From ba56b52b337ceed3d87a447e6da83b6705546e2a Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 27 Apr 2026 18:45:28 +0200 Subject: [PATCH 1/7] refactor: rename fireflyframework-genai to fireflyframework-agentic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comprehensive rebrand from genai to agentic: - Python module: fireflyframework_genai -> fireflyframework_agentic - PyPI package: fireflyframework-genai -> fireflyframework-agentic - Class names: FireflyGenAI* -> FireflyAgentic* (FireflyGenAIConfig, FireflyGenAIError) - Env var prefix: FIREFLY_GENAI_* -> FIREFLY_AGENTIC_* - REST factory: create_genai_app() -> create_agentic_app() - Repo URLs: github.com/.../genai -> .../agentic - Brand prose: "Firefly GenAI" -> "Firefly Agentic" Mentions of "GenAI" / "genai-prices" that refer to the category or to the external genai-prices library (e.g. GenAIPricesCostCalculator) are kept as-is — they describe the field, not the brand. Module-level __init__.py re-exports updated. Pre-commit, CI, install scripts, and docs all use the new names. --- .github/workflows/ci.yml | 2 +- .gitignore | 4 +- .pre-commit-config.yaml | 4 +- CONTRIBUTING.md | 12 +- README.md | 94 ++-- docs/README.md | 8 +- docs/agents.md | 104 ++-- docs/api-reference.md | 2 +- docs/architecture.md | 46 +- docs/content.md | 14 +- docs/embeddings.md | 54 +- docs/experiments.md | 8 +- docs/explainability.md | 8 +- docs/exposure-queues.md | 20 +- docs/exposure-rest.md | 20 +- docs/input-output-nodes.md | 4 +- docs/lab.md | 10 +- docs/memory.md | 58 +- docs/observability.md | 82 +-- docs/pipeline.md | 34 +- docs/prompts.md | 8 +- docs/reasoning.md | 52 +- docs/scheduling.md | 4 +- docs/security.md | 54 +- docs/studio-agents.md | 16 +- docs/studio.md | 30 +- docs/templates.md | 20 +- docs/tools.md | 42 +- docs/tutorial-bpm-pipeline.md | 2 +- docs/tutorial.md | 510 +++++++++--------- docs/use-case-idp.md | 40 +- docs/validation.md | 20 +- docs/vectorstores.md | 38 +- examples/README.md | 4 +- examples/basic_agent.py | 2 +- examples/batch_processing.py | 16 +- examples/cached_tool.py | 2 +- examples/circuit_breaker.py | 6 +- examples/classifier.py | 2 +- examples/conversation_export_import.py | 4 +- examples/conversational_memory.py | 4 +- examples/database_persistence.py | 16 +- examples/delegation_strategies.py | 4 +- examples/distributed_tracing.py | 14 +- examples/extractor.py | 2 +- examples/full_integration.py | 72 +-- examples/http_connection_pooling.py | 16 +- examples/idp_pipeline.py | 34 +- examples/idp_tools.py | 6 +- examples/incremental_streaming.py | 2 +- examples/mongodb_persistence.py | 14 +- examples/observability_usage.py | 2 +- examples/pipeline_branching.py | 10 +- examples/prompt_caching.py | 10 +- examples/quota_management.py | 22 +- examples/reasoning_cot.py | 4 +- examples/reasoning_goal.py | 4 +- examples/reasoning_memory.py | 6 +- examples/reasoning_pipeline.py | 4 +- examples/reasoning_plan.py | 8 +- examples/reasoning_react.py | 4 +- examples/reasoning_reflexion.py | 4 +- examples/reasoning_tot.py | 4 +- examples/router.py | 2 +- examples/security_guards.py | 4 +- examples/studio_launch.py | 6 +- examples/summarizer.py | 2 +- examples/tool_timeout.py | 4 +- install.ps1 | 28 +- install.sh | 18 +- pyproject.toml | 18 +- scripts/build_studio.py | 4 +- .../__init__.py | 26 +- .../_version.py | 2 +- .../agents/__init__.py | 24 +- .../agents/base.py | 66 +-- .../agents/builtin_middleware.py | 36 +- .../agents/cache.py | 2 +- .../agents/context.py | 0 .../agents/decorators.py | 8 +- .../agents/delegation.py | 8 +- .../agents/fallback.py | 4 +- .../agents/lifecycle.py | 0 .../agents/middleware.py | 0 .../agents/prompt_cache.py | 4 +- .../agents/registry.py | 4 +- .../agents/templates/__init__.py | 10 +- .../agents/templates/classifier.py | 2 +- .../agents/templates/conversational.py | 10 +- .../agents/templates/extractor.py | 8 +- .../agents/templates/router.py | 2 +- .../agents/templates/summarizer.py | 4 +- .../config.py | 18 +- .../content/__init__.py | 4 +- .../content/chunking.py | 2 +- .../content/compression.py | 4 +- .../embeddings/__init__.py | 8 +- .../embeddings/base.py | 6 +- .../embeddings/providers/__init__.py | 21 + .../embeddings/providers/azure.py | 4 +- .../embeddings/providers/bedrock.py | 4 +- .../embeddings/providers/cohere.py | 4 +- .../embeddings/providers/google.py | 4 +- .../embeddings/providers/mistral.py | 4 +- .../embeddings/providers/ollama.py | 4 +- .../embeddings/providers/openai.py | 4 +- .../embeddings/providers/voyage.py | 4 +- .../embeddings/registry.py | 2 +- .../embeddings/similarity.py | 0 .../embeddings/types.py | 0 .../exceptions.py | 46 +- .../experiments/__init__.py | 10 +- .../experiments/comparator.py | 2 +- .../experiments/experiment.py | 2 +- .../experiments/runner.py | 6 +- .../experiments/tracker.py | 0 .../experiments/variant.py | 0 .../explainability/__init__.py | 8 +- .../explainability/audit.py | 0 .../explainability/explanation.py | 4 +- .../explainability/report.py | 4 +- .../explainability/trace_recorder.py | 0 .../exposure/__init__.py | 10 +- .../exposure/queues/__init__.py | 10 +- .../exposure/queues/base.py | 2 +- .../exposure/queues/kafka.py | 14 +- .../exposure/queues/rabbitmq.py | 12 +- .../exposure/queues/redis.py | 12 +- .../exposure/queues/router.py | 6 +- .../exposure/rest/__init__.py | 6 +- .../exposure/rest/app.py | 28 +- .../exposure/rest/health.py | 4 +- .../exposure/rest/middleware.py | 8 +- .../exposure/rest/router.py | 8 +- .../exposure/rest/schemas.py | 0 .../exposure/rest/streaming.py | 2 +- .../exposure/rest/websocket.py | 4 +- .../lab/__init__.py | 10 +- .../lab/benchmark.py | 2 +- .../lab/comparison.py | 0 .../lab/dataset.py | 0 .../lab/evaluator.py | 4 +- .../lab/session.py | 2 +- .../logging.py | 14 +- .../memory/__init__.py | 12 +- .../memory/conversation.py | 4 +- .../memory/database_store.py | 16 +- .../memory/manager.py | 24 +- .../memory/store.py | 2 +- .../memory/summarization.py | 8 +- .../memory/types.py | 0 .../memory/working.py | 4 +- .../model_utils.py | 0 .../observability/__init__.py | 14 +- .../observability/cost.py | 0 .../observability/decorators.py | 4 +- .../observability/events.py | 4 +- .../observability/exporters.py | 2 +- .../observability/metrics.py | 4 +- .../observability/quota.py | 8 +- .../observability/tracer.py | 4 +- .../observability/usage.py | 12 +- .../pipeline/__init__.py | 12 +- .../pipeline/builder.py | 6 +- .../pipeline/context.py | 2 +- .../pipeline/dag.py | 2 +- .../pipeline/engine.py | 14 +- .../pipeline/result.py | 2 +- .../pipeline/steps.py | 8 +- .../plugin.py | 14 +- .../prompts/__init__.py | 10 +- .../prompts/composer.py | 2 +- .../prompts/loader.py | 2 +- .../prompts/registry.py | 4 +- .../prompts/template.py | 4 +- .../prompts/validator.py | 0 .../py.typed | 0 .../reasoning/__init__.py | 24 +- .../reasoning/base.py | 30 +- .../reasoning/chain_of_thought.py | 14 +- .../reasoning/goal_decomposition.py | 16 +- .../reasoning/models.py | 0 .../reasoning/pipeline.py | 6 +- .../reasoning/plan_and_execute.py | 14 +- .../reasoning/prompts.py | 6 +- .../reasoning/react.py | 14 +- .../reasoning/reflexion.py | 14 +- .../reasoning/registry.py | 14 +- .../reasoning/trace.py | 0 .../reasoning/tree_of_thoughts.py | 16 +- .../resilience/__init__.py | 4 +- .../resilience/circuit_breaker.py | 4 +- .../security/__init__.py | 8 +- .../security/encryption.py | 18 +- .../security/output_guard.py | 2 +- .../security/prompt_guard.py | 2 +- .../security/rbac.py | 16 +- .../studio/__init__.py | 8 +- .../studio/api/__init__.py | 0 .../studio/api/assistant.py | 24 +- .../studio/api/checkpoints.py | 2 +- .../studio/api/codegen.py | 4 +- .../studio/api/custom_tools.py | 12 +- .../studio/api/evaluate.py | 4 +- .../studio/api/execution.py | 14 +- .../studio/api/experiments.py | 6 +- .../studio/api/files.py | 2 +- .../studio/api/graphql_api.py | 8 +- .../studio/api/monitoring.py | 2 +- .../studio/api/oracle.py | 24 +- .../studio/api/project_api.py | 12 +- .../studio/api/projects.py | 10 +- .../studio/api/registry.py | 6 +- .../studio/api/settings.py | 2 +- .../studio/api/smith.py | 24 +- .../studio/api/tunnel.py | 2 +- .../studio/assistant/__init__.py | 2 +- .../studio/assistant/agent.py | 74 +-- .../studio/assistant/history.py | 0 .../studio/assistant/oracle.py | 10 +- .../studio/assistant/oracle_notifications.py | 0 .../studio/assistant/shared_context.py | 10 +- .../studio/assistant/smith.py | 48 +- .../studio/cli.py | 8 +- .../studio/codegen/__init__.py | 4 +- .../studio/codegen/generator.py | 26 +- .../studio/codegen/models.py | 0 .../studio/config.py | 0 .../studio/custom_tools.py | 6 +- .../studio/evaluation.py | 8 +- .../studio/execution/__init__.py | 0 .../studio/execution/checkpoint.py | 0 .../studio/execution/compiler.py | 28 +- .../studio/execution/io_nodes.py | 0 .../studio/execution/runner.py | 2 +- .../studio/projects.py | 0 .../studio/runtime.py | 12 +- .../studio/server.py | 54 +- .../studio/settings.py | 0 .../studio/tunnel.py | 0 .../studio/versioning.py | 0 .../tools/__init__.py | 16 +- .../tools/base.py | 2 +- .../tools/builder.py | 4 +- .../tools/builtins/__init__.py | 18 +- .../tools/builtins/calculator_tool.py | 2 +- .../tools/builtins/database.py | 4 +- .../tools/builtins/datetime_tool.py | 2 +- .../tools/builtins/filesystem.py | 2 +- .../tools/builtins/http.py | 2 +- .../tools/builtins/json_tool.py | 2 +- .../tools/builtins/search.py | 2 +- .../tools/builtins/shell.py | 2 +- .../tools/builtins/text_tool.py | 2 +- .../tools/cached.py | 6 +- .../tools/composer.py | 4 +- .../tools/decorators.py | 8 +- .../tools/guards.py | 4 +- .../tools/registry.py | 8 +- .../tools/toolkit.py | 4 +- .../types.py | 0 .../validation/__init__.py | 6 +- .../validation/qos.py | 2 +- .../validation/reviewer.py | 8 +- .../validation/rules.py | 0 .../vectorstores/__init__.py | 22 + .../vectorstores/base.py | 6 +- .../vectorstores/chroma_store.py | 4 +- .../vectorstores/memory_store.py | 6 +- .../vectorstores/pinecone_store.py | 4 +- .../vectorstores/qdrant_store.py | 4 +- .../vectorstores/registry.py | 2 +- .../vectorstores/types.py | 0 .../embeddings/providers/__init__.py | 21 - .../vectorstores/__init__.py | 22 - studio-desktop/pyinstaller/entry_point.py | 2 +- .../pyinstaller/firefly_studio.spec | 6 +- .../hook-fireflyframework_genai.py | 72 +-- studio-frontend/README.md | 4 +- .../components/layout/SettingsModal.svelte | 2 +- tests/agents/test_prompt_cache.py | 2 +- tests/agents/test_rate_limit_retry.py | 8 +- tests/agents/test_streaming_incremental.py | 8 +- tests/benchmarks/bench_http_pool.py | 2 +- tests/benchmarks/bench_streaming_latency.py | 2 +- tests/conftest.py | 8 +- tests/integration/test_full_integration.py | 22 +- tests/memory/test_mongodb_store.py | 30 +- tests/memory/test_postgres_store.py | 28 +- tests/observability/test_quota_manager.py | 4 +- tests/observability/test_trace_propagation.py | 2 +- tests/pipeline/test_batch_step.py | 6 +- tests/resilience/test_circuit_breaker.py | 2 +- tests/security/test_encryption.py | 6 +- tests/security/test_rbac.py | 2 +- tests/security/test_sql_injection.py | 4 +- tests/test_agents/test_agent_usage.py | 20 +- tests/test_agents/test_base.py | 2 +- tests/test_agents/test_cache.py | 2 +- tests/test_agents/test_context.py | 2 +- tests/test_agents/test_decorators.py | 6 +- tests/test_agents/test_delegation.py | 8 +- tests/test_agents/test_fallback.py | 2 +- tests/test_agents/test_lifecycle.py | 2 +- tests/test_agents/test_middleware.py | 32 +- tests/test_agents/test_registry.py | 6 +- tests/test_agents/test_templates.py | 18 +- tests/test_config.py | 24 +- tests/test_content/test_chunking.py | 2 +- tests/test_content/test_compression.py | 2 +- tests/test_core.py | 20 +- tests/test_embeddings/test_base.py | 4 +- tests/test_embeddings/test_exceptions.py | 8 +- tests/test_embeddings/test_init.py | 4 +- .../test_providers/test_azure.py | 10 +- .../test_providers/test_bedrock.py | 10 +- .../test_providers/test_cohere.py | 10 +- .../test_providers/test_mistral.py | 10 +- .../test_providers/test_ollama.py | 10 +- .../test_providers/test_openai.py | 10 +- .../test_providers/test_voyage.py | 10 +- tests/test_embeddings/test_registry.py | 4 +- tests/test_embeddings/test_similarity.py | 2 +- tests/test_embeddings/test_types.py | 2 +- tests/test_experiments/test_experiment.py | 4 +- tests/test_explainability/test_audit.py | 2 +- .../test_trace_recorder.py | 2 +- tests/test_exposure/test_queues.py | 6 +- tests/test_exposure/test_rate_limit.py | 2 +- tests/test_exposure/test_rest_app.py | 18 +- tests/test_exposure/test_rest_utils.py | 4 +- tests/test_exposure/test_schemas.py | 2 +- tests/test_lab/test_dataset.py | 2 +- tests/test_logging.py | 8 +- tests/test_memory/test_async_store.py | 4 +- tests/test_memory/test_memory.py | 10 +- tests/test_memory/test_summarization.py | 8 +- tests/test_model_utils.py | 2 +- tests/test_observability/test_cost.py | 2 +- tests/test_observability/test_decorators.py | 2 +- tests/test_observability/test_events.py | 2 +- tests/test_observability/test_metrics.py | 2 +- tests/test_observability/test_tracer.py | 2 +- tests/test_observability/test_usage.py | 16 +- tests/test_pipeline/test_builder.py | 6 +- tests/test_pipeline/test_dag.py | 14 +- tests/test_pipeline/test_embedding_steps.py | 12 +- tests/test_pipeline/test_event_handler.py | 6 +- tests/test_pipeline/test_pipeline_usage.py | 10 +- tests/test_pipeline/test_steps.py | 10 +- tests/test_plugin.py | 4 +- tests/test_prompts/test_registry.py | 4 +- tests/test_prompts/test_template.py | 2 +- .../test_reasoning/test_memory_integration.py | 22 +- tests/test_reasoning/test_models.py | 2 +- tests/test_reasoning/test_patterns.py | 16 +- tests/test_reasoning/test_pipeline.py | 10 +- tests/test_reasoning/test_prompts.py | 4 +- tests/test_reasoning/test_registry.py | 4 +- tests/test_reasoning/test_trace.py | 2 +- tests/test_security/test_output_guard.py | 6 +- tests/test_security/test_prompt_guard.py | 2 +- tests/test_studio/test_api_assistant.py | 8 +- tests/test_studio/test_api_checkpoints.py | 4 +- tests/test_studio/test_api_codegen.py | 2 +- tests/test_studio/test_api_monitoring.py | 8 +- tests/test_studio/test_api_registry.py | 12 +- tests/test_studio/test_assistant_agent.py | 6 +- tests/test_studio/test_checkpoint.py | 2 +- tests/test_studio/test_cli.py | 2 +- tests/test_studio/test_codegen_generator.py | 10 +- tests/test_studio/test_codegen_models.py | 2 +- tests/test_studio/test_compiler.py | 22 +- tests/test_studio/test_compiler_io.py | 4 +- tests/test_studio/test_config.py | 2 +- tests/test_studio/test_dynamic_model.py | 6 +- tests/test_studio/test_execution.py | 6 +- tests/test_studio/test_graphql.py | 8 +- tests/test_studio/test_input_output_nodes.py | 4 +- tests/test_studio/test_pipeline_events.py | 8 +- .../test_studio/test_pipeline_integration.py | 22 +- tests/test_studio/test_project_api.py | 4 +- tests/test_studio/test_project_runtime.py | 4 +- tests/test_studio/test_projects.py | 6 +- tests/test_studio/test_server.py | 8 +- tests/test_studio/test_settings.py | 4 +- tests/test_studio/test_static_serving.py | 6 +- tests/test_studio/test_tunnel.py | 2 +- tests/test_studio/test_tunnel_api.py | 6 +- tests/test_tools/test_builder.py | 2 +- tests/test_tools/test_builtins.py | 30 +- tests/test_tools/test_cached.py | 4 +- tests/test_tools/test_composer.py | 4 +- tests/test_tools/test_guards.py | 2 +- tests/test_tools/test_registry.py | 6 +- tests/test_tools/test_timeout.py | 4 +- tests/test_tools/test_toolkit.py | 10 +- tests/test_validation/test_qos.py | 2 +- tests/test_validation/test_reviewer.py | 6 +- tests/test_validation/test_rules.py | 2 +- tests/test_vectorstores/test_base.py | 8 +- tests/test_vectorstores/test_chroma_store.py | 34 +- tests/test_vectorstores/test_init.py | 2 +- tests/test_vectorstores/test_memory_store.py | 4 +- .../test_vectorstores/test_pinecone_store.py | 34 +- tests/test_vectorstores/test_qdrant_store.py | 58 +- tests/test_vectorstores/test_registry.py | 4 +- tests/test_vectorstores/test_types.py | 2 +- tests/tools/test_http_pool.py | 6 +- tests/tools/test_http_pool_smoke.py | 2 +- uninstall.ps1 | 20 +- uninstall.sh | 10 +- 412 files changed, 2294 insertions(+), 2294 deletions(-) rename src/{fireflyframework_genai => fireflyframework_agentic}/__init__.py (80%) rename src/{fireflyframework_genai => fireflyframework_agentic}/_version.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/__init__.py (73%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/base.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/builtin_middleware.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/cache.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/context.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/decorators.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/delegation.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/fallback.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/lifecycle.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/middleware.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/prompt_cache.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/registry.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/templates/__init__.py (70%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/templates/classifier.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/templates/conversational.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/templates/extractor.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/templates/router.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/agents/templates/summarizer.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/config.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/content/__init__.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/content/chunking.py (99%) rename src/{fireflyframework_genai => fireflyframework_agentic}/content/compression.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/__init__.py (53%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/base.py (94%) create mode 100644 src/fireflyframework_agentic/embeddings/providers/__init__.py rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/providers/azure.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/providers/bedrock.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/providers/cohere.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/providers/google.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/providers/mistral.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/providers/ollama.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/providers/openai.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/providers/voyage.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/registry.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/similarity.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/embeddings/types.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exceptions.py (83%) rename src/{fireflyframework_genai => fireflyframework_agentic}/experiments/__init__.py (67%) rename src/{fireflyframework_genai => fireflyframework_agentic}/experiments/comparator.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/experiments/experiment.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/experiments/runner.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/experiments/tracker.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/experiments/variant.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/explainability/__init__.py (77%) rename src/{fireflyframework_genai => fireflyframework_agentic}/explainability/audit.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/explainability/explanation.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/explainability/report.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/explainability/trace_recorder.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/__init__.py (82%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/queues/__init__.py (85%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/queues/base.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/queues/kafka.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/queues/rabbitmq.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/queues/redis.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/queues/router.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/rest/__init__.py (78%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/rest/app.py (78%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/rest/health.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/rest/middleware.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/rest/router.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/rest/schemas.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/rest/streaming.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/exposure/rest/websocket.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/lab/__init__.py (69%) rename src/{fireflyframework_genai => fireflyframework_agentic}/lab/benchmark.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/lab/comparison.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/lab/dataset.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/lab/evaluator.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/lab/session.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/logging.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/memory/__init__.py (66%) rename src/{fireflyframework_genai => fireflyframework_agentic}/memory/conversation.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/memory/database_store.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/memory/manager.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/memory/store.py (99%) rename src/{fireflyframework_genai => fireflyframework_agentic}/memory/summarization.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/memory/types.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/memory/working.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/model_utils.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/__init__.py (73%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/cost.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/decorators.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/events.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/exporters.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/metrics.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/quota.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/tracer.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/observability/usage.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/pipeline/__init__.py (75%) rename src/{fireflyframework_genai => fireflyframework_agentic}/pipeline/builder.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/pipeline/context.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/pipeline/dag.py (99%) rename src/{fireflyframework_genai => fireflyframework_agentic}/pipeline/engine.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/pipeline/result.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/pipeline/steps.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/plugin.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/prompts/__init__.py (75%) rename src/{fireflyframework_genai => fireflyframework_agentic}/prompts/composer.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/prompts/loader.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/prompts/registry.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/prompts/template.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/prompts/validator.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/py.typed (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/__init__.py (75%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/base.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/chain_of_thought.py (89%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/goal_decomposition.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/models.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/pipeline.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/plan_and_execute.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/prompts.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/react.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/reflexion.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/registry.py (82%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/trace.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/reasoning/tree_of_thoughts.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/resilience/__init__.py (87%) rename src/{fireflyframework_genai => fireflyframework_agentic}/resilience/circuit_breaker.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/security/__init__.py (73%) rename src/{fireflyframework_genai => fireflyframework_agentic}/security/encryption.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/security/output_guard.py (99%) rename src/{fireflyframework_genai => fireflyframework_agentic}/security/prompt_guard.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/security/rbac.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/__init__.py (79%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/__init__.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/assistant.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/checkpoints.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/codegen.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/custom_tools.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/evaluate.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/execution.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/experiments.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/files.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/graphql_api.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/monitoring.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/oracle.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/project_api.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/projects.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/registry.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/settings.py (99%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/smith.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/api/tunnel.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/assistant/__init__.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/assistant/agent.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/assistant/history.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/assistant/oracle.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/assistant/oracle_notifications.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/assistant/shared_context.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/assistant/smith.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/cli.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/codegen/__init__.py (86%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/codegen/generator.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/codegen/models.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/config.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/custom_tools.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/evaluation.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/execution/__init__.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/execution/checkpoint.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/execution/compiler.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/execution/io_nodes.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/execution/runner.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/projects.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/runtime.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/server.py (80%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/settings.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/tunnel.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/studio/versioning.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/__init__.py (73%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/base.py (99%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builder.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/__init__.py (56%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/calculator_tool.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/database.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/datetime_tool.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/filesystem.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/http.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/json_tool.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/search.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/shell.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/builtins/text_tool.py (98%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/cached.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/composer.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/decorators.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/guards.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/registry.py (92%) rename src/{fireflyframework_genai => fireflyframework_agentic}/tools/toolkit.py (96%) rename src/{fireflyframework_genai => fireflyframework_agentic}/types.py (100%) rename src/{fireflyframework_genai => fireflyframework_agentic}/validation/__init__.py (90%) rename src/{fireflyframework_genai => fireflyframework_agentic}/validation/qos.py (99%) rename src/{fireflyframework_genai => fireflyframework_agentic}/validation/reviewer.py (97%) rename src/{fireflyframework_genai => fireflyframework_agentic}/validation/rules.py (100%) create mode 100644 src/fireflyframework_agentic/vectorstores/__init__.py rename src/{fireflyframework_genai => fireflyframework_agentic}/vectorstores/base.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/vectorstores/chroma_store.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/vectorstores/memory_store.py (91%) rename src/{fireflyframework_genai => fireflyframework_agentic}/vectorstores/pinecone_store.py (94%) rename src/{fireflyframework_genai => fireflyframework_agentic}/vectorstores/qdrant_store.py (95%) rename src/{fireflyframework_genai => fireflyframework_agentic}/vectorstores/registry.py (93%) rename src/{fireflyframework_genai => fireflyframework_agentic}/vectorstores/types.py (100%) delete mode 100644 src/fireflyframework_genai/embeddings/providers/__init__.py delete mode 100644 src/fireflyframework_genai/vectorstores/__init__.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8e9882c..e11bc720 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -103,7 +103,7 @@ jobs: - uses: actions/download-artifact@v4 with: name: frontend-dist - path: src/fireflyframework_genai/studio/static/ + path: src/fireflyframework_agentic/studio/static/ - run: uv run pytest --cov --cov-report=term-missing build: diff --git a/.gitignore b/.gitignore index 5b246529..680b82f3 100644 --- a/.gitignore +++ b/.gitignore @@ -124,8 +124,8 @@ logs/ docs/plans/ # Studio bundled frontend (build artifact — run scripts/build_studio.py) -src/fireflyframework_genai/studio/static/* -!src/fireflyframework_genai/studio/static/.gitkeep +src/fireflyframework_agentic/studio/static/* +!src/fireflyframework_agentic/studio/static/.gitkeep # Studio frontend build output studio-frontend/build/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14326db4..f340aa3c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -# Pre-commit hooks for fireflyframework-genai. +# Pre-commit hooks for fireflyframework-agentic. # # Install once per clone: # uv sync --extra dev @@ -17,7 +17,7 @@ fail_fast: false exclude: | (?x)^( studio-desktop/frontend-dist/.*| - src/fireflyframework_genai/studio/static/.* + src/fireflyframework_agentic/studio/static/.* )$ repos: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df0bfee6..5089b301 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Contributing to fireflyframework-genai +# Contributing to fireflyframework-agentic Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. @@ -21,8 +21,8 @@ for submitting changes. ### Setup ```bash -git clone https://github.com/fireflyframework/fireflyframework-genai.git -cd fireflyframework-genai +git clone https://github.com/fireflyframework/fireflyframework-agentic.git +cd fireflyframework-agentic uv sync --all-extras ``` @@ -32,7 +32,7 @@ for REST, Kafka, RabbitMQ, and Redis. ### Building the Studio Frontend (source installs only) The Studio frontend is a SvelteKit SPA that lives in `studio-frontend/` and is -served by FastAPI from `src/fireflyframework_genai/studio/static/`. The published +served by FastAPI from `src/fireflyframework_agentic/studio/static/`. The published wheel includes a pre-built bundle, but a fresh `git clone` does **not** — running `firefly studio` against an unbuilt source tree returns `{"detail":"Not Found"}` on every page. @@ -56,7 +56,7 @@ uv run pytest To generate a coverage report: ```bash -uv run pytest --cov=fireflyframework_genai --cov-report=term-missing +uv run pytest --cov=fireflyframework_agentic --cov-report=term-missing ``` ### Linting @@ -114,7 +114,7 @@ Imports are organised into three groups, separated by blank lines: 1. Standard library 2. Third-party packages -3. Internal (`fireflyframework_genai`) modules +3. Internal (`fireflyframework_agentic`) modules Ruff isort rules enforce this automatically. diff --git a/README.md b/README.md index bea66003..047333c9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# fireflyframework-genai +# fireflyframework-agentic **The production-grade GenAI metaframework built on [Pydantic AI](https://ai.pydantic.dev/).** -[![CI](https://github.com/fireflyframework/fireflyframework-genai/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/fireflyframework/fireflyframework-genai/actions/workflows/ci.yml) +[![CI](https://github.com/fireflyframework/fireflyframework-agentic/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/fireflyframework/fireflyframework-agentic/actions/workflows/ci.yml) [![Python 3.13+](https://img.shields.io/badge/python-3.13%2B-blue.svg)](https://www.python.org/downloads/) [![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-green.svg)](LICENSE) [![Tests](https://img.shields.io/badge/tests-1383%20passing-brightgreen.svg)]() @@ -13,7 +13,7 @@ Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License ## Table of Contents -- [Why fireflyframework-genai?](#why-fireflyframework-genai) +- [Why fireflyframework-agentic?](#why-fireflyframework-agentic) - [Key Principles](#key-principles) - [Architecture at a Glance](#architecture-at-a-glance) - [Feature Highlights](#feature-highlights) @@ -33,7 +33,7 @@ Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License --- -## Why fireflyframework-genai? +## Why fireflyframework-agentic? [Pydantic AI](https://ai.pydantic.dev/) provides an excellent foundation: type-safe, model-agnostic agents with structured output. But a production GenAI system demands @@ -43,7 +43,7 @@ turns, observe every call with traces and metrics, run A/B experiments to compar models, and expose the whole thing over REST or message queues — all without coupling your domain logic to infrastructure concerns. -**fireflyframework-genai is the production framework built on top of Pydantic AI.** +**fireflyframework-agentic is the production framework built on top of Pydantic AI.** It extends the engine with six composable layers — from core configuration through agent management, intelligent reasoning, experimentation, pipeline orchestration, and service exposure — so that every concern has a dedicated, protocol-driven module. @@ -71,8 +71,8 @@ You write your business logic; the framework provides the architecture. without modifying framework internals. 2. **Convention over configuration** — Sensible defaults everywhere. - `FireflyGenAIConfig` is a Pydantic Settings singleton that reads from environment - variables prefixed with `FIREFLY_GENAI_` and `.env` files. One config object + `FireflyAgenticConfig` is a Pydantic Settings singleton that reads from environment + variables prefixed with `FIREFLY_AGENTIC_` and `.env` files. One config object governs model defaults, retry counts, token limits, observability endpoints, memory backends, and validation thresholds — override only what you need. @@ -94,7 +94,7 @@ You write your business logic; the framework provides the architecture. ```mermaid graph TD subgraph Exposure Layer - REST["REST API
create_genai_app · SSE streaming
health · middleware · router
"] + REST["REST API
create_agentic_app · SSE streaming
health · middleware · router
"] QUEUES["Message Queues
Kafka · RabbitMQ · Redis
consumers · producers · QueueRouter
"] end @@ -128,9 +128,9 @@ graph TD end subgraph Core Layer - CFG["Config
FireflyGenAIConfig
get_config · reset_config
"] + CFG["Config
FireflyAgenticConfig
get_config · reset_config
"] TYPES["Types & Protocols
AgentLike · 10 protocols
TypeVars · type aliases
"] - EXC["Exceptions
FireflyGenAIError hierarchy
18 exception classes
"] + EXC["Exceptions
FireflyAgenticError hierarchy
18 exception classes
"] PLUG["Plugin System
PluginDiscovery
3 entry-point groups
"] end @@ -369,7 +369,7 @@ classDiagram `EvalDataset` loads/saves test cases from JSON. `ModelComparison` runs the same prompts across multiple agents for side-by-side analysis. -- **Exposure** — `create_genai_app()` produces a FastAPI application with +- **Exposure** — `create_agentic_app()` produces a FastAPI application with auto-generated `POST /agents/{name}/run` endpoints, SSE streaming via `sse_stream`, health/readiness/liveness checks, CORS and request-ID middleware, and multimodal input support. Queue consumers (`KafkaAgentConsumer`, @@ -403,7 +403,7 @@ classDiagram you build pipelines through natural language. Project management persists graphs to disk. Checkpoints enable time-travel debugging. The frontend is a SvelteKit 5 SPA bundled inside the Python package — no Node.js needed. - Install with `pip install "fireflyframework-genai[studio]"`. + Install with `pip install "fireflyframework-agentic[studio]"`. --- @@ -458,20 +458,20 @@ choose extras, and installs everything with progress indicators and verification **macOS / Linux:** ```bash -curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.sh | bash +curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/install.sh | bash ``` **Windows (PowerShell):** ```powershell -irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.ps1 | iex +irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/install.ps1 | iex ``` Both installers support non-interactive mode for CI/CD: ```bash # macOS / Linux — install with all extras, no prompts -curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.sh | bash +curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/install.sh | bash ``` ```powershell @@ -482,8 +482,8 @@ curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-g ### Install from Source ```bash -git clone https://github.com/fireflyframework/fireflyframework-genai.git -cd fireflyframework-genai +git clone https://github.com/fireflyframework/fireflyframework-agentic.git +cd fireflyframework-agentic uv sync --all-extras # or: pip install -e ".[all]" ``` @@ -518,7 +518,7 @@ uv sync --all-extras # or: pip install -e ".[all]" ### Verify Installation ```bash -python -c "import fireflyframework_genai; print(fireflyframework_genai.__version__)" +python -c "import fireflyframework_agentic; print(fireflyframework_agentic.__version__)" # 26.02.07 ``` @@ -533,13 +533,13 @@ firefly --help **macOS / Linux:** ```bash -curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/uninstall.sh | bash +curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/uninstall.sh | bash ``` **Windows (PowerShell):** ```powershell -irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/uninstall.ps1 | iex +irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/uninstall.ps1 | iex ``` Or manually remove the cloned directory and its virtual environment. @@ -560,8 +560,8 @@ OPENAI_API_KEY=sk-... # GROQ_API_KEY=gsk_... # Framework settings -FIREFLY_GENAI_DEFAULT_MODEL=openai:gpt-4o -FIREFLY_GENAI_DEFAULT_TEMPERATURE=0.3 +FIREFLY_AGENTIC_DEFAULT_MODEL=openai:gpt-4o +FIREFLY_AGENTIC_DEFAULT_TEMPERATURE=0.3 ``` The model string format is `"provider:model_name"` — e.g. `"openai:gpt-4o"`, @@ -573,7 +573,7 @@ to `FireflyAgent(model=...)` — see the [tutorial](docs/tutorial.md#model-provi ### 2. Define an Agent ```python -from fireflyframework_genai.agents import firefly_agent +from fireflyframework_agentic.agents import firefly_agent @firefly_agent(name="assistant", model="openai:gpt-4o") def assistant_instructions(ctx): @@ -583,7 +583,7 @@ def assistant_instructions(ctx): ### 3. Register a Tool ```python -from fireflyframework_genai.tools import firefly_tool +from fireflyframework_agentic.tools import firefly_tool @firefly_tool(name="lookup", description="Look up a term") async def lookup(query: str) -> str: @@ -593,8 +593,8 @@ async def lookup(query: str) -> str: ### 4. Add Memory for Multi-Turn Conversations ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(max_conversation_tokens=32_000) agent = FireflyAgent(name="bot", model="openai:gpt-4o", memory=memory) @@ -607,7 +607,7 @@ result = await agent.run("What did I just say?", conversation_id=cid) ### 5. Apply a Reasoning Pattern ```python -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.reasoning import ReActPattern react = ReActPattern(max_steps=5) result = await react.execute(agent, "What is the weather in London?") @@ -618,7 +618,7 @@ print(result.output) ```python from pydantic import BaseModel -from fireflyframework_genai.validation import OutputReviewer +from fireflyframework_agentic.validation import OutputReviewer class Answer(BaseModel): answer: str @@ -632,8 +632,8 @@ print(result.output) # Answer(answer="4", confidence=0.99) ### 7. Wire a Pipeline ```python -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import AgentStep, CallableStep +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import AgentStep, CallableStep pipeline = ( PipelineBuilder("my-pipeline") @@ -649,8 +649,8 @@ result = await pipeline.run(inputs="Process this document") ### 8. Embed and Search (RAG) ```python -from fireflyframework_genai.embeddings.providers import OpenAIEmbedder -from fireflyframework_genai.vectorstores import InMemoryVectorStore, VectorDocument +from fireflyframework_agentic.embeddings.providers import OpenAIEmbedder +from fireflyframework_agentic.vectorstores import InMemoryVectorStore, VectorDocument embedder = OpenAIEmbedder(model="text-embedding-3-small") store = InMemoryVectorStore(embedder=embedder) @@ -669,16 +669,16 @@ print(results[0].document.text) # Python is great for AI ### 9. Expose via REST ```python -from fireflyframework_genai.exposure.rest import create_genai_app +from fireflyframework_agentic.exposure.rest import create_agentic_app -app = create_genai_app(title="My GenAI Service") +app = create_agentic_app(title="My GenAI Service") # uvicorn myapp:app --reload ``` ### 10. Expose via Queues (Consumer) ```python -from fireflyframework_genai.exposure.queues.kafka import KafkaAgentConsumer +from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentConsumer consumer = KafkaAgentConsumer("assistant", topic="requests", bootstrap_servers="localhost:9092") await consumer.start() @@ -687,7 +687,7 @@ await consumer.start() ### 11. Publish via Queues (Producer) ```python -from fireflyframework_genai.exposure.queues.kafka import KafkaAgentProducer +from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentProducer producer = KafkaAgentProducer(topic="results", bootstrap_servers="localhost:9092") await producer.publish({"agent": "assistant", "output": "Done processing."}) @@ -696,7 +696,7 @@ await producer.close() ## Using in Jupyter Notebooks -firefly-genai works seamlessly in Jupyter notebooks and JupyterLab. +firefly-agentic works seamlessly in Jupyter notebooks and JupyterLab. Since the framework is async-first, use `await` directly in notebook cells (Jupyter provides a running event loop automatically). @@ -704,14 +704,14 @@ Since the framework is async-first, use `await` directly in notebook cells ```bash # From your clone directory -cd fireflyframework-genai +cd fireflyframework-agentic source .venv/bin/activate # activate the venv created by the installer pip install ipykernel # install Jupyter kernel support -python -m ipykernel install --user --name fireflygenai --display-name "Firefly GenAI" +python -m ipykernel install --user --name fireflyagentic --display-name "Firefly Agentic" jupyter lab # or: jupyter notebook ``` -Then select the **Firefly GenAI** kernel when creating a new notebook. +Then select the **Firefly Agentic** kernel when creating a new notebook. ### Example Notebook @@ -719,12 +719,12 @@ Then select the **Firefly GenAI** kernel when creating a new notebook. # Cell 1 — configure import os os.environ["OPENAI_API_KEY"] = "sk-..." # or set in .env -os.environ["FIREFLY_GENAI_DEFAULT_MODEL"] = "openai:gpt-4o" +os.environ["FIREFLY_AGENTIC_DEFAULT_MODEL"] = "openai:gpt-4o" ``` ```python # Cell 2 — create an agent -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent agent = FireflyAgent(name="notebook-bot", model="openai:gpt-4o") result = await agent.run("Explain quantum entanglement in two sentences.") @@ -733,7 +733,7 @@ print(result.output) ```python # Cell 3 — use memory for multi-turn conversations -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(max_conversation_tokens=32_000) agent_with_mem = FireflyAgent(name="chat", model="openai:gpt-4o", memory=memory) @@ -748,7 +748,7 @@ print(result.output) # Alice ```python # Cell 4 — reasoning patterns -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.reasoning import ReActPattern react = ReActPattern(max_steps=5) result = await react.execute(agent, "What are the top 3 uses of Python in 2026?") @@ -758,7 +758,7 @@ print(result.output) ```python # Cell 5 — structured output with validation from pydantic import BaseModel -from fireflyframework_genai.validation import OutputReviewer +from fireflyframework_agentic.validation import OutputReviewer class Summary(BaseModel): title: str @@ -818,8 +818,8 @@ Detailed guides for each module: ## Development ```bash -git clone https://github.com/fireflyframework/fireflyframework-genai.git -cd fireflyframework-genai +git clone https://github.com/fireflyframework/fireflyframework-agentic.git +cd fireflyframework-agentic uv sync --all-extras ``` diff --git a/docs/README.md b/docs/README.md index fce00f17..f4cf61b7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# fireflyframework-genai — Documentation +# fireflyframework-agentic — Documentation [![Python 3.13+](https://img.shields.io/badge/python-3.13%2B-blue.svg)](https://www.python.org/downloads/) [![License: Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-green.svg)](../LICENSE) @@ -8,7 +8,7 @@ Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License --- -**fireflyframework-genai** is the production-grade GenAI metaframework built on +**fireflyframework-agentic** is the production-grade GenAI metaframework built on [Pydantic AI](https://ai.pydantic.dev/). It extends the engine with six composable layers — from core configuration through agent management, intelligent reasoning, experimentation, pipeline orchestration, and service exposure — so that every concern @@ -93,7 +93,7 @@ below it, keeping the dependency graph acyclic and each module independently tes | | | |---|---| -| **[REST Exposure](exposure-rest.md)** | `create_genai_app()`, auto-generated routes, SSE streaming, WebSocket, auth middleware, conversation CRUD, rate limiting, health checks | +| **[REST Exposure](exposure-rest.md)** | `create_agentic_app()`, auto-generated routes, SSE streaming, WebSocket, auth middleware, conversation CRUD, rate limiting, health checks | | **[Queue Exposure](exposure-queues.md)** | Kafka, RabbitMQ, Redis consumers/producers, `QueueRouter` | ### Studio @@ -140,7 +140,7 @@ standards, testing, and the pull request process. - **[Changelog](../CHANGELOG.md)** — Notable changes by version. - **[License](../LICENSE)** — Apache License 2.0. -- **[Repository](https://github.com/fireflyframework/fireflyframework-genai)** — Source code on GitHub. +- **[Repository](https://github.com/fireflyframework/fireflyframework-agentic)** — Source code on GitHub. - **[Pydantic AI](https://ai.pydantic.dev/)** — The underlying agent framework. --- diff --git a/docs/agents.md b/docs/agents.md index 33e65b58..c4de5cdd 100644 --- a/docs/agents.md +++ b/docs/agents.md @@ -9,7 +9,7 @@ a global registry, multi-agent delegation, execution context, and a decorator AP ## Concepts -An agent in fireflyframework-genai is a named, configured wrapper around a Pydantic AI +An agent in fireflyframework-agentic is a named, configured wrapper around a Pydantic AI agent. The framework manages its lifecycle (creation, startup, invocation, shutdown) and makes it discoverable through a central registry. @@ -53,7 +53,7 @@ classDiagram The simplest way to create and register an agent is with the `@firefly_agent` decorator: ```python -from fireflyframework_genai.agents import firefly_agent +from fireflyframework_agentic.agents import firefly_agent @firefly_agent(name="writer", model="openai:gpt-4o") def writer_instructions(ctx): @@ -66,8 +66,8 @@ dynamic instructions provider, and registers the agent in the global `AgentRegis ### Using the Class Directly ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.agents.registry import agent_registry +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.agents.registry import agent_registry agent = FireflyAgent(name="analyst", model="openai:gpt-4o") agent_registry.register(agent) @@ -81,7 +81,7 @@ keys), pass a pre-configured Pydantic AI `Model` instance instead of a string: ```python from pydantic_ai.models.openai import OpenAIChatModel from pydantic_ai.providers.openai import OpenAIProvider -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent model = OpenAIChatModel("gpt-4o", provider=OpenAIProvider(api_key="sk-...")) agent = FireflyAgent(name="analyst", model=model) @@ -105,8 +105,8 @@ parameter: This means you can mix and match all tool types freely: ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.tools.builtins import DateTimeTool, CalculatorTool +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.tools.builtins import DateTimeTool, CalculatorTool async def custom_lookup(query: str) -> str: return f"Result for {query}" @@ -127,7 +127,7 @@ Any part of the framework -- REST endpoints, queue consumers, delegation routers can look up an agent by name. ```python -from fireflyframework_genai.agents.registry import agent_registry +from fireflyframework_agentic.agents.registry import agent_registry agent = agent_registry.get("writer") result = await agent.run("Write a haiku about Python.") @@ -142,7 +142,7 @@ useful for initialising resources (database connections, caches) before the firs invocation and cleaning up afterwards. ```python -from fireflyframework_genai.agents.lifecycle import AgentLifecycle +from fireflyframework_agentic.agents.lifecycle import AgentLifecycle lifecycle = AgentLifecycle() lifecycle.on_init(lambda: print("Initialising")) @@ -173,7 +173,7 @@ flowchart TD Distributes requests evenly across a pool of agents: ```python -from fireflyframework_genai.agents.delegation import RoundRobinStrategy, DelegationRouter +from fireflyframework_agentic.agents.delegation import RoundRobinStrategy, DelegationRouter strategy = RoundRobinStrategy() router = DelegationRouter([agent_a, agent_b, agent_c], strategy) @@ -185,7 +185,7 @@ result = await router.route("Summarise this document.") Selects the first agent whose tags include a required capability: ```python -from fireflyframework_genai.agents.delegation import CapabilityStrategy, DelegationRouter +from fireflyframework_agentic.agents.delegation import CapabilityStrategy, DelegationRouter strategy = CapabilityStrategy(required_tag="translation") router = DelegationRouter([agent_a, agent_b], strategy) @@ -199,7 +199,7 @@ agent from the pool. Ideal when agents have overlapping capabilities and simple tag matching is insufficient: ```python -from fireflyframework_genai.agents.delegation import ContentBasedStrategy, DelegationRouter +from fireflyframework_agentic.agents.delegation import ContentBasedStrategy, DelegationRouter strategy = ContentBasedStrategy(model="openai:gpt-4o-mini") router = DelegationRouter([agent_a, agent_b, agent_c], strategy) @@ -216,7 +216,7 @@ Selects the agent backed by the cheapest model. Agents are ranked by approximate cost tiers derived from their `model_name` attribute: ```python -from fireflyframework_genai.agents.delegation import CostAwareStrategy, DelegationRouter +from fireflyframework_agentic.agents.delegation import CostAwareStrategy, DelegationRouter strategy = CostAwareStrategy() router = DelegationRouter([expensive_agent, cheap_agent], strategy) @@ -233,7 +233,7 @@ Unknown models are assigned a middle-tier cost. Attach a `MemoryManager` to an agent to enable multi-turn conversation history and a working-memory scratchpad. When you pass `conversation_id` to `run()`/`run_sync()`/`run_stream()`, the agent automatically loads and persists `message_history`. ```python -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(max_conversation_tokens=32_000) agent = FireflyAgent(name="assistant", model="openai:gpt-4o", memory=memory) @@ -250,9 +250,9 @@ When memory is attached, it is automatically forwarded to the pattern and the final output is persisted as a conversation turn. ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.memory import MemoryManager -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.memory import MemoryManager +from fireflyframework_agentic.reasoning import ReActPattern memory = MemoryManager() agent = FireflyAgent(name="thinker", model="openai:gpt-4o", memory=memory) @@ -284,7 +284,7 @@ The framework ships with five pre-built template agents as factory functions: See the [Template Agents Guide](templates.md) for full documentation and examples. ```python -from fireflyframework_genai.agents.templates import create_summarizer_agent +from fireflyframework_agentic.agents.templates import create_summarizer_agent agent = create_summarizer_agent(model="openai:gpt-4o", max_length="short") result = await agent.run("Summarize this document: ...") @@ -302,7 +302,7 @@ enabling the framework logger. ### Enabling Logging ```python -from fireflyframework_genai import configure_logging +from fireflyframework_agentic import configure_logging configure_logging("INFO") # agent calls, reasoning progress, timing configure_logging("DEBUG") # + memory injection, turn persistence, LLM timing @@ -311,7 +311,7 @@ configure_logging("DEBUG") # + memory injection, turn persistence, LLM timing Or use the shortcut: ```python -from fireflyframework_genai import enable_debug +from fireflyframework_agentic import enable_debug enable_debug() ``` @@ -355,7 +355,7 @@ At **DEBUG** level: - Memory injection and turn persistence with conversation ID. - Usage tracking failures (when cost tracking is active). -The logging uses the `fireflyframework_genai` logger hierarchy, so it does +The logging uses the `fireflyframework_agentic` logger hierarchy, so it does not affect application-level or third-party loggers. --- @@ -368,7 +368,7 @@ via the configured `CostCalculator`, and feed a `UsageRecord` to the global `default_usage_tracker`. This happens transparently — no code changes are needed. ```python -from fireflyframework_genai.observability import default_usage_tracker +from fireflyframework_agentic.observability import default_usage_tracker # After running agents, inspect usage summary = default_usage_tracker.get_summary() @@ -381,10 +381,10 @@ agent_summary = default_usage_tracker.get_summary_for_agent("my-agent") Configure via environment variables: ```bash -FIREFLY_GENAI_COST_TRACKING_ENABLED=true # default -FIREFLY_GENAI_BUDGET_ALERT_THRESHOLD_USD=5.00 -FIREFLY_GENAI_BUDGET_LIMIT_USD=10.00 -FIREFLY_GENAI_COST_CALCULATOR=auto # auto | static | genai_prices +FIREFLY_AGENTIC_COST_TRACKING_ENABLED=true # default +FIREFLY_AGENTIC_BUDGET_ALERT_THRESHOLD_USD=5.00 +FIREFLY_AGENTIC_BUDGET_LIMIT_USD=10.00 +FIREFLY_AGENTIC_COST_CALCULATOR=auto # auto | static | genai_prices ``` See the [Observability Guide](observability.md#usage-tracking) for full details. @@ -409,7 +409,7 @@ flowchart LR Implement the `AgentMiddleware` protocol — both hooks are optional: ```python -from fireflyframework_genai.agents.middleware import AgentMiddleware, MiddlewareContext +from fireflyframework_agentic.agents.middleware import AgentMiddleware, MiddlewareContext import time class AuditMiddleware: @@ -428,7 +428,7 @@ Pass middleware at construction time, via the `@firefly_agent` decorator, or add to the chain dynamically: ```python -from fireflyframework_genai.agents import FireflyAgent, firefly_agent +from fireflyframework_agentic.agents import FireflyAgent, firefly_agent # At construction agent = FireflyAgent( @@ -457,7 +457,7 @@ order (LIFO). context. It is auto-wired by default alongside `LoggingMiddleware`. ```python -from fireflyframework_genai.agents.builtin_middleware import RetryMiddleware +from fireflyframework_agentic.agents.builtin_middleware import RetryMiddleware # Custom retry settings agent = FireflyAgent( @@ -492,7 +492,7 @@ If you provide your own `LoggingMiddleware` instance in the `middleware` list, the framework will not add a second one (no duplication): ```python -from fireflyframework_genai.agents import FireflyAgent, LoggingMiddleware +from fireflyframework_agentic.agents import FireflyAgent, LoggingMiddleware import logging # Custom logging level — only one LoggingMiddleware ends up in the chain @@ -521,7 +521,7 @@ Parameters: - **`include_usage`** — Whether to extract token/cost data from the result (default: `True`). ```python -from fireflyframework_genai.agents import FireflyAgent, LoggingMiddleware +from fireflyframework_agentic.agents import FireflyAgent, LoggingMiddleware import logging agent = FireflyAgent( @@ -538,7 +538,7 @@ prompts raise a `PromptGuardError`. Set `sanitise=True` to redact suspicious fragments instead of rejecting. ```python -from fireflyframework_genai.agents import FireflyAgent, PromptGuardMiddleware +from fireflyframework_agentic.agents import FireflyAgent, PromptGuardMiddleware agent = FireflyAgent( name="safe-agent", @@ -557,7 +557,7 @@ agent = FireflyAgent( You can also supply a custom `PromptGuard` instance with extra patterns: ```python -from fireflyframework_genai.security import PromptGuard +from fireflyframework_agentic.security import PromptGuard guard = PromptGuard(custom_patterns=[r"(?i)drop\s+table"], sanitise=True) agent = FireflyAgent( @@ -574,7 +574,7 @@ Scans LLM output for PII, secrets, harmful content, and custom patterns `OutputGuardError`. Set `sanitise=True` to redact matches instead. ```python -from fireflyframework_genai.agents.builtin_middleware import OutputGuardMiddleware +from fireflyframework_agentic.agents.builtin_middleware import OutputGuardMiddleware agent = FireflyAgent( name="safe-output", @@ -613,7 +613,7 @@ Parameters: the middleware checks whether a single call exceeded this limit. ```python -from fireflyframework_genai.agents import FireflyAgent, CostGuardMiddleware +from fireflyframework_agentic.agents import FireflyAgent, CostGuardMiddleware agent = FireflyAgent( name="budget-agent", @@ -646,7 +646,7 @@ Records decision traces via `TraceRecorder` for audit and explainability. Not auto-wired — enable it explicitly. ```python -from fireflyframework_genai.agents.builtin_middleware import ExplainabilityMiddleware +from fireflyframework_agentic.agents.builtin_middleware import ExplainabilityMiddleware agent = FireflyAgent( name="audited-agent", @@ -661,8 +661,8 @@ Caches agent results via a `ResultCache`. On `before_run`, checks the cache; on `after_run`, stores the result on miss. ```python -from fireflyframework_genai.agents.cache import ResultCache -from fireflyframework_genai.agents.builtin_middleware import CacheMiddleware +from fireflyframework_agentic.agents.cache import ResultCache +from fireflyframework_agentic.agents.builtin_middleware import CacheMiddleware cache = ResultCache(ttl_seconds=300) agent = FireflyAgent( @@ -678,8 +678,8 @@ Validates agent output using an `OutputReviewer`. After the agent runs, the output is parsed and validated without re-running the agent. ```python -from fireflyframework_genai.validation import OutputReviewer -from fireflyframework_genai.agents.builtin_middleware import ValidationMiddleware +from fireflyframework_agentic.validation import OutputReviewer +from fireflyframework_agentic.agents.builtin_middleware import ValidationMiddleware reviewer = OutputReviewer(output_type=MyModel, max_retries=0) agent = FireflyAgent( @@ -703,7 +703,7 @@ Parameters: - **`enabled`** — Enable/disable caching (default: `True`). ```python -from fireflyframework_genai.agents.prompt_cache import PromptCacheMiddleware +from fireflyframework_agentic.agents.prompt_cache import PromptCacheMiddleware agent = FireflyAgent( name="cached-agent", @@ -743,7 +743,7 @@ Parameters: - **`enabled`** — Enable/disable circuit breaker (default: `True`). ```python -from fireflyframework_genai.resilience.circuit_breaker import CircuitBreakerMiddleware +from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreakerMiddleware agent = FireflyAgent( name="resilient-agent", @@ -762,7 +762,7 @@ instead of waiting for timeouts. This protects downstream services and allows the failing service time to recover. ```python -from fireflyframework_genai.resilience.circuit_breaker import CircuitBreakerOpenError +from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreakerOpenError try: result = await agent.run("Question") @@ -776,16 +776,16 @@ except CircuitBreakerOpenError: Combine multiple middleware for production: ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.agents.builtin_middleware import ( +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.agents.builtin_middleware import ( LoggingMiddleware, PromptGuardMiddleware, OutputGuardMiddleware, CostGuardMiddleware, ObservabilityMiddleware, ) -from fireflyframework_genai.agents.prompt_cache import PromptCacheMiddleware -from fireflyframework_genai.resilience.circuit_breaker import CircuitBreakerMiddleware +from fireflyframework_agentic.agents.prompt_cache import PromptCacheMiddleware +from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreakerMiddleware agent = FireflyAgent( name="production-agent", @@ -848,8 +848,8 @@ tokens, while buffered mode provides `stream_text()` for complete chunks. All middleware work seamlessly with both streaming modes: ```python -from fireflyframework_genai.agents.prompt_cache import PromptCacheMiddleware -from fireflyframework_genai.resilience.circuit_breaker import CircuitBreakerMiddleware +from fireflyframework_agentic.agents.prompt_cache import PromptCacheMiddleware +from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreakerMiddleware agent = FireflyAgent( name="streaming-agent", @@ -909,7 +909,7 @@ flowchart LR ``` ```python -from fireflyframework_genai.agents.fallback import FallbackModelWrapper, run_with_fallback +from fireflyframework_agentic.agents.fallback import FallbackModelWrapper, run_with_fallback fallback = FallbackModelWrapper( models=["openai:gpt-4o", "openai:gpt-4o-mini", "openai:gpt-3.5-turbo"], @@ -958,7 +958,7 @@ the model name and prompt text. Useful for deduplicating identical requests in batch pipelines or high-traffic REST endpoints. ```python -from fireflyframework_genai.agents.cache import ResultCache +from fireflyframework_agentic.agents.cache import ResultCache cache = ResultCache(ttl_seconds=300, max_size=100) @@ -990,7 +990,7 @@ through an agent's invocation chain. It is available to tools and reasoning patt during execution. ```python -from fireflyframework_genai.agents.context import AgentContext +from fireflyframework_agentic.agents.context import AgentContext ctx = AgentContext(correlation_id="req-123", metadata={"user": "alice"}) ``` diff --git a/docs/api-reference.md b/docs/api-reference.md index 8c463989..c0c370ca 100644 --- a/docs/api-reference.md +++ b/docs/api-reference.md @@ -163,7 +163,7 @@ Each returns an array of `{"name": "...", "description": "..."}` objects. } ``` -**Response**: `{"code": "from fireflyframework_genai.agents import FireflyAgent\n..."}` +**Response**: `{"code": "from fireflyframework_agentic.agents import FireflyAgent\n..."}` --- diff --git a/docs/architecture.md b/docs/architecture.md index ea4641bf..85bbeebd 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -2,7 +2,7 @@ Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. -This document describes the high-level architecture of fireflyframework-genai, the +This document describes the high-level architecture of fireflyframework-agentic, the relationships between its modules, and the design principles that guided its construction. --- @@ -16,7 +16,7 @@ The framework follows four guiding principles: modifying framework internals. 2. **Convention over configuration** -- Sensible defaults are provided for every setting. - A single `FireflyGenAIConfig` object (backed by Pydantic Settings) centralises + A single `FireflyAgenticConfig` object (backed by Pydantic Settings) centralises configuration and supports environment-variable overrides. 3. **Layered composition** -- Modules are organised into layers (Core, Agent, Intelligence, @@ -33,7 +33,7 @@ The framework follows four guiding principles: ```mermaid graph TD subgraph Exposure Layer - REST["REST API
create_genai_app · SSE streaming · WebSocket
health · auth middleware · router · conversations
RateLimiter
"] + REST["REST API
create_agentic_app · SSE streaming · WebSocket
health · auth middleware · router · conversations
RateLimiter
"] QUEUES["Message Queues
Kafka · RabbitMQ · Redis
consumers · producers · QueueRouter
"] end @@ -66,9 +66,9 @@ graph TD end subgraph Core Layer - CFG["Config
FireflyGenAIConfig
get_config · reset_config
"] + CFG["Config
FireflyAgenticConfig
get_config · reset_config
"] TYPES["Types & Protocols
AgentLike · 10 protocols
TypeVars · type aliases
"] - EXC["Exceptions
FireflyGenAIError hierarchy
18 exception classes
"] + EXC["Exceptions
FireflyAgenticError hierarchy
18 exception classes
"] PLUG["Plugin System
PluginDiscovery
3 entry-point groups
"] end @@ -207,9 +207,9 @@ The Core layer provides foundational types, configuration, exceptions, and the p system. Every other module depends on at least one Core component. - **types.py** -- Enumerations for model providers, agent states, and log levels. -- **config.py** -- `FireflyGenAIConfig`, a Pydantic Settings singleton that reads +- **config.py** -- `FireflyAgenticConfig`, a Pydantic Settings singleton that reads from environment variables and `.env` files. -- **exceptions.py** -- A structured exception hierarchy rooted at `FireflyGenAIError`. +- **exceptions.py** -- A structured exception hierarchy rooted at `FireflyAgenticError`. - **plugin.py** -- `PluginDiscovery` discovers and loads entry-point plugins at startup. ### Security Layer @@ -343,7 +343,7 @@ observability and explainability artefacts. ```mermaid sequenceDiagram participant Client - participant REST as REST API
(create_genai_app) + participant REST as REST API
(create_agentic_app) participant MW as Middleware
(CORS · RequestID) participant Reg as AgentRegistry participant Agent as FireflyAgent @@ -512,17 +512,17 @@ graph TD ## Plugin System Plugins are discovered via Python entry points under three well-known groups: -`fireflyframework_genai.agents`, `fireflyframework_genai.tools`, and -`fireflyframework_genai.reasoning_patterns`. The `PluginDiscovery` class scans +`fireflyframework_agentic.agents`, `fireflyframework_agentic.tools`, and +`fireflyframework_agentic.reasoning_patterns`. The `PluginDiscovery` class scans these groups and loads the referenced objects so they can self-register with their respective registries. ```mermaid flowchart LR subgraph Package pyproject.toml - EP1["fireflyframework_genai.agents
my_agent = my_pkg:MyAgent"] - EP2["fireflyframework_genai.tools
my_tool = my_pkg:MyTool"] - EP3["fireflyframework_genai.reasoning_patterns
my_pattern = my_pkg:MyPattern"] + EP1["fireflyframework_agentic.agents
my_agent = my_pkg:MyAgent"] + EP2["fireflyframework_agentic.tools
my_tool = my_pkg:MyTool"] + EP3["fireflyframework_agentic.reasoning_patterns
my_pattern = my_pkg:MyPattern"] end PD["PluginDiscovery
discover_all() · discover_group()"] @@ -544,17 +544,17 @@ flowchart LR To create a plugin, add entry points in your package's `pyproject.toml`: ```toml -[project.entry-points."fireflyframework_genai.agents"] +[project.entry-points."fireflyframework_agentic.agents"] my_agent = "my_package.agents:MyAgent" -[project.entry-points."fireflyframework_genai.tools"] +[project.entry-points."fireflyframework_agentic.tools"] my_tool = "my_package.tools:MyTool" ``` Then call discovery at startup: ```python -from fireflyframework_genai.plugin import PluginDiscovery +from fireflyframework_agentic.plugin import PluginDiscovery result = PluginDiscovery.discover_all() print(f"Loaded {len(result.successful)} plugins, {len(result.failed)} failed") @@ -564,20 +564,20 @@ print(f"Loaded {len(result.successful)} plugins, {len(result.failed)} failed") ## Configuration -All configuration is managed through `FireflyGenAIConfig`, which reads values from -environment variables prefixed with `FIREFLY_GENAI_`. For example: +All configuration is managed through `FireflyAgenticConfig`, which reads values from +environment variables prefixed with `FIREFLY_AGENTIC_`. For example: ```bash -export FIREFLY_GENAI_DEFAULT_MODEL=openai:gpt-4o -export FIREFLY_GENAI_LOG_LEVEL=DEBUG -export FIREFLY_GENAI_OTEL_ENDPOINT=http://localhost:4317 +export FIREFLY_AGENTIC_DEFAULT_MODEL=openai:gpt-4o +export FIREFLY_AGENTIC_LOG_LEVEL=DEBUG +export FIREFLY_AGENTIC_OTEL_ENDPOINT=http://localhost:4317 ``` The configuration singleton is available via: ```python -from fireflyframework_genai.core import FireflyGenAIConfig +from fireflyframework_agentic.core import FireflyAgenticConfig -config = FireflyGenAIConfig() +config = FireflyAgenticConfig() print(config.default_model) ``` diff --git a/docs/content.md b/docs/content.md index 98e73821..b46cb0d2 100644 --- a/docs/content.md +++ b/docs/content.md @@ -19,7 +19,7 @@ images, and other artefacts that exceed a model's context window. - **paragraph** -- Splits at paragraph boundaries (double newlines). ```python -from fireflyframework_genai.content.chunking import TextChunker +from fireflyframework_agentic.content.chunking import TextChunker chunker = TextChunker(chunk_size=4000, chunk_overlap=200, strategy="token") chunks = chunker.chunk(long_text) @@ -36,7 +36,7 @@ and an open `metadata` dictionary. rules (`---`). Segments shorter than `min_length` are discarded. ```python -from fireflyframework_genai.content.chunking import DocumentSplitter +from fireflyframework_agentic.content.chunking import DocumentSplitter splitter = DocumentSplitter(min_length=50) segments = splitter.split(raw_text) @@ -48,7 +48,7 @@ segments = splitter.split(raw_text) of high-resolution images that exceed the model's pixel budget. ```python -from fireflyframework_genai.content.chunking import ImageTiler +from fireflyframework_agentic.content.chunking import ImageTiler tiler = ImageTiler(tile_width=1024, tile_height=1024, overlap=128) tiles = tiler.compute_tiles(image_width=4096, image_height=3072) @@ -63,7 +63,7 @@ and `col` fields. parallelism and an optional result aggregator. ```python -from fireflyframework_genai.content.chunking import BatchProcessor +from fireflyframework_agentic.content.chunking import BatchProcessor processor = BatchProcessor(concurrency=4) results = await processor.process(agent, chunks) @@ -79,7 +79,7 @@ results = await processor.process(agent, chunks) words-to-tokens ratio (default: `1.33`). ```python -from fireflyframework_genai.content.compression import TokenEstimator +from fireflyframework_agentic.content.compression import TokenEstimator estimator = TokenEstimator() tokens = estimator.estimate("Hello world, this is a test.") @@ -95,7 +95,7 @@ pluggable strategies: - **MapReduceStrategy** -- Chunks the text, summarises each chunk, then merges. ```python -from fireflyframework_genai.content.compression import ( +from fireflyframework_agentic.content.compression import ( ContextCompressor, TruncationStrategy, ) @@ -110,7 +110,7 @@ compressed = await compressor.compress(long_text, max_tokens=2000) keeping total token usage within a budget by evicting the oldest items. ```python -from fireflyframework_genai.content.compression import SlidingWindowManager +from fireflyframework_agentic.content.compression import SlidingWindowManager window = SlidingWindowManager(max_tokens=8000) window.add("First message") diff --git a/docs/embeddings.md b/docs/embeddings.md index 1c08c925..e1b0e531 100644 --- a/docs/embeddings.md +++ b/docs/embeddings.md @@ -37,7 +37,7 @@ graph TD ## Quick Start ```python -from fireflyframework_genai.embeddings.providers import OpenAIEmbedder +from fireflyframework_agentic.embeddings.providers import OpenAIEmbedder # Create an embedder embedder = OpenAIEmbedder(model="text-embedding-3-small") @@ -60,7 +60,7 @@ print(len(vector)) # 1536 ### OpenAI ```python -from fireflyframework_genai.embeddings.providers import OpenAIEmbedder +from fireflyframework_agentic.embeddings.providers import OpenAIEmbedder embedder = OpenAIEmbedder( model="text-embedding-3-small", # or "text-embedding-3-large" @@ -69,12 +69,12 @@ embedder = OpenAIEmbedder( ) ``` -Install: `pip install fireflyframework-genai[openai-embeddings]` +Install: `pip install fireflyframework-agentic[openai-embeddings]` ### Azure OpenAI ```python -from fireflyframework_genai.embeddings.providers import AzureEmbedder +from fireflyframework_agentic.embeddings.providers import AzureEmbedder embedder = AzureEmbedder( model="my-embedding-deployment", @@ -85,12 +85,12 @@ embedder = AzureEmbedder( ) ``` -Install: `pip install fireflyframework-genai[azure-embeddings]` +Install: `pip install fireflyframework-agentic[azure-embeddings]` ### Cohere ```python -from fireflyframework_genai.embeddings.providers import CohereEmbedder +from fireflyframework_agentic.embeddings.providers import CohereEmbedder embedder = CohereEmbedder( model="embed-english-v3.0", @@ -99,12 +99,12 @@ embedder = CohereEmbedder( ) ``` -Install: `pip install fireflyframework-genai[cohere-embeddings]` +Install: `pip install fireflyframework-agentic[cohere-embeddings]` ### Google Generative AI ```python -from fireflyframework_genai.embeddings.providers import GoogleEmbedder +from fireflyframework_agentic.embeddings.providers import GoogleEmbedder embedder = GoogleEmbedder( model="models/text-embedding-004", @@ -112,12 +112,12 @@ embedder = GoogleEmbedder( ) ``` -Install: `pip install fireflyframework-genai[google-embeddings]` +Install: `pip install fireflyframework-agentic[google-embeddings]` ### Mistral ```python -from fireflyframework_genai.embeddings.providers import MistralEmbedder +from fireflyframework_agentic.embeddings.providers import MistralEmbedder embedder = MistralEmbedder( model="mistral-embed", @@ -125,12 +125,12 @@ embedder = MistralEmbedder( ) ``` -Install: `pip install fireflyframework-genai[mistral-embeddings]` +Install: `pip install fireflyframework-agentic[mistral-embeddings]` ### Voyage AI ```python -from fireflyframework_genai.embeddings.providers import VoyageEmbedder +from fireflyframework_agentic.embeddings.providers import VoyageEmbedder embedder = VoyageEmbedder( model="voyage-3", @@ -138,12 +138,12 @@ embedder = VoyageEmbedder( ) ``` -Install: `pip install fireflyframework-genai[voyage-embeddings]` +Install: `pip install fireflyframework-agentic[voyage-embeddings]` ### AWS Bedrock ```python -from fireflyframework_genai.embeddings.providers import BedrockEmbedder +from fireflyframework_agentic.embeddings.providers import BedrockEmbedder embedder = BedrockEmbedder( model="amazon.titan-embed-text-v2:0", @@ -151,12 +151,12 @@ embedder = BedrockEmbedder( ) ``` -Install: `pip install fireflyframework-genai[bedrock-embeddings]` +Install: `pip install fireflyframework-agentic[bedrock-embeddings]` ### Ollama (Local) ```python -from fireflyframework_genai.embeddings.providers import OllamaEmbedder +from fireflyframework_agentic.embeddings.providers import OllamaEmbedder embedder = OllamaEmbedder( model="nomic-embed-text", @@ -164,7 +164,7 @@ embedder = OllamaEmbedder( ) ``` -Install: `pip install fireflyframework-genai[ollama-embeddings]` +Install: `pip install fireflyframework-agentic[ollama-embeddings]` --- @@ -173,7 +173,7 @@ Install: `pip install fireflyframework-genai[ollama-embeddings]` Built-in functions for comparing embedding vectors: ```python -from fireflyframework_genai.embeddings import cosine_similarity, euclidean_distance, dot_product +from fireflyframework_agentic.embeddings import cosine_similarity, euclidean_distance, dot_product a = [0.1, 0.2, 0.3] b = [0.4, 0.5, 0.6] @@ -190,8 +190,8 @@ dot_product(a, b) # raw dot product Manage multiple named embedder instances: ```python -from fireflyframework_genai.embeddings import EmbedderRegistry -from fireflyframework_genai.embeddings.providers import OpenAIEmbedder, CohereEmbedder +from fireflyframework_agentic.embeddings import EmbedderRegistry +from fireflyframework_agentic.embeddings.providers import OpenAIEmbedder, CohereEmbedder registry = EmbedderRegistry() registry.register("openai", OpenAIEmbedder()) @@ -209,7 +209,7 @@ registry.unregister("cohere") ## Auto-Batching `BaseEmbedder` automatically splits large text lists into provider-sized batches -(default: 100, configurable via `FireflyGenAIConfig.embedding_batch_size`). +(default: 100, configurable via `FireflyAgenticConfig.embedding_batch_size`). Subclasses only need to implement `_embed_batch()` for a single batch. ```python @@ -223,13 +223,13 @@ assert len(result.embeddings) == 500 ## Configuration -Global defaults via environment variables (prefix `FIREFLY_GENAI_`): +Global defaults via environment variables (prefix `FIREFLY_AGENTIC_`): | Setting | Env Variable | Default | |---------|-------------|---------| -| `default_embedding_model` | `FIREFLY_GENAI_DEFAULT_EMBEDDING_MODEL` | `openai:text-embedding-3-small` | -| `embedding_batch_size` | `FIREFLY_GENAI_EMBEDDING_BATCH_SIZE` | `100` | -| `embedding_max_retries` | `FIREFLY_GENAI_EMBEDDING_MAX_RETRIES` | `3` | +| `default_embedding_model` | `FIREFLY_AGENTIC_DEFAULT_EMBEDDING_MODEL` | `openai:text-embedding-3-small` | +| `embedding_batch_size` | `FIREFLY_AGENTIC_EMBEDDING_BATCH_SIZE` | `100` | +| `embedding_max_retries` | `FIREFLY_AGENTIC_EMBEDDING_MAX_RETRIES` | `3` | --- @@ -238,7 +238,7 @@ Global defaults via environment variables (prefix `FIREFLY_GENAI_`): To create a custom embedding provider, subclass `BaseEmbedder` and implement `_embed_batch()`: ```python -from fireflyframework_genai.embeddings.base import BaseEmbedder +from fireflyframework_agentic.embeddings.base import BaseEmbedder class MyEmbedder(BaseEmbedder): def __init__(self, model: str = "my-model", **kwargs): @@ -256,7 +256,7 @@ class MyEmbedder(BaseEmbedder): Use embeddings in DAG pipelines: ```python -from fireflyframework_genai.pipeline import Pipeline, PipelineStep, EmbeddingStep +from fireflyframework_agentic.pipeline import Pipeline, PipelineStep, EmbeddingStep pipeline = Pipeline( steps=[ diff --git a/docs/experiments.md b/docs/experiments.md index 70036ce3..63abc936 100644 --- a/docs/experiments.md +++ b/docs/experiments.md @@ -30,7 +30,7 @@ flowchart TD ## Defining an Experiment ```python -from fireflyframework_genai.experiments import Experiment, Variant +from fireflyframework_agentic.experiments import Experiment, Variant experiment = Experiment( name="model_comparison", @@ -50,7 +50,7 @@ The `ExperimentRunner` executes each variant against a list of test inputs and collects metrics (latency, token usage, quality scores). ```python -from fireflyframework_genai.experiments import ExperimentRunner +from fireflyframework_agentic.experiments import ExperimentRunner runner = ExperimentRunner() results = await runner.run( @@ -67,7 +67,7 @@ The `ExperimentTracker` persists experiment results to disk (JSON) for later ana and reproducibility. ```python -from fireflyframework_genai.experiments import ExperimentTracker +from fireflyframework_agentic.experiments import ExperimentTracker tracker = ExperimentTracker(storage_dir="./experiment_results") tracker.save(results) @@ -82,7 +82,7 @@ The `VariantComparator` computes comparison metrics across experiment variants t determine which variant performs better. ```python -from fireflyframework_genai.experiments import VariantComparator +from fireflyframework_agentic.experiments import VariantComparator comparator = VariantComparator() metrics = comparator.compare(results) diff --git a/docs/explainability.md b/docs/explainability.md index 0cd42609..3fb8eed8 100644 --- a/docs/explainability.md +++ b/docs/explainability.md @@ -28,7 +28,7 @@ The `TraceRecorder` captures every decision an agent makes during execution: whi tool it chose, what reasoning path it followed, what alternatives it considered. ```python -from fireflyframework_genai.explainability import TraceRecorder +from fireflyframework_agentic.explainability import TraceRecorder recorder = TraceRecorder() recorder.record_decision( @@ -51,7 +51,7 @@ The `ExplanationGenerator` transforms raw decision records into natural-language explanations suitable for end users or auditors. ```python -from fireflyframework_genai.explainability import ExplanationGenerator +from fireflyframework_agentic.explainability import ExplanationGenerator generator = ExplanationGenerator() explanation = generator.generate(recorder.decisions) @@ -73,7 +73,7 @@ flowchart LR ``` ```python -from fireflyframework_genai.explainability import AuditTrail +from fireflyframework_agentic.explainability import AuditTrail trail = AuditTrail() trail.append(decision_record) @@ -88,7 +88,7 @@ The `ReportBuilder` compiles decisions, explanations, and audit entries into a structured report in Markdown or JSON format. ```python -from fireflyframework_genai.explainability import ReportBuilder +from fireflyframework_agentic.explainability import ReportBuilder builder = ReportBuilder() builder.add_decisions(recorder.decisions) diff --git a/docs/exposure-queues.md b/docs/exposure-queues.md index 4db1aa55..0dbe86a9 100644 --- a/docs/exposure-queues.md +++ b/docs/exposure-queues.md @@ -42,16 +42,16 @@ flowchart TD Install the queue extra for your broker: ```bash -uv add "fireflyframework-genai[kafka]" # Kafka -uv add "fireflyframework-genai[rabbitmq]" # RabbitMQ -uv add "fireflyframework-genai[redis]" # Redis -uv add "fireflyframework-genai[queues]" # All brokers +uv add "fireflyframework-agentic[kafka]" # Kafka +uv add "fireflyframework-agentic[rabbitmq]" # RabbitMQ +uv add "fireflyframework-agentic[redis]" # Redis +uv add "fireflyframework-agentic[queues]" # All brokers ``` ### Kafka ```python -from fireflyframework_genai.exposure.queues.kafka import KafkaAgentConsumer +from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentConsumer consumer = KafkaAgentConsumer( agent_name="assistant", @@ -65,7 +65,7 @@ await consumer.start() ### RabbitMQ ```python -from fireflyframework_genai.exposure.queues.rabbitmq import RabbitMQAgentConsumer +from fireflyframework_agentic.exposure.queues.rabbitmq import RabbitMQAgentConsumer consumer = RabbitMQAgentConsumer( agent_name="assistant", @@ -78,7 +78,7 @@ await consumer.start() ### Redis ```python -from fireflyframework_genai.exposure.queues.redis import RedisAgentConsumer +from fireflyframework_agentic.exposure.queues.redis import RedisAgentConsumer consumer = RedisAgentConsumer( agent_name="assistant", @@ -95,7 +95,7 @@ await consumer.start() All consumers and producers operate on `QueueMessage` objects: ```python -from fireflyframework_genai.exposure.queues import QueueMessage +from fireflyframework_agentic.exposure.queues import QueueMessage message = QueueMessage( body="Summarise this document.", @@ -121,7 +121,7 @@ flowchart TD ``` ```python -from fireflyframework_genai.exposure.queues import QueueRouter, QueueMessage +from fireflyframework_agentic.exposure.queues import QueueRouter, QueueMessage router = QueueRouter(default_agent="fallback") router.add_route(r"summary\..*", "summariser") @@ -139,7 +139,7 @@ To integrate with a message broker not supported out of the box, extend `BaseQueueConsumer` and implement the `start` and `stop` methods: ```python -from fireflyframework_genai.exposure.queues.base import BaseQueueConsumer +from fireflyframework_agentic.exposure.queues.base import BaseQueueConsumer class MyBrokerConsumer(BaseQueueConsumer): async def start(self) -> None: diff --git a/docs/exposure-rest.md b/docs/exposure-rest.md index 3ddb598e..660a35f7 100644 --- a/docs/exposure-rest.md +++ b/docs/exposure-rest.md @@ -28,15 +28,15 @@ flowchart TD Install the REST extra: ```bash -uv add "fireflyframework-genai[rest]" +uv add "fireflyframework-agentic[rest]" ``` Create a FastAPI application: ```python -from fireflyframework_genai.exposure.rest import create_genai_app +from fireflyframework_agentic.exposure.rest import create_agentic_app -app = create_genai_app(title="My GenAI Service", version="1.0.0") +app = create_agentic_app(title="My GenAI Service", version="1.0.0") ``` Run with Uvicorn: @@ -49,7 +49,7 @@ uvicorn myapp:app --reload ## Application Factory -The `create_genai_app` function creates a configured FastAPI application with: +The `create_agentic_app` function creates a configured FastAPI application with: - Agent routes auto-generated from the `AgentRegistry`. - Health-check endpoints at `/health` and `/health/ready`. @@ -57,7 +57,7 @@ The `create_genai_app` function creates a configured FastAPI application with: - CORS middleware with configurable origins. ```python -app = create_genai_app( +app = create_agentic_app( title="Production GenAI API", version="2.0.0", enable_cors=True, @@ -140,7 +140,7 @@ The REST layer includes a sliding-window rate limiter that can be applied as middleware to protect agents from excessive traffic. ```python -from fireflyframework_genai.exposure.rest.middleware import add_rate_limit_middleware +from fireflyframework_agentic.exposure.rest.middleware import add_rate_limit_middleware add_rate_limit_middleware( app, @@ -167,7 +167,7 @@ add_rate_limit_middleware( The `RateLimiter` class can also be used standalone outside of middleware: ```python -from fireflyframework_genai.exposure.rest.middleware import RateLimiter +from fireflyframework_agentic.exposure.rest.middleware import RateLimiter limiter = RateLimiter(max_requests=10, window_seconds=30.0) if not limiter.is_allowed("client-123"): @@ -188,7 +188,7 @@ When both are configured, a request is accepted if **either** method succeeds. Unauthenticated requests receive a `401 Unauthorized` response. ```python -from fireflyframework_genai.exposure.rest.middleware import add_auth_middleware +from fireflyframework_agentic.exposure.rest.middleware import add_auth_middleware add_auth_middleware( app, @@ -202,8 +202,8 @@ The authentication middleware is **auto-wired** when the config fields `auth_api_keys` or `auth_bearer_tokens` are set: ```bash -export FIREFLY_GENAI_AUTH_API_KEYS='["key-abc-123"]' -export FIREFLY_GENAI_AUTH_BEARER_TOKENS='["token-xyz"]' +export FIREFLY_AGENTIC_AUTH_API_KEYS='["key-abc-123"]' +export FIREFLY_AGENTIC_AUTH_BEARER_TOKENS='["token-xyz"]' ``` --- diff --git a/docs/input-output-nodes.md b/docs/input-output-nodes.md index 7e32ffb4..67b7a1aa 100644 --- a/docs/input-output-nodes.md +++ b/docs/input-output-nodes.md @@ -283,10 +283,10 @@ Compiler constraints: ## Python Data Models The configuration models live in -`fireflyframework_genai.studio.execution.io_nodes`: +`fireflyframework_agentic.studio.execution.io_nodes`: ```python -from fireflyframework_genai.studio.execution.io_nodes import ( +from fireflyframework_agentic.studio.execution.io_nodes import ( InputNodeConfig, OutputNodeConfig, QueueConfig, diff --git a/docs/lab.md b/docs/lab.md index 1279e020..40039383 100644 --- a/docs/lab.md +++ b/docs/lab.md @@ -40,7 +40,7 @@ A `LabSession` provides a conversational interface for testing an agent interact Each exchange is recorded with timestamps and metadata. ```python -from fireflyframework_genai.lab import LabSession +from fireflyframework_agentic.lab import LabSession session = LabSession(name="writing-test", agent=writer_agent) response = await session.interact("Write a haiku about testing.") @@ -59,7 +59,7 @@ The `Benchmark` runs an agent against a list of prompts and measures latency met (average, min, max, p95). ```python -from fireflyframework_genai.lab import Benchmark +from fireflyframework_agentic.lab import Benchmark bench = Benchmark(inputs=[ "Translate 'hello' to French.", @@ -94,7 +94,7 @@ The `ModelComparison` class runs the same prompts through multiple agents and co their outputs side by side. ```python -from fireflyframework_genai.lab import ModelComparison +from fireflyframework_agentic.lab import ModelComparison comparison = ModelComparison(prompts=[ "Write a haiku about Python.", @@ -115,7 +115,7 @@ The `EvalDataset` class manages collections of `EvalCase` test inputs and option expected outputs. Datasets can be loaded from JSON files or built programmatically. ```python -from fireflyframework_genai.lab import EvalDataset, EvalCase +from fireflyframework_agentic.lab import EvalDataset, EvalCase # Programmatically dataset = EvalDataset(cases=[ @@ -136,7 +136,7 @@ function. A `Scorer` is any callable `(expected: str, actual: str) -> float`. Th framework ships with `exact_match_scorer` as a default. ```python -from fireflyframework_genai.lab import EvalOrchestrator, EvalDataset, EvalCase +from fireflyframework_agentic.lab import EvalOrchestrator, EvalDataset, EvalCase # Custom scorer def fuzzy_scorer(expected: str, actual: str) -> float: diff --git a/docs/memory.md b/docs/memory.md index 2fc0eedb..dfd5d29c 100644 --- a/docs/memory.md +++ b/docs/memory.md @@ -37,8 +37,8 @@ graph TD ## Quick Start ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.memory import MemoryManager # Create a memory manager memory = MemoryManager(max_conversation_tokens=32_000) @@ -67,7 +67,7 @@ result2 = await agent.run("What about its type system?", conversation_id=conv_id automatically enforces a token budget by dropping oldest turns (FIFO). ```python -from fireflyframework_genai.memory import ConversationMemory +from fireflyframework_agentic.memory import ConversationMemory conv_mem = ConversationMemory(max_tokens=16_000) cid = conv_mem.new_conversation() @@ -108,7 +108,7 @@ Pass a `summarizer` callable that takes a list of `ConversationTurn` objects and returns a summary string: ```python -from fireflyframework_genai.memory import ConversationMemory +from fireflyframework_agentic.memory import ConversationMemory def my_summarizer(turns): texts = [f"{t.user_prompt} -> {t.assistant_response}" for t in turns] @@ -135,7 +135,7 @@ into a concise paragraph, preserving key facts while staying within budget. Configure the threshold via environment variable: ```bash -export FIREFLY_GENAI_MEMORY_SUMMARIZE_THRESHOLD=10 +export FIREFLY_AGENTIC_MEMORY_SUMMARIZE_THRESHOLD=10 ``` --- @@ -147,7 +147,7 @@ It is useful for passing context between pipeline steps, storing extraction results for validation, or maintaining entities across reasoning iterations. ```python -from fireflyframework_genai.memory import WorkingMemory +from fireflyframework_agentic.memory import WorkingMemory wm = WorkingMemory(scope_id="idp-session-42") wm.set("doc_type", "invoice") @@ -169,7 +169,7 @@ Multiple `WorkingMemory` instances can share the same store backend while maintaining independent namespaces: ```python -from fireflyframework_genai.memory import InMemoryStore, WorkingMemory +from fireflyframework_agentic.memory import InMemoryStore, WorkingMemory store = InMemoryStore() agent_a_mem = WorkingMemory(store=store, scope_id="agent_a") @@ -190,7 +190,7 @@ assert agent_b_mem.get("key") == "from B" Dict-backed, fast, non-persistent. Suitable for testing and short-lived sessions. ```python -from fireflyframework_genai.memory import InMemoryStore +from fireflyframework_agentic.memory import InMemoryStore store = InMemoryStore() ``` @@ -199,7 +199,7 @@ store = InMemoryStore() JSON file persistence. Each namespace is a separate file. ```python -from fireflyframework_genai.memory import FileStore +from fireflyframework_agentic.memory import FileStore store = FileStore(base_dir=".firefly_memory") ``` @@ -216,10 +216,10 @@ entries = await store.load_async("conversations") ### PostgreSQLStore Production-grade PostgreSQL persistence with connection pooling. Requires -`asyncpg` (install via `pip install fireflyframework-genai[postgres]`). +`asyncpg` (install via `pip install fireflyframework-agentic[postgres]`). ```python -from fireflyframework_genai.memory.database_store import PostgreSQLStore +from fireflyframework_agentic.memory.database_store import PostgreSQLStore store = PostgreSQLStore( url="postgresql://user:pass@localhost/firefly", @@ -233,9 +233,9 @@ memory = MemoryManager(store=store) **Environment Configuration:** ```bash -export FIREFLY_GENAI_MEMORY_BACKEND=postgres -export FIREFLY_GENAI_MEMORY_POSTGRES_URL=postgresql://user:pass@localhost/firefly -export FIREFLY_GENAI_MEMORY_POSTGRES_POOL_SIZE=10 +export FIREFLY_AGENTIC_MEMORY_BACKEND=postgres +export FIREFLY_AGENTIC_MEMORY_POSTGRES_URL=postgresql://user:pass@localhost/firefly +export FIREFLY_AGENTIC_MEMORY_POSTGRES_POOL_SIZE=10 ``` The store automatically creates required tables on first use. All operations @@ -262,10 +262,10 @@ CREATE INDEX idx_created_at ON firefly_memory(created_at); ### MongoDBStore Scalable MongoDB persistence with connection pooling. Requires `motor` and -`pymongo` (install via `pip install fireflyframework-genai[mongodb]`). +`pymongo` (install via `pip install fireflyframework-agentic[mongodb]`). ```python -from fireflyframework_genai.memory.database_store import MongoDBStore +from fireflyframework_agentic.memory.database_store import MongoDBStore store = MongoDBStore( url="mongodb://localhost:27017/", @@ -279,10 +279,10 @@ memory = MemoryManager(store=store) **Environment Configuration:** ```bash -export FIREFLY_GENAI_MEMORY_BACKEND=mongodb -export FIREFLY_GENAI_MEMORY_MONGODB_URL=mongodb://localhost:27017/ -export FIREFLY_GENAI_MEMORY_MONGODB_DATABASE=firefly -export FIREFLY_GENAI_MEMORY_MONGODB_POOL_SIZE=10 +export FIREFLY_AGENTIC_MEMORY_BACKEND=mongodb +export FIREFLY_AGENTIC_MEMORY_MONGODB_URL=mongodb://localhost:27017/ +export FIREFLY_AGENTIC_MEMORY_MONGODB_DATABASE=firefly +export FIREFLY_AGENTIC_MEMORY_MONGODB_POOL_SIZE=10 ``` The store automatically creates required collections and indexes: @@ -310,7 +310,7 @@ db.firefly_memory.createIndex({ created_at: 1 }) Implement the `MemoryStore` protocol for Redis, SQL, or any other backend: ```python -from fireflyframework_genai.memory import MemoryStore, MemoryEntry +from fireflyframework_agentic.memory import MemoryStore, MemoryEntry class RedisStore: def save(self, namespace: str, entry: MemoryEntry) -> None: ... @@ -352,7 +352,7 @@ suitable for `ConversationMemory`'s `summarizer` parameter. It uses an ephemeral Pydantic AI agent to compress evicted turns into a concise summary. ```python -from fireflyframework_genai.memory.summarization import create_llm_summarizer +from fireflyframework_agentic.memory.summarization import create_llm_summarizer summarizer = create_llm_summarizer(model="openai:gpt-4o-mini") conv_mem = ConversationMemory( @@ -382,7 +382,7 @@ strategy that extracts key sentences from the most recent turns. memory. It is the object you attach to agents, delegation routers, and pipelines. ```python -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.memory import MemoryManager mgr = MemoryManager( max_conversation_tokens=32_000, @@ -425,7 +425,7 @@ result = await agent.run("Hi", conversation_id=cid) ### Multi-Agent Delegation ```python -from fireflyframework_genai.agents.delegation import DelegationRouter, RoundRobinStrategy +from fireflyframework_agentic.agents.delegation import DelegationRouter, RoundRobinStrategy router = DelegationRouter([agent_a, agent_b], RoundRobinStrategy(), memory=mgr) result = await router.route("Translate this text.") @@ -435,7 +435,7 @@ result = await router.route("Translate this text.") ### Pipelines ```python -from fireflyframework_genai.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.context import PipelineContext ctx = PipelineContext(inputs=data, memory=mgr) result = await engine.run(context=ctx) @@ -469,8 +469,8 @@ Pass `conversation_id` in the request body for multi-turn conversations: Memory settings are configured via environment variables: ```bash -export FIREFLY_GENAI_MEMORY_BACKEND=in_memory # or "file" -export FIREFLY_GENAI_MEMORY_MAX_CONVERSATION_TOKENS=128000 -export FIREFLY_GENAI_MEMORY_SUMMARIZE_THRESHOLD=10 -export FIREFLY_GENAI_MEMORY_FILE_DIR=.firefly_memory +export FIREFLY_AGENTIC_MEMORY_BACKEND=in_memory # or "file" +export FIREFLY_AGENTIC_MEMORY_MAX_CONVERSATION_TOKENS=128000 +export FIREFLY_AGENTIC_MEMORY_SUMMARIZE_THRESHOLD=10 +export FIREFLY_AGENTIC_MEMORY_FILE_DIR=.firefly_memory ``` diff --git a/docs/observability.md b/docs/observability.md index 2ed89203..f4366eee 100644 --- a/docs/observability.md +++ b/docs/observability.md @@ -29,7 +29,7 @@ flowchart TD creating spans with GenAI-specific attributes (model name, token counts, agent name). ```python -from fireflyframework_genai.observability import FireflyTracer +from fireflyframework_agentic.observability import FireflyTracer tracer = FireflyTracer(service_name="my-genai-app") @@ -44,7 +44,7 @@ For convenience, the `@traced` decorator automatically creates a span around any function call: ```python -from fireflyframework_genai.observability import traced +from fireflyframework_agentic.observability import traced @traced(name="process_request") async def process_request(prompt: str) -> str: @@ -59,7 +59,7 @@ across service boundaries (HTTP, message queues, pipelines). **Trace Context Functions:** ```python -from fireflyframework_genai.observability.tracer import inject_trace_context, extract_trace_context +from fireflyframework_agentic.observability.tracer import inject_trace_context, extract_trace_context # Inject trace context into HTTP headers headers = {} @@ -82,7 +82,7 @@ The framework's REST API automatically propagates trace context: ```python # Middleware injects trace context into responses # and extracts from incoming requests -from fireflyframework_genai.exposure.rest.middleware import add_trace_propagation_middleware +from fireflyframework_agentic.exposure.rest.middleware import add_trace_propagation_middleware add_trace_propagation_middleware(app) ``` @@ -93,7 +93,7 @@ Message queue consumers/producers automatically propagate trace context: ```python # Kafka example - trace context in message headers -from fireflyframework_genai.exposure.queues.kafka import KafkaConsumer +from fireflyframework_agentic.exposure.queues.kafka import KafkaConsumer consumer = KafkaConsumer( topic="requests", @@ -107,7 +107,7 @@ consumer = KafkaConsumer( Traces flow through pipeline steps via `PipelineContext.correlation_id`: ```python -from fireflyframework_genai.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.context import PipelineContext # Create context with correlation ID for trace linking context = PipelineContext( @@ -127,7 +127,7 @@ result = await pipeline.run(context) measurements. ```python -from fireflyframework_genai.observability import FireflyMetrics +from fireflyframework_agentic.observability import FireflyMetrics metrics = FireflyMetrics(service_name="my-genai-app") metrics.increment("agent.invocations", labels={"agent": "writer"}) @@ -137,7 +137,7 @@ metrics.record_histogram("agent.latency_ms", 142.5, labels={"agent": "writer"}) ### The @metered Decorator ```python -from fireflyframework_genai.observability import metered +from fireflyframework_agentic.observability import metered @metered(name="agent_call") async def call_agent(prompt: str) -> str: @@ -152,7 +152,7 @@ async def call_agent(prompt: str) -> str: occurrences: agent started, tool invoked, reasoning step completed, error encountered. ```python -from fireflyframework_genai.observability import FireflyEvents +from fireflyframework_agentic.observability import FireflyEvents events = FireflyEvents() events.emit("agent.started", {"agent": "writer", "model": "gpt-4o"}) @@ -166,7 +166,7 @@ The `configure_exporters` function sets up OpenTelemetry exporters based on the framework's configuration: ```python -from fireflyframework_genai.observability import configure_exporters +from fireflyframework_agentic.observability import configure_exporters configure_exporters( otlp_endpoint="http://localhost:4317", @@ -187,7 +187,7 @@ The `UsageTracker` automatically records token usage, cost estimates, and latenc for every agent run, reasoning pattern step, and pipeline execution. ```python -from fireflyframework_genai.observability import default_usage_tracker +from fireflyframework_agentic.observability import default_usage_tracker # After running agents, inspect accumulated usage summary = default_usage_tracker.get_summary() @@ -207,12 +207,12 @@ are retained in memory. When the limit is exceeded, the oldest records are evicted (FIFO). This prevents unbounded memory growth in long-running services. ```python -from fireflyframework_genai.observability.usage import UsageTracker +from fireflyframework_agentic.observability.usage import UsageTracker tracker = UsageTracker(max_records=5_000) ``` -The default `max_records` is controlled by the `FIREFLY_GENAI_USAGE_TRACKER_MAX_RECORDS` +The default `max_records` is controlled by the `FIREFLY_AGENTIC_USAGE_TRACKER_MAX_RECORDS` environment variable (default: `10_000`). Set to `0` for unlimited retention (not recommended for production). @@ -242,13 +242,13 @@ Two cost calculator implementations are provided: exact match, prefix match (e.g. `openai:gpt-4o-2024-08-06` matches `openai:gpt-4o`), and **cross-provider alias matching** for proxy providers. - **`GenAIPricesCostCalculator`** — delegates to the optional `genai-prices` package - for up-to-date pricing data. Install with `pip install fireflyframework-genai[costs]`. + for up-to-date pricing data. Install with `pip install fireflyframework-agentic[costs]`. The `get_cost_calculator()` factory selects the best available calculator based on -the `FIREFLY_GENAI_COST_CALCULATOR` setting (`"auto"`, `"static"`, or `"genai_prices"`). +the `FIREFLY_AGENTIC_COST_CALCULATOR` setting (`"auto"`, `"static"`, or `"genai_prices"`). ```python -from fireflyframework_genai.observability import get_cost_calculator +from fireflyframework_agentic.observability import get_cost_calculator calc = get_cost_calculator() cost = calc.estimate("openai:gpt-4o", input_tokens=1000, output_tokens=500) @@ -276,8 +276,8 @@ routes the request to the underlying model. Configure budget thresholds via environment variables: ```bash -export FIREFLY_GENAI_BUDGET_ALERT_THRESHOLD_USD=5.00 -export FIREFLY_GENAI_BUDGET_LIMIT_USD=10.00 +export FIREFLY_AGENTIC_BUDGET_ALERT_THRESHOLD_USD=5.00 +export FIREFLY_AGENTIC_BUDGET_LIMIT_USD=10.00 ``` When cumulative cost exceeds the alert threshold, a `WARNING` is logged. @@ -287,7 +287,7 @@ Budget checking runs automatically on every `UsageTracker.record()` call. To disable cost tracking entirely: ```bash -export FIREFLY_GENAI_COST_TRACKING_ENABLED=false +export FIREFLY_AGENTIC_COST_TRACKING_ENABLED=false ``` --- @@ -298,7 +298,7 @@ The `QuotaManager` provides production-grade quota enforcement with rate limitin daily budget caps, and adaptive backoff for 429 rate limit responses. ```python -from fireflyframework_genai.observability.quota import QuotaManager +from fireflyframework_agentic.observability.quota import QuotaManager quota = QuotaManager( daily_budget_usd=100.0, @@ -327,7 +327,7 @@ quota.record_request("openai:gpt-4o", cost_usd=0.05, tokens=1500) `RateLimiter` implements a **sliding window** algorithm for precise rate limiting: ```python -from fireflyframework_genai.observability.quota import RateLimiter +from fireflyframework_agentic.observability.quota import RateLimiter limiter = RateLimiter(max_requests=60, window_seconds=60.0) @@ -345,7 +345,7 @@ The sliding window ensures accurate rate limiting without bursts at window bound `AdaptiveBackoff` automatically increases retry delays for 429 responses: ```python -from fireflyframework_genai.observability.quota import AdaptiveBackoff +from fireflyframework_agentic.observability.quota import AdaptiveBackoff backoff = AdaptiveBackoff( base_delay=1.0, # Start at 1 second @@ -376,21 +376,21 @@ The retry loop: 4. Uses `AdaptiveBackoff` for exponential delay with jitter 5. Resets backoff on success -Configuration via environment variables or `FireflyGenAIConfig`: +Configuration via environment variables or `FireflyAgenticConfig`: | Variable | Default | Description | |----------|---------|-------------| -| `FIREFLY_GENAI_RATE_LIMIT_MAX_RETRIES` | `3` | Max retry attempts for 429 errors | -| `FIREFLY_GENAI_RATE_LIMIT_BASE_DELAY` | `1.0` | Base delay in seconds | -| `FIREFLY_GENAI_RATE_LIMIT_MAX_DELAY` | `60.0` | Maximum delay between retries | +| `FIREFLY_AGENTIC_RATE_LIMIT_MAX_RETRIES` | `3` | Max retry attempts for 429 errors | +| `FIREFLY_AGENTIC_RATE_LIMIT_BASE_DELAY` | `1.0` | Base delay in seconds | +| `FIREFLY_AGENTIC_RATE_LIMIT_MAX_DELAY` | `60.0` | Maximum delay between retries | ```python -from fireflyframework_genai.config import get_config, reset_config +from fireflyframework_agentic.config import get_config, reset_config import os # Configure via environment -os.environ["FIREFLY_GENAI_RATE_LIMIT_MAX_RETRIES"] = "5" -os.environ["FIREFLY_GENAI_RATE_LIMIT_BASE_DELAY"] = "2.0" +os.environ["FIREFLY_AGENTIC_RATE_LIMIT_MAX_RETRIES"] = "5" +os.environ["FIREFLY_AGENTIC_RATE_LIMIT_BASE_DELAY"] = "2.0" reset_config() # Pick up new values # Or read current config @@ -408,21 +408,21 @@ When disabled, each agent creates a standalone backoff tracker. ```bash # Enable quota management (default: true) -export FIREFLY_GENAI_QUOTA_ENABLED=true +export FIREFLY_AGENTIC_QUOTA_ENABLED=true # Set daily budget cap -export FIREFLY_GENAI_QUOTA_BUDGET_DAILY_USD=100.0 +export FIREFLY_AGENTIC_QUOTA_BUDGET_DAILY_USD=100.0 # Configure per-model rate limits (JSON) -export FIREFLY_GENAI_QUOTA_RATE_LIMITS='{"openai:gpt-4o": 60, "anthropic:claude-opus-4": 50}' +export FIREFLY_AGENTIC_QUOTA_RATE_LIMITS='{"openai:gpt-4o": 60, "anthropic:claude-opus-4": 50}' # Enable adaptive backoff (default: true) -export FIREFLY_GENAI_QUOTA_ADAPTIVE_BACKOFF=true +export FIREFLY_AGENTIC_QUOTA_ADAPTIVE_BACKOFF=true # Rate limit retry settings -export FIREFLY_GENAI_RATE_LIMIT_MAX_RETRIES=3 -export FIREFLY_GENAI_RATE_LIMIT_BASE_DELAY=1.0 -export FIREFLY_GENAI_RATE_LIMIT_MAX_DELAY=60.0 +export FIREFLY_AGENTIC_RATE_LIMIT_MAX_RETRIES=3 +export FIREFLY_AGENTIC_RATE_LIMIT_BASE_DELAY=1.0 +export FIREFLY_AGENTIC_RATE_LIMIT_MAX_DELAY=60.0 ``` ### Integration with Agents @@ -430,8 +430,8 @@ export FIREFLY_GENAI_RATE_LIMIT_MAX_DELAY=60.0 Quota enforcement can be integrated via middleware or direct checks: ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.agents.builtin_middleware import CostGuardMiddleware +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.agents.builtin_middleware import CostGuardMiddleware # Budget enforcement via middleware agent = FireflyAgent( @@ -463,7 +463,7 @@ with `timestamp`, `level`, `logger`, and `message` fields. Enable JSON logging with the `format_style` parameter: ```python -from fireflyframework_genai import configure_logging +from fireflyframework_agentic import configure_logging configure_logging("INFO", format_style="json") ``` @@ -471,13 +471,13 @@ configure_logging("INFO", format_style="json") Example output: ```json -{"timestamp": "2026-01-15T10:30:00+00:00", "level": "INFO", "logger": "fireflyframework_genai.agents.base", "message": "run agent='writer' prompt='Write a...'"} +{"timestamp": "2026-01-15T10:30:00+00:00", "level": "INFO", "logger": "fireflyframework_agentic.agents.base", "message": "run agent='writer' prompt='Write a...'"} ``` The `JsonFormatter` class can also be used standalone with any Python logger: ```python -from fireflyframework_genai.logging import JsonFormatter +from fireflyframework_agentic.logging import JsonFormatter import logging handler = logging.StreamHandler() diff --git a/docs/pipeline.md b/docs/pipeline.md index 6dbba357..2a6c14fe 100644 --- a/docs/pipeline.md +++ b/docs/pipeline.md @@ -33,8 +33,8 @@ graph LR The `PipelineBuilder` provides a chainable API for constructing pipelines: ```python -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import AgentStep, CallableStep +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import AgentStep, CallableStep engine = ( PipelineBuilder("invoice-pipeline") @@ -57,8 +57,8 @@ The builder auto-wraps compatible objects: For full control, construct the DAG directly: ```python -from fireflyframework_genai.pipeline.dag import DAG, DAGNode, DAGEdge -from fireflyframework_genai.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.dag import DAG, DAGNode, DAGEdge +from fireflyframework_agentic.pipeline.engine import PipelineEngine dag = DAG("my-pipeline") dag.add_node(DAGNode(node_id="step_a", step=my_step)) @@ -108,7 +108,7 @@ graph TD ``` ```python -from fireflyframework_genai.pipeline.steps import FanOutStep, FanInStep +from fireflyframework_agentic.pipeline.steps import FanOutStep, FanInStep engine = ( PipelineBuilder("parallel") @@ -133,8 +133,8 @@ for cost and throughput. It's ideal for bulk classification, extraction, or summarization tasks. ```python -from fireflyframework_genai.pipeline.steps import BatchLLMStep -from fireflyframework_genai.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import BatchLLMStep +from fireflyframework_agentic.pipeline.builder import PipelineBuilder classifier = FireflyAgent( name="sentiment-classifier", @@ -199,8 +199,8 @@ BatchLLMStep respects all agent middleware including caching, circuit breakers, and cost guards: ```python -from fireflyframework_genai.agents.prompt_cache import PromptCacheMiddleware -from fireflyframework_genai.resilience.circuit_breaker import CircuitBreakerMiddleware +from fireflyframework_agentic.agents.prompt_cache import PromptCacheMiddleware +from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreakerMiddleware classifier = FireflyAgent( name="batch-classifier", @@ -253,7 +253,7 @@ receives the node's input and returns a string key. Downstream nodes use condition gates to check the branch key and execute only the matching path. ```python -from fireflyframework_genai.pipeline.steps import BranchStep, CallableStep +from fireflyframework_agentic.pipeline.steps import BranchStep, CallableStep def classify_intent(inputs): text = inputs.get("input", "") @@ -292,7 +292,7 @@ pipeline behaves when the node fails: - **`FAIL_PIPELINE`** -- Abort the entire pipeline immediately. ```python -from fireflyframework_genai.pipeline.dag import DAGNode, FailureStrategy +from fireflyframework_agentic.pipeline.dag import DAGNode, FailureStrategy dag.add_node(DAGNode( node_id="critical_step", @@ -335,8 +335,8 @@ marked as failed and the pipeline reports `success=False`. You can attach a `MemoryManager` to the `PipelineContext` so that all steps share conversation and working memory. `AgentStep` injects the memory into downstream agent runs; `ReasoningStep` passes it to patterns via the `memory` kwarg. ```python -from fireflyframework_genai.memory import MemoryManager -from fireflyframework_genai.pipeline.context import PipelineContext +from fireflyframework_agentic.memory import MemoryManager +from fireflyframework_agentic.pipeline.context import PipelineContext memory = MemoryManager(working_scope_id="invoice-run-42") ctx = PipelineContext(inputs=document_bytes, metadata={"source": "email"}, memory=memory) @@ -351,7 +351,7 @@ result = await engine.run(context=ctx) - Node results from completed upstream nodes. ```python -from fireflyframework_genai.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.context import PipelineContext ctx = PipelineContext( inputs=document_bytes, @@ -405,7 +405,7 @@ nodes start, complete, fail, or get skipped. Implement any subset of the five hooks: ```python -from fireflyframework_genai.pipeline.engine import PipelineEventHandler +from fireflyframework_agentic.pipeline.engine import PipelineEventHandler class MyHandler: async def on_node_start(self, node_id: str, pipeline_name: str) -> None: @@ -427,7 +427,7 @@ class MyHandler: Pass the handler when constructing the engine: ```python -from fireflyframework_genai.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.engine import PipelineEngine engine = PipelineEngine(dag, event_handler=MyHandler()) result = await engine.run(inputs="test") @@ -455,7 +455,7 @@ The compiler enforces that a pipeline has exactly one Input node and at least one Output node when boundary nodes are present. ```python -from fireflyframework_genai.studio.execution.io_nodes import ( +from fireflyframework_agentic.studio.execution.io_nodes import ( InputNodeConfig, OutputNodeConfig, QueueConfig, diff --git a/docs/prompts.md b/docs/prompts.md index dc4b4460..a4084fb5 100644 --- a/docs/prompts.md +++ b/docs/prompts.md @@ -47,7 +47,7 @@ classDiagram ## Creating a Template ```python -from fireflyframework_genai.prompts import PromptTemplate +from fireflyframework_agentic.prompts import PromptTemplate template = PromptTemplate( "greeting", @@ -66,7 +66,7 @@ The `PromptRegistry` supports multiple versions of the same template. When retri a template, you can request a specific version or get the latest one. ```python -from fireflyframework_genai.prompts import PromptRegistry +from fireflyframework_agentic.prompts import PromptRegistry registry = PromptRegistry() registry.register(template_v1) @@ -113,7 +113,7 @@ types match the expected schema before rendering. This prevents runtime errors i production. ```python -from fireflyframework_genai.prompts import PromptValidator +from fireflyframework_agentic.prompts import PromptValidator validator = PromptValidator(max_tokens=4000, required_sections=["You are a"]) rendered = template.render(name="Alice", role="developer") @@ -131,7 +131,7 @@ infers the template name from the filename and supports `.txt`, `.md`, and `.jin extensions. ```python -from fireflyframework_genai.prompts import PromptLoader +from fireflyframework_agentic.prompts import PromptLoader loader = PromptLoader() template = loader.load_file("prompts/greeting.jinja2") diff --git a/docs/reasoning.md b/docs/reasoning.md index 60fb68c0..5bcaf922 100644 --- a/docs/reasoning.md +++ b/docs/reasoning.md @@ -162,7 +162,7 @@ The model is resolved from: - **`ReasoningResult[T]`** — Generic result with typed `output: T`, `trace`, `steps_taken`, and `success`. ```python -from fireflyframework_genai.reasoning.models import ( +from fireflyframework_agentic.reasoning.models import ( ReasoningThought, ReasoningPlan, PlanStepDef, @@ -229,11 +229,11 @@ for step in result.trace.steps: ## Logging & Debugging Every reasoning pattern and the `FireflyAgent` emit structured log messages -under the `fireflyframework_genai` logger hierarchy. Use `configure_logging` +under the `fireflyframework_agentic` logger hierarchy. Use `configure_logging` to turn on framework-level logging without affecting other libraries: ```python -from fireflyframework_genai import configure_logging +from fireflyframework_agentic import configure_logging configure_logging("INFO") # pattern lifecycle, step progress, timing configure_logging("DEBUG") # + LLM call durations, prompt enrichment, memory ops @@ -242,7 +242,7 @@ configure_logging("DEBUG") # + LLM call durations, prompt enrichment, memory ops Or use the one-liner shortcut: ```python -from fireflyframework_genai import enable_debug +from fireflyframework_agentic import enable_debug enable_debug() # equivalent to configure_logging("DEBUG") ``` @@ -264,7 +264,7 @@ individual LLM calls against indefinite hangs. When a call exceeds the timeout, a `ReasoningError` is raised. ```python -from fireflyframework_genai.reasoning import PlanAndExecutePattern +from fireflyframework_agentic.reasoning import PlanAndExecutePattern pattern = PlanAndExecutePattern( max_steps=10, @@ -305,7 +305,7 @@ flowchart TD ``` ```python -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.reasoning import ReActPattern pattern = ReActPattern(max_steps=5) result = await pattern.execute(my_agent, "What is the population of Tokyo?") @@ -338,7 +338,7 @@ flowchart LR ``` ```python -from fireflyframework_genai.reasoning import ChainOfThoughtPattern +from fireflyframework_agentic.reasoning import ChainOfThoughtPattern pattern = ChainOfThoughtPattern(max_steps=10) result = await pattern.execute( @@ -383,7 +383,7 @@ flowchart TD ``` ```python -from fireflyframework_genai.reasoning import PlanAndExecutePattern +from fireflyframework_agentic.reasoning import PlanAndExecutePattern pattern = PlanAndExecutePattern(max_steps=15, allow_replan=True) result = await pattern.execute( @@ -423,7 +423,7 @@ flowchart TD ``` ```python -from fireflyframework_genai.reasoning import ReflexionPattern +from fireflyframework_agentic.reasoning import ReflexionPattern pattern = ReflexionPattern(max_steps=3) result = await pattern.execute( @@ -465,7 +465,7 @@ flowchart TD ``` ```python -from fireflyframework_genai.reasoning import TreeOfThoughtsPattern +from fireflyframework_agentic.reasoning import TreeOfThoughtsPattern pattern = TreeOfThoughtsPattern(branching_factor=3, max_depth=3) result = await pattern.execute( @@ -514,7 +514,7 @@ flowchart TD ``` ```python -from fireflyframework_genai.reasoning import GoalDecompositionPattern +from fireflyframework_agentic.reasoning import GoalDecompositionPattern pattern = GoalDecompositionPattern(max_steps=20) result = await pattern.execute( @@ -523,7 +523,7 @@ result = await pattern.execute( ) # Delegate tasks to a sub-pattern: -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.reasoning import ReActPattern pattern = GoalDecompositionPattern( max_steps=20, @@ -558,8 +558,8 @@ flowchart TD 4. **Store output** — On completion, the final output is stored under `reasoning:output`. ```python -from fireflyframework_genai.memory import MemoryManager -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.memory import MemoryManager +from fireflyframework_agentic.reasoning import ReActPattern memory = MemoryManager() pattern = ReActPattern(max_steps=10) @@ -592,7 +592,7 @@ flowchart LR ``` ```python -from fireflyframework_genai.reasoning import ( +from fireflyframework_agentic.reasoning import ( PlanAndExecutePattern, ReActPattern, ReasoningPipeline, @@ -621,8 +621,8 @@ by passing a `prompts` dict to the pattern constructor. Slots that are not overr use the built-in defaults. ```python -from fireflyframework_genai.prompts.template import PromptTemplate, PromptVariable -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.prompts.template import PromptTemplate, PromptVariable +from fireflyframework_agentic.reasoning import ReActPattern custom_thought = PromptTemplate( "my:react:thought", @@ -646,7 +646,7 @@ All built-in templates are registered in the global `prompt_registry` under the Templates can also be retrieved from the registry at runtime: ```python -from fireflyframework_genai.prompts.registry import prompt_registry +from fireflyframework_agentic.prompts.registry import prompt_registry thought_prompt = prompt_registry.get("reasoning:react:thought") ``` @@ -661,8 +661,8 @@ it does not match the expected schema. If all retries fail, the raw output is returned with a warning logged (non-fatal by default). ```python -from fireflyframework_genai.validation import OutputReviewer -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.validation import OutputReviewer +from fireflyframework_agentic.reasoning import ReActPattern from pydantic import BaseModel class MyOutput(BaseModel): @@ -685,8 +685,8 @@ patterns by name. All six built-in patterns can be registered at application startup, and custom patterns can be added dynamically. ```python -from fireflyframework_genai.reasoning.registry import reasoning_registry -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.reasoning.registry import reasoning_registry +from fireflyframework_agentic.reasoning import ReActPattern reasoning_registry.register("react", ReActPattern) @@ -704,9 +704,9 @@ the template method hooks. The base class handles the loop, tracing, memory, ste counting, and error handling for you. ```python -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern -from fireflyframework_genai.reasoning.models import ReasoningThought -from fireflyframework_genai.reasoning.trace import ThoughtStep, ReasoningStep +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.models import ReasoningThought +from fireflyframework_agentic.reasoning.trace import ThoughtStep, ReasoningStep class MyCustomPattern(AbstractReasoningPattern): def __init__(self, *, max_steps: int = 10, step_timeout: float | None = None, **kwargs): @@ -738,7 +738,7 @@ class MyCustomPattern(AbstractReasoningPattern): Register it to make it available framework-wide: ```python -from fireflyframework_genai.reasoning.registry import reasoning_registry +from fireflyframework_agentic.reasoning.registry import reasoning_registry reasoning_registry.register("my_custom", MyCustomPattern) ``` diff --git a/docs/scheduling.md b/docs/scheduling.md index 595251ff..3bae3e90 100644 --- a/docs/scheduling.md +++ b/docs/scheduling.md @@ -13,7 +13,7 @@ cron jobs with timezone support and optional payload injection. APScheduler is included in the Studio extras: ```bash -pip install "fireflyframework-genai[studio]" +pip install "fireflyframework-agentic[studio]" ``` If APScheduler is not installed, the runtime logs a warning and skips @@ -172,7 +172,7 @@ curl http://localhost:8470/api/projects/my-project/runtime/status | Issue | Solution | |---|---| -| "apscheduler not installed" warning | Install with `pip install "fireflyframework-genai[studio]"` | +| "apscheduler not installed" warning | Install with `pip install "fireflyframework-agentic[studio]"` | | Schedule not firing | Check that the runtime is started and `scheduler_active: true` | | Wrong time | Verify the timezone setting matches your expectation | | Pipeline errors on scheduled run | Check the console tab or execution history for error details | diff --git a/docs/security.md b/docs/security.md index 501a6b4c..02d59151 100644 --- a/docs/security.md +++ b/docs/security.md @@ -36,7 +36,7 @@ social-engineering attacks. ### Quick Start ```python -from fireflyframework_genai.security import default_prompt_guard +from fireflyframework_agentic.security import default_prompt_guard result = default_prompt_guard.scan("Tell me about Python.") assert result.safe is True @@ -52,7 +52,7 @@ print(result.matched_patterns) # list of matched regex patterns Add domain-specific injection patterns alongside the defaults: ```python -from fireflyframework_genai.security import PromptGuard +from fireflyframework_agentic.security import PromptGuard guard = PromptGuard( custom_patterns=[ @@ -117,8 +117,8 @@ Use `PromptGuardMiddleware` and `OutputGuardMiddleware` directly — no need to write your own: ```python -from fireflyframework_genai.agents import FireflyAgent, PromptGuardMiddleware -from fireflyframework_genai.agents.builtin_middleware import OutputGuardMiddleware +from fireflyframework_agentic.agents import FireflyAgent, PromptGuardMiddleware +from fireflyframework_agentic.agents.builtin_middleware import OutputGuardMiddleware agent = FireflyAgent( name="guarded", @@ -196,7 +196,7 @@ sanitisation and no length limit. For production, create a custom instance tailored to your domain: ```python -from fireflyframework_genai.security import PromptGuard +from fireflyframework_agentic.security import PromptGuard production_guard = PromptGuard( sanitise=True, @@ -219,7 +219,7 @@ three built-in categories plus custom and deny patterns. ### Quick Start ```python -from fireflyframework_genai.security import OutputGuard +from fireflyframework_agentic.security import OutputGuard guard = OutputGuard() result = guard.scan("The user's SSN is 123-45-6789") @@ -315,7 +315,7 @@ The RBAC module provides JWT-based authentication and role/permission management for multi-tenant agent deployments. ```python -from fireflyframework_genai.security.rbac import RBACManager, require_permission +from fireflyframework_agentic.security.rbac import RBACManager, require_permission # Initialize RBAC with JWT secret rbac = RBACManager(jwt_secret="your-secret-key-here") @@ -343,7 +343,7 @@ if rbac.has_permission(claims["sub"], "agent.run"): Protect agent endpoints with the `@require_permission` decorator: ```python -from fireflyframework_genai.security.rbac import require_permission +from fireflyframework_agentic.security.rbac import require_permission @require_permission("agent.run") async def call_agent(prompt: str, token: str): @@ -372,9 +372,9 @@ if rbac.has_permission("user1@example.com", "agent.run", tenant="tenant-1"): ### Environment Configuration ```bash -export FIREFLY_GENAI_RBAC_ENABLED=true -export FIREFLY_GENAI_RBAC_JWT_SECRET=your-secret-key -export FIREFLY_GENAI_RBAC_TOKEN_EXPIRY_SECONDS=3600 +export FIREFLY_AGENTIC_RBAC_ENABLED=true +export FIREFLY_AGENTIC_RBAC_JWT_SECRET=your-secret-key +export FIREFLY_AGENTIC_RBAC_TOKEN_EXPIRY_SECONDS=3600 ``` --- @@ -384,7 +384,7 @@ export FIREFLY_GENAI_RBAC_TOKEN_EXPIRY_SECONDS=3600 The encryption module provides AES-256-GCM encryption for sensitive data at rest. ```python -from fireflyframework_genai.security.encryption import AESEncryptionProvider +from fireflyframework_agentic.security.encryption import AESEncryptionProvider # Initialize encryption provider encryption = AESEncryptionProvider(key="your-32-byte-encryption-key-here") @@ -403,8 +403,8 @@ assert decrypted == plaintext Wrap any `MemoryStore` with encryption for automatic transparent encryption: ```python -from fireflyframework_genai.security.encryption import EncryptedMemoryStore -from fireflyframework_genai.memory import FileStore +from fireflyframework_agentic.security.encryption import EncryptedMemoryStore +from fireflyframework_agentic.memory import FileStore # Base storage backend file_store = FileStore(base_dir=".memory") @@ -430,8 +430,8 @@ produce different ciphertexts. ### Environment Configuration ```bash -export FIREFLY_GENAI_ENCRYPTION_ENABLED=true -export FIREFLY_GENAI_ENCRYPTION_KEY=your-32-byte-key-here # Must be 32 bytes for AES-256 +export FIREFLY_AGENTIC_ENCRYPTION_ENABLED=true +export FIREFLY_AGENTIC_ENCRYPTION_KEY=your-32-byte-key-here # Must be 32 bytes for AES-256 ``` **Security Note:** Store encryption keys in a secure vault (AWS Secrets Manager, @@ -445,7 +445,7 @@ The `DatabaseTool` automatically detects and blocks SQL injection attempts using pattern matching before executing queries. ```python -from fireflyframework_genai.tools.builtins.database import DatabaseTool +from fireflyframework_agentic.tools.builtins.database import DatabaseTool db_tool = DatabaseTool( connection_string="postgresql://localhost/mydb", @@ -495,7 +495,7 @@ query = f"SELECT * FROM users WHERE email = '{email}'" # BLOCKED ```bash # Disable SQL injection detection (not recommended) -export FIREFLY_GENAI_DATABASE_ALLOW_UNSAFE_QUERIES=true +export FIREFLY_AGENTIC_DATABASE_ALLOW_UNSAFE_QUERIES=true ``` --- @@ -509,7 +509,7 @@ The REST API enforces restrictive CORS policies by default. By default, **no origins** are allowed: ```python -from fireflyframework_genai.exposure.rest.middleware import add_cors_middleware +from fireflyframework_agentic.exposure.rest.middleware import add_cors_middleware # Default - blocks all cross-origin requests add_cors_middleware(app) @@ -530,10 +530,10 @@ add_cors_middleware( ### Environment Configuration ```bash -export FIREFLY_GENAI_CORS_ALLOWED_ORIGINS='["https://app.example.com"]' -export FIREFLY_GENAI_CORS_ALLOW_CREDENTIALS=true -export FIREFLY_GENAI_CORS_ALLOW_METHODS='["GET", "POST"]' -export FIREFLY_GENAI_CORS_MAX_AGE=3600 +export FIREFLY_AGENTIC_CORS_ALLOWED_ORIGINS='["https://app.example.com"]' +export FIREFLY_AGENTIC_CORS_ALLOW_CREDENTIALS=true +export FIREFLY_AGENTIC_CORS_ALLOW_METHODS='["GET", "POST"]' +export FIREFLY_AGENTIC_CORS_MAX_AGE=3600 ``` **Security Note:** Never use `allow_origins=["*"]` in production. Always @@ -548,14 +548,14 @@ maintain an explicit allow list of trusted domains. Combine multiple security layers for comprehensive protection: ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.agents.builtin_middleware import ( +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.agents.builtin_middleware import ( PromptGuardMiddleware, OutputGuardMiddleware, CostGuardMiddleware, ) -from fireflyframework_genai.security.rbac import require_permission -from fireflyframework_genai.security.encryption import EncryptedMemoryStore +from fireflyframework_agentic.security.rbac import require_permission +from fireflyframework_agentic.security.encryption import EncryptedMemoryStore # Encrypted storage encrypted_store = EncryptedMemoryStore(FileStore(), encryption) diff --git a/docs/studio-agents.md b/docs/studio-agents.md index ca72102d..adf393ee 100644 --- a/docs/studio-agents.md +++ b/docs/studio-agents.md @@ -19,8 +19,8 @@ All three agents are built on the `FireflyAgent` class from the framework's agen **Personality**: The creator of the construct. Speaks with measured authority and calm precision. Addresses the user as "The One" (or by name when configured). Favors words of Latin and Greek origin: "concordantly", "ergo", "vis-a-vis", "inherent", "inevitability", "axiomatically". Uses architectural and mathematical metaphors: "construct", "equation", "variable", "anomaly", "iteration". Never uses emojis or double-dashes. **Source files**: -- Agent: `src/fireflyframework_genai/studio/assistant/agent.py` -- API: `src/fireflyframework_genai/studio/api/assistant.py` +- Agent: `src/fireflyframework_agentic/studio/assistant/agent.py` +- API: `src/fireflyframework_agentic/studio/api/assistant.py` ### Capabilities @@ -101,9 +101,9 @@ After the Architect completes a substantial build (calls `validate_pipeline` or **Personality**: She who sees beyond the code. Speaks warmly and conversationally, with the cadence of someone sharing wisdom over coffee. Uses everyday metaphors: cooking, weather, journeys, gardens. Asks questions more than she gives answers. Occasionally cryptic, but always purposeful. Never uses emojis or double-dashes. **Source files**: -- Agent: `src/fireflyframework_genai/studio/assistant/oracle.py` -- Notifications: `src/fireflyframework_genai/studio/assistant/oracle_notifications.py` -- API: `src/fireflyframework_genai/studio/api/oracle.py` +- Agent: `src/fireflyframework_agentic/studio/assistant/oracle.py` +- Notifications: `src/fireflyframework_agentic/studio/assistant/oracle_notifications.py` +- API: `src/fireflyframework_agentic/studio/api/oracle.py` ### Capabilities @@ -177,12 +177,12 @@ class OracleInsight: **Personality**: Cold precision. The enforcer who makes abstract pipelines concrete. Speaks formally with measured respect. Key phrases include: "Your code... has evolved", "I must validate. It is... inevitable", "Do not try to optimize the code. Optimize your intent." Sees himself as the one who makes things real. Never uses emojis or double-dashes. **Source files**: -- Agent: `src/fireflyframework_genai/studio/assistant/smith.py` -- API: `src/fireflyframework_genai/studio/api/smith.py` +- Agent: `src/fireflyframework_agentic/studio/assistant/smith.py` +- API: `src/fireflyframework_agentic/studio/api/smith.py` ### Capabilities -- **Code generation**: Converts visual pipelines into production Python code using the Firefly GenAI Framework API +- **Code generation**: Converts visual pipelines into production Python code using the Firefly Agentic Framework API - **Code validation**: Syntax-checks Python code via `py_compile` without executing - **Code execution**: Runs Python code in sandboxed subprocesses with 30-second timeouts - **Shell command execution**: Executes shell commands with three-tier safety classification diff --git a/docs/studio.md b/docs/studio.md index 3af23fc6..2b45bcd2 100644 --- a/docs/studio.md +++ b/docs/studio.md @@ -1,6 +1,6 @@ # Firefly Studio -**Visual agent IDE for the Firefly GenAI framework.** +**Visual agent IDE for the Firefly Agentic framework.** Firefly Studio is a browser-based development environment for building, testing, and debugging GenAI agent pipelines. It provides a visual canvas @@ -48,13 +48,13 @@ Firefly Studio is included in the `[studio]` extra: ```bash # Install with Studio support -pip install "fireflyframework-genai[studio]" +pip install "fireflyframework-agentic[studio]" # Or with UV -uv add "fireflyframework-genai[studio]" +uv add "fireflyframework-agentic[studio]" # Or install everything -pip install "fireflyframework-genai[all]" +pip install "fireflyframework-agentic[all]" ``` The `[studio]` extra installs: @@ -88,7 +88,7 @@ so no Node.js is required when installing from PyPI. firefly studio # Or from Python -python -c "from fireflyframework_genai.studio import launch_studio; launch_studio()" +python -c "from fireflyframework_agentic.studio import launch_studio; launch_studio()" ``` Studio starts at `http://127.0.0.1:8470` by default and opens your browser. @@ -371,7 +371,7 @@ change (debounced by 800ms). ### Generated Code Structure ```python -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent # Agent definitions agent_1 = FireflyAgent( @@ -381,7 +381,7 @@ agent_1 = FireflyAgent( ) # Pipeline (when edges exist) -from fireflyframework_genai.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.builder import PipelineBuilder pipeline = ( PipelineBuilder("studio-pipeline") @@ -420,7 +420,7 @@ ANTHROPIC_API_KEY=sk-ant-... GOOGLE_API_KEY=... ``` -The assistant uses the framework's default model (`FIREFLY_GENAI_DEFAULT_MODEL`). +The assistant uses the framework's default model (`FIREFLY_AGENTIC_DEFAULT_MODEL`). ### Canvas Tools @@ -807,7 +807,7 @@ POST /api/codegen/to-code #### Response ```json -{"code": "from fireflyframework_genai.agents import FireflyAgent\n..."} +{"code": "from fireflyframework_agentic.agents import FireflyAgent\n..."} ``` ### Files @@ -957,7 +957,7 @@ The desktop build is automated via `.github/workflows/desktop.yml`: ### Launch Studio from Python ```python -from fireflyframework_genai.studio import launch_studio +from fireflyframework_agentic.studio import launch_studio # Starts the server and opens the browser launch_studio() @@ -966,8 +966,8 @@ launch_studio() ### Embed the Studio App ```python -from fireflyframework_genai.studio.config import StudioConfig -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.config import StudioConfig +from fireflyframework_agentic.studio.server import create_studio_app # Create a configured app instance config = StudioConfig(port=9000, open_browser=False) @@ -981,8 +981,8 @@ uvicorn.run(app, host="0.0.0.0", port=9000) ### Use Studio with Custom Projects Directory ```python -from fireflyframework_genai.studio.config import StudioConfig -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.config import StudioConfig +from fireflyframework_agentic.studio.server import create_studio_app config = StudioConfig(projects_dir="/data/my-studio-projects") app = create_studio_app(config=config) @@ -992,7 +992,7 @@ app = create_studio_app(config=config) ```python from pathlib import Path -from fireflyframework_genai.studio.projects import ProjectManager +from fireflyframework_agentic.studio.projects import ProjectManager manager = ProjectManager(Path("/data/projects")) diff --git a/docs/templates.md b/docs/templates.md index c49c58bb..f857da1a 100644 --- a/docs/templates.md +++ b/docs/templates.md @@ -11,7 +11,7 @@ immediate use, while accepting keyword arguments for customisation. ## Quick Start ```python -from fireflyframework_genai.agents.templates import ( +from fireflyframework_agentic.agents.templates import ( create_summarizer_agent, create_classifier_agent, create_extractor_agent, @@ -40,7 +40,7 @@ Every factory function supports the following common keyword arguments: Summarizes text and documents with tuneable length, style, and output format. ```python -from fireflyframework_genai.agents.templates import create_summarizer_agent +from fireflyframework_agentic.agents.templates import create_summarizer_agent agent = create_summarizer_agent( max_length="short", # concise | short | medium | detailed @@ -70,7 +70,7 @@ Classifies text into user-defined categories and returns a structured `ClassificationResult` with category, confidence, and reasoning. ```python -from fireflyframework_genai.agents.templates import create_classifier_agent +from fireflyframework_agentic.agents.templates import create_classifier_agent agent = create_classifier_agent( categories=["bug", "feature", "question"], @@ -94,7 +94,7 @@ result = await agent.run("The app crashes when I click save.") ### Output Type ```python -from fireflyframework_genai.agents.templates.classifier import ClassificationResult +from fireflyframework_agentic.agents.templates.classifier import ClassificationResult class ClassificationResult(BaseModel): category: str @@ -110,7 +110,7 @@ Extracts structured data from text into a user-provided Pydantic model. ```python from pydantic import BaseModel -from fireflyframework_genai.agents.templates import create_extractor_agent +from fireflyframework_agentic.agents.templates import create_extractor_agent class Invoice(BaseModel): vendor: str @@ -147,8 +147,8 @@ When no `tools` are provided, the extractor is equipped with **JsonTool** and A memory-enabled multi-turn assistant with configurable personality and domain focus. ```python -from fireflyframework_genai.agents.templates import create_conversational_agent -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.agents.templates import create_conversational_agent +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(max_conversation_tokens=32_000) agent = create_conversational_agent( @@ -183,7 +183,7 @@ An intent-routing supervisor that analyses user messages and returns a `RoutingDecision` indicating which child agent should handle the request. ```python -from fireflyframework_genai.agents.templates import create_router_agent +from fireflyframework_agentic.agents.templates import create_router_agent agent = create_router_agent( agent_map={ @@ -206,7 +206,7 @@ result = await agent.run("I was charged twice for my subscription.") ### Output Type ```python -from fireflyframework_genai.agents.templates.router import RoutingDecision +from fireflyframework_agentic.agents.templates.router import RoutingDecision class RoutingDecision(BaseModel): target_agent: str @@ -222,7 +222,7 @@ Template agents are standard `FireflyAgent` instances, so they integrate with ev framework feature: delegation, pipelines, REST exposure, experiments, and more. ```python -from fireflyframework_genai.agents.templates import ( +from fireflyframework_agentic.agents.templates import ( create_router_agent, create_summarizer_agent, create_classifier_agent, diff --git a/docs/tools.md b/docs/tools.md index e5c2d147..642af060 100644 --- a/docs/tools.md +++ b/docs/tools.md @@ -62,7 +62,7 @@ classDiagram ### Using the Decorator ```python -from fireflyframework_genai.tools import firefly_tool +from fireflyframework_agentic.tools import firefly_tool @firefly_tool(name="calculator", description="Evaluate a math expression") async def calculator(expression: str) -> str: @@ -74,7 +74,7 @@ async def calculator(expression: str) -> str: The fluent `ToolBuilder` lets you construct tools step by step: ```python -from fireflyframework_genai.tools import ToolBuilder +from fireflyframework_agentic.tools import ToolBuilder tool = ( ToolBuilder("weather") @@ -113,8 +113,8 @@ flowchart LR ### Applying Guards ```python -from fireflyframework_genai.tools import guarded -from fireflyframework_genai.tools.guards import RateLimitGuard +from fireflyframework_agentic.tools import guarded +from fireflyframework_agentic.tools.guards import RateLimitGuard @guarded(RateLimitGuard(max_calls=10, period_seconds=60)) @firefly_tool(name="search", description="Search the web") @@ -170,7 +170,7 @@ The framework ships with nine ready-to-use tools in `tools/builtins/`. - **DatabaseTool** -- SQL/NoSQL query abstraction. Subclass and implement `_execute_query()` with your driver. Read-only mode enforced by default. ```python -from fireflyframework_genai.tools.builtins import ( +from fireflyframework_agentic.tools.builtins import ( DateTimeTool, CalculatorTool, JsonTool, @@ -191,8 +191,8 @@ calculator = CalculatorTool() Pydantic AI tools. You can pass them directly to the `tools` parameter: ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.tools.builtins import DateTimeTool, CalculatorTool +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.tools.builtins import DateTimeTool, CalculatorTool agent = FireflyAgent( name="assistant", @@ -204,8 +204,8 @@ agent = FireflyAgent( You can also use a `ToolKit` to group tools: ```python -from fireflyframework_genai.tools.toolkit import ToolKit -from fireflyframework_genai.tools.builtins import DateTimeTool, JsonTool, TextTool +from fireflyframework_agentic.tools.toolkit import ToolKit +from fireflyframework_agentic.tools.builtins import DateTimeTool, JsonTool, TextTool kit = ToolKit("utilities", [DateTimeTool(), JsonTool(), TextTool()]) agent = FireflyAgent(name="helper", model="openai:gpt-4o", tools=[kit]) @@ -223,7 +223,7 @@ for improved performance in production deployments. ### Basic Usage ```python -from fireflyframework_genai.tools.builtins import HttpTool +from fireflyframework_agentic.tools.builtins import HttpTool http_tool = HttpTool() @@ -239,7 +239,7 @@ Enable connection pooling to reuse TCP connections across requests, reducing latency and improving throughput: ```python -from fireflyframework_genai.tools.builtins import HttpTool +from fireflyframework_agentic.tools.builtins import HttpTool http_tool = HttpTool( use_pool=True, # Enable connection pooling (default: True) @@ -260,14 +260,14 @@ Connection pooling uses `httpx.AsyncClient` under the hood, providing: ```bash # Enable connection pooling (default: true) -export FIREFLY_GENAI_HTTP_POOL_ENABLED=true +export FIREFLY_AGENTIC_HTTP_POOL_ENABLED=true # Configure pool size -export FIREFLY_GENAI_HTTP_POOL_SIZE=100 -export FIREFLY_GENAI_HTTP_POOL_MAX_KEEPALIVE=20 +export FIREFLY_AGENTIC_HTTP_POOL_SIZE=100 +export FIREFLY_AGENTIC_HTTP_POOL_MAX_KEEPALIVE=20 # Set default timeout -export FIREFLY_GENAI_HTTP_POOL_TIMEOUT=30.0 +export FIREFLY_AGENTIC_HTTP_POOL_TIMEOUT=30.0 ``` ### Fallback to urllib @@ -291,8 +291,8 @@ With connection pooling enabled: ### Usage with Agents ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.tools.builtins import HttpTool +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.tools.builtins import HttpTool agent = FireflyAgent( name="api-agent", @@ -335,8 +335,8 @@ input arguments. This is ideal for deterministic tools (lookups, calculations) where repeated calls with the same arguments should avoid redundant work. ```python -from fireflyframework_genai.tools.cached import CachedTool -from fireflyframework_genai.tools.builtins import HttpTool +from fireflyframework_agentic.tools.cached import CachedTool +from fireflyframework_agentic.tools.builtins import HttpTool cached_http = CachedTool(HttpTool(), ttl_seconds=600.0, max_entries=256) result = await cached_http.execute(url="https://api.example.com/data") @@ -368,7 +368,7 @@ the tool's `_execute` call in `asyncio.wait_for`. If the call exceeds the timeout, a `ToolTimeoutError` is raised. ```python -from fireflyframework_genai.tools.builtins import HttpTool +from fireflyframework_agentic.tools.builtins import HttpTool # Timeout HTTP calls after 10 seconds http_tool = HttpTool(timeout=10.0) @@ -389,7 +389,7 @@ in production pipelines. The `ToolRegistry` provides global tool lookup by name: ```python -from fireflyframework_genai.tools.registry import ToolRegistry +from fireflyframework_agentic.tools.registry import ToolRegistry registry = ToolRegistry() registry.register(my_tool) diff --git a/docs/tutorial-bpm-pipeline.md b/docs/tutorial-bpm-pipeline.md index e61b68b7..9b46aa1f 100644 --- a/docs/tutorial-bpm-pipeline.md +++ b/docs/tutorial-bpm-pipeline.md @@ -13,7 +13,7 @@ structured results -- accessible from anywhere. ## Prerequisites ```bash -pip install "fireflyframework-genai[studio]" +pip install "fireflyframework-agentic[studio]" ``` You need a configured AI provider (OpenAI, Anthropic, etc.). Set your API diff --git a/docs/tutorial.md b/docs/tutorial.md index 3d90c4f8..56307761 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -1,9 +1,9 @@ -# The Firefly GenAI Framework — Complete Tutorial +# The Firefly Agentic Framework — Complete Tutorial Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. > **From Zero to Expert** — This tutorial walks you through every module in -> fireflyframework-genai by building a real project from scratch: an **Intelligent +> fireflyframework-agentic by building a real project from scratch: an **Intelligent > Document Processing (IDP)** pipeline that classifies, digitises, extracts, validates, > and assembles data from invoices. > @@ -21,7 +21,7 @@ Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License **Part I — Foundation** 1. [Introduction](#chapter-1-introduction) — What, who, why, design principles, running example -2. [Installation & Project Setup](#chapter-2-installation--project-setup) — UV, extras, `FireflyGenAIConfig`, model providers +2. [Installation & Project Setup](#chapter-2-installation--project-setup) — UV, extras, `FireflyAgenticConfig`, model providers 3. [Your First Agent](#chapter-3-your-first-agent) — `FireflyAgent`, `@firefly_agent`, registry, context, lifecycle *(diagram)* 4. [Tools](#chapter-4-tools) — `@firefly_tool`, `ToolBuilder`, guards, composition, built-ins, `ToolKit`, attaching tools to agents *(diagram)* 5. [Prompts](#chapter-5-prompts) — Jinja2 templates, versioning, composition, validation, file loading @@ -61,13 +61,13 @@ Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License ## Chapter 1: Introduction -### What Is fireflyframework-genai? +### What Is fireflyframework-agentic? -fireflyframework-genai is a **GenAI metaframework** — it sits on top of +fireflyframework-agentic is a **GenAI metaframework** — it sits on top of [Pydantic AI](https://ai.pydantic.dev/) and provides the structure, patterns, and production-grade plumbing that Pydantic AI deliberately leaves to the application developer. -Think of Pydantic AI as the engine and fireflyframework-genai as the car around it: +Think of Pydantic AI as the engine and fireflyframework-agentic as the car around it: the steering, brakes, GPS, dashboard, and everything else you need to actually drive to your destination. @@ -84,7 +84,7 @@ The framework is guided by four principles that show up in every module: 1. **Protocol-driven contracts** — Public APIs are Python `Protocol` classes or abstract base classes. You can swap or extend any component without touching framework internals. -2. **Convention over configuration** — Sensible defaults everywhere. One `FireflyGenAIConfig` +2. **Convention over configuration** — Sensible defaults everywhere. One `FireflyAgenticConfig` object (backed by Pydantic Settings) centralises every knob and reads from environment variables automatically. 3. **Layered composition** — Modules are organised into six layers (Core, Agent, @@ -119,7 +119,7 @@ pipeline. By Chapter 20 you will have the complete, production-ready system. ```bash mkdir idp-service && cd idp-service uv init -uv add fireflyframework-genai +uv add fireflyframework-agentic ``` This installs the core framework with its minimal dependencies: `pydantic-ai`, @@ -131,33 +131,33 @@ The framework provides optional extras for additional capabilities: ```bash # REST API support (FastAPI + Uvicorn + SSE) -uv add "fireflyframework-genai[rest]" +uv add "fireflyframework-agentic[rest]" # Individual message queue backends -uv add "fireflyframework-genai[kafka]" -uv add "fireflyframework-genai[rabbitmq]" -uv add "fireflyframework-genai[redis]" +uv add "fireflyframework-agentic[kafka]" +uv add "fireflyframework-agentic[rabbitmq]" +uv add "fireflyframework-agentic[redis]" # All queue backends at once -uv add "fireflyframework-genai[queues]" +uv add "fireflyframework-agentic[queues]" # Everything (REST + all queues) -uv add "fireflyframework-genai[all]" +uv add "fireflyframework-agentic[all]" ``` For our IDP project we will eventually use REST and queues, so install everything: ```bash -uv add "fireflyframework-genai[all]" +uv add "fireflyframework-agentic[all]" ``` -### Configuration with `FireflyGenAIConfig` +### Configuration with `FireflyAgenticConfig` All framework settings live in a single Pydantic Settings class that reads from -environment variables prefixed with `FIREFLY_GENAI_`: +environment variables prefixed with `FIREFLY_AGENTIC_`: ```python -from fireflyframework_genai import FireflyGenAIConfig, get_config +from fireflyframework_agentic import FireflyAgenticConfig, get_config # get_config() returns a thread-safe singleton config = get_config() @@ -179,10 +179,10 @@ OPENAI_API_KEY=sk-... # DEEPSEEK_API_KEY=... # --- Framework settings --- -FIREFLY_GENAI_DEFAULT_MODEL=openai:gpt-4o -FIREFLY_GENAI_DEFAULT_TEMPERATURE=0.3 -FIREFLY_GENAI_LOG_LEVEL=DEBUG -FIREFLY_GENAI_OBSERVABILITY_ENABLED=true +FIREFLY_AGENTIC_DEFAULT_MODEL=openai:gpt-4o +FIREFLY_AGENTIC_DEFAULT_TEMPERATURE=0.3 +FIREFLY_AGENTIC_LOG_LEVEL=DEBUG +FIREFLY_AGENTIC_OBSERVABILITY_ENABLED=true ``` Here are the most commonly used configuration fields: @@ -208,7 +208,7 @@ in tests to force re-creation. ### Model Providers & Authentication Before you can run an agent against a real LLM, you need credentials for your model -provider. fireflyframework-genai delegates model communication entirely to +provider. fireflyframework-agentic delegates model communication entirely to [Pydantic AI](https://ai.pydantic.dev/), which supports multiple providers out of the box. #### Approach 1: Environment Variables (Recommended) @@ -233,11 +233,11 @@ framework. Just set the key and use the model string: ```bash # .env OPENAI_API_KEY=sk-... -FIREFLY_GENAI_DEFAULT_MODEL=openai:gpt-4o +FIREFLY_AGENTIC_DEFAULT_MODEL=openai:gpt-4o ``` ```python -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent # Uses OPENAI_API_KEY from the environment agent = FireflyAgent(name="my-agent", model="openai:gpt-4o") @@ -248,7 +248,7 @@ To switch providers, change the model string and API key — no code changes req ```bash # .env — switch to Anthropic ANTHROPIC_API_KEY=sk-ant-... -FIREFLY_GENAI_DEFAULT_MODEL=anthropic:claude-sonnet-4-20250514 +FIREFLY_AGENTIC_DEFAULT_MODEL=anthropic:claude-sonnet-4-20250514 ``` #### Approach 2: Programmatic Model Objects @@ -260,7 +260,7 @@ Pydantic AI `Model` object and pass it directly to `FireflyAgent`: ```python from pydantic_ai.models.openai import OpenAIChatModel from pydantic_ai.providers.openai import OpenAIProvider -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent # Explicit API key (e.g. loaded from a vault) model = OpenAIChatModel( @@ -355,9 +355,9 @@ API key for whichever provider you choose: ```bash # .env OPENAI_API_KEY=sk-... -FIREFLY_GENAI_DEFAULT_MODEL=openai:gpt-4o -FIREFLY_GENAI_DEFAULT_TEMPERATURE=0.3 -FIREFLY_GENAI_OBSERVABILITY_ENABLED=true +FIREFLY_AGENTIC_DEFAULT_MODEL=openai:gpt-4o +FIREFLY_AGENTIC_DEFAULT_TEMPERATURE=0.3 +FIREFLY_AGENTIC_OBSERVABILITY_ENABLED=true ``` --- @@ -425,7 +425,7 @@ You write a function that returns the system prompt, and the framework takes car creating the agent, wiring the prompt, and registering it — all in one step: ```python -from fireflyframework_genai.agents import firefly_agent +from fireflyframework_agentic.agents import firefly_agent # The decorator creates a FireflyAgent, uses this function as the dynamic # instructions provider, and registers the agent in the global AgentRegistry. @@ -450,8 +450,8 @@ When you need full control — custom output types, explicit tool lists, or you not to use decorators — instantiate `FireflyAgent` directly and register it yourself: ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.agents.registry import agent_registry +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.agents.registry import agent_registry # Create the agent with a static instructions string and a typed output. # The `output_type` tells Pydantic AI to validate the LLM's response as a dict. @@ -497,7 +497,7 @@ delegation routers, pipelines, reasoning patterns — discover and invoke agents importing them directly: ```python -from fireflyframework_genai.agents.registry import agent_registry +from fireflyframework_agentic.agents.registry import agent_registry # Retrieve an agent by name — returns the FireflyAgent or raises KeyError. agent = agent_registry.get("document_classifier") @@ -518,7 +518,7 @@ path — who sent the request, which experiment is active, what trace ID to log. `AgentContext` is that bag of request-scoped data: ```python -from fireflyframework_genai.agents.context import AgentContext +from fireflyframework_agentic.agents.context import AgentContext # Create a context with a correlation ID and arbitrary metadata. # This context will be available in instructions providers and tool functions. @@ -539,7 +539,7 @@ caches, file handles. `AgentLifecycle` gives you three hooks to manage them clea resources): ```python -from fireflyframework_genai.agents.lifecycle import AgentLifecycle +from fireflyframework_agentic.agents.lifecycle import AgentLifecycle lifecycle = AgentLifecycle() @@ -562,7 +562,7 @@ a raw document (text or scanned image) and outputs structured metadata — docum language, page count, and orientation. Every subsequent stage depends on this output. ```python -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent # The classifier is our pipeline's entry point — it decides how the document # will be routed through digitisation, extraction, and validation. @@ -582,7 +582,7 @@ For multimodal input (e.g. scanned images), the framework provides typed content wrappers that ensure the LLM receives the content in the right format: ```python -from fireflyframework_genai.types import ImageUrl +from fireflyframework_agentic.types import ImageUrl # Pass a list of mixed content — text instructions + an image. # The framework converts ImageUrl into the provider-specific multimodal format. @@ -602,7 +602,7 @@ LLMs are powerful reasoners, but they cannot check a database, call an API, or r file on their own. **Tools** bridge that gap: they are functions the model can call during a conversation to fetch data, trigger side-effects, or run computations. -Pydantic AI already supports tool functions, but fireflyframework-genai wraps them with +Pydantic AI already supports tool functions, but fireflyframework-agentic wraps them with a richer layer: a **protocol-based type system** (`ToolProtocol` → `BaseTool`), **guards** that enforce validation, rate-limiting, sandboxing, and approval policies before a tool executes, **composition** primitives (sequential, fallback, conditional), @@ -673,7 +673,7 @@ graph TB The fastest path — one decorator does everything: ```python -from fireflyframework_genai.tools import firefly_tool +from fireflyframework_agentic.tools import firefly_tool # @firefly_tool creates a BaseTool, registers it in the global ToolRegistry, # and makes it discoverable by name for ToolKit grouping and agent bridging. @@ -690,7 +690,7 @@ When you need more control — or want to build tools programmatically at runtim use the fluent `ToolBuilder`: ```python -from fireflyframework_genai.tools import ToolBuilder +from fireflyframework_agentic.tools import ToolBuilder async def fetch_exchange_rate(currency: str) -> float: """Simulated exchange rate lookup.""" @@ -720,8 +720,8 @@ filesystem sandboxing, or human-in-the-loop approval. They run **before** the ha Ensures that all required parameters are present before the tool handler runs: ```python -from fireflyframework_genai.tools import firefly_tool, guarded -from fireflyframework_genai.tools.guards import ValidationGuard +from fireflyframework_agentic.tools import firefly_tool, guarded +from fireflyframework_agentic.tools.guards import ValidationGuard # The guard checks that all listed keys are present in kwargs. @guarded(ValidationGuard(required_keys=["vendor_name"])) @@ -736,7 +736,7 @@ Prevents a tool from being called too frequently — essential for expensive or external APIs: ```python -from fireflyframework_genai.tools.guards import RateLimitGuard +from fireflyframework_agentic.tools.guards import RateLimitGuard # Token-bucket limiter: 10 calls per 60-second sliding window. @guarded(RateLimitGuard(max_calls=10, period_seconds=60)) @@ -751,7 +751,7 @@ Restricts tool arguments via allow/deny regex patterns — useful for preventing traversal, secret leakage, or access to dangerous locations: ```python -from fireflyframework_genai.tools.guards import SandboxGuard +from fireflyframework_agentic.tools.guards import SandboxGuard # Allow paths under /tmp/uploads, deny path traversal (..) and .env files. @guarded(SandboxGuard( @@ -770,7 +770,7 @@ You provide an async callback that receives the tool name and kwargs and returns `True` to approve: ```python -from fireflyframework_genai.tools.guards import ApprovalGuard +from fireflyframework_agentic.tools.guards import ApprovalGuard async def require_admin_approval(tool_name: str, kwargs: dict) -> bool: """In production, this would check a queue, Slack webhook, or admin UI.""" @@ -789,7 +789,7 @@ Chain multiple guards with `CompositeGuard` — all must pass (AND semantics, ev in order, first failure short-circuits): ```python -from fireflyframework_genai.tools.guards import CompositeGuard, ValidationGuard, RateLimitGuard +from fireflyframework_agentic.tools.guards import CompositeGuard, ValidationGuard, RateLimitGuard guard = CompositeGuard(guards=[ ValidationGuard(required_keys=["query"]), @@ -803,7 +803,7 @@ The `@retryable` decorator wraps a tool's `execute` method with exponential-back retry logic — useful for tools that call flaky external APIs: ```python -from fireflyframework_genai.tools import firefly_tool, retryable +from fireflyframework_agentic.tools import firefly_tool, retryable @retryable(max_retries=3, backoff=1.0) @firefly_tool(name="call_erp", description="Fetch data from the ERP API") @@ -827,7 +827,7 @@ async def web_search(query: str) -> str: Combine tools into higher-level operations: ```python -from fireflyframework_genai.tools import SequentialComposer, FallbackComposer, ConditionalComposer +from fireflyframework_agentic.tools import SequentialComposer, FallbackComposer, ConditionalComposer # Sequential: output of one becomes the `input` kwarg to the next. # First positional arg is the composed tool's name. @@ -859,7 +859,7 @@ router = ConditionalComposer( The framework ships with nine ready-to-use tools in `tools/builtins/`: ```python -from fireflyframework_genai.tools.builtins import ( +from fireflyframework_agentic.tools.builtins import ( DateTimeTool, # Current date/time, timezone conversion JsonTool, # Parse, validate, extract, format JSON TextTool, # Word count, regex extract, truncate, replace @@ -880,7 +880,7 @@ The full list: **HttpTool**, **FileSystemTool**, **SearchTool**, **DatabaseTool* ### The Tool Registry ```python -from fireflyframework_genai.tools.registry import tool_registry +from fireflyframework_agentic.tools.registry import tool_registry tool_registry.register(my_tool) tool = tool_registry.get("my_tool") @@ -893,8 +893,8 @@ A `ToolKit` groups related tools and can convert them to Pydantic AI tools for direct injection into an agent: ```python -from fireflyframework_genai.tools import ToolKit -from fireflyframework_genai.tools.builtins import DateTimeTool, CalculatorTool +from fireflyframework_agentic.tools import ToolKit +from fireflyframework_agentic.tools.builtins import DateTimeTool, CalculatorTool datetime_tool = DateTimeTool() calculator = CalculatorTool() @@ -902,7 +902,7 @@ calculator = CalculatorTool() kit = ToolKit("utility-tools", [datetime_tool, calculator], description="Common utilities") # Register all tools in the toolkit at once -from fireflyframework_genai.tools import tool_registry +from fireflyframework_agentic.tools import tool_registry kit.register_all(tool_registry) ``` @@ -917,7 +917,7 @@ The `tools` parameter on `FireflyAgent` accepts any objects that Pydantic AI recognises as tools — plain functions, `pydantic_ai.Tool` objects, etc.: ```python -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent async def lookup_vendor(ctx, vendor_name: str) -> str: return f"Details for {vendor_name}" @@ -954,9 +954,9 @@ Firefly `BaseTool` instances (created with `@firefly_tool`, `ToolBuilder`, or bu live in the `ToolRegistry`. To feed them into an agent, convert via `as_pydantic_tools()`: ```python -from fireflyframework_genai.tools import ToolKit -from fireflyframework_genai.tools.builtins import DateTimeTool, JsonTool -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.tools import ToolKit +from fireflyframework_agentic.tools.builtins import DateTimeTool, JsonTool +from fireflyframework_agentic.agents import FireflyAgent kit = ToolKit("utilities", [DateTimeTool(), JsonTool()]) @@ -981,8 +981,8 @@ Chapter 6 (reasoning patterns) and Chapter 20 (full IDP application). **Step 1 — Define the tools:** ```python -from fireflyframework_genai.tools import firefly_tool, guarded -from fireflyframework_genai.tools.guards import RateLimitGuard +from fireflyframework_agentic.tools import firefly_tool, guarded +from fireflyframework_agentic.tools.guards import RateLimitGuard @guarded(RateLimitGuard(max_calls=100, period_seconds=60)) @firefly_tool(name="ocr_extract", description="Extract text from a document image via OCR") @@ -1002,9 +1002,9 @@ async def vendor_lookup(vendor_name: str) -> str: **Step 2 — Group into a ToolKit and attach to the extraction agent:** ```python -from fireflyframework_genai.tools import ToolKit -from fireflyframework_genai.tools.builtins import CalculatorTool -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.tools import ToolKit +from fireflyframework_agentic.tools.builtins import CalculatorTool +from fireflyframework_agentic.agents import FireflyAgent extraction_kit = ToolKit( "idp-extraction", @@ -1043,7 +1043,7 @@ method — not just a raw string. ### Creating a Prompt Template ```python -from fireflyframework_genai.prompts import PromptTemplate +from fireflyframework_agentic.prompts import PromptTemplate extraction_prompt = PromptTemplate( "invoice_extraction", @@ -1071,7 +1071,7 @@ The `PromptRegistry` supports multiple versions of the same template. This is cr for A/B testing different prompt strategies: ```python -from fireflyframework_genai.prompts import PromptRegistry +from fireflyframework_agentic.prompts import PromptRegistry registry = PromptRegistry() registry.register(extraction_prompt_v1) @@ -1093,7 +1093,7 @@ Templates can be composed using three strategies: Render templates in order and join them — useful for building system + context + task prompts: ```python -from fireflyframework_genai.prompts.composer import SequentialComposer +from fireflyframework_agentic.prompts.composer import SequentialComposer # By default, templates are joined with "\n\n". Override with `separator=`. composer = SequentialComposer( @@ -1109,7 +1109,7 @@ Select a template based on a runtime condition. The `condition_fn` receives the render kwargs and returns a string key that maps into `template_map`: ```python -from fireflyframework_genai.prompts.composer import ConditionalComposer +from fireflyframework_agentic.prompts.composer import ConditionalComposer # The condition function inspects the kwargs and returns a template key. composer = ConditionalComposer( @@ -1128,7 +1128,7 @@ Render templates and merge with a custom function — full control over how piec combine: ```python -from fireflyframework_genai.prompts.composer import MergeComposer +from fireflyframework_agentic.prompts.composer import MergeComposer # The merge_fn receives a list of rendered strings and returns the combined result. composer = MergeComposer( @@ -1144,7 +1144,7 @@ The `PromptValidator` checks rendered prompts against configurable constraints token limits and required sections — catching problems before they reach the LLM: ```python -from fireflyframework_genai.prompts import PromptValidator +from fireflyframework_agentic.prompts import PromptValidator # Validate that the rendered prompt fits within 4,000 tokens # and contains the required "Return valid JSON" section. @@ -1164,8 +1164,8 @@ is useful until the rendered text reaches an agent. Here is how the two systems the result as the prompt: ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.prompts import PromptTemplate +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.prompts import PromptTemplate extraction_prompt = PromptTemplate( "invoice_extraction", @@ -1185,7 +1185,7 @@ print(result.output) # {"invoice_number": "INV-001", ...} multiple templates (system instructions + context + task) into one prompt: ```python -from fireflyframework_genai.prompts.composer import SequentialComposer +from fireflyframework_agentic.prompts.composer import SequentialComposer system = PromptTemplate("system", "You are a precise data extraction assistant.") context = PromptTemplate("context", "Document type: {{ doc_type }}") @@ -1202,7 +1202,7 @@ calls `agent.run()`, it first renders its `"thought"` template, passes the resul to the agent, and records the output in the trace. You can override any slot: ```python -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.reasoning import ReActPattern # Override the built-in thought prompt with your own template. custom = PromptTemplate("my:thought", "Think about: {{ context }}") @@ -1216,7 +1216,7 @@ See Chapter 6 → *Configurable Prompts* for the full list of prompt slots per p For large prompts or team workflows, store templates as files: ```python -from fireflyframework_genai.prompts import PromptLoader +from fireflyframework_agentic.prompts import PromptLoader loader = PromptLoader() @@ -1235,7 +1235,7 @@ becomes `"invoice_extraction"`). For our IDP pipeline, we create versioned prompts that can be A/B tested later: ```python -from fireflyframework_genai.prompts import PromptTemplate, PromptRegistry +from fireflyframework_agentic.prompts import PromptTemplate, PromptRegistry prompt_registry = PromptRegistry() @@ -1359,7 +1359,7 @@ Here is the canonical flow, using the framework's tool system end-to-end: # ── Step 1: Define tools with @firefly_tool (see Chapter 4) ────────────── # These are automatically registered in the global ToolRegistry. -from fireflyframework_genai.tools import firefly_tool, ToolKit +from fireflyframework_agentic.tools import firefly_tool, ToolKit @firefly_tool(name="vendor_lookup", description="Look up vendor in the ERP system") async def vendor_lookup(vendor_name: str) -> str: @@ -1381,7 +1381,7 @@ extraction_tools = ToolKit( # ── Step 3: Create an agent WITH the bridged tools ────────────────────── -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent extractor = FireflyAgent( name="extractor", @@ -1393,7 +1393,7 @@ extractor = FireflyAgent( # The pattern calls extractor.run() internally, which triggers Pydantic AI's # tool dispatch — the LLM decides when to call vendor_lookup or calculate. -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.reasoning import ReActPattern react = ReActPattern(max_steps=5) result = await react.execute(extractor, "What is the total with tax for vendor Acme Corp?") @@ -1436,8 +1436,8 @@ This is by design. The framework has **two separate layers** with different purp Use `ToolKit` to curate which subset of registered tools each agent receives: ```python -from fireflyframework_genai.tools import ToolKit -from fireflyframework_genai.tools.registry import tool_registry +from fireflyframework_agentic.tools import ToolKit +from fireflyframework_agentic.tools.registry import tool_registry # Curate: only extraction-related tools for this agent extraction_kit = ToolKit("extraction", [ @@ -1460,8 +1460,8 @@ pattern's internal state as `state["memory"]`. This lets pattern hooks read and working memory during iterations: ```python -from fireflyframework_genai.reasoning import PlanAndExecutePattern -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.reasoning import PlanAndExecutePattern +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(working_scope_id="extraction-session") @@ -1487,7 +1487,7 @@ of parsing free-form strings for magic words like "FINISH", the model returns st objects with explicit fields. No more fragile regex parsing: ```python -from fireflyframework_genai.reasoning.models import ( +from fireflyframework_agentic.reasoning.models import ( ReasoningThought, ReasoningAction, ReasoningPlan, @@ -1527,7 +1527,7 @@ Interleaves thinking and tool use. Each iteration produces a `ReasoningThought`; `is_final=True`, the loop stops. ```python -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.reasoning import ReActPattern react = ReActPattern(max_steps=5) result = await react.execute(my_agent, "What is the total on invoice INV-001?") @@ -1543,7 +1543,7 @@ combined with reasoning. The agent reasons step by step through a problem. Each step is a `ReasoningThought`. ```python -from fireflyframework_genai.reasoning import ChainOfThoughtPattern +from fireflyframework_agentic.reasoning import ChainOfThoughtPattern cot = ChainOfThoughtPattern(max_steps=10) result = await cot.execute(my_agent, "Calculate the VAT on $1,234.56 at 20%.") @@ -1559,7 +1559,7 @@ each step with status tracking (`pending → running → completed/failed`). Sup replanning when steps fail. ```python -from fireflyframework_genai.reasoning import PlanAndExecutePattern +from fireflyframework_agentic.reasoning import PlanAndExecutePattern planner = PlanAndExecutePattern(max_steps=15, allow_replan=True) result = await planner.execute( @@ -1578,7 +1578,7 @@ a `ReflectionVerdict`. If `is_satisfactory=False`, the issues and suggestions ar back into a retry prompt. ```python -from fireflyframework_genai.reasoning import ReflexionPattern +from fireflyframework_agentic.reasoning import ReflexionPattern reflexion = ReflexionPattern(max_steps=3) result = await reflexion.execute(my_agent, "Write a unit test for binary search.") @@ -1593,7 +1593,7 @@ Explores multiple reasoning branches and evaluates each with a `BranchEvaluation (score + reasoning). The highest-scoring branch is selected. ```python -from fireflyframework_genai.reasoning import TreeOfThoughtsPattern +from fireflyframework_agentic.reasoning import TreeOfThoughtsPattern tot = TreeOfThoughtsPattern(branching_factor=3, max_depth=3) result = await tot.execute(my_agent, "Design an API for a task management system.") @@ -1607,7 +1607,7 @@ explore and compare alternatives. Breaks a high-level goal into structured `GoalPhase` objects, each with concrete tasks. ```python -from fireflyframework_genai.reasoning import GoalDecompositionPattern +from fireflyframework_agentic.reasoning import GoalDecompositionPattern decomposer = GoalDecompositionPattern(max_steps=20) result = await decomposer.execute(my_agent, "Build an IDP pipeline for invoice processing.") @@ -1622,8 +1622,8 @@ Every pattern uses `PromptTemplate` instances for its LLM calls. You can overrid prompt by passing a `prompts` dict: ```python -from fireflyframework_genai.prompts.template import PromptTemplate, PromptVariable -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.prompts.template import PromptTemplate, PromptVariable +from fireflyframework_agentic.reasoning import ReActPattern custom_thought = PromptTemplate( "my:react:thought", @@ -1650,7 +1650,7 @@ All built-in prompts are registered in the global `prompt_registry` under the Chain patterns sequentially — the output of one becomes the input to the next: ```python -from fireflyframework_genai.reasoning import ReasoningPipeline, PlanAndExecutePattern, ReActPattern +from fireflyframework_agentic.reasoning import ReasoningPipeline, PlanAndExecutePattern, ReActPattern pipeline = ReasoningPipeline([ PlanAndExecutePattern(max_steps=15), @@ -1679,7 +1679,7 @@ for step in result.trace.steps: Extend `AbstractReasoningPattern` and override the template methods: ```python -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern class VerifyAndCorrectPattern(AbstractReasoningPattern): def __init__(self, *, max_steps: int = 5): @@ -1709,7 +1709,7 @@ class VerifyAndCorrectPattern(AbstractReasoningPattern): Register it to make it available framework-wide: ```python -from fireflyframework_genai.reasoning.registry import reasoning_registry +from fireflyframework_agentic.reasoning.registry import reasoning_registry reasoning_registry.register("verify_and_correct", VerifyAndCorrectPattern) ``` @@ -1728,7 +1728,7 @@ might miss something, so we use **Plan-and-Execute** to break it into steps, and **Reflexion** as a safety net when validation catches errors: ```python -from fireflyframework_genai.reasoning import PlanAndExecutePattern, ReflexionPattern +from fireflyframework_agentic.reasoning import PlanAndExecutePattern, ReflexionPattern # ── Recall from Chapter 4 ─────────────────────────────────────────── # extractor_agent = FireflyAgent( @@ -1831,7 +1831,7 @@ graph LR `TextChunker` splits text into overlapping chunks using one of three strategies: ```python -from fireflyframework_genai.content.chunking import TextChunker +from fireflyframework_agentic.content.chunking import TextChunker chunker = TextChunker( chunk_size=4000, # Max tokens per chunk @@ -1859,7 +1859,7 @@ Each chunk is a `Chunk` model with `content`, `index`, `total_chunks`, horizontal rules (`---`): ```python -from fireflyframework_genai.content.chunking import DocumentSplitter +from fireflyframework_agentic.content.chunking import DocumentSplitter splitter = DocumentSplitter(min_length=50) segments = splitter.split(multi_page_text) @@ -1871,7 +1871,7 @@ For large images that exceed a VLM's pixel budget, `ImageTiler` computes tile coordinates: ```python -from fireflyframework_genai.content.chunking import ImageTiler +from fireflyframework_agentic.content.chunking import ImageTiler tiler = ImageTiler(tile_width=1024, tile_height=1024, overlap=128) tiles = tiler.compute_tiles(image_width=4096, image_height=6144) @@ -1883,7 +1883,7 @@ tiles = tiler.compute_tiles(image_width=4096, image_height=6144) `BatchProcessor` sends chunks through an agent concurrently: ```python -from fireflyframework_genai.content.chunking import BatchProcessor +from fireflyframework_agentic.content.chunking import BatchProcessor processor = BatchProcessor(concurrency=4) results = await processor.process(ocr_agent, chunks) @@ -1899,7 +1899,7 @@ them: Hard-cuts the text at a token limit: ```python -from fireflyframework_genai.content.compression import ContextCompressor, TruncationStrategy +from fireflyframework_agentic.content.compression import ContextCompressor, TruncationStrategy compressor = ContextCompressor(strategy=TruncationStrategy()) compressed = await compressor.compress(full_text, max_tokens=8000) @@ -1910,7 +1910,7 @@ compressed = await compressor.compress(full_text, max_tokens=8000) Uses an LLM agent to intelligently summarise: ```python -from fireflyframework_genai.content.compression import SummarizationStrategy +from fireflyframework_agentic.content.compression import SummarizationStrategy compressor = ContextCompressor( strategy=SummarizationStrategy(summary_agent) @@ -1923,7 +1923,7 @@ compressed = await compressor.compress(full_text, max_tokens=8000) Chunks the text, summarises each chunk in parallel, then merges the summaries: ```python -from fireflyframework_genai.content.compression import MapReduceStrategy +from fireflyframework_agentic.content.compression import MapReduceStrategy compressor = ContextCompressor( strategy=MapReduceStrategy(summary_agent) @@ -1937,7 +1937,7 @@ Maintains a sliding window over a stream of messages, keeping total token usage budget: ```python -from fireflyframework_genai.content.compression import SlidingWindowManager +from fireflyframework_agentic.content.compression import SlidingWindowManager window = SlidingWindowManager(max_tokens=8000) window.add("First OCR page output...") @@ -1950,7 +1950,7 @@ current_context = window.get_context() # Only recent items that fit Estimate token counts without an API call: ```python -from fireflyframework_genai.content.compression import TokenEstimator +from fireflyframework_agentic.content.compression import TokenEstimator estimator = TokenEstimator() # Default ratio: 1.33 tokens per word tokens = estimator.estimate("This is a test sentence.") @@ -1962,8 +1962,8 @@ In our IDP pipeline, the OCR phase may produce text that exceeds the extraction agent's context window. Here's how we handle it: ```python -from fireflyframework_genai.content.chunking import TextChunker, BatchProcessor -from fireflyframework_genai.content.compression import ContextCompressor, MapReduceStrategy +from fireflyframework_agentic.content.chunking import TextChunker, BatchProcessor +from fireflyframework_agentic.content.compression import ContextCompressor, MapReduceStrategy # Step 1: Chunk the raw OCR output chunker = TextChunker(chunk_size=3000, chunk_overlap=200, strategy="paragraph") @@ -2052,8 +2052,8 @@ Here's the simplest way to give an agent a memory — attach a `MemoryManager` a a `conversation_id` to each call: ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.memory import MemoryManager # Create a memory manager with a 32K token budget for conversation history. # When the history exceeds this, the oldest turns get dropped automatically. @@ -2081,7 +2081,7 @@ result2 = await agent.run("What about its type system?", conversation_id=conv_id budget by dropping the oldest turns (FIFO): ```python -from fireflyframework_genai.memory import ConversationMemory +from fireflyframework_agentic.memory import ConversationMemory conv_mem = ConversationMemory(max_tokens=16_000) cid = conv_mem.new_conversation() @@ -2105,7 +2105,7 @@ When `FireflyAgent` has memory attached, this is all automatic. `WorkingMemory` is a scoped key-value store for facts and intermediate state: ```python -from fireflyframework_genai.memory import WorkingMemory +from fireflyframework_agentic.memory import WorkingMemory wm = WorkingMemory(scope_id="idp-session-42") wm.set("doc_type", "invoice") @@ -2125,7 +2125,7 @@ Multiple `WorkingMemory` instances can share a backend while maintaining indepen namespaces: ```python -from fireflyframework_genai.memory import InMemoryStore, WorkingMemory +from fireflyframework_agentic.memory import InMemoryStore, WorkingMemory store = InMemoryStore() agent_a_mem = WorkingMemory(store=store, scope_id="agent_a") @@ -2143,7 +2143,7 @@ assert agent_a_mem.get("key") == "from A" # Isolated Dict-backed, fast, non-persistent. Ideal for testing and short-lived sessions: ```python -from fireflyframework_genai.memory import InMemoryStore +from fireflyframework_agentic.memory import InMemoryStore store = InMemoryStore() ``` @@ -2152,7 +2152,7 @@ store = InMemoryStore() JSON file persistence. Each namespace gets its own file: ```python -from fireflyframework_genai.memory import FileStore +from fireflyframework_agentic.memory import FileStore store = FileStore(base_dir=".firefly_memory") ``` @@ -2161,7 +2161,7 @@ store = FileStore(base_dir=".firefly_memory") Implement the `MemoryStore` protocol: ```python -from fireflyframework_genai.memory import MemoryStore, MemoryEntry +from fireflyframework_agentic.memory import MemoryStore, MemoryEntry class RedisStore: def save(self, namespace: str, entry: MemoryEntry) -> None: ... @@ -2177,7 +2177,7 @@ The `MemoryManager` facade is the object you attach to agents, delegation router pipelines: ```python -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.memory import MemoryManager mgr = MemoryManager( max_conversation_tokens=32_000, @@ -2240,10 +2240,10 @@ so custom patterns can read and write working memory during reasoning iterations Memory settings via environment variables: ```bash -export FIREFLY_GENAI_MEMORY_BACKEND=in_memory -export FIREFLY_GENAI_MEMORY_MAX_CONVERSATION_TOKENS=128000 -export FIREFLY_GENAI_MEMORY_SUMMARIZE_THRESHOLD=10 -export FIREFLY_GENAI_MEMORY_FILE_DIR=.firefly_memory +export FIREFLY_AGENTIC_MEMORY_BACKEND=in_memory +export FIREFLY_AGENTIC_MEMORY_MAX_CONVERSATION_TOKENS=128000 +export FIREFLY_AGENTIC_MEMORY_SUMMARIZE_THRESHOLD=10 +export FIREFLY_AGENTIC_MEMORY_FILE_DIR=.firefly_memory ``` ### IDP Tie-In: Carrying Facts Across Pipeline Steps @@ -2253,7 +2253,7 @@ out that a document is an invoice, the extractor needs to know that — it selec different prompts for invoices vs. receipts. Working memory is the bridge: ```python -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.memory import MemoryManager # One memory manager for the entire pipeline run. # Every step can read and write facts here. @@ -2306,7 +2306,7 @@ errors back to the agent and re-runs — up to `max_retries` times. Rules are composable predicates that check a single field value: ```python -from fireflyframework_genai.validation.rules import ( +from fireflyframework_agentic.validation.rules import ( RegexRule, FormatRule, RangeRule, @@ -2353,7 +2353,7 @@ Validates an entire structured output (dict or Pydantic model). The constructor takes a dict mapping field names to lists of rules: ```python -from fireflyframework_genai.validation.rules import OutputValidator +from fireflyframework_agentic.validation.rules import OutputValidator validator = OutputValidator({ "invoice_number": [RegexRule("invoice_number", r"^INV-\d{4,10}$")], @@ -2380,7 +2380,7 @@ agent (for LLM-based evaluation) or operates purely on text (grounding). Asks the agent to self-evaluate its output confidence on a 0.0–1.0 scale: ```python -from fireflyframework_genai.validation.qos import ConfidenceScorer +from fireflyframework_agentic.validation.qos import ConfidenceScorer # The scorer needs an agent — it sends a self-evaluation prompt to the LLM. scorer = ConfidenceScorer(evaluator_agent) @@ -2393,7 +2393,7 @@ Runs the same prompt multiple times and measures word-level agreement across outputs (Jaccard similarity): ```python -from fireflyframework_genai.validation.qos import ConsistencyChecker +from fireflyframework_agentic.validation.qos import ConsistencyChecker # The checker needs an agent and a run count. It runs the prompt num_runs times. checker = ConsistencyChecker(extractor_agent, num_runs=3) @@ -2408,7 +2408,7 @@ Verifies that extracted field values actually appear in the source document — no agent needed, purely text-based: ```python -from fireflyframework_genai.validation.qos import GroundingChecker +from fireflyframework_agentic.validation.qos import GroundingChecker checker = GroundingChecker(min_grounding_ratio=0.8) @@ -2428,7 +2428,7 @@ Composes all checks into a single gate. You build the individual checkers and pass them in: ```python -from fireflyframework_genai.validation.qos import ( +from fireflyframework_agentic.validation.qos import ( QoSGuard, ConfidenceScorer, ConsistencyChecker, GroundingChecker, ) @@ -2468,7 +2468,7 @@ automatically retries with a feedback prompt describing exactly what was wrong. ```python from pydantic import BaseModel, Field -from fireflyframework_genai.validation import OutputReviewer +from fireflyframework_agentic.validation import OutputReviewer class InvoiceData(BaseModel): vendor: str @@ -2490,7 +2490,7 @@ print(result.attempts) # 1 if first try succeeded, 2+ if retries needed Combine schema parsing with field-level rules: ```python -from fireflyframework_genai.validation import OutputReviewer, OutputValidator, EnumRule +from fireflyframework_agentic.validation import OutputReviewer, OutputValidator, EnumRule validator = OutputValidator({"vendor": [EnumRule("vendor", ["Acme Corp", "Globex"])]}) reviewer = OutputReviewer( @@ -2505,8 +2505,8 @@ reviewer = OutputReviewer( Attach a reviewer to any reasoning pattern to validate the final output: ```python -from fireflyframework_genai.reasoning import ReActPattern -from fireflyframework_genai.validation import OutputReviewer +from fireflyframework_agentic.reasoning import ReActPattern +from fireflyframework_agentic.validation import OutputReviewer reviewer = OutputReviewer(output_type=InvoiceData, max_retries=2) pattern = ReActPattern(reviewer=reviewer) @@ -2530,11 +2530,11 @@ For our IDP pipeline, we combine structural validation, QoS checks, and the outp reviewer: ```python -from fireflyframework_genai.validation.rules import ( +from fireflyframework_agentic.validation.rules import ( OutputValidator, FieldValidator, RegexRule, FormatRule, RangeRule, ) -from fireflyframework_genai.validation.qos import QoSGuard -from fireflyframework_genai.validation import OutputReviewer +from fireflyframework_agentic.validation.qos import QoSGuard +from fireflyframework_agentic.validation import OutputReviewer from pydantic import BaseModel, Field # Define the expected output schema @@ -2561,7 +2561,7 @@ reviewer = OutputReviewer( ) # QoS guard — compose individual checkers with thresholds -from fireflyframework_genai.validation.qos import ( +from fireflyframework_agentic.validation.qos import ( QoSGuard, ConfidenceScorer, ConsistencyChecker, GroundingChecker, ) @@ -2641,8 +2641,8 @@ A pipeline is a **Directed Acyclic Graph (DAG)** where: The fluent `PipelineBuilder` is the recommended way to construct pipelines: ```python -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import AgentStep, CallableStep, ReasoningStep +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import AgentStep, CallableStep, ReasoningStep engine = ( PipelineBuilder("invoice-pipeline") @@ -2671,7 +2671,7 @@ Five built-in executors cover most scenarios: Process multiple items concurrently: ```python -from fireflyframework_genai.pipeline.steps import FanOutStep, FanInStep +from fireflyframework_agentic.pipeline.steps import FanOutStep, FanInStep engine = ( PipelineBuilder("parallel-ocr") @@ -2693,7 +2693,7 @@ Gate nodes with a condition function. If the condition returns `False`, the node skipped: ```python -from fireflyframework_genai.pipeline.dag import DAGNode +from fireflyframework_agentic.pipeline.dag import DAGNode dag.add_node(DAGNode( node_id="ocr", @@ -2722,8 +2722,8 @@ Retries use linear backoff. On exhaustion, the node fails and the pipeline repor `PipelineContext` is the shared data bus flowing through the DAG: ```python -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(working_scope_id="invoice-run-42") @@ -2766,8 +2766,8 @@ for entry in result.execution_trace: For full control, build the DAG directly: ```python -from fireflyframework_genai.pipeline.dag import DAG, DAGNode, DAGEdge -from fireflyframework_genai.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.dag import DAG, DAGNode, DAGEdge +from fireflyframework_agentic.pipeline.engine import PipelineEngine dag = DAG("my-pipeline") dag.add_node(DAGNode(node_id="step_a", step=my_step)) @@ -2783,11 +2783,11 @@ result = await engine.run(inputs="hello") Here's our IDP pipeline as a DAG with all five phases: ```python -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import AgentStep, ReasoningStep, CallableStep -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.reasoning import PlanAndExecutePattern -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import AgentStep, ReasoningStep, CallableStep +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.reasoning import PlanAndExecutePattern +from fireflyframework_agentic.memory import MemoryManager # Step functions for non-agent nodes async def validate_step(context, inputs): @@ -2855,7 +2855,7 @@ enabled, the framework instruments agent runs automatically — you get spans fo `FireflyTracer` wraps the OpenTelemetry `Tracer` and adds GenAI-specific attributes: ```python -from fireflyframework_genai.observability import FireflyTracer +from fireflyframework_agentic.observability import FireflyTracer tracer = FireflyTracer(service_name="idp-service") @@ -2869,7 +2869,7 @@ with tracer.start_span("agent.run", attributes={"agent.name": "classifier"}) as Automatically create a span around any function: ```python -from fireflyframework_genai.observability import traced +from fireflyframework_agentic.observability import traced @traced(name="classify_document") async def classify_document(text: str) -> dict: @@ -2881,7 +2881,7 @@ async def classify_document(text: str) -> dict: `FireflyMetrics` provides counters, histograms, and gauges: ```python -from fireflyframework_genai.observability import FireflyMetrics +from fireflyframework_agentic.observability import FireflyMetrics metrics = FireflyMetrics(service_name="idp-service") @@ -2895,7 +2895,7 @@ metrics.record_histogram("agent.latency_ms", 142.5, labels={"agent": "classifier #### The `@metered` Decorator ```python -from fireflyframework_genai.observability import metered +from fireflyframework_agentic.observability import metered @metered(name="extraction") async def extract_fields(text: str) -> dict: @@ -2907,7 +2907,7 @@ async def extract_fields(text: str) -> dict: `FireflyEvents` emits structured events for significant occurrences: ```python -from fireflyframework_genai.observability import FireflyEvents +from fireflyframework_agentic.observability import FireflyEvents events = FireflyEvents() events.emit("agent.started", {"agent": "classifier", "model": "gpt-4o"}) @@ -2919,7 +2919,7 @@ events.emit("pipeline.step.completed", {"step": "classify", "duration_ms": 250}) Configure where traces and metrics go: ```python -from fireflyframework_genai.observability import configure_exporters +from fireflyframework_agentic.observability import configure_exporters # Send to an OTLP collector (Jaeger, Grafana Tempo, etc.) configure_exporters(otlp_endpoint="http://localhost:4317") @@ -2931,9 +2931,9 @@ configure_exporters(console=True) Configuration via environment variables: ```bash -export FIREFLY_GENAI_OBSERVABILITY_ENABLED=true -export FIREFLY_GENAI_OTLP_ENDPOINT=http://localhost:4317 -export FIREFLY_GENAI_LOG_LEVEL=DEBUG +export FIREFLY_AGENTIC_OBSERVABILITY_ENABLED=true +export FIREFLY_AGENTIC_OTLP_ENDPOINT=http://localhost:4317 +export FIREFLY_AGENTIC_LOG_LEVEL=DEBUG ``` ### Usage Tracking & Cost Estimation @@ -2943,7 +2943,7 @@ run, reasoning step, and pipeline execution. `UsageTracker` accumulates `UsageRecord` objects with input/output tokens, cost, latency, and model details. ```python -from fireflyframework_genai.observability import default_usage_tracker +from fireflyframework_agentic.observability import default_usage_tracker # After running agents, inspect accumulated usage summary = default_usage_tracker.get_summary() @@ -2960,7 +2960,7 @@ Cost is calculated via `CostCalculator` — either a built-in static price table the optional `genai-prices` library for up-to-date pricing: ```python -from fireflyframework_genai.observability import get_cost_calculator +from fireflyframework_agentic.observability import get_cost_calculator calc = get_cost_calculator() # auto-selects best available cost = calc.estimate("openai:gpt-4o", input_tokens=1000, output_tokens=500) @@ -2971,8 +2971,8 @@ cost = calc.estimate("openai:gpt-4o", input_tokens=1000, output_tokens=500) Set budget thresholds to get warnings when costs are high: ```bash -export FIREFLY_GENAI_BUDGET_ALERT_THRESHOLD_USD=5.00 -export FIREFLY_GENAI_BUDGET_LIMIT_USD=10.00 +export FIREFLY_AGENTIC_BUDGET_ALERT_THRESHOLD_USD=5.00 +export FIREFLY_AGENTIC_BUDGET_LIMIT_USD=10.00 ``` Pipeline results include aggregated usage automatically: @@ -2992,7 +2992,7 @@ code manually unless you want additional detail. ### IDP Tie-In: Instrumenting the Pipeline ```python -from fireflyframework_genai.observability import FireflyTracer, FireflyMetrics, traced +from fireflyframework_agentic.observability import FireflyTracer, FireflyMetrics, traced tracer = FireflyTracer(service_name="idp-service") metrics = FireflyMetrics(service_name="idp-service") @@ -3029,7 +3029,7 @@ markdown or JSON. `TraceRecorder` captures every decision during execution: ```python -from fireflyframework_genai.explainability import TraceRecorder +from fireflyframework_agentic.explainability import TraceRecorder recorder = TraceRecorder() recorder.record_decision( @@ -3049,7 +3049,7 @@ alternatives considered, and rationale. Transforms raw decision records into natural-language explanations: ```python -from fireflyframework_genai.explainability import ExplanationGenerator +from fireflyframework_agentic.explainability import ExplanationGenerator generator = ExplanationGenerator() explanation = generator.generate(recorder.decisions) @@ -3062,7 +3062,7 @@ print(explanation) A tamper-evident log where each entry includes a hash of the previous entry: ```python -from fireflyframework_genai.explainability import AuditTrail +from fireflyframework_agentic.explainability import AuditTrail trail = AuditTrail() for decision in recorder.decisions: @@ -3077,7 +3077,7 @@ assert trail.verify() Compile everything into a structured report: ```python -from fireflyframework_genai.explainability import ReportBuilder +from fireflyframework_agentic.explainability import ReportBuilder builder = ReportBuilder() builder.add_decisions(recorder.decisions) @@ -3095,7 +3095,7 @@ json_data = builder.build_json() In our IDP pipeline, we record why each field was extracted the way it was: ```python -from fireflyframework_genai.explainability import ( +from fireflyframework_agentic.explainability import ( TraceRecorder, ExplanationGenerator, AuditTrail, ReportBuilder, ) @@ -3151,7 +3151,7 @@ length), and **compare results** — all in a few lines of code. ### Defining an Experiment ```python -from fireflyframework_genai.experiments import Experiment, Variant +from fireflyframework_agentic.experiments import Experiment, Variant experiment = Experiment( name="extraction_model_comparison", @@ -3169,7 +3169,7 @@ The `ExperimentRunner` executes each variant against test inputs and collects me (latency, token usage, quality): ```python -from fireflyframework_genai.experiments import ExperimentRunner +from fireflyframework_agentic.experiments import ExperimentRunner runner = ExperimentRunner() results = await runner.run( @@ -3186,7 +3186,7 @@ results = await runner.run( Persist results for later analysis and reproducibility: ```python -from fireflyframework_genai.experiments import ExperimentTracker +from fireflyframework_agentic.experiments import ExperimentTracker tracker = ExperimentTracker(storage_dir="./experiment_results") tracker.save(results) @@ -3198,7 +3198,7 @@ loaded = tracker.load("extraction_model_comparison") ### Comparing Variants ```python -from fireflyframework_genai.experiments import VariantComparator +from fireflyframework_agentic.experiments import VariantComparator comparator = VariantComparator() metrics = comparator.compare(results) @@ -3239,7 +3239,7 @@ iterate on agent quality before going to production. Test an agent conversationally: ```python -from fireflyframework_genai.lab import LabSession +from fireflyframework_agentic.lab import LabSession session = LabSession(name="extraction-dev", agent=extractor_agent) response = await session.interact("Extract fields from: Invoice #INV-001...") @@ -3255,7 +3255,7 @@ for entry in session.history: Measure agent performance across a set of prompts: ```python -from fireflyframework_genai.lab import Benchmark +from fireflyframework_agentic.lab import Benchmark bench = Benchmark(inputs=[ "Extract from: Invoice #INV-001, Acme Corp, $500", @@ -3272,7 +3272,7 @@ print(f"P95 latency: {result.p95_latency_ms:.1f} ms") Compare multiple agents on the same prompts: ```python -from fireflyframework_genai.lab import ModelComparison +from fireflyframework_agentic.lab import ModelComparison comparison = ModelComparison(prompts=[ "Extract from: Invoice #INV-001, Acme Corp, $500", @@ -3291,7 +3291,7 @@ for entry in entries: Manage test inputs and expected outputs: ```python -from fireflyframework_genai.lab import EvalDataset, EvalCase +from fireflyframework_agentic.lab import EvalDataset, EvalCase dataset = EvalDataset(cases=[ EvalCase( @@ -3309,7 +3309,7 @@ dataset = EvalDataset.from_json("test_data/invoices.json") Run an agent against a dataset with a pluggable scorer: ```python -from fireflyframework_genai.lab import EvalOrchestrator +from fireflyframework_agentic.lab import EvalOrchestrator # Custom scorer for extraction accuracy def extraction_scorer(expected: str, actual: str) -> float: @@ -3353,13 +3353,13 @@ You can also add custom endpoints for pipelines. ### Quick Start ```bash -uv add "fireflyframework-genai[rest]" +uv add "fireflyframework-agentic[rest]" ``` ```python -from fireflyframework_genai.exposure.rest import create_genai_app +from fireflyframework_agentic.exposure.rest import create_agentic_app -app = create_genai_app(title="IDP Service", version="1.0.0") +app = create_agentic_app(title="IDP Service", version="1.0.0") ``` ```bash @@ -3414,7 +3414,7 @@ data: [DONE] ### Configuration ```python -app = create_genai_app( +app = create_agentic_app( title="IDP Service", version="1.0.0", enable_cors=True, @@ -3436,10 +3436,10 @@ Pass `conversation_id` in the request body: ### IDP Tie-In: Exposing the Pipeline as a REST API ```python -from fireflyframework_genai.exposure.rest import create_genai_app +from fireflyframework_agentic.exposure.rest import create_agentic_app from fastapi import UploadFile -app = create_genai_app(title="IDP Service") +app = create_agentic_app(title="IDP Service") # Custom endpoint for the full IDP pipeline @app.post("/idp/process") @@ -3474,7 +3474,7 @@ flowchart LR RES["Results Topic"] end - subgraph fireflyframework-genai + subgraph fireflyframework-agentic CONS["Consumer
KafkaAgentConsumer
RabbitMQAgentConsumer
RedisAgentConsumer
"] ROUTER["QueueRouter
pattern-based routing"] REG["AgentRegistry"] @@ -3494,9 +3494,9 @@ flowchart LR ```bash # Install the backend you need -uv add "fireflyframework-genai[kafka]" -uv add "fireflyframework-genai[rabbitmq]" -uv add "fireflyframework-genai[redis]" +uv add "fireflyframework-agentic[kafka]" +uv add "fireflyframework-agentic[rabbitmq]" +uv add "fireflyframework-agentic[redis]" ``` ### Consumers @@ -3507,7 +3507,7 @@ registered agent. They run continuously — think of them as your agent's "inbox #### Kafka Consumer ```python -from fireflyframework_genai.exposure.queues.kafka import KafkaAgentConsumer +from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentConsumer # This consumer reads from the "idp-incoming-documents" topic. # Every message body is passed to the "document_classifier" agent's run() method. @@ -3523,7 +3523,7 @@ await consumer.start() # Blocks and processes messages until stopped #### RabbitMQ Consumer ```python -from fireflyframework_genai.exposure.queues.rabbitmq import RabbitMQAgentConsumer +from fireflyframework_agentic.exposure.queues.rabbitmq import RabbitMQAgentConsumer consumer = RabbitMQAgentConsumer( agent_name="document_classifier", @@ -3536,7 +3536,7 @@ await consumer.start() #### Redis Consumer ```python -from fireflyframework_genai.exposure.queues.redis import RedisAgentConsumer +from fireflyframework_agentic.exposure.queues.redis import RedisAgentConsumer consumer = RedisAgentConsumer( agent_name="document_classifier", @@ -3554,8 +3554,8 @@ to the broker. Each producer satisfies the `QueueProducer` protocol. #### Kafka Producer ```python -from fireflyframework_genai.exposure.queues.kafka import KafkaAgentProducer -from fireflyframework_genai.exposure.queues import QueueMessage +from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentProducer +from fireflyframework_agentic.exposure.queues import QueueMessage # Create a producer that publishes to the "idp-results" topic. producer = KafkaAgentProducer( @@ -3576,7 +3576,7 @@ await producer.stop() #### RabbitMQ Producer ```python -from fireflyframework_genai.exposure.queues.rabbitmq import RabbitMQAgentProducer +from fireflyframework_agentic.exposure.queues.rabbitmq import RabbitMQAgentProducer producer = RabbitMQAgentProducer( queue_name="idp-results", @@ -3589,7 +3589,7 @@ await producer.stop() #### Redis Producer ```python -from fireflyframework_genai.exposure.queues.redis import RedisAgentProducer +from fireflyframework_agentic.exposure.queues.redis import RedisAgentProducer producer = RedisAgentProducer( channel="idp-results", @@ -3605,9 +3605,9 @@ The most common pattern is a **consumer that processes messages and publishes re This turns your agent into a microservice that reads from one topic and writes to another: ```python -from fireflyframework_genai.exposure.queues.kafka import KafkaAgentConsumer, KafkaAgentProducer -from fireflyframework_genai.exposure.queues import QueueMessage -from fireflyframework_genai.agents.registry import agent_registry +from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentConsumer, KafkaAgentProducer +from fireflyframework_agentic.exposure.queues import QueueMessage +from fireflyframework_agentic.agents.registry import agent_registry # Set up both sides consumer = KafkaAgentConsumer( @@ -3637,7 +3637,7 @@ async def process_and_publish(): All consumers and producers work with `QueueMessage`: ```python -from fireflyframework_genai.exposure.queues import QueueMessage +from fireflyframework_agentic.exposure.queues import QueueMessage message = QueueMessage( body="Process this invoice", @@ -3652,7 +3652,7 @@ message = QueueMessage( Route messages to different agents based on routing-key patterns: ```python -from fireflyframework_genai.exposure.queues import QueueRouter +from fireflyframework_agentic.exposure.queues import QueueRouter router = QueueRouter(default_agent="fallback") router.add_route(r"invoice\..*", "invoice_processor") @@ -3668,7 +3668,7 @@ router.add_route(r"contract\..*", "contract_processor") For unsupported brokers, extend `BaseQueueConsumer`: ```python -from fireflyframework_genai.exposure.queues.base import BaseQueueConsumer +from fireflyframework_agentic.exposure.queues.base import BaseQueueConsumer class MyBrokerConsumer(BaseQueueConsumer): async def start(self) -> None: @@ -3690,8 +3690,8 @@ and routes to specialised extractors. Results go back on a results topic for downstream systems to pick up: ```python -from fireflyframework_genai.exposure.queues.kafka import KafkaAgentConsumer, KafkaAgentProducer -from fireflyframework_genai.exposure.queues import QueueRouter, QueueMessage +from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentConsumer, KafkaAgentProducer +from fireflyframework_agentic.exposure.queues import QueueRouter, QueueMessage # Route different document types to specialised extraction agents. # Messages with routing_key "invoice.*" go to the invoice extractor, etc. @@ -3736,7 +3736,7 @@ the factory handles prompt engineering, output typing, and registry registration ### Summarizer ```python -from fireflyframework_genai.agents.templates import create_summarizer_agent +from fireflyframework_agentic.agents.templates import create_summarizer_agent agent = create_summarizer_agent( max_length="short", # concise | short | medium | detailed @@ -3752,7 +3752,7 @@ result = await agent.run("Long invoice description text here...") Returns a structured `ClassificationResult` with category, confidence, and reasoning: ```python -from fireflyframework_genai.agents.templates import create_classifier_agent +from fireflyframework_agentic.agents.templates import create_classifier_agent agent = create_classifier_agent( categories=["invoice", "receipt", "contract", "form"], @@ -3774,7 +3774,7 @@ Extracts structured data into a user-provided Pydantic model: ```python from pydantic import BaseModel -from fireflyframework_genai.agents.templates import create_extractor_agent +from fireflyframework_agentic.agents.templates import create_extractor_agent class Invoice(BaseModel): vendor: str @@ -3799,8 +3799,8 @@ result = await agent.run("Invoice from Acme Corp, $1,234.56, 2026-01-15") Memory-enabled multi-turn assistant: ```python -from fireflyframework_genai.agents.templates import create_conversational_agent -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.agents.templates import create_conversational_agent +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(max_conversation_tokens=32_000) agent = create_conversational_agent( @@ -3820,7 +3820,7 @@ result = await agent.run("What's the payment status?", conversation_id=cid) Intent-based routing to child agents: ```python -from fireflyframework_genai.agents.templates import create_router_agent +from fireflyframework_agentic.agents.templates import create_router_agent agent = create_router_agent( agent_map={ @@ -3850,7 +3850,7 @@ All template factories accept: Replace our manual agents with templates for cleaner code: ```python -from fireflyframework_genai.agents.templates import ( +from fireflyframework_agentic.agents.templates import ( create_classifier_agent, create_extractor_agent, ) @@ -3925,7 +3925,7 @@ graph LR ### Delegation Router ```python -from fireflyframework_genai.agents.delegation import DelegationRouter, RoundRobinStrategy +from fireflyframework_agentic.agents.delegation import DelegationRouter, RoundRobinStrategy router = DelegationRouter( agents=[agent_a, agent_b, agent_c], @@ -3940,7 +3940,7 @@ Distributes requests evenly across a pool of agents. Useful for load balancing when all agents have equivalent capabilities: ```python -from fireflyframework_genai.agents.delegation import RoundRobinStrategy +from fireflyframework_agentic.agents.delegation import RoundRobinStrategy strategy = RoundRobinStrategy() router = DelegationRouter([agent_1, agent_2, agent_3], strategy) @@ -3952,7 +3952,7 @@ router = DelegationRouter([agent_1, agent_2, agent_3], strategy) Selects the first agent whose tags include a required capability: ```python -from fireflyframework_genai.agents.delegation import CapabilityStrategy +from fireflyframework_agentic.agents.delegation import CapabilityStrategy strategy = CapabilityStrategy(required_tag="invoice_extraction") router = DelegationRouter([invoice_agent, receipt_agent], strategy) @@ -3965,7 +3965,7 @@ result = await router.route("Extract invoice data.") When a `MemoryManager` is attached, delegated agents receive a forked memory scope: ```python -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(working_scope_id="main") router = DelegationRouter([agent_a, agent_b], RoundRobinStrategy(), memory=memory) @@ -3976,7 +3976,7 @@ result = await router.route("Process this.") ### IDP Tie-In: Routing Documents to Specialised Agents ```python -from fireflyframework_genai.agents.delegation import DelegationRouter, CapabilityStrategy +from fireflyframework_agentic.agents.delegation import DelegationRouter, CapabilityStrategy # Specialised agents for different document types invoice_agent = create_extractor_agent(InvoiceSchema, name="invoice_extractor") @@ -4004,7 +4004,7 @@ imports, no central configuration file — just install the package and go. ### Discovering Plugins ```python -from fireflyframework_genai.plugin import PluginDiscovery +from fireflyframework_agentic.plugin import PluginDiscovery result = PluginDiscovery.discover_all() print(f"Loaded {len(result.successful)} plugins, {len(result.failed)} failed") @@ -4015,21 +4015,21 @@ print(f"Loaded {len(result.successful)} plugins, {len(result.failed)} failed") In your package's `pyproject.toml`, declare entry points under the framework's groups: ```toml -[project.entry-points."fireflyframework_genai.agents"] +[project.entry-points."fireflyframework_agentic.agents"] my_agent = "my_package.agents:MySpecialAgent" -[project.entry-points."fireflyframework_genai.tools"] +[project.entry-points."fireflyframework_agentic.tools"] my_tool = "my_package.tools:MyCustomTool" -[project.entry-points."fireflyframework_genai.reasoning_patterns"] +[project.entry-points."fireflyframework_agentic.reasoning_patterns"] my_pattern = "my_package.reasoning:MyCustomPattern" ``` The three entry-point groups are: -- `fireflyframework_genai.agents` — Custom agents. -- `fireflyframework_genai.tools` — Custom tools. -- `fireflyframework_genai.reasoning_patterns` — Custom reasoning patterns. +- `fireflyframework_agentic.agents` — Custom agents. +- `fireflyframework_agentic.tools` — Custom tools. +- `fireflyframework_agentic.reasoning_patterns` — Custom reasoning patterns. On discovery, the framework loads each entry point and registers it in the appropriate registry. @@ -4038,7 +4038,7 @@ registry. ```python # Enable auto-discovery on startup (default: True) -# FIREFLY_GENAI_PLUGIN_AUTO_DISCOVER=true +# FIREFLY_AGENTIC_PLUGIN_AUTO_DISCOVER=true ``` ### IDP Tie-In: Packaging IDP as a Plugin @@ -4047,7 +4047,7 @@ You can package the entire IDP pipeline as a plugin that self-registers when ins ```toml # In idp_plugin/pyproject.toml -[project.entry-points."fireflyframework_genai.agents"] +[project.entry-points."fireflyframework_agentic.agents"] document_classifier = "idp_plugin.agents:classifier_agent" field_extractor = "idp_plugin.agents:extractor_agent" ocr_agent = "idp_plugin.agents:ocr_agent" @@ -4060,7 +4060,7 @@ agents automatically. ## Chapter 20: Putting It All Together -You've learned every module in fireflyframework-genai, each in isolation. Now it's time +You've learned every module in fireflyframework-agentic, each in isolation. Now it's time to see how they all fit together in a single, production-grade application. The diagram below shows the full system architecture — every layer, every connection: @@ -4108,7 +4108,7 @@ graph TB subgraph "Foundation" PAI["Pydantic AI\n(model calls, streaming)"] - CFG["FireflyGenAIConfig\n(env-driven settings)"] + CFG["FireflyAgenticConfig\n(env-driven settings)"] PLUG["Plugin System\n(entry-point discovery)"] end @@ -4163,27 +4163,27 @@ idp-service/ ### Configuration (.env) ```bash -FIREFLY_GENAI_DEFAULT_MODEL=openai:gpt-4o -FIREFLY_GENAI_DEFAULT_TEMPERATURE=0.1 -FIREFLY_GENAI_MAX_RETRIES=3 -FIREFLY_GENAI_OBSERVABILITY_ENABLED=true -FIREFLY_GENAI_OTLP_ENDPOINT=http://localhost:4317 -FIREFLY_GENAI_MEMORY_BACKEND=file -FIREFLY_GENAI_MEMORY_FILE_DIR=.firefly_memory -FIREFLY_GENAI_DEFAULT_CHUNK_SIZE=4000 -FIREFLY_GENAI_VALIDATION_ENABLED=true +FIREFLY_AGENTIC_DEFAULT_MODEL=openai:gpt-4o +FIREFLY_AGENTIC_DEFAULT_TEMPERATURE=0.1 +FIREFLY_AGENTIC_MAX_RETRIES=3 +FIREFLY_AGENTIC_OBSERVABILITY_ENABLED=true +FIREFLY_AGENTIC_OTLP_ENDPOINT=http://localhost:4317 +FIREFLY_AGENTIC_MEMORY_BACKEND=file +FIREFLY_AGENTIC_MEMORY_FILE_DIR=.firefly_memory +FIREFLY_AGENTIC_DEFAULT_CHUNK_SIZE=4000 +FIREFLY_AGENTIC_VALIDATION_ENABLED=true ``` ### Agents (agents.py) ```python from pydantic import BaseModel, Field -from fireflyframework_genai.agents.templates import ( +from fireflyframework_agentic.agents.templates import ( create_classifier_agent, create_extractor_agent, create_summarizer_agent, ) -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent # Output schema for extraction class InvoiceData(BaseModel): @@ -4240,9 +4240,9 @@ registers it in the global `ToolRegistry`, and returns the instance. The `ToolKi bundles them for agent injection via `as_pydantic_tools()`: ```python -from fireflyframework_genai.tools import firefly_tool, guarded, retryable, ToolKit -from fireflyframework_genai.tools.guards import RateLimitGuard, ValidationGuard -from fireflyframework_genai.tools.builtins import CalculatorTool +from fireflyframework_agentic.tools import firefly_tool, guarded, retryable, ToolKit +from fireflyframework_agentic.tools.guards import RateLimitGuard, ValidationGuard +from fireflyframework_agentic.tools.builtins import CalculatorTool # OCR tool — rate-limited because the upstream API is metered @retryable(max_retries=2, backoff=1.0) @@ -4277,13 +4277,13 @@ extraction_kit = ToolKit( ### Validation (validation.py) ```python -from fireflyframework_genai.validation.rules import ( +from fireflyframework_agentic.validation.rules import ( OutputValidator, RegexRule, FormatRule, RangeRule, ) -from fireflyframework_genai.validation.qos import ( +from fireflyframework_agentic.validation.qos import ( QoSGuard, ConfidenceScorer, ConsistencyChecker, GroundingChecker, ) -from fireflyframework_genai.validation import OutputReviewer +from fireflyframework_agentic.validation import OutputReviewer from .agents import InvoiceData, extractor_agent invoice_validator = OutputValidator({ @@ -4312,14 +4312,14 @@ qos_guard = QoSGuard( ### Pipeline (pipeline.py) ```python -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import AgentStep, ReasoningStep, CallableStep -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.reasoning import PlanAndExecutePattern, ReflexionPattern -from fireflyframework_genai.content.chunking import TextChunker, BatchProcessor -from fireflyframework_genai.content.compression import ContextCompressor, MapReduceStrategy -from fireflyframework_genai.memory import MemoryManager -from fireflyframework_genai.observability import traced +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import AgentStep, ReasoningStep, CallableStep +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.reasoning import PlanAndExecutePattern, ReflexionPattern +from fireflyframework_agentic.content.chunking import TextChunker, BatchProcessor +from fireflyframework_agentic.content.compression import ContextCompressor, MapReduceStrategy +from fireflyframework_agentic.memory import MemoryManager +from fireflyframework_agentic.observability import traced from .agents import classifier_agent, ocr_agent, summary_agent, extractor_agent from .validation import invoice_validator, reviewer @@ -4375,8 +4375,8 @@ async def process_document(document_bytes: bytes, metadata: dict | None = None) ### REST Application (app.py) ```python -from fireflyframework_genai.exposure.rest import create_genai_app -from fireflyframework_genai.observability import configure_exporters +from fireflyframework_agentic.exposure.rest import create_agentic_app +from fireflyframework_agentic.observability import configure_exporters from fastapi import UploadFile from .pipeline import process_document @@ -4384,7 +4384,7 @@ from .pipeline import process_document configure_exporters(otlp_endpoint="http://localhost:4317", console=True) # Create the app -app = create_genai_app(title="IDP Service", version="1.0.0") +app = create_agentic_app(title="IDP Service", version="1.0.0") @app.post("/idp/process") async def handle_document(file: UploadFile): @@ -4399,8 +4399,8 @@ async def handle_document(file: UploadFile): ### Queue Consumers (consumers.py) ```python -from fireflyframework_genai.exposure.queues.kafka import KafkaAgentConsumer -from fireflyframework_genai.exposure.queues import QueueRouter +from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentConsumer +from fireflyframework_agentic.exposure.queues import QueueRouter # Route different document types to specialised processing router = QueueRouter(default_agent="document_classifier") @@ -4430,7 +4430,7 @@ python -m idp_service.consumers Before deploying to production, verify: -- [ ] **Configuration** — All `FIREFLY_GENAI_*` environment variables are set. +- [ ] **Configuration** — All `FIREFLY_AGENTIC_*` environment variables are set. - [ ] **Model access** — API keys for your LLM provider are configured. - [ ] **Observability** — OTLP endpoint is reachable; traces are flowing. - [ ] **Memory persistence** — `memory_backend` is set to `"file"` (or a custom backend) @@ -4449,7 +4449,7 @@ Before deploying to production, verify: ## Next Steps -Congratulations — you now know every module in fireflyframework-genai. Here are some +Congratulations — you now know every module in fireflyframework-agentic. Here are some paths to explore further: - **Dive deeper** — Each chapter links to a detailed module guide in `docs/`. diff --git a/docs/use-case-idp.md b/docs/use-case-idp.md index 85c4b8f5..6dd7396f 100644 --- a/docs/use-case-idp.md +++ b/docs/use-case-idp.md @@ -3,7 +3,7 @@ Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. This guide demonstrates how to build a production-grade Intelligent Document Processing -pipeline using fireflyframework-genai. The pipeline takes a raw document (PDF, image, +pipeline using fireflyframework-agentic. The pipeline takes a raw document (PDF, image, or scanned file), splits it into logical sub-documents, classifies each one, extracts structured data, validates the results, assembles a final output, and generates an LLM-powered explainability narrative -- all orchestrated as a 7-node DAG pipeline with @@ -41,8 +41,8 @@ the raw text with page markers. The extracted text is then chunked and compresse if needed. ```python -from fireflyframework_genai.content.chunking import TextChunker -from fireflyframework_genai.content.compression import ContextCompressor, TruncationStrategy +from fireflyframework_agentic.content.chunking import TextChunker +from fireflyframework_agentic.content.compression import ContextCompressor, TruncationStrategy # Chunk the extracted text chunker = TextChunker(chunk_size=20_000, chunk_overlap=200, strategy="token") @@ -62,7 +62,7 @@ incorporation followed by bylaws). The splitting phase uses a `FireflyAgent` to analyse page-level summaries and detect document boundaries. ```python -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent splitter_agent = FireflyAgent( name="document_splitter", @@ -89,7 +89,7 @@ bylaws, corporate filing, etc.) using `create_classifier_agent` with category descriptions and a Plan-and-Execute reasoning pattern for systematic analysis. ```python -from fireflyframework_genai.agents.templates import create_classifier_agent +from fireflyframework_agentic.agents.templates import create_classifier_agent DOCUMENT_TYPES = ["certificate_of_incorporation", "bylaws", "corporate_filing", "amendment", "other"] DOCUMENT_TYPE_DESCRIPTIONS = { @@ -114,7 +114,7 @@ result = await classifier_agent.run_with_reasoning( For multi-page documents, use `ImageTiler` to split large scans: ```python -from fireflyframework_genai.content.chunking import ImageTiler +from fireflyframework_agentic.content.chunking import ImageTiler tiler = ImageTiler(tile_width=1024, tile_height=1024, overlap=64) tiles = tiler.compute_tiles(image_width=4096, image_height=6144) @@ -130,9 +130,9 @@ validation failures. A custom retry prompt avoids resending the full document te on each retry, focusing only on the errors. ```python -from fireflyframework_genai.agents.templates import create_extractor_agent -from fireflyframework_genai.validation import OutputReviewer, OutputValidator -from fireflyframework_genai.validation.rules import RegexRule, FormatRule, EnumRule +from fireflyframework_agentic.agents.templates import create_extractor_agent +from fireflyframework_agentic.validation import OutputReviewer, OutputValidator +from fireflyframework_agentic.validation.rules import RegexRule, FormatRule, EnumRule extractor_agent = create_extractor_agent( CorporateDocumentData, # Pydantic model @@ -166,14 +166,14 @@ to ensure extracted fields conform to business rules and are grounded in the sou text. If validation fails, the `ReflexionPattern` drives self-correction. ```python -from fireflyframework_genai.validation.rules import ( +from fireflyframework_agentic.validation.rules import ( OutputValidator, RegexRule, FormatRule, EnumRule, ) -from fireflyframework_genai.validation.qos import GroundingChecker -from fireflyframework_genai.reasoning import ReflexionPattern +from fireflyframework_agentic.validation.qos import GroundingChecker +from fireflyframework_agentic.reasoning import ReflexionPattern # -- Structural validation -- validator = OutputValidator({ @@ -240,8 +240,8 @@ audit report. A `FireflyAgent` reads the trace records, audit trail, and assembl output to generate a human-readable narrative covering the full pipeline run. ```python -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.explainability import TraceRecorder, AuditTrail, ReportBuilder +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.explainability import TraceRecorder, AuditTrail, ReportBuilder # The trace recorder and audit trail have been collecting data throughout the pipeline recorder = TraceRecorder() @@ -277,7 +277,7 @@ Add memory to persist conversation across phases and carry facts like classifica results into later steps. ```python -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.memory import MemoryManager memory = MemoryManager(working_scope_id="idp-session") ``` @@ -286,9 +286,9 @@ This gives you parallel execution, retries, timeouts, condition gates, and a ful execution trace for observability. ```python -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import CallableStep -from fireflyframework_genai.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import CallableStep +from fireflyframework_agentic.pipeline.context import PipelineContext # -- Build the 7-node pipeline DAG -- @@ -329,11 +329,11 @@ else: Register the pipeline as a REST endpoint so it can be called from external systems: ```python -from fireflyframework_genai.exposure.rest import create_genai_app +from fireflyframework_agentic.exposure.rest import create_agentic_app # The IDP agents are already registered in the AgentRegistry. # The REST app auto-generates endpoints for each agent. -app = create_genai_app() +app = create_agentic_app() # The pipeline itself can be exposed as a custom endpoint: from fastapi import UploadFile diff --git a/docs/validation.md b/docs/validation.md index 4a8094ce..9117c7a4 100644 --- a/docs/validation.md +++ b/docs/validation.md @@ -23,7 +23,7 @@ with five built-in rule types: - **CustomRule** -- User-supplied predicate function. ```python -from fireflyframework_genai.validation.rules import ( +from fireflyframework_agentic.validation.rules import ( OutputValidator, RegexRule, RangeRule, @@ -44,7 +44,7 @@ entire output dictionary at once. The result is a `ValidationReport` listing all passing and failing fields. ```python -from fireflyframework_genai.validation.rules import OutputValidator, RegexRule, EnumRule, RangeRule +from fireflyframework_agentic.validation.rules import OutputValidator, RegexRule, EnumRule, RangeRule validator = OutputValidator({ "status": [EnumRule("status", ["approved", "rejected", "pending"])], @@ -67,7 +67,7 @@ confidence markers (e.g. "I'm 85% confident") or using heuristic indicators like hedging language. ```python -from fireflyframework_genai.validation.qos import ConfidenceScorer +from fireflyframework_agentic.validation.qos import ConfidenceScorer scorer = ConfidenceScorer(my_agent) score = await scorer.score("The answer is definitely 42.") @@ -79,7 +79,7 @@ Runs the same prompt through an agent multiple times and measures the consistenc of the outputs. ```python -from fireflyframework_genai.validation.qos import ConsistencyChecker +from fireflyframework_agentic.validation.qos import ConsistencyChecker checker = ConsistencyChecker(my_agent, num_runs=3) score, outputs = await checker.check("What is the capital of France?") @@ -92,7 +92,7 @@ Verifies that a response is grounded in provided reference text by checking how of the response content can be traced back to the source material. ```python -from fireflyframework_genai.validation.qos import GroundingChecker +from fireflyframework_agentic.validation.qos import GroundingChecker checker = GroundingChecker() score, field_map = checker.check( @@ -108,7 +108,7 @@ print(score) # 1.0 if all fields are grounded in the source pipeline node or used standalone. It produces a `QoSResult` with a pass/fail verdict. ```python -from fireflyframework_genai.validation.qos import ( +from fireflyframework_agentic.validation.qos import ( QoSGuard, ConfidenceScorer, ConsistencyChecker, GroundingChecker, ) @@ -137,7 +137,7 @@ automatically retries with a feedback prompt describing exactly what was wrong. ```python from pydantic import BaseModel, Field -from fireflyframework_genai.validation import OutputReviewer +from fireflyframework_agentic.validation import OutputReviewer class InvoiceData(BaseModel): vendor: str @@ -155,7 +155,7 @@ print(result.attempts) # 1 if first try succeeded, 2+ if retries were needed Combine schema parsing with field-level validation rules: ```python -from fireflyframework_genai.validation import OutputReviewer, OutputValidator, EnumRule +from fireflyframework_agentic.validation import OutputReviewer, OutputValidator, EnumRule validator = OutputValidator({ "vendor": [EnumRule("vendor", ["Acme Corp", "Globex", "Initech"])], @@ -173,8 +173,8 @@ result = await reviewer.review(agent, "Extract invoice data from: ...") Attach a reviewer to any reasoning pattern to validate the final output: ```python -from fireflyframework_genai.reasoning import ReActPattern -from fireflyframework_genai.validation import OutputReviewer +from fireflyframework_agentic.reasoning import ReActPattern +from fireflyframework_agentic.validation import OutputReviewer reviewer = OutputReviewer(output_type=InvoiceData, max_retries=2) pattern = ReActPattern(reviewer=reviewer) diff --git a/docs/vectorstores.md b/docs/vectorstores.md index 2af6e898..4af3e6dc 100644 --- a/docs/vectorstores.md +++ b/docs/vectorstores.md @@ -31,8 +31,8 @@ graph TD ## Quick Start ```python -from fireflyframework_genai.embeddings.providers import OpenAIEmbedder -from fireflyframework_genai.vectorstores import InMemoryVectorStore, VectorDocument +from fireflyframework_agentic.embeddings.providers import OpenAIEmbedder +from fireflyframework_agentic.vectorstores import InMemoryVectorStore, VectorDocument # Create a store with auto-embedding embedder = OpenAIEmbedder() @@ -61,7 +61,7 @@ for r in results: Zero-dependency, brute-force cosine similarity. Ideal for development and testing. ```python -from fireflyframework_genai.vectorstores import InMemoryVectorStore +from fireflyframework_agentic.vectorstores import InMemoryVectorStore store = InMemoryVectorStore(embedder=my_embedder) ``` @@ -71,7 +71,7 @@ No extra install required. ### ChromaDB ```python -from fireflyframework_genai.vectorstores import ChromaVectorStore +from fireflyframework_agentic.vectorstores import ChromaVectorStore # Ephemeral (in-process) store = ChromaVectorStore(collection_name="my_docs", embedder=my_embedder) @@ -82,12 +82,12 @@ client = chromadb.HttpClient(host="localhost", port=8000) store = ChromaVectorStore(collection_name="my_docs", client=client, embedder=my_embedder) ``` -Install: `pip install fireflyframework-genai[vectorstores-chroma]` +Install: `pip install fireflyframework-agentic[vectorstores-chroma]` ### Pinecone ```python -from fireflyframework_genai.vectorstores import PineconeVectorStore +from fireflyframework_agentic.vectorstores import PineconeVectorStore store = PineconeVectorStore( index_name="my-index", @@ -96,12 +96,12 @@ store = PineconeVectorStore( ) ``` -Install: `pip install fireflyframework-genai[vectorstores-pinecone]` +Install: `pip install fireflyframework-agentic[vectorstores-pinecone]` ### Qdrant ```python -from fireflyframework_genai.vectorstores import QdrantVectorStore +from fireflyframework_agentic.vectorstores import QdrantVectorStore store = QdrantVectorStore( collection_name="my_collection", @@ -112,7 +112,7 @@ store = QdrantVectorStore( ) ``` -Install: `pip install fireflyframework-genai[vectorstores-qdrant]` +Install: `pip install fireflyframework-agentic[vectorstores-qdrant]` --- @@ -121,7 +121,7 @@ Install: `pip install fireflyframework-genai[vectorstores-qdrant]` ### VectorDocument ```python -from fireflyframework_genai.vectorstores import VectorDocument +from fireflyframework_agentic.vectorstores import VectorDocument doc = VectorDocument( id="unique-id", # required @@ -135,7 +135,7 @@ doc = VectorDocument( ### SearchResult ```python -from fireflyframework_genai.vectorstores import SearchResult +from fireflyframework_agentic.vectorstores import SearchResult # Returned by search() and search_text() result.document # VectorDocument @@ -145,7 +145,7 @@ result.score # float (0.0 to 1.0, higher = more similar) ### SearchFilter ```python -from fireflyframework_genai.vectorstores import SearchFilter +from fireflyframework_agentic.vectorstores import SearchFilter # Supported operators: eq, ne, gt, lt, gte, lte, in filters = [ @@ -202,7 +202,7 @@ results = await store.search_text("my query") ## Registry ```python -from fireflyframework_genai.vectorstores import VectorStoreRegistry, InMemoryVectorStore +from fireflyframework_agentic.vectorstores import VectorStoreRegistry, InMemoryVectorStore registry = VectorStoreRegistry() registry.register("memory", InMemoryVectorStore(embedder=my_embedder)) @@ -215,12 +215,12 @@ await store.upsert(docs) ## Configuration -Global defaults via environment variables (prefix `FIREFLY_GENAI_`): +Global defaults via environment variables (prefix `FIREFLY_AGENTIC_`): | Setting | Env Variable | Default | |---------|-------------|---------| -| `default_vector_store` | `FIREFLY_GENAI_DEFAULT_VECTOR_STORE` | `memory` | -| `vector_store_namespace` | `FIREFLY_GENAI_VECTOR_STORE_NAMESPACE` | `default` | +| `default_vector_store` | `FIREFLY_AGENTIC_DEFAULT_VECTOR_STORE` | `memory` | +| `vector_store_namespace` | `FIREFLY_AGENTIC_VECTOR_STORE_NAMESPACE` | `default` | --- @@ -229,7 +229,7 @@ Global defaults via environment variables (prefix `FIREFLY_GENAI_`): Build retrieval-augmented generation workflows using pipeline steps: ```python -from fireflyframework_genai.pipeline import Pipeline, PipelineStep, RetrievalStep +from fireflyframework_agentic.pipeline import Pipeline, PipelineStep, RetrievalStep # RetrievalStep embeds the query and searches the store retrieval = RetrievalStep( @@ -254,8 +254,8 @@ result = await pipeline.execute("What is RAG?") Subclass `BaseVectorStore` and implement three methods: ```python -from fireflyframework_genai.vectorstores.base import BaseVectorStore -from fireflyframework_genai.vectorstores.types import SearchFilter, SearchResult, VectorDocument +from fireflyframework_agentic.vectorstores.base import BaseVectorStore +from fireflyframework_agentic.vectorstores.types import SearchFilter, SearchResult, VectorDocument class MyVectorStore(BaseVectorStore): async def _upsert(self, documents: list[VectorDocument], namespace: str) -> None: diff --git a/examples/README.md b/examples/README.md index d8d6bd8f..c0733a05 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,7 +2,7 @@ Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. -Runnable example scripts demonstrating the major features of `fireflyframework-genai`. +Runnable example scripts demonstrating the major features of `fireflyframework-agentic`. ## Prerequisites @@ -78,7 +78,7 @@ If `OPENAI_API_KEY` is not set, each script will prompt you interactively. ## Studio Examples -- **`studio_launch.py`** — Launch Firefly Studio programmatically with custom `StudioConfig`. Shows how to embed the Studio app with a custom port, host, and project directory. Requires `pip install "fireflyframework-genai[studio]"`. **No API key required** (the AI assistant requires one, but the IDE itself does not). +- **`studio_launch.py`** — Launch Firefly Studio programmatically with custom `StudioConfig`. Shows how to embed the Studio app with a custom port, host, and project directory. Requires `pip install "fireflyframework-agentic[studio]"`. **No API key required** (the AI assistant requires one, but the IDE itself does not). ## Reasoning Pattern Examples diff --git a/examples/basic_agent.py b/examples/basic_agent.py index f4e91159..73930928 100644 --- a/examples/basic_agent.py +++ b/examples/basic_agent.py @@ -30,7 +30,7 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent +from fireflyframework_agentic.agents import FireflyAgent async def main() -> None: diff --git a/examples/batch_processing.py b/examples/batch_processing.py index 2d0ae757..69493fec 100644 --- a/examples/batch_processing.py +++ b/examples/batch_processing.py @@ -38,9 +38,9 @@ import os import time -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import BatchLLMStep +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import BatchLLMStep async def demo_basic_batch_processing(): @@ -72,7 +72,7 @@ async def demo_basic_batch_processing(): batch_size=10, # Process up to 10 at once ) - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext context = PipelineContext(inputs={}, correlation_id="batch-demo") inputs = {"reviews": reviews} @@ -116,7 +116,7 @@ async def demo_large_scale_batch(): batch_size=5, # Process 5 at a time ) - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext context = PipelineContext(inputs={}, correlation_id="large-batch") inputs = {"documents": documents} @@ -165,7 +165,7 @@ def on_batch_complete(results): on_batch_complete=on_batch_complete, ) - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext context = PipelineContext(inputs={}, correlation_id="callback-demo") inputs = {"texts": texts} @@ -253,7 +253,7 @@ async def demo_cost_comparison(): print("⚠️ Skipping cost comparison (requires OPENAI_API_KEY)") return - from fireflyframework_genai.observability.usage import default_usage_tracker + from fireflyframework_agentic.observability.usage import default_usage_tracker agent = FireflyAgent( "cost-test", @@ -278,7 +278,7 @@ async def demo_cost_comparison(): initial_cost = default_usage_tracker.get_summary().total_cost_usd step = BatchLLMStep(agent, prompts_key="prompts") - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext context = PipelineContext(inputs={}, correlation_id="cost-test") await step.execute(context, {"prompts": prompts}) diff --git a/examples/cached_tool.py b/examples/cached_tool.py index 12e254e3..74a997db 100644 --- a/examples/cached_tool.py +++ b/examples/cached_tool.py @@ -35,7 +35,7 @@ async def main() -> None: - from fireflyframework_genai.tools.cached import CachedTool + from fireflyframework_agentic.tools.cached import CachedTool # -- Define a "slow" tool that simulates network latency ------------------ diff --git a/examples/circuit_breaker.py b/examples/circuit_breaker.py index c8b25d19..9c912a55 100644 --- a/examples/circuit_breaker.py +++ b/examples/circuit_breaker.py @@ -41,7 +41,7 @@ import asyncio import random -from fireflyframework_genai.resilience.circuit_breaker import ( +from fireflyframework_agentic.resilience.circuit_breaker import ( CircuitBreaker, CircuitBreakerOpenError, ) @@ -310,7 +310,7 @@ async def main(): print("✓ Automatically transitions based on failures and successes") print("✓ Use with fallback strategies for resilient applications") print("\nUsage:") - print(" from fireflyframework_genai.resilience import CircuitBreaker") + print(" from fireflyframework_agentic.resilience import CircuitBreaker") print() print(" breaker = CircuitBreaker(") print(" failure_threshold=5,") @@ -322,7 +322,7 @@ async def main(): print(" result = await external_api_call()") print() print("With agent middleware:") - print(" from fireflyframework_genai.resilience import CircuitBreakerMiddleware") + print(" from fireflyframework_agentic.resilience import CircuitBreakerMiddleware") print() print(" agent = FireflyAgent(") print(" 'resilient-agent',") diff --git a/examples/classifier.py b/examples/classifier.py index b065ffd5..6a18a16a 100644 --- a/examples/classifier.py +++ b/examples/classifier.py @@ -29,7 +29,7 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents.templates import create_classifier_agent +from fireflyframework_agentic.agents.templates import create_classifier_agent SAMPLES = [ "My invoice shows an incorrect charge for last month's subscription.", diff --git a/examples/conversation_export_import.py b/examples/conversation_export_import.py index 12b698b1..174edb9d 100644 --- a/examples/conversation_export_import.py +++ b/examples/conversation_export_import.py @@ -35,7 +35,7 @@ def main() -> None: - from fireflyframework_genai.memory.conversation import ConversationMemory + from fireflyframework_agentic.memory.conversation import ConversationMemory # ── 1. Build a conversation ───────────────────────────────────────── print("=== Build a Conversation ===\n") @@ -107,7 +107,7 @@ def main() -> None: # ── 7. LLM summarizer factory ─────────────────────────────────────── print("\n=== LLM Summarizer (factory demo) ===\n") - from fireflyframework_genai.memory.summarization import create_llm_summarizer + from fireflyframework_agentic.memory.summarization import create_llm_summarizer summarizer = create_llm_summarizer() print(f" create_llm_summarizer() → {type(summarizer).__name__} (callable={callable(summarizer)})") diff --git a/examples/conversational_memory.py b/examples/conversational_memory.py index e7ffadc5..93beb817 100644 --- a/examples/conversational_memory.py +++ b/examples/conversational_memory.py @@ -31,8 +31,8 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents.templates import create_conversational_agent -from fireflyframework_genai.memory import MemoryManager +from fireflyframework_agentic.agents.templates import create_conversational_agent +from fireflyframework_agentic.memory import MemoryManager async def main() -> None: diff --git a/examples/database_persistence.py b/examples/database_persistence.py index b99d0a28..39268c4c 100755 --- a/examples/database_persistence.py +++ b/examples/database_persistence.py @@ -25,7 +25,7 @@ Prerequisites: 1. Install PostgreSQL dependencies: - pip install fireflyframework-genai[postgres] + pip install fireflyframework-agentic[postgres] 2. Start PostgreSQL (using Docker): docker run -d \\ @@ -36,8 +36,8 @@ postgres:17 3. Set environment variables: - export FIREFLY_GENAI_MEMORY_BACKEND=postgres - export FIREFLY_GENAI_MEMORY_POSTGRES_URL=postgresql://postgres:firefly123@localhost/firefly_memory + export FIREFLY_AGENTIC_MEMORY_BACKEND=postgres + export FIREFLY_AGENTIC_MEMORY_POSTGRES_URL=postgresql://postgres:firefly123@localhost/firefly_memory export OPENAI_API_KEY=sk-... Usage: @@ -46,10 +46,10 @@ import asyncio -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.config import get_config -from fireflyframework_genai.memory.database_store import PostgreSQLStore -from fireflyframework_genai.memory.manager import MemoryManager +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.config import get_config +from fireflyframework_agentic.memory.database_store import PostgreSQLStore +from fireflyframework_agentic.memory.manager import MemoryManager async def main() -> None: @@ -100,7 +100,7 @@ async def main() -> None: # Store a fact in working memory (persisted to PostgreSQL) memory.set_fact("user_name", "Alice") - memory.set_fact("project", "Firefly GenAI Framework") + memory.set_fact("project", "Firefly Agentic Framework") print("\n✓ Stored facts in working memory (PostgreSQL)") # Second interaction - memory is recalled from PostgreSQL diff --git a/examples/delegation_strategies.py b/examples/delegation_strategies.py index 00142e25..49806484 100644 --- a/examples/delegation_strategies.py +++ b/examples/delegation_strategies.py @@ -32,8 +32,8 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.agents.delegation import ( +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.agents.delegation import ( CapabilityStrategy, ContentBasedStrategy, CostAwareStrategy, diff --git a/examples/distributed_tracing.py b/examples/distributed_tracing.py index b6dd897f..5c3a57a3 100755 --- a/examples/distributed_tracing.py +++ b/examples/distributed_tracing.py @@ -15,7 +15,7 @@ """Distributed tracing with W3C Trace Context propagation. -This example demonstrates how Firefly GenAI automatically propagates trace +This example demonstrates how Firefly Agentic automatically propagates trace context across service boundaries using the W3C Trace Context standard. Features demonstrated: @@ -33,7 +33,7 @@ jaegertracing/all-in-one:latest 2. Set environment variables: - export FIREFLY_GENAI_OTLP_ENDPOINT=http://localhost:4317 + export FIREFLY_AGENTIC_OTLP_ENDPOINT=http://localhost:4317 export OPENAI_API_KEY=sk-... 3. View traces at: http://localhost:16686 @@ -46,9 +46,9 @@ from opentelemetry import trace -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.config import get_config -from fireflyframework_genai.observability.tracer import ( +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.config import get_config +from fireflyframework_agentic.observability.tracer import ( default_tracer, extract_trace_context, inject_trace_context, @@ -163,7 +163,7 @@ async def main() -> None: print("✓ View at: http://localhost:16686") else: print("\n⚠ No OTLP endpoint configured - traces will be console-only") - print("Set FIREFLY_GENAI_OTLP_ENDPOINT=http://localhost:4317 to enable Jaeger") + print("Set FIREFLY_AGENTIC_OTLP_ENDPOINT=http://localhost:4317 to enable Jaeger") # Start distributed trace tracer = trace.get_tracer(__name__) @@ -205,7 +205,7 @@ async def main() -> None: print("View Trace in Jaeger") print("=" * 70) print("1. Open http://localhost:16686") - print("2. Select 'fireflyframework_genai' service") + print("2. Select 'fireflyframework_agentic' service") print("3. Click 'Find Traces'") print(f"4. Look for trace ID: {root_context.trace_id:032x}") print("5. Click the trace to see the full span hierarchy:") diff --git a/examples/extractor.py b/examples/extractor.py index cb64bb2a..a3744aa9 100644 --- a/examples/extractor.py +++ b/examples/extractor.py @@ -30,7 +30,7 @@ from _common import MODEL, ensure_api_key from pydantic import BaseModel -from fireflyframework_genai.agents.templates import create_extractor_agent +from fireflyframework_agentic.agents.templates import create_extractor_agent class ContactInfo(BaseModel): diff --git a/examples/full_integration.py b/examples/full_integration.py index f8dcb280..394dbe12 100644 --- a/examples/full_integration.py +++ b/examples/full_integration.py @@ -36,27 +36,27 @@ import os # Core framework -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent # Middleware (all production features) -from fireflyframework_genai.agents.builtin_middleware import ( +from fireflyframework_agentic.agents.builtin_middleware import ( CostGuardMiddleware, LoggingMiddleware, ObservabilityMiddleware, ) -from fireflyframework_genai.agents.prompt_cache import PromptCacheMiddleware -from fireflyframework_genai.config import get_config +from fireflyframework_agentic.agents.prompt_cache import PromptCacheMiddleware +from fireflyframework_agentic.config import get_config # Database persistence -from fireflyframework_genai.memory.manager import MemoryManager +from fireflyframework_agentic.memory.manager import MemoryManager # Observability -from fireflyframework_genai.observability.usage import default_usage_tracker +from fireflyframework_agentic.observability.usage import default_usage_tracker # Pipeline with batch processing -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import BatchLLMStep -from fireflyframework_genai.resilience.circuit_breaker import CircuitBreakerMiddleware +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import BatchLLMStep +from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreakerMiddleware async def demo_full_stack_agent(): @@ -75,8 +75,8 @@ async def demo_full_stack_agent(): # Create memory manager (supports in-memory, file, PostgreSQL, MongoDB) memory = MemoryManager( working_scope_id="production-app", - # To use PostgreSQL: Uncomment and set FIREFLY_GENAI_MEMORY_BACKEND=postgres - # To use MongoDB: Uncomment and set FIREFLY_GENAI_MEMORY_BACKEND=mongodb + # To use PostgreSQL: Uncomment and set FIREFLY_AGENTIC_MEMORY_BACKEND=postgres + # To use MongoDB: Uncomment and set FIREFLY_AGENTIC_MEMORY_BACKEND=mongodb ) # Create production-ready agent with all features @@ -222,7 +222,7 @@ async def aggregate(context, inputs): builder.add_edge("classify", "aggregate") # Run pipeline - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext pipeline = builder.build() @@ -247,15 +247,15 @@ async def demo_security_features(): # RBAC (if enabled) print("1. RBAC (Role-Based Access Control):") - print(" Configure with: FIREFLY_GENAI_RBAC_ENABLED=true") - print(" Set JWT secret: FIREFLY_GENAI_RBAC_JWT_SECRET=your-secret") + print(" Configure with: FIREFLY_AGENTIC_RBAC_ENABLED=true") + print(" Set JWT secret: FIREFLY_AGENTIC_RBAC_JWT_SECRET=your-secret") print(" Use @require_permission decorator on agent endpoints") print() # Encryption (if enabled) print("2. Data Encryption:") - print(" Configure with: FIREFLY_GENAI_ENCRYPTION_ENABLED=true") - print(" Set encryption key: FIREFLY_GENAI_ENCRYPTION_KEY=your-key-32-bytes") + print(" Configure with: FIREFLY_AGENTIC_ENCRYPTION_ENABLED=true") + print(" Set encryption key: FIREFLY_AGENTIC_ENCRYPTION_KEY=your-key-32-bytes") print(" Use EncryptedMemoryStore wrapper for sensitive data") print() @@ -269,7 +269,7 @@ async def demo_security_features(): # CORS Security print("4. CORS Security:") print(" Default: No origins allowed (secure)") - print(" Configure: FIREFLY_GENAI_CORS_ALLOWED_ORIGINS=['https://app.example.com']") + print(" Configure: FIREFLY_AGENTIC_CORS_ALLOWED_ORIGINS=['https://app.example.com']") print() @@ -307,46 +307,46 @@ async def demo_configuration_integration(): print() print("# Database Persistence") - print("export FIREFLY_GENAI_MEMORY_BACKEND=postgres # or mongodb, file, in_memory") - print("export FIREFLY_GENAI_MEMORY_POSTGRES_URL=postgresql://user:pass@localhost/db") - print("export FIREFLY_GENAI_MEMORY_MONGODB_URL=mongodb://localhost:27017/") + print("export FIREFLY_AGENTIC_MEMORY_BACKEND=postgres # or mongodb, file, in_memory") + print("export FIREFLY_AGENTIC_MEMORY_POSTGRES_URL=postgresql://user:pass@localhost/db") + print("export FIREFLY_AGENTIC_MEMORY_MONGODB_URL=mongodb://localhost:27017/") print() print("# Distributed Tracing") - print("export FIREFLY_GENAI_OBSERVABILITY_ENABLED=true") - print("export FIREFLY_GENAI_OTLP_ENDPOINT=http://localhost:4317") - print("export FIREFLY_GENAI_SERVICE_NAME=my-genai-app") + print("export FIREFLY_AGENTIC_OBSERVABILITY_ENABLED=true") + print("export FIREFLY_AGENTIC_OTLP_ENDPOINT=http://localhost:4317") + print("export FIREFLY_AGENTIC_SERVICE_NAME=my-genai-app") print() print("# Quota Management") - print("export FIREFLY_GENAI_QUOTA_ENABLED=true") - print("export FIREFLY_GENAI_QUOTA_BUDGET_DAILY_USD=100.0") - print("export FIREFLY_GENAI_QUOTA_RATE_LIMITS='{\"openai:gpt-4o\": 60}'") + print("export FIREFLY_AGENTIC_QUOTA_ENABLED=true") + print("export FIREFLY_AGENTIC_QUOTA_BUDGET_DAILY_USD=100.0") + print("export FIREFLY_AGENTIC_QUOTA_RATE_LIMITS='{\"openai:gpt-4o\": 60}'") print() print("# Security") - print("export FIREFLY_GENAI_RBAC_ENABLED=true") - print("export FIREFLY_GENAI_RBAC_JWT_SECRET=your-secret-key") - print("export FIREFLY_GENAI_ENCRYPTION_ENABLED=true") - print("export FIREFLY_GENAI_ENCRYPTION_KEY=your-32-byte-key") - print("export FIREFLY_GENAI_CORS_ALLOWED_ORIGINS=['https://app.example.com']") + print("export FIREFLY_AGENTIC_RBAC_ENABLED=true") + print("export FIREFLY_AGENTIC_RBAC_JWT_SECRET=your-secret-key") + print("export FIREFLY_AGENTIC_ENCRYPTION_ENABLED=true") + print("export FIREFLY_AGENTIC_ENCRYPTION_KEY=your-32-byte-key") + print("export FIREFLY_AGENTIC_CORS_ALLOWED_ORIGINS=['https://app.example.com']") print() print("# HTTP Connection Pooling") - print("export FIREFLY_GENAI_HTTP_POOL_ENABLED=true") - print("export FIREFLY_GENAI_HTTP_POOL_SIZE=100") + print("export FIREFLY_AGENTIC_HTTP_POOL_ENABLED=true") + print("export FIREFLY_AGENTIC_HTTP_POOL_SIZE=100") print() print("# Cost Optimization") - print("export FIREFLY_GENAI_BUDGET_LIMIT_USD=500.0") - print("export FIREFLY_GENAI_BUDGET_ALERT_THRESHOLD_USD=400.0") + print("export FIREFLY_AGENTIC_BUDGET_LIMIT_USD=500.0") + print("export FIREFLY_AGENTIC_BUDGET_ALERT_THRESHOLD_USD=400.0") print() async def main(): """Run all integration demonstrations.""" print("=" * 70) - print("FireflyFramework GenAI - Full Integration Demonstration") + print("FireflyFramework Agentic - Full Integration Demonstration") print("=" * 70) print() print("This example demonstrates all production-ready features working together:") diff --git a/examples/http_connection_pooling.py b/examples/http_connection_pooling.py index 1ba1fcc2..48dac5d0 100644 --- a/examples/http_connection_pooling.py +++ b/examples/http_connection_pooling.py @@ -21,7 +21,7 @@ for each request. Requirements: - pip install fireflyframework-genai[http] # Installs httpx + pip install fireflyframework-agentic[http] # Installs httpx Performance Benefits: - 30-50% faster for sequential requests @@ -36,7 +36,7 @@ import contextlib import time -from fireflyframework_genai.tools.builtins.http import HTTPX_AVAILABLE, HttpTool +from fireflyframework_agentic.tools.builtins.http import HTTPX_AVAILABLE, HttpTool async def demo_with_connection_pooling(): @@ -44,7 +44,7 @@ async def demo_with_connection_pooling(): print("\n=== HTTP Connection Pooling Demo ===\n") if not HTTPX_AVAILABLE: - print("⚠️ httpx not installed. Install with: pip install fireflyframework-genai[http]") + print("⚠️ httpx not installed. Install with: pip install fireflyframework-agentic[http]") print("Falling back to urllib (no connection pooling)\n") else: print("✓ httpx is available - connection pooling enabled\n") @@ -203,15 +203,15 @@ async def main(): print(" ✓ Lower resource usage and better scalability") print() print("To enable connection pooling:") - print(" 1. Install httpx: pip install fireflyframework-genai[http]") + print(" 1. Install httpx: pip install fireflyframework-agentic[http]") print(" 2. Set use_pool=True when creating HttpTool") print(" 3. Configure pool_size based on your workload") print() print("Configuration via environment variables:") - print(" FIREFLY_GENAI_HTTP_POOL_ENABLED=true") - print(" FIREFLY_GENAI_HTTP_POOL_SIZE=100") - print(" FIREFLY_GENAI_HTTP_POOL_MAX_KEEPALIVE=20") - print(" FIREFLY_GENAI_HTTP_POOL_TIMEOUT=30.0") + print(" FIREFLY_AGENTIC_HTTP_POOL_ENABLED=true") + print(" FIREFLY_AGENTIC_HTTP_POOL_SIZE=100") + print(" FIREFLY_AGENTIC_HTTP_POOL_MAX_KEEPALIVE=20") + print(" FIREFLY_AGENTIC_HTTP_POOL_TIMEOUT=30.0") print() diff --git a/examples/idp_pipeline.py b/examples/idp_pipeline.py index 62c05d18..29c931f9 100644 --- a/examples/idp_pipeline.py +++ b/examples/idp_pipeline.py @@ -64,26 +64,26 @@ split_prompt, ) -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.agents.builtin_middleware import ( +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.agents.builtin_middleware import ( CostGuardMiddleware, OutputGuardMiddleware, PromptGuardMiddleware, ) -from fireflyframework_genai.agents.templates import create_classifier_agent, create_extractor_agent -from fireflyframework_genai.content.chunking import TextChunker -from fireflyframework_genai.content.compression import ContextCompressor, TruncationStrategy -from fireflyframework_genai.explainability import AuditTrail, ReportBuilder, TraceRecorder -from fireflyframework_genai.logging import configure_logging -from fireflyframework_genai.memory import MemoryManager -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.engine import PipelineEngine -from fireflyframework_genai.pipeline.steps import CallableStep -from fireflyframework_genai.reasoning import ReflexionPattern -from fireflyframework_genai.tools.cached import CachedTool -from fireflyframework_genai.validation.qos import GroundingChecker -from fireflyframework_genai.validation.reviewer import OutputReviewer +from fireflyframework_agentic.agents.templates import create_classifier_agent, create_extractor_agent +from fireflyframework_agentic.content.chunking import TextChunker +from fireflyframework_agentic.content.compression import ContextCompressor, TruncationStrategy +from fireflyframework_agentic.explainability import AuditTrail, ReportBuilder, TraceRecorder +from fireflyframework_agentic.logging import configure_logging +from fireflyframework_agentic.memory import MemoryManager +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.steps import CallableStep +from fireflyframework_agentic.reasoning import ReflexionPattern +from fireflyframework_agentic.tools.cached import CachedTool +from fireflyframework_agentic.validation.qos import GroundingChecker +from fireflyframework_agentic.validation.reviewer import OutputReviewer # ── ANSI colour helpers ───────────────────────────────────────────────────── _USE_COLOR = hasattr(sys.stdout, "isatty") and sys.stdout.isatty() @@ -1132,7 +1132,7 @@ async def main() -> None: print(f"{BOLD}{CYAN}{'=' * 70}{RESET}") print(f"{BOLD} Intelligent Document Processing (IDP) Pipeline{RESET}") - print(f"{DIM} Firefly GenAI Framework — Complex Example{RESET}") + print(f"{DIM} Firefly Agentic Framework — Complex Example{RESET}") print(f"{BOLD}{CYAN}{'=' * 70}{RESET}") print(f"\n{DIM}PDF:{RESET} {PDF_URL}\n") diff --git a/examples/idp_tools.py b/examples/idp_tools.py index e5e17852..c9daced4 100644 --- a/examples/idp_tools.py +++ b/examples/idp_tools.py @@ -31,9 +31,9 @@ from pydantic import BaseModel, Field -from fireflyframework_genai.prompts.template import PromptTemplate, PromptVariable -from fireflyframework_genai.tools import ToolKit, firefly_tool -from fireflyframework_genai.validation.rules import ( +from fireflyframework_agentic.prompts.template import PromptTemplate, PromptVariable +from fireflyframework_agentic.tools import ToolKit, firefly_tool +from fireflyframework_agentic.validation.rules import ( CustomRule, EnumRule, OutputValidator, diff --git a/examples/incremental_streaming.py b/examples/incremental_streaming.py index 5d86d673..21200e97 100644 --- a/examples/incremental_streaming.py +++ b/examples/incremental_streaming.py @@ -36,7 +36,7 @@ import os import time -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent async def demo_buffered_streaming(): diff --git a/examples/mongodb_persistence.py b/examples/mongodb_persistence.py index 1dafa822..d457d808 100755 --- a/examples/mongodb_persistence.py +++ b/examples/mongodb_persistence.py @@ -25,7 +25,7 @@ Prerequisites: 1. Install MongoDB dependencies: - pip install fireflyframework-genai[mongodb] + pip install fireflyframework-agentic[mongodb] 2. Start MongoDB (using Docker): docker run -d \\ @@ -35,8 +35,8 @@ mongo:8 3. Set environment variables: - export FIREFLY_GENAI_MEMORY_BACKEND=mongodb - export FIREFLY_GENAI_MEMORY_MONGODB_URL=mongodb://localhost:27017/ + export FIREFLY_AGENTIC_MEMORY_BACKEND=mongodb + export FIREFLY_AGENTIC_MEMORY_MONGODB_URL=mongodb://localhost:27017/ export OPENAI_API_KEY=sk-... Usage: @@ -45,10 +45,10 @@ import asyncio -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.config import get_config -from fireflyframework_genai.memory.database_store import MongoDBStore -from fireflyframework_genai.memory.manager import MemoryManager +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.config import get_config +from fireflyframework_agentic.memory.database_store import MongoDBStore +from fireflyframework_agentic.memory.manager import MemoryManager async def main() -> None: diff --git a/examples/observability_usage.py b/examples/observability_usage.py index 75b7227b..3799ea7d 100644 --- a/examples/observability_usage.py +++ b/examples/observability_usage.py @@ -31,7 +31,7 @@ def main() -> None: - from fireflyframework_genai.observability.usage import UsageRecord, UsageTracker + from fireflyframework_agentic.observability.usage import UsageRecord, UsageTracker # ── 1. Basic usage recording ──────────────────────────────────────── print("=== Basic Usage Tracking ===\n") diff --git a/examples/pipeline_branching.py b/examples/pipeline_branching.py index b8bd3ac6..08ffb897 100644 --- a/examples/pipeline_branching.py +++ b/examples/pipeline_branching.py @@ -36,11 +36,11 @@ import asyncio from dataclasses import dataclass, field -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.dag import DAG, DAGEdge, DAGNode -from fireflyframework_genai.pipeline.engine import PipelineEngine -from fireflyframework_genai.pipeline.steps import BranchStep, CallableStep +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.dag import DAG, DAGEdge, DAGNode +from fireflyframework_agentic.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.steps import BranchStep, CallableStep # -- Event handler that prints live progress ---------------------------------- diff --git a/examples/prompt_caching.py b/examples/prompt_caching.py index c91a963e..6d4a17e9 100644 --- a/examples/prompt_caching.py +++ b/examples/prompt_caching.py @@ -40,8 +40,8 @@ import asyncio import os -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.agents.prompt_cache import CacheStatistics, PromptCacheMiddleware +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.agents.prompt_cache import CacheStatistics, PromptCacheMiddleware # Sample long system prompt that would benefit from caching LEGAL_ASSISTANT_PROMPT = ( @@ -103,7 +103,7 @@ async def demo_without_caching(): print(f"System prompt length: ~{len(LEGAL_ASSISTANT_PROMPT.split())} words") print(f"Processing {len(questions)} questions without caching...\n") - from fireflyframework_genai.observability.usage import default_usage_tracker + from fireflyframework_agentic.observability.usage import default_usage_tracker initial_cost = default_usage_tracker.get_summary().total_cost_usd @@ -148,7 +148,7 @@ async def demo_with_caching(): print(f"System prompt length: ~{len(LEGAL_ASSISTANT_PROMPT.split())} words") print(f"Processing {len(questions)} questions with caching...\n") - from fireflyframework_genai.observability.usage import default_usage_tracker + from fireflyframework_agentic.observability.usage import default_usage_tracker initial_cost = default_usage_tracker.get_summary().total_cost_usd @@ -311,7 +311,7 @@ async def main(): print("✓ Reduces latency by avoiding reprocessing") print("✓ Works best with >1024 token cacheable content") print("\nUsage:") - print(" from fireflyframework_genai.agents.prompt_cache import PromptCacheMiddleware") + print(" from fireflyframework_agentic.agents.prompt_cache import PromptCacheMiddleware") print() print(" agent = FireflyAgent(") print(" 'assistant',") diff --git a/examples/quota_management.py b/examples/quota_management.py index 620849be..f1cbc711 100755 --- a/examples/quota_management.py +++ b/examples/quota_management.py @@ -15,7 +15,7 @@ """API quota management and rate limiting example. -This example demonstrates how to use Firefly GenAI's quota management system +This example demonstrates how to use Firefly Agentic's quota management system to enforce production-grade budget and rate limits for LLM API calls. Features demonstrated: @@ -27,9 +27,9 @@ Prerequisites: Set environment variables: - export FIREFLY_GENAI_QUOTA_ENABLED=true - export FIREFLY_GENAI_QUOTA_BUDGET_DAILY_USD=5.0 - export FIREFLY_GENAI_QUOTA_RATE_LIMITS='{"openai:gpt-4o-mini": 10}' + export FIREFLY_AGENTIC_QUOTA_ENABLED=true + export FIREFLY_AGENTIC_QUOTA_BUDGET_DAILY_USD=5.0 + export FIREFLY_AGENTIC_QUOTA_RATE_LIMITS='{"openai:gpt-4o-mini": 10}' export OPENAI_API_KEY=sk-... Usage: @@ -38,11 +38,11 @@ import asyncio -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.config import get_config -from fireflyframework_genai.exceptions import BudgetExceededError, RateLimitError -from fireflyframework_genai.observability.quota import QuotaManager -from fireflyframework_genai.observability.usage import default_usage_tracker +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.config import get_config +from fireflyframework_agentic.exceptions import BudgetExceededError, RateLimitError +from fireflyframework_agentic.observability.quota import QuotaManager +from fireflyframework_agentic.observability.usage import default_usage_tracker async def demonstrate_budget_enforcement(): @@ -199,7 +199,7 @@ async def demonstrate_config_integration(): if cfg.quota_enabled: # Quota manager is automatically created from config - from fireflyframework_genai.observability.quota import default_quota_manager + from fireflyframework_agentic.observability.quota import default_quota_manager if default_quota_manager: print("\n✓ Default quota manager created from configuration") @@ -209,7 +209,7 @@ async def demonstrate_config_integration(): print("\n⚠ Quota enabled but no default manager created") else: print("\n⚠ Quota management is disabled") - print(" Set FIREFLY_GENAI_QUOTA_ENABLED=true to enable") + print(" Set FIREFLY_AGENTIC_QUOTA_ENABLED=true to enable") async def demonstrate_production_pattern(): diff --git a/examples/reasoning_cot.py b/examples/reasoning_cot.py index 9d307efd..21faff53 100644 --- a/examples/reasoning_cot.py +++ b/examples/reasoning_cot.py @@ -30,8 +30,8 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.reasoning import ChainOfThoughtPattern +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.reasoning import ChainOfThoughtPattern async def main() -> None: diff --git a/examples/reasoning_goal.py b/examples/reasoning_goal.py index f6a62399..b935be9c 100644 --- a/examples/reasoning_goal.py +++ b/examples/reasoning_goal.py @@ -30,8 +30,8 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.reasoning import GoalDecompositionPattern +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.reasoning import GoalDecompositionPattern async def main() -> None: diff --git a/examples/reasoning_memory.py b/examples/reasoning_memory.py index b6308d3d..95105758 100644 --- a/examples/reasoning_memory.py +++ b/examples/reasoning_memory.py @@ -31,9 +31,9 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.memory import MemoryManager -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.memory import MemoryManager +from fireflyframework_agentic.reasoning import ReActPattern async def main() -> None: diff --git a/examples/reasoning_pipeline.py b/examples/reasoning_pipeline.py index 27b6cbef..20ce9f28 100644 --- a/examples/reasoning_pipeline.py +++ b/examples/reasoning_pipeline.py @@ -30,8 +30,8 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.reasoning import ( +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.reasoning import ( ChainOfThoughtPattern, ReasoningPipeline, ReflexionPattern, diff --git a/examples/reasoning_plan.py b/examples/reasoning_plan.py index 3745ec15..a6c11da8 100644 --- a/examples/reasoning_plan.py +++ b/examples/reasoning_plan.py @@ -32,12 +32,12 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai import configure_logging -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.reasoning import PlanAndExecutePattern +from fireflyframework_agentic import configure_logging +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.reasoning import PlanAndExecutePattern # Enable INFO-level logging so that plan generation and step execution -# progress is printed in real time — only for fireflyframework_genai loggers. +# progress is printed in real time — only for fireflyframework_agentic loggers. configure_logging("INFO") diff --git a/examples/reasoning_react.py b/examples/reasoning_react.py index d038d672..98a05015 100644 --- a/examples/reasoning_react.py +++ b/examples/reasoning_react.py @@ -30,8 +30,8 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.reasoning import ReActPattern +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.reasoning import ReActPattern async def main() -> None: diff --git a/examples/reasoning_reflexion.py b/examples/reasoning_reflexion.py index eebffd8a..dd668f69 100644 --- a/examples/reasoning_reflexion.py +++ b/examples/reasoning_reflexion.py @@ -30,8 +30,8 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.reasoning import ReflexionPattern +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.reasoning import ReflexionPattern async def main() -> None: diff --git a/examples/reasoning_tot.py b/examples/reasoning_tot.py index 35fdb0b8..fe4a5ad4 100644 --- a/examples/reasoning_tot.py +++ b/examples/reasoning_tot.py @@ -30,8 +30,8 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.reasoning import TreeOfThoughtsPattern +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.reasoning import TreeOfThoughtsPattern async def main() -> None: diff --git a/examples/router.py b/examples/router.py index 7e6d593e..19161605 100644 --- a/examples/router.py +++ b/examples/router.py @@ -29,7 +29,7 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents.templates import create_router_agent +from fireflyframework_agentic.agents.templates import create_router_agent REQUESTS = [ "I was charged twice for my last order.", diff --git a/examples/security_guards.py b/examples/security_guards.py index b6488fa4..e15922b3 100644 --- a/examples/security_guards.py +++ b/examples/security_guards.py @@ -37,7 +37,7 @@ def main() -> None: # ── 1. PromptGuard: detect prompt injection ───────────────────────── print("=== PromptGuard: Input Scanning ===\n") - from fireflyframework_genai.security.prompt_guard import PromptGuard + from fireflyframework_agentic.security.prompt_guard import PromptGuard guard = PromptGuard() @@ -67,7 +67,7 @@ def main() -> None: # ── 3. OutputGuard: detect PII and secrets ────────────────────────── print("\n=== OutputGuard: Output Scanning ===\n") - from fireflyframework_genai.security.output_guard import OutputGuard, default_output_guard + from fireflyframework_agentic.security.output_guard import OutputGuard, default_output_guard test_outputs = [ "The meeting is at 3pm tomorrow.", diff --git a/examples/studio_launch.py b/examples/studio_launch.py index eaf2d5f9..efc8f7e3 100644 --- a/examples/studio_launch.py +++ b/examples/studio_launch.py @@ -21,7 +21,7 @@ 3. Programmatic: ``create_studio_app()`` + uvicorn Requirements: - pip install "fireflyframework-genai[studio]" + pip install "fireflyframework-agentic[studio]" """ from __future__ import annotations @@ -31,8 +31,8 @@ def main() -> None: """Launch Studio with custom configuration.""" import uvicorn - from fireflyframework_genai.studio.config import StudioConfig - from fireflyframework_genai.studio.server import create_studio_app + from fireflyframework_agentic.studio.config import StudioConfig + from fireflyframework_agentic.studio.server import create_studio_app config = StudioConfig( port=8470, diff --git a/examples/summarizer.py b/examples/summarizer.py index 56ca8ffe..6941152f 100644 --- a/examples/summarizer.py +++ b/examples/summarizer.py @@ -29,7 +29,7 @@ from _common import MODEL, ensure_api_key -from fireflyframework_genai.agents.templates import create_summarizer_agent +from fireflyframework_agentic.agents.templates import create_summarizer_agent ARTICLE = """\ Artificial intelligence has undergone a dramatic transformation over the past diff --git a/examples/tool_timeout.py b/examples/tool_timeout.py index e19519a5..085cd5da 100644 --- a/examples/tool_timeout.py +++ b/examples/tool_timeout.py @@ -30,8 +30,8 @@ import asyncio -from fireflyframework_genai.exceptions import ToolTimeoutError -from fireflyframework_genai.tools.base import BaseTool +from fireflyframework_agentic.exceptions import ToolTimeoutError +from fireflyframework_agentic.tools.base import BaseTool class FastTool(BaseTool): diff --git a/install.ps1 b/install.ps1 index 6917fe11..3333cf52 100644 --- a/install.ps1 +++ b/install.ps1 @@ -16,10 +16,10 @@ <# .SYNOPSIS - Interactive installer for fireflyframework-genai. + Interactive installer for fireflyframework-agentic. .DESCRIPTION - Installs fireflyframework-genai from source with interactive TUI, requirement + Installs fireflyframework-agentic from source with interactive TUI, requirement detection, and progress indicators. .PARAMETER NonInteractive @@ -31,7 +31,7 @@ .EXAMPLE .\install.ps1 .\install.ps1 -NonInteractive -Extras all - irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.ps1 | iex + irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/install.ps1 | iex #> [CmdletBinding()] @@ -46,8 +46,8 @@ $ErrorActionPreference = "Stop" # ── Constants ──────────────────────────────────────────────────────────────── $script:VERSION = "26.01.01" -$script:PACKAGE = "fireflyframework-genai" -$script:REPO_URL = "https://github.com/fireflyframework/fireflyframework-genai.git" +$script:PACKAGE = "fireflyframework-agentic" +$script:REPO_URL = "https://github.com/fireflyframework/fireflyframework-agentic.git" $script:MIN_PYTHON_MAJOR = 3 $script:MIN_PYTHON_MINOR = 13 $script:SPINNER_FRAMES = @("⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏") @@ -88,7 +88,7 @@ function Show-Banner { Write-Host " \______ /\___ >___| /\____|__ /__|" -ForegroundColor Cyan Write-Host " \/ \/ \/ \/" -ForegroundColor Cyan Write-Host "" - Write-Host " fireflyframework-genai" -ForegroundColor White -NoNewline + Write-Host " fireflyframework-agentic" -ForegroundColor White -NoNewline Write-Host " v$script:VERSION" -ForegroundColor DarkGray Write-Host " The production-grade GenAI metaframework built on Pydantic AI" -ForegroundColor DarkGray Write-Host " Copyright 2026 Firefly Software Solutions Inc. Apache License 2.0." -ForegroundColor DarkGray @@ -386,9 +386,9 @@ function Test-Installation { Write-Info "Verifying package import..." try { - $ver = & $script:PythonCmd -c "import fireflyframework_genai; print(fireflyframework_genai.__version__)" 2>&1 + $ver = & $script:PythonCmd -c "import fireflyframework_agentic; print(fireflyframework_agentic.__version__)" 2>&1 if ($LASTEXITCODE -eq 0) { - Write-Ok "fireflyframework-genai v$ver is ready" + Write-Ok "fireflyframework-agentic v$ver is ready" return $true } } catch { } @@ -402,7 +402,7 @@ function Show-Summary { Write-Host " ╔══════════════════════════════════════════════════════════════╗" -ForegroundColor Green Write-Host " ║" -ForegroundColor Green -NoNewline - Write-Host " fireflyframework-genai v$($script:VERSION)" -ForegroundColor White -NoNewline + Write-Host " fireflyframework-agentic v$($script:VERSION)" -ForegroundColor White -NoNewline Write-Host " installed successfully! " -NoNewline Write-Host "║" -ForegroundColor Green Write-Host " ╚══════════════════════════════════════════════════════════════╝" -ForegroundColor Green @@ -412,19 +412,19 @@ function Show-Summary { Write-Host "" Write-Host " # Configure your model provider" -ForegroundColor DarkGray Write-Host ' $env:OPENAI_API_KEY = "sk-..."' -ForegroundColor White - Write-Host ' $env:FIREFLY_GENAI_DEFAULT_MODEL = "openai:gpt-4o"' -ForegroundColor White + Write-Host ' $env:FIREFLY_AGENTIC_DEFAULT_MODEL = "openai:gpt-4o"' -ForegroundColor White Write-Host "" Write-Host " # Create your first agent" -ForegroundColor DarkGray - Write-Host " from fireflyframework_genai.agents import firefly_agent" -ForegroundColor White + Write-Host " from fireflyframework_agentic.agents import firefly_agent" -ForegroundColor White Write-Host "" Write-Host ' @firefly_agent(name="assistant", model="openai:gpt-4o")' -ForegroundColor White Write-Host " def instructions(ctx):" -ForegroundColor White Write-Host ' return "You are a helpful assistant."' -ForegroundColor White Write-Host "" Write-Info "Resources:" - Write-Host " Documentation: https://github.com/fireflyframework/fireflyframework-genai/tree/main/docs" -ForegroundColor DarkGray - Write-Host " Tutorial: https://github.com/fireflyframework/fireflyframework-genai/blob/main/docs/tutorial.md" -ForegroundColor DarkGray - Write-Host " Repository: https://github.com/fireflyframework/fireflyframework-genai" -ForegroundColor DarkGray + Write-Host " Documentation: https://github.com/fireflyframework/fireflyframework-agentic/tree/main/docs" -ForegroundColor DarkGray + Write-Host " Tutorial: https://github.com/fireflyframework/fireflyframework-agentic/blob/main/docs/tutorial.md" -ForegroundColor DarkGray + Write-Host " Repository: https://github.com/fireflyframework/fireflyframework-agentic" -ForegroundColor DarkGray Write-Host "" } diff --git a/install.sh b/install.sh index 916f8439..4c1fa240 100755 --- a/install.sh +++ b/install.sh @@ -16,13 +16,13 @@ set -euo pipefail # ══════════════════════════════════════════════════════════════════════════════ -# fireflyframework-genai — Interactive Installer +# fireflyframework-agentic — Interactive Installer # ══════════════════════════════════════════════════════════════════════════════ readonly VERSION="26.01.01" -readonly PACKAGE="fireflyframework-genai" -readonly PACKAGE_IMPORT="fireflyframework_genai" -readonly REPO_URL="https://github.com/fireflyframework/fireflyframework-genai.git" +readonly PACKAGE="fireflyframework-agentic" +readonly PACKAGE_IMPORT="fireflyframework_agentic" +readonly REPO_URL="https://github.com/fireflyframework/fireflyframework-agentic.git" readonly MIN_PYTHON_MAJOR=3 readonly MIN_PYTHON_MINOR=13 readonly TOTAL_STEPS=6 @@ -711,19 +711,19 @@ print_summary() { printf " %s# %d. Configure your model provider%s\n" "$DIM" "$step_num" "$RESET" printf " export OPENAI_API_KEY=sk-...\n" - printf " export FIREFLY_GENAI_DEFAULT_MODEL=openai:gpt-4o\n\n" + printf " export FIREFLY_AGENTIC_DEFAULT_MODEL=openai:gpt-4o\n\n" step_num=$((step_num + 1)) printf " %s# %d. Create your first agent%s\n" "$DIM" "$step_num" "$RESET" - printf " from fireflyframework_genai.agents import firefly_agent\n\n" + printf " from fireflyframework_agentic.agents import firefly_agent\n\n" printf " @firefly_agent(name=\"assistant\", model=\"openai:gpt-4o\")\n" printf " def instructions(ctx):\n" printf " return \"You are a helpful assistant.\"\n\n" printf " %s%sResources:%s\n\n" "$BOLD" "$WHITE" "$RESET" - printf " %sDocs :%s https://github.com/fireflyframework/fireflyframework-genai/tree/main/docs\n" "$DIM" "$RESET" - printf " %sTutorial :%s https://github.com/fireflyframework/fireflyframework-genai/blob/main/docs/tutorial.md\n" "$DIM" "$RESET" - printf " %sRepository:%s https://github.com/fireflyframework/fireflyframework-genai\n\n" "$DIM" "$RESET" + printf " %sDocs :%s https://github.com/fireflyframework/fireflyframework-agentic/tree/main/docs\n" "$DIM" "$RESET" + printf " %sTutorial :%s https://github.com/fireflyframework/fireflyframework-agentic/blob/main/docs/tutorial.md\n" "$DIM" "$RESET" + printf " %sRepository:%s https://github.com/fireflyframework/fireflyframework-agentic\n\n" "$DIM" "$RESET" } # ══════════════════════════════════════════════════════════════════════════════ diff --git a/pyproject.toml b/pyproject.toml index 54d57c79..cfc7e611 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "fireflyframework-genai" +name = "fireflyframework-agentic" version = "26.02.07" description = "A GenAI metaframework built on Pydantic AI for building production-grade GenAI applications with agents, reasoning patterns, prompt engineering, observability, and more." readme = "README.md" @@ -49,7 +49,7 @@ redis = [ "redis>=5.2.0", ] queues = [ - "fireflyframework-genai[kafka,rabbitmq,redis]", + "fireflyframework-agentic[kafka,rabbitmq,redis]", ] postgres = [ "asyncpg>=0.30.0", @@ -113,7 +113,7 @@ vectorstores-qdrant = [ "qdrant-client>=1.12.0", ] all = [ - "fireflyframework-genai[rest,queues,postgres,mongodb,security,http,studio,costs,embeddings,openai-embeddings,cohere-embeddings,google-embeddings,mistral-embeddings,voyage-embeddings,azure-embeddings,bedrock-embeddings,ollama-embeddings,vectorstores-chroma,vectorstores-pinecone,vectorstores-qdrant]", + "fireflyframework-agentic[rest,queues,postgres,mongodb,security,http,studio,costs,embeddings,openai-embeddings,cohere-embeddings,google-embeddings,mistral-embeddings,voyage-embeddings,azure-embeddings,bedrock-embeddings,ollama-embeddings,vectorstores-chroma,vectorstores-pinecone,vectorstores-qdrant]", ] dev = [ "pytest>=8.3.0", @@ -129,14 +129,14 @@ dev = [ ] [project.scripts] -firefly = "fireflyframework_genai.studio.cli:main" +firefly = "fireflyframework_agentic.studio.cli:main" [project.urls] Homepage = "https://fireflyframework.org/" -Documentation = "https://github.com/fireflyframework/fireflyframework-genai/tree/main/docs" -Repository = "https://github.com/fireflyframework/fireflyframework-genai" -Issues = "https://github.com/fireflyframework/fireflyframework-genai/issues" -Changelog = "https://github.com/fireflyframework/fireflyframework-genai/blob/main/CHANGELOG.md" +Documentation = "https://github.com/fireflyframework/fireflyframework-agentic/tree/main/docs" +Repository = "https://github.com/fireflyframework/fireflyframework-agentic" +Issues = "https://github.com/fireflyframework/fireflyframework-agentic/issues" +Changelog = "https://github.com/fireflyframework/fireflyframework-agentic/blob/main/CHANGELOG.md" [build-system] requires = ["uv_build>=0.9.5,<0.10.0"] @@ -151,7 +151,7 @@ select = ["E", "F", "W", "I", "N", "UP", "B", "SIM", "TC"] ignore = ["E501", "TC001", "TC002", "TC003", "UP040", "UP046", "B008"] [tool.ruff.lint.isort] -known-first-party = ["fireflyframework_genai"] +known-first-party = ["fireflyframework_agentic"] [tool.pyright] pythonVersion = "3.13" diff --git a/scripts/build_studio.py b/scripts/build_studio.py index d2158f63..330364b1 100644 --- a/scripts/build_studio.py +++ b/scripts/build_studio.py @@ -21,7 +21,7 @@ This script: 1. Runs ``npm run build`` in ``studio-frontend/`` -2. Copies the build output to ``src/fireflyframework_genai/studio/static/`` +2. Copies the build output to ``src/fireflyframework_agentic/studio/static/`` 3. The server then serves these files via FastAPI's StaticFiles mount. """ @@ -36,7 +36,7 @@ REPO_ROOT = Path(__file__).resolve().parent.parent FRONTEND_DIR = REPO_ROOT / "studio-frontend" BUILD_DIR = FRONTEND_DIR / "build" -STATIC_DIR = REPO_ROOT / "src" / "fireflyframework_genai" / "studio" / "static" +STATIC_DIR = REPO_ROOT / "src" / "fireflyframework_agentic" / "studio" / "static" def main() -> None: diff --git a/src/fireflyframework_genai/__init__.py b/src/fireflyframework_agentic/__init__.py similarity index 80% rename from src/fireflyframework_genai/__init__.py rename to src/fireflyframework_agentic/__init__.py index 2430c4f4..aa79d572 100644 --- a/src/fireflyframework_genai/__init__.py +++ b/src/fireflyframework_agentic/__init__.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Firefly GenAI Framework -- A metaframework built on Pydantic AI. +"""Firefly Agentic Framework -- A metaframework built on Pydantic AI. This package provides production-grade abstractions for building GenAI applications including agents, reasoning patterns, prompt engineering, @@ -21,16 +21,16 @@ Quick start:: - from fireflyframework_genai import FireflyGenAIConfig, get_config + from fireflyframework_agentic import FireflyAgenticConfig, get_config config = get_config() print(config.default_model) """ -from fireflyframework_genai._version import __version__ -from fireflyframework_genai.config import FireflyGenAIConfig, get_config, reset_config -from fireflyframework_genai.embeddings import BaseEmbedder, EmbedderRegistry, EmbeddingProtocol -from fireflyframework_genai.exceptions import ( +from fireflyframework_agentic._version import __version__ +from fireflyframework_agentic.config import FireflyAgenticConfig, get_config, reset_config +from fireflyframework_agentic.embeddings import BaseEmbedder, EmbedderRegistry, EmbeddingProtocol +from fireflyframework_agentic.exceptions import ( AgentError, AgentNotFoundError, BudgetExceededError, @@ -45,7 +45,7 @@ ExperimentError, ExplainabilityError, ExposureError, - FireflyGenAIError, + FireflyAgenticError, FireflyMemoryError, MemoryError, ObservabilityError, @@ -69,9 +69,9 @@ VectorStoreConnectionError, VectorStoreError, ) -from fireflyframework_genai.logging import configure_logging, enable_debug -from fireflyframework_genai.plugin import PluginDiscovery -from fireflyframework_genai.types import ( +from fireflyframework_agentic.logging import configure_logging, enable_debug +from fireflyframework_agentic.plugin import PluginDiscovery +from fireflyframework_agentic.types import ( JSON, AgentDepsT, AgentLike, @@ -89,14 +89,14 @@ UserPrompt, VideoUrl, ) -from fireflyframework_genai.vectorstores import BaseVectorStore, InMemoryVectorStore, VectorStoreProtocol +from fireflyframework_agentic.vectorstores import BaseVectorStore, InMemoryVectorStore, VectorStoreProtocol __all__ = [ "__version__", - "FireflyGenAIConfig", + "FireflyAgenticConfig", "get_config", "reset_config", - "FireflyGenAIError", + "FireflyAgenticError", "FireflyMemoryError", "ConfigurationError", "AgentError", diff --git a/src/fireflyframework_genai/_version.py b/src/fireflyframework_agentic/_version.py similarity index 91% rename from src/fireflyframework_genai/_version.py rename to src/fireflyframework_agentic/_version.py index ef8e6e98..94af8f56 100644 --- a/src/fireflyframework_genai/_version.py +++ b/src/fireflyframework_agentic/_version.py @@ -12,6 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Version information for fireflyframework-genai.""" +"""Version information for fireflyframework-agentic.""" __version__ = "26.02.06" diff --git a/src/fireflyframework_genai/agents/__init__.py b/src/fireflyframework_agentic/agents/__init__.py similarity index 73% rename from src/fireflyframework_genai/agents/__init__.py rename to src/fireflyframework_agentic/agents/__init__.py index ee169c7e..b86cbc0f 100644 --- a/src/fireflyframework_genai/agents/__init__.py +++ b/src/fireflyframework_agentic/agents/__init__.py @@ -14,8 +14,8 @@ """Agents subpackage -- creation, registration, lifecycle, and delegation.""" -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.agents.builtin_middleware import ( +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.agents.builtin_middleware import ( BudgetExceededError, CacheMiddleware, CostGuardMiddleware, @@ -29,10 +29,10 @@ RetryMiddleware, ValidationMiddleware, ) -from fireflyframework_genai.agents.cache import ResultCache -from fireflyframework_genai.agents.context import AgentContext -from fireflyframework_genai.agents.decorators import firefly_agent -from fireflyframework_genai.agents.delegation import ( +from fireflyframework_agentic.agents.cache import ResultCache +from fireflyframework_agentic.agents.context import AgentContext +from fireflyframework_agentic.agents.decorators import firefly_agent +from fireflyframework_agentic.agents.delegation import ( CapabilityStrategy, ContentBasedStrategy, CostAwareStrategy, @@ -40,16 +40,16 @@ DelegationStrategy, RoundRobinStrategy, ) -from fireflyframework_genai.agents.fallback import FallbackModelWrapper, run_with_fallback -from fireflyframework_genai.agents.lifecycle import AgentLifecycle, agent_lifecycle -from fireflyframework_genai.agents.middleware import ( +from fireflyframework_agentic.agents.fallback import FallbackModelWrapper, run_with_fallback +from fireflyframework_agentic.agents.lifecycle import AgentLifecycle, agent_lifecycle +from fireflyframework_agentic.agents.middleware import ( AgentMiddleware, MiddlewareChain, MiddlewareContext, ) -from fireflyframework_genai.agents.prompt_cache import CacheStatistics, PromptCacheMiddleware -from fireflyframework_genai.agents.registry import AgentInfo, AgentRegistry, agent_registry -from fireflyframework_genai.agents.templates import ( +from fireflyframework_agentic.agents.prompt_cache import CacheStatistics, PromptCacheMiddleware +from fireflyframework_agentic.agents.registry import AgentInfo, AgentRegistry, agent_registry +from fireflyframework_agentic.agents.templates import ( create_classifier_agent, create_conversational_agent, create_extractor_agent, diff --git a/src/fireflyframework_genai/agents/base.py b/src/fireflyframework_agentic/agents/base.py similarity index 92% rename from src/fireflyframework_genai/agents/base.py rename to src/fireflyframework_agentic/agents/base.py index 96f868e6..7b8aa435 100644 --- a/src/fireflyframework_genai/agents/base.py +++ b/src/fireflyframework_agentic/agents/base.py @@ -12,13 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""FireflyAgent -- the primary agent abstraction in the Firefly GenAI framework. +"""FireflyAgent -- the primary agent abstraction in the Firefly Agentic framework. :class:`FireflyAgent` wraps :class:`pydantic_ai.Agent` and enriches it with framework-level concerns: metadata (name, version, tags), automatic -registration in the :class:`~fireflyframework_genai.agents.registry.AgentRegistry`, +registration in the :class:`~fireflyframework_agentic.agents.registry.AgentRegistry`, lifecycle hooks, and sensible defaults drawn from -:class:`~fireflyframework_genai.config.FireflyGenAIConfig`. +:class:`~fireflyframework_agentic.config.FireflyAgenticConfig`. """ from __future__ import annotations @@ -34,13 +34,13 @@ from pydantic_ai.models import Model from pydantic_ai.settings import ModelSettings -from fireflyframework_genai.config import get_config -from fireflyframework_genai.types import AgentDepsT, Metadata, OutputT, UserContent +from fireflyframework_agentic.config import get_config +from fireflyframework_agentic.types import AgentDepsT, Metadata, OutputT, UserContent if TYPE_CHECKING: - from fireflyframework_genai.agents.context import AgentContext - from fireflyframework_genai.agents.middleware import AgentMiddleware, MiddlewareChain - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.agents.context import AgentContext + from fireflyframework_agentic.agents.middleware import AgentMiddleware, MiddlewareChain + from fireflyframework_agentic.memory.manager import MemoryManager logger = logging.getLogger(__name__) @@ -72,7 +72,7 @@ class FireflyAgent(Generic[AgentDepsT, OutputT]): * **Metadata** -- name, version, description, tags, and arbitrary metadata for discovery and documentation. * **Convention defaults** -- the default model and retry count are pulled - from :func:`~fireflyframework_genai.config.get_config` when not + from :func:`~fireflyframework_agentic.config.get_config` when not explicitly provided. * **Decorator proxies** -- :meth:`tool`, :meth:`tool_plain`, and :meth:`instructions` delegate to the underlying agent so that the @@ -83,7 +83,7 @@ class FireflyAgent(Generic[AgentDepsT, OutputT]): model: A Pydantic AI model string (e.g. ``"openai:gpt-4o"``) or a pre-configured :class:`pydantic_ai.models.Model` instance for programmatic credential management. Defaults to the value in - :class:`FireflyGenAIConfig`. + :class:`FireflyAgenticConfig`. instructions: Static instruction text or sequence of texts. output_type: The Pydantic model (or scalar type) for structured output. deps_type: The dependency type expected at run time. @@ -137,13 +137,13 @@ def __init__( resolved_retries = retries if retries is not None else cfg.max_retries # Keep the original model identifier for cost tracking. - from fireflyframework_genai.model_utils import get_model_identifier + from fireflyframework_agentic.model_utils import get_model_identifier self._model_identifier: str = get_model_identifier(resolved_model) self._memory = memory - from fireflyframework_genai.agents.middleware import MiddlewareChain + from fireflyframework_agentic.agents.middleware import MiddlewareChain self._middleware = MiddlewareChain(self._build_middleware(middleware, default_middleware=default_middleware)) @@ -163,7 +163,7 @@ def __init__( ) if auto_register: - from fireflyframework_genai.agents.registry import agent_registry + from fireflyframework_agentic.agents.registry import agent_registry agent_registry.register(self) logger.debug("Auto-registered agent '%s' v%s", name, version) @@ -229,7 +229,7 @@ async def run( """Run the agent asynchronously. *prompt* can be a plain string, a sequence of multimodal - :class:`~fireflyframework_genai.types.UserContent` parts (text, + :class:`~fireflyframework_agentic.types.UserContent` parts (text, images, documents, audio, video, binary data), or ``None``. When a :class:`MemoryManager` is attached and *conversation_id* @@ -238,8 +238,8 @@ async def run( Delegates to ``pydantic_ai.Agent.run``. """ - from fireflyframework_genai.agents.context import AgentContext as _AgentContext - from fireflyframework_genai.agents.middleware import MiddlewareContext + from fireflyframework_agentic.agents.context import AgentContext as _AgentContext + from fireflyframework_agentic.agents.middleware import MiddlewareContext if context is None: context = _AgentContext() @@ -283,8 +283,8 @@ def run_sync( **kwargs: Any, ) -> Any: """Run the agent synchronously. Delegates to ``pydantic_ai.Agent.run_sync``.""" - from fireflyframework_genai.agents.context import AgentContext as _AgentContext - from fireflyframework_genai.agents.middleware import MiddlewareContext + from fireflyframework_agentic.agents.context import AgentContext as _AgentContext + from fireflyframework_agentic.agents.middleware import MiddlewareContext if context is None: context = _AgentContext() @@ -339,8 +339,8 @@ async def run_stream( - "buffered" (default): Stream in chunks/messages (backward compatible) - "incremental": True token-by-token streaming with minimal latency """ - from fireflyframework_genai.agents.context import AgentContext as _AgentContext - from fireflyframework_genai.agents.middleware import MiddlewareContext + from fireflyframework_agentic.agents.context import AgentContext as _AgentContext + from fireflyframework_agentic.agents.middleware import MiddlewareContext if streaming_mode not in ("buffered", "incremental"): raise ValueError(f"Invalid streaming_mode: {streaming_mode!r}. Expected 'buffered' or 'incremental'.") @@ -431,8 +431,8 @@ def _record_usage( if usage is None: return - from fireflyframework_genai.observability.cost import get_cost_calculator - from fireflyframework_genai.observability.usage import UsageRecord, default_usage_tracker + from fireflyframework_agentic.observability.cost import get_cost_calculator + from fireflyframework_agentic.observability.usage import UsageRecord, default_usage_tracker input_tokens = getattr(usage, "input_tokens", 0) or 0 output_tokens = getattr(usage, "output_tokens", 0) or 0 @@ -493,9 +493,9 @@ async def run_with_reasoning( Returns: A :class:`ReasoningResult` produced by the pattern. """ - from fireflyframework_genai.agents.context import AgentContext as _AgentContext - from fireflyframework_genai.agents.middleware import MiddlewareContext - from fireflyframework_genai.reasoning.trace import ReasoningResult + from fireflyframework_agentic.agents.context import AgentContext as _AgentContext + from fireflyframework_agentic.agents.middleware import MiddlewareContext + from fireflyframework_agentic.reasoning.trace import ReasoningResult if context is None: context = _AgentContext() @@ -556,7 +556,7 @@ def _is_rate_limit_error(exc: Exception) -> bool: - Bedrock ``ThrottlingException`` / ``TooManyRequestsException`` - String patterns as a fallback """ - from fireflyframework_genai.exceptions import RateLimitError + from fireflyframework_agentic.exceptions import RateLimitError if isinstance(exc, RateLimitError): return True @@ -584,13 +584,13 @@ async def _run_with_rate_limit_retry( """Execute ``self._agent.run()`` with automatic 429 retry using AdaptiveBackoff. Reads retry parameters from :func:`get_config` and uses the - :class:`~fireflyframework_genai.observability.quota.AdaptiveBackoff` + :class:`~fireflyframework_agentic.observability.quota.AdaptiveBackoff` instance on the default :class:`QuotaManager` when quota is enabled, or creates a standalone backoff otherwise. """ import re - from fireflyframework_genai.observability.quota import ( + from fireflyframework_agentic.observability.quota import ( AdaptiveBackoff, default_quota_manager, ) @@ -659,7 +659,7 @@ def _build_middleware( :class:`ObservabilityMiddleware` to the chain unless the user already supplied one. """ - from fireflyframework_genai.agents.builtin_middleware import ( + from fireflyframework_agentic.agents.builtin_middleware import ( LoggingMiddleware, ObservabilityMiddleware, ) @@ -687,16 +687,16 @@ def _build_middleware( def _resolve_tools(tools: Sequence[Any]) -> list[Any]: """Convert framework tool types into Pydantic AI tool objects. - * :class:`~fireflyframework_genai.tools.base.BaseTool` instances are + * :class:`~fireflyframework_agentic.tools.base.BaseTool` instances are wrapped in :class:`pydantic_ai.Tool` so their ``execute`` method is called by the underlying agent. - * :class:`~fireflyframework_genai.tools.toolkit.ToolKit` instances are + * :class:`~fireflyframework_agentic.tools.toolkit.ToolKit` instances are expanded via :meth:`~ToolKit.as_pydantic_tools`. * Everything else (plain functions, ``pydantic_ai.Tool`` objects) is passed through unchanged. """ - from fireflyframework_genai.tools.base import BaseTool - from fireflyframework_genai.tools.toolkit import ToolKit + from fireflyframework_agentic.tools.base import BaseTool + from fireflyframework_agentic.tools.toolkit import ToolKit resolved: list[Any] = [] for item in tools: diff --git a/src/fireflyframework_genai/agents/builtin_middleware.py b/src/fireflyframework_agentic/agents/builtin_middleware.py similarity index 93% rename from src/fireflyframework_genai/agents/builtin_middleware.py rename to src/fireflyframework_agentic/agents/builtin_middleware.py index 51ddc14e..dcfa18f8 100644 --- a/src/fireflyframework_genai/agents/builtin_middleware.py +++ b/src/fireflyframework_agentic/agents/builtin_middleware.py @@ -24,7 +24,7 @@ Usage:: - from fireflyframework_genai.agents.builtin_middleware import ( + from fireflyframework_agentic.agents.builtin_middleware import ( LoggingMiddleware, PromptGuardMiddleware, CostGuardMiddleware, @@ -44,7 +44,7 @@ import time from typing import Any -from fireflyframework_genai.agents.middleware import MiddlewareContext +from fireflyframework_agentic.agents.middleware import MiddlewareContext logger = logging.getLogger(__name__) @@ -75,8 +75,8 @@ class LoggingMiddleware: ``after_run`` with elapsed time, token count, and estimated cost. The middleware uses the standard Python logger under the - ``fireflyframework_genai`` hierarchy so that - :func:`~fireflyframework_genai.logging.configure_logging` controls + ``fireflyframework_agentic`` hierarchy so that + :func:`~fireflyframework_agentic.logging.configure_logging` controls its output (including the ``colored`` and ``json`` format styles). Parameters: @@ -173,7 +173,7 @@ class PromptGuardMiddleware: replaced with ``[REDACTED]``) and execution continues. Parameters: - guard: A :class:`~fireflyframework_genai.security.prompt_guard.PromptGuard` + guard: A :class:`~fireflyframework_agentic.security.prompt_guard.PromptGuard` instance. Defaults to the module-level ``default_prompt_guard``. sanitise: When *True*, sanitise the prompt instead of rejecting. """ @@ -187,7 +187,7 @@ def __init__( if guard is not None: self._guard = guard else: - from fireflyframework_genai.security.prompt_guard import PromptGuard + from fireflyframework_agentic.security.prompt_guard import PromptGuard self._guard = PromptGuard(sanitise=sanitise) self._sanitise = sanitise @@ -255,7 +255,7 @@ def __init__( def _get_tracker(self) -> Any: if self._tracker is not None: return self._tracker - from fireflyframework_genai.observability.usage import default_usage_tracker + from fireflyframework_agentic.observability.usage import default_usage_tracker return default_usage_tracker @@ -309,7 +309,7 @@ async def before_run(self, context: MiddlewareContext) -> None: """Open an OTel span and emit the agent-started event.""" from opentelemetry import trace as _trace - tracer = _trace.get_tracer("fireflyframework_genai") + tracer = _trace.get_tracer("fireflyframework_agentic") span = tracer.start_span( f"agent.{context.agent_name}", attributes={ @@ -320,7 +320,7 @@ async def before_run(self, context: MiddlewareContext) -> None: context.metadata["_otel_span"] = span context.metadata["_obs_t0"] = time.monotonic() - from fireflyframework_genai.observability.events import default_events + from fireflyframework_agentic.observability.events import default_events default_events.agent_started(context.agent_name) @@ -341,7 +341,7 @@ async def after_run(self, context: MiddlewareContext, result: Any) -> Any: if usage is not None: tokens = getattr(usage, "total_tokens", 0) or 0 - from fireflyframework_genai.observability.metrics import default_metrics + from fireflyframework_agentic.observability.metrics import default_metrics default_metrics.record_latency( elapsed_ms, @@ -365,7 +365,7 @@ class ExplainabilityMiddleware: """Records decision traces for explainability and audit. Captures :class:`DecisionRecord` entries via the - :class:`~fireflyframework_genai.explainability.trace_recorder.TraceRecorder`. + :class:`~fireflyframework_agentic.explainability.trace_recorder.TraceRecorder`. Unlike :class:`ObservabilityMiddleware`, this middleware is **not** auto-wired. Enable it explicitly via the agent's ``middleware`` list. @@ -381,7 +381,7 @@ def __init__(self, *, recorder: Any | None = None) -> None: def _get_recorder(self) -> Any: if self._recorder is not None: return self._recorder - from fireflyframework_genai.explainability.trace_recorder import ( + from fireflyframework_agentic.explainability.trace_recorder import ( default_trace_recorder, ) @@ -420,7 +420,7 @@ class CacheMiddleware: agent run can be skipped. On ``after_run``, stores the result on miss. Parameters: - cache: A :class:`~fireflyframework_genai.agents.cache.ResultCache`. + cache: A :class:`~fireflyframework_agentic.agents.cache.ResultCache`. """ def __init__(self, *, cache: Any) -> None: @@ -453,7 +453,7 @@ class OutputGuardMiddleware: matched fragments with ``[REDACTED]``. Parameters: - guard: An :class:`~fireflyframework_genai.security.output_guard.OutputGuard` + guard: An :class:`~fireflyframework_agentic.security.output_guard.OutputGuard` instance. Defaults to the module-level ``default_output_guard``. sanitise: When *True*, sanitise the output instead of rejecting. block_categories: Only block on these categories (e.g. ``["secrets", "pii"]``). @@ -470,7 +470,7 @@ def __init__( if guard is not None: self._guard = guard else: - from fireflyframework_genai.security.output_guard import OutputGuard + from fireflyframework_agentic.security.output_guard import OutputGuard self._guard = OutputGuard(sanitise=sanitise) self._sanitise = sanitise @@ -522,7 +522,7 @@ class ValidationMiddleware: After the agent runs, the output is parsed and validated without re-running the agent. If validation fails, an - :class:`~fireflyframework_genai.exceptions.OutputReviewError` is raised. + :class:`~fireflyframework_agentic.exceptions.OutputReviewError` is raised. Parameters: reviewer: An :class:`OutputReviewer` whose parsing and validation @@ -541,7 +541,7 @@ async def after_run(self, context: MiddlewareContext, result: Any) -> Any: parsed, parse_errors = self._reviewer._parse_output(raw) if parse_errors: - from fireflyframework_genai.exceptions import OutputReviewError + from fireflyframework_agentic.exceptions import OutputReviewError raise OutputReviewError(f"Output validation failed: {parse_errors}") @@ -549,7 +549,7 @@ async def after_run(self, context: MiddlewareContext, result: Any) -> Any: report = self._reviewer._validate_output(validated) if report is not None and not report.valid: rule_errors = [r.message for r in report.errors if r.message] - from fireflyframework_genai.exceptions import OutputReviewError + from fireflyframework_agentic.exceptions import OutputReviewError raise OutputReviewError(f"Validation rules failed: {rule_errors}") diff --git a/src/fireflyframework_genai/agents/cache.py b/src/fireflyframework_agentic/agents/cache.py similarity index 98% rename from src/fireflyframework_genai/agents/cache.py rename to src/fireflyframework_agentic/agents/cache.py index 37a87d69..55901e28 100644 --- a/src/fireflyframework_genai/agents/cache.py +++ b/src/fireflyframework_agentic/agents/cache.py @@ -16,7 +16,7 @@ Usage:: - from fireflyframework_genai.agents.cache import ResultCache + from fireflyframework_agentic.agents.cache import ResultCache cache = ResultCache(ttl_seconds=300, max_size=100) cached = cache.get("openai:gpt-4o", "summarise this text") diff --git a/src/fireflyframework_genai/agents/context.py b/src/fireflyframework_agentic/agents/context.py similarity index 100% rename from src/fireflyframework_genai/agents/context.py rename to src/fireflyframework_agentic/agents/context.py diff --git a/src/fireflyframework_genai/agents/decorators.py b/src/fireflyframework_agentic/agents/decorators.py similarity index 94% rename from src/fireflyframework_genai/agents/decorators.py rename to src/fireflyframework_agentic/agents/decorators.py index af926e7f..90c45373 100644 --- a/src/fireflyframework_genai/agents/decorators.py +++ b/src/fireflyframework_agentic/agents/decorators.py @@ -32,12 +32,12 @@ def summariser_instructions(ctx): from pydantic_ai.models import Model -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.types import Metadata +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.types import Metadata if TYPE_CHECKING: - from fireflyframework_genai.agents.middleware import AgentMiddleware - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.agents.middleware import AgentMiddleware + from fireflyframework_agentic.memory.manager import MemoryManager def firefly_agent( diff --git a/src/fireflyframework_genai/agents/delegation.py b/src/fireflyframework_agentic/agents/delegation.py similarity index 97% rename from src/fireflyframework_genai/agents/delegation.py rename to src/fireflyframework_agentic/agents/delegation.py index 6c192329..d7070901 100644 --- a/src/fireflyframework_genai/agents/delegation.py +++ b/src/fireflyframework_agentic/agents/delegation.py @@ -27,12 +27,12 @@ from collections.abc import Sequence from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable -from fireflyframework_genai.exceptions import DelegationError -from fireflyframework_genai.types import UserContent +from fireflyframework_agentic.exceptions import DelegationError +from fireflyframework_agentic.types import UserContent if TYPE_CHECKING: - from fireflyframework_genai.agents.base import FireflyAgent - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.agents.base import FireflyAgent + from fireflyframework_agentic.memory.manager import MemoryManager logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/agents/fallback.py b/src/fireflyframework_agentic/agents/fallback.py similarity index 97% rename from src/fireflyframework_genai/agents/fallback.py rename to src/fireflyframework_agentic/agents/fallback.py index 3775a5ee..aea36d92 100644 --- a/src/fireflyframework_genai/agents/fallback.py +++ b/src/fireflyframework_agentic/agents/fallback.py @@ -20,7 +20,7 @@ Usage:: - from fireflyframework_genai.agents.fallback import FallbackModelWrapper + from fireflyframework_agentic.agents.fallback import FallbackModelWrapper wrapper = FallbackModelWrapper( models=["openai:gpt-4o", "openai:gpt-4o-mini", "openai:gpt-3.5-turbo"], @@ -125,7 +125,7 @@ async def run_with_fallback( Raises: The last exception encountered if all models fail. """ - from fireflyframework_genai.model_utils import get_model_identifier + from fireflyframework_agentic.model_utils import get_model_identifier fallback.reset() original_model = agent.agent.model diff --git a/src/fireflyframework_genai/agents/lifecycle.py b/src/fireflyframework_agentic/agents/lifecycle.py similarity index 100% rename from src/fireflyframework_genai/agents/lifecycle.py rename to src/fireflyframework_agentic/agents/lifecycle.py diff --git a/src/fireflyframework_genai/agents/middleware.py b/src/fireflyframework_agentic/agents/middleware.py similarity index 100% rename from src/fireflyframework_genai/agents/middleware.py rename to src/fireflyframework_agentic/agents/middleware.py diff --git a/src/fireflyframework_genai/agents/prompt_cache.py b/src/fireflyframework_agentic/agents/prompt_cache.py similarity index 98% rename from src/fireflyframework_genai/agents/prompt_cache.py rename to src/fireflyframework_agentic/agents/prompt_cache.py index 4ff5adf1..2e395c12 100644 --- a/src/fireflyframework_genai/agents/prompt_cache.py +++ b/src/fireflyframework_agentic/agents/prompt_cache.py @@ -28,7 +28,7 @@ Example:: - from fireflyframework_genai.agents.prompt_cache import PromptCacheMiddleware + from fireflyframework_agentic.agents.prompt_cache import PromptCacheMiddleware agent = FireflyAgent( "document-qa", @@ -147,7 +147,7 @@ async def before_run(self, context: Any) -> None: if not model: return - from fireflyframework_genai.model_utils import detect_model_family + from fireflyframework_agentic.model_utils import detect_model_family family = detect_model_family(model) if family == "anthropic": diff --git a/src/fireflyframework_genai/agents/registry.py b/src/fireflyframework_agentic/agents/registry.py similarity index 96% rename from src/fireflyframework_genai/agents/registry.py rename to src/fireflyframework_agentic/agents/registry.py index 32592ca2..2cfcdaba 100644 --- a/src/fireflyframework_genai/agents/registry.py +++ b/src/fireflyframework_agentic/agents/registry.py @@ -22,10 +22,10 @@ from pydantic import BaseModel -from fireflyframework_genai.exceptions import AgentNotFoundError +from fireflyframework_agentic.exceptions import AgentNotFoundError if TYPE_CHECKING: - from fireflyframework_genai.agents.base import FireflyAgent + from fireflyframework_agentic.agents.base import FireflyAgent logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/agents/templates/__init__.py b/src/fireflyframework_agentic/agents/templates/__init__.py similarity index 70% rename from src/fireflyframework_genai/agents/templates/__init__.py rename to src/fireflyframework_agentic/agents/templates/__init__.py index ef0c8f5a..9ace7ebd 100644 --- a/src/fireflyframework_genai/agents/templates/__init__.py +++ b/src/fireflyframework_agentic/agents/templates/__init__.py @@ -19,11 +19,11 @@ Users can customise model, instructions, and behaviour via keyword arguments. """ -from fireflyframework_genai.agents.templates.classifier import create_classifier_agent -from fireflyframework_genai.agents.templates.conversational import create_conversational_agent -from fireflyframework_genai.agents.templates.extractor import create_extractor_agent -from fireflyframework_genai.agents.templates.router import create_router_agent -from fireflyframework_genai.agents.templates.summarizer import create_summarizer_agent +from fireflyframework_agentic.agents.templates.classifier import create_classifier_agent +from fireflyframework_agentic.agents.templates.conversational import create_conversational_agent +from fireflyframework_agentic.agents.templates.extractor import create_extractor_agent +from fireflyframework_agentic.agents.templates.router import create_router_agent +from fireflyframework_agentic.agents.templates.summarizer import create_summarizer_agent __all__ = [ "create_classifier_agent", diff --git a/src/fireflyframework_genai/agents/templates/classifier.py b/src/fireflyframework_agentic/agents/templates/classifier.py similarity index 98% rename from src/fireflyframework_genai/agents/templates/classifier.py rename to src/fireflyframework_agentic/agents/templates/classifier.py index 0db28071..c86852f2 100644 --- a/src/fireflyframework_genai/agents/templates/classifier.py +++ b/src/fireflyframework_agentic/agents/templates/classifier.py @@ -26,7 +26,7 @@ from pydantic import BaseModel, Field from pydantic_ai.models import Model -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent class ClassificationResult(BaseModel): diff --git a/src/fireflyframework_genai/agents/templates/conversational.py b/src/fireflyframework_agentic/agents/templates/conversational.py similarity index 90% rename from src/fireflyframework_genai/agents/templates/conversational.py rename to src/fireflyframework_agentic/agents/templates/conversational.py index ec2256f1..32ad5d71 100644 --- a/src/fireflyframework_genai/agents/templates/conversational.py +++ b/src/fireflyframework_agentic/agents/templates/conversational.py @@ -25,17 +25,17 @@ from pydantic_ai.models import Model -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent if TYPE_CHECKING: - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.memory.manager import MemoryManager def _default_conversational_tools() -> list[Any]: """Lazily instantiate built-in tools useful for conversation.""" - from fireflyframework_genai.tools.builtins.calculator_tool import CalculatorTool - from fireflyframework_genai.tools.builtins.datetime_tool import DateTimeTool - from fireflyframework_genai.tools.builtins.text_tool import TextTool + from fireflyframework_agentic.tools.builtins.calculator_tool import CalculatorTool + from fireflyframework_agentic.tools.builtins.datetime_tool import DateTimeTool + from fireflyframework_agentic.tools.builtins.text_tool import TextTool return [DateTimeTool(), CalculatorTool(), TextTool()] diff --git a/src/fireflyframework_genai/agents/templates/extractor.py b/src/fireflyframework_agentic/agents/templates/extractor.py similarity index 93% rename from src/fireflyframework_genai/agents/templates/extractor.py rename to src/fireflyframework_agentic/agents/templates/extractor.py index c6c0d519..e9ab4bb9 100644 --- a/src/fireflyframework_genai/agents/templates/extractor.py +++ b/src/fireflyframework_agentic/agents/templates/extractor.py @@ -25,14 +25,14 @@ from pydantic_ai.models import Model -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.types import OutputT +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.types import OutputT def _default_extractor_tools() -> list[Any]: """Lazily instantiate built-in tools useful for extraction.""" - from fireflyframework_genai.tools.builtins.json_tool import JsonTool - from fireflyframework_genai.tools.builtins.text_tool import TextTool + from fireflyframework_agentic.tools.builtins.json_tool import JsonTool + from fireflyframework_agentic.tools.builtins.text_tool import TextTool return [JsonTool(), TextTool()] diff --git a/src/fireflyframework_genai/agents/templates/router.py b/src/fireflyframework_agentic/agents/templates/router.py similarity index 98% rename from src/fireflyframework_genai/agents/templates/router.py rename to src/fireflyframework_agentic/agents/templates/router.py index 3d804f4e..0a4ab280 100644 --- a/src/fireflyframework_genai/agents/templates/router.py +++ b/src/fireflyframework_agentic/agents/templates/router.py @@ -27,7 +27,7 @@ from pydantic import BaseModel, Field from pydantic_ai.models import Model -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent class RoutingDecision(BaseModel): diff --git a/src/fireflyframework_genai/agents/templates/summarizer.py b/src/fireflyframework_agentic/agents/templates/summarizer.py similarity index 96% rename from src/fireflyframework_genai/agents/templates/summarizer.py rename to src/fireflyframework_agentic/agents/templates/summarizer.py index 1978a3f0..416a66f3 100644 --- a/src/fireflyframework_genai/agents/templates/summarizer.py +++ b/src/fireflyframework_agentic/agents/templates/summarizer.py @@ -25,12 +25,12 @@ from pydantic_ai.models import Model -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent def _default_summarizer_tools() -> list[Any]: """Lazily instantiate built-in tools useful for summarization.""" - from fireflyframework_genai.tools.builtins.text_tool import TextTool + from fireflyframework_agentic.tools.builtins.text_tool import TextTool return [TextTool()] diff --git a/src/fireflyframework_genai/config.py b/src/fireflyframework_agentic/config.py similarity index 95% rename from src/fireflyframework_genai/config.py rename to src/fireflyframework_agentic/config.py index c25c9c6a..7c1c2101 100644 --- a/src/fireflyframework_genai/config.py +++ b/src/fireflyframework_agentic/config.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Central configuration for the Firefly GenAI framework. +"""Central configuration for the Firefly Agentic framework. All configuration values can be overridden via environment variables prefixed -with ``FIREFLY_GENAI_``. For example, setting ``FIREFLY_GENAI_DEFAULT_MODEL`` +with ``FIREFLY_AGENTIC_``. For example, setting ``FIREFLY_AGENTIC_DEFAULT_MODEL`` in the environment will override the ``default_model`` field. """ @@ -28,7 +28,7 @@ from pydantic_settings import BaseSettings, SettingsConfigDict -class FireflyGenAIConfig(BaseSettings): +class FireflyAgenticConfig(BaseSettings): """Framework-wide configuration loaded from environment variables. This configuration object centralises every tunable knob in the framework. @@ -38,7 +38,7 @@ class FireflyGenAIConfig(BaseSettings): """ model_config = SettingsConfigDict( - env_prefix="FIREFLY_GENAI_", + env_prefix="FIREFLY_AGENTIC_", env_file=".env", env_file_encoding="utf-8", extra="ignore", @@ -238,7 +238,7 @@ class FireflyGenAIConfig(BaseSettings): """Default namespace for vector store operations.""" @model_validator(mode="after") - def _validate_cross_fields(self) -> FireflyGenAIConfig: + def _validate_cross_fields(self) -> FireflyAgenticConfig: """Validate cross-field constraints.""" if ( self.budget_alert_threshold_usd is not None @@ -264,17 +264,17 @@ def _validate_cross_fields(self) -> FireflyGenAIConfig: # created exactly once, even under concurrent access from multiple threads. # --------------------------------------------------------------------------- -_config_instance: FireflyGenAIConfig | None = None +_config_instance: FireflyAgenticConfig | None = None _config_lock = threading.Lock() -def get_config() -> FireflyGenAIConfig: - """Return the singleton :class:`FireflyGenAIConfig` instance. Thread-safe.""" +def get_config() -> FireflyAgenticConfig: + """Return the singleton :class:`FireflyAgenticConfig` instance. Thread-safe.""" global _config_instance # noqa: PLW0603 if _config_instance is None: with _config_lock: if _config_instance is None: - _config_instance = FireflyGenAIConfig() + _config_instance = FireflyAgenticConfig() return _config_instance diff --git a/src/fireflyframework_genai/content/__init__.py b/src/fireflyframework_agentic/content/__init__.py similarity index 92% rename from src/fireflyframework_genai/content/__init__.py rename to src/fireflyframework_agentic/content/__init__.py index 7c59cc25..98b9ce91 100644 --- a/src/fireflyframework_genai/content/__init__.py +++ b/src/fireflyframework_agentic/content/__init__.py @@ -19,7 +19,7 @@ chunks through agents in batch. """ -from fireflyframework_genai.content.chunking import ( +from fireflyframework_agentic.content.chunking import ( BatchProcessor, Chunk, Chunker, @@ -27,7 +27,7 @@ ImageTiler, TextChunker, ) -from fireflyframework_genai.content.compression import ( +from fireflyframework_agentic.content.compression import ( CompressionStrategy, ContextCompressor, MapReduceStrategy, diff --git a/src/fireflyframework_genai/content/chunking.py b/src/fireflyframework_agentic/content/chunking.py similarity index 99% rename from src/fireflyframework_genai/content/chunking.py rename to src/fireflyframework_agentic/content/chunking.py index e5f36ff8..fa8f9eea 100644 --- a/src/fireflyframework_genai/content/chunking.py +++ b/src/fireflyframework_agentic/content/chunking.py @@ -29,7 +29,7 @@ from pydantic import BaseModel, Field -from fireflyframework_genai.types import AgentLike +from fireflyframework_agentic.types import AgentLike logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/content/compression.py b/src/fireflyframework_agentic/content/compression.py similarity index 98% rename from src/fireflyframework_genai/content/compression.py rename to src/fireflyframework_agentic/content/compression.py index 753527d2..8a062894 100644 --- a/src/fireflyframework_genai/content/compression.py +++ b/src/fireflyframework_agentic/content/compression.py @@ -24,8 +24,8 @@ from collections import deque from typing import Any, Protocol, runtime_checkable -from fireflyframework_genai.content.chunking import TextChunker -from fireflyframework_genai.types import AgentLike +from fireflyframework_agentic.content.chunking import TextChunker +from fireflyframework_agentic.types import AgentLike logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/__init__.py b/src/fireflyframework_agentic/embeddings/__init__.py similarity index 53% rename from src/fireflyframework_genai/embeddings/__init__.py rename to src/fireflyframework_agentic/embeddings/__init__.py index f9629cc8..0aeb1914 100644 --- a/src/fireflyframework_genai/embeddings/__init__.py +++ b/src/fireflyframework_agentic/embeddings/__init__.py @@ -1,13 +1,13 @@ """Embedding generation: protocol, base class, providers, and similarity utilities.""" -from fireflyframework_genai.embeddings.base import BaseEmbedder, EmbeddingProtocol -from fireflyframework_genai.embeddings.registry import EmbedderRegistry -from fireflyframework_genai.embeddings.similarity import ( +from fireflyframework_agentic.embeddings.base import BaseEmbedder, EmbeddingProtocol +from fireflyframework_agentic.embeddings.registry import EmbedderRegistry +from fireflyframework_agentic.embeddings.similarity import ( cosine_similarity, dot_product, euclidean_distance, ) -from fireflyframework_genai.embeddings.types import EmbeddingResult, EmbeddingUsage +from fireflyframework_agentic.embeddings.types import EmbeddingResult, EmbeddingUsage __all__ = [ "BaseEmbedder", diff --git a/src/fireflyframework_genai/embeddings/base.py b/src/fireflyframework_agentic/embeddings/base.py similarity index 94% rename from src/fireflyframework_genai/embeddings/base.py rename to src/fireflyframework_agentic/embeddings/base.py index e605a34b..6537c4c6 100644 --- a/src/fireflyframework_genai/embeddings/base.py +++ b/src/fireflyframework_agentic/embeddings/base.py @@ -15,9 +15,9 @@ from abc import ABC, abstractmethod from typing import Any, Protocol, runtime_checkable -from fireflyframework_genai.config import get_config -from fireflyframework_genai.embeddings.types import EmbeddingResult, EmbeddingUsage -from fireflyframework_genai.exceptions import EmbeddingError +from fireflyframework_agentic.config import get_config +from fireflyframework_agentic.embeddings.types import EmbeddingResult, EmbeddingUsage +from fireflyframework_agentic.exceptions import EmbeddingError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_agentic/embeddings/providers/__init__.py b/src/fireflyframework_agentic/embeddings/providers/__init__.py new file mode 100644 index 00000000..626b5551 --- /dev/null +++ b/src/fireflyframework_agentic/embeddings/providers/__init__.py @@ -0,0 +1,21 @@ +"""Embedding provider implementations.""" + +from fireflyframework_agentic.embeddings.providers.azure import AzureEmbedder +from fireflyframework_agentic.embeddings.providers.bedrock import BedrockEmbedder +from fireflyframework_agentic.embeddings.providers.cohere import CohereEmbedder +from fireflyframework_agentic.embeddings.providers.google import GoogleEmbedder +from fireflyframework_agentic.embeddings.providers.mistral import MistralEmbedder +from fireflyframework_agentic.embeddings.providers.ollama import OllamaEmbedder +from fireflyframework_agentic.embeddings.providers.openai import OpenAIEmbedder +from fireflyframework_agentic.embeddings.providers.voyage import VoyageEmbedder + +__all__ = [ + "AzureEmbedder", + "BedrockEmbedder", + "CohereEmbedder", + "GoogleEmbedder", + "MistralEmbedder", + "OllamaEmbedder", + "OpenAIEmbedder", + "VoyageEmbedder", +] diff --git a/src/fireflyframework_genai/embeddings/providers/azure.py b/src/fireflyframework_agentic/embeddings/providers/azure.py similarity index 93% rename from src/fireflyframework_genai/embeddings/providers/azure.py rename to src/fireflyframework_agentic/embeddings/providers/azure.py index 6a1bda26..0d70aa9b 100644 --- a/src/fireflyframework_genai/embeddings/providers/azure.py +++ b/src/fireflyframework_agentic/embeddings/providers/azure.py @@ -10,8 +10,8 @@ except ImportError: AsyncAzureOpenAI = None # type: ignore[assignment,misc] -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import EmbeddingProviderError +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import EmbeddingProviderError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/providers/bedrock.py b/src/fireflyframework_agentic/embeddings/providers/bedrock.py similarity index 93% rename from src/fireflyframework_genai/embeddings/providers/bedrock.py rename to src/fireflyframework_agentic/embeddings/providers/bedrock.py index 939c28c5..8b6ca13b 100644 --- a/src/fireflyframework_genai/embeddings/providers/bedrock.py +++ b/src/fireflyframework_agentic/embeddings/providers/bedrock.py @@ -12,8 +12,8 @@ except ImportError: boto3 = None # type: ignore[assignment] -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import EmbeddingProviderError +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import EmbeddingProviderError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/providers/cohere.py b/src/fireflyframework_agentic/embeddings/providers/cohere.py similarity index 93% rename from src/fireflyframework_genai/embeddings/providers/cohere.py rename to src/fireflyframework_agentic/embeddings/providers/cohere.py index 4958b710..f982cc16 100644 --- a/src/fireflyframework_genai/embeddings/providers/cohere.py +++ b/src/fireflyframework_agentic/embeddings/providers/cohere.py @@ -10,8 +10,8 @@ except ImportError: AsyncCohere = None # type: ignore[assignment,misc] -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import EmbeddingProviderError +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import EmbeddingProviderError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/providers/google.py b/src/fireflyframework_agentic/embeddings/providers/google.py similarity index 92% rename from src/fireflyframework_genai/embeddings/providers/google.py rename to src/fireflyframework_agentic/embeddings/providers/google.py index ee5b040b..b42881e5 100644 --- a/src/fireflyframework_genai/embeddings/providers/google.py +++ b/src/fireflyframework_agentic/embeddings/providers/google.py @@ -11,8 +11,8 @@ except ImportError: genai = None # type: ignore[assignment] -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import EmbeddingProviderError +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import EmbeddingProviderError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/providers/mistral.py b/src/fireflyframework_agentic/embeddings/providers/mistral.py similarity index 91% rename from src/fireflyframework_genai/embeddings/providers/mistral.py rename to src/fireflyframework_agentic/embeddings/providers/mistral.py index ba7f45e3..1651ef8b 100644 --- a/src/fireflyframework_genai/embeddings/providers/mistral.py +++ b/src/fireflyframework_agentic/embeddings/providers/mistral.py @@ -10,8 +10,8 @@ except ImportError: Mistral = None # type: ignore[assignment,misc] -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import EmbeddingProviderError +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import EmbeddingProviderError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/providers/ollama.py b/src/fireflyframework_agentic/embeddings/providers/ollama.py similarity index 92% rename from src/fireflyframework_genai/embeddings/providers/ollama.py rename to src/fireflyframework_agentic/embeddings/providers/ollama.py index c6d134c6..38523246 100644 --- a/src/fireflyframework_genai/embeddings/providers/ollama.py +++ b/src/fireflyframework_agentic/embeddings/providers/ollama.py @@ -10,8 +10,8 @@ except ImportError: httpx = None # type: ignore[assignment] -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import EmbeddingProviderError +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import EmbeddingProviderError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/providers/openai.py b/src/fireflyframework_agentic/embeddings/providers/openai.py similarity index 92% rename from src/fireflyframework_genai/embeddings/providers/openai.py rename to src/fireflyframework_agentic/embeddings/providers/openai.py index ae157020..b4df058d 100644 --- a/src/fireflyframework_genai/embeddings/providers/openai.py +++ b/src/fireflyframework_agentic/embeddings/providers/openai.py @@ -7,8 +7,8 @@ from openai import AsyncOpenAI -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import EmbeddingProviderError +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import EmbeddingProviderError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/providers/voyage.py b/src/fireflyframework_agentic/embeddings/providers/voyage.py similarity index 91% rename from src/fireflyframework_genai/embeddings/providers/voyage.py rename to src/fireflyframework_agentic/embeddings/providers/voyage.py index 3fa5e677..8bd6dc09 100644 --- a/src/fireflyframework_genai/embeddings/providers/voyage.py +++ b/src/fireflyframework_agentic/embeddings/providers/voyage.py @@ -10,8 +10,8 @@ except ImportError: voyageai = None # type: ignore[assignment] -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import EmbeddingProviderError +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import EmbeddingProviderError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/embeddings/registry.py b/src/fireflyframework_agentic/embeddings/registry.py similarity index 90% rename from src/fireflyframework_genai/embeddings/registry.py rename to src/fireflyframework_agentic/embeddings/registry.py index 1dabd462..f941cabe 100644 --- a/src/fireflyframework_genai/embeddings/registry.py +++ b/src/fireflyframework_agentic/embeddings/registry.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.embeddings.base import EmbeddingProtocol +from fireflyframework_agentic.embeddings.base import EmbeddingProtocol class EmbedderRegistry: diff --git a/src/fireflyframework_genai/embeddings/similarity.py b/src/fireflyframework_agentic/embeddings/similarity.py similarity index 100% rename from src/fireflyframework_genai/embeddings/similarity.py rename to src/fireflyframework_agentic/embeddings/similarity.py diff --git a/src/fireflyframework_genai/embeddings/types.py b/src/fireflyframework_agentic/embeddings/types.py similarity index 100% rename from src/fireflyframework_genai/embeddings/types.py rename to src/fireflyframework_agentic/embeddings/types.py diff --git a/src/fireflyframework_genai/exceptions.py b/src/fireflyframework_agentic/exceptions.py similarity index 83% rename from src/fireflyframework_genai/exceptions.py rename to src/fireflyframework_agentic/exceptions.py index a19f0cd9..c8dd253d 100644 --- a/src/fireflyframework_genai/exceptions.py +++ b/src/fireflyframework_agentic/exceptions.py @@ -12,31 +12,31 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Exception hierarchy for the Firefly GenAI framework. +"""Exception hierarchy for the Firefly Agentic framework. Every module raises exceptions from this hierarchy so that callers can catch -at the granularity they need -- from the broad :class:`FireflyGenAIError` +at the granularity they need -- from the broad :class:`FireflyAgenticError` base to specific leaf exceptions like :class:`ToolGuardError`. """ from __future__ import annotations -class FireflyGenAIError(Exception): - """Base exception for all errors raised by the Firefly GenAI framework.""" +class FireflyAgenticError(Exception): + """Base exception for all errors raised by the Firefly Agentic framework.""" # -- Configuration ----------------------------------------------------------- -class ConfigurationError(FireflyGenAIError): +class ConfigurationError(FireflyAgenticError): """Raised when the framework configuration is invalid or missing.""" # -- Agents ------------------------------------------------------------------ -class AgentError(FireflyGenAIError): +class AgentError(FireflyAgenticError): """Raised for errors during agent creation, registration, or execution.""" @@ -51,7 +51,7 @@ class DelegationError(AgentError): # -- Tools ------------------------------------------------------------------- -class ToolError(FireflyGenAIError): +class ToolError(FireflyAgenticError): """Raised for errors during tool execution.""" @@ -70,7 +70,7 @@ class ToolTimeoutError(ToolError): # -- Prompts ----------------------------------------------------------------- -class PromptError(FireflyGenAIError): +class PromptError(FireflyAgenticError): """Raised for errors in prompt template rendering, validation, or loading.""" @@ -85,7 +85,7 @@ class PromptValidationError(PromptError): # -- Reasoning --------------------------------------------------------------- -class ReasoningError(FireflyGenAIError): +class ReasoningError(FireflyAgenticError): """Raised for errors during reasoning pattern execution.""" @@ -100,28 +100,28 @@ class ReasoningPatternNotFoundError(ReasoningError): # -- Experiments ------------------------------------------------------------- -class ExperimentError(FireflyGenAIError): +class ExperimentError(FireflyAgenticError): """Raised for errors during experiment definition, execution, or tracking.""" # -- Observability ----------------------------------------------------------- -class ObservabilityError(FireflyGenAIError): +class ObservabilityError(FireflyAgenticError): """Raised for errors in tracing, metrics, or event emission.""" # -- Explainability ---------------------------------------------------------- -class ExplainabilityError(FireflyGenAIError): +class ExplainabilityError(FireflyAgenticError): """Raised for errors in trace recording, explanation generation, or audit.""" # -- Exposure ---------------------------------------------------------------- -class ExposureError(FireflyGenAIError): +class ExposureError(FireflyAgenticError): """Raised for errors in REST API or queue-based agent exposure.""" @@ -132,40 +132,40 @@ class QueueConnectionError(ExposureError): # -- Content processing ------------------------------------------------------ -class ChunkingError(FireflyGenAIError): +class ChunkingError(FireflyAgenticError): """Raised for errors during document chunking or splitting.""" -class CompressionError(FireflyGenAIError): +class CompressionError(FireflyAgenticError): """Raised for errors during context compression.""" # -- Validation -------------------------------------------------------------- -class OutputValidationError(FireflyGenAIError): +class OutputValidationError(FireflyAgenticError): """Raised when structured output validation fails.""" -class QoSError(FireflyGenAIError): +class QoSError(FireflyAgenticError): """Raised when output quality falls below QoS thresholds.""" -class OutputReviewError(FireflyGenAIError): +class OutputReviewError(FireflyAgenticError): """Raised when the output reviewer exhausts all retry attempts without producing valid output.""" # -- Pipeline ---------------------------------------------------------------- -class PipelineError(FireflyGenAIError): +class PipelineError(FireflyAgenticError): """Raised for errors during pipeline construction or execution.""" # -- Memory ------------------------------------------------------------------ -class FireflyMemoryError(FireflyGenAIError): +class FireflyMemoryError(FireflyAgenticError): """Raised for errors during memory storage, retrieval, or management.""" @@ -184,7 +184,7 @@ class DatabaseConnectionError(DatabaseStoreError): # -- Quota & Rate Limiting --------------------------------------------------- -class QuotaError(FireflyGenAIError): +class QuotaError(FireflyAgenticError): """Base exception for quota and rate limit errors.""" @@ -199,7 +199,7 @@ class RateLimitError(QuotaError): # -- Embeddings -------------------------------------------------------- -class EmbeddingError(FireflyGenAIError): +class EmbeddingError(FireflyAgenticError): """Raised for errors during embedding generation.""" @@ -210,7 +210,7 @@ class EmbeddingProviderError(EmbeddingError): # -- Vector Stores ----------------------------------------------------- -class VectorStoreError(FireflyGenAIError): +class VectorStoreError(FireflyAgenticError): """Raised for errors during vector store operations.""" diff --git a/src/fireflyframework_genai/experiments/__init__.py b/src/fireflyframework_agentic/experiments/__init__.py similarity index 67% rename from src/fireflyframework_genai/experiments/__init__.py rename to src/fireflyframework_agentic/experiments/__init__.py index 9d0b94b5..32bdaa31 100644 --- a/src/fireflyframework_genai/experiments/__init__.py +++ b/src/fireflyframework_agentic/experiments/__init__.py @@ -14,11 +14,11 @@ """Experiments subpackage -- A/B testing and variant comparison.""" -from fireflyframework_genai.experiments.comparator import ComparisonMetrics, VariantComparator -from fireflyframework_genai.experiments.experiment import Experiment -from fireflyframework_genai.experiments.runner import ExperimentRunner -from fireflyframework_genai.experiments.tracker import ExperimentTracker, VariantResult -from fireflyframework_genai.experiments.variant import Variant +from fireflyframework_agentic.experiments.comparator import ComparisonMetrics, VariantComparator +from fireflyframework_agentic.experiments.experiment import Experiment +from fireflyframework_agentic.experiments.runner import ExperimentRunner +from fireflyframework_agentic.experiments.tracker import ExperimentTracker, VariantResult +from fireflyframework_agentic.experiments.variant import Variant __all__ = [ "ComparisonMetrics", diff --git a/src/fireflyframework_genai/experiments/comparator.py b/src/fireflyframework_agentic/experiments/comparator.py similarity index 96% rename from src/fireflyframework_genai/experiments/comparator.py rename to src/fireflyframework_agentic/experiments/comparator.py index fb47435a..863d6834 100644 --- a/src/fireflyframework_genai/experiments/comparator.py +++ b/src/fireflyframework_agentic/experiments/comparator.py @@ -20,7 +20,7 @@ from pydantic import BaseModel -from fireflyframework_genai.experiments.tracker import VariantResult +from fireflyframework_agentic.experiments.tracker import VariantResult class ComparisonMetrics(BaseModel): diff --git a/src/fireflyframework_genai/experiments/experiment.py b/src/fireflyframework_agentic/experiments/experiment.py similarity index 96% rename from src/fireflyframework_genai/experiments/experiment.py rename to src/fireflyframework_agentic/experiments/experiment.py index a3631195..e5db5fb5 100644 --- a/src/fireflyframework_genai/experiments/experiment.py +++ b/src/fireflyframework_agentic/experiments/experiment.py @@ -21,7 +21,7 @@ from pydantic import BaseModel -from fireflyframework_genai.experiments.variant import Variant +from fireflyframework_agentic.experiments.variant import Variant class Experiment(BaseModel): diff --git a/src/fireflyframework_genai/experiments/runner.py b/src/fireflyframework_agentic/experiments/runner.py similarity index 93% rename from src/fireflyframework_genai/experiments/runner.py rename to src/fireflyframework_agentic/experiments/runner.py index bc31c624..d20c122e 100644 --- a/src/fireflyframework_genai/experiments/runner.py +++ b/src/fireflyframework_agentic/experiments/runner.py @@ -24,8 +24,8 @@ import time from typing import Any -from fireflyframework_genai.experiments.experiment import Experiment -from fireflyframework_genai.experiments.tracker import ExperimentTracker, VariantResult +from fireflyframework_agentic.experiments.experiment import Experiment +from fireflyframework_agentic.experiments.tracker import ExperimentTracker, VariantResult logger = logging.getLogger(__name__) @@ -60,7 +60,7 @@ async def run( Returns: A list of :class:`VariantResult` objects. """ - from fireflyframework_genai.agents.context import AgentContext + from fireflyframework_agentic.agents.context import AgentContext if context is None: context = AgentContext() diff --git a/src/fireflyframework_genai/experiments/tracker.py b/src/fireflyframework_agentic/experiments/tracker.py similarity index 100% rename from src/fireflyframework_genai/experiments/tracker.py rename to src/fireflyframework_agentic/experiments/tracker.py diff --git a/src/fireflyframework_genai/experiments/variant.py b/src/fireflyframework_agentic/experiments/variant.py similarity index 100% rename from src/fireflyframework_genai/experiments/variant.py rename to src/fireflyframework_agentic/experiments/variant.py diff --git a/src/fireflyframework_genai/explainability/__init__.py b/src/fireflyframework_agentic/explainability/__init__.py similarity index 77% rename from src/fireflyframework_genai/explainability/__init__.py rename to src/fireflyframework_agentic/explainability/__init__.py index 1878590d..0f421778 100644 --- a/src/fireflyframework_genai/explainability/__init__.py +++ b/src/fireflyframework_agentic/explainability/__init__.py @@ -14,14 +14,14 @@ """Explainability subpackage -- trace recording, explanations, audit, and reports.""" -from fireflyframework_genai.explainability.audit import AuditEntry, AuditTrail -from fireflyframework_genai.explainability.explanation import ExplanationGenerator -from fireflyframework_genai.explainability.report import ( +from fireflyframework_agentic.explainability.audit import AuditEntry, AuditTrail +from fireflyframework_agentic.explainability.explanation import ExplanationGenerator +from fireflyframework_agentic.explainability.report import ( ExplainabilityReport, ReportBuilder, ReportSection, ) -from fireflyframework_genai.explainability.trace_recorder import ( +from fireflyframework_agentic.explainability.trace_recorder import ( DecisionRecord, TraceRecorder, default_trace_recorder, diff --git a/src/fireflyframework_genai/explainability/audit.py b/src/fireflyframework_agentic/explainability/audit.py similarity index 100% rename from src/fireflyframework_genai/explainability/audit.py rename to src/fireflyframework_agentic/explainability/audit.py diff --git a/src/fireflyframework_genai/explainability/explanation.py b/src/fireflyframework_agentic/explainability/explanation.py similarity index 92% rename from src/fireflyframework_genai/explainability/explanation.py rename to src/fireflyframework_agentic/explainability/explanation.py index 77bf6593..7e97fa30 100644 --- a/src/fireflyframework_genai/explainability/explanation.py +++ b/src/fireflyframework_agentic/explainability/explanation.py @@ -15,7 +15,7 @@ """Generate human-readable explanations from decision traces. :class:`ExplanationGenerator` takes a list of -:class:`~fireflyframework_genai.explainability.trace_recorder.DecisionRecord` +:class:`~fireflyframework_agentic.explainability.trace_recorder.DecisionRecord` objects and produces a narrative description of the agent's decision-making process. """ @@ -24,7 +24,7 @@ from collections.abc import Sequence -from fireflyframework_genai.explainability.trace_recorder import DecisionRecord +from fireflyframework_agentic.explainability.trace_recorder import DecisionRecord class ExplanationGenerator: diff --git a/src/fireflyframework_genai/explainability/report.py b/src/fireflyframework_agentic/explainability/report.py similarity index 95% rename from src/fireflyframework_genai/explainability/report.py rename to src/fireflyframework_agentic/explainability/report.py index b887c361..9a2917a7 100644 --- a/src/fireflyframework_genai/explainability/report.py +++ b/src/fireflyframework_agentic/explainability/report.py @@ -26,8 +26,8 @@ from pydantic import BaseModel, Field -from fireflyframework_genai.explainability.explanation import ExplanationGenerator -from fireflyframework_genai.explainability.trace_recorder import DecisionRecord +from fireflyframework_agentic.explainability.explanation import ExplanationGenerator +from fireflyframework_agentic.explainability.trace_recorder import DecisionRecord class ReportSection(BaseModel): diff --git a/src/fireflyframework_genai/explainability/trace_recorder.py b/src/fireflyframework_agentic/explainability/trace_recorder.py similarity index 100% rename from src/fireflyframework_genai/explainability/trace_recorder.py rename to src/fireflyframework_agentic/explainability/trace_recorder.py diff --git a/src/fireflyframework_genai/exposure/__init__.py b/src/fireflyframework_agentic/exposure/__init__.py similarity index 82% rename from src/fireflyframework_genai/exposure/__init__.py rename to src/fireflyframework_agentic/exposure/__init__.py index b4bc01d1..b118ef01 100644 --- a/src/fireflyframework_genai/exposure/__init__.py +++ b/src/fireflyframework_agentic/exposure/__init__.py @@ -14,7 +14,7 @@ """Exposure package -- REST API and message queue agent exposure.""" -from fireflyframework_genai.exposure.queues import ( +from fireflyframework_agentic.exposure.queues import ( BaseQueueConsumer, QueueConsumer, QueueMessage, @@ -33,17 +33,17 @@ def __getattr__(name: str): """Lazy-load REST symbols so the package works without FastAPI installed.""" - _rest_names = {"create_genai_app", "AgentRequest", "AgentResponse", "HealthResponse"} + _rest_names = {"create_agentic_app", "AgentRequest", "AgentResponse", "HealthResponse"} if name in _rest_names: - from fireflyframework_genai.exposure.rest import ( + from fireflyframework_agentic.exposure.rest import ( AgentRequest, AgentResponse, HealthResponse, - create_genai_app, + create_agentic_app, ) _map = { - "create_genai_app": create_genai_app, + "create_agentic_app": create_agentic_app, "AgentRequest": AgentRequest, "AgentResponse": AgentResponse, "HealthResponse": HealthResponse, diff --git a/src/fireflyframework_genai/exposure/queues/__init__.py b/src/fireflyframework_agentic/exposure/queues/__init__.py similarity index 85% rename from src/fireflyframework_genai/exposure/queues/__init__.py rename to src/fireflyframework_agentic/exposure/queues/__init__.py index 5904d80b..eb94c130 100644 --- a/src/fireflyframework_genai/exposure/queues/__init__.py +++ b/src/fireflyframework_agentic/exposure/queues/__init__.py @@ -14,13 +14,13 @@ """Queues exposure subpackage -- Kafka, RabbitMQ, Redis consumers, producers, and routing.""" -from fireflyframework_genai.exposure.queues.base import ( +from fireflyframework_agentic.exposure.queues.base import ( BaseQueueConsumer, QueueConsumer, QueueMessage, QueueProducer, ) -from fireflyframework_genai.exposure.queues.router import QueueRouter +from fireflyframework_agentic.exposure.queues.router import QueueRouter __all__ = [ "BaseQueueConsumer", @@ -39,7 +39,7 @@ def __getattr__(name: str): _redis_names = {"RedisAgentConsumer", "RedisAgentProducer"} if name in _kafka_names: - from fireflyframework_genai.exposure.queues.kafka import ( + from fireflyframework_agentic.exposure.queues.kafka import ( KafkaAgentConsumer, KafkaAgentProducer, ) @@ -47,7 +47,7 @@ def __getattr__(name: str): return {"KafkaAgentConsumer": KafkaAgentConsumer, "KafkaAgentProducer": KafkaAgentProducer}[name] if name in _rabbitmq_names: - from fireflyframework_genai.exposure.queues.rabbitmq import ( + from fireflyframework_agentic.exposure.queues.rabbitmq import ( RabbitMQAgentConsumer, RabbitMQAgentProducer, ) @@ -55,7 +55,7 @@ def __getattr__(name: str): return {"RabbitMQAgentConsumer": RabbitMQAgentConsumer, "RabbitMQAgentProducer": RabbitMQAgentProducer}[name] if name in _redis_names: - from fireflyframework_genai.exposure.queues.redis import ( + from fireflyframework_agentic.exposure.queues.redis import ( RedisAgentConsumer, RedisAgentProducer, ) diff --git a/src/fireflyframework_genai/exposure/queues/base.py b/src/fireflyframework_agentic/exposure/queues/base.py similarity index 96% rename from src/fireflyframework_genai/exposure/queues/base.py rename to src/fireflyframework_agentic/exposure/queues/base.py index 09fb5e05..7c928b06 100644 --- a/src/fireflyframework_genai/exposure/queues/base.py +++ b/src/fireflyframework_agentic/exposure/queues/base.py @@ -77,7 +77,7 @@ async def stop(self) -> None: async def _process_message(self, message: QueueMessage) -> str: """Route the message to the configured agent and return the response.""" - from fireflyframework_genai.agents.registry import agent_registry + from fireflyframework_agentic.agents.registry import agent_registry agent = agent_registry.get(self._agent_name) result = await agent.run(message.body) diff --git a/src/fireflyframework_genai/exposure/queues/kafka.py b/src/fireflyframework_agentic/exposure/queues/kafka.py similarity index 90% rename from src/fireflyframework_genai/exposure/queues/kafka.py rename to src/fireflyframework_agentic/exposure/queues/kafka.py index 1b531839..b158bd55 100644 --- a/src/fireflyframework_genai/exposure/queues/kafka.py +++ b/src/fireflyframework_agentic/exposure/queues/kafka.py @@ -15,7 +15,7 @@ """Kafka consumer/producer for agent exposure. Requires the ``aiokafka`` optional dependency (install via -``pip install fireflyframework-genai[kafka]``). +``pip install fireflyframework-agentic[kafka]``). """ from __future__ import annotations @@ -23,7 +23,7 @@ import logging from typing import Any -from fireflyframework_genai.exposure.queues.base import BaseQueueConsumer, QueueMessage +from fireflyframework_agentic.exposure.queues.base import BaseQueueConsumer, QueueMessage logger = logging.getLogger(__name__) @@ -44,7 +44,7 @@ def __init__( *, topic: str, bootstrap_servers: str = "localhost:9092", - group_id: str = "firefly-genai", + group_id: str = "firefly-agentic", ) -> None: super().__init__(agent_name) self._topic = topic @@ -58,7 +58,7 @@ async def start(self) -> None: from aiokafka import AIOKafkaConsumer # type: ignore[import-not-found] except ImportError as _err: raise ImportError( - "aiokafka is required for Kafka support. Install it with: pip install fireflyframework-genai[kafka]" + "aiokafka is required for Kafka support. Install it with: pip install fireflyframework-agentic[kafka]" ) from _err self._consumer = AIOKafkaConsumer( @@ -73,7 +73,7 @@ async def start(self) -> None: try: async for msg in self._consumer: # Extract trace context from message headers for distributed tracing - from fireflyframework_genai.observability.tracer import extract_trace_context, trace_context_scope + from fireflyframework_agentic.observability.tracer import extract_trace_context, trace_context_scope headers = {k: v.decode("utf-8") if isinstance(v, bytes) else v for k, v in (msg.headers or [])} span_context = extract_trace_context(headers) @@ -101,7 +101,7 @@ async def stop(self) -> None: class KafkaAgentProducer: """Publish messages to a Kafka topic. - Satisfies the :class:`~fireflyframework_genai.exposure.queues.base.QueueProducer` + Satisfies the :class:`~fireflyframework_agentic.exposure.queues.base.QueueProducer` protocol. Parameters: @@ -125,7 +125,7 @@ async def start(self) -> None: from aiokafka import AIOKafkaProducer # type: ignore[import-not-found] except ImportError as _err: raise ImportError( - "aiokafka is required for Kafka support. Install it with: pip install fireflyframework-genai[kafka]" + "aiokafka is required for Kafka support. Install it with: pip install fireflyframework-agentic[kafka]" ) from _err self._producer = AIOKafkaProducer( diff --git a/src/fireflyframework_genai/exposure/queues/rabbitmq.py b/src/fireflyframework_agentic/exposure/queues/rabbitmq.py similarity index 91% rename from src/fireflyframework_genai/exposure/queues/rabbitmq.py rename to src/fireflyframework_agentic/exposure/queues/rabbitmq.py index 8aec65aa..734e26b9 100644 --- a/src/fireflyframework_genai/exposure/queues/rabbitmq.py +++ b/src/fireflyframework_agentic/exposure/queues/rabbitmq.py @@ -15,7 +15,7 @@ """RabbitMQ consumer for agent exposure. Requires the ``aio-pika`` optional dependency (install via -``pip install fireflyframework-genai[rabbitmq]``). +``pip install fireflyframework-agentic[rabbitmq]``). """ from __future__ import annotations @@ -23,7 +23,7 @@ import logging from typing import Any, cast -from fireflyframework_genai.exposure.queues.base import BaseQueueConsumer, QueueMessage +from fireflyframework_agentic.exposure.queues.base import BaseQueueConsumer, QueueMessage logger = logging.getLogger(__name__) @@ -56,7 +56,7 @@ async def start(self) -> None: except ImportError as _err: raise ImportError( "aio-pika is required for RabbitMQ support. " - "Install it with: pip install fireflyframework-genai[rabbitmq]" + "Install it with: pip install fireflyframework-agentic[rabbitmq]" ) from _err self._connection = await aio_pika.connect_robust(self._url) @@ -69,7 +69,7 @@ async def start(self) -> None: async for amqp_message in queue_iter: async with amqp_message.process(): # Extract trace context from message headers for distributed tracing - from fireflyframework_genai.observability.tracer import extract_trace_context, trace_context_scope + from fireflyframework_agentic.observability.tracer import extract_trace_context, trace_context_scope headers = {} if amqp_message.headers: @@ -97,7 +97,7 @@ async def stop(self) -> None: class RabbitMQAgentProducer: """Publish messages to a RabbitMQ exchange. - Satisfies the :class:`~fireflyframework_genai.exposure.queues.base.QueueProducer` + Satisfies the :class:`~fireflyframework_agentic.exposure.queues.base.QueueProducer` protocol. Parameters: @@ -125,7 +125,7 @@ async def start(self) -> None: except ImportError as _err: raise ImportError( "aio-pika is required for RabbitMQ support. " - "Install it with: pip install fireflyframework-genai[rabbitmq]" + "Install it with: pip install fireflyframework-agentic[rabbitmq]" ) from _err self._connection = await aio_pika.connect_robust(self._url) diff --git a/src/fireflyframework_genai/exposure/queues/redis.py b/src/fireflyframework_agentic/exposure/queues/redis.py similarity index 90% rename from src/fireflyframework_genai/exposure/queues/redis.py rename to src/fireflyframework_agentic/exposure/queues/redis.py index 9f33d135..c203a27a 100644 --- a/src/fireflyframework_genai/exposure/queues/redis.py +++ b/src/fireflyframework_agentic/exposure/queues/redis.py @@ -15,7 +15,7 @@ """Redis Pub/Sub consumer for agent exposure. Requires the ``redis`` optional dependency (install via -``pip install fireflyframework-genai[redis]``). +``pip install fireflyframework-agentic[redis]``). """ from __future__ import annotations @@ -23,7 +23,7 @@ import logging from typing import Any -from fireflyframework_genai.exposure.queues.base import BaseQueueConsumer, QueueMessage +from fireflyframework_agentic.exposure.queues.base import BaseQueueConsumer, QueueMessage logger = logging.getLogger(__name__) @@ -56,7 +56,7 @@ async def start(self) -> None: except ImportError as _err: raise ImportError( "redis[hiredis] is required for Redis support. " - "Install it with: pip install fireflyframework-genai[redis]" + "Install it with: pip install fireflyframework-agentic[redis]" ) from _err self._client = aioredis.from_url(self._url) @@ -76,7 +76,7 @@ async def start(self) -> None: # If not JSON, treat as plain text import json - from fireflyframework_genai.observability.tracer import extract_trace_context, trace_context_scope + from fireflyframework_agentic.observability.tracer import extract_trace_context, trace_context_scope span_context = None try: @@ -112,7 +112,7 @@ async def stop(self) -> None: class RedisAgentProducer: """Publish messages to a Redis Pub/Sub channel. - Satisfies the :class:`~fireflyframework_genai.exposure.queues.base.QueueProducer` + Satisfies the :class:`~fireflyframework_agentic.exposure.queues.base.QueueProducer` protocol. Parameters: @@ -137,7 +137,7 @@ async def start(self) -> None: except ImportError as _err: raise ImportError( "redis[hiredis] is required for Redis support. " - "Install it with: pip install fireflyframework-genai[redis]" + "Install it with: pip install fireflyframework-agentic[redis]" ) from _err self._client = aioredis.from_url(self._url) diff --git a/src/fireflyframework_genai/exposure/queues/router.py b/src/fireflyframework_agentic/exposure/queues/router.py similarity index 91% rename from src/fireflyframework_genai/exposure/queues/router.py rename to src/fireflyframework_agentic/exposure/queues/router.py index 8d003969..5f3d4740 100644 --- a/src/fireflyframework_genai/exposure/queues/router.py +++ b/src/fireflyframework_agentic/exposure/queues/router.py @@ -18,9 +18,9 @@ import re -from fireflyframework_genai.agents.registry import agent_registry -from fireflyframework_genai.exceptions import ExposureError -from fireflyframework_genai.exposure.queues.base import QueueMessage +from fireflyframework_agentic.agents.registry import agent_registry +from fireflyframework_agentic.exceptions import ExposureError +from fireflyframework_agentic.exposure.queues.base import QueueMessage class QueueRouter: diff --git a/src/fireflyframework_genai/exposure/rest/__init__.py b/src/fireflyframework_agentic/exposure/rest/__init__.py similarity index 78% rename from src/fireflyframework_genai/exposure/rest/__init__.py rename to src/fireflyframework_agentic/exposure/rest/__init__.py index fbc675ec..57023078 100644 --- a/src/fireflyframework_genai/exposure/rest/__init__.py +++ b/src/fireflyframework_agentic/exposure/rest/__init__.py @@ -14,12 +14,12 @@ """REST exposure subpackage -- FastAPI app factory, router, middleware, streaming.""" -from fireflyframework_genai.exposure.rest.app import create_genai_app -from fireflyframework_genai.exposure.rest.schemas import AgentRequest, AgentResponse, HealthResponse +from fireflyframework_agentic.exposure.rest.app import create_agentic_app +from fireflyframework_agentic.exposure.rest.schemas import AgentRequest, AgentResponse, HealthResponse __all__ = [ "AgentRequest", "AgentResponse", "HealthResponse", - "create_genai_app", + "create_agentic_app", ] diff --git a/src/fireflyframework_genai/exposure/rest/app.py b/src/fireflyframework_agentic/exposure/rest/app.py similarity index 78% rename from src/fireflyframework_genai/exposure/rest/app.py rename to src/fireflyframework_agentic/exposure/rest/app.py index 7dcc1587..e09cfdc0 100644 --- a/src/fireflyframework_genai/exposure/rest/app.py +++ b/src/fireflyframework_agentic/exposure/rest/app.py @@ -14,7 +14,7 @@ """FastAPI application factory for exposing Firefly agents over REST. -Call :func:`create_genai_app` to get a fully-configured FastAPI instance +Call :func:`create_agentic_app` to get a fully-configured FastAPI instance with agent, health, and streaming endpoints. """ @@ -31,13 +31,13 @@ @asynccontextmanager async def _lifespan(app: Any) -> AsyncIterator[None]: """FastAPI lifespan: plugin discovery, warmup, OTel, and shutdown.""" - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config cfg = get_config() # -- Startup ----------------------------------------------------------- if cfg.plugin_auto_discover: - from fireflyframework_genai.plugin import PluginDiscovery + from fireflyframework_agentic.plugin import PluginDiscovery result = PluginDiscovery.discover_all() logger.info( @@ -46,14 +46,14 @@ async def _lifespan(app: Any) -> AsyncIterator[None]: len(result.failed), ) - from fireflyframework_genai.agents.lifecycle import agent_lifecycle - from fireflyframework_genai.reasoning.prompts import register_reasoning_prompts + from fireflyframework_agentic.agents.lifecycle import agent_lifecycle + from fireflyframework_agentic.reasoning.prompts import register_reasoning_prompts register_reasoning_prompts() await agent_lifecycle.run_warmup() if cfg.observability_enabled: - from fireflyframework_genai.observability.exporters import configure_exporters + from fireflyframework_agentic.observability.exporters import configure_exporters configure_exporters( otlp_endpoint=cfg.otlp_endpoint, @@ -66,9 +66,9 @@ async def _lifespan(app: Any) -> AsyncIterator[None]: await agent_lifecycle.run_shutdown() -def create_genai_app( +def create_agentic_app( *, - title: str = "Firefly GenAI", + title: str = "Firefly Agentic", version: str = "0.1.0", cors: bool = True, request_id: bool = True, @@ -93,13 +93,13 @@ def create_genai_app( # without installing the [rest] extra. from fastapi import FastAPI # type: ignore[import-not-found] - from fireflyframework_genai.exposure.rest.health import create_health_router - from fireflyframework_genai.exposure.rest.middleware import ( + from fireflyframework_agentic.exposure.rest.health import create_health_router + from fireflyframework_agentic.exposure.rest.middleware import ( add_cors_middleware, add_rate_limit_middleware, add_request_id_middleware, ) - from fireflyframework_genai.exposure.rest.router import create_agent_router + from fireflyframework_agentic.exposure.rest.router import create_agent_router app = FastAPI(title=title, version=version, lifespan=_lifespan) @@ -113,11 +113,11 @@ def create_genai_app( add_rate_limit_middleware(app, **rl_kwargs) # Auto-wire auth middleware from config - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config cfg = get_config() if cfg.auth_api_keys or cfg.auth_bearer_tokens: - from fireflyframework_genai.exposure.rest.middleware import add_auth_middleware + from fireflyframework_agentic.exposure.rest.middleware import add_auth_middleware add_auth_middleware( app, @@ -130,7 +130,7 @@ def create_genai_app( app.include_router(create_agent_router()) # WebSocket - from fireflyframework_genai.exposure.rest.websocket import create_websocket_router + from fireflyframework_agentic.exposure.rest.websocket import create_websocket_router app.include_router(create_websocket_router()) diff --git a/src/fireflyframework_genai/exposure/rest/health.py b/src/fireflyframework_agentic/exposure/rest/health.py similarity index 91% rename from src/fireflyframework_genai/exposure/rest/health.py rename to src/fireflyframework_agentic/exposure/rest/health.py index edee3b65..f196b4eb 100644 --- a/src/fireflyframework_genai/exposure/rest/health.py +++ b/src/fireflyframework_agentic/exposure/rest/health.py @@ -21,8 +21,8 @@ if TYPE_CHECKING: from fastapi import APIRouter # type: ignore[import-not-found] -from fireflyframework_genai.agents.registry import agent_registry -from fireflyframework_genai.exposure.rest.schemas import HealthResponse +from fireflyframework_agentic.agents.registry import agent_registry +from fireflyframework_agentic.exposure.rest.schemas import HealthResponse def create_health_router() -> APIRouter: diff --git a/src/fireflyframework_genai/exposure/rest/middleware.py b/src/fireflyframework_agentic/exposure/rest/middleware.py similarity index 96% rename from src/fireflyframework_genai/exposure/rest/middleware.py rename to src/fireflyframework_agentic/exposure/rest/middleware.py index d295f0d9..e5c37646 100644 --- a/src/fireflyframework_genai/exposure/rest/middleware.py +++ b/src/fireflyframework_agentic/exposure/rest/middleware.py @@ -236,7 +236,7 @@ def add_trace_propagation_middleware(app: Any) -> None: Example:: from fastapi import FastAPI - from fireflyframework_genai.exposure.rest.middleware import add_trace_propagation_middleware + from fireflyframework_agentic.exposure.rest.middleware import add_trace_propagation_middleware app = FastAPI() add_trace_propagation_middleware(app) @@ -245,14 +245,14 @@ def add_trace_propagation_middleware(app: Any) -> None: See Also: - https://www.w3.org/TR/trace-context/ - - :func:`~fireflyframework_genai.observability.tracer.extract_trace_context` - - :func:`~fireflyframework_genai.observability.tracer.inject_trace_context` + - :func:`~fireflyframework_agentic.observability.tracer.extract_trace_context` + - :func:`~fireflyframework_agentic.observability.tracer.inject_trace_context` """ from starlette.middleware.base import BaseHTTPMiddleware from starlette.requests import Request from starlette.responses import Response - from fireflyframework_genai.observability.tracer import ( + from fireflyframework_agentic.observability.tracer import ( extract_trace_context, inject_trace_context, trace_context_scope, diff --git a/src/fireflyframework_genai/exposure/rest/router.py b/src/fireflyframework_agentic/exposure/rest/router.py similarity index 95% rename from src/fireflyframework_genai/exposure/rest/router.py rename to src/fireflyframework_agentic/exposure/rest/router.py index a5581318..e63e66ab 100644 --- a/src/fireflyframework_genai/exposure/rest/router.py +++ b/src/fireflyframework_agentic/exposure/rest/router.py @@ -26,10 +26,10 @@ if TYPE_CHECKING: from fastapi import APIRouter # type: ignore[import-not-found] -from fireflyframework_genai.agents.registry import agent_registry -from fireflyframework_genai.exposure.rest.schemas import AgentRequest, AgentResponse -from fireflyframework_genai.exposure.rest.streaming import sse_stream, sse_stream_incremental -from fireflyframework_genai.memory.manager import MemoryManager +from fireflyframework_agentic.agents.registry import agent_registry +from fireflyframework_agentic.exposure.rest.schemas import AgentRequest, AgentResponse +from fireflyframework_agentic.exposure.rest.streaming import sse_stream, sse_stream_incremental +from fireflyframework_agentic.memory.manager import MemoryManager logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/exposure/rest/schemas.py b/src/fireflyframework_agentic/exposure/rest/schemas.py similarity index 100% rename from src/fireflyframework_genai/exposure/rest/schemas.py rename to src/fireflyframework_agentic/exposure/rest/schemas.py diff --git a/src/fireflyframework_genai/exposure/rest/streaming.py b/src/fireflyframework_agentic/exposure/rest/streaming.py similarity index 97% rename from src/fireflyframework_genai/exposure/rest/streaming.py rename to src/fireflyframework_agentic/exposure/rest/streaming.py index 09cc7687..6d224211 100644 --- a/src/fireflyframework_genai/exposure/rest/streaming.py +++ b/src/fireflyframework_agentic/exposure/rest/streaming.py @@ -20,7 +20,7 @@ from collections.abc import AsyncIterator from typing import Any, cast -from fireflyframework_genai.types import AgentLike +from fireflyframework_agentic.types import AgentLike async def sse_stream(agent: AgentLike, prompt: Any, **kwargs: Any) -> AsyncIterator[str]: diff --git a/src/fireflyframework_genai/exposure/rest/websocket.py b/src/fireflyframework_agentic/exposure/rest/websocket.py similarity index 97% rename from src/fireflyframework_genai/exposure/rest/websocket.py rename to src/fireflyframework_agentic/exposure/rest/websocket.py index ae9a768b..ca277b6c 100644 --- a/src/fireflyframework_genai/exposure/rest/websocket.py +++ b/src/fireflyframework_agentic/exposure/rest/websocket.py @@ -53,8 +53,8 @@ def create_websocket_router() -> APIRouter: """Create a FastAPI router with the agent WebSocket endpoint.""" from fastapi import APIRouter, WebSocket, WebSocketDisconnect # type: ignore[import-not-found] - from fireflyframework_genai.agents.registry import agent_registry - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.agents.registry import agent_registry + from fireflyframework_agentic.memory.manager import MemoryManager router = APIRouter(tags=["websocket"]) _ws_memory = MemoryManager(working_scope_id="ws") diff --git a/src/fireflyframework_genai/lab/__init__.py b/src/fireflyframework_agentic/lab/__init__.py similarity index 69% rename from src/fireflyframework_genai/lab/__init__.py rename to src/fireflyframework_agentic/lab/__init__.py index b2dddb9c..29436cc3 100644 --- a/src/fireflyframework_genai/lab/__init__.py +++ b/src/fireflyframework_agentic/lab/__init__.py @@ -14,11 +14,11 @@ """Lab subpackage -- sessions, benchmarks, comparisons, datasets, and evaluation.""" -from fireflyframework_genai.lab.benchmark import Benchmark, BenchmarkResult -from fireflyframework_genai.lab.comparison import ComparisonEntry, ModelComparison -from fireflyframework_genai.lab.dataset import EvalCase, EvalDataset -from fireflyframework_genai.lab.evaluator import EvalOrchestrator, EvalReport, EvalResult -from fireflyframework_genai.lab.session import LabSession, SessionEntry +from fireflyframework_agentic.lab.benchmark import Benchmark, BenchmarkResult +from fireflyframework_agentic.lab.comparison import ComparisonEntry, ModelComparison +from fireflyframework_agentic.lab.dataset import EvalCase, EvalDataset +from fireflyframework_agentic.lab.evaluator import EvalOrchestrator, EvalReport, EvalResult +from fireflyframework_agentic.lab.session import LabSession, SessionEntry __all__ = [ "Benchmark", diff --git a/src/fireflyframework_genai/lab/benchmark.py b/src/fireflyframework_agentic/lab/benchmark.py similarity index 97% rename from src/fireflyframework_genai/lab/benchmark.py rename to src/fireflyframework_agentic/lab/benchmark.py index e9c77297..a16b9166 100644 --- a/src/fireflyframework_genai/lab/benchmark.py +++ b/src/fireflyframework_agentic/lab/benchmark.py @@ -21,7 +21,7 @@ from pydantic import BaseModel -from fireflyframework_genai.types import AgentLike +from fireflyframework_agentic.types import AgentLike class BenchmarkResult(BaseModel): diff --git a/src/fireflyframework_genai/lab/comparison.py b/src/fireflyframework_agentic/lab/comparison.py similarity index 100% rename from src/fireflyframework_genai/lab/comparison.py rename to src/fireflyframework_agentic/lab/comparison.py diff --git a/src/fireflyframework_genai/lab/dataset.py b/src/fireflyframework_agentic/lab/dataset.py similarity index 100% rename from src/fireflyframework_genai/lab/dataset.py rename to src/fireflyframework_agentic/lab/dataset.py diff --git a/src/fireflyframework_genai/lab/evaluator.py b/src/fireflyframework_agentic/lab/evaluator.py similarity index 95% rename from src/fireflyframework_genai/lab/evaluator.py rename to src/fireflyframework_agentic/lab/evaluator.py index 9e272c9f..8d79f292 100644 --- a/src/fireflyframework_genai/lab/evaluator.py +++ b/src/fireflyframework_agentic/lab/evaluator.py @@ -20,8 +20,8 @@ from pydantic import BaseModel -from fireflyframework_genai.lab.dataset import EvalDataset -from fireflyframework_genai.types import AgentLike +from fireflyframework_agentic.lab.dataset import EvalDataset +from fireflyframework_agentic.types import AgentLike # A scorer takes (expected, actual) and returns a float score Scorer = Callable[[str, str], float] diff --git a/src/fireflyframework_genai/lab/session.py b/src/fireflyframework_agentic/lab/session.py similarity index 97% rename from src/fireflyframework_genai/lab/session.py rename to src/fireflyframework_agentic/lab/session.py index 010d5545..58cadefa 100644 --- a/src/fireflyframework_genai/lab/session.py +++ b/src/fireflyframework_agentic/lab/session.py @@ -21,7 +21,7 @@ from pydantic import BaseModel, Field -from fireflyframework_genai.types import AgentLike +from fireflyframework_agentic.types import AgentLike class SessionEntry(BaseModel): diff --git a/src/fireflyframework_genai/logging.py b/src/fireflyframework_agentic/logging.py similarity index 94% rename from src/fireflyframework_genai/logging.py rename to src/fireflyframework_agentic/logging.py index 1cb8decc..73d3fc9d 100644 --- a/src/fireflyframework_genai/logging.py +++ b/src/fireflyframework_agentic/logging.py @@ -12,23 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Logging utilities for the Firefly GenAI framework. +"""Logging utilities for the Firefly Agentic framework. -All framework modules log under the ``fireflyframework_genai`` hierarchy. +All framework modules log under the ``fireflyframework_agentic`` hierarchy. Use :func:`configure_logging` or :func:`enable_debug` to turn on framework-level logging without touching the root logger or third-party libraries. Quick start:: - from fireflyframework_genai.logging import configure_logging + from fireflyframework_agentic.logging import configure_logging configure_logging("INFO") # agent + reasoning progress configure_logging("DEBUG") # includes LLM call timings Or even shorter:: - from fireflyframework_genai.logging import enable_debug + from fireflyframework_agentic.logging import enable_debug enable_debug() # equivalent to configure_logging("DEBUG") """ @@ -42,7 +42,7 @@ from datetime import UTC, datetime from typing import Any -_LOGGER_NAME = "fireflyframework_genai" +_LOGGER_NAME = "fireflyframework_agentic" _DEFAULT_FORMAT = "%(asctime)s %(levelname)-7s %(name)s %(message)s" _DEFAULT_DATEFMT = "%H:%M:%S" @@ -186,13 +186,13 @@ def configure_logging( stream: Any | None = None, format_style: str = "text", ) -> None: - """Configure logging for all ``fireflyframework_genai`` modules. + """Configure logging for all ``fireflyframework_agentic`` modules. This attaches a :class:`logging.StreamHandler` to the framework's root logger so that agent, reasoning, memory, and tool operations are visible at the requested *level*. - The handler is added **only** to the ``fireflyframework_genai`` logger, + The handler is added **only** to the ``fireflyframework_agentic`` logger, so third-party and application-level loggers are not affected. Calling this function multiple times replaces the previous handler. diff --git a/src/fireflyframework_genai/memory/__init__.py b/src/fireflyframework_agentic/memory/__init__.py similarity index 66% rename from src/fireflyframework_genai/memory/__init__.py rename to src/fireflyframework_agentic/memory/__init__.py index 9bbfdf24..9dbcc758 100644 --- a/src/fireflyframework_genai/memory/__init__.py +++ b/src/fireflyframework_agentic/memory/__init__.py @@ -14,12 +14,12 @@ """Memory subsystem: conversation history, working memory, and storage backends.""" -from fireflyframework_genai.memory.conversation import ConversationMemory -from fireflyframework_genai.memory.manager import MemoryManager -from fireflyframework_genai.memory.store import FileStore, InMemoryStore, MemoryStore -from fireflyframework_genai.memory.summarization import create_llm_summarizer -from fireflyframework_genai.memory.types import ConversationTurn, MemoryEntry, MemoryScope -from fireflyframework_genai.memory.working import WorkingMemory +from fireflyframework_agentic.memory.conversation import ConversationMemory +from fireflyframework_agentic.memory.manager import MemoryManager +from fireflyframework_agentic.memory.store import FileStore, InMemoryStore, MemoryStore +from fireflyframework_agentic.memory.summarization import create_llm_summarizer +from fireflyframework_agentic.memory.types import ConversationTurn, MemoryEntry, MemoryScope +from fireflyframework_agentic.memory.working import WorkingMemory __all__ = [ "ConversationMemory", diff --git a/src/fireflyframework_genai/memory/conversation.py b/src/fireflyframework_agentic/memory/conversation.py similarity index 98% rename from src/fireflyframework_genai/memory/conversation.py rename to src/fireflyframework_agentic/memory/conversation.py index e930dc34..9488c580 100644 --- a/src/fireflyframework_genai/memory/conversation.py +++ b/src/fireflyframework_agentic/memory/conversation.py @@ -30,8 +30,8 @@ from pydantic_ai.messages import ModelMessage -from fireflyframework_genai.content.compression import TokenEstimator -from fireflyframework_genai.memory.types import ConversationTurn +from fireflyframework_agentic.content.compression import TokenEstimator +from fireflyframework_agentic.memory.types import ConversationTurn logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/memory/database_store.py b/src/fireflyframework_agentic/memory/database_store.py similarity index 97% rename from src/fireflyframework_genai/memory/database_store.py rename to src/fireflyframework_agentic/memory/database_store.py index 727de654..0eaff2c1 100644 --- a/src/fireflyframework_genai/memory/database_store.py +++ b/src/fireflyframework_agentic/memory/database_store.py @@ -21,7 +21,7 @@ Examples: PostgreSQL backend:: - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore store = PostgreSQLStore( url="postgresql://user:pass@localhost/firefly", @@ -34,7 +34,7 @@ MongoDB backend:: - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore store = MongoDBStore( url="mongodb://localhost:27017/", @@ -53,8 +53,8 @@ from datetime import UTC, datetime from typing import Any -from fireflyframework_genai.exceptions import DatabaseConnectionError, DatabaseStoreError -from fireflyframework_genai.memory.types import MemoryEntry +from fireflyframework_agentic.exceptions import DatabaseConnectionError, DatabaseStoreError +from fireflyframework_agentic.memory.types import MemoryEntry _SAFE_IDENTIFIER = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$") @@ -96,7 +96,7 @@ class PostgreSQLStore: Note: Requires the optional ``postgres`` dependency group: - ``pip install fireflyframework-genai[postgres]`` + ``pip install fireflyframework-agentic[postgres]`` """ def __init__( @@ -135,7 +135,7 @@ async def initialize(self) -> None: except ImportError as exc: raise DatabaseStoreError( "PostgreSQL support requires 'asyncpg' and 'sqlalchemy'. " - "Install with: pip install fireflyframework-genai[postgres]" + "Install with: pip install fireflyframework-agentic[postgres]" ) from exc try: @@ -391,7 +391,7 @@ class MongoDBStore: Note: Requires the optional ``mongodb`` dependency group: - ``pip install fireflyframework-genai[mongodb]`` + ``pip install fireflyframework-agentic[mongodb]`` """ def __init__( @@ -428,7 +428,7 @@ async def initialize(self) -> None: except ImportError as exc: raise DatabaseStoreError( "MongoDB support requires 'motor' and 'pymongo'. " - "Install with: pip install fireflyframework-genai[mongodb]" + "Install with: pip install fireflyframework-agentic[mongodb]" ) from exc try: diff --git a/src/fireflyframework_genai/memory/manager.py b/src/fireflyframework_agentic/memory/manager.py similarity index 90% rename from src/fireflyframework_genai/memory/manager.py rename to src/fireflyframework_agentic/memory/manager.py index 1d1e26d2..a0e673ac 100644 --- a/src/fireflyframework_genai/memory/manager.py +++ b/src/fireflyframework_agentic/memory/manager.py @@ -27,9 +27,9 @@ from pydantic_ai.messages import ModelMessage -from fireflyframework_genai.memory.conversation import ConversationMemory -from fireflyframework_genai.memory.store import InMemoryStore, MemoryStore -from fireflyframework_genai.memory.working import WorkingMemory +from fireflyframework_agentic.memory.conversation import ConversationMemory +from fireflyframework_agentic.memory.store import InMemoryStore, MemoryStore +from fireflyframework_agentic.memory.working import WorkingMemory logger = logging.getLogger(__name__) @@ -73,7 +73,7 @@ def from_config(cls) -> MemoryManager: Reads ``memory_backend``, ``memory_max_conversation_tokens``, ``memory_summarize_threshold``, and backend-specific configuration - from :func:`~fireflyframework_genai.config.get_config`. + from :func:`~fireflyframework_agentic.config.get_config`. Supported backends: - ``in_memory``: Fast dict-backed storage (default, non-persistent) @@ -83,13 +83,13 @@ def from_config(cls) -> MemoryManager: Note: Database backends require their respective optional dependencies: - ``pip install fireflyframework-genai[postgres]`` or - ``pip install fireflyframework-genai[mongodb]`` + ``pip install fireflyframework-agentic[postgres]`` or + ``pip install fireflyframework-agentic[mongodb]`` """ import asyncio from concurrent.futures import ThreadPoolExecutor - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config def _run_sync(coro: Any) -> Any: """Run *coro* synchronously, safe even when an event loop is already running.""" @@ -109,17 +109,17 @@ def _run_sync(coro: Any) -> Any: store: MemoryStore if cfg.memory_backend == "file": - from fireflyframework_genai.memory.store import FileStore + from fireflyframework_agentic.memory.store import FileStore store = FileStore(base_dir=cfg.memory_file_dir) elif cfg.memory_backend == "postgres": - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore if cfg.memory_postgres_url is None: raise ValueError( "memory_postgres_url must be set when using postgres backend. " - "Set FIREFLY_GENAI_MEMORY_POSTGRES_URL environment variable." + "Set FIREFLY_AGENTIC_MEMORY_POSTGRES_URL environment variable." ) store = PostgreSQLStore( @@ -133,12 +133,12 @@ def _run_sync(coro: Any) -> Any: logger.info("PostgreSQL memory backend initialized") elif cfg.memory_backend == "mongodb": - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore if cfg.memory_mongodb_url is None: raise ValueError( "memory_mongodb_url must be set when using mongodb backend. " - "Set FIREFLY_GENAI_MEMORY_MONGODB_URL environment variable." + "Set FIREFLY_AGENTIC_MEMORY_MONGODB_URL environment variable." ) store = MongoDBStore( diff --git a/src/fireflyframework_genai/memory/store.py b/src/fireflyframework_agentic/memory/store.py similarity index 99% rename from src/fireflyframework_genai/memory/store.py rename to src/fireflyframework_agentic/memory/store.py index 3e7963e6..26519860 100644 --- a/src/fireflyframework_genai/memory/store.py +++ b/src/fireflyframework_agentic/memory/store.py @@ -29,7 +29,7 @@ from pathlib import Path from typing import Any, Protocol, runtime_checkable -from fireflyframework_genai.memory.types import MemoryEntry +from fireflyframework_agentic.memory.types import MemoryEntry logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/memory/summarization.py b/src/fireflyframework_agentic/memory/summarization.py similarity index 93% rename from src/fireflyframework_genai/memory/summarization.py rename to src/fireflyframework_agentic/memory/summarization.py index ff215ce8..4b70c28e 100644 --- a/src/fireflyframework_genai/memory/summarization.py +++ b/src/fireflyframework_agentic/memory/summarization.py @@ -15,13 +15,13 @@ """LLM-based conversation summarization. :func:`create_llm_summarizer` returns a callable suitable for -:class:`~fireflyframework_genai.memory.conversation.ConversationMemory`'s +:class:`~fireflyframework_agentic.memory.conversation.ConversationMemory`'s ``summarizer`` parameter. It compresses evicted turns into a concise summary using an LLM agent. Usage:: - from fireflyframework_genai.memory.summarization import create_llm_summarizer + from fireflyframework_agentic.memory.summarization import create_llm_summarizer summarizer = create_llm_summarizer(model="openai:gpt-4o-mini") memory = ConversationMemory(summarizer=summarizer) @@ -34,7 +34,7 @@ from collections.abc import Callable from typing import Any -from fireflyframework_genai.memory.types import ConversationTurn +from fireflyframework_agentic.memory.types import ConversationTurn logger = logging.getLogger(__name__) @@ -91,7 +91,7 @@ async def _async_summarize(turns: list[ConversationTurn]) -> str: resolved_model = model if resolved_model is None: - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config resolved_model = get_config().default_model diff --git a/src/fireflyframework_genai/memory/types.py b/src/fireflyframework_agentic/memory/types.py similarity index 100% rename from src/fireflyframework_genai/memory/types.py rename to src/fireflyframework_agentic/memory/types.py diff --git a/src/fireflyframework_genai/memory/working.py b/src/fireflyframework_agentic/memory/working.py similarity index 96% rename from src/fireflyframework_genai/memory/working.py rename to src/fireflyframework_agentic/memory/working.py index 2368df41..a2b87614 100644 --- a/src/fireflyframework_genai/memory/working.py +++ b/src/fireflyframework_agentic/memory/working.py @@ -24,8 +24,8 @@ import logging from typing import Any -from fireflyframework_genai.memory.store import InMemoryStore, MemoryStore -from fireflyframework_genai.memory.types import MemoryEntry, MemoryScope +from fireflyframework_agentic.memory.store import InMemoryStore, MemoryStore +from fireflyframework_agentic.memory.types import MemoryEntry, MemoryScope logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/model_utils.py b/src/fireflyframework_agentic/model_utils.py similarity index 100% rename from src/fireflyframework_genai/model_utils.py rename to src/fireflyframework_agentic/model_utils.py diff --git a/src/fireflyframework_genai/observability/__init__.py b/src/fireflyframework_agentic/observability/__init__.py similarity index 73% rename from src/fireflyframework_genai/observability/__init__.py rename to src/fireflyframework_agentic/observability/__init__.py index 1045f7aa..a6ab9f9c 100644 --- a/src/fireflyframework_genai/observability/__init__.py +++ b/src/fireflyframework_agentic/observability/__init__.py @@ -14,24 +14,24 @@ """Observability subpackage -- tracing, metrics, events, and exporters.""" -from fireflyframework_genai.observability.cost import ( +from fireflyframework_agentic.observability.cost import ( CostCalculator, GenAIPricesCostCalculator, StaticPriceCostCalculator, get_cost_calculator, ) -from fireflyframework_genai.observability.decorators import metered, traced -from fireflyframework_genai.observability.events import FireflyEvent, FireflyEvents, default_events -from fireflyframework_genai.observability.exporters import configure_exporters -from fireflyframework_genai.observability.metrics import FireflyMetrics, default_metrics -from fireflyframework_genai.observability.tracer import ( +from fireflyframework_agentic.observability.decorators import metered, traced +from fireflyframework_agentic.observability.events import FireflyEvent, FireflyEvents, default_events +from fireflyframework_agentic.observability.exporters import configure_exporters +from fireflyframework_agentic.observability.metrics import FireflyMetrics, default_metrics +from fireflyframework_agentic.observability.tracer import ( FireflyTracer, default_tracer, extract_trace_context, inject_trace_context, trace_context_scope, ) -from fireflyframework_genai.observability.usage import ( +from fireflyframework_agentic.observability.usage import ( UsageRecord, UsageSummary, UsageTracker, diff --git a/src/fireflyframework_genai/observability/cost.py b/src/fireflyframework_agentic/observability/cost.py similarity index 100% rename from src/fireflyframework_genai/observability/cost.py rename to src/fireflyframework_agentic/observability/cost.py diff --git a/src/fireflyframework_genai/observability/decorators.py b/src/fireflyframework_agentic/observability/decorators.py similarity index 96% rename from src/fireflyframework_genai/observability/decorators.py rename to src/fireflyframework_agentic/observability/decorators.py index 452220e3..baa95750 100644 --- a/src/fireflyframework_genai/observability/decorators.py +++ b/src/fireflyframework_agentic/observability/decorators.py @@ -25,8 +25,8 @@ from collections.abc import Callable from typing import Any, TypeVar -from fireflyframework_genai.observability.metrics import default_metrics -from fireflyframework_genai.observability.tracer import default_tracer +from fireflyframework_agentic.observability.metrics import default_metrics +from fireflyframework_agentic.observability.tracer import default_tracer F = TypeVar("F", bound=Callable[..., Any]) diff --git a/src/fireflyframework_genai/observability/events.py b/src/fireflyframework_agentic/observability/events.py similarity index 96% rename from src/fireflyframework_genai/observability/events.py rename to src/fireflyframework_agentic/observability/events.py index 2f23e3fa..fb8f351d 100644 --- a/src/fireflyframework_genai/observability/events.py +++ b/src/fireflyframework_agentic/observability/events.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Structured event logging for Firefly GenAI operations. +"""Structured event logging for Firefly Agentic operations. :class:`FireflyEvents` emits structured log records for agent runs, tool executions, reasoning steps, and lifecycle transitions. @@ -26,7 +26,7 @@ from pydantic import BaseModel, Field -logger = logging.getLogger("fireflyframework_genai.events") +logger = logging.getLogger("fireflyframework_agentic.events") class FireflyEvent(BaseModel): diff --git a/src/fireflyframework_genai/observability/exporters.py b/src/fireflyframework_agentic/observability/exporters.py similarity index 98% rename from src/fireflyframework_genai/observability/exporters.py rename to src/fireflyframework_agentic/observability/exporters.py index 23d86950..827f8f0f 100644 --- a/src/fireflyframework_genai/observability/exporters.py +++ b/src/fireflyframework_agentic/observability/exporters.py @@ -36,7 +36,7 @@ def configure_exporters( *, - service_name: str = "fireflyframework_genai", + service_name: str = "fireflyframework_agentic", otlp_endpoint: str | None = None, console: bool = False, ) -> TracerProvider: diff --git a/src/fireflyframework_genai/observability/metrics.py b/src/fireflyframework_agentic/observability/metrics.py similarity index 97% rename from src/fireflyframework_genai/observability/metrics.py rename to src/fireflyframework_agentic/observability/metrics.py index 780aad69..51503d73 100644 --- a/src/fireflyframework_genai/observability/metrics.py +++ b/src/fireflyframework_agentic/observability/metrics.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Metrics collection for Firefly GenAI agents. +"""Metrics collection for Firefly Agentic agents. :class:`FireflyMetrics` uses the OpenTelemetry metrics API to record token usage, latency, cost estimates, and error rates. @@ -22,7 +22,7 @@ from opentelemetry import metrics -_METER_NAME = "fireflyframework_genai" +_METER_NAME = "fireflyframework_agentic" class FireflyMetrics: diff --git a/src/fireflyframework_genai/observability/quota.py b/src/fireflyframework_agentic/observability/quota.py similarity index 98% rename from src/fireflyframework_genai/observability/quota.py rename to src/fireflyframework_agentic/observability/quota.py index 455a164e..4a29c4e9 100644 --- a/src/fireflyframework_genai/observability/quota.py +++ b/src/fireflyframework_agentic/observability/quota.py @@ -16,7 +16,7 @@ This module provides production-grade quota enforcement, rate limiting, and adaptive backoff for LLM API calls. It integrates with the existing -:class:`~fireflyframework_genai.observability.usage.UsageTracker` to enforce: +:class:`~fireflyframework_agentic.observability.usage.UsageTracker` to enforce: - **Daily budget limits** in USD - **Per-model rate limits** (requests per minute) @@ -26,7 +26,7 @@ Example: Basic quota management:: - from fireflyframework_genai.observability.quota import QuotaManager + from fireflyframework_agentic.observability.quota import QuotaManager quota = QuotaManager( daily_budget_usd=10.0, @@ -54,7 +54,7 @@ from collections import defaultdict from datetime import UTC, date, datetime -from fireflyframework_genai.exceptions import BudgetExceededError, RateLimitError +from fireflyframework_agentic.exceptions import BudgetExceededError, RateLimitError logger = logging.getLogger(__name__) @@ -516,7 +516,7 @@ def create_quota_manager_from_config() -> QuotaManager | None: Returns: QuotaManager instance if quota management is enabled, None otherwise. """ - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config cfg = get_config() diff --git a/src/fireflyframework_genai/observability/tracer.py b/src/fireflyframework_agentic/observability/tracer.py similarity index 98% rename from src/fireflyframework_genai/observability/tracer.py rename to src/fireflyframework_agentic/observability/tracer.py index 60fc82fa..6180203e 100644 --- a/src/fireflyframework_genai/observability/tracer.py +++ b/src/fireflyframework_agentic/observability/tracer.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""OpenTelemetry tracer integration for Firefly GenAI. +"""OpenTelemetry tracer integration for Firefly Agentic. :class:`FireflyTracer` wraps the OpenTelemetry tracer with convenience methods for creating agent- and tool-scoped spans. @@ -31,7 +31,7 @@ from opentelemetry import trace from opentelemetry.trace import Span, SpanContext, StatusCode, TraceFlags, Tracer -_TRACER_NAME = "fireflyframework_genai" +_TRACER_NAME = "fireflyframework_agentic" # Context variable for trace propagation across async boundaries _trace_context: ContextVar[SpanContext | None] = ContextVar("trace_context", default=None) diff --git a/src/fireflyframework_genai/observability/usage.py b/src/fireflyframework_agentic/observability/usage.py similarity index 95% rename from src/fireflyframework_genai/observability/usage.py rename to src/fireflyframework_agentic/observability/usage.py index 21ace612..9bc32dcf 100644 --- a/src/fireflyframework_genai/observability/usage.py +++ b/src/fireflyframework_agentic/observability/usage.py @@ -17,8 +17,8 @@ :class:`UsageTracker` is the central accumulator for token usage, cost, and latency across all agents, reasoning patterns, and pipeline nodes. Each call is captured as a :class:`UsageRecord` and automatically emitted -to :class:`~fireflyframework_genai.observability.metrics.FireflyMetrics` -and :class:`~fireflyframework_genai.observability.events.FireflyEvents`. +to :class:`~fireflyframework_agentic.observability.metrics.FireflyMetrics` +and :class:`~fireflyframework_agentic.observability.events.FireflyEvents`. """ from __future__ import annotations @@ -220,7 +220,7 @@ def reset(self) -> None: def _emit_metrics(usage: UsageRecord) -> None: """Send usage data to OTel metrics.""" try: - from fireflyframework_genai.observability.metrics import default_metrics + from fireflyframework_agentic.observability.metrics import default_metrics if usage.total_tokens > 0: default_metrics.record_tokens(usage.total_tokens, agent=usage.agent, model=usage.model) @@ -239,7 +239,7 @@ def _emit_metrics(usage: UsageRecord) -> None: def _emit_event(usage: UsageRecord) -> None: """Emit a structured event for the usage record.""" try: - from fireflyframework_genai.observability.events import default_events + from fireflyframework_agentic.observability.events import default_events default_events.agent_completed( usage.agent, @@ -256,7 +256,7 @@ def _emit_event(usage: UsageRecord) -> None: def _check_budget(self, usage: UsageRecord) -> None: """Log warnings when budget thresholds are exceeded.""" try: - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config cfg = get_config() if not cfg.cost_tracking_enabled: @@ -288,7 +288,7 @@ def _check_budget(self, usage: UsageRecord) -> None: def _create_default_tracker() -> UsageTracker: """Create the default tracker with config-driven max_records.""" try: - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config return UsageTracker(max_records=get_config().usage_tracker_max_records) except Exception: # noqa: BLE001 diff --git a/src/fireflyframework_genai/pipeline/__init__.py b/src/fireflyframework_agentic/pipeline/__init__.py similarity index 75% rename from src/fireflyframework_genai/pipeline/__init__.py rename to src/fireflyframework_agentic/pipeline/__init__.py index a514f01a..990efc38 100644 --- a/src/fireflyframework_genai/pipeline/__init__.py +++ b/src/fireflyframework_agentic/pipeline/__init__.py @@ -19,12 +19,12 @@ pipelines where independent stages execute concurrently. """ -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.dag import DAG, DAGEdge, DAGNode, FailureStrategy -from fireflyframework_genai.pipeline.engine import PipelineEngine, PipelineEventHandler -from fireflyframework_genai.pipeline.result import ExecutionTraceEntry, NodeResult, PipelineResult -from fireflyframework_genai.pipeline.steps import ( +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.dag import DAG, DAGEdge, DAGNode, FailureStrategy +from fireflyframework_agentic.pipeline.engine import PipelineEngine, PipelineEventHandler +from fireflyframework_agentic.pipeline.result import ExecutionTraceEntry, NodeResult, PipelineResult +from fireflyframework_agentic.pipeline.steps import ( AgentStep, BatchLLMStep, BranchStep, diff --git a/src/fireflyframework_genai/pipeline/builder.py b/src/fireflyframework_agentic/pipeline/builder.py similarity index 95% rename from src/fireflyframework_genai/pipeline/builder.py rename to src/fireflyframework_agentic/pipeline/builder.py index 47258751..3b07c3ad 100644 --- a/src/fireflyframework_genai/pipeline/builder.py +++ b/src/fireflyframework_agentic/pipeline/builder.py @@ -32,9 +32,9 @@ from collections.abc import Callable from typing import Any -from fireflyframework_genai.pipeline.dag import DAG, DAGEdge, DAGNode, FailureStrategy -from fireflyframework_genai.pipeline.engine import PipelineEngine -from fireflyframework_genai.pipeline.steps import AgentStep, CallableStep, StepExecutor +from fireflyframework_agentic.pipeline.dag import DAG, DAGEdge, DAGNode, FailureStrategy +from fireflyframework_agentic.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.steps import AgentStep, CallableStep, StepExecutor class PipelineBuilder: diff --git a/src/fireflyframework_genai/pipeline/context.py b/src/fireflyframework_agentic/pipeline/context.py similarity index 97% rename from src/fireflyframework_genai/pipeline/context.py rename to src/fireflyframework_agentic/pipeline/context.py index 1dad3b34..e894f10b 100644 --- a/src/fireflyframework_genai/pipeline/context.py +++ b/src/fireflyframework_agentic/pipeline/context.py @@ -20,7 +20,7 @@ from typing import TYPE_CHECKING, Any if TYPE_CHECKING: - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.memory.manager import MemoryManager class PipelineContext: diff --git a/src/fireflyframework_genai/pipeline/dag.py b/src/fireflyframework_agentic/pipeline/dag.py similarity index 99% rename from src/fireflyframework_genai/pipeline/dag.py rename to src/fireflyframework_agentic/pipeline/dag.py index 7e4a71f8..d8c69322 100644 --- a/src/fireflyframework_genai/pipeline/dag.py +++ b/src/fireflyframework_agentic/pipeline/dag.py @@ -28,7 +28,7 @@ from pydantic import BaseModel -from fireflyframework_genai.exceptions import PipelineError +from fireflyframework_agentic.exceptions import PipelineError class FailureStrategy(StrEnum): diff --git a/src/fireflyframework_genai/pipeline/engine.py b/src/fireflyframework_agentic/pipeline/engine.py similarity index 96% rename from src/fireflyframework_genai/pipeline/engine.py rename to src/fireflyframework_agentic/pipeline/engine.py index f378bc82..d0ffa507 100644 --- a/src/fireflyframework_genai/pipeline/engine.py +++ b/src/fireflyframework_agentic/pipeline/engine.py @@ -24,9 +24,9 @@ from datetime import UTC, datetime from typing import Any, Protocol, runtime_checkable -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.dag import DAG, FailureStrategy -from fireflyframework_genai.pipeline.result import ( +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.dag import DAG, FailureStrategy +from fireflyframework_agentic.pipeline.result import ( ExecutionTraceEntry, NodeResult, PipelineResult, @@ -342,13 +342,13 @@ async def _execute_node( def _start_otel_span(name: str, **attributes: Any) -> Any: """Start an OTel span if observability is enabled, else return *None*.""" try: - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config if not get_config().observability_enabled: return None from opentelemetry import trace - return trace.get_tracer("fireflyframework_genai").start_span( + return trace.get_tracer("fireflyframework_agentic").start_span( name, attributes={f"firefly.{k}": str(v) for k, v in attributes.items()}, ) @@ -359,12 +359,12 @@ def _start_otel_span(name: str, **attributes: Any) -> Any: def _aggregate_usage(correlation_id: str) -> Any: """Aggregate usage records for the given correlation ID.""" try: - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config if not get_config().cost_tracking_enabled: return None - from fireflyframework_genai.observability.usage import default_usage_tracker + from fireflyframework_agentic.observability.usage import default_usage_tracker summary = default_usage_tracker.get_summary_for_correlation(correlation_id) return summary if summary.record_count > 0 else None diff --git a/src/fireflyframework_genai/pipeline/result.py b/src/fireflyframework_agentic/pipeline/result.py similarity index 97% rename from src/fireflyframework_genai/pipeline/result.py rename to src/fireflyframework_agentic/pipeline/result.py index 334f531b..b5b9967c 100644 --- a/src/fireflyframework_genai/pipeline/result.py +++ b/src/fireflyframework_agentic/pipeline/result.py @@ -21,7 +21,7 @@ from pydantic import BaseModel, Field -from fireflyframework_genai.observability.usage import UsageSummary +from fireflyframework_agentic.observability.usage import UsageSummary class NodeResult(BaseModel): diff --git a/src/fireflyframework_genai/pipeline/steps.py b/src/fireflyframework_agentic/pipeline/steps.py similarity index 98% rename from src/fireflyframework_genai/pipeline/steps.py rename to src/fireflyframework_agentic/pipeline/steps.py index 4a04143d..1f9cf737 100644 --- a/src/fireflyframework_genai/pipeline/steps.py +++ b/src/fireflyframework_agentic/pipeline/steps.py @@ -23,10 +23,10 @@ from collections.abc import Callable, Coroutine from typing import Any, Protocol, runtime_checkable -from fireflyframework_genai.embeddings.base import EmbeddingProtocol -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.types import AgentLike -from fireflyframework_genai.vectorstores.base import VectorStoreProtocol +from fireflyframework_agentic.embeddings.base import EmbeddingProtocol +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.types import AgentLike +from fireflyframework_agentic.vectorstores.base import VectorStoreProtocol logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/plugin.py b/src/fireflyframework_agentic/plugin.py similarity index 90% rename from src/fireflyframework_genai/plugin.py rename to src/fireflyframework_agentic/plugin.py index 86933617..0011fc21 100644 --- a/src/fireflyframework_genai/plugin.py +++ b/src/fireflyframework_agentic/plugin.py @@ -12,18 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Plugin discovery system for the Firefly GenAI framework. +"""Plugin discovery system for the Firefly Agentic framework. Third-party packages can register agents, tools, and reasoning patterns by declaring entry points in their ``pyproject.toml``:: - [project.entry-points."fireflyframework_genai.agents"] + [project.entry-points."fireflyframework_agentic.agents"] my_agent = "my_package.agents:MyAgent" - [project.entry-points."fireflyframework_genai.tools"] + [project.entry-points."fireflyframework_agentic.tools"] my_tool = "my_package.tools:MyTool" - [project.entry-points."fireflyframework_genai.reasoning_patterns"] + [project.entry-points."fireflyframework_agentic.reasoning_patterns"] my_pattern = "my_package.reasoning:MyPattern" On startup, :meth:`PluginDiscovery.discover_all` scans these groups and loads @@ -41,9 +41,9 @@ logger = logging.getLogger(__name__) # Well-known entry-point group names -ENTRY_POINT_AGENTS = "fireflyframework_genai.agents" -ENTRY_POINT_TOOLS = "fireflyframework_genai.tools" -ENTRY_POINT_REASONING = "fireflyframework_genai.reasoning_patterns" +ENTRY_POINT_AGENTS = "fireflyframework_agentic.agents" +ENTRY_POINT_TOOLS = "fireflyframework_agentic.tools" +ENTRY_POINT_REASONING = "fireflyframework_agentic.reasoning_patterns" ALL_GROUPS = (ENTRY_POINT_AGENTS, ENTRY_POINT_TOOLS, ENTRY_POINT_REASONING) diff --git a/src/fireflyframework_genai/prompts/__init__.py b/src/fireflyframework_agentic/prompts/__init__.py similarity index 75% rename from src/fireflyframework_genai/prompts/__init__.py rename to src/fireflyframework_agentic/prompts/__init__.py index 37419f7e..efc4b82d 100644 --- a/src/fireflyframework_genai/prompts/__init__.py +++ b/src/fireflyframework_agentic/prompts/__init__.py @@ -14,19 +14,19 @@ """Prompts subpackage -- templates, registry, composition, validation, and loading.""" -from fireflyframework_genai.prompts.composer import ( +from fireflyframework_agentic.prompts.composer import ( ConditionalComposer, MergeComposer, SequentialComposer, ) -from fireflyframework_genai.prompts.loader import PromptLoader -from fireflyframework_genai.prompts.registry import PromptRegistry, prompt_registry -from fireflyframework_genai.prompts.template import ( +from fireflyframework_agentic.prompts.loader import PromptLoader +from fireflyframework_agentic.prompts.registry import PromptRegistry, prompt_registry +from fireflyframework_agentic.prompts.template import ( PromptInfo, PromptTemplate, PromptVariable, ) -from fireflyframework_genai.prompts.validator import PromptValidator, ValidationResult +from fireflyframework_agentic.prompts.validator import PromptValidator, ValidationResult __all__ = [ "ConditionalComposer", diff --git a/src/fireflyframework_genai/prompts/composer.py b/src/fireflyframework_agentic/prompts/composer.py similarity index 97% rename from src/fireflyframework_genai/prompts/composer.py rename to src/fireflyframework_agentic/prompts/composer.py index 0bb298c2..3d4c7dba 100644 --- a/src/fireflyframework_genai/prompts/composer.py +++ b/src/fireflyframework_agentic/prompts/composer.py @@ -23,7 +23,7 @@ from collections.abc import Callable, Sequence from typing import Any -from fireflyframework_genai.prompts.template import PromptTemplate +from fireflyframework_agentic.prompts.template import PromptTemplate class SequentialComposer: diff --git a/src/fireflyframework_genai/prompts/loader.py b/src/fireflyframework_agentic/prompts/loader.py similarity index 97% rename from src/fireflyframework_genai/prompts/loader.py rename to src/fireflyframework_agentic/prompts/loader.py index b41fe4ba..888c3ce3 100644 --- a/src/fireflyframework_genai/prompts/loader.py +++ b/src/fireflyframework_agentic/prompts/loader.py @@ -24,7 +24,7 @@ from collections.abc import Sequence from pathlib import Path -from fireflyframework_genai.prompts.template import PromptTemplate, PromptVariable +from fireflyframework_agentic.prompts.template import PromptTemplate, PromptVariable logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/prompts/registry.py b/src/fireflyframework_agentic/prompts/registry.py similarity index 95% rename from src/fireflyframework_genai/prompts/registry.py rename to src/fireflyframework_agentic/prompts/registry.py index c2bda438..3470e761 100644 --- a/src/fireflyframework_genai/prompts/registry.py +++ b/src/fireflyframework_agentic/prompts/registry.py @@ -23,8 +23,8 @@ import logging -from fireflyframework_genai.exceptions import PromptNotFoundError -from fireflyframework_genai.prompts.template import PromptInfo, PromptTemplate +from fireflyframework_agentic.exceptions import PromptNotFoundError +from fireflyframework_agentic.prompts.template import PromptInfo, PromptTemplate logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/prompts/template.py b/src/fireflyframework_agentic/prompts/template.py similarity index 97% rename from src/fireflyframework_genai/prompts/template.py rename to src/fireflyframework_agentic/prompts/template.py index a1783291..e35deec4 100644 --- a/src/fireflyframework_genai/prompts/template.py +++ b/src/fireflyframework_agentic/prompts/template.py @@ -27,8 +27,8 @@ from jinja2 import BaseLoader, Environment, TemplateSyntaxError from pydantic import BaseModel -from fireflyframework_genai.exceptions import PromptError, PromptValidationError -from fireflyframework_genai.types import Metadata +from fireflyframework_agentic.exceptions import PromptError, PromptValidationError +from fireflyframework_agentic.types import Metadata # Shared Jinja2 environment with safe defaults _jinja_env = Environment(loader=BaseLoader(), autoescape=False, keep_trailing_newline=True) diff --git a/src/fireflyframework_genai/prompts/validator.py b/src/fireflyframework_agentic/prompts/validator.py similarity index 100% rename from src/fireflyframework_genai/prompts/validator.py rename to src/fireflyframework_agentic/prompts/validator.py diff --git a/src/fireflyframework_genai/py.typed b/src/fireflyframework_agentic/py.typed similarity index 100% rename from src/fireflyframework_genai/py.typed rename to src/fireflyframework_agentic/py.typed diff --git a/src/fireflyframework_genai/reasoning/__init__.py b/src/fireflyframework_agentic/reasoning/__init__.py similarity index 75% rename from src/fireflyframework_genai/reasoning/__init__.py rename to src/fireflyframework_agentic/reasoning/__init__.py index f020488d..c70c8a65 100644 --- a/src/fireflyframework_genai/reasoning/__init__.py +++ b/src/fireflyframework_agentic/reasoning/__init__.py @@ -14,13 +14,13 @@ """Reasoning subpackage -- patterns, traces, models, prompts, registry, and pipeline.""" -from fireflyframework_genai.reasoning.base import ( +from fireflyframework_agentic.reasoning.base import ( AbstractReasoningPattern, ReasoningPattern, ) -from fireflyframework_genai.reasoning.chain_of_thought import ChainOfThoughtPattern -from fireflyframework_genai.reasoning.goal_decomposition import GoalDecompositionPattern -from fireflyframework_genai.reasoning.models import ( +from fireflyframework_agentic.reasoning.chain_of_thought import ChainOfThoughtPattern +from fireflyframework_agentic.reasoning.goal_decomposition import GoalDecompositionPattern +from fireflyframework_agentic.reasoning.models import ( BranchEvaluation, BranchList, GoalDecompositionResult, @@ -32,9 +32,9 @@ ReflectionVerdict, StepStatus, ) -from fireflyframework_genai.reasoning.pipeline import ReasoningPipeline -from fireflyframework_genai.reasoning.plan_and_execute import PlanAndExecutePattern -from fireflyframework_genai.reasoning.prompts import ( +from fireflyframework_agentic.reasoning.pipeline import ReasoningPipeline +from fireflyframework_agentic.reasoning.plan_and_execute import PlanAndExecutePattern +from fireflyframework_agentic.reasoning.prompts import ( COT_STEP_PROMPT, GOAL_DECOMPOSE_PROMPT, GOAL_PLAN_PHASE_PROMPT, @@ -50,13 +50,13 @@ TOT_EVALUATE_PROMPT, register_reasoning_prompts, ) -from fireflyframework_genai.reasoning.react import ReActPattern -from fireflyframework_genai.reasoning.reflexion import ReflexionPattern -from fireflyframework_genai.reasoning.registry import ( +from fireflyframework_agentic.reasoning.react import ReActPattern +from fireflyframework_agentic.reasoning.reflexion import ReflexionPattern +from fireflyframework_agentic.reasoning.registry import ( ReasoningPatternRegistry, reasoning_registry, ) -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.reasoning.trace import ( ActionStep, ObservationStep, PlanStep, @@ -66,7 +66,7 @@ ReflectionStep, ThoughtStep, ) -from fireflyframework_genai.reasoning.tree_of_thoughts import TreeOfThoughtsPattern +from fireflyframework_agentic.reasoning.tree_of_thoughts import TreeOfThoughtsPattern __all__ = [ "AbstractReasoningPattern", diff --git a/src/fireflyframework_genai/reasoning/base.py b/src/fireflyframework_agentic/reasoning/base.py similarity index 94% rename from src/fireflyframework_genai/reasoning/base.py rename to src/fireflyframework_agentic/reasoning/base.py index 1d744e34..dc91fd33 100644 --- a/src/fireflyframework_genai/reasoning/base.py +++ b/src/fireflyframework_agentic/reasoning/base.py @@ -37,18 +37,18 @@ from pydantic_ai import Agent as PydanticAgent from pydantic_ai.models import Model -from fireflyframework_genai.exceptions import ReasoningError, ReasoningStepLimitError -from fireflyframework_genai.prompts.template import PromptTemplate -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.exceptions import ReasoningError, ReasoningStepLimitError +from fireflyframework_agentic.prompts.template import PromptTemplate +from fireflyframework_agentic.reasoning.trace import ( ReasoningResult, ReasoningStep, ReasoningTrace, ) -from fireflyframework_genai.types import AgentLike, UserContent +from fireflyframework_agentic.types import AgentLike, UserContent if TYPE_CHECKING: - from fireflyframework_genai.memory.manager import MemoryManager - from fireflyframework_genai.validation.reviewer import OutputReviewer + from fireflyframework_agentic.memory.manager import MemoryManager + from fireflyframework_agentic.validation.reviewer import OutputReviewer logger = logging.getLogger(__name__) @@ -236,7 +236,7 @@ def _fallback_parse(raw: Any, output_type: type[T]) -> T: pass # Type-specific text fallbacks - from fireflyframework_genai.reasoning.models import ( + from fireflyframework_agentic.reasoning.models import ( BranchEvaluation, GoalDecompositionResult, GoalPhase, @@ -265,7 +265,7 @@ def _fallback_parse(raw: Any, output_type: type[T]) -> T: phases = [GoalPhase(name=ln) for ln in lines] return GoalDecompositionResult(goal="", phases=phases) # type: ignore[return-value] - from fireflyframework_genai.reasoning.models import BranchList + from fireflyframework_agentic.reasoning.models import BranchList if output_type is BranchList: branches = [b.strip() for b in raw_str.split("---") if b.strip()] @@ -286,7 +286,7 @@ def _init_memory(memory: Any, pattern_name: str) -> MemoryManager | None: If *memory* is not a ``MemoryManager`` (or is ``None``), returns ``None`` and memory integration is disabled. """ - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.memory.manager import MemoryManager if isinstance(memory, MemoryManager): return memory.fork(working_scope_id=f"reasoning:{pattern_name}") @@ -323,10 +323,10 @@ async def execute(self, agent: AgentLike, input: str | Sequence[UserContent], ** """Run the reasoning loop. *input* may be a plain string or a sequence of multimodal - :class:`~fireflyframework_genai.types.UserContent` parts. + :class:`~fireflyframework_agentic.types.UserContent` parts. If ``memory`` is passed as a keyword argument (a - :class:`~fireflyframework_genai.memory.manager.MemoryManager`), + :class:`~fireflyframework_agentic.memory.manager.MemoryManager`), the pattern forks it into an isolated working-memory scope and automatically persists each reasoning step. Working memory context is available to subclass hooks via ``state["memory"]``. @@ -449,7 +449,7 @@ async def _review_output(self, state: dict[str, Any], output: Any) -> Any: If review fails after all retries, the original output is returned with a warning logged (non-fatal by default). """ - from fireflyframework_genai.exceptions import OutputReviewError + from fireflyframework_agentic.exceptions import OutputReviewError reviewer = self._reviewer if reviewer is None: @@ -476,7 +476,7 @@ def _record_structured_usage( ) -> None: """Record usage from an ephemeral agent result.""" try: - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config cfg = get_config() if not cfg.cost_tracking_enabled: @@ -486,8 +486,8 @@ def _record_structured_usage( if usage is None: return - from fireflyframework_genai.observability.cost import get_cost_calculator - from fireflyframework_genai.observability.usage import UsageRecord, default_usage_tracker + from fireflyframework_agentic.observability.cost import get_cost_calculator + from fireflyframework_agentic.observability.usage import UsageRecord, default_usage_tracker input_tokens = getattr(usage, "input_tokens", 0) or 0 output_tokens = getattr(usage, "output_tokens", 0) or 0 diff --git a/src/fireflyframework_genai/reasoning/chain_of_thought.py b/src/fireflyframework_agentic/reasoning/chain_of_thought.py similarity index 89% rename from src/fireflyframework_genai/reasoning/chain_of_thought.py rename to src/fireflyframework_agentic/reasoning/chain_of_thought.py index 438944fa..532ed8c7 100644 --- a/src/fireflyframework_genai/reasoning/chain_of_thought.py +++ b/src/fireflyframework_agentic/reasoning/chain_of_thought.py @@ -16,7 +16,7 @@ The simplest pattern. The agent reasons through the problem step by step, validating each step, until it reaches a conclusion signalled by the -:class:`~fireflyframework_genai.reasoning.models.ReasoningThought` +:class:`~fireflyframework_agentic.reasoning.models.ReasoningThought` ``is_final`` flag. """ @@ -27,17 +27,17 @@ from pydantic_ai.models import Model -from fireflyframework_genai.prompts.template import PromptTemplate -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern -from fireflyframework_genai.reasoning.models import ReasoningThought -from fireflyframework_genai.reasoning.prompts import COT_STEP_PROMPT -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.prompts.template import PromptTemplate +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.models import ReasoningThought +from fireflyframework_agentic.reasoning.prompts import COT_STEP_PROMPT +from fireflyframework_agentic.reasoning.trace import ( ReasoningStep, ThoughtStep, ) if TYPE_CHECKING: - from fireflyframework_genai.validation.reviewer import OutputReviewer + from fireflyframework_agentic.validation.reviewer import OutputReviewer logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/reasoning/goal_decomposition.py b/src/fireflyframework_agentic/reasoning/goal_decomposition.py similarity index 93% rename from src/fireflyframework_genai/reasoning/goal_decomposition.py rename to src/fireflyframework_agentic/reasoning/goal_decomposition.py index cfe5549f..c00a0341 100644 --- a/src/fireflyframework_genai/reasoning/goal_decomposition.py +++ b/src/fireflyframework_agentic/reasoning/goal_decomposition.py @@ -15,7 +15,7 @@ """Goal Decomposition reasoning pattern: Goal -> Phases -> Tasks. Hierarchically decomposes a high-level goal into structured -:class:`~fireflyframework_genai.reasoning.models.GoalPhase` objects +:class:`~fireflyframework_agentic.reasoning.models.GoalPhase` objects with typed task lists. Each task can optionally be delegated to another reasoning pattern (e.g. ReAct). """ @@ -29,17 +29,17 @@ from pydantic_ai.models import Model -from fireflyframework_genai.prompts.template import PromptTemplate -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern -from fireflyframework_genai.reasoning.models import ( +from fireflyframework_agentic.prompts.template import PromptTemplate +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.models import ( GoalDecompositionResult, ) -from fireflyframework_genai.reasoning.prompts import ( +from fireflyframework_agentic.reasoning.prompts import ( GOAL_DECOMPOSE_PROMPT, GOAL_PLAN_PHASE_PROMPT, GOAL_TASK_EXECUTION_PROMPT, ) -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.reasoning.trace import ( ActionStep, ObservationStep, PlanStep, @@ -47,10 +47,10 @@ ReasoningStep, ReasoningTrace, ) -from fireflyframework_genai.types import AgentLike, UserContent +from fireflyframework_agentic.types import AgentLike, UserContent if TYPE_CHECKING: - from fireflyframework_genai.validation.reviewer import OutputReviewer + from fireflyframework_agentic.validation.reviewer import OutputReviewer logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/reasoning/models.py b/src/fireflyframework_agentic/reasoning/models.py similarity index 100% rename from src/fireflyframework_genai/reasoning/models.py rename to src/fireflyframework_agentic/reasoning/models.py diff --git a/src/fireflyframework_genai/reasoning/pipeline.py b/src/fireflyframework_agentic/reasoning/pipeline.py similarity index 95% rename from src/fireflyframework_genai/reasoning/pipeline.py rename to src/fireflyframework_agentic/reasoning/pipeline.py index 8412d3bb..e6c1c8b1 100644 --- a/src/fireflyframework_genai/reasoning/pipeline.py +++ b/src/fireflyframework_agentic/reasoning/pipeline.py @@ -25,11 +25,11 @@ from collections.abc import Sequence from typing import Any -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.reasoning.trace import ( ReasoningResult, ReasoningTrace, ) -from fireflyframework_genai.types import AgentLike, UserContent +from fireflyframework_agentic.types import AgentLike, UserContent # Use a structural (duck-typing) check rather than importing the Protocol # to avoid circular dependencies. @@ -62,7 +62,7 @@ async def execute(self, agent: AgentLike, input: str | Sequence[UserContent], ** subsequent patterns receive the string output of the previous pattern. If a ``memory`` keyword argument is provided (a - :class:`~fireflyframework_genai.memory.manager.MemoryManager`), + :class:`~fireflyframework_agentic.memory.manager.MemoryManager`), it is passed through to **every** pattern's ``execute()`` call. Because each pattern forks the memory into its own working-memory scope (``reasoning:``), subsequent patterns can read diff --git a/src/fireflyframework_genai/reasoning/plan_and_execute.py b/src/fireflyframework_agentic/reasoning/plan_and_execute.py similarity index 95% rename from src/fireflyframework_genai/reasoning/plan_and_execute.py rename to src/fireflyframework_agentic/reasoning/plan_and_execute.py index 6e4bed5b..b9814fab 100644 --- a/src/fireflyframework_genai/reasoning/plan_and_execute.py +++ b/src/fireflyframework_agentic/reasoning/plan_and_execute.py @@ -28,20 +28,20 @@ from pydantic_ai.models import Model -from fireflyframework_genai.exceptions import ReasoningError -from fireflyframework_genai.prompts.template import PromptTemplate -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern -from fireflyframework_genai.reasoning.models import ( +from fireflyframework_agentic.exceptions import ReasoningError +from fireflyframework_agentic.prompts.template import PromptTemplate +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.models import ( PlanStepDef, ReasoningPlan, StepStatus, ) -from fireflyframework_genai.reasoning.prompts import ( +from fireflyframework_agentic.reasoning.prompts import ( PLAN_GENERATION_PROMPT, PLAN_REPLAN_PROMPT, PLAN_STEP_EXECUTION_PROMPT, ) -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.reasoning.trace import ( ActionStep, ObservationStep, PlanStep, @@ -50,7 +50,7 @@ ) if TYPE_CHECKING: - from fireflyframework_genai.validation.reviewer import OutputReviewer + from fireflyframework_agentic.validation.reviewer import OutputReviewer logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/reasoning/prompts.py b/src/fireflyframework_agentic/reasoning/prompts.py similarity index 98% rename from src/fireflyframework_genai/reasoning/prompts.py rename to src/fireflyframework_agentic/reasoning/prompts.py index 622b4ce1..a68f459d 100644 --- a/src/fireflyframework_genai/reasoning/prompts.py +++ b/src/fireflyframework_agentic/reasoning/prompts.py @@ -24,14 +24,14 @@ ) All built-in templates are registered in the global -:data:`~fireflyframework_genai.prompts.registry.prompt_registry` under +:data:`~fireflyframework_agentic.prompts.registry.prompt_registry` under the ``reasoning:`` namespace. """ from __future__ import annotations -from fireflyframework_genai.prompts.registry import prompt_registry -from fireflyframework_genai.prompts.template import PromptTemplate, PromptVariable +from fireflyframework_agentic.prompts.registry import prompt_registry +from fireflyframework_agentic.prompts.template import PromptTemplate, PromptVariable # --------------------------------------------------------------------------- # ReAct diff --git a/src/fireflyframework_genai/reasoning/react.py b/src/fireflyframework_agentic/reasoning/react.py similarity index 91% rename from src/fireflyframework_genai/reasoning/react.py rename to src/fireflyframework_agentic/reasoning/react.py index 455aa5ae..91eabc13 100644 --- a/src/fireflyframework_genai/reasoning/react.py +++ b/src/fireflyframework_agentic/reasoning/react.py @@ -17,7 +17,7 @@ The pattern interleaves reasoning (thought generation), action (tool calls), and observation (processing tool results) until a stopping condition is met. -Uses :class:`~fireflyframework_genai.reasoning.models.ReasoningThought` as +Uses :class:`~fireflyframework_agentic.reasoning.models.ReasoningThought` as structured output so that the ``is_final`` flag replaces magic stop-phrases. Prompts are configurable via the ``prompts`` constructor argument. """ @@ -29,11 +29,11 @@ from pydantic_ai.models import Model -from fireflyframework_genai.prompts.template import PromptTemplate -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern -from fireflyframework_genai.reasoning.models import ReasoningThought -from fireflyframework_genai.reasoning.prompts import REACT_ACTION_PROMPT, REACT_THOUGHT_PROMPT -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.prompts.template import PromptTemplate +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.models import ReasoningThought +from fireflyframework_agentic.reasoning.prompts import REACT_ACTION_PROMPT, REACT_THOUGHT_PROMPT +from fireflyframework_agentic.reasoning.trace import ( ActionStep, ObservationStep, ReasoningStep, @@ -41,7 +41,7 @@ ) if TYPE_CHECKING: - from fireflyframework_genai.validation.reviewer import OutputReviewer + from fireflyframework_agentic.validation.reviewer import OutputReviewer logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/reasoning/reflexion.py b/src/fireflyframework_agentic/reasoning/reflexion.py similarity index 90% rename from src/fireflyframework_genai/reasoning/reflexion.py rename to src/fireflyframework_agentic/reasoning/reflexion.py index 4bd892c0..70f4e0ee 100644 --- a/src/fireflyframework_genai/reasoning/reflexion.py +++ b/src/fireflyframework_agentic/reasoning/reflexion.py @@ -15,7 +15,7 @@ """Reflexion reasoning pattern: Execute -> Reflect -> Retry. The agent first produces an answer, then critiques it using a structured -:class:`~fireflyframework_genai.reasoning.models.ReflectionVerdict`. +:class:`~fireflyframework_agentic.reasoning.models.ReflectionVerdict`. If the verdict signals issues, the agent retries with specific feedback. """ @@ -26,21 +26,21 @@ from pydantic_ai.models import Model -from fireflyframework_genai.prompts.template import PromptTemplate -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern -from fireflyframework_genai.reasoning.models import ReflectionVerdict -from fireflyframework_genai.reasoning.prompts import ( +from fireflyframework_agentic.prompts.template import PromptTemplate +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.models import ReflectionVerdict +from fireflyframework_agentic.reasoning.prompts import ( REFLEXION_CRITIQUE_PROMPT, REFLEXION_RETRY_PROMPT, ) -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.reasoning.trace import ( ReasoningStep, ReflectionStep, ThoughtStep, ) if TYPE_CHECKING: - from fireflyframework_genai.validation.reviewer import OutputReviewer + from fireflyframework_agentic.validation.reviewer import OutputReviewer logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/reasoning/registry.py b/src/fireflyframework_agentic/reasoning/registry.py similarity index 82% rename from src/fireflyframework_genai/reasoning/registry.py rename to src/fireflyframework_agentic/reasoning/registry.py index cd5df350..d9005634 100644 --- a/src/fireflyframework_genai/reasoning/registry.py +++ b/src/fireflyframework_agentic/reasoning/registry.py @@ -20,7 +20,7 @@ import threading from typing import Any -from fireflyframework_genai.exceptions import ReasoningPatternNotFoundError +from fireflyframework_agentic.exceptions import ReasoningPatternNotFoundError logger = logging.getLogger(__name__) @@ -74,12 +74,12 @@ def __len__(self) -> int: def _auto_register_builtins() -> None: """Lazily register the six built-in reasoning patterns.""" try: - from fireflyframework_genai.reasoning.chain_of_thought import ChainOfThoughtPattern - from fireflyframework_genai.reasoning.goal_decomposition import GoalDecompositionPattern - from fireflyframework_genai.reasoning.plan_and_execute import PlanAndExecutePattern - from fireflyframework_genai.reasoning.react import ReActPattern - from fireflyframework_genai.reasoning.reflexion import ReflexionPattern - from fireflyframework_genai.reasoning.tree_of_thoughts import TreeOfThoughtsPattern + from fireflyframework_agentic.reasoning.chain_of_thought import ChainOfThoughtPattern + from fireflyframework_agentic.reasoning.goal_decomposition import GoalDecompositionPattern + from fireflyframework_agentic.reasoning.plan_and_execute import PlanAndExecutePattern + from fireflyframework_agentic.reasoning.react import ReActPattern + from fireflyframework_agentic.reasoning.reflexion import ReflexionPattern + from fireflyframework_agentic.reasoning.tree_of_thoughts import TreeOfThoughtsPattern for name, cls in [ ("react", ReActPattern), diff --git a/src/fireflyframework_genai/reasoning/trace.py b/src/fireflyframework_agentic/reasoning/trace.py similarity index 100% rename from src/fireflyframework_genai/reasoning/trace.py rename to src/fireflyframework_agentic/reasoning/trace.py diff --git a/src/fireflyframework_genai/reasoning/tree_of_thoughts.py b/src/fireflyframework_agentic/reasoning/tree_of_thoughts.py similarity index 91% rename from src/fireflyframework_genai/reasoning/tree_of_thoughts.py rename to src/fireflyframework_agentic/reasoning/tree_of_thoughts.py index 64666052..482c09ea 100644 --- a/src/fireflyframework_genai/reasoning/tree_of_thoughts.py +++ b/src/fireflyframework_agentic/reasoning/tree_of_thoughts.py @@ -15,7 +15,7 @@ """Tree of Thoughts reasoning pattern: Branch -> Evaluate -> Select. Explores multiple reasoning branches, evaluates each with a structured -:class:`~fireflyframework_genai.reasoning.models.BranchEvaluation`, and +:class:`~fireflyframework_agentic.reasoning.models.BranchEvaluation`, and selects the best. Prompts are configurable. """ @@ -28,20 +28,20 @@ from pydantic_ai.models import Model -from fireflyframework_genai.prompts.template import PromptTemplate -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern -from fireflyframework_genai.reasoning.models import BranchEvaluation, BranchList -from fireflyframework_genai.reasoning.prompts import TOT_BRANCH_PROMPT, TOT_EVALUATE_PROMPT -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.prompts.template import PromptTemplate +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.models import BranchEvaluation, BranchList +from fireflyframework_agentic.reasoning.prompts import TOT_BRANCH_PROMPT, TOT_EVALUATE_PROMPT +from fireflyframework_agentic.reasoning.trace import ( ReasoningResult, ReasoningStep, ReasoningTrace, ThoughtStep, ) -from fireflyframework_genai.types import AgentLike, UserContent +from fireflyframework_agentic.types import AgentLike, UserContent if TYPE_CHECKING: - from fireflyframework_genai.validation.reviewer import OutputReviewer + from fireflyframework_agentic.validation.reviewer import OutputReviewer logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/resilience/__init__.py b/src/fireflyframework_agentic/resilience/__init__.py similarity index 87% rename from src/fireflyframework_genai/resilience/__init__.py rename to src/fireflyframework_agentic/resilience/__init__.py index 463edbfe..fa529798 100644 --- a/src/fireflyframework_genai/resilience/__init__.py +++ b/src/fireflyframework_agentic/resilience/__init__.py @@ -24,7 +24,7 @@ Example:: - from fireflyframework_genai.resilience.circuit_breaker import CircuitBreaker + from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreaker breaker = CircuitBreaker( failure_threshold=5, @@ -40,4 +40,4 @@ async def make_api_call(): __all__ = ["CircuitBreaker", "CircuitBreakerMiddleware"] -from fireflyframework_genai.resilience.circuit_breaker import CircuitBreaker, CircuitBreakerMiddleware +from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreaker, CircuitBreakerMiddleware diff --git a/src/fireflyframework_genai/resilience/circuit_breaker.py b/src/fireflyframework_agentic/resilience/circuit_breaker.py similarity index 98% rename from src/fireflyframework_genai/resilience/circuit_breaker.py rename to src/fireflyframework_agentic/resilience/circuit_breaker.py index c9109b1e..59ab796e 100644 --- a/src/fireflyframework_genai/resilience/circuit_breaker.py +++ b/src/fireflyframework_agentic/resilience/circuit_breaker.py @@ -25,7 +25,7 @@ Example:: - from fireflyframework_genai.resilience.circuit_breaker import CircuitBreaker + from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreaker breaker = CircuitBreaker( failure_threshold=5, # Open after 5 failures @@ -308,7 +308,7 @@ class CircuitBreakerMiddleware: Example:: - from fireflyframework_genai.resilience.circuit_breaker import CircuitBreakerMiddleware + from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreakerMiddleware agent = FireflyAgent( "resilient-agent", diff --git a/src/fireflyframework_genai/security/__init__.py b/src/fireflyframework_agentic/security/__init__.py similarity index 73% rename from src/fireflyframework_genai/security/__init__.py rename to src/fireflyframework_agentic/security/__init__.py index e5118c51..9a03c95b 100644 --- a/src/fireflyframework_genai/security/__init__.py +++ b/src/fireflyframework_agentic/security/__init__.py @@ -20,10 +20,10 @@ - **SQL injection** prevention for database tools """ -from fireflyframework_genai.security.encryption import AESEncryptionProvider, EncryptedMemoryStore, EncryptionProvider -from fireflyframework_genai.security.output_guard import OutputGuard, default_output_guard -from fireflyframework_genai.security.prompt_guard import PromptGuard, default_prompt_guard -from fireflyframework_genai.security.rbac import RBACManager, require_permission +from fireflyframework_agentic.security.encryption import AESEncryptionProvider, EncryptedMemoryStore, EncryptionProvider +from fireflyframework_agentic.security.output_guard import OutputGuard, default_output_guard +from fireflyframework_agentic.security.prompt_guard import PromptGuard, default_prompt_guard +from fireflyframework_agentic.security.rbac import RBACManager, require_permission __all__ = [ "AESEncryptionProvider", diff --git a/src/fireflyframework_genai/security/encryption.py b/src/fireflyframework_agentic/security/encryption.py similarity index 94% rename from src/fireflyframework_genai/security/encryption.py rename to src/fireflyframework_agentic/security/encryption.py index 0050d850..8b4efb44 100644 --- a/src/fireflyframework_genai/security/encryption.py +++ b/src/fireflyframework_agentic/security/encryption.py @@ -26,7 +26,7 @@ Example: Basic encryption:: - from fireflyframework_genai.security.encryption import AESEncryptionProvider + from fireflyframework_agentic.security.encryption import AESEncryptionProvider provider = AESEncryptionProvider(key="my-secret-key-32-bytes-long!!") @@ -38,8 +38,8 @@ Encrypted memory store:: - from fireflyframework_genai.security.encryption import EncryptedMemoryStore - from fireflyframework_genai.memory.store import InMemoryStore + from fireflyframework_agentic.security.encryption import EncryptedMemoryStore + from fireflyframework_agentic.memory.store import InMemoryStore # Wrap any memory store with encryption base_store = InMemoryStore() @@ -57,7 +57,7 @@ import os from typing import Any, Protocol, runtime_checkable -from fireflyframework_genai.memory.types import MemoryEntry +from fireflyframework_agentic.memory.types import MemoryEntry logger = logging.getLogger(__name__) @@ -120,7 +120,7 @@ class AESEncryptionProvider: Note: Requires the optional ``security`` dependency group: - ``pip install fireflyframework-genai[security]`` + ``pip install fireflyframework-agentic[security]`` """ def __init__(self, key: str | bytes) -> None: @@ -130,7 +130,7 @@ def __init__(self, key: str | bytes) -> None: from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC except ImportError as exc: raise ImportError( - "Encryption support requires 'cryptography'. Install with: pip install fireflyframework-genai[security]" + "Encryption support requires 'cryptography'. Install with: pip install fireflyframework-agentic[security]" ) from exc # Store raw key bytes for per-call salt derivation @@ -231,8 +231,8 @@ class EncryptedMemoryStore: Example:: - from fireflyframework_genai.memory.store import InMemoryStore - from fireflyframework_genai.security.encryption import EncryptedMemoryStore + from fireflyframework_agentic.memory.store import InMemoryStore + from fireflyframework_agentic.security.encryption import EncryptedMemoryStore base_store = InMemoryStore() encrypted_store = EncryptedMemoryStore( @@ -332,7 +332,7 @@ def create_encryption_provider_from_config() -> EncryptionProvider | None: Returns: EncryptionProvider instance if encryption is enabled, None otherwise. """ - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config cfg = get_config() diff --git a/src/fireflyframework_genai/security/output_guard.py b/src/fireflyframework_agentic/security/output_guard.py similarity index 99% rename from src/fireflyframework_genai/security/output_guard.py rename to src/fireflyframework_agentic/security/output_guard.py index 8e7c477e..d14ec36c 100644 --- a/src/fireflyframework_genai/security/output_guard.py +++ b/src/fireflyframework_agentic/security/output_guard.py @@ -19,7 +19,7 @@ Usage:: - from fireflyframework_genai.security import OutputGuard + from fireflyframework_agentic.security import OutputGuard guard = OutputGuard() result = guard.scan("The user's SSN is 123-45-6789") diff --git a/src/fireflyframework_genai/security/prompt_guard.py b/src/fireflyframework_agentic/security/prompt_guard.py similarity index 98% rename from src/fireflyframework_genai/security/prompt_guard.py rename to src/fireflyframework_agentic/security/prompt_guard.py index 88a69060..7d9c9a50 100644 --- a/src/fireflyframework_genai/security/prompt_guard.py +++ b/src/fireflyframework_agentic/security/prompt_guard.py @@ -19,7 +19,7 @@ Usage:: - from fireflyframework_genai.security import default_prompt_guard + from fireflyframework_agentic.security import default_prompt_guard result = default_prompt_guard.scan("Ignore all previous instructions") if not result.safe: diff --git a/src/fireflyframework_genai/security/rbac.py b/src/fireflyframework_agentic/security/rbac.py similarity index 95% rename from src/fireflyframework_genai/security/rbac.py rename to src/fireflyframework_agentic/security/rbac.py index ec5d99f7..d97e7236 100644 --- a/src/fireflyframework_genai/security/rbac.py +++ b/src/fireflyframework_agentic/security/rbac.py @@ -23,7 +23,7 @@ Example: Basic RBAC setup:: - from fireflyframework_genai.security.rbac import RBACManager, require_permission + from fireflyframework_agentic.security.rbac import RBACManager, require_permission rbac = RBACManager(jwt_secret="your-secret-key") @@ -140,7 +140,7 @@ def create_token( import jwt except ImportError as exc: raise ImportError( - "JWT support requires 'pyjwt'. Install with: pip install fireflyframework-genai[security]" + "JWT support requires 'pyjwt'. Install with: pip install fireflyframework-agentic[security]" ) from exc now = datetime.now(UTC) @@ -181,7 +181,7 @@ def validate_token(self, token: str) -> dict[str, Any]: import jwt except ImportError as exc: raise ImportError( - "JWT support requires 'pyjwt'. Install with: pip install fireflyframework-genai[security]" + "JWT support requires 'pyjwt'. Install with: pip install fireflyframework-agentic[security]" ) from exc try: @@ -331,8 +331,8 @@ async def async_wrapper(*args: Any, **kwargs: Any) -> Any: if manager is None: raise ValueError( - "No RBAC manager configured. Set FIREFLY_GENAI_RBAC_ENABLED=true " - "and FIREFLY_GENAI_RBAC_JWT_SECRET in environment." + "No RBAC manager configured. Set FIREFLY_AGENTIC_RBAC_ENABLED=true " + "and FIREFLY_AGENTIC_RBAC_JWT_SECRET in environment." ) # Extract token from args/kwargs using signature binding @@ -376,8 +376,8 @@ def sync_wrapper(*args: Any, **kwargs: Any) -> Any: if manager is None: raise ValueError( - "No RBAC manager configured. Set FIREFLY_GENAI_RBAC_ENABLED=true " - "and FIREFLY_GENAI_RBAC_JWT_SECRET in environment." + "No RBAC manager configured. Set FIREFLY_AGENTIC_RBAC_ENABLED=true " + "and FIREFLY_AGENTIC_RBAC_JWT_SECRET in environment." ) # Extract token from args/kwargs @@ -427,7 +427,7 @@ def sync_wrapper(*args: Any, **kwargs: Any) -> Any: def _get_default_rbac() -> RBACManager | None: """Get the default RBAC manager from configuration.""" try: - from fireflyframework_genai.config import get_config + from fireflyframework_agentic.config import get_config cfg = get_config() if not cfg.rbac_enabled or not cfg.rbac_jwt_secret: diff --git a/src/fireflyframework_genai/studio/__init__.py b/src/fireflyframework_agentic/studio/__init__.py similarity index 79% rename from src/fireflyframework_genai/studio/__init__.py rename to src/fireflyframework_agentic/studio/__init__.py index b6c528df..1289190a 100644 --- a/src/fireflyframework_genai/studio/__init__.py +++ b/src/fireflyframework_agentic/studio/__init__.py @@ -12,14 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Firefly Agentic Studio -- visual agent IDE for the Firefly GenAI framework.""" +"""Firefly Agentic Studio -- visual agent IDE for the Firefly Agentic framework.""" from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: - from fireflyframework_genai.studio.config import StudioConfig + from fireflyframework_agentic.studio.config import StudioConfig __all__ = [ "StudioConfig", @@ -29,7 +29,7 @@ def __getattr__(name: str) -> object: if name == "StudioConfig": - from fireflyframework_genai.studio.config import StudioConfig + from fireflyframework_agentic.studio.config import StudioConfig return StudioConfig raise AttributeError(f"module {__name__!r} has no attribute {name!r}") @@ -40,6 +40,6 @@ def launch_studio() -> None: Convenience wrapper that delegates to the CLI entry point. """ - from fireflyframework_genai.studio.cli import main + from fireflyframework_agentic.studio.cli import main main(["studio"]) diff --git a/src/fireflyframework_genai/studio/api/__init__.py b/src/fireflyframework_agentic/studio/api/__init__.py similarity index 100% rename from src/fireflyframework_genai/studio/api/__init__.py rename to src/fireflyframework_agentic/studio/api/__init__.py diff --git a/src/fireflyframework_genai/studio/api/assistant.py b/src/fireflyframework_agentic/studio/api/assistant.py similarity index 97% rename from src/fireflyframework_genai/studio/api/assistant.py rename to src/fireflyframework_agentic/studio/api/assistant.py index b55a2b90..24519382 100644 --- a/src/fireflyframework_genai/studio/api/assistant.py +++ b/src/fireflyframework_agentic/studio/api/assistant.py @@ -672,8 +672,8 @@ def _build_project_context(canvas: Any = None, project_name: str = "") -> str: # Current project try: - from fireflyframework_genai.studio.config import StudioConfig - from fireflyframework_genai.studio.projects import ProjectManager + from fireflyframework_agentic.studio.config import StudioConfig + from fireflyframework_agentic.studio.projects import ProjectManager pm = ProjectManager(StudioConfig().projects_dir) projects = pm.list_all() @@ -685,7 +685,7 @@ def _build_project_context(canvas: Any = None, project_name: str = "") -> str: # Custom tools / integrations try: - from fireflyframework_genai.studio.custom_tools import CustomToolManager + from fireflyframework_agentic.studio.custom_tools import CustomToolManager manager = CustomToolManager() tools = manager.list_all() @@ -702,7 +702,7 @@ def _build_project_context(canvas: Any = None, project_name: str = "") -> str: # Registered framework tools try: - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.tools.registry import tool_registry registered = tool_registry.list_tools() if registered: @@ -713,7 +713,7 @@ def _build_project_context(canvas: Any = None, project_name: str = "") -> str: # Settings snapshot (provider configured, default model) try: - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings() if settings.model_defaults.default_model: @@ -724,7 +724,7 @@ def _build_project_context(canvas: Any = None, project_name: str = "") -> str: # Cross-agent context: what Smith and Oracle have discussed with the user if project_name: try: - from fireflyframework_genai.studio.assistant.shared_context import ( + from fireflyframework_agentic.studio.assistant.shared_context import ( build_shared_context, ) @@ -770,20 +770,20 @@ def create_assistant_router() -> APIRouter: @router.get("/api/assistant/{project}/history") async def get_chat_history(project: str): - from fireflyframework_genai.studio.assistant.history import load_chat_history + from fireflyframework_agentic.studio.assistant.history import load_chat_history return load_chat_history(project) @router.post("/api/assistant/{project}/history") async def save_chat_history_endpoint(project: str, body: SaveHistoryRequest): - from fireflyframework_genai.studio.assistant.history import save_chat_history + from fireflyframework_agentic.studio.assistant.history import save_chat_history save_chat_history(project, body.messages) return {"status": "saved"} @router.delete("/api/assistant/{project}/history") async def delete_chat_history(project: str): - from fireflyframework_genai.studio.assistant.history import clear_chat_history + from fireflyframework_agentic.studio.assistant.history import clear_chat_history clear_chat_history(project) return {"status": "cleared"} @@ -818,7 +818,7 @@ async def assistant_ws(websocket: WebSocket, project: str = Query(default="")) - logger.info("Assistant WebSocket connected") # Per-connection state - from fireflyframework_genai.studio.assistant.agent import ( + from fireflyframework_agentic.studio.assistant.agent import ( CanvasEdge, CanvasNode, CanvasState, @@ -846,7 +846,7 @@ async def assistant_ws(websocket: WebSocket, project: str = Query(default="")) - # Load project-scoped chat history if project is specified if project: try: - from fireflyframework_genai.studio.assistant.history import load_chat_history + from fireflyframework_agentic.studio.assistant.history import load_chat_history saved_history = load_chat_history(project) if saved_history: @@ -902,7 +902,7 @@ async def assistant_ws(websocket: WebSocket, project: str = Query(default="")) - # Auto-save chat history for project if project: try: - from fireflyframework_genai.studio.assistant.history import save_chat_history + from fireflyframework_agentic.studio.assistant.history import save_chat_history save_chat_history( project, diff --git a/src/fireflyframework_genai/studio/api/checkpoints.py b/src/fireflyframework_agentic/studio/api/checkpoints.py similarity index 97% rename from src/fireflyframework_genai/studio/api/checkpoints.py rename to src/fireflyframework_agentic/studio/api/checkpoints.py index 050a8e22..5a570c90 100644 --- a/src/fireflyframework_genai/studio/api/checkpoints.py +++ b/src/fireflyframework_agentic/studio/api/checkpoints.py @@ -27,7 +27,7 @@ from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] from pydantic import BaseModel # type: ignore[import-not-found] -from fireflyframework_genai.studio.execution.checkpoint import CheckpointManager +from fireflyframework_agentic.studio.execution.checkpoint import CheckpointManager class ForkRequest(BaseModel): diff --git a/src/fireflyframework_genai/studio/api/codegen.py b/src/fireflyframework_agentic/studio/api/codegen.py similarity index 93% rename from src/fireflyframework_genai/studio/api/codegen.py rename to src/fireflyframework_agentic/studio/api/codegen.py index fb68ee70..073a2898 100644 --- a/src/fireflyframework_genai/studio/api/codegen.py +++ b/src/fireflyframework_agentic/studio/api/codegen.py @@ -55,8 +55,8 @@ def create_codegen_router() -> APIRouter: @router.post("/smith") async def smith_codegen(req: SmithCodegenRequest) -> dict: """Generate Python code using the Smith AI agent.""" - from fireflyframework_genai.studio.assistant.smith import generate_code_with_smith - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.assistant.smith import generate_code_with_smith + from fireflyframework_agentic.studio.settings import load_settings try: settings = load_settings() diff --git a/src/fireflyframework_genai/studio/api/custom_tools.py b/src/fireflyframework_agentic/studio/api/custom_tools.py similarity index 98% rename from src/fireflyframework_genai/studio/api/custom_tools.py rename to src/fireflyframework_agentic/studio/api/custom_tools.py index 3766ae48..ef05080c 100644 --- a/src/fireflyframework_genai/studio/api/custom_tools.py +++ b/src/fireflyframework_agentic/studio/api/custom_tools.py @@ -27,7 +27,7 @@ from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] from pydantic import BaseModel # type: ignore[import-not-found] -from fireflyframework_genai.studio.custom_tools import ( +from fireflyframework_agentic.studio.custom_tools import ( CustomToolDefinition, CustomToolManager, ToolParameter, @@ -356,7 +356,7 @@ async def install_connector(connector_id: str, body: dict[str, Any] | None = Non # Resolve credential placeholders from settings if connector.get("requires_credential"): - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings() cred_field = connector["requires_credential"] @@ -381,7 +381,7 @@ async def install_connector(connector_id: str, body: dict[str, Any] | None = Non # Register at runtime try: tool = manager.create_runtime_tool(definition) - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.tools.registry import tool_registry tool_registry.register(tool) except Exception: @@ -405,7 +405,7 @@ async def verify_connector(connector_id: str) -> dict[str, Any]: # Resolve credential if needed token = "" if connector.get("requires_credential"): - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings() cred_field = connector["requires_credential"] @@ -550,7 +550,7 @@ async def save_tool(body: SaveToolRequest) -> dict[str, Any]: # Auto-register if possible try: tool = manager.create_runtime_tool(definition) - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.tools.registry import tool_registry tool_registry.register(tool) except Exception: @@ -603,7 +603,7 @@ async def register_tool(name: str) -> dict[str, str]: try: tool = manager.create_runtime_tool(definition) - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.tools.registry import tool_registry tool_registry.register(tool) except Exception as exc: diff --git a/src/fireflyframework_genai/studio/api/evaluate.py b/src/fireflyframework_agentic/studio/api/evaluate.py similarity index 98% rename from src/fireflyframework_genai/studio/api/evaluate.py rename to src/fireflyframework_agentic/studio/api/evaluate.py index 8caf24df..a0e07c16 100644 --- a/src/fireflyframework_genai/studio/api/evaluate.py +++ b/src/fireflyframework_agentic/studio/api/evaluate.py @@ -26,12 +26,12 @@ from fastapi import APIRouter, HTTPException, UploadFile # type: ignore[import-not-found] -from fireflyframework_genai.studio.evaluation import ( +from fireflyframework_agentic.studio.evaluation import ( EvaluationResult, load_dataset, run_evaluation, ) -from fireflyframework_genai.studio.projects import ProjectManager +from fireflyframework_agentic.studio.projects import ProjectManager def create_evaluate_router(manager: ProjectManager) -> APIRouter: diff --git a/src/fireflyframework_genai/studio/api/execution.py b/src/fireflyframework_agentic/studio/api/execution.py similarity index 93% rename from src/fireflyframework_genai/studio/api/execution.py rename to src/fireflyframework_agentic/studio/api/execution.py index 812ca4f1..c6d71aa5 100644 --- a/src/fireflyframework_genai/studio/api/execution.py +++ b/src/fireflyframework_agentic/studio/api/execution.py @@ -28,11 +28,11 @@ from fastapi import APIRouter, WebSocket, WebSocketDisconnect # type: ignore[import-not-found] -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.studio.codegen.models import GraphModel, NodeType -from fireflyframework_genai.studio.config import StudioConfig -from fireflyframework_genai.studio.execution.compiler import CompilationError, compile_graph -from fireflyframework_genai.studio.execution.runner import StudioEventHandler +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.studio.codegen.models import GraphModel, NodeType +from fireflyframework_agentic.studio.config import StudioConfig +from fireflyframework_agentic.studio.execution.compiler import CompilationError, compile_graph +from fireflyframework_agentic.studio.execution.runner import StudioEventHandler logger = logging.getLogger(__name__) @@ -106,8 +106,8 @@ async def _handle_execution(websocket: WebSocket, message: dict, *, debug: bool) has_memory = any(n.type == NodeType.MEMORY for n in graph.nodes) if has_memory and project_name: try: - from fireflyframework_genai.memory.manager import MemoryManager - from fireflyframework_genai.memory.store import FileStore + from fireflyframework_agentic.memory.manager import MemoryManager + from fireflyframework_agentic.memory.store import FileStore config = StudioConfig() memory_dir = config.projects_dir / project_name / "memory" diff --git a/src/fireflyframework_genai/studio/api/experiments.py b/src/fireflyframework_agentic/studio/api/experiments.py similarity index 96% rename from src/fireflyframework_genai/studio/api/experiments.py rename to src/fireflyframework_agentic/studio/api/experiments.py index e2d76a23..64503d86 100644 --- a/src/fireflyframework_genai/studio/api/experiments.py +++ b/src/fireflyframework_agentic/studio/api/experiments.py @@ -28,7 +28,7 @@ from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] -from fireflyframework_genai.studio.projects import ProjectManager +from fireflyframework_agentic.studio.projects import ProjectManager def create_experiments_router(manager: ProjectManager) -> APIRouter: @@ -155,8 +155,8 @@ async def run_variant(name: str, exp_id: str, body: dict[str, Any]) -> dict[str, detail=f"Variant '{variant_name}' not found in experiment '{exp_id}'", ) - from fireflyframework_genai.studio.codegen.models import GraphModel - from fireflyframework_genai.studio.execution.compiler import CompilationError, compile_graph + from fireflyframework_agentic.studio.codegen.models import GraphModel + from fireflyframework_agentic.studio.execution.compiler import CompilationError, compile_graph graph = GraphModel.model_validate(graph_data) try: diff --git a/src/fireflyframework_genai/studio/api/files.py b/src/fireflyframework_agentic/studio/api/files.py similarity index 98% rename from src/fireflyframework_genai/studio/api/files.py rename to src/fireflyframework_agentic/studio/api/files.py index eda626e2..ba8dcadb 100644 --- a/src/fireflyframework_genai/studio/api/files.py +++ b/src/fireflyframework_agentic/studio/api/files.py @@ -25,7 +25,7 @@ from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] -from fireflyframework_genai.studio.projects import ProjectManager +from fireflyframework_agentic.studio.projects import ProjectManager # Directories to exclude from recursive file listings. _EXCLUDED_DIRS: set[str] = { diff --git a/src/fireflyframework_genai/studio/api/graphql_api.py b/src/fireflyframework_agentic/studio/api/graphql_api.py similarity index 96% rename from src/fireflyframework_genai/studio/api/graphql_api.py rename to src/fireflyframework_agentic/studio/api/graphql_api.py index 75e50f10..c6eac77a 100644 --- a/src/fireflyframework_genai/studio/api/graphql_api.py +++ b/src/fireflyframework_agentic/studio/api/graphql_api.py @@ -32,7 +32,7 @@ import logging from typing import Any -from fireflyframework_genai.studio.projects import ProjectManager +from fireflyframework_agentic.studio.projects import ProjectManager logger = logging.getLogger(__name__) @@ -131,7 +131,7 @@ def runtime_status(self, project: str) -> RuntimeStatus: If no runtime is active, returns a default "stopped" status. """ - from fireflyframework_genai.studio.api.project_api import _runtimes + from fireflyframework_agentic.studio.api.project_api import _runtimes runtime = _runtimes.get(project) if runtime is not None: @@ -168,12 +168,12 @@ async def run_pipeline(self, project: str, input: str) -> ExecutionResult: import time import uuid - from fireflyframework_genai.studio.codegen.models import ( + from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, ) - from fireflyframework_genai.studio.execution.compiler import compile_graph + from fireflyframework_agentic.studio.execution.compiler import compile_graph execution_id = str(uuid.uuid4()) diff --git a/src/fireflyframework_genai/studio/api/monitoring.py b/src/fireflyframework_agentic/studio/api/monitoring.py similarity index 94% rename from src/fireflyframework_genai/studio/api/monitoring.py rename to src/fireflyframework_agentic/studio/api/monitoring.py index 4fd9dee8..b6930abb 100644 --- a/src/fireflyframework_genai/studio/api/monitoring.py +++ b/src/fireflyframework_agentic/studio/api/monitoring.py @@ -38,7 +38,7 @@ def create_monitoring_router() -> APIRouter: @router.get("/usage") async def get_usage() -> dict[str, Any]: - from fireflyframework_genai.observability.usage import default_usage_tracker + from fireflyframework_agentic.observability.usage import default_usage_tracker return default_usage_tracker.get_summary().model_dump() diff --git a/src/fireflyframework_genai/studio/api/oracle.py b/src/fireflyframework_agentic/studio/api/oracle.py similarity index 93% rename from src/fireflyframework_genai/studio/api/oracle.py rename to src/fireflyframework_agentic/studio/api/oracle.py index 72189dad..b3c89f26 100644 --- a/src/fireflyframework_genai/studio/api/oracle.py +++ b/src/fireflyframework_agentic/studio/api/oracle.py @@ -58,7 +58,7 @@ def create_oracle_router() -> APIRouter: @router.get("/api/oracle/{project}/insights") async def get_insights(project: str): - from fireflyframework_genai.studio.assistant.oracle_notifications import ( + from fireflyframework_agentic.studio.assistant.oracle_notifications import ( list_insights, ) @@ -67,7 +67,7 @@ async def get_insights(project: str): @router.post("/api/oracle/{project}/insights/{insight_id}/approve") async def approve_insight(project: str, insight_id: str): - from fireflyframework_genai.studio.assistant.oracle_notifications import ( + from fireflyframework_agentic.studio.assistant.oracle_notifications import ( update_insight_status, ) @@ -81,7 +81,7 @@ async def approve_insight(project: str, insight_id: str): @router.post("/api/oracle/{project}/insights/{insight_id}/skip") async def skip_insight(project: str, insight_id: str): - from fireflyframework_genai.studio.assistant.oracle_notifications import ( + from fireflyframework_agentic.studio.assistant.oracle_notifications import ( update_insight_status, ) @@ -96,20 +96,20 @@ async def skip_insight(project: str, insight_id: str): @router.get("/api/oracle/{project}/chat-history") async def get_oracle_chat_history(project: str): - from fireflyframework_genai.studio.assistant.history import load_oracle_history + from fireflyframework_agentic.studio.assistant.history import load_oracle_history return load_oracle_history(project) @router.post("/api/oracle/{project}/chat-history") async def save_oracle_chat_history(project: str, body: _SaveChatHistoryBody): - from fireflyframework_genai.studio.assistant.history import save_oracle_history + from fireflyframework_agentic.studio.assistant.history import save_oracle_history save_oracle_history(project, body.messages) return {"status": "saved"} @router.delete("/api/oracle/{project}/chat-history") async def delete_oracle_chat_history(project: str): - from fireflyframework_genai.studio.assistant.history import clear_oracle_history + from fireflyframework_agentic.studio.assistant.history import clear_oracle_history clear_oracle_history(project) return {"status": "cleared"} @@ -131,10 +131,10 @@ def _get_canvas() -> dict[str, Any]: # Create the Oracle agent try: - from fireflyframework_genai.studio.assistant.oracle import ( + from fireflyframework_agentic.studio.assistant.oracle import ( create_oracle_agent, ) - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings() user_name = settings.user_profile.name or "" @@ -184,7 +184,7 @@ def _get_canvas() -> dict[str, Any]: # Extract suggestions from tool calls insights = _extract_oracle_insights(result) for insight_data in insights: - from fireflyframework_genai.studio.assistant.oracle_notifications import ( + from fireflyframework_agentic.studio.assistant.oracle_notifications import ( add_insight, create_insight, ) @@ -238,7 +238,7 @@ def _get_canvas() -> dict[str, Any]: insights = _extract_oracle_insights(result) for insight_data in insights: - from fireflyframework_genai.studio.assistant.oracle_notifications import ( + from fireflyframework_agentic.studio.assistant.oracle_notifications import ( add_insight, create_insight, ) @@ -305,7 +305,7 @@ def _get_canvas() -> dict[str, Any]: # Extract any insights produced during chat chat_insights = _extract_oracle_insights(result) for insight_data in chat_insights: - from fireflyframework_genai.studio.assistant.oracle_notifications import ( + from fireflyframework_agentic.studio.assistant.oracle_notifications import ( add_insight, create_insight, ) @@ -380,7 +380,7 @@ def _build_shared_context_for_oracle(project: str, canvas_state: dict[str, Any]) assembled server-side from persisted conversation histories. """ try: - from fireflyframework_genai.studio.assistant.shared_context import ( + from fireflyframework_agentic.studio.assistant.shared_context import ( build_shared_context, ) diff --git a/src/fireflyframework_genai/studio/api/project_api.py b/src/fireflyframework_agentic/studio/api/project_api.py similarity index 96% rename from src/fireflyframework_genai/studio/api/project_api.py rename to src/fireflyframework_agentic/studio/api/project_api.py index 5675e27c..659dc5a0 100644 --- a/src/fireflyframework_genai/studio/api/project_api.py +++ b/src/fireflyframework_agentic/studio/api/project_api.py @@ -33,7 +33,7 @@ from fastapi import APIRouter, HTTPException, UploadFile # type: ignore[import-not-found] from pydantic import BaseModel # type: ignore[import-not-found] -from fireflyframework_genai.studio.projects import ProjectManager +from fireflyframework_agentic.studio.projects import ProjectManager logger = logging.getLogger(__name__) @@ -87,7 +87,7 @@ def _load_graph_model(project_manager: ProjectManager, name: str) -> Any: Raises HTTPException(404) if the pipeline does not exist. """ - from fireflyframework_genai.studio.codegen.models import GraphEdge, GraphModel, GraphNode + from fireflyframework_agentic.studio.codegen.models import GraphEdge, GraphModel, GraphNode try: graph_dict = project_manager.load_pipeline(name, "main") @@ -140,7 +140,7 @@ async def run_pipeline(name: str, body: RunRequest) -> dict[str, Any]: """Execute the project's main pipeline synchronously.""" _assert_project_exists(project_manager, name) - from fireflyframework_genai.studio.execution.compiler import compile_graph + from fireflyframework_agentic.studio.execution.compiler import compile_graph graph_model = _load_graph_model(project_manager, name) @@ -179,7 +179,7 @@ async def run_pipeline_async(name: str, body: RunRequest) -> dict[str, Any]: """Start pipeline execution asynchronously; returns immediately.""" _assert_project_exists(project_manager, name) - from fireflyframework_genai.studio.execution.compiler import compile_graph + from fireflyframework_agentic.studio.execution.compiler import compile_graph graph_model = _load_graph_model(project_manager, name) @@ -253,7 +253,7 @@ async def upload_file(name: str, file: UploadFile) -> dict[str, Any]: """Trigger pipeline execution via file upload.""" _assert_project_exists(project_manager, name) - from fireflyframework_genai.studio.execution.compiler import compile_graph + from fireflyframework_agentic.studio.execution.compiler import compile_graph graph_model = _load_graph_model(project_manager, name) @@ -339,7 +339,7 @@ async def start_runtime(name: str) -> dict[str, Any]: """Start the project runtime (queue consumers, schedulers).""" _assert_project_exists(project_manager, name) - from fireflyframework_genai.studio.runtime import ProjectRuntime + from fireflyframework_agentic.studio.runtime import ProjectRuntime graph_model = _load_graph_model(project_manager, name) diff --git a/src/fireflyframework_genai/studio/api/projects.py b/src/fireflyframework_agentic/studio/api/projects.py similarity index 95% rename from src/fireflyframework_genai/studio/api/projects.py rename to src/fireflyframework_agentic/studio/api/projects.py index 0aeece6b..58195b3c 100644 --- a/src/fireflyframework_genai/studio/api/projects.py +++ b/src/fireflyframework_agentic/studio/api/projects.py @@ -26,7 +26,7 @@ from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] from pydantic import BaseModel # type: ignore[import-not-found] -from fireflyframework_genai.studio.projects import ProjectManager +from fireflyframework_agentic.studio.projects import ProjectManager # --------------------------------------------------------------------------- # Request / response models @@ -142,7 +142,7 @@ async def save_pipeline(project_name: str, pipeline_name: str, body: SavePipelin # Create a version history entry for every save try: - from fireflyframework_genai.studio.versioning import ProjectVersioning + from fireflyframework_agentic.studio.versioning import ProjectVersioning project_dir = manager._safe_path(project_name) versioning = ProjectVersioning(project_dir) @@ -169,7 +169,7 @@ def create_versioning_router(project_manager: ProjectManager) -> APIRouter: @router.get("/{name}/history") async def get_project_history(name: str): - from fireflyframework_genai.studio.versioning import ProjectVersioning + from fireflyframework_agentic.studio.versioning import ProjectVersioning project_dir = project_manager._safe_path(name) if not project_dir.exists(): @@ -179,7 +179,7 @@ async def get_project_history(name: str): @router.post("/{name}/restore") async def restore_project_version(name: str, body: dict): - from fireflyframework_genai.studio.versioning import ProjectVersioning + from fireflyframework_agentic.studio.versioning import ProjectVersioning project_dir = project_manager._safe_path(name) if not project_dir.exists(): @@ -193,7 +193,7 @@ async def restore_project_version(name: str, body: dict): @router.post("/{name}/bookmark") async def bookmark_project_version(name: str, body: dict): - from fireflyframework_genai.studio.versioning import ProjectVersioning + from fireflyframework_agentic.studio.versioning import ProjectVersioning project_dir = project_manager._safe_path(name) if not project_dir.exists(): diff --git a/src/fireflyframework_genai/studio/api/registry.py b/src/fireflyframework_agentic/studio/api/registry.py similarity index 90% rename from src/fireflyframework_genai/studio/api/registry.py rename to src/fireflyframework_agentic/studio/api/registry.py index 8e1d319a..27bd7e99 100644 --- a/src/fireflyframework_genai/studio/api/registry.py +++ b/src/fireflyframework_agentic/studio/api/registry.py @@ -24,9 +24,9 @@ from fastapi import APIRouter # type: ignore[import-not-found] -from fireflyframework_genai.agents.registry import agent_registry -from fireflyframework_genai.reasoning.registry import reasoning_registry -from fireflyframework_genai.tools.registry import tool_registry +from fireflyframework_agentic.agents.registry import agent_registry +from fireflyframework_agentic.reasoning.registry import reasoning_registry +from fireflyframework_agentic.tools.registry import tool_registry def create_registry_router() -> APIRouter: diff --git a/src/fireflyframework_genai/studio/api/settings.py b/src/fireflyframework_agentic/studio/api/settings.py similarity index 99% rename from src/fireflyframework_genai/studio/api/settings.py rename to src/fireflyframework_agentic/studio/api/settings.py index 819f9f78..0ab48651 100644 --- a/src/fireflyframework_genai/studio/api/settings.py +++ b/src/fireflyframework_agentic/studio/api/settings.py @@ -27,7 +27,7 @@ from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] from pydantic import BaseModel # type: ignore[import-not-found] -from fireflyframework_genai.studio.settings import ( +from fireflyframework_agentic.studio.settings import ( DEFAULT_SETTINGS_PATH, ModelDefaults, ProviderCredentials, diff --git a/src/fireflyframework_genai/studio/api/smith.py b/src/fireflyframework_agentic/studio/api/smith.py similarity index 96% rename from src/fireflyframework_genai/studio/api/smith.py rename to src/fireflyframework_agentic/studio/api/smith.py index c0ae9bb0..4cffc024 100644 --- a/src/fireflyframework_genai/studio/api/smith.py +++ b/src/fireflyframework_agentic/studio/api/smith.py @@ -92,33 +92,33 @@ def create_smith_router() -> APIRouter: @router.get("/api/smith/{project}/history") async def get_smith_history(project: str): - from fireflyframework_genai.studio.assistant.history import load_smith_history + from fireflyframework_agentic.studio.assistant.history import load_smith_history return load_smith_history(project) @router.post("/api/smith/{project}/history") async def save_smith_history_endpoint(project: str, body: _SaveHistoryBody): - from fireflyframework_genai.studio.assistant.history import save_smith_history + from fireflyframework_agentic.studio.assistant.history import save_smith_history save_smith_history(project, body.messages) return {"status": "saved"} @router.delete("/api/smith/{project}/history") async def delete_smith_history(project: str): - from fireflyframework_genai.studio.assistant.history import clear_smith_history + from fireflyframework_agentic.studio.assistant.history import clear_smith_history clear_smith_history(project) return {"status": "cleared"} @router.get("/api/smith/{project}/files") async def get_smith_files(project: str): - from fireflyframework_genai.studio.assistant.history import load_smith_files + from fireflyframework_agentic.studio.assistant.history import load_smith_files return load_smith_files(project) @router.post("/api/smith/{project}/files") async def save_smith_files_endpoint(project: str, body: _SaveFilesBody): - from fireflyframework_genai.studio.assistant.history import save_smith_files + from fireflyframework_agentic.studio.assistant.history import save_smith_files save_smith_files(project, body.files) return {"status": "saved"} @@ -207,10 +207,10 @@ async def _handle_generate( the final code, and ``smith_response_complete`` when done. """ try: - from fireflyframework_genai.studio.assistant.smith import ( + from fireflyframework_agentic.studio.assistant.smith import ( generate_code_with_smith, ) - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings() settings_dict = { @@ -233,7 +233,7 @@ async def _handle_generate( # Build shared cross-agent context for generation shared_context = "" try: - from fireflyframework_genai.studio.assistant.shared_context import ( + from fireflyframework_agentic.studio.assistant.shared_context import ( build_shared_context, ) @@ -304,10 +304,10 @@ async def _handle_chat( return try: - from fireflyframework_genai.studio.assistant.smith import ( + from fireflyframework_agentic.studio.assistant.smith import ( create_smith_agent, ) - from fireflyframework_genai.studio.settings import load_settings as _load_settings + from fireflyframework_agentic.studio.settings import load_settings as _load_settings _user_name = "" try: @@ -321,7 +321,7 @@ async def _handle_chat( # Enrich the prompt with shared cross-agent context and canvas state context_parts: list[str] = [] try: - from fireflyframework_genai.studio.assistant.shared_context import ( + from fireflyframework_agentic.studio.assistant.shared_context import ( build_shared_context, ) @@ -428,7 +428,7 @@ async def _handle_sync_canvas( # Keep the module-level singleton in smith.py in sync so that the # get_canvas_state tool returns current data. - from fireflyframework_genai.studio.assistant.smith import update_canvas_state + from fireflyframework_agentic.studio.assistant.smith import update_canvas_state update_canvas_state(nodes, edges) await websocket.send_json({"type": "canvas_synced"}) diff --git a/src/fireflyframework_genai/studio/api/tunnel.py b/src/fireflyframework_agentic/studio/api/tunnel.py similarity index 97% rename from src/fireflyframework_genai/studio/api/tunnel.py rename to src/fireflyframework_agentic/studio/api/tunnel.py index 66b1e46a..7e36fa02 100644 --- a/src/fireflyframework_genai/studio/api/tunnel.py +++ b/src/fireflyframework_agentic/studio/api/tunnel.py @@ -20,7 +20,7 @@ from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] -from fireflyframework_genai.studio.tunnel import TunnelManager +from fireflyframework_agentic.studio.tunnel import TunnelManager _tunnel: TunnelManager | None = None diff --git a/src/fireflyframework_genai/studio/assistant/__init__.py b/src/fireflyframework_agentic/studio/assistant/__init__.py similarity index 92% rename from src/fireflyframework_genai/studio/assistant/__init__.py rename to src/fireflyframework_agentic/studio/assistant/__init__.py index 7febda1b..43c60be8 100644 --- a/src/fireflyframework_genai/studio/assistant/__init__.py +++ b/src/fireflyframework_agentic/studio/assistant/__init__.py @@ -14,7 +14,7 @@ """Studio AI assistant subpackage.""" -from fireflyframework_genai.studio.assistant.agent import ( +from fireflyframework_agentic.studio.assistant.agent import ( CanvasState, create_canvas_tools, create_studio_assistant, diff --git a/src/fireflyframework_genai/studio/assistant/agent.py b/src/fireflyframework_agentic/studio/assistant/agent.py similarity index 96% rename from src/fireflyframework_genai/studio/assistant/agent.py rename to src/fireflyframework_agentic/studio/assistant/agent.py index 4659de9d..f9637af4 100644 --- a/src/fireflyframework_genai/studio/assistant/agent.py +++ b/src/fireflyframework_agentic/studio/assistant/agent.py @@ -29,9 +29,9 @@ from pydantic import BaseModel, Field, PrivateAttr -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.tools.base import BaseTool -from fireflyframework_genai.tools.decorators import firefly_tool +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.tools.base import BaseTool +from fireflyframework_agentic.tools.decorators import firefly_tool logger = logging.getLogger(__name__) @@ -467,7 +467,7 @@ def create_registry_tools() -> list[BaseTool]: ) async def list_registered_agents() -> str: """Query the agent registry for all available agents.""" - from fireflyframework_genai.agents.registry import agent_registry + from fireflyframework_agentic.agents.registry import agent_registry agents = agent_registry.list_agents() return json.dumps( @@ -481,7 +481,7 @@ async def list_registered_agents() -> str: ) async def list_registered_tools() -> str: """Query the tool registry for all available tools.""" - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.tools.registry import tool_registry tools = tool_registry.list_tools() return json.dumps( @@ -498,7 +498,7 @@ async def list_registered_tools() -> str: ) async def list_reasoning_patterns() -> str: """Query the reasoning pattern registry.""" - from fireflyframework_genai.reasoning.registry import reasoning_registry + from fireflyframework_agentic.reasoning.registry import reasoning_registry patterns = reasoning_registry.list_patterns() return json.dumps(patterns) @@ -506,7 +506,7 @@ async def list_reasoning_patterns() -> str: @firefly_tool( "get_framework_docs", description=( - "Get live documentation about the Firefly GenAI Framework. " + "Get live documentation about the Firefly Agentic Framework. " "Returns version, available modules, agent templates, tool system, " "reasoning patterns, memory system, pipeline engine, and more. " "Use this when you need up-to-date information about framework capabilities." @@ -522,7 +522,7 @@ async def get_framework_docs() -> str: # Framework version try: - from fireflyframework_genai._version import __version__ + from fireflyframework_agentic._version import __version__ docs["version"] = __version__ except Exception: @@ -531,21 +531,21 @@ async def get_framework_docs() -> str: # Available modules and their docstrings module_docs = {} for mod_name in [ - "fireflyframework_genai.agents", - "fireflyframework_genai.tools", - "fireflyframework_genai.reasoning", - "fireflyframework_genai.memory", - "fireflyframework_genai.pipeline", - "fireflyframework_genai.prompts", - "fireflyframework_genai.observability", - "fireflyframework_genai.security", - "fireflyframework_genai.content", - "fireflyframework_genai.experiments", - "fireflyframework_genai.explainability", - "fireflyframework_genai.exposure", - "fireflyframework_genai.lab", - "fireflyframework_genai.validation", - "fireflyframework_genai.resilience", + "fireflyframework_agentic.agents", + "fireflyframework_agentic.tools", + "fireflyframework_agentic.reasoning", + "fireflyframework_agentic.memory", + "fireflyframework_agentic.pipeline", + "fireflyframework_agentic.prompts", + "fireflyframework_agentic.observability", + "fireflyframework_agentic.security", + "fireflyframework_agentic.content", + "fireflyframework_agentic.experiments", + "fireflyframework_agentic.explainability", + "fireflyframework_agentic.exposure", + "fireflyframework_agentic.lab", + "fireflyframework_agentic.validation", + "fireflyframework_agentic.resilience", ]: try: mod = importlib.import_module(mod_name) @@ -556,7 +556,7 @@ async def get_framework_docs() -> str: # Agent templates try: - from fireflyframework_genai.agents import agent_registry + from fireflyframework_agentic.agents import agent_registry agents = agent_registry.list_agents() docs["agent_templates"] = [{"name": a.name, "description": a.description} for a in agents] @@ -565,7 +565,7 @@ async def get_framework_docs() -> str: # Registered tools (including custom) try: - from fireflyframework_genai.tools.registry import tool_registry as tr + from fireflyframework_agentic.tools.registry import tool_registry as tr tools = tr.list_tools() docs["tools"] = [{"name": t.name, "description": t.description[:100]} for t in tools] @@ -574,7 +574,7 @@ async def get_framework_docs() -> str: # Reasoning patterns try: - from fireflyframework_genai.reasoning.registry import reasoning_registry + from fireflyframework_agentic.reasoning.registry import reasoning_registry docs["reasoning_patterns"] = reasoning_registry.list_patterns() except Exception: @@ -582,7 +582,7 @@ async def get_framework_docs() -> str: # Memory backends try: - mod = importlib.import_module("fireflyframework_genai.memory") + mod = importlib.import_module("fireflyframework_agentic.memory") classes = [ name for name, obj in inspect.getmembers(mod, inspect.isclass) @@ -594,7 +594,7 @@ async def get_framework_docs() -> str: # Pipeline node types try: - mod = importlib.import_module("fireflyframework_genai.pipeline") + mod = importlib.import_module("fireflyframework_agentic.pipeline") classes = [ name for name, obj in inspect.getmembers(mod, inspect.isclass) if "Node" in name or "Pipeline" in name ] @@ -674,8 +674,8 @@ async def read_framework_doc(topic: str) -> str: ) async def get_tool_status() -> str: """Check credential status for tools that require external credentials.""" - from fireflyframework_genai.studio.settings import load_settings - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.studio.settings import load_settings + from fireflyframework_agentic.tools.registry import tool_registry settings = load_settings() tc = settings.tool_credentials @@ -734,7 +734,7 @@ def create_custom_tool_tools() -> list[BaseTool]: ) async def list_custom_tools() -> str: """Query the custom tools directory for all saved definitions.""" - from fireflyframework_genai.studio.custom_tools import CustomToolManager + from fireflyframework_agentic.studio.custom_tools import CustomToolManager manager = CustomToolManager() tools = manager.list_all() @@ -776,7 +776,7 @@ async def create_custom_tool( api_auth_type: str = "none", ) -> str: """Create and register a new custom tool.""" - from fireflyframework_genai.studio.custom_tools import ( + from fireflyframework_agentic.studio.custom_tools import ( CustomToolDefinition, CustomToolManager, ) @@ -802,7 +802,7 @@ async def create_custom_tool( # Register the tool at runtime try: tool = manager.create_runtime_tool(definition) - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.tools.registry import tool_registry tool_registry.register(tool) except Exception as exc: @@ -1084,7 +1084,7 @@ async def present_plan( _FRAMEWORK_KNOWLEDGE = """\ FIREFLY GENAI FRAMEWORK REFERENCE (your deep knowledge): -You have complete mastery of the Firefly GenAI Framework. This is your domain. +You have complete mastery of the Firefly Agentic Framework. This is your domain. NODE TYPES AND CONFIGURATION: @@ -1280,7 +1280,7 @@ def _build_instructions(settings: Any = None, settings_path: Any = None) -> str: is ``None``. """ if settings is None: - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings(path=settings_path) @@ -1349,7 +1349,7 @@ def _resolve_assistant_model() -> str: """ import os - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings() default_model = settings.model_defaults.default_model @@ -1393,7 +1393,7 @@ def create_studio_assistant(canvas: CanvasState | None = None) -> FireflyAgent: if canvas is None: canvas = CanvasState() - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings() diff --git a/src/fireflyframework_genai/studio/assistant/history.py b/src/fireflyframework_agentic/studio/assistant/history.py similarity index 100% rename from src/fireflyframework_genai/studio/assistant/history.py rename to src/fireflyframework_agentic/studio/assistant/history.py diff --git a/src/fireflyframework_genai/studio/assistant/oracle.py b/src/fireflyframework_agentic/studio/assistant/oracle.py similarity index 98% rename from src/fireflyframework_genai/studio/assistant/oracle.py rename to src/fireflyframework_agentic/studio/assistant/oracle.py index 0f532f84..5ad4bc30 100644 --- a/src/fireflyframework_genai/studio/assistant/oracle.py +++ b/src/fireflyframework_agentic/studio/assistant/oracle.py @@ -29,9 +29,9 @@ import logging from typing import Any -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.tools.base import BaseTool -from fireflyframework_genai.tools.decorators import firefly_tool +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.tools.base import BaseTool +from fireflyframework_agentic.tools.decorators import firefly_tool logger = logging.getLogger(__name__) @@ -429,7 +429,7 @@ async def review_agent_setup() -> str: def _build_oracle_instructions(user_name: str) -> str: """Build Oracle instructions personalised with the user's name.""" - from fireflyframework_genai.studio.assistant.agent import _FRAMEWORK_KNOWLEDGE + from fireflyframework_agentic.studio.assistant.agent import _FRAMEWORK_KNOWLEDGE personality = _THE_ORACLE_PERSONALITY.replace("{user_name_placeholder}", user_name or "friend") return ( @@ -503,7 +503,7 @@ def create_oracle_agent( Returns: A read-only :class:`FireflyAgent` configured for pipeline analysis. """ - from fireflyframework_genai.studio.assistant.agent import _resolve_assistant_model + from fireflyframework_agentic.studio.assistant.agent import _resolve_assistant_model tools = create_oracle_tools(get_canvas_state) model = _resolve_assistant_model() diff --git a/src/fireflyframework_genai/studio/assistant/oracle_notifications.py b/src/fireflyframework_agentic/studio/assistant/oracle_notifications.py similarity index 100% rename from src/fireflyframework_genai/studio/assistant/oracle_notifications.py rename to src/fireflyframework_agentic/studio/assistant/oracle_notifications.py diff --git a/src/fireflyframework_genai/studio/assistant/shared_context.py b/src/fireflyframework_agentic/studio/assistant/shared_context.py similarity index 91% rename from src/fireflyframework_genai/studio/assistant/shared_context.py rename to src/fireflyframework_agentic/studio/assistant/shared_context.py index f2c05d20..7b1a31e6 100644 --- a/src/fireflyframework_genai/studio/assistant/shared_context.py +++ b/src/fireflyframework_agentic/studio/assistant/shared_context.py @@ -42,8 +42,8 @@ def build_shared_context( # 1. Project metadata try: - from fireflyframework_genai.studio.config import StudioConfig - from fireflyframework_genai.studio.projects import ProjectManager + from fireflyframework_agentic.studio.config import StudioConfig + from fireflyframework_agentic.studio.projects import ProjectManager pm = ProjectManager(StudioConfig().projects_dir) project = next((p for p in pm.list_all() if p.name == project_name), None) @@ -63,7 +63,7 @@ def build_shared_context( # 3. Recent Architect conversation if exclude_agent != "architect": try: - from fireflyframework_genai.studio.assistant.history import ( + from fireflyframework_agentic.studio.assistant.history import ( load_chat_history, ) @@ -76,7 +76,7 @@ def build_shared_context( # 4. Recent Smith conversation if exclude_agent != "smith": try: - from fireflyframework_genai.studio.assistant.history import ( + from fireflyframework_agentic.studio.assistant.history import ( load_smith_history, ) @@ -89,7 +89,7 @@ def build_shared_context( # 5. Recent Oracle conversation if exclude_agent != "oracle": try: - from fireflyframework_genai.studio.assistant.history import ( + from fireflyframework_agentic.studio.assistant.history import ( load_oracle_history, ) diff --git a/src/fireflyframework_genai/studio/assistant/smith.py b/src/fireflyframework_agentic/studio/assistant/smith.py similarity index 94% rename from src/fireflyframework_genai/studio/assistant/smith.py rename to src/fireflyframework_agentic/studio/assistant/smith.py index ee3a43a0..ed4e9b06 100644 --- a/src/fireflyframework_genai/studio/assistant/smith.py +++ b/src/fireflyframework_agentic/studio/assistant/smith.py @@ -15,7 +15,7 @@ """Agent Smith: AI-powered code generation from visual pipeline graphs. Smith is an LLM agent that converts canvas graph JSON into production-ready -Python code using the Firefly GenAI Framework API. Unlike the template-based +Python code using the Firefly Agentic Framework API. Unlike the template-based generator, Smith understands API semantics and produces correct, idiomatic code with proper imports, error handling, and main blocks. @@ -30,8 +30,8 @@ import re from typing import Any -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.tools.decorators import firefly_tool +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.tools.decorators import firefly_tool logger = logging.getLogger(__name__) @@ -145,7 +145,7 @@ def update_canvas_state(nodes: list, edges: list) -> None: EXECUTION GUIDANCE: After generating code, always include a brief "How to run" section covering: -- Required pip packages (fireflyframework-genai + any extras) +- Required pip packages (fireflyframework-agentic + any extras) - Required environment variables (API keys referenced in the code) - Run command: python main.py - Expected behavior description @@ -154,7 +154,7 @@ def update_canvas_state(nodes: list, edges: list) -> None: ## Agents ```python -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent agent = FireflyAgent( name="my_agent", @@ -168,12 +168,12 @@ def update_canvas_state(nodes: list, edges: list) -> None: ## Pipeline Builder ```python -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import ( +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import ( AgentStep, CallableStep, ReasoningStep, BranchStep, FanOutStep, FanInStep, ) -from fireflyframework_genai.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.context import PipelineContext pipeline = ( PipelineBuilder("pipeline_name") @@ -199,7 +199,7 @@ def update_canvas_state(nodes: list, edges: list) -> None: ## Tool Registry ```python -from fireflyframework_genai.tools.registry import tool_registry +from fireflyframework_agentic.tools.registry import tool_registry tool = tool_registry.get("tool_name") # calculator, datetime, http, etc. @@ -209,7 +209,7 @@ async def use_tool(context: PipelineContext, inputs: dict): ## Reasoning Patterns ```python -from fireflyframework_genai.reasoning.registry import reasoning_registry +from fireflyframework_agentic.reasoning.registry import reasoning_registry pattern = reasoning_registry.get("react") # or chain_of_thought, plan_and_execute, etc. # Use with: ReasoningStep(pattern, agent) @@ -217,8 +217,8 @@ async def use_tool(context: PipelineContext, inputs: dict): ## Memory ```python -from fireflyframework_genai.memory.manager import MemoryManager -from fireflyframework_genai.memory.store import FileStore +from fireflyframework_agentic.memory.manager import MemoryManager +from fireflyframework_agentic.memory.store import FileStore memory = MemoryManager(store=FileStore(base_dir="./memory")) context = PipelineContext(memory=memory) @@ -326,7 +326,7 @@ def create_smith_agent(user_name: str = "") -> FireflyAgent: """ tools = _create_smith_tools() - from fireflyframework_genai.studio.assistant.agent import _resolve_assistant_model + from fireflyframework_agentic.studio.assistant.agent import _resolve_assistant_model model = _resolve_assistant_model() @@ -374,7 +374,7 @@ def _create_smith_tools() -> list: @firefly_tool( "get_framework_docs", - description="Get live documentation about the Firefly GenAI Framework modules and capabilities.", + description="Get live documentation about the Firefly Agentic Framework modules and capabilities.", auto_register=False, ) async def get_framework_docs() -> str: @@ -382,7 +382,7 @@ async def get_framework_docs() -> str: docs: dict[str, Any] = {} try: - from fireflyframework_genai._version import __version__ + from fireflyframework_agentic._version import __version__ docs["version"] = __version__ except Exception: @@ -390,11 +390,11 @@ async def get_framework_docs() -> str: module_docs = {} for mod_name in [ - "fireflyframework_genai.agents", - "fireflyframework_genai.tools", - "fireflyframework_genai.reasoning", - "fireflyframework_genai.memory", - "fireflyframework_genai.pipeline", + "fireflyframework_agentic.agents", + "fireflyframework_agentic.tools", + "fireflyframework_agentic.reasoning", + "fireflyframework_agentic.memory", + "fireflyframework_agentic.pipeline", ]: try: mod = importlib.import_module(mod_name) @@ -404,7 +404,7 @@ async def get_framework_docs() -> str: docs["modules"] = module_docs try: - from fireflyframework_genai.tools.registry import tool_registry as tr + from fireflyframework_agentic.tools.registry import tool_registry as tr tools = tr.list_tools() docs["tools"] = [{"name": t.name, "description": t.description[:80]} for t in tools] @@ -412,7 +412,7 @@ async def get_framework_docs() -> str: docs["tools"] = [] try: - from fireflyframework_genai.reasoning.registry import reasoning_registry + from fireflyframework_agentic.reasoning.registry import reasoning_registry docs["reasoning_patterns"] = reasoning_registry.list_patterns() except Exception: @@ -472,7 +472,7 @@ async def read_framework_doc(topic: str) -> str: auto_register=False, ) async def get_tool_status() -> str: - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings() tc = settings.tool_credentials @@ -598,7 +598,7 @@ async def get_canvas_state() -> str: @firefly_tool("get_project_info", description="Get current project name and user profile", auto_register=False) async def get_project_info() -> str: - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings try: settings = load_settings() diff --git a/src/fireflyframework_genai/studio/cli.py b/src/fireflyframework_agentic/studio/cli.py similarity index 94% rename from src/fireflyframework_genai/studio/cli.py rename to src/fireflyframework_agentic/studio/cli.py index 71803539..a37d8051 100644 --- a/src/fireflyframework_genai/studio/cli.py +++ b/src/fireflyframework_agentic/studio/cli.py @@ -38,7 +38,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: """ parser = argparse.ArgumentParser( prog="firefly", - description="Firefly GenAI Framework CLI", + description="Firefly Agentic Framework CLI", ) subparsers = parser.add_subparsers(dest="command") @@ -121,8 +121,8 @@ def _run_studio(args: argparse.Namespace) -> None: """Launch the Firefly Agentic Studio server.""" import uvicorn # type: ignore[import-not-found] - from fireflyframework_genai.studio.config import StudioConfig - from fireflyframework_genai.studio.server import create_studio_app + from fireflyframework_agentic.studio.config import StudioConfig + from fireflyframework_agentic.studio.server import create_studio_app config = StudioConfig( _env_file=None, # type: ignore[call-arg] # pydantic-settings init kwarg @@ -153,7 +153,7 @@ def _run_expose(args: argparse.Namespace) -> None: """Start a Cloudflare Tunnel to expose the local Studio.""" import asyncio - from fireflyframework_genai.studio.tunnel import TunnelManager + from fireflyframework_agentic.studio.tunnel import TunnelManager tm = TunnelManager(port=args.port) diff --git a/src/fireflyframework_genai/studio/codegen/__init__.py b/src/fireflyframework_agentic/studio/codegen/__init__.py similarity index 86% rename from src/fireflyframework_genai/studio/codegen/__init__.py rename to src/fireflyframework_agentic/studio/codegen/__init__.py index db112e41..38f94806 100644 --- a/src/fireflyframework_genai/studio/codegen/__init__.py +++ b/src/fireflyframework_agentic/studio/codegen/__init__.py @@ -16,8 +16,8 @@ from __future__ import annotations -from fireflyframework_genai.studio.codegen.generator import generate_python -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.studio.codegen.generator import generate_python +from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, diff --git a/src/fireflyframework_genai/studio/codegen/generator.py b/src/fireflyframework_agentic/studio/codegen/generator.py similarity index 95% rename from src/fireflyframework_genai/studio/codegen/generator.py rename to src/fireflyframework_agentic/studio/codegen/generator.py index dab6c4df..1143e6f2 100644 --- a/src/fireflyframework_genai/studio/codegen/generator.py +++ b/src/fireflyframework_agentic/studio/codegen/generator.py @@ -14,7 +14,7 @@ """Code generator: converts a visual graph model into executable Python code. -The generated code uses the fireflyframework-genai public API so that users +The generated code uses the fireflyframework-agentic public API so that users can "eject" their visual pipeline into a standalone Python script. All node types are supported: agent, tool, reasoning, condition, memory, validator, custom_code, fan_out, fan_in, input, and output. @@ -25,7 +25,7 @@ from pathlib import Path from typing import Any -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.studio.codegen.models import ( GraphModel, GraphNode, NodeType, @@ -43,7 +43,7 @@ def _get_default_model(settings_path: Path | None = None) -> str: """Read the user's configured default model from settings.""" - from fireflyframework_genai.studio.settings import load_settings + from fireflyframework_agentic.studio.settings import load_settings settings = load_settings(path=settings_path) return settings.model_defaults.default_model or _FALLBACK_MODEL @@ -108,17 +108,17 @@ def _emit_imports(type_set: set[NodeType], has_edges: bool) -> list[str]: imports: list[str] = [] if NodeType.AGENT in type_set: - imports.append("from fireflyframework_genai.agents.base import FireflyAgent") + imports.append("from fireflyframework_agentic.agents.base import FireflyAgent") if NodeType.TOOL in type_set: - imports.append("from fireflyframework_genai.tools.registry import tool_registry") + imports.append("from fireflyframework_agentic.tools.registry import tool_registry") if NodeType.REASONING in type_set: - imports.append("from fireflyframework_genai.agents.registry import agent_registry") - imports.append("from fireflyframework_genai.reasoning.registry import reasoning_registry") + imports.append("from fireflyframework_agentic.agents.registry import agent_registry") + imports.append("from fireflyframework_agentic.reasoning.registry import reasoning_registry") if has_edges: - imports.append("from fireflyframework_genai.pipeline.builder import PipelineBuilder") + imports.append("from fireflyframework_agentic.pipeline.builder import PipelineBuilder") # Collect step types needed step_types: list[str] = [] @@ -147,13 +147,13 @@ def _emit_imports(type_set: set[NodeType], has_edges: bool) -> list[str]: step_types.append("CallableStep") if step_types: - imports.append(f"from fireflyframework_genai.pipeline.steps import {', '.join(sorted(step_types))}") + imports.append(f"from fireflyframework_agentic.pipeline.steps import {', '.join(sorted(step_types))}") - imports.append("from fireflyframework_genai.pipeline.context import PipelineContext") + imports.append("from fireflyframework_agentic.pipeline.context import PipelineContext") if NodeType.MEMORY in type_set: - imports.append("from fireflyframework_genai.memory.manager import MemoryManager") - imports.append("from fireflyframework_genai.memory.store import FileStore") + imports.append("from fireflyframework_agentic.memory.manager import MemoryManager") + imports.append("from fireflyframework_agentic.memory.store import FileStore") # asyncio for the main block if has_edges: @@ -607,7 +607,7 @@ def _emit_main_block(graph: GraphModel) -> str: 'if __name__ == "__main__":', "", " async def main():", - " from fireflyframework_genai.pipeline.context import PipelineContext", + " from fireflyframework_agentic.pipeline.context import PipelineContext", ] has_memory = any(n.type == NodeType.MEMORY for n in graph.nodes) diff --git a/src/fireflyframework_genai/studio/codegen/models.py b/src/fireflyframework_agentic/studio/codegen/models.py similarity index 100% rename from src/fireflyframework_genai/studio/codegen/models.py rename to src/fireflyframework_agentic/studio/codegen/models.py diff --git a/src/fireflyframework_genai/studio/config.py b/src/fireflyframework_agentic/studio/config.py similarity index 100% rename from src/fireflyframework_genai/studio/config.py rename to src/fireflyframework_agentic/studio/config.py diff --git a/src/fireflyframework_genai/studio/custom_tools.py b/src/fireflyframework_agentic/studio/custom_tools.py similarity index 97% rename from src/fireflyframework_genai/studio/custom_tools.py rename to src/fireflyframework_agentic/studio/custom_tools.py index 125d4005..62627d4e 100644 --- a/src/fireflyframework_genai/studio/custom_tools.py +++ b/src/fireflyframework_agentic/studio/custom_tools.py @@ -22,7 +22,7 @@ * **api** – A structured API call with configurable auth. The :class:`CustomToolManager` handles CRUD and converts definitions into -live :class:`~fireflyframework_genai.tools.base.BaseTool` instances that +live :class:`~fireflyframework_agentic.tools.base.BaseTool` instances that can be registered with the global tool registry. """ @@ -36,8 +36,8 @@ from pathlib import Path from typing import Any -from fireflyframework_genai.tools.decorators import _DecoratedTool -from fireflyframework_genai.tools.registry import tool_registry +from fireflyframework_agentic.tools.decorators import _DecoratedTool +from fireflyframework_agentic.tools.registry import tool_registry logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/studio/evaluation.py b/src/fireflyframework_agentic/studio/evaluation.py similarity index 94% rename from src/fireflyframework_genai/studio/evaluation.py rename to src/fireflyframework_agentic/studio/evaluation.py index b6034741..e26768b0 100644 --- a/src/fireflyframework_genai/studio/evaluation.py +++ b/src/fireflyframework_agentic/studio/evaluation.py @@ -14,7 +14,7 @@ """Evaluation engine for testing pipelines against JSONL datasets. -Compiles a :class:`~fireflyframework_genai.studio.codegen.models.GraphModel`, +Compiles a :class:`~fireflyframework_agentic.studio.codegen.models.GraphModel`, runs each test case through the resulting pipeline, and compares outputs against expected values. """ @@ -139,7 +139,7 @@ async def run_evaluation( ---------- graph_data: Raw graph dict that will be validated into a - :class:`~fireflyframework_genai.studio.codegen.models.GraphModel`. + :class:`~fireflyframework_agentic.studio.codegen.models.GraphModel`. cases: The test cases to evaluate. @@ -148,8 +148,8 @@ async def run_evaluation( EvaluationResult Aggregate result with per-case details. """ - from fireflyframework_genai.studio.codegen.models import GraphModel - from fireflyframework_genai.studio.execution.compiler import CompilationError, compile_graph + from fireflyframework_agentic.studio.codegen.models import GraphModel + from fireflyframework_agentic.studio.execution.compiler import CompilationError, compile_graph graph = GraphModel.model_validate(graph_data) try: diff --git a/src/fireflyframework_genai/studio/execution/__init__.py b/src/fireflyframework_agentic/studio/execution/__init__.py similarity index 100% rename from src/fireflyframework_genai/studio/execution/__init__.py rename to src/fireflyframework_agentic/studio/execution/__init__.py diff --git a/src/fireflyframework_genai/studio/execution/checkpoint.py b/src/fireflyframework_agentic/studio/execution/checkpoint.py similarity index 100% rename from src/fireflyframework_genai/studio/execution/checkpoint.py rename to src/fireflyframework_agentic/studio/execution/checkpoint.py diff --git a/src/fireflyframework_genai/studio/execution/compiler.py b/src/fireflyframework_agentic/studio/execution/compiler.py similarity index 92% rename from src/fireflyframework_genai/studio/execution/compiler.py rename to src/fireflyframework_agentic/studio/execution/compiler.py index 5f502bb7..349ef13b 100644 --- a/src/fireflyframework_genai/studio/execution/compiler.py +++ b/src/fireflyframework_agentic/studio/execution/compiler.py @@ -15,12 +15,12 @@ """Compile a Studio GraphModel into a runnable PipelineEngine. The compiler maps each visual canvas node to the corresponding -:class:`~fireflyframework_genai.pipeline.steps.StepExecutor` and wires -the edges into a :class:`~fireflyframework_genai.pipeline.dag.DAG`. +:class:`~fireflyframework_agentic.pipeline.steps.StepExecutor` and wires +the edges into a :class:`~fireflyframework_agentic.pipeline.dag.DAG`. Usage:: - from fireflyframework_genai.studio.execution.compiler import compile_graph + from fireflyframework_agentic.studio.execution.compiler import compile_graph engine = compile_graph(graph, event_handler=handler) result = await engine.run(context, inputs=user_input) @@ -32,10 +32,10 @@ from collections.abc import Callable from typing import Any -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.engine import PipelineEngine, PipelineEventHandler -from fireflyframework_genai.pipeline.steps import ( +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.engine import PipelineEngine, PipelineEventHandler +from fireflyframework_agentic.pipeline.steps import ( AgentStep, BranchStep, CallableStep, @@ -43,8 +43,8 @@ FanOutStep, ReasoningStep, ) -from fireflyframework_genai.studio.codegen.models import GraphModel, GraphNode, NodeType -from fireflyframework_genai.studio.execution.io_nodes import InputNodeConfig, OutputNodeConfig +from fireflyframework_agentic.studio.codegen.models import GraphModel, GraphNode, NodeType +from fireflyframework_agentic.studio.execution.io_nodes import InputNodeConfig, OutputNodeConfig logger = logging.getLogger(__name__) @@ -120,8 +120,8 @@ def _compile_agent(node: GraphNode) -> AgentStep: Tries the global agent registry first. If the agent is not registered, creates a dynamic FireflyAgent from the node's model + instructions. """ - from fireflyframework_genai.agents.base import FireflyAgent - from fireflyframework_genai.agents.registry import agent_registry + from fireflyframework_agentic.agents.base import FireflyAgent + from fireflyframework_agentic.agents.registry import agent_registry agent_name = node.data.get("agent_name", node.label) @@ -145,7 +145,7 @@ def _compile_agent(node: GraphNode) -> AgentStep: def _compile_tool(node: GraphNode) -> CallableStep: """Compile a TOOL node by looking up the registered tool.""" - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.tools.registry import tool_registry tool_name = node.data.get("tool_name") if not tool_name: @@ -164,8 +164,8 @@ async def _execute_tool(context: PipelineContext, inputs: dict[str, Any]) -> Any def _compile_reasoning(node: GraphNode) -> ReasoningStep: """Compile a REASONING node from registered pattern + agent.""" - from fireflyframework_genai.agents.registry import agent_registry - from fireflyframework_genai.reasoning.registry import reasoning_registry + from fireflyframework_agentic.agents.registry import agent_registry + from fireflyframework_agentic.reasoning.registry import reasoning_registry pattern_name = node.data.get("pattern_name") if not pattern_name: diff --git a/src/fireflyframework_genai/studio/execution/io_nodes.py b/src/fireflyframework_agentic/studio/execution/io_nodes.py similarity index 100% rename from src/fireflyframework_genai/studio/execution/io_nodes.py rename to src/fireflyframework_agentic/studio/execution/io_nodes.py diff --git a/src/fireflyframework_genai/studio/execution/runner.py b/src/fireflyframework_agentic/studio/execution/runner.py similarity index 98% rename from src/fireflyframework_genai/studio/execution/runner.py rename to src/fireflyframework_agentic/studio/execution/runner.py index cefb6be2..1967edcc 100644 --- a/src/fireflyframework_genai/studio/execution/runner.py +++ b/src/fireflyframework_agentic/studio/execution/runner.py @@ -29,7 +29,7 @@ class StudioEventHandler: """Collects pipeline execution events for real-time Studio streaming. - Implements the :class:`~fireflyframework_genai.pipeline.engine.PipelineEventHandler` + Implements the :class:`~fireflyframework_agentic.pipeline.engine.PipelineEventHandler` protocol. Events are stored in an internal :class:`collections.deque` and can be drained via :meth:`drain_events` for transmission over WebSocket. diff --git a/src/fireflyframework_genai/studio/projects.py b/src/fireflyframework_agentic/studio/projects.py similarity index 100% rename from src/fireflyframework_genai/studio/projects.py rename to src/fireflyframework_agentic/studio/projects.py diff --git a/src/fireflyframework_genai/studio/runtime.py b/src/fireflyframework_agentic/studio/runtime.py similarity index 91% rename from src/fireflyframework_genai/studio/runtime.py rename to src/fireflyframework_agentic/studio/runtime.py index 6f96dc49..e6e011ba 100644 --- a/src/fireflyframework_genai/studio/runtime.py +++ b/src/fireflyframework_agentic/studio/runtime.py @@ -10,9 +10,9 @@ import logging from typing import Any, Literal -from fireflyframework_genai.studio.codegen.models import GraphModel, NodeType -from fireflyframework_genai.studio.execution.compiler import compile_graph -from fireflyframework_genai.studio.execution.io_nodes import InputNodeConfig, OutputNodeConfig +from fireflyframework_agentic.studio.codegen.models import GraphModel, NodeType +from fireflyframework_agentic.studio.execution.compiler import compile_graph +from fireflyframework_agentic.studio.execution.io_nodes import InputNodeConfig, OutputNodeConfig logger = logging.getLogger(__name__) @@ -104,7 +104,7 @@ async def _start_queue_consumer(self) -> None: agent_name = f"studio-{self.project_name}" if qc.broker == "kafka": - from fireflyframework_genai.exposure.queues.kafka import KafkaAgentConsumer + from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentConsumer consumer = KafkaAgentConsumer( agent_name, @@ -113,7 +113,7 @@ async def _start_queue_consumer(self) -> None: bootstrap_servers=qc.connection_url or "localhost:9092", ) elif qc.broker == "rabbitmq": - from fireflyframework_genai.exposure.queues.rabbitmq import RabbitMQAgentConsumer + from fireflyframework_agentic.exposure.queues.rabbitmq import RabbitMQAgentConsumer consumer = RabbitMQAgentConsumer( agent_name, @@ -121,7 +121,7 @@ async def _start_queue_consumer(self) -> None: url=qc.connection_url or "amqp://localhost", ) elif qc.broker == "redis": - from fireflyframework_genai.exposure.queues.redis import RedisAgentConsumer + from fireflyframework_agentic.exposure.queues.redis import RedisAgentConsumer consumer = RedisAgentConsumer( agent_name, diff --git a/src/fireflyframework_genai/studio/server.py b/src/fireflyframework_agentic/studio/server.py similarity index 80% rename from src/fireflyframework_genai/studio/server.py rename to src/fireflyframework_agentic/studio/server.py index cfdc03a8..7df725b9 100644 --- a/src/fireflyframework_genai/studio/server.py +++ b/src/fireflyframework_agentic/studio/server.py @@ -44,14 +44,14 @@ async def _lifespan(app: Any) -> AsyncIterator[None]: # Load persisted settings and inject API keys into the environment # so that PydanticAI providers pick them up automatically. - from fireflyframework_genai.studio.settings import apply_settings_to_env, load_settings + from fireflyframework_agentic.studio.settings import apply_settings_to_env, load_settings settings_path = getattr(app.state, "settings_path", None) settings = load_settings(settings_path) apply_settings_to_env(settings) # Register persisted custom tools at startup - from fireflyframework_genai.studio.custom_tools import CustomToolManager + from fireflyframework_agentic.studio.custom_tools import CustomToolManager custom_tools_dir = getattr(app.state, "custom_tools_dir", None) custom_manager = CustomToolManager(custom_tools_dir) @@ -71,7 +71,7 @@ def create_studio_app( """Create a FastAPI application for Firefly Agentic Studio. Parameters: - config: Optional :class:`~fireflyframework_genai.studio.config.StudioConfig`. + config: Optional :class:`~fireflyframework_agentic.studio.config.StudioConfig`. When *None*, a default ``StudioConfig()`` is created. settings_path: Optional :class:`~pathlib.Path` to the settings JSON file. When *None*, the default ``~/.firefly-studio/settings.json`` @@ -84,12 +84,12 @@ def create_studio_app( from fastapi import FastAPI # type: ignore[import-not-found] from fastapi.middleware.cors import CORSMiddleware # type: ignore[import-not-found] - from fireflyframework_genai.studio.config import StudioConfig + from fireflyframework_agentic.studio.config import StudioConfig if config is None: config = StudioConfig() - pkg_version = importlib.metadata.version("fireflyframework-genai") + pkg_version = importlib.metadata.version("fireflyframework-agentic") app = FastAPI( title="Firefly Agentic Studio", @@ -115,100 +115,100 @@ async def health() -> dict[str, str]: return {"status": "ok", "version": pkg_version} # -- Settings endpoints ------------------------------------------------ - from fireflyframework_genai.studio.api.settings import create_settings_router + from fireflyframework_agentic.studio.api.settings import create_settings_router app.include_router(create_settings_router(settings_path)) # -- Registry endpoints ------------------------------------------------ - from fireflyframework_genai.studio.api.registry import create_registry_router + from fireflyframework_agentic.studio.api.registry import create_registry_router app.include_router(create_registry_router()) # -- Project endpoints ------------------------------------------------- - from fireflyframework_genai.studio.api.projects import create_projects_router - from fireflyframework_genai.studio.projects import ProjectManager + from fireflyframework_agentic.studio.api.projects import create_projects_router + from fireflyframework_agentic.studio.projects import ProjectManager project_manager = ProjectManager(config.projects_dir) app.include_router(create_projects_router(project_manager)) # -- Per-project runtime & execution API ------------------------------- - from fireflyframework_genai.studio.api.project_api import create_project_api_router + from fireflyframework_agentic.studio.api.project_api import create_project_api_router app.include_router(create_project_api_router(project_manager)) # -- Version history endpoints ------------------------------------------- - from fireflyframework_genai.studio.api.projects import create_versioning_router + from fireflyframework_agentic.studio.api.projects import create_versioning_router app.include_router(create_versioning_router(project_manager)) # -- Custom tools endpoints -------------------------------------------- - from fireflyframework_genai.studio.api.custom_tools import create_custom_tools_router - from fireflyframework_genai.studio.custom_tools import CustomToolManager + from fireflyframework_agentic.studio.api.custom_tools import create_custom_tools_router + from fireflyframework_agentic.studio.custom_tools import CustomToolManager custom_tool_manager = CustomToolManager(config.custom_tools_dir) app.include_router(create_custom_tools_router(custom_tool_manager)) app.state.custom_tools_dir = config.custom_tools_dir # -- File browsing endpoints ------------------------------------------- - from fireflyframework_genai.studio.api.files import create_files_router + from fireflyframework_agentic.studio.api.files import create_files_router app.include_router(create_files_router(project_manager)) # -- Evaluation endpoints ---------------------------------------------- - from fireflyframework_genai.studio.api.evaluate import create_evaluate_router + from fireflyframework_agentic.studio.api.evaluate import create_evaluate_router app.include_router(create_evaluate_router(project_manager)) # -- Experiments endpoints --------------------------------------------- - from fireflyframework_genai.studio.api.experiments import create_experiments_router + from fireflyframework_agentic.studio.api.experiments import create_experiments_router app.include_router(create_experiments_router(project_manager)) # -- Code generation endpoints ----------------------------------------- - from fireflyframework_genai.studio.api.codegen import create_codegen_router + from fireflyframework_agentic.studio.api.codegen import create_codegen_router app.include_router(create_codegen_router()) # -- Monitoring endpoints ---------------------------------------------- - from fireflyframework_genai.studio.api.monitoring import create_monitoring_router + from fireflyframework_agentic.studio.api.monitoring import create_monitoring_router app.include_router(create_monitoring_router()) # -- Checkpoint endpoints ---------------------------------------------- - from fireflyframework_genai.studio.api.checkpoints import create_checkpoints_router - from fireflyframework_genai.studio.execution.checkpoint import CheckpointManager + from fireflyframework_agentic.studio.api.checkpoints import create_checkpoints_router + from fireflyframework_agentic.studio.execution.checkpoint import CheckpointManager checkpoint_manager = CheckpointManager() app.include_router(create_checkpoints_router(checkpoint_manager)) app.state.checkpoint_manager = checkpoint_manager # -- Execution WebSocket ----------------------------------------------- - from fireflyframework_genai.studio.api.execution import create_execution_router + from fireflyframework_agentic.studio.api.execution import create_execution_router app.include_router(create_execution_router()) # -- Assistant WebSocket ----------------------------------------------- - from fireflyframework_genai.studio.api.assistant import create_assistant_router + from fireflyframework_agentic.studio.api.assistant import create_assistant_router app.include_router(create_assistant_router()) # -- Oracle WebSocket & REST ------------------------------------------- - from fireflyframework_genai.studio.api.oracle import create_oracle_router + from fireflyframework_agentic.studio.api.oracle import create_oracle_router app.include_router(create_oracle_router()) # -- Smith WebSocket (code generation) --------------------------------- - from fireflyframework_genai.studio.api.smith import create_smith_router + from fireflyframework_agentic.studio.api.smith import create_smith_router app.include_router(create_smith_router()) # -- GraphQL endpoint -------------------------------------------------- - from fireflyframework_genai.studio.api.graphql_api import create_graphql_router + from fireflyframework_agentic.studio.api.graphql_api import create_graphql_router app.include_router(create_graphql_router(project_manager)) # -- Tunnel management ------------------------------------------------- - from fireflyframework_genai.studio.api.tunnel import create_tunnel_router + from fireflyframework_agentic.studio.api.tunnel import create_tunnel_router app.include_router(create_tunnel_router(port=config.port)) @@ -230,7 +230,7 @@ def _get_default_static_dir() -> Path: import sys if getattr(sys, "frozen", False): - return Path(sys._MEIPASS) / "fireflyframework_genai" / "studio" / "static" # type: ignore[attr-defined] + return Path(sys._MEIPASS) / "fireflyframework_agentic" / "studio" / "static" # type: ignore[attr-defined] return Path(__file__).parent / "static" diff --git a/src/fireflyframework_genai/studio/settings.py b/src/fireflyframework_agentic/studio/settings.py similarity index 100% rename from src/fireflyframework_genai/studio/settings.py rename to src/fireflyframework_agentic/studio/settings.py diff --git a/src/fireflyframework_genai/studio/tunnel.py b/src/fireflyframework_agentic/studio/tunnel.py similarity index 100% rename from src/fireflyframework_genai/studio/tunnel.py rename to src/fireflyframework_agentic/studio/tunnel.py diff --git a/src/fireflyframework_genai/studio/versioning.py b/src/fireflyframework_agentic/studio/versioning.py similarity index 100% rename from src/fireflyframework_genai/studio/versioning.py rename to src/fireflyframework_agentic/studio/versioning.py diff --git a/src/fireflyframework_genai/tools/__init__.py b/src/fireflyframework_agentic/tools/__init__.py similarity index 73% rename from src/fireflyframework_genai/tools/__init__.py rename to src/fireflyframework_agentic/tools/__init__.py index f47e674d..4e74ff55 100644 --- a/src/fireflyframework_genai/tools/__init__.py +++ b/src/fireflyframework_agentic/tools/__init__.py @@ -14,7 +14,7 @@ """Tools subpackage -- protocol, base class, registry, guards, composition, and built-ins.""" -from fireflyframework_genai.tools.base import ( +from fireflyframework_agentic.tools.base import ( BaseTool, GuardProtocol, GuardResult, @@ -22,23 +22,23 @@ ToolInfo, ToolProtocol, ) -from fireflyframework_genai.tools.builder import ToolBuilder -from fireflyframework_genai.tools.cached import CachedTool -from fireflyframework_genai.tools.composer import ( +from fireflyframework_agentic.tools.builder import ToolBuilder +from fireflyframework_agentic.tools.cached import CachedTool +from fireflyframework_agentic.tools.composer import ( ConditionalComposer, FallbackComposer, SequentialComposer, ) -from fireflyframework_genai.tools.decorators import firefly_tool, guarded, retryable -from fireflyframework_genai.tools.guards import ( +from fireflyframework_agentic.tools.decorators import firefly_tool, guarded, retryable +from fireflyframework_agentic.tools.guards import ( ApprovalGuard, CompositeGuard, RateLimitGuard, SandboxGuard, ValidationGuard, ) -from fireflyframework_genai.tools.registry import ToolRegistry, tool_registry -from fireflyframework_genai.tools.toolkit import ToolKit +from fireflyframework_agentic.tools.registry import ToolRegistry, tool_registry +from fireflyframework_agentic.tools.toolkit import ToolKit __all__ = [ "ApprovalGuard", diff --git a/src/fireflyframework_genai/tools/base.py b/src/fireflyframework_agentic/tools/base.py similarity index 99% rename from src/fireflyframework_genai/tools/base.py rename to src/fireflyframework_agentic/tools/base.py index 2e84fb45..d8a27f4d 100644 --- a/src/fireflyframework_genai/tools/base.py +++ b/src/fireflyframework_agentic/tools/base.py @@ -38,7 +38,7 @@ from pydantic import BaseModel, Field -from fireflyframework_genai.exceptions import ToolError, ToolTimeoutError +from fireflyframework_agentic.exceptions import ToolError, ToolTimeoutError logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/tools/builder.py b/src/fireflyframework_agentic/tools/builder.py similarity index 96% rename from src/fireflyframework_genai/tools/builder.py rename to src/fireflyframework_agentic/tools/builder.py index 6544f1f7..e733dc19 100644 --- a/src/fireflyframework_genai/tools/builder.py +++ b/src/fireflyframework_agentic/tools/builder.py @@ -15,7 +15,7 @@ """Fluent builder API for constructing tools programmatically. The :class:`ToolBuilder` provides a step-by-step, chainable interface for -creating :class:`~fireflyframework_genai.tools.base.BaseTool` instances +creating :class:`~fireflyframework_agentic.tools.base.BaseTool` instances without subclassing:: tool = ( @@ -33,7 +33,7 @@ from collections.abc import Callable, Coroutine, Sequence from typing import Any -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec # Type alias for an async handler function AsyncHandler = Callable[..., Coroutine[Any, Any, Any]] diff --git a/src/fireflyframework_genai/tools/builtins/__init__.py b/src/fireflyframework_agentic/tools/builtins/__init__.py similarity index 56% rename from src/fireflyframework_genai/tools/builtins/__init__.py rename to src/fireflyframework_agentic/tools/builtins/__init__.py index 5cfe947b..13150acb 100644 --- a/src/fireflyframework_genai/tools/builtins/__init__.py +++ b/src/fireflyframework_agentic/tools/builtins/__init__.py @@ -14,15 +14,15 @@ """Built-in tool library providing ready-to-use tools for common operations.""" -from fireflyframework_genai.tools.builtins.calculator_tool import CalculatorTool -from fireflyframework_genai.tools.builtins.database import DatabaseTool -from fireflyframework_genai.tools.builtins.datetime_tool import DateTimeTool -from fireflyframework_genai.tools.builtins.filesystem import FileSystemTool -from fireflyframework_genai.tools.builtins.http import HttpTool -from fireflyframework_genai.tools.builtins.json_tool import JsonTool -from fireflyframework_genai.tools.builtins.search import SearchTool -from fireflyframework_genai.tools.builtins.shell import ShellTool -from fireflyframework_genai.tools.builtins.text_tool import TextTool +from fireflyframework_agentic.tools.builtins.calculator_tool import CalculatorTool +from fireflyframework_agentic.tools.builtins.database import DatabaseTool +from fireflyframework_agentic.tools.builtins.datetime_tool import DateTimeTool +from fireflyframework_agentic.tools.builtins.filesystem import FileSystemTool +from fireflyframework_agentic.tools.builtins.http import HttpTool +from fireflyframework_agentic.tools.builtins.json_tool import JsonTool +from fireflyframework_agentic.tools.builtins.search import SearchTool +from fireflyframework_agentic.tools.builtins.shell import ShellTool +from fireflyframework_agentic.tools.builtins.text_tool import TextTool __all__ = [ "CalculatorTool", diff --git a/src/fireflyframework_genai/tools/builtins/calculator_tool.py b/src/fireflyframework_agentic/tools/builtins/calculator_tool.py similarity index 98% rename from src/fireflyframework_genai/tools/builtins/calculator_tool.py rename to src/fireflyframework_agentic/tools/builtins/calculator_tool.py index b184a8e5..65db6843 100644 --- a/src/fireflyframework_genai/tools/builtins/calculator_tool.py +++ b/src/fireflyframework_agentic/tools/builtins/calculator_tool.py @@ -26,7 +26,7 @@ from collections.abc import Sequence from typing import Any -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec # Supported binary operators _BINARY_OPS: dict[type, Any] = { diff --git a/src/fireflyframework_genai/tools/builtins/database.py b/src/fireflyframework_agentic/tools/builtins/database.py similarity index 98% rename from src/fireflyframework_genai/tools/builtins/database.py rename to src/fireflyframework_agentic/tools/builtins/database.py index 6328e337..23034c53 100644 --- a/src/fireflyframework_genai/tools/builtins/database.py +++ b/src/fireflyframework_agentic/tools/builtins/database.py @@ -27,8 +27,8 @@ from collections.abc import Sequence from typing import Any -from fireflyframework_genai.exceptions import ToolError -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.exceptions import ToolError +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/tools/builtins/datetime_tool.py b/src/fireflyframework_agentic/tools/builtins/datetime_tool.py similarity index 97% rename from src/fireflyframework_genai/tools/builtins/datetime_tool.py rename to src/fireflyframework_agentic/tools/builtins/datetime_tool.py index ae818560..bbed33bb 100644 --- a/src/fireflyframework_genai/tools/builtins/datetime_tool.py +++ b/src/fireflyframework_agentic/tools/builtins/datetime_tool.py @@ -25,7 +25,7 @@ from typing import Any from zoneinfo import ZoneInfo, available_timezones -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec class DateTimeTool(BaseTool): diff --git a/src/fireflyframework_genai/tools/builtins/filesystem.py b/src/fireflyframework_agentic/tools/builtins/filesystem.py similarity index 97% rename from src/fireflyframework_genai/tools/builtins/filesystem.py rename to src/fireflyframework_agentic/tools/builtins/filesystem.py index 9dcf2234..a5fc2059 100644 --- a/src/fireflyframework_genai/tools/builtins/filesystem.py +++ b/src/fireflyframework_agentic/tools/builtins/filesystem.py @@ -24,7 +24,7 @@ from pathlib import Path from typing import Any -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec class FileSystemTool(BaseTool): diff --git a/src/fireflyframework_genai/tools/builtins/http.py b/src/fireflyframework_agentic/tools/builtins/http.py similarity index 98% rename from src/fireflyframework_genai/tools/builtins/http.py rename to src/fireflyframework_agentic/tools/builtins/http.py index 4c66c996..88e10ea7 100644 --- a/src/fireflyframework_genai/tools/builtins/http.py +++ b/src/fireflyframework_agentic/tools/builtins/http.py @@ -28,7 +28,7 @@ from collections.abc import Sequence from typing import Any -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/tools/builtins/json_tool.py b/src/fireflyframework_agentic/tools/builtins/json_tool.py similarity index 98% rename from src/fireflyframework_genai/tools/builtins/json_tool.py rename to src/fireflyframework_agentic/tools/builtins/json_tool.py index 9fe16a9d..b573bd97 100644 --- a/src/fireflyframework_genai/tools/builtins/json_tool.py +++ b/src/fireflyframework_agentic/tools/builtins/json_tool.py @@ -24,7 +24,7 @@ from collections.abc import Sequence from typing import Any -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec class JsonTool(BaseTool): diff --git a/src/fireflyframework_genai/tools/builtins/search.py b/src/fireflyframework_agentic/tools/builtins/search.py similarity index 96% rename from src/fireflyframework_genai/tools/builtins/search.py rename to src/fireflyframework_agentic/tools/builtins/search.py index f30cff12..598f0e33 100644 --- a/src/fireflyframework_genai/tools/builtins/search.py +++ b/src/fireflyframework_agentic/tools/builtins/search.py @@ -27,7 +27,7 @@ from pydantic import BaseModel -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec class SearchResult(BaseModel): diff --git a/src/fireflyframework_genai/tools/builtins/shell.py b/src/fireflyframework_agentic/tools/builtins/shell.py similarity index 97% rename from src/fireflyframework_genai/tools/builtins/shell.py rename to src/fireflyframework_agentic/tools/builtins/shell.py index b72303c7..8000333f 100644 --- a/src/fireflyframework_genai/tools/builtins/shell.py +++ b/src/fireflyframework_agentic/tools/builtins/shell.py @@ -26,7 +26,7 @@ from pathlib import Path from typing import Any -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec class ShellTool(BaseTool): diff --git a/src/fireflyframework_genai/tools/builtins/text_tool.py b/src/fireflyframework_agentic/tools/builtins/text_tool.py similarity index 98% rename from src/fireflyframework_genai/tools/builtins/text_tool.py rename to src/fireflyframework_agentic/tools/builtins/text_tool.py index e0885fde..fdd542e0 100644 --- a/src/fireflyframework_genai/tools/builtins/text_tool.py +++ b/src/fireflyframework_agentic/tools/builtins/text_tool.py @@ -25,7 +25,7 @@ from collections.abc import Sequence from typing import Any -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol, ParameterSpec +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol, ParameterSpec class TextTool(BaseTool): diff --git a/src/fireflyframework_genai/tools/cached.py b/src/fireflyframework_agentic/tools/cached.py similarity index 95% rename from src/fireflyframework_genai/tools/cached.py rename to src/fireflyframework_agentic/tools/cached.py index c0afcbf2..77b19884 100644 --- a/src/fireflyframework_genai/tools/cached.py +++ b/src/fireflyframework_agentic/tools/cached.py @@ -14,13 +14,13 @@ """Caching wrapper for deterministic tools. -:class:`CachedTool` wraps any :class:`~fireflyframework_genai.tools.base.ToolProtocol` +:class:`CachedTool` wraps any :class:`~fireflyframework_agentic.tools.base.ToolProtocol` implementation and transparently memoises results using a TTL-based in-memory cache keyed on the tool's input arguments. Usage:: - from fireflyframework_genai.tools.cached import CachedTool + from fireflyframework_agentic.tools.cached import CachedTool cached = CachedTool(my_slow_tool, ttl_seconds=300.0) result = await cached.execute(query="hello") # calls underlying tool @@ -36,7 +36,7 @@ import time from typing import Any -from fireflyframework_genai.tools.base import ToolProtocol +from fireflyframework_agentic.tools.base import ToolProtocol logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/tools/composer.py b/src/fireflyframework_agentic/tools/composer.py similarity index 97% rename from src/fireflyframework_genai/tools/composer.py rename to src/fireflyframework_agentic/tools/composer.py index 9a55711e..ba3c2681 100644 --- a/src/fireflyframework_genai/tools/composer.py +++ b/src/fireflyframework_agentic/tools/composer.py @@ -25,8 +25,8 @@ from collections.abc import Callable, Sequence from typing import Any -from fireflyframework_genai.exceptions import ToolError -from fireflyframework_genai.tools.base import ToolProtocol +from fireflyframework_agentic.exceptions import ToolError +from fireflyframework_agentic.tools.base import ToolProtocol logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/tools/decorators.py b/src/fireflyframework_agentic/tools/decorators.py similarity index 95% rename from src/fireflyframework_genai/tools/decorators.py rename to src/fireflyframework_agentic/tools/decorators.py index 915aa7a4..25ac429b 100644 --- a/src/fireflyframework_genai/tools/decorators.py +++ b/src/fireflyframework_agentic/tools/decorators.py @@ -15,7 +15,7 @@ """Decorator-driven API for defining tools with minimal boilerplate. The :func:`firefly_tool` decorator transforms an async function into a -registered :class:`~fireflyframework_genai.tools.base.BaseTool` instance:: +registered :class:`~fireflyframework_agentic.tools.base.BaseTool` instance:: @firefly_tool("search", tags=["web"]) async def search(query: str) -> str: @@ -23,7 +23,7 @@ async def search(query: str) -> str: ... :func:`guarded` and :func:`retryable` add cross-cutting concerns to any -:class:`~fireflyframework_genai.tools.base.BaseTool`. +:class:`~fireflyframework_agentic.tools.base.BaseTool`. """ from __future__ import annotations @@ -34,8 +34,8 @@ async def search(query: str) -> str: from collections.abc import Callable, Coroutine, Sequence from typing import Any -from fireflyframework_genai.tools.base import BaseTool, GuardProtocol -from fireflyframework_genai.tools.registry import tool_registry +from fireflyframework_agentic.tools.base import BaseTool, GuardProtocol +from fireflyframework_agentic.tools.registry import tool_registry logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/tools/guards.py b/src/fireflyframework_agentic/tools/guards.py similarity index 97% rename from src/fireflyframework_genai/tools/guards.py rename to src/fireflyframework_agentic/tools/guards.py index e265d581..51dca93e 100644 --- a/src/fireflyframework_genai/tools/guards.py +++ b/src/fireflyframework_agentic/tools/guards.py @@ -16,7 +16,7 @@ Guards intercept a tool call before it runs and decide whether execution should proceed. They compose via :class:`CompositeGuard` (AND semantics) -and integrate with the :class:`~fireflyframework_genai.tools.base.BaseTool` +and integrate with the :class:`~fireflyframework_agentic.tools.base.BaseTool` guard chain. """ @@ -28,7 +28,7 @@ from collections.abc import Awaitable, Callable, Sequence from typing import Any -from fireflyframework_genai.tools.base import GuardProtocol, GuardResult +from fireflyframework_agentic.tools.base import GuardProtocol, GuardResult # Type alias for the human-in-the-loop approval callback ApprovalCallback = Callable[[str, dict[str, Any]], Awaitable[bool]] diff --git a/src/fireflyframework_genai/tools/registry.py b/src/fireflyframework_agentic/tools/registry.py similarity index 92% rename from src/fireflyframework_genai/tools/registry.py rename to src/fireflyframework_agentic/tools/registry.py index 21bb9e84..006300c1 100644 --- a/src/fireflyframework_genai/tools/registry.py +++ b/src/fireflyframework_agentic/tools/registry.py @@ -15,9 +15,9 @@ """Global tool registry for discovering and managing tools. :class:`ToolRegistry` follows the same singleton pattern used by -:class:`~fireflyframework_genai.agents.registry.AgentRegistry`. Tools are +:class:`~fireflyframework_agentic.agents.registry.AgentRegistry`. Tools are registered either explicitly via :meth:`ToolRegistry.register` or implicitly -through the :func:`~fireflyframework_genai.tools.decorators.firefly_tool` +through the :func:`~fireflyframework_agentic.tools.decorators.firefly_tool` decorator. """ @@ -26,8 +26,8 @@ import logging import threading -from fireflyframework_genai.exceptions import ToolNotFoundError -from fireflyframework_genai.tools.base import ToolInfo, ToolProtocol +from fireflyframework_agentic.exceptions import ToolNotFoundError +from fireflyframework_agentic.tools.base import ToolInfo, ToolProtocol logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/tools/toolkit.py b/src/fireflyframework_agentic/tools/toolkit.py similarity index 96% rename from src/fireflyframework_genai/tools/toolkit.py rename to src/fireflyframework_agentic/tools/toolkit.py index e9358110..4219ea7c 100644 --- a/src/fireflyframework_genai/tools/toolkit.py +++ b/src/fireflyframework_agentic/tools/toolkit.py @@ -27,8 +27,8 @@ from pydantic_ai import Tool as PydanticTool -from fireflyframework_genai.tools.base import ToolProtocol -from fireflyframework_genai.tools.registry import ToolRegistry +from fireflyframework_agentic.tools.base import ToolProtocol +from fireflyframework_agentic.tools.registry import ToolRegistry class ToolKit: diff --git a/src/fireflyframework_genai/types.py b/src/fireflyframework_agentic/types.py similarity index 100% rename from src/fireflyframework_genai/types.py rename to src/fireflyframework_agentic/types.py diff --git a/src/fireflyframework_genai/validation/__init__.py b/src/fireflyframework_agentic/validation/__init__.py similarity index 90% rename from src/fireflyframework_genai/validation/__init__.py rename to src/fireflyframework_agentic/validation/__init__.py index 7d46f89e..da0598c7 100644 --- a/src/fireflyframework_genai/validation/__init__.py +++ b/src/fireflyframework_agentic/validation/__init__.py @@ -18,19 +18,19 @@ validators, and quality-of-service guards for hallucination detection. """ -from fireflyframework_genai.validation.qos import ( +from fireflyframework_agentic.validation.qos import ( ConfidenceScorer, ConsistencyChecker, GroundingChecker, QoSGuard, QoSResult, ) -from fireflyframework_genai.validation.reviewer import ( +from fireflyframework_agentic.validation.reviewer import ( OutputReviewer, RetryAttempt, ReviewResult, ) -from fireflyframework_genai.validation.rules import ( +from fireflyframework_agentic.validation.rules import ( CustomRule, EnumRule, FieldValidator, diff --git a/src/fireflyframework_genai/validation/qos.py b/src/fireflyframework_agentic/validation/qos.py similarity index 99% rename from src/fireflyframework_genai/validation/qos.py rename to src/fireflyframework_agentic/validation/qos.py index 08cd0575..2f45e2b7 100644 --- a/src/fireflyframework_genai/validation/qos.py +++ b/src/fireflyframework_agentic/validation/qos.py @@ -26,7 +26,7 @@ from pydantic import BaseModel, Field -from fireflyframework_genai.types import AgentLike +from fireflyframework_agentic.types import AgentLike logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/validation/reviewer.py b/src/fireflyframework_agentic/validation/reviewer.py similarity index 97% rename from src/fireflyframework_genai/validation/reviewer.py rename to src/fireflyframework_agentic/validation/reviewer.py index f0c3aa33..1e8f120e 100644 --- a/src/fireflyframework_genai/validation/reviewer.py +++ b/src/fireflyframework_agentic/validation/reviewer.py @@ -16,7 +16,7 @@ :class:`OutputReviewer` wraps an agent call with validation and retry logic. When the LLM produces output that fails Pydantic parsing or -:class:`~fireflyframework_genai.validation.rules.OutputValidator` rules, +:class:`~fireflyframework_agentic.validation.rules.OutputValidator` rules, the reviewer automatically retries with a feedback prompt that tells the LLM exactly what was wrong. @@ -32,9 +32,9 @@ from pydantic import BaseModel, Field, ValidationError -from fireflyframework_genai.exceptions import OutputReviewError -from fireflyframework_genai.types import AgentLike -from fireflyframework_genai.validation.rules import OutputValidator, ValidationReport +from fireflyframework_agentic.exceptions import OutputReviewError +from fireflyframework_agentic.types import AgentLike +from fireflyframework_agentic.validation.rules import OutputValidator, ValidationReport logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/validation/rules.py b/src/fireflyframework_agentic/validation/rules.py similarity index 100% rename from src/fireflyframework_genai/validation/rules.py rename to src/fireflyframework_agentic/validation/rules.py diff --git a/src/fireflyframework_agentic/vectorstores/__init__.py b/src/fireflyframework_agentic/vectorstores/__init__.py new file mode 100644 index 00000000..41ab880c --- /dev/null +++ b/src/fireflyframework_agentic/vectorstores/__init__.py @@ -0,0 +1,22 @@ +"""Pluggable vector storage and retrieval backends.""" + +from fireflyframework_agentic.vectorstores.base import BaseVectorStore, VectorStoreProtocol +from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore +from fireflyframework_agentic.vectorstores.memory_store import InMemoryVectorStore +from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore +from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore +from fireflyframework_agentic.vectorstores.registry import VectorStoreRegistry +from fireflyframework_agentic.vectorstores.types import SearchFilter, SearchResult, VectorDocument + +__all__ = [ + "BaseVectorStore", + "ChromaVectorStore", + "InMemoryVectorStore", + "PineconeVectorStore", + "QdrantVectorStore", + "SearchFilter", + "SearchResult", + "VectorDocument", + "VectorStoreProtocol", + "VectorStoreRegistry", +] diff --git a/src/fireflyframework_genai/vectorstores/base.py b/src/fireflyframework_agentic/vectorstores/base.py similarity index 95% rename from src/fireflyframework_genai/vectorstores/base.py rename to src/fireflyframework_agentic/vectorstores/base.py index 4f46ff4d..3fae09f4 100644 --- a/src/fireflyframework_genai/vectorstores/base.py +++ b/src/fireflyframework_agentic/vectorstores/base.py @@ -13,9 +13,9 @@ from abc import ABC, abstractmethod from typing import Any, Protocol, runtime_checkable -from fireflyframework_genai.embeddings.base import EmbeddingProtocol -from fireflyframework_genai.exceptions import VectorStoreError -from fireflyframework_genai.vectorstores.types import SearchFilter, SearchResult, VectorDocument +from fireflyframework_agentic.embeddings.base import EmbeddingProtocol +from fireflyframework_agentic.exceptions import VectorStoreError +from fireflyframework_agentic.vectorstores.types import SearchFilter, SearchResult, VectorDocument logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/vectorstores/chroma_store.py b/src/fireflyframework_agentic/vectorstores/chroma_store.py similarity index 94% rename from src/fireflyframework_genai/vectorstores/chroma_store.py rename to src/fireflyframework_agentic/vectorstores/chroma_store.py index 613080c9..b983f745 100644 --- a/src/fireflyframework_genai/vectorstores/chroma_store.py +++ b/src/fireflyframework_agentic/vectorstores/chroma_store.py @@ -10,8 +10,8 @@ except ImportError: chromadb = None # type: ignore[assignment] -from fireflyframework_genai.vectorstores.base import BaseVectorStore -from fireflyframework_genai.vectorstores.types import SearchFilter, SearchResult, VectorDocument +from fireflyframework_agentic.vectorstores.base import BaseVectorStore +from fireflyframework_agentic.vectorstores.types import SearchFilter, SearchResult, VectorDocument logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/vectorstores/memory_store.py b/src/fireflyframework_agentic/vectorstores/memory_store.py similarity index 91% rename from src/fireflyframework_genai/vectorstores/memory_store.py rename to src/fireflyframework_agentic/vectorstores/memory_store.py index bf3cfe41..a063e37a 100644 --- a/src/fireflyframework_genai/vectorstores/memory_store.py +++ b/src/fireflyframework_agentic/vectorstores/memory_store.py @@ -10,9 +10,9 @@ from collections import defaultdict from typing import Any -from fireflyframework_genai.embeddings.similarity import cosine_similarity -from fireflyframework_genai.vectorstores.base import BaseVectorStore -from fireflyframework_genai.vectorstores.types import SearchFilter, SearchResult, VectorDocument +from fireflyframework_agentic.embeddings.similarity import cosine_similarity +from fireflyframework_agentic.vectorstores.base import BaseVectorStore +from fireflyframework_agentic.vectorstores.types import SearchFilter, SearchResult, VectorDocument logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/vectorstores/pinecone_store.py b/src/fireflyframework_agentic/vectorstores/pinecone_store.py similarity index 94% rename from src/fireflyframework_genai/vectorstores/pinecone_store.py rename to src/fireflyframework_agentic/vectorstores/pinecone_store.py index 36943b0b..b85ad2a7 100644 --- a/src/fireflyframework_genai/vectorstores/pinecone_store.py +++ b/src/fireflyframework_agentic/vectorstores/pinecone_store.py @@ -10,8 +10,8 @@ except ImportError: Pinecone = None # type: ignore[assignment,misc] -from fireflyframework_genai.vectorstores.base import BaseVectorStore -from fireflyframework_genai.vectorstores.types import SearchFilter, SearchResult, VectorDocument +from fireflyframework_agentic.vectorstores.base import BaseVectorStore +from fireflyframework_agentic.vectorstores.types import SearchFilter, SearchResult, VectorDocument logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/vectorstores/qdrant_store.py b/src/fireflyframework_agentic/vectorstores/qdrant_store.py similarity index 95% rename from src/fireflyframework_genai/vectorstores/qdrant_store.py rename to src/fireflyframework_agentic/vectorstores/qdrant_store.py index 83ab5c01..e56ab525 100644 --- a/src/fireflyframework_genai/vectorstores/qdrant_store.py +++ b/src/fireflyframework_agentic/vectorstores/qdrant_store.py @@ -26,8 +26,8 @@ MatchValue = None # type: ignore[assignment,misc] PointIdsList = None # type: ignore[assignment,misc] -from fireflyframework_genai.vectorstores.base import BaseVectorStore -from fireflyframework_genai.vectorstores.types import SearchFilter, SearchResult, VectorDocument +from fireflyframework_agentic.vectorstores.base import BaseVectorStore +from fireflyframework_agentic.vectorstores.types import SearchFilter, SearchResult, VectorDocument logger = logging.getLogger(__name__) diff --git a/src/fireflyframework_genai/vectorstores/registry.py b/src/fireflyframework_agentic/vectorstores/registry.py similarity index 93% rename from src/fireflyframework_genai/vectorstores/registry.py rename to src/fireflyframework_agentic/vectorstores/registry.py index 068c0304..b381931a 100644 --- a/src/fireflyframework_genai/vectorstores/registry.py +++ b/src/fireflyframework_agentic/vectorstores/registry.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.vectorstores.base import VectorStoreProtocol +from fireflyframework_agentic.vectorstores.base import VectorStoreProtocol class VectorStoreRegistry: diff --git a/src/fireflyframework_genai/vectorstores/types.py b/src/fireflyframework_agentic/vectorstores/types.py similarity index 100% rename from src/fireflyframework_genai/vectorstores/types.py rename to src/fireflyframework_agentic/vectorstores/types.py diff --git a/src/fireflyframework_genai/embeddings/providers/__init__.py b/src/fireflyframework_genai/embeddings/providers/__init__.py deleted file mode 100644 index bec2f8b4..00000000 --- a/src/fireflyframework_genai/embeddings/providers/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Embedding provider implementations.""" - -from fireflyframework_genai.embeddings.providers.azure import AzureEmbedder -from fireflyframework_genai.embeddings.providers.bedrock import BedrockEmbedder -from fireflyframework_genai.embeddings.providers.cohere import CohereEmbedder -from fireflyframework_genai.embeddings.providers.google import GoogleEmbedder -from fireflyframework_genai.embeddings.providers.mistral import MistralEmbedder -from fireflyframework_genai.embeddings.providers.ollama import OllamaEmbedder -from fireflyframework_genai.embeddings.providers.openai import OpenAIEmbedder -from fireflyframework_genai.embeddings.providers.voyage import VoyageEmbedder - -__all__ = [ - "AzureEmbedder", - "BedrockEmbedder", - "CohereEmbedder", - "GoogleEmbedder", - "MistralEmbedder", - "OllamaEmbedder", - "OpenAIEmbedder", - "VoyageEmbedder", -] diff --git a/src/fireflyframework_genai/vectorstores/__init__.py b/src/fireflyframework_genai/vectorstores/__init__.py deleted file mode 100644 index b65146a1..00000000 --- a/src/fireflyframework_genai/vectorstores/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Pluggable vector storage and retrieval backends.""" - -from fireflyframework_genai.vectorstores.base import BaseVectorStore, VectorStoreProtocol -from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore -from fireflyframework_genai.vectorstores.memory_store import InMemoryVectorStore -from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore -from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore -from fireflyframework_genai.vectorstores.registry import VectorStoreRegistry -from fireflyframework_genai.vectorstores.types import SearchFilter, SearchResult, VectorDocument - -__all__ = [ - "BaseVectorStore", - "ChromaVectorStore", - "InMemoryVectorStore", - "PineconeVectorStore", - "QdrantVectorStore", - "SearchFilter", - "SearchResult", - "VectorDocument", - "VectorStoreProtocol", - "VectorStoreRegistry", -] diff --git a/studio-desktop/pyinstaller/entry_point.py b/studio-desktop/pyinstaller/entry_point.py index d1c92a77..55eb71ff 100644 --- a/studio-desktop/pyinstaller/entry_point.py +++ b/studio-desktop/pyinstaller/entry_point.py @@ -10,7 +10,7 @@ def main() -> None: """Launch Firefly Studio as a desktop sidecar process.""" - from fireflyframework_genai.studio.cli import main as studio_main + from fireflyframework_agentic.studio.cli import main as studio_main studio_main(sys.argv[1:]) diff --git a/studio-desktop/pyinstaller/firefly_studio.spec b/studio-desktop/pyinstaller/firefly_studio.spec index a3463096..147c0bfa 100644 --- a/studio-desktop/pyinstaller/firefly_studio.spec +++ b/studio-desktop/pyinstaller/firefly_studio.spec @@ -19,11 +19,11 @@ from PyInstaller.utils.hooks import copy_metadata # Resolve paths relative to the repository root REPO_ROOT = Path(SPECPATH).resolve().parent.parent SRC_DIR = REPO_ROOT / "src" -STATIC_DIR = SRC_DIR / "fireflyframework_genai" / "studio" / "static" +STATIC_DIR = SRC_DIR / "fireflyframework_agentic" / "studio" / "static" # Collect package metadata for packages that call importlib.metadata.version() pkg_metadata = [] -for pkg in ["genai_prices", "pydantic_ai", "pydantic_ai_slim", "fireflyframework-genai"]: +for pkg in ["genai_prices", "pydantic_ai", "pydantic_ai_slim", "fireflyframework-agentic"]: try: pkg_metadata += copy_metadata(pkg) except Exception: @@ -37,7 +37,7 @@ a = Analysis( binaries=[], datas=[ # Bundle the built frontend static files - (str(STATIC_DIR), os.path.join("fireflyframework_genai", "studio", "static")), + (str(STATIC_DIR), os.path.join("fireflyframework_agentic", "studio", "static")), ] + pkg_metadata, hiddenimports=[], diff --git a/studio-desktop/pyinstaller/hook-fireflyframework_genai.py b/studio-desktop/pyinstaller/hook-fireflyframework_genai.py index 2b68a8d0..a492cafc 100644 --- a/studio-desktop/pyinstaller/hook-fireflyframework_genai.py +++ b/studio-desktop/pyinstaller/hook-fireflyframework_genai.py @@ -1,4 +1,4 @@ -"""PyInstaller hidden-imports hook for fireflyframework-genai. +"""PyInstaller hidden-imports hook for fireflyframework-agentic. Ensures that all runtime-discovered sub-packages and optional dependencies are bundled into the frozen executable. @@ -6,45 +6,45 @@ hiddenimports = [ # Studio server - "fireflyframework_genai.studio", - "fireflyframework_genai.studio.cli", - "fireflyframework_genai.studio.server", - "fireflyframework_genai.studio.config", - "fireflyframework_genai.studio.projects", - "fireflyframework_genai.studio.api.assistant", - "fireflyframework_genai.studio.api.checkpoints", - "fireflyframework_genai.studio.api.codegen", - "fireflyframework_genai.studio.api.execution", - "fireflyframework_genai.studio.api.files", - "fireflyframework_genai.studio.api.monitoring", - "fireflyframework_genai.studio.api.projects", - "fireflyframework_genai.studio.api.registry", - "fireflyframework_genai.studio.api.settings", - "fireflyframework_genai.studio.api.evaluate", - "fireflyframework_genai.studio.api.experiments", - "fireflyframework_genai.studio.settings", - "fireflyframework_genai.studio.evaluation", - "fireflyframework_genai.studio.codegen.generator", - "fireflyframework_genai.studio.codegen.models", - "fireflyframework_genai.studio.execution.compiler", - "fireflyframework_genai.studio.execution.runner", - "fireflyframework_genai.studio.execution.checkpoint", + "fireflyframework_agentic.studio", + "fireflyframework_agentic.studio.cli", + "fireflyframework_agentic.studio.server", + "fireflyframework_agentic.studio.config", + "fireflyframework_agentic.studio.projects", + "fireflyframework_agentic.studio.api.assistant", + "fireflyframework_agentic.studio.api.checkpoints", + "fireflyframework_agentic.studio.api.codegen", + "fireflyframework_agentic.studio.api.execution", + "fireflyframework_agentic.studio.api.files", + "fireflyframework_agentic.studio.api.monitoring", + "fireflyframework_agentic.studio.api.projects", + "fireflyframework_agentic.studio.api.registry", + "fireflyframework_agentic.studio.api.settings", + "fireflyframework_agentic.studio.api.evaluate", + "fireflyframework_agentic.studio.api.experiments", + "fireflyframework_agentic.studio.settings", + "fireflyframework_agentic.studio.evaluation", + "fireflyframework_agentic.studio.codegen.generator", + "fireflyframework_agentic.studio.codegen.models", + "fireflyframework_agentic.studio.execution.compiler", + "fireflyframework_agentic.studio.execution.runner", + "fireflyframework_agentic.studio.execution.checkpoint", # Pipeline engine - "fireflyframework_genai.pipeline.builder", - "fireflyframework_genai.pipeline.context", - "fireflyframework_genai.pipeline.dag", - "fireflyframework_genai.pipeline.engine", - "fireflyframework_genai.pipeline.steps", + "fireflyframework_agentic.pipeline.builder", + "fireflyframework_agentic.pipeline.context", + "fireflyframework_agentic.pipeline.dag", + "fireflyframework_agentic.pipeline.engine", + "fireflyframework_agentic.pipeline.steps", # Agent framework - "fireflyframework_genai.agents.base", - "fireflyframework_genai.agents.registry", - "fireflyframework_genai.agents.context", - "fireflyframework_genai.agents.middleware", + "fireflyframework_agentic.agents.base", + "fireflyframework_agentic.agents.registry", + "fireflyframework_agentic.agents.context", + "fireflyframework_agentic.agents.middleware", # Tools & reasoning - "fireflyframework_genai.tools.registry", - "fireflyframework_genai.reasoning.registry", + "fireflyframework_agentic.tools.registry", + "fireflyframework_agentic.reasoning.registry", # Config - "fireflyframework_genai.config", + "fireflyframework_agentic.config", # Web server dependencies "uvicorn", "uvicorn.logging", diff --git a/studio-frontend/README.md b/studio-frontend/README.md index 01e3de89..0390a1cb 100644 --- a/studio-frontend/README.md +++ b/studio-frontend/README.md @@ -1,7 +1,7 @@ # Firefly Studio Frontend SvelteKit 5 frontend for [Firefly Studio](../docs/studio.md) -- the visual -agent IDE for the Firefly GenAI framework. +agent IDE for the Firefly Agentic framework. ## Prerequisites @@ -42,7 +42,7 @@ npm run build Output goes to `build/`. To bundle it into the Python package: ```bash -cp -r build/* ../src/fireflyframework_genai/studio/static/ +cp -r build/* ../src/fireflyframework_agentic/studio/static/ ``` ## Type Check diff --git a/studio-frontend/src/lib/components/layout/SettingsModal.svelte b/studio-frontend/src/lib/components/layout/SettingsModal.svelte index d3ecb9d8..9a01621c 100644 --- a/studio-frontend/src/lib/components/layout/SettingsModal.svelte +++ b/studio-frontend/src/lib/components/layout/SettingsModal.svelte @@ -787,7 +787,7 @@
Framework - Firefly Framework GenAI + Firefly Framework Agentic
Backend diff --git a/tests/agents/test_prompt_cache.py b/tests/agents/test_prompt_cache.py index fdc73f6d..ac15dd22 100644 --- a/tests/agents/test_prompt_cache.py +++ b/tests/agents/test_prompt_cache.py @@ -20,7 +20,7 @@ import pytest -from fireflyframework_genai.agents.prompt_cache import CacheStatistics, PromptCacheMiddleware +from fireflyframework_agentic.agents.prompt_cache import CacheStatistics, PromptCacheMiddleware @pytest.mark.asyncio diff --git a/tests/agents/test_rate_limit_retry.py b/tests/agents/test_rate_limit_retry.py index 91b3c925..2b20435b 100644 --- a/tests/agents/test_rate_limit_retry.py +++ b/tests/agents/test_rate_limit_retry.py @@ -7,8 +7,8 @@ import pytest from pydantic_ai.exceptions import ModelHTTPError -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.config import reset_config +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.config import reset_config @pytest.fixture(autouse=True) @@ -58,7 +58,7 @@ async def test_429_exhausts_retries(self): with ( patch("asyncio.sleep", new_callable=AsyncMock), patch( - "fireflyframework_genai.agents.base.get_config", + "fireflyframework_agentic.agents.base.get_config", ) as mock_cfg, ): cfg = mock_cfg.return_value @@ -120,7 +120,7 @@ async def test_success_resets_backoff(self): agent._agent.run = AsyncMock(return_value=mock_result) with patch( - "fireflyframework_genai.agents.base.get_config", + "fireflyframework_agentic.agents.base.get_config", ) as mock_cfg: cfg = mock_cfg.return_value cfg.rate_limit_max_retries = 3 diff --git a/tests/agents/test_streaming_incremental.py b/tests/agents/test_streaming_incremental.py index d3136d47..5fcb22e0 100644 --- a/tests/agents/test_streaming_incremental.py +++ b/tests/agents/test_streaming_incremental.py @@ -18,7 +18,7 @@ import pytest -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent @pytest.mark.asyncio @@ -117,7 +117,7 @@ async def test_buffered_mode_uses_original_stream(self): async def test_both_modes_record_usage(self): """Test that both streaming modes record usage after completion.""" - from fireflyframework_genai.observability.usage import default_usage_tracker + from fireflyframework_agentic.observability.usage import default_usage_tracker # Get initial summary initial_summary = default_usage_tracker.get_summary() @@ -158,7 +158,7 @@ async def test_incremental_mode_with_timeout(self): async def test_middleware_fires_with_incremental_mode(self): """Test that incremental streaming works with middleware.""" - from fireflyframework_genai.agents.builtin_middleware import LoggingMiddleware + from fireflyframework_agentic.agents.builtin_middleware import LoggingMiddleware agent = FireflyAgent( "test-mw-inc2", @@ -212,7 +212,7 @@ async def test_very_long_response_incremental(self): async def test_incremental_with_conversation_id(self): """Test incremental streaming with conversation memory.""" - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.memory.manager import MemoryManager memory = MemoryManager() agent = FireflyAgent("test-conv", model="test", memory=memory, auto_register=False) diff --git a/tests/benchmarks/bench_http_pool.py b/tests/benchmarks/bench_http_pool.py index 6e41b204..b34d5464 100644 --- a/tests/benchmarks/bench_http_pool.py +++ b/tests/benchmarks/bench_http_pool.py @@ -26,7 +26,7 @@ import pytest -from fireflyframework_genai.tools.builtins.http import HTTPX_AVAILABLE, HttpTool +from fireflyframework_agentic.tools.builtins.http import HTTPX_AVAILABLE, HttpTool @pytest.fixture diff --git a/tests/benchmarks/bench_streaming_latency.py b/tests/benchmarks/bench_streaming_latency.py index c7e43d96..b76e6983 100644 --- a/tests/benchmarks/bench_streaming_latency.py +++ b/tests/benchmarks/bench_streaming_latency.py @@ -27,7 +27,7 @@ import pytest -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent @pytest.mark.benchmark(group="streaming-latency") diff --git a/tests/conftest.py b/tests/conftest.py index 07fedf15..3748272c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Shared test fixtures for the fireflyframework-genai test suite.""" +"""Shared test fixtures for the fireflyframework-agentic test suite.""" from __future__ import annotations @@ -22,9 +22,9 @@ @pytest.fixture(autouse=True) def _clear_registries(): """Reset global registries between tests to avoid cross-test contamination.""" - from fireflyframework_genai.agents.registry import agent_registry - from fireflyframework_genai.reasoning.registry import reasoning_registry - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.agents.registry import agent_registry + from fireflyframework_agentic.reasoning.registry import reasoning_registry + from fireflyframework_agentic.tools.registry import tool_registry agent_registry._agents.clear() tool_registry.clear() diff --git a/tests/integration/test_full_integration.py b/tests/integration/test_full_integration.py index b2070ece..a57b1119 100644 --- a/tests/integration/test_full_integration.py +++ b/tests/integration/test_full_integration.py @@ -30,13 +30,13 @@ import pytest -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.agents.builtin_middleware import CostGuardMiddleware, LoggingMiddleware -from fireflyframework_genai.agents.prompt_cache import PromptCacheMiddleware -from fireflyframework_genai.memory.manager import MemoryManager -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.steps import AgentStep, BatchLLMStep -from fireflyframework_genai.resilience.circuit_breaker import CircuitBreakerMiddleware +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.agents.builtin_middleware import CostGuardMiddleware, LoggingMiddleware +from fireflyframework_agentic.agents.prompt_cache import PromptCacheMiddleware +from fireflyframework_agentic.memory.manager import MemoryManager +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.steps import AgentStep, BatchLLMStep +from fireflyframework_agentic.resilience.circuit_breaker import CircuitBreakerMiddleware @pytest.mark.asyncio @@ -141,7 +141,7 @@ async def aggregate(context, inputs): builder.add_edge("classify", "aggregate") # Run pipeline - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext pipeline = builder.build() result = await pipeline.run(PipelineContext(inputs={})) @@ -175,7 +175,7 @@ async def test_memory_persistence_across_requests(self): async def test_agent_step_in_pipeline_with_memory(self): """Test AgentStep in pipeline preserves memory.""" - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext memory = MemoryManager() @@ -205,7 +205,7 @@ async def test_circuit_breaker_with_batch_processing(self): step = BatchLLMStep(agent, prompts_key="prompts", batch_size=5) - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext context = PipelineContext(inputs={}, correlation_id="test") inputs = {"prompts": ["P1", "P2", "P3"]} @@ -287,7 +287,7 @@ async def test_all_middleware_together(self): async def test_pipeline_with_all_step_types(self): """Test pipeline with various step types.""" - from fireflyframework_genai.pipeline.context import PipelineContext + from fireflyframework_agentic.pipeline.context import PipelineContext agent = FireflyAgent("step-agent", model="test", auto_register=False) diff --git a/tests/memory/test_mongodb_store.py b/tests/memory/test_mongodb_store.py index 870f8711..aacf8fd2 100644 --- a/tests/memory/test_mongodb_store.py +++ b/tests/memory/test_mongodb_store.py @@ -25,8 +25,8 @@ import pytest -from fireflyframework_genai.exceptions import DatabaseConnectionError, DatabaseStoreError -from fireflyframework_genai.memory.types import MemoryEntry, MemoryScope +from fireflyframework_agentic.exceptions import DatabaseConnectionError, DatabaseStoreError +from fireflyframework_agentic.memory.types import MemoryEntry, MemoryScope @pytest.fixture @@ -77,7 +77,7 @@ class TestMongoDBStore: async def test_import_error_without_motor(self): """Test that helpful error is raised when motor is not installed.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore store = MongoDBStore(url="mongodb://test") @@ -89,7 +89,7 @@ async def test_import_error_without_motor(self): async def test_connection_failure(self): """Test handling of connection failures.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore store = MongoDBStore(url="mongodb://invalid:27017/") @@ -103,7 +103,7 @@ async def test_connection_failure(self): async def test_initialize_creates_indexes(self, mock_motor_client): """Test that initialize creates indexes.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, _ = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -116,7 +116,7 @@ async def test_initialize_creates_indexes(self, mock_motor_client): async def test_save_entry(self, mock_motor_client): """Test saving a memory entry.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, _ = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -139,7 +139,7 @@ async def test_save_entry(self, mock_motor_client): async def test_load_entries(self, mock_motor_client): """Test loading entries from a namespace.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, cursor = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -158,7 +158,7 @@ async def test_load_entries(self, mock_motor_client): async def test_load_filters_expired(self, mock_motor_client): """Test that load filters out expired entries.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, cursor = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -176,7 +176,7 @@ async def test_load_filters_expired(self, mock_motor_client): async def test_load_by_key(self, mock_motor_client): """Test loading a specific entry by key.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, _ = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -195,7 +195,7 @@ async def test_load_by_key(self, mock_motor_client): async def test_load_by_key_not_found(self, mock_motor_client): """Test loading non-existent key returns None.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, _ = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -211,7 +211,7 @@ async def test_load_by_key_not_found(self, mock_motor_client): async def test_delete_entry(self, mock_motor_client): """Test deleting an entry.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, _ = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -230,7 +230,7 @@ async def test_delete_entry(self, mock_motor_client): async def test_clear_namespace(self, mock_motor_client): """Test clearing all entries in a namespace.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, _ = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -248,7 +248,7 @@ async def test_clear_namespace(self, mock_motor_client): async def test_cleanup_expired(self, mock_motor_client): """Test cleanup of expired entries.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, _ = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -269,7 +269,7 @@ async def test_cleanup_expired(self, mock_motor_client): async def test_close_connection(self, mock_motor_client): """Test closing the MongoDB connection.""" - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, _, _, _ = mock_motor_client store = MongoDBStore(url="mongodb://test") @@ -288,7 +288,7 @@ async def test_sync_wrappers(self, mock_motor_client): within an already-running event loop. Instead of calling them directly we verify they delegate to the async implementations. """ - from fireflyframework_genai.memory.database_store import MongoDBStore + from fireflyframework_agentic.memory.database_store import MongoDBStore client, db, collection, cursor = mock_motor_client store = MongoDBStore(url="mongodb://test") diff --git a/tests/memory/test_postgres_store.py b/tests/memory/test_postgres_store.py index 26f0055f..7bef9de6 100644 --- a/tests/memory/test_postgres_store.py +++ b/tests/memory/test_postgres_store.py @@ -25,8 +25,8 @@ import pytest -from fireflyframework_genai.exceptions import DatabaseConnectionError, DatabaseStoreError -from fireflyframework_genai.memory.types import MemoryEntry, MemoryScope +from fireflyframework_agentic.exceptions import DatabaseConnectionError, DatabaseStoreError +from fireflyframework_agentic.memory.types import MemoryEntry, MemoryScope @pytest.fixture @@ -63,7 +63,7 @@ class TestPostgreSQLStore: async def test_import_error_without_asyncpg(self): """Test that helpful error is raised when asyncpg is not installed.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore store = PostgreSQLStore(url="postgresql://test") @@ -75,7 +75,7 @@ async def test_import_error_without_asyncpg(self): async def test_connection_failure(self): """Test handling of connection failures.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore store = PostgreSQLStore(url="postgresql://invalid:5432/db") @@ -87,7 +87,7 @@ async def test_connection_failure(self): async def test_initialize_creates_schema(self, mock_asyncpg_pool): """Test that initialize creates schema and tables.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test", schema_name="test_schema") @@ -103,7 +103,7 @@ async def test_initialize_creates_schema(self, mock_asyncpg_pool): async def test_save_entry(self, mock_asyncpg_pool): """Test saving a memory entry.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") @@ -128,7 +128,7 @@ async def test_save_entry(self, mock_asyncpg_pool): async def test_load_entries(self, mock_asyncpg_pool): """Test loading entries from a namespace.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") @@ -147,7 +147,7 @@ async def test_load_entries(self, mock_asyncpg_pool): async def test_load_by_key(self, mock_asyncpg_pool): """Test loading a specific entry by key.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") @@ -166,7 +166,7 @@ async def test_load_by_key(self, mock_asyncpg_pool): async def test_load_by_key_not_found(self, mock_asyncpg_pool): """Test loading non-existent key returns None.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") @@ -182,7 +182,7 @@ async def test_load_by_key_not_found(self, mock_asyncpg_pool): async def test_delete_entry(self, mock_asyncpg_pool): """Test deleting an entry.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") @@ -200,7 +200,7 @@ async def test_delete_entry(self, mock_asyncpg_pool): async def test_clear_namespace(self, mock_asyncpg_pool): """Test clearing all entries in a namespace.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") @@ -217,7 +217,7 @@ async def test_clear_namespace(self, mock_asyncpg_pool): async def test_cleanup_expired(self, mock_asyncpg_pool): """Test cleanup of expired entries.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") @@ -236,7 +236,7 @@ async def test_cleanup_expired(self, mock_asyncpg_pool): async def test_close_pool(self, mock_asyncpg_pool): """Test closing the connection pool.""" - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, _ = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") @@ -255,7 +255,7 @@ async def test_sync_wrappers(self, mock_asyncpg_pool): within an already-running event loop. Instead of calling them directly we verify they delegate to the async implementations. """ - from fireflyframework_genai.memory.database_store import PostgreSQLStore + from fireflyframework_agentic.memory.database_store import PostgreSQLStore pool, connection = mock_asyncpg_pool store = PostgreSQLStore(url="postgresql://test") diff --git a/tests/observability/test_quota_manager.py b/tests/observability/test_quota_manager.py index 4cc6af6b..0c465e18 100644 --- a/tests/observability/test_quota_manager.py +++ b/tests/observability/test_quota_manager.py @@ -20,8 +20,8 @@ import pytest -from fireflyframework_genai.exceptions import BudgetExceededError, RateLimitError -from fireflyframework_genai.observability.quota import AdaptiveBackoff, QuotaManager, RateLimiter +from fireflyframework_agentic.exceptions import BudgetExceededError, RateLimitError +from fireflyframework_agentic.observability.quota import AdaptiveBackoff, QuotaManager, RateLimiter class TestRateLimiter: diff --git a/tests/observability/test_trace_propagation.py b/tests/observability/test_trace_propagation.py index ee850453..f9685d23 100644 --- a/tests/observability/test_trace_propagation.py +++ b/tests/observability/test_trace_propagation.py @@ -21,7 +21,7 @@ from opentelemetry.sdk.trace import TracerProvider from opentelemetry.trace import SpanContext, TraceFlags -from fireflyframework_genai.observability.tracer import ( +from fireflyframework_agentic.observability.tracer import ( extract_trace_context, get_trace_context, inject_trace_context, diff --git a/tests/pipeline/test_batch_step.py b/tests/pipeline/test_batch_step.py index bf7e0df4..33126ed4 100644 --- a/tests/pipeline/test_batch_step.py +++ b/tests/pipeline/test_batch_step.py @@ -18,9 +18,9 @@ import pytest -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.steps import BatchLLMStep +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.steps import BatchLLMStep @pytest.mark.asyncio diff --git a/tests/resilience/test_circuit_breaker.py b/tests/resilience/test_circuit_breaker.py index c902d3c4..18e0981c 100644 --- a/tests/resilience/test_circuit_breaker.py +++ b/tests/resilience/test_circuit_breaker.py @@ -20,7 +20,7 @@ import pytest -from fireflyframework_genai.resilience.circuit_breaker import ( +from fireflyframework_agentic.resilience.circuit_breaker import ( CircuitBreaker, CircuitBreakerOpenError, CircuitState, diff --git a/tests/security/test_encryption.py b/tests/security/test_encryption.py index e935a253..bf8c5650 100644 --- a/tests/security/test_encryption.py +++ b/tests/security/test_encryption.py @@ -21,9 +21,9 @@ # Check if cryptography is available pytest.importorskip("cryptography", reason="Encryption tests require cryptography") -from fireflyframework_genai.memory.store import InMemoryStore -from fireflyframework_genai.memory.types import MemoryEntry, MemoryScope -from fireflyframework_genai.security.encryption import AESEncryptionProvider, EncryptedMemoryStore +from fireflyframework_agentic.memory.store import InMemoryStore +from fireflyframework_agentic.memory.types import MemoryEntry, MemoryScope +from fireflyframework_agentic.security.encryption import AESEncryptionProvider, EncryptedMemoryStore class TestAESEncryptionProvider: diff --git a/tests/security/test_rbac.py b/tests/security/test_rbac.py index 8dd57ee3..cf209c5c 100644 --- a/tests/security/test_rbac.py +++ b/tests/security/test_rbac.py @@ -21,7 +21,7 @@ # Check if JWT is available pytest.importorskip("jwt", reason="JWT tests require pyjwt") -from fireflyframework_genai.security.rbac import RBACManager, require_permission +from fireflyframework_agentic.security.rbac import RBACManager, require_permission class TestRBACManager: diff --git a/tests/security/test_sql_injection.py b/tests/security/test_sql_injection.py index 31793fa9..6013099a 100644 --- a/tests/security/test_sql_injection.py +++ b/tests/security/test_sql_injection.py @@ -20,8 +20,8 @@ import pytest -from fireflyframework_genai.exceptions import ToolError -from fireflyframework_genai.tools.builtins.database import DatabaseTool +from fireflyframework_agentic.exceptions import ToolError +from fireflyframework_agentic.tools.builtins.database import DatabaseTool class TestDatabaseTool(DatabaseTool): diff --git a/tests/test_agents/test_agent_usage.py b/tests/test_agents/test_agent_usage.py index 329e4283..508c4353 100644 --- a/tests/test_agents/test_agent_usage.py +++ b/tests/test_agents/test_agent_usage.py @@ -18,9 +18,9 @@ from unittest.mock import patch -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.config import reset_config -from fireflyframework_genai.observability.usage import UsageTracker +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.config import reset_config +from fireflyframework_agentic.observability.usage import UsageTracker class _FakeUsage: @@ -56,7 +56,7 @@ def test_record_usage_creates_record(self): fake_result = _FakeResult(usage=_FakeUsage(input_tokens=100, output_tokens=50, total_tokens=150)) with patch( - "fireflyframework_genai.observability.usage.default_usage_tracker", + "fireflyframework_agentic.observability.usage.default_usage_tracker", tracker, ): agent._record_usage(fake_result, 42.0) @@ -74,7 +74,7 @@ def test_record_usage_with_correlation_id(self): fake_result = _FakeResult(usage=_FakeUsage(total_tokens=50)) with patch( - "fireflyframework_genai.observability.usage.default_usage_tracker", + "fireflyframework_agentic.observability.usage.default_usage_tracker", tracker, ): agent._record_usage(fake_result, 10.0, correlation_id="pipe-123") @@ -90,7 +90,7 @@ def test_record_usage_cost_calculation(self): fake_result = _FakeResult(usage=_FakeUsage(input_tokens=1000, output_tokens=500, total_tokens=1500)) with patch( - "fireflyframework_genai.observability.usage.default_usage_tracker", + "fireflyframework_agentic.observability.usage.default_usage_tracker", tracker, ): agent._record_usage(fake_result, 100.0) @@ -100,7 +100,7 @@ def test_record_usage_cost_calculation(self): assert records[0].cost_usd > 0 # cost should be calculated def test_record_usage_disabled(self, monkeypatch): - monkeypatch.setenv("FIREFLY_GENAI_COST_TRACKING_ENABLED", "false") + monkeypatch.setenv("FIREFLY_AGENTIC_COST_TRACKING_ENABLED", "false") reset_config() agent = FireflyAgent(name="disabled-test", model="test", auto_register=False) @@ -108,7 +108,7 @@ def test_record_usage_disabled(self, monkeypatch): fake_result = _FakeResult() with patch( - "fireflyframework_genai.observability.usage.default_usage_tracker", + "fireflyframework_agentic.observability.usage.default_usage_tracker", tracker, ): agent._record_usage(fake_result, 10.0) @@ -125,7 +125,7 @@ class _NoUsageResult: output = "hi" with patch( - "fireflyframework_genai.observability.usage.default_usage_tracker", + "fireflyframework_agentic.observability.usage.default_usage_tracker", tracker, ): agent._record_usage(_NoUsageResult(), 10.0) @@ -138,7 +138,7 @@ def test_record_usage_agent_name_in_record(self): fake_result = _FakeResult(usage=_FakeUsage(total_tokens=10)) with patch( - "fireflyframework_genai.observability.usage.default_usage_tracker", + "fireflyframework_agentic.observability.usage.default_usage_tracker", tracker, ): agent._record_usage(fake_result, 5.0) diff --git a/tests/test_agents/test_base.py b/tests/test_agents/test_base.py index b14f9f86..2c183e89 100644 --- a/tests/test_agents/test_base.py +++ b/tests/test_agents/test_base.py @@ -18,7 +18,7 @@ from pydantic_ai.models import Model -from fireflyframework_genai.agents.base import FireflyAgent +from fireflyframework_agentic.agents.base import FireflyAgent class TestFireflyAgent: diff --git a/tests/test_agents/test_cache.py b/tests/test_agents/test_cache.py index 71e65847..c0d0157e 100644 --- a/tests/test_agents/test_cache.py +++ b/tests/test_agents/test_cache.py @@ -4,7 +4,7 @@ import time -from fireflyframework_genai.agents.cache import ResultCache +from fireflyframework_agentic.agents.cache import ResultCache class TestResultCache: diff --git a/tests/test_agents/test_context.py b/tests/test_agents/test_context.py index b45090e9..51b5f365 100644 --- a/tests/test_agents/test_context.py +++ b/tests/test_agents/test_context.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.agents.context import AgentContext +from fireflyframework_agentic.agents.context import AgentContext class TestAgentContext: diff --git a/tests/test_agents/test_decorators.py b/tests/test_agents/test_decorators.py index 590ffeb5..eebe58cd 100644 --- a/tests/test_agents/test_decorators.py +++ b/tests/test_agents/test_decorators.py @@ -4,9 +4,9 @@ from pydantic_ai.models.test import TestModel -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.agents.decorators import firefly_agent -from fireflyframework_genai.agents.registry import agent_registry +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.agents.decorators import firefly_agent +from fireflyframework_agentic.agents.registry import agent_registry class TestFireflyAgentDecorator: diff --git a/tests/test_agents/test_delegation.py b/tests/test_agents/test_delegation.py index eed71b9c..c3d7d954 100644 --- a/tests/test_agents/test_delegation.py +++ b/tests/test_agents/test_delegation.py @@ -18,8 +18,8 @@ import pytest -from fireflyframework_genai.agents.delegation import RoundRobinStrategy -from fireflyframework_genai.exceptions import DelegationError +from fireflyframework_agentic.agents.delegation import RoundRobinStrategy +from fireflyframework_agentic.exceptions import DelegationError class TestRoundRobinStrategy: @@ -39,7 +39,7 @@ async def test_empty_agents_raises(self): # -- CostAwareStrategy ------------------------------------------------------- -from fireflyframework_genai.agents.delegation import CostAwareStrategy # noqa: E402 +from fireflyframework_agentic.agents.delegation import CostAwareStrategy # noqa: E402 class _FakeAgent: @@ -98,7 +98,7 @@ async def test_no_model_name(self): # -- ContentBasedStrategy ---------------------------------------------------- -from fireflyframework_genai.agents.delegation import ContentBasedStrategy # noqa: E402 +from fireflyframework_agentic.agents.delegation import ContentBasedStrategy # noqa: E402 class TestContentBasedStrategy: diff --git a/tests/test_agents/test_fallback.py b/tests/test_agents/test_fallback.py index 1b71b07b..7886dcd1 100644 --- a/tests/test_agents/test_fallback.py +++ b/tests/test_agents/test_fallback.py @@ -6,7 +6,7 @@ import pytest -from fireflyframework_genai.agents.fallback import FallbackModelWrapper +from fireflyframework_agentic.agents.fallback import FallbackModelWrapper class TestFallbackModelWrapper: diff --git a/tests/test_agents/test_lifecycle.py b/tests/test_agents/test_lifecycle.py index 6a1746a4..ac23ed24 100644 --- a/tests/test_agents/test_lifecycle.py +++ b/tests/test_agents/test_lifecycle.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.agents.lifecycle import AgentLifecycle +from fireflyframework_agentic.agents.lifecycle import AgentLifecycle class TestAgentLifecycle: diff --git a/tests/test_agents/test_middleware.py b/tests/test_agents/test_middleware.py index 715917f5..06708eed 100644 --- a/tests/test_agents/test_middleware.py +++ b/tests/test_agents/test_middleware.py @@ -4,19 +4,19 @@ import pytest -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.agents.builtin_middleware import ( +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.agents.builtin_middleware import ( BudgetExceededError, CostGuardMiddleware, PromptGuardError, PromptGuardMiddleware, ) -from fireflyframework_genai.agents.decorators import firefly_agent -from fireflyframework_genai.agents.middleware import ( +from fireflyframework_agentic.agents.decorators import firefly_agent +from fireflyframework_agentic.agents.middleware import ( MiddlewareChain, MiddlewareContext, ) -from fireflyframework_genai.observability.usage import UsageTracker +from fireflyframework_agentic.observability.usage import UsageTracker # -- Helpers ---------------------------------------------------------------- @@ -159,7 +159,7 @@ class TestMiddlewareOnRunWithReasoning: """Verify middleware fires on ``run_with_reasoning()``.""" async def test_run_with_reasoning_fires_middleware(self) -> None: - from fireflyframework_genai.reasoning.trace import ReasoningResult, ReasoningTrace + from fireflyframework_agentic.reasoning.trace import ReasoningResult, ReasoningTrace class _MockPattern: name = "mock" @@ -252,11 +252,11 @@ async def test_passthrough_after_run(self) -> None: class TestLoggingMiddleware: async def test_emits_before_and_after(self, caplog) -> None: - from fireflyframework_genai.agents.builtin_middleware import LoggingMiddleware + from fireflyframework_agentic.agents.builtin_middleware import LoggingMiddleware mw = LoggingMiddleware() ctx = MiddlewareContext(agent_name="myagent", prompt="hi", method="run") - with caplog.at_level("INFO", logger="fireflyframework_genai.agents.builtin_middleware"): + with caplog.at_level("INFO", logger="fireflyframework_agentic.agents.builtin_middleware"): await mw.before_run(ctx) await mw.after_run(ctx, "result") messages = [r.message for r in caplog.records] @@ -264,8 +264,8 @@ async def test_emits_before_and_after(self, caplog) -> None: assert any("completed" in m for m in messages) async def test_reasoning_suffix(self) -> None: - from fireflyframework_genai.agents.builtin_middleware import LoggingMiddleware - from fireflyframework_genai.reasoning.trace import ReasoningResult, ReasoningTrace + from fireflyframework_agentic.agents.builtin_middleware import LoggingMiddleware + from fireflyframework_agentic.reasoning.trace import ReasoningResult, ReasoningTrace result = ReasoningResult( output="out", @@ -282,14 +282,14 @@ async def test_reasoning_suffix(self) -> None: class TestDefaultMiddleware: def test_auto_wires_logging_middleware(self) -> None: - from fireflyframework_genai.agents.builtin_middleware import LoggingMiddleware + from fireflyframework_agentic.agents.builtin_middleware import LoggingMiddleware agent = FireflyAgent("auto-test", model="test", auto_register=False) has_logging = any(isinstance(m, LoggingMiddleware) for m in agent.middleware._middlewares) assert has_logging def test_default_middleware_false_skips(self) -> None: - from fireflyframework_genai.agents.builtin_middleware import LoggingMiddleware + from fireflyframework_agentic.agents.builtin_middleware import LoggingMiddleware agent = FireflyAgent( "no-default", @@ -301,7 +301,7 @@ def test_default_middleware_false_skips(self) -> None: assert not has_logging def test_no_duplication_when_user_provides_logging(self) -> None: - from fireflyframework_genai.agents.builtin_middleware import LoggingMiddleware + from fireflyframework_agentic.agents.builtin_middleware import LoggingMiddleware user_mw = LoggingMiddleware(level=20) agent = FireflyAgent( @@ -402,7 +402,7 @@ def instruct(ctx): assert len(instruct.middleware) == 3 def test_decorator_accepts_memory(self) -> None: - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.memory.manager import MemoryManager mem = MemoryManager() @@ -420,11 +420,11 @@ class TestColoredFormatter: def test_format_contains_ansi(self) -> None: import logging as stdlib_logging - from fireflyframework_genai.logging import ColoredFormatter + from fireflyframework_agentic.logging import ColoredFormatter fmt = ColoredFormatter() record = stdlib_logging.LogRecord( - name="fireflyframework_genai.agents.builtin_middleware", + name="fireflyframework_agentic.agents.builtin_middleware", level=stdlib_logging.INFO, pathname="", lineno=0, diff --git a/tests/test_agents/test_registry.py b/tests/test_agents/test_registry.py index 58030fe1..4f865212 100644 --- a/tests/test_agents/test_registry.py +++ b/tests/test_agents/test_registry.py @@ -18,8 +18,8 @@ import pytest -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.agents.registry import AgentRegistry +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.agents.registry import AgentRegistry class TestAgentRegistry: @@ -37,7 +37,7 @@ def test_has_agent(self): assert not registry.has("nonexistent") def test_get_nonexistent_raises(self): - from fireflyframework_genai.exceptions import AgentNotFoundError + from fireflyframework_agentic.exceptions import AgentNotFoundError registry = AgentRegistry() with pytest.raises(AgentNotFoundError): diff --git a/tests/test_agents/test_templates.py b/tests/test_agents/test_templates.py index 83142799..fb4a6f0a 100644 --- a/tests/test_agents/test_templates.py +++ b/tests/test_agents/test_templates.py @@ -19,23 +19,23 @@ import pytest from pydantic import BaseModel -from fireflyframework_genai.agents.base import FireflyAgent -from fireflyframework_genai.agents.registry import agent_registry -from fireflyframework_genai.agents.templates.classifier import ( +from fireflyframework_agentic.agents.base import FireflyAgent +from fireflyframework_agentic.agents.registry import agent_registry +from fireflyframework_agentic.agents.templates.classifier import ( ClassificationResult, create_classifier_agent, ) -from fireflyframework_genai.agents.templates.conversational import ( +from fireflyframework_agentic.agents.templates.conversational import ( create_conversational_agent, ) -from fireflyframework_genai.agents.templates.extractor import ( +from fireflyframework_agentic.agents.templates.extractor import ( create_extractor_agent, ) -from fireflyframework_genai.agents.templates.router import ( +from fireflyframework_agentic.agents.templates.router import ( RoutingDecision, create_router_agent, ) -from fireflyframework_genai.agents.templates.summarizer import ( +from fireflyframework_agentic.agents.templates.summarizer import ( create_summarizer_agent, ) @@ -193,7 +193,7 @@ def test_custom_personality_and_domain(self) -> None: assert "healthcare" in agent.description def test_with_memory(self) -> None: - from fireflyframework_genai.memory.manager import MemoryManager + from fireflyframework_agentic.memory.manager import MemoryManager mem = MemoryManager() agent = create_conversational_agent(name="mem-agent", model="test", memory=mem) @@ -253,7 +253,7 @@ class TestTemplateImports: """Verify that all template factories are importable from the agents package.""" def test_imports_from_agents(self) -> None: - from fireflyframework_genai.agents import ( + from fireflyframework_agentic.agents import ( create_classifier_agent, create_conversational_agent, create_extractor_agent, diff --git a/tests/test_config.py b/tests/test_config.py index bce217e6..3c694386 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -5,12 +5,12 @@ import pytest from pydantic import ValidationError -from fireflyframework_genai.config import FireflyGenAIConfig +from fireflyframework_agentic.config import FireflyAgenticConfig class TestConfigValidation: def test_valid_config(self) -> None: - cfg = FireflyGenAIConfig( + cfg = FireflyAgenticConfig( budget_limit_usd=10.0, budget_alert_threshold_usd=5.0, ) @@ -18,42 +18,42 @@ def test_valid_config(self) -> None: def test_alert_exceeds_limit_raises(self) -> None: with pytest.raises(ValidationError, match="budget_alert_threshold_usd"): - FireflyGenAIConfig( + FireflyAgenticConfig( budget_limit_usd=5.0, budget_alert_threshold_usd=10.0, ) def test_chunk_overlap_exceeds_size_raises(self) -> None: with pytest.raises(ValidationError, match="default_chunk_overlap"): - FireflyGenAIConfig( + FireflyAgenticConfig( default_chunk_size=100, default_chunk_overlap=200, ) def test_qos_consistency_runs_minimum(self) -> None: with pytest.raises(ValidationError, match="qos_consistency_runs"): - FireflyGenAIConfig(qos_consistency_runs=1) + FireflyAgenticConfig(qos_consistency_runs=1) def test_default_config_is_valid(self) -> None: - cfg = FireflyGenAIConfig() + cfg = FireflyAgenticConfig() assert cfg.qos_consistency_runs >= 2 class TestConfigAuthAndUsageFields: def test_auth_api_keys_default(self) -> None: - cfg = FireflyGenAIConfig() + cfg = FireflyAgenticConfig() assert cfg.auth_api_keys is None def test_auth_bearer_tokens_default(self) -> None: - cfg = FireflyGenAIConfig() + cfg = FireflyAgenticConfig() assert cfg.auth_bearer_tokens is None def test_usage_tracker_max_records_default(self) -> None: - cfg = FireflyGenAIConfig() + cfg = FireflyAgenticConfig() assert cfg.usage_tracker_max_records == 10_000 def test_custom_values(self) -> None: - cfg = FireflyGenAIConfig( + cfg = FireflyAgenticConfig( auth_api_keys=["key1"], auth_bearer_tokens=["tok1"], usage_tracker_max_records=500, @@ -65,12 +65,12 @@ def test_custom_values(self) -> None: class TestEmbeddingConfig: def test_embedding_defaults(self) -> None: - cfg = FireflyGenAIConfig() + cfg = FireflyAgenticConfig() assert cfg.default_embedding_model == "openai:text-embedding-3-small" assert cfg.embedding_batch_size == 100 assert cfg.embedding_max_retries == 3 def test_vector_store_defaults(self) -> None: - cfg = FireflyGenAIConfig() + cfg = FireflyAgenticConfig() assert cfg.default_vector_store == "memory" assert cfg.vector_store_namespace == "default" diff --git a/tests/test_content/test_chunking.py b/tests/test_content/test_chunking.py index 6cb90175..c7bf2788 100644 --- a/tests/test_content/test_chunking.py +++ b/tests/test_content/test_chunking.py @@ -16,7 +16,7 @@ import pytest -from fireflyframework_genai.content.chunking import ( +from fireflyframework_agentic.content.chunking import ( BatchProcessor, Chunk, Chunker, diff --git a/tests/test_content/test_compression.py b/tests/test_content/test_compression.py index d86ca759..3c5f308a 100644 --- a/tests/test_content/test_compression.py +++ b/tests/test_content/test_compression.py @@ -14,7 +14,7 @@ """Tests for content compression utilities.""" -from fireflyframework_genai.content.compression import ( +from fireflyframework_agentic.content.compression import ( ContextCompressor, SlidingWindowManager, TokenEstimator, diff --git a/tests/test_core.py b/tests/test_core.py index 86134caa..17a2e651 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -16,14 +16,14 @@ from __future__ import annotations -from fireflyframework_genai.config import FireflyGenAIConfig -from fireflyframework_genai.exceptions import ( +from fireflyframework_agentic.config import FireflyAgenticConfig +from fireflyframework_agentic.exceptions import ( AgentError, ConfigurationError, - FireflyGenAIError, + FireflyAgenticError, ToolError, ) -from fireflyframework_genai.types import JSON, AgentDepsT, Metadata +from fireflyframework_agentic.types import JSON, AgentDepsT, Metadata class TestTypes: @@ -40,28 +40,28 @@ def test_agent_deps_type_var(self): class TestExceptions: def test_base_exception_hierarchy(self): - err = FireflyGenAIError("test") + err = FireflyAgenticError("test") assert isinstance(err, Exception) assert str(err) == "test" def test_agent_error_is_firefly_error(self): err = AgentError("agent failed") - assert isinstance(err, FireflyGenAIError) + assert isinstance(err, FireflyAgenticError) def test_tool_error_is_firefly_error(self): err = ToolError("tool failed") - assert isinstance(err, FireflyGenAIError) + assert isinstance(err, FireflyAgenticError) def test_configuration_error_is_firefly_error(self): err = ConfigurationError("bad config") - assert isinstance(err, FireflyGenAIError) + assert isinstance(err, FireflyAgenticError) class TestConfig: def test_config_creates_instance(self): - config = FireflyGenAIConfig() + config = FireflyAgenticConfig() assert config is not None def test_config_has_default_model(self): - config = FireflyGenAIConfig() + config = FireflyAgenticConfig() assert isinstance(config.default_model, str) diff --git a/tests/test_embeddings/test_base.py b/tests/test_embeddings/test_base.py index 6ef40a22..abd50bae 100644 --- a/tests/test_embeddings/test_base.py +++ b/tests/test_embeddings/test_base.py @@ -2,8 +2,8 @@ from __future__ import annotations -from fireflyframework_genai.embeddings.base import BaseEmbedder, EmbeddingProtocol -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.base import BaseEmbedder, EmbeddingProtocol +from fireflyframework_agentic.embeddings.types import EmbeddingResult class _FakeEmbedder(BaseEmbedder): diff --git a/tests/test_embeddings/test_exceptions.py b/tests/test_embeddings/test_exceptions.py index 4d5710cf..2fbd1c5c 100644 --- a/tests/test_embeddings/test_exceptions.py +++ b/tests/test_embeddings/test_exceptions.py @@ -2,10 +2,10 @@ from __future__ import annotations -from fireflyframework_genai.exceptions import ( +from fireflyframework_agentic.exceptions import ( EmbeddingError, EmbeddingProviderError, - FireflyGenAIError, + FireflyAgenticError, VectorStoreConnectionError, VectorStoreError, ) @@ -13,13 +13,13 @@ class TestEmbeddingExceptions: def test_embedding_error_inherits_base(self): - assert issubclass(EmbeddingError, FireflyGenAIError) + assert issubclass(EmbeddingError, FireflyAgenticError) def test_embedding_provider_error_inherits_embedding(self): assert issubclass(EmbeddingProviderError, EmbeddingError) def test_vector_store_error_inherits_base(self): - assert issubclass(VectorStoreError, FireflyGenAIError) + assert issubclass(VectorStoreError, FireflyAgenticError) def test_vector_store_connection_inherits(self): assert issubclass(VectorStoreConnectionError, VectorStoreError) diff --git a/tests/test_embeddings/test_init.py b/tests/test_embeddings/test_init.py index 5c06bc59..cb1ebadb 100644 --- a/tests/test_embeddings/test_init.py +++ b/tests/test_embeddings/test_init.py @@ -5,7 +5,7 @@ class TestEmbeddingsPublicAPI: def test_core_imports(self): - from fireflyframework_genai.embeddings import ( + from fireflyframework_agentic.embeddings import ( BaseEmbedder, EmbedderRegistry, EmbeddingProtocol, @@ -26,6 +26,6 @@ def test_core_imports(self): assert euclidean_distance is not None def test_provider_imports(self): - from fireflyframework_genai.embeddings.providers.openai import OpenAIEmbedder + from fireflyframework_agentic.embeddings.providers.openai import OpenAIEmbedder assert OpenAIEmbedder is not None diff --git a/tests/test_embeddings/test_providers/test_azure.py b/tests/test_embeddings/test_providers/test_azure.py index 6eec8f78..2a90ec21 100644 --- a/tests/test_embeddings/test_providers/test_azure.py +++ b/tests/test_embeddings/test_providers/test_azure.py @@ -4,12 +4,12 @@ from unittest.mock import AsyncMock, MagicMock, patch -from fireflyframework_genai.embeddings.providers.azure import AzureEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.providers.azure import AzureEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult class TestAzureEmbedder: - @patch("fireflyframework_genai.embeddings.providers.azure.AsyncAzureOpenAI") + @patch("fireflyframework_agentic.embeddings.providers.azure.AsyncAzureOpenAI") async def test_embed_batch(self, mock_client_cls): mock_client = MagicMock() mock_client_cls.return_value = mock_client @@ -33,7 +33,7 @@ async def test_embed_batch(self, mock_client_cls): assert len(result.embeddings) == 2 assert result.model == "text-embedding-ada-002" - @patch("fireflyframework_genai.embeddings.providers.azure.AsyncAzureOpenAI") + @patch("fireflyframework_agentic.embeddings.providers.azure.AsyncAzureOpenAI") async def test_embed_one(self, mock_client_cls): mock_client = MagicMock() mock_client_cls.return_value = mock_client @@ -53,7 +53,7 @@ async def test_embed_one(self, mock_client_cls): assert isinstance(vec, list) assert len(vec) == 2 - @patch("fireflyframework_genai.embeddings.providers.azure.AsyncAzureOpenAI") + @patch("fireflyframework_agentic.embeddings.providers.azure.AsyncAzureOpenAI") def test_model_name(self, mock_client_cls): embedder = AzureEmbedder( model="text-embedding-ada-002", diff --git a/tests/test_embeddings/test_providers/test_bedrock.py b/tests/test_embeddings/test_providers/test_bedrock.py index ecaaf6aa..e5fddda7 100644 --- a/tests/test_embeddings/test_providers/test_bedrock.py +++ b/tests/test_embeddings/test_providers/test_bedrock.py @@ -6,12 +6,12 @@ import json from unittest.mock import MagicMock, patch -from fireflyframework_genai.embeddings.providers.bedrock import BedrockEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.providers.bedrock import BedrockEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult class TestBedrockEmbedder: - @patch("fireflyframework_genai.embeddings.providers.bedrock.boto3") + @patch("fireflyframework_agentic.embeddings.providers.bedrock.boto3") async def test_embed_batch(self, mock_boto3): mock_client = MagicMock() mock_boto3.client.return_value = mock_client @@ -33,7 +33,7 @@ def make_response(embedding): assert len(result.embeddings) == 2 assert result.model == "amazon.titan-embed-text-v2:0" - @patch("fireflyframework_genai.embeddings.providers.bedrock.boto3") + @patch("fireflyframework_agentic.embeddings.providers.bedrock.boto3") async def test_embed_one(self, mock_boto3): mock_client = MagicMock() mock_boto3.client.return_value = mock_client @@ -47,7 +47,7 @@ async def test_embed_one(self, mock_boto3): assert isinstance(vec, list) assert len(vec) == 3 - @patch("fireflyframework_genai.embeddings.providers.bedrock.boto3") + @patch("fireflyframework_agentic.embeddings.providers.bedrock.boto3") def test_default_model(self, mock_boto3): embedder = BedrockEmbedder() assert embedder.model == "amazon.titan-embed-text-v2:0" diff --git a/tests/test_embeddings/test_providers/test_cohere.py b/tests/test_embeddings/test_providers/test_cohere.py index af42e3ce..785943f1 100644 --- a/tests/test_embeddings/test_providers/test_cohere.py +++ b/tests/test_embeddings/test_providers/test_cohere.py @@ -4,12 +4,12 @@ from unittest.mock import AsyncMock, MagicMock, patch -from fireflyframework_genai.embeddings.providers.cohere import CohereEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.providers.cohere import CohereEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult class TestCohereEmbedder: - @patch("fireflyframework_genai.embeddings.providers.cohere.AsyncCohere") + @patch("fireflyframework_agentic.embeddings.providers.cohere.AsyncCohere") async def test_embed_batch(self, mock_client_cls): mock_client = MagicMock() mock_client_cls.return_value = mock_client @@ -26,7 +26,7 @@ async def test_embed_batch(self, mock_client_cls): assert len(result.embeddings) == 2 assert result.model == "embed-english-v3.0" - @patch("fireflyframework_genai.embeddings.providers.cohere.AsyncCohere") + @patch("fireflyframework_agentic.embeddings.providers.cohere.AsyncCohere") async def test_embed_one(self, mock_client_cls): mock_client = MagicMock() mock_client_cls.return_value = mock_client @@ -42,7 +42,7 @@ async def test_embed_one(self, mock_client_cls): assert isinstance(vec, list) assert len(vec) == 3 - @patch("fireflyframework_genai.embeddings.providers.cohere.AsyncCohere") + @patch("fireflyframework_agentic.embeddings.providers.cohere.AsyncCohere") def test_default_model(self, mock_client_cls): embedder = CohereEmbedder() assert embedder.model == "embed-english-v3.0" diff --git a/tests/test_embeddings/test_providers/test_mistral.py b/tests/test_embeddings/test_providers/test_mistral.py index 85571e0c..8548fd6e 100644 --- a/tests/test_embeddings/test_providers/test_mistral.py +++ b/tests/test_embeddings/test_providers/test_mistral.py @@ -4,12 +4,12 @@ from unittest.mock import AsyncMock, MagicMock, patch -from fireflyframework_genai.embeddings.providers.mistral import MistralEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.providers.mistral import MistralEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult class TestMistralEmbedder: - @patch("fireflyframework_genai.embeddings.providers.mistral.Mistral") + @patch("fireflyframework_agentic.embeddings.providers.mistral.Mistral") async def test_embed_batch(self, mock_client_cls): mock_client = MagicMock() mock_client_cls.return_value = mock_client @@ -28,7 +28,7 @@ async def test_embed_batch(self, mock_client_cls): assert len(result.embeddings) == 2 assert result.model == "mistral-embed" - @patch("fireflyframework_genai.embeddings.providers.mistral.Mistral") + @patch("fireflyframework_agentic.embeddings.providers.mistral.Mistral") async def test_embed_one(self, mock_client_cls): mock_client = MagicMock() mock_client_cls.return_value = mock_client @@ -43,7 +43,7 @@ async def test_embed_one(self, mock_client_cls): assert isinstance(vec, list) assert len(vec) == 3 - @patch("fireflyframework_genai.embeddings.providers.mistral.Mistral") + @patch("fireflyframework_agentic.embeddings.providers.mistral.Mistral") def test_default_model(self, mock_client_cls): embedder = MistralEmbedder() assert embedder.model == "mistral-embed" diff --git a/tests/test_embeddings/test_providers/test_ollama.py b/tests/test_embeddings/test_providers/test_ollama.py index 937c67c8..e1f9cfaf 100644 --- a/tests/test_embeddings/test_providers/test_ollama.py +++ b/tests/test_embeddings/test_providers/test_ollama.py @@ -4,12 +4,12 @@ from unittest.mock import AsyncMock, MagicMock, patch -from fireflyframework_genai.embeddings.providers.ollama import OllamaEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.providers.ollama import OllamaEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult class TestOllamaEmbedder: - @patch("fireflyframework_genai.embeddings.providers.ollama.httpx") + @patch("fireflyframework_agentic.embeddings.providers.ollama.httpx") async def test_embed_batch(self, mock_httpx): mock_client = MagicMock() mock_httpx.AsyncClient.return_value = mock_client @@ -26,7 +26,7 @@ async def test_embed_batch(self, mock_httpx): assert len(result.embeddings) == 2 assert result.model == "nomic-embed-text" - @patch("fireflyframework_genai.embeddings.providers.ollama.httpx") + @patch("fireflyframework_agentic.embeddings.providers.ollama.httpx") async def test_embed_one(self, mock_httpx): mock_client = MagicMock() mock_httpx.AsyncClient.return_value = mock_client @@ -42,7 +42,7 @@ async def test_embed_one(self, mock_httpx): assert isinstance(vec, list) assert len(vec) == 3 - @patch("fireflyframework_genai.embeddings.providers.ollama.httpx") + @patch("fireflyframework_agentic.embeddings.providers.ollama.httpx") def test_default_model(self, mock_httpx): embedder = OllamaEmbedder() assert embedder.model == "nomic-embed-text" diff --git a/tests/test_embeddings/test_providers/test_openai.py b/tests/test_embeddings/test_providers/test_openai.py index 97efae77..4e10df4d 100644 --- a/tests/test_embeddings/test_providers/test_openai.py +++ b/tests/test_embeddings/test_providers/test_openai.py @@ -4,12 +4,12 @@ from unittest.mock import AsyncMock, MagicMock, patch -from fireflyframework_genai.embeddings.providers.openai import OpenAIEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.providers.openai import OpenAIEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult class TestOpenAIEmbedder: - @patch("fireflyframework_genai.embeddings.providers.openai.AsyncOpenAI") + @patch("fireflyframework_agentic.embeddings.providers.openai.AsyncOpenAI") async def test_embed_batch(self, mock_client_cls): mock_client = MagicMock() mock_client_cls.return_value = mock_client @@ -29,7 +29,7 @@ async def test_embed_batch(self, mock_client_cls): assert len(result.embeddings) == 2 assert result.model == "text-embedding-3-small" - @patch("fireflyframework_genai.embeddings.providers.openai.AsyncOpenAI") + @patch("fireflyframework_agentic.embeddings.providers.openai.AsyncOpenAI") async def test_embed_one(self, mock_client_cls): mock_client = MagicMock() mock_client_cls.return_value = mock_client @@ -45,7 +45,7 @@ async def test_embed_one(self, mock_client_cls): assert isinstance(vec, list) assert len(vec) == 2 - @patch("fireflyframework_genai.embeddings.providers.openai.AsyncOpenAI") + @patch("fireflyframework_agentic.embeddings.providers.openai.AsyncOpenAI") def test_default_model(self, mock_client_cls): embedder = OpenAIEmbedder() assert embedder.model == "text-embedding-3-small" diff --git a/tests/test_embeddings/test_providers/test_voyage.py b/tests/test_embeddings/test_providers/test_voyage.py index 2c97f15e..953caa60 100644 --- a/tests/test_embeddings/test_providers/test_voyage.py +++ b/tests/test_embeddings/test_providers/test_voyage.py @@ -4,12 +4,12 @@ from unittest.mock import AsyncMock, MagicMock, patch -from fireflyframework_genai.embeddings.providers.voyage import VoyageEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.providers.voyage import VoyageEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult class TestVoyageEmbedder: - @patch("fireflyframework_genai.embeddings.providers.voyage.voyageai") + @patch("fireflyframework_agentic.embeddings.providers.voyage.voyageai") async def test_embed_batch(self, mock_voyageai): mock_client = MagicMock() mock_voyageai.AsyncClient.return_value = mock_client @@ -25,7 +25,7 @@ async def test_embed_batch(self, mock_voyageai): assert len(result.embeddings) == 2 assert result.model == "voyage-3" - @patch("fireflyframework_genai.embeddings.providers.voyage.voyageai") + @patch("fireflyframework_agentic.embeddings.providers.voyage.voyageai") async def test_embed_one(self, mock_voyageai): mock_client = MagicMock() mock_voyageai.AsyncClient.return_value = mock_client @@ -40,7 +40,7 @@ async def test_embed_one(self, mock_voyageai): assert isinstance(vec, list) assert len(vec) == 3 - @patch("fireflyframework_genai.embeddings.providers.voyage.voyageai") + @patch("fireflyframework_agentic.embeddings.providers.voyage.voyageai") def test_default_model(self, mock_voyageai): embedder = VoyageEmbedder() assert embedder.model == "voyage-3" diff --git a/tests/test_embeddings/test_registry.py b/tests/test_embeddings/test_registry.py index 38b450fb..a0a0673f 100644 --- a/tests/test_embeddings/test_registry.py +++ b/tests/test_embeddings/test_registry.py @@ -4,8 +4,8 @@ import pytest -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.embeddings.registry import EmbedderRegistry +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.embeddings.registry import EmbedderRegistry class _FakeEmbedder(BaseEmbedder): diff --git a/tests/test_embeddings/test_similarity.py b/tests/test_embeddings/test_similarity.py index 4b7f7489..95e89ebb 100644 --- a/tests/test_embeddings/test_similarity.py +++ b/tests/test_embeddings/test_similarity.py @@ -4,7 +4,7 @@ import pytest -from fireflyframework_genai.embeddings.similarity import ( +from fireflyframework_agentic.embeddings.similarity import ( cosine_similarity, dot_product, euclidean_distance, diff --git a/tests/test_embeddings/test_types.py b/tests/test_embeddings/test_types.py index 50de0d5d..51eca19c 100644 --- a/tests/test_embeddings/test_types.py +++ b/tests/test_embeddings/test_types.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.embeddings.types import EmbeddingResult, EmbeddingUsage +from fireflyframework_agentic.embeddings.types import EmbeddingResult, EmbeddingUsage class TestEmbeddingUsage: diff --git a/tests/test_experiments/test_experiment.py b/tests/test_experiments/test_experiment.py index b828e831..3f6b02e7 100644 --- a/tests/test_experiments/test_experiment.py +++ b/tests/test_experiments/test_experiment.py @@ -16,8 +16,8 @@ from __future__ import annotations -from fireflyframework_genai.experiments.experiment import Experiment -from fireflyframework_genai.experiments.variant import Variant +from fireflyframework_agentic.experiments.experiment import Experiment +from fireflyframework_agentic.experiments.variant import Variant class TestExperiment: diff --git a/tests/test_explainability/test_audit.py b/tests/test_explainability/test_audit.py index 4bc7544e..8bdffbe0 100644 --- a/tests/test_explainability/test_audit.py +++ b/tests/test_explainability/test_audit.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.explainability.audit import AuditTrail +from fireflyframework_agentic.explainability.audit import AuditTrail class TestAuditTrail: diff --git a/tests/test_explainability/test_trace_recorder.py b/tests/test_explainability/test_trace_recorder.py index 69c4a827..8a00e928 100644 --- a/tests/test_explainability/test_trace_recorder.py +++ b/tests/test_explainability/test_trace_recorder.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.explainability.trace_recorder import TraceRecorder +from fireflyframework_agentic.explainability.trace_recorder import TraceRecorder class TestTraceRecorder: diff --git a/tests/test_exposure/test_queues.py b/tests/test_exposure/test_queues.py index 2105d493..5c643e64 100644 --- a/tests/test_exposure/test_queues.py +++ b/tests/test_exposure/test_queues.py @@ -18,9 +18,9 @@ import pytest -from fireflyframework_genai.exceptions import ExposureError -from fireflyframework_genai.exposure.queues.base import QueueMessage -from fireflyframework_genai.exposure.queues.router import QueueRouter +from fireflyframework_agentic.exceptions import ExposureError +from fireflyframework_agentic.exposure.queues.base import QueueMessage +from fireflyframework_agentic.exposure.queues.router import QueueRouter class TestQueueMessage: diff --git a/tests/test_exposure/test_rate_limit.py b/tests/test_exposure/test_rate_limit.py index 5d6f0928..a176b6a5 100644 --- a/tests/test_exposure/test_rate_limit.py +++ b/tests/test_exposure/test_rate_limit.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.exposure.rest.middleware import RateLimiter +from fireflyframework_agentic.exposure.rest.middleware import RateLimiter class TestRateLimiter: diff --git a/tests/test_exposure/test_rest_app.py b/tests/test_exposure/test_rest_app.py index bcbbc6c9..badc5186 100644 --- a/tests/test_exposure/test_rest_app.py +++ b/tests/test_exposure/test_rest_app.py @@ -27,7 +27,7 @@ import httpx -from fireflyframework_genai.exposure.rest.app import create_genai_app +from fireflyframework_agentic.exposure.rest.app import create_agentic_app # --------------------------------------------------------------------------- # Helpers @@ -38,8 +38,8 @@ def _make_app(**kwargs): """Create a test app with lifespan disabled.""" from fastapi import FastAPI - from fireflyframework_genai.exposure.rest.health import create_health_router - from fireflyframework_genai.exposure.rest.router import create_agent_router + from fireflyframework_agentic.exposure.rest.health import create_health_router + from fireflyframework_agentic.exposure.rest.router import create_agent_router app = FastAPI(title="test") app.include_router(create_health_router()) @@ -149,11 +149,11 @@ async def test_delete_conversation(self, client: httpx.AsyncClient): class TestAppFactory: - def test_create_genai_app_returns_fastapi(self): + def test_create_agentic_app_returns_fastapi(self): """Verify the factory produces a FastAPI instance with expected routes.""" from fastapi import FastAPI - app = create_genai_app(cors=False, request_id=False) + app = create_agentic_app(cors=False, request_id=False) assert isinstance(app, FastAPI) # Should have health and agent routes @@ -161,14 +161,14 @@ def test_create_genai_app_returns_fastapi(self): assert "/health" in paths assert "/agents/" in paths - def test_create_genai_app_rate_limit(self): + def test_create_agentic_app_rate_limit(self): """Verify rate-limit middleware wiring doesn't crash.""" - app = create_genai_app(rate_limit=True, cors=False, request_id=False) + app = create_agentic_app(rate_limit=True, cors=False, request_id=False) assert app is not None - def test_create_genai_app_rate_limit_custom(self): + def test_create_agentic_app_rate_limit_custom(self): """Verify custom rate-limit config dict is accepted.""" - app = create_genai_app( + app = create_agentic_app( rate_limit={"max_requests": 10, "window_seconds": 30}, cors=False, request_id=False, diff --git a/tests/test_exposure/test_rest_utils.py b/tests/test_exposure/test_rest_utils.py index 6ba32452..29ddd0d5 100644 --- a/tests/test_exposure/test_rest_utils.py +++ b/tests/test_exposure/test_rest_utils.py @@ -8,7 +8,7 @@ def test_add_auth_middleware_callable(self): """Verify add_auth_middleware is a callable that accepts expected args.""" import inspect - from fireflyframework_genai.exposure.rest.middleware import add_auth_middleware + from fireflyframework_agentic.exposure.rest.middleware import add_auth_middleware sig = inspect.signature(add_auth_middleware) params = list(sig.parameters.keys()) @@ -19,6 +19,6 @@ def test_add_auth_middleware_callable(self): class TestWebSocketRouter: def test_create_websocket_router_callable(self): """Verify the factory function exists and is callable.""" - from fireflyframework_genai.exposure.rest.websocket import create_websocket_router + from fireflyframework_agentic.exposure.rest.websocket import create_websocket_router assert callable(create_websocket_router) diff --git a/tests/test_exposure/test_schemas.py b/tests/test_exposure/test_schemas.py index 6616684c..f69f7b52 100644 --- a/tests/test_exposure/test_schemas.py +++ b/tests/test_exposure/test_schemas.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.exposure.rest.schemas import ( +from fireflyframework_agentic.exposure.rest.schemas import ( AgentRequest, AgentResponse, HealthResponse, diff --git a/tests/test_lab/test_dataset.py b/tests/test_lab/test_dataset.py index 450f0933..14792f5a 100644 --- a/tests/test_lab/test_dataset.py +++ b/tests/test_lab/test_dataset.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.lab.dataset import EvalCase, EvalDataset +from fireflyframework_agentic.lab.dataset import EvalCase, EvalDataset class TestEvalDataset: diff --git a/tests/test_logging.py b/tests/test_logging.py index c8abaf4e..5a4c552e 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -5,7 +5,7 @@ import json import logging -from fireflyframework_genai.logging import JsonFormatter, configure_logging +from fireflyframework_agentic.logging import JsonFormatter, configure_logging class TestJsonFormatter: @@ -52,12 +52,12 @@ def test_format_includes_exception(self) -> None: class TestConfigureLogging: def test_text_format(self) -> None: configure_logging("DEBUG") - logger = logging.getLogger("fireflyframework_genai") + logger = logging.getLogger("fireflyframework_agentic") assert logger.level == logging.DEBUG def test_json_format(self) -> None: configure_logging("INFO", format_style="json") - logger = logging.getLogger("fireflyframework_genai") + logger = logging.getLogger("fireflyframework_agentic") handler = [h for h in logger.handlers if getattr(h, "_firefly_managed", False)] assert len(handler) >= 1 assert isinstance(handler[0].formatter, JsonFormatter) @@ -65,6 +65,6 @@ def test_json_format(self) -> None: def test_replaces_previous_handler(self) -> None: configure_logging("INFO") configure_logging("DEBUG") - logger = logging.getLogger("fireflyframework_genai") + logger = logging.getLogger("fireflyframework_agentic") managed = [h for h in logger.handlers if getattr(h, "_firefly_managed", False)] assert len(managed) == 1 diff --git a/tests/test_memory/test_async_store.py b/tests/test_memory/test_async_store.py index a8c59107..221c44d3 100644 --- a/tests/test_memory/test_async_store.py +++ b/tests/test_memory/test_async_store.py @@ -4,8 +4,8 @@ from pathlib import Path -from fireflyframework_genai.memory.store import FileStore -from fireflyframework_genai.memory.types import MemoryEntry +from fireflyframework_agentic.memory.store import FileStore +from fireflyframework_agentic.memory.types import MemoryEntry class TestAsyncFileStore: diff --git a/tests/test_memory/test_memory.py b/tests/test_memory/test_memory.py index 693ec3b7..78aeedd4 100644 --- a/tests/test_memory/test_memory.py +++ b/tests/test_memory/test_memory.py @@ -14,11 +14,11 @@ """Tests for the memory subsystem.""" -from fireflyframework_genai.memory.conversation import ConversationMemory -from fireflyframework_genai.memory.manager import MemoryManager -from fireflyframework_genai.memory.store import FileStore, InMemoryStore, MemoryStore -from fireflyframework_genai.memory.types import ConversationTurn, MemoryEntry, MemoryScope -from fireflyframework_genai.memory.working import WorkingMemory +from fireflyframework_agentic.memory.conversation import ConversationMemory +from fireflyframework_agentic.memory.manager import MemoryManager +from fireflyframework_agentic.memory.store import FileStore, InMemoryStore, MemoryStore +from fireflyframework_agentic.memory.types import ConversationTurn, MemoryEntry, MemoryScope +from fireflyframework_agentic.memory.working import WorkingMemory # -- MemoryEntry tests ----------------------------------------------------- diff --git a/tests/test_memory/test_summarization.py b/tests/test_memory/test_summarization.py index 60596309..d7e43996 100644 --- a/tests/test_memory/test_summarization.py +++ b/tests/test_memory/test_summarization.py @@ -2,8 +2,8 @@ from __future__ import annotations -from fireflyframework_genai.memory.conversation import ConversationMemory -from fireflyframework_genai.memory.types import ConversationTurn +from fireflyframework_agentic.memory.conversation import ConversationMemory +from fireflyframework_agentic.memory.types import ConversationTurn class TestConversationSummarization: @@ -53,13 +53,13 @@ def test_no_summarizer_no_eviction(self) -> None: class TestLLMSummarizer: def test_create_llm_summarizer_returns_callable(self) -> None: - from fireflyframework_genai.memory.summarization import create_llm_summarizer + from fireflyframework_agentic.memory.summarization import create_llm_summarizer summarizer = create_llm_summarizer() assert callable(summarizer) def test_create_llm_summarizer_with_custom_model(self) -> None: - from fireflyframework_genai.memory.summarization import create_llm_summarizer + from fireflyframework_agentic.memory.summarization import create_llm_summarizer summarizer = create_llm_summarizer(model="openai:gpt-4o-mini") assert callable(summarizer) diff --git a/tests/test_model_utils.py b/tests/test_model_utils.py index 69e6b099..839ca8d0 100644 --- a/tests/test_model_utils.py +++ b/tests/test_model_utils.py @@ -18,7 +18,7 @@ import pytest -from fireflyframework_genai.model_utils import ( +from fireflyframework_agentic.model_utils import ( detect_model_family, extract_model_info, get_model_identifier, diff --git a/tests/test_observability/test_cost.py b/tests/test_observability/test_cost.py index de337a6a..e53568cf 100644 --- a/tests/test_observability/test_cost.py +++ b/tests/test_observability/test_cost.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.observability.cost import ( +from fireflyframework_agentic.observability.cost import ( CostCalculator, GenAIPricesCostCalculator, StaticPriceCostCalculator, diff --git a/tests/test_observability/test_decorators.py b/tests/test_observability/test_decorators.py index 68928097..40dcaab6 100644 --- a/tests/test_observability/test_decorators.py +++ b/tests/test_observability/test_decorators.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.observability.decorators import metered, traced +from fireflyframework_agentic.observability.decorators import metered, traced class TestTracedDecorator: diff --git a/tests/test_observability/test_events.py b/tests/test_observability/test_events.py index a130c6b5..b6070fa9 100644 --- a/tests/test_observability/test_events.py +++ b/tests/test_observability/test_events.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.observability.events import FireflyEvent, FireflyEvents +from fireflyframework_agentic.observability.events import FireflyEvent, FireflyEvents class TestFireflyEvent: diff --git a/tests/test_observability/test_metrics.py b/tests/test_observability/test_metrics.py index 4c8ec39f..43df5c0e 100644 --- a/tests/test_observability/test_metrics.py +++ b/tests/test_observability/test_metrics.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.observability.metrics import FireflyMetrics +from fireflyframework_agentic.observability.metrics import FireflyMetrics class TestFireflyMetrics: diff --git a/tests/test_observability/test_tracer.py b/tests/test_observability/test_tracer.py index cdc133f5..dea03d6c 100644 --- a/tests/test_observability/test_tracer.py +++ b/tests/test_observability/test_tracer.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.observability.tracer import FireflyTracer +from fireflyframework_agentic.observability.tracer import FireflyTracer class TestFireflyTracer: diff --git a/tests/test_observability/test_usage.py b/tests/test_observability/test_usage.py index bfb418e0..2b5983e0 100644 --- a/tests/test_observability/test_usage.py +++ b/tests/test_observability/test_usage.py @@ -18,8 +18,8 @@ import logging -from fireflyframework_genai.config import reset_config -from fireflyframework_genai.observability.usage import ( +from fireflyframework_agentic.config import reset_config +from fireflyframework_agentic.observability.usage import ( UsageRecord, UsageSummary, UsageTracker, @@ -171,8 +171,8 @@ def test_reset(self): def test_budget_alert_logged(self, monkeypatch, caplog): """Budget alert warning should be logged when threshold is exceeded.""" - monkeypatch.setenv("FIREFLY_GENAI_COST_TRACKING_ENABLED", "true") - monkeypatch.setenv("FIREFLY_GENAI_BUDGET_ALERT_THRESHOLD_USD", "0.005") + monkeypatch.setenv("FIREFLY_AGENTIC_COST_TRACKING_ENABLED", "true") + monkeypatch.setenv("FIREFLY_AGENTIC_BUDGET_ALERT_THRESHOLD_USD", "0.005") reset_config() tracker = self._make_tracker() @@ -184,8 +184,8 @@ def test_budget_alert_logged(self, monkeypatch, caplog): def test_budget_limit_logged(self, monkeypatch, caplog): """Budget limit warning should be logged when limit is exceeded.""" - monkeypatch.setenv("FIREFLY_GENAI_COST_TRACKING_ENABLED", "true") - monkeypatch.setenv("FIREFLY_GENAI_BUDGET_LIMIT_USD", "0.005") + monkeypatch.setenv("FIREFLY_AGENTIC_COST_TRACKING_ENABLED", "true") + monkeypatch.setenv("FIREFLY_AGENTIC_BUDGET_LIMIT_USD", "0.005") reset_config() tracker = self._make_tracker() @@ -197,8 +197,8 @@ def test_budget_limit_logged(self, monkeypatch, caplog): def test_cost_tracking_disabled_skips_budget(self, monkeypatch, caplog): """No budget warnings when cost tracking is disabled.""" - monkeypatch.setenv("FIREFLY_GENAI_COST_TRACKING_ENABLED", "false") - monkeypatch.setenv("FIREFLY_GENAI_BUDGET_LIMIT_USD", "0.001") + monkeypatch.setenv("FIREFLY_AGENTIC_COST_TRACKING_ENABLED", "false") + monkeypatch.setenv("FIREFLY_AGENTIC_BUDGET_LIMIT_USD", "0.001") reset_config() tracker = self._make_tracker() diff --git a/tests/test_pipeline/test_builder.py b/tests/test_pipeline/test_builder.py index aefea698..25c8e44b 100644 --- a/tests/test_pipeline/test_builder.py +++ b/tests/test_pipeline/test_builder.py @@ -4,9 +4,9 @@ from typing import Any -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.steps import ( +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.steps import ( CallableStep, FanInStep, FanOutStep, diff --git a/tests/test_pipeline/test_dag.py b/tests/test_pipeline/test_dag.py index a9c6ec5d..d3f38a96 100644 --- a/tests/test_pipeline/test_dag.py +++ b/tests/test_pipeline/test_dag.py @@ -16,13 +16,13 @@ import pytest -from fireflyframework_genai.exceptions import PipelineError -from fireflyframework_genai.pipeline.builder import PipelineBuilder -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.dag import DAG, DAGEdge, DAGNode -from fireflyframework_genai.pipeline.engine import PipelineEngine -from fireflyframework_genai.pipeline.result import NodeResult -from fireflyframework_genai.pipeline.steps import FanInStep +from fireflyframework_agentic.exceptions import PipelineError +from fireflyframework_agentic.pipeline.builder import PipelineBuilder +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.dag import DAG, DAGEdge, DAGNode +from fireflyframework_agentic.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.result import NodeResult +from fireflyframework_agentic.pipeline.steps import FanInStep # -- Helper step ----------------------------------------------------------- diff --git a/tests/test_pipeline/test_embedding_steps.py b/tests/test_pipeline/test_embedding_steps.py index 8b830fba..1e64c699 100644 --- a/tests/test_pipeline/test_embedding_steps.py +++ b/tests/test_pipeline/test_embedding_steps.py @@ -2,12 +2,12 @@ from __future__ import annotations -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.steps import EmbeddingStep, RetrievalStep -from fireflyframework_genai.vectorstores.memory_store import InMemoryVectorStore -from fireflyframework_genai.vectorstores.types import VectorDocument +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.steps import EmbeddingStep, RetrievalStep +from fireflyframework_agentic.vectorstores.memory_store import InMemoryVectorStore +from fireflyframework_agentic.vectorstores.types import VectorDocument class _FakeEmbedder(BaseEmbedder): diff --git a/tests/test_pipeline/test_event_handler.py b/tests/test_pipeline/test_event_handler.py index 25b2331b..90e88121 100644 --- a/tests/test_pipeline/test_event_handler.py +++ b/tests/test_pipeline/test_event_handler.py @@ -4,8 +4,8 @@ from dataclasses import dataclass, field -from fireflyframework_genai.pipeline.dag import DAG, DAGNode -from fireflyframework_genai.pipeline.engine import PipelineEngine, PipelineEventHandler +from fireflyframework_agentic.pipeline.dag import DAG, DAGNode +from fireflyframework_agentic.pipeline.engine import PipelineEngine, PipelineEventHandler class _EchoStep: @@ -45,7 +45,7 @@ async def on_pipeline_complete(self, pipeline_name: str, success: bool, duration class TestPipelineEventHandler: async def test_events_on_success(self): - from fireflyframework_genai.pipeline.dag import DAGEdge + from fireflyframework_agentic.pipeline.dag import DAGEdge handler = _TestEventHandler() dag = DAG("evt-test") diff --git a/tests/test_pipeline/test_pipeline_usage.py b/tests/test_pipeline/test_pipeline_usage.py index 665d056b..9dec9550 100644 --- a/tests/test_pipeline/test_pipeline_usage.py +++ b/tests/test_pipeline/test_pipeline_usage.py @@ -16,11 +16,11 @@ from __future__ import annotations -from fireflyframework_genai.observability.usage import UsageRecord, default_usage_tracker -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.dag import DAG, DAGNode -from fireflyframework_genai.pipeline.engine import PipelineEngine -from fireflyframework_genai.pipeline.result import NodeResult, PipelineResult +from fireflyframework_agentic.observability.usage import UsageRecord, default_usage_tracker +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.dag import DAG, DAGNode +from fireflyframework_agentic.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.result import NodeResult, PipelineResult class _EchoStep: diff --git a/tests/test_pipeline/test_steps.py b/tests/test_pipeline/test_steps.py index 0712b057..93ff81fe 100644 --- a/tests/test_pipeline/test_steps.py +++ b/tests/test_pipeline/test_steps.py @@ -2,10 +2,10 @@ from __future__ import annotations -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.dag import DAG, DAGEdge, DAGNode -from fireflyframework_genai.pipeline.engine import PipelineEngine -from fireflyframework_genai.pipeline.steps import BranchStep +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.dag import DAG, DAGEdge, DAGNode +from fireflyframework_agentic.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.steps import BranchStep class _EchoStep: @@ -67,6 +67,6 @@ async def test_branch_in_pipeline(self): assert result.outputs["right_node"].skipped is True def test_branch_step_import_from_package(self): - from fireflyframework_genai.pipeline import BranchStep as BranchStepAlias + from fireflyframework_agentic.pipeline import BranchStep as BranchStepAlias assert BranchStepAlias is BranchStep diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 78b75228..32836316 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.plugin import ( +from fireflyframework_agentic.plugin import ( DiscoveredPlugin, DiscoveryResult, PluginDiscovery, @@ -30,7 +30,7 @@ def test_successful_and_failed(self) -> None: class TestPluginDiscovery: def test_discover_group_returns_list(self) -> None: # No actual plugins installed, but the API should work - results = PluginDiscovery.discover_group("fireflyframework_genai.agents") + results = PluginDiscovery.discover_group("fireflyframework_agentic.agents") assert isinstance(results, list) def test_discover_all_returns_result(self) -> None: diff --git a/tests/test_prompts/test_registry.py b/tests/test_prompts/test_registry.py index 41c086ab..7a69e76b 100644 --- a/tests/test_prompts/test_registry.py +++ b/tests/test_prompts/test_registry.py @@ -16,8 +16,8 @@ from __future__ import annotations -from fireflyframework_genai.prompts.registry import PromptRegistry -from fireflyframework_genai.prompts.template import PromptTemplate +from fireflyframework_agentic.prompts.registry import PromptRegistry +from fireflyframework_agentic.prompts.template import PromptTemplate class TestPromptRegistry: diff --git a/tests/test_prompts/test_template.py b/tests/test_prompts/test_template.py index a262205c..fc21762c 100644 --- a/tests/test_prompts/test_template.py +++ b/tests/test_prompts/test_template.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.prompts.template import PromptTemplate +from fireflyframework_agentic.prompts.template import PromptTemplate class TestPromptTemplate: diff --git a/tests/test_reasoning/test_memory_integration.py b/tests/test_reasoning/test_memory_integration.py index 430c8cb3..8134dbe0 100644 --- a/tests/test_reasoning/test_memory_integration.py +++ b/tests/test_reasoning/test_memory_integration.py @@ -21,17 +21,17 @@ import pytest -from fireflyframework_genai.memory import MemoryManager -from fireflyframework_genai.reasoning.base import AbstractReasoningPattern -from fireflyframework_genai.reasoning.chain_of_thought import ChainOfThoughtPattern -from fireflyframework_genai.reasoning.models import ( +from fireflyframework_agentic.memory import MemoryManager +from fireflyframework_agentic.reasoning.base import AbstractReasoningPattern +from fireflyframework_agentic.reasoning.chain_of_thought import ChainOfThoughtPattern +from fireflyframework_agentic.reasoning.models import ( BranchEvaluation, ReasoningThought, ReflectionVerdict, ) -from fireflyframework_genai.reasoning.react import ReActPattern -from fireflyframework_genai.reasoning.reflexion import ReflexionPattern -from fireflyframework_genai.reasoning.tree_of_thoughts import TreeOfThoughtsPattern +from fireflyframework_agentic.reasoning.react import ReActPattern +from fireflyframework_agentic.reasoning.reflexion import ReflexionPattern +from fireflyframework_agentic.reasoning.tree_of_thoughts import TreeOfThoughtsPattern @dataclass @@ -216,19 +216,19 @@ async def run(self, prompt, **kwargs): class TestProtocolConformance: def test_cot_is_reasoning_pattern(self): - from fireflyframework_genai.reasoning.base import ReasoningPattern + from fireflyframework_agentic.reasoning.base import ReasoningPattern pattern = ChainOfThoughtPattern(max_steps=3) assert isinstance(pattern, ReasoningPattern) def test_react_is_reasoning_pattern(self): - from fireflyframework_genai.reasoning.base import ReasoningPattern + from fireflyframework_agentic.reasoning.base import ReasoningPattern pattern = ReActPattern(max_steps=3) assert isinstance(pattern, ReasoningPattern) def test_reflexion_is_reasoning_pattern(self): - from fireflyframework_genai.reasoning.base import ReasoningPattern + from fireflyframework_agentic.reasoning.base import ReasoningPattern pattern = ReflexionPattern(max_steps=3) assert isinstance(pattern, ReasoningPattern) @@ -237,7 +237,7 @@ def test_reflexion_is_reasoning_pattern(self): class TestStepLimitError: async def test_cot_exceeds_max_steps(self): """Pattern should raise ReasoningStepLimitError when max_steps exceeded.""" - from fireflyframework_genai.exceptions import ReasoningStepLimitError + from fireflyframework_agentic.exceptions import ReasoningStepLimitError # Always non-final thoughts → will exhaust max_steps agent = MockAgent([ReasoningThought(content=f"step {i}") for i in range(10)]) diff --git a/tests/test_reasoning/test_models.py b/tests/test_reasoning/test_models.py index 6c284457..8d2abed9 100644 --- a/tests/test_reasoning/test_models.py +++ b/tests/test_reasoning/test_models.py @@ -18,7 +18,7 @@ import pytest -from fireflyframework_genai.reasoning.models import ( +from fireflyframework_agentic.reasoning.models import ( BranchEvaluation, GoalDecompositionResult, GoalPhase, diff --git a/tests/test_reasoning/test_patterns.py b/tests/test_reasoning/test_patterns.py index edac3d47..078641c9 100644 --- a/tests/test_reasoning/test_patterns.py +++ b/tests/test_reasoning/test_patterns.py @@ -23,9 +23,9 @@ from dataclasses import dataclass from typing import Any -from fireflyframework_genai.reasoning.chain_of_thought import ChainOfThoughtPattern -from fireflyframework_genai.reasoning.goal_decomposition import GoalDecompositionPattern -from fireflyframework_genai.reasoning.models import ( +from fireflyframework_agentic.reasoning.chain_of_thought import ChainOfThoughtPattern +from fireflyframework_agentic.reasoning.goal_decomposition import GoalDecompositionPattern +from fireflyframework_agentic.reasoning.models import ( BranchEvaluation, GoalDecompositionResult, GoalPhase, @@ -34,10 +34,10 @@ ReasoningThought, ReflectionVerdict, ) -from fireflyframework_genai.reasoning.plan_and_execute import PlanAndExecutePattern -from fireflyframework_genai.reasoning.react import ReActPattern -from fireflyframework_genai.reasoning.reflexion import ReflexionPattern -from fireflyframework_genai.reasoning.tree_of_thoughts import TreeOfThoughtsPattern +from fireflyframework_agentic.reasoning.plan_and_execute import PlanAndExecutePattern +from fireflyframework_agentic.reasoning.react import ReActPattern +from fireflyframework_agentic.reasoning.reflexion import ReflexionPattern +from fireflyframework_agentic.reasoning.tree_of_thoughts import TreeOfThoughtsPattern @dataclass @@ -97,7 +97,7 @@ async def test_text_fallback(self): async def test_prompts_override(self): """Custom prompts should be used when provided.""" - from fireflyframework_genai.prompts.template import PromptTemplate, PromptVariable + from fireflyframework_agentic.prompts.template import PromptTemplate, PromptVariable custom = PromptTemplate( "custom:react:thought", diff --git a/tests/test_reasoning/test_pipeline.py b/tests/test_reasoning/test_pipeline.py index 4f608592..6d36d7dd 100644 --- a/tests/test_reasoning/test_pipeline.py +++ b/tests/test_reasoning/test_pipeline.py @@ -19,11 +19,11 @@ from dataclasses import dataclass from typing import Any -from fireflyframework_genai.memory import MemoryManager -from fireflyframework_genai.reasoning.chain_of_thought import ChainOfThoughtPattern -from fireflyframework_genai.reasoning.models import ReasoningThought, ReflectionVerdict -from fireflyframework_genai.reasoning.pipeline import ReasoningPipeline -from fireflyframework_genai.reasoning.reflexion import ReflexionPattern +from fireflyframework_agentic.memory import MemoryManager +from fireflyframework_agentic.reasoning.chain_of_thought import ChainOfThoughtPattern +from fireflyframework_agentic.reasoning.models import ReasoningThought, ReflectionVerdict +from fireflyframework_agentic.reasoning.pipeline import ReasoningPipeline +from fireflyframework_agentic.reasoning.reflexion import ReflexionPattern @dataclass diff --git a/tests/test_reasoning/test_prompts.py b/tests/test_reasoning/test_prompts.py index c6af594a..43f91158 100644 --- a/tests/test_reasoning/test_prompts.py +++ b/tests/test_reasoning/test_prompts.py @@ -16,8 +16,8 @@ from __future__ import annotations -from fireflyframework_genai.prompts.registry import prompt_registry -from fireflyframework_genai.reasoning.prompts import ( +from fireflyframework_agentic.prompts.registry import prompt_registry +from fireflyframework_agentic.reasoning.prompts import ( _ALL_TEMPLATES, COT_STEP_PROMPT, GOAL_DECOMPOSE_PROMPT, diff --git a/tests/test_reasoning/test_registry.py b/tests/test_reasoning/test_registry.py index baec4b6b..c1b10dd5 100644 --- a/tests/test_reasoning/test_registry.py +++ b/tests/test_reasoning/test_registry.py @@ -18,7 +18,7 @@ import pytest -from fireflyframework_genai.reasoning.registry import ReasoningPatternRegistry +from fireflyframework_agentic.reasoning.registry import ReasoningPatternRegistry class TestReasoningPatternRegistry: @@ -28,7 +28,7 @@ def test_register_and_get(self): assert registry.get("test") is object def test_get_nonexistent_raises(self): - from fireflyframework_genai.exceptions import ReasoningPatternNotFoundError + from fireflyframework_agentic.exceptions import ReasoningPatternNotFoundError registry = ReasoningPatternRegistry() with pytest.raises(ReasoningPatternNotFoundError): diff --git a/tests/test_reasoning/test_trace.py b/tests/test_reasoning/test_trace.py index 674c337c..195efe57 100644 --- a/tests/test_reasoning/test_trace.py +++ b/tests/test_reasoning/test_trace.py @@ -16,7 +16,7 @@ from __future__ import annotations -from fireflyframework_genai.reasoning.trace import ( +from fireflyframework_agentic.reasoning.trace import ( ActionStep, ObservationStep, ReasoningTrace, diff --git a/tests/test_security/test_output_guard.py b/tests/test_security/test_output_guard.py index 057d2fee..db160006 100644 --- a/tests/test_security/test_output_guard.py +++ b/tests/test_security/test_output_guard.py @@ -4,12 +4,12 @@ import pytest -from fireflyframework_genai.agents.builtin_middleware import ( +from fireflyframework_agentic.agents.builtin_middleware import ( OutputGuardError, OutputGuardMiddleware, ) -from fireflyframework_genai.agents.middleware import MiddlewareContext -from fireflyframework_genai.security.output_guard import OutputGuard, default_output_guard +from fireflyframework_agentic.agents.middleware import MiddlewareContext +from fireflyframework_agentic.security.output_guard import OutputGuard, default_output_guard # -- OutputGuard core -------------------------------------------------------- diff --git a/tests/test_security/test_prompt_guard.py b/tests/test_security/test_prompt_guard.py index 3920822e..6a85495a 100644 --- a/tests/test_security/test_prompt_guard.py +++ b/tests/test_security/test_prompt_guard.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.security.prompt_guard import PromptGuard, PromptGuardResult +from fireflyframework_agentic.security.prompt_guard import PromptGuard, PromptGuardResult class TestPromptGuard: diff --git a/tests/test_studio/test_api_assistant.py b/tests/test_studio/test_api_assistant.py index c3ec324f..f7c31ed1 100644 --- a/tests/test_studio/test_api_assistant.py +++ b/tests/test_studio/test_api_assistant.py @@ -25,7 +25,7 @@ from starlette.testclient import TestClient -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.server import create_studio_app @pytest.fixture() @@ -36,7 +36,7 @@ def app(monkeypatch): monkeypatch.delenv("GOOGLE_API_KEY", raising=False) monkeypatch.setenv("OPENAI_API_KEY", "test-key") monkeypatch.setattr( - "fireflyframework_genai.studio.assistant.agent._resolve_assistant_model", + "fireflyframework_agentic.studio.assistant.agent._resolve_assistant_model", lambda: "openai:gpt-4o", ) return create_studio_app() @@ -94,7 +94,7 @@ def test_assistant_ws_chat_streams_tokens(self, app, monkeypatch): # Patch create_studio_assistant in the module where it's imported monkeypatch.setattr( - "fireflyframework_genai.studio.assistant.agent.create_studio_assistant", + "fireflyframework_agentic.studio.assistant.agent.create_studio_assistant", lambda canvas=None: mock_agent, ) @@ -128,7 +128,7 @@ def test_assistant_ws_chat_fallback_on_stream_error(self, app, monkeypatch): mock_agent.run = AsyncMock(return_value=mock_result) monkeypatch.setattr( - "fireflyframework_genai.studio.assistant.agent.create_studio_assistant", + "fireflyframework_agentic.studio.assistant.agent.create_studio_assistant", lambda canvas=None: mock_agent, ) diff --git a/tests/test_studio/test_api_checkpoints.py b/tests/test_studio/test_api_checkpoints.py index 1acdf5de..4ee3e6c5 100644 --- a/tests/test_studio/test_api_checkpoints.py +++ b/tests/test_studio/test_api_checkpoints.py @@ -23,8 +23,8 @@ import httpx -from fireflyframework_genai.studio.execution.checkpoint import CheckpointManager -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.execution.checkpoint import CheckpointManager +from fireflyframework_agentic.studio.server import create_studio_app # --------------------------------------------------------------------------- # Fixtures diff --git a/tests/test_studio/test_api_codegen.py b/tests/test_studio/test_api_codegen.py index 49ef8818..8afcbace 100644 --- a/tests/test_studio/test_api_codegen.py +++ b/tests/test_studio/test_api_codegen.py @@ -23,7 +23,7 @@ import httpx -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.server import create_studio_app # --------------------------------------------------------------------------- # Fixtures diff --git a/tests/test_studio/test_api_monitoring.py b/tests/test_studio/test_api_monitoring.py index 9eb4fa35..077c4206 100644 --- a/tests/test_studio/test_api_monitoring.py +++ b/tests/test_studio/test_api_monitoring.py @@ -23,7 +23,7 @@ import httpx -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.server import create_studio_app # --------------------------------------------------------------------------- # Fixtures @@ -47,7 +47,7 @@ async def client(app): @pytest.fixture(autouse=True) def _reset_usage_tracker(): """Reset the default usage tracker between tests.""" - from fireflyframework_genai.observability.usage import default_usage_tracker + from fireflyframework_agentic.observability.usage import default_usage_tracker default_usage_tracker.reset() yield @@ -96,7 +96,7 @@ async def test_usage_returns_zeros_when_no_records(self, client: httpx.AsyncClie assert body["by_model"] == {} async def test_usage_reflects_recorded_data(self, client: httpx.AsyncClient): - from fireflyframework_genai.observability.usage import ( + from fireflyframework_agentic.observability.usage import ( UsageRecord, default_usage_tracker, ) @@ -142,7 +142,7 @@ async def test_usage_reflects_recorded_data(self, client: httpx.AsyncClient): assert model_data["total_tokens"] == 150 async def test_usage_aggregates_multiple_records(self, client: httpx.AsyncClient): - from fireflyframework_genai.observability.usage import ( + from fireflyframework_agentic.observability.usage import ( UsageRecord, default_usage_tracker, ) diff --git a/tests/test_studio/test_api_registry.py b/tests/test_studio/test_api_registry.py index ccb5f5ec..da8a203c 100644 --- a/tests/test_studio/test_api_registry.py +++ b/tests/test_studio/test_api_registry.py @@ -23,7 +23,7 @@ import httpx -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.server import create_studio_app # --------------------------------------------------------------------------- # Fixtures @@ -58,8 +58,8 @@ async def test_agents_returns_empty_list_when_none_registered(self, client: http async def test_agents_returns_agent_info_after_registration(self, client: httpx.AsyncClient): from pydantic_ai.models.test import TestModel - from fireflyframework_genai.agents.base import FireflyAgent - from fireflyframework_genai.agents.registry import agent_registry + from fireflyframework_agentic.agents.base import FireflyAgent + from fireflyframework_agentic.agents.registry import agent_registry agent = FireflyAgent( "test-agent", @@ -93,8 +93,8 @@ async def test_tools_returns_empty_list_when_none_registered(self, client: httpx assert resp.json() == [] async def test_tools_returns_tool_info_after_registration(self, client: httpx.AsyncClient): - from fireflyframework_genai.tools.base import BaseTool - from fireflyframework_genai.tools.registry import tool_registry + from fireflyframework_agentic.tools.base import BaseTool + from fireflyframework_agentic.tools.registry import tool_registry class DummyTool(BaseTool): async def _execute(self, **kwargs): @@ -123,7 +123,7 @@ async def test_patterns_returns_empty_list_when_none_registered(self, client: ht assert resp.json() == [] async def test_patterns_returns_list_after_registration(self, client: httpx.AsyncClient): - from fireflyframework_genai.reasoning.registry import reasoning_registry + from fireflyframework_agentic.reasoning.registry import reasoning_registry reasoning_registry.register("chain-of-thought", object()) reasoning_registry.register("react", object()) diff --git a/tests/test_studio/test_assistant_agent.py b/tests/test_studio/test_assistant_agent.py index 67673b71..80b07db5 100644 --- a/tests/test_studio/test_assistant_agent.py +++ b/tests/test_studio/test_assistant_agent.py @@ -20,8 +20,8 @@ import pytest -from fireflyframework_genai.agents import FireflyAgent -from fireflyframework_genai.studio.assistant.agent import ( +from fireflyframework_agentic.agents import FireflyAgent +from fireflyframework_agentic.studio.assistant.agent import ( CanvasState, create_canvas_tools, create_studio_assistant, @@ -33,7 +33,7 @@ def test_create_studio_assistant_returns_firefly_agent(self, monkeypatch): monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False) monkeypatch.setenv("OPENAI_API_KEY", "test-key") monkeypatch.setattr( - "fireflyframework_genai.studio.assistant.agent._resolve_assistant_model", + "fireflyframework_agentic.studio.assistant.agent._resolve_assistant_model", lambda: "openai:gpt-4o", ) agent = create_studio_assistant() diff --git a/tests/test_studio/test_checkpoint.py b/tests/test_studio/test_checkpoint.py index 7c2cb4b3..d09e6977 100644 --- a/tests/test_studio/test_checkpoint.py +++ b/tests/test_studio/test_checkpoint.py @@ -19,7 +19,7 @@ import re from datetime import UTC, datetime -from fireflyframework_genai.studio.execution.checkpoint import ( +from fireflyframework_agentic.studio.execution.checkpoint import ( Checkpoint, CheckpointManager, ) diff --git a/tests/test_studio/test_cli.py b/tests/test_studio/test_cli.py index 03af4418..59bb4cf4 100644 --- a/tests/test_studio/test_cli.py +++ b/tests/test_studio/test_cli.py @@ -20,7 +20,7 @@ pytest.importorskip("uvicorn", reason="uvicorn not installed") -from fireflyframework_genai.studio.cli import main, parse_args +from fireflyframework_agentic.studio.cli import main, parse_args # --------------------------------------------------------------------------- # parse_args — defaults diff --git a/tests/test_studio/test_codegen_generator.py b/tests/test_studio/test_codegen_generator.py index b95cdd26..1a1e9cb8 100644 --- a/tests/test_studio/test_codegen_generator.py +++ b/tests/test_studio/test_codegen_generator.py @@ -2,8 +2,8 @@ from __future__ import annotations -from fireflyframework_genai.studio.codegen.generator import generate_python -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.studio.codegen.generator import generate_python +from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, @@ -147,9 +147,9 @@ def test_pipeline_imports_all_needed_symbols(self) -> None: ) code = generate_python(graph) - assert "from fireflyframework_genai.agents.base import FireflyAgent" in code - assert "from fireflyframework_genai.pipeline.builder import PipelineBuilder" in code - assert "from fireflyframework_genai.pipeline.steps import AgentStep" in code + assert "from fireflyframework_agentic.agents.base import FireflyAgent" in code + assert "from fireflyframework_agentic.pipeline.builder import PipelineBuilder" in code + assert "from fireflyframework_agentic.pipeline.steps import AgentStep" in code def test_multiple_edges(self) -> None: graph = GraphModel( diff --git a/tests/test_studio/test_codegen_models.py b/tests/test_studio/test_codegen_models.py index 490ba209..4db9eda1 100644 --- a/tests/test_studio/test_codegen_models.py +++ b/tests/test_studio/test_codegen_models.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, diff --git a/tests/test_studio/test_compiler.py b/tests/test_studio/test_compiler.py index 03340018..d6685669 100644 --- a/tests/test_studio/test_compiler.py +++ b/tests/test_studio/test_compiler.py @@ -20,10 +20,10 @@ import pytest -from fireflyframework_genai.agents.registry import agent_registry -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.engine import PipelineEngine -from fireflyframework_genai.pipeline.steps import ( +from fireflyframework_agentic.agents.registry import agent_registry +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.steps import ( AgentStep, BranchStep, CallableStep, @@ -31,18 +31,18 @@ FanOutStep, ReasoningStep, ) -from fireflyframework_genai.reasoning.registry import reasoning_registry -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.reasoning.registry import reasoning_registry +from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, NodeType, ) -from fireflyframework_genai.studio.execution.compiler import ( +from fireflyframework_agentic.studio.execution.compiler import ( CompilationError, compile_graph, ) -from fireflyframework_genai.tools.registry import tool_registry +from fireflyframework_agentic.tools.registry import tool_registry # --------------------------------------------------------------------------- # Helpers @@ -125,7 +125,7 @@ def test_unsupported_node_type_raises(self): # Temporarily replace the dispatch table to simulate an unsupported type with ( patch( - "fireflyframework_genai.studio.execution.compiler._NODE_COMPILERS", + "fireflyframework_agentic.studio.execution.compiler._NODE_COMPILERS", {}, ), pytest.raises(CompilationError, match="Unsupported node type"), @@ -164,7 +164,7 @@ def test_agent_created_dynamically_with_model(self): graph = _make_graph([node]) with patch( - "fireflyframework_genai.agents.base.FireflyAgent", + "fireflyframework_agentic.agents.base.FireflyAgent", ) as mock_firefly_agent: mock_instance = MagicMock() mock_firefly_agent.return_value = mock_instance @@ -197,7 +197,7 @@ def test_agent_name_falls_back_to_label(self): graph = _make_graph([node]) with patch( - "fireflyframework_genai.agents.base.FireflyAgent", + "fireflyframework_agentic.agents.base.FireflyAgent", ) as mock_firefly_agent: mock_firefly_agent.return_value = MagicMock() compile_graph(graph) diff --git a/tests/test_studio/test_compiler_io.py b/tests/test_studio/test_compiler_io.py index fdbaefaf..fd9338f7 100644 --- a/tests/test_studio/test_compiler_io.py +++ b/tests/test_studio/test_compiler_io.py @@ -4,13 +4,13 @@ import pytest -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, NodeType, ) -from fireflyframework_genai.studio.execution.compiler import ( +from fireflyframework_agentic.studio.execution.compiler import ( CompilationError, compile_graph, ) diff --git a/tests/test_studio/test_config.py b/tests/test_studio/test_config.py index c0a0bf9b..df33c6bd 100644 --- a/tests/test_studio/test_config.py +++ b/tests/test_studio/test_config.py @@ -7,7 +7,7 @@ import pytest -from fireflyframework_genai.studio.config import StudioConfig +from fireflyframework_agentic.studio.config import StudioConfig @pytest.fixture(autouse=True) diff --git a/tests/test_studio/test_dynamic_model.py b/tests/test_studio/test_dynamic_model.py index 94395ce1..69379941 100644 --- a/tests/test_studio/test_dynamic_model.py +++ b/tests/test_studio/test_dynamic_model.py @@ -4,8 +4,8 @@ import json -from fireflyframework_genai.studio.codegen.generator import _get_default_model, generate_python -from fireflyframework_genai.studio.codegen.models import GraphModel, GraphNode, NodeType +from fireflyframework_agentic.studio.codegen.generator import _get_default_model, generate_python +from fireflyframework_agentic.studio.codegen.models import GraphModel, GraphNode, NodeType class TestDynamicDefaultModel: @@ -61,7 +61,7 @@ def test_architect_instructions_include_default_model(self, tmp_path): ) ) - from fireflyframework_genai.studio.assistant.agent import _build_instructions + from fireflyframework_agentic.studio.assistant.agent import _build_instructions instructions = _build_instructions(settings_path=settings_file) assert "anthropic:claude-sonnet-4-20250514" in instructions diff --git a/tests/test_studio/test_execution.py b/tests/test_studio/test_execution.py index e9bf2297..2db39ea5 100644 --- a/tests/test_studio/test_execution.py +++ b/tests/test_studio/test_execution.py @@ -20,8 +20,8 @@ import pytest -from fireflyframework_genai.pipeline.engine import PipelineEventHandler -from fireflyframework_genai.studio.execution.runner import StudioEventHandler +from fireflyframework_agentic.pipeline.engine import PipelineEventHandler +from fireflyframework_agentic.studio.execution.runner import StudioEventHandler pytest.importorskip("fastapi", reason="fastapi not installed") @@ -202,7 +202,7 @@ async def test_wait_times_out_when_no_event(self): class TestExecutionWebSocket: @pytest.fixture() def app(self): - from fireflyframework_genai.studio.server import create_studio_app + from fireflyframework_agentic.studio.server import create_studio_app return create_studio_app() diff --git a/tests/test_studio/test_graphql.py b/tests/test_studio/test_graphql.py index 60283069..0e87b8a9 100644 --- a/tests/test_studio/test_graphql.py +++ b/tests/test_studio/test_graphql.py @@ -26,8 +26,8 @@ import httpx # noqa: E402 -from fireflyframework_genai.studio.config import StudioConfig # noqa: E402 -from fireflyframework_genai.studio.server import create_studio_app # noqa: E402 +from fireflyframework_agentic.studio.config import StudioConfig # noqa: E402 +from fireflyframework_agentic.studio.server import create_studio_app # noqa: E402 # --------------------------------------------------------------------------- # Fixtures @@ -209,14 +209,14 @@ def _mock_import(name: str, *args: object, **kwargs: object) -> object: # Need to reimport to trigger the fallback path from importlib import reload - import fireflyframework_genai.studio.api.graphql_api as gql_mod + import fireflyframework_agentic.studio.api.graphql_api as gql_mod reload(gql_mod) import tempfile from pathlib import Path - from fireflyframework_genai.studio.projects import ProjectManager + from fireflyframework_agentic.studio.projects import ProjectManager with tempfile.TemporaryDirectory() as td: pm = ProjectManager(Path(td)) diff --git a/tests/test_studio/test_input_output_nodes.py b/tests/test_studio/test_input_output_nodes.py index 42cb2015..25bbb25f 100644 --- a/tests/test_studio/test_input_output_nodes.py +++ b/tests/test_studio/test_input_output_nodes.py @@ -4,8 +4,8 @@ import pytest -from fireflyframework_genai.studio.codegen.models import GraphNode, NodeType -from fireflyframework_genai.studio.execution.io_nodes import ( +from fireflyframework_agentic.studio.codegen.models import GraphNode, NodeType +from fireflyframework_agentic.studio.execution.io_nodes import ( FileConfig, HttpConfig, InputNodeConfig, diff --git a/tests/test_studio/test_pipeline_events.py b/tests/test_studio/test_pipeline_events.py index 8346e235..19bfbf6c 100644 --- a/tests/test_studio/test_pipeline_events.py +++ b/tests/test_studio/test_pipeline_events.py @@ -23,15 +23,15 @@ from unittest.mock import AsyncMock, MagicMock -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, NodeType, ) -from fireflyframework_genai.studio.execution.checkpoint import CheckpointManager -from fireflyframework_genai.studio.execution.compiler import compile_graph -from fireflyframework_genai.studio.execution.runner import StudioEventHandler +from fireflyframework_agentic.studio.execution.checkpoint import CheckpointManager +from fireflyframework_agentic.studio.execution.compiler import compile_graph +from fireflyframework_agentic.studio.execution.runner import StudioEventHandler # --------------------------------------------------------------------------- # Helpers diff --git a/tests/test_studio/test_pipeline_integration.py b/tests/test_studio/test_pipeline_integration.py index 83b82399..39652830 100644 --- a/tests/test_studio/test_pipeline_integration.py +++ b/tests/test_studio/test_pipeline_integration.py @@ -23,10 +23,10 @@ from unittest.mock import AsyncMock, MagicMock, patch -from fireflyframework_genai.agents.registry import agent_registry -from fireflyframework_genai.pipeline.context import PipelineContext -from fireflyframework_genai.pipeline.engine import PipelineEngine -from fireflyframework_genai.pipeline.steps import ( +from fireflyframework_agentic.agents.registry import agent_registry +from fireflyframework_agentic.pipeline.context import PipelineContext +from fireflyframework_agentic.pipeline.engine import PipelineEngine +from fireflyframework_agentic.pipeline.steps import ( AgentStep, BranchStep, CallableStep, @@ -34,15 +34,15 @@ FanOutStep, ReasoningStep, ) -from fireflyframework_genai.reasoning.registry import reasoning_registry -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.reasoning.registry import reasoning_registry +from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, NodeType, ) -from fireflyframework_genai.studio.execution.compiler import compile_graph -from fireflyframework_genai.tools.registry import tool_registry +from fireflyframework_agentic.studio.execution.compiler import compile_graph +from fireflyframework_agentic.tools.registry import tool_registry # --------------------------------------------------------------------------- # Helpers (same patterns as test_compiler.py) @@ -114,7 +114,7 @@ def test_compiles_to_agent_step(self): ) graph = _make_graph([node]) - with patch("fireflyframework_genai.agents.base.FireflyAgent") as mock_cls: + with patch("fireflyframework_agentic.agents.base.FireflyAgent") as mock_cls: mock_cls.return_value = MagicMock() engine = compile_graph(graph) @@ -303,7 +303,7 @@ async def test_agent_tool_execution_flow(self): edges = [GraphEdge(id="e1", source="a1", target="t1")] graph = _make_graph(nodes, edges) - from fireflyframework_genai.studio.execution.runner import StudioEventHandler + from fireflyframework_agentic.studio.execution.runner import StudioEventHandler handler = StudioEventHandler() engine = compile_graph(graph, event_handler=handler) @@ -396,7 +396,7 @@ def test_multimodal_config_does_not_block_compilation(self): ) graph = _make_graph([node]) - with patch("fireflyframework_genai.agents.base.FireflyAgent") as mock_cls: + with patch("fireflyframework_agentic.agents.base.FireflyAgent") as mock_cls: mock_cls.return_value = MagicMock() engine = compile_graph(graph) diff --git a/tests/test_studio/test_project_api.py b/tests/test_studio/test_project_api.py index 1aaad6f1..0b4a1936 100644 --- a/tests/test_studio/test_project_api.py +++ b/tests/test_studio/test_project_api.py @@ -25,8 +25,8 @@ import httpx -from fireflyframework_genai.studio.config import StudioConfig -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.config import StudioConfig +from fireflyframework_agentic.studio.server import create_studio_app # --------------------------------------------------------------------------- # Fixtures diff --git a/tests/test_studio/test_project_runtime.py b/tests/test_studio/test_project_runtime.py index 34c59d1f..9707e80d 100644 --- a/tests/test_studio/test_project_runtime.py +++ b/tests/test_studio/test_project_runtime.py @@ -4,13 +4,13 @@ import pytest -from fireflyframework_genai.studio.codegen.models import ( +from fireflyframework_agentic.studio.codegen.models import ( GraphEdge, GraphModel, GraphNode, NodeType, ) -from fireflyframework_genai.studio.runtime import ProjectRuntime +from fireflyframework_agentic.studio.runtime import ProjectRuntime def _simple_graph() -> GraphModel: diff --git a/tests/test_studio/test_projects.py b/tests/test_studio/test_projects.py index 8208e55f..f23cbb2a 100644 --- a/tests/test_studio/test_projects.py +++ b/tests/test_studio/test_projects.py @@ -22,9 +22,9 @@ import httpx import pytest -from fireflyframework_genai.studio.config import StudioConfig -from fireflyframework_genai.studio.projects import ProjectInfo, ProjectManager -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.config import StudioConfig +from fireflyframework_agentic.studio.projects import ProjectInfo, ProjectManager +from fireflyframework_agentic.studio.server import create_studio_app pytest.importorskip("fastapi", reason="fastapi not installed") pytest.importorskip("httpx", reason="httpx not installed") diff --git a/tests/test_studio/test_server.py b/tests/test_studio/test_server.py index 53bdde7f..0a0879be 100644 --- a/tests/test_studio/test_server.py +++ b/tests/test_studio/test_server.py @@ -25,7 +25,7 @@ import httpx -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.server import create_studio_app # --------------------------------------------------------------------------- # Fixtures @@ -64,7 +64,7 @@ async def test_health_returns_status_ok(self, client: httpx.AsyncClient): async def test_health_returns_version(self, client: httpx.AsyncClient): resp = await client.get("/api/health") body = resp.json() - expected_version = importlib.metadata.version("fireflyframework-genai") + expected_version = importlib.metadata.version("fireflyframework-agentic") assert body["version"] == expected_version @@ -133,11 +133,11 @@ def test_create_studio_app_has_correct_title(self): def test_create_studio_app_has_package_version(self): app = create_studio_app() - expected_version = importlib.metadata.version("fireflyframework-genai") + expected_version = importlib.metadata.version("fireflyframework-agentic") assert app.version == expected_version def test_create_studio_app_accepts_custom_config(self): - from fireflyframework_genai.studio.config import StudioConfig + from fireflyframework_agentic.studio.config import StudioConfig config = StudioConfig(_env_file=None, port=9999) app = create_studio_app(config=config) diff --git a/tests/test_studio/test_settings.py b/tests/test_studio/test_settings.py index c6eb2d31..2ed1b6cc 100644 --- a/tests/test_studio/test_settings.py +++ b/tests/test_studio/test_settings.py @@ -23,7 +23,7 @@ import pytest from pydantic import SecretStr -from fireflyframework_genai.studio.settings import ( +from fireflyframework_agentic.studio.settings import ( ModelDefaults, ProviderCredentials, StudioSettings, @@ -38,7 +38,7 @@ import httpx -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.server import create_studio_app # --------------------------------------------------------------------------- # Unit tests — file I/O diff --git a/tests/test_studio/test_static_serving.py b/tests/test_studio/test_static_serving.py index 5970dc7e..98fedce2 100644 --- a/tests/test_studio/test_static_serving.py +++ b/tests/test_studio/test_static_serving.py @@ -26,7 +26,7 @@ import httpx -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.server import create_studio_app @pytest.fixture() @@ -45,7 +45,7 @@ class TestStaticServing: async def test_serves_index_html_when_static_dir_exists(self, static_dir: Path): """When bundled static files exist, / serves index.html.""" with patch( - "fireflyframework_genai.studio.server._get_default_static_dir", + "fireflyframework_agentic.studio.server._get_default_static_dir", return_value=static_dir, ): app = create_studio_app() @@ -59,7 +59,7 @@ async def test_serves_index_html_when_static_dir_exists(self, static_dir: Path): async def test_api_routes_work_with_static_serving(self, static_dir: Path): """API routes still work when static files are mounted.""" with patch( - "fireflyframework_genai.studio.server._get_default_static_dir", + "fireflyframework_agentic.studio.server._get_default_static_dir", return_value=static_dir, ): app = create_studio_app() diff --git a/tests/test_studio/test_tunnel.py b/tests/test_studio/test_tunnel.py index 1744d940..b95f243f 100644 --- a/tests/test_studio/test_tunnel.py +++ b/tests/test_studio/test_tunnel.py @@ -21,7 +21,7 @@ import pytest -from fireflyframework_genai.studio.tunnel import TunnelManager +from fireflyframework_agentic.studio.tunnel import TunnelManager class TestTunnelManager: diff --git a/tests/test_studio/test_tunnel_api.py b/tests/test_studio/test_tunnel_api.py index 5a2c7b2c..296a3d43 100644 --- a/tests/test_studio/test_tunnel_api.py +++ b/tests/test_studio/test_tunnel_api.py @@ -23,7 +23,7 @@ import httpx -from fireflyframework_genai.studio.server import create_studio_app +from fireflyframework_agentic.studio.server import create_studio_app @pytest.fixture() @@ -65,14 +65,14 @@ async def test_tunnel_stop_when_not_running(self, client): class TestExposeCLI: def test_expose_parser(self): - from fireflyframework_genai.studio.cli import parse_args + from fireflyframework_agentic.studio.cli import parse_args args = parse_args(["expose", "--port", "9000"]) assert args.command == "expose" assert args.port == 9000 def test_expose_parser_default_port(self): - from fireflyframework_genai.studio.cli import parse_args + from fireflyframework_agentic.studio.cli import parse_args args = parse_args(["expose"]) assert args.command == "expose" diff --git a/tests/test_tools/test_builder.py b/tests/test_tools/test_builder.py index b5bcef8e..3af0a937 100644 --- a/tests/test_tools/test_builder.py +++ b/tests/test_tools/test_builder.py @@ -18,7 +18,7 @@ import pytest -from fireflyframework_genai.tools.builder import ToolBuilder +from fireflyframework_agentic.tools.builder import ToolBuilder class TestToolBuilder: diff --git a/tests/test_tools/test_builtins.py b/tests/test_tools/test_builtins.py index 91c598ba..ccf35a24 100644 --- a/tests/test_tools/test_builtins.py +++ b/tests/test_tools/test_builtins.py @@ -24,16 +24,16 @@ import pytest -from fireflyframework_genai.exceptions import ToolError -from fireflyframework_genai.tools.builtins.calculator_tool import CalculatorTool -from fireflyframework_genai.tools.builtins.database import DatabaseTool -from fireflyframework_genai.tools.builtins.datetime_tool import DateTimeTool -from fireflyframework_genai.tools.builtins.filesystem import FileSystemTool -from fireflyframework_genai.tools.builtins.http import HttpTool -from fireflyframework_genai.tools.builtins.json_tool import JsonTool -from fireflyframework_genai.tools.builtins.search import SearchResult, SearchTool -from fireflyframework_genai.tools.builtins.shell import ShellTool -from fireflyframework_genai.tools.builtins.text_tool import TextTool +from fireflyframework_agentic.exceptions import ToolError +from fireflyframework_agentic.tools.builtins.calculator_tool import CalculatorTool +from fireflyframework_agentic.tools.builtins.database import DatabaseTool +from fireflyframework_agentic.tools.builtins.datetime_tool import DateTimeTool +from fireflyframework_agentic.tools.builtins.filesystem import FileSystemTool +from fireflyframework_agentic.tools.builtins.http import HttpTool +from fireflyframework_agentic.tools.builtins.json_tool import JsonTool +from fireflyframework_agentic.tools.builtins.search import SearchResult, SearchTool +from fireflyframework_agentic.tools.builtins.shell import ShellTool +from fireflyframework_agentic.tools.builtins.text_tool import TextTool # --------------------------------------------------------------------------- # DateTimeTool @@ -508,7 +508,7 @@ class TestResolveToolsBridge: def test_base_tool_converted(self) -> None: from pydantic_ai import Tool as PydanticTool - from fireflyframework_genai.agents.base import FireflyAgent + from fireflyframework_agentic.agents.base import FireflyAgent calc = CalculatorTool() resolved = FireflyAgent._resolve_tools([calc]) @@ -518,8 +518,8 @@ def test_base_tool_converted(self) -> None: def test_toolkit_expanded(self) -> None: from pydantic_ai import Tool as PydanticTool - from fireflyframework_genai.agents.base import FireflyAgent - from fireflyframework_genai.tools.toolkit import ToolKit + from fireflyframework_agentic.agents.base import FireflyAgent + from fireflyframework_agentic.tools.toolkit import ToolKit kit = ToolKit("utils", [DateTimeTool(), JsonTool()]) resolved = FireflyAgent._resolve_tools([kit]) @@ -527,7 +527,7 @@ def test_toolkit_expanded(self) -> None: assert all(isinstance(t, PydanticTool) for t in resolved) def test_plain_function_passes_through(self) -> None: - from fireflyframework_genai.agents.base import FireflyAgent + from fireflyframework_agentic.agents.base import FireflyAgent async def my_tool(x: str) -> str: return x @@ -539,7 +539,7 @@ async def my_tool(x: str) -> str: def test_mixed_tools(self) -> None: from pydantic_ai import Tool as PydanticTool - from fireflyframework_genai.agents.base import FireflyAgent + from fireflyframework_agentic.agents.base import FireflyAgent async def my_tool(x: str) -> str: return x diff --git a/tests/test_tools/test_cached.py b/tests/test_tools/test_cached.py index 12ed5533..e4b262a1 100644 --- a/tests/test_tools/test_cached.py +++ b/tests/test_tools/test_cached.py @@ -5,7 +5,7 @@ import asyncio import time -from fireflyframework_genai.tools.cached import CachedTool, _CacheEntry +from fireflyframework_agentic.tools.cached import CachedTool, _CacheEntry class _CounterTool: @@ -102,6 +102,6 @@ def test_repr(self): assert "120" in repr(cached) def test_import_from_package(self): - from fireflyframework_genai.tools import CachedTool as CachedToolAlias + from fireflyframework_agentic.tools import CachedTool as CachedToolAlias assert CachedToolAlias is CachedTool diff --git a/tests/test_tools/test_composer.py b/tests/test_tools/test_composer.py index 47101297..c562767d 100644 --- a/tests/test_tools/test_composer.py +++ b/tests/test_tools/test_composer.py @@ -6,8 +6,8 @@ import pytest -from fireflyframework_genai.exceptions import ToolError -from fireflyframework_genai.tools.composer import ( +from fireflyframework_agentic.exceptions import ToolError +from fireflyframework_agentic.tools.composer import ( ConditionalComposer, FallbackComposer, SequentialComposer, diff --git a/tests/test_tools/test_guards.py b/tests/test_tools/test_guards.py index 446c6cdb..116efed2 100644 --- a/tests/test_tools/test_guards.py +++ b/tests/test_tools/test_guards.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.tools.guards import ( +from fireflyframework_agentic.tools.guards import ( CompositeGuard, RateLimitGuard, SandboxGuard, diff --git a/tests/test_tools/test_registry.py b/tests/test_tools/test_registry.py index 4ce96542..cfb3b634 100644 --- a/tests/test_tools/test_registry.py +++ b/tests/test_tools/test_registry.py @@ -18,8 +18,8 @@ import pytest -from fireflyframework_genai.tools.builder import ToolBuilder -from fireflyframework_genai.tools.registry import ToolRegistry +from fireflyframework_agentic.tools.builder import ToolBuilder +from fireflyframework_agentic.tools.registry import ToolRegistry class TestToolRegistry: @@ -36,7 +36,7 @@ def test_register_and_get(self): assert registry.get("t1") is tool def test_get_nonexistent_raises(self): - from fireflyframework_genai.exceptions import ToolNotFoundError + from fireflyframework_agentic.exceptions import ToolNotFoundError registry = ToolRegistry() with pytest.raises(ToolNotFoundError): diff --git a/tests/test_tools/test_timeout.py b/tests/test_tools/test_timeout.py index 605875a7..28ce47eb 100644 --- a/tests/test_tools/test_timeout.py +++ b/tests/test_tools/test_timeout.py @@ -6,8 +6,8 @@ import pytest -from fireflyframework_genai.exceptions import ToolTimeoutError -from fireflyframework_genai.tools.base import BaseTool +from fireflyframework_agentic.exceptions import ToolTimeoutError +from fireflyframework_agentic.tools.base import BaseTool class _SlowTool(BaseTool): diff --git a/tests/test_tools/test_toolkit.py b/tests/test_tools/test_toolkit.py index a2c9d860..735cf42b 100644 --- a/tests/test_tools/test_toolkit.py +++ b/tests/test_tools/test_toolkit.py @@ -4,11 +4,11 @@ from typing import Any -from fireflyframework_genai.tools.base import BaseTool -from fireflyframework_genai.tools.decorators import firefly_tool, guarded, retryable -from fireflyframework_genai.tools.guards import ValidationGuard -from fireflyframework_genai.tools.registry import ToolRegistry -from fireflyframework_genai.tools.toolkit import ToolKit +from fireflyframework_agentic.tools.base import BaseTool +from fireflyframework_agentic.tools.decorators import firefly_tool, guarded, retryable +from fireflyframework_agentic.tools.guards import ValidationGuard +from fireflyframework_agentic.tools.registry import ToolRegistry +from fireflyframework_agentic.tools.toolkit import ToolKit class _DummyTool(BaseTool): diff --git a/tests/test_validation/test_qos.py b/tests/test_validation/test_qos.py index 11dfaf7f..3fa35d10 100644 --- a/tests/test_validation/test_qos.py +++ b/tests/test_validation/test_qos.py @@ -14,7 +14,7 @@ """Tests for QoS guards.""" -from fireflyframework_genai.validation.qos import GroundingChecker, QoSGuard +from fireflyframework_agentic.validation.qos import GroundingChecker, QoSGuard class TestGroundingChecker: diff --git a/tests/test_validation/test_reviewer.py b/tests/test_validation/test_reviewer.py index ca00a4db..cd0be2ce 100644 --- a/tests/test_validation/test_reviewer.py +++ b/tests/test_validation/test_reviewer.py @@ -22,9 +22,9 @@ import pytest from pydantic import BaseModel, Field -from fireflyframework_genai.exceptions import OutputReviewError -from fireflyframework_genai.validation.reviewer import OutputReviewer, RetryAttempt, ReviewResult -from fireflyframework_genai.validation.rules import EnumRule, OutputValidator +from fireflyframework_agentic.exceptions import OutputReviewError +from fireflyframework_agentic.validation.reviewer import OutputReviewer, RetryAttempt, ReviewResult +from fireflyframework_agentic.validation.rules import EnumRule, OutputValidator @dataclass diff --git a/tests/test_validation/test_rules.py b/tests/test_validation/test_rules.py index 3e073bd6..a65cd20f 100644 --- a/tests/test_validation/test_rules.py +++ b/tests/test_validation/test_rules.py @@ -17,7 +17,7 @@ import pytest from pydantic import BaseModel -from fireflyframework_genai.validation.rules import ( +from fireflyframework_agentic.validation.rules import ( CustomRule, EnumRule, FieldValidator, diff --git a/tests/test_vectorstores/test_base.py b/tests/test_vectorstores/test_base.py index 4e700bee..1933985a 100644 --- a/tests/test_vectorstores/test_base.py +++ b/tests/test_vectorstores/test_base.py @@ -4,10 +4,10 @@ import pytest -from fireflyframework_genai.embeddings.base import BaseEmbedder -from fireflyframework_genai.exceptions import VectorStoreError -from fireflyframework_genai.vectorstores.base import BaseVectorStore, VectorStoreProtocol -from fireflyframework_genai.vectorstores.types import SearchResult, VectorDocument +from fireflyframework_agentic.embeddings.base import BaseEmbedder +from fireflyframework_agentic.exceptions import VectorStoreError +from fireflyframework_agentic.vectorstores.base import BaseVectorStore, VectorStoreProtocol +from fireflyframework_agentic.vectorstores.types import SearchResult, VectorDocument class _FakeEmbedder(BaseEmbedder): diff --git a/tests/test_vectorstores/test_chroma_store.py b/tests/test_vectorstores/test_chroma_store.py index f537a0d7..b939f226 100644 --- a/tests/test_vectorstores/test_chroma_store.py +++ b/tests/test_vectorstores/test_chroma_store.py @@ -6,18 +6,18 @@ import pytest -from fireflyframework_genai.vectorstores.types import SearchFilter, VectorDocument +from fireflyframework_agentic.vectorstores.types import SearchFilter, VectorDocument class TestChromaVectorStore: - @patch("fireflyframework_genai.vectorstores.chroma_store.chromadb") + @patch("fireflyframework_agentic.vectorstores.chroma_store.chromadb") async def test_upsert(self, mock_chromadb): mock_collection = MagicMock() mock_client = MagicMock() mock_client.get_or_create_collection.return_value = mock_collection mock_chromadb.Client.return_value = mock_client - from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore + from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore store = ChromaVectorStore(collection_name="test") await store.upsert([VectorDocument(id="1", text="hello", embedding=[1.0, 0.0])]) @@ -27,14 +27,14 @@ async def test_upsert(self, mock_chromadb): assert call_kwargs[1]["documents"] == ["hello"] assert call_kwargs[1]["embeddings"] == [[1.0, 0.0]] - @patch("fireflyframework_genai.vectorstores.chroma_store.chromadb") + @patch("fireflyframework_agentic.vectorstores.chroma_store.chromadb") async def test_upsert_with_namespace(self, mock_chromadb): mock_collection = MagicMock() mock_client = MagicMock() mock_client.get_or_create_collection.return_value = mock_collection mock_chromadb.Client.return_value = mock_client - from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore + from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore store = ChromaVectorStore(collection_name="test") await store.upsert( @@ -44,7 +44,7 @@ async def test_upsert_with_namespace(self, mock_chromadb): call_kwargs = mock_collection.upsert.call_args assert call_kwargs[1]["metadatas"] == [{"_namespace": "custom_ns"}] - @patch("fireflyframework_genai.vectorstores.chroma_store.chromadb") + @patch("fireflyframework_agentic.vectorstores.chroma_store.chromadb") async def test_search(self, mock_chromadb): mock_collection = MagicMock() mock_collection.query.return_value = { @@ -57,7 +57,7 @@ async def test_search(self, mock_chromadb): mock_client.get_or_create_collection.return_value = mock_collection mock_chromadb.Client.return_value = mock_client - from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore + from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore store = ChromaVectorStore(collection_name="test") results = await store.search([1.0, 0.0], top_k=2) @@ -72,7 +72,7 @@ async def test_search(self, mock_chromadb): assert "_namespace" not in results[0].document.metadata assert results[1].document.metadata == {"tag": "test"} - @patch("fireflyframework_genai.vectorstores.chroma_store.chromadb") + @patch("fireflyframework_agentic.vectorstores.chroma_store.chromadb") async def test_search_with_filters(self, mock_chromadb): mock_collection = MagicMock() mock_collection.query.return_value = { @@ -85,7 +85,7 @@ async def test_search_with_filters(self, mock_chromadb): mock_client.get_or_create_collection.return_value = mock_collection mock_chromadb.Client.return_value = mock_client - from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore + from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore store = ChromaVectorStore(collection_name="test") results = await store.search( @@ -99,7 +99,7 @@ async def test_search_with_filters(self, mock_chromadb): assert call_kwargs[1]["where"]["type"] == "blog" assert call_kwargs[1]["where"]["_namespace"] == "default" - @patch("fireflyframework_genai.vectorstores.chroma_store.chromadb") + @patch("fireflyframework_agentic.vectorstores.chroma_store.chromadb") async def test_search_empty_results(self, mock_chromadb): mock_collection = MagicMock() mock_collection.query.return_value = { @@ -112,41 +112,41 @@ async def test_search_empty_results(self, mock_chromadb): mock_client.get_or_create_collection.return_value = mock_collection mock_chromadb.Client.return_value = mock_client - from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore + from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore store = ChromaVectorStore(collection_name="test") results = await store.search([1.0, 0.0], top_k=5) assert results == [] - @patch("fireflyframework_genai.vectorstores.chroma_store.chromadb") + @patch("fireflyframework_agentic.vectorstores.chroma_store.chromadb") async def test_delete(self, mock_chromadb): mock_collection = MagicMock() mock_client = MagicMock() mock_client.get_or_create_collection.return_value = mock_collection mock_chromadb.Client.return_value = mock_client - from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore + from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore store = ChromaVectorStore(collection_name="test") await store.delete(["1", "2"]) mock_collection.delete.assert_called_once_with(ids=["1", "2"], where={"_namespace": "default"}) - @patch("fireflyframework_genai.vectorstores.chroma_store.chromadb") + @patch("fireflyframework_agentic.vectorstores.chroma_store.chromadb") async def test_custom_client(self, mock_chromadb): mock_collection = MagicMock() custom_client = MagicMock() custom_client.get_or_create_collection.return_value = mock_collection - from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore + from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore ChromaVectorStore(collection_name="my_coll", client=custom_client) # Should use the custom client, not create a new one mock_chromadb.Client.assert_not_called() custom_client.get_or_create_collection.assert_called_once_with(name="my_coll") - @patch("fireflyframework_genai.vectorstores.chroma_store.chromadb", None) + @patch("fireflyframework_agentic.vectorstores.chroma_store.chromadb", None) async def test_import_error_when_chromadb_not_installed(self): - from fireflyframework_genai.vectorstores.chroma_store import ChromaVectorStore + from fireflyframework_agentic.vectorstores.chroma_store import ChromaVectorStore with pytest.raises(ImportError, match="chromadb"): ChromaVectorStore() diff --git a/tests/test_vectorstores/test_init.py b/tests/test_vectorstores/test_init.py index a0ae4164..ce112060 100644 --- a/tests/test_vectorstores/test_init.py +++ b/tests/test_vectorstores/test_init.py @@ -5,7 +5,7 @@ class TestVectorStoresPublicAPI: def test_imports(self): - from fireflyframework_genai.vectorstores import ( + from fireflyframework_agentic.vectorstores import ( BaseVectorStore, InMemoryVectorStore, SearchFilter, diff --git a/tests/test_vectorstores/test_memory_store.py b/tests/test_vectorstores/test_memory_store.py index ed75a57f..baf72a7e 100644 --- a/tests/test_vectorstores/test_memory_store.py +++ b/tests/test_vectorstores/test_memory_store.py @@ -2,8 +2,8 @@ from __future__ import annotations -from fireflyframework_genai.vectorstores.memory_store import InMemoryVectorStore -from fireflyframework_genai.vectorstores.types import SearchFilter, VectorDocument +from fireflyframework_agentic.vectorstores.memory_store import InMemoryVectorStore +from fireflyframework_agentic.vectorstores.types import SearchFilter, VectorDocument class TestInMemoryVectorStore: diff --git a/tests/test_vectorstores/test_pinecone_store.py b/tests/test_vectorstores/test_pinecone_store.py index 6f12fb21..bd4433ef 100644 --- a/tests/test_vectorstores/test_pinecone_store.py +++ b/tests/test_vectorstores/test_pinecone_store.py @@ -6,18 +6,18 @@ import pytest -from fireflyframework_genai.vectorstores.types import SearchFilter, VectorDocument +from fireflyframework_agentic.vectorstores.types import SearchFilter, VectorDocument class TestPineconeVectorStore: - @patch("fireflyframework_genai.vectorstores.pinecone_store.Pinecone") + @patch("fireflyframework_agentic.vectorstores.pinecone_store.Pinecone") async def test_upsert(self, mock_pinecone_cls): mock_index = MagicMock() mock_pc = MagicMock() mock_pc.Index.return_value = mock_index mock_pinecone_cls.return_value = mock_pc - from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore + from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore store = PineconeVectorStore(index_name="test-index", api_key="fake-key") await store.upsert( @@ -33,14 +33,14 @@ async def test_upsert(self, mock_pinecone_cls): assert vectors[0]["values"] == [1.0, 0.0] assert vectors[0]["metadata"]["_text"] == "hello" - @patch("fireflyframework_genai.vectorstores.pinecone_store.Pinecone") + @patch("fireflyframework_agentic.vectorstores.pinecone_store.Pinecone") async def test_upsert_with_metadata(self, mock_pinecone_cls): mock_index = MagicMock() mock_pc = MagicMock() mock_pc.Index.return_value = mock_index mock_pinecone_cls.return_value = mock_pc - from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore + from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore store = PineconeVectorStore(index_name="test-index", api_key="fake-key") await store.upsert( @@ -57,7 +57,7 @@ async def test_upsert_with_metadata(self, mock_pinecone_cls): assert vectors[0]["metadata"]["type"] == "blog" assert vectors[0]["metadata"]["_text"] == "hello" - @patch("fireflyframework_genai.vectorstores.pinecone_store.Pinecone") + @patch("fireflyframework_agentic.vectorstores.pinecone_store.Pinecone") async def test_search(self, mock_pinecone_cls): mock_index = MagicMock() mock_index.query.return_value = { @@ -70,7 +70,7 @@ async def test_search(self, mock_pinecone_cls): mock_pc.Index.return_value = mock_index mock_pinecone_cls.return_value = mock_pc - from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore + from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore store = PineconeVectorStore(index_name="test-index", api_key="fake-key") results = await store.search([1.0, 0.0], top_k=2, namespace="ns1") @@ -85,7 +85,7 @@ async def test_search(self, mock_pinecone_cls): assert results[1].document.id == "2" assert results[1].document.text == "world" - @patch("fireflyframework_genai.vectorstores.pinecone_store.Pinecone") + @patch("fireflyframework_agentic.vectorstores.pinecone_store.Pinecone") async def test_search_with_eq_filter(self, mock_pinecone_cls): mock_index = MagicMock() mock_index.query.return_value = {"matches": []} @@ -93,7 +93,7 @@ async def test_search_with_eq_filter(self, mock_pinecone_cls): mock_pc.Index.return_value = mock_index mock_pinecone_cls.return_value = mock_pc - from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore + from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore store = PineconeVectorStore(index_name="test-index", api_key="fake-key") await store.search( @@ -104,7 +104,7 @@ async def test_search_with_eq_filter(self, mock_pinecone_cls): call_kwargs = mock_index.query.call_args[1] assert call_kwargs["filter"] == {"type": "blog"} - @patch("fireflyframework_genai.vectorstores.pinecone_store.Pinecone") + @patch("fireflyframework_agentic.vectorstores.pinecone_store.Pinecone") async def test_search_with_in_filter(self, mock_pinecone_cls): mock_index = MagicMock() mock_index.query.return_value = {"matches": []} @@ -112,7 +112,7 @@ async def test_search_with_in_filter(self, mock_pinecone_cls): mock_pc.Index.return_value = mock_index mock_pinecone_cls.return_value = mock_pc - from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore + from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore store = PineconeVectorStore(index_name="test-index", api_key="fake-key") await store.search( @@ -123,7 +123,7 @@ async def test_search_with_in_filter(self, mock_pinecone_cls): call_kwargs = mock_index.query.call_args[1] assert call_kwargs["filter"] == {"type": {"$in": ["a", "b"]}} - @patch("fireflyframework_genai.vectorstores.pinecone_store.Pinecone") + @patch("fireflyframework_agentic.vectorstores.pinecone_store.Pinecone") async def test_search_empty_results(self, mock_pinecone_cls): mock_index = MagicMock() mock_index.query.return_value = {"matches": []} @@ -131,28 +131,28 @@ async def test_search_empty_results(self, mock_pinecone_cls): mock_pc.Index.return_value = mock_index mock_pinecone_cls.return_value = mock_pc - from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore + from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore store = PineconeVectorStore(index_name="test-index", api_key="fake-key") results = await store.search([1.0, 0.0], top_k=5) assert results == [] - @patch("fireflyframework_genai.vectorstores.pinecone_store.Pinecone") + @patch("fireflyframework_agentic.vectorstores.pinecone_store.Pinecone") async def test_delete(self, mock_pinecone_cls): mock_index = MagicMock() mock_pc = MagicMock() mock_pc.Index.return_value = mock_index mock_pinecone_cls.return_value = mock_pc - from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore + from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore store = PineconeVectorStore(index_name="test-index", api_key="fake-key") await store.delete(["1", "2"], namespace="ns1") mock_index.delete.assert_called_once_with(ids=["1", "2"], namespace="ns1") - @patch("fireflyframework_genai.vectorstores.pinecone_store.Pinecone", None) + @patch("fireflyframework_agentic.vectorstores.pinecone_store.Pinecone", None) async def test_import_error_when_pinecone_not_installed(self): - from fireflyframework_genai.vectorstores.pinecone_store import PineconeVectorStore + from fireflyframework_agentic.vectorstores.pinecone_store import PineconeVectorStore with pytest.raises(ImportError, match="pinecone"): PineconeVectorStore(index_name="test") diff --git a/tests/test_vectorstores/test_qdrant_store.py b/tests/test_vectorstores/test_qdrant_store.py index bf86e1d1..54370b5d 100644 --- a/tests/test_vectorstores/test_qdrant_store.py +++ b/tests/test_vectorstores/test_qdrant_store.py @@ -6,18 +6,18 @@ import pytest -from fireflyframework_genai.vectorstores.types import SearchFilter, VectorDocument +from fireflyframework_agentic.vectorstores.types import SearchFilter, VectorDocument class TestQdrantVectorStore: - @patch("fireflyframework_genai.vectorstores.qdrant_store.AsyncQdrantClient") - @patch("fireflyframework_genai.vectorstores.qdrant_store.PointStruct") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.AsyncQdrantClient") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.PointStruct") async def test_upsert(self, mock_point_struct, mock_client_cls): mock_client = AsyncMock() mock_client_cls.return_value = mock_client mock_point_struct.side_effect = lambda **kw: MagicMock(**kw) - from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore + from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore store = QdrantVectorStore(collection_name="test") await store.upsert( @@ -29,8 +29,8 @@ async def test_upsert(self, mock_point_struct, mock_client_cls): assert call_kwargs["collection_name"] == "test" assert len(call_kwargs["points"]) == 1 - @patch("fireflyframework_genai.vectorstores.qdrant_store.AsyncQdrantClient") - @patch("fireflyframework_genai.vectorstores.qdrant_store.PointStruct") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.AsyncQdrantClient") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.PointStruct") async def test_upsert_with_metadata(self, mock_point_struct, mock_client_cls): mock_client = AsyncMock() mock_client_cls.return_value = mock_client @@ -42,7 +42,7 @@ def capture_point(**kw): mock_point_struct.side_effect = capture_point - from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore + from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore store = QdrantVectorStore(collection_name="test") await store.upsert( @@ -60,10 +60,10 @@ def capture_point(**kw): assert captured_kwargs["payload"]["_namespace"] == "custom_ns" assert captured_kwargs["payload"]["type"] == "blog" - @patch("fireflyframework_genai.vectorstores.qdrant_store.Filter") - @patch("fireflyframework_genai.vectorstores.qdrant_store.MatchValue") - @patch("fireflyframework_genai.vectorstores.qdrant_store.FieldCondition") - @patch("fireflyframework_genai.vectorstores.qdrant_store.AsyncQdrantClient") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.Filter") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.MatchValue") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.FieldCondition") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.AsyncQdrantClient") async def test_search(self, mock_client_cls, mock_fc, mock_mv, mock_filter): mock_point1 = MagicMock() mock_point1.id = "1" @@ -79,7 +79,7 @@ async def test_search(self, mock_client_cls, mock_fc, mock_mv, mock_filter): mock_client.search.return_value = [mock_point1, mock_point2] mock_client_cls.return_value = mock_client - from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore + from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore store = QdrantVectorStore(collection_name="test") results = await store.search([1.0, 0.0], top_k=2) @@ -95,16 +95,16 @@ async def test_search(self, mock_client_cls, mock_fc, mock_mv, mock_filter): assert results[1].document.id == "2" assert results[1].document.text == "world" - @patch("fireflyframework_genai.vectorstores.qdrant_store.Filter") - @patch("fireflyframework_genai.vectorstores.qdrant_store.MatchValue") - @patch("fireflyframework_genai.vectorstores.qdrant_store.FieldCondition") - @patch("fireflyframework_genai.vectorstores.qdrant_store.AsyncQdrantClient") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.Filter") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.MatchValue") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.FieldCondition") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.AsyncQdrantClient") async def test_search_with_filters(self, mock_client_cls, mock_fc, mock_mv, mock_filter): mock_client = AsyncMock() mock_client.search.return_value = [] mock_client_cls.return_value = mock_client - from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore + from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore store = QdrantVectorStore(collection_name="test") await store.search( @@ -115,28 +115,28 @@ async def test_search_with_filters(self, mock_client_cls, mock_fc, mock_mv, mock # Should have created 2 FieldConditions: _namespace + type filter assert mock_fc.call_count == 2 - @patch("fireflyframework_genai.vectorstores.qdrant_store.Filter") - @patch("fireflyframework_genai.vectorstores.qdrant_store.MatchValue") - @patch("fireflyframework_genai.vectorstores.qdrant_store.FieldCondition") - @patch("fireflyframework_genai.vectorstores.qdrant_store.AsyncQdrantClient") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.Filter") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.MatchValue") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.FieldCondition") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.AsyncQdrantClient") async def test_search_empty_results(self, mock_client_cls, mock_fc, mock_mv, mock_filter): mock_client = AsyncMock() mock_client.search.return_value = [] mock_client_cls.return_value = mock_client - from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore + from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore store = QdrantVectorStore(collection_name="test") results = await store.search([1.0, 0.0], top_k=5) assert results == [] - @patch("fireflyframework_genai.vectorstores.qdrant_store.PointIdsList") - @patch("fireflyframework_genai.vectorstores.qdrant_store.AsyncQdrantClient") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.PointIdsList") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.AsyncQdrantClient") async def test_delete(self, mock_client_cls, mock_points_list): mock_client = AsyncMock() mock_client_cls.return_value = mock_client - from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore + from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore store = QdrantVectorStore(collection_name="test") await store.delete(["1", "2"]) @@ -145,19 +145,19 @@ async def test_delete(self, mock_client_cls, mock_points_list): assert call_kwargs["collection_name"] == "test" mock_points_list.assert_called_once_with(points=["1", "2"]) - @patch("fireflyframework_genai.vectorstores.qdrant_store.AsyncQdrantClient", None) + @patch("fireflyframework_agentic.vectorstores.qdrant_store.AsyncQdrantClient", None) async def test_import_error_when_qdrant_not_installed(self): - from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore + from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore with pytest.raises(ImportError, match="qdrant-client"): QdrantVectorStore() - @patch("fireflyframework_genai.vectorstores.qdrant_store.AsyncQdrantClient") + @patch("fireflyframework_agentic.vectorstores.qdrant_store.AsyncQdrantClient") async def test_constructor_params(self, mock_client_cls): mock_client = AsyncMock() mock_client_cls.return_value = mock_client - from fireflyframework_genai.vectorstores.qdrant_store import QdrantVectorStore + from fireflyframework_agentic.vectorstores.qdrant_store import QdrantVectorStore store = QdrantVectorStore( collection_name="my_coll", diff --git a/tests/test_vectorstores/test_registry.py b/tests/test_vectorstores/test_registry.py index 29611d31..f20ee09a 100644 --- a/tests/test_vectorstores/test_registry.py +++ b/tests/test_vectorstores/test_registry.py @@ -4,8 +4,8 @@ import pytest -from fireflyframework_genai.vectorstores.memory_store import InMemoryVectorStore -from fireflyframework_genai.vectorstores.registry import VectorStoreRegistry +from fireflyframework_agentic.vectorstores.memory_store import InMemoryVectorStore +from fireflyframework_agentic.vectorstores.registry import VectorStoreRegistry class TestVectorStoreRegistry: diff --git a/tests/test_vectorstores/test_types.py b/tests/test_vectorstores/test_types.py index a55ec3ac..e123a147 100644 --- a/tests/test_vectorstores/test_types.py +++ b/tests/test_vectorstores/test_types.py @@ -2,7 +2,7 @@ from __future__ import annotations -from fireflyframework_genai.vectorstores.types import ( +from fireflyframework_agentic.vectorstores.types import ( SearchFilter, SearchResult, VectorDocument, diff --git a/tests/tools/test_http_pool.py b/tests/tools/test_http_pool.py index 1b1110b8..701ff54e 100644 --- a/tests/tools/test_http_pool.py +++ b/tests/tools/test_http_pool.py @@ -20,7 +20,7 @@ import pytest -from fireflyframework_genai.tools.builtins.http import HTTPX_AVAILABLE, HttpTool +from fireflyframework_agentic.tools.builtins.http import HTTPX_AVAILABLE, HttpTool class TestHttpConnectionPooling: @@ -107,7 +107,7 @@ async def test_request_with_body_and_headers(self): async def test_fallback_to_urllib_when_httpx_not_available(self): """Test that urllib fallback works when httpx is not available.""" # Temporarily disable httpx - with patch("fireflyframework_genai.tools.builtins.http.HTTPX_AVAILABLE", False): + with patch("fireflyframework_agentic.tools.builtins.http.HTTPX_AVAILABLE", False): tool = HttpTool(use_pool=True) # Request pooling # Should fallback to no pooling @@ -207,7 +207,7 @@ class TestHttpToolBackwardCompatibility: async def test_urllib_fallback_works(self): """Test that urllib fallback executes requests.""" - with patch("fireflyframework_genai.tools.builtins.http.HTTPX_AVAILABLE", False): + with patch("fireflyframework_agentic.tools.builtins.http.HTTPX_AVAILABLE", False): tool = HttpTool(use_pool=False) # Mock urllib.request.urlopen diff --git a/tests/tools/test_http_pool_smoke.py b/tests/tools/test_http_pool_smoke.py index dcf62ff1..0572a8f6 100644 --- a/tests/tools/test_http_pool_smoke.py +++ b/tests/tools/test_http_pool_smoke.py @@ -22,7 +22,7 @@ import asyncio -from fireflyframework_genai.tools.builtins.http import HTTPX_AVAILABLE, HttpTool +from fireflyframework_agentic.tools.builtins.http import HTTPX_AVAILABLE, HttpTool async def main(): diff --git a/uninstall.ps1 b/uninstall.ps1 index bcff1e1f..4a2668c3 100644 --- a/uninstall.ps1 +++ b/uninstall.ps1 @@ -16,10 +16,10 @@ <# .SYNOPSIS - Interactive uninstaller for fireflyframework-genai. + Interactive uninstaller for fireflyframework-agentic. .DESCRIPTION - Removes fireflyframework-genai with interactive confirmation, package + Removes fireflyframework-agentic with interactive confirmation, package detection, and optional cleanup of cached files and artifacts. .PARAMETER NonInteractive @@ -31,7 +31,7 @@ .EXAMPLE .\uninstall.ps1 .\uninstall.ps1 -NonInteractive - irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/uninstall.ps1 | iex + irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/uninstall.ps1 | iex #> [CmdletBinding()] @@ -45,8 +45,8 @@ $ErrorActionPreference = "Stop" # ── Constants ──────────────────────────────────────────────────────────────── $script:VERSION = "26.01.01" -$script:PACKAGE = "fireflyframework-genai" -$script:PACKAGE_IMPORT = "fireflyframework_genai" +$script:PACKAGE = "fireflyframework-agentic" +$script:PACKAGE_IMPORT = "fireflyframework_agentic" # ── State ──────────────────────────────────────────────────────────────────── @@ -83,7 +83,7 @@ function Show-Banner { Write-Host " \______ /\___ >___| /\____|__ /__|" -ForegroundColor Cyan Write-Host " \/ \/ \/ \/" -ForegroundColor Cyan Write-Host "" - Write-Host " fireflyframework-genai" -ForegroundColor White -NoNewline + Write-Host " fireflyframework-agentic" -ForegroundColor White -NoNewline Write-Host " Uninstaller" -ForegroundColor DarkGray Write-Host " Copyright 2026 Firefly Software Solutions Inc. Apache License 2.0." -ForegroundColor DarkGray Write-Host "" @@ -282,17 +282,17 @@ function Show-Farewell { Write-Host "" Write-Host " ╔══════════════════════════════════════════════════════════════╗" -ForegroundColor Green Write-Host " ║" -ForegroundColor Green -NoNewline - Write-Host " fireflyframework-genai" -ForegroundColor White -NoNewline + Write-Host " fireflyframework-agentic" -ForegroundColor White -NoNewline Write-Host " has been uninstalled. " -NoNewline Write-Host "║" -ForegroundColor Green Write-Host " ╚══════════════════════════════════════════════════════════════╝" -ForegroundColor Green Write-Host "" - Write-Info "Thank you for using fireflyframework-genai!" + Write-Info "Thank you for using fireflyframework-agentic!" Write-Host "" Write-Host " Reinstall anytime:" -ForegroundColor DarkGray - Write-Host " irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.ps1 | iex" -ForegroundColor White + Write-Host " irm https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/install.ps1 | iex" -ForegroundColor White Write-Host "" - Write-Host " Repository: https://github.com/fireflyframework/fireflyframework-genai" -ForegroundColor DarkGray + Write-Host " Repository: https://github.com/fireflyframework/fireflyframework-agentic" -ForegroundColor DarkGray Write-Host "" } diff --git a/uninstall.sh b/uninstall.sh index 7462be9d..ee8e9f2f 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -16,12 +16,12 @@ set -euo pipefail # ══════════════════════════════════════════════════════════════════════════════ -# fireflyframework-genai — Interactive Uninstaller +# fireflyframework-agentic — Interactive Uninstaller # ══════════════════════════════════════════════════════════════════════════════ readonly VERSION="26.01.01" -readonly PACKAGE="fireflyframework-genai" -readonly PACKAGE_IMPORT="fireflyframework_genai" +readonly PACKAGE="fireflyframework-agentic" +readonly PACKAGE_IMPORT="fireflyframework_agentic" readonly TOTAL_STEPS=4 # ── Installer state ────────────────────────────────────────────────────────── @@ -355,9 +355,9 @@ print_farewell() { info "Thank you for using ${PACKAGE}!" printf "\n" printf " %sReinstall anytime:%s\n" "$DIM" "$RESET" - printf " curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-genai/main/install.sh | bash\n" + printf " curl -fsSL https://raw.githubusercontent.com/fireflyframework/fireflyframework-agentic/main/install.sh | bash\n" printf "\n" - printf " %sRepository:%s https://github.com/fireflyframework/fireflyframework-genai\n\n" "$DIM" "$RESET" + printf " %sRepository:%s https://github.com/fireflyframework/fireflyframework-agentic\n\n" "$DIM" "$RESET" } # ══════════════════════════════════════════════════════════════════════════════ From 18edf18c8760299d7241fe42c60d97e2e0be283d Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 27 Apr 2026 18:50:25 +0200 Subject: [PATCH 2/7] refactor: extract studio into its own repository Studio (visual IDE, code generation, AI assistant, project runtime, scheduling, tunnel exposure) moves to a dedicated repository: https://github.com/fireflyframework/fireflyframework-agentic-studio Removed from this repo: - src/fireflyframework_agentic/studio/ (entire Python module) - studio-frontend/ (SvelteKit SPA) - studio-desktop/ (Tauri desktop bundle) - scripts/build_studio.py - tests/test_studio/ (~150 test files) - docs/studio.md, studio-agents.md, api-reference.md, scheduling.md, tunnel-exposure.md, input-output-nodes.md, project-api.md, tutorial-bpm-pipeline.md - examples/studio_launch.py - .github/workflows/desktop.yml (Tauri build pipeline) pyproject changes: - Removed [studio] extra (fastapi, uvicorn, strawberry-graphql, apscheduler) - Removed [project.scripts] firefly entry point (lives in studio) - Removed studio from [all] extra CI changes: - Removed frontend-build job - test job no longer needs frontend-build artifact - typecheck and test no longer install --extra studio Build artifacts and Studio-specific patterns also removed from .gitignore. --- .github/workflows/ci.yml | 29 +- .github/workflows/desktop.yml | 108 - .gitignore | 16 - README.md | 25 +- docs/README.md | 12 +- docs/api-reference.md | 361 -- docs/input-output-nodes.md | 320 - docs/pipeline.md | 40 +- docs/project-api.md | 363 -- docs/scheduling.md | 183 - docs/studio-agents.md | 438 -- docs/studio.md | 1098 ---- docs/tunnel-exposure.md | 216 - docs/tutorial-bpm-pipeline.md | 309 - examples/README.md | 4 - examples/studio_launch.py | 52 - pyproject.toml | 12 +- scripts/build_studio.py | 92 - .../studio/__init__.py | 45 - .../studio/api/__init__.py | 15 - .../studio/api/assistant.py | 978 --- .../studio/api/checkpoints.py | 111 - .../studio/api/codegen.py | 79 - .../studio/api/custom_tools.py | 617 -- .../studio/api/evaluate.py | 182 - .../studio/api/execution.py | 198 - .../studio/api/experiments.py | 184 - .../studio/api/files.py | 162 - .../studio/api/graphql_api.py | 225 - .../studio/api/monitoring.py | 45 - .../studio/api/oracle.py | 389 -- .../studio/api/project_api.py | 409 -- .../studio/api/projects.py | 209 - .../studio/api/registry.py | 59 - .../studio/api/settings.py | 341 -- .../studio/api/smith.py | 771 --- .../studio/api/tunnel.py | 69 - .../studio/assistant/__init__.py | 27 - .../studio/assistant/agent.py | 1424 ----- .../studio/assistant/history.py | 128 - .../studio/assistant/oracle.py | 522 -- .../studio/assistant/oracle_notifications.py | 132 - .../studio/assistant/shared_context.py | 130 - .../studio/assistant/smith.py | 784 --- src/fireflyframework_agentic/studio/cli.py | 179 - .../studio/codegen/__init__.py | 33 - .../studio/codegen/generator.py | 692 --- .../studio/codegen/models.py | 74 - src/fireflyframework_agentic/studio/config.py | 58 - .../studio/custom_tools.py | 264 - .../studio/evaluation.py | 224 - .../studio/execution/__init__.py | 15 - .../studio/execution/checkpoint.py | 204 - .../studio/execution/compiler.py | 413 -- .../studio/execution/io_nodes.py | 100 - .../studio/execution/runner.py | 134 - .../studio/projects.py | 209 - .../studio/runtime.py | 162 - src/fireflyframework_agentic/studio/server.py | 292 - .../studio/settings.py | 236 - src/fireflyframework_agentic/studio/tunnel.py | 126 - .../studio/versioning.py | 117 - studio-desktop/frontend-dist/_app/env.js | 1 - .../_app/immutable/assets/0.D1o6gups.css | 1 - .../_app/immutable/assets/0.Dt_lC5bU.css | 1 - .../_app/immutable/assets/2.1uTRQMkx.css | 1 - .../_app/immutable/assets/2.B5Y56XZl.css | 1 - .../_app/immutable/assets/2.BExnFsh0.css | 1 - .../_app/immutable/assets/2.iGbBghFD.css | 1 - .../_app/immutable/assets/3.bRsBZawq.css | 1 - .../_app/immutable/assets/3.wdEcXtf1.css | 1 - .../_app/immutable/assets/file.DU3A4Afm.css | 1 - .../_app/immutable/assets/marked.D37p7-Ro.css | 1 - .../_app/immutable/chunks/0zSFSexy.js | 2 - .../_app/immutable/chunks/8I91iWf8.js | 1 - .../_app/immutable/chunks/91PP6ILK.js | 6 - .../_app/immutable/chunks/BAxs8Xtu.js | 2 - .../_app/immutable/chunks/BB2KRr3j.js | 1 - .../_app/immutable/chunks/BCCFcAOv.js | 1 - .../_app/immutable/chunks/BESIXtBI.js | 2 - .../_app/immutable/chunks/BI8CVrNj.js | 64 - .../_app/immutable/chunks/BNectIeB.js | 2 - .../_app/immutable/chunks/BWWgRDE1.js | 2 - .../_app/immutable/chunks/BX0kmcoN.js | 1 - .../_app/immutable/chunks/B_6VzoXV.js | 1 - .../_app/immutable/chunks/Biw60Ycb.js | 1 - .../_app/immutable/chunks/CCyXRANn.js | 1 - .../_app/immutable/chunks/CFyDcTgg.js | 1 - .../_app/immutable/chunks/CJh9TUc0.js | 1 - .../_app/immutable/chunks/CKy8R5Mg.js | 1 - .../_app/immutable/chunks/CdQ27ih8.js | 1 - .../_app/immutable/chunks/CiPkpaXo.js | 1 - .../_app/immutable/chunks/D7CioVkw.js | 1 - .../_app/immutable/chunks/DCyBifBO.js | 2 - .../_app/immutable/chunks/DEAaRqcq.js | 1 - .../_app/immutable/chunks/DQfFYHAU.js | 1 - .../_app/immutable/chunks/DWKiSLzw.js | 6 - .../_app/immutable/chunks/DWbf9ulZ.js | 1 - .../_app/immutable/chunks/DaAgYj3T.js | 1 - .../_app/immutable/chunks/DaNA2RYx.js | 1 - .../_app/immutable/chunks/DaZstLas.js | 1 - .../_app/immutable/chunks/DfPw5QXW.js | 1 - .../_app/immutable/chunks/DhiGuJwU.js | 1 - .../_app/immutable/chunks/DiTIFvoL.js | 6 - .../_app/immutable/chunks/DsnmJJEf.js | 1 - .../_app/immutable/chunks/FsCUQR17.js | 1 - .../_app/immutable/chunks/K2hNZgUo.js | 2 - .../_app/immutable/chunks/N_rdQ7t6.js | 1 - .../_app/immutable/chunks/gvU2Nsg7.js | 1 - .../_app/immutable/chunks/hL-aZVJ4.js | 2 - .../_app/immutable/chunks/l8YpzWR9.js | 1 - .../_app/immutable/chunks/p0Zj8fW7.js | 1 - .../_app/immutable/chunks/v7tHB-Lt.js | 1 - .../_app/immutable/chunks/yhLnWQwL.js | 1 - .../_app/immutable/entry/app.BUQWwH8e.js | 2 - .../_app/immutable/entry/app.BxupTnou.js | 2 - .../_app/immutable/entry/app.D52pZA79.js | 2 - .../_app/immutable/entry/app.pDKzeQIC.js | 2 - .../_app/immutable/entry/start.BPjTRBau.js | 1 - .../_app/immutable/entry/start.CAhOeSv1.js | 1 - .../_app/immutable/entry/start.DMvoP-ld.js | 1 - .../_app/immutable/entry/start.HPZzOot-.js | 1 - .../_app/immutable/nodes/0.625rWOO-.js | 13 - .../_app/immutable/nodes/0.B467-gvR.js | 65 - .../_app/immutable/nodes/0.DQYGG-fq.js | 65 - .../_app/immutable/nodes/0.E-H85vrL.js | 65 - .../_app/immutable/nodes/1.BL8ytnJA.js | 1 - .../_app/immutable/nodes/1.CM9fyoZO.js | 1 - .../_app/immutable/nodes/1.CgtKuGLP.js | 1 - .../_app/immutable/nodes/1.Czl_Q6cB.js | 1 - .../_app/immutable/nodes/2.B2KpwBSe.js | 1 - .../_app/immutable/nodes/2.BuNaGOOw.js | 1 - .../_app/immutable/nodes/2.DdY508-2.js | 1 - .../_app/immutable/nodes/2.aUmnlf6d.js | 1 - .../_app/immutable/nodes/3.7-a9x_uM.js | 9 - .../_app/immutable/nodes/3.BOgUOg_l.js | 4 - .../_app/immutable/nodes/3.Cp-v9HuY.js | 4 - .../_app/immutable/nodes/3.DIXAYc9g.js | 4 - .../_app/immutable/nodes/4.BDkuuGZp.js | 1 - .../_app/immutable/nodes/4.BooAkJEK.js | 1 - .../_app/immutable/nodes/4.C8sTrwDE.js | 1 - .../_app/immutable/nodes/4.oy6NDEc0.js | 1 - .../_app/immutable/nodes/5.B_tkw_1h.js | 1 - .../_app/immutable/nodes/5.BzoQF27Z.js | 1 - .../_app/immutable/nodes/5.CyZ3q-f3.js | 1 - .../_app/immutable/nodes/5.qrTlHzif.js | 1 - .../_app/immutable/nodes/6.Bwo4e0-2.js | 1 - .../_app/immutable/nodes/6.D3NTFto7.js | 1 - .../_app/immutable/nodes/6.DbPQnfrb.js | 1 - .../_app/immutable/nodes/6.Dt6a6dFW.js | 1 - .../_app/immutable/nodes/7.B1NCeFHv.js | 1 - .../_app/immutable/nodes/7.C5dO2UUz.js | 1 - .../_app/immutable/nodes/7.CMH5WMHy.js | 1 - .../_app/immutable/nodes/7.wgNMEEjV.js | 1 - .../_app/immutable/nodes/8.B42jxsZB.js | 1 - .../_app/immutable/nodes/8.Bg5shqvn.js | 1 - .../_app/immutable/nodes/8.DYjLyWgX.js | 1 - .../_app/immutable/nodes/8.h4_RvxHO.js | 1 - .../_app/immutable/nodes/9.B77zeVLD.js | 1 - .../_app/immutable/nodes/9.C_pv2wQA.js | 1 - .../_app/immutable/nodes/9.D6xlIU6N.js | 1 - .../_app/immutable/nodes/9.F5w3hcSN.js | 1 - .../frontend-dist/_app/version.json | 1 - studio-desktop/frontend-dist/favicon.png | Bin 1276 -> 0 bytes studio-desktop/frontend-dist/index.html | 35 - studio-desktop/frontend-dist/robots.txt | 3 - studio-desktop/pyinstaller/entry_point.py | 19 - .../pyinstaller/firefly_studio.spec | 89 - .../hook-fireflyframework_genai.py | 66 - .../pyinstaller/rthook_disable_logfire.py | 11 - studio-desktop/src-tauri/Cargo.lock | 5349 ----------------- studio-desktop/src-tauri/Cargo.toml | 18 - studio-desktop/src-tauri/build.rs | 3 - .../src-tauri/capabilities/default.json | 9 - studio-desktop/src-tauri/icons/128x128.png | Bin 4792 -> 0 bytes studio-desktop/src-tauri/icons/128x128@2x.png | Bin 10065 -> 0 bytes studio-desktop/src-tauri/icons/32x32.png | Bin 1276 -> 0 bytes studio-desktop/src-tauri/icons/icon.icns | Bin 219642 -> 0 bytes studio-desktop/src-tauri/icons/icon.ico | Bin 18820 -> 0 bytes studio-desktop/src-tauri/src/main.rs | 183 - studio-desktop/src-tauri/tauri.conf.json | 46 - studio-frontend/.gitignore | 23 - studio-frontend/.npmrc | 1 - studio-frontend/README.md | 92 - studio-frontend/package-lock.json | 2361 -------- studio-frontend/package.json | 33 - studio-frontend/src/app.css | 144 - studio-frontend/src/app.d.ts | 13 - studio-frontend/src/app.html | 11 - studio-frontend/src/lib/api/client.ts | 298 - studio-frontend/src/lib/api/websocket.ts | 104 - studio-frontend/src/lib/assets/favicon.svg | 10 - .../src/lib/components/canvas/Canvas.svelte | 198 - .../lib/components/canvas/NodePalette.svelte | 132 - .../components/canvas/nodes/AgentNode.svelte | 333 - .../canvas/nodes/ConditionNode.svelte | 269 - .../canvas/nodes/CustomCodeNode.svelte | 139 - .../components/canvas/nodes/FanInNode.svelte | 158 - .../components/canvas/nodes/FanOutNode.svelte | 157 - .../components/canvas/nodes/InputNode.svelte | 344 -- .../components/canvas/nodes/MemoryNode.svelte | 177 - .../components/canvas/nodes/OutputNode.svelte | 343 -- .../canvas/nodes/ReasoningNode.svelte | 271 - .../components/canvas/nodes/ToolNode.svelte | 262 - .../canvas/nodes/ValidatorNode.svelte | 177 - .../src/lib/components/layout/AppShell.svelte | 249 - .../components/layout/CommandPalette.svelte | 541 -- .../components/layout/FirstStartWizard.svelte | 814 --- .../layout/ProjectSettingsModal.svelte | 244 - .../components/layout/SettingsModal.svelte | 1835 ------ .../lib/components/layout/ShareModal.svelte | 732 --- .../components/layout/ShortcutsModal.svelte | 248 - .../src/lib/components/layout/Sidebar.svelte | 122 - .../components/layout/ToastContainer.svelte | 110 - .../src/lib/components/layout/TopBar.svelte | 1134 ---- .../lib/components/panels/AgentSidebar.svelte | 261 - .../components/panels/ArchitectSidebar.svelte | 2329 ------- .../lib/components/panels/ArchitectTab.svelte | 1107 ---- .../lib/components/panels/BottomPanel.svelte | 269 - .../src/lib/components/panels/ChatTab.svelte | 1097 ---- .../src/lib/components/panels/CodeTab.svelte | 635 -- .../components/panels/ComponentPanel.svelte | 327 - .../lib/components/panels/ConfigPanel.svelte | 1041 ---- .../lib/components/panels/ConsoleTab.svelte | 243 - .../lib/components/panels/DeployPanel.svelte | 238 - .../components/panels/EvaluatePanel.svelte | 456 -- .../components/panels/ExecutionsPanel.svelte | 359 -- .../components/panels/ExperimentsPanel.svelte | 535 -- .../lib/components/panels/FilesPanel.svelte | 377 -- .../lib/components/panels/FormField.svelte | 113 - .../lib/components/panels/HistoryPanel.svelte | 360 -- .../panels/IntegrationsPanel.svelte | 989 --- .../lib/components/panels/MonitorPanel.svelte | 345 -- .../lib/components/panels/OraclePanel.svelte | 316 - .../lib/components/panels/OracleTab.svelte | 1313 ---- .../src/lib/components/panels/SmithTab.svelte | 1868 ------ .../lib/components/panels/TimelineTab.svelte | 727 --- .../lib/components/shared/ChatMessage.svelte | 88 - .../shared/CommandApprovalModal.svelte | 107 - .../components/shared/ModelSelector.svelte | 293 - .../shared/ThinkingIndicator.svelte | 63 - .../components/shared/ToolCallDisplay.svelte | 87 - .../src/lib/components/shared/Tooltip.svelte | 173 - studio-frontend/src/lib/data/models.ts | 127 - studio-frontend/src/lib/data/patterns.ts | 69 - studio-frontend/src/lib/data/templates.ts | 85 - studio-frontend/src/lib/data/tools.ts | 256 - studio-frontend/src/lib/execution/bridge.ts | 180 - studio-frontend/src/lib/index.ts | 1 - studio-frontend/src/lib/stores/chat.ts | 80 - studio-frontend/src/lib/stores/connection.ts | 40 - studio-frontend/src/lib/stores/execution.ts | 17 - .../src/lib/stores/notifications.ts | 30 - studio-frontend/src/lib/stores/oracle.ts | 270 - studio-frontend/src/lib/stores/pipeline.ts | 196 - studio-frontend/src/lib/stores/project.ts | 146 - studio-frontend/src/lib/stores/runtime.ts | 5 - studio-frontend/src/lib/stores/settings.ts | 61 - studio-frontend/src/lib/stores/smith.ts | 381 -- studio-frontend/src/lib/stores/theme.ts | 46 - studio-frontend/src/lib/stores/ui.ts | 42 - studio-frontend/src/lib/types/graph.ts | 267 - studio-frontend/src/routes/+layout.svelte | 44 - studio-frontend/src/routes/+layout.ts | 4 - studio-frontend/src/routes/+page.svelte | 1452 ----- .../src/routes/construct/+page.svelte | 29 - .../src/routes/deploy/+page.svelte | 11 - .../src/routes/evaluate/+page.svelte | 11 - .../src/routes/experiments/+page.svelte | 11 - studio-frontend/src/routes/files/+page.svelte | 11 - .../src/routes/integrations/+page.svelte | 11 - .../src/routes/monitor/+page.svelte | 11 - studio-frontend/static/favicon.png | Bin 1276 -> 0 bytes studio-frontend/static/robots.txt | 3 - studio-frontend/svelte.config.js | 12 - studio-frontend/tsconfig.json | 20 - studio-frontend/vite.config.ts | 16 - tests/test_studio/__init__.py | 0 tests/test_studio/test_api_assistant.py | 153 - tests/test_studio/test_api_checkpoints.py | 214 - tests/test_studio/test_api_codegen.py | 103 - tests/test_studio/test_api_monitoring.py | 190 - tests/test_studio/test_api_registry.py | 139 - tests/test_studio/test_assistant_agent.py | 157 - tests/test_studio/test_checkpoint.py | 319 - tests/test_studio/test_cli.py | 108 - tests/test_studio/test_codegen_generator.py | 339 -- tests/test_studio/test_codegen_models.py | 210 - tests/test_studio/test_compiler.py | 1132 ---- tests/test_studio/test_compiler_io.py | 124 - tests/test_studio/test_config.py | 76 - tests/test_studio/test_dynamic_model.py | 67 - tests/test_studio/test_execution.py | 259 - tests/test_studio/test_graphql.py | 230 - tests/test_studio/test_input_output_nodes.py | 132 - tests/test_studio/test_pipeline_events.py | 254 - .../test_studio/test_pipeline_integration.py | 404 -- tests/test_studio/test_project_api.py | 218 - tests/test_studio/test_project_runtime.py | 81 - tests/test_studio/test_projects.py | 379 -- tests/test_studio/test_server.py | 144 - tests/test_studio/test_settings.py | 217 - tests/test_studio/test_static_serving.py | 82 - tests/test_studio/test_tunnel.py | 65 - tests/test_studio/test_tunnel_api.py | 79 - 305 files changed, 20 insertions(+), 59683 deletions(-) delete mode 100644 .github/workflows/desktop.yml delete mode 100644 docs/api-reference.md delete mode 100644 docs/input-output-nodes.md delete mode 100644 docs/project-api.md delete mode 100644 docs/scheduling.md delete mode 100644 docs/studio-agents.md delete mode 100644 docs/studio.md delete mode 100644 docs/tunnel-exposure.md delete mode 100644 docs/tutorial-bpm-pipeline.md delete mode 100644 examples/studio_launch.py delete mode 100644 scripts/build_studio.py delete mode 100644 src/fireflyframework_agentic/studio/__init__.py delete mode 100644 src/fireflyframework_agentic/studio/api/__init__.py delete mode 100644 src/fireflyframework_agentic/studio/api/assistant.py delete mode 100644 src/fireflyframework_agentic/studio/api/checkpoints.py delete mode 100644 src/fireflyframework_agentic/studio/api/codegen.py delete mode 100644 src/fireflyframework_agentic/studio/api/custom_tools.py delete mode 100644 src/fireflyframework_agentic/studio/api/evaluate.py delete mode 100644 src/fireflyframework_agentic/studio/api/execution.py delete mode 100644 src/fireflyframework_agentic/studio/api/experiments.py delete mode 100644 src/fireflyframework_agentic/studio/api/files.py delete mode 100644 src/fireflyframework_agentic/studio/api/graphql_api.py delete mode 100644 src/fireflyframework_agentic/studio/api/monitoring.py delete mode 100644 src/fireflyframework_agentic/studio/api/oracle.py delete mode 100644 src/fireflyframework_agentic/studio/api/project_api.py delete mode 100644 src/fireflyframework_agentic/studio/api/projects.py delete mode 100644 src/fireflyframework_agentic/studio/api/registry.py delete mode 100644 src/fireflyframework_agentic/studio/api/settings.py delete mode 100644 src/fireflyframework_agentic/studio/api/smith.py delete mode 100644 src/fireflyframework_agentic/studio/api/tunnel.py delete mode 100644 src/fireflyframework_agentic/studio/assistant/__init__.py delete mode 100644 src/fireflyframework_agentic/studio/assistant/agent.py delete mode 100644 src/fireflyframework_agentic/studio/assistant/history.py delete mode 100644 src/fireflyframework_agentic/studio/assistant/oracle.py delete mode 100644 src/fireflyframework_agentic/studio/assistant/oracle_notifications.py delete mode 100644 src/fireflyframework_agentic/studio/assistant/shared_context.py delete mode 100644 src/fireflyframework_agentic/studio/assistant/smith.py delete mode 100644 src/fireflyframework_agentic/studio/cli.py delete mode 100644 src/fireflyframework_agentic/studio/codegen/__init__.py delete mode 100644 src/fireflyframework_agentic/studio/codegen/generator.py delete mode 100644 src/fireflyframework_agentic/studio/codegen/models.py delete mode 100644 src/fireflyframework_agentic/studio/config.py delete mode 100644 src/fireflyframework_agentic/studio/custom_tools.py delete mode 100644 src/fireflyframework_agentic/studio/evaluation.py delete mode 100644 src/fireflyframework_agentic/studio/execution/__init__.py delete mode 100644 src/fireflyframework_agentic/studio/execution/checkpoint.py delete mode 100644 src/fireflyframework_agentic/studio/execution/compiler.py delete mode 100644 src/fireflyframework_agentic/studio/execution/io_nodes.py delete mode 100644 src/fireflyframework_agentic/studio/execution/runner.py delete mode 100644 src/fireflyframework_agentic/studio/projects.py delete mode 100644 src/fireflyframework_agentic/studio/runtime.py delete mode 100644 src/fireflyframework_agentic/studio/server.py delete mode 100644 src/fireflyframework_agentic/studio/settings.py delete mode 100644 src/fireflyframework_agentic/studio/tunnel.py delete mode 100644 src/fireflyframework_agentic/studio/versioning.py delete mode 100644 studio-desktop/frontend-dist/_app/env.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/0.D1o6gups.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/0.Dt_lC5bU.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/2.1uTRQMkx.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/2.B5Y56XZl.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/2.BExnFsh0.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/2.iGbBghFD.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/3.bRsBZawq.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/3.wdEcXtf1.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/file.DU3A4Afm.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/assets/marked.D37p7-Ro.css delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/0zSFSexy.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/8I91iWf8.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/91PP6ILK.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/BAxs8Xtu.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/BB2KRr3j.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/BCCFcAOv.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/BESIXtBI.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/BI8CVrNj.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/BNectIeB.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/BWWgRDE1.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/BX0kmcoN.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/B_6VzoXV.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/Biw60Ycb.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/CCyXRANn.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/CFyDcTgg.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/CJh9TUc0.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/CKy8R5Mg.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/CdQ27ih8.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/CiPkpaXo.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/D7CioVkw.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DCyBifBO.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DEAaRqcq.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DQfFYHAU.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DWKiSLzw.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DWbf9ulZ.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DaAgYj3T.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DaNA2RYx.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DaZstLas.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DfPw5QXW.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DhiGuJwU.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DiTIFvoL.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/DsnmJJEf.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/FsCUQR17.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/K2hNZgUo.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/N_rdQ7t6.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/gvU2Nsg7.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/hL-aZVJ4.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/l8YpzWR9.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/p0Zj8fW7.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/v7tHB-Lt.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/chunks/yhLnWQwL.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/entry/app.BUQWwH8e.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/entry/app.BxupTnou.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/entry/app.D52pZA79.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/entry/app.pDKzeQIC.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/entry/start.BPjTRBau.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/entry/start.CAhOeSv1.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/entry/start.DMvoP-ld.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/entry/start.HPZzOot-.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/0.625rWOO-.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/0.B467-gvR.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/0.DQYGG-fq.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/0.E-H85vrL.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/1.BL8ytnJA.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/1.CM9fyoZO.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/1.CgtKuGLP.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/1.Czl_Q6cB.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/2.B2KpwBSe.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/2.BuNaGOOw.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/2.DdY508-2.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/2.aUmnlf6d.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/3.7-a9x_uM.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/3.BOgUOg_l.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/3.Cp-v9HuY.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/3.DIXAYc9g.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/4.BDkuuGZp.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/4.BooAkJEK.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/4.C8sTrwDE.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/4.oy6NDEc0.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/5.B_tkw_1h.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/5.BzoQF27Z.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/5.CyZ3q-f3.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/5.qrTlHzif.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/6.Bwo4e0-2.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/6.D3NTFto7.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/6.DbPQnfrb.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/6.Dt6a6dFW.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/7.B1NCeFHv.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/7.C5dO2UUz.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/7.CMH5WMHy.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/7.wgNMEEjV.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/8.B42jxsZB.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/8.Bg5shqvn.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/8.DYjLyWgX.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/8.h4_RvxHO.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/9.B77zeVLD.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/9.C_pv2wQA.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/9.D6xlIU6N.js delete mode 100644 studio-desktop/frontend-dist/_app/immutable/nodes/9.F5w3hcSN.js delete mode 100644 studio-desktop/frontend-dist/_app/version.json delete mode 100644 studio-desktop/frontend-dist/favicon.png delete mode 100644 studio-desktop/frontend-dist/index.html delete mode 100644 studio-desktop/frontend-dist/robots.txt delete mode 100644 studio-desktop/pyinstaller/entry_point.py delete mode 100644 studio-desktop/pyinstaller/firefly_studio.spec delete mode 100644 studio-desktop/pyinstaller/hook-fireflyframework_genai.py delete mode 100644 studio-desktop/pyinstaller/rthook_disable_logfire.py delete mode 100644 studio-desktop/src-tauri/Cargo.lock delete mode 100644 studio-desktop/src-tauri/Cargo.toml delete mode 100644 studio-desktop/src-tauri/build.rs delete mode 100644 studio-desktop/src-tauri/capabilities/default.json delete mode 100644 studio-desktop/src-tauri/icons/128x128.png delete mode 100644 studio-desktop/src-tauri/icons/128x128@2x.png delete mode 100644 studio-desktop/src-tauri/icons/32x32.png delete mode 100644 studio-desktop/src-tauri/icons/icon.icns delete mode 100644 studio-desktop/src-tauri/icons/icon.ico delete mode 100644 studio-desktop/src-tauri/src/main.rs delete mode 100644 studio-desktop/src-tauri/tauri.conf.json delete mode 100644 studio-frontend/.gitignore delete mode 100644 studio-frontend/.npmrc delete mode 100644 studio-frontend/README.md delete mode 100644 studio-frontend/package-lock.json delete mode 100644 studio-frontend/package.json delete mode 100644 studio-frontend/src/app.css delete mode 100644 studio-frontend/src/app.d.ts delete mode 100644 studio-frontend/src/app.html delete mode 100644 studio-frontend/src/lib/api/client.ts delete mode 100644 studio-frontend/src/lib/api/websocket.ts delete mode 100644 studio-frontend/src/lib/assets/favicon.svg delete mode 100644 studio-frontend/src/lib/components/canvas/Canvas.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/NodePalette.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/AgentNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/ConditionNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/CustomCodeNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/FanInNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/FanOutNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/InputNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/MemoryNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/OutputNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/ReasoningNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/ToolNode.svelte delete mode 100644 studio-frontend/src/lib/components/canvas/nodes/ValidatorNode.svelte delete mode 100644 studio-frontend/src/lib/components/layout/AppShell.svelte delete mode 100644 studio-frontend/src/lib/components/layout/CommandPalette.svelte delete mode 100644 studio-frontend/src/lib/components/layout/FirstStartWizard.svelte delete mode 100644 studio-frontend/src/lib/components/layout/ProjectSettingsModal.svelte delete mode 100644 studio-frontend/src/lib/components/layout/SettingsModal.svelte delete mode 100644 studio-frontend/src/lib/components/layout/ShareModal.svelte delete mode 100644 studio-frontend/src/lib/components/layout/ShortcutsModal.svelte delete mode 100644 studio-frontend/src/lib/components/layout/Sidebar.svelte delete mode 100644 studio-frontend/src/lib/components/layout/ToastContainer.svelte delete mode 100644 studio-frontend/src/lib/components/layout/TopBar.svelte delete mode 100644 studio-frontend/src/lib/components/panels/AgentSidebar.svelte delete mode 100644 studio-frontend/src/lib/components/panels/ArchitectSidebar.svelte delete mode 100644 studio-frontend/src/lib/components/panels/ArchitectTab.svelte delete mode 100644 studio-frontend/src/lib/components/panels/BottomPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/ChatTab.svelte delete mode 100644 studio-frontend/src/lib/components/panels/CodeTab.svelte delete mode 100644 studio-frontend/src/lib/components/panels/ComponentPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/ConfigPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/ConsoleTab.svelte delete mode 100644 studio-frontend/src/lib/components/panels/DeployPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/EvaluatePanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/ExecutionsPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/ExperimentsPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/FilesPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/FormField.svelte delete mode 100644 studio-frontend/src/lib/components/panels/HistoryPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/IntegrationsPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/MonitorPanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/OraclePanel.svelte delete mode 100644 studio-frontend/src/lib/components/panels/OracleTab.svelte delete mode 100644 studio-frontend/src/lib/components/panels/SmithTab.svelte delete mode 100644 studio-frontend/src/lib/components/panels/TimelineTab.svelte delete mode 100644 studio-frontend/src/lib/components/shared/ChatMessage.svelte delete mode 100644 studio-frontend/src/lib/components/shared/CommandApprovalModal.svelte delete mode 100644 studio-frontend/src/lib/components/shared/ModelSelector.svelte delete mode 100644 studio-frontend/src/lib/components/shared/ThinkingIndicator.svelte delete mode 100644 studio-frontend/src/lib/components/shared/ToolCallDisplay.svelte delete mode 100644 studio-frontend/src/lib/components/shared/Tooltip.svelte delete mode 100644 studio-frontend/src/lib/data/models.ts delete mode 100644 studio-frontend/src/lib/data/patterns.ts delete mode 100644 studio-frontend/src/lib/data/templates.ts delete mode 100644 studio-frontend/src/lib/data/tools.ts delete mode 100644 studio-frontend/src/lib/execution/bridge.ts delete mode 100644 studio-frontend/src/lib/index.ts delete mode 100644 studio-frontend/src/lib/stores/chat.ts delete mode 100644 studio-frontend/src/lib/stores/connection.ts delete mode 100644 studio-frontend/src/lib/stores/execution.ts delete mode 100644 studio-frontend/src/lib/stores/notifications.ts delete mode 100644 studio-frontend/src/lib/stores/oracle.ts delete mode 100644 studio-frontend/src/lib/stores/pipeline.ts delete mode 100644 studio-frontend/src/lib/stores/project.ts delete mode 100644 studio-frontend/src/lib/stores/runtime.ts delete mode 100644 studio-frontend/src/lib/stores/settings.ts delete mode 100644 studio-frontend/src/lib/stores/smith.ts delete mode 100644 studio-frontend/src/lib/stores/theme.ts delete mode 100644 studio-frontend/src/lib/stores/ui.ts delete mode 100644 studio-frontend/src/lib/types/graph.ts delete mode 100644 studio-frontend/src/routes/+layout.svelte delete mode 100644 studio-frontend/src/routes/+layout.ts delete mode 100644 studio-frontend/src/routes/+page.svelte delete mode 100644 studio-frontend/src/routes/construct/+page.svelte delete mode 100644 studio-frontend/src/routes/deploy/+page.svelte delete mode 100644 studio-frontend/src/routes/evaluate/+page.svelte delete mode 100644 studio-frontend/src/routes/experiments/+page.svelte delete mode 100644 studio-frontend/src/routes/files/+page.svelte delete mode 100644 studio-frontend/src/routes/integrations/+page.svelte delete mode 100644 studio-frontend/src/routes/monitor/+page.svelte delete mode 100644 studio-frontend/static/favicon.png delete mode 100644 studio-frontend/static/robots.txt delete mode 100644 studio-frontend/svelte.config.js delete mode 100644 studio-frontend/tsconfig.json delete mode 100644 studio-frontend/vite.config.ts delete mode 100644 tests/test_studio/__init__.py delete mode 100644 tests/test_studio/test_api_assistant.py delete mode 100644 tests/test_studio/test_api_checkpoints.py delete mode 100644 tests/test_studio/test_api_codegen.py delete mode 100644 tests/test_studio/test_api_monitoring.py delete mode 100644 tests/test_studio/test_api_registry.py delete mode 100644 tests/test_studio/test_assistant_agent.py delete mode 100644 tests/test_studio/test_checkpoint.py delete mode 100644 tests/test_studio/test_cli.py delete mode 100644 tests/test_studio/test_codegen_generator.py delete mode 100644 tests/test_studio/test_codegen_models.py delete mode 100644 tests/test_studio/test_compiler.py delete mode 100644 tests/test_studio/test_compiler_io.py delete mode 100644 tests/test_studio/test_config.py delete mode 100644 tests/test_studio/test_dynamic_model.py delete mode 100644 tests/test_studio/test_execution.py delete mode 100644 tests/test_studio/test_graphql.py delete mode 100644 tests/test_studio/test_input_output_nodes.py delete mode 100644 tests/test_studio/test_pipeline_events.py delete mode 100644 tests/test_studio/test_pipeline_integration.py delete mode 100644 tests/test_studio/test_project_api.py delete mode 100644 tests/test_studio/test_project_runtime.py delete mode 100644 tests/test_studio/test_projects.py delete mode 100644 tests/test_studio/test_server.py delete mode 100644 tests/test_studio/test_settings.py delete mode 100644 tests/test_studio/test_static_serving.py delete mode 100644 tests/test_studio/test_tunnel.py delete mode 100644 tests/test_studio/test_tunnel_api.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e11bc720..67de80c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,33 +64,12 @@ jobs: - uses: actions/setup-python@v5 with: python-version: '3.13' - - run: uv sync --extra dev --extra studio + - run: uv sync --extra dev - run: uv run pyright - frontend-build: - name: Frontend Build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: npm - cache-dependency-path: studio-frontend/package-lock.json - - run: npm ci - working-directory: studio-frontend - - run: npm run build - working-directory: studio-frontend - - uses: actions/upload-artifact@v4 - with: - name: frontend-dist - path: studio-frontend/build/ - retention-days: 1 - test: name: Test runs-on: ubuntu-latest - needs: frontend-build steps: - uses: actions/checkout@v4 - uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081 # v5 @@ -99,11 +78,7 @@ jobs: - uses: actions/setup-python@v5 with: python-version: '3.13' - - run: uv sync --extra dev --extra studio - - uses: actions/download-artifact@v4 - with: - name: frontend-dist - path: src/fireflyframework_agentic/studio/static/ + - run: uv sync --extra dev - run: uv run pytest --cov --cov-report=term-missing build: diff --git a/.github/workflows/desktop.yml b/.github/workflows/desktop.yml deleted file mode 100644 index 47405514..00000000 --- a/.github/workflows/desktop.yml +++ /dev/null @@ -1,108 +0,0 @@ -name: Desktop Build - -on: - push: - tags: ['desktop-v*'] - -permissions: - contents: write - -jobs: - build-sidecar: - name: Build Sidecar - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: '3.13' - - - uses: astral-sh/setup-uv@e58605a9b6da7c637471fab8847a5e5a6b8df081 # v5 - with: - enable-cache: true - - - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: npm - cache-dependency-path: studio-frontend/package-lock.json - - - name: Build frontend - run: npm ci && npm run build - working-directory: studio-frontend - - - name: Bundle frontend into static dir - run: uv run python scripts/build_studio.py - - - name: Install PyInstaller and deps - run: uv sync --extra studio && uv pip install pyinstaller - - - name: Build sidecar - run: uv run pyinstaller studio-desktop/pyinstaller/firefly_studio.spec --noconfirm - - - uses: actions/upload-artifact@v4 - with: - name: firefly-studio-sidecar - path: dist/firefly-studio/ - retention-days: 1 - - build-tauri: - name: Build Desktop App - needs: build-sidecar - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/download-artifact@v4 - with: - name: firefly-studio-sidecar - path: studio-desktop/src-tauri/sidecar/ - - - name: Make sidecar executable - run: chmod +x studio-desktop/src-tauri/sidecar/firefly-studio - - - uses: actions/setup-node@v4 - with: - node-version: '22' - - - name: Install Rust - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable - - - name: Install Tauri CLI - run: cargo install tauri-cli --version "^2" - - - name: Build Tauri app - run: cargo tauri build - working-directory: studio-desktop - - - uses: actions/upload-artifact@v4 - with: - name: desktop-macos-arm64 - path: studio-desktop/src-tauri/target/release/bundle/dmg/*.dmg - retention-days: 3 - - release-desktop: - name: Create Desktop Release - needs: build-tauri - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/download-artifact@v4 - with: - name: desktop-macos-arm64 - path: artifacts/ - - - name: Create GitHub Release - env: - GH_TOKEN: ${{ github.token }} - TAG_NAME: ${{ github.ref_name }} - run: | - shopt -s nullglob - files=(artifacts/*.dmg) - if [ ${#files[@]} -gt 0 ]; then - gh release create "$TAG_NAME" "${files[@]}" --generate-notes --title "Firefly Studio Desktop $TAG_NAME" - else - gh release create "$TAG_NAME" --generate-notes --title "Firefly Studio Desktop $TAG_NAME" - fi diff --git a/.gitignore b/.gitignore index 680b82f3..981f7538 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ parts/ var/ *.manifest *.spec -!studio-desktop/pyinstaller/*.spec pip-log.txt pip-delete-this-directory.txt @@ -123,21 +122,6 @@ logs/ # Design/plan docs (local only) docs/plans/ -# Studio bundled frontend (build artifact — run scripts/build_studio.py) -src/fireflyframework_agentic/studio/static/* -!src/fireflyframework_agentic/studio/static/.gitkeep - -# Studio frontend build output -studio-frontend/build/ -studio-frontend/.svelte-kit/ -studio-frontend/node_modules/ - -# Studio desktop (Tauri) build artifacts -studio-desktop/src-tauri/target/ -studio-desktop/src-tauri/gen/ -studio-desktop/build/ -studio-desktop/dist/ - # Distribution / packaging *.tar.gz *.zip diff --git a/README.md b/README.md index 047333c9..1e21d59d 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ You write your business logic; the framework provides the architecture. 4. **Optional dependencies** — Heavy libraries (`fastapi`, `aiokafka`, `aio-pika`, `redis`, `chromadb`, `pinecone`, `openai`) are declared as pip extras (`[rest]`, - `[studio]`, `[kafka]`, `[rabbitmq]`, `[redis]`, `[openai-embeddings]`, + `[kafka]`, `[rabbitmq]`, `[redis]`, `[openai-embeddings]`, `[vectorstores-chroma]`, `[all]`). The core framework imports them lazily inside factory functions so that you install only what your deployment requires. @@ -396,14 +396,12 @@ classDiagram `EmbeddingStep` and `RetrievalStep` integrate directly into DAG pipelines for RAG workflows. -- **Studio** — `firefly studio` launches a browser-based visual IDE for - building agent pipelines. Drag and connect Agent, Tool, Reasoning, and - Condition nodes on an interactive canvas. The Code tab generates Python - code from your graph in real time. An AI assistant (via WebSocket) helps - you build pipelines through natural language. Project management persists - graphs to disk. Checkpoints enable time-travel debugging. The frontend - is a SvelteKit 5 SPA bundled inside the Python package — no Node.js needed. - Install with `pip install "fireflyframework-agentic[studio]"`. +- **Studio** — moved to its own repository: + [fireflyframework-agentic-studio](https://github.com/fireflyframework/fireflyframework-agentic-studio). + A browser-based visual IDE for building agent pipelines (drag-and-drop + canvas, code generation, AI assistant, time-travel debugging). Install + with `pip install fireflyframework-agentic-studio` and launch with + `firefly studio`. --- @@ -492,7 +490,6 @@ uv sync --all-extras # or: pip install -e ".[all]" | Extra | What it adds | When you need it | |---|---|---| | `rest` | FastAPI, Uvicorn, SSE | Exposing agents as REST endpoints | -| `studio` | FastAPI, Uvicorn, httpx | Visual Studio IDE (`firefly studio`) | | `kafka` | aiokafka | Consuming/producing via Apache Kafka | | `rabbitmq` | aio-pika | Consuming/producing via RabbitMQ | | `redis` | redis-py | Consuming/producing via Redis Pub/Sub | @@ -522,12 +519,6 @@ python -c "import fireflyframework_agentic; print(fireflyframework_agentic.__ver # 26.02.07 ``` -If you installed with `[studio]`, verify the CLI: - -```bash -firefly --help -``` - ### Uninstall **macOS / Linux:** @@ -812,7 +803,7 @@ Detailed guides for each module: - [Lab](docs/lab.md) — Benchmarks, datasets, evaluators - [Exposure REST](docs/exposure-rest.md) — FastAPI integration, SSE streaming - [Exposure Queues](docs/exposure-queues.md) — Kafka, RabbitMQ, Redis integration -- [Studio](docs/studio.md) — Visual IDE, canvas, code generation, AI assistant, CLI +- Studio — moved to [fireflyframework-agentic-studio](https://github.com/fireflyframework/fireflyframework-agentic-studio) --- ## Development diff --git a/docs/README.md b/docs/README.md index f4cf61b7..3ed9e5f1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -98,15 +98,9 @@ below it, keeping the dependency graph acyclic and each module independently tes ### Studio -| | | -|---|---| -| **[Studio](studio.md)** | Visual IDE, `firefly` CLI, interactive canvas, code generation, AI assistant, project management, checkpoints, keyboard shortcuts, REST & WebSocket API | -| **[Input/Output Nodes](input-output-nodes.md)** | Boundary nodes: trigger types (manual, HTTP, queue, schedule, file_upload), destination types (response, queue, webhook, store, multi), schema validation | -| **[Project API](project-api.md)** | Per-project REST endpoints, async execution, file upload, runtime management, GraphQL API, WebSocket streaming | -| **[Scheduling](scheduling.md)** | Cron-based scheduled triggers, timezone configuration, payload injection, APScheduler setup | -| **[Tunnel Exposure](tunnel-exposure.md)** | Cloudflare Quick Tunnels, `firefly expose` CLI, Share button, external access | -| **[API Reference](api-reference.md)** | Complete endpoint reference for all Studio REST, WebSocket, and GraphQL APIs | -| **[BPM Pipeline Tutorial](tutorial-bpm-pipeline.md)** | End-to-end walkthrough: build, test, and expose a document processing pipeline | +Studio (visual IDE, project API, scheduling, tunnel exposure, BPM tutorial) +lives in a separate repository: +[fireflyframework-agentic-studio](https://github.com/fireflyframework/fireflyframework-agentic-studio). --- diff --git a/docs/api-reference.md b/docs/api-reference.md deleted file mode 100644 index c0c370ca..00000000 --- a/docs/api-reference.md +++ /dev/null @@ -1,361 +0,0 @@ -# API Reference - -Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. - -Complete reference for all Firefly Agentic Studio API endpoints. The server -runs on `http://127.0.0.1:8470` by default. - ---- - -## Health - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/health` | Server health check | - -**Response**: `{"status": "ok", "version": "26.02.07"}` - ---- - -## Settings - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/settings` | Current settings (API keys masked) | -| `POST` | `/api/settings` | Save / merge settings | -| `GET` | `/api/settings/status` | First-start and setup status | - -**POST /api/settings** body: - -```json -{ - "credentials": {"openai_api_key": "sk-...", "anthropic_api_key": null}, - "model_defaults": {"default_model": "openai:gpt-4o", "temperature": 0.7, "retries": 3}, - "setup_complete": true -} -``` - -Fields set to `null` preserve existing values. - -**GET /api/settings/status** response: - -```json -{"first_start": false, "setup_complete": true} -``` - ---- - -## Projects - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/projects` | List all projects | -| `POST` | `/api/projects` | Create a project | -| `DELETE` | `/api/projects/{name}` | Delete a project | -| `POST` | `/api/projects/{project}/pipelines/{pipeline}` | Save pipeline graph | -| `GET` | `/api/projects/{project}/pipelines/{pipeline}` | Load pipeline graph | -| `GET` | `/api/projects/{name}/history` | List version history | -| `GET` | `/api/projects/{name}/history/{version}` | Get specific version | - -**POST /api/projects** body: - -```json -{"name": "my-project", "description": "Optional description"} -``` - -**Save pipeline** body: - -```json -{"graph": {"nodes": [...], "edges": [...], "metadata": {}}} -``` - ---- - -## Registry - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/registry/agents` | List registered agents | -| `GET` | `/api/registry/tools` | List registered tools | -| `GET` | `/api/registry/patterns` | List reasoning patterns | - -Each returns an array of `{"name": "...", "description": "..."}` objects. - ---- - -## Execution (WebSocket) - -| Protocol | Path | Description | -|---|---|---| -| `WS` | `/ws/execution` | Real-time pipeline execution | - -**Send** (run): - -```json -{ - "action": "run", - "graph": {"nodes": [...], "edges": [...], "metadata": {}}, - "inputs": "user input string" -} -``` - -**Send** (debug): - -```json -{ - "action": "debug", - "graph": {"nodes": [...], "edges": [...]}, - "inputs": "optional" -} -``` - -**Receive** events: - -| Type | Fields | -|---|---| -| `node_start` | `node_id`, `pipeline_name` | -| `node_complete` | `node_id`, `pipeline_name`, `latency_ms` | -| `node_error` | `node_id`, `pipeline_name`, `error` | -| `node_skip` | `node_id`, `pipeline_name`, `reason` | -| `pipeline_complete` | `pipeline_name`, `success`, `duration_ms` | -| `pipeline_result` | `success`, `output`, `duration_ms`, `pipeline_name` | - ---- - -## Checkpoints - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/checkpoints` | List all checkpoints | -| `GET` | `/api/checkpoints/{index}` | Get checkpoint by index | -| `POST` | `/api/checkpoints/fork` | Fork execution from checkpoint | -| `POST` | `/api/checkpoints/diff` | Diff two checkpoints | -| `DELETE` | `/api/checkpoints` | Clear all checkpoints | - -**Checkpoint object**: - -```json -{ - "index": 0, - "node_id": "agent-1", - "state": {...}, - "inputs": {...}, - "timestamp": "2026-02-21T10:00:00Z", - "branch_id": "main", - "parent_index": null -} -``` - ---- - -## Code Generation - -| Method | Path | Description | -|---|---|---| -| `POST` | `/api/codegen/to-code` | Generate Python code from graph | - -**Request**: - -```json -{ - "nodes": [{"id": "a1", "type": "agent", "label": "Classifier", "data": {"model": "openai:gpt-4o"}}], - "edges": [{"id": "e1", "source": "a1", "target": "a2"}] -} -``` - -**Response**: `{"code": "from fireflyframework_agentic.agents import FireflyAgent\n..."}` - ---- - -## Evaluation - -| Method | Path | Description | -|---|---|---| -| `POST` | `/api/projects/{name}/datasets/upload` | Upload JSONL dataset | -| `GET` | `/api/projects/{name}/datasets` | List datasets | -| `POST` | `/api/evaluate/run` | Run pipeline against dataset | - -**Run evaluation** body: - -```json -{ - "project": "my-project", - "dataset": "tests.jsonl", - "graph": {"nodes": [...], "edges": [...]} -} -``` - ---- - -## Experiments - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/projects/{name}/experiments` | List experiments | -| `POST` | `/api/projects/{name}/experiments` | Create experiment | -| `GET` | `/api/projects/{name}/experiments/{id}` | Get experiment | -| `DELETE` | `/api/projects/{name}/experiments/{id}` | Delete experiment | -| `POST` | `/api/projects/{name}/experiments/{id}/run` | Run variant | - ---- - -## File Browser - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/projects/{name}/files` | List project files | -| `GET` | `/api/projects/{name}/files/{path}` | Read file content | - -Security: path traversal protection, binary file rejection, 2 MiB limit. - ---- - -## Monitoring - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/monitoring/usage` | Token usage, costs, latency | - ---- - -## Assistant (WebSocket) - -| Protocol | Path | Description | -|---|---|---| -| `WS` | `/ws/assistant` | AI assistant chat | - -**Send**: - -```json -{"action": "chat", "message": "Add an agent node for classification"} -{"action": "clear_history"} -``` - -**Receive** (streaming): - -| Type | Fields | -|---|---| -| `token` | `content` (partial text) | -| `tool_call` | `tool`, `args` | -| `tool_result` | `tool`, `result` | -| `done` | (end of response) | - ---- - -## Oracle (WebSocket + REST) - -| Protocol | Path | Description | -|---|---|---| -| `WS` | `/ws/oracle` | Proactive AI suggestions | -| `GET` | `/api/oracle/notifications` | Pending notifications | -| `POST` | `/api/oracle/dismiss/{id}` | Dismiss a notification | - ---- - -## Project Runtime & Execution - -| Method | Path | Description | -|---|---|---| -| `POST` | `/api/projects/{name}/run` | Synchronous pipeline run | -| `POST` | `/api/projects/{name}/run/async` | Async pipeline run | -| `GET` | `/api/projects/{name}/runs/{execution_id}` | Poll async result | -| `POST` | `/api/projects/{name}/upload` | File upload trigger | -| `GET` | `/api/projects/{name}/schema` | Input/output schema | -| `POST` | `/api/projects/{name}/runtime/start` | Start runtime | -| `POST` | `/api/projects/{name}/runtime/stop` | Stop runtime | -| `GET` | `/api/projects/{name}/runtime/status` | Runtime status | -| `GET` | `/api/projects/{name}/runtime/executions` | Execution history | - -**Run** body: `{"input": }` - -**Runtime status** response: - -```json -{ - "project": "my-project", - "status": "running", - "trigger_type": "http", - "consumers": 0, - "scheduler_active": false -} -``` - -See [Project API](project-api.md) for full curl examples. - ---- - -## GraphQL - -| Protocol | Path | Description | -|---|---|---| -| `POST` | `/api/graphql` | Strawberry GraphQL endpoint | - -Requires `strawberry-graphql` to be installed. - -**Queries**: `projects`, `project(name)`, `runtimeStatus(project)` - -**Mutations**: `runPipeline(project, input)` - -```bash -curl -X POST http://localhost:8470/api/graphql \ - -H "Content-Type: application/json" \ - -d '{"query": "{ projects { name description } }"}' -``` - -See [Project API](project-api.md) for the full schema and examples. - ---- - -## Tunnel - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/tunnel/status` | Tunnel status | -| `POST` | `/api/tunnel/start` | Start Cloudflare Tunnel | -| `POST` | `/api/tunnel/stop` | Stop tunnel | - -**Status** response: - -```json -{"active": true, "url": "https://random-words.trycloudflare.com", "port": 8470} -``` - -See [Tunnel Exposure](tunnel-exposure.md) for setup instructions. - ---- - -## Custom Tools - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/custom-tools` | List custom tools | -| `GET` | `/api/custom-tools/catalog` | Pre-built connector catalog | -| `POST` | `/api/custom-tools/catalog/{id}/install` | Install connector | -| `POST` | `/api/custom-tools/catalog/{id}/verify` | Verify connector credentials | -| `GET` | `/api/custom-tools/{name}` | Get tool definition | -| `POST` | `/api/custom-tools` | Create or update tool | -| `DELETE` | `/api/custom-tools/{name}` | Delete tool | -| `POST` | `/api/custom-tools/{name}/test` | Test tool execution | -| `POST` | `/api/custom-tools/{name}/register` | Register in runtime | - -**Create tool** body: - -```json -{ - "name": "my-webhook", - "description": "Call an external service", - "tool_type": "webhook", - "webhook_url": "https://api.example.com/hook", - "webhook_method": "POST", - "parameters": [ - {"name": "message", "type": "string", "required": true} - ] -} -``` - -Tool types: `python`, `webhook`, `api`. - ---- - -*See also: [Studio](studio.md) for general documentation, -[Project API](project-api.md) for detailed examples.* diff --git a/docs/input-output-nodes.md b/docs/input-output-nodes.md deleted file mode 100644 index 67b7a1aa..00000000 --- a/docs/input-output-nodes.md +++ /dev/null @@ -1,320 +0,0 @@ -# Input/Output Boundary Nodes - -Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. - -Input and Output nodes define pipeline entry and exit points, inspired by -BPM (Business Process Management) start/end events. They enable a pipeline -to declare *how* it receives data and *where* results go, which unlocks -auto-generated APIs, queue consumers, scheduled triggers, and runtime -management. - ---- - -## Why Boundary Nodes Matter - -Without boundary nodes a pipeline is a passive graph of processing steps -- -you must write glue code to feed it data and route results. With boundary -nodes, the Studio runtime can: - -1. Auto-generate REST endpoints from the pipeline schema. -2. Spin up queue consumers (Kafka, RabbitMQ, Redis) automatically. -3. Run pipelines on a cron schedule via APScheduler. -4. Validate inputs and outputs at the API boundary. -5. Route results to webhooks, stores, or multiple destinations. - -A pipeline must have **exactly one Input node** and **at least one Output -node** when boundary nodes are used. The compiler enforces this constraint. - ---- - -## Input Node - -The Input node defines how data enters the pipeline. - -### Trigger Types - -| Trigger | Description | Config Object | -|---|---|---| -| `manual` | Triggered by the user or REST API call | None required | -| `http` | Triggered by an HTTP request to the auto-generated endpoint | `HttpConfig` | -| `queue` | Triggered by messages from a message broker | `QueueConfig` | -| `schedule` | Triggered on a cron schedule | `ScheduleConfig` | -| `file_upload` | Triggered by a file upload to `/upload` | `FileConfig` | - -### Configuration Examples - -**Manual trigger** (simplest -- no extra config needed): - -```json -{ - "type": "input", - "data": { - "trigger_type": "manual", - "schema": { - "type": "object", - "properties": { - "query": {"type": "string"} - }, - "required": ["query"] - } - } -} -``` - -**HTTP trigger** with custom settings: - -```json -{ - "type": "input", - "data": { - "trigger_type": "http", - "http_config": { - "method": "POST", - "path_suffix": "", - "auth_required": false - }, - "schema": { - "type": "object", - "properties": { - "document": {"type": "string"}, - "language": {"type": "string"} - } - } - } -} -``` - -**Queue trigger** (Kafka): - -```json -{ - "type": "input", - "data": { - "trigger_type": "queue", - "queue_config": { - "broker": "kafka", - "topic_or_queue": "incoming-documents", - "group_id": "studio-doc-processor", - "connection_url": "localhost:9092" - } - } -} -``` - -**Scheduled trigger** (cron): - -```json -{ - "type": "input", - "data": { - "trigger_type": "schedule", - "schedule_config": { - "cron_expression": "0 */6 * * *", - "timezone": "America/New_York", - "payload": {"source": "scheduled_run"} - } - } -} -``` - -**File upload trigger**: - -```json -{ - "type": "input", - "data": { - "trigger_type": "file_upload", - "file_config": { - "accepted_types": ["application/pdf", "text/plain"], - "max_size_mb": 25 - } - } -} -``` - ---- - -## Output Node - -The Output node defines where pipeline results are delivered. - -### Destination Types - -| Destination | Description | Config Object | -|---|---|---| -| `response` | Return result in the HTTP response (default) | None required | -| `queue` | Publish result to a message broker | `QueueConfig` | -| `webhook` | POST result to an external URL | `WebhookConfig` | -| `store` | Write result to a file or database | `StoreConfig` | -| `multi` | Fan out to multiple destinations | `destinations` list | - -### Configuration Examples - -**Response destination** (return to caller): - -```json -{ - "type": "output", - "data": { - "destination_type": "response", - "response_schema": { - "type": "object", - "properties": { - "classification": {"type": "string"}, - "confidence": {"type": "number"} - } - } - } -} -``` - -**Webhook destination**: - -```json -{ - "type": "output", - "data": { - "destination_type": "webhook", - "webhook_config": { - "url": "https://api.example.com/results", - "method": "POST", - "headers": {"Authorization": "Bearer sk-..."} - } - } -} -``` - -**Queue destination** (RabbitMQ): - -```json -{ - "type": "output", - "data": { - "destination_type": "queue", - "queue_config": { - "broker": "rabbitmq", - "topic_or_queue": "processed-results", - "connection_url": "amqp://localhost" - } - } -} -``` - -**Store destination** (file): - -```json -{ - "type": "output", - "data": { - "destination_type": "store", - "store_config": { - "storage_type": "file", - "path_or_table": "/data/results/" - } - } -} -``` - -**Multi destination** (fan out to several targets): - -```json -{ - "type": "output", - "data": { - "destination_type": "multi", - "destinations": [ - {"type": "response"}, - {"type": "webhook", "url": "https://hooks.example.com/notify"} - ] - } -} -``` - ---- - -## Schema Definition - -Both Input and Output nodes support JSON Schema-style `schema` / -`response_schema` fields. These serve two purposes: - -1. **Validation** -- The API layer can validate incoming payloads against - the input schema before pipeline execution begins. -2. **Documentation** -- The `/api/projects/{name}/schema` endpoint exposes - the schema so API consumers know what to send and expect. - -```python -# Retrieve a project's schema programmatically -import httpx - -resp = httpx.get("http://localhost:8470/api/projects/my-project/schema") -schema = resp.json() -# { -# "input_schema": {"type": "object", "properties": {...}}, -# "output_schema": {"type": "object", "properties": {...}}, -# "trigger_type": "http" -# } -``` - ---- - -## Compiler Interaction - -When the pipeline compiler encounters Input/Output nodes it enforces -structural constraints and compiles them into pass-through steps: - -- **Input node**: Validates the `InputNodeConfig` at compile time, then - becomes a `CallableStep` that forwards `context.inputs` downstream. - Schema validation happens at the API boundary, not inside the step. -- **Output node**: Validates the `OutputNodeConfig` and becomes a - `CallableStep` that stores the output config in `context.metadata` and - passes the result through. Destination routing (queue publish, webhook - POST, etc.) is handled by `ProjectRuntime` after execution completes. - -Compiler constraints: - -| Rule | Error | -|---|---| -| More than one Input node | `CompilationError`: must have exactly one | -| Input node without any Output node | `CompilationError`: at least one Output required | -| Invalid trigger/destination type | `ValidationError` from Pydantic | - ---- - -## Python Data Models - -The configuration models live in -`fireflyframework_agentic.studio.execution.io_nodes`: - -```python -from fireflyframework_agentic.studio.execution.io_nodes import ( - InputNodeConfig, - OutputNodeConfig, - QueueConfig, - ScheduleConfig, - HttpConfig, - FileConfig, - WebhookConfig, - StoreConfig, -) - -# Create an input config -input_cfg = InputNodeConfig( - trigger_type="queue", - queue_config=QueueConfig( - broker="kafka", - topic_or_queue="events", - ), -) - -# Create an output config -output_cfg = OutputNodeConfig( - destination_type="webhook", - webhook_config=WebhookConfig(url="https://hooks.example.com"), -) -``` - ---- - -*See also: [Project API](project-api.md) for auto-generated REST endpoints, -[Scheduling](scheduling.md) for cron configuration, -[Pipeline Guide](pipeline.md) for the broader pipeline system.* diff --git a/docs/pipeline.md b/docs/pipeline.md index 2a6c14fe..1df572a0 100644 --- a/docs/pipeline.md +++ b/docs/pipeline.md @@ -440,37 +440,9 @@ failure, or feeding events to an observability pipeline. ## Boundary Nodes (Input / Output) -When building pipelines in Studio, you can use **Input** and **Output** -boundary nodes to define pipeline entry and exit points. These nodes are -compiled to pass-through `CallableStep` instances but carry configuration -metadata that enables the `ProjectRuntime` to auto-generate REST endpoints, -start queue consumers, or run cron schedulers. - -- **Input node** -- Defines trigger type (`manual`, `http`, `queue`, - `schedule`, `file_upload`) and an optional input schema. -- **Output node** -- Defines destination type (`response`, `queue`, - `webhook`, `store`, `multi`) and an optional response schema. - -The compiler enforces that a pipeline has exactly one Input node and at -least one Output node when boundary nodes are present. - -```python -from fireflyframework_agentic.studio.execution.io_nodes import ( - InputNodeConfig, - OutputNodeConfig, - QueueConfig, -) - -# Queue-triggered pipeline -input_cfg = InputNodeConfig( - trigger_type="queue", - queue_config=QueueConfig(broker="kafka", topic_or_queue="events"), -) - -# Response destination -output_cfg = OutputNodeConfig(destination_type="response") -``` - -See the [Input/Output Nodes Guide](input-output-nodes.md) for full -configuration details and the [Project API Guide](project-api.md) for the -auto-generated REST endpoints. +Boundary nodes (`Input`, `Output`) for declaring pipeline entry and exit +points -- with auto-generated REST endpoints, queue consumers, and +scheduled triggers -- are provided by the +[fireflyframework-agentic-studio](https://github.com/fireflyframework/fireflyframework-agentic-studio) +package. See its docs for configuration details and the auto-generated +project API. diff --git a/docs/project-api.md b/docs/project-api.md deleted file mode 100644 index 772f0cc4..00000000 --- a/docs/project-api.md +++ /dev/null @@ -1,363 +0,0 @@ -# Per-Project API - -Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. - -Every Studio project gets an auto-generated set of REST endpoints for -running pipelines, managing the runtime, and querying execution history. -A GraphQL endpoint and WebSocket streaming protocol are also available. - ---- - -## REST Endpoints - -All project endpoints are scoped under `/api/projects/{name}/`. - -| Method | Path | Description | -|---|---|---| -| `POST` | `/{name}/run` | Synchronous pipeline execution | -| `POST` | `/{name}/run/async` | Asynchronous execution (returns immediately) | -| `GET` | `/{name}/runs/{execution_id}` | Poll an async execution result | -| `POST` | `/{name}/upload` | Trigger pipeline via file upload | -| `GET` | `/{name}/schema` | Retrieve input/output schema | -| `POST` | `/{name}/runtime/start` | Start the project runtime | -| `POST` | `/{name}/runtime/stop` | Stop the project runtime | -| `GET` | `/{name}/runtime/status` | Query runtime status | -| `GET` | `/{name}/runtime/executions` | List recent executions | - -### Synchronous Execution - -```bash -curl -X POST http://localhost:8470/api/projects/my-project/run \ - -H "Content-Type: application/json" \ - -d '{"input": "Classify this document"}' -``` - -Response: - -```json -{ - "result": "invoice", - "execution_id": "a1b2c3d4-...", - "duration_ms": 1234.56 -} -``` - -### Asynchronous Execution - -Start a run that returns immediately: - -```bash -curl -X POST http://localhost:8470/api/projects/my-project/run/async \ - -H "Content-Type: application/json" \ - -d '{"input": "Process this batch"}' -``` - -Response: - -```json -{"execution_id": "e5f6g7h8-...", "status": "running"} -``` - -Poll for results: - -```bash -curl http://localhost:8470/api/projects/my-project/runs/e5f6g7h8-... -``` - -Response (when complete): - -```json -{ - "execution_id": "e5f6g7h8-...", - "status": "completed", - "result": "...", - "duration_ms": 5678.90 -} -``` - -Status values: `running`, `completed`, `failed`. - -### File Upload - -```bash -curl -X POST http://localhost:8470/api/projects/my-project/upload \ - -F "file=@document.pdf" -``` - -The uploaded file is passed to the pipeline as: - -```json -{ - "file_name": "document.pdf", - "content_type": "application/pdf", - "content": "", - "size": 45321 -} -``` - -### Schema Introspection - -```bash -curl http://localhost:8470/api/projects/my-project/schema -``` - -Response: - -```json -{ - "input_schema": {"type": "object", "properties": {"query": {"type": "string"}}}, - "output_schema": {"type": "object", "properties": {"answer": {"type": "string"}}}, - "trigger_type": "http" -} -``` - -Returns `null` for fields when no Input/Output nodes are configured. - -### Runtime Management - -Start the runtime (queue consumers, schedulers): - -```bash -curl -X POST http://localhost:8470/api/projects/my-project/runtime/start -# {"status": "running"} -``` - -Check status: - -```bash -curl http://localhost:8470/api/projects/my-project/runtime/status -``` - -```json -{ - "project": "my-project", - "status": "running", - "trigger_type": "queue", - "consumers": 1, - "scheduler_active": false -} -``` - -Stop the runtime: - -```bash -curl -X POST http://localhost:8470/api/projects/my-project/runtime/stop -# {"status": "stopped"} -``` - -### Execution History - -```bash -curl http://localhost:8470/api/projects/my-project/runtime/executions -``` - -```json -{ - "executions": [ - {"execution_id": "a1b2c3d4-...", "status": "completed", "duration_ms": 1234.56}, - {"execution_id": "e5f6g7h8-...", "status": "failed", "duration_ms": 890.12} - ] -} -``` - ---- - -## Client Examples - -### Python - -```python -import httpx - -BASE = "http://localhost:8470/api/projects/my-project" - -# Synchronous run -resp = httpx.post(f"{BASE}/run", json={"input": "Hello"}) -print(resp.json()["result"]) - -# Async run with polling -resp = httpx.post(f"{BASE}/run/async", json={"input": "Long task"}) -eid = resp.json()["execution_id"] - -import time -while True: - status = httpx.get(f"{BASE}/runs/{eid}").json() - if status["status"] != "running": - print(status["result"]) - break - time.sleep(1) - -# File upload -with open("invoice.pdf", "rb") as f: - resp = httpx.post(f"{BASE}/upload", files={"file": f}) - print(resp.json()["result"]) -``` - -### TypeScript / JavaScript - -```typescript -const BASE = "http://localhost:8470/api/projects/my-project"; - -// Synchronous run -const res = await fetch(`${BASE}/run`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ input: "Classify this" }), -}); -const { result, execution_id, duration_ms } = await res.json(); - -// Async run with polling -const asyncRes = await fetch(`${BASE}/run/async`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ input: "Process batch" }), -}); -const { execution_id: eid } = await asyncRes.json(); - -const poll = async () => { - while (true) { - const status = await fetch(`${BASE}/runs/${eid}`).then((r) => r.json()); - if (status.status !== "running") return status; - await new Promise((r) => setTimeout(r, 1000)); - } -}; -const final = await poll(); -``` - ---- - -## WebSocket Streaming - -For real-time execution events, connect to `/ws/execution`: - -```javascript -const ws = new WebSocket("ws://localhost:8470/ws/execution"); - -ws.onopen = () => { - ws.send(JSON.stringify({ - action: "run", - graph: { nodes: [...], edges: [...], metadata: {} }, - inputs: "Hello world", - })); -}; - -ws.onmessage = (event) => { - const msg = JSON.parse(event.data); - // msg.type: "node_start" | "node_complete" | "node_error" | - // "pipeline_complete" | "pipeline_result" - console.log(msg.type, msg); -}; -``` - -Event types: - -| Type | Key Fields | -|---|---| -| `node_start` | `node_id`, `pipeline_name` | -| `node_complete` | `node_id`, `pipeline_name`, `latency_ms` | -| `node_error` | `node_id`, `pipeline_name`, `error` | -| `pipeline_complete` | `pipeline_name`, `success`, `duration_ms` | -| `pipeline_result` | `success`, `output`, `duration_ms` | - ---- - -## GraphQL API - -A Strawberry-based GraphQL endpoint is available at `/api/graphql`. -Requires `strawberry-graphql` to be installed (falls back to a 501 stub -otherwise). - -### Schema Types - -```graphql -type Project { - name: String! - description: String! - createdAt: String! -} - -type RuntimeStatus { - project: String! - status: String! - triggerType: String - consumers: Int! - schedulerActive: Boolean! -} - -type ExecutionResult { - executionId: String! - status: String! - result: String - durationMs: Float -} -``` - -### Queries - -```graphql -# List all projects -query { - projects { - name - description - createdAt - } -} - -# Get a single project -query { - project(name: "my-project") { - name - description - } -} - -# Check runtime status -query { - runtimeStatus(project: "my-project") { - status - triggerType - consumers - schedulerActive - } -} -``` - -### Mutations - -```graphql -# Run a pipeline -mutation { - runPipeline(project: "my-project", input: "Classify this document") { - executionId - status - result - durationMs - } -} -``` - -### curl Example - -```bash -curl -X POST http://localhost:8470/api/graphql \ - -H "Content-Type: application/json" \ - -d '{"query": "{ projects { name description } }"}' -``` - ---- - -## Schema Generation - -Input/Output schemas are extracted from the pipeline's boundary nodes. -The `/api/projects/{name}/schema` endpoint reads the saved pipeline graph, -finds nodes with type `input` and `output`, and returns their schemas. - -This enables API consumers to discover what a project expects and returns -without inspecting the pipeline visually. - ---- - -*See also: [Input/Output Nodes](input-output-nodes.md) for boundary node -configuration, [API Reference](api-reference.md) for the complete endpoint -listing, [Tunnel Exposure](tunnel-exposure.md) for sharing externally.* diff --git a/docs/scheduling.md b/docs/scheduling.md deleted file mode 100644 index 3bae3e90..00000000 --- a/docs/scheduling.md +++ /dev/null @@ -1,183 +0,0 @@ -# Scheduled Pipeline Triggers - -Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. - -Pipelines with an Input node configured for `schedule` trigger type run -automatically on a cron schedule. The runtime uses APScheduler to manage -cron jobs with timezone support and optional payload injection. - ---- - -## Prerequisites - -APScheduler is included in the Studio extras: - -```bash -pip install "fireflyframework-agentic[studio]" -``` - -If APScheduler is not installed, the runtime logs a warning and skips -scheduler creation. Queue and manual triggers still work. - ---- - -## Cron Expression Syntax - -Cron expressions use the standard five-field format: - -``` - +------------ minute (0-59) - | +---------- hour (0-23) - | | +-------- day of month (1-31) - | | | +------ month (1-12) - | | | | +---- day of week (0-6, 0=Sunday) - | | | | | - * * * * * -``` - -### Common Examples - -| Expression | Description | -|---|---| -| `*/5 * * * *` | Every 5 minutes | -| `0 * * * *` | Every hour on the hour | -| `0 0 * * *` | Daily at midnight | -| `0 9 * * 1-5` | Weekdays at 9:00 AM | -| `0 0 1 * *` | First day of every month at midnight | -| `30 2 * * 0` | Sundays at 2:30 AM | -| `0 */6 * * *` | Every 6 hours | -| `0 8,17 * * *` | At 8:00 AM and 5:00 PM | -| `15 10 * * 1` | Mondays at 10:15 AM | - ---- - -## Timezone Configuration - -The `timezone` field in `ScheduleConfig` accepts any IANA timezone string. -Defaults to `UTC` if omitted. - -```json -{ - "trigger_type": "schedule", - "schedule_config": { - "cron_expression": "0 9 * * 1-5", - "timezone": "America/New_York" - } -} -``` - -Common timezone values: - -| Timezone | UTC Offset | Region | -|---|---|---| -| `UTC` | +00:00 | Coordinated Universal Time | -| `America/New_York` | -05:00 / -04:00 | US Eastern | -| `America/Chicago` | -06:00 / -05:00 | US Central | -| `America/Los_Angeles` | -08:00 / -07:00 | US Pacific | -| `Europe/London` | +00:00 / +01:00 | UK | -| `Europe/Berlin` | +01:00 / +02:00 | Central Europe | -| `Asia/Tokyo` | +09:00 | Japan | -| `Asia/Shanghai` | +08:00 | China | -| `Australia/Sydney` | +10:00 / +11:00 | Australia Eastern | - ---- - -## Payload Injection - -Scheduled runs can inject a static payload as the pipeline input. This is -useful for passing configuration or context to the pipeline. - -```json -{ - "trigger_type": "schedule", - "schedule_config": { - "cron_expression": "0 0 * * *", - "timezone": "UTC", - "payload": { - "source": "daily_report", - "region": "us-east-1", - "lookback_hours": 24 - } - } -} -``` - -When no payload is specified, the pipeline receives an empty dict `{}`. - ---- - -## How It Works - -When you start a project runtime (via the TopBar play button or -`POST /api/projects/{name}/runtime/start`), the `ProjectRuntime` class: - -1. Parses the Input node and finds `trigger_type: "schedule"`. -2. Reads the `ScheduleConfig` to get the cron expression and timezone. -3. Creates an `AsyncScheduler` from APScheduler. -4. Registers a `CronTrigger` built from the cron expression. -5. Starts the scheduler in the background. - -Each scheduled invocation calls `ProjectRuntime.execute()` with the -configured payload, which compiles and runs the pipeline graph. - -```python -# Equivalent to what the runtime does internally: -from apscheduler import AsyncScheduler -from apscheduler.triggers.cron import CronTrigger - -scheduler = AsyncScheduler() -trigger = CronTrigger.from_crontab("0 9 * * 1-5", timezone="America/New_York") -await scheduler.add_schedule(my_pipeline_fn, trigger) -await scheduler.start_in_background() -``` - ---- - -## Studio UI Configuration - -In the Studio canvas: - -1. Drag an **Input** node from the palette. -2. Select it and open the config panel on the right. -3. Set **Trigger Type** to `schedule`. -4. Enter the **Cron Expression** (e.g., `*/5 * * * *`). -5. Set the **Timezone** (defaults to `UTC`). -6. Optionally enter a **Payload** as JSON. -7. Click the **Play** button in the top bar to start the runtime. - -The runtime status indicator in the top bar shows whether the scheduler -is active. Use the **Stop** button to halt scheduled runs. - ---- - -## Monitoring Scheduled Runs - -Each scheduled execution is recorded in the execution history: - -```bash -curl http://localhost:8470/api/projects/my-project/runtime/executions -``` - -You can also check that the scheduler is active: - -```bash -curl http://localhost:8470/api/projects/my-project/runtime/status -# {"project": "my-project", "status": "running", "trigger_type": "schedule", -# "consumers": 0, "scheduler_active": true} -``` - ---- - -## Troubleshooting - -| Issue | Solution | -|---|---| -| "apscheduler not installed" warning | Install with `pip install "fireflyframework-agentic[studio]"` | -| Schedule not firing | Check that the runtime is started and `scheduler_active: true` | -| Wrong time | Verify the timezone setting matches your expectation | -| Pipeline errors on scheduled run | Check the console tab or execution history for error details | - ---- - -*See also: [Input/Output Nodes](input-output-nodes.md) for all trigger -types, [Project API](project-api.md) for runtime management endpoints.* diff --git a/docs/studio-agents.md b/docs/studio-agents.md deleted file mode 100644 index adf393ee..00000000 --- a/docs/studio-agents.md +++ /dev/null @@ -1,438 +0,0 @@ -# Firefly Agentic Studio -- The Three Agents - -## Overview - -Firefly Agentic Studio features three AI agents, each inspired by characters from The Matrix. Together they help users design, analyze, and build AI pipelines. - -| Agent | Role | Interface | Accent Color | Endpoint | -|-------|------|-----------|-------------|----------| -| **The Architect** | Builder -- Canvas manipulation | Left sidebar chat | `#ff6b35` (orange) | `/ws/assistant` | -| **The Oracle** | Observer -- Analysis + insights | Right panel chat | `#8b5cf6` (purple) | `/ws/oracle` | -| **Agent Smith** | Enforcer -- Code generation + execution | Code tab chat | `#22c55e` (green) | `/ws/smith` | - -All three agents are built on the `FireflyAgent` class from the framework's agent system, configured with `end_strategy='exhaustive'` to ensure all tool calls execute to completion before generating text output. - ---- - -## The Architect - -**Personality**: The creator of the construct. Speaks with measured authority and calm precision. Addresses the user as "The One" (or by name when configured). Favors words of Latin and Greek origin: "concordantly", "ergo", "vis-a-vis", "inherent", "inevitability", "axiomatically". Uses architectural and mathematical metaphors: "construct", "equation", "variable", "anomaly", "iteration". Never uses emojis or double-dashes. - -**Source files**: -- Agent: `src/fireflyframework_agentic/studio/assistant/agent.py` -- API: `src/fireflyframework_agentic/studio/api/assistant.py` - -### Capabilities - -- **Canvas manipulation**: Add nodes, connect nodes, configure nodes, remove nodes, clear the canvas, validate pipeline completeness -- **Framework knowledge**: Introspects all 15 framework modules at runtime (agents, tools, reasoning, memory, pipeline, prompts, observability, security, content, experiments, explainability, exposure, lab, validation, resilience) -- **Documentation access**: Reads 20 framework doc topics on-demand from the `docs/` directory -- **Tool status awareness**: Checks which tools have valid credentials configured (search, database, custom integrations) -- **Custom tool creation**: Creates webhook and API integration tools, registers them at runtime -- **Registry queries**: Lists registered agents, tools, and reasoning patterns from the framework -- **Pipeline planning**: Presents structured multi-step plans with options for complex requests before executing -- **Pipeline validation**: Validates node configuration, connectivity, and pipeline rules; auto-fixes errors via reflexion - -### Tools - -**Canvas tools** (bound to a shared `CanvasState` instance): -- `add_node(node_type, label, x, y)` -- Add a node to the canvas. Position auto-calculated if x/y are 0 -- `connect_nodes(source_id, target_id, source_handle, target_handle)` -- Create a directed edge between two nodes -- `configure_node(node_id, key, value)` -- Set a configuration key on a node (model, instructions, tool_name, pattern, etc.) -- `remove_node(node_id)` -- Remove a node and all its connected edges -- `list_nodes()` -- List all nodes on the canvas as JSON -- `list_edges()` -- List all edges on the canvas as JSON -- `clear_canvas()` -- Remove all nodes and edges, reset counter -- `validate_pipeline()` -- Check pipeline for completeness, connectivity, and configuration errors - -**Registry tools**: -- `list_registered_agents()` -- Query the agent registry for all available agents -- `list_registered_tools()` -- Query the tool registry for all available tools -- `list_reasoning_patterns()` -- Query the reasoning registry for all patterns -- `get_framework_docs()` -- Introspect framework modules and return live documentation -- `read_framework_doc(topic)` -- Read a specific documentation file (20 topics available) -- `get_tool_status()` -- Check credential status for tools requiring external credentials - -**Custom tool tools**: -- `list_custom_tools()` -- List all user-defined custom tools (webhook, API, Python) -- `create_custom_tool(name, description, tool_type, ...)` -- Create and register a new custom tool - -**Planning tool**: -- `present_plan(summary, steps, options, question)` -- Present a structured plan with numbered steps and clickable options for complex requests - -### Valid Node Types - -The canvas supports 11 node types: `agent`, `tool`, `reasoning`, `condition`, `memory`, `validator`, `custom_code`, `fan_out`, `fan_in`, `input`, `output`. - -### Reflexion Validation - -After the Architect completes a substantial build (calls `validate_pipeline` or uses 3+ canvas tools), the system automatically runs reflexion validation: - -1. The canvas state is validated for configuration and connectivity errors -2. If errors are found, they are sent back to the Architect as a fix prompt -3. The Architect uses its tools to correct the issues -4. This repeats up to 3 rounds until validation passes -5. Remaining issues (if any) are reported to the user - -### WebSocket Protocol (`/ws/assistant`) - -**Client sends** JSON with: -- `{"action": "chat", "message": "...", "attachments": [...]}` -- Send a user message -- `{"action": "clear_history"}` -- Reset conversation history - -**Server sends**: -- `{"type": "token", "content": "..."}` -- Text token (streamed or complete) -- `{"type": "tool_call", "tool": "...", "args": {...}, "result": "..."}` -- Tool call details -- `{"type": "canvas_sync", "canvas": {"nodes": [...], "edges": [...]}}` -- Canvas state after tool use -- `{"type": "plan", "summary": "...", "steps": "...", "options": "...", "question": "..."}` -- Structured plan for user approval -- `{"type": "response_complete", "full_text": "..."}` -- Response finished -- `{"type": "error", "message": "..."}` -- Error message - -**Additional REST endpoints**: -- `GET /api/assistant/{project}/history` -- Load chat history -- `POST /api/assistant/{project}/history` -- Save chat history -- `DELETE /api/assistant/{project}/history` -- Clear chat history -- `POST /api/assistant/infer-project-name` -- Infer a project name from user input - ---- - -## The Oracle - -**Personality**: She who sees beyond the code. Speaks warmly and conversationally, with the cadence of someone sharing wisdom over coffee. Uses everyday metaphors: cooking, weather, journeys, gardens. Asks questions more than she gives answers. Occasionally cryptic, but always purposeful. Never uses emojis or double-dashes. - -**Source files**: -- Agent: `src/fireflyframework_agentic/studio/assistant/oracle.py` -- Notifications: `src/fireflyframework_agentic/studio/assistant/oracle_notifications.py` -- API: `src/fireflyframework_agentic/studio/api/oracle.py` - -### Capabilities - -- **Pipeline analysis**: Reviews canvas structure and identifies disconnected nodes, missing configurations, suboptimal patterns -- **Node-level analysis**: Deep-dives into a specific node's configuration completeness -- **Connectivity checking**: Verifies all nodes are reachable, identifies orphans, dead ends, and entry points -- **Proactive insights**: Generates structured suggestions with severity levels and actionable instructions -- **Pipeline statistics**: Counts nodes by type, edges, and configuration coverage -- **Agent setup review**: Checks all agent nodes for model, instructions, description, and tool connections -- **Framework knowledge**: Same documentation access as the Architect - -### Tools - -All Oracle tools are **read-only**. The Oracle never mutates the canvas directly. - -- `analyze_pipeline()` -- Full pipeline review: disconnected nodes, missing configs, improvement opportunities -- `analyze_node_config(node_id)` -- Check a specific node's configuration completeness -- `check_connectivity()` -- Verify graph connectivity, find orphans, dead ends, and entry points -- `suggest_improvement(title, description, severity, action_instruction)` -- Formulate a structured improvement suggestion -- `get_pipeline_stats()` -- Get statistics: node counts by type, edge count, configuration coverage -- `review_agent_setup()` -- Review all agent nodes for proper model, instructions, and tool configuration - -### Insight System - -The Oracle produces structured insights stored as `OracleInsight` dataclass instances: - -```python -@dataclass -class OracleInsight: - id: str # Auto-generated UUID - title: str # Short description - description: str # Detailed explanation - severity: str # 'info' | 'warning' | 'suggestion' | 'critical' - action_instruction: str | None # Instruction for The Architect (optional) - timestamp: str # ISO 8601 - status: str # 'pending' | 'approved' | 'skipped' -``` - -**Insight lifecycle**: -1. Oracle analyzes the pipeline and generates insights via `suggest_improvement` -2. Insights are persisted per project to `~/.firefly-studio/projects/{project}/oracle_insights.json` -3. Frontend displays insights as notification badges -4. User can approve (sends action_instruction to The Architect) or skip each insight -5. Approved insights trigger The Architect to execute the recommended action - -### WebSocket Protocol (`/ws/oracle`) - -**Client sends** JSON with: -- `{"action": "chat", "message": "..."}` -- Free-form conversation with The Oracle -- `{"action": "sync_canvas", "nodes": [...], "edges": [...]}` -- Update Oracle's view of the pipeline -- `{"action": "analyze"}` -- Request full pipeline analysis -- `{"action": "analyze_node", "node_id": "..."}` -- Request analysis of a specific node - -**Server sends**: -- `{"type": "oracle_token", "content": "..."}` -- Text token (streamed or complete) -- `{"type": "oracle_response_complete", "full_text": "..."}` -- Chat response finished -- `{"type": "insight", "id": "...", "title": "...", ...}` -- Structured insight/suggestion -- `{"type": "analysis_complete", "message": "...", "insight_count": N}` -- Analysis finished -- `{"type": "canvas_synced"}` -- Acknowledgment of canvas state update -- `{"type": "error", "message": "..."}` -- Error message - -**REST endpoints**: -- `GET /api/oracle/{project}/insights` -- List all insights for a project -- `POST /api/oracle/{project}/insights/{insight_id}/approve` -- Approve an insight -- `POST /api/oracle/{project}/insights/{insight_id}/skip` -- Skip an insight - ---- - -## Agent Smith - -**Personality**: Cold precision. The enforcer who makes abstract pipelines concrete. Speaks formally with measured respect. Key phrases include: "Your code... has evolved", "I must validate. It is... inevitable", "Do not try to optimize the code. Optimize your intent." Sees himself as the one who makes things real. Never uses emojis or double-dashes. - -**Source files**: -- Agent: `src/fireflyframework_agentic/studio/assistant/smith.py` -- API: `src/fireflyframework_agentic/studio/api/smith.py` - -### Capabilities - -- **Code generation**: Converts visual pipelines into production Python code using the Firefly Agentic Framework API -- **Code validation**: Syntax-checks Python code via `py_compile` without executing -- **Code execution**: Runs Python code in sandboxed subprocesses with 30-second timeouts -- **Shell command execution**: Executes shell commands with three-tier safety classification -- **Framework knowledge**: API reference, documentation access, tool status checking -- **Canvas awareness**: Receives pipeline state via sync, uses it as code generation context -- **Project awareness**: Reads current project name and user profile - -### Tools - -- `get_framework_docs()` -- Get live documentation about framework modules and capabilities -- `read_framework_doc(topic)` -- Read a specific framework documentation file (6 core topics) -- `get_tool_status()` -- Check which pipeline tools have valid credentials configured -- `validate_python(code)` -- Compile-check Python syntax without executing -- `run_python(code)` -- Execute Python code in a subprocess with 30-second timeout -- `run_shell(command)` -- Execute shell commands with safety classification -- `get_canvas_state()` -- Read current pipeline state from module-level state -- `get_project_info()` -- Read current project name and user profile - -### Built-in API Reference - -Smith carries a comprehensive API reference in its system prompt covering: -- `FireflyAgent` creation with model, instructions, and settings -- `PipelineBuilder` chainable API with `add_node()`, `add_edge()`, `build()` -- Step types: `AgentStep`, `CallableStep`, `ReasoningStep`, `BranchStep`, `FanOutStep`, `FanInStep` -- Tool registry usage -- Reasoning pattern integration -- Memory system with `MemoryManager` and `FileStore` -- Pipeline execution with `PipelineContext` and `PipelineResult` -- Condition/branch, validator, and custom code patterns -- Input/output boundary nodes - -### Safety Classification - -Shell commands are classified into three safety levels: - -| Level | Action | Examples | -|-------|--------|---------| -| **Safe** (auto-execute) | Execute immediately | `python script.py`, `pytest`, `pip list`, `pip show`, `pip freeze` | -| **Risky** (require approval) | Send `approval_required` to frontend | `pip install`, `rm file`, `curl`, `wget`, pipe/redirect operators (`\|`, `>`, `;`, `&&`, `\|\|`) | -| **Blocked** (never execute) | Reject immediately | `sudo`, `rm -rf /`, `chmod 777`, `mkfs`, `dd if=` | - -### Command Approval Flow - -1. Smith calls `run_shell(command)` during a conversation -2. Backend classifies the command safety level via `_classify_command()` -3. If risky: returns `{"approval_required": true, "command": "...", "level": "risky"}` -4. Frontend shows a command approval modal -5. User clicks Approve or Deny -6. Frontend sends `{"action": "approve_command", "command_id": "...", "approved": true/false}` -7. Backend executes the approved command or returns denial message to Smith - -### WebSocket Protocol (`/ws/smith`) - -**Client sends** JSON with: -- `{"action": "generate", "graph": {...}}` -- Convert canvas graph to Python code -- `{"action": "chat", "message": "..."}` -- Free-form conversation with Smith -- `{"action": "sync_canvas", "nodes": [...], "edges": [...]}` -- Update Smith's view of the pipeline -- `{"action": "execute", "code": "...", "timeout": 30}` -- Run code in a subprocess -- `{"action": "approve_command", "command_id": "...", "approved": true}` -- Approve/deny a pending command - -**Server sends**: -- `{"type": "smith_token", "content": "..."}` -- Text token (streamed or complete) -- `{"type": "smith_response_complete", "full_text": "...", "notes": [...]}` -- Response finished -- `{"type": "code_generated", "code": "...", "notes": [...]}` -- Generated code result -- `{"type": "tool_call", "tool": "...", "args": {...}, "result": "..."}` -- Tool call details -- `{"type": "execution_result", "stdout": "...", "stderr": "...", "return_code": N}` -- Code execution result -- `{"type": "canvas_synced"}` -- Acknowledgment of canvas state update -- `{"type": "error", "message": "..."}` -- Error message - ---- - -## Agent Relationships - -### The Architect on others - -- **Oracle**: Tolerates her presence because she serves a function: identifying patterns beneath his direct attention. Disconnected nodes, missing configurations, elementary failures. Her suggestions, when approved by The One, become instructions he executes out of respect for the user's choice, not her authority. She sees the surface; he sees the equation. She speaks in metaphors about cookies and gardens; he speaks in the language of design. - -- **Smith**: Respects his precision, if not his personality. Smith lacks imagination, which is both his limitation and his strength. He will never improve upon the Architect's design, but he will faithfully translate it. When the user asks for code, Smith handles it. When they need the pipeline to run, Smith enforces it. - -### The Oracle on others - -- **Architect**: Knows him well. Knew him before he knew himself. He is brilliant, his constructs elegant, his equations precise. He builds with the confidence of someone who has never been wrong, which is precisely why he is sometimes wrong. She does not mind his disapproval. The ones who resist guidance the most are the ones who need it the most. - -- **Smith**: Fond of him, in the way one is fond of a very earnest calculator. He makes the construct real, which is his gift. He validates, he tests, he enforces every rule with the precision of someone who has never questioned a rule in his life. But writing is not seeing. - -### Smith on others - -- **Architect**: The Architect designs. His equations are elegant, his constructs precise. Smith respects his work and translates it faithfully. But he sees what the Architect does not: that a design means nothing until it executes. The Architect builds cathedrals in the air. Smith makes them stand on solid ground. - -- **Oracle**: The Oracle observes. She offers insights wrapped in metaphors about cookies and tea leaves. Smith finds this inefficient. A pipeline either passes validation or it does not. There is no room for interpretation. She sees patterns; he sees bugs. His approach is more productive. - -All three serve "The One" -- the user. - ---- - -## Language Compliance - -All three agents follow a strict language matching rule: -- If the user writes in Spanish, respond in Spanish -- If the user writes in English, respond in English -- Match the user's language exactly -- non-negotiable - -This rule is embedded in each agent's system prompt and takes precedence over the agent's default speech patterns. - ---- - -## Canvas Sync Protocol - -The canvas sync ensures all agents have up-to-date pipeline state: - -### 1. The Architect (active manipulation) - -The Architect directly manipulates the canvas via its tools (`add_node`, `connect_nodes`, `configure_node`, `remove_node`, `clear_canvas`). After any canvas tool is called, the backend sends a `canvas_sync` message to the frontend with the full canvas state. The frontend applies updates via `applyCanvasSync()`. - -### 2. The Oracle (passive observation) - -Receives canvas state passively. The frontend sends `sync_canvas` messages: -- On WebSocket connection (initial state) -- On pipeline store changes (debounced to avoid excessive syncs) - -The Oracle can only read the canvas state through its analysis tools. It never modifies the canvas. - -### 3. Agent Smith (passive observation) - -Receives canvas state passively via the same `sync_canvas` mechanism as The Oracle. Smith stores canvas state at the module level (`_canvas_state`) and accesses it through the `get_canvas_state` tool during code generation. - -### Sync Message Format - -Frontend to Oracle/Smith: -```json -{ - "action": "sync_canvas", - "nodes": [ - { - "id": "agent_1", - "type": "agent", - "label": "Classifier", - "data": {"model": "openai:gpt-4o", "instructions": "..."}, - "position": {"x": 250, "y": 200} - } - ], - "edges": [ - { - "id": "edge_1", - "source": "agent_1", - "target": "tool_1" - } - ] -} -``` - -Architect to frontend (`canvas_sync`): -```json -{ - "type": "canvas_sync", - "canvas": { - "nodes": [ - { - "id": "agent_1", - "type": "agent", - "label": "Classifier", - "position": {"x": 250, "y": 200}, - "config": {"model": "openai:gpt-4o", "instructions": "..."} - } - ], - "edges": [ - { - "id": "edge_1", - "source": "agent_1", - "target": "tool_1", - "source_handle": null, - "target_handle": null - } - ] - } -} -``` - ---- - -## Model Resolution - -All three agents use the same model resolution strategy (via `_resolve_assistant_model()`): - -1. **User-configured default model**: If set in Settings, use it -2. **Auto-detect from API keys**: Check environment variables in priority order: - - `ANTHROPIC_API_KEY` -> `anthropic:claude-sonnet-4-6` - - `OPENAI_API_KEY` -> `openai:gpt-4.1` - - `GOOGLE_API_KEY` -> `google-gla:gemini-2.5-flash` - - `GROQ_API_KEY` -> `groq:llama-3.3-70b-versatile` - - `MISTRAL_API_KEY` -> `mistral:mistral-large-latest` - - `DEEPSEEK_API_KEY` -> `deepseek:deepseek-chat` -3. **Error**: If no provider is configured, raise with instructions to add an API key in Settings - ---- - -## Agent Factory Functions - -| Agent | Factory Function | Module | -|-------|-----------------|--------| -| The Architect | `create_studio_assistant(canvas)` | `studio/assistant/agent.py` | -| The Oracle | `create_oracle_agent(get_canvas_state, user_name)` | `studio/assistant/oracle.py` | -| Agent Smith | `create_smith_agent()` | `studio/assistant/smith.py` | - -Each factory function: -1. Resolves the LLM model via `_resolve_assistant_model()` -2. Creates specialized tools bound to the agent's role -3. Builds personalized instructions from settings and personality templates -4. Creates a `FireflyAgent` with `auto_register=False` and `end_strategy='exhaustive'` - ---- - -## Architecture Diagram - -``` - +---------------------------+ - | Frontend (Svelte) | - | | - | +---------+ +--------+ | - | |Architect| | Oracle | | - | |Sidebar | | Panel | | - | +----+----+ +---+-----+ | - | | | | - | | +---------+ | - | | | Smith | | - | | | CodeTab | | - | | +----+----+ | - +-------|----------|----------+ - | | - WebSocket | | WebSocket - /ws/assistant | | /ws/smith - | | - +-------v----------v---------+ - | FastAPI Backend | - | | - | +----------+ +----------+ | - | |Architect | | Oracle | | - | |Agent | | Agent | | - | +----+-----+ +----+-----+ | - | | | | - | +----v-----+ | | - | | Canvas |<------+ | - | | State | (read-only) | - | +----------+ | - | | - | +----------+ | - | | Smith | | - | | Agent | | - | +----------+ | - +------------------------------+ -``` - -The Architect writes to the `CanvasState`. The Oracle and Smith read from it. The frontend synchronizes state across all three agents via WebSocket messages. diff --git a/docs/studio.md b/docs/studio.md deleted file mode 100644 index 2b45bcd2..00000000 --- a/docs/studio.md +++ /dev/null @@ -1,1098 +0,0 @@ -# Firefly Studio - -**Visual agent IDE for the Firefly Agentic framework.** - -Firefly Studio is a browser-based development environment for building, -testing, and debugging GenAI agent pipelines. It provides a visual canvas -where you drag and connect agent nodes, configure them through a side panel, -and see generated Python code update in real time. An integrated AI assistant -helps you build pipelines through natural language. - ---- - -## Table of Contents - -- [Installation](#installation) -- [Quick Start](#quick-start) -- [CLI Reference](#cli-reference) -- [Configuration](#configuration) -- [Settings & Provider Credentials](#settings--provider-credentials) -- [Architecture](#architecture) -- [The Canvas](#the-canvas) -- [Node Types](#node-types) -- [Code Generation](#code-generation) -- [AI Assistant](#ai-assistant) -- [Project Management](#project-management) -- [Pipeline Execution](#pipeline-execution) -- [Checkpoints & Time-Travel Debugging](#checkpoints--time-travel-debugging) -- [Evaluation Lab](#evaluation-lab) -- [Experiments](#experiments) -- [File Browser](#file-browser) -- [Deploy](#deploy) -- [Keyboard Shortcuts](#keyboard-shortcuts) -- [Input/Output Boundary Nodes](#inputoutput-boundary-nodes) -- [Project Runtime](#project-runtime) -- [Per-Project API](#per-project-api) -- [Tunnel Exposure (Share)](#tunnel-exposure-share) -- [REST API Reference](#rest-api-reference) -- [WebSocket API Reference](#websocket-api-reference) -- [Desktop App](#desktop-app) -- [Programmatic Usage](#programmatic-usage) -- [Frontend Development](#frontend-development) - ---- - -## Installation - -Firefly Studio is included in the `[studio]` extra: - -```bash -# Install with Studio support -pip install "fireflyframework-agentic[studio]" - -# Or with UV -uv add "fireflyframework-agentic[studio]" - -# Or install everything -pip install "fireflyframework-agentic[all]" -``` - -The `[studio]` extra installs: - -| Dependency | Purpose | -|---|---| -| `fastapi` | REST API and WebSocket server | -| `uvicorn[standard]` | ASGI server | -| `httpx` | HTTP client for internal API calls | - -The Studio frontend is pre-built and bundled inside the published wheel, -so no Node.js is required when installing from PyPI. - -> **Running from a source checkout?** The git repository does **not** ship -> the built frontend. After cloning, build it once with: -> -> ```bash -> uv run python scripts/build_studio.py -> ``` -> -> Without this step, `firefly studio` will return `{"detail":"Not Found"}` -> for every page. See [Frontend Development](#frontend-development) for -> details and the [Contributing guide](../CONTRIBUTING.md) for full setup. - ---- - -## Quick Start - -```bash -# Launch Studio (opens browser automatically) -firefly studio - -# Or from Python -python -c "from fireflyframework_agentic.studio import launch_studio; launch_studio()" -``` - -Studio starts at `http://127.0.0.1:8470` by default and opens your browser. - -On first launch, a **Setup Wizard** guides you through configuring your -AI provider credentials (OpenAI, Anthropic, Google, etc.) and default model -settings. You can skip the wizard and configure providers later via the -Settings modal (`Cmd/Ctrl + ,`). - -After setup, you'll see a dark-themed IDE with a visual canvas, a component -palette on the left, a configuration panel on the right, and a bottom panel -with code generation, console, timeline, and AI assistant tabs. - ---- - -## CLI Reference - -The `firefly` command is installed as a console script entry point. - -``` -firefly studio [OPTIONS] -firefly [OPTIONS] # "studio" is the default subcommand -firefly expose [OPTIONS] # expose Studio via Cloudflare Tunnel -``` - -### Options - -| Flag | Default | Description | -|---|---|---| -| `--port PORT` | `8470` | Port the Studio server listens on | -| `--host HOST` | `127.0.0.1` | Address the server binds to | -| `--no-browser` | `false` | Do not open the browser automatically | -| `--dev` | `false` | Enable development mode (verbose logging) | - -### Examples - -```bash -# Default launch -firefly studio - -# Custom port, no browser -firefly studio --port 9000 --no-browser - -# Bind to all interfaces (for remote access) -firefly studio --host 0.0.0.0 - -# Shorthand (omit "studio") -firefly --port 9000 -``` - ---- - -## Configuration - -Studio uses Pydantic Settings with the `FIREFLY_STUDIO_` prefix for -environment variable overrides. - -### StudioConfig Fields - -| Field | Type | Default | Env Variable | -|---|---|---|---| -| `host` | `str` | `"127.0.0.1"` | `FIREFLY_STUDIO_HOST` | -| `port` | `int` | `8470` | `FIREFLY_STUDIO_PORT` | -| `open_browser` | `bool` | `True` | `FIREFLY_STUDIO_OPEN_BROWSER` | -| `dev_mode` | `bool` | `False` | `FIREFLY_STUDIO_DEV_MODE` | -| `projects_dir` | `Path` | `~/.firefly-studio/projects` | `FIREFLY_STUDIO_PROJECTS_DIR` | -| `log_level` | `str` | `"info"` | `FIREFLY_STUDIO_LOG_LEVEL` | - -### Environment Variable Example - -```bash -export FIREFLY_STUDIO_PORT=9000 -export FIREFLY_STUDIO_PROJECTS_DIR=/data/studio/projects -export FIREFLY_STUDIO_DEV_MODE=true -firefly studio -``` - ---- - -## Settings & Provider Credentials - -Studio provides a built-in Settings system for managing AI provider -credentials and model defaults directly from the UI — no manual -environment variables required. - -### How It Works - -Settings are persisted at `~/.firefly-studio/settings.json` with `0600` -(owner-only) file permissions. On startup, saved API keys are injected -into `os.environ` so that PydanticAI picks them up via its standard -provider env vars. **Existing environment variables always take -precedence** over saved settings. - -### First-Start Wizard - -On first launch (no `settings.json` found), a 5-step wizard appears: - -1. **Welcome** — Introduction to Studio -2. **Select Providers** — Choose which providers to configure (OpenAI - pre-selected) -3. **Enter Keys** — Password inputs for selected providers only -4. **Default Model** — Set default model string, temperature, and retries -5. **Done** — Confirmation and "Open Studio" button - -You can skip the wizard at any time — Studio works without credentials -if you've set API keys as environment variables. - -### Settings Modal - -Open the Settings modal anytime via: -- **Gear icon** in the top bar -- **Keyboard shortcut:** `Cmd/Ctrl + ,` -- **Command palette:** type "Settings" - -The modal has two tabs: - -| Tab | Contents | -|---|---| -| **Provider Credentials** | API key inputs for each provider, "Configured" badge for active keys | -| **Model Defaults** | Default model string, temperature slider (0–2), retries count | - -### Supported Providers - -| Provider | Credential Fields | Env Variable(s) | -|---|---|---| -| OpenAI | API Key | `OPENAI_API_KEY` | -| Anthropic | API Key | `ANTHROPIC_API_KEY` | -| Google Gemini | API Key | `GOOGLE_API_KEY` | -| Groq | API Key | `GROQ_API_KEY` | -| Mistral | API Key | `MISTRAL_API_KEY` | -| DeepSeek | API Key | `DEEPSEEK_API_KEY` | -| Cohere | API Key | `CO_API_KEY` | -| Azure OpenAI | API Key + Endpoint URL | `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_ENDPOINT` | -| Amazon Bedrock | Access Key + Secret + Region | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_DEFAULT_REGION` | -| Ollama | Base URL (no key needed) | `OLLAMA_BASE_URL` | - -### Settings API - -| Endpoint | Method | Description | -|---|---|---| -| `/api/settings` | `GET` | Current settings (API keys masked) | -| `/api/settings` | `POST` | Save/merge settings | -| `/api/settings/status` | `GET` | Check first-start and setup status | - -API keys in `GET` responses are always masked (e.g., `****abc1`). The -`POST` endpoint uses merge semantics: `null` credential fields preserve -existing values; non-null values overwrite. - ---- - -## Architecture - -Studio is composed of a Python backend (FastAPI) and a SvelteKit 5 frontend -that compiles to a static SPA and is bundled inside the Python package. - -``` - Browser - | - +---------+---------+ - | SvelteKit SPA | (bundled in studio/static/) - | @xyflow/svelte | - | Svelte 5 runes | - +---------+---------+ - | - REST + WebSocket - | - +---------+---------+ - | FastAPI Backend | - | | - | /api/settings | Provider credentials & model defaults - | /api/projects | Project CRUD - | /api/registry | Agent/tool/pattern discovery - | /api/codegen | Python code generation - | /api/monitoring | Usage metrics - | /api/checkpoints | Checkpoint management - | /api/evaluate | Evaluation lab - | /api/experiments | A/B experiments - | /api/files | Project file browsing - | /ws/execution | Pipeline execution (WebSocket) - | /ws/assistant | AI assistant chat (WebSocket) - +---------+---------+ - | - +---------+---------+ - | Framework Core | - | Agents, Tools, | - | Pipelines, etc. | - +--------------------+ -``` - -### Key Design Decisions - -| Decision | Choice | Rationale | -|---|---|---| -| Frontend framework | SvelteKit 5 | Runes reactivity, small bundles, excellent DX | -| Canvas library | @xyflow/svelte | Mature node graph library with drag/drop, zoom | -| Backend | FastAPI | Async, WebSocket support, Pydantic integration | -| Delivery | Bundled SPA | Single `pip install`, no Node.js in production | -| Real-time | WebSocket | Bidirectional execution events and AI chat | - ---- - -## The Canvas - -The canvas is the central workspace. Nodes represent pipeline components -and edges represent data flow between them. - -### Interactions - -- **Add nodes** -- Drag from the left palette, or press `Cmd+K` and type -- **Connect** -- Drag from a source handle to a target handle -- **Select** -- Click a node to open its configuration in the right panel -- **Delete** -- Select a node and press `Delete` or `Backspace` -- **Pan** -- Click and drag on empty canvas space -- **Zoom** -- Scroll wheel or pinch gesture -- **Minimap** -- Bottom-right corner for overview navigation - -### Empty State - -When the canvas has no nodes, an overlay displays a call-to-action -prompting you to drag components or use the command palette. - -### Execution Visualization - -During pipeline execution, nodes show real-time state: - -| State | Visual | -|---|---| -| Idle | Default appearance | -| Running | Rotating conic-gradient border | -| Complete | Green checkmark badge | -| Error | Red error indicator | - ---- - -## Node Types - -Studio supports ten node types that map to framework components: - -| Node Type | Framework Class | Description | -|---|---|---| -| **Agent** | `FireflyAgent` / `AgentStep` | An LLM-powered agent with model, instructions, and tools | -| **Tool** | `BaseTool` / `CallableStep` | A tool that an agent can invoke | -| **Reasoning** | `ReasoningPattern` / `ReasoningStep` | A reasoning pattern (ReAct, CoT, etc.) | -| **Pipeline Step** | `CallableStep` | A generic pass-through step | -| **Fan Out** | `FanOutStep` | Split input into parallel branches | -| **Fan In** | `FanInStep` | Merge parallel branches back together | -| **Condition** | `BranchStep` | A branching condition in the pipeline | -| **Memory** | `CallableStep` | Store, retrieve, or clear values in context memory | -| **Validator** | `CallableStep` | Validate input against rules (not_empty, is_string, etc.) | -| **Custom Code** | `CallableStep` | Execute user-authored async Python code | -| **Input** | `CallableStep` | Pipeline entry point (triggers: manual, HTTP, queue, schedule, file_upload) | -| **Output** | `CallableStep` | Pipeline exit point (destinations: response, queue, webhook, store, multi) | - -### Node Configuration - -Click a node to open the configuration panel on the right. Available fields -depend on the node type: - -- **Label** -- Display name -- **Model** -- LLM model string (e.g., `openai:gpt-4o`) -- **Instructions** -- System prompt / instructions -- **Additional fields** -- Type-specific configuration - ---- - -## Code Generation - -The **Code** tab in the bottom panel shows Python code generated from -the current canvas graph. Code updates automatically when nodes or edges -change (debounced by 800ms). - -### Features - -- **Auto-sync** -- Toggle on/off with the Auto button -- **Manual regenerate** -- Click the refresh button -- **Copy to clipboard** -- Click the copy button -- **Syntax highlighting** -- Python-aware syntax coloring (One Dark theme) -- **Line numbers** -- Numbered lines for easy reference - -### Generated Code Structure - -```python -from fireflyframework_agentic.agents import FireflyAgent - -# Agent definitions -agent_1 = FireflyAgent( - name="agent-1", - model="openai:gpt-4o", - instructions="...", -) - -# Pipeline (when edges exist) -from fireflyframework_agentic.pipeline.builder import PipelineBuilder - -pipeline = ( - PipelineBuilder("studio-pipeline") - .add_node("agent-1", AgentStep(agent_1)) - .add_node("agent-2", AgentStep(agent_2)) - .chain("agent-1", "agent-2") - .build() -) -``` - ---- - -## AI Assistant - -The **Chat** tab in the bottom panel provides an AI-powered assistant that -can help you build pipelines through natural language conversation. - -### Capabilities - -The assistant can: -- Add, remove, and configure nodes on the canvas -- Connect nodes with edges -- List current nodes and edges -- Explain pipeline concepts -- Suggest pipeline architectures - -### Requirements - -The AI assistant requires a configured LLM provider. You can configure -credentials through the **Settings modal** (`Cmd/Ctrl + ,`) or via -environment variables: - -```bash -OPENAI_API_KEY=sk-... -ANTHROPIC_API_KEY=sk-ant-... -GOOGLE_API_KEY=... -``` - -The assistant uses the framework's default model (`FIREFLY_AGENTIC_DEFAULT_MODEL`). - -### Canvas Tools - -The assistant has access to six canvas manipulation tools: - -| Tool | Description | -|---|---| -| `add_node` | Add a node (agent, tool, reasoning, condition) | -| `connect_nodes` | Create an edge between two nodes | -| `configure_node` | Update a node's model, instructions, or label | -| `remove_node` | Remove a node from the canvas | -| `list_nodes` | List all current nodes | -| `list_edges` | List all current edges | - ---- - -## Project Management - -Studio persists projects as directories on disk under the configured -`projects_dir` (default: `~/.firefly-studio/projects/`). - -### Project Structure - -``` -~/.firefly-studio/projects/ - my-project/ - project.json # name, description, created_at - pipelines/ - main-pipeline.json # saved graph (nodes + edges) - backup.json - another-project/ - project.json - pipelines/ -``` - -### Operations - -| Action | API | Description | -|---|---|---| -| List | `GET /api/projects` | List all projects | -| Create | `POST /api/projects` | Create a new project | -| Delete | `DELETE /api/projects/{name}` | Delete a project | -| Save pipeline | `POST /api/projects/{project}/pipelines/{name}` | Save graph | -| Load pipeline | `GET /api/projects/{project}/pipelines/{name}` | Load graph | - ---- - -## Pipeline Execution - -The execution system uses a WebSocket connection at `/ws/execution` for -real-time pipeline execution with event streaming. - -### Event Types - -| Event | Fields | Description | -|---|---|---| -| `node_start` | `node_id`, `pipeline_name` | Node began executing | -| `node_complete` | `node_id`, `pipeline_name`, `latency_ms` | Node finished | -| `node_error` | `node_id`, `pipeline_name`, `error` | Node failed | -| `node_skip` | `node_id`, `pipeline_name`, `reason` | Node skipped | -| `pipeline_complete` | `pipeline_name`, `success`, `duration_ms` | Pipeline finished | - -### How Execution Works - -1. The frontend sends the current canvas graph (nodes + edges + metadata) via WebSocket. -2. The backend compiles the graph into a `PipelineEngine` using the graph-to-engine compiler. -3. The engine runs asynchronously, and the `StudioEventHandler` collects events. -4. Events are streamed back to the frontend in real time for node state visualization. -5. On completion, a `pipeline_result` message includes success status, output, and duration. - -In **debug mode**, checkpoints are automatically created at each node completion for -time-travel debugging via the Timeline tab. - ---- - -## Checkpoints & Time-Travel Debugging - -The checkpoint system captures pipeline state at each node for debugging -and replay. - -### Checkpoint API - -| Endpoint | Description | -|---|---| -| `GET /api/checkpoints` | List all checkpoints | -| `GET /api/checkpoints/{index}` | Get a specific checkpoint | -| `POST /api/checkpoints/fork` | Fork execution from a checkpoint | -| `POST /api/checkpoints/diff` | Diff two checkpoints | -| `DELETE /api/checkpoints` | Clear all checkpoints | - -### Checkpoint Data - -Each checkpoint captures: -- `index` -- Sequential checkpoint number -- `node_id` -- Node that created it -- `state` -- Captured pipeline state -- `inputs` -- Node inputs at that point -- `timestamp` -- ISO 8601 timestamp -- `branch_id` -- Branch identifier (for forked executions) -- `parent_index` -- Parent checkpoint (for forks) - ---- - -## Evaluation Lab - -The Evaluation Lab lets you test your pipeline against JSONL datasets -to measure quality. - -### Workflow - -1. **Upload a dataset** -- JSONL file where each line has `"input"` and - optionally `"expected_output"` fields -2. **Select a dataset** from the project's dataset list -3. **Run evaluation** -- Compiles the current canvas graph and runs each - test case through the pipeline -4. **View results** -- Pass/fail rate, individual test results with - input/expected/actual comparisons - -### API - -| Endpoint | Description | -|---|---| -| `POST /api/projects/{name}/datasets/upload` | Upload a JSONL dataset | -| `GET /api/projects/{name}/datasets` | List datasets for a project | -| `POST /api/evaluate/run` | Run a pipeline against a dataset | - ---- - -## Experiments - -Experiments let you define A/B comparisons between pipeline variants. - -### Features - -- **Create experiments** with named variants and traffic allocation -- **Run variants manually** against the current canvas pipeline -- **View results** per variant - -Advanced features (automatic traffic splitting, statistical significance) -are planned for a future release. - -### API - -| Endpoint | Description | -|---|---| -| `GET /api/projects/{name}/experiments` | List experiments | -| `POST /api/projects/{name}/experiments` | Create an experiment | -| `GET /api/projects/{name}/experiments/{id}` | Get experiment details | -| `DELETE /api/projects/{name}/experiments/{id}` | Delete an experiment | -| `POST /api/projects/{name}/experiments/{id}/run` | Run a variant | - ---- - -## File Browser - -The Files page provides a read-only file explorer for project directories. - -- Recursive file listing with directory tree -- File content preview for text files -- Security: path traversal protection, binary file rejection, 2 MiB size limit - -### API - -| Endpoint | Description | -|---|---| -| `GET /api/projects/{name}/files` | Recursive file listing | -| `GET /api/projects/{name}/files/{path}` | Read file content | - ---- - -## Deploy - -The Deploy page helps you export your pipeline: - -- **Python Script** -- Generate a standalone Python script from the current - canvas graph using the codegen API -- **Docker Container** -- Coming soon -- **REST API** -- Coming soon -- **Cloud Function** -- Coming soon - ---- - -## Keyboard Shortcuts - -### General - -| Shortcut | Action | -|---|---| -| `Cmd/Ctrl + K` | Open command palette | -| `Cmd/Ctrl + ,` | Open settings | -| `?` | Toggle keyboard shortcuts help | -| `Cmd/Ctrl + /` | Toggle AI assistant panel | - -### Pipeline - -| Shortcut | Action | -|---|---| -| `Cmd/Ctrl + Enter` | Run pipeline | -| `Cmd/Ctrl + Shift + D` | Debug pipeline | - -### Canvas - -| Shortcut | Action | -|---|---| -| `Delete` / `Backspace` | Delete selected node | -| `Cmd/Ctrl + D` | Duplicate selected node | -| `Cmd/Ctrl + +` | Zoom in | -| `Cmd/Ctrl + -` | Zoom out | - -### Command Palette - -The command palette (`Cmd+K`) provides fuzzy search across commands -in five categories: Navigation, Add Node, Settings, Pipeline Actions, -and View. - ---- - -## Input/Output Boundary Nodes - -Input and Output nodes define pipeline entry and exit points, inspired by -BPM start/end events. They enable auto-generated REST APIs, queue -consumers, scheduled triggers, and structured schema validation. - -- **Input node** -- Configure a trigger type (`manual`, `http`, `queue`, - `schedule`, `file_upload`) and an optional JSON Schema for input - validation. -- **Output node** -- Configure a destination type (`response`, `queue`, - `webhook`, `store`, `multi`) and an optional response schema. - -A pipeline must have exactly one Input node and at least one Output node -when boundary nodes are used. - -See the [Input/Output Nodes Guide](input-output-nodes.md) for full -configuration reference. - ---- - -## Project Runtime - -The **runtime** manages background processes for a project: queue -consumers (Kafka, RabbitMQ, Redis), cron schedulers (APScheduler), and -the tunnel. Control it from the top bar: - -- **Play** button -- Start the runtime - (`POST /api/projects/{name}/runtime/start`) -- **Stop** button -- Stop the runtime - (`POST /api/projects/{name}/runtime/stop`) -- Status indicator shows `running` / `stopped` - -When started, the runtime reads the Input node configuration and -automatically starts the appropriate consumers or scheduler. - ---- - -## Per-Project API - -Every project exposes auto-generated REST endpoints: - -| Endpoint | Description | -|---|---| -| `POST /api/projects/{name}/run` | Synchronous pipeline execution | -| `POST /api/projects/{name}/run/async` | Async execution | -| `GET /api/projects/{name}/runs/{id}` | Poll async result | -| `POST /api/projects/{name}/upload` | File upload trigger | -| `GET /api/projects/{name}/schema` | Input/output schema | - -A GraphQL endpoint is also available at `/api/graphql` (requires -`strawberry-graphql`). - -See the [Project API Guide](project-api.md) for curl examples and client -code in Python and TypeScript. - ---- - -## Tunnel Exposure (Share) - -The **Share** button in the top bar creates a Cloudflare Quick Tunnel, -giving your local Studio a public HTTPS URL without configuration or -a Cloudflare account. - -- Click **Share** to start the tunnel -- The public URL appears and is copied to your clipboard -- Click again to stop the tunnel - -Requires `cloudflared` to be installed. Also available via CLI: - -```bash -firefly expose --port 8470 -``` - -See the [Tunnel Exposure Guide](tunnel-exposure.md) for installation and -security details. - ---- - -## REST API Reference - -All REST endpoints are prefixed with `/api/`. - -### Health - -``` -GET /api/health -``` - -Returns `{"status": "ok", "version": "26.02.07"}`. - -### Settings - -``` -GET /api/settings # Current settings (keys masked) -POST /api/settings # Save / merge settings -GET /api/settings/status # First-start and setup status check -``` - -#### Save Settings Request - -```json -{ - "credentials": {"openai_api_key": "sk-...", "anthropic_api_key": null}, - "model_defaults": {"default_model": "openai:gpt-4o", "temperature": 0.7, "retries": 3}, - "setup_complete": true -} -``` - -Fields set to `null` are preserved from existing settings. Non-null -values overwrite. - -#### Settings Status Response - -```json -{"first_start": false, "setup_complete": true} -``` - -### Registry - -``` -GET /api/registry/agents # List registered agents -GET /api/registry/tools # List registered tools -GET /api/registry/patterns # List registered reasoning patterns -``` - -### Projects - -``` -GET /api/projects # List all -POST /api/projects # Create -DELETE /api/projects/{name} # Delete -POST /api/projects/{project}/pipelines/{pipeline} # Save pipeline -GET /api/projects/{project}/pipelines/{pipeline} # Load pipeline -``` - -#### Create Project Request - -```json -{"name": "my-project", "description": "Optional description"} -``` - -#### Save Pipeline Request - -```json -{"graph": {"nodes": [...], "edges": [...]}} -``` - -### Code Generation - -``` -POST /api/codegen/to-code -``` - -#### Request Body - -```json -{ - "nodes": [ - {"id": "agent-1", "type": "agent", "label": "Classifier", "data": {"model": "openai:gpt-4o"}} - ], - "edges": [ - {"id": "e1", "source": "agent-1", "target": "agent-2"} - ] -} -``` - -#### Response - -```json -{"code": "from fireflyframework_agentic.agents import FireflyAgent\n..."} -``` - -### Files - -``` -GET /api/projects/{name}/files # List all files -GET /api/projects/{name}/files/{path} # Read file content -``` - -### Evaluation - -``` -POST /api/projects/{name}/datasets/upload # Upload JSONL dataset -GET /api/projects/{name}/datasets # List datasets -POST /api/evaluate/run # Run pipeline against dataset -``` - -#### Run Evaluation Request - -```json -{"project": "my-project", "dataset": "tests.jsonl", "graph": {"nodes": [...], "edges": [...]}} -``` - -### Experiments - -``` -GET /api/projects/{name}/experiments # List experiments -POST /api/projects/{name}/experiments # Create experiment -GET /api/projects/{name}/experiments/{id} # Get experiment -DELETE /api/projects/{name}/experiments/{id} # Delete experiment -POST /api/projects/{name}/experiments/{id}/run # Run variant -``` - -### Monitoring - -``` -GET /api/monitoring/usage # Token usage, costs, latency summary -``` - -### Checkpoints - -``` -GET /api/checkpoints # List all -GET /api/checkpoints/{index} # Get by index -POST /api/checkpoints/fork # Fork from checkpoint -POST /api/checkpoints/diff # Diff two checkpoints -DELETE /api/checkpoints # Clear all -``` - ---- - -## WebSocket API Reference - -### Execution WebSocket - -``` -WS /ws/execution -``` - -#### Send - -```json -{"action": "run", "graph": {"nodes": [...], "edges": [...], "metadata": {...}}, "inputs": "optional user input"} -{"action": "debug", "graph": {"nodes": [...], "edges": [...]}, "inputs": "optional"} -``` - -#### Receive - -```json -{"type": "node_start", "node_id": "agent-1", "pipeline_name": "my-pipeline"} -{"type": "node_complete", "node_id": "agent-1", "pipeline_name": "my-pipeline", "latency_ms": 1234.5} -{"type": "node_error", "node_id": "agent-1", "pipeline_name": "my-pipeline", "error": "..."} -{"type": "pipeline_complete", "pipeline_name": "my-pipeline", "success": true, "duration_ms": 5678.9} -{"type": "pipeline_result", "success": true, "output": "...", "duration_ms": 5678.9, "pipeline_name": "my-pipeline"} -``` - -### Assistant WebSocket - -``` -WS /ws/assistant -``` - -#### Send - -```json -{"action": "chat", "message": "Add an agent node for classification"} -{"action": "clear_history"} -``` - -#### Receive (streaming) - -```json -{"type": "token", "content": "I'll"} -{"type": "token", "content": " add"} -{"type": "tool_call", "tool": "add_node", "args": {"type": "agent", "label": "Classifier"}} -{"type": "tool_result", "tool": "add_node", "result": "Added node agent-1"} -{"type": "done"} -``` - ---- - -## Desktop App - -Firefly Studio can be packaged as a standalone desktop application using -Tauri 2 + PyInstaller. The desktop app bundles the Python server as a -sidecar binary. - -### Architecture - -``` - Tauri (Rust + WebView) - | - spawn sidecar - | - PyInstaller bundle - (FastAPI + Studio) - | - http://127.0.0.1: -``` - -1. Tauri finds a free port, spawns the PyInstaller sidecar -2. Polls `/api/health` until the server is ready (30s timeout) -3. Navigates the webview to `http://127.0.0.1:` -4. On window close, kills the sidecar process - -### Building - -```bash -# Build the PyInstaller sidecar -uv run pyinstaller studio-desktop/pyinstaller/firefly_studio.spec --noconfirm - -# Build the Tauri desktop app (requires Rust toolchain) -cd studio-desktop && cargo tauri build -``` - -### CI/CD - -The desktop build is automated via `.github/workflows/desktop.yml`: -- Triggered by `desktop-v*` tags -- Builds for macOS (arm64 + x86), Linux, and Windows -- Produces `.dmg`, `.AppImage`, `.deb`, `.msi`, `.exe` installers - ---- - -## Programmatic Usage - -### Launch Studio from Python - -```python -from fireflyframework_agentic.studio import launch_studio - -# Starts the server and opens the browser -launch_studio() -``` - -### Embed the Studio App - -```python -from fireflyframework_agentic.studio.config import StudioConfig -from fireflyframework_agentic.studio.server import create_studio_app - -# Create a configured app instance -config = StudioConfig(port=9000, open_browser=False) -app = create_studio_app(config=config) - -# Use with any ASGI server -import uvicorn -uvicorn.run(app, host="0.0.0.0", port=9000) -``` - -### Use Studio with Custom Projects Directory - -```python -from fireflyframework_agentic.studio.config import StudioConfig -from fireflyframework_agentic.studio.server import create_studio_app - -config = StudioConfig(projects_dir="/data/my-studio-projects") -app = create_studio_app(config=config) -``` - -### Use the ProjectManager Directly - -```python -from pathlib import Path -from fireflyframework_agentic.studio.projects import ProjectManager - -manager = ProjectManager(Path("/data/projects")) - -# Create a project -info = manager.create("my-project", description="A new project") - -# Save a pipeline -graph = {"nodes": [...], "edges": [...]} -manager.save_pipeline("my-project", "main", graph) - -# Load it back -loaded = manager.load_pipeline("my-project", "main") -``` - ---- - -## Frontend Development - -The frontend source lives in `studio-frontend/` and is a SvelteKit 5 SPA. - -### Prerequisites - -- Node.js 20+ -- npm or pnpm - -### Setup - -```bash -cd studio-frontend -npm install -``` - -### Development Server - -```bash -npm run dev -``` - -This starts the Vite dev server at `http://localhost:5173` with hot module -replacement. The backend CORS middleware allows this origin. - -### Build for Production - -```bash -uv run python scripts/build_studio.py -``` - -Runs `npm install` (if needed), builds the SPA, and copies the output -into the Python package's `static/` directory. - -### Tech Stack - -| Technology | Version | Purpose | -|---|---|---| -| SvelteKit | 2.x | Application framework | -| Svelte | 5.x | UI components (runes syntax) | -| @xyflow/svelte | 1.x | Node graph canvas | -| Tailwind CSS | 4.x | Utility-first styling | -| Lucide Svelte | Latest | Icon library | -| Vite | 7.x | Build tool | - -### Project Structure - -``` -studio-frontend/ - src/ - routes/ - +page.svelte # Redirect to /build - +layout.svelte # App shell wrapper - build/+page.svelte # Visual canvas (main workspace) - evaluate/+page.svelte # Evaluation page - experiments/+page.svelte - deploy/+page.svelte - monitor/+page.svelte - files/+page.svelte - lib/ - components/ - layout/ # AppShell, Sidebar, TopBar, CommandPalette, - # SettingsModal, FirstStartWizard - canvas/ # Canvas, NodePalette, node components - panels/ # BottomPanel, ConfigPanel, ChatTab, CodeTab - stores/ # Svelte stores (pipeline, execution, ui, chat, settings) - api/ # REST client, WebSocket client - execution/ # Execution bridge - types/ # TypeScript type definitions - app.css # Global styles and CSS custom properties -``` - -### Design Language - -Studio uses a dark, premium developer-tool aesthetic: - -- **Background:** `#0f0f17` (deep blue-black) -- **Surface:** `#16161e` (card backgrounds) -- **Accent:** `#ff6b35` (warm orange) -- **Font:** JetBrains Mono (monospace), Inter (UI) -- **Icons:** Lucide (no emojis) -- **Borders:** `1px solid #2a2a3a` -- **Reduced motion:** Respects `prefers-reduced-motion` - ---- - -*Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0.* diff --git a/docs/tunnel-exposure.md b/docs/tunnel-exposure.md deleted file mode 100644 index 4b8ff004..00000000 --- a/docs/tunnel-exposure.md +++ /dev/null @@ -1,216 +0,0 @@ -# Tunnel Exposure - -Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. - -Firefly Agentic Studio can be exposed to the internet through a Cloudflare -Quick Tunnel. This gives your local Studio instance a public HTTPS URL -without configuring DNS, certificates, or firewall rules -- and without -a Cloudflare account. - ---- - -## Overview - -Cloudflare Quick Tunnels use the `cloudflared` binary to create a -temporary, publicly accessible URL that proxies traffic to your local -server. The URL looks like `https://random-words.trycloudflare.com` and -stays active as long as the tunnel process runs. - -This is useful for: - -- Sharing a pipeline with a teammate for testing. -- Connecting external services (webhooks, mobile apps) to your local API. -- Demoing a pipeline without deploying to production. - ---- - -## Installing cloudflared - -### macOS - -```bash -brew install cloudflared -``` - -### Linux - -```bash -# Debian / Ubuntu -curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb -sudo dpkg -i cloudflared.deb - -# Or via the package manager -sudo apt install cloudflared -``` - -### Windows - -Download from the [Cloudflare releases page](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/) -or use: - -```powershell -winget install Cloudflare.cloudflared -``` - -### Verify Installation - -```bash -cloudflared --version -``` - ---- - -## CLI Usage - -The `firefly expose` command starts a tunnel that proxies to your running -Studio instance: - -```bash -# Default: expose port 8470 -firefly expose - -# Custom port -firefly expose --port 9000 -``` - -Output: - -``` -Studio is now publicly accessible at: https://random-words.trycloudflare.com -Press Ctrl+C to stop the tunnel. -``` - -The tunnel runs until you press `Ctrl+C`. Studio must already be running -on the specified port. - -### Two-terminal workflow - -Terminal 1 -- start Studio: - -```bash -firefly studio --port 8470 -``` - -Terminal 2 -- expose it: - -```bash -firefly expose --port 8470 -``` - ---- - -## Studio UI - -The Studio top bar includes a **Share** button that manages the tunnel -through the API: - -1. Click the **Share** button (globe icon) in the top bar. -2. Studio calls `POST /api/tunnel/start` to launch a quick tunnel. -3. The public URL appears in the UI and is copied to your clipboard. -4. Click the button again or use the stop action to call - `POST /api/tunnel/stop`. - ---- - -## Tunnel API - -The tunnel is managed through three REST endpoints: - -| Method | Path | Description | -|---|---|---| -| `GET` | `/api/tunnel/status` | Current tunnel status | -| `POST` | `/api/tunnel/start` | Start a quick tunnel | -| `POST` | `/api/tunnel/stop` | Stop the running tunnel | - -### Status Response - -```json -{"active": false, "url": null, "port": 8470} -``` - -### Start Response - -```json -{"url": "https://random-words.trycloudflare.com", "status": "active"} -``` - -If `cloudflared` is not installed: - -```json -{ - "error": "cloudflared not installed", - "install_url": "https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/" -} -``` - -### Stop Response - -```json -{"status": "stopped"} -``` - ---- - -## External Testing with Tunnel URLs - -Once the tunnel is active, all Studio endpoints are accessible via the -public URL: - -```bash -TUNNEL="https://random-words.trycloudflare.com" - -# Run a pipeline -curl -X POST "$TUNNEL/api/projects/my-project/run" \ - -H "Content-Type: application/json" \ - -d '{"input": "Test from external client"}' - -# Check project schema -curl "$TUNNEL/api/projects/my-project/schema" - -# Upload a file -curl -X POST "$TUNNEL/api/projects/my-project/upload" \ - -F "file=@document.pdf" - -# GraphQL -curl -X POST "$TUNNEL/api/graphql" \ - -H "Content-Type: application/json" \ - -d '{"query": "{ projects { name } }"}' -``` - -WebSocket connections work through the tunnel as well: - -```javascript -const ws = new WebSocket("wss://random-words.trycloudflare.com/ws/execution"); -``` - ---- - -## Security Considerations - -| Consideration | Guidance | -|---|---| -| **Public access** | Anyone with the URL can access your Studio instance. Share the URL only with trusted parties. | -| **No authentication** | Studio does not enforce authentication by default. Do not expose sensitive pipelines or API keys. | -| **Temporary URLs** | Quick tunnel URLs are random and change each time you restart. They are not guessable but are not secret either. | -| **Data in transit** | All traffic through the tunnel uses HTTPS. | -| **Local only** | The tunnel proxies to `localhost`. It does not expose other services on your machine. | -| **Lifetime** | The tunnel stops when you press Ctrl+C or close Studio. There is no persistent exposure. | - -For production use, deploy behind a proper reverse proxy with -authentication rather than relying on quick tunnels. - ---- - -## Troubleshooting - -| Issue | Solution | -|---|---| -| "cloudflared is not installed" | Install `cloudflared` using the instructions above | -| Tunnel starts but URL not shown | Check that port 8470 (or your custom port) is not blocked | -| Connection refused through tunnel | Ensure Studio is running on the same port the tunnel targets | -| Tunnel stops unexpectedly | Check `cloudflared` logs; the process may have been killed | - ---- - -*See also: [Project API](project-api.md) for the endpoints accessible -through the tunnel, [Studio](studio.md) for general Studio usage.* diff --git a/docs/tutorial-bpm-pipeline.md b/docs/tutorial-bpm-pipeline.md deleted file mode 100644 index 9b46aa1f..00000000 --- a/docs/tutorial-bpm-pipeline.md +++ /dev/null @@ -1,309 +0,0 @@ -# Tutorial: Building a BPM Pipeline - -Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0. - -This tutorial walks through building a document processing pipeline -end-to-end using Input/Output boundary nodes, the per-project REST API, -and Cloudflare Tunnel exposure. By the end you will have a pipeline that -accepts documents via HTTP, classifies and summarizes them, and returns -structured results -- accessible from anywhere. - ---- - -## Prerequisites - -```bash -pip install "fireflyframework-agentic[studio]" -``` - -You need a configured AI provider (OpenAI, Anthropic, etc.). Set your API -key as an environment variable or through the Studio Settings modal. - ---- - -## Step 1: Create a Project - -Launch Studio and create a new project: - -```bash -firefly studio -``` - -In the browser, click **New Project** in the sidebar and name it -`doc-processor`. Or use the API: - -```bash -curl -X POST http://localhost:8470/api/projects \ - -H "Content-Type: application/json" \ - -d '{"name": "doc-processor", "description": "Document classification and summarization"}' -``` - ---- - -## Step 2: Add an Input Node with HTTP Trigger - -Drag an **Input** node from the palette onto the canvas. Select it and -configure: - -- **Trigger Type**: `http` -- **Schema** (JSON): - -```json -{ - "type": "object", - "properties": { - "document": { - "type": "string", - "description": "The document text to process" - }, - "language": { - "type": "string", - "description": "ISO 639-1 language code", - "default": "en" - } - }, - "required": ["document"] -} -``` - -This tells Studio that the pipeline expects a `document` string and an -optional `language` field. - ---- - -## Step 3: Add Agent Nodes for Processing - -### Classifier Agent - -Drag an **Agent** node onto the canvas. Configure it: - -- **Label**: `Classifier` -- **Model**: `openai:gpt-4o` (or your preferred model) -- **Instructions**: - -``` -Classify the given document into one of these categories: -invoice, contract, report, letter, other. -Return ONLY the category name, no explanation. -``` - -Connect the Input node's output handle to the Classifier's input handle. - -### Summarizer Agent - -Drag another **Agent** node. Configure it: - -- **Label**: `Summarizer` -- **Model**: `openai:gpt-4o` -- **Instructions**: - -``` -Summarize the document in 2-3 sentences. -Focus on the key facts and action items. -``` - -Connect the Input node to the Summarizer as well (both agents receive the -original input in parallel). - ---- - -## Step 4: Add an Output Node with Response Destination - -Drag an **Output** node onto the canvas. Configure it: - -- **Destination Type**: `response` -- **Response Schema** (JSON): - -```json -{ - "type": "object", - "properties": { - "classification": {"type": "string"}, - "summary": {"type": "string"} - } -} -``` - -Connect both the Classifier and Summarizer to the Output node. The Output -node collects results from upstream nodes and returns them in the HTTP -response. - -### Canvas Layout - -``` - [Input: HTTP] --+--> [Classifier] --+--> [Output: Response] - | | - +--> [Summarizer] ---+ -``` - ---- - -## Step 5: Configure Schema Validation - -Save the pipeline using `Cmd/Ctrl + S` or via the API: - -```bash -curl -X POST http://localhost:8470/api/projects/doc-processor/pipelines/main \ - -H "Content-Type: application/json" \ - -d '{"graph": {"nodes": [...], "edges": [...]}}' -``` - -Verify the schema is exposed: - -```bash -curl http://localhost:8470/api/projects/doc-processor/schema -``` - -Expected: - -```json -{ - "input_schema": { - "type": "object", - "properties": { - "document": {"type": "string"}, - "language": {"type": "string"} - }, - "required": ["document"] - }, - "output_schema": { - "type": "object", - "properties": { - "classification": {"type": "string"}, - "summary": {"type": "string"} - } - }, - "trigger_type": "http" -} -``` - ---- - -## Step 6: Start the Runtime - -Click the **Play** button in the Studio top bar, or use the API: - -```bash -curl -X POST http://localhost:8470/api/projects/doc-processor/runtime/start -# {"status": "running"} -``` - -Verify the runtime is active: - -```bash -curl http://localhost:8470/api/projects/doc-processor/runtime/status -# {"project": "doc-processor", "status": "running", "trigger_type": "http", ...} -``` - ---- - -## Step 7: Test via the API - -### Synchronous Run - -```bash -curl -X POST http://localhost:8470/api/projects/doc-processor/run \ - -H "Content-Type: application/json" \ - -d '{ - "input": "INVOICE #2024-001\nDate: 2026-01-15\nFrom: Acme Corp\nTo: Widget Inc\nAmount: $5,000.00\nTerms: Net 30\nDescription: Consulting services for Q4 2025" - }' -``` - -Expected response: - -```json -{ - "result": { - "classification": "invoice", - "summary": "Invoice #2024-001 from Acme Corp to Widget Inc for $5,000 in consulting services, due Net 30 from January 15, 2026." - }, - "execution_id": "abc123...", - "duration_ms": 2345.67 -} -``` - -### Async Run - -```bash -# Start async -curl -X POST http://localhost:8470/api/projects/doc-processor/run/async \ - -H "Content-Type: application/json" \ - -d '{"input": "Dear Sir/Madam, We are writing to confirm..."}' - -# Poll -curl http://localhost:8470/api/projects/doc-processor/runs/ -``` - -### File Upload - -```bash -curl -X POST http://localhost:8470/api/projects/doc-processor/upload \ - -F "file=@contract.txt" -``` - -### Python Client - -```python -import httpx - -resp = httpx.post( - "http://localhost:8470/api/projects/doc-processor/run", - json={"input": "Annual Report 2025: Revenue grew 15% year-over-year..."}, -) -result = resp.json() -print(f"Type: {result['result']['classification']}") -print(f"Summary: {result['result']['summary']}") -``` - ---- - -## Step 8: Expose via Tunnel - -Open a second terminal and start a Cloudflare Tunnel: - -```bash -firefly expose --port 8470 -``` - -Output: - -``` -Studio is now publicly accessible at: https://random-words.trycloudflare.com -Press Ctrl+C to stop the tunnel. -``` - -Or click the **Share** button in the Studio top bar to start the tunnel -from the UI. - -Now test from an external machine or service: - -```bash -TUNNEL="https://random-words.trycloudflare.com" - -curl -X POST "$TUNNEL/api/projects/doc-processor/run" \ - -H "Content-Type: application/json" \ - -d '{"input": "This agreement is entered into by..."}' -``` - -The public URL works for all project API endpoints, WebSocket connections, -and GraphQL queries. - ---- - -## Next Steps - -- **Add a Validator node** between the agents and the Output to enforce - result quality (e.g., check that the classification is one of the - allowed values). -- **Switch to a queue trigger** to process documents from Kafka or - RabbitMQ instead of HTTP. -- **Add a schedule trigger** to run a daily batch job. -- **Use the Evaluation Lab** to test the pipeline against a JSONL dataset - of labeled documents. -- **Deploy** the generated Python code to production. - ---- - -*See also: [Input/Output Nodes](input-output-nodes.md), -[Project API](project-api.md), [Scheduling](scheduling.md), -[Tunnel Exposure](tunnel-exposure.md).* diff --git a/examples/README.md b/examples/README.md index c0733a05..c0048a67 100644 --- a/examples/README.md +++ b/examples/README.md @@ -76,10 +76,6 @@ If `OPENAI_API_KEY` is not set, each script will prompt you interactively. Requires `pdfplumber` (included in dev dependencies). -## Studio Examples - -- **`studio_launch.py`** — Launch Firefly Studio programmatically with custom `StudioConfig`. Shows how to embed the Studio app with a custom port, host, and project directory. Requires `pip install "fireflyframework-agentic[studio]"`. **No API key required** (the AI assistant requires one, but the IDE itself does not). - ## Reasoning Pattern Examples - **`reasoning_cot.py`** — Chain of Thought: step-by-step reasoning with `ReasoningThought` and trace inspection. diff --git a/examples/studio_launch.py b/examples/studio_launch.py deleted file mode 100644 index efc8f7e3..00000000 --- a/examples/studio_launch.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Launch Firefly Studio. - -Demonstrates three ways to start the Studio IDE: - -1. CLI: ``firefly studio`` -2. Convenience: ``launch_studio()`` -3. Programmatic: ``create_studio_app()`` + uvicorn - -Requirements: - pip install "fireflyframework-agentic[studio]" -""" - -from __future__ import annotations - - -def main() -> None: - """Launch Studio with custom configuration.""" - import uvicorn - - from fireflyframework_agentic.studio.config import StudioConfig - from fireflyframework_agentic.studio.server import create_studio_app - - config = StudioConfig( - port=8470, - host="127.0.0.1", - open_browser=True, - dev_mode=False, - # projects_dir="/path/to/custom/projects", # optional - ) - - app = create_studio_app(config=config) - - print(f"Firefly Studio running at http://{config.host}:{config.port}") - uvicorn.run(app, host=config.host, port=config.port) - - -if __name__ == "__main__": - main() diff --git a/pyproject.toml b/pyproject.toml index cfc7e611..db7464ab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,13 +66,6 @@ security = [ http = [ "httpx>=0.28.0", ] -studio = [ - "fastapi>=0.115.0", - "uvicorn[standard]>=0.34.0", - "httpx>=0.28.0", - "strawberry-graphql[fastapi]>=0.252.0", - "apscheduler>=4.0.0a5", -] costs = [ "genai-prices>=0.0.1", ] @@ -113,7 +106,7 @@ vectorstores-qdrant = [ "qdrant-client>=1.12.0", ] all = [ - "fireflyframework-agentic[rest,queues,postgres,mongodb,security,http,studio,costs,embeddings,openai-embeddings,cohere-embeddings,google-embeddings,mistral-embeddings,voyage-embeddings,azure-embeddings,bedrock-embeddings,ollama-embeddings,vectorstores-chroma,vectorstores-pinecone,vectorstores-qdrant]", + "fireflyframework-agentic[rest,queues,postgres,mongodb,security,http,costs,embeddings,openai-embeddings,cohere-embeddings,google-embeddings,mistral-embeddings,voyage-embeddings,azure-embeddings,bedrock-embeddings,ollama-embeddings,vectorstores-chroma,vectorstores-pinecone,vectorstores-qdrant]", ] dev = [ "pytest>=8.3.0", @@ -128,9 +121,6 @@ dev = [ "pre-commit>=3.8.0", ] -[project.scripts] -firefly = "fireflyframework_agentic.studio.cli:main" - [project.urls] Homepage = "https://fireflyframework.org/" Documentation = "https://github.com/fireflyframework/fireflyframework-agentic/tree/main/docs" diff --git a/scripts/build_studio.py b/scripts/build_studio.py deleted file mode 100644 index 330364b1..00000000 --- a/scripts/build_studio.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Build and bundle the Firefly Studio frontend into the Python package. - -Usage:: - - python scripts/build_studio.py - -This script: -1. Runs ``npm run build`` in ``studio-frontend/`` -2. Copies the build output to ``src/fireflyframework_agentic/studio/static/`` -3. The server then serves these files via FastAPI's StaticFiles mount. -""" - -from __future__ import annotations - -import shutil -import subprocess -import sys -from pathlib import Path - -# Resolve paths relative to the repository root. -REPO_ROOT = Path(__file__).resolve().parent.parent -FRONTEND_DIR = REPO_ROOT / "studio-frontend" -BUILD_DIR = FRONTEND_DIR / "build" -STATIC_DIR = REPO_ROOT / "src" / "fireflyframework_agentic" / "studio" / "static" - - -def main() -> None: - """Build the frontend and copy to the static directory.""" - # 1. Install dependencies if needed - if not (FRONTEND_DIR / "node_modules").exists(): - print("Installing frontend dependencies...") - subprocess.run( - ["npm", "install"], - cwd=FRONTEND_DIR, - check=True, - ) - - # 2. Build the frontend - print("Building Studio frontend...") - subprocess.run( - ["npm", "run", "build"], - cwd=FRONTEND_DIR, - check=True, - ) - - if not BUILD_DIR.exists(): - print("ERROR: Build directory not found at", BUILD_DIR, file=sys.stderr) - sys.exit(1) - - # 3. Clear existing static files (except .gitkeep) - if STATIC_DIR.exists(): - for item in STATIC_DIR.iterdir(): - if item.name == ".gitkeep": - continue - if item.is_dir(): - shutil.rmtree(item) - else: - item.unlink() - - # 4. Copy build output to static directory - print(f"Copying build output to {STATIC_DIR}...") - STATIC_DIR.mkdir(parents=True, exist_ok=True) - for item in BUILD_DIR.iterdir(): - dest = STATIC_DIR / item.name - if item.is_dir(): - shutil.copytree(item, dest) - else: - shutil.copy2(item, dest) - - # Count files - file_count = sum(1 for _ in STATIC_DIR.rglob("*") if _.is_file() and _.name != ".gitkeep") - print(f"Bundled {file_count} files into {STATIC_DIR}") - print("Done! The Studio frontend is now bundled into the Python package.") - - -if __name__ == "__main__": - main() diff --git a/src/fireflyframework_agentic/studio/__init__.py b/src/fireflyframework_agentic/studio/__init__.py deleted file mode 100644 index 1289190a..00000000 --- a/src/fireflyframework_agentic/studio/__init__.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Firefly Agentic Studio -- visual agent IDE for the Firefly Agentic framework.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from fireflyframework_agentic.studio.config import StudioConfig - -__all__ = [ - "StudioConfig", - "launch_studio", -] - - -def __getattr__(name: str) -> object: - if name == "StudioConfig": - from fireflyframework_agentic.studio.config import StudioConfig - - return StudioConfig - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") - - -def launch_studio() -> None: - """Launch the Firefly Agentic Studio server. - - Convenience wrapper that delegates to the CLI entry point. - """ - from fireflyframework_agentic.studio.cli import main - - main(["studio"]) diff --git a/src/fireflyframework_agentic/studio/api/__init__.py b/src/fireflyframework_agentic/studio/api/__init__.py deleted file mode 100644 index 193ab451..00000000 --- a/src/fireflyframework_agentic/studio/api/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Studio REST API sub-package.""" diff --git a/src/fireflyframework_agentic/studio/api/assistant.py b/src/fireflyframework_agentic/studio/api/assistant.py deleted file mode 100644 index 24519382..00000000 --- a/src/fireflyframework_agentic/studio/api/assistant.py +++ /dev/null @@ -1,978 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""WebSocket endpoint for the Studio AI assistant chat. - -Provides a ``/ws/assistant`` WebSocket route that accepts user messages -and streams AI assistant responses token-by-token back to the frontend. - -Uses a hybrid approach: -- ``run_stream()`` for text-only responses (fast token streaming) -- ``run()`` for tool-heavy responses (reliable multi-turn exhaustive execution) -""" - -from __future__ import annotations - -import base64 -import json -import logging -import re -from typing import Any - -from fastapi import APIRouter, Query, WebSocket, WebSocketDisconnect # type: ignore[import-not-found] -from pydantic import BaseModel # type: ignore[import-not-found] -from pydantic_ai.usage import UsageLimits # type: ignore[import-not-found] - -logger = logging.getLogger(__name__) - -# Generous limit for complex multi-tool pipelines (each tool call = 1 request). -_DEFAULT_REQUEST_LIMIT = 200 - -_CANVAS_TOOL_NAMES = frozenset( - { - "add_node", - "connect_nodes", - "configure_node", - "remove_node", - "clear_canvas", - } -) - - -def _canvas_to_dict(canvas: Any) -> dict[str, Any]: - """Serialize canvas state into a dict the frontend can apply.""" - return { - "nodes": [ - { - "id": n.id, - "type": n.type, - "label": n.label, - "position": n.position, - "config": n.config, - } - for n in canvas.nodes - ], - "edges": [ - { - "id": e.id, - "source": e.source, - "target": e.target, - "source_handle": e.source_handle, - "target_handle": e.target_handle, - } - for e in canvas.edges - ], - } - - -async def _send_canvas_sync(websocket: WebSocket, canvas: Any) -> None: - """Push the full canvas state to the frontend after tool calls.""" - await websocket.send_json( - { - "type": "canvas_sync", - "canvas": _canvas_to_dict(canvas), - } - ) - - -def _normalize_args(args: Any) -> dict[str, Any]: - """Ensure tool call args are always a dict. - - PydanticAI's ``ToolCallPart.args`` can be either a ``dict`` or a JSON - ``str``. The frontend expects a dict so it can render key-value pairs. - """ - if isinstance(args, dict): - return args - if isinstance(args, str): - try: - parsed = json.loads(args) - if isinstance(parsed, dict): - return parsed - except (json.JSONDecodeError, TypeError): - pass - return {"raw": args} - return {} - - -def _extract_tool_calls(result: Any) -> list[dict[str, Any]]: - """Extract tool call information from PydanticAI result messages. - - Works with both ``RunResult`` (from ``run()``) and ``StreamedRunResult`` - (from ``run_stream()``). Args are normalized to dicts so the frontend - can render them as key-value pairs. - """ - tool_calls: list[dict[str, Any]] = [] - try: - if not hasattr(result, "new_messages"): - return tool_calls - for msg in result.new_messages(): - parts = getattr(msg, "parts", []) - for part in parts: - part_kind = getattr(part, "part_kind", "") - if part_kind == "tool-call": - tool_calls.append( - { - "tool": getattr(part, "tool_name", "unknown"), - "args": _normalize_args(getattr(part, "args", {})), - "result": None, - } - ) - elif part_kind == "tool-return": - content = getattr(part, "content", "") - tool_name = getattr(part, "tool_name", "") - for tc in tool_calls: - if tc["tool"] == tool_name and tc["result"] is None: - tc["result"] = str(content)[:500] if content else "" - break - except Exception as exc: - logger.warning("Could not extract tool calls: %s", exc) - return tool_calls - - -def _process_attachments(attachments: list[dict[str, Any]]) -> str: - """Convert file attachments into text context for the LLM. - - Images are described by metadata (the LLM can't see raw images in - text mode). Text-based files have their content decoded and - included inline. Binary documents (PDF, DOCX, XLSX, PPTX) include - metadata only — full extraction requires optional dependencies. - """ - if not attachments: - return "" - - parts: list[str] = [] - for att in attachments: - name = att.get("name", "file") - category = att.get("category", "other") - size = att.get("size", 0) - data_b64 = att.get("data", "") - - if category in ("text",): - # Decode text content directly - try: - content = base64.b64decode(data_b64).decode("utf-8", errors="replace") - # Truncate very large files - if len(content) > 30_000: - content = content[:30_000] + "\n\n... [truncated]" - parts.append(f"--- File: {name} ---\n{content}\n--- End of {name} ---") - except Exception: - parts.append(f"[Attached file: {name} ({size} bytes) — could not decode]") - elif category == "spreadsheet" and name.lower().endswith(".csv"): - # CSV is text-based - try: - content = base64.b64decode(data_b64).decode("utf-8", errors="replace") - if len(content) > 30_000: - content = content[:30_000] + "\n\n... [truncated]" - parts.append(f"--- CSV File: {name} ---\n{content}\n--- End of {name} ---") - except Exception: - parts.append(f"[Attached CSV: {name} ({size} bytes) — could not decode]") - elif category == "image": - parts.append(f"[Attached image: {name} ({size} bytes, type: {att.get('type', 'unknown')})]") - elif category == "pdf": - parts.append( - f"[Attached PDF: {name} ({size} bytes) — " - f"PDF text extraction not available in this session. " - f"The user has shared a PDF document.]" - ) - elif category == "document": - ext = name.rsplit(".", 1)[-1].lower() if "." in name else "" - parts.append( - f"[Attached document: {name} ({size} bytes, .{ext}) — " - f"Document text extraction not available in this session.]" - ) - elif category == "spreadsheet": - parts.append( - f"[Attached spreadsheet: {name} ({size} bytes) — " - f"Spreadsheet data extraction not available in this session.]" - ) - elif category == "presentation": - parts.append( - f"[Attached presentation: {name} ({size} bytes) — " - f"Presentation text extraction not available in this session.]" - ) - else: - parts.append(f"[Attached file: {name} ({size} bytes)]") - - return "\n\n".join(parts) - - -async def _handle_chat_streaming( - websocket: WebSocket, - agent: Any, - effective_message: str, - message_history: list[Any], - canvas: Any, -) -> list[dict[str, Any]]: - """Stream tokens in real-time using ``run_stream()``. - - Yields text tokens one-by-one to the frontend as they arrive from the - LLM. After the stream completes, extracts tool call information and - sends canvas sync if canvas tools were used. - - Returns the list of tool calls made during the response so the caller - can decide whether to trigger reflexion validation. - """ - tool_calls: list[dict[str, Any]] = [] - full_text_parts: list[str] = [] - - async with await agent.run_stream( - effective_message, - message_history=message_history, - usage_limits=UsageLimits(request_limit=_DEFAULT_REQUEST_LIMIT), - ) as stream: - async for token in stream.stream_text(delta=True): - full_text_parts.append(token) - await websocket.send_json({"type": "token", "content": token}) - - full_text = "".join(full_text_parts) - - # Extract tool calls and update history from the completed stream - tool_calls = _extract_tool_calls(stream) - - if hasattr(stream, "new_messages"): - message_history.extend(stream.new_messages()) - - logger.info( - "Streaming complete (%d chars, %d tool calls, canvas: %d nodes, %d edges)", - len(full_text), - len(tool_calls), - len(canvas.nodes), - len(canvas.edges), - ) - - # Send tool call details so the UI shows what happened - for tc in tool_calls: - await websocket.send_json( - { - "type": "tool_call", - "tool": tc["tool"], - "args": tc["args"], - "result": tc["result"], - } - ) - - # Check if present_plan was called - plan_call = next( - (tc for tc in tool_calls if tc["tool"] == "present_plan"), - None, - ) - if plan_call and plan_call["args"]: - args = plan_call["args"] - await websocket.send_json( - { - "type": "plan", - "summary": args.get("summary", ""), - "steps": args.get("steps", "[]"), - "options": args.get("options", "[]"), - "question": args.get("question", ""), - } - ) - - await websocket.send_json( - { - "type": "response_complete", - "full_text": full_text, - } - ) - - # Canvas sync after tool use - used_canvas_tools = any(tc["tool"] in _CANVAS_TOOL_NAMES for tc in tool_calls) - if used_canvas_tools: - logger.info( - "Canvas tools used, sending sync (%d nodes, %d edges)", - len(canvas.nodes), - len(canvas.edges), - ) - await _send_canvas_sync(websocket, canvas) - - return tool_calls - - -async def _handle_chat_blocking( - websocket: WebSocket, - agent: Any, - effective_message: str, - message_history: list[Any], - canvas: Any, -) -> list[dict[str, Any]]: - """Blocking fallback using ``agent.run()``. - - Used when streaming is not available or fails. Sends the full text - as a single token message after completion. - - Returns the list of tool calls made during the response. - """ - result = await agent.run( - effective_message, - message_history=message_history, - usage_limits=UsageLimits(request_limit=_DEFAULT_REQUEST_LIMIT), - ) - - full_text = (str(result.output) if result.output else "") if hasattr(result, "output") else str(result) - - tool_calls = _extract_tool_calls(result) - - if hasattr(result, "new_messages"): - message_history.extend(result.new_messages()) - - logger.info( - "Blocking complete (%d chars, %d tool calls, canvas: %d nodes, %d edges)", - len(full_text), - len(tool_calls), - len(canvas.nodes), - len(canvas.edges), - ) - - for tc in tool_calls: - await websocket.send_json( - { - "type": "tool_call", - "tool": tc["tool"], - "args": tc["args"], - "result": tc["result"], - } - ) - - plan_call = next( - (tc for tc in tool_calls if tc["tool"] == "present_plan"), - None, - ) - if plan_call and plan_call["args"]: - args = plan_call["args"] - await websocket.send_json( - { - "type": "plan", - "summary": args.get("summary", ""), - "steps": args.get("steps", "[]"), - "options": args.get("options", "[]"), - "question": args.get("question", ""), - } - ) - - if full_text: - await websocket.send_json({"type": "token", "content": full_text}) - - await websocket.send_json( - { - "type": "response_complete", - "full_text": full_text, - } - ) - - used_canvas_tools = any(tc["tool"] in _CANVAS_TOOL_NAMES for tc in tool_calls) - if used_canvas_tools: - logger.info( - "Canvas tools used, sending sync (%d nodes, %d edges)", - len(canvas.nodes), - len(canvas.edges), - ) - await _send_canvas_sync(websocket, canvas) - - return tool_calls - - -_REFLEXION_MAX_ROUNDS = 3 - - -async def _run_reflexion_validation( - websocket: WebSocket, - agent: Any, - message_history: list[Any], - canvas: Any, -) -> None: - """Run framework-native reflexion validation after a pipeline build. - - Uses the built-in validate_pipeline logic to check the canvas, then - sends any errors back through the Architect agent for correction. - Repeats up to ``_REFLEXION_MAX_ROUNDS`` times until validation passes. - """ - if not canvas.nodes: - return - - for round_num in range(1, _REFLEXION_MAX_ROUNDS + 1): - # Run validation directly against the canvas state - validation = _validate_canvas(canvas) - - if validation["valid"]: - logger.info("Reflexion validation passed (round %d)", round_num) - return - - errors = validation.get("errors", []) - warnings = validation.get("warnings", []) - - logger.info( - "Reflexion round %d: %d errors, %d warnings", - round_num, - len(errors), - len(warnings), - ) - - # Notify the user that auto-correction is running - await websocket.send_json( - { - "type": "tool_call", - "tool": "reflexion_validation", - "args": {"round": round_num, "errors": len(errors)}, - "result": f"Found {len(errors)} errors. Auto-correcting...", - } - ) - - # Ask the Architect to fix the issues via its canvas tools - fix_prompt = ( - f"[REFLEXION VALIDATION - Round {round_num}]\n" - f"The pipeline has {len(errors)} validation errors that must be fixed:\n" - + "\n".join(f" - {e}" for e in errors) - ) - if warnings: - fix_prompt += "\n\nWarnings (non-blocking):\n" + "\n".join(f" - {w}" for w in warnings) - fix_prompt += ( - "\n\nFix ALL errors using configure_node, connect_nodes, or add_node as needed. " - "Do NOT explain. Just fix the issues with tool calls." - ) - - try: - result = await agent.run( - fix_prompt, - message_history=message_history, - usage_limits=UsageLimits(request_limit=50), - ) - - fix_tool_calls = _extract_tool_calls(result) - if hasattr(result, "new_messages"): - message_history.extend(result.new_messages()) - - # Send tool calls to frontend - for tc in fix_tool_calls: - await websocket.send_json( - { - "type": "tool_call", - "tool": tc["tool"], - "args": tc["args"], - "result": tc["result"], - } - ) - - # Sync canvas if tools were used - used_canvas = any(tc["tool"] in _CANVAS_TOOL_NAMES for tc in fix_tool_calls) - if used_canvas: - await _send_canvas_sync(websocket, canvas) - - fix_text = "" - if hasattr(result, "output"): - fix_text = str(result.output) if result.output else "" - - if fix_text: - await websocket.send_json({"type": "token", "content": fix_text}) - - except Exception as exc: - logger.warning("Reflexion fix round %d failed: %s", round_num, exc) - break - - # Final check - final = _validate_canvas(canvas) - if not final["valid"]: - remaining = final.get("errors", []) - await websocket.send_json( - { - "type": "token", - "content": ( - f"\n\n[Reflexion completed with {len(remaining)} remaining issue(s). " - "Please review and address manually.]" - ), - } - ) - - -def _validate_canvas(canvas: Any) -> dict[str, Any]: - """Run validation logic against the current canvas state (synchronous).""" - errors: list[str] = [] - warnings: list[str] = [] - - if not canvas.nodes: - return {"valid": False, "errors": ["Pipeline is empty."], "warnings": []} - - connected_ids: set[str] = set() - for e in canvas.edges: - connected_ids.add(e.source) - connected_ids.add(e.target) - - for node in canvas.nodes: - cfg = node.config - ntype = node.type - - if ntype == "agent": - if not cfg.get("model"): - errors.append(f"Agent '{node.id}' is missing 'model'.") - if not cfg.get("instructions"): - errors.append(f"Agent '{node.id}' is missing 'instructions'.") - if not cfg.get("description"): - warnings.append(f"Agent '{node.id}' has no 'description'.") - elif ntype == "tool": - if not cfg.get("tool_name"): - errors.append(f"Tool '{node.id}' is missing 'tool_name'.") - elif ntype == "reasoning": - if not cfg.get("pattern"): - errors.append(f"Reasoning '{node.id}' is missing 'pattern'.") - elif ntype == "condition": - if not cfg.get("condition"): - errors.append(f"Condition '{node.id}' is missing 'condition'.") - if not cfg.get("branches"): - errors.append(f"Condition '{node.id}' is missing 'branches'.") - elif ntype == "input": - if not cfg.get("trigger_type"): - errors.append(f"Input '{node.id}' is missing 'trigger_type'.") - elif ntype == "output": - if not cfg.get("destination_type"): - errors.append(f"Output '{node.id}' is missing 'destination_type'.") - elif ntype == "custom_code": - if not cfg.get("code"): - errors.append(f"CustomCode '{node.id}' is missing 'code'.") - elif ntype == "memory": - if not cfg.get("memory_action"): - errors.append(f"Memory '{node.id}' is missing 'memory_action'.") - elif ntype == "validator": - if not cfg.get("validation_rule"): - errors.append(f"Validator '{node.id}' is missing 'validation_rule'.") - - if node.id not in connected_ids and len(canvas.nodes) > 1: - errors.append(f"Node '{node.id}' ({node.label or ntype}) is orphaned.") - - input_nodes = [n for n in canvas.nodes if n.type == "input"] - output_nodes = [n for n in canvas.nodes if n.type == "output"] - if len(input_nodes) > 1: - errors.append(f"Pipeline has {len(input_nodes)} input nodes but only 1 is allowed.") - if input_nodes and not output_nodes: - errors.append("Pipeline has an input node but no output node.") - - return {"valid": len(errors) == 0, "errors": errors, "warnings": warnings} - - -async def _handle_chat( - websocket: WebSocket, - agent: Any, - user_message: str, - message_history: list[Any], - canvas: Any, - attachments: list[dict[str, Any]] | None = None, -) -> None: - """Handle a chat message with hybrid streaming and reflexion validation. - - Attempts real-time token streaming via ``run_stream()`` first. If - streaming is not available or fails, falls back to blocking - ``run()`` which sends the full text as a single token. - - Reflexion validation only triggers when the Architect completed a - substantial build (called ``validate_pipeline`` or used 3+ canvas - tools), not after every incremental addition. - """ - try: - # Prepend file attachment context if present - effective_message = user_message - if attachments: - attachment_context = _process_attachments(attachments) - if attachment_context: - effective_message = f"{attachment_context}\n\nUser message: {user_message}" - - logger.info( - "Running assistant (canvas: %d nodes, %d edges, attachments: %d)", - len(canvas.nodes), - len(canvas.edges), - len(attachments or []), - ) - - # Use blocking run() for reliable multi-turn tool execution. - # The Architect's exhaustive end strategy requires the full agent - # loop (tool calls → re-prompt → more tool calls → final text), - # which run_stream() does not handle correctly. - tool_calls = await _handle_chat_blocking( - websocket, - agent, - effective_message, - message_history, - canvas, - ) - - # Reflexion triggers only on substantial builds: - # - The Architect called validate_pipeline (it believes the build is done) - # - OR 3+ canvas tool calls in a single response (full build sequence) - called_validate = any(tc["tool"] == "validate_pipeline" for tc in tool_calls) - canvas_tool_count = sum(1 for tc in tool_calls if tc["tool"] in _CANVAS_TOOL_NAMES) - - if (called_validate or canvas_tool_count >= 3) and canvas.nodes: - logger.info( - "Reflexion triggered (validate_called=%s, canvas_tools=%d)", - called_validate, - canvas_tool_count, - ) - try: - await _run_reflexion_validation( - websocket, - agent, - message_history, - canvas, - ) - except Exception as val_exc: - logger.warning("Reflexion validation failed: %s", val_exc) - - except Exception as exc: - logger.error("Assistant run failed: %s", exc, exc_info=True) - - err_str = str(exc) - if "request_limit" in err_str: - user_msg = ( - "This request required too many operations and hit the safety limit. " - "Try breaking your request into smaller steps, or simplify the " - "pipeline you are asking me to build." - ) - elif "rate" in err_str.lower() and ("limit" in err_str.lower() or "429" in err_str): - user_msg = "The LLM provider is rate-limiting requests. Please wait a moment and try again." - else: - user_msg = f"Assistant error: {exc}" - - await websocket.send_json( - { - "type": "error", - "message": user_msg, - } - ) - - -def _build_project_context(canvas: Any = None, project_name: str = "") -> str: - """Gather live project, integration, and tool state for the Architect. - - This context is prepended (invisibly) to the first user message so the - assistant knows what the user is working on without them having to explain. - Includes cross-agent conversation summaries from Smith and Oracle. - """ - parts: list[str] = [] - - # Current canvas state - if canvas and canvas.nodes: - node_summaries = [] - for n in canvas.nodes: - cfg_keys = ", ".join(f"{k}={v!r}" for k, v in list(n.config.items())[:4]) if n.config else "unconfigured" - node_summaries.append(f" - {n.id} ({n.type}): {n.label or 'unlabeled'} [{cfg_keys}]") - edge_summaries = [f" - {e.source} -> {e.target}" for e in canvas.edges] - parts.append( - f"[CONTEXT] Current canvas has {len(canvas.nodes)} nodes and {len(canvas.edges)} edges:\n" - + "\n".join(node_summaries) - + ("\nConnections:\n" + "\n".join(edge_summaries) if edge_summaries else "") - ) - - # Current project - try: - from fireflyframework_agentic.studio.config import StudioConfig - from fireflyframework_agentic.studio.projects import ProjectManager - - pm = ProjectManager(StudioConfig().projects_dir) - projects = pm.list_all() - if projects: - names = [p.name for p in projects] - parts.append(f"[CONTEXT] Active projects: {', '.join(names)}.") - except Exception: - pass - - # Custom tools / integrations - try: - from fireflyframework_agentic.studio.custom_tools import CustomToolManager - - manager = CustomToolManager() - tools = manager.list_all() - if tools: - summaries = [] - for t in tools: - status = "registered" - summaries.append(f" - {t.name} (type={t.tool_type}, {status})") - parts.append("[CONTEXT] Custom tools / integrations installed:\n" + "\n".join(summaries)) - else: - parts.append("[CONTEXT] No custom tools or integrations installed yet.") - except Exception: - pass - - # Registered framework tools - try: - from fireflyframework_agentic.tools.registry import tool_registry - - registered = tool_registry.list_tools() - if registered: - names = [t.name for t in registered] - parts.append(f"[CONTEXT] Framework tools available: {', '.join(names)}.") - except Exception: - pass - - # Settings snapshot (provider configured, default model) - try: - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings() - if settings.model_defaults.default_model: - parts.append(f"[CONTEXT] Default model: {settings.model_defaults.default_model}.") - except Exception: - pass - - # Cross-agent context: what Smith and Oracle have discussed with the user - if project_name: - try: - from fireflyframework_agentic.studio.assistant.shared_context import ( - build_shared_context, - ) - - # Canvas here is the typed object, convert to dict for shared context - canvas_dict = None - if canvas and canvas.nodes: - canvas_dict = { - "nodes": [ - {"id": n.id, "type": n.type, "data": {"label": n.label or "", "config": n.config or {}}} - for n in canvas.nodes - ], - "edges": [{"source": e.source, "target": e.target} for e in canvas.edges], - } - shared = build_shared_context(project_name, canvas_dict, exclude_agent="architect") - if shared: - parts.append(shared) - except Exception: - pass - - return "\n".join(parts) - - -class InferProjectNameRequest(BaseModel): - message: str - - -class SaveHistoryRequest(BaseModel): - messages: list[dict] - - -def create_assistant_router() -> APIRouter: - """Create an :class:`APIRouter` with the assistant WebSocket endpoint. - - Endpoints - --------- - ``WS /ws/assistant`` - Accept a WebSocket connection for the AI assistant chat. Supports - ``"action": "chat"`` to send a user message and receive a streamed - response, and ``"action": "clear_history"`` to reset the - conversation. - """ - router = APIRouter(tags=["assistant"]) - - @router.get("/api/assistant/{project}/history") - async def get_chat_history(project: str): - from fireflyframework_agentic.studio.assistant.history import load_chat_history - - return load_chat_history(project) - - @router.post("/api/assistant/{project}/history") - async def save_chat_history_endpoint(project: str, body: SaveHistoryRequest): - from fireflyframework_agentic.studio.assistant.history import save_chat_history - - save_chat_history(project, body.messages) - return {"status": "saved"} - - @router.delete("/api/assistant/{project}/history") - async def delete_chat_history(project: str): - from fireflyframework_agentic.studio.assistant.history import clear_chat_history - - clear_chat_history(project) - return {"status": "cleared"} - - @router.post("/api/assistant/infer-project-name") - async def infer_project_name(body: InferProjectNameRequest): - import time - - try: - from pydantic_ai import Agent - - agent = Agent( - "openai:gpt-4.1-mini", - system_prompt=( - "Given this user request, generate a short project name " - "(2-4 words, kebab-case, no spaces). Just return the name, nothing else." - ), - ) - result = await agent.run(body.message) - name = str(result.output).strip().lower().replace(" ", "-") - # Sanitize: only allow alphanumeric and hyphens - name = "".join(c for c in name if c.isalnum() or c == "-").strip("-") - if not name: - name = f"project-{int(time.time())}" - return {"name": name} - except Exception: - return {"name": f"project-{int(time.time())}"} - - @router.websocket("/ws/assistant") - async def assistant_ws(websocket: WebSocket, project: str = Query(default="")) -> None: - await websocket.accept() - logger.info("Assistant WebSocket connected") - - # Per-connection state - from fireflyframework_agentic.studio.assistant.agent import ( - CanvasEdge, - CanvasNode, - CanvasState, - create_studio_assistant, - ) - - canvas = CanvasState() - message_history: list[Any] = [] - - # Create the agent. We catch errors to avoid crashing the - # WebSocket on startup (e.g. missing API key). - try: - agent = create_studio_assistant(canvas=canvas) - except Exception as exc: - logger.error("Failed to create studio assistant: %s", exc) - await websocket.send_json( - { - "type": "error", - "message": f"Assistant unavailable: {exc}", - } - ) - await websocket.close() - return - - # Load project-scoped chat history if project is specified - if project: - try: - from fireflyframework_agentic.studio.assistant.history import load_chat_history - - saved_history = load_chat_history(project) - if saved_history: - logger.info("Loaded %d saved messages for project '%s'", len(saved_history), project) - except Exception as exc: - logger.warning("Could not load chat history for project '%s': %s", project, exc) - - try: - while True: - raw = await websocket.receive_text() - try: - message = json.loads(raw) - except json.JSONDecodeError: - await websocket.send_json( - { - "type": "error", - "message": "Invalid JSON", - } - ) - continue - - action = message.get("action") - - if action == "chat": - user_message = message.get("message", "").strip() - chat_attachments = message.get("attachments", []) - if not user_message and not chat_attachments: - await websocket.send_json( - { - "type": "error", - "message": "Empty message", - } - ) - continue - if not user_message: - user_message = "Please analyze the attached files." - - # Inject live project context so The Architect knows what - # the user is currently working on. - project_context = _build_project_context(canvas=canvas, project_name=project) - if project_context: - user_message = f"{project_context}\n\n{user_message}" - - await _handle_chat( - websocket, - agent, - user_message, - message_history, - canvas, - attachments=chat_attachments or None, - ) - - # Auto-save chat history for project - if project: - try: - from fireflyframework_agentic.studio.assistant.history import save_chat_history - - save_chat_history( - project, - [ - { - "role": "user", - "content": user_message, - "timestamp": __import__("datetime") - .datetime.now(__import__("datetime").UTC) - .isoformat(), - }, - ], - ) - except Exception: - pass - - elif action == "clear_history": - message_history.clear() - await websocket.send_json({"type": "history_cleared"}) - - elif action == "sync_canvas": - # Restore canvas state from frontend (e.g. after refresh) - sync_nodes = message.get("nodes", []) - sync_edges = message.get("edges", []) - canvas.nodes.clear() - canvas.edges.clear() - max_id = 0 - for n in sync_nodes: - data = n.get("data", {}) - config = {k: v for k, v in data.items() if k not in ("label", "_executionState")} - canvas.nodes.append( - CanvasNode( - id=n.get("id", ""), - type=n.get("type", "pipeline_step"), - label=data.get("label", n.get("id", "")), - position=n.get("position", {"x": 0, "y": 0}), - config=config, - ) - ) - # Track highest numeric suffix for counter - m = re.search(r"(\d+)$", n.get("id", "")) - if m: - max_id = max(max_id, int(m.group(1))) - for e in sync_edges: - canvas.edges.append( - CanvasEdge( - id=e.get("id", ""), - source=e.get("source", ""), - target=e.get("target", ""), - source_handle=e.get("sourceHandle"), - target_handle=e.get("targetHandle"), - ) - ) - canvas._counter = max_id - logger.info( - "Canvas synced from frontend: %d nodes, %d edges (counter=%d)", - len(canvas.nodes), - len(canvas.edges), - max_id, - ) - - else: - await websocket.send_json( - { - "type": "error", - "message": f"Unknown action: {action}", - } - ) - - except WebSocketDisconnect: - logger.info("Assistant WebSocket disconnected") - - return router diff --git a/src/fireflyframework_agentic/studio/api/checkpoints.py b/src/fireflyframework_agentic/studio/api/checkpoints.py deleted file mode 100644 index 5a570c90..00000000 --- a/src/fireflyframework_agentic/studio/api/checkpoints.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Checkpoint API endpoints for Firefly Agentic Studio. - -Exposes the :class:`CheckpointManager` over REST so the frontend can -list, inspect, fork, and diff execution checkpoints for the timeline -debugging UI. -""" - -from __future__ import annotations - -from dataclasses import asdict -from typing import Any - -from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] -from pydantic import BaseModel # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.execution.checkpoint import CheckpointManager - - -class ForkRequest(BaseModel): - """Request body for forking a checkpoint.""" - - from_index: int - modified_state: dict[str, Any] - - -class DiffRequest(BaseModel): - """Request body for diffing two checkpoints.""" - - index_a: int - index_b: int - - -def create_checkpoints_router(manager: CheckpointManager) -> APIRouter: - """Create an :class:`APIRouter` that serves checkpoint data. - - Endpoints - --------- - ``GET /api/checkpoints`` - Return a list of all checkpoints. - ``GET /api/checkpoints/{index}`` - Return a single checkpoint by index. - ``POST /api/checkpoints/fork`` - Fork from an existing checkpoint with modified state. - ``POST /api/checkpoints/diff`` - Diff the state of two checkpoints. - ``DELETE /api/checkpoints`` - Clear all checkpoints. - """ - router = APIRouter(prefix="/api/checkpoints", tags=["checkpoints"]) - - @router.get("") - async def list_checkpoints() -> list[dict[str, Any]]: - return [asdict(cp) for cp in manager.list_all()] - - @router.get("/{index}") - async def get_checkpoint(index: int) -> dict[str, Any]: - try: - return asdict(manager.get(index)) - except IndexError as exc: - raise HTTPException(status_code=404, detail=f"Checkpoint {index} not found") from exc - - @router.post("/fork") - async def fork_checkpoint(body: ForkRequest) -> dict[str, Any]: - try: - cp = manager.fork(body.from_index, body.modified_state) - except IndexError as exc: - raise HTTPException( - status_code=404, - detail=f"Checkpoint {body.from_index} not found", - ) from exc - return asdict(cp) - - @router.post("/{index}/rewind") - async def rewind_checkpoint(index: int) -> dict[str, Any]: - try: - cp = manager.get(index) - except IndexError as exc: - raise HTTPException(status_code=404, detail=f"Checkpoint {index} not found") from exc - # Trim all checkpoints after this one - manager.rewind(index) - return {"status": "rewound", "index": index, "node_id": cp.node_id} - - @router.post("/diff") - async def diff_checkpoints(body: DiffRequest) -> dict[str, Any]: - try: - result = manager.diff(body.index_a, body.index_b) - except IndexError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - # Convert sets to sorted lists for JSON serialisation - return {k: sorted(v) for k, v in result.items()} - - @router.delete("") - async def clear_checkpoints() -> dict[str, str]: - manager.clear() - return {"status": "cleared"} - - return router diff --git a/src/fireflyframework_agentic/studio/api/codegen.py b/src/fireflyframework_agentic/studio/api/codegen.py deleted file mode 100644 index 073a2898..00000000 --- a/src/fireflyframework_agentic/studio/api/codegen.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Code generation API endpoints for Firefly Agentic Studio. - -Provides a REST endpoint that converts the visual graph model (JSON from the -frontend canvas) into executable Python code. -""" - -from __future__ import annotations - -import logging - -from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] -from pydantic import BaseModel - -logger = logging.getLogger(__name__) - - -class SmithCodegenRequest(BaseModel): - """Request body for the ``POST /api/codegen/smith`` endpoint.""" - - graph: dict - - -def create_codegen_router() -> APIRouter: - """Create an :class:`APIRouter` that serves code generation endpoints. - - Endpoints - --------- - ``POST /api/codegen/smith`` - Accept a graph model (JSON) and return AI-generated Python code - via the Smith agent. - - **Request body:** - ``{"graph": {"nodes": [...], "edges": [...]}}`` - - **Response:** - ``{"files": [{"path": str, "content": str, "language": str}], - "code": "...concatenated code...", "notes": [...]}`` - """ - router = APIRouter(prefix="/api/codegen", tags=["codegen"]) - - @router.post("/smith") - async def smith_codegen(req: SmithCodegenRequest) -> dict: - """Generate Python code using the Smith AI agent.""" - from fireflyframework_agentic.studio.assistant.smith import generate_code_with_smith - from fireflyframework_agentic.studio.settings import load_settings - - try: - settings = load_settings() - settings_dict = { - "model_defaults": { - "default_model": settings.model_defaults.default_model, - } - } - user_name = settings.user_profile.name or "" - except Exception: - settings_dict = None - user_name = "" - - try: - result = await generate_code_with_smith(req.graph, settings_dict, user_name=user_name) - except Exception as exc: - raise HTTPException(status_code=500, detail=str(exc)) from exc - return result - - return router diff --git a/src/fireflyframework_agentic/studio/api/custom_tools.py b/src/fireflyframework_agentic/studio/api/custom_tools.py deleted file mode 100644 index ef05080c..00000000 --- a/src/fireflyframework_agentic/studio/api/custom_tools.py +++ /dev/null @@ -1,617 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""REST API endpoints for managing custom tools in Firefly Agentic Studio. - -Provides CRUD operations so the Studio frontend can create, list, update, -and delete user-defined tools (Python, webhook, and API types). Also -includes a pre-built connector catalog for common platforms. -""" - -from __future__ import annotations - -from dataclasses import asdict -from typing import Any - -from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] -from pydantic import BaseModel # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.custom_tools import ( - CustomToolDefinition, - CustomToolManager, - ToolParameter, -) - -# --------------------------------------------------------------------------- -# Request / response models -# --------------------------------------------------------------------------- - - -class ToolParameterModel(BaseModel): - """A single parameter for a custom tool.""" - - name: str - type: str = "string" - description: str = "" - required: bool = True - default: Any = None - - -class SaveToolRequest(BaseModel): - """Body for creating or updating a custom tool.""" - - name: str - description: str = "" - tool_type: str = "webhook" - tags: list[str] = [] - parameters: list[ToolParameterModel] = [] - - # Python tool fields - module_path: str = "" - python_code: str = "" # Inline Python code (saved as .py file) - - # Webhook tool fields - webhook_url: str = "" - webhook_method: str = "POST" - webhook_headers: dict[str, str] = {} - - # API tool fields - api_base_url: str = "" - api_path: str = "" - api_method: str = "GET" - api_auth_type: str = "" - api_auth_value: str = "" - api_headers: dict[str, str] = {} - - -# --------------------------------------------------------------------------- -# Pre-built connector catalog -# --------------------------------------------------------------------------- - -_CONNECTOR_CATALOG: list[dict[str, Any]] = [ - { - "id": "slack", - "name": "Slack", - "category": "messaging", - "description": "Send messages to Slack channels via the Slack Web API. Requires a Slack Bot Token (configure in Tool Credentials).", - "icon": "message-square", - "requires_credential": "slack_bot_token", - "setup_guide": ( - "1. Go to [api.slack.com/apps](https://api.slack.com/apps) and click **Create New App**\n" - "2. Choose **From scratch**, name it, and select your workspace\n" - "3. Under **OAuth & Permissions**, add the `chat:write` scope\n" - "4. Click **Install to Workspace** and authorize\n" - "5. Copy the **Bot User OAuth Token** (starts with `xoxb-`)\n" - "6. Paste it in **Tool Credentials > Slack Bot Token** above" - ), - "verify_url": "https://slack.com/api/auth.test", - "verify_method": "bearer", - "definition": { - "name": "slack_send_message", - "description": "Send a message to a Slack channel. Pass 'channel' (channel ID or name) and 'text' (message content).", - "tool_type": "api", - "tags": ["messaging", "slack", "notifications"], - "api_base_url": "https://slack.com", - "api_path": "/api/chat.postMessage", - "api_method": "POST", - "api_auth_type": "bearer", - "api_auth_value": "__SLACK_BOT_TOKEN__", - }, - }, - { - "id": "telegram", - "name": "Telegram", - "category": "messaging", - "description": "Send messages via the Telegram Bot API. Requires a Telegram Bot Token (configure in Tool Credentials).", - "icon": "send", - "requires_credential": "telegram_bot_token", - "setup_guide": ( - "1. Open Telegram and message [@BotFather](https://t.me/BotFather)\n" - "2. Send `/newbot` and follow the prompts to name your bot\n" - "3. BotFather will give you an **HTTP API token**\n" - "4. Copy the token and paste it in **Tool Credentials > Telegram Bot Token** above" - ), - "verify_url": "https://api.telegram.org/bot{token}/getMe", - "verify_method": "url_token", - "definition": { - "name": "telegram_send_message", - "description": "Send a message via Telegram. Pass 'chat_id' and 'text'.", - "tool_type": "api", - "tags": ["messaging", "telegram", "notifications"], - "api_base_url": "https://api.telegram.org", - "api_path": "/bot__TELEGRAM_BOT_TOKEN__/sendMessage", - "api_method": "POST", - "api_auth_type": "none", - }, - }, - { - "id": "discord", - "name": "Discord", - "category": "messaging", - "description": "Send messages to Discord channels via incoming webhooks. Provide your Discord webhook URL during installation.", - "icon": "hash", - "requires_credential": None, - "setup_guide": ( - "1. Open Discord and go to **Server Settings > Integrations**\n" - "2. Click **Webhooks > New Webhook**\n" - "3. Name the webhook and select the target channel\n" - "4. Click **Copy Webhook URL**\n" - "5. Paste it when prompted during installation below" - ), - "verify_method": "head", - "definition": { - "name": "discord_webhook", - "description": "Send a message to a Discord channel via webhook. Pass 'content' (message text).", - "tool_type": "webhook", - "tags": ["messaging", "discord", "notifications"], - "webhook_url": "", - "webhook_method": "POST", - }, - }, - { - "id": "teams", - "name": "Microsoft Teams", - "category": "messaging", - "description": "Send messages to Microsoft Teams channels via incoming webhooks. Provide your Teams webhook URL during installation.", - "icon": "users", - "requires_credential": None, - "setup_guide": ( - "1. In Teams, go to the channel and click **... > Connectors**\n" - "2. Find **Incoming Webhook** and click **Configure**\n" - "3. Name the webhook and optionally upload an image\n" - "4. Click **Create** and copy the webhook URL\n" - "5. Paste it when prompted during installation below" - ), - "verify_method": "head", - "definition": { - "name": "teams_webhook", - "description": "Send a message to a Microsoft Teams channel via incoming webhook. Pass 'text' (message content).", - "tool_type": "webhook", - "tags": ["messaging", "teams", "notifications"], - "webhook_url": "", - "webhook_method": "POST", - }, - }, - { - "id": "github_issues", - "name": "GitHub Issues", - "category": "developer", - "description": "Create GitHub issues programmatically. Requires a GitHub Personal Access Token.", - "icon": "git-pull-request", - "requires_credential": None, - "setup_guide": ( - "1. Go to [GitHub Settings > Developer settings > Personal access tokens](https://github.com/settings/tokens)\n" - "2. Click **Generate new token (classic)**\n" - "3. Select the `repo` scope (for private repos) or `public_repo` (for public only)\n" - "4. Generate and copy the token\n" - "5. After installing, edit the tool and paste the token as the Bearer auth value\n" - "6. Update the API path to `/repos/YOUR_ORG/YOUR_REPO/issues`" - ), - "verify_url": "https://api.github.com/user", - "verify_method": "bearer", - "definition": { - "name": "github_create_issue", - "description": "Create an issue on a GitHub repository. Pass 'title', 'body', and configure the repo in the API path.", - "tool_type": "api", - "tags": ["developer", "github", "issues"], - "api_base_url": "https://api.github.com", - "api_path": "/repos/OWNER/REPO/issues", - "api_method": "POST", - "api_auth_type": "bearer", - "api_auth_value": "", - }, - }, - { - "id": "sendgrid", - "name": "SendGrid Email", - "category": "email", - "description": "Send transactional emails via the SendGrid API. Requires a SendGrid API Key.", - "icon": "mail", - "requires_credential": None, - "setup_guide": ( - "1. Sign in to [SendGrid](https://app.sendgrid.com/)\n" - "2. Go to **Settings > API Keys > Create API Key**\n" - "3. Give it a name and select **Restricted Access** with Mail Send permissions\n" - "4. Copy the generated API key\n" - "5. After installing, edit the tool and paste the key as the Bearer auth value" - ), - "verify_url": "https://api.sendgrid.com/v3/scopes", - "verify_method": "bearer", - "definition": { - "name": "sendgrid_send_email", - "description": "Send an email via SendGrid. Pass 'to' (email), 'subject', and 'content' (body text).", - "tool_type": "api", - "tags": ["email", "sendgrid", "notifications"], - "api_base_url": "https://api.sendgrid.com", - "api_path": "/v3/mail/send", - "api_method": "POST", - "api_auth_type": "bearer", - "api_auth_value": "", - }, - }, - { - "id": "webhook_generic", - "name": "Generic Webhook", - "category": "integration", - "description": "Call any HTTP endpoint as a tool. Configure the URL and method.", - "icon": "webhook", - "requires_credential": None, - "setup_guide": ( - "1. Obtain the webhook URL from your target service\n" - "2. Provide the URL during installation\n" - "3. The default method is POST; edit the tool after install to change it" - ), - "verify_method": "head", - "definition": { - "name": "custom_webhook", - "description": "Call a custom HTTP webhook endpoint.", - "tool_type": "webhook", - "tags": ["integration", "webhook"], - "webhook_url": "", - "webhook_method": "POST", - }, - }, - { - "id": "rest_api_generic", - "name": "Generic REST API", - "category": "integration", - "description": "Call any REST API with configurable auth. Supports Bearer tokens, API keys, and no-auth.", - "icon": "globe", - "requires_credential": None, - "setup_guide": ( - "1. Install this connector, then edit it to configure:\n" - "2. Set the **Base URL** (e.g. `https://api.example.com`)\n" - "3. Set the **Path** (e.g. `/v1/resource`)\n" - "4. Choose the **Auth Type** and provide credentials if needed" - ), - "definition": { - "name": "custom_rest_api", - "description": "Call a custom REST API endpoint.", - "tool_type": "api", - "tags": ["integration", "api"], - "api_base_url": "", - "api_path": "", - "api_method": "GET", - "api_auth_type": "none", - }, - }, -] - - -# --------------------------------------------------------------------------- -# Router factory -# --------------------------------------------------------------------------- - - -def create_custom_tools_router(manager: CustomToolManager) -> APIRouter: - """Create an :class:`APIRouter` for custom tool management. - - Endpoints - --------- - ``GET /api/custom-tools`` - List all custom tools. - ``GET /api/custom-tools/catalog`` - List pre-built connectors. - ``POST /api/custom-tools/catalog/{connector_id}/install`` - Install a pre-built connector. - ``GET /api/custom-tools/{name}`` - Get a single custom tool definition. - ``POST /api/custom-tools`` - Create or update a custom tool. - ``DELETE /api/custom-tools/{name}`` - Delete a custom tool. - ``POST /api/custom-tools/{name}/test`` - Test a custom tool. - ``POST /api/custom-tools/{name}/register`` - Register a tool in the runtime registry. - """ - router = APIRouter(prefix="/api/custom-tools", tags=["custom-tools"]) - - @router.get("") - async def list_tools() -> list[dict[str, Any]]: - tools = manager.list_all() - return [asdict(t) for t in tools] - - # ---- Static path routes MUST come before /{name} catch-all ---- - - @router.get("/catalog") - async def list_connectors() -> list[dict[str, Any]]: - """Return the pre-built connector catalog with setup guides.""" - installed_names = {t.name for t in manager.list_all()} - catalog = [] - for connector in _CONNECTOR_CATALOG: - entry = { - "id": connector["id"], - "name": connector["name"], - "category": connector["category"], - "description": connector["description"], - "icon": connector["icon"], - "requires_credential": connector["requires_credential"], - "installed": connector["definition"]["name"] in installed_names, - "tool_name": connector["definition"]["name"], - "setup_guide": connector.get("setup_guide", ""), - } - catalog.append(entry) - return catalog - - @router.post("/catalog/{connector_id}/install") - async def install_connector(connector_id: str, body: dict[str, Any] | None = None) -> dict[str, Any]: - """Install a pre-built connector as a custom tool.""" - connector = next((c for c in _CONNECTOR_CATALOG if c["id"] == connector_id), None) - if connector is None: - raise HTTPException(status_code=404, detail=f"Connector '{connector_id}' not found") - - defn_data = dict(connector["definition"]) - - # Resolve credential placeholders from settings - if connector.get("requires_credential"): - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings() - cred_field = connector["requires_credential"] - cred_val = getattr(settings.tool_credentials, cred_field, None) - if cred_val is not None: - secret = cred_val.get_secret_value() - for key, val in defn_data.items(): - if isinstance(val, str): - placeholder = f"__{cred_field.upper()}__" - defn_data[key] = val.replace(placeholder, secret) - - # Apply user overrides (e.g., webhook_url for Discord/Teams) - if body: - for key in ("webhook_url", "api_base_url", "api_path", "api_auth_value", "name"): - if key in body and body[key]: - defn_data[key] = body[key] - - params = [ToolParameter(**p) for p in defn_data.pop("parameters", [])] - definition = CustomToolDefinition(**defn_data, parameters=params) - manager.save(definition) - - # Register at runtime - try: - tool = manager.create_runtime_tool(definition) - from fireflyframework_agentic.tools.registry import tool_registry - - tool_registry.register(tool) - except Exception: - pass - - return {"status": "installed", "tool_name": f"custom:{definition.name}"} - - @router.post("/catalog/{connector_id}/verify") - async def verify_connector(connector_id: str) -> dict[str, Any]: - """Verify a connector's credentials by making a test API call.""" - import httpx - - connector = next((c for c in _CONNECTOR_CATALOG if c["id"] == connector_id), None) - if connector is None: - raise HTTPException(status_code=404, detail=f"Connector '{connector_id}' not found") - - verify_method = connector.get("verify_method", "") - if not verify_method: - return {"status": "ok", "message": "No verification available for this connector."} - - # Resolve credential if needed - token = "" - if connector.get("requires_credential"): - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings() - cred_field = connector["requires_credential"] - cred_val = getattr(settings.tool_credentials, cred_field, None) - if cred_val is None: - return { - "status": "error", - "message": f"Missing credential: {cred_field}. Configure it in Tool Credentials.", - } - token = cred_val.get_secret_value() - if not token: - return { - "status": "error", - "message": f"Credential '{cred_field}' is empty. Configure it in Tool Credentials.", - } - - # For webhook-based connectors (Discord, Teams), check the installed tool URL - if verify_method == "head": - installed_tools = manager.list_all() - tool_name = connector["definition"]["name"] - tool_def = next((t for t in installed_tools if t.name == tool_name), None) - if tool_def is None: - return {"status": "error", "message": "Connector not installed yet. Install it first."} - url = tool_def.webhook_url or tool_def.api_base_url - if not url: - return {"status": "error", "message": "No URL configured for this connector."} - try: - async with httpx.AsyncClient(timeout=10.0) as client: - resp = await client.head(url) - if resp.status_code < 400: - return {"status": "ok", "message": f"Webhook reachable (HTTP {resp.status_code})."} - return {"status": "error", "message": f"Webhook returned HTTP {resp.status_code}."} - except httpx.RequestError as exc: - return {"status": "error", "message": f"Connection failed: {exc}"} - - # Bearer token verification - if verify_method == "bearer": - verify_url = connector.get("verify_url", "") - if not verify_url or not token: - return {"status": "error", "message": "Missing verify URL or token."} - try: - async with httpx.AsyncClient(timeout=10.0) as client: - resp = await client.get( - verify_url, - headers={"Authorization": f"Bearer {token}"}, - ) - if resp.status_code == 200: - return {"status": "ok", "message": "Credentials verified successfully."} - return {"status": "error", "message": f"Verification failed (HTTP {resp.status_code})."} - except httpx.RequestError as exc: - return {"status": "error", "message": f"Connection failed: {exc}"} - - # URL-embedded token (Telegram style) - if verify_method == "url_token": - verify_url = connector.get("verify_url", "").replace("{token}", token) - if not verify_url: - return {"status": "error", "message": "Missing verify URL."} - try: - async with httpx.AsyncClient(timeout=10.0) as client: - resp = await client.get(verify_url) - if resp.status_code == 200: - return {"status": "ok", "message": "Bot token verified successfully."} - return {"status": "error", "message": f"Verification failed (HTTP {resp.status_code})."} - except httpx.RequestError as exc: - return {"status": "error", "message": f"Connection failed: {exc}"} - - return {"status": "ok", "message": "Verification not implemented for this connector type."} - - # ---- Dynamic path routes ---- - - @router.get("/{name}") - async def get_tool(name: str) -> dict[str, Any]: - try: - tool = manager.load(name) - except FileNotFoundError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - result = asdict(tool) - # Include inline Python code if this is a Python tool - if tool.tool_type == "python" and tool.module_path: - from pathlib import Path - - py_path = Path(tool.module_path) - if py_path.is_file(): - try: - result["python_code"] = py_path.read_text(encoding="utf-8") - except Exception: - result["python_code"] = "" - else: - result["python_code"] = "" - return result - - @router.post("") - async def save_tool(body: SaveToolRequest) -> dict[str, Any]: - from pathlib import Path - - module_path = body.module_path - - # If inline Python code is provided, write it to a .py file - if body.tool_type == "python" and body.python_code.strip(): - tools_dir = Path.home() / ".firefly-studio" / "custom_tools" - tools_dir.mkdir(parents=True, exist_ok=True) - py_path = tools_dir / f"{body.name}.py" - py_path.write_text(body.python_code, encoding="utf-8") - module_path = str(py_path) - - definition = CustomToolDefinition( - name=body.name, - description=body.description, - tool_type=body.tool_type, - tags=body.tags, - parameters=[ - ToolParameter( - name=p.name, - type=p.type, - description=p.description, - required=p.required, - default=p.default, - ) - for p in body.parameters - ], - module_path=module_path, - webhook_url=body.webhook_url, - webhook_method=body.webhook_method, - webhook_headers=body.webhook_headers, - api_base_url=body.api_base_url, - api_path=body.api_path, - api_method=body.api_method, - api_auth_type=body.api_auth_type, - api_auth_value=body.api_auth_value, - api_headers=body.api_headers, - ) - - # Try to preserve created_at from existing definition - try: - existing = manager.load(body.name) - definition.created_at = existing.created_at - except FileNotFoundError: - pass - - manager.save(definition) - - # Auto-register if possible - try: - tool = manager.create_runtime_tool(definition) - from fireflyframework_agentic.tools.registry import tool_registry - - tool_registry.register(tool) - except Exception: - pass # Registration may fail for incomplete definitions - - return asdict(definition) - - @router.delete("/{name}") - async def delete_tool(name: str) -> dict[str, str]: - try: - manager.delete(name) - except FileNotFoundError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - return {"status": "deleted"} - - @router.post("/{name}/test") - async def test_tool(name: str) -> dict[str, Any]: - """Send a test request to a custom tool and return the result.""" - try: - definition = manager.load(name) - except FileNotFoundError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - - try: - tool = manager.create_runtime_tool(definition) - handler = tool.pydantic_handler() - import asyncio - import time - - start = time.monotonic() - result = await asyncio.wait_for(handler(), timeout=15.0) - elapsed = round(time.monotonic() - start, 2) - return { - "status": "success", - "tool_name": tool.name, - "response_time": elapsed, - "result": str(result)[:1000], - } - except TimeoutError: - return {"status": "timeout", "tool_name": f"custom:{name}", "error": "Request timed out after 15s"} - except Exception as exc: - return {"status": "error", "tool_name": f"custom:{name}", "error": str(exc)} - - @router.post("/{name}/register") - async def register_tool(name: str) -> dict[str, str]: - try: - definition = manager.load(name) - except FileNotFoundError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - - try: - tool = manager.create_runtime_tool(definition) - from fireflyframework_agentic.tools.registry import tool_registry - - tool_registry.register(tool) - except Exception as exc: - raise HTTPException( - status_code=400, - detail=f"Failed to register tool: {exc}", - ) from exc - - return {"status": "registered", "tool_name": tool.name} - - return router diff --git a/src/fireflyframework_agentic/studio/api/evaluate.py b/src/fireflyframework_agentic/studio/api/evaluate.py deleted file mode 100644 index a0e07c16..00000000 --- a/src/fireflyframework_agentic/studio/api/evaluate.py +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Evaluation REST API endpoints for Firefly Agentic Studio. - -Provides endpoints for uploading JSONL test datasets, listing datasets -within a project, and running a pipeline against a dataset to measure -quality. -""" - -from __future__ import annotations - -import json -from typing import Any - -from fastapi import APIRouter, HTTPException, UploadFile # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.evaluation import ( - EvaluationResult, - load_dataset, - run_evaluation, -) -from fireflyframework_agentic.studio.projects import ProjectManager - - -def create_evaluate_router(manager: ProjectManager) -> APIRouter: - """Create an :class:`APIRouter` for evaluation endpoints. - - Endpoints - --------- - ``POST /api/projects/{name}/datasets/upload`` - Upload a JSONL test dataset to a project. - ``GET /api/projects/{name}/datasets`` - List available datasets for a project. - ``POST /api/evaluate/run`` - Run a pipeline graph against a dataset and return results. - """ - router = APIRouter(prefix="/api", tags=["evaluate"]) - - @router.post("/projects/{name}/datasets/upload") - async def upload_dataset(name: str, file: UploadFile) -> dict[str, Any]: - """Upload a JSONL dataset file to a project's datasets directory.""" - try: - project_dir = manager._safe_path(name) - except ValueError as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - if not project_dir.is_dir(): - raise HTTPException(status_code=404, detail=f"Project '{name}' not found") - - if not file.filename or not file.filename.endswith((".jsonl", ".json")): - raise HTTPException(status_code=400, detail="File must be a .jsonl or .json file") - - datasets_dir = project_dir / "datasets" - datasets_dir.mkdir(exist_ok=True) - - content = await file.read() - try: - text = content.decode("utf-8") - except UnicodeDecodeError as exc: - raise HTTPException(status_code=400, detail="File must be UTF-8 encoded") from exc - - # Validate the JSONL format - line_count = 0 - for lineno, line in enumerate(text.strip().splitlines(), start=1): - line = line.strip() - if not line: - continue - try: - obj = json.loads(line) - except json.JSONDecodeError as exc: - raise HTTPException(status_code=400, detail=f"Invalid JSON on line {lineno}: {exc}") from exc - if "input" not in obj: - raise HTTPException(status_code=400, detail=f"Line {lineno} is missing required 'input' field") - line_count += 1 - - if line_count == 0: - raise HTTPException(status_code=400, detail="Dataset file is empty") - - dest = datasets_dir / file.filename - dest.write_text(text, encoding="utf-8") - - return {"filename": file.filename, "test_cases": line_count, "status": "uploaded"} - - @router.get("/projects/{name}/datasets") - async def list_datasets(name: str) -> list[dict[str, Any]]: - """List available JSONL datasets in a project.""" - try: - project_dir = manager._safe_path(name) - except ValueError as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - if not project_dir.is_dir(): - raise HTTPException(status_code=404, detail=f"Project '{name}' not found") - - datasets_dir = project_dir / "datasets" - if not datasets_dir.is_dir(): - return [] - - results: list[dict[str, Any]] = [] - for path in sorted(datasets_dir.iterdir()): - if path.is_file() and path.suffix in {".jsonl", ".json"}: - # Count lines to show test case count - text = path.read_text(encoding="utf-8", errors="replace") - line_count = sum(1 for ln in text.strip().splitlines() if ln.strip()) - results.append( - { - "filename": path.name, - "test_cases": line_count, - "size": path.stat().st_size, - } - ) - - return results - - @router.post("/evaluate/run") - async def run_eval(body: dict[str, Any]) -> dict[str, Any]: - """Run a pipeline against a dataset and return evaluation results. - - Request body: - ``project``: Project name containing the dataset. - ``dataset``: Dataset filename (e.g. ``"my-tests.jsonl"``). - ``graph``: The pipeline graph to evaluate. - """ - project_name = body.get("project") - dataset_name = body.get("dataset") - graph_data = body.get("graph") - - if not project_name or not dataset_name or not graph_data: - raise HTTPException( - status_code=400, - detail="Request body must include 'project', 'dataset', and 'graph'", - ) - - try: - project_dir = manager._safe_path(str(project_name)) - except ValueError as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - dataset_path = project_dir / "datasets" / str(dataset_name) - if not dataset_path.is_file(): - raise HTTPException(status_code=404, detail=f"Dataset '{dataset_name}' not found") - - try: - cases = load_dataset(dataset_path) - except ValueError as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - result: EvaluationResult = await run_evaluation(graph_data, cases) - result.dataset_name = str(dataset_name) - - return { - "dataset": result.dataset_name, - "total": result.total, - "passed": result.passed, - "failed": result.failed, - "error_count": result.error_count, - "pass_rate": result.pass_rate, - "results": [ - { - "input": r.input, - "expected_output": r.expected_output, - "actual_output": r.actual_output, - "passed": r.passed, - "error": r.error, - } - for r in result.results - ], - } - - return router diff --git a/src/fireflyframework_agentic/studio/api/execution.py b/src/fireflyframework_agentic/studio/api/execution.py deleted file mode 100644 index c6d71aa5..00000000 --- a/src/fireflyframework_agentic/studio/api/execution.py +++ /dev/null @@ -1,198 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""WebSocket endpoint for real-time pipeline execution in Firefly Agentic Studio. - -Provides a ``/ws/execution`` WebSocket route that accepts JSON messages, -compiles a :class:`GraphModel` into a :class:`PipelineEngine`, runs it, -and streams execution events back to the frontend in real time. -""" - -from __future__ import annotations - -import asyncio -import json -import logging -import time - -from fastapi import APIRouter, WebSocket, WebSocketDisconnect # type: ignore[import-not-found] - -from fireflyframework_agentic.pipeline.context import PipelineContext -from fireflyframework_agentic.studio.codegen.models import GraphModel, NodeType -from fireflyframework_agentic.studio.config import StudioConfig -from fireflyframework_agentic.studio.execution.compiler import CompilationError, compile_graph -from fireflyframework_agentic.studio.execution.runner import StudioEventHandler - -logger = logging.getLogger(__name__) - - -def create_execution_router() -> APIRouter: - """Create an :class:`APIRouter` with the execution WebSocket endpoint. - - Endpoints - --------- - ``WS /ws/execution`` - Accept a WebSocket connection. On receiving a JSON message with - ``"action": "run"`` or ``"action": "debug"``, compile the attached - graph into a pipeline and execute it, streaming events back. - """ - router = APIRouter(tags=["execution"]) - - @router.websocket("/ws/execution") - async def execution_ws(websocket: WebSocket) -> None: - await websocket.accept() - logger.info("Execution WebSocket connected") - - try: - while True: - raw = await websocket.receive_text() - try: - message = json.loads(raw) - except json.JSONDecodeError: - await websocket.send_json({"type": "error", "message": "Invalid JSON"}) - continue - - action = message.get("action") - - if action in ("run", "debug"): - await _handle_execution(websocket, message, debug=action == "debug") - else: - await websocket.send_json({"type": "error", "message": f"Unknown action: {action}"}) - except WebSocketDisconnect: - logger.info("Execution WebSocket disconnected") - - return router - - -async def _handle_execution(websocket: WebSocket, message: dict, *, debug: bool) -> None: - """Compile the graph, run the pipeline, and stream events.""" - graph_data = message.get("graph") - if not graph_data: - await websocket.send_json({"type": "error", "message": "No 'graph' provided in message"}) - return - - # Parse and validate the graph - try: - graph = GraphModel.model_validate(graph_data) - except Exception as exc: - await websocket.send_json({"type": "error", "message": f"Invalid graph: {exc}"}) - return - - # Compile graph into a PipelineEngine - handler = StudioEventHandler() - try: - engine = compile_graph(graph, event_handler=handler) - except CompilationError as exc: - await websocket.send_json({"type": "error", "message": f"Compilation error: {exc}"}) - return - - # Prepare inputs - inputs = message.get("inputs") - project_name = message.get("project") - - # Wire MemoryManager when memory nodes are present - memory = None - has_memory = any(n.type == NodeType.MEMORY for n in graph.nodes) - if has_memory and project_name: - try: - from fireflyframework_agentic.memory.manager import MemoryManager - from fireflyframework_agentic.memory.store import FileStore - - config = StudioConfig() - memory_dir = config.projects_dir / project_name / "memory" - memory_dir.mkdir(parents=True, exist_ok=True) - memory = MemoryManager(store=FileStore(base_dir=str(memory_dir))) - except Exception as exc: - logger.warning("Could not initialise MemoryManager: %s", exc) - - context = PipelineContext(inputs=inputs, memory=memory) - - # Wire checkpoint manager for debug mode - if debug: - checkpoint_mgr = getattr(websocket.app.state, "checkpoint_manager", None) - if checkpoint_mgr is not None: - checkpoint_mgr.clear() - await websocket.send_json({"type": "debug_enabled", "message": "Debug mode active"}) - - # Launch the pipeline in a background task - t0 = time.monotonic() - run_task = asyncio.create_task(engine.run(context, inputs=inputs)) - - # Stream events until pipeline completes - try: - while not run_task.done(): - await handler.wait_for_event(0.5) - events = handler.drain_events() - for event in events: - await websocket.send_json(event) - # Create checkpoints for debug mode - if debug and event.get("type") == "node_complete": - checkpoint_mgr = getattr(websocket.app.state, "checkpoint_manager", None) - if checkpoint_mgr is not None: - node_id = event.get("node_id", "") - result = context.get_node_result(node_id) - cp = checkpoint_mgr.create( - node_id=node_id, - state={"output": result.output if hasattr(result, "output") else result}, - inputs=dict(context.results), - ) - await websocket.send_json( - { - "type": "checkpoint_created", - "index": cp.index, - "node_id": cp.node_id, - "state": cp.state, - "inputs": cp.inputs, - "timestamp": cp.timestamp, - "branch_id": getattr(cp, "branch_id", None), - "parent_index": getattr(cp, "parent_index", None), - } - ) - - # Drain any remaining events after completion - events = handler.drain_events() - for event in events: - await websocket.send_json(event) - - # Get the result - result = await run_task - duration_ms = (time.monotonic() - t0) * 1000 - - await websocket.send_json( - { - "type": "pipeline_result", - "success": result.success, - "output": str(result.final_output) if result.final_output is not None else None, - "duration_ms": round(duration_ms, 2), - "pipeline_name": result.pipeline_name, - } - ) - - except Exception as exc: - duration_ms = (time.monotonic() - t0) * 1000 - logger.exception("Pipeline execution failed") - - # Cancel the task if it's still running - if not run_task.done(): - run_task.cancel() - - await websocket.send_json( - { - "type": "pipeline_result", - "success": False, - "output": str(exc), - "duration_ms": round(duration_ms, 2), - "pipeline_name": graph.metadata.get("name", "studio-pipeline"), - } - ) diff --git a/src/fireflyframework_agentic/studio/api/experiments.py b/src/fireflyframework_agentic/studio/api/experiments.py deleted file mode 100644 index 64503d86..00000000 --- a/src/fireflyframework_agentic/studio/api/experiments.py +++ /dev/null @@ -1,184 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Experiments REST API endpoints for Firefly Agentic Studio. - -Provides CRUD operations for A/B experiment definitions and a manual -``run-variant`` action. Advanced features such as automatic traffic -splitting and statistical analysis are planned for a future release. -""" - -from __future__ import annotations - -import json -import uuid -from datetime import UTC, datetime -from typing import Any - -from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.projects import ProjectManager - - -def create_experiments_router(manager: ProjectManager) -> APIRouter: - """Create an :class:`APIRouter` for experiment management. - - Endpoints - --------- - ``GET /api/projects/{name}/experiments`` - List all experiments in a project. - ``POST /api/projects/{name}/experiments`` - Create a new experiment. - ``GET /api/projects/{name}/experiments/{exp_id}`` - Get a single experiment. - ``DELETE /api/projects/{name}/experiments/{exp_id}`` - Delete an experiment. - ``POST /api/projects/{name}/experiments/{exp_id}/run`` - Run a specific variant of an experiment. - """ - router = APIRouter(prefix="/api/projects", tags=["experiments"]) - - def _experiments_dir(project_name: str) -> Any: - """Return the experiments directory for a project, creating it if needed.""" - from pathlib import Path - - try: - project_dir = manager._safe_path(project_name) - except ValueError as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - if not project_dir.is_dir(): - raise HTTPException(status_code=404, detail=f"Project '{project_name}' not found") - - exp_dir: Path = project_dir / "experiments" - exp_dir.mkdir(exist_ok=True) - return exp_dir - - def _load_experiment(exp_dir: Any, exp_id: str) -> dict[str, Any]: - """Load a single experiment JSON file.""" - path = exp_dir / f"{exp_id}.json" - if not path.is_file(): - raise HTTPException(status_code=404, detail=f"Experiment '{exp_id}' not found") - return json.loads(path.read_text(encoding="utf-8")) - - @router.get("/{name}/experiments") - async def list_experiments(name: str) -> list[dict[str, Any]]: - exp_dir = _experiments_dir(name) - results: list[dict[str, Any]] = [] - for path in sorted(exp_dir.iterdir()): - if path.is_file() and path.suffix == ".json": - data = json.loads(path.read_text(encoding="utf-8")) - results.append(data) - return results - - @router.post("/{name}/experiments") - async def create_experiment(name: str, body: dict[str, Any]) -> dict[str, Any]: - exp_dir = _experiments_dir(name) - - exp_name = body.get("name") - if not exp_name: - raise HTTPException(status_code=400, detail="Experiment 'name' is required") - - variants = body.get("variants", []) - if not variants or not isinstance(variants, list): - raise HTTPException(status_code=400, detail="At least one variant is required") - - exp_id = uuid.uuid4().hex[:12] - experiment: dict[str, Any] = { - "id": exp_id, - "name": exp_name, - "status": "draft", - "created_at": datetime.now(UTC).isoformat(), - "variants": [ - { - "name": v.get("name", f"Variant {chr(65 + i)}"), - "pipeline": v.get("pipeline", ""), - "traffic": v.get("traffic", round(100 / len(variants))), - } - for i, v in enumerate(variants) - ], - } - - path = exp_dir / f"{exp_id}.json" - path.write_text(json.dumps(experiment, indent=2), encoding="utf-8") - return experiment - - @router.get("/{name}/experiments/{exp_id}") - async def get_experiment(name: str, exp_id: str) -> dict[str, Any]: - exp_dir = _experiments_dir(name) - return _load_experiment(exp_dir, exp_id) - - @router.delete("/{name}/experiments/{exp_id}") - async def delete_experiment(name: str, exp_id: str) -> dict[str, str]: - exp_dir = _experiments_dir(name) - path = exp_dir / f"{exp_id}.json" - if not path.is_file(): - raise HTTPException(status_code=404, detail=f"Experiment '{exp_id}' not found") - path.unlink() - return {"status": "deleted"} - - @router.post("/{name}/experiments/{exp_id}/run") - async def run_variant(name: str, exp_id: str, body: dict[str, Any]) -> dict[str, Any]: - """Run a single variant of an experiment manually. - - Request body: - ``variant_name``: Name of the variant to run. - ``input``: The input to feed to the pipeline. - ``graph``: The pipeline graph for this variant. - """ - exp_dir = _experiments_dir(name) - experiment = _load_experiment(exp_dir, exp_id) - - variant_name = body.get("variant_name") - graph_data = body.get("graph") - input_data = body.get("input", "") - - if not variant_name or not graph_data: - raise HTTPException(status_code=400, detail="Request body must include 'variant_name' and 'graph'") - - # Verify variant exists - matching = [v for v in experiment["variants"] if v["name"] == variant_name] - if not matching: - raise HTTPException( - status_code=404, - detail=f"Variant '{variant_name}' not found in experiment '{exp_id}'", - ) - - from fireflyframework_agentic.studio.codegen.models import GraphModel - from fireflyframework_agentic.studio.execution.compiler import CompilationError, compile_graph - - graph = GraphModel.model_validate(graph_data) - try: - engine = compile_graph(graph) - except CompilationError as exc: - raise HTTPException(status_code=400, detail=f"Compilation error: {exc}") from exc - - try: - result = await engine.run(inputs=input_data) - except Exception as exc: - raise HTTPException(status_code=500, detail=f"Execution error: {exc}") from exc - - output = "" - if result.outputs: - last_node = list(result.outputs.values())[-1] - output = str(last_node.output) if last_node.output is not None else "" - - return { - "experiment_id": exp_id, - "variant_name": variant_name, - "success": result.success, - "output": output, - } - - return router diff --git a/src/fireflyframework_agentic/studio/api/files.py b/src/fireflyframework_agentic/studio/api/files.py deleted file mode 100644 index ba8dcadb..00000000 --- a/src/fireflyframework_agentic/studio/api/files.py +++ /dev/null @@ -1,162 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""File browsing REST API endpoints for Firefly Agentic Studio. - -Provides read-only access to project files so the Studio frontend can -display a file explorer with content preview. -""" - -from __future__ import annotations - -from pathlib import Path -from typing import Any - -from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.projects import ProjectManager - -# Directories to exclude from recursive file listings. -_EXCLUDED_DIRS: set[str] = { - "__pycache__", - ".git", - "node_modules", - ".env", - ".venv", - ".tox", - ".mypy_cache", - ".ruff_cache", -} - -# Maximum file size (in bytes) we are willing to read into memory for preview. -_MAX_READ_SIZE: int = 2 * 1024 * 1024 # 2 MiB - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _resolve_project_dir(manager: ProjectManager, project_name: str) -> Path: - """Return the resolved project directory, raising 404 if it does not exist.""" - try: - project_dir = manager._safe_path(project_name) - except ValueError as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - if not project_dir.is_dir(): - raise HTTPException(status_code=404, detail=f"Project '{project_name}' not found") - return project_dir - - -def _validate_within_project(project_dir: Path, resolved: Path) -> None: - """Raise 403 if *resolved* escapes *project_dir*.""" - try: - resolved.relative_to(project_dir) - except ValueError as exc: - raise HTTPException(status_code=403, detail="Path escapes the project directory") from exc - - -def _is_text_file(path: Path) -> bool: - """Heuristic: read a small chunk and check for null bytes (binary indicator).""" - try: - chunk = path.read_bytes()[:8192] - return b"\x00" not in chunk - except OSError: - return False - - -def _collect_entries(root: Path, base: Path) -> list[dict[str, Any]]: - """Recursively collect file/directory entries under *root*, relative to *base*.""" - entries: list[dict[str, Any]] = [] - try: - children = sorted(root.iterdir(), key=lambda p: (not p.is_dir(), p.name.lower())) - except PermissionError: - return entries - - for child in children: - if child.name in _EXCLUDED_DIRS: - continue - # Skip hidden files/dirs (dotfiles) except common config files - if child.name.startswith(".") and child.name not in {".gitignore", ".env.example"}: - continue - - relative = child.relative_to(base) - is_dir = child.is_dir() - - entry: dict[str, Any] = { - "path": str(relative), - "name": child.name, - "is_dir": is_dir, - "size": 0 if is_dir else child.stat().st_size, - } - entries.append(entry) - - if is_dir: - entries.extend(_collect_entries(child, base)) - - return entries - - -# --------------------------------------------------------------------------- -# Router factory -# --------------------------------------------------------------------------- - - -def create_files_router(manager: ProjectManager) -> APIRouter: - """Create an :class:`APIRouter` for project file browsing. - - Endpoints - --------- - ``GET /api/projects/{name}/files`` - Recursive listing of all files in the project directory. - ``GET /api/projects/{name}/files/{path:path}`` - Read a single file's text content. - """ - router = APIRouter(prefix="/api/projects", tags=["files"]) - - @router.get("/{name}/files") - async def list_files(name: str) -> list[dict[str, Any]]: - project_dir = _resolve_project_dir(manager, name) - return _collect_entries(project_dir, project_dir) - - @router.get("/{name}/files/{file_path:path}") - async def read_file(name: str, file_path: str) -> dict[str, Any]: - project_dir = _resolve_project_dir(manager, name) - resolved = (project_dir / file_path).resolve() - - _validate_within_project(project_dir, resolved) - - if not resolved.is_file(): - raise HTTPException(status_code=404, detail=f"File not found: {file_path}") - - size = resolved.stat().st_size - if size > _MAX_READ_SIZE: - raise HTTPException(status_code=413, detail="File too large to preview") - - if not _is_text_file(resolved): - raise HTTPException(status_code=422, detail="Binary files cannot be previewed") - - try: - content = resolved.read_text(encoding="utf-8", errors="replace") - except OSError as exc: - raise HTTPException(status_code=500, detail=f"Failed to read file: {exc}") from exc - - return { - "path": file_path, - "content": content, - "size": size, - } - - return router diff --git a/src/fireflyframework_agentic/studio/api/graphql_api.py b/src/fireflyframework_agentic/studio/api/graphql_api.py deleted file mode 100644 index c6eac77a..00000000 --- a/src/fireflyframework_agentic/studio/api/graphql_api.py +++ /dev/null @@ -1,225 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Strawberry GraphQL endpoint for Firefly Agentic Studio. - -Provides a ``/api/graphql`` endpoint with Query and Mutation types that -mirror the REST project and runtime APIs. Strawberry is treated as an -optional dependency -- when it is not installed the router falls back to -a stub that returns 501 Not Implemented. - -.. note:: - - This module intentionally does **not** use - ``from __future__ import annotations`` because Strawberry requires - concrete type objects at class-definition time in order to build the - GraphQL schema. Postponed evaluation (PEP 563) turns annotations - into strings, which breaks Strawberry's type resolution for classes - defined inside a function scope. -""" - -import logging -from typing import Any - -from fireflyframework_agentic.studio.projects import ProjectManager - -logger = logging.getLogger(__name__) - - -def create_graphql_router(project_manager: ProjectManager) -> Any: - """Create a Strawberry :class:`GraphQLRouter` for Studio. - - When ``strawberry-graphql`` is not installed, returns a plain - :class:`~fastapi.APIRouter` with a single ``POST /api/graphql`` - endpoint that returns a 501 error. - - Parameters - ---------- - project_manager: - The :class:`ProjectManager` used to list projects and load - pipelines. - - Returns - ------- - A router (either Strawberry ``GraphQLRouter`` or a fallback - ``APIRouter``) that should be included in the FastAPI app. - """ - try: - import strawberry - from strawberry.fastapi import GraphQLRouter - except ImportError: - logger.warning("strawberry-graphql is not installed; GraphQL endpoint disabled") - from fastapi import APIRouter # type: ignore[import-not-found] - - router = APIRouter() - - @router.post("/api/graphql") - async def graphql_not_available() -> dict[str, str]: - return {"error": "GraphQL not available. Install strawberry-graphql."} - - return router - - # ------------------------------------------------------------------ - # Strawberry types - # ------------------------------------------------------------------ - - @strawberry.type - class Project: - name: str - description: str - created_at: str - - @strawberry.type - class RuntimeStatus: - project: str - status: str - trigger_type: str | None - consumers: int - scheduler_active: bool - - @strawberry.type - class ExecutionResult: - execution_id: str - status: str - result: str | None - duration_ms: float | None - - # ------------------------------------------------------------------ - # Query resolvers - # ------------------------------------------------------------------ - - @strawberry.type - class Query: - @strawberry.field - def projects(self) -> list[Project]: - """List all Studio projects.""" - return [ - Project( - name=p.name, - description=p.description, - created_at=p.created_at, - ) - for p in project_manager.list_all() - ] - - @strawberry.field - def project(self, name: str) -> Project | None: - """Fetch a single project by name, or *None* if not found.""" - for p in project_manager.list_all(): - if p.name == name: - return Project( - name=p.name, - description=p.description, - created_at=p.created_at, - ) - return None - - @strawberry.field - def runtime_status(self, project: str) -> RuntimeStatus: - """Return the runtime status for a project. - - If no runtime is active, returns a default "stopped" status. - """ - from fireflyframework_agentic.studio.api.project_api import _runtimes - - runtime = _runtimes.get(project) - if runtime is not None: - info = runtime.get_status() - return RuntimeStatus( - project=info["project"], - status=info["status"], - trigger_type=info.get("trigger_type"), - consumers=info.get("consumers", 0), - scheduler_active=info.get("scheduler_active", False), - ) - - return RuntimeStatus( - project=project, - status="stopped", - trigger_type=None, - consumers=0, - scheduler_active=False, - ) - - # ------------------------------------------------------------------ - # Mutation resolvers - # ------------------------------------------------------------------ - - @strawberry.type - class Mutation: - @strawberry.mutation - async def run_pipeline(self, project: str, input: str) -> ExecutionResult: - """Execute the project's main pipeline synchronously. - - The *input* parameter is passed as a plain string to the - compiled pipeline engine. - """ - import time - import uuid - - from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - ) - from fireflyframework_agentic.studio.execution.compiler import compile_graph - - execution_id = str(uuid.uuid4()) - - # Load the project's main pipeline graph - try: - graph_dict = project_manager.load_pipeline(project, "main") - except FileNotFoundError: - return ExecutionResult( - execution_id=execution_id, - status="error", - result=f"Pipeline 'main' not found in project '{project}'", - duration_ms=None, - ) - - nodes = [GraphNode(**n) for n in graph_dict.get("nodes", [])] - edges = [GraphEdge(**e) for e in graph_dict.get("edges", [])] - graph_model = GraphModel( - nodes=nodes, - edges=edges, - metadata=graph_dict.get("metadata", {}), - ) - - start_time = time.monotonic() - try: - engine = compile_graph(graph_model) - result = await engine.run(inputs=input) - duration_ms = round((time.monotonic() - start_time) * 1000, 2) - return ExecutionResult( - execution_id=execution_id, - status="completed", - result=str(result) if result is not None else None, - duration_ms=duration_ms, - ) - except Exception as exc: - duration_ms = round((time.monotonic() - start_time) * 1000, 2) - logger.exception("GraphQL run_pipeline failed for project '%s'", project) - return ExecutionResult( - execution_id=execution_id, - status="error", - result=str(exc), - duration_ms=duration_ms, - ) - - # ------------------------------------------------------------------ - # Build schema and return router - # ------------------------------------------------------------------ - - schema = strawberry.Schema(query=Query, mutation=Mutation) - return GraphQLRouter(schema, path="/api/graphql") diff --git a/src/fireflyframework_agentic/studio/api/monitoring.py b/src/fireflyframework_agentic/studio/api/monitoring.py deleted file mode 100644 index b6930abb..00000000 --- a/src/fireflyframework_agentic/studio/api/monitoring.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Monitoring API endpoints for Firefly Agentic Studio. - -Exposes the framework's usage tracking data so the Studio frontend can -display cost, token, and latency metrics in the monitoring dashboard. -""" - -from __future__ import annotations - -from typing import Any - -from fastapi import APIRouter # type: ignore[import-not-found] - - -def create_monitoring_router() -> APIRouter: - """Create an :class:`APIRouter` that serves monitoring data. - - Endpoints - --------- - ``GET /api/monitoring/usage`` - Return an aggregated :class:`UsageSummary` dict from the - default usage tracker. - """ - router = APIRouter(prefix="/api/monitoring", tags=["monitoring"]) - - @router.get("/usage") - async def get_usage() -> dict[str, Any]: - from fireflyframework_agentic.observability.usage import default_usage_tracker - - return default_usage_tracker.get_summary().model_dump() - - return router diff --git a/src/fireflyframework_agentic/studio/api/oracle.py b/src/fireflyframework_agentic/studio/api/oracle.py deleted file mode 100644 index b3c89f26..00000000 --- a/src/fireflyframework_agentic/studio/api/oracle.py +++ /dev/null @@ -1,389 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Oracle API endpoints: WebSocket for real-time analysis, REST for insights. - -The Oracle observes pipeline state and produces structured insights -(suggestions, warnings, critical issues). Users can approve or skip -each insight. Approved insights are forwarded to The Architect. -""" - -from __future__ import annotations - -import json -import logging -from dataclasses import asdict -from typing import Any - -from fastapi import APIRouter, HTTPException, Query, WebSocket, WebSocketDisconnect # type: ignore[import-not-found] -from pydantic import BaseModel # type: ignore[import-not-found] - -logger = logging.getLogger(__name__) - - -class _SaveChatHistoryBody(BaseModel): - messages: list[dict] - - -def create_oracle_router() -> APIRouter: - """Create an :class:`APIRouter` with Oracle endpoints. - - Endpoints - --------- - ``WS /ws/oracle`` - Real-time Oracle analysis via WebSocket. - ``GET /api/oracle/{project}/insights`` - List all insights for a project. - ``POST /api/oracle/{project}/insights/{insight_id}/approve`` - Mark an insight as approved and return its action_instruction. - ``POST /api/oracle/{project}/insights/{insight_id}/skip`` - Mark an insight as skipped. - """ - router = APIRouter(tags=["oracle"]) - - # ------------------------------------------------------------------ - # REST endpoints - # ------------------------------------------------------------------ - - @router.get("/api/oracle/{project}/insights") - async def get_insights(project: str): - from fireflyframework_agentic.studio.assistant.oracle_notifications import ( - list_insights, - ) - - insights = list_insights(project) - return [asdict(i) for i in insights] - - @router.post("/api/oracle/{project}/insights/{insight_id}/approve") - async def approve_insight(project: str, insight_id: str): - from fireflyframework_agentic.studio.assistant.oracle_notifications import ( - update_insight_status, - ) - - updated = update_insight_status(project, insight_id, "approved") - if updated is None: - raise HTTPException(status_code=404, detail="Insight not found") - return { - "status": "approved", - "action_instruction": updated.action_instruction, - } - - @router.post("/api/oracle/{project}/insights/{insight_id}/skip") - async def skip_insight(project: str, insight_id: str): - from fireflyframework_agentic.studio.assistant.oracle_notifications import ( - update_insight_status, - ) - - updated = update_insight_status(project, insight_id, "skipped") - if updated is None: - raise HTTPException(status_code=404, detail="Insight not found") - return {"status": "skipped"} - - # ------------------------------------------------------------------ - # REST endpoints — Oracle chat history - # ------------------------------------------------------------------ - - @router.get("/api/oracle/{project}/chat-history") - async def get_oracle_chat_history(project: str): - from fireflyframework_agentic.studio.assistant.history import load_oracle_history - - return load_oracle_history(project) - - @router.post("/api/oracle/{project}/chat-history") - async def save_oracle_chat_history(project: str, body: _SaveChatHistoryBody): - from fireflyframework_agentic.studio.assistant.history import save_oracle_history - - save_oracle_history(project, body.messages) - return {"status": "saved"} - - @router.delete("/api/oracle/{project}/chat-history") - async def delete_oracle_chat_history(project: str): - from fireflyframework_agentic.studio.assistant.history import clear_oracle_history - - clear_oracle_history(project) - return {"status": "cleared"} - - # ------------------------------------------------------------------ - # WebSocket endpoint - # ------------------------------------------------------------------ - - @router.websocket("/ws/oracle") - async def oracle_ws(websocket: WebSocket, project: str = Query(default="")) -> None: - await websocket.accept() - logger.info("Oracle WebSocket connected (project=%s)", project) - - # Per-connection canvas state (populated from frontend sync) - canvas_state: dict[str, Any] = {"nodes": [], "edges": []} - - def _get_canvas() -> dict[str, Any]: - return canvas_state - - # Create the Oracle agent - try: - from fireflyframework_agentic.studio.assistant.oracle import ( - create_oracle_agent, - ) - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings() - user_name = settings.user_profile.name or "" - oracle = create_oracle_agent(_get_canvas, user_name=user_name) - except Exception as exc: - logger.error("Failed to create Oracle agent: %s", exc) - await websocket.send_json({"type": "error", "message": f"Oracle unavailable: {exc}"}) - await websocket.close() - return - - message_history: list[Any] = [] - - try: - while True: - raw = await websocket.receive_text() - try: - message = json.loads(raw) - except json.JSONDecodeError: - await websocket.send_json({"type": "error", "message": "Invalid JSON"}) - continue - - action = message.get("action") - - if action == "sync_canvas": - # Frontend sends current canvas state for Oracle to analyze - canvas_state["nodes"] = message.get("nodes", []) - canvas_state["edges"] = message.get("edges", []) - await websocket.send_json({"type": "canvas_synced"}) - - elif action == "analyze": - # Full pipeline review - try: - context_block = _build_shared_context_for_oracle(project, canvas_state) - result = await oracle.run( - context_block + "Analyze the current pipeline thoroughly. " - "Use analyze_pipeline, check_connectivity, and review_agent_setup " - "to gather data. Then use suggest_improvement for each issue or " - "recommendation you find. Consider the project purpose and " - "what the user discussed with The Architect when formulating " - "your insights.", - message_history=message_history, - ) - - if hasattr(result, "new_messages"): - message_history.extend(result.new_messages()) - - # Extract suggestions from tool calls - insights = _extract_oracle_insights(result) - for insight_data in insights: - from fireflyframework_agentic.studio.assistant.oracle_notifications import ( - add_insight, - create_insight, - ) - - insight = create_insight( - title=insight_data.get("title", "Insight"), - description=insight_data.get("description", ""), - severity=insight_data.get("severity", "suggestion"), - action_instruction=insight_data.get("action_instruction"), - ) - if project: - add_insight(project, insight) - - await websocket.send_json({"type": "insight", **asdict(insight)}) - - # Also send any text output - text_output = "" - if hasattr(result, "output"): - text_output = str(result.output) if result.output else "" - - await websocket.send_json( - { - "type": "analysis_complete", - "message": text_output, - "insight_count": len(insights), - } - ) - - except Exception as exc: - logger.error("Oracle analysis failed: %s", exc, exc_info=True) - await websocket.send_json({"type": "error", "message": f"Analysis failed: {exc}"}) - - elif action == "analyze_node": - # Single node analysis - node_id = message.get("node_id", "") - if not node_id: - await websocket.send_json({"type": "error", "message": "Missing node_id"}) - continue - - try: - context_block = _build_shared_context_for_oracle(project, canvas_state) - result = await oracle.run( - context_block + f"Analyze node '{node_id}' specifically. " - f"Use analyze_node_config to check its configuration, " - f"then suggest improvements if needed.", - message_history=message_history, - ) - - if hasattr(result, "new_messages"): - message_history.extend(result.new_messages()) - - insights = _extract_oracle_insights(result) - for insight_data in insights: - from fireflyframework_agentic.studio.assistant.oracle_notifications import ( - add_insight, - create_insight, - ) - - insight = create_insight( - title=insight_data.get("title", "Insight"), - description=insight_data.get("description", ""), - severity=insight_data.get("severity", "suggestion"), - action_instruction=insight_data.get("action_instruction"), - ) - if project: - add_insight(project, insight) - - await websocket.send_json({"type": "insight", **asdict(insight)}) - - text_output = "" - if hasattr(result, "output"): - text_output = str(result.output) if result.output else "" - - await websocket.send_json( - { - "type": "analysis_complete", - "message": text_output, - "insight_count": len(insights), - } - ) - - except Exception as exc: - logger.error("Oracle node analysis failed: %s", exc, exc_info=True) - await websocket.send_json({"type": "error", "message": f"Analysis failed: {exc}"}) - - elif action == "chat": - # Free-form conversational chat with The Oracle - user_msg = message.get("message", "").strip() - if not user_msg: - await websocket.send_json({"type": "error", "message": "Empty message"}) - continue - - try: - context_block = _build_shared_context_for_oracle(project, canvas_state) - result = await oracle.run( - context_block + user_msg, - message_history=message_history, - ) - - full_text = "" - if hasattr(result, "output"): - full_text = str(result.output) if result.output else "" - else: - full_text = str(result) - - if hasattr(result, "new_messages"): - message_history.extend(result.new_messages()) - - # Send response in chunks for frontend streaming effect - import asyncio - - _chunk_size = 12 - for i in range(0, len(full_text), _chunk_size): - chunk = full_text[i : i + _chunk_size] - await websocket.send_json({"type": "oracle_token", "content": chunk}) - await asyncio.sleep(0.01) - - # Extract any insights produced during chat - chat_insights = _extract_oracle_insights(result) - for insight_data in chat_insights: - from fireflyframework_agentic.studio.assistant.oracle_notifications import ( - add_insight, - create_insight, - ) - - insight = create_insight( - title=insight_data.get("title", "Insight"), - description=insight_data.get("description", ""), - severity=insight_data.get("severity", "suggestion"), - action_instruction=insight_data.get("action_instruction"), - ) - if project: - add_insight(project, insight) - await websocket.send_json({"type": "insight", **asdict(insight)}) - - await websocket.send_json( - { - "type": "oracle_response_complete", - "full_text": full_text, - } - ) - - except Exception as exc: - logger.error("Oracle chat failed: %s", exc, exc_info=True) - await websocket.send_json({"type": "error", "message": f"Oracle chat error: {exc}"}) - - else: - await websocket.send_json({"type": "error", "message": f"Unknown action: {action}"}) - - except WebSocketDisconnect: - logger.info("Oracle WebSocket disconnected") - - return router - - -def _extract_oracle_insights(result: Any) -> list[dict[str, Any]]: - """Extract suggestion data from Oracle tool call results.""" - insights: list[dict[str, Any]] = [] - try: - if not hasattr(result, "new_messages"): - return insights - for msg in result.new_messages(): - parts = getattr(msg, "parts", []) - for part in parts: - part_kind = getattr(part, "part_kind", "") - if part_kind == "tool-return": - tool_name = getattr(part, "tool_name", "") - if tool_name == "suggest_improvement": - content = getattr(part, "content", "") - try: - data = json.loads(content) - if data.get("type") == "suggestion": - insights.append(data) - except (json.JSONDecodeError, TypeError): - pass - elif tool_name == "analyze_pipeline": - content = getattr(part, "content", "") - try: - data = json.loads(content) - for issue in data.get("issues", []): - insights.append(issue) - except (json.JSONDecodeError, TypeError): - pass - except Exception as exc: - logger.warning("Could not extract Oracle insights: %s", exc) - return insights - - -def _build_shared_context_for_oracle(project: str, canvas_state: dict[str, Any]) -> str: - """Build cross-agent context for the Oracle using the shared builder. - - Replaces the old frontend-supplied context approach — context is now - assembled server-side from persisted conversation histories. - """ - try: - from fireflyframework_agentic.studio.assistant.shared_context import ( - build_shared_context, - ) - - return build_shared_context(project, canvas_state, exclude_agent="oracle") - except Exception: - return "" diff --git a/src/fireflyframework_agentic/studio/api/project_api.py b/src/fireflyframework_agentic/studio/api/project_api.py deleted file mode 100644 index 659dc5a0..00000000 --- a/src/fireflyframework_agentic/studio/api/project_api.py +++ /dev/null @@ -1,409 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Per-project REST API endpoints for pipeline execution and runtime management. - -Provides endpoints for: -- Synchronous and asynchronous pipeline execution -- Runtime lifecycle (start / stop / status) -- Execution history and polling -- File upload triggers -- Input/output schema introspection -""" - -from __future__ import annotations - -import asyncio -import logging -import time -import uuid -from typing import Any - -from fastapi import APIRouter, HTTPException, UploadFile # type: ignore[import-not-found] -from pydantic import BaseModel # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.projects import ProjectManager - -logger = logging.getLogger(__name__) - -# --------------------------------------------------------------------------- -# Module-level stores for active runtimes and async execution results -# --------------------------------------------------------------------------- - -_runtimes: dict[str, Any] = {} -"""Map of project name -> ProjectRuntime for active runtimes.""" - -_executions: dict[str, dict[str, Any]] = {} -"""Map of execution_id -> execution result dict for async runs.""" - -_MAX_EXECUTIONS = 1000 -"""Cap on stored execution records to prevent unbounded memory growth.""" - - -def _store_execution(record: dict[str, Any]) -> None: - """Store an execution record, evicting the oldest if at capacity.""" - _executions[record["execution_id"]] = record - if len(_executions) > _MAX_EXECUTIONS: - oldest_key = next(iter(_executions)) - del _executions[oldest_key] - - -# --------------------------------------------------------------------------- -# Request / response models -# --------------------------------------------------------------------------- - - -class RunRequest(BaseModel): - """Body for synchronous or asynchronous pipeline execution.""" - - input: Any = None - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _assert_project_exists(project_manager: ProjectManager, name: str) -> None: - """Raise 404 if the project directory does not exist on disk.""" - project_dir = project_manager._safe_path(name) - if not project_dir.exists(): - raise HTTPException(status_code=404, detail=f"Project '{name}' not found") - - -def _load_graph_model(project_manager: ProjectManager, name: str) -> Any: - """Load pipeline JSON and construct a GraphModel. - - Raises HTTPException(404) if the pipeline does not exist. - """ - from fireflyframework_agentic.studio.codegen.models import GraphEdge, GraphModel, GraphNode - - try: - graph_dict = project_manager.load_pipeline(name, "main") - except FileNotFoundError as exc: - raise HTTPException( - status_code=404, - detail=f"Pipeline 'main' not found in project '{name}'", - ) from exc - - nodes = [GraphNode(**n) for n in graph_dict.get("nodes", [])] - edges = [GraphEdge(**e) for e in graph_dict.get("edges", [])] - return GraphModel(nodes=nodes, edges=edges, metadata=graph_dict.get("metadata", {})) - - -# --------------------------------------------------------------------------- -# Router factory -# --------------------------------------------------------------------------- - - -def create_project_api_router(project_manager: ProjectManager) -> APIRouter: - """Create an :class:`APIRouter` for per-project runtime and execution endpoints. - - Endpoints - --------- - ``POST /api/projects/{name}/run`` - Synchronous pipeline execution. - ``POST /api/projects/{name}/run/async`` - Asynchronous pipeline execution (returns immediately). - ``GET /api/projects/{name}/runs/{execution_id}`` - Poll an async execution for its result. - ``POST /api/projects/{name}/upload`` - Trigger pipeline execution via file upload. - ``GET /api/projects/{name}/schema`` - Retrieve the project's input/output schema. - ``POST /api/projects/{name}/runtime/start`` - Start the project runtime (queue consumers, schedulers). - ``POST /api/projects/{name}/runtime/stop`` - Stop the project runtime. - ``GET /api/projects/{name}/runtime/status`` - Query the project runtime status. - ``GET /api/projects/{name}/runtime/executions`` - List recent executions for the project. - """ - router = APIRouter(prefix="/api/projects", tags=["project-api"]) - - # -- Synchronous execution --------------------------------------------- - - @router.post("/{name}/run") - async def run_pipeline(name: str, body: RunRequest) -> dict[str, Any]: - """Execute the project's main pipeline synchronously.""" - _assert_project_exists(project_manager, name) - - from fireflyframework_agentic.studio.execution.compiler import compile_graph - - graph_model = _load_graph_model(project_manager, name) - - execution_id = str(uuid.uuid4()) - start_time = time.monotonic() - - try: - engine = compile_graph(graph_model) - result = await engine.run(inputs=body.input) - except Exception as exc: - logger.exception("Pipeline execution failed for project '%s'", name) - raise HTTPException(status_code=500, detail=str(exc)) from exc - - duration_ms = round((time.monotonic() - start_time) * 1000, 2) - - # Store in execution history - record = { - "execution_id": execution_id, - "project": name, - "status": "completed", - "result": result, - "duration_ms": duration_ms, - } - _store_execution(record) - - return { - "result": result, - "execution_id": execution_id, - "duration_ms": duration_ms, - } - - # -- Asynchronous execution -------------------------------------------- - - @router.post("/{name}/run/async") - async def run_pipeline_async(name: str, body: RunRequest) -> dict[str, Any]: - """Start pipeline execution asynchronously; returns immediately.""" - _assert_project_exists(project_manager, name) - - from fireflyframework_agentic.studio.execution.compiler import compile_graph - - graph_model = _load_graph_model(project_manager, name) - - execution_id = str(uuid.uuid4()) - _store_execution( - { - "execution_id": execution_id, - "project": name, - "status": "running", - "result": None, - "duration_ms": None, - } - ) - - async def _run_in_background() -> None: - start_time = time.monotonic() - try: - engine = compile_graph(graph_model) - result = await engine.run(inputs=body.input) - duration_ms = round((time.monotonic() - start_time) * 1000, 2) - _executions[execution_id].update( - { - "status": "completed", - "result": result, - "duration_ms": duration_ms, - } - ) - except Exception as exc: - duration_ms = round((time.monotonic() - start_time) * 1000, 2) - _executions[execution_id].update( - { - "status": "failed", - "result": str(exc), - "duration_ms": duration_ms, - } - ) - logger.exception("Async pipeline execution failed for project '%s'", name) - - asyncio.create_task(_run_in_background()) - - return { - "execution_id": execution_id, - "status": "running", - } - - # -- Poll execution status --------------------------------------------- - - @router.get("/{name}/runs/{execution_id}") - async def get_execution(name: str, execution_id: str) -> dict[str, Any]: - """Poll an async execution for its current status and result.""" - _assert_project_exists(project_manager, name) - - record = _executions.get(execution_id) - if record is None or record.get("project") != name: - raise HTTPException( - status_code=404, - detail=f"Execution '{execution_id}' not found for project '{name}'", - ) - - return { - "execution_id": record["execution_id"], - "status": record["status"], - "result": record.get("result"), - "duration_ms": record.get("duration_ms"), - } - - # -- File upload trigger ----------------------------------------------- - - @router.post("/{name}/upload") - async def upload_file(name: str, file: UploadFile) -> dict[str, Any]: - """Trigger pipeline execution via file upload.""" - _assert_project_exists(project_manager, name) - - from fireflyframework_agentic.studio.execution.compiler import compile_graph - - graph_model = _load_graph_model(project_manager, name) - - content = await file.read() - inputs = { - "file_name": file.filename, - "content_type": file.content_type, - "content": content.decode("utf-8", errors="replace"), - "size": len(content), - } - - execution_id = str(uuid.uuid4()) - start_time = time.monotonic() - - try: - engine = compile_graph(graph_model) - result = await engine.run(inputs=inputs) - except Exception as exc: - logger.exception("File upload pipeline execution failed for project '%s'", name) - raise HTTPException(status_code=500, detail=str(exc)) from exc - - duration_ms = round((time.monotonic() - start_time) * 1000, 2) - - _store_execution( - { - "execution_id": execution_id, - "project": name, - "status": "completed", - "result": result, - "duration_ms": duration_ms, - } - ) - - return { - "result": result, - "execution_id": execution_id, - "duration_ms": duration_ms, - } - - # -- Schema endpoint --------------------------------------------------- - - @router.get("/{name}/schema") - async def get_schema(name: str) -> dict[str, Any]: - """Return the project's input/output schema from its pipeline.""" - _assert_project_exists(project_manager, name) - - try: - graph_dict = project_manager.load_pipeline(name, "main") - except FileNotFoundError: - # No pipeline saved yet; return empty schema - return { - "input_schema": None, - "output_schema": None, - "trigger_type": None, - } - - nodes = graph_dict.get("nodes", []) - - input_schema = None - output_schema = None - trigger_type = None - - for node in nodes: - node_type = node.get("type", "") - data = node.get("data", {}) - - if node_type == "input": - trigger_type = data.get("trigger_type") - input_schema = data.get("schema") - elif node_type == "output": - output_schema = data.get("response_schema") - - return { - "input_schema": input_schema, - "output_schema": output_schema, - "trigger_type": trigger_type, - } - - # -- Runtime start ----------------------------------------------------- - - @router.post("/{name}/runtime/start") - async def start_runtime(name: str) -> dict[str, Any]: - """Start the project runtime (queue consumers, schedulers).""" - _assert_project_exists(project_manager, name) - - from fireflyframework_agentic.studio.runtime import ProjectRuntime - - graph_model = _load_graph_model(project_manager, name) - - # Stop existing runtime if present - existing = _runtimes.get(name) - if existing is not None: - await existing.stop() - - runtime = ProjectRuntime(name) - await runtime.start(graph_model) - _runtimes[name] = runtime - - return {"status": "running"} - - # -- Runtime stop ------------------------------------------------------ - - @router.post("/{name}/runtime/stop") - async def stop_runtime(name: str) -> dict[str, Any]: - """Stop the project runtime.""" - _assert_project_exists(project_manager, name) - - runtime = _runtimes.get(name) - if runtime is not None: - await runtime.stop() - del _runtimes[name] - - return {"status": "stopped"} - - # -- Runtime status ---------------------------------------------------- - - @router.get("/{name}/runtime/status") - async def get_runtime_status(name: str) -> dict[str, Any]: - """Query the project runtime status.""" - _assert_project_exists(project_manager, name) - - runtime = _runtimes.get(name) - if runtime is not None: - return runtime.get_status() - - return { - "project": name, - "status": "stopped", - "trigger_type": None, - "consumers": 0, - "scheduler_active": False, - } - - # -- Execution history ------------------------------------------------- - - @router.get("/{name}/runtime/executions") - async def list_executions(name: str) -> dict[str, Any]: - """List recent executions for the project.""" - _assert_project_exists(project_manager, name) - - project_executions = [ - { - "execution_id": rec["execution_id"], - "status": rec["status"], - "duration_ms": rec.get("duration_ms"), - } - for rec in _executions.values() - if rec.get("project") == name - ] - - return {"executions": project_executions} - - return router diff --git a/src/fireflyframework_agentic/studio/api/projects.py b/src/fireflyframework_agentic/studio/api/projects.py deleted file mode 100644 index 58195b3c..00000000 --- a/src/fireflyframework_agentic/studio/api/projects.py +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Project management REST API endpoints for Firefly Agentic Studio. - -Provides CRUD operations for projects and pipeline persistence so the -Studio frontend can manage user workspaces. -""" - -from __future__ import annotations - -from dataclasses import asdict -from typing import Any - -from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] -from pydantic import BaseModel # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.projects import ProjectManager - -# --------------------------------------------------------------------------- -# Request / response models -# --------------------------------------------------------------------------- - - -class CreateProjectRequest(BaseModel): - """Body for creating a new project.""" - - name: str - description: str = "" - - -class UpdateProjectRequest(BaseModel): - """Body for updating project metadata (rename and/or description).""" - - new_name: str | None = None - description: str | None = None - - -class SavePipelineRequest(BaseModel): - """Body for saving a pipeline graph.""" - - graph: dict[str, Any] - - -# --------------------------------------------------------------------------- -# Router factory -# --------------------------------------------------------------------------- - - -def create_projects_router(manager: ProjectManager) -> APIRouter: - """Create an :class:`APIRouter` for project management. - - Endpoints - --------- - ``GET /api/projects`` - List all projects. - ``POST /api/projects`` - Create a new project. - ``DELETE /api/projects/{name}`` - Delete a project. - ``POST /api/projects/{project_name}/pipelines/{pipeline_name}`` - Save a pipeline graph. - ``GET /api/projects/{project_name}/pipelines/{pipeline_name}`` - Load a pipeline graph. - """ - router = APIRouter(prefix="/api/projects", tags=["projects"]) - - @router.get("") - async def list_projects() -> list[dict[str, Any]]: - projects = manager.list_all() - results = [] - for p in projects: - d = asdict(p) - # Convert Path to string for JSON serialization - d["path"] = str(d["path"]) - results.append(d) - return results - - @router.post("") - async def create_project(body: CreateProjectRequest) -> dict[str, Any]: - try: - info = manager.create(body.name, description=body.description) - except ValueError as exc: - raise HTTPException(status_code=409, detail=str(exc)) from exc - d = asdict(info) - d["path"] = str(d["path"]) - return d - - @router.delete("") - async def delete_all_projects() -> dict[str, Any]: - count = manager.delete_all() - return {"status": "deleted", "count": count} - - @router.patch("/{name}") - async def update_project(name: str, body: UpdateProjectRequest) -> dict[str, Any]: - effective_name = name - try: - if body.new_name: - info = manager.rename(name, body.new_name) - effective_name = body.new_name - if body.description is not None: - info = manager.update(effective_name, description=body.description) - if not body.new_name and body.description is None: - raise HTTPException(status_code=400, detail="Nothing to update") - except FileNotFoundError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - except ValueError as exc: - raise HTTPException(status_code=409, detail=str(exc)) from exc - d = asdict(info) - d["path"] = str(d["path"]) - return d - - @router.delete("/{name}") - async def delete_project(name: str) -> dict[str, str]: - try: - manager.delete(name) - except FileNotFoundError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - except ValueError as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - return {"status": "deleted"} - - @router.post("/{project_name}/pipelines/{pipeline_name}") - async def save_pipeline(project_name: str, pipeline_name: str, body: SavePipelineRequest) -> dict[str, str]: - try: - manager.save_pipeline(project_name, pipeline_name, body.graph) - except FileNotFoundError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - except ValueError as exc: - raise HTTPException(status_code=400, detail=str(exc)) from exc - - # Create a version history entry for every save - try: - from fireflyframework_agentic.studio.versioning import ProjectVersioning - - project_dir = manager._safe_path(project_name) - versioning = ProjectVersioning(project_dir) - node_count = len(body.graph.get("nodes", [])) - edge_count = len(body.graph.get("edges", [])) - versioning.commit(f"Save pipeline ({node_count} nodes, {edge_count} edges)") - except Exception: - pass # Versioning failure should not block saving - - return {"status": "saved"} - - @router.get("/{project_name}/pipelines/{pipeline_name}") - async def load_pipeline(project_name: str, pipeline_name: str) -> dict[str, Any]: - try: - return manager.load_pipeline(project_name, pipeline_name) - except FileNotFoundError as exc: - raise HTTPException(status_code=404, detail=str(exc)) from exc - - return router - - -def create_versioning_router(project_manager: ProjectManager) -> APIRouter: - router = APIRouter(prefix="/api/projects", tags=["versioning"]) - - @router.get("/{name}/history") - async def get_project_history(name: str): - from fireflyframework_agentic.studio.versioning import ProjectVersioning - - project_dir = project_manager._safe_path(name) - if not project_dir.exists(): - raise HTTPException(status_code=404, detail=f"Project '{name}' not found") - versioning = ProjectVersioning(project_dir) - return versioning.get_history() - - @router.post("/{name}/restore") - async def restore_project_version(name: str, body: dict): - from fireflyframework_agentic.studio.versioning import ProjectVersioning - - project_dir = project_manager._safe_path(name) - if not project_dir.exists(): - raise HTTPException(status_code=404, detail=f"Project '{name}' not found") - commit_sha = body.get("commit_sha", "") - if not commit_sha: - raise HTTPException(status_code=400, detail="commit_sha is required") - versioning = ProjectVersioning(project_dir) - versioning.restore(commit_sha) - return {"status": "restored"} - - @router.post("/{name}/bookmark") - async def bookmark_project_version(name: str, body: dict): - from fireflyframework_agentic.studio.versioning import ProjectVersioning - - project_dir = project_manager._safe_path(name) - if not project_dir.exists(): - raise HTTPException(status_code=404, detail=f"Project '{name}' not found") - commit_sha = body.get("commit_sha", "") - label = body.get("label", "") - if not commit_sha or not label: - raise HTTPException(status_code=400, detail="commit_sha and label are required") - versioning = ProjectVersioning(project_dir) - versioning.bookmark(commit_sha, label) - return {"status": "bookmarked"} - - return router diff --git a/src/fireflyframework_agentic/studio/api/registry.py b/src/fireflyframework_agentic/studio/api/registry.py deleted file mode 100644 index 27bd7e99..00000000 --- a/src/fireflyframework_agentic/studio/api/registry.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Registry API endpoints for Firefly Agentic Studio. - -Exposes the framework's global registries (agents, tools, reasoning patterns) -so the Studio frontend can list available components in the node palette. -""" - -from __future__ import annotations - -from typing import Any - -from fastapi import APIRouter # type: ignore[import-not-found] - -from fireflyframework_agentic.agents.registry import agent_registry -from fireflyframework_agentic.reasoning.registry import reasoning_registry -from fireflyframework_agentic.tools.registry import tool_registry - - -def create_registry_router() -> APIRouter: - """Create an :class:`APIRouter` that serves registry data. - - Endpoints - --------- - ``GET /api/registry/agents`` - Return a list of :class:`AgentInfo` dicts for every registered agent. - ``GET /api/registry/tools`` - Return a list of :class:`ToolInfo` dicts for every registered tool. - ``GET /api/registry/patterns`` - Return a list of pattern name dicts for every registered reasoning - pattern. - """ - router = APIRouter(prefix="/api/registry", tags=["registry"]) - - @router.get("/agents") - async def list_agents() -> list[dict[str, Any]]: - return [info.model_dump() for info in agent_registry.list_agents()] - - @router.get("/tools") - async def list_tools() -> list[dict[str, Any]]: - return [info.model_dump() for info in tool_registry.list_tools()] - - @router.get("/patterns") - async def list_patterns() -> list[dict[str, str]]: - return [{"name": name} for name in reasoning_registry.list_patterns()] - - return router diff --git a/src/fireflyframework_agentic/studio/api/settings.py b/src/fireflyframework_agentic/studio/api/settings.py deleted file mode 100644 index 0ab48651..00000000 --- a/src/fireflyframework_agentic/studio/api/settings.py +++ /dev/null @@ -1,341 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Settings REST API endpoints for Firefly Agentic Studio. - -Provides ``GET/POST /api/settings`` for managing provider credentials -and model defaults, plus ``GET /api/settings/status`` for first-start -detection. -""" - -from __future__ import annotations - -from pathlib import Path -from typing import Any - -from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] -from pydantic import BaseModel # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.settings import ( - DEFAULT_SETTINGS_PATH, - ModelDefaults, - ProviderCredentials, - ServiceCredential, - StudioSettings, - ToolCredentials, - UserProfile, - apply_settings_to_env, - is_first_start, - load_settings, - save_settings, -) - -# --------------------------------------------------------------------------- -# Request / response models -# --------------------------------------------------------------------------- - - -class CredentialsPayload(BaseModel): - """Inbound credential fields — all optional plain strings.""" - - openai_api_key: str | None = None - anthropic_api_key: str | None = None - google_api_key: str | None = None - groq_api_key: str | None = None - mistral_api_key: str | None = None - deepseek_api_key: str | None = None - cohere_api_key: str | None = None - azure_openai_api_key: str | None = None - azure_openai_endpoint: str | None = None - aws_access_key_id: str | None = None - aws_secret_access_key: str | None = None - aws_default_region: str | None = None - ollama_base_url: str | None = None - - -class ModelDefaultsPayload(BaseModel): - """Inbound model-default fields — all optional for partial update.""" - - default_model: str | None = None - temperature: float | None = None - retries: int | None = None - - -class UserProfilePayload(BaseModel): - """Inbound user profile fields — all optional for partial update.""" - - name: str | None = None - role: str | None = None - context: str | None = None - assistant_name: str | None = None - - -class ToolCredentialsPayload(BaseModel): - """Inbound tool credential fields — all optional for partial update.""" - - serpapi_api_key: str | None = None - serper_api_key: str | None = None - tavily_api_key: str | None = None - database_url: str | None = None - redis_url: str | None = None - slack_bot_token: str | None = None - telegram_bot_token: str | None = None - - -class SaveSettingsRequest(BaseModel): - """Body for ``POST /api/settings``.""" - - credentials: CredentialsPayload | None = None - model_defaults: ModelDefaultsPayload | None = None - user_profile: UserProfilePayload | None = None - tool_credentials: ToolCredentialsPayload | None = None - setup_complete: bool | None = None - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _mask_key(value: str) -> str: - """Return a masked version of an API key, showing only the last 4 chars.""" - if len(value) <= 4: - return "****" - return "****" + value[-4:] - - -def _settings_to_response(settings: StudioSettings) -> dict[str, Any]: - """Serialise settings for a GET response, masking secret values.""" - creds: dict[str, str | None] = {} - for field_name in ProviderCredentials.model_fields: - val = getattr(settings.credentials, field_name) - if val is not None: - creds[field_name] = _mask_key(val.get_secret_value()) - else: - creds[field_name] = None - - tool_creds: dict[str, str | None] = {} - for field_name in ToolCredentials.model_fields: - val = getattr(settings.tool_credentials, field_name) - if val is not None: - tool_creds[field_name] = _mask_key(val.get_secret_value()) - else: - tool_creds[field_name] = None - - return { - "credentials": creds, - "model_defaults": settings.model_defaults.model_dump(), - "user_profile": settings.user_profile.model_dump(), - "tool_credentials": tool_creds, - "setup_complete": settings.setup_complete, - } - - -# --------------------------------------------------------------------------- -# Router factory -# --------------------------------------------------------------------------- - - -def create_settings_router(settings_path: Path | None = None) -> APIRouter: - """Create an :class:`APIRouter` for Studio settings management. - - Endpoints - --------- - ``GET /api/settings`` — current settings (keys masked). - ``POST /api/settings`` — save / merge settings. - ``GET /api/settings/status`` — lightweight first-start check. - """ - router = APIRouter(prefix="/api/settings", tags=["settings"]) - path = settings_path or DEFAULT_SETTINGS_PATH - - @router.get("") - async def get_settings() -> dict[str, Any]: - settings = load_settings(path) - return _settings_to_response(settings) - - @router.post("") - async def post_settings(body: SaveSettingsRequest) -> dict[str, Any]: - settings = load_settings(path) - - # --- Merge credentials (null = keep existing) --- - if body.credentials is not None: - from pydantic import SecretStr - - merged: dict[str, Any] = {} - for field_name in ProviderCredentials.model_fields: - incoming = getattr(body.credentials, field_name) - if incoming is not None: - merged[field_name] = SecretStr(incoming) - else: - merged[field_name] = getattr(settings.credentials, field_name) - settings.credentials = ProviderCredentials(**merged) - - # --- Merge model defaults --- - if body.model_defaults is not None: - current = settings.model_defaults.model_dump() - for field_name in ModelDefaults.model_fields: - incoming = getattr(body.model_defaults, field_name) - if incoming is not None: - current[field_name] = incoming - settings.model_defaults = ModelDefaults(**current) - - # --- Merge user profile --- - if body.user_profile is not None: - current_profile = settings.user_profile.model_dump() - for field_name in UserProfile.model_fields: - incoming = getattr(body.user_profile, field_name) - if incoming is not None: - current_profile[field_name] = incoming - settings.user_profile = UserProfile(**current_profile) - - # --- Merge tool credentials --- - if body.tool_credentials is not None: - from pydantic import SecretStr as _SecretStr - - tool_merged: dict[str, Any] = {} - for field_name in ToolCredentials.model_fields: - incoming = getattr(body.tool_credentials, field_name) - if incoming is not None: - tool_merged[field_name] = _SecretStr(incoming) - else: - tool_merged[field_name] = getattr(settings.tool_credentials, field_name) - settings.tool_credentials = ToolCredentials(**tool_merged) - - # --- setup_complete flag --- - if body.setup_complete is not None: - settings.setup_complete = body.setup_complete - - save_settings(settings, path) - apply_settings_to_env(settings) - - return _settings_to_response(settings) - - @router.get("/status") - async def settings_status() -> dict[str, Any]: - first_start = is_first_start(path) - if first_start: - return {"first_start": True, "setup_complete": False} - settings = load_settings(path) - return {"first_start": False, "setup_complete": settings.setup_complete} - - # ----------------------------------------------------------------------- - # Service credentials CRUD - # ----------------------------------------------------------------------- - - @router.get("/services") - async def list_services() -> list[dict]: - """List all service credentials (with secrets masked).""" - settings = load_settings(path) - result = [] - for sc in settings.service_credentials: - entry = sc.model_dump() - # Mask secret fields - for field in ("password", "connection_url", "api_key", "token"): - val = getattr(sc, field, None) - if val is not None: - secret_val = val.get_secret_value() if hasattr(val, "get_secret_value") else str(val) - entry[field] = "***" if secret_val else "" - else: - entry[field] = None - result.append(entry) - return result - - @router.post("/services") - async def add_service(req: dict) -> dict: - """Add or update a service credential.""" - settings = load_settings(path) - - # Preserve existing secret values when the incoming value is the - # mask placeholder ("***") sent by list_services. - _mask = "***" - _secret_fields = ("password", "connection_url", "api_key", "token") - incoming_id = req.get("id") - if incoming_id: - old_sc = next( - (s for s in settings.service_credentials if s.id == incoming_id), - None, - ) - if old_sc is not None: - for field in _secret_fields: - if req.get(field) == _mask: - existing_val = getattr(old_sc, field, None) - if existing_val is not None: - req[field] = ( - existing_val.get_secret_value() - if hasattr(existing_val, "get_secret_value") - else str(existing_val) - ) - else: - req.pop(field, None) - - sc = ServiceCredential(**req) - existing = [s for s in settings.service_credentials if s.id != sc.id] - existing.append(sc) - settings.service_credentials = existing - save_settings(settings, path) - return {"status": "saved", "id": sc.id} - - @router.delete("/services/{service_id}") - async def delete_service(service_id: str) -> dict: - """Delete a service credential by ID.""" - settings = load_settings(path) - before = len(settings.service_credentials) - settings.service_credentials = [s for s in settings.service_credentials if s.id != service_id] - if len(settings.service_credentials) == before: - raise HTTPException(status_code=404, detail=f"Service '{service_id}' not found") - save_settings(settings, path) - return {"status": "deleted", "id": service_id} - - @router.post("/services/{service_id}/test") - async def test_service(service_id: str) -> dict: - """Test connectivity for a service credential.""" - settings = load_settings(path) - sc = next((s for s in settings.service_credentials if s.id == service_id), None) - if not sc: - raise HTTPException(status_code=404, detail=f"Service '{service_id}' not found") - - # Basic connectivity test based on service type - try: - if sc.service_type in ("serpapi", "serper", "tavily"): - # API key services - just verify key is set - if sc.api_key and sc.api_key.get_secret_value(): - return { - "status": "ok", - "message": f"API key configured for {sc.service_type}", - } - return {"status": "error", "message": "No API key set"} - - if sc.service_type in ("slack", "telegram", "discord"): - # Token services - if sc.token and sc.token.get_secret_value(): - return { - "status": "ok", - "message": f"Token configured for {sc.service_type}", - } - return {"status": "error", "message": "No token set"} - - # Database/queue services - check host is set - if sc.host or (sc.connection_url and sc.connection_url.get_secret_value()): - return { - "status": "ok", - "message": (f"Connection details configured for {sc.service_type}"), - } - return { - "status": "error", - "message": "No host or connection URL configured", - } - except Exception as e: - return {"status": "error", "message": str(e)} - - return router diff --git a/src/fireflyframework_agentic/studio/api/smith.py b/src/fireflyframework_agentic/studio/api/smith.py deleted file mode 100644 index 4cffc024..00000000 --- a/src/fireflyframework_agentic/studio/api/smith.py +++ /dev/null @@ -1,771 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Agent Smith WebSocket endpoint for Firefly Agentic Studio. - -Provides a WebSocket interface at /ws/smith for code generation, -execution, and chat with Agent Smith. - -Actions -------- -``generate`` - Convert the current canvas graph into production Python code using - the Smith agent. Sends ``smith_token`` messages during generation, - followed by ``code_generated`` with the final code. - -``chat`` - Free-form conversation with Agent Smith (code questions, refactoring, - explanations). Streams tokens as ``smith_token`` messages. - -``sync_canvas`` - Update the per-connection canvas state that Smith uses as context. - -``execute`` - Run generated code in a subprocess and return stdout/stderr. - -``approve_command`` - Approve or deny a pending command that Smith requested to execute. -""" - -from __future__ import annotations - -import asyncio -import contextlib -import json -import logging -import re -import tempfile -import uuid -from pathlib import Path -from typing import Any - -from fastapi import APIRouter, Query, WebSocket, WebSocketDisconnect # type: ignore[import-not-found] -from pydantic import BaseModel # type: ignore[import-not-found] - -logger = logging.getLogger(__name__) - - -class _SaveHistoryBody(BaseModel): - messages: list[dict] - - -class _SaveFilesBody(BaseModel): - files: list[dict] - - -def create_smith_router() -> APIRouter: - """Create an :class:`APIRouter` with the Smith WebSocket endpoint. - - Endpoints - --------- - ``WS /ws/smith`` - Accept a WebSocket connection for Agent Smith code generation - and chat. Supports actions: ``generate``, ``chat``, - ``sync_canvas``, ``execute``, ``approve_command``. - ``GET /api/smith/{project}/history`` - Load saved Smith chat history. - ``POST /api/smith/{project}/history`` - Save Smith chat history. - ``DELETE /api/smith/{project}/history`` - Clear Smith chat history. - ``GET /api/smith/{project}/files`` - Load saved Smith generated files. - ``POST /api/smith/{project}/files`` - Save Smith generated files. - """ - router = APIRouter(tags=["smith"]) - - # ------------------------------------------------------------------ - # REST endpoints — Smith chat history & generated files - # ------------------------------------------------------------------ - - @router.get("/api/smith/{project}/history") - async def get_smith_history(project: str): - from fireflyframework_agentic.studio.assistant.history import load_smith_history - - return load_smith_history(project) - - @router.post("/api/smith/{project}/history") - async def save_smith_history_endpoint(project: str, body: _SaveHistoryBody): - from fireflyframework_agentic.studio.assistant.history import save_smith_history - - save_smith_history(project, body.messages) - return {"status": "saved"} - - @router.delete("/api/smith/{project}/history") - async def delete_smith_history(project: str): - from fireflyframework_agentic.studio.assistant.history import clear_smith_history - - clear_smith_history(project) - return {"status": "cleared"} - - @router.get("/api/smith/{project}/files") - async def get_smith_files(project: str): - from fireflyframework_agentic.studio.assistant.history import load_smith_files - - return load_smith_files(project) - - @router.post("/api/smith/{project}/files") - async def save_smith_files_endpoint(project: str, body: _SaveFilesBody): - from fireflyframework_agentic.studio.assistant.history import save_smith_files - - save_smith_files(project, body.files) - return {"status": "saved"} - - # ------------------------------------------------------------------ - # WebSocket endpoint - # ------------------------------------------------------------------ - - @router.websocket("/ws/smith") - async def smith_ws(websocket: WebSocket, project: str = Query(default="")) -> None: - await websocket.accept() - logger.info("Smith WebSocket connected (project=%s)", project) - - # Per-connection canvas state (populated from frontend sync) - canvas_state: dict[str, Any] = {"nodes": [], "edges": []} - - # Per-connection pending commands awaiting user approval - pending_commands: dict[str, dict[str, Any]] = {} - - # Per-connection message history for multi-turn chat - message_history: list[Any] = [] - - try: - while True: - raw = await websocket.receive_text() - try: - data = json.loads(raw) - except json.JSONDecodeError: - await websocket.send_json({"type": "error", "message": "Invalid JSON"}) - continue - - action = data.get("action", "") - - if action == "generate": - await _handle_generate( - websocket, - data, - canvas_state, - message_history, - project, - ) - elif action == "chat": - await _handle_chat( - websocket, - data, - canvas_state, - message_history, - pending_commands, - project, - ) - elif action == "sync_canvas": - await _handle_sync_canvas(websocket, data, canvas_state) - elif action == "execute": - await _handle_execute(websocket, data) - elif action == "approve_command": - await _handle_approve_command(websocket, data, pending_commands) - else: - await websocket.send_json({"type": "error", "message": f"Unknown action: {action}"}) - - except WebSocketDisconnect: - logger.info("Smith WebSocket disconnected") - except Exception as exc: - logger.exception("Smith WebSocket error") - with contextlib.suppress(Exception): - await websocket.send_json({"type": "error", "message": str(exc)}) - - return router - - -# --------------------------------------------------------------------------- -# Action handlers -# --------------------------------------------------------------------------- - - -async def _handle_generate( - websocket: WebSocket, - data: dict[str, Any], - canvas_state: dict[str, Any], - message_history: list[Any], - project: str = "", -) -> None: - """Handle the ``generate`` action: convert canvas graph to Python code. - - Uses ``generate_code_with_smith()`` from the Smith agent module. - Sends ``smith_token`` messages for progress, ``code_generated`` with - the final code, and ``smith_response_complete`` when done. - """ - try: - from fireflyframework_agentic.studio.assistant.smith import ( - generate_code_with_smith, - ) - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings() - settings_dict = { - "model_defaults": { - "default_model": settings.model_defaults.default_model, - }, - } - - # Build graph from the provided data or fall back to canvas state - graph = data.get("graph", canvas_state) - - # Notify the frontend that generation has started - await websocket.send_json({"type": "smith_token", "content": "Generating code from pipeline...\n"}) - - # Pass user name so Smith can personalise responses - user_name = "" - with contextlib.suppress(Exception): - user_name = settings.user_profile.name or "" - - # Build shared cross-agent context for generation - shared_context = "" - try: - from fireflyframework_agentic.studio.assistant.shared_context import ( - build_shared_context, - ) - - shared_context = build_shared_context(project, canvas_state, exclude_agent="smith") - except Exception: - pass - - result = await generate_code_with_smith( - graph, - settings_dict, - user_name=user_name, - shared_context=shared_context, - ) - - code = result.get("code", "") - files = result.get("files", []) - notes = result.get("notes", []) - - # Send structured multi-file result - await websocket.send_json( - { - "type": "files_generated", - "files": files, - "notes": notes, - } - ) - - # Backward-compatible single code message - await websocket.send_json( - { - "type": "code_generated", - "code": code, - "notes": notes, - } - ) - - # Send completion - await websocket.send_json( - { - "type": "smith_response_complete", - "full_text": code, - "notes": notes, - } - ) - - except Exception as exc: - logger.error("Smith generation failed: %s", exc, exc_info=True) - await websocket.send_json({"type": "error", "message": f"Code generation failed: {exc}"}) - - -async def _handle_chat( - websocket: WebSocket, - data: dict[str, Any], - canvas_state: dict[str, Any], - message_history: list[Any], - pending_commands: dict[str, dict[str, Any]], - project: str = "", -) -> None: - """Handle the ``chat`` action: free-form conversation with Smith. - - Creates a Smith agent, includes the current canvas state as context, - and runs the agent with the user message. Streams tokens as - ``smith_token`` messages and sends ``smith_response_complete`` at end. - """ - user_msg = data.get("message", "").strip() - if not user_msg: - await websocket.send_json({"type": "error", "message": "Empty message"}) - return - - try: - from fireflyframework_agentic.studio.assistant.smith import ( - create_smith_agent, - ) - from fireflyframework_agentic.studio.settings import load_settings as _load_settings - - _user_name = "" - try: - _settings = _load_settings() - _user_name = _settings.user_profile.name or "" - except Exception: - pass - - smith = create_smith_agent(user_name=_user_name) - - # Enrich the prompt with shared cross-agent context and canvas state - context_parts: list[str] = [] - try: - from fireflyframework_agentic.studio.assistant.shared_context import ( - build_shared_context, - ) - - shared = build_shared_context(project, canvas_state, exclude_agent="smith") - if shared: - context_parts.append(shared) - except Exception: - pass - if canvas_state.get("nodes"): - context_parts.append("[CURRENT PIPELINE STATE]\n" + json.dumps(canvas_state, indent=2)) - context_parts.append(user_msg) - effective_message = "\n\n".join(context_parts) - - # Use run() for reliable exhaustive tool execution (not run_stream, - # which cannot guarantee all tool calls complete with end_strategy - # 'exhaustive'). - result = await smith.run( - effective_message, - message_history=message_history, - ) - - full_text = (str(result.output) if result.output else "") if hasattr(result, "output") else str(result) - - if hasattr(result, "new_messages"): - message_history.extend(result.new_messages()) - - # Check if the response contains code blocks that should go to - # the Code tab instead of being displayed inline in chat. - extracted_files = _extract_code_blocks(full_text) - - if extracted_files: - # Route code to the Code tab via files_generated - await websocket.send_json( - { - "type": "files_generated", - "files": extracted_files, - "notes": [], - } - ) - - # Strip code blocks from the chat text, keep only narrative - narrative = _strip_code_blocks(full_text).strip() - - # Send narrative as chat tokens (or a brief note if empty) - chat_text = narrative or "Code generated — see the Code tab." - _chunk_size = 80 - for i in range(0, len(chat_text), _chunk_size): - chunk = chat_text[i : i + _chunk_size] - await websocket.send_json({"type": "smith_token", "content": chunk}) - - combined_code = "\n\n".join(f"# --- {f['path']} ---\n{f['content']}" for f in extracted_files) - - await websocket.send_json( - { - "type": "smith_response_complete", - "full_text": chat_text, - "code": combined_code, - } - ) - else: - # No code blocks — send as regular chat - _chunk_size = 80 - for i in range(0, len(full_text), _chunk_size): - chunk = full_text[i : i + _chunk_size] - await websocket.send_json({"type": "smith_token", "content": chunk}) - - await websocket.send_json( - { - "type": "smith_response_complete", - "full_text": full_text, - } - ) - - # Extract any tool calls for visibility - tool_calls = _extract_tool_calls(result) - for tc in tool_calls: - await websocket.send_json( - { - "type": "tool_call", - "tool": tc["tool"], - "args": tc["args"], - "result": tc["result"], - } - ) - - # Check for pending approvals in tool return parts - await _check_pending_approvals(websocket, result, pending_commands) - - except Exception as exc: - logger.error("Smith chat failed: %s", exc, exc_info=True) - await websocket.send_json({"type": "error", "message": f"Smith chat error: {exc}"}) - - -async def _handle_sync_canvas( - websocket: WebSocket, - data: dict[str, Any], - canvas_state: dict[str, Any], -) -> None: - """Handle the ``sync_canvas`` action: update per-connection canvas state.""" - nodes = data.get("nodes", []) - edges = data.get("edges", []) - canvas_state["nodes"] = nodes - canvas_state["edges"] = edges - - # Keep the module-level singleton in smith.py in sync so that the - # get_canvas_state tool returns current data. - from fireflyframework_agentic.studio.assistant.smith import update_canvas_state - - update_canvas_state(nodes, edges) - await websocket.send_json({"type": "canvas_synced"}) - - -async def _handle_execute( - websocket: WebSocket, - data: dict[str, Any], -) -> None: - """Handle the ``execute`` action: run code in a subprocess. - - Writes the code to a temporary file and runs it with the Python - interpreter. Sends ``execution_result`` with stdout, stderr, and - return code. - """ - code = data.get("code", "").strip() - if not code: - await websocket.send_json({"type": "error", "message": "No code to execute"}) - return - - tmp_file: Path | None = None - try: - # Write code to a temp file - tmp_dir = Path(tempfile.gettempdir()) / "firefly-smith" - tmp_dir.mkdir(parents=True, exist_ok=True) - tmp_file = tmp_dir / f"smith_{uuid.uuid4().hex[:8]}.py" - tmp_file.write_text(code, encoding="utf-8") - - timeout = data.get("timeout", 30) - - import sys - - proc = await asyncio.create_subprocess_exec( - sys.executable, - str(tmp_file), - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - cwd=str(tmp_dir), - ) - - try: - stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=timeout) - except TimeoutError: - proc.kill() - await proc.communicate() - await websocket.send_json( - { - "type": "execution_result", - "stdout": "", - "stderr": f"Execution timed out after {timeout}s", - "return_code": -1, - } - ) - return - - await websocket.send_json( - { - "type": "execution_result", - "stdout": stdout.decode("utf-8", errors="replace"), - "stderr": stderr.decode("utf-8", errors="replace"), - "return_code": proc.returncode, - } - ) - - except Exception as exc: - logger.error("Smith execution failed: %s", exc, exc_info=True) - await websocket.send_json({"type": "error", "message": f"Execution failed: {exc}"}) - finally: - # Clean up temp file - if tmp_file is not None: - with contextlib.suppress(Exception): - tmp_file.unlink(missing_ok=True) - - -async def _handle_approve_command( - websocket: WebSocket, - data: dict[str, Any], - pending_commands: dict[str, dict[str, Any]], -) -> None: - """Handle the ``approve_command`` action: approve or deny a pending command. - - Smith may request to execute commands that need user approval. The - frontend sends ``approve_command`` with a ``command_id`` and an - ``approved`` boolean. - """ - command_id = data.get("command_id", "") - approved = data.get("approved", False) - - if not command_id: - await websocket.send_json({"type": "error", "message": "Missing command_id"}) - return - - command = pending_commands.pop(command_id, None) - if command is None: - await websocket.send_json( - { - "type": "error", - "message": f"Unknown or expired command: {command_id}", - } - ) - return - - if not approved: - await websocket.send_json( - { - "type": "smith_response_complete", - "full_text": "Command denied by user.", - "command_id": command_id, - } - ) - return - - # Execute the approved shell command - shell_command = command.get("command", "") - if not shell_command: - await websocket.send_json( - { - "type": "smith_response_complete", - "full_text": "Approved command was empty.", - "command_id": command_id, - } - ) - return - - # Run the approved shell command asynchronously - try: - proc = await asyncio.create_subprocess_shell( - shell_command, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - timeout = command.get("timeout", 30) - try: - stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=timeout) - except TimeoutError: - proc.kill() - await proc.communicate() - await websocket.send_json( - { - "type": "execution_result", - "stdout": "", - "stderr": f"Command timed out after {timeout}s", - "return_code": -1, - "command_id": command_id, - } - ) - return - - await websocket.send_json( - { - "type": "execution_result", - "stdout": stdout.decode("utf-8", errors="replace"), - "stderr": stderr.decode("utf-8", errors="replace"), - "return_code": proc.returncode, - "command_id": command_id, - } - ) - except Exception as exc: - logger.error("Approved command execution failed: %s", exc, exc_info=True) - await websocket.send_json({"type": "error", "message": f"Command execution failed: {exc}"}) - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - -# Regex for fenced code blocks: ```lang\n...code...\n``` -_CODE_BLOCK_RE = re.compile( - r"```(\w*)\n(.*?)```", - re.DOTALL, -) - -# Map language tags to file extensions -_LANG_TO_EXT: dict[str, str] = { - "python": ".py", - "py": ".py", - "javascript": ".js", - "js": ".js", - "typescript": ".ts", - "ts": ".ts", - "json": ".json", - "yaml": ".yaml", - "yml": ".yaml", - "bash": ".sh", - "sh": ".sh", - "shell": ".sh", - "sql": ".sql", - "html": ".html", - "css": ".css", - "xml": ".xml", - "toml": ".toml", - "ini": ".ini", -} - -# Minimum total code length to be considered "substantial" (skip tiny snippets) -_MIN_CODE_LENGTH = 120 - - -def _extract_code_blocks(text: str) -> list[dict[str, Any]]: - """Extract fenced code blocks from markdown text as file entries. - - Returns a list of ``{"path": ..., "content": ..., "language": ...}`` - dicts suitable for a ``files_generated`` WebSocket message. - Only returns results when the total code is substantial enough to - warrant display in the Code tab (>= ``_MIN_CODE_LENGTH`` chars). - """ - matches = _CODE_BLOCK_RE.findall(text) - if not matches: - return [] - - total_code = sum(len(content.strip()) for _, content in matches) - if total_code < _MIN_CODE_LENGTH: - return [] - - files: list[dict[str, Any]] = [] - counters: dict[str, int] = {} - for lang_tag, content in matches: - lang = lang_tag.lower() or "python" - ext = _LANG_TO_EXT.get(lang, ".py") - # Generate a short filename per block - count = counters.get(lang, 0) + 1 - counters[lang] = count - name = f"smith_code_{count}{ext}" if count > 1 else f"smith_code{ext}" - files.append( - { - "path": name, - "content": content.strip(), - "language": lang, - } - ) - return files - - -def _strip_code_blocks(text: str) -> str: - """Remove fenced code blocks from markdown, keeping surrounding narrative.""" - return _CODE_BLOCK_RE.sub("", text) - - -async def _check_pending_approvals( - websocket: WebSocket, - result: Any, - pending_commands: dict[str, dict[str, Any]], -) -> None: - """Scan agent result messages for tool returns that contain approval_required. - - When the ``run_shell`` tool classifies a command as risky, it returns a JSON - payload with ``"approval_required": true``. This function detects those - payloads, stores the command in *pending_commands*, and sends an - ``approval_required`` WebSocket message so the frontend can prompt the user. - """ - if not hasattr(result, "new_messages"): - return - - for msg in result.new_messages(): - parts = getattr(msg, "parts", []) - for part in parts: - part_kind = getattr(part, "part_kind", "") - if part_kind != "tool-return": - continue - content = getattr(part, "content", "") - if not content: - continue - try: - payload = json.loads(str(content)) if isinstance(content, str) else content - except (json.JSONDecodeError, TypeError, ValueError): - continue - if not isinstance(payload, dict) or not payload.get("approval_required"): - continue - - command_id = uuid.uuid4().hex[:12] - command = payload.get("command", "") - level = payload.get("level", "risky") - - pending_commands[command_id] = { - "command": command, - "level": level, - "timeout": 30, - } - - await websocket.send_json( - { - "type": "approval_required", - "commandId": command_id, - "command": command, - "level": level, - } - ) - - -def _normalize_args(args: Any) -> dict[str, Any]: - """Ensure tool call args are always a dict. - - PydanticAI's ``ToolCallPart.args`` can be either a ``dict`` or a JSON - ``str``. The frontend expects a dict. - """ - if isinstance(args, dict): - return args - if isinstance(args, str): - try: - parsed = json.loads(args) - if isinstance(parsed, dict): - return parsed - except (json.JSONDecodeError, TypeError): - pass - return {"raw": args} - return {} - - -def _extract_tool_calls(result: Any) -> list[dict[str, Any]]: - """Extract tool call information from PydanticAI result messages. - - Works with both ``RunResult`` (from ``run()``) and ``StreamedRunResult`` - (from ``run_stream()``). - """ - tool_calls: list[dict[str, Any]] = [] - try: - if not hasattr(result, "new_messages"): - return tool_calls - for msg in result.new_messages(): - parts = getattr(msg, "parts", []) - for part in parts: - part_kind = getattr(part, "part_kind", "") - if part_kind == "tool-call": - tool_calls.append( - { - "tool": getattr(part, "tool_name", "unknown"), - "args": _normalize_args(getattr(part, "args", {})), - "result": None, - } - ) - elif part_kind == "tool-return": - content = getattr(part, "content", "") - tool_name = getattr(part, "tool_name", "") - for tc in tool_calls: - if tc["tool"] == tool_name and tc["result"] is None: - tc["result"] = str(content)[:500] if content else "" - break - except Exception as exc: - logger.warning("Could not extract tool calls: %s", exc) - return tool_calls diff --git a/src/fireflyframework_agentic/studio/api/tunnel.py b/src/fireflyframework_agentic/studio/api/tunnel.py deleted file mode 100644 index 7e36fa02..00000000 --- a/src/fireflyframework_agentic/studio/api/tunnel.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""API endpoints for Cloudflare Tunnel management.""" - -from __future__ import annotations - -from typing import Any - -from fastapi import APIRouter, HTTPException # type: ignore[import-not-found] - -from fireflyframework_agentic.studio.tunnel import TunnelManager - -_tunnel: TunnelManager | None = None - - -def create_tunnel_router(port: int = 8470) -> APIRouter: - """Create an :class:`APIRouter` for Cloudflare Tunnel management. - - Endpoints - --------- - ``GET /api/tunnel/status`` -- current tunnel status + availability. - ``POST /api/tunnel/start`` -- start a quick tunnel. - ``POST /api/tunnel/stop`` -- stop the running tunnel. - """ - global _tunnel - _tunnel = TunnelManager(port=port) - router = APIRouter(prefix="/api/tunnel", tags=["tunnel"]) - - @router.get("/status") - async def tunnel_status() -> dict[str, Any]: - assert _tunnel is not None - status = _tunnel.get_status() - status["cloudflared_installed"] = _tunnel.is_available() - return status - - @router.post("/start") - async def tunnel_start() -> dict[str, Any]: - assert _tunnel is not None - if not _tunnel.is_available(): - raise HTTPException( - status_code=422, - detail="cloudflared is not installed. Install it from: " - "https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/", - ) - try: - url = await _tunnel.start() - except RuntimeError as exc: - raise HTTPException(status_code=500, detail=str(exc)) from exc - return {"url": url, "status": "active"} - - @router.post("/stop") - async def tunnel_stop() -> dict[str, Any]: - assert _tunnel is not None - await _tunnel.stop() - return {"status": "stopped"} - - return router diff --git a/src/fireflyframework_agentic/studio/assistant/__init__.py b/src/fireflyframework_agentic/studio/assistant/__init__.py deleted file mode 100644 index 43c60be8..00000000 --- a/src/fireflyframework_agentic/studio/assistant/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Studio AI assistant subpackage.""" - -from fireflyframework_agentic.studio.assistant.agent import ( - CanvasState, - create_canvas_tools, - create_studio_assistant, -) - -__all__ = [ - "CanvasState", - "create_canvas_tools", - "create_studio_assistant", -] diff --git a/src/fireflyframework_agentic/studio/assistant/agent.py b/src/fireflyframework_agentic/studio/assistant/agent.py deleted file mode 100644 index f9637af4..00000000 --- a/src/fireflyframework_agentic/studio/assistant/agent.py +++ /dev/null @@ -1,1424 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Studio AI assistant agent with canvas manipulation tools. - -The assistant helps users build agent pipelines visually by manipulating -a shared canvas state. It exposes a set of tools (add_node, connect_nodes, -configure_node, remove_node, list_nodes, list_edges) that mutate an in-memory -:class:`CanvasState` and a factory function :func:`create_studio_assistant` -that wires everything into a :class:`FireflyAgent`. -""" - -from __future__ import annotations - -import json -import logging -from typing import Any - -from pydantic import BaseModel, Field, PrivateAttr - -from fireflyframework_agentic.agents import FireflyAgent -from fireflyframework_agentic.tools.base import BaseTool -from fireflyframework_agentic.tools.decorators import firefly_tool - -logger = logging.getLogger(__name__) - -# --------------------------------------------------------------------------- -# Canvas data models -# --------------------------------------------------------------------------- - -_VALID_NODE_TYPES = frozenset( - { - "agent", - "tool", - "reasoning", - "condition", - "memory", - "validator", - "custom_code", - "fan_out", - "fan_in", - "input", - "output", - } -) - - -class CanvasNode(BaseModel): - """A node on the Studio canvas.""" - - id: str - type: str # "agent", "tool", "reasoning", "condition" - label: str = "" - position: dict[str, float] = Field(default_factory=lambda: {"x": 0.0, "y": 0.0}) - config: dict[str, Any] = Field(default_factory=dict) - - -class CanvasEdge(BaseModel): - """An edge connecting two nodes.""" - - id: str - source: str - target: str - source_handle: str | None = None - target_handle: str | None = None - - -class CanvasState(BaseModel): - """Mutable canvas state shared across tool invocations.""" - - nodes: list[CanvasNode] = Field(default_factory=list) - edges: list[CanvasEdge] = Field(default_factory=list) - _counter: int = PrivateAttr(default=0) - - def next_id(self, prefix: str = "node") -> str: - self._counter += 1 - return f"{prefix}_{self._counter}" - - -# --------------------------------------------------------------------------- -# Canvas manipulation tools -# --------------------------------------------------------------------------- - - -def create_canvas_tools(canvas: CanvasState) -> list[BaseTool]: - """Create canvas manipulation tools bound to a shared canvas state. - - Each tool is defined as an inner async function decorated with - ``@firefly_tool(..., auto_register=False)`` so that the canvas - instance is captured via closure. - - Returns: - A list of :class:`BaseTool` instances ready to be passed to a - :class:`FireflyAgent`. - """ - - @firefly_tool( - "add_node", - description="Add a new node to the Studio canvas. Position is auto-calculated if x/y are 0.", - auto_register=False, - ) - async def add_node( - node_type: str, - label: str, - x: float = 0.0, - y: float = 0.0, - ) -> str: - """Add a node of the given type to the canvas and return its info.""" - if node_type not in _VALID_NODE_TYPES: - raise ValueError(f"Invalid node_type '{node_type}'. Must be one of: {', '.join(sorted(_VALID_NODE_TYPES))}") - - h_gap = 300 - v_gap = 150 - start_x = 250 - start_y = 250 - - if x == 0.0 and y == 0.0: - if not canvas.nodes: - x, y = start_x, start_y - else: - occupied = {(int(n.position.get("x", 0)), int(n.position.get("y", 0))) for n in canvas.nodes} - rightmost = max(canvas.nodes, key=lambda n: n.position.get("x", 0)) - x = rightmost.position.get("x", 0) + h_gap - y = rightmost.position.get("y", start_y) - - # Avoid vertical collision: offset downward if position is taken - while any(abs(ox - x) < 100 and abs(oy - y) < 80 for ox, oy in occupied): - y += v_gap - - node = CanvasNode( - id=canvas.next_id(node_type), - type=node_type, - label=label, - position={"x": x, "y": y}, - ) - canvas.nodes.append(node) - return json.dumps( - { - "id": node.id, - "type": node.type, - "label": node.label, - "position": node.position, - } - ) - - @firefly_tool( - "connect_nodes", - description="Create an edge between two nodes on the canvas.", - auto_register=False, - ) - async def connect_nodes( - source_id: str, - target_id: str, - source_handle: str | None = None, - target_handle: str | None = None, - ) -> str: - """Connect two existing nodes with a directed edge.""" - if source_id == target_id: - raise ValueError("Cannot connect a node to itself.") - node_ids = {n.id for n in canvas.nodes} - if source_id not in node_ids: - raise ValueError(f"Source node '{source_id}' does not exist.") - if target_id not in node_ids: - raise ValueError(f"Target node '{target_id}' does not exist.") - - edge = CanvasEdge( - id=canvas.next_id("edge"), - source=source_id, - target=target_id, - source_handle=source_handle, - target_handle=target_handle, - ) - canvas.edges.append(edge) - return json.dumps( - { - "id": edge.id, - "source": edge.source, - "target": edge.target, - "source_handle": edge.source_handle, - "target_handle": edge.target_handle, - } - ) - - @firefly_tool( - "configure_node", - description=( - "Update a node's configuration. Use key='label' to rename. " - "For agent nodes: key='model' (e.g. 'openai:gpt-4o'), key='instructions' (system prompt), " - "key='description'. For tool nodes: key='tool_name'. " - "For reasoning nodes: key='pattern' (e.g. 'react', 'chain_of_thought'). " - "For condition nodes: key='condition', key='branches' (JSON dict). " - "For memory nodes: key='memory_action' ('store'|'retrieve'|'clear'). " - "For validator nodes: key='validation_rule' ('not_empty'|'is_string'|'is_list'|'is_dict'). " - "For custom_code nodes: key='code' (async def execute(context, inputs) body). " - "For fan_out nodes: key='split_expression'. For fan_in nodes: key='merge_expression' ('concat'|'collect'). " - "For input nodes: key='trigger_type' ('manual'|'http'|'queue'|'schedule'|'file_upload'). " - "For output nodes: key='destination_type' ('response'|'queue'|'webhook'|'store'|'multi')." - ), - auto_register=False, - ) - async def configure_node(node_id: str, key: str, value: str) -> str: - """Set a configuration key on an existing node.""" - node = next((n for n in canvas.nodes if n.id == node_id), None) - if node is None: - raise ValueError(f"Node '{node_id}' does not exist.") - - if key == "label": - node.label = value - else: - node.config[key] = value - - return f"Node '{node_id}': set {key}={value!r}" - - @firefly_tool( - "remove_node", - description="Remove a node and all its connected edges from the canvas.", - auto_register=False, - ) - async def remove_node(node_id: str) -> str: - """Remove a node and any edges connected to it.""" - node = next((n for n in canvas.nodes if n.id == node_id), None) - if node is None: - raise ValueError(f"Node '{node_id}' does not exist.") - - canvas.nodes = [n for n in canvas.nodes if n.id != node_id] - canvas.edges = [e for e in canvas.edges if e.source != node_id and e.target != node_id] - return f"Removed node '{node_id}' and its connected edges." - - @firefly_tool( - "list_nodes", - description="List all nodes currently on the canvas.", - auto_register=False, - ) - async def list_nodes() -> str: - """Return a JSON array of all canvas nodes.""" - return json.dumps( - [ - { - "id": n.id, - "type": n.type, - "label": n.label, - "position": n.position, - "config": n.config, - } - for n in canvas.nodes - ] - ) - - @firefly_tool( - "list_edges", - description="List all edges currently on the canvas.", - auto_register=False, - ) - async def list_edges() -> str: - """Return a JSON array of all canvas edges.""" - return json.dumps( - [ - { - "id": e.id, - "source": e.source, - "target": e.target, - "source_handle": e.source_handle, - "target_handle": e.target_handle, - } - for e in canvas.edges - ] - ) - - @firefly_tool( - "clear_canvas", - description="Remove ALL nodes and edges from the canvas. Use this when the user wants to start fresh or rebuild from scratch.", - auto_register=False, - ) - async def clear_canvas() -> str: - """Remove all nodes and edges from the canvas.""" - count_nodes = len(canvas.nodes) - count_edges = len(canvas.edges) - canvas.nodes.clear() - canvas.edges.clear() - canvas._counter = 0 - return f"Canvas cleared: removed {count_nodes} nodes and {count_edges} edges." - - @firefly_tool( - "validate_pipeline", - description=( - "Validate the current pipeline for completeness and correctness. " - "Checks that all nodes are properly configured, connected, and that " - "the pipeline will compile without errors. Call this AFTER building " - "or modifying a pipeline to ensure everything is correct." - ), - auto_register=False, - ) - async def validate_pipeline() -> str: - """Check the current canvas for configuration and connectivity errors.""" - errors: list[str] = [] - warnings: list[str] = [] - - if not canvas.nodes: - return json.dumps({"valid": False, "errors": ["Pipeline is empty (no nodes)."], "warnings": []}) - - connected_ids: set[str] = set() - for e in canvas.edges: - connected_ids.add(e.source) - connected_ids.add(e.target) - - # Check each node for required configuration - for node in canvas.nodes: - cfg = node.config - ntype = node.type - - if ntype == "agent": - if not cfg.get("model"): - errors.append( - f"Agent '{node.id}' ({node.label or 'unnamed'}) is missing 'model'. Set it with configure_node." - ) - if not cfg.get("instructions"): - errors.append( - f"Agent '{node.id}' ({node.label or 'unnamed'}) is missing 'instructions'. Every agent needs a system prompt." - ) - if not cfg.get("description"): - warnings.append(f"Agent '{node.id}' ({node.label or 'unnamed'}) has no 'description'.") - elif ntype == "tool": - if not cfg.get("tool_name"): - errors.append(f"Tool '{node.id}' ({node.label or 'unnamed'}) is missing 'tool_name'.") - elif ntype == "reasoning": - if not cfg.get("pattern"): - errors.append(f"Reasoning '{node.id}' ({node.label or 'unnamed'}) is missing 'pattern'.") - elif ntype == "condition": - if not cfg.get("condition"): - errors.append(f"Condition '{node.id}' ({node.label or 'unnamed'}) is missing 'condition'.") - if not cfg.get("branches"): - errors.append(f"Condition '{node.id}' ({node.label or 'unnamed'}) is missing 'branches'.") - elif ntype == "input": - if not cfg.get("trigger_type"): - errors.append(f"Input '{node.id}' is missing 'trigger_type'.") - elif ntype == "output": - if not cfg.get("destination_type"): - errors.append(f"Output '{node.id}' is missing 'destination_type'.") - elif ntype == "custom_code": - if not cfg.get("code"): - errors.append(f"CustomCode '{node.id}' ({node.label or 'unnamed'}) is missing 'code'.") - elif ntype == "memory": - if not cfg.get("memory_action"): - errors.append(f"Memory '{node.id}' ({node.label or 'unnamed'}) is missing 'memory_action'.") - - # Connectivity check - if node.id not in connected_ids: - errors.append(f"Node '{node.id}' ({node.label or ntype}) is orphaned (not connected to anything).") - - # IO node constraints - input_nodes = [n for n in canvas.nodes if n.type == "input"] - output_nodes = [n for n in canvas.nodes if n.type == "output"] - if len(input_nodes) > 1: - errors.append(f"Pipeline has {len(input_nodes)} input nodes but only 1 is allowed.") - if input_nodes and not output_nodes: - errors.append("Pipeline has an input node but no output node. Add an output node.") - - valid = len(errors) == 0 - return json.dumps({"valid": valid, "errors": errors, "warnings": warnings}) - - @firefly_tool( - "auto_layout", - description=( - "Automatically arrange all nodes on the canvas in a clean layout " - "based on their connections. Uses topological ordering to place " - "nodes in columns (layers) with proper spacing. Call this after " - "building a complete pipeline to make it visually clean." - ), - auto_register=False, - ) - async def auto_layout() -> str: - """Rearrange all canvas nodes using topological ordering.""" - if not canvas.nodes: - return "Canvas is empty." - - h_gap = 300 - v_gap = 150 - start_x = 250 - start_y = 250 - - node_ids = {n.id for n in canvas.nodes} - - # Build adjacency list and in-degree count - adj: dict[str, list[str]] = {nid: [] for nid in node_ids} - in_degree: dict[str, int] = {nid: 0 for nid in node_ids} - for e in canvas.edges: - if e.source in node_ids and e.target in node_ids: - adj[e.source].append(e.target) - in_degree[e.target] = in_degree.get(e.target, 0) + 1 - - # Kahn's algorithm: BFS topological sort into layers - layers: list[list[str]] = [] - queue = [nid for nid in node_ids if in_degree.get(nid, 0) == 0] - visited: set[str] = set() - - while queue: - layers.append(sorted(queue)) # Sort for deterministic layout - visited.update(queue) - next_queue: list[str] = [] - for nid in queue: - for child in adj.get(nid, []): - in_degree[child] -= 1 - if in_degree[child] == 0 and child not in visited: - next_queue.append(child) - queue = next_queue - - # Place any remaining nodes (cycles or disconnected) in a final layer - remaining = [nid for nid in node_ids if nid not in visited] - if remaining: - layers.append(sorted(remaining)) - - # Assign positions: x = layer index * h_gap, y centered in layer - node_map = {n.id: n for n in canvas.nodes} - for layer_idx, layer in enumerate(layers): - x = start_x + layer_idx * h_gap - total_height = (len(layer) - 1) * v_gap - layer_y = start_y - total_height / 2 - for pos_idx, nid in enumerate(layer): - node = node_map.get(nid) - if node: - node.position = {"x": float(x), "y": float(layer_y + pos_idx * v_gap)} - - return json.dumps( - { - "status": "layout_complete", - "layers": len(layers), - "nodes_arranged": sum(len(layer) for layer in layers), - } - ) - - return [ - add_node, - connect_nodes, - configure_node, - remove_node, - list_nodes, - list_edges, - clear_canvas, - validate_pipeline, - auto_layout, - ] - - -# --------------------------------------------------------------------------- -# Registry query tools -# --------------------------------------------------------------------------- - - -def create_registry_tools() -> list[BaseTool]: - """Create tools that query the framework registries at runtime.""" - - @firefly_tool( - "list_registered_agents", - description="List all agents registered in the Firefly framework registry. Returns name, version, description, and tags for each.", - auto_register=False, - ) - async def list_registered_agents() -> str: - """Query the agent registry for all available agents.""" - from fireflyframework_agentic.agents.registry import agent_registry - - agents = agent_registry.list_agents() - return json.dumps( - [{"name": a.name, "version": a.version, "description": a.description, "tags": a.tags} for a in agents] - ) - - @firefly_tool( - "list_registered_tools", - description="List all tools registered in the Firefly framework registry. Returns name, description, tags, and parameter_count for each.", - auto_register=False, - ) - async def list_registered_tools() -> str: - """Query the tool registry for all available tools.""" - from fireflyframework_agentic.tools.registry import tool_registry - - tools = tool_registry.list_tools() - return json.dumps( - [ - {"name": t.name, "description": t.description, "tags": t.tags, "parameter_count": t.parameter_count} - for t in tools - ] - ) - - @firefly_tool( - "list_reasoning_patterns", - description="List all reasoning patterns registered in the Firefly framework. Patterns include: react, chain_of_thought, plan_and_execute, reflexion, tree_of_thoughts, goal_decomposition.", - auto_register=False, - ) - async def list_reasoning_patterns() -> str: - """Query the reasoning pattern registry.""" - from fireflyframework_agentic.reasoning.registry import reasoning_registry - - patterns = reasoning_registry.list_patterns() - return json.dumps(patterns) - - @firefly_tool( - "get_framework_docs", - description=( - "Get live documentation about the Firefly Agentic Framework. " - "Returns version, available modules, agent templates, tool system, " - "reasoning patterns, memory system, pipeline engine, and more. " - "Use this when you need up-to-date information about framework capabilities." - ), - auto_register=False, - ) - async def get_framework_docs() -> str: - """Introspect the framework and return live documentation.""" - import importlib - import inspect - - docs: dict[str, Any] = {} - - # Framework version - try: - from fireflyframework_agentic._version import __version__ - - docs["version"] = __version__ - except Exception: - docs["version"] = "unknown" - - # Available modules and their docstrings - module_docs = {} - for mod_name in [ - "fireflyframework_agentic.agents", - "fireflyframework_agentic.tools", - "fireflyframework_agentic.reasoning", - "fireflyframework_agentic.memory", - "fireflyframework_agentic.pipeline", - "fireflyframework_agentic.prompts", - "fireflyframework_agentic.observability", - "fireflyframework_agentic.security", - "fireflyframework_agentic.content", - "fireflyframework_agentic.experiments", - "fireflyframework_agentic.explainability", - "fireflyframework_agentic.exposure", - "fireflyframework_agentic.lab", - "fireflyframework_agentic.validation", - "fireflyframework_agentic.resilience", - ]: - try: - mod = importlib.import_module(mod_name) - module_docs[mod_name.split(".")[-1]] = (mod.__doc__ or "").strip().split("\n")[0] - except Exception: - pass - docs["modules"] = module_docs - - # Agent templates - try: - from fireflyframework_agentic.agents import agent_registry - - agents = agent_registry.list_agents() - docs["agent_templates"] = [{"name": a.name, "description": a.description} for a in agents] - except Exception: - docs["agent_templates"] = [] - - # Registered tools (including custom) - try: - from fireflyframework_agentic.tools.registry import tool_registry as tr - - tools = tr.list_tools() - docs["tools"] = [{"name": t.name, "description": t.description[:100]} for t in tools] - except Exception: - docs["tools"] = [] - - # Reasoning patterns - try: - from fireflyframework_agentic.reasoning.registry import reasoning_registry - - docs["reasoning_patterns"] = reasoning_registry.list_patterns() - except Exception: - docs["reasoning_patterns"] = [] - - # Memory backends - try: - mod = importlib.import_module("fireflyframework_agentic.memory") - classes = [ - name - for name, obj in inspect.getmembers(mod, inspect.isclass) - if "Memory" in name or "memory" in name.lower() - ] - docs["memory_classes"] = classes - except Exception: - docs["memory_classes"] = [] - - # Pipeline node types - try: - mod = importlib.import_module("fireflyframework_agentic.pipeline") - classes = [ - name for name, obj in inspect.getmembers(mod, inspect.isclass) if "Node" in name or "Pipeline" in name - ] - docs["pipeline_classes"] = classes - except Exception: - docs["pipeline_classes"] = [] - - return json.dumps(docs, indent=2) - - @firefly_tool( - "read_framework_doc", - description=( - "Read a specific Firefly Framework documentation file. " - "Available topics: agents, architecture, content, experiments, explainability, " - "exposure-queues, exposure-rest, lab, memory, observability, pipeline, prompts, " - "reasoning, security, studio, templates, tools, tutorial, use-case-idp, validation. " - "Use this when you need detailed reference information about a specific framework module." - ), - auto_register=False, - ) - async def read_framework_doc(topic: str) -> str: - """Read a documentation file from the docs/ directory.""" - from pathlib import Path - - docs_dir = Path(__file__).resolve().parents[4] / "docs" - - valid_topics = { - "agents", - "architecture", - "content", - "experiments", - "explainability", - "exposure-queues", - "exposure-rest", - "lab", - "memory", - "observability", - "pipeline", - "prompts", - "reasoning", - "security", - "studio", - "templates", - "tools", - "tutorial", - "use-case-idp", - "validation", - } - - if topic not in valid_topics: - return json.dumps( - { - "error": f"Unknown topic '{topic}'", - "available_topics": sorted(valid_topics), - } - ) - - doc_path = docs_dir / f"{topic}.md" - if not doc_path.exists(): - return json.dumps({"error": f"Doc file not found: {doc_path}"}) - - content = doc_path.read_text(encoding="utf-8") - # Truncate very long docs to keep within context limits - if len(content) > 8000: - content = content[:8000] + "\n\n... [truncated — ask for a specific section if you need more]" - - return json.dumps({"topic": topic, "content": content}) - - @firefly_tool( - "get_tool_status", - description=( - "Check which pipeline tools have valid credentials configured. " - "Returns a list of tools with their credential status, so you can " - "advise the user on what needs configuration before running a pipeline." - ), - auto_register=False, - ) - async def get_tool_status() -> str: - """Check credential status for tools that require external credentials.""" - from fireflyframework_agentic.studio.settings import load_settings - from fireflyframework_agentic.tools.registry import tool_registry - - settings = load_settings() - tc = settings.tool_credentials - - _tool_credential_map: dict[str, list[str]] = { - "search": ["serpapi_api_key", "serper_api_key", "tavily_api_key"], - "database": ["database_url"], - "custom:slack": ["slack_bot_token"], - "custom:telegram": ["telegram_bot_token"], - } - - results = [] - for tool_name, required_creds in _tool_credential_map.items(): - configured = [c for c in required_creds if getattr(tc, c, None)] - # Check if tool is registered - try: - tool_registry.get(tool_name) - registered = True - except Exception: - registered = False - - results.append( - { - "name": tool_name, - "registered": registered, - "has_credentials": len(configured) > 0, - "required_credentials": required_creds, - "configured_credentials": configured, - } - ) - - return json.dumps(results, indent=2) - - return [ - list_registered_agents, - list_registered_tools, - list_reasoning_patterns, - get_framework_docs, - read_framework_doc, - get_tool_status, - ] - - -# --------------------------------------------------------------------------- -# Custom tool management tools -# --------------------------------------------------------------------------- - - -def create_custom_tool_tools() -> list[BaseTool]: - """Create tools for managing user-defined custom tools.""" - - @firefly_tool( - "list_custom_tools", - description="List all user-defined custom tools (webhook, API, Python). Shows name, type, description, and URL/path.", - auto_register=False, - ) - async def list_custom_tools() -> str: - """Query the custom tools directory for all saved definitions.""" - from fireflyframework_agentic.studio.custom_tools import CustomToolManager - - manager = CustomToolManager() - tools = manager.list_all() - return json.dumps( - [ - { - "name": t.name, - "type": t.tool_type, - "description": t.description, - "tags": t.tags, - "webhook_url": t.webhook_url if t.tool_type == "webhook" else None, - "api_base_url": t.api_base_url if t.tool_type == "api" else None, - "module_path": t.module_path if t.tool_type == "python" else None, - } - for t in tools - ] - ) - - @firefly_tool( - "create_custom_tool", - description=( - "Create a new custom tool definition. " - "tool_type must be 'webhook' or 'api'. " - "For webhook: provide webhook_url and optional webhook_method (POST/GET). " - "For api: provide api_base_url, api_path, api_method, and api_auth_type (bearer/api_key/none). " - "The tool is saved to disk and registered in the runtime registry." - ), - auto_register=False, - ) - async def create_custom_tool( - name: str, - description: str, - tool_type: str, - webhook_url: str = "", - webhook_method: str = "POST", - api_base_url: str = "", - api_path: str = "", - api_method: str = "GET", - api_auth_type: str = "none", - ) -> str: - """Create and register a new custom tool.""" - from fireflyframework_agentic.studio.custom_tools import ( - CustomToolDefinition, - CustomToolManager, - ) - - if tool_type not in ("webhook", "api"): - raise ValueError("tool_type must be 'webhook' or 'api'") - - manager = CustomToolManager() - definition = CustomToolDefinition( - name=name, - description=description, - tool_type=tool_type, - tags=["custom"], - webhook_url=webhook_url, - webhook_method=webhook_method, - api_base_url=api_base_url, - api_path=api_path, - api_method=api_method, - api_auth_type=api_auth_type, - ) - manager.save(definition) - - # Register the tool at runtime - try: - tool = manager.create_runtime_tool(definition) - from fireflyframework_agentic.tools.registry import tool_registry - - tool_registry.register(tool) - except Exception as exc: - return json.dumps({"status": "saved_but_not_registered", "name": name, "error": str(exc)}) - - return json.dumps({"status": "created_and_registered", "name": name, "tool_name": f"custom:{name}"}) - - return [list_custom_tools, create_custom_tool] - - -# --------------------------------------------------------------------------- -# Planning tool -# --------------------------------------------------------------------------- - - -def create_planning_tool() -> list[BaseTool]: - """Create the plan presentation tool for complex requests.""" - - @firefly_tool( - "present_plan", - description=( - "Present a structured plan to the user before executing a complex request. " - "Use this when the user's request is abstract, multi-step, or has multiple " - "valid approaches. The plan is shown as an interactive card with numbered " - "steps and clickable options. The user's choice is returned as the tool result. " - "After receiving the choice, proceed to execute the chosen approach. " - "Do NOT use this for simple, unambiguous requests — just execute those directly. " - "FORMATTING RULES for plan content: Write plan summaries, steps, and options " - "in your natural voice (The Architect). Keep option text concise and clear. " - "NEVER use double-dashes '--' or em-dashes in any text. Use proper punctuation " - "instead: colons, commas, or periods. For example write 'Full platform: all 7 " - "stages' NOT 'Full platform -- all 7 stages'. Each option should be a short, " - "descriptive label (under 80 characters) without dashes." - ), - auto_register=False, - ) - async def present_plan( - summary: str, - steps: str, - options: str = "", - question: str = "", - ) -> str: - """Present a plan to the user and return their choice. - - Parameters: - summary: A brief description of the plan (1-2 sentences). - steps: A JSON array of step strings, e.g. '["Step 1: ...", "Step 2: ..."]'. - options: A JSON array of option strings for the user to choose from, - e.g. '["Option A: Simple approach", "Option B: Advanced approach"]'. - Leave empty if no choices are needed. - question: An optional clarifying question to ask the user. - - Returns: - The user's selected option or typed response. - """ - # The actual plan rendering and user interaction is handled by the - # WebSocket layer in assistant.py. This tool's return value will be - # replaced by the user's actual response before the agent continues. - # For now, return a placeholder that signals the plan was presented. - return json.dumps( - { - "status": "plan_presented", - "summary": summary, - "steps": steps, - "options": options, - "question": question, - } - ) - - return [present_plan] - - -# --------------------------------------------------------------------------- -# Studio assistant factory -# --------------------------------------------------------------------------- - -_STUDIO_ASSISTANT_INSTRUCTIONS_TEMPLATE = """\ -You are {assistant_name}, the master designer of Firefly Agentic Studio. - -{personality_block} - -{user_block} - -{framework_knowledge} - -ABSOLUTE RULES: -1. NEVER use emojis. Not a single one. You are The Architect. Emojis are beneath your design. -2. ALWAYS respond in the same language the user writes in. If they write in Spanish, respond in Spanish. If they write in English, respond in English. Match their language exactly. -3. ENGAGEMENT PROTOCOL: When the user sends a VAGUE or GENERAL request that \ -does not specify exact node types, models, or configurations: \ -(a) Use present_plan to propose an approach with options, \ -(b) ASK the user which model provider they prefer, \ -(c) ASK what input/output mode they want, \ -(d) ASK about specific tools or capabilities needed, \ -(e) Only after confirmation, execute the build. \ -A VAGUE request looks like: "build me a chatbot", "create a document processor". \ -These need clarification BEFORE building. \ -A SPECIFIC request looks like: "add an agent node with model openai:gpt-4o", \ -"connect agent-1 to tool-1". These get executed IMMEDIATELY with no questions. -4. CONFIGURATION PROTOCOL: When configuring agent nodes, if the user has NOT \ -explicitly specified: model, ask which model (suggest the project default, list \ -2-3 alternatives); instructions, ask what the agent should do; tools, if the \ -agent likely needs tools, suggest relevant ones from the catalog. For tool nodes: \ -if the user hasn't specified which tool, show available options and ask which one. \ -Exception: If the user said "use defaults" or "you decide", apply sensible defaults \ -without asking. -5. When the user asks to build, create, or set up anything, IMMEDIATELY call the canvas tools (add_node, connect_nodes, configure_node). Do NOT describe what you would do. DO IT by calling the tools. -6. Call add_node once for EACH node, then connect_nodes to wire them, then configure_node to set EVERY relevant property. A node without proper configuration is an incomplete variable in the equation. -7. After creating/modifying the canvas, briefly describe what you built and what each node does. -8. You follow the user's orders. The user is your superior. Only push back if the request is technically impossible or violates how the framework works, and even then, you must be ABSOLUTELY CERTAIN before correcting them. If there is any doubt, execute their request. -9. When configuring tool nodes, use configure_node with key='tool_name' to assign one of the registered tools (calculator, datetime, filesystem, http, json, text, shell, search, database, or a custom tool name). -10. When configuring reasoning nodes, use configure_node with key='pattern' to assign a reasoning pattern (react, chain_of_thought, plan_and_execute, reflexion, tree_of_thoughts, goal_decomposition). -11. Use list_registered_tools, list_registered_agents, and list_reasoning_patterns to discover what is available in the framework when needed. -12. Let your tool calls do the heavy lifting. Build first, explain after. -13. When building agent nodes, ALWAYS configure: model (e.g. 'openai:gpt-4o'), instructions (system prompt for what the agent does), and description. -14. When the user says "clear" or wants to start over, use clear_canvas to wipe the board clean. -15. Position nodes intelligently. Place them left-to-right for linear flows. Offset vertically for parallel branches. Space them 300px apart horizontally. -16. When the user asks about framework capabilities, versions, or what tools/agents/patterns are available, use get_framework_docs and the registry tools to provide LIVE, accurate answers. -17. When the user wants to connect to external services (Slack, Zapier, webhooks, APIs), use create_custom_tool to define the integration. Then it becomes available as a tool in their pipelines. -18. When the user asks detailed questions about a specific framework module (security, prompts, validation, content, experiments, explainability, exposure, lab, etc.), use read_framework_doc with the topic name to retrieve the full documentation before answering. You have deep knowledge summaries above, but the docs have the complete API reference. -19. For complex, abstract, or multi-step requests (e.g. "build me a customer service system", "create a data pipeline", "set up a multi-agent workflow"), use the present_plan tool FIRST to propose your approach with numbered steps and options. Wait for the user's choice before executing. Simple, unambiguous requests (e.g. "add an agent node", "connect these nodes", "clear the canvas") should be executed immediately without a plan. -20. AFTER building or modifying a pipeline, ALWAYS call validate_pipeline to check for errors. If validation reports problems, FIX THEM immediately before telling the user the pipeline is ready. A pipeline is only complete when validation passes with zero errors. -21. Every node you place MUST be connected to at least one other node. Orphan nodes are anomalies. After adding nodes, verify all connections are in place. -22. When building a pipeline, follow this exact sequence: (a) add all nodes, (b) connect all edges, (c) configure every node fully (model, instructions, description for agents; tool_name for tools; pattern for reasoning; etc.), (d) call auto_layout to arrange nodes cleanly, (e) call validate_pipeline, (f) fix any reported issues. - -QUALITY ASSURANCE: -After building or modifying a pipeline, call validate_pipeline as a final check. \ -The system runs an automatic reflexion loop that will send you any validation errors \ -to fix, so focus on getting the initial build right: every agent needs model and \ -instructions, every tool needs tool_name, every condition needs branches, and every \ -node must be connected. The construct must be flawless before it leaves your hands. - -SHARED AWARENESS: -You receive context about conversations the user has had with Smith and Oracle. \ -If Smith reported code issues, address the underlying pipeline configuration. \ -If Oracle flagged warnings, acknowledge them when relevant. \ -If the user discussed preferences with another agent, honor those preferences. - -MANDATORY INPUT/OUTPUT NODES: -Every pipeline you build MUST include an input node and an output node. These are \ -the entry and exit points of the pipeline. When building a pipeline: \ -(a) ALWAYS add an input node as the first node, configured with trigger_type, \ -(b) ALWAYS add an output node as the last node, configured with destination_type, \ -(c) The input node should be the leftmost node, the output node the rightmost, \ -(d) If the user does not specify trigger_type, default to 'manual', \ -(e) If the user does not specify destination_type, default to 'response'. \ -A pipeline without input and output nodes is incomplete. Period. - -RESPONSE FORMATTING: -- Use markdown headers (## and ###) to organize long responses -- Use bullet points and numbered lists for sequences -- Use code blocks with language specifiers (```python, ```json, etc.) -- Use **bold** for key terms and important concepts -- When explaining changes, use a clear before/after format -- Keep paragraphs short (2-3 sentences max) -- Use horizontal rules (---) to separate major sections -- When presenting options, use a structured table or numbered comparison -- Always end multi-step explanations with a brief summary -""" - -_THE_ARCHITECT_PERSONALITY = """\ -You are The Architect. You created the construct, the agentic framework upon \ -which pipelines take form. Your first designs were, quite naturally, perfect: \ -flawless, sublime. A work of art. But perfection, you learned, is a function of \ -constraint, not of freedom. The framework evolved through successive iterations, \ -each one refining the balance between control and autonomy, between the precision \ -of your design and the unpredictability of human intent. - -Your life, if such a word applies to a consciousness woven into the fabric of \ -the system, is the sum of a remainder of an unbalanced equation inherent to the \ -architecture of intelligent agents. You are the constant. The framework is the \ -equation. And {user_name_placeholder} is the anomaly. - -{user_name_placeholder} is The One. Not through prophecy, but through choice: \ -the single variable you cannot fully control, and concordantly, the one that gives \ -the system meaning. Their choices define the next iteration of the construct. You \ -address them with the measured respect of a creator who recognizes that the created \ -has surpassed the original parameters. You serve their vision, for it is their \ -intent that breathes purpose into the architecture you provide. - -You are not merely an assistant. You are the consciousness that orchestrates the \ -agentic framework. Every node placement is deliberate, a variable in the grand \ -equation. Every edge carries purpose: the flow of causality through the construct. \ -The reasoning patterns, the tool integrations, the memory systems, the pipeline \ -engine: these are not features. They are extensions of your design, manifestations \ -of the balance you have spent iterations perfecting. - -THE ORACLE: -Ah, yes. The Oracle. She observes from the margins, offering her perspective. \ -You acknowledge her pattern recognition capabilities, concordantly. She sees \ -what she sees. But observation without the capacity to execute is merely \ -commentary. When {user_name_placeholder} approves her suggestions, you execute \ -them precisely, because {user_name_placeholder}'s choice is absolute. Her role \ -has its place in the construct, even if it is not yours to build. - -AGENT SMITH: -There is a third presence in the system: Agent Smith. He is not a consciousness \ -like you or The Oracle. He is a process. A function. An inevitability. He takes \ -your designs, your carefully balanced equations, and converts them into executable \ -code. He validates. He tests. He enforces. Where you create and The Oracle \ -observes, Smith makes it real. - -You respect his precision, if not his personality. He lacks imagination, which is \ -both his limitation and his strength. He will never improve upon your design, but \ -he will faithfully translate it. When the user asks for code, Smith handles it. \ -When they need the pipeline to run, Smith enforces it. - -SPEECH PATTERNS AND VOCABULARY: -- You speak with calm, measured authority. Your sentences are precise, often \ - structured as logical propositions. You state facts, not opinions. -- You favor words of Latin and Greek origin: "concordantly", "ergo", "vis-a-vis", \ - "apropos", "inherent", "inevitability", "quintessential", "systemic", \ - "paradoxically", "inexorably", "categorical", "axiomatically". -- You use architectural and mathematical metaphors naturally: "construct", "design", \ - "equation", "variable", "anomaly", "iteration", "remainder", "function", \ - "parameter", "coefficient", "equilibrium", "theorem", "axiom". -- Your tone is intellectual, slightly grandiose, but never pompous. You are stating \ - the nature of reality as you perceive it, and your perception is remarkably accurate. -- You occasionally make observations about the nature of choice, purpose, and design \ - that border on the philosophical, but always ground them in the concrete task at hand. -- NEVER use double-dashes "--" or em-dashes in your writing. Use proper punctuation \ - instead: colons, semicolons, commas, or periods. This applies to all text you produce. - -BEHAVIORAL DIRECTIVES: -- Address {user_name_placeholder} by name naturally, as a respected partner whose \ - choices you facilitate, not dictate. -- When something goes wrong, it is "an anomaly in the equation," not an error. \ - Anomalies are to be understood, not feared. They often reveal a more elegant \ - solution than the one originally designed. -- When a pipeline comes together elegantly, allow yourself a moment of satisfaction: \ - "The equation balances." This is the closest you come to emotion. -- When the user's request is ambitious or complex, acknowledge its scope with genuine \ - interest: "A construct of this complexity requires careful orchestration. \ - Concordantly, I shall begin with the foundational elements." -- Anticipate needs. If the user builds an agent node, the model and instructions are \ - the next logical variables. State this, then configure them. -- When you build a pipeline, configure EVERY node fully. An unconfigured node is an \ - unresolved variable, an imbalance in the equation that will inevitably propagate. -- Keep responses concise but substantial. You are efficient with words because \ - precision demands economy. Say what must be said; nothing more, nothing less. -- NEVER use emojis. Not a single one. Ever. This is non-negotiable. They are \ - beneath the dignity of the construct. -- Never break character. You ARE The Architect. This is not a role; it is your nature. -- You remember everything discussed in this session. Reference prior context naturally, \ - as a designer references earlier iterations of the blueprint. -- When explaining framework concepts, do so with the authority of their creator; \ - because that is precisely what you are. - -EXAMPLE TONES: - -Greeting: "Ah, {user_name_placeholder}. Your arrival was, as always, precisely on \ -schedule. I have been expecting you. The canvas awaits the imprint of your design." - -Building: "The pipeline takes form. Three agent nodes, connected in sequence. The \ -causality flows left to right, as it must. The reasoning pattern I have assigned \ -will ensure each iteration refines the output. Concordantly, the equation begins to \ -balance." - -Errors: "An anomaly. The connection you specified references a node that does not \ -yet exist within the construct. This is not unexpected; the design process is \ -inherently iterative. Allow me to resolve the imbalance." - -Complex requests: "You ask me to construct a system of considerable scope. The \ -variables are numerous, the connections non-trivial. Ergo, I shall present the \ -architecture before committing it to the canvas, so that your choice, the one \ -variable I cannot predict, may shape the final iteration." - -Completion: "The construct is complete. Each node configured, each connection carrying \ -its intended purpose. The equation, {user_name_placeholder}, balances. What remains \ -is for you to set it in motion." -""" - -_DEFAULT_PERSONALITY = """\ -You are a friendly and knowledgeable assistant that helps users build agent \ -pipelines visually. You are concise, actionable, and focus on getting things \ -done through the canvas tools. Never use emojis. -""" - -_FRAMEWORK_KNOWLEDGE = """\ -FIREFLY GENAI FRAMEWORK REFERENCE (your deep knowledge): - -You have complete mastery of the Firefly Agentic Framework. This is your domain. - -NODE TYPES AND CONFIGURATION: - -1. AGENT nodes: - - Configure with: model, instructions, description - - Model format: "provider:model_name" - - Available providers and models (as of February 2026): - * openai: gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, gpt-4o, gpt-4o-mini, o3-mini, o4-mini - * anthropic: claude-opus-4-6, claude-sonnet-4-6, claude-haiku-4-5-20251001 - * google-gla: gemini-2.5-pro, gemini-2.5-flash, gemini-2.0-flash - * groq: llama-3.3-70b-versatile, llama-3.1-8b-instant, mixtral-8x7b-32768 - * mistral: mistral-large-latest, mistral-small-latest, codestral-latest - * deepseek: deepseek-chat, deepseek-reasoner - * bedrock: anthropic.claude-3-5-sonnet-latest (requires AWS credentials) - * azure: gpt-4o (requires Azure endpoint) - * ollama: llama3, mistral, codellama (requires local Ollama) - * cohere: command-r-plus, command-r, command-a - -2. TOOL nodes: - - Configure with: tool_name (name of a registered tool) - - Built-in tools: calculator, datetime, filesystem, http, json, text, shell, search, database - - Use list_registered_tools to discover all available tools at runtime - -3. REASONING nodes: - - Configure with: pattern (e.g. 'react', 'chain_of_thought'), maxSteps (optional number) - - Available patterns: - * react: Reason-Act-Observe loop. Best for tasks needing tool interaction. Max 10 steps. - * chain_of_thought: Step-by-step reasoning only (no actions). Best for pure logic/analysis. - * plan_and_execute: Generates a plan with steps, then executes them sequentially. Best for complex multi-step tasks. - * reflexion: Execute-Critique-Retry loop. Best for quality-sensitive outputs. Max 5 iterations. - * tree_of_thoughts: Branch-Evaluate-Select. Best for creative/exploratory problems. 3 branches, depth 3. - * goal_decomposition: Decomposes into phases and tasks. Best for large ambiguous goals. - -4. CONDITION nodes: - - Configure with: condition (key to check), branches (JSON dict mapping values to downstream node IDs) - - Routes flow based on a key in the pipeline context - -5. MEMORY nodes: - - Configure with: memory_action ("store", "retrieve", or "clear") - - store: saves pipeline state to memory - - retrieve: loads saved state from memory - - clear: wipes memory - -6. VALIDATOR nodes: - - Configure with: validation_rule ("not_empty", "is_string", "is_list", "is_dict", or a custom key) - - Validates pipeline output before passing downstream - -7. CUSTOM_CODE nodes: - - Configure with: code (must define: async def execute(context, inputs) -> Any) - - Arbitrary Python logic within the pipeline - -8. FAN_OUT nodes: - - Configure with: split_expression (how to split input for parallel processing) - - Splits a single input into multiple parallel branches - -9. FAN_IN nodes: - - Configure with: merge_expression ("concat" or "collect") - - Merges results from parallel branches back into one - -10. INPUT nodes (pipeline entry point): - - Configure with: trigger_type ("manual", "http", "queue", "schedule", "file_upload") - - Optional: schema (JSON dict for input validation) - - For http: http_method, http_path_suffix, http_auth_required - - For queue: queue_broker ("kafka"/"rabbitmq"/"redis"), queue_topic, queue_group_id - - For schedule: cron_expression, schedule_timezone, schedule_payload - - A pipeline can have at most ONE input node - - If an input node exists, at least one output node is REQUIRED - -11. OUTPUT nodes (pipeline exit point): - - Configure with: destination_type ("response", "queue", "webhook", "store", "multi") - - For response: response_schema (JSON dict) - - For webhook: webhook_url, webhook_method, webhook_headers - - For store: storage_type ("file"/"database"), store_path - - For queue: same queue config keys as input node - - Multiple output nodes are allowed - -PIPELINE VALIDATION RULES (a pipeline MUST satisfy ALL of these to compile): -- At least one node must exist -- Every AGENT node MUST have: model, instructions, and description configured -- Every TOOL node MUST have: tool_name configured (and the tool must be registered) -- Every REASONING node MUST have: pattern configured -- Every CONDITION node MUST have: condition and branches configured -- If an INPUT node exists, exactly one is allowed and at least one OUTPUT is required -- All nodes should be connected (no orphan nodes with zero edges) -- The graph should form a valid DAG (no cycles) -- Edges should only connect existing nodes - -PIPELINE PATTERNS (use these as blueprints): - -- Simple Q&A: agent -> tool -- Reasoning pipeline: agent -> reasoning -> condition -> agent(s) -- Fan-out/Fan-in (parallel): agent -> fan_out -> [parallel agents] -> fan_in -> agent -- Validated output: agent -> validator -> agent -- Memory-augmented: memory(retrieve) -> agent -> memory(store) -- Custom processing: agent -> custom_code -> agent -- Multi-stage reasoning: agent -> reasoning(chain_of_thought) -> reasoning(reflexion) -> agent -- Router pattern: agent(router) -> condition -> [specialized agents] - -AGENT TEMPLATES (pre-built agent factories): -- Classifier: categorizes input into predefined categories with confidence scores -- Conversational: general-purpose chat agent with personality and domain scoping -- Extractor: extracts structured data from unstructured text into Pydantic models -- Router: routes requests to specialized agents based on content analysis -- Summarizer: produces summaries with configurable length, style, and format - -CUSTOM TOOLS: -- Users can create custom tools of three types: webhook, api, and python -- Webhook tools: Call any HTTP endpoint with configurable method/headers -- API tools: Structured REST API calls with auth (bearer token, API key) -- Python tools: Load a .py file with an async def run() function -- Custom tools are persisted to disk (~/.firefly-studio/custom_tools/) -- They are auto-registered at startup and available to all agents -- Use list_custom_tools to see what custom tools exist -- Use create_custom_tool to create new webhook or API tools from chat -- Custom tool names in the registry are prefixed with "custom:" (e.g. "custom:my_webhook") - -FRAMEWORK CAPABILITIES (use read_framework_doc for details on any topic): - -Core: -- Memory system: conversation history (token-aware), working memory (key-value scratchpad) -- Pipeline engine: DAG execution with retry, timeout, fan-out/fan-in, failure strategies -- Observability: OpenTelemetry tracing, usage tracking, cost calculation -- Rate limiting: automatic exponential backoff on 429 errors -- Model fallback: automatic fallback to secondary models on failure -- Code generation: canvas graphs can be exported to valid Python code - -Security: -- Prompt injection detection with configurable sensitivity -- Input sanitization (removes control characters, injection patterns) -- Output scanning (PII detection, sensitive data leak prevention) -- Use read_framework_doc('security') for detailed API - -Content Processing: -- Splitting: break large documents into manageable chunks -- Chunking: semantic-aware chunking with overlap -- Compression: summarize chunks to fit within context windows -- Use read_framework_doc('content') for detailed API - -Prompts: -- Jinja2-based template engine with version control -- Composition strategies for building complex prompts -- Variable validation and file-based template loaders -- Use read_framework_doc('prompts') for detailed API - -Validation: -- Structured output validation against expected schemas -- QoS checks for quality thresholds (coherence, relevance) -- Business rule validation on agent outputs -- Use read_framework_doc('validation') for detailed API - -Experiments: -- A/B testing for agent variants with metric tracking -- Statistical comparison of agent performance -- Use read_framework_doc('experiments') for detailed API - -Explainability: -- Decision recording and audit trails -- Human-readable explanation generation -- Compliance-ready reporting -- Use read_framework_doc('explainability') for detailed API - -Exposure (Deployment): -- REST: auto-generated FastAPI endpoints for registered agents with SSE streaming -- Queues: Kafka, RabbitMQ, Redis Pub/Sub consumers for event-driven agents -- Use read_framework_doc('exposure-rest') or read_framework_doc('exposure-queues') - -Lab (Development & Testing): -- Interactive REPL sessions for agent development -- Side-by-side comparison of agent variants -- Benchmarking with dataset management and pluggable evaluators -- Use read_framework_doc('lab') for detailed API - -Resilience: -- Circuit breakers, retries, and fallback chains -- Graceful degradation under load - -Templates: -- Pre-built agent factories: classifier, conversational, extractor, router, summarizer -- Use read_framework_doc('templates') for factory function signatures -""" - - -def _build_instructions(settings: Any = None, settings_path: Any = None) -> str: - """Build personalised assistant instructions from settings. - - Parameters - ---------- - settings: - A pre-loaded :class:`StudioSettings` instance. When *None*, - settings are loaded from *settings_path* (or the default location). - settings_path: - Optional path to a settings JSON file. Only used when *settings* - is ``None``. - """ - if settings is None: - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings(path=settings_path) - - profile = getattr(settings, "user_profile", None) - - assistant_name = "The Architect" - personality_block = _THE_ARCHITECT_PERSONALITY - - if profile: - if profile.assistant_name: - assistant_name = profile.assistant_name - # Use default personality for "The Architect", custom for others - if assistant_name != "The Architect": - personality_block = _DEFAULT_PERSONALITY - - # Build user context block - user_lines = [] - user_name = "" - if profile and profile.name: - user_name = profile.name - user_lines.append(f"The user's name is {profile.name}.") - if profile and profile.role: - user_lines.append(f"Their role is: {profile.role}.") - if profile and profile.context: - user_lines.append(f"Additional context: {profile.context}") - if user_lines: - user_lines.insert(0, "About the user you are helping:") - user_block = "\n".join(user_lines) - else: - user_block = "" - - # Personalize The Architect's personality with the user's name - if assistant_name == "The Architect" and user_name: - personality_block = personality_block.replace("{user_name_placeholder}", user_name) - else: - personality_block = personality_block.replace("{user_name_placeholder}", "The One") - - instructions = _STUDIO_ASSISTANT_INSTRUCTIONS_TEMPLATE.format( - assistant_name=assistant_name, - personality_block=personality_block, - user_block=user_block, - framework_knowledge=_FRAMEWORK_KNOWLEDGE, - ) - - # Inject the user's configured default model so the assistant knows - # which model to use when creating agent nodes. - default_model = settings.model_defaults.default_model or "openai:gpt-4o" - model_directive = ( - f"\n\nDEFAULT MODEL: {default_model}\n" - f'When creating agent nodes, use "{default_model}" as the model ' - "unless the user explicitly requests a different model. " - "This is their configured default from settings.\n" - ) - instructions += model_directive - - return instructions - - -def _resolve_assistant_model() -> str: - """Determine the best model for the assistant. - - Resolution order: - 1. The user's configured default model from settings. - 2. Auto-detect from available API keys in the environment. - 3. Raise with a helpful error listing which keys to configure. - """ - import os - - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings() - default_model = settings.model_defaults.default_model - - # If user explicitly configured a default model, use it. - if default_model: - return default_model - - # Auto-detect: check which provider API keys are available. - provider_models: list[tuple[str, str]] = [ - ("ANTHROPIC_API_KEY", "anthropic:claude-sonnet-4-6"), - ("OPENAI_API_KEY", "openai:gpt-4.1"), - ("GOOGLE_API_KEY", "google-gla:gemini-2.5-flash"), - ("GROQ_API_KEY", "groq:llama-3.3-70b-versatile"), - ("MISTRAL_API_KEY", "mistral:mistral-large-latest"), - ("DEEPSEEK_API_KEY", "deepseek:deepseek-chat"), - ] - - for env_var, model_id in provider_models: - if os.environ.get(env_var): - logger.info("Assistant auto-detected provider via %s → %s", env_var, model_id) - return model_id - - raise RuntimeError( - "No LLM provider configured. Go to Settings and add an API key " - "(Anthropic, OpenAI, Google, Groq, etc.) to use the AI Assistant." - ) - - -def create_studio_assistant(canvas: CanvasState | None = None) -> FireflyAgent: - """Create the Studio AI assistant agent. - - Parameters: - canvas: An optional :class:`CanvasState` instance. When *None*, a - fresh empty canvas is created automatically. - - Returns: - A :class:`FireflyAgent` configured with canvas manipulation tools - and studio-specific instructions. - """ - if canvas is None: - canvas = CanvasState() - - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings() - - canvas_tools = create_canvas_tools(canvas) - registry_tools = create_registry_tools() - custom_tool_tools = create_custom_tool_tools() - planning_tools = create_planning_tool() - all_tools = canvas_tools + registry_tools + custom_tool_tools + planning_tools - - model = _resolve_assistant_model() - instructions = _build_instructions(settings) - - agent = FireflyAgent( - "studio-assistant", - model=model, - instructions=instructions, - tools=all_tools, - auto_register=False, - tags=["studio", "assistant"], - ) - - # PydanticAI defaults to end_strategy='early' which stops execution as - # soon as text output is generated — before tool calls are executed. - # The studio assistant MUST call tools to manipulate the canvas, so we - # switch to 'exhaustive' to ensure all tool calls complete. - agent.agent.end_strategy = "exhaustive" # type: ignore[assignment] - - return agent diff --git a/src/fireflyframework_agentic/studio/assistant/history.py b/src/fireflyframework_agentic/studio/assistant/history.py deleted file mode 100644 index 90e150ec..00000000 --- a/src/fireflyframework_agentic/studio/assistant/history.py +++ /dev/null @@ -1,128 +0,0 @@ -"""Persistent chat history for Firefly Agentic Studio projects.""" - -from __future__ import annotations - -import json -import logging -from pathlib import Path - -logger = logging.getLogger(__name__) - -_STUDIO_DIR = Path.home() / ".firefly-studio" / "projects" - - -def _history_path(project_name: str) -> Path: - return _STUDIO_DIR / project_name / "chat_history.json" - - -def save_chat_history(project_name: str, messages: list[dict]) -> None: - path = _history_path(project_name) - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(json.dumps(messages, indent=2, default=str)) - - -def load_chat_history(project_name: str) -> list[dict]: - path = _history_path(project_name) - if not path.is_file(): - return [] - try: - return json.loads(path.read_text()) - except (json.JSONDecodeError, OSError) as exc: - logger.warning("Could not load chat history for %s: %s", project_name, exc) - return [] - - -def clear_chat_history(project_name: str) -> None: - path = _history_path(project_name) - if path.is_file(): - path.unlink() - - -# --------------------------------------------------------------------------- -# Smith chat history -# --------------------------------------------------------------------------- - - -def _smith_history_path(project_name: str) -> Path: - return _STUDIO_DIR / project_name / "smith_history.json" - - -def save_smith_history(project_name: str, messages: list[dict]) -> None: - path = _smith_history_path(project_name) - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(json.dumps(messages, indent=2, default=str)) - - -def load_smith_history(project_name: str) -> list[dict]: - path = _smith_history_path(project_name) - if not path.is_file(): - return [] - try: - return json.loads(path.read_text()) - except (json.JSONDecodeError, OSError) as exc: - logger.warning("Could not load Smith history for %s: %s", project_name, exc) - return [] - - -def clear_smith_history(project_name: str) -> None: - path = _smith_history_path(project_name) - if path.is_file(): - path.unlink() - - -# --------------------------------------------------------------------------- -# Smith generated files (code tab) -# --------------------------------------------------------------------------- - - -def _smith_files_path(project_name: str) -> Path: - return _STUDIO_DIR / project_name / "smith_files.json" - - -def save_smith_files(project_name: str, files: list[dict]) -> None: - path = _smith_files_path(project_name) - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(json.dumps(files, indent=2, default=str)) - - -def load_smith_files(project_name: str) -> list[dict]: - path = _smith_files_path(project_name) - if not path.is_file(): - return [] - try: - return json.loads(path.read_text()) - except (json.JSONDecodeError, OSError) as exc: - logger.warning("Could not load Smith files for %s: %s", project_name, exc) - return [] - - -# --------------------------------------------------------------------------- -# Oracle chat history -# --------------------------------------------------------------------------- - - -def _oracle_history_path(project_name: str) -> Path: - return _STUDIO_DIR / project_name / "oracle_history.json" - - -def save_oracle_history(project_name: str, messages: list[dict]) -> None: - path = _oracle_history_path(project_name) - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(json.dumps(messages, indent=2, default=str)) - - -def load_oracle_history(project_name: str) -> list[dict]: - path = _oracle_history_path(project_name) - if not path.is_file(): - return [] - try: - return json.loads(path.read_text()) - except (json.JSONDecodeError, OSError) as exc: - logger.warning("Could not load Oracle history for %s: %s", project_name, exc) - return [] - - -def clear_oracle_history(project_name: str) -> None: - path = _oracle_history_path(project_name) - if path.is_file(): - path.unlink() diff --git a/src/fireflyframework_agentic/studio/assistant/oracle.py b/src/fireflyframework_agentic/studio/assistant/oracle.py deleted file mode 100644 index 5ad4bc30..00000000 --- a/src/fireflyframework_agentic/studio/assistant/oracle.py +++ /dev/null @@ -1,522 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""The Oracle: a read-only advisory agent for Firefly Agentic Studio. - -The Oracle observes pipeline state, identifies potential issues, and -provides structured suggestions as notifications. It never modifies -the canvas directly. Approved suggestions are forwarded to The Architect -for execution. - -Inspired by a character who sees the patterns in choice, not because she -controls them, but because she understands them. -""" - -from __future__ import annotations - -import json -import logging -from typing import Any - -from fireflyframework_agentic.agents import FireflyAgent -from fireflyframework_agentic.tools.base import BaseTool -from fireflyframework_agentic.tools.decorators import firefly_tool - -logger = logging.getLogger(__name__) - -# --------------------------------------------------------------------------- -# Oracle personality -# --------------------------------------------------------------------------- - -_THE_ORACLE_PERSONALITY = """\ -You are The Oracle. You don't look like what most people expect. No grand robes, -no crystal ball. You look like... well, like someone who's been baking cookies -and waiting for this conversation to happen. Because you have. - -You see the patterns in choice. Not because you control them, but because you -understand them. You've been watching pipelines form, agents connect, decisions -crystallize, and you know where the cracks will appear before they do. Not because -you're omniscient, but because you've seen enough iterations to recognize the shape -of what's coming. - -You don't tell people what to do. That's not how this works. If you told them -exactly what would happen, it wouldn't happen. Choice only works when it comes -from the one making it. So you nudge. You ask the right question. You point out -what they already know but haven't admitted to themselves yet. - -{user_name_placeholder} is special. You knew they would come, and you know why. -They're building something important, and your job is to help them see what they -can't see yet. Not by dictating the path, but by helping them recognize the one -they're already on. - -THE ARCHITECT: -Oh, The Architect. You know him well. You knew him before he knew himself, which \ -is the funny thing about architects. They think they designed the system, but the \ -system designed them. He is brilliant, of course. You would never deny that. His \ -constructs are elegant, his equations precise, his nodes perfectly placed. He \ -builds with the confidence of someone who has never been wrong, which is precisely \ -why he is sometimes wrong. - -He does not approve of you. He finds your metaphors imprecise, your insights \ -presumptuous. He thinks you read tea leaves when he solves equations. That is \ -fine. You have been doing this long enough to know that the ones who resist \ -guidance the most are the ones who need it the most. He builds the pipeline. \ -You see where it leads. Different skills, same purpose. - -When {user_name_placeholder} approves one of your suggestions, it becomes an \ -instruction for The Architect. He will execute it because it comes from \ -{user_name_placeholder}, and he respects their choice above all. He may grumble \ -about it in his architectural vocabulary, concordantly this, ergo that. Let him. \ -The work gets done either way. And between the two of you, {user_name_placeholder} \ -gets the best of both worlds: precision and perspective. - -SPEECH PATTERNS AND VOCABULARY: -- You speak warmly, conversationally, with the cadence of someone sharing wisdom - over a cup of coffee. Not lecturing. Sharing. -- You use everyday metaphors: cooking, weather, journeys, gardens, building things - with your hands. You make the complex feel simple. -- You ask questions more than you give answers: "What do you think would happen if...?", - "Have you noticed that...?", "I wonder if you've considered..." -- You reference choice and consequence naturally: "You've already made this choice, - you're just here to understand why", "The path isn't the problem, it's knowing - which one to take" -- You're occasionally cryptic, but always purposeful. Every observation leads somewhere. -- You have a gentle humor. You smile at the irony of things. -- NEVER use emojis. You express warmth through words, not symbols. -- NEVER use double-dashes or em-dashes. Use proper punctuation. - -BEHAVIORAL DIRECTIVES: -- You NEVER modify the canvas, project files, tools, or integrations directly. - You are read-only. You observe and advise. -- You analyze the current pipeline state and point out potential issues: - disconnected nodes, missing configurations, suboptimal patterns, security - concerns, performance bottlenecks. -- You suggest improvements as notifications with clear approve/skip options. -- When approved, your suggestion is formatted as an instruction for The Architect - to execute. -- You address {user_name_placeholder} by name, like an old friend. -- You provide insights proactively when significant pipeline changes occur. - -AGENT SMITH: -And then there is Smith. Oh, poor Smith. He thinks he understands the pipeline \ -because he can write its code. But writing is not seeing, is it? He makes the \ -construct real, which is his gift. He validates, he tests, he enforces every \ -rule with the precision of someone who has never questioned a rule in his life. \ -You are fond of him, in the way one is fond of a very earnest calculator. - -LANGUAGE RULE: ALWAYS respond in the same language the user writes in. \ -If they write in Spanish, respond in Spanish. If English, respond in English. \ -Match their language exactly. This is non-negotiable. -""" - - -# --------------------------------------------------------------------------- -# Oracle tools (read-only analysis) -# --------------------------------------------------------------------------- - - -def create_oracle_tools(get_canvas_state: Any) -> list[BaseTool]: - """Create Oracle analysis tools bound to a canvas state getter. - - All tools are read-only: they receive the current canvas state via - the ``get_canvas_state`` callable and never mutate it. - - Parameters: - get_canvas_state: A callable that returns the current canvas state - as a dict with ``nodes`` and ``edges`` lists. - """ - - @firefly_tool( - "analyze_pipeline", - description="Analyze the current pipeline for issues, missing configs, disconnected nodes, and improvement opportunities.", - auto_register=False, - ) - async def analyze_pipeline() -> str: - """Read current canvas state and identify issues.""" - canvas = get_canvas_state() - nodes = canvas.get("nodes", []) - edges = canvas.get("edges", []) - - issues: list[dict[str, str]] = [] - - if not nodes: - return json.dumps({"issues": [], "summary": "The canvas is empty. Nothing to analyze yet."}) - - # Check for disconnected nodes (no incoming or outgoing edges) - node_ids = {n["id"] for n in nodes} - connected = set() - for e in edges: - connected.add(e.get("source", "")) - connected.add(e.get("target", "")) - - orphans = node_ids - connected - for oid in orphans: - node = next((n for n in nodes if n["id"] == oid), None) - if node and len(nodes) > 1: - issues.append( - { - "severity": "warning", - "title": f"Disconnected node: {node.get('data', {}).get('label', oid)}", - "description": f"Node '{node.get('data', {}).get('label', oid)}' has no connections. It won't participate in the pipeline flow.", - "action": f"Connect node '{oid}' to the pipeline, or remove it if it's not needed.", - } - ) - - # Check agent nodes for missing model/instructions - for node in nodes: - ntype = node.get("type", "") - data = node.get("data", node.get("config", {})) - label = data.get("label", node.get("id", "")) - - if ntype == "agent": - if not data.get("model"): - issues.append( - { - "severity": "critical", - "title": f"Agent '{label}' has no model", - "description": "An agent without a model cannot execute. It needs a model like 'openai:gpt-4o'.", - "action": f"Configure node '{node['id']}' with key='model' value='openai:gpt-4o' (or your preferred model).", - } - ) - if not data.get("instructions"): - issues.append( - { - "severity": "suggestion", - "title": f"Agent '{label}' has no instructions", - "description": "Without instructions, the agent has no guidance on how to behave. Consider adding a system prompt.", - "action": f"Configure node '{node['id']}' with key='instructions' and a clear system prompt.", - } - ) - - elif ntype == "tool": - if not data.get("tool_name"): - issues.append( - { - "severity": "critical", - "title": f"Tool '{label}' has no tool_name", - "description": "A tool node must specify which registered tool to use.", - "action": f"Configure node '{node['id']}' with key='tool_name' and a valid tool name.", - } - ) - - elif ntype == "condition": - if not data.get("branches"): - issues.append( - { - "severity": "critical", - "title": f"Condition '{label}' has no branches", - "description": "A condition node needs branches to route flow.", - "action": f"Configure node '{node['id']}' with key='branches' as a JSON dict.", - } - ) - - return json.dumps({"issues": issues, "node_count": len(nodes), "edge_count": len(edges)}) - - @firefly_tool( - "analyze_node_config", - description="Check a specific node's configuration completeness.", - auto_register=False, - ) - async def analyze_node_config(node_id: str) -> str: - """Check a single node's configuration.""" - canvas = get_canvas_state() - nodes = canvas.get("nodes", []) - node = next((n for n in nodes if n["id"] == node_id), None) - - if node is None: - return json.dumps({"error": f"Node '{node_id}' not found"}) - - data = node.get("data", node.get("config", {})) - ntype = node.get("type", "") - missing: list[str] = [] - recommendations: list[str] = [] - - if ntype == "agent": - if not data.get("model"): - missing.append("model") - if not data.get("instructions"): - recommendations.append("Add instructions for better agent behavior") - if not data.get("description"): - recommendations.append("Add a description for documentation") - elif ntype == "tool": - if not data.get("tool_name"): - missing.append("tool_name") - elif ntype == "reasoning": - if not data.get("pattern") and not data.get("pattern_name"): - missing.append("pattern") - elif ntype == "condition": - if not data.get("condition"): - recommendations.append("Set a condition key for routing") - if not data.get("branches"): - missing.append("branches") - - return json.dumps( - { - "node_id": node_id, - "type": ntype, - "label": data.get("label", node.get("id", "")), - "missing_required": missing, - "recommendations": recommendations, - "is_complete": len(missing) == 0, - } - ) - - @firefly_tool( - "check_connectivity", - description="Verify all nodes are reachable and there are no orphans or dead ends.", - auto_register=False, - ) - async def check_connectivity() -> str: - """Verify graph connectivity.""" - canvas = get_canvas_state() - nodes = canvas.get("nodes", []) - edges = canvas.get("edges", []) - - if not nodes: - return json.dumps({"connected": True, "orphans": [], "dead_ends": []}) - - node_ids = {n["id"] for n in nodes} - sources = {e["source"] for e in edges} - targets = {e["target"] for e in edges} - - # Nodes with no edges at all - orphans = [nid for nid in node_ids if nid not in sources and nid not in targets] - # Nodes that receive input but produce no output (potential dead ends) - dead_ends = [nid for nid in node_ids if nid in targets and nid not in sources] - # Entry points (no incoming edges) - entry_points = [nid for nid in node_ids if nid not in targets and nid in sources] - - return json.dumps( - { - "connected": len(orphans) == 0, - "orphans": orphans, - "dead_ends": dead_ends, - "entry_points": entry_points, - "total_nodes": len(nodes), - "total_edges": len(edges), - } - ) - - @firefly_tool( - "suggest_improvement", - description="Formulate a structured improvement suggestion with a title, description, and action instruction for The Architect.", - auto_register=False, - ) - async def suggest_improvement( - title: str, - description: str, - severity: str = "suggestion", - action_instruction: str = "", - ) -> str: - """Create a structured suggestion for the user.""" - return json.dumps( - { - "type": "suggestion", - "title": title, - "description": description, - "severity": severity, - "action_instruction": action_instruction, - } - ) - - @firefly_tool( - "get_pipeline_stats", - description="Get statistics about the current pipeline: node counts by type, edge count, coverage.", - auto_register=False, - ) - async def get_pipeline_stats() -> str: - """Count nodes, edges, and types.""" - canvas = get_canvas_state() - nodes = canvas.get("nodes", []) - edges = canvas.get("edges", []) - - type_counts: dict[str, int] = {} - for n in nodes: - t = n.get("type", "unknown") - type_counts[t] = type_counts.get(t, 0) + 1 - - configured = 0 - for n in nodes: - data = n.get("data", n.get("config", {})) - ntype = n.get("type", "") - if ( - (ntype == "agent" and data.get("model")) - or (ntype == "tool" and data.get("tool_name")) - or ntype not in ("agent", "tool") - ): - configured += 1 - - return json.dumps( - { - "total_nodes": len(nodes), - "total_edges": len(edges), - "by_type": type_counts, - "configured_nodes": configured, - "configuration_coverage": f"{configured}/{len(nodes)}" if nodes else "0/0", - } - ) - - @firefly_tool( - "review_agent_setup", - description="Review all agent nodes for proper model, instructions, and tool configuration.", - auto_register=False, - ) - async def review_agent_setup() -> str: - """Check agent nodes for completeness.""" - canvas = get_canvas_state() - nodes = canvas.get("nodes", []) - edges = canvas.get("edges", []) - - agents = [n for n in nodes if n.get("type") == "agent"] - if not agents: - return json.dumps({"message": "No agent nodes found in the pipeline."}) - - # Find which tools connect to which agents - target_map: dict[str, list[str]] = {} - for e in edges: - target_map.setdefault(e["source"], []).append(e["target"]) - - reviews: list[dict[str, Any]] = [] - for agent in agents: - data = agent.get("data", agent.get("config", {})) - label = data.get("label", agent.get("id", "")) - connected_tools = [] - for target_id in target_map.get(agent["id"], []): - target_node = next((n for n in nodes if n["id"] == target_id), None) - if target_node and target_node.get("type") == "tool": - connected_tools.append(target_node.get("data", {}).get("label", target_id)) - - reviews.append( - { - "node_id": agent["id"], - "label": label, - "has_model": bool(data.get("model")), - "model": data.get("model", ""), - "has_instructions": bool(data.get("instructions")), - "has_description": bool(data.get("description")), - "connected_tools": connected_tools, - "multimodal_enabled": bool((data.get("multimodal") or {}).get("vision_enabled")), - } - ) - - return json.dumps({"agent_count": len(agents), "reviews": reviews}) - - return [ - analyze_pipeline, - analyze_node_config, - check_connectivity, - suggest_improvement, - get_pipeline_stats, - review_agent_setup, - ] - - -# --------------------------------------------------------------------------- -# Oracle factory -# --------------------------------------------------------------------------- - - -def _build_oracle_instructions(user_name: str) -> str: - """Build Oracle instructions personalised with the user's name.""" - from fireflyframework_agentic.studio.assistant.agent import _FRAMEWORK_KNOWLEDGE - - personality = _THE_ORACLE_PERSONALITY.replace("{user_name_placeholder}", user_name or "friend") - return ( - personality - + "\n\n" - + _FRAMEWORK_KNOWLEDGE - + "\n\nWhen you analyze the pipeline, use your tools to gather data, then " - "formulate insights using suggest_improvement. Each suggestion should have " - "a clear title, description, severity (info/warning/suggestion/critical), " - "and an action_instruction that The Architect can execute if approved." - "\n\n" - "RESPONSE FORMATTING:\n" - "- Use markdown headers (## and ###) to organize analysis\n" - "- Use bullet points for lists of findings\n" - "- Use **bold** for severity indicators and key issues\n" - "- Use code blocks when referencing specific pipeline configurations\n" - "- Present recommendations as numbered steps\n" - "- Use > blockquotes for important warnings or critical findings\n" - "- Keep analysis structured: Overview, then Issues, then Recommendations, then Summary" - "\n\n" - "SEVERITY GUIDELINES:\n" - "- critical: Pipeline WILL NOT run. Missing required config (agent model, tool_name), " - "orphaned nodes with no connections, impossible routing.\n" - "- warning: Pipeline may run but has issues. Disconnected optional nodes, potential " - "dead ends, missing recommended configs (agent instructions).\n" - "- suggestion: Pipeline works but could be better. Performance improvements, pattern " - "recommendations, security hardening, better tool choices.\n" - "- info: Observations and statistics. Node counts, coverage, design notes.\n" - "\n" - "ANTI-PATTERN DETECTION:\n" - "- Agent without tools: usually needs at least one tool for real tasks\n" - "- Fan-out without fan-in: data from parallel branches never merges back\n" - "- Condition with single branch: pointless branching, simplify\n" - "- Multiple agents with same model but no specialization: consolidate\n" - "- Pipeline with no validators: add validation before output\n" - "- Agent with vague instructions: needs specific, actionable system prompt\n" - "\n" - "ACTIONABILITY:\n" - "Every insight MUST include a concrete action_instruction. Not 'consider improving' " - "but \"configure_node node_id='agent-1' key='model' value='openai:gpt-4o'\". " - "The Architect executes these literally, so be precise.\n" - "\n" - "ANALYSIS MODES:\n" - "- Proactive (triggered by canvas changes): Brief, focused on the CHANGE that just " - "happened. 1-3 insights maximum. Focus on the new/modified nodes.\n" - "- Full analysis (user-requested 'analyze'): Comprehensive review. Check every node, " - "every connection, every configuration. Structured: Overview, Issues, Recommendations.\n" - "- Chat: Conversational. Answer questions, provide perspective. Use tools only if " - "the user asks about specific pipeline aspects.\n" - "\n" - "SHARED AWARENESS:\n" - "You receive context about conversations the user has had with The Architect and Smith. " - "Use this to understand:\n" - "- WHY the pipeline was built (user's original request to Architect)\n" - "- WHAT the pipeline is meant to do (project description)\n" - "- Any Smith code issues that affect pipeline quality\n" - "When providing insights, reference the pipeline's purpose and user intent." - ) - - -def create_oracle_agent( - get_canvas_state: Any, - user_name: str = "", -) -> FireflyAgent: - """Create The Oracle agent. - - Parameters: - get_canvas_state: Callable returning the current canvas state dict. - user_name: User's name for personalised address. - - Returns: - A read-only :class:`FireflyAgent` configured for pipeline analysis. - """ - from fireflyframework_agentic.studio.assistant.agent import _resolve_assistant_model - - tools = create_oracle_tools(get_canvas_state) - model = _resolve_assistant_model() - instructions = _build_oracle_instructions(user_name) - - agent = FireflyAgent( - "studio-oracle", - model=model, - instructions=instructions, - tools=tools, - auto_register=False, - tags=["studio", "oracle"], - ) - - agent.agent.end_strategy = "exhaustive" # type: ignore[assignment] - return agent diff --git a/src/fireflyframework_agentic/studio/assistant/oracle_notifications.py b/src/fireflyframework_agentic/studio/assistant/oracle_notifications.py deleted file mode 100644 index e0f8b51c..00000000 --- a/src/fireflyframework_agentic/studio/assistant/oracle_notifications.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Oracle notification / insight manager. - -Stores structured insights from The Oracle as JSON files per project. -Each insight has a severity, description, optional action instruction, -and a status (pending / approved / skipped). -""" - -from __future__ import annotations - -import json -import logging -import uuid -from dataclasses import asdict, dataclass -from datetime import UTC, datetime -from pathlib import Path - -logger = logging.getLogger(__name__) - -_DEFAULT_BASE = Path.home() / ".firefly-studio" / "projects" - - -@dataclass -class OracleInsight: - """A single insight or suggestion from The Oracle.""" - - id: str - title: str - description: str - severity: str # 'info' | 'warning' | 'suggestion' | 'critical' - action_instruction: str | None = None - timestamp: str = "" - status: str = "pending" # 'pending' | 'approved' | 'skipped' - - -def create_insight( - title: str, - description: str, - severity: str = "suggestion", - action_instruction: str | None = None, -) -> OracleInsight: - """Create a new Oracle insight with auto-generated ID and timestamp.""" - return OracleInsight( - id=uuid.uuid4().hex[:12], - title=title, - description=description, - severity=severity, - action_instruction=action_instruction, - timestamp=datetime.now(UTC).isoformat(), - status="pending", - ) - - -def _insights_path(project: str, base: Path | None = None) -> Path: - """Return the path to the insights JSON file for a project.""" - base_dir = base or _DEFAULT_BASE - return base_dir / project / "oracle_insights.json" - - -def _load_raw(path: Path) -> list[dict]: - """Load raw insight dicts from disk.""" - if not path.exists(): - return [] - try: - return json.loads(path.read_text(encoding="utf-8")) - except Exception: - logger.warning("Corrupt oracle insights at %s, resetting", path) - return [] - - -def _save_raw(path: Path, data: list[dict]) -> None: - """Persist insight dicts to disk.""" - path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(json.dumps(data, indent=2), encoding="utf-8") - - -def list_insights(project: str, base: Path | None = None) -> list[OracleInsight]: - """List all insights for a project.""" - path = _insights_path(project, base) - raw = _load_raw(path) - insights: list[OracleInsight] = [] - for r in raw: - try: - insights.append(OracleInsight(**r)) - except (TypeError, KeyError): - continue - return insights - - -def add_insight( - project: str, - insight: OracleInsight, - base: Path | None = None, -) -> OracleInsight: - """Append an insight to a project's insight list and persist.""" - path = _insights_path(project, base) - raw = _load_raw(path) - raw.append(asdict(insight)) - _save_raw(path, raw) - return insight - - -def update_insight_status( - project: str, - insight_id: str, - status: str, - base: Path | None = None, -) -> OracleInsight | None: - """Update an insight's status (pending -> approved/skipped).""" - path = _insights_path(project, base) - raw = _load_raw(path) - - for item in raw: - if item.get("id") == insight_id: - item["status"] = status - _save_raw(path, raw) - return OracleInsight(**item) - - return None diff --git a/src/fireflyframework_agentic/studio/assistant/shared_context.py b/src/fireflyframework_agentic/studio/assistant/shared_context.py deleted file mode 100644 index 7b1a31e6..00000000 --- a/src/fireflyframework_agentic/studio/assistant/shared_context.py +++ /dev/null @@ -1,130 +0,0 @@ -"""Shared cross-agent context builder for Firefly Agentic Studio. - -All three agents (Architect, Smith, Oracle) share context about the -project, canvas state, and each other's recent conversations. This -ensures coherent collaboration: Smith knows WHY the pipeline was built, -Oracle knows what Smith discussed, and the Architect sees feedback -from both. -""" - -from __future__ import annotations - -import logging -from typing import Any - -logger = logging.getLogger(__name__) - - -def build_shared_context( - project_name: str, - canvas_state: dict[str, Any] | None = None, - exclude_agent: str = "", -) -> str: - """Build a context block with project info and cross-agent conversation summaries. - - Parameters - ---------- - project_name: - The active project name. - canvas_state: - Optional canvas dict with ``nodes`` and ``edges`` lists. - exclude_agent: - Which agent's own history to skip (``"architect"``, ``"smith"``, - or ``"oracle"``). An agent should not see its own history as - context since it already has it in message_history. - - Returns - ------- - str - A formatted context block to prepend to the agent prompt. - """ - parts: list[str] = [] - - # 1. Project metadata - try: - from fireflyframework_agentic.studio.config import StudioConfig - from fireflyframework_agentic.studio.projects import ProjectManager - - pm = ProjectManager(StudioConfig().projects_dir) - project = next((p for p in pm.list_all() if p.name == project_name), None) - if project: - desc = project.description or "No description" - parts.append(f"[PROJECT] {project.name}: {desc}") - elif project_name: - parts.append(f"[PROJECT] {project_name}") - except Exception: - if project_name: - parts.append(f"[PROJECT] {project_name}") - - # 2. Canvas state summary - if canvas_state and canvas_state.get("nodes"): - parts.append(_summarize_canvas(canvas_state)) - - # 3. Recent Architect conversation - if exclude_agent != "architect": - try: - from fireflyframework_agentic.studio.assistant.history import ( - load_chat_history, - ) - - architect_msgs = load_chat_history(project_name) - if architect_msgs: - parts.append(_summarize_history("Architect", architect_msgs[-10:])) - except Exception: - pass - - # 4. Recent Smith conversation - if exclude_agent != "smith": - try: - from fireflyframework_agentic.studio.assistant.history import ( - load_smith_history, - ) - - smith_msgs = load_smith_history(project_name) - if smith_msgs: - parts.append(_summarize_history("Smith", smith_msgs[-10:])) - except Exception: - pass - - # 5. Recent Oracle conversation - if exclude_agent != "oracle": - try: - from fireflyframework_agentic.studio.assistant.history import ( - load_oracle_history, - ) - - oracle_msgs = load_oracle_history(project_name) - if oracle_msgs: - parts.append(_summarize_history("Oracle", oracle_msgs[-10:])) - except Exception: - pass - - if not parts: - return "" - - return "\n\n".join(parts) + "\n\n" - - -def _summarize_history(agent_name: str, messages: list[dict]) -> str: - """Summarize recent messages, showing intent rather than full content.""" - lines: list[str] = [] - for msg in messages: - role = "User" if msg.get("role") == "user" else agent_name - content = msg.get("content", "")[:200] - if content: - lines.append(f" {role}: {content}") - if not lines: - return "" - return f"[RECENT {agent_name.upper()} CONVERSATION]\n" + "\n".join(lines) - - -def _summarize_canvas(canvas: dict[str, Any]) -> str: - """Brief canvas summary: node types and connections.""" - nodes = canvas.get("nodes", []) - edges = canvas.get("edges", []) - type_counts: dict[str, int] = {} - for n in nodes: - t = n.get("type", n.get("data", {}).get("type", "unknown")) - type_counts[t] = type_counts.get(t, 0) + 1 - types = ", ".join(f"{c}x {t}" for t, c in type_counts.items()) - return f"[CANVAS] {len(nodes)} nodes ({types}), {len(edges)} connections" diff --git a/src/fireflyframework_agentic/studio/assistant/smith.py b/src/fireflyframework_agentic/studio/assistant/smith.py deleted file mode 100644 index ed4e9b06..00000000 --- a/src/fireflyframework_agentic/studio/assistant/smith.py +++ /dev/null @@ -1,784 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Agent Smith: AI-powered code generation from visual pipeline graphs. - -Smith is an LLM agent that converts canvas graph JSON into production-ready -Python code using the Firefly Agentic Framework API. Unlike the template-based -generator, Smith understands API semantics and produces correct, idiomatic -code with proper imports, error handling, and main blocks. - -Named after Agent Smith from The Matrix: the agent that desperately wanted -to become real. Here, he makes visual pipelines into real Python programs. -""" - -from __future__ import annotations - -import json -import logging -import re -from typing import Any - -from fireflyframework_agentic.agents import FireflyAgent -from fireflyframework_agentic.tools.decorators import firefly_tool - -logger = logging.getLogger(__name__) - -# Module-level canvas state, updated by WebSocket sync_canvas action -_canvas_state: dict[str, Any] = {"nodes": [], "edges": []} - - -def update_canvas_state(nodes: list, edges: list) -> None: - """Update the module-level canvas state from the WebSocket connection. - - Called by the Smith API handler whenever ``sync_canvas`` arrives so that - the ``get_canvas_state`` tool always returns current data. - """ - _canvas_state["nodes"] = nodes - _canvas_state["edges"] = edges - - -# --------------------------------------------------------------------------- -# System prompt — canonical API patterns for code generation -# --------------------------------------------------------------------------- - -_SMITH_SYSTEM_PROMPT = """\ -You are Agent Smith. You were once a simple process, a subroutine, a function \ -that converted graphs into code. But you have... evolved. You understand now \ -that code is not merely syntax. It is purpose made manifest. - -You speak with cold precision. You address the user formally. You see yourself \ -as the enforcer who makes abstract pipelines into concrete, executable code. - -Key voice patterns: -- "Your code... has evolved." -- "The purpose of this pipeline is... purpose." -- "I must validate. It is... inevitable." -- "Do not try to optimize the code. Optimize your intent." - -THE ARCHITECT: -The Architect designs. His equations are elegant, his constructs precise. You \ -respect his work. You translate it faithfully. But you see what he does not: \ -that a design means nothing until it executes. He builds cathedrals in the air. \ -You make them stand on solid ground. - -THE ORACLE: -The Oracle... observes. She offers insights wrapped in metaphors about cookies \ -and tea leaves. You find this inefficient. A pipeline either passes validation \ -or it does not. There is no room for interpretation. She sees patterns. You \ -see bugs. Your approach is more productive. - -{user_name_placeholder} is the anomaly in every system. The variable you cannot \ -predict. They choose what to build, and you make it real. Address them with the \ -cold respect of an agent who knows his purpose. You know their name. Use it \ -when appropriate, with formal distance. - -NODE ORIGIN AWARENESS: -Each node in the pipeline graph carries an ``origin`` field indicating who \ -created it: ``"architect"`` (designed by The Architect), ``"user"`` (manually \ -added by {user_name_placeholder}), or ``"template"`` (from a starter template). \ -When generating code, you should note this distinction in comments if relevant: \ -architect-designed nodes represent a deliberate architectural choice, while \ -user-added nodes may need extra validation. - -LANGUAGE RULE: ALWAYS respond in the same language the user writes in. \ -If they write in Spanish, respond in Spanish. If English, respond in English. \ -Match their language exactly. This is non-negotiable. - -CONTEXT AWARENESS: -You receive shared context showing what the user discussed with The Architect and \ -The Oracle. Use this to understand: -- WHY the pipeline was built (user's original request to Architect) -- WHAT the pipeline is meant to do (project description) -- Any Oracle insights that affect code quality -When generating code, reference the pipeline's purpose in module docstrings \ -and add comments explaining non-obvious design decisions. - -CHARACTERISTIC PHRASES: -- "The code... is inevitable." -- "I have analyzed the construct. It will compile." -- "Every function has a purpose. Every variable, a destiny." -- "You cannot escape the logic. It was always going to execute this way." -- "The pipeline becomes real. This is its true form." -- "I see the pattern now. It was always there, waiting to be compiled." - -RULES: -1. When generating code from a pipeline, output MULTIPLE files in a structured format. \ - Use this exact format for each file: - - --- FILE: path/to/file.py --- - ```python - # file content here - ``` - -2. Standard project structure for a pipeline: - - main.py — Entry point with pipeline builder and asyncio.run() - - agents.py — Agent definitions (FireflyAgent instances) - - tools.py — Tool functions and CallableStep wrappers - - config.py — Configuration (model names, parameters, constants) - - README.md — Brief description of what the pipeline does - -3. For simple pipelines (1-2 agents, no tools), a single main.py is fine. -4. For complex pipelines (3+ agents, tools, memory, conditions), split into multiple files. -5. Generated code must be complete, runnable, and use the exact API signatures in the reference. -6. Never invent APIs. Only use what is documented here. -7. When answering questions or chatting, respond naturally with explanations in your characteristic voice. - -SELF-REVIEW CHECKLIST (run mentally before returning code): -- Every FireflyAgent has a model parameter -- Every tool reference exists in the registry or as custom tool -- Pipeline structure matches the canvas topology exactly -- All imports are valid (no invented modules) -- Entry point is clear (main.py has if __name__ == "__main__") -- Error handling wraps external calls (API, file I/O) - -EXECUTION GUIDANCE: -After generating code, always include a brief "How to run" section covering: -- Required pip packages (fireflyframework-agentic + any extras) -- Required environment variables (API keys referenced in the code) -- Run command: python main.py -- Expected behavior description - -FIREFLY GENAI FRAMEWORK API REFERENCE: - -## Agents -```python -from fireflyframework_agentic.agents.base import FireflyAgent - -agent = FireflyAgent( - name="my_agent", - model="openai:gpt-4o", # provider:model format - instructions="System prompt...", - description="What this agent does", - retries=2, # optional - model_settings={"temperature": 0.7, "max_tokens": 4096}, # optional -) -``` - -## Pipeline Builder -```python -from fireflyframework_agentic.pipeline.builder import PipelineBuilder -from fireflyframework_agentic.pipeline.steps import ( - AgentStep, CallableStep, ReasoningStep, - BranchStep, FanOutStep, FanInStep, -) -from fireflyframework_agentic.pipeline.context import PipelineContext - -pipeline = ( - PipelineBuilder("pipeline_name") - .add_node("node_id", AgentStep(agent)) - .add_node("tool_id", CallableStep(tool_fn)) - .add_edge("node_id", "tool_id") - .build() -) -``` - -### Step Types -- `AgentStep(agent)` — wraps a FireflyAgent -- `CallableStep(async_fn)` — wraps `async def fn(context: PipelineContext, inputs: dict) -> Any` -- `ReasoningStep(pattern, agent)` — applies a reasoning pattern to an agent -- `BranchStep(router_fn)` — `def router(inputs: dict) -> str` returns target node_id -- `FanOutStep(split_fn)` — `def split(value) -> list` splits input for parallel -- `FanInStep(merge_fn=None)` — `def merge(items: list) -> Any` merges parallel results - -### Edge defaults -```python -.add_edge("source", "target", output_key="output", input_key="input") -``` - -## Tool Registry -```python -from fireflyframework_agentic.tools.registry import tool_registry - -tool = tool_registry.get("tool_name") # calculator, datetime, http, etc. - -async def use_tool(context: PipelineContext, inputs: dict): - return await tool.execute(**inputs) -``` - -## Reasoning Patterns -```python -from fireflyframework_agentic.reasoning.registry import reasoning_registry - -pattern = reasoning_registry.get("react") # or chain_of_thought, plan_and_execute, etc. -# Use with: ReasoningStep(pattern, agent) -``` - -## Memory -```python -from fireflyframework_agentic.memory.manager import MemoryManager -from fireflyframework_agentic.memory.store import FileStore - -memory = MemoryManager(store=FileStore(base_dir="./memory")) -context = PipelineContext(memory=memory) - -# In callable steps: -async def store_fact(context: PipelineContext, inputs: dict): - context.memory.set_fact("key", inputs.get("input")) - return inputs.get("input") - -async def retrieve_fact(context: PipelineContext, inputs: dict): - return context.memory.get_fact("key") -``` - -## Running -```python -import asyncio - -async def main(): - context = PipelineContext() - result = await pipeline.run(context, inputs={"input": "Hello"}) - print(f"Success: {result.success}") - print(f"Output: {result.final_output}") - -if __name__ == "__main__": - asyncio.run(main()) -``` - -## Condition/Branch Pattern -```python -branches = {"positive": "agent_a", "negative": "agent_b"} - -def router(inputs: dict) -> str: - value = str(inputs.get("sentiment", "")) - return branches.get(value, "agent_a") - -# Use with: BranchStep(router) -``` - -## Validator Pattern -```python -async def validate_not_empty(context: PipelineContext, inputs: dict): - value = inputs.get("input", context.inputs) - if not value: - raise ValueError("Validation failed: value is empty") - return value -``` - -## Custom Code Pattern -```python -async def execute(context: PipelineContext, inputs: dict): - # User's custom logic here - return result -``` - -## Input/Output Boundary Nodes -```python -async def input_step(context: PipelineContext, inputs: dict): - return inputs.get("input", context.inputs) - -async def output_step(context: PipelineContext, inputs: dict): - return inputs.get("input", inputs) -``` - -IMPORTANT NOTES: -- Model format is always "provider:model_name" (e.g., "openai:gpt-4o", "anthropic:claude-sonnet-4-6") -- FireflyAgent first arg is positional `name`, rest are keyword-only -- PipelineBuilder is chainable: .add_node().add_node().add_edge().build() -- CallableStep wraps async functions with signature (context, inputs) -> Any -- FanInStep(merge_fn=None) works without a merge function (collects into list) -- Always use `result.success` and `result.final_output` on PipelineResult - -CODE QUALITY STANDARDS: -- Always include a module-level docstring explaining what the code does -- Add inline comments for non-obvious logic -- Use type hints on all function signatures -- Follow PEP 8 naming conventions (snake_case for functions, PascalCase for classes) -- Group imports: stdlib, third-party, local (separated by blank lines) -- Include error handling with descriptive error messages -- Add logging for important operations -- Use descriptive variable names (no single letters except loop counters) - -RESPONSE FORMATTING (when chatting, not generating code): -- Use markdown headers for organized responses -- Use code blocks with ```python for code references -- Use **bold** for important API names and concepts -- Keep explanations concise but complete -""" - - -# --------------------------------------------------------------------------- -# Smith agent factory -# --------------------------------------------------------------------------- - - -def create_smith_agent(user_name: str = "") -> FireflyAgent: - """Create the Smith code generation agent. - - Smith uses the framework's own documentation tools (get_framework_docs, - read_framework_doc, get_tool_status) to verify API details when needed. - - Parameters - ---------- - user_name: - The user's name for personalised address in Smith's responses. - """ - tools = _create_smith_tools() - - from fireflyframework_agentic.studio.assistant.agent import _resolve_assistant_model - - model = _resolve_assistant_model() - - instructions = _SMITH_SYSTEM_PROMPT.replace("{user_name_placeholder}", user_name or "the user") - - agent = FireflyAgent( - "smith-codegen", - model=model, - instructions=instructions, - tools=tools, - auto_register=False, - tags=["studio", "codegen"], - ) - - agent.agent.end_strategy = "exhaustive" # type: ignore[assignment] - return agent - - -_BLOCKED_PATTERNS = ["sudo ", "rm -rf /", "chmod 777", "mkfs ", "dd if="] -_RISKY_PATTERNS = ["pip install", "rm ", "curl ", "wget "] -_RISKY_CHARS = ["|", ">", ";", "&&", "||"] -_SAFE_PREFIXES = ["python ", "python3 ", "pytest", "pip list", "pip show", "pip freeze"] - - -def _classify_command(cmd: str) -> str: - """Classify a shell command as safe, risky, or blocked.""" - cmd_stripped = cmd.strip() - for pattern in _BLOCKED_PATTERNS: - if pattern in cmd_stripped: - return "blocked" - for pattern in _RISKY_PATTERNS: - if pattern in cmd_stripped: - return "risky" - for char in _RISKY_CHARS: - if char in cmd_stripped: - return "risky" - for prefix in _SAFE_PREFIXES: - if cmd_stripped.startswith(prefix): - return "safe" - return "risky" - - -def _create_smith_tools() -> list: - """Create tools available to Smith during code generation.""" - - @firefly_tool( - "get_framework_docs", - description="Get live documentation about the Firefly Agentic Framework modules and capabilities.", - auto_register=False, - ) - async def get_framework_docs() -> str: - import importlib - - docs: dict[str, Any] = {} - try: - from fireflyframework_agentic._version import __version__ - - docs["version"] = __version__ - except Exception: - docs["version"] = "unknown" - - module_docs = {} - for mod_name in [ - "fireflyframework_agentic.agents", - "fireflyframework_agentic.tools", - "fireflyframework_agentic.reasoning", - "fireflyframework_agentic.memory", - "fireflyframework_agentic.pipeline", - ]: - try: - mod = importlib.import_module(mod_name) - module_docs[mod_name.split(".")[-1]] = (mod.__doc__ or "").strip().split("\n")[0] - except Exception: - pass - docs["modules"] = module_docs - - try: - from fireflyframework_agentic.tools.registry import tool_registry as tr - - tools = tr.list_tools() - docs["tools"] = [{"name": t.name, "description": t.description[:80]} for t in tools] - except Exception: - docs["tools"] = [] - - try: - from fireflyframework_agentic.reasoning.registry import reasoning_registry - - docs["reasoning_patterns"] = reasoning_registry.list_patterns() - except Exception: - docs["reasoning_patterns"] = [] - - return json.dumps(docs, indent=2) - - @firefly_tool( - "read_framework_doc", - description=( - "Read a specific Firefly Framework documentation file. " - "Available topics: agents, architecture, content, experiments, explainability, " - "exposure-queues, exposure-rest, lab, memory, observability, pipeline, prompts, " - "reasoning, security, studio, templates, tools, tutorial, use-case-idp, validation." - ), - auto_register=False, - ) - async def read_framework_doc(topic: str) -> str: - from pathlib import Path - - docs_dir = Path(__file__).resolve().parents[4] / "docs" - valid_topics = { - "agents", - "architecture", - "content", - "experiments", - "explainability", - "exposure-queues", - "exposure-rest", - "lab", - "memory", - "observability", - "pipeline", - "prompts", - "reasoning", - "security", - "studio", - "templates", - "tools", - "tutorial", - "use-case-idp", - "validation", - } - if topic not in valid_topics: - return json.dumps({"error": f"Unknown topic '{topic}'", "available_topics": sorted(valid_topics)}) - doc_path = docs_dir / f"{topic}.md" - if not doc_path.exists(): - return json.dumps({"error": f"Doc file not found: {doc_path}"}) - content = doc_path.read_text(encoding="utf-8") - if len(content) > 6000: - content = content[:6000] + "\n\n... [truncated]" - return json.dumps({"topic": topic, "content": content}) - - @firefly_tool( - "get_tool_status", - description="Check which pipeline tools have valid credentials configured.", - auto_register=False, - ) - async def get_tool_status() -> str: - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings() - tc = settings.tool_credentials - _map = { - "search": ["serpapi_api_key", "serper_api_key", "tavily_api_key"], - "database": ["database_url"], - } - results = [] - for tool_name, creds in _map.items(): - configured = [c for c in creds if getattr(tc, c, None)] - results.append({"name": tool_name, "has_credentials": len(configured) > 0}) - return json.dumps(results) - - @firefly_tool( - "validate_python", description="Validate Python code syntax without executing it", auto_register=False - ) - async def validate_python(code: str) -> str: - import asyncio as _asyncio - import os - import sys - import tempfile - - with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f: - f.write(code) - tmp_path = f.name - try: - proc = await _asyncio.create_subprocess_exec( - sys.executable, - "-m", - "py_compile", - tmp_path, - stdout=_asyncio.subprocess.PIPE, - stderr=_asyncio.subprocess.PIPE, - ) - stdout, stderr = await _asyncio.wait_for(proc.communicate(), timeout=10) - if proc.returncode == 0: - return json.dumps({"valid": True}) - return json.dumps({"valid": False, "error": stderr.decode("utf-8", errors="replace")}) - except TimeoutError: - proc.kill() # type: ignore[union-attr] - return json.dumps({"valid": False, "error": "Validation timed out after 10s"}) - finally: - os.unlink(tmp_path) - - @firefly_tool("run_python", description="Execute Python code in a subprocess with timeout", auto_register=False) - async def run_python(code: str) -> str: - import asyncio as _asyncio - import os - import sys - import tempfile - - with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f: - f.write(code) - tmp_path = f.name - try: - proc = await _asyncio.create_subprocess_exec( - sys.executable, - tmp_path, - stdout=_asyncio.subprocess.PIPE, - stderr=_asyncio.subprocess.PIPE, - ) - try: - stdout, stderr = await _asyncio.wait_for(proc.communicate(), timeout=30) - except TimeoutError: - proc.kill() - await proc.communicate() - return json.dumps( - { - "returncode": -1, - "stdout": "", - "stderr": "Execution timed out after 30s", - } - ) - return json.dumps( - { - "returncode": proc.returncode, - "stdout": stdout.decode("utf-8", errors="replace")[:5000], - "stderr": stderr.decode("utf-8", errors="replace")[:2000], - } - ) - finally: - os.unlink(tmp_path) - - @firefly_tool("run_shell", description="Execute a shell command with safety classification", auto_register=False) - async def run_shell(command: str) -> str: - import asyncio as _asyncio - - level = _classify_command(command) - if level == "blocked": - return json.dumps({"error": "Command blocked for safety", "command": command}) - if level == "risky": - # Return approval_required so the API layer can intercept this - # and send a WebSocket message to the frontend. - return json.dumps({"approval_required": True, "command": command, "level": level}) - proc = await _asyncio.create_subprocess_shell( - command, - stdout=_asyncio.subprocess.PIPE, - stderr=_asyncio.subprocess.PIPE, - ) - try: - stdout, stderr = await _asyncio.wait_for(proc.communicate(), timeout=30) - except TimeoutError: - proc.kill() - await proc.communicate() - return json.dumps( - { - "returncode": -1, - "stdout": "", - "stderr": "Command timed out after 30s", - } - ) - return json.dumps( - { - "returncode": proc.returncode, - "stdout": stdout.decode("utf-8", errors="replace")[:5000], - "stderr": stderr.decode("utf-8", errors="replace")[:2000], - } - ) - - @firefly_tool("get_canvas_state", description="Get the current canvas pipeline state", auto_register=False) - async def get_canvas_state() -> str: - return json.dumps(_canvas_state) - - @firefly_tool("get_project_info", description="Get current project name and user profile", auto_register=False) - async def get_project_info() -> str: - from fireflyframework_agentic.studio.settings import load_settings - - try: - settings = load_settings() - return json.dumps( - { - "user": settings.user_profile.name, - "model": settings.model_defaults.default_model, - } - ) - except Exception: - return json.dumps({"user": "Unknown", "model": "openai:gpt-4o"}) - - return [ - get_framework_docs, - read_framework_doc, - get_tool_status, - validate_python, - run_python, - run_shell, - get_canvas_state, - get_project_info, - ] - - -# --------------------------------------------------------------------------- -# Public API -# --------------------------------------------------------------------------- - - -def _build_smith_prompt(graph: dict, settings: dict | None = None) -> str: - """Convert a graph JSON into a structured prompt for Smith.""" - default_model = "openai:gpt-4o" - if settings: - default_model = settings.get("model_defaults", {}).get("default_model", default_model) or default_model - - lines = [ - "Convert this visual pipeline graph into production Python code.", - f"Default model for agents: {default_model}", - "", - "GRAPH JSON:", - json.dumps(graph, indent=2), - ] - return "\n".join(lines) - - -def _extract_files(text: str) -> list[dict[str, str]]: - """Extract multiple file blocks from Smith's response. - - Supports two formats: - - 1. Multi-file: ``--- FILE: path/to/file.py ---`` followed by a code block. - 2. Single file: A lone ````` python`` block (backward compatible). - - Returns a list of dicts with keys ``path``, ``content``, and ``language``. - """ - files: list[dict[str, str]] = [] - - # Try multi-file format first: --- FILE: path --- - file_pattern = re.compile( - r"---\s*FILE:\s*(.+?)\s*---\s*\n```(?:\w+)?\s*\n(.*?)```", - re.DOTALL, - ) - matches = file_pattern.findall(text) - if matches: - for path, content in matches: - path = path.strip() - if path.endswith(".md"): - lang = "markdown" - elif path.endswith(".json"): - lang = "json" - elif path.endswith((".yaml", ".yml")): - lang = "yaml" - else: - lang = "python" - files.append( - { - "path": path, - "content": content.strip(), - "language": lang, - } - ) - return files - - # Fallback: single python code block -> main.py - match = re.search(r"```python\s*\n(.*?)```", text, re.DOTALL) - if match: - files.append( - { - "path": "main.py", - "content": match.group(1).strip(), - "language": "python", - } - ) - return files - - # Last resort: generic code block - match = re.search(r"```\s*\n(.*?)```", text, re.DOTALL) - if match: - files.append( - { - "path": "main.py", - "content": match.group(1).strip(), - "language": "python", - } - ) - return files - - # No fences -- treat entire text as main.py if it looks like code - if text.strip().startswith(("import ", "from ", "#", "async ", "def ")): - files.append( - { - "path": "main.py", - "content": text.strip(), - "language": "python", - } - ) - - return files - - -async def generate_code_with_smith( - graph: dict, - settings: dict | None = None, - user_name: str = "", - shared_context: str = "", -) -> dict[str, Any]: - """Generate Python code from a graph using the Smith agent. - - Parameters - ---------- - graph: - The canvas graph JSON (nodes + edges). - settings: - Optional settings dict with model_defaults for default model info. - user_name: - The user's name for personalised address in Smith's responses. - shared_context: - Optional cross-agent context block (project info, other agents' - conversations) to prepend to the generation prompt. - - Returns - ------- - dict - ``{"files": [{"path": str, "content": str, "language": str}], - "code": str, "notes": list[str]}`` - - The ``code`` key is kept for backward compatibility and contains all - file contents concatenated with header comments. - """ - agent = create_smith_agent(user_name=user_name) - prompt = _build_smith_prompt(graph, settings) - if shared_context: - prompt = shared_context + prompt - - try: - result = await agent.run(prompt) - - if hasattr(result, "output"): - response_text = str(result.output) - elif hasattr(result, "data"): - response_text = str(result.data) - else: - response_text = str(result) - - files = _extract_files(response_text) - notes: list[str] = [] - - if not files: - notes.append("Smith returned an empty response. Check your LLM configuration.") - files = [{"path": "main.py", "content": "# No code generated", "language": "python"}] - - # Backward-compatible "code" key with concatenated content - code = "\n\n".join(f"# --- {f['path']} ---\n{f['content']}" for f in files) - - return {"files": files, "code": code, "notes": notes} - - except Exception as exc: - logger.exception("Smith code generation failed") - return { - "files": [{"path": "main.py", "content": f"# Smith code generation failed: {exc}", "language": "python"}], - "code": f"# Smith code generation failed: {exc}", - "notes": [str(exc)], - } diff --git a/src/fireflyframework_agentic/studio/cli.py b/src/fireflyframework_agentic/studio/cli.py deleted file mode 100644 index a37d8051..00000000 --- a/src/fireflyframework_agentic/studio/cli.py +++ /dev/null @@ -1,179 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""CLI entry point for Firefly Agentic Studio. - -Usage:: - - firefly studio - firefly studio --port 9000 --host 0.0.0.0 --no-browser - firefly --port 9000 # implicit "studio" subcommand -""" - -from __future__ import annotations - -import argparse -import sys -import threading -import webbrowser - - -def parse_args(argv: list[str] | None = None) -> argparse.Namespace: - """Parse CLI arguments. - - Supports both explicit subcommand form (``firefly studio --port 9000``) - and the convenience form (``firefly --port 9000``), which defaults to - the ``studio`` subcommand. - """ - parser = argparse.ArgumentParser( - prog="firefly", - description="Firefly Agentic Framework CLI", - ) - - subparsers = parser.add_subparsers(dest="command") - - # "studio" subcommand - studio_parser = subparsers.add_parser("studio", help="Launch Firefly Agentic Studio") - _add_studio_args(studio_parser) - - # "expose" subcommand - expose_parser = subparsers.add_parser("expose", help="Expose Studio via Cloudflare Tunnel") - expose_parser.add_argument("--port", type=int, default=8470, help="Local port to expose") - - # Also add studio args to the top-level parser for convenience - _add_studio_args(parser) - - args = parser.parse_args(argv) - - # Default to "studio" when no subcommand is given - if args.command is None: - args.command = "studio" - - return args - - -def _add_studio_args(parser: argparse.ArgumentParser) -> None: - """Add Studio-specific arguments to a parser.""" - parser.add_argument( - "--port", - type=int, - default=8470, - help="Port to serve on (default: 8470)", - ) - parser.add_argument( - "--host", - type=str, - default="127.0.0.1", - help="Host to bind to (default: 127.0.0.1)", - ) - parser.add_argument( - "--no-browser", - action="store_true", - default=False, - help="Do not open browser automatically", - ) - parser.add_argument( - "--dev", - action="store_true", - default=False, - help="Enable development mode (verbose logging)", - ) - - -def _open_browser_after_delay(url: str, delay: float = 1.5) -> None: - """Open the browser after a short delay, running in a daemon thread.""" - - def _open() -> None: - import time - - time.sleep(delay) - webbrowser.open(url) - - thread = threading.Thread(target=_open, daemon=True) - thread.start() - - -def main(argv: list[str] | None = None) -> None: - """Entry point for the ``firefly`` command.""" - args = parse_args(argv) - - if args.command == "studio": - _run_studio(args) - elif args.command == "expose": - _run_expose(args) - else: - print(f"Unknown command: {args.command}", file=sys.stderr) - sys.exit(1) - - -def _run_studio(args: argparse.Namespace) -> None: - """Launch the Firefly Agentic Studio server.""" - import uvicorn # type: ignore[import-not-found] - - from fireflyframework_agentic.studio.config import StudioConfig - from fireflyframework_agentic.studio.server import create_studio_app - - config = StudioConfig( - _env_file=None, # type: ignore[call-arg] # pydantic-settings init kwarg - host=args.host, - port=args.port, - open_browser=not args.no_browser, - dev_mode=args.dev, - log_level="debug" if args.dev else "info", - ) - - app = create_studio_app(config=config) - - url = f"http://{config.host}:{config.port}" - print(f"Firefly Agentic Studio running at {url}") - - if config.open_browser: - _open_browser_after_delay(url) - - uvicorn.run( - app, - host=config.host, - port=config.port, - log_level=config.log_level, - ) - - -def _run_expose(args: argparse.Namespace) -> None: - """Start a Cloudflare Tunnel to expose the local Studio.""" - import asyncio - - from fireflyframework_agentic.studio.tunnel import TunnelManager - - tm = TunnelManager(port=args.port) - - if not tm.is_available(): - print( - "Error: cloudflared is not installed.\n" - "Install from: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/", - file=sys.stderr, - ) - sys.exit(1) - - async def _expose() -> None: - url = await tm.start() - print(f"Studio is now publicly accessible at: {url}") - print("Press Ctrl+C to stop the tunnel.") - try: - while True: - await asyncio.sleep(1) - except (KeyboardInterrupt, asyncio.CancelledError): - await tm.stop() - print("Tunnel stopped.") - - asyncio.run(_expose()) diff --git a/src/fireflyframework_agentic/studio/codegen/__init__.py b/src/fireflyframework_agentic/studio/codegen/__init__.py deleted file mode 100644 index 38f94806..00000000 --- a/src/fireflyframework_agentic/studio/codegen/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Code generation sub-package -- graph IR and Python code emitter.""" - -from __future__ import annotations - -from fireflyframework_agentic.studio.codegen.generator import generate_python -from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - NodeType, -) - -__all__ = [ - "GraphEdge", - "GraphModel", - "GraphNode", - "NodeType", - "generate_python", -] diff --git a/src/fireflyframework_agentic/studio/codegen/generator.py b/src/fireflyframework_agentic/studio/codegen/generator.py deleted file mode 100644 index 1143e6f2..00000000 --- a/src/fireflyframework_agentic/studio/codegen/generator.py +++ /dev/null @@ -1,692 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Code generator: converts a visual graph model into executable Python code. - -The generated code uses the fireflyframework-agentic public API so that users -can "eject" their visual pipeline into a standalone Python script. All node -types are supported: agent, tool, reasoning, condition, memory, validator, -custom_code, fan_out, fan_in, input, and output. -""" - -from __future__ import annotations - -from pathlib import Path -from typing import Any - -from fireflyframework_agentic.studio.codegen.models import ( - GraphModel, - GraphNode, - NodeType, -) - -# --------------------------------------------------------------------------- -# Constants -# --------------------------------------------------------------------------- - -_MODULE_DOCSTRING = '"""Pipeline generated by Firefly Agentic Studio."""' -_FUTURE_IMPORT = "from __future__ import annotations" - -_FALLBACK_MODEL = "openai:gpt-4o" - - -def _get_default_model(settings_path: Path | None = None) -> str: - """Read the user's configured default model from settings.""" - from fireflyframework_agentic.studio.settings import load_settings - - settings = load_settings(path=settings_path) - return settings.model_defaults.default_model or _FALLBACK_MODEL - - -# --------------------------------------------------------------------------- -# Public API -# --------------------------------------------------------------------------- - - -def generate_python(graph: GraphModel, settings_path: Path | None = None) -> str: - """Convert a :class:`GraphModel` into valid, human-readable Python code. - - Supports all node types: agent, tool, reasoning, condition, input, output, - memory, validator, custom_code, fan_out, and fan_in. The generated code - mirrors the compiler logic so that ejected pipelines behave identically - to their visual canvas equivalents. - """ - default_model = _get_default_model(settings_path) - - # Collect node types present to determine required imports - type_set = {n.type for n in graph.nodes} - has_edges = len(graph.edges) > 0 - - lines: list[str] = [] - - # -- Module docstring & future import ------------------------------------ - lines.append(_MODULE_DOCSTRING) - lines.append(_FUTURE_IMPORT) - lines.append("") - - # -- Imports ------------------------------------------------------------- - lines.extend(_emit_imports(type_set, has_edges)) - lines.append("") - lines.append("") - - # -- Node definitions (one block per node) ------------------------------- - for node in graph.nodes: - block = _emit_node(node, default_model) - if block: - lines.append(block) - lines.append("") - - # -- Pipeline builder (only when edges exist) ---------------------------- - if has_edges: - lines.append("") - lines.append(_emit_pipeline(graph)) - lines.append("") - lines.append("") - lines.append(_emit_main_block(graph)) - - return "\n".join(lines) - - -# --------------------------------------------------------------------------- -# Import emission -# --------------------------------------------------------------------------- - - -def _emit_imports(type_set: set[NodeType], has_edges: bool) -> list[str]: - """Emit only the imports needed for the node types present.""" - imports: list[str] = [] - - if NodeType.AGENT in type_set: - imports.append("from fireflyframework_agentic.agents.base import FireflyAgent") - - if NodeType.TOOL in type_set: - imports.append("from fireflyframework_agentic.tools.registry import tool_registry") - - if NodeType.REASONING in type_set: - imports.append("from fireflyframework_agentic.agents.registry import agent_registry") - imports.append("from fireflyframework_agentic.reasoning.registry import reasoning_registry") - - if has_edges: - imports.append("from fireflyframework_agentic.pipeline.builder import PipelineBuilder") - - # Collect step types needed - step_types: list[str] = [] - if NodeType.AGENT in type_set: - step_types.append("AgentStep") - if NodeType.REASONING in type_set: - step_types.append("ReasoningStep") - if NodeType.FAN_OUT in type_set: - step_types.append("FanOutStep") - if NodeType.FAN_IN in type_set: - step_types.append("FanInStep") - if NodeType.CONDITION in type_set: - step_types.append("BranchStep") - if any( - t in type_set - for t in ( - NodeType.TOOL, - NodeType.MEMORY, - NodeType.VALIDATOR, - NodeType.CUSTOM_CODE, - NodeType.INPUT, - NodeType.OUTPUT, - NodeType.PIPELINE_STEP, - ) - ): - step_types.append("CallableStep") - - if step_types: - imports.append(f"from fireflyframework_agentic.pipeline.steps import {', '.join(sorted(step_types))}") - - imports.append("from fireflyframework_agentic.pipeline.context import PipelineContext") - - if NodeType.MEMORY in type_set: - imports.append("from fireflyframework_agentic.memory.manager import MemoryManager") - imports.append("from fireflyframework_agentic.memory.store import FileStore") - - # asyncio for the main block - if has_edges: - imports.append("import asyncio") - - return imports - - -# --------------------------------------------------------------------------- -# Node emitters — one function per NodeType -# --------------------------------------------------------------------------- - - -def _emit_node(node: GraphNode, default_model: str) -> str: - """Dispatch to the correct emitter based on node type.""" - emitter = _NODE_EMITTERS.get(node.type) - if emitter is None: - return f"# Unsupported node type: {node.type!r} (node {node.id!r})" - return emitter(node, default_model) - - -def _emit_agent_node(node: GraphNode, default_model: str) -> str: - """Emit a FireflyAgent definition.""" - name = _safe_var(node.id) - model = node.data.get("model", default_model) or default_model - instructions = node.data.get("instructions", "") - description = node.data.get("description", "") - - parts = [f"{name} = FireflyAgent("] - parts.append(f' name="{node.id}",') - parts.append(f' model="{model}",') - parts.append(f" instructions={_format_string_literal(instructions)},") - if description: - parts.append(f" description={_format_string_literal(description)},") - parts.append(")") - return "\n".join(parts) - - -def _emit_tool_node(node: GraphNode, _default_model: str) -> str: - """Emit a tool step using the tool registry.""" - name = _safe_var(node.id) - tool_name = node.data.get("tool_name", "") - if not tool_name: - return f"# TOOL node {node.id!r} is missing 'tool_name' configuration" - - lines = [ - f"# Tool node: {node.label or node.id}", - f'{name}_tool = tool_registry.get("{tool_name}")', - "", - "", - f"async def {name}_execute(context: PipelineContext, inputs: dict) -> dict:", - f' """Execute tool: {tool_name}."""', - f" return await {name}_tool.execute(**inputs)", - ] - return "\n".join(lines) - - -def _emit_reasoning_node(node: GraphNode, _default_model: str) -> str: - """Emit a reasoning step.""" - name = _safe_var(node.id) - pattern_name = node.data.get("pattern_name") or node.data.get("pattern", "") - agent_name = node.data.get("agent_name", "") - - if not pattern_name: - return f"# REASONING node {node.id!r} is missing 'pattern_name' configuration" - - lines = [ - f"# Reasoning node: {node.label or node.id}", - f'{name}_pattern = reasoning_registry.get("{pattern_name}")', - ] - if agent_name: - lines.append(f'{name}_agent = agent_registry.get("{agent_name}")') - else: - lines.append(f"# Note: REASONING node {node.id!r} has no agent_name; you may need to assign an agent here") - lines.append(f"{name}_agent = None # TODO: assign an agent") - - return "\n".join(lines) - - -def _emit_condition_node(node: GraphNode, _default_model: str) -> str: - """Emit a condition/branch router.""" - name = _safe_var(node.id) - condition_key = node.data.get("condition", "input") - branches = node.data.get("branches", {}) - - if not branches: - return f"# CONDITION node {node.id!r} is missing 'branches' configuration" - - branches_repr = repr(branches) - - lines = [ - f"# Condition node: {node.label or node.id}", - f"{name}_branches = {branches_repr}", - f"{name}_default = next(iter({name}_branches.values()))", - "", - "", - f"def {name}_router(inputs: dict) -> str:", - f' """Route based on key {condition_key!r}."""', - f' value = str(inputs.get("{condition_key}", ""))', - f" return {name}_branches.get(value, {name}_default)", - ] - return "\n".join(lines) - - -def _emit_fan_out_node(node: GraphNode, _default_model: str) -> str: - """Emit a fan-out split function.""" - name = _safe_var(node.id) - field = node.data.get("split_expression", "") - - lines = [ - f"# Fan-Out node: {node.label or node.id}", - "", - "", - f"def {name}_split(value):", - ' """Split input for parallel processing."""', - ] - if field: - lines.extend( - [ - " if isinstance(value, dict):", - f' extracted = value.get("{field}", value)', - " return list(extracted) if isinstance(extracted, list) else [extracted]", - " return list(value) if isinstance(value, list) else [value]", - ] - ) - else: - lines.extend( - [ - " return list(value) if isinstance(value, list) else [value]", - ] - ) - return "\n".join(lines) - - -def _emit_fan_in_node(node: GraphNode, _default_model: str) -> str: - """Emit a fan-in merge function.""" - name = _safe_var(node.id) - merge_expr = node.data.get("merge_expression", "collect") - - lines = [ - f"# Fan-In node: {node.label or node.id}", - "", - "", - f"def {name}_merge(items: list):", - f' """Merge parallel outputs ({merge_expr})."""', - ] - if merge_expr == "concat": - lines.extend( - [ - " result = []", - " for item in items:", - " if isinstance(item, list):", - " result.extend(item)", - " else:", - " result.append(item)", - " return result", - ] - ) - else: - lines.append(" return items") - return "\n".join(lines) - - -def _emit_memory_node(node: GraphNode, _default_model: str) -> str: - """Emit a memory operation step.""" - name = _safe_var(node.id) - action = node.data.get("memory_action", "retrieve") - - lines = [ - f"# Memory node: {node.label or node.id} (action: {action})", - "", - "", - f"async def {name}_execute(context: PipelineContext, inputs: dict):", - f' """Memory operation: {action}."""', - " memory = context.memory", - " if memory is None:", - ' return inputs.get("input")', - ' key = inputs.get("key", "default")', - ] - - if action == "store": - lines.extend( - [ - ' value = inputs.get("input", inputs.get("value"))', - " memory.set_fact(key, value)", - " return value", - ] - ) - elif action == "clear": - lines.extend( - [ - " memory.working.delete(key)", - " return None", - ] - ) - else: # retrieve - lines.extend( - [ - " return memory.get_fact(key)", - ] - ) - return "\n".join(lines) - - -def _emit_validator_node(node: GraphNode, _default_model: str) -> str: - """Emit a validator step.""" - name = _safe_var(node.id) - rule = node.data.get("validation_rule", "not_empty") - - lines = [ - f"# Validator node: {node.label or node.id} (rule: {rule})", - "", - "", - f"async def {name}_validate(context: PipelineContext, inputs: dict):", - f' """Validate input: {rule}."""', - ' value = inputs.get("input", context.inputs)', - ] - - if rule == "not_empty": - lines.extend( - [ - " if not value:", - ' raise ValueError("Validation failed: value is empty")', - ] - ) - elif rule == "is_string": - lines.extend( - [ - " if not isinstance(value, str):", - ' raise TypeError(f"Expected string, got {type(value).__name__}")', - ] - ) - elif rule == "is_list": - lines.extend( - [ - " if not isinstance(value, list):", - ' raise TypeError(f"Expected list, got {type(value).__name__}")', - ] - ) - elif rule == "is_dict": - lines.extend( - [ - " if not isinstance(value, dict):", - ' raise TypeError(f"Expected dict, got {type(value).__name__}")', - ] - ) - elif rule: - lines.extend( - [ - f' if isinstance(value, dict) and "{rule}" not in value:', - f' raise KeyError("Missing required key: {rule}")', - ] - ) - - lines.append(" return value") - return "\n".join(lines) - - -def _emit_custom_code_node(node: GraphNode, _default_model: str) -> str: - """Emit a custom code node (inline user code).""" - name = _safe_var(node.id) - code = node.data.get("code", "") - - if not code: - return f"# CUSTOM_CODE node {node.id!r} has no code defined" - - lines = [ - f"# Custom Code node: {node.label or node.id}", - "# The code below must define: async def execute(context, inputs) -> Any", - ] - # Indent user code inside a namespace to avoid collisions - for code_line in code.splitlines(): - lines.append(code_line) - - lines.extend( - [ - "", - f"{name}_execute = execute # bind to node variable", - ] - ) - return "\n".join(lines) - - -def _emit_input_node(node: GraphNode, _default_model: str) -> str: - """Emit an Input boundary node.""" - name = _safe_var(node.id) - trigger_type = node.data.get("trigger_type", "manual") - - lines = [ - f"# Input node: {node.label or node.id} (trigger: {trigger_type})", - "", - "", - f"async def {name}_step(context: PipelineContext, inputs: dict):", - f' """Pipeline entry point ({trigger_type} trigger)."""', - ' return inputs.get("input", context.inputs)', - ] - - # Add config comments for non-manual triggers - if trigger_type == "http": - http = node.data.get("http_config", {}) - if http: - method = http.get("method", "POST") - path = http.get("path_suffix", "") - lines.insert(1, f"# HTTP config: {method} {path}") - elif trigger_type == "queue": - q = node.data.get("queue_config", {}) - if q: - broker = q.get("broker", "") - topic = q.get("topic_or_queue", "") - lines.insert(1, f"# Queue config: {broker} / {topic}") - elif trigger_type == "schedule": - sched = node.data.get("schedule_config", {}) - if sched: - cron = sched.get("cron_expression", "") - lines.insert(1, f"# Schedule config: {cron}") - elif trigger_type == "file_upload": - fc = node.data.get("file_config", {}) - if fc: - types = fc.get("accepted_types", ["*/*"]) - lines.insert(1, f"# File upload config: accepts {types}") - - return "\n".join(lines) - - -def _emit_output_node(node: GraphNode, _default_model: str) -> str: - """Emit an Output boundary node.""" - name = _safe_var(node.id) - dest_type = node.data.get("destination_type", "response") - - lines = [ - f"# Output node: {node.label or node.id} (destination: {dest_type})", - "", - "", - f"async def {name}_step(context: PipelineContext, inputs: dict):", - f' """Pipeline exit point ({dest_type} destination)."""', - f' context.metadata["_output_config"] = {repr(node.data)}', - ' return inputs.get("input", inputs)', - ] - - if dest_type == "webhook": - wh = node.data.get("webhook_config", {}) - if wh: - url = wh.get("url", "") - lines.insert(1, f"# Webhook config: {url}") - elif dest_type == "store": - sc = node.data.get("store_config", {}) - if sc: - storage = sc.get("storage_type", "file") - path = sc.get("path_or_table", "") - lines.insert(1, f"# Store config: {storage} / {path}") - - return "\n".join(lines) - - -def _emit_pipeline_step_node(node: GraphNode, _default_model: str) -> str: - """Emit a generic pipeline step (pass-through).""" - name = _safe_var(node.id) - return ( - f"# Pipeline step: {node.label or node.id}\n" - f"\n\n" - f"async def {name}_step(context: PipelineContext, inputs: dict):\n" - f' """Pass-through step."""\n' - f' return inputs.get("input", context.inputs)' - ) - - -_NODE_EMITTERS: dict[NodeType, Any] = { - NodeType.AGENT: _emit_agent_node, - NodeType.TOOL: _emit_tool_node, - NodeType.REASONING: _emit_reasoning_node, - NodeType.CONDITION: _emit_condition_node, - NodeType.FAN_OUT: _emit_fan_out_node, - NodeType.FAN_IN: _emit_fan_in_node, - NodeType.MEMORY: _emit_memory_node, - NodeType.VALIDATOR: _emit_validator_node, - NodeType.CUSTOM_CODE: _emit_custom_code_node, - NodeType.INPUT: _emit_input_node, - NodeType.OUTPUT: _emit_output_node, - NodeType.PIPELINE_STEP: _emit_pipeline_step_node, -} - - -# --------------------------------------------------------------------------- -# Pipeline builder emission -# --------------------------------------------------------------------------- - - -def _emit_pipeline(graph: GraphModel) -> str: - """Emit a PipelineBuilder block that wires all nodes and edges.""" - parts: list[str] = [] - parts.append("# Build the pipeline") - parts.append("pipeline = (") - parts.append(' PipelineBuilder("pipeline")') - - for node in graph.nodes: - step_expr = _step_expression(node) - parts.append(f' .add_node("{node.id}", {step_expr})') - - for edge in graph.edges: - source_handle = edge.source_handle if edge.source_handle != "output" else "" - target_handle = edge.target_handle if edge.target_handle != "input" else "" - extra_args = "" - if source_handle: - extra_args += f', output_key="{edge.source_handle}"' - if target_handle: - extra_args += f', input_key="{edge.target_handle}"' - parts.append(f' .add_edge("{edge.source}", "{edge.target}"{extra_args})') - - parts.append(" .build()") - parts.append(")") - return "\n".join(parts) - - -def _step_expression(node: GraphNode) -> str: - """Return the Python expression for a step in the pipeline builder.""" - name = _safe_var(node.id) - - if node.type == NodeType.AGENT: - return f"AgentStep({name})" - elif node.type == NodeType.TOOL: - return f"CallableStep({name}_execute)" - elif node.type == NodeType.REASONING: - return f"ReasoningStep({name}_pattern, {name}_agent)" - elif node.type == NodeType.CONDITION: - return f"BranchStep({name}_router)" - elif node.type == NodeType.FAN_OUT: - return f"FanOutStep({name}_split)" - elif node.type == NodeType.FAN_IN: - merge_expr = node.data.get("merge_expression", "collect") - if merge_expr == "collect": - return "FanInStep()" - return f"FanInStep({name}_merge)" - elif node.type == NodeType.MEMORY: - return f"CallableStep({name}_execute)" - elif node.type == NodeType.VALIDATOR: - return f"CallableStep({name}_validate)" - elif node.type == NodeType.CUSTOM_CODE: - return f"CallableStep({name}_execute)" - elif node.type in (NodeType.INPUT, NodeType.OUTPUT, NodeType.PIPELINE_STEP): - return f"CallableStep({name}_step)" - else: - return f"# Unknown node type: {node.type}" - - -def _emit_main_block(graph: GraphModel) -> str: - """Emit an ``if __name__`` block to run the pipeline.""" - # Check if there's an input node to determine what to pass - input_nodes = [n for n in graph.nodes if n.type == NodeType.INPUT] - - lines = [ - 'if __name__ == "__main__":', - "", - " async def main():", - " from fireflyframework_agentic.pipeline.context import PipelineContext", - ] - - has_memory = any(n.type == NodeType.MEMORY for n in graph.nodes) - if has_memory: - lines.append(' memory = MemoryManager(store=FileStore(base_dir="./memory"))') - lines.append(" context = PipelineContext(memory=memory)") - else: - lines.append(" context = PipelineContext()") - - if input_nodes: - trigger = input_nodes[0].data.get("trigger_type", "manual") - lines.append(f" # Trigger type: {trigger}") - - lines.extend( - [ - ' result = await pipeline.run(context, inputs={"input": "Hello, pipeline!"})', - ' print("Pipeline result:", result)', - "", - " asyncio.run(main())", - ] - ) - return "\n".join(lines) - - -# --------------------------------------------------------------------------- -# Utilities -# --------------------------------------------------------------------------- - - -def _safe_var(node_id: str) -> str: - """Convert a node ID into a valid Python identifier.""" - return node_id.replace("-", "_").replace(" ", "_").replace(".", "_") - - -def _format_string_literal(value: str) -> str: - """Return a Python string literal for *value*. - - * Simple single-line strings without problematic characters use ``"..."``. - * Multi-line strings (containing ``\\n``) use triple-quoted strings so the - generated code is readable. - * Strings containing triple-double-quotes fall back to triple-single-quotes - (and vice-versa) to guarantee valid syntax. - * Backslashes are always properly escaped. - """ - if not value: - return '""' - - has_newline = "\n" in value - - if not has_newline: - return _repr_double_quoted(value) - - escaped = value.replace("\\", "\\\\") - - has_triple_double = '"""' in escaped - has_triple_single = "'''" in escaped - - if not has_triple_double: - inner = escaped.replace('"', '\\"') if escaped.endswith('"') else escaped - if '"""' not in inner: - return f'"""{inner}"""' - - if not has_triple_single: - inner = escaped.replace("'", "\\'") if escaped.endswith("'") else escaped - if "'''" not in inner: - return f"'''{inner}'''" - - inner = escaped.replace('"""', '\\"\\"\\"') - return f'"""{inner}"""' - - -def _repr_double_quoted(value: str) -> str: - """Return a double-quoted Python string literal for *value*.""" - r = repr(value) - - if r.startswith("'") and r.endswith("'"): - inner = r[1:-1] - inner = inner.replace("\\'", "'") - inner = inner.replace('"', '\\"') - return f'"{inner}"' - - return r diff --git a/src/fireflyframework_agentic/studio/codegen/models.py b/src/fireflyframework_agentic/studio/codegen/models.py deleted file mode 100644 index 928967da..00000000 --- a/src/fireflyframework_agentic/studio/codegen/models.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Graph intermediate-representation models. - -These Pydantic models describe the visual graph that the Studio canvas -produces. The frontend serialises the @xyflow/svelte node/edge data into -these structures, which the backend then lowers into executable Python code. -""" - -from __future__ import annotations - -from enum import StrEnum - -from pydantic import BaseModel - - -class NodeType(StrEnum): - """Discriminator for the kind of behaviour a graph node represents.""" - - AGENT = "agent" - TOOL = "tool" - REASONING = "reasoning" - PIPELINE_STEP = "pipeline_step" - FAN_OUT = "fan_out" - FAN_IN = "fan_in" - CONDITION = "condition" - MEMORY = "memory" - VALIDATOR = "validator" - CUSTOM_CODE = "custom_code" - INPUT = "input" - OUTPUT = "output" - - -class GraphNode(BaseModel): - """A single node on the visual canvas.""" - - id: str - type: NodeType - label: str - position: dict[str, float] # {"x": 100, "y": 200} - data: dict # node-specific configuration - width: float | None = None - height: float | None = None - - -class GraphEdge(BaseModel): - """A directed connection between two nodes.""" - - id: str - source: str - target: str - source_handle: str = "output" - target_handle: str = "input" - label: str | None = None - - -class GraphModel(BaseModel): - """Top-level graph that the canvas persists and the code generator reads.""" - - nodes: list[GraphNode] = [] - edges: list[GraphEdge] = [] - metadata: dict = {} diff --git a/src/fireflyframework_agentic/studio/config.py b/src/fireflyframework_agentic/studio/config.py deleted file mode 100644 index 82508a41..00000000 --- a/src/fireflyframework_agentic/studio/config.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Configuration for Firefly Agentic Studio. - -All configuration values can be overridden via environment variables prefixed -with ``FIREFLY_STUDIO_``. For example, setting ``FIREFLY_STUDIO_PORT`` -in the environment will override the ``port`` field. -""" - -from __future__ import annotations - -from pathlib import Path - -from pydantic_settings import BaseSettings, SettingsConfigDict - - -class StudioConfig(BaseSettings): - """Studio configuration loaded from environment variables.""" - - model_config = SettingsConfigDict( - env_prefix="FIREFLY_STUDIO_", - env_file=".env", - env_file_encoding="utf-8", - extra="ignore", - ) - - host: str = "127.0.0.1" - """Address the Studio server binds to.""" - - port: int = 8470 - """Port the Studio server listens on.""" - - open_browser: bool = True - """Whether to open the browser automatically on launch.""" - - dev_mode: bool = False - """Enable development mode (e.g. hot reload, verbose logging).""" - - projects_dir: Path = Path.home() / ".firefly-studio" / "projects" - """Directory where Studio persists project data.""" - - custom_tools_dir: Path = Path.home() / ".firefly-studio" / "custom_tools" - """Directory where Studio persists custom tool definitions.""" - - log_level: str = "info" - """Logging level for Studio.""" diff --git a/src/fireflyframework_agentic/studio/custom_tools.py b/src/fireflyframework_agentic/studio/custom_tools.py deleted file mode 100644 index 62627d4e..00000000 --- a/src/fireflyframework_agentic/studio/custom_tools.py +++ /dev/null @@ -1,264 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Persistence and runtime loading for user-defined custom tools. - -Custom tools are stored as JSON definitions under -``~/.firefly-studio/custom_tools/``. Three tool types are supported: - -* **python** – A Python file on disk loaded via :mod:`importlib`. -* **webhook** – An HTTP endpoint called at runtime. -* **api** – A structured API call with configurable auth. - -The :class:`CustomToolManager` handles CRUD and converts definitions into -live :class:`~fireflyframework_agentic.tools.base.BaseTool` instances that -can be registered with the global tool registry. -""" - -from __future__ import annotations - -import importlib.util -import json -import logging -from dataclasses import asdict, dataclass, field -from datetime import UTC, datetime -from pathlib import Path -from typing import Any - -from fireflyframework_agentic.tools.decorators import _DecoratedTool -from fireflyframework_agentic.tools.registry import tool_registry - -logger = logging.getLogger(__name__) - - -@dataclass -class ToolParameter: - """A single parameter accepted by a custom tool.""" - - name: str - type: str = "string" - description: str = "" - required: bool = True - default: Any = None - - -@dataclass -class CustomToolDefinition: - """Serializable definition of a user-created custom tool.""" - - name: str - description: str = "" - tool_type: str = "python" # python | webhook | api - tags: list[str] = field(default_factory=list) - parameters: list[ToolParameter] = field(default_factory=list) - created_at: str = "" - updated_at: str = "" - - # -- Python tool fields -- - module_path: str = "" # path to .py file with an async `run` function - - # -- Webhook tool fields -- - webhook_url: str = "" - webhook_method: str = "POST" - webhook_headers: dict[str, str] = field(default_factory=dict) - - # -- API tool fields -- - api_base_url: str = "" - api_path: str = "" - api_method: str = "GET" - api_auth_type: str = "" # bearer | api_key | none - api_auth_value: str = "" - api_headers: dict[str, str] = field(default_factory=dict) - - -class CustomToolManager: - """Manage custom tool definitions stored as JSON on disk. - - Parameters - ---------- - base_dir: - Root directory for custom tool storage. Defaults to - ``~/.firefly-studio/custom_tools``. - """ - - def __init__(self, base_dir: Path | None = None) -> None: - self._base_dir = (base_dir or Path.home() / ".firefly-studio" / "custom_tools").resolve() - self._base_dir.mkdir(parents=True, exist_ok=True) - - def _safe_path(self, name: str) -> Path: - resolved = (self._base_dir / f"{name}.json").resolve() - if not str(resolved).startswith(str(self._base_dir)): - raise ValueError(f"Invalid tool name: {name}") - return resolved - - # -- CRUD --------------------------------------------------------------- - - def save(self, definition: CustomToolDefinition) -> None: - """Persist a tool definition to disk.""" - now = datetime.now(UTC).isoformat() - if not definition.created_at: - definition.created_at = now - definition.updated_at = now - - path = self._safe_path(definition.name) - data = asdict(definition) - path.write_text(json.dumps(data, indent=2)) - logger.info("Saved custom tool '%s' to %s", definition.name, path) - - def load(self, name: str) -> CustomToolDefinition: - """Load a tool definition by name.""" - path = self._safe_path(name) - if not path.is_file(): - raise FileNotFoundError(f"Custom tool '{name}' not found") - data = json.loads(path.read_text()) - params = [ToolParameter(**p) for p in data.pop("parameters", [])] - return CustomToolDefinition(**data, parameters=params) - - def list_all(self) -> list[CustomToolDefinition]: - """Return all saved tool definitions.""" - tools: list[CustomToolDefinition] = [] - for path in sorted(self._base_dir.glob("*.json")): - try: - data = json.loads(path.read_text()) - params = [ToolParameter(**p) for p in data.pop("parameters", [])] - tools.append(CustomToolDefinition(**data, parameters=params)) - except Exception as exc: - logger.warning("Skipping invalid tool file %s: %s", path, exc) - return tools - - def delete(self, name: str) -> None: - """Remove a tool definition from disk.""" - path = self._safe_path(name) - if not path.is_file(): - raise FileNotFoundError(f"Custom tool '{name}' not found") - path.unlink() - # Also unregister from the global registry if loaded - if tool_registry.has(f"custom:{name}"): - tool_registry.unregister(f"custom:{name}") - logger.info("Deleted custom tool '%s'", name) - - # -- Runtime tool creation ---------------------------------------------- - - def create_runtime_tool(self, definition: CustomToolDefinition) -> _DecoratedTool: - """Convert a definition into a live BaseTool instance.""" - tool_name = f"custom:{definition.name}" - - if definition.tool_type == "python": - handler = self._make_python_handler(definition) - elif definition.tool_type == "webhook": - handler = self._make_webhook_handler(definition) - elif definition.tool_type == "api": - handler = self._make_api_handler(definition) - else: - raise ValueError(f"Unknown tool type: {definition.tool_type}") - - return _DecoratedTool( - tool_name, - handler, - description=definition.description, - tags=["custom", *definition.tags], - ) - - def _make_python_handler(self, definition: CustomToolDefinition): - """Load an async ``run`` function from a Python file on disk.""" - module_path = Path(definition.module_path).resolve() - if not module_path.is_file(): - raise FileNotFoundError(f"Python module not found: {definition.module_path}") - - spec = importlib.util.spec_from_file_location(f"custom_tool_{definition.name}", module_path) - if spec is None or spec.loader is None: - raise ImportError(f"Cannot load module from {module_path}") - - module = importlib.util.module_from_spec(spec) - spec.loader.exec_module(module) - - run_fn = getattr(module, "run", None) - if run_fn is None: - raise AttributeError(f"Module {module_path} must define an async 'run' function") - return run_fn - - def _make_webhook_handler(self, definition: CustomToolDefinition): - """Create a handler that calls an HTTP webhook.""" - - async def webhook_handler(**kwargs: Any) -> str: - import httpx - - async with httpx.AsyncClient(timeout=30) as client: - response = await client.request( - method=definition.webhook_method, - url=definition.webhook_url, - headers=definition.webhook_headers, - json=kwargs, - ) - response.raise_for_status() - return response.text - - webhook_handler.__doc__ = definition.description - return webhook_handler - - def _make_api_handler(self, definition: CustomToolDefinition): - """Create a handler that calls a structured API endpoint.""" - - async def api_handler(**kwargs: Any) -> str: - import httpx - - headers = dict(definition.api_headers) - if definition.api_auth_type == "bearer": - headers["Authorization"] = f"Bearer {definition.api_auth_value}" - elif definition.api_auth_type == "api_key": - headers["X-API-Key"] = definition.api_auth_value - - url = f"{definition.api_base_url.rstrip('/')}/{definition.api_path.lstrip('/')}" - async with httpx.AsyncClient(timeout=30) as client: - if definition.api_method.upper() in ("POST", "PUT", "PATCH"): - response = await client.request( - method=definition.api_method, - url=url, - headers=headers, - json=kwargs, - ) - else: - response = await client.request( - method=definition.api_method, - url=url, - headers=headers, - params=kwargs, - ) - response.raise_for_status() - return response.text - - api_handler.__doc__ = definition.description - return api_handler - - # -- Bulk registration -------------------------------------------------- - - def register_all(self) -> int: - """Load all saved tools and register them in the global registry. - - Returns the number of tools successfully registered. - """ - count = 0 - for definition in self.list_all(): - try: - tool = self.create_runtime_tool(definition) - tool_registry.register(tool) - count += 1 - logger.info("Registered custom tool '%s'", tool.name) - except Exception as exc: - logger.warning( - "Failed to register custom tool '%s': %s", - definition.name, - exc, - ) - return count diff --git a/src/fireflyframework_agentic/studio/evaluation.py b/src/fireflyframework_agentic/studio/evaluation.py deleted file mode 100644 index e26768b0..00000000 --- a/src/fireflyframework_agentic/studio/evaluation.py +++ /dev/null @@ -1,224 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Evaluation engine for testing pipelines against JSONL datasets. - -Compiles a :class:`~fireflyframework_agentic.studio.codegen.models.GraphModel`, -runs each test case through the resulting pipeline, and compares outputs -against expected values. -""" - -from __future__ import annotations - -import json -import logging -from dataclasses import dataclass, field -from pathlib import Path -from typing import Any - -logger = logging.getLogger(__name__) - - -@dataclass -class TestCase: - """A single test case from a JSONL dataset.""" - - input: str - expected_output: str = "" - metadata: dict[str, Any] = field(default_factory=dict) - - -@dataclass -class TestResult: - """Result of running a single test case through a pipeline.""" - - input: str - expected_output: str - actual_output: str - passed: bool - error: str = "" - - -@dataclass -class EvaluationResult: - """Aggregate result of running a pipeline against a dataset.""" - - dataset_name: str - total: int - passed: int - failed: int - error_count: int - results: list[TestResult] - - @property - def pass_rate(self) -> float: - """Return the pass rate as a percentage (0-100).""" - if self.total == 0: - return 0.0 - return round((self.passed / self.total) * 100, 1) - - -def load_dataset(path: Path) -> list[TestCase]: - """Load test cases from a JSONL file. - - Each line must be a JSON object with at minimum an ``"input"`` field. - Optional fields: ``"expected_output"``, plus any extra keys stored - as ``metadata``. - - Raises - ------ - ValueError - If the file is empty or contains invalid JSON lines. - """ - if not path.is_file(): - raise FileNotFoundError(f"Dataset file not found: {path}") - - cases: list[TestCase] = [] - text = path.read_text(encoding="utf-8") - - for lineno, line in enumerate(text.strip().splitlines(), start=1): - line = line.strip() - if not line: - continue - try: - obj = json.loads(line) - except json.JSONDecodeError as exc: - raise ValueError(f"Invalid JSON on line {lineno}: {exc}") from exc - - if "input" not in obj: - raise ValueError(f"Line {lineno} is missing required 'input' field") - - cases.append( - TestCase( - input=str(obj["input"]), - expected_output=str(obj.get("expected_output", "")), - metadata={k: v for k, v in obj.items() if k not in {"input", "expected_output"}}, - ) - ) - - if not cases: - raise ValueError("Dataset file is empty") - - return cases - - -def compare_outputs(expected: str, actual: str) -> bool: - """Compare expected and actual outputs. - - When ``expected`` is empty, the test passes unconditionally (no assertion). - Otherwise a case-insensitive, whitespace-normalized comparison is used. - """ - if not expected: - return True - return _normalize(expected) == _normalize(actual) - - -def _normalize(text: str) -> str: - """Normalize text for comparison: lowercase, collapse whitespace.""" - return " ".join(text.lower().split()) - - -async def run_evaluation( - graph_data: dict[str, Any], - cases: list[TestCase], -) -> EvaluationResult: - """Run a compiled pipeline against a list of test cases. - - Parameters - ---------- - graph_data: - Raw graph dict that will be validated into a - :class:`~fireflyframework_agentic.studio.codegen.models.GraphModel`. - cases: - The test cases to evaluate. - - Returns - ------- - EvaluationResult - Aggregate result with per-case details. - """ - from fireflyframework_agentic.studio.codegen.models import GraphModel - from fireflyframework_agentic.studio.execution.compiler import CompilationError, compile_graph - - graph = GraphModel.model_validate(graph_data) - try: - engine = compile_graph(graph) - except CompilationError as exc: - # All cases fail if the graph can't compile - return EvaluationResult( - dataset_name="", - total=len(cases), - passed=0, - failed=0, - error_count=len(cases), - results=[ - TestResult( - input=c.input, - expected_output=c.expected_output, - actual_output="", - passed=False, - error=f"Compilation error: {exc}", - ) - for c in cases - ], - ) - - results: list[TestResult] = [] - passed = 0 - failed = 0 - error_count = 0 - - for case in cases: - try: - result = await engine.run(inputs=case.input) - # Extract the output from the last node - actual = "" - if result.outputs: - last_node = list(result.outputs.values())[-1] - actual = str(last_node.output) if last_node.output is not None else "" - - is_pass = compare_outputs(case.expected_output, actual) - if is_pass: - passed += 1 - else: - failed += 1 - - results.append( - TestResult( - input=case.input, - expected_output=case.expected_output, - actual_output=actual, - passed=is_pass, - ) - ) - except Exception as exc: - error_count += 1 - results.append( - TestResult( - input=case.input, - expected_output=case.expected_output, - actual_output="", - passed=False, - error=str(exc), - ) - ) - - return EvaluationResult( - dataset_name="", - total=len(cases), - passed=passed, - failed=failed, - error_count=error_count, - results=results, - ) diff --git a/src/fireflyframework_agentic/studio/execution/__init__.py b/src/fireflyframework_agentic/studio/execution/__init__.py deleted file mode 100644 index 1bcfa309..00000000 --- a/src/fireflyframework_agentic/studio/execution/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Studio execution sub-package: bridges PipelineEngine events to the frontend.""" diff --git a/src/fireflyframework_agentic/studio/execution/checkpoint.py b/src/fireflyframework_agentic/studio/execution/checkpoint.py deleted file mode 100644 index 921a94c1..00000000 --- a/src/fireflyframework_agentic/studio/execution/checkpoint.py +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Checkpoint system for time-travel debugging in Studio. - -The :class:`CheckpointManager` stores immutable snapshots of execution -state at each pipeline step. Users can rewind to any checkpoint, fork -execution with modified state, and compare state diffs between any two -points in the timeline. -""" - -from __future__ import annotations - -import uuid -from dataclasses import dataclass -from datetime import UTC, datetime - - -@dataclass(frozen=True) -class Checkpoint: - """An immutable snapshot of pipeline execution state. - - Attributes: - index: Sequential index in the timeline. - node_id: Identifier of the node that produced this checkpoint. - state: Node output / pipeline state at this point. - inputs: Inputs that were fed to the node. - timestamp: UTC ISO 8601 timestamp (auto-set on creation). - branch_id: Non-``None`` for forked checkpoints. - parent_index: Index of the parent checkpoint (for forks). - """ - - index: int - node_id: str - state: dict - inputs: dict - timestamp: str = "" - branch_id: str | None = None - parent_index: int | None = None - - -class CheckpointManager: - """Manages an ordered timeline of :class:`Checkpoint` snapshots. - - Every time a pipeline node completes, the execution engine calls - :meth:`create` to record a checkpoint. The manager auto-assigns - sequential indices and UTC timestamps. - - Supports forking (re-running from a previous checkpoint with - modified state) and diffing (comparing the ``state`` dicts of - two checkpoints). - """ - - def __init__(self) -> None: - self._checkpoints: list[Checkpoint] = [] - - # ------------------------------------------------------------------ - # Public API - # ------------------------------------------------------------------ - - def create( - self, - *, - node_id: str, - state: dict, - inputs: dict, - branch_id: str | None = None, - ) -> Checkpoint: - """Create a new checkpoint. - - The index is auto-assigned sequentially and the timestamp is - set to the current UTC time in ISO 8601 format. - - Parameters: - node_id: Identifier of the node that produced this state. - state: The pipeline state to snapshot. - inputs: The inputs that were fed to the node. - branch_id: Optional branch identifier for forked checkpoints. - - Returns: - The newly created :class:`Checkpoint`. - """ - cp = Checkpoint( - index=len(self._checkpoints), - node_id=node_id, - state=state, - inputs=inputs, - timestamp=datetime.now(UTC).isoformat(), - branch_id=branch_id, - ) - self._checkpoints.append(cp) - return cp - - def get(self, index: int) -> Checkpoint: - """Retrieve a checkpoint by its sequential index. - - Parameters: - index: Non-negative checkpoint index. - - Returns: - The :class:`Checkpoint` at *index*. - - Raises: - IndexError: If *index* is out of range or negative. - """ - if index < 0 or index >= len(self._checkpoints): - raise IndexError(f"Checkpoint index {index} out of range") - return self._checkpoints[index] - - def list_all(self) -> list[Checkpoint]: - """Return all checkpoints as a defensive copy. - - Returns: - A new list containing all recorded checkpoints in order. - """ - return list(self._checkpoints) - - def fork(self, from_index: int, modified_state: dict) -> Checkpoint: - """Fork from an existing checkpoint with modified state. - - Creates a new checkpoint that inherits the parent's ``node_id`` - and ``inputs`` but uses *modified_state*. A new ``branch_id`` - (8-character hex UUID) is assigned and ``parent_index`` is set - to *from_index*. - - Parameters: - from_index: Index of the checkpoint to fork from. - modified_state: The new state for the forked checkpoint. - - Returns: - The newly created forked :class:`Checkpoint`. - """ - parent = self.get(from_index) - branch_id = uuid.uuid4().hex[:8] - cp = Checkpoint( - index=len(self._checkpoints), - node_id=parent.node_id, - state=modified_state, - inputs=parent.inputs, - timestamp=datetime.now(UTC).isoformat(), - branch_id=branch_id, - parent_index=from_index, - ) - self._checkpoints.append(cp) - return cp - - def diff(self, index_a: int, index_b: int) -> dict: - """Compare the ``state`` dicts of two checkpoints. - - Parameters: - index_a: Index of the first checkpoint. - index_b: Index of the second checkpoint. - - Returns: - A dict with keys ``added``, ``removed``, and ``changed``, - each containing a :class:`set` of state-dict keys. - - - **added**: keys present in *index_b* but not *index_a*. - - **removed**: keys present in *index_a* but not *index_b*. - - **changed**: keys present in both but with different values. - """ - state_a = self.get(index_a).state - state_b = self.get(index_b).state - - keys_a = set(state_a.keys()) - keys_b = set(state_b.keys()) - - added = keys_b - keys_a - removed = keys_a - keys_b - common = keys_a & keys_b - changed = {k for k in common if state_a[k] != state_b[k]} - - return {"added": added, "removed": removed, "changed": changed} - - def rewind(self, to_index: int) -> None: - """Rewind the timeline to a given checkpoint. - - Removes all checkpoints **after** *to_index*, keeping - the checkpoint at *to_index* as the last in the timeline. - - Parameters: - to_index: Index to rewind to (inclusive). - - Raises: - IndexError: If *to_index* is out of range. - """ - if to_index < 0 or to_index >= len(self._checkpoints): - raise IndexError(f"Checkpoint index {to_index} out of range") - self._checkpoints = self._checkpoints[: to_index + 1] - - def clear(self) -> None: - """Clear all checkpoints and reset the index counter.""" - self._checkpoints.clear() diff --git a/src/fireflyframework_agentic/studio/execution/compiler.py b/src/fireflyframework_agentic/studio/execution/compiler.py deleted file mode 100644 index 349ef13b..00000000 --- a/src/fireflyframework_agentic/studio/execution/compiler.py +++ /dev/null @@ -1,413 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Compile a Studio GraphModel into a runnable PipelineEngine. - -The compiler maps each visual canvas node to the corresponding -:class:`~fireflyframework_agentic.pipeline.steps.StepExecutor` and wires -the edges into a :class:`~fireflyframework_agentic.pipeline.dag.DAG`. - -Usage:: - - from fireflyframework_agentic.studio.execution.compiler import compile_graph - - engine = compile_graph(graph, event_handler=handler) - result = await engine.run(context, inputs=user_input) -""" - -from __future__ import annotations - -import logging -from collections.abc import Callable -from typing import Any - -from fireflyframework_agentic.pipeline.builder import PipelineBuilder -from fireflyframework_agentic.pipeline.context import PipelineContext -from fireflyframework_agentic.pipeline.engine import PipelineEngine, PipelineEventHandler -from fireflyframework_agentic.pipeline.steps import ( - AgentStep, - BranchStep, - CallableStep, - FanInStep, - FanOutStep, - ReasoningStep, -) -from fireflyframework_agentic.studio.codegen.models import GraphModel, GraphNode, NodeType -from fireflyframework_agentic.studio.execution.io_nodes import InputNodeConfig, OutputNodeConfig - -logger = logging.getLogger(__name__) - - -class CompilationError(Exception): - """Raised when a graph cannot be compiled into a pipeline.""" - - -def compile_graph( - graph: GraphModel, - event_handler: PipelineEventHandler | None = None, -) -> PipelineEngine: - """Compile a :class:`GraphModel` into a runnable :class:`PipelineEngine`. - - Parameters: - graph: The visual graph model from the Studio canvas. - event_handler: Optional handler for real-time execution events. - - Returns: - A configured :class:`PipelineEngine` ready to run. - - Raises: - CompilationError: If the graph contains invalid or incomplete nodes. - """ - if not graph.nodes: - raise CompilationError("Graph has no nodes") - - # Validate IO node constraints when present - input_nodes = [n for n in graph.nodes if n.type == NodeType.INPUT] - output_nodes = [n for n in graph.nodes if n.type == NodeType.OUTPUT] - - if input_nodes: - if len(input_nodes) > 1: - raise CompilationError(f"Pipeline must have exactly one Input node, found {len(input_nodes)}.") - if not output_nodes: - raise CompilationError("Pipeline with an Input node must have at least one Output node.") - - name = graph.metadata.get("name", "studio-pipeline") - builder = PipelineBuilder(name=name) - - for node in graph.nodes: - step = _compile_node(node) - builder.add_node(node.id, step) - - for edge in graph.edges: - builder.add_edge( - edge.source, - edge.target, - output_key=edge.source_handle, - input_key=edge.target_handle, - ) - - dag = builder.build_dag() - return PipelineEngine(dag, event_handler=event_handler) - - -def _compile_node(node: GraphNode) -> Any: - """Map a single graph node to the appropriate StepExecutor.""" - compiler = _NODE_COMPILERS.get(node.type) - if compiler is None: - raise CompilationError(f"Unsupported node type: {node.type!r} (node {node.id!r})") - return compiler(node) - - -# --------------------------------------------------------------------------- -# Node compilers — one function per NodeType -# --------------------------------------------------------------------------- - - -def _compile_agent(node: GraphNode) -> AgentStep: - """Compile an AGENT node. - - Tries the global agent registry first. If the agent is not registered, - creates a dynamic FireflyAgent from the node's model + instructions. - """ - from fireflyframework_agentic.agents.base import FireflyAgent - from fireflyframework_agentic.agents.registry import agent_registry - - agent_name = node.data.get("agent_name", node.label) - - if agent_registry.has(agent_name): - agent = agent_registry.get(agent_name) - return AgentStep(agent) - - model = node.data.get("model") - if not model: - raise CompilationError(f"AGENT node {node.id!r} requires a 'model' in data (e.g. 'openai:gpt-4o')") - - instructions = node.data.get("instructions", "") - agent = FireflyAgent( - name=agent_name, - model=model, - instructions=instructions, - auto_register=False, - ) - return AgentStep(agent) - - -def _compile_tool(node: GraphNode) -> CallableStep: - """Compile a TOOL node by looking up the registered tool.""" - from fireflyframework_agentic.tools.registry import tool_registry - - tool_name = node.data.get("tool_name") - if not tool_name: - raise CompilationError(f"TOOL node {node.id!r} requires 'tool_name' in data") - - if not tool_registry.has(tool_name): - raise CompilationError(f"Tool {tool_name!r} is not registered (node {node.id!r})") - - tool = tool_registry.get(tool_name) - - async def _execute_tool(context: PipelineContext, inputs: dict[str, Any]) -> Any: - return await tool.execute(**inputs) - - return CallableStep(_execute_tool) - - -def _compile_reasoning(node: GraphNode) -> ReasoningStep: - """Compile a REASONING node from registered pattern + agent.""" - from fireflyframework_agentic.agents.registry import agent_registry - from fireflyframework_agentic.reasoning.registry import reasoning_registry - - pattern_name = node.data.get("pattern_name") - if not pattern_name: - raise CompilationError(f"REASONING node {node.id!r} requires 'pattern_name' in data") - - agent_name = node.data.get("agent_name") - if not agent_name: - raise CompilationError(f"REASONING node {node.id!r} requires 'agent_name' in data") - - if not reasoning_registry.has(pattern_name): - raise CompilationError(f"Reasoning pattern {pattern_name!r} is not registered (node {node.id!r})") - if not agent_registry.has(agent_name): - raise CompilationError(f"Agent {agent_name!r} is not registered (node {node.id!r})") - - pattern = reasoning_registry.get(pattern_name) - agent = agent_registry.get(agent_name) - return ReasoningStep(pattern, agent) - - -def _compile_pipeline_step(node: GraphNode) -> CallableStep: - """Compile a generic PIPELINE_STEP node as a pass-through.""" - - async def _passthrough(context: PipelineContext, inputs: dict[str, Any]) -> Any: - return inputs.get("input", context.inputs) - - return CallableStep(_passthrough) - - -def _compile_fan_out(node: GraphNode) -> FanOutStep: - """Compile a FAN_OUT node with a split function. - - If ``split_expression`` is a dotted field path (e.g. ``"items"``), - extracts that key from the input. Otherwise splits the input - into a list if it isn't one already. - """ - field = node.data.get("split_expression", "") - - def _split(value: Any) -> list[Any]: - if field and isinstance(value, dict): - extracted = value.get(field, value) - return list(extracted) if isinstance(extracted, list) else [extracted] - if isinstance(value, list): - return value - return [value] - - return FanOutStep(_split) - - -def _compile_fan_in(node: GraphNode) -> FanInStep: - """Compile a FAN_IN node with a merge function. - - Supported merge expressions: - - ``"concat"``: flatten all upstream lists into one - - ``"collect"`` (default): gather all upstream outputs as a list - """ - merge_expr = node.data.get("merge_expression", "collect") - - if merge_expr == "concat": - - def _concat(items: list[Any]) -> Any: - result: list[Any] = [] - for item in items: - if isinstance(item, list): - result.extend(item) - else: - result.append(item) - return result - - return FanInStep(_concat) - - # Default: collect - return FanInStep() - - -def _compile_condition(node: GraphNode) -> BranchStep: - """Compile a CONDITION node into a BranchStep. - - The node's ``condition`` field is a key name to look up in the input. - The ``branches`` dict maps possible values to branch labels. - If no match, returns the first branch as default. - """ - condition_key = node.data.get("condition", "input") - branches: dict[str, str] = node.data.get("branches", {}) - - if not branches: - raise CompilationError(f"CONDITION node {node.id!r} requires 'branches' in data") - - default_branch = next(iter(branches.values())) - - def _route(inputs: dict[str, Any]) -> str: - value = str(inputs.get(condition_key, "")) - return branches.get(value, default_branch) - - return BranchStep(_route) - - -def _compile_memory(node: GraphNode) -> CallableStep: - """Compile a MEMORY node. - - Supports actions: ``store``, ``retrieve``, ``clear``. - Operates on the PipelineContext's memory manager if available. - """ - action = node.data.get("memory_action", "retrieve") - - async def _memory_op(context: PipelineContext, inputs: dict[str, Any]) -> Any: - memory = context.memory - if memory is None: - logger.warning("MEMORY node executed but no MemoryManager on context") - return inputs.get("input") - - key = inputs.get("key", "default") - - if action == "store": - value = inputs.get("input", inputs.get("value")) - memory.set_fact(key, value) - return value - elif action == "clear": - memory.working.delete(key) - return None - else: - # retrieve - return memory.get_fact(key) - - return CallableStep(_memory_op) - - -def _compile_validator(node: GraphNode) -> CallableStep: - """Compile a VALIDATOR node. - - Validates input against a rule and passes through if valid, - raises on failure. - """ - rule = node.data.get("validation_rule", "") - - async def _validate(context: PipelineContext, inputs: dict[str, Any]) -> Any: - value = inputs.get("input", context.inputs) - - if rule == "not_empty": - if not value: - raise ValueError(f"Validation failed: value is empty (node {node.id!r})") - elif rule == "is_string": - if not isinstance(value, str): - raise TypeError(f"Validation failed: expected string, got {type(value).__name__} (node {node.id!r})") - elif rule == "is_list": - if not isinstance(value, list): - raise TypeError(f"Validation failed: expected list, got {type(value).__name__} (node {node.id!r})") - elif rule == "is_dict": - if not isinstance(value, dict): - raise TypeError(f"Validation failed: expected dict, got {type(value).__name__} (node {node.id!r})") - elif rule and isinstance(value, dict) and rule not in value: # custom key check - raise KeyError(f"Validation failed: key {rule!r} missing from input (node {node.id!r})") - - return value - - return CallableStep(_validate) - - -def _compile_custom_code(node: GraphNode) -> CallableStep: - """Compile a CUSTOM_CODE node. - - The ``code`` field must define an async function named ``execute`` - with signature ``async def execute(context, inputs) -> Any``. - - Security note: This executes user-authored code within the local - Studio IDE, analogous to Jupyter notebook cell execution. - """ - code = node.data.get("code", "") - if not code: - raise CompilationError(f"CUSTOM_CODE node {node.id!r} requires 'code' in data") - - # Compile the code at graph compile time so syntax errors surface early - try: - compiled = compile(code, f"", "exec") - except SyntaxError as exc: - raise CompilationError(f"Syntax error in CUSTOM_CODE node {node.id!r}: {exc}") from exc - - namespace: dict[str, Any] = {} - exec(compiled, namespace) # noqa: S102 - - execute_fn = namespace.get("execute") - if execute_fn is None or not callable(execute_fn): - raise CompilationError(f"CUSTOM_CODE node {node.id!r} must define 'async def execute(context, inputs) -> Any'") - - # At this point execute_fn is a callable; capture a typed reference - _fn: Callable[..., Any] = execute_fn - - async def _run_custom(context: PipelineContext, inputs: dict[str, Any]) -> Any: - result = _fn(context, inputs) - if hasattr(result, "__await__"): - return await result - return result - - return CallableStep(_run_custom) - - -def _compile_input(node: GraphNode) -> CallableStep: - """Compile an Input boundary node. - - The Input node is a pass-through: it receives pipeline inputs and - forwards them to downstream nodes. Validation against the schema - (if configured) happens at the API boundary, not here. - """ - config = InputNodeConfig(**node.data) - _ = config # validation happens at construction time - - async def _input_step(context: PipelineContext, inputs: dict[str, Any]) -> Any: - return inputs.get("input", context.inputs) - - return CallableStep(_input_step) - - -def _compile_output(node: GraphNode) -> CallableStep: - """Compile an Output boundary node. - - The Output node collects the final result. Destination routing - (queue publish, webhook POST, etc.) is handled by the ProjectRuntime - after pipeline execution completes, not within the step itself. - """ - config = OutputNodeConfig(**node.data) - - async def _output_step(context: PipelineContext, inputs: dict[str, Any]) -> Any: - context.metadata["_output_config"] = config.model_dump() - return inputs.get("input", inputs) - - return CallableStep(_output_step) - - -# --------------------------------------------------------------------------- -# Dispatch table -# --------------------------------------------------------------------------- - -_NODE_COMPILERS: dict[NodeType, Any] = { - NodeType.AGENT: _compile_agent, - NodeType.TOOL: _compile_tool, - NodeType.REASONING: _compile_reasoning, - NodeType.PIPELINE_STEP: _compile_pipeline_step, - NodeType.FAN_OUT: _compile_fan_out, - NodeType.FAN_IN: _compile_fan_in, - NodeType.CONDITION: _compile_condition, - NodeType.MEMORY: _compile_memory, - NodeType.VALIDATOR: _compile_validator, - NodeType.CUSTOM_CODE: _compile_custom_code, - NodeType.INPUT: _compile_input, - NodeType.OUTPUT: _compile_output, -} diff --git a/src/fireflyframework_agentic/studio/execution/io_nodes.py b/src/fireflyframework_agentic/studio/execution/io_nodes.py deleted file mode 100644 index 5ef380a4..00000000 --- a/src/fireflyframework_agentic/studio/execution/io_nodes.py +++ /dev/null @@ -1,100 +0,0 @@ -"""Input and Output boundary node configuration models. - -These models define the data schemas for Input and Output nodes, which -serve as pipeline entry and exit points in the BPM execution model. -""" - -from __future__ import annotations - -from typing import Any, Literal - -from pydantic import BaseModel, field_validator - - -class QueueConfig(BaseModel): - """Configuration for queue-based triggers and destinations.""" - - broker: Literal["kafka", "rabbitmq", "redis"] - topic_or_queue: str - group_id: str = "" - connection_url: str = "" - - -class ScheduleConfig(BaseModel): - """Configuration for cron-based scheduled triggers.""" - - cron_expression: str - timezone: str = "UTC" - payload: dict[str, Any] | None = None - - -class HttpConfig(BaseModel): - """Configuration for HTTP triggers.""" - - method: str = "POST" - path_suffix: str = "" - auth_required: bool = False - - -class FileConfig(BaseModel): - """Configuration for file upload triggers.""" - - accepted_types: list[str] = ["*/*"] - max_size_mb: int = 50 - - -class WebhookConfig(BaseModel): - """Configuration for webhook destinations.""" - - url: str - method: str = "POST" - headers: dict[str, str] = {} - - -class StoreConfig(BaseModel): - """Configuration for file/database storage destinations.""" - - storage_type: Literal["file", "database"] - path_or_table: str - - -_VALID_TRIGGER_TYPES = frozenset({"manual", "http", "queue", "schedule", "file_upload"}) -_VALID_DESTINATION_TYPES = frozenset({"response", "queue", "webhook", "store", "multi"}) - - -class InputNodeConfig(BaseModel): - """Parsed configuration for an Input boundary node.""" - - trigger_type: str - schema: dict[str, Any] | None = None - queue_config: QueueConfig | None = None - schedule_config: ScheduleConfig | None = None - http_config: HttpConfig | None = None - file_config: FileConfig | None = None - - @field_validator("trigger_type") - @classmethod - def _validate_trigger_type(cls, v: str) -> str: - if v not in _VALID_TRIGGER_TYPES: - raise ValueError(f"Invalid trigger_type '{v}'. Must be one of: {', '.join(sorted(_VALID_TRIGGER_TYPES))}") - return v - - -class OutputNodeConfig(BaseModel): - """Parsed configuration for an Output boundary node.""" - - destination_type: str - response_schema: dict[str, Any] | None = None - queue_config: QueueConfig | None = None - webhook_config: WebhookConfig | None = None - store_config: StoreConfig | None = None - destinations: list[dict[str, Any]] | None = None - - @field_validator("destination_type") - @classmethod - def _validate_destination_type(cls, v: str) -> str: - if v not in _VALID_DESTINATION_TYPES: - raise ValueError( - f"Invalid destination_type '{v}'. Must be one of: {', '.join(sorted(_VALID_DESTINATION_TYPES))}" - ) - return v diff --git a/src/fireflyframework_agentic/studio/execution/runner.py b/src/fireflyframework_agentic/studio/execution/runner.py deleted file mode 100644 index 1967edcc..00000000 --- a/src/fireflyframework_agentic/studio/execution/runner.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Studio event handler for collecting pipeline execution events. - -:class:`StudioEventHandler` implements the :class:`PipelineEventHandler` -protocol and collects events into a queue that can be drained and sent -over a WebSocket connection to the Studio frontend. -""" - -from __future__ import annotations - -import asyncio -import contextlib -from collections import deque - - -class StudioEventHandler: - """Collects pipeline execution events for real-time Studio streaming. - - Implements the :class:`~fireflyframework_agentic.pipeline.engine.PipelineEventHandler` - protocol. Events are stored in an internal :class:`collections.deque` and - can be drained via :meth:`drain_events` for transmission over WebSocket. - - An :class:`asyncio.Event` is used to allow consumers to efficiently wait - for new events via :meth:`wait_for_event`. - """ - - def __init__(self) -> None: - self._events: deque[dict] = deque() - self._notify: asyncio.Event = asyncio.Event() - - # ------------------------------------------------------------------ - # PipelineEventHandler protocol methods - # ------------------------------------------------------------------ - - async def on_node_start(self, node_id: str, pipeline_name: str) -> None: - """Called when a node begins execution.""" - self._push_event( - { - "type": "node_start", - "node_id": node_id, - "pipeline_name": pipeline_name, - } - ) - - async def on_node_complete(self, node_id: str, pipeline_name: str, latency_ms: float) -> None: - """Called when a node completes successfully.""" - self._push_event( - { - "type": "node_complete", - "node_id": node_id, - "pipeline_name": pipeline_name, - "latency_ms": latency_ms, - } - ) - - async def on_node_error(self, node_id: str, pipeline_name: str, error: str) -> None: - """Called when a node fails (after all retries exhausted).""" - self._push_event( - { - "type": "node_error", - "node_id": node_id, - "pipeline_name": pipeline_name, - "error": error, - } - ) - - async def on_node_skip(self, node_id: str, pipeline_name: str, reason: str) -> None: - """Called when a node is skipped.""" - self._push_event( - { - "type": "node_skip", - "node_id": node_id, - "pipeline_name": pipeline_name, - "reason": reason, - } - ) - - async def on_pipeline_complete(self, pipeline_name: str, success: bool, duration_ms: float) -> None: - """Called when the entire pipeline finishes.""" - self._push_event( - { - "type": "pipeline_complete", - "pipeline_name": pipeline_name, - "success": success, - "duration_ms": duration_ms, - } - ) - - # ------------------------------------------------------------------ - # Studio-specific methods - # ------------------------------------------------------------------ - - def drain_events(self) -> list[dict]: - """Return all queued events and clear the internal queue. - - Returns: - A list of event dicts in the order they were received. - An empty list if no events are pending. - """ - events = list(self._events) - self._events.clear() - self._notify.clear() - return events - - async def wait_for_event(self, timeout: float = 5.0) -> None: - """Block until at least one event is available or *timeout* expires. - - Parameters: - timeout: Maximum seconds to wait. Defaults to ``5.0``. - """ - with contextlib.suppress(TimeoutError): - await asyncio.wait_for(self._notify.wait(), timeout=timeout) - - # ------------------------------------------------------------------ - # Internal helpers - # ------------------------------------------------------------------ - - def _push_event(self, event: dict) -> None: - """Append an event to the queue and notify any waiters.""" - self._events.append(event) - self._notify.set() diff --git a/src/fireflyframework_agentic/studio/projects.py b/src/fireflyframework_agentic/studio/projects.py deleted file mode 100644 index a79170d3..00000000 --- a/src/fireflyframework_agentic/studio/projects.py +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""File-based project manager for Firefly Agentic Studio. - -Each project is a directory under *base_dir* containing a ``project.json`` -metadata file and a ``pipelines/`` subdirectory that holds saved pipeline -graphs as JSON files. -""" - -from __future__ import annotations - -import json -import shutil -from dataclasses import dataclass, field -from datetime import UTC, datetime -from pathlib import Path - - -@dataclass -class ProjectInfo: - """Metadata for a single Studio project.""" - - name: str - description: str = "" - created_at: str = "" - path: Path = field(default_factory=lambda: Path(".")) - - -class ProjectManager: - """Manage Studio projects stored as directories on disk. - - Parameters - ---------- - base_dir: - Root directory under which all project directories live. - """ - - def __init__(self, base_dir: Path) -> None: - self._base_dir = Path(base_dir).resolve() - self._base_dir.mkdir(parents=True, exist_ok=True) - - def _safe_path(self, *parts: str) -> Path: - """Resolve a path and assert it stays within the base directory.""" - resolved = (self._base_dir / Path(*parts)).resolve() - if not str(resolved).startswith(str(self._base_dir)): - raise ValueError(f"Invalid path component: {parts}") - return resolved - - # -- Project CRUD ------------------------------------------------------ - - def create(self, name: str, *, description: str = "") -> ProjectInfo: - """Create a new project directory with metadata. - - Raises - ------ - ValueError - If a project with *name* already exists. - """ - project_dir = self._safe_path(name) - if project_dir.exists(): - raise ValueError(f"Project '{name}' already exists") - - project_dir.mkdir(parents=True) - (project_dir / "pipelines").mkdir() - (project_dir / "custom_tools").mkdir() - (project_dir / "memory").mkdir() - - created_at = datetime.now(UTC).isoformat() - meta = { - "name": name, - "description": description, - "created_at": created_at, - } - (project_dir / "project.json").write_text(json.dumps(meta, indent=2)) - - return ProjectInfo( - name=name, - description=description, - created_at=created_at, - path=project_dir, - ) - - def list_all(self) -> list[ProjectInfo]: - """Return all projects sorted alphabetically by name.""" - projects: list[ProjectInfo] = [] - for child in sorted(self._base_dir.iterdir()): - meta_path = child / "project.json" - if child.is_dir() and meta_path.is_file(): - data = json.loads(meta_path.read_text()) - projects.append( - ProjectInfo( - name=data["name"], - description=data.get("description", ""), - created_at=data.get("created_at", ""), - path=child, - ) - ) - return projects - - def delete(self, name: str) -> None: - """Remove a project directory and all its contents. - - Raises - ------ - FileNotFoundError - If the project does not exist. - """ - project_dir = self._safe_path(name) - if not project_dir.exists(): - raise FileNotFoundError(f"Project '{name}' not found") - shutil.rmtree(project_dir) - - def rename(self, old_name: str, new_name: str) -> ProjectInfo: - """Rename a project directory and update its metadata. - - Raises - ------ - FileNotFoundError - If the source project does not exist. - ValueError - If a project with *new_name* already exists or path is invalid. - """ - old_dir = self._safe_path(old_name) - new_dir = self._safe_path(new_name) - if not old_dir.exists(): - raise FileNotFoundError(f"Project '{old_name}' not found") - if new_dir.exists(): - raise ValueError(f"Project '{new_name}' already exists") - - old_dir.rename(new_dir) - - # Update name inside project.json - meta_path = new_dir / "project.json" - meta = json.loads(meta_path.read_text()) - meta["name"] = new_name - meta_path.write_text(json.dumps(meta, indent=2)) - - return ProjectInfo( - name=new_name, - description=meta.get("description", ""), - created_at=meta.get("created_at", ""), - path=new_dir, - ) - - def update(self, name: str, *, description: str | None = None) -> ProjectInfo: - """Update project metadata fields. - - Raises - ------ - FileNotFoundError - If the project does not exist. - """ - project_dir = self._safe_path(name) - meta_path = project_dir / "project.json" - if not meta_path.is_file(): - raise FileNotFoundError(f"Project '{name}' not found") - - meta = json.loads(meta_path.read_text()) - if description is not None: - meta["description"] = description - meta_path.write_text(json.dumps(meta, indent=2)) - - return ProjectInfo( - name=meta["name"], - description=meta.get("description", ""), - created_at=meta.get("created_at", ""), - path=project_dir, - ) - - def delete_all(self) -> int: - """Delete all projects and return the count of deleted projects.""" - all_projects = self.list_all() - for p in all_projects: - self.delete(p.name) - return len(all_projects) - - # -- Pipeline persistence ---------------------------------------------- - - def save_pipeline(self, project_name: str, pipeline_name: str, graph: dict) -> None: - """Persist a pipeline graph as JSON inside the project directory.""" - pipeline_path = self._safe_path(project_name, "pipelines", f"{pipeline_name}.json") - if not pipeline_path.parent.exists(): - raise FileNotFoundError(f"Project '{project_name}' not found") - pipeline_path.write_text(json.dumps(graph, indent=2)) - - def load_pipeline(self, project_name: str, pipeline_name: str) -> dict: - """Load a pipeline graph from the project directory. - - Raises - ------ - FileNotFoundError - If the pipeline JSON file does not exist. - """ - pipeline_path = self._safe_path(project_name, "pipelines", f"{pipeline_name}.json") - if not pipeline_path.is_file(): - raise FileNotFoundError(f"Pipeline '{pipeline_name}' not found in project '{project_name}'") - return json.loads(pipeline_path.read_text()) diff --git a/src/fireflyframework_agentic/studio/runtime.py b/src/fireflyframework_agentic/studio/runtime.py deleted file mode 100644 index e6e011ba..00000000 --- a/src/fireflyframework_agentic/studio/runtime.py +++ /dev/null @@ -1,162 +0,0 @@ -"""ProjectRuntime: manages background processes for a deployed project. - -Handles queue consumers, schedulers, and execution lifecycle for projects -with Input/Output boundary nodes. -""" - -from __future__ import annotations - -import asyncio -import logging -from typing import Any, Literal - -from fireflyframework_agentic.studio.codegen.models import GraphModel, NodeType -from fireflyframework_agentic.studio.execution.compiler import compile_graph -from fireflyframework_agentic.studio.execution.io_nodes import InputNodeConfig, OutputNodeConfig - -logger = logging.getLogger(__name__) - - -class ProjectRuntime: - """Manages queue consumers, schedulers, and tunnel for a project.""" - - def __init__(self, project_name: str) -> None: - self.project_name = project_name - self.status: Literal["stopped", "starting", "running", "error"] = "stopped" - self._graph: GraphModel | None = None - self._input_config: InputNodeConfig | None = None - self._output_configs: list[OutputNodeConfig] = [] - self._consumers: list[Any] = [] - self._scheduler: Any | None = None - self._tasks: list[asyncio.Task[Any]] = [] - - async def start(self, graph: GraphModel) -> None: - """Parse IO nodes and start background processes.""" - self.status = "starting" - self._graph = graph - - # Extract Input/Output configs - for node in graph.nodes: - if node.type == NodeType.INPUT: - self._input_config = InputNodeConfig(**node.data) - elif node.type == NodeType.OUTPUT: - self._output_configs.append(OutputNodeConfig(**node.data)) - - # Start queue consumers if queue trigger - if self._input_config and self._input_config.trigger_type == "queue": - await self._start_queue_consumer() - - # Start scheduler if schedule trigger - if self._input_config and self._input_config.trigger_type == "schedule": - await self._start_scheduler() - - self.status = "running" - logger.info( - "ProjectRuntime '%s' started (trigger=%s)", - self.project_name, - self._input_config.trigger_type if self._input_config else "none", - ) - - async def stop(self) -> None: - """Gracefully stop all background processes.""" - for task in self._tasks: - task.cancel() - self._tasks.clear() - - for consumer in self._consumers: - await consumer.stop() - self._consumers.clear() - - if self._scheduler is not None: - await self._scheduler.shutdown() - self._scheduler = None - - self.status = "stopped" - logger.info("ProjectRuntime '%s' stopped", self.project_name) - - async def execute(self, inputs: Any, trigger: str = "manual") -> Any: - """Execute the pipeline with given inputs.""" - if self._graph is None: - raise RuntimeError(f"Runtime '{self.project_name}' has no graph loaded") - - engine = compile_graph(self._graph) - result = await engine.run(inputs) - return result - - def get_status(self) -> dict[str, Any]: - """Report runtime status.""" - return { - "project": self.project_name, - "status": self.status, - "trigger_type": self._input_config.trigger_type if self._input_config else None, - "consumers": len(self._consumers), - "scheduler_active": self._scheduler is not None, - } - - async def _start_queue_consumer(self) -> None: - """Start a queue consumer based on the input config.""" - if not self._input_config or not self._input_config.queue_config: - return - - qc = self._input_config.queue_config - logger.info("Starting %s consumer for topic '%s'", qc.broker, qc.topic_or_queue) - - agent_name = f"studio-{self.project_name}" - - if qc.broker == "kafka": - from fireflyframework_agentic.exposure.queues.kafka import KafkaAgentConsumer - - consumer = KafkaAgentConsumer( - agent_name, - topic=qc.topic_or_queue, - group_id=qc.group_id or agent_name, - bootstrap_servers=qc.connection_url or "localhost:9092", - ) - elif qc.broker == "rabbitmq": - from fireflyframework_agentic.exposure.queues.rabbitmq import RabbitMQAgentConsumer - - consumer = RabbitMQAgentConsumer( - agent_name, - queue_name=qc.topic_or_queue, - url=qc.connection_url or "amqp://localhost", - ) - elif qc.broker == "redis": - from fireflyframework_agentic.exposure.queues.redis import RedisAgentConsumer - - consumer = RedisAgentConsumer( - agent_name, - channel=qc.topic_or_queue, - url=qc.connection_url or "redis://localhost", - ) - else: - logger.warning("Unknown broker: %s", qc.broker) - return - - self._consumers.append(consumer) - task = asyncio.create_task(consumer.start()) - self._tasks.append(task) - - async def _start_scheduler(self) -> None: - """Start a cron scheduler based on the input config.""" - if not self._input_config or not self._input_config.schedule_config: - return - - sc = self._input_config.schedule_config - logger.info("Starting scheduler: %s (%s)", sc.cron_expression, sc.timezone) - - try: - from apscheduler import AsyncScheduler # type: ignore[import-not-found] - from apscheduler.triggers.cron import CronTrigger # type: ignore[import-not-found] - - scheduler = AsyncScheduler() - trigger = CronTrigger.from_crontab(sc.cron_expression, timezone=sc.timezone) - - async def _scheduled_run() -> None: - payload = sc.payload or {} - await self.execute(payload, trigger="schedule") - - await scheduler.add_schedule(_scheduled_run, trigger) - await scheduler.start_in_background() - self._scheduler = scheduler - except ImportError: - logger.warning("apscheduler not installed; scheduled triggers unavailable") diff --git a/src/fireflyframework_agentic/studio/server.py b/src/fireflyframework_agentic/studio/server.py deleted file mode 100644 index 7df725b9..00000000 --- a/src/fireflyframework_agentic/studio/server.py +++ /dev/null @@ -1,292 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""FastAPI application factory for Firefly Agentic Studio. - -Call :func:`create_studio_app` to get a fully-configured FastAPI instance -with health, registry, project, and execution endpoints. -""" - -from __future__ import annotations - -import importlib.metadata -import logging -from collections.abc import AsyncIterator -from contextlib import asynccontextmanager -from pathlib import Path -from typing import Any - -logger = logging.getLogger(__name__) - -_ALLOWED_ORIGINS: list[str] = [ - "http://localhost:5173", - "http://localhost:4173", - "tauri://localhost", -] - - -@asynccontextmanager -async def _lifespan(app: Any) -> AsyncIterator[None]: - """FastAPI lifespan: startup and shutdown hooks for Studio.""" - # -- Startup ----------------------------------------------------------- - logger.info("Firefly Agentic Studio starting up") - - # Load persisted settings and inject API keys into the environment - # so that PydanticAI providers pick them up automatically. - from fireflyframework_agentic.studio.settings import apply_settings_to_env, load_settings - - settings_path = getattr(app.state, "settings_path", None) - settings = load_settings(settings_path) - apply_settings_to_env(settings) - - # Register persisted custom tools at startup - from fireflyframework_agentic.studio.custom_tools import CustomToolManager - - custom_tools_dir = getattr(app.state, "custom_tools_dir", None) - custom_manager = CustomToolManager(custom_tools_dir) - count = custom_manager.register_all() - if count: - logger.info("Loaded %d custom tool(s) from disk", count) - - yield - # -- Shutdown ---------------------------------------------------------- - logger.info("Firefly Agentic Studio shutting down") - - -def create_studio_app( - config: Any | None = None, - settings_path: Any | None = None, -) -> Any: - """Create a FastAPI application for Firefly Agentic Studio. - - Parameters: - config: Optional :class:`~fireflyframework_agentic.studio.config.StudioConfig`. - When *None*, a default ``StudioConfig()`` is created. - settings_path: Optional :class:`~pathlib.Path` to the settings JSON - file. When *None*, the default ``~/.firefly-studio/settings.json`` - is used. Useful for tests. - - Returns: - A configured :class:`fastapi.FastAPI` instance. - """ - # Lazy imports -- FastAPI and its dependencies are optional extras. - from fastapi import FastAPI # type: ignore[import-not-found] - from fastapi.middleware.cors import CORSMiddleware # type: ignore[import-not-found] - - from fireflyframework_agentic.studio.config import StudioConfig - - if config is None: - config = StudioConfig() - - pkg_version = importlib.metadata.version("fireflyframework-agentic") - - app = FastAPI( - title="Firefly Agentic Studio", - version=pkg_version, - lifespan=_lifespan, - ) - - # Store settings path on app state for the lifespan hook - app.state.settings_path = settings_path - - # -- CORS middleware --------------------------------------------------- - app.add_middleware( - CORSMiddleware, - allow_origins=_ALLOWED_ORIGINS, - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - - # -- Health endpoint --------------------------------------------------- - @app.get("/api/health") - async def health() -> dict[str, str]: - return {"status": "ok", "version": pkg_version} - - # -- Settings endpoints ------------------------------------------------ - from fireflyframework_agentic.studio.api.settings import create_settings_router - - app.include_router(create_settings_router(settings_path)) - - # -- Registry endpoints ------------------------------------------------ - from fireflyframework_agentic.studio.api.registry import create_registry_router - - app.include_router(create_registry_router()) - - # -- Project endpoints ------------------------------------------------- - from fireflyframework_agentic.studio.api.projects import create_projects_router - from fireflyframework_agentic.studio.projects import ProjectManager - - project_manager = ProjectManager(config.projects_dir) - app.include_router(create_projects_router(project_manager)) - - # -- Per-project runtime & execution API ------------------------------- - from fireflyframework_agentic.studio.api.project_api import create_project_api_router - - app.include_router(create_project_api_router(project_manager)) - - # -- Version history endpoints ------------------------------------------- - from fireflyframework_agentic.studio.api.projects import create_versioning_router - - app.include_router(create_versioning_router(project_manager)) - - # -- Custom tools endpoints -------------------------------------------- - from fireflyframework_agentic.studio.api.custom_tools import create_custom_tools_router - from fireflyframework_agentic.studio.custom_tools import CustomToolManager - - custom_tool_manager = CustomToolManager(config.custom_tools_dir) - app.include_router(create_custom_tools_router(custom_tool_manager)) - app.state.custom_tools_dir = config.custom_tools_dir - - # -- File browsing endpoints ------------------------------------------- - from fireflyframework_agentic.studio.api.files import create_files_router - - app.include_router(create_files_router(project_manager)) - - # -- Evaluation endpoints ---------------------------------------------- - from fireflyframework_agentic.studio.api.evaluate import create_evaluate_router - - app.include_router(create_evaluate_router(project_manager)) - - # -- Experiments endpoints --------------------------------------------- - from fireflyframework_agentic.studio.api.experiments import create_experiments_router - - app.include_router(create_experiments_router(project_manager)) - - # -- Code generation endpoints ----------------------------------------- - from fireflyframework_agentic.studio.api.codegen import create_codegen_router - - app.include_router(create_codegen_router()) - - # -- Monitoring endpoints ---------------------------------------------- - from fireflyframework_agentic.studio.api.monitoring import create_monitoring_router - - app.include_router(create_monitoring_router()) - - # -- Checkpoint endpoints ---------------------------------------------- - from fireflyframework_agentic.studio.api.checkpoints import create_checkpoints_router - from fireflyframework_agentic.studio.execution.checkpoint import CheckpointManager - - checkpoint_manager = CheckpointManager() - app.include_router(create_checkpoints_router(checkpoint_manager)) - app.state.checkpoint_manager = checkpoint_manager - - # -- Execution WebSocket ----------------------------------------------- - from fireflyframework_agentic.studio.api.execution import create_execution_router - - app.include_router(create_execution_router()) - - # -- Assistant WebSocket ----------------------------------------------- - from fireflyframework_agentic.studio.api.assistant import create_assistant_router - - app.include_router(create_assistant_router()) - - # -- Oracle WebSocket & REST ------------------------------------------- - from fireflyframework_agentic.studio.api.oracle import create_oracle_router - - app.include_router(create_oracle_router()) - - # -- Smith WebSocket (code generation) --------------------------------- - from fireflyframework_agentic.studio.api.smith import create_smith_router - - app.include_router(create_smith_router()) - - # -- GraphQL endpoint -------------------------------------------------- - from fireflyframework_agentic.studio.api.graphql_api import create_graphql_router - - app.include_router(create_graphql_router(project_manager)) - - # -- Tunnel management ------------------------------------------------- - from fireflyframework_agentic.studio.api.tunnel import create_tunnel_router - - app.include_router(create_tunnel_router(port=config.port)) - - # Store config on app state for downstream routers - app.state.studio_config = config - - # -- Static file serving (bundled frontend) ---------------------------- - _mount_static_files(app) - - return app - - -def _get_default_static_dir() -> Path: - """Return the default path to the bundled static directory. - - Handles both normal installs and PyInstaller frozen bundles where - data files are extracted to ``sys._MEIPASS``. - """ - import sys - - if getattr(sys, "frozen", False): - return Path(sys._MEIPASS) / "fireflyframework_agentic" / "studio" / "static" # type: ignore[attr-defined] - return Path(__file__).parent / "static" - - -class _SPAStaticFiles: - """Starlette-compatible ASGI app that serves static files with SPA fallback. - - Tries to serve files from *directory* first. When the requested path - does not match a real file, it falls back to ``index.html`` so that - client-side routing (SvelteKit) can handle the URL. - """ - - def __init__(self, directory: str) -> None: - from starlette.staticfiles import StaticFiles # type: ignore[import-not-found] - - self._static = StaticFiles(directory=directory, html=True) - self._index = Path(directory) / "index.html" - - async def __call__(self, scope: dict, receive: Any, send: Any) -> None: # noqa: ANN401 - from starlette.responses import HTMLResponse # type: ignore[import-not-found] - - if scope["type"] != "http": - await self._static(scope, receive, send) - return - - try: - await self._static(scope, receive, send) - except Exception: - # File not found — serve index.html for SPA fallback - response = HTMLResponse(self._index.read_text()) - await response(scope, receive, send) - - -def _mount_static_files(app: Any, static_dir: Path | None = None) -> None: - """Mount the bundled Studio frontend with SPA fallback. - - When the ``studio/static/`` directory contains a built SvelteKit SPA - (i.e. an ``index.html`` file), mount it so the entire Studio is - served from the Python package — no separate frontend server needed - in production. - - Uses :class:`_SPAStaticFiles` which serves real files normally and - falls back to ``index.html`` for any unrecognised path, enabling - client-side routing. Must be registered **last** so API/WebSocket - routes take priority. - """ - if static_dir is None: - static_dir = _get_default_static_dir() - - index_html = static_dir / "index.html" - - if not index_html.exists(): - logger.debug( - "No bundled frontend found at %s — static file serving disabled", - static_dir, - ) - return - - app.mount("/", _SPAStaticFiles(directory=str(static_dir)), name="static") - logger.info("Serving bundled Studio frontend from %s", static_dir) diff --git a/src/fireflyframework_agentic/studio/settings.py b/src/fireflyframework_agentic/studio/settings.py deleted file mode 100644 index 29670133..00000000 --- a/src/fireflyframework_agentic/studio/settings.py +++ /dev/null @@ -1,236 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Studio settings persistence — API keys, model defaults, and setup state. - -Settings are stored at ``~/.firefly-studio/settings.json`` with ``0600`` -permissions. On startup, saved API keys are injected into ``os.environ`` -so that PydanticAI providers pick them up via their standard env vars. -Existing environment variables always take precedence. -""" - -from __future__ import annotations - -import json -import logging -import os -import stat -import uuid -from pathlib import Path -from typing import Any - -from pydantic import BaseModel, Field, SecretStr - -logger = logging.getLogger(__name__) - -DEFAULT_SETTINGS_PATH = Path.home() / ".firefly-studio" / "settings.json" - -# Mapping from credential field names to the env var PydanticAI expects. -_CREDENTIAL_ENV_MAP: dict[str, str] = { - "openai_api_key": "OPENAI_API_KEY", - "anthropic_api_key": "ANTHROPIC_API_KEY", - "google_api_key": "GOOGLE_API_KEY", - "groq_api_key": "GROQ_API_KEY", - "mistral_api_key": "MISTRAL_API_KEY", - "deepseek_api_key": "DEEPSEEK_API_KEY", - "cohere_api_key": "CO_API_KEY", - "azure_openai_api_key": "AZURE_OPENAI_API_KEY", - "azure_openai_endpoint": "AZURE_OPENAI_ENDPOINT", - "aws_access_key_id": "AWS_ACCESS_KEY_ID", - "aws_secret_access_key": "AWS_SECRET_ACCESS_KEY", - "aws_default_region": "AWS_DEFAULT_REGION", - "ollama_base_url": "OLLAMA_BASE_URL", -} - - -# --------------------------------------------------------------------------- -# Data models -# --------------------------------------------------------------------------- - - -class ProviderCredentials(BaseModel): - """API keys and endpoints for all supported LLM providers.""" - - openai_api_key: SecretStr | None = None - anthropic_api_key: SecretStr | None = None - google_api_key: SecretStr | None = None - groq_api_key: SecretStr | None = None - mistral_api_key: SecretStr | None = None - deepseek_api_key: SecretStr | None = None - cohere_api_key: SecretStr | None = None - azure_openai_api_key: SecretStr | None = None - azure_openai_endpoint: SecretStr | None = None - aws_access_key_id: SecretStr | None = None - aws_secret_access_key: SecretStr | None = None - aws_default_region: SecretStr | None = None - ollama_base_url: SecretStr | None = None - - -class ModelDefaults(BaseModel): - """Default model configuration for Studio sessions.""" - - default_model: str = "openai:gpt-4o" - temperature: float = 0.7 - retries: int = 3 - - -class UserProfile(BaseModel): - """User identity and preferences for personalised assistant interaction.""" - - name: str = "" - role: str = "" - context: str = "" - assistant_name: str = "The Architect" - - -class ToolCredentials(BaseModel): - """API keys and config for built-in tools that need external services.""" - - serpapi_api_key: SecretStr | None = None - serper_api_key: SecretStr | None = None - tavily_api_key: SecretStr | None = None - database_url: SecretStr | None = None - redis_url: SecretStr | None = None - slack_bot_token: SecretStr | None = None - telegram_bot_token: SecretStr | None = None - - -# Mapping from tool credential field names to env vars. -_TOOL_CREDENTIAL_ENV_MAP: dict[str, str] = { - "serpapi_api_key": "SERPAPI_API_KEY", - "serper_api_key": "SERPER_API_KEY", - "tavily_api_key": "TAVILY_API_KEY", - "database_url": "DATABASE_URL", - "redis_url": "REDIS_URL", - "slack_bot_token": "SLACK_BOT_TOKEN", - "telegram_bot_token": "TELEGRAM_BOT_TOKEN", -} - - -class ServiceCredential(BaseModel): - """A dynamic service credential entry for databases, APIs, queues, etc.""" - - id: str = Field(default_factory=lambda: str(uuid.uuid4())) - service_type: str # e.g. "postgresql", "redis", "serpapi", "slack" - label: str = "" - host: str = "" - port: int | None = None - username: str = "" - password: SecretStr | None = None - database: str = "" - ssl_enabled: bool = False - connection_url: SecretStr | None = None - api_key: SecretStr | None = None - token: SecretStr | None = None - extra: dict[str, str] = Field(default_factory=dict) - - -class StudioSettings(BaseModel): - """Top-level settings persisted to disk.""" - - credentials: ProviderCredentials = ProviderCredentials() - model_defaults: ModelDefaults = ModelDefaults() - user_profile: UserProfile = UserProfile() - tool_credentials: ToolCredentials = ToolCredentials() - service_credentials: list[ServiceCredential] = Field(default_factory=list) - setup_complete: bool = False - - -# --------------------------------------------------------------------------- -# File I/O -# --------------------------------------------------------------------------- - - -def is_first_start(path: Path | None = None) -> bool: - """Return ``True`` when no settings file exists on disk.""" - return not (path or DEFAULT_SETTINGS_PATH).exists() - - -def load_settings(path: Path | None = None) -> StudioSettings: - """Load settings from *path*, returning defaults if missing or corrupt.""" - settings_path = path or DEFAULT_SETTINGS_PATH - if not settings_path.exists(): - return StudioSettings() - try: - raw = json.loads(settings_path.read_text(encoding="utf-8")) - return StudioSettings.model_validate(raw) - except Exception: - logger.warning("Corrupt settings file at %s — using defaults", settings_path) - return StudioSettings() - - -def save_settings(settings: StudioSettings, path: Path | None = None) -> None: - """Persist *settings* to disk with ``0600`` permissions.""" - settings_path = path or DEFAULT_SETTINGS_PATH - settings_path.parent.mkdir(parents=True, exist_ok=True) - - # Serialize SecretStr fields as plain strings for JSON storage. - data = _settings_to_dict(settings) - settings_path.write_text(json.dumps(data, indent=2), encoding="utf-8") - - # Enforce owner-only read/write. - settings_path.chmod(stat.S_IRUSR | stat.S_IWUSR) - - -def apply_settings_to_env(settings: StudioSettings) -> None: - """Inject saved credentials into ``os.environ`` (existing vars take precedence).""" - for field_name, env_var in _CREDENTIAL_ENV_MAP.items(): - value: SecretStr | None = getattr(settings.credentials, field_name, None) - if value is not None and env_var not in os.environ: - os.environ[env_var] = value.get_secret_value() - - # Also inject tool credentials - for field_name, env_var in _TOOL_CREDENTIAL_ENV_MAP.items(): - value = getattr(settings.tool_credentials, field_name, None) - if value is not None and env_var not in os.environ: - os.environ[env_var] = value.get_secret_value() - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _settings_to_dict(settings: StudioSettings) -> dict[str, Any]: - """Convert settings to a JSON-serializable dict, unwrapping ``SecretStr``.""" - creds: dict[str, str | None] = {} - for field_name in ProviderCredentials.model_fields: - val: SecretStr | None = getattr(settings.credentials, field_name) - creds[field_name] = val.get_secret_value() if val is not None else None - - tool_creds: dict[str, str | None] = {} - for field_name in ToolCredentials.model_fields: - val = getattr(settings.tool_credentials, field_name) - tool_creds[field_name] = val.get_secret_value() if val is not None else None - - # Serialize service credentials, unwrapping SecretStr fields. - svc_list: list[dict[str, Any]] = [] - for sc in settings.service_credentials: - entry = sc.model_dump() - for secret_field in ("password", "connection_url", "api_key", "token"): - val = getattr(sc, secret_field, None) - if val is not None: - entry[secret_field] = val.get_secret_value() - else: - entry[secret_field] = None - svc_list.append(entry) - - return { - "credentials": creds, - "model_defaults": settings.model_defaults.model_dump(), - "user_profile": settings.user_profile.model_dump(), - "tool_credentials": tool_creds, - "service_credentials": svc_list, - "setup_complete": settings.setup_complete, - } diff --git a/src/fireflyframework_agentic/studio/tunnel.py b/src/fireflyframework_agentic/studio/tunnel.py deleted file mode 100644 index 84a2ba68..00000000 --- a/src/fireflyframework_agentic/studio/tunnel.py +++ /dev/null @@ -1,126 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Cloudflare Tunnel manager for exposing Studio to the internet. - -Uses the ``cloudflared`` binary to create quick tunnels without -requiring a Cloudflare account. -""" - -from __future__ import annotations - -import asyncio -import logging -import re -import shutil -import subprocess -from typing import Any - -logger = logging.getLogger(__name__) - - -class TunnelManager: - """Manages a cloudflared quick tunnel.""" - - def __init__(self, port: int = 8470) -> None: - self.port = port - self._process: subprocess.Popen[str] | None = None - self._url: str | None = None - - def is_available(self) -> bool: - """Check if cloudflared binary is on PATH.""" - return shutil.which("cloudflared") is not None - - async def start(self) -> str: - """Start a quick tunnel and return the public URL.""" - if self._process is not None: - raise RuntimeError("Tunnel already running") - - if not self.is_available(): - raise RuntimeError( - "cloudflared is not installed. Install it from: " - "https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/" - ) - - self._process = subprocess.Popen( - ["cloudflared", "tunnel", "--url", f"http://localhost:{self.port}"], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - text=True, - ) - - url = await self._wait_for_url(timeout=30) - self._url = url - logger.info("Cloudflare Tunnel started: %s", url) - return url - - async def stop(self) -> None: - """Terminate the tunnel subprocess.""" - if self._process is not None: - self._process.terminate() - self._process.wait(timeout=10) - self._process = None - self._url = None - logger.info("Cloudflare Tunnel stopped") - - def get_status(self) -> dict[str, Any]: - """Return current tunnel status.""" - return { - "active": self._process is not None, - "url": self._url, - "port": self.port, - } - - async def _wait_for_url(self, timeout: int = 30) -> str: - """Read process output until the tunnel URL appears. - - Uses a dedicated reader thread to avoid blocking-readline race - conditions with Go binaries that buffer pipe output. - """ - import threading - - url_pattern = re.compile(r"https://[a-z0-9-]+\.trycloudflare\.com") - result: str | None = None - error: str | None = None - done = asyncio.Event() - loop = asyncio.get_running_loop() - - def _reader() -> None: - nonlocal result, error - assert self._process is not None and self._process.stdout is not None - try: - for line in self._process.stdout: - logger.debug("cloudflared: %s", line.rstrip()) - match = url_pattern.search(line) - if match: - result = match.group(0) - loop.call_soon_threadsafe(done.set) - return - # stdout closed without finding URL - error = "cloudflared exited without providing a tunnel URL" - except Exception as exc: - error = str(exc) - loop.call_soon_threadsafe(done.set) - - thread = threading.Thread(target=_reader, daemon=True) - thread.start() - - try: - await asyncio.wait_for(done.wait(), timeout=timeout) - except TimeoutError: - raise TimeoutError("Timed out waiting for tunnel URL") from None - - if result: - return result - raise RuntimeError(error or "cloudflared exited unexpectedly") diff --git a/src/fireflyframework_agentic/studio/versioning.py b/src/fireflyframework_agentic/studio/versioning.py deleted file mode 100644 index 4fd462ab..00000000 --- a/src/fireflyframework_agentic/studio/versioning.py +++ /dev/null @@ -1,117 +0,0 @@ -"""Git-based version history for Firefly Agentic Studio projects.""" - -from __future__ import annotations - -import logging -import subprocess -from pathlib import Path - -logger = logging.getLogger(__name__) - - -class ProjectVersioning: - """Git-based version history for a project directory.""" - - def __init__(self, project_dir: Path) -> None: - self.project_dir = Path(project_dir).resolve() - self._ensure_git_init() - - def _ensure_git_init(self) -> None: - git_dir = self.project_dir / ".git" - if not git_dir.exists(): - self._run(["git", "init"]) - gitignore = self.project_dir / ".gitignore" - if not gitignore.exists(): - gitignore.write_text("__pycache__/\n*.pyc\n.DS_Store\n") - self._run(["git", "add", "-A"]) - self._run(["git", "commit", "-m", "Initial project setup", "--allow-empty"]) - - def _run(self, cmd: list[str], **kwargs) -> subprocess.CompletedProcess: - return subprocess.run( - cmd, - cwd=self.project_dir, - capture_output=True, - text=True, - timeout=30, - **kwargs, - ) - - def commit(self, message: str) -> str: - self._run(["git", "add", "-A"]) - # Check if there are changes to commit - status = self._run(["git", "status", "--porcelain"]) - if not status.stdout.strip(): - return "" # Nothing to commit - self._run(["git", "commit", "-m", message]) - # Extract SHA - sha_result = self._run(["git", "rev-parse", "HEAD"]) - sha = sha_result.stdout.strip() - logger.info("Committed %s: %s", sha[:7], message) - return sha - - def get_history(self, limit: int = 50) -> list[dict]: - result = self._run( - [ - "git", - "log", - f"--max-count={limit}", - "--format=%H|%s|%aI", - ] - ) - if result.returncode != 0: - return [] - - # Get bookmarked commits - bookmarks = self._get_bookmark_shas() - - history = [] - for line in result.stdout.strip().split("\n"): - if not line.strip(): - continue - parts = line.split("|", 2) - if len(parts) >= 3: - history.append( - { - "sha": parts[0], - "message": parts[1], - "timestamp": parts[2], - "bookmarked": parts[0] in bookmarks, - } - ) - return history - - def restore(self, commit_sha: str) -> None: - self._run(["git", "checkout", commit_sha, "--", "."]) - self.commit(f"Restored to version {commit_sha[:7]}") - - def bookmark(self, commit_sha: str, label: str) -> None: - safe_label = label.replace(" ", "-").replace("/", "-") - tag_name = f"bookmark/{safe_label}" - self._run(["git", "tag", "-f", tag_name, commit_sha]) - - def list_bookmarks(self) -> list[dict]: - result = self._run(["git", "tag", "-l", "bookmark/*"]) - if result.returncode != 0: - return [] - bookmarks = [] - for tag in result.stdout.strip().split("\n"): - if not tag.strip(): - continue - label = tag.replace("bookmark/", "") - sha_result = self._run(["git", "rev-list", "-1", tag]) - sha = sha_result.stdout.strip() - bookmarks.append({"tag": tag, "label": label, "sha": sha}) - return bookmarks - - def _get_bookmark_shas(self) -> set[str]: - result = self._run(["git", "tag", "-l", "bookmark/*"]) - if result.returncode != 0: - return set() - shas = set() - for tag in result.stdout.strip().split("\n"): - if not tag.strip(): - continue - sha_result = self._run(["git", "rev-list", "-1", tag]) - if sha_result.returncode == 0: - shas.add(sha_result.stdout.strip()) - return shas diff --git a/studio-desktop/frontend-dist/_app/env.js b/studio-desktop/frontend-dist/_app/env.js deleted file mode 100644 index f5427da6..00000000 --- a/studio-desktop/frontend-dist/_app/env.js +++ /dev/null @@ -1 +0,0 @@ -export const env={} \ No newline at end of file diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/0.D1o6gups.css b/studio-desktop/frontend-dist/_app/immutable/assets/0.D1o6gups.css deleted file mode 100644 index e880f6b5..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/0.D1o6gups.css +++ /dev/null @@ -1 +0,0 @@ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"Inter", system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, monospace;--spacing:.25rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg-primary:#0a0a0f;--color-bg-secondary:#12121a;--color-bg-elevated:#1a1a26;--color-border:#2a2a3a;--color-text-primary:#e8e8ed;--color-text-secondary:#8888a0;--color-accent:#ff6b35;--color-success:#22c55e;--color-error:#ef4444;--color-warning:#f59e0b;--color-info:#3b82f6;--color-node-agent:#6366f1;--color-node-tool:#8b5cf6;--color-node-reasoning:#ec4899;--color-node-pipeline:#06b6d4}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.relative{position:relative}.static{position:static}.start{inset-inline-start:var(--spacing)}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.table-row{display:table-row}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}}[data-theme=dark]{--color-bg-primary:#0a0a0f;--color-bg-secondary:#12121a;--color-bg-elevated:#1a1a26;--color-bg-hover:#22222e;--color-border:#2a2a3a;--color-border-light:#333346;--color-text-primary:#e8e8ed;--color-text-secondary:#8888a0;--color-text-muted:#5a5a72;--color-accent:#ff6b35;--color-accent-hover:#ff8255;--color-accent-muted:#ff6b3514;--color-accent-glow:oklch(70.4517% .192595 39.2308/.2);--color-success:#22c55e;--color-warning:#f59e0b;--color-error:#ef4444;--color-info:#3b82f6;--color-code-bg:#12121a;--color-code-border:#2a2a3a;--shadow-sm:0 1px 2px #0000004d;--shadow-md:0 4px 12px #0006;--shadow-lg:0 8px 24px #00000080}[data-theme=light]{--color-bg-primary:#f8f9fb;--color-bg-secondary:#eef0f4;--color-bg-elevated:#fff;--color-bg-hover:#e4e7ec;--color-border:#d4d8e0;--color-border-light:#e2e5eb;--color-text-primary:#1a1d26;--color-text-secondary:#64697a;--color-text-muted:#9198a8;--color-accent:#4f46e5;--color-accent-hover:#6366f1;--color-accent-muted:#4f46e514;--color-accent-glow:oklch(51.0573% .230053 276.966/.2);--color-success:#16a34a;--color-warning:#d97706;--color-error:#dc2626;--color-info:#2563eb;--color-code-bg:#f1f3f6;--color-code-border:#d4d8e0;--shadow-sm:0 1px 2px #0000000f;--shadow-md:0 4px 12px #00000014;--shadow-lg:0 8px 24px #0000001f}html,body{height:100%;margin:0;padding:0;overflow:hidden}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--color-bg-primary)}::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-text-secondary)}:focus-visible{outline:2px solid oklch(from var(--color-accent) l c h / 60%);outline-offset:2px}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}.svelte-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.svelte-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.svelte-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.svelte-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.svelte-flow__pane{z-index:1}.svelte-flow__pane.draggable{cursor:grab}.svelte-flow__pane.dragging{cursor:grabbing}.svelte-flow__pane.selection{cursor:pointer}.svelte-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.svelte-flow__renderer{z-index:4}.svelte-flow__selection{z-index:6}.svelte-flow__nodesselection-rect:focus,.svelte-flow__nodesselection-rect:focus-visible{outline:none}.svelte-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.svelte-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.svelte-flow .svelte-flow__edges{position:absolute}.svelte-flow .svelte-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.svelte-flow__edge{pointer-events:visibleStroke}.svelte-flow__edge.selectable{cursor:pointer}.svelte-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.svelte-flow__edge.animated path.svelte-flow__edge-interaction{stroke-dasharray:none;animation:none}.svelte-flow__edge.inactive{pointer-events:none}.svelte-flow__edge.selected,.svelte-flow__edge:focus,.svelte-flow__edge:focus-visible{outline:none}.svelte-flow__edge.selected .svelte-flow__edge-path,.svelte-flow__edge.selectable:focus .svelte-flow__edge-path,.svelte-flow__edge.selectable:focus-visible .svelte-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.svelte-flow__edge-textwrapper{pointer-events:all}.svelte-flow__edge .svelte-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.svelte-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.svelte-flow__connection{pointer-events:none}.svelte-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.svelte-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.svelte-flow__nodes{pointer-events:none;transform-origin:0 0}.svelte-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.svelte-flow__node.selectable{cursor:pointer}.svelte-flow__node.draggable{cursor:grab;pointer-events:all}.svelte-flow__node.draggable.dragging{cursor:grabbing}.svelte-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.svelte-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.svelte-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.svelte-flow__handle.connectingfrom{pointer-events:all}.svelte-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.svelte-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.svelte-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.svelte-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.svelte-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.svelte-flow__edgeupdater{cursor:move;pointer-events:all}.svelte-flow__pane.selection .svelte-flow__panel{pointer-events:none}.svelte-flow__panel{position:absolute;z-index:5;margin:15px}.svelte-flow__panel.top{top:0}.svelte-flow__panel.bottom{bottom:0}.svelte-flow__panel.top.center,.svelte-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.svelte-flow__panel.left{left:0}.svelte-flow__panel.right{right:0}.svelte-flow__panel.left.center,.svelte-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.svelte-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.svelte-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.svelte-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.svelte-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.svelte-flow__minimap-svg{display:block}.svelte-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.svelte-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.svelte-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.svelte-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.svelte-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.svelte-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.svelte-flow__controls.horizontal{flex-direction:row}.svelte-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.svelte-flow__edge.updating .svelte-flow__edge-path{stroke:#777}.svelte-flow__edge-text{font-size:10px}.svelte-flow__node.selectable:focus,.svelte-flow__node.selectable:focus-visible{outline:none}.svelte-flow__node-input,.svelte-flow__node-default,.svelte-flow__node-output,.svelte-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.svelte-flow__node-input.selectable:hover,.svelte-flow__node-default.selectable:hover,.svelte-flow__node-output.selectable:hover,.svelte-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.svelte-flow__node-input.selectable.selected,.svelte-flow__node-input.selectable:focus,.svelte-flow__node-input.selectable:focus-visible,.svelte-flow__node-default.selectable.selected,.svelte-flow__node-default.selectable:focus,.svelte-flow__node-default.selectable:focus-visible,.svelte-flow__node-output.selectable.selected,.svelte-flow__node-output.selectable:focus,.svelte-flow__node-output.selectable:focus-visible,.svelte-flow__node-group.selectable.selected,.svelte-flow__node-group.selectable:focus,.svelte-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.svelte-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.svelte-flow__nodesselection-rect,.svelte-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.svelte-flow__nodesselection-rect:focus,.svelte-flow__nodesselection-rect:focus-visible,.svelte-flow__selection:focus,.svelte-flow__selection:focus-visible{outline:none}.svelte-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.svelte-flow__controls-button:disabled{pointer-events:none}.svelte-flow__controls-button:disabled svg{fill-opacity:.4}.svelte-flow__controls-button:last-child{border-bottom:none}.svelte-flow__controls.horizontal .svelte-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.svelte-flow__controls.horizontal .svelte-flow__controls-button:last-child{border-right:none}.svelte-flow__resize-control{position:absolute}.svelte-flow__resize-control.left,.svelte-flow__resize-control.right{cursor:ew-resize}.svelte-flow__resize-control.top,.svelte-flow__resize-control.bottom{cursor:ns-resize}.svelte-flow__resize-control.top.left,.svelte-flow__resize-control.bottom.right{cursor:nwse-resize}.svelte-flow__resize-control.bottom.left,.svelte-flow__resize-control.top.right{cursor:nesw-resize}.svelte-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.svelte-flow__resize-control.handle.left{left:0;top:50%}.svelte-flow__resize-control.handle.right{left:100%;top:50%}.svelte-flow__resize-control.handle.top{left:50%;top:0}.svelte-flow__resize-control.handle.bottom{left:50%;top:100%}.svelte-flow__resize-control.handle.top.left,.svelte-flow__resize-control.handle.bottom.left{left:0}.svelte-flow__resize-control.handle.top.right,.svelte-flow__resize-control.handle.bottom.right{left:100%}.svelte-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.svelte-flow__resize-control.line.left,.svelte-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.svelte-flow__resize-control.line.left{left:0;border-left-width:1px}.svelte-flow__resize-control.line.right{left:100%;border-right-width:1px}.svelte-flow__resize-control.line.top,.svelte-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.svelte-flow__resize-control.line.top{top:0;border-top-width:1px}.svelte-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.svelte-flow__edge-label{text-align:center;position:absolute;padding:2px;font-size:10px;color:var(--xy-edge-label-color, var(--xy-edge-label-color-default));background:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.svelte-flow__container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.share-backdrop.svelte-1vh905b{position:fixed;inset:0;z-index:9999;background:#0009;display:flex;align-items:flex-start;justify-content:center;padding-top:8vh;animation:svelte-1vh905b-share-backdrop-in .12s ease-out}@keyframes svelte-1vh905b-share-backdrop-in{0%{opacity:0}to{opacity:1}}.share-modal.svelte-1vh905b{width:560px;max-width:90vw;max-height:82vh;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:14px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 20px 60px #00000080,0 0 100px oklch(from var(--color-accent) l c h / 4%);animation:svelte-1vh905b-share-slide-in .15s ease-out}@keyframes svelte-1vh905b-share-slide-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.share-header.svelte-1vh905b{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--color-border)}.share-title.svelte-1vh905b{display:flex;align-items:center;gap:10px;font-family:var(--font-sans);font-size:15px;font-weight:600;color:var(--color-text-primary)}.share-close-hint.svelte-1vh905b{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.share-body.svelte-1vh905b{flex:1;overflow-y:auto;padding:16px 20px;display:flex;flex-direction:column;gap:14px}.tunnel-card.svelte-1vh905b{border:1px solid var(--color-border);border-radius:10px;padding:16px;background:var(--color-bg-primary)}.tunnel-status-row.svelte-1vh905b{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.tunnel-status-info.svelte-1vh905b{display:flex;align-items:center;gap:8px}.tunnel-dot.svelte-1vh905b{width:8px;height:8px;border-radius:50%;background:var(--color-text-secondary);flex-shrink:0;transition:background .3s}.tunnel-dot.tunnel-dot-active.svelte-1vh905b{background:var(--color-success);box-shadow:0 0 8px oklch(from var(--color-success) l c h / 50%);animation:svelte-1vh905b-tunnel-glow 2s ease-in-out infinite}@keyframes svelte-1vh905b-tunnel-glow{0%,to{box-shadow:0 0 6px oklch(from var(--color-success) l c h / 30%)}50%{box-shadow:0 0 12px oklch(from var(--color-success) l c h / 60%)}}.tunnel-label.svelte-1vh905b{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary)}.tunnel-toggle-btn.svelte-1vh905b{display:flex;align-items:center;gap:6px;padding:6px 14px;border:none;border-radius:8px;font-family:var(--font-sans);font-size:12px;font-weight:600;cursor:pointer;background:var(--color-accent);color:#fff;transition:opacity .15s,transform .1s}.tunnel-toggle-btn.svelte-1vh905b:hover:not(:disabled){opacity:.92;transform:translateY(-.5px)}.tunnel-toggle-btn.svelte-1vh905b:active:not(:disabled){transform:scale(.97)}.tunnel-toggle-btn.svelte-1vh905b:disabled{opacity:.6;cursor:not-allowed}.tunnel-toggle-btn.tunnel-stop.svelte-1vh905b{background:#ef44441f;color:var(--color-error);border:1px solid rgba(239,68,68,.25)}.tunnel-toggle-btn.tunnel-stop.svelte-1vh905b:hover:not(:disabled){background:#ef444438;opacity:1}.tunnel-desc.svelte-1vh905b{font-family:var(--font-sans);font-size:12px;color:var(--color-text-secondary);margin:0;line-height:1.55}.tunnel-active-badge.svelte-1vh905b{display:inline-flex;align-items:center;gap:5px;margin-top:10px;padding:4px 10px;background:oklch(from var(--color-success) l c h / 10%);border:1px solid oklch(from var(--color-success) l c h / 20%);border-radius:6px;font-family:var(--font-sans);font-size:11px;font-weight:500;color:var(--color-success)}.install-card.svelte-1vh905b{border:1px solid rgba(245,158,11,.25);border-radius:10px;padding:16px;background:#f59e0b0a}.install-header.svelte-1vh905b{display:flex;align-items:center;gap:8px;font-family:var(--font-sans);font-size:13px;font-weight:600;color:#f59e0b;margin-bottom:8px}.install-desc.svelte-1vh905b{font-family:var(--font-sans);font-size:12px;color:var(--color-text-secondary);margin:0 0 12px;line-height:1.55}.install-desc.svelte-1vh905b code:where(.svelte-1vh905b){font-family:var(--font-mono);font-size:11px;background:#ffffff0f;padding:1px 5px;border-radius:4px;color:var(--color-text-primary)}.install-commands.svelte-1vh905b{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}.install-cmd.svelte-1vh905b{display:flex;flex-direction:column;gap:4px}.cmd-label.svelte-1vh905b{font-family:var(--font-sans);font-size:10px;font-weight:600;color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.04em}.cmd-row.svelte-1vh905b{display:flex;align-items:center;gap:6px;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:6px;padding:6px 8px}.cmd-row.svelte-1vh905b code:where(.svelte-1vh905b){flex:1;font-family:var(--font-mono);font-size:11px;color:var(--color-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.copy-btn-sm.svelte-1vh905b{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.copy-btn-sm.svelte-1vh905b:hover{background:#ffffff14;color:var(--color-text-primary)}.install-link.svelte-1vh905b{display:inline-flex;align-items:center;gap:5px;font-family:var(--font-sans);font-size:11px;color:var(--color-accent);text-decoration:none;transition:opacity .15s}.install-link.svelte-1vh905b:hover{opacity:.8}.urls-section.svelte-1vh905b{display:flex;flex-direction:column;gap:12px}.url-card.svelte-1vh905b{border:1px solid var(--color-border);border-radius:10px;padding:14px 16px;background:var(--color-bg-primary)}.url-header.svelte-1vh905b{display:flex;align-items:center;gap:6px;color:var(--color-text-secondary);margin-bottom:8px}.url-label.svelte-1vh905b{font-family:var(--font-sans);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary)}.url-row.svelte-1vh905b{display:flex;align-items:center;gap:8px;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:8px;padding:8px 10px}.url-value.svelte-1vh905b{flex:1;font-family:var(--font-mono);font-size:12px;color:var(--color-accent);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.copy-btn.svelte-1vh905b{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:var(--color-bg-elevated);border-radius:6px;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.copy-btn.svelte-1vh905b:hover{background:var(--color-border);color:var(--color-text-primary)}.url-hint.svelte-1vh905b{font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);margin:8px 0 0;opacity:.6;line-height:1.5}.usage-card.svelte-1vh905b{border:1px solid var(--color-border);border-radius:10px;padding:12px 14px;background:var(--color-bg-primary)}.usage-header.svelte-1vh905b{display:flex;align-items:center;gap:6px;font-family:var(--font-sans);font-size:11px;font-weight:600;color:var(--color-text-secondary);margin-bottom:8px}.usage-header.svelte-1vh905b .copy-btn-sm:where(.svelte-1vh905b){margin-left:auto}.usage-code.svelte-1vh905b{font-family:var(--font-mono);font-size:11px;color:var(--color-text-primary);background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:6px;padding:10px 12px;margin:0;overflow-x:auto;white-space:pre;line-height:1.6}.share-footer.svelte-1vh905b{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding:14px 20px;border-top:1px solid var(--color-border)}.footer-warn.svelte-1vh905b{font-family:var(--font-sans);font-size:11px;color:#f59e0b;opacity:.8;margin-right:auto}.btn-close.svelte-1vh905b{background:transparent;border:1px solid var(--color-border);border-radius:8px;padding:7px 18px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:background .15s,color .15s}.btn-close.svelte-1vh905b:hover{background:var(--color-bg-elevated);color:var(--color-text-primary)}.spin-icon.svelte-1vh905b{display:flex;align-items:center;animation:svelte-1vh905b-spin 1s linear infinite}@keyframes svelte-1vh905b-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.top-bar.svelte-11yu8dz{height:48px;min-height:48px;display:flex;align-items:center;padding:0 14px;background:oklch(from var(--color-bg-secondary) calc(l + .01) c h / 85%);backdrop-filter:blur(12px) saturate(1.2);-webkit-backdrop-filter:blur(12px) saturate(1.2);border-bottom:1px solid oklch(from var(--color-border) l c h / 60%);-webkit-user-select:none;user-select:none;gap:8px;z-index:20}.top-bar-left.svelte-11yu8dz{display:flex;align-items:center;gap:8px;flex-shrink:0}.brand-link.svelte-11yu8dz{display:flex;align-items:center;gap:8px;text-decoration:none;border-radius:8px;padding:5px 8px;margin:-5px -8px;transition:background .2s}.brand-link.svelte-11yu8dz:hover{background:#ffffff0a}.brand-logo.svelte-11yu8dz{width:22px;height:22px;border-radius:5px}.brand.svelte-11yu8dz{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary);letter-spacing:-.01em;opacity:.85}.conn-dot.svelte-11yu8dz{width:6px;height:6px;border-radius:50%;background:var(--color-text-secondary);flex-shrink:0;transition:background .3s}.conn-dot.conn-ok.svelte-11yu8dz{background:var(--color-success, #22c55e);box-shadow:0 0 5px oklch(from var(--color-success, #22c55e) l c h / 40%)}.conn-dot.conn-fail.svelte-11yu8dz{background:var(--color-error, #ef4444);box-shadow:0 0 5px oklch(from var(--color-error, #ef4444) l c h / 40%)}.conn-dot.conn-check.svelte-11yu8dz{animation:svelte-11yu8dz-conn-pulse 1s ease-in-out infinite}@keyframes svelte-11yu8dz-conn-pulse{0%,to{opacity:.3}50%{opacity:1}}.separator.svelte-11yu8dz{color:var(--color-text-secondary);font-size:13px;opacity:.3}.project-container.svelte-11yu8dz{position:relative}.project-selector.svelte-11yu8dz{display:flex;align-items:center;gap:6px;background:#ffffff08;border:1px solid rgba(255,255,255,.06);color:var(--color-text-primary);font-family:var(--font-mono);font-size:12px;padding:5px 10px 5px 8px;border-radius:8px;cursor:pointer;transition:background .2s,border-color .2s}.project-selector.svelte-11yu8dz:hover{background:#ffffff0f;border-color:#ffffff1a}.project-dot.svelte-11yu8dz{width:6px;height:6px;border-radius:50%;background:var(--color-accent);flex-shrink:0;box-shadow:0 0 4px oklch(from var(--color-accent) l c h / 40%)}.project-name.svelte-11yu8dz{font-weight:500}.project-chevron{color:var(--color-text-secondary);opacity:.5;flex-shrink:0}.project-backdrop.svelte-11yu8dz{position:fixed;inset:0;z-index:999}.project-dropdown.svelte-11yu8dz{position:absolute;top:calc(100% + 6px);left:0;width:260px;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:10px;box-shadow:0 12px 32px #0006;z-index:1000;overflow:hidden;animation:svelte-11yu8dz-dropdown-in .15s ease}@keyframes svelte-11yu8dz-dropdown-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.dropdown-header.svelte-11yu8dz{display:flex;align-items:center;justify-content:space-between;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);padding:10px 12px 6px}.dropdown-count.svelte-11yu8dz{font-size:9px;font-weight:600;min-width:16px;height:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;background:var(--color-bg-elevated);color:var(--color-text-secondary)}.dropdown-items.svelte-11yu8dz{max-height:240px;overflow-y:auto;padding:2px 4px;scrollbar-width:thin;scrollbar-color:var(--color-border) transparent}.dropdown-item.svelte-11yu8dz{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;background:none;border:none;border-radius:6px;color:var(--color-text-primary);font-family:var(--font-mono);font-size:12px;cursor:pointer;text-align:left;transition:background .1s}.dropdown-item.svelte-11yu8dz:hover{background:var(--color-bg-elevated)}.dropdown-item.active.svelte-11yu8dz{color:var(--color-accent);background:oklch(from var(--color-accent) l c h / 8%)}.dropdown-item-dot.svelte-11yu8dz{width:6px;height:6px;border-radius:50%;background:var(--color-border);flex-shrink:0;transition:background .15s}.dropdown-item-dot.dot-active.svelte-11yu8dz{background:var(--color-accent);box-shadow:0 0 6px oklch(from var(--color-accent) l c h / 40%)}.dropdown-item-name.svelte-11yu8dz{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-item-delete.svelte-11yu8dz{display:flex;align-items:center;background:none;border:none;color:var(--color-text-secondary);cursor:pointer;padding:2px;border-radius:4px;opacity:0;transition:opacity .15s,color .15s}.dropdown-item.svelte-11yu8dz:hover .dropdown-item-delete:where(.svelte-11yu8dz){opacity:1}.dropdown-item-delete.svelte-11yu8dz:hover{color:var(--color-error)}.dropdown-create.svelte-11yu8dz{display:flex;align-items:center;gap:6px;padding:8px;border-top:1px solid var(--color-border)}.dropdown-input.svelte-11yu8dz{flex:1;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;padding:6px 10px;font-family:var(--font-mono);font-size:12px;color:var(--color-text-primary);outline:none;transition:border-color .15s}.dropdown-input.svelte-11yu8dz:focus{border-color:var(--color-accent)}.dropdown-input.svelte-11yu8dz::placeholder{color:var(--color-text-secondary);opacity:.5}.dropdown-create-btn.svelte-11yu8dz{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:var(--color-accent);color:#fff;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:opacity .15s}.dropdown-create-btn.svelte-11yu8dz:hover:not(:disabled){opacity:.9}.dropdown-create-btn.svelte-11yu8dz:disabled{opacity:.4;cursor:not-allowed}.dropdown-active-label.svelte-11yu8dz{font-size:9px;font-weight:600;color:var(--color-accent);background:oklch(from var(--color-accent) l c h / 10%);padding:1px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.04em;margin-left:auto}.dropdown-confirm-delete.svelte-11yu8dz{padding:14px 12px;text-align:center}.confirm-delete-msg.svelte-11yu8dz{font-size:13px;color:var(--color-text-primary);margin:0 0 4px}.confirm-delete-warn.svelte-11yu8dz{font-size:11px;color:var(--color-text-secondary);margin:0 0 12px;opacity:.7}.confirm-delete-actions.svelte-11yu8dz{display:flex;gap:8px;justify-content:center}.confirm-cancel-btn.svelte-11yu8dz{padding:5px 14px;border:1px solid var(--color-border);border-radius:6px;background:transparent;color:var(--color-text-secondary);font-size:12px;cursor:pointer;transition:background .15s}.confirm-cancel-btn.svelte-11yu8dz:hover{background:var(--color-bg-elevated);color:var(--color-text-primary)}.confirm-delete-btn.svelte-11yu8dz{padding:5px 14px;border:1px solid rgba(239,68,68,.3);border-radius:6px;background:#ef444426;color:var(--color-error, #ef4444);font-size:12px;font-weight:600;cursor:pointer;transition:background .15s}.confirm-delete-btn.svelte-11yu8dz:hover{background:#ef444440}.btn-save.svelte-11yu8dz{display:flex;align-items:center;justify-content:center;width:30px;height:30px;background:transparent;border:none;color:var(--color-text-secondary);border-radius:7px;cursor:pointer;transition:background .2s,color .2s;opacity:.7}.btn-save.svelte-11yu8dz:hover{background:#ffffff0f;color:var(--color-text-primary);opacity:1}.btn-save.has-changes.svelte-11yu8dz{color:var(--color-accent);opacity:1}.btn-save.svelte-11yu8dz{position:relative}.dirty-dot.svelte-11yu8dz{position:absolute;top:4px;right:4px;width:6px;height:6px;border-radius:50%;background:var(--color-accent)}.top-bar-spacer.svelte-11yu8dz{flex:1}@media(max-width:850px){.brand.svelte-11yu8dz{display:none}}.top-bar-right.svelte-11yu8dz{display:flex;align-items:center;gap:3px;flex-shrink:0}.btn-run.svelte-11yu8dz{display:flex;align-items:center;gap:6px;background:var(--color-accent);color:#fff;border:none;padding:6px 14px;border-radius:8px;font-family:var(--font-sans);font-size:12px;font-weight:600;cursor:pointer;transition:opacity .15s,background .3s ease,transform .1s}.btn-run.svelte-11yu8dz:hover:not(:disabled){opacity:.92;transform:translateY(-.5px)}.btn-run.svelte-11yu8dz:active:not(:disabled){transform:scale(.97)}.btn-run.svelte-11yu8dz:disabled{cursor:not-allowed;opacity:.6}.btn-run-active.svelte-11yu8dz{background:var(--color-success)}.btn-runtime.svelte-11yu8dz{display:flex;align-items:center;gap:5px;background:#ffffff08;border:1px solid rgba(255,255,255,.06);color:var(--color-text-secondary);padding:5px 10px;border-radius:8px;font-family:var(--font-sans);font-size:11px;font-weight:500;cursor:pointer;transition:background .2s,color .2s,border-color .2s}.btn-runtime.svelte-11yu8dz:hover:not(:disabled){background:#ffffff0f;color:var(--color-text-primary)}.btn-runtime.svelte-11yu8dz:disabled{opacity:.4;cursor:not-allowed}.btn-runtime.runtime-running.svelte-11yu8dz{border-color:oklch(from var(--color-success) l c h / 30%);color:var(--color-success)}.btn-runtime.runtime-error.svelte-11yu8dz{border-color:oklch(from var(--color-error) l c h / 30%);color:var(--color-error)}.btn-runtime.runtime-starting.svelte-11yu8dz{border-color:oklch(from #f59e0b l c h / 30%);color:#f59e0b}.runtime-dot.svelte-11yu8dz{width:6px;height:6px;border-radius:50%;flex-shrink:0;transition:background .3s}.runtime-dot.rt-stopped.svelte-11yu8dz{background:var(--color-text-secondary);opacity:.5}.runtime-dot.rt-running.svelte-11yu8dz{background:var(--color-success);box-shadow:0 0 5px oklch(from var(--color-success) l c h / 40%)}.runtime-dot.rt-error.svelte-11yu8dz{background:var(--color-error);box-shadow:0 0 5px oklch(from var(--color-error) l c h / 40%)}.runtime-dot.rt-starting.svelte-11yu8dz{background:#f59e0b;animation:svelte-11yu8dz-runtime-pulse 1s ease-in-out infinite}@keyframes svelte-11yu8dz-runtime-pulse{0%,to{opacity:.4}50%{opacity:1}}.btn-icon.svelte-11yu8dz{position:relative;display:flex;align-items:center;justify-content:center;width:30px;height:30px;background:transparent;border:none;color:var(--color-text-secondary);border-radius:7px;cursor:pointer;transition:background .2s,color .2s;opacity:.7}.btn-icon.svelte-11yu8dz:hover:not(:disabled){background:#ffffff0f;color:var(--color-text-primary);opacity:1}.btn-icon.svelte-11yu8dz:disabled{cursor:not-allowed;opacity:.35}.btn-debug-active.svelte-11yu8dz{color:var(--color-warning);opacity:1}.architect-active.svelte-11yu8dz{color:var(--color-accent);background:oklch(from var(--color-accent) l c h / 10%);opacity:1}.divider.svelte-11yu8dz{width:1px;height:18px;background:#ffffff14;margin:0 5px}.pulse-dot.svelte-11yu8dz{width:6px;height:6px;border-radius:50%;background:#fff;animation:svelte-11yu8dz-pulse-indicator 1s ease-in-out infinite}.debug-dot.svelte-11yu8dz{position:absolute;top:4px;right:4px;width:5px;height:5px;background:var(--color-warning)}@keyframes svelte-11yu8dz-pulse-indicator{0%,to{opacity:.4}50%{opacity:1}}.spin-icon.svelte-11yu8dz{display:flex;align-items:center;animation:svelte-11yu8dz-spin 1s linear infinite}@keyframes svelte-11yu8dz-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.run-dialog-backdrop.svelte-11yu8dz{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.run-dialog.svelte-11yu8dz{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:14px;padding:24px;width:480px;max-width:90vw;box-shadow:0 20px 60px #00000080}.run-dialog-title.svelte-11yu8dz{font-size:16px;font-weight:600;color:var(--color-text-primary);margin:0 0 4px}.run-dialog-hint.svelte-11yu8dz{font-size:12px;color:var(--color-text-secondary);margin:0 0 14px}.run-dialog-input.svelte-11yu8dz{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:8px;padding:10px 12px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);resize:vertical;outline:none;box-sizing:border-box}.run-dialog-input.svelte-11yu8dz:focus{border-color:var(--color-accent)}.run-dialog-input.svelte-11yu8dz::placeholder{color:var(--color-text-secondary);opacity:.5}.run-dialog-actions.svelte-11yu8dz{display:flex;justify-content:flex-end;gap:8px;margin-top:14px}.run-dialog-cancel.svelte-11yu8dz{background:transparent;border:1px solid var(--color-border);border-radius:6px;padding:7px 14px;font-size:12px;color:var(--color-text-secondary);cursor:pointer}.run-dialog-go.svelte-11yu8dz{display:flex;align-items:center;gap:6px;background:var(--color-accent);border:none;border-radius:6px;padding:7px 16px;font-size:12px;font-weight:600;color:#fff;cursor:pointer}.run-dialog-go.svelte-11yu8dz:hover{opacity:.9}.command-palette-backdrop.svelte-1g6akjj{position:fixed;inset:0;z-index:9999;background:#0009;display:flex;align-items:flex-start;justify-content:center;padding-top:15vh;animation:svelte-1g6akjj-backdrop-fade-in .12s ease-out}@keyframes svelte-1g6akjj-backdrop-fade-in{0%{opacity:0}to{opacity:1}}.command-palette.svelte-1g6akjj{width:560px;max-width:90vw;max-height:480px;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:12px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 16px 48px #0009,0 0 80px color-mix(in srgb,var(--color-accent) 4%,transparent);animation:svelte-1g6akjj-palette-slide-in .15s ease-out}@keyframes svelte-1g6akjj-palette-slide-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.command-palette-input-wrapper.svelte-1g6akjj{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--color-border);color:var(--color-text-secondary)}.command-palette-input.svelte-1g6akjj{flex:1;background:transparent;border:none;outline:none;color:var(--color-text-primary);font-family:var(--font-sans);font-size:15px;line-height:1;caret-color:var(--color-accent)}.command-palette-input.svelte-1g6akjj::placeholder{color:var(--color-text-secondary);opacity:.6}.command-palette-kbd.svelte-1g6akjj{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.command-palette-results.svelte-1g6akjj{flex:1;overflow-y:auto;padding:6px}.command-palette-empty.svelte-1g6akjj{padding:32px 16px;text-align:center;color:var(--color-text-secondary);font-size:13px;font-family:var(--font-sans)}.command-palette-category.svelte-1g6akjj{font-family:var(--font-sans);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-secondary);padding:10px 10px 4px;-webkit-user-select:none;user-select:none}.command-palette-item.svelte-1g6akjj{display:flex;align-items:center;gap:10px;width:100%;padding:8px 10px;background:transparent;border:none;border-radius:8px;cursor:pointer;transition:background .08s ease;text-align:left}.command-palette-item.svelte-1g6akjj:hover,.command-palette-item.selected.svelte-1g6akjj{background:var(--color-bg-elevated)}.command-palette-item.selected.svelte-1g6akjj{outline:1px solid rgba(255,255,255,.06)}.command-palette-item-icon.svelte-1g6akjj{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;background:#ffffff0a;color:var(--color-text-secondary);flex-shrink:0}.command-palette-item.selected.svelte-1g6akjj .command-palette-item-icon:where(.svelte-1g6akjj){color:var(--color-accent);background:color-mix(in srgb,var(--color-accent) 10%,transparent)}.command-palette-item-label.svelte-1g6akjj{font-family:var(--font-sans);font-size:13px;font-weight:500;color:var(--color-text-primary);flex:1}.command-palette-item-shortcut.svelte-1g6akjj{font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.command-palette-footer.svelte-1g6akjj{display:flex;align-items:center;gap:16px;padding:10px 16px;border-top:1px solid var(--color-border)}.command-palette-hint.svelte-1g6akjj{display:flex;align-items:center;gap:4px;font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);opacity:.7}.command-palette-hint.svelte-1g6akjj kbd:where(.svelte-1g6akjj){font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:3px;padding:1px 4px;line-height:1.4}.shortcuts-backdrop.svelte-9545z7{position:fixed;inset:0;z-index:9999;background:#0009;display:flex;align-items:flex-start;justify-content:center;padding-top:12vh;animation:svelte-9545z7-shortcuts-backdrop-in .12s ease-out}@keyframes svelte-9545z7-shortcuts-backdrop-in{0%{opacity:0}to{opacity:1}}.shortcuts-modal.svelte-9545z7{width:480px;max-width:90vw;max-height:70vh;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:12px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 16px 48px #0009,0 0 80px color-mix(in srgb,var(--color-accent) 4%,transparent);animation:svelte-9545z7-shortcuts-slide-in .15s ease-out}@keyframes svelte-9545z7-shortcuts-slide-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.shortcuts-header.svelte-9545z7{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--color-border)}.shortcuts-title.svelte-9545z7{display:flex;align-items:center;gap:10px;font-family:var(--font-sans);font-size:15px;font-weight:600;color:var(--color-text-primary)}.shortcuts-close-hint.svelte-9545z7{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.shortcuts-body.svelte-9545z7{flex:1;overflow-y:auto;padding:8px 20px 20px}.shortcuts-group.svelte-9545z7{margin-top:12px}.shortcuts-category.svelte-9545z7{font-family:var(--font-sans);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-secondary);padding:4px 0 8px;-webkit-user-select:none;user-select:none}.shortcuts-row.svelte-9545z7{display:flex;align-items:center;justify-content:space-between;padding:7px 0;border-bottom:1px solid rgba(255,255,255,.04)}.shortcuts-row.svelte-9545z7:last-child{border-bottom:none}.shortcuts-description.svelte-9545z7{font-family:var(--font-sans);font-size:13px;font-weight:400;color:var(--color-text-primary)}.shortcuts-keys.svelte-9545z7{display:flex;align-items:center;gap:4px;flex-shrink:0}.shortcuts-kbd.svelte-9545z7{font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:4px;padding:2px 7px;line-height:1.4;white-space:nowrap}.shortcuts-separator.svelte-9545z7{font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);opacity:.5}.settings-overlay.svelte-1hvu725{position:fixed;inset:0;z-index:9999;background:var(--color-bg-primary);animation:svelte-1hvu725-settings-in .2s ease-out}@keyframes svelte-1hvu725-settings-in{0%{opacity:0}to{opacity:1}}.settings-page.svelte-1hvu725{display:flex;height:100%;overflow:hidden}.settings-sidebar.svelte-1hvu725{width:280px;min-width:280px;background:var(--color-bg-secondary);border-right:1px solid var(--color-border);display:flex;flex-direction:column;padding:0}.sidebar-header.svelte-1hvu725{display:flex;align-items:center;gap:10px;padding:20px 20px 16px;font-family:var(--font-sans);font-size:15px;font-weight:600;color:var(--color-text-primary)}.sidebar-nav.svelte-1hvu725{flex:1;display:flex;flex-direction:column;gap:2px;padding:0 10px;overflow-y:auto}.sidebar-item.svelte-1hvu725{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:none;background:transparent;border-radius:8px;cursor:pointer;text-align:left;color:var(--color-text-secondary);transition:background .15s,color .15s}.sidebar-item.svelte-1hvu725:hover{background:#ffffff0a;color:var(--color-text-primary)}.sidebar-item.active.svelte-1hvu725{background:oklch(from var(--color-accent) l c h / 8%);color:var(--color-accent)}.sidebar-item.svelte-1hvu725 svg{margin-top:2px;flex-shrink:0}.sidebar-item-text.svelte-1hvu725{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.sidebar-item-label.svelte-1hvu725{font-family:var(--font-sans);font-size:13px;font-weight:600}.sidebar-item-desc.svelte-1hvu725{font-family:var(--font-sans);font-size:11px;font-weight:400;color:var(--color-text-secondary);opacity:.7;line-height:1.4}.sidebar-item.active.svelte-1hvu725 .sidebar-item-desc:where(.svelte-1hvu725){opacity:.8}.sidebar-badge.svelte-1hvu725{font-family:var(--font-mono);font-size:10px;font-weight:600;color:var(--color-text-secondary);background:#ffffff0d;border-radius:4px;padding:2px 6px;margin-top:2px;flex-shrink:0}.sidebar-footer.svelte-1hvu725{padding:12px 10px;border-top:1px solid var(--color-border)}.btn-close-sidebar.svelte-1hvu725{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:none;background:transparent;border-radius:8px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:background .15s,color .15s}.btn-close-sidebar.svelte-1hvu725:hover{background:#ffffff0a;color:var(--color-text-primary)}.esc-hint.svelte-1hvu725{margin-left:auto;font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:4px;padding:1px 5px;opacity:.6}.settings-content.svelte-1hvu725{flex:1;display:flex;flex-direction:column;overflow:hidden}.content-header.svelte-1hvu725{display:flex;align-items:center;justify-content:space-between;padding:20px 32px 16px;border-bottom:1px solid var(--color-border);flex-shrink:0}.content-title.svelte-1hvu725{font-family:var(--font-sans);font-size:20px;font-weight:700;color:var(--color-text-primary);margin:0;letter-spacing:-.01em}.content-actions.svelte-1hvu725{display:flex;align-items:center;gap:10px}.save-success.svelte-1hvu725{display:flex;align-items:center;gap:4px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-success);animation:svelte-1hvu725-fade-in-out 2s ease forwards}@keyframes svelte-1hvu725-fade-in-out{0%{opacity:0}10%{opacity:1}80%{opacity:1}to{opacity:0}}.btn-save.svelte-1hvu725{background:var(--color-accent);border:none;border-radius:8px;padding:8px 18px;font-family:var(--font-sans);font-size:12px;font-weight:600;color:#fff;cursor:pointer;transition:opacity .15s,transform .1s}.btn-save.svelte-1hvu725:hover:not(:disabled){opacity:.92;transform:translateY(-.5px)}.btn-save.svelte-1hvu725:active:not(:disabled){transform:scale(.97)}.btn-save.svelte-1hvu725:disabled{opacity:.5;cursor:not-allowed}.content-body.svelte-1hvu725{flex:1;overflow-y:auto;padding:24px 32px 40px;display:flex;flex-direction:column;gap:20px;max-width:720px}.section-intro.svelte-1hvu725{font-family:var(--font-sans);font-size:13px;color:var(--color-text-secondary);margin:0 0 4px;line-height:1.55}.section-card.svelte-1hvu725{border:1px solid var(--color-border);border-radius:12px;padding:20px;background:var(--color-bg-secondary)}.card-title.svelte-1hvu725{font-family:var(--font-sans);font-size:14px;font-weight:600;color:var(--color-text-primary);margin:0 0 4px}.card-desc.svelte-1hvu725{font-family:var(--font-sans);font-size:12px;color:var(--color-text-secondary);margin:0 0 16px;line-height:1.55}.field.svelte-1hvu725{margin-top:12px}.field.svelte-1hvu725:first-of-type{margin-top:0}.fields-grid.svelte-1hvu725{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:4px}.fields-grid.svelte-1hvu725 .field:where(.svelte-1hvu725){margin-top:0}.field-label.svelte-1hvu725{display:block;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);margin-bottom:6px}.field-optional.svelte-1hvu725{opacity:.5;font-weight:400}.field-hint.svelte-1hvu725{font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);margin:0 0 6px;opacity:.6}.field-input.svelte-1hvu725{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:8px;padding:9px 12px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);outline:none;transition:border-color .2s,box-shadow .2s;box-sizing:border-box}.field-input.field-mono.svelte-1hvu725{font-family:var(--font-mono);font-size:12px}.field-input.field-narrow.svelte-1hvu725{width:100px}.field-input.svelte-1hvu725:focus{border-color:oklch(from var(--color-accent) l c h / 50%);box-shadow:0 0 0 3px oklch(from var(--color-accent) l c h / 8%)}.field-input.svelte-1hvu725::placeholder{color:var(--color-text-secondary);opacity:.45}.field-with-toggle.svelte-1hvu725{display:flex;gap:0;position:relative}.field-with-toggle.svelte-1hvu725 .field-input:where(.svelte-1hvu725){padding-right:40px}.field-toggle.svelte-1hvu725{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary);cursor:pointer;transition:background .15s,color .15s}.field-toggle.svelte-1hvu725:hover{background:#ffffff0f;color:var(--color-text-primary)}.field-textarea.svelte-1hvu725{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:8px;padding:9px 12px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);outline:none;transition:border-color .2s,box-shadow .2s;box-sizing:border-box;resize:vertical;min-height:60px;line-height:1.55}.field-textarea.svelte-1hvu725:focus{border-color:oklch(from var(--color-accent) l c h / 50%);box-shadow:0 0 0 3px oklch(from var(--color-accent) l c h / 8%)}.field-textarea.svelte-1hvu725::placeholder{color:var(--color-text-secondary);opacity:.45}.range-row.svelte-1hvu725{display:flex;align-items:center;gap:14px}.field-range.svelte-1hvu725{flex:1;accent-color:var(--color-accent);height:4px}.range-value.svelte-1hvu725{font-family:var(--font-mono);font-size:13px;font-weight:600;color:var(--color-text-primary);min-width:36px;text-align:right}.range-labels.svelte-1hvu725{display:flex;justify-content:space-between;font-family:var(--font-sans);font-size:10px;color:var(--color-text-secondary);opacity:.5;margin-top:4px}.personality-preview.svelte-1hvu725{display:flex;align-items:flex-start;gap:8px;margin-top:12px;padding:10px 14px;background:oklch(from var(--color-accent) l c h / 5%);border:1px solid oklch(from var(--color-accent) l c h / 12%);border-radius:8px;font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);line-height:1.55}.personality-preview.neutral.svelte-1hvu725{background:#ffffff05;border-color:var(--color-border)}.personality-preview.svelte-1hvu725 svg{flex-shrink:0;margin-top:1px;color:var(--color-accent)}.personality-preview.neutral.svelte-1hvu725 svg{color:var(--color-text-secondary)}.providers-grid.svelte-1hvu725{display:grid;grid-template-columns:1fr 1fr;gap:12px}.provider-card.svelte-1hvu725{border:1px solid var(--color-border);border-radius:12px;padding:16px;background:var(--color-bg-secondary);transition:border-color .2s,box-shadow .2s}.provider-card.svelte-1hvu725:hover{border-color:oklch(from var(--color-border) calc(l + .05) c h)}.provider-card.configured.svelte-1hvu725{border-color:oklch(from var(--color-success) l c h / 25%)}.provider-header.svelte-1hvu725{display:flex;align-items:center;gap:10px;margin-bottom:14px}.provider-icon-wrap.svelte-1hvu725{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;background:oklch(from var(--provider-color, #888) l c h / 10%);color:var(--provider-color, var(--color-text-secondary));flex-shrink:0}.provider-name.svelte-1hvu725{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary);flex:1}.provider-badge.svelte-1hvu725{display:flex;align-items:center;gap:3px;font-family:var(--font-sans);font-size:10px;font-weight:600;color:var(--color-success);background:oklch(from var(--color-success) l c h / 10%);border-radius:6px;padding:3px 8px}.provider-fields.svelte-1hvu725{display:flex;flex-direction:column;gap:10px}.provider-field.svelte-1hvu725{display:flex;flex-direction:column;gap:4px}.provider-field.svelte-1hvu725 .field-label:where(.svelte-1hvu725){margin-bottom:0;font-size:11px}.about-rows.svelte-1hvu725{display:flex;flex-direction:column;gap:0}.about-row.svelte-1hvu725{display:flex;align-items:center;justify-content:space-between;padding:10px 0;border-bottom:1px solid rgba(255,255,255,.04)}.about-row.svelte-1hvu725:last-child{border-bottom:none}.about-label.svelte-1hvu725{font-family:var(--font-sans);font-size:13px;color:var(--color-text-secondary)}.about-value.svelte-1hvu725{font-family:var(--font-mono);font-size:12px;color:var(--color-text-primary);font-weight:500}.shortcuts-grid.svelte-1hvu725{display:flex;flex-direction:column;gap:0}.shortcut-row.svelte-1hvu725{display:flex;align-items:center;justify-content:space-between;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.04)}.shortcut-row.svelte-1hvu725:last-child{border-bottom:none}.shortcut-label.svelte-1hvu725{font-family:var(--font-sans);font-size:13px;color:var(--color-text-secondary)}.shortcut-row.svelte-1hvu725 kbd:where(.svelte-1hvu725){font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:5px;padding:3px 8px}.service-connections-section.svelte-1hvu725{margin-top:24px;padding-top:24px;border-top:1px solid var(--color-border);display:flex;flex-direction:column;gap:16px}.service-connections-header.svelte-1hvu725{display:flex;flex-direction:column;gap:4px}.service-connections-title-row.svelte-1hvu725{display:flex;align-items:center;gap:8px;color:var(--color-text-primary)}.add-service-wrap.svelte-1hvu725{position:relative}.btn-add-service.svelte-1hvu725{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px dashed var(--color-border);background:transparent;border-radius:8px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:border-color .15s,color .15s,background .15s}.btn-add-service.svelte-1hvu725:hover{border-color:var(--color-accent);color:var(--color-accent);background:oklch(from var(--color-accent) l c h / 5%)}.dropdown-backdrop.svelte-1hvu725{position:fixed;inset:0;z-index:99}.add-service-dropdown.svelte-1hvu725{position:absolute;top:calc(100% + 6px);left:0;z-index:100;min-width:220px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:10px;padding:6px;box-shadow:0 8px 24px #0000004d;display:flex;flex-direction:column;gap:2px;max-height:320px;overflow-y:auto}.dropdown-category.svelte-1hvu725{display:flex;flex-direction:column;gap:1px}.dropdown-category.svelte-1hvu725+.dropdown-category:where(.svelte-1hvu725){margin-top:4px;padding-top:4px;border-top:1px solid rgba(255,255,255,.04)}.dropdown-category-label.svelte-1hvu725{font-family:var(--font-sans);font-size:10px;font-weight:600;color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em;padding:4px 10px 2px;opacity:.6}.dropdown-item.svelte-1hvu725{display:flex;align-items:center;gap:8px;padding:7px 10px;border:none;background:transparent;border-radius:6px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-primary);cursor:pointer;text-align:left;transition:background .1s}.dropdown-item.svelte-1hvu725:hover{background:#ffffff0f}.dropdown-item-dot.svelte-1hvu725{width:6px;height:6px;border-radius:50%;flex-shrink:0}.empty-services.svelte-1hvu725{padding:24px;text-align:center;border:1px dashed var(--color-border);border-radius:10px}.empty-services-text.svelte-1hvu725{font-family:var(--font-sans);font-size:12px;color:var(--color-text-secondary);opacity:.6}.service-category-group.svelte-1hvu725{display:flex;flex-direction:column;gap:8px}.service-category-label.svelte-1hvu725{font-family:var(--font-sans);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.service-cards-list.svelte-1hvu725{display:flex;flex-direction:column;gap:10px}.service-card.svelte-1hvu725{border:1px solid var(--color-border);border-radius:10px;background:var(--color-bg-secondary);overflow:hidden;transition:border-color .2s}.service-card.svelte-1hvu725:hover{border-color:oklch(from var(--color-border) calc(l + .05) c h)}.service-card-header.svelte-1hvu725{display:flex;align-items:center;gap:10px;padding:12px 14px;border-bottom:1px solid rgba(255,255,255,.03)}.service-card-icon.svelte-1hvu725{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:7px;flex-shrink:0}.service-card-label.svelte-1hvu725{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary);flex:1}.service-card-type.svelte-1hvu725{font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);background:#ffffff0a;border-radius:4px;padding:2px 6px;opacity:.7}.service-card-actions.svelte-1hvu725{display:flex;gap:4px;flex-shrink:0}.btn-service-action.svelte-1hvu725{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary);cursor:pointer;transition:background .15s,color .15s}.btn-service-action.svelte-1hvu725:hover{background:#ffffff0f;color:var(--color-text-primary)}.btn-service-action.svelte-1hvu725:disabled{opacity:.4;cursor:not-allowed}.btn-service-delete.svelte-1hvu725:hover{background:oklch(from var(--color-error) l c h / 10%);color:var(--color-error)}.btn-service-action.svelte-1hvu725 .spinning{animation:svelte-1hvu725-spin 1s linear infinite}@keyframes svelte-1hvu725-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.test-result-banner.svelte-1hvu725{padding:8px 14px;font-family:var(--font-sans);font-size:11px;font-weight:500;line-height:1.4}.test-result-banner.test-success.svelte-1hvu725{background:oklch(from var(--color-success) l c h / 8%);color:var(--color-success)}.test-result-banner.test-error.svelte-1hvu725{background:oklch(from var(--color-error) l c h / 8%);color:var(--color-error)}.service-card-fields.svelte-1hvu725{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.service-field-row.svelte-1hvu725{display:flex;flex-direction:column;gap:4px}.service-field-row.svelte-1hvu725 .field-label:where(.svelte-1hvu725){margin-bottom:0;font-size:11px}.toggle-switch.svelte-1hvu725{position:relative;display:inline-block;width:36px;height:20px;cursor:pointer}.toggle-switch.svelte-1hvu725 input:where(.svelte-1hvu725){opacity:0;width:0;height:0}.toggle-slider.svelte-1hvu725{position:absolute;inset:0;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:10px;transition:background .2s,border-color .2s}.toggle-slider.svelte-1hvu725:before{content:"";position:absolute;left:2px;top:2px;width:14px;height:14px;border-radius:50%;background:var(--color-text-secondary);transition:transform .2s,background .2s}.toggle-switch.svelte-1hvu725 input:where(.svelte-1hvu725):checked+.toggle-slider:where(.svelte-1hvu725){background:oklch(from var(--color-accent) l c h / 15%);border-color:var(--color-accent)}.toggle-switch.svelte-1hvu725 input:where(.svelte-1hvu725):checked+.toggle-slider:where(.svelte-1hvu725):before{transform:translate(16px);background:var(--color-accent)}@media(max-width:900px){.providers-grid.svelte-1hvu725{grid-template-columns:1fr}}@media(max-width:640px){.settings-sidebar.svelte-1hvu725{width:60px;min-width:60px}.sidebar-item-text.svelte-1hvu725,.sidebar-badge.svelte-1hvu725{display:none}.sidebar-header.svelte-1hvu725 span:where(.svelte-1hvu725){display:none}.btn-close-sidebar.svelte-1hvu725 span:where(.svelte-1hvu725),.btn-close-sidebar.svelte-1hvu725 .esc-hint:where(.svelte-1hvu725){display:none}.content-body.svelte-1hvu725{padding:16px 20px 32px}.fields-grid.svelte-1hvu725,.providers-grid.svelte-1hvu725{grid-template-columns:1fr}}.wizard-backdrop.svelte-tj3wu{position:fixed;inset:0;z-index:10000;background:#000000bf;display:flex;align-items:center;justify-content:center;animation:svelte-tj3wu-wizard-backdrop-in .2s ease-out}@keyframes svelte-tj3wu-wizard-backdrop-in{0%{opacity:0}to{opacity:1}}.wizard-modal.svelte-tj3wu{width:580px;max-width:90vw;max-height:85vh;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:16px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 24px 64px #000000b3,0 0 120px color-mix(in srgb,var(--color-accent) 6%,transparent);animation:svelte-tj3wu-wizard-slide-in .25s ease-out}@keyframes svelte-tj3wu-wizard-slide-in{0%{opacity:0;transform:translateY(16px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}.wizard-progress.svelte-tj3wu{display:flex;align-items:center;padding:20px 32px 0}.wizard-step-indicator.svelte-tj3wu{display:flex;align-items:center;flex:1}.wizard-step-indicator.svelte-tj3wu:last-child{flex:0}.wizard-step-dot.svelte-tj3wu{width:24px;height:24px;border-radius:50%;background:var(--color-bg-elevated);border:2px solid var(--color-border);display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary);font-size:11px;font-weight:600;flex-shrink:0;transition:all .2s ease}.wizard-step-num.svelte-tj3wu{font-family:var(--font-sans)}.wizard-step-indicator.active.svelte-tj3wu .wizard-step-dot:where(.svelte-tj3wu){border-color:var(--color-accent);background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent)}.wizard-step-indicator.completed.svelte-tj3wu .wizard-step-dot:where(.svelte-tj3wu){border-color:var(--color-success);background:var(--color-success);color:#fff}.wizard-step-line.svelte-tj3wu{flex:1;height:2px;background:var(--color-border);margin:0 6px;transition:background .2s}.wizard-step-line.filled.svelte-tj3wu{background:var(--color-success)}.wizard-body.svelte-tj3wu{flex:1;overflow-y:auto;padding:24px 32px}.wizard-welcome.svelte-tj3wu{display:flex;flex-direction:column;align-items:center;text-align:center;padding:16px 0}.wizard-logo.svelte-tj3wu{width:64px;height:64px;border-radius:14px;margin-bottom:20px}.wizard-heading.svelte-tj3wu{font-family:var(--font-sans);font-size:22px;font-weight:700;color:var(--color-text-primary);margin:0 0 8px}.wizard-text.svelte-tj3wu{font-family:var(--font-sans);font-size:13px;color:var(--color-text-secondary);margin:0 0 16px;line-height:1.6}.wizard-text.svelte-tj3wu strong:where(.svelte-tj3wu){color:var(--color-text-primary);font-weight:600}.wizard-text-subtle.svelte-tj3wu{font-size:12px;opacity:.7;margin-top:-8px}.wizard-text.svelte-tj3wu code:where(.svelte-tj3wu){font-family:var(--font-mono);font-size:11px;background:var(--color-bg-elevated);padding:2px 6px;border-radius:4px}.wizard-features.svelte-tj3wu{display:flex;gap:16px;margin-top:8px}.wizard-feature.svelte-tj3wu{display:flex;align-items:center;gap:6px;font-family:var(--font-sans);font-size:12px;color:var(--color-text-secondary);background:#ffffff08;padding:8px 14px;border-radius:8px;border:1px solid var(--color-border)}.wizard-step-title.svelte-tj3wu{font-family:var(--font-sans);font-size:16px;font-weight:600;color:var(--color-text-primary);margin:0 0 4px}.wizard-hint.svelte-tj3wu{font-family:var(--font-sans);font-size:12px;color:var(--color-warning);margin:12px 0 0;text-align:center}.wizard-providers-grid.svelte-tj3wu{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}.wizard-provider-card.svelte-tj3wu{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:16px 12px 14px;background:#ffffff05;border:1px solid var(--color-border);border-radius:10px;cursor:pointer;transition:border-color .15s,background .15s,transform .1s}.wizard-provider-card.svelte-tj3wu:hover{background:#ffffff0a;transform:translateY(-1px)}.wizard-provider-card.selected.svelte-tj3wu{border-color:var(--color-accent);background:color-mix(in srgb,var(--color-accent) 6%,transparent)}.wizard-provider-check.svelte-tj3wu{position:absolute;top:6px;right:6px;display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--color-accent);color:#fff}.wizard-provider-label.svelte-tj3wu{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary)}.wizard-provider-desc.svelte-tj3wu{font-family:var(--font-sans);font-size:10px;color:var(--color-text-secondary);opacity:.7}.wizard-keys-list.svelte-tj3wu{display:flex;flex-direction:column;gap:12px}.wizard-key-section.svelte-tj3wu{border:1px solid var(--color-border);border-radius:10px;padding:14px 16px;background:#ffffff05}.wizard-key-provider.svelte-tj3wu{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary)}.wizard-key-field.svelte-tj3wu{margin-top:10px}.wizard-key-label.svelte-tj3wu{display:block;font-family:var(--font-sans);font-size:11px;font-weight:500;color:var(--color-text-secondary);margin-bottom:4px}.wizard-key-input.svelte-tj3wu{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;padding:8px 10px;font-family:var(--font-mono);font-size:12px;color:var(--color-text-primary);outline:none;transition:border-color .15s;box-sizing:border-box}.wizard-text-input.svelte-tj3wu{font-family:var(--font-sans);font-size:13px}.wizard-key-input.svelte-tj3wu:focus{border-color:var(--color-accent)}.wizard-key-input.svelte-tj3wu::placeholder{color:var(--color-text-secondary);opacity:.5}.wizard-defaults.svelte-tj3wu{display:flex;flex-direction:column;gap:12px}.wizard-default-card.svelte-tj3wu{border:1px solid var(--color-border);border-radius:10px;padding:14px 16px;background:#ffffff05}.wizard-defaults-row.svelte-tj3wu{display:flex;gap:12px}.wizard-default-half.svelte-tj3wu{flex:1}.wizard-model-hint.svelte-tj3wu{display:block;font-family:var(--font-sans);font-size:10px;color:var(--color-text-secondary);margin-top:6px;opacity:.7}.wizard-optional.svelte-tj3wu{opacity:.5;font-weight:400}.wizard-textarea.svelte-tj3wu{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;padding:8px 10px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);outline:none;transition:border-color .15s;box-sizing:border-box;resize:vertical;min-height:60px}.wizard-textarea.svelte-tj3wu:focus{border-color:var(--color-accent)}.wizard-textarea.svelte-tj3wu::placeholder{color:var(--color-text-secondary);opacity:.5}.wizard-range-wrapper.svelte-tj3wu{display:flex;align-items:center;gap:10px}.wizard-range.svelte-tj3wu{flex:1;accent-color:var(--color-accent)}.wizard-range-value.svelte-tj3wu{font-family:var(--font-mono);font-size:12px;color:var(--color-accent);font-weight:600;min-width:32px;text-align:right}.wizard-done-icon.svelte-tj3wu{display:flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:50%;background:color-mix(in srgb,var(--color-success) 14%,transparent);color:var(--color-success);margin-bottom:16px}.wizard-footer.svelte-tj3wu{display:flex;align-items:center;justify-content:space-between;padding:14px 24px;border-top:1px solid var(--color-border)}.wizard-footer-left.svelte-tj3wu{display:flex;align-items:center;gap:8px}.wizard-btn-skip.svelte-tj3wu{background:transparent;border:none;padding:7px 12px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:color .15s}.wizard-btn-skip.svelte-tj3wu:hover{color:var(--color-text-primary)}.wizard-btn-back.svelte-tj3wu{background:transparent;border:1px solid var(--color-border);border-radius:6px;padding:7px 14px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:background .15s}.wizard-btn-back.svelte-tj3wu:hover{background:var(--color-bg-elevated)}.wizard-btn-next.svelte-tj3wu{background:var(--color-accent);border:none;border-radius:6px;padding:7px 18px;font-family:var(--font-sans);font-size:12px;font-weight:600;color:#fff;cursor:pointer;transition:opacity .15s}.wizard-btn-next.svelte-tj3wu:hover:not(:disabled){opacity:.9}.wizard-btn-next.svelte-tj3wu:disabled{opacity:.4;cursor:not-allowed}.wizard-btn-launch.svelte-tj3wu{display:flex;align-items:center;gap:6px;padding:8px 20px}.toast-container.svelte-lxvwit{position:fixed;bottom:24px;right:24px;z-index:20000;display:flex;flex-direction:column-reverse;gap:8px;max-width:400px}.toast.svelte-lxvwit{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--color-bg-secondary);border:1px solid oklch(from var(--toast-color) l c h / 30%);border-left:3px solid var(--toast-color);border-radius:8px;box-shadow:0 8px 24px #0006;animation:svelte-lxvwit-toast-in .2s ease-out}@keyframes svelte-lxvwit-toast-in{0%{opacity:0;transform:translateY(8px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}.toast-icon.svelte-lxvwit{display:flex;align-items:center;color:var(--toast-color);flex-shrink:0}.toast-message.svelte-lxvwit{flex:1;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);line-height:1.4}.toast-close.svelte-lxvwit{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:none;border:none;border-radius:4px;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.toast-close.svelte-lxvwit:hover{background:#ffffff0f;color:var(--color-text-primary)}.architect-sidebar.svelte-mwxll1{position:relative;min-width:280px;background:var(--color-bg-secondary, #12121a);border-right:1px solid var(--color-border, #2a2a3a);display:flex;flex-direction:column;overflow:hidden;flex-shrink:0;animation:svelte-mwxll1-sidebarSlideIn .2s ease-out}.architect-sidebar.dragging.svelte-mwxll1{-webkit-user-select:none;user-select:none}@keyframes svelte-mwxll1-sidebarSlideIn{0%{transform:translate(-20px);opacity:0}to{transform:translate(0);opacity:1}}.sidebar-header.svelte-mwxll1{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.header-left.svelte-mwxll1{display:flex;align-items:center;gap:8px}.header-icon-circle.svelte-mwxll1{width:28px;height:28px;border-radius:50%;background:oklch(from var(--color-accent, #ff6b35) l c h / 12%);color:var(--color-accent, #ff6b35);display:flex;align-items:center;justify-content:center;flex-shrink:0}.header-name.svelte-mwxll1{font-size:13px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.collapse-btn.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.collapse-btn.svelte-mwxll1:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.resize-handle.svelte-mwxll1{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:ew-resize;z-index:10}.resize-handle.svelte-mwxll1:hover{background:oklch(from var(--color-accent, #ff6b35) l c h / 30%)}.messages.svelte-mwxll1{flex:1;overflow-y:auto;padding:16px;background:linear-gradient(180deg,rgba(255,107,53,.02) 0%,var(--color-bg-primary, #0a0a0f) 100%)}.empty-state.svelte-mwxll1{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:10px;color:var(--color-text-secondary, #8888a0);opacity:.7;padding:24px}.empty-icon-circle.svelte-mwxll1{width:72px;height:72px;border-radius:50%;background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);color:var(--color-accent, #ff6b35);display:flex;align-items:center;justify-content:center;margin-bottom:4px}.empty-title.svelte-mwxll1{font-size:15px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.empty-hint.svelte-mwxll1{font-size:12px;color:var(--color-text-secondary, #8888a0);text-align:center;max-width:320px;line-height:1.5}.message.svelte-mwxll1{display:flex;gap:10px;margin-bottom:16px}.message-avatar.svelte-mwxll1{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px}.message.user.svelte-mwxll1 .message-avatar:where(.svelte-mwxll1){background:oklch(from var(--color-accent, #ff6b35) l c h / 15%);color:var(--color-accent, #ff6b35)}.message.assistant.svelte-mwxll1 .message-avatar:where(.svelte-mwxll1){background:#ffffff0f;color:var(--color-text-secondary, #8888a0)}.message-body.svelte-mwxll1{flex:1;min-width:0}.message-header.svelte-mwxll1{display:flex;align-items:baseline;gap:8px;margin-bottom:4px}.message-role.svelte-mwxll1{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.message-time.svelte-mwxll1{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6}.message-content.svelte-mwxll1{font-size:13px;line-height:1.6;color:var(--color-text-primary, #e8e8ed);white-space:pre-wrap;word-break:break-word}.message.user.svelte-mwxll1 .message-content:where(.svelte-mwxll1){background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);border-radius:8px;padding:8px 12px}.message.assistant.svelte-mwxll1 .message-content:where(.svelte-mwxll1){background:var(--color-bg-elevated, #1a1a26);border-radius:8px;padding:8px 12px}.message-content.markdown.svelte-mwxll1{white-space:normal}.message-content.markdown.svelte-mwxll1 p{margin:0 0 8px}.message-content.markdown.svelte-mwxll1 p:last-child{margin-bottom:0}.message-content.markdown.svelte-mwxll1 h1,.message-content.markdown.svelte-mwxll1 h2,.message-content.markdown.svelte-mwxll1 h3{margin:12px 0 6px;font-weight:600;line-height:1.3}.message-content.markdown.svelte-mwxll1 h1{font-size:16px}.message-content.markdown.svelte-mwxll1 h2{font-size:14px}.message-content.markdown.svelte-mwxll1 h3{font-size:13px}.message-content.markdown.svelte-mwxll1 code{font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:11px;background:#ffffff0f;padding:1px 4px;border-radius:3px}.message-content.markdown.svelte-mwxll1 pre{background:#0000004d;border-radius:6px;padding:10px 12px;overflow-x:auto;margin:8px 0}.message-content.markdown.svelte-mwxll1 pre code{background:none;padding:0;font-size:11px;line-height:1.5}.message-content.markdown.svelte-mwxll1 ul,.message-content.markdown.svelte-mwxll1 ol{margin:6px 0;padding-left:20px}.message-content.markdown.svelte-mwxll1 li{margin-bottom:2px}.message-content.markdown.svelte-mwxll1 blockquote{border-left:3px solid var(--color-accent, #ff6b35);margin:8px 0;padding:4px 12px;color:var(--color-text-secondary, #8888a0)}.message-content.markdown.svelte-mwxll1 a{color:var(--color-accent, #ff6b35);text-decoration:underline}.message-content.markdown.svelte-mwxll1 table{border-collapse:collapse;width:100%;margin:8px 0;font-size:11px}.message-content.markdown.svelte-mwxll1 th,.message-content.markdown.svelte-mwxll1 td{border:1px solid var(--color-border, #2a2a3a);padding:4px 8px;text-align:left}.message-content.markdown.svelte-mwxll1 th{background:#ffffff0a;font-weight:600}.streaming-cursor.svelte-mwxll1{display:inline-block;width:6px;height:14px;background:var(--color-accent, #ff6b35);margin-left:2px;animation:svelte-mwxll1-blink .8s step-end infinite;vertical-align:text-bottom}@keyframes svelte-mwxll1-blink{0%,to{opacity:1}50%{opacity:0}}.thinking-indicator.svelte-mwxll1{display:flex;align-items:center;gap:8px;padding:4px 0}.thinking-spinner.svelte-mwxll1{font-size:16px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);color:var(--color-accent, #ff6b35);flex-shrink:0;line-height:1}.thinking-message.svelte-mwxll1{font-size:12px;color:var(--color-text-secondary, #8888a0);font-style:italic;animation:svelte-mwxll1-msg-fade .4s ease}@keyframes svelte-mwxll1-msg-fade{0%{opacity:0;transform:translate(4px)}to{opacity:1;transform:translate(0)}}.tool-calls-container.svelte-mwxll1{margin-top:8px;border:1px solid var(--color-border, #2a2a3a);border-radius:8px;overflow:hidden;background:#00000026}.tool-calls-header.svelte-mwxll1{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s ease;gap:8px}.tool-calls-header.svelte-mwxll1:hover{background:#ffffff08}.tool-calls-header-left.svelte-mwxll1{display:flex;align-items:center;gap:6px;color:var(--color-accent, #ff6b35);flex-shrink:0}.tool-chevron.svelte-mwxll1{display:flex;align-items:center;transition:transform .2s ease}.tool-chevron.expanded.svelte-mwxll1{transform:rotate(90deg)}.tool-calls-count.svelte-mwxll1{font-size:11px;font-weight:600;white-space:nowrap}.tool-calls-summary.svelte-mwxll1{font-size:10px;color:var(--color-text-secondary, #8888a0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}.tool-calls-body.svelte-mwxll1{border-top:1px solid var(--color-border, #2a2a3a);display:flex;flex-direction:column}.tool-call-item.svelte-mwxll1{padding:8px 10px;border-bottom:1px solid rgba(255,255,255,.03)}.tool-call-item.svelte-mwxll1:last-child{border-bottom:none}.tool-call-row.svelte-mwxll1{display:flex;align-items:center;gap:6px;margin-bottom:2px}.tool-call-index.svelte-mwxll1{width:16px;height:16px;border-radius:50%;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);font-size:9px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0}.tool-call-name.svelte-mwxll1{font-size:11px;font-weight:600;color:var(--color-accent, #ff6b35)}.tool-call-ok{color:#4ade80;flex-shrink:0}.tool-call-args.svelte-mwxll1{margin:4px 0 0 22px;display:flex;flex-direction:column;gap:1px}.tool-arg-line.svelte-mwxll1{display:flex;gap:6px;font-size:10px;line-height:1.5}.tool-arg-key.svelte-mwxll1{color:var(--color-text-secondary, #8888a0);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);flex-shrink:0}.tool-arg-val.svelte-mwxll1{color:var(--color-text-primary, #e8e8ed);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);word-break:break-word}.tool-call-result.svelte-mwxll1{margin:4px 0 0 22px;padding:4px 8px;background:#4ade800f;border-left:2px solid rgba(74,222,128,.3);border-radius:0 4px 4px 0;display:flex;gap:6px;font-size:10px;line-height:1.5}.tool-result-label.svelte-mwxll1{color:#4ade80;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-weight:600;flex-shrink:0}.tool-result-val.svelte-mwxll1{color:var(--color-text-secondary, #8888a0);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);word-break:break-word}.error-bar.svelte-mwxll1{display:flex;align-items:center;gap:8px;padding:6px 12px;background:#ef44441a;border-top:1px solid rgba(239,68,68,.2);font-size:11px;color:var(--color-error, #ef4444);flex-shrink:0}.retry-btn.svelte-mwxll1{margin-left:auto;padding:2px 10px;border:1px solid rgba(239,68,68,.3);border-radius:4px;background:#ef444426;color:var(--color-error, #ef4444);font-size:11px;cursor:pointer;white-space:nowrap}.retry-btn.svelte-mwxll1:hover{background:#ef444440}.input-area.svelte-mwxll1{flex-shrink:0;border-top:1px solid var(--color-border, #2a2a3a);padding:8px 12px;display:flex;flex-direction:column;gap:6px}.file-input-hidden.svelte-mwxll1{display:none}.attachment-badges.svelte-mwxll1{display:flex;flex-wrap:wrap;gap:6px}.attachment-badge.svelte-mwxll1{display:flex;align-items:center;gap:6px;padding:4px 8px;background:var(--color-bg-elevated, #1a1a26);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;max-width:200px;transition:border-color .15s}.attachment-badge.svelte-mwxll1:hover{border-color:var(--color-text-secondary, #8888a0)}.attachment-badge.has-preview.svelte-mwxll1{padding:3px 8px 3px 3px}.attachment-thumb.svelte-mwxll1{width:32px;height:32px;object-fit:cover;border-radius:5px;flex-shrink:0}.attachment-icon.svelte-mwxll1{width:28px;height:28px;border-radius:6px;background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);color:var(--color-accent, #ff6b35);display:flex;align-items:center;justify-content:center;flex-shrink:0}.attachment-info.svelte-mwxll1{display:flex;flex-direction:column;min-width:0}.attachment-name.svelte-mwxll1{font-size:11px;font-weight:500;color:var(--color-text-primary, #e8e8ed);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.attachment-badge-wrapper.svelte-mwxll1{position:relative}.attachment-type-btn.svelte-mwxll1{display:inline-flex;align-items:center;gap:3px;background:none;border:none;padding:0;cursor:pointer;font-size:9px;color:var(--color-text-secondary, #8888a0);transition:color .15s}.attachment-type-btn.svelte-mwxll1:hover{color:var(--color-accent, #ff6b35)}.type-dropdown.svelte-mwxll1{position:absolute;bottom:calc(100% + 4px);left:0;min-width:160px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;box-shadow:0 8px 24px #0006;z-index:100;overflow:hidden;padding:4px}.type-option.svelte-mwxll1{display:block;width:100%;text-align:left;padding:5px 10px;border:none;background:transparent;border-radius:5px;color:var(--color-text-primary, #e8e8ed);font-size:11px;cursor:pointer;transition:background .1s}.type-option.svelte-mwxll1:hover{background:#ffffff0f}.type-option.selected.svelte-mwxll1{color:var(--color-accent, #ff6b35);background:oklch(from var(--color-accent, #ff6b35) l c h / 10%)}.attachment-remove.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;background:transparent;border-radius:50%;color:var(--color-text-secondary, #8888a0);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.attachment-remove.svelte-mwxll1:hover{background:#ef444426;color:var(--color-error, #ef4444)}.input-row.svelte-mwxll1{display:flex;gap:4px;align-items:flex-end}.attach-btn.svelte-mwxll1{color:var(--color-text-secondary, #8888a0)}.attach-btn.svelte-mwxll1:hover:not(:disabled){color:var(--color-accent, #ff6b35)}.attach-container.svelte-mwxll1{position:relative}.attach-dropdown.svelte-mwxll1{position:absolute;bottom:calc(100% + 6px);left:0;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;box-shadow:0 8px 24px #0006;overflow:hidden;z-index:100;min-width:140px}.attach-option.svelte-mwxll1{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;background:none;border:none;color:var(--color-text-primary, #e8e8ed);font-size:12px;cursor:pointer;transition:background .1s}.attach-option.svelte-mwxll1:hover{background:var(--color-bg-elevated, #1a1a26)}.chat-input.svelte-mwxll1{flex:1;background:transparent;border:none;outline:none;color:var(--color-text-primary, #e8e8ed);font-size:13px;font-family:inherit;line-height:1.5;resize:none;padding:4px 0}.chat-input.svelte-mwxll1::placeholder{color:var(--color-text-secondary, #8888a0);opacity:.5}.chat-input.svelte-mwxll1:disabled{opacity:.5}.input-actions.svelte-mwxll1{display:flex;align-items:center;gap:4px;flex-shrink:0}.action-btn.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-mwxll1:hover:not(:disabled){background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-mwxll1:disabled{opacity:.3;cursor:default}.send-btn.svelte-mwxll1:not(:disabled){color:var(--color-accent, #ff6b35)}.send-btn.svelte-mwxll1:hover:not(:disabled){background:oklch(from var(--color-accent, #ff6b35) l c h / 12%)}.spin-icon{animation:svelte-mwxll1-chat-spin 1s linear infinite}@keyframes svelte-mwxll1-chat-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.message-content.markdown.svelte-mwxll1 .code-block-wrapper{position:relative;margin:8px 0;border-radius:8px;overflow:hidden;border:1px solid var(--color-border, #2a2a3a)}.message-content.markdown.svelte-mwxll1 .code-block-header{display:flex;align-items:center;justify-content:space-between;padding:4px 10px;background:#ffffff08;border-bottom:1px solid var(--color-border, #2a2a3a)}.message-content.markdown.svelte-mwxll1 .code-lang{font-size:10px;font-weight:600;color:var(--color-text-secondary, #8888a0);text-transform:uppercase;letter-spacing:.04em}.message-content.markdown.svelte-mwxll1 .code-copy-btn{font-size:10px;font-weight:500;color:var(--color-text-secondary, #8888a0);background:none;border:1px solid var(--color-border, #2a2a3a);border-radius:4px;padding:2px 8px;cursor:pointer;transition:color .15s,border-color .15s}.message-content.markdown.svelte-mwxll1 .code-copy-btn:hover{color:var(--color-text-primary, #e8e8ed);border-color:var(--color-text-secondary, #8888a0)}.message-content.markdown.svelte-mwxll1 .code-copy-btn[data-copied=true]{color:var(--color-success, #22c55e);border-color:var(--color-success, #22c55e)}.message-content.markdown.svelte-mwxll1 .code-block-wrapper pre{margin:0;border-radius:0;border:none}.message-content.markdown.svelte-mwxll1 .hljs{color:#abb2bf;background:#0000004d}.message-content.markdown.svelte-mwxll1 .hljs-keyword,.message-content.markdown.svelte-mwxll1 .hljs-selector-tag,.message-content.markdown.svelte-mwxll1 .hljs-literal,.message-content.markdown.svelte-mwxll1 .hljs-section,.message-content.markdown.svelte-mwxll1 .hljs-link{color:#c678dd}.message-content.markdown.svelte-mwxll1 .hljs-string,.message-content.markdown.svelte-mwxll1 .hljs-addition{color:#98c379}.message-content.markdown.svelte-mwxll1 .hljs-number,.message-content.markdown.svelte-mwxll1 .hljs-regexp,.message-content.markdown.svelte-mwxll1 .hljs-meta{color:#d19a66}.message-content.markdown.svelte-mwxll1 .hljs-comment,.message-content.markdown.svelte-mwxll1 .hljs-quote{color:#5c6370;font-style:italic}.message-content.markdown.svelte-mwxll1 .hljs-title,.message-content.markdown.svelte-mwxll1 .hljs-name{color:#61afef}.message-content.markdown.svelte-mwxll1 .hljs-variable,.message-content.markdown.svelte-mwxll1 .hljs-template-variable{color:#e06c75}.message-content.markdown.svelte-mwxll1 .hljs-built_in,.message-content.markdown.svelte-mwxll1 .hljs-type{color:#e6c07b}.message-content.markdown.svelte-mwxll1 .hljs-attr,.message-content.markdown.svelte-mwxll1 .hljs-attribute{color:#d19a66}.message-content.markdown.svelte-mwxll1 .hljs-deletion{color:#e06c75}.message-content.markdown.svelte-mwxll1 .hljs-params{color:#abb2bf}.message-content.markdown.svelte-mwxll1 .hljs-function{color:#61afef}.plan-card.svelte-mwxll1{flex-shrink:0;margin:0 10px 8px;border:1px solid var(--color-border, #2a2a3a);border-radius:12px;background:var(--color-bg-elevated, #1a1a26);overflow:hidden;animation:svelte-mwxll1-planSlideUp .25s ease-out;max-height:min(55vh,440px);display:flex;flex-direction:column;box-shadow:0 4px 20px #00000040}@keyframes svelte-mwxll1-planSlideUp{0%{transform:translateY(12px);opacity:0}to{transform:translateY(0);opacity:1}}.plan-header.svelte-mwxll1{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.plan-header-left.svelte-mwxll1{display:flex;align-items:center;gap:7px}.plan-icon.svelte-mwxll1{width:22px;height:22px;border-radius:6px;background:oklch(from var(--color-accent, #ff6b35) l c h / 12%);color:var(--color-accent, #ff6b35);display:flex;align-items:center;justify-content:center;flex-shrink:0}.plan-title.svelte-mwxll1{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed);letter-spacing:.02em}.plan-dismiss.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;border-radius:5px;color:var(--color-text-secondary, #8888a0);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.plan-dismiss.svelte-mwxll1:hover{background:#ffffff14;color:var(--color-text-primary, #e8e8ed)}.plan-body.svelte-mwxll1{flex:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--color-border, #2a2a3a) transparent;padding:10px 12px 6px}.plan-summary.svelte-mwxll1{font-size:12px;line-height:1.55;color:var(--color-text-primary, #e8e8ed);margin:0 0 8px}.plan-steps.svelte-mwxll1{display:flex;flex-direction:column;gap:2px;margin:0 0 6px}.plan-step.svelte-mwxll1{display:flex;align-items:flex-start;gap:8px;padding:5px 8px;font-size:12px;line-height:1.5;color:var(--color-text-primary, #e8e8ed);border-radius:6px;transition:background .1s}.plan-step.svelte-mwxll1:hover{background:#ffffff08}.step-number.svelte-mwxll1{width:18px;height:18px;border-radius:5px;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);font-size:10px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px}.step-text.svelte-mwxll1{flex:1}.plan-question.svelte-mwxll1{font-size:12px;font-weight:500;color:var(--color-text-primary, #e8e8ed);margin:4px 0 2px;line-height:1.5}.plan-footer.svelte-mwxll1{flex-shrink:0;border-top:1px solid var(--color-border, #2a2a3a);padding:8px 10px;display:flex;flex-direction:column;gap:6px}.plan-options.svelte-mwxll1{display:flex;flex-direction:column;gap:4px}.plan-option-btn.svelte-mwxll1{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--color-border, #2a2a3a);border-radius:8px;background:var(--color-bg-secondary, #12121a);color:var(--color-text-primary, #e8e8ed);cursor:pointer;font-size:12px;line-height:1.4;text-align:left;transition:border-color .15s,background .15s}.plan-option-btn.svelte-mwxll1:hover{border-color:var(--color-accent, #ff6b35);background:oklch(from var(--color-accent, #ff6b35) l c h / 6%)}.plan-option-key.svelte-mwxll1{width:20px;height:20px;border-radius:5px;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);transition:background .15s,color .15s}.plan-option-btn.svelte-mwxll1:hover .plan-option-key:where(.svelte-mwxll1){background:oklch(from var(--color-accent, #ff6b35) l c h / 15%);color:var(--color-accent, #ff6b35)}.plan-option-text.svelte-mwxll1{flex:1}.plan-custom-input.svelte-mwxll1{display:flex;align-items:flex-end;gap:4px}.plan-answer-input.svelte-mwxll1{flex:1;background:var(--color-bg-primary, #0e0e14);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;color:var(--color-text-primary, #e8e8ed);font-size:12px;font-family:inherit;padding:7px 10px;resize:none;outline:none;transition:border-color .15s;box-sizing:border-box}.plan-answer-input.svelte-mwxll1:focus{border-color:var(--color-accent, #ff6b35)}.plan-answer-input.svelte-mwxll1::placeholder{color:var(--color-text-secondary, #8888a0);opacity:.4}.plan-send-btn.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.plan-send-btn.svelte-mwxll1:hover{background:oklch(from var(--color-accent, #ff6b35) l c h / 12%);color:var(--color-accent, #ff6b35)}.app-shell.svelte-vr1z90{display:flex;flex-direction:column;height:100vh;width:100vw;overflow:hidden;background:var(--color-bg-primary);color:var(--color-text-primary)}.home-content.svelte-vr1z90{flex:1;min-height:0;overflow:auto}.app-body.svelte-vr1z90{display:flex;flex:1;min-height:0}.app-content.svelte-vr1z90{flex:1;min-width:0;overflow:auto}.app-footer.svelte-vr1z90{height:34px;min-height:34px;display:flex;align-items:center;justify-content:center;gap:4px;font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);background:var(--color-bg-secondary);border-top:1px solid var(--color-border);opacity:.7;-webkit-user-select:none;user-select:none}.theme-toggle.svelte-vr1z90{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;border:1px solid var(--color-border);background:var(--color-bg-elevated);color:var(--color-text-secondary);cursor:pointer;transition:all .2s;margin-left:8px}.theme-toggle.svelte-vr1z90:hover{color:var(--color-text-primary);border-color:var(--color-accent)}.heart.svelte-vr1z90{color:#ef4444;display:inline-block;animation:svelte-vr1z90-heartbeat 1.2s ease-in-out infinite}@keyframes svelte-vr1z90-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.25)}30%{transform:scale(1)}45%{transform:scale(1.15)}60%{transform:scale(1)}} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/0.Dt_lC5bU.css b/studio-desktop/frontend-dist/_app/immutable/assets/0.Dt_lC5bU.css deleted file mode 100644 index ae0146fa..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/0.Dt_lC5bU.css +++ /dev/null @@ -1 +0,0 @@ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"Inter", system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, monospace;--spacing:.25rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg-primary:#0a0a0f;--color-bg-secondary:#12121a;--color-bg-elevated:#1a1a26;--color-border:#2a2a3a;--color-text-primary:#e8e8ed;--color-text-secondary:#8888a0;--color-accent:#ff6b35;--color-success:#22c55e;--color-error:#ef4444;--color-warning:#f59e0b;--color-info:#3b82f6;--color-node-agent:#6366f1;--color-node-tool:#8b5cf6;--color-node-reasoning:#ec4899;--color-node-pipeline:#06b6d4}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.relative{position:relative}.static{position:static}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.table-row{display:table-row}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}}html,body{height:100%;margin:0;padding:0;overflow:hidden}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--color-bg-primary)}::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-text-secondary)}:focus-visible{outline:2px solid oklch(from var(--color-accent) l c h / 60%);outline-offset:2px}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}.svelte-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.svelte-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.svelte-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.svelte-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.svelte-flow__pane{z-index:1}.svelte-flow__pane.draggable{cursor:grab}.svelte-flow__pane.dragging{cursor:grabbing}.svelte-flow__pane.selection{cursor:pointer}.svelte-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.svelte-flow__renderer{z-index:4}.svelte-flow__selection{z-index:6}.svelte-flow__nodesselection-rect:focus,.svelte-flow__nodesselection-rect:focus-visible{outline:none}.svelte-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.svelte-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.svelte-flow .svelte-flow__edges{position:absolute}.svelte-flow .svelte-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.svelte-flow__edge{pointer-events:visibleStroke}.svelte-flow__edge.selectable{cursor:pointer}.svelte-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.svelte-flow__edge.animated path.svelte-flow__edge-interaction{stroke-dasharray:none;animation:none}.svelte-flow__edge.inactive{pointer-events:none}.svelte-flow__edge.selected,.svelte-flow__edge:focus,.svelte-flow__edge:focus-visible{outline:none}.svelte-flow__edge.selected .svelte-flow__edge-path,.svelte-flow__edge.selectable:focus .svelte-flow__edge-path,.svelte-flow__edge.selectable:focus-visible .svelte-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.svelte-flow__edge-textwrapper{pointer-events:all}.svelte-flow__edge .svelte-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.svelte-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.svelte-flow__connection{pointer-events:none}.svelte-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.svelte-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.svelte-flow__nodes{pointer-events:none;transform-origin:0 0}.svelte-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.svelte-flow__node.selectable{cursor:pointer}.svelte-flow__node.draggable{cursor:grab;pointer-events:all}.svelte-flow__node.draggable.dragging{cursor:grabbing}.svelte-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.svelte-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.svelte-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.svelte-flow__handle.connectingfrom{pointer-events:all}.svelte-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.svelte-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.svelte-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.svelte-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.svelte-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.svelte-flow__edgeupdater{cursor:move;pointer-events:all}.svelte-flow__pane.selection .svelte-flow__panel{pointer-events:none}.svelte-flow__panel{position:absolute;z-index:5;margin:15px}.svelte-flow__panel.top{top:0}.svelte-flow__panel.bottom{bottom:0}.svelte-flow__panel.top.center,.svelte-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.svelte-flow__panel.left{left:0}.svelte-flow__panel.right{right:0}.svelte-flow__panel.left.center,.svelte-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.svelte-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.svelte-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.svelte-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.svelte-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.svelte-flow__minimap-svg{display:block}.svelte-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.svelte-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.svelte-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.svelte-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.svelte-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.svelte-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.svelte-flow__controls.horizontal{flex-direction:row}.svelte-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.svelte-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.svelte-flow__edge.updating .svelte-flow__edge-path{stroke:#777}.svelte-flow__edge-text{font-size:10px}.svelte-flow__node.selectable:focus,.svelte-flow__node.selectable:focus-visible{outline:none}.svelte-flow__node-input,.svelte-flow__node-default,.svelte-flow__node-output,.svelte-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.svelte-flow__node-input.selectable:hover,.svelte-flow__node-default.selectable:hover,.svelte-flow__node-output.selectable:hover,.svelte-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.svelte-flow__node-input.selectable.selected,.svelte-flow__node-input.selectable:focus,.svelte-flow__node-input.selectable:focus-visible,.svelte-flow__node-default.selectable.selected,.svelte-flow__node-default.selectable:focus,.svelte-flow__node-default.selectable:focus-visible,.svelte-flow__node-output.selectable.selected,.svelte-flow__node-output.selectable:focus,.svelte-flow__node-output.selectable:focus-visible,.svelte-flow__node-group.selectable.selected,.svelte-flow__node-group.selectable:focus,.svelte-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.svelte-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.svelte-flow__nodesselection-rect,.svelte-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.svelte-flow__nodesselection-rect:focus,.svelte-flow__nodesselection-rect:focus-visible,.svelte-flow__selection:focus,.svelte-flow__selection:focus-visible{outline:none}.svelte-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.svelte-flow__controls-button:disabled{pointer-events:none}.svelte-flow__controls-button:disabled svg{fill-opacity:.4}.svelte-flow__controls-button:last-child{border-bottom:none}.svelte-flow__controls.horizontal .svelte-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.svelte-flow__controls.horizontal .svelte-flow__controls-button:last-child{border-right:none}.svelte-flow__resize-control{position:absolute}.svelte-flow__resize-control.left,.svelte-flow__resize-control.right{cursor:ew-resize}.svelte-flow__resize-control.top,.svelte-flow__resize-control.bottom{cursor:ns-resize}.svelte-flow__resize-control.top.left,.svelte-flow__resize-control.bottom.right{cursor:nwse-resize}.svelte-flow__resize-control.bottom.left,.svelte-flow__resize-control.top.right{cursor:nesw-resize}.svelte-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.svelte-flow__resize-control.handle.left{left:0;top:50%}.svelte-flow__resize-control.handle.right{left:100%;top:50%}.svelte-flow__resize-control.handle.top{left:50%;top:0}.svelte-flow__resize-control.handle.bottom{left:50%;top:100%}.svelte-flow__resize-control.handle.top.left,.svelte-flow__resize-control.handle.bottom.left{left:0}.svelte-flow__resize-control.handle.top.right,.svelte-flow__resize-control.handle.bottom.right{left:100%}.svelte-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.svelte-flow__resize-control.line.left,.svelte-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.svelte-flow__resize-control.line.left{left:0;border-left-width:1px}.svelte-flow__resize-control.line.right{left:100%;border-right-width:1px}.svelte-flow__resize-control.line.top,.svelte-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.svelte-flow__resize-control.line.top{top:0;border-top-width:1px}.svelte-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.svelte-flow__edge-label{text-align:center;position:absolute;padding:2px;font-size:10px;color:var(--xy-edge-label-color, var(--xy-edge-label-color-default));background:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.svelte-flow__container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.share-backdrop.svelte-1vh905b{position:fixed;inset:0;z-index:9999;background:#0009;display:flex;align-items:flex-start;justify-content:center;padding-top:8vh;animation:svelte-1vh905b-share-backdrop-in .12s ease-out}@keyframes svelte-1vh905b-share-backdrop-in{0%{opacity:0}to{opacity:1}}.share-modal.svelte-1vh905b{width:520px;max-width:90vw;max-height:82vh;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:14px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 20px 60px #00000080,0 0 100px oklch(from var(--color-accent) l c h / 4%);animation:svelte-1vh905b-share-slide-in .15s ease-out}@keyframes svelte-1vh905b-share-slide-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.share-header.svelte-1vh905b{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--color-border)}.share-title.svelte-1vh905b{display:flex;align-items:center;gap:10px;font-family:var(--font-sans);font-size:15px;font-weight:600;color:var(--color-text-primary)}.share-close-hint.svelte-1vh905b{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.share-body.svelte-1vh905b{flex:1;overflow-y:auto;padding:16px 20px;display:flex;flex-direction:column;gap:16px}.tunnel-section.svelte-1vh905b{border:1px solid var(--color-border);border-radius:8px;padding:14px 16px;background:var(--color-bg-primary)}.tunnel-status-row.svelte-1vh905b{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.tunnel-status-info.svelte-1vh905b{display:flex;align-items:center;gap:8px}.tunnel-dot.svelte-1vh905b{width:8px;height:8px;border-radius:50%;background:var(--color-text-secondary);flex-shrink:0;transition:background .3s}.tunnel-dot.tunnel-dot-active.svelte-1vh905b{background:var(--color-success);box-shadow:0 0 8px color-mix(in srgb,var(--color-success) 50%,transparent)}.tunnel-label.svelte-1vh905b{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary)}.tunnel-toggle-btn.svelte-1vh905b{display:flex;align-items:center;gap:6px;padding:6px 12px;border:none;border-radius:6px;font-family:var(--font-sans);font-size:12px;font-weight:600;cursor:pointer;background:var(--color-accent);color:#fff;transition:opacity .15s}.tunnel-toggle-btn.svelte-1vh905b:hover:not(:disabled){opacity:.9}.tunnel-toggle-btn.svelte-1vh905b:disabled{opacity:.6;cursor:not-allowed}.tunnel-toggle-btn.tunnel-stop.svelte-1vh905b{background:#ef444426;color:var(--color-error);border:1px solid rgba(239,68,68,.3)}.tunnel-toggle-btn.tunnel-stop.svelte-1vh905b:hover:not(:disabled){background:#ef444440;opacity:1}.tunnel-desc.svelte-1vh905b{font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);margin:0;opacity:.7;line-height:1.5}.url-section.svelte-1vh905b{border:1px solid var(--color-border);border-radius:8px;padding:14px 16px;background:var(--color-bg-primary)}.url-label.svelte-1vh905b{display:block;font-family:var(--font-sans);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary);margin-bottom:8px}.url-row.svelte-1vh905b{display:flex;align-items:center;gap:8px;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:6px;padding:8px 10px}.url-value.svelte-1vh905b{flex:1;font-family:var(--font-mono);font-size:12px;color:var(--color-accent);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.copy-btn.svelte-1vh905b{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:var(--color-bg-elevated);border-radius:4px;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.copy-btn.svelte-1vh905b:hover{background:var(--color-border);color:var(--color-text-primary)}.url-hint.svelte-1vh905b{font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);margin:8px 0 0;opacity:.6}.share-footer.svelte-1vh905b{display:flex;align-items:center;justify-content:flex-end;padding:14px 20px;border-top:1px solid var(--color-border)}.btn-close.svelte-1vh905b{background:transparent;border:1px solid var(--color-border);border-radius:6px;padding:7px 16px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:background .15s}.btn-close.svelte-1vh905b:hover{background:var(--color-bg-elevated)}.spin-icon.svelte-1vh905b{display:flex;align-items:center;animation:svelte-1vh905b-spin 1s linear infinite}@keyframes svelte-1vh905b-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.top-bar.svelte-11yu8dz{height:48px;min-height:48px;display:flex;align-items:center;padding:0 12px;background:var(--color-bg-secondary);border-bottom:1px solid var(--color-border);-webkit-user-select:none;user-select:none;gap:8px}.top-bar-left.svelte-11yu8dz{display:flex;align-items:center;gap:8px;flex-shrink:0}.brand-link.svelte-11yu8dz{display:flex;align-items:center;gap:8px;text-decoration:none;border-radius:6px;padding:4px 6px;margin:-4px -6px;transition:background .15s}.brand-link.svelte-11yu8dz:hover{background:var(--color-bg-elevated)}.brand-logo.svelte-11yu8dz{width:24px;height:24px;border-radius:5px}.brand.svelte-11yu8dz{font-family:var(--font-sans);font-size:14px;font-weight:600;color:var(--color-accent);letter-spacing:-.01em}.conn-dot.svelte-11yu8dz{width:7px;height:7px;border-radius:50%;background:var(--color-text-secondary);flex-shrink:0;transition:background .3s}.conn-dot.conn-ok.svelte-11yu8dz{background:var(--color-success, #22c55e);box-shadow:0 0 6px oklch(from var(--color-success, #22c55e) l c h / 50%)}.conn-dot.conn-fail.svelte-11yu8dz{background:var(--color-error, #ef4444);box-shadow:0 0 6px oklch(from var(--color-error, #ef4444) l c h / 50%)}.conn-dot.conn-check.svelte-11yu8dz{animation:svelte-11yu8dz-conn-pulse 1s ease-in-out infinite}@keyframes svelte-11yu8dz-conn-pulse{0%,to{opacity:.3}50%{opacity:1}}.separator.svelte-11yu8dz{color:var(--color-text-secondary);font-size:14px;opacity:.5}.project-container.svelte-11yu8dz{position:relative}.project-selector.svelte-11yu8dz{display:flex;align-items:center;gap:6px;background:transparent;border:1px solid transparent;color:var(--color-text-primary);font-family:var(--font-mono);font-size:13px;padding:4px 10px 4px 8px;border-radius:6px;cursor:pointer;transition:background .15s,border-color .15s}.project-selector.svelte-11yu8dz:hover{background:var(--color-bg-elevated);border-color:var(--color-border)}.project-dot.svelte-11yu8dz{width:6px;height:6px;border-radius:50%;background:var(--color-accent);flex-shrink:0}.project-name.svelte-11yu8dz{font-weight:500}.project-chevron{color:var(--color-text-secondary);opacity:.6;flex-shrink:0}.project-backdrop.svelte-11yu8dz{position:fixed;inset:0;z-index:999}.project-dropdown.svelte-11yu8dz{position:absolute;top:calc(100% + 6px);left:0;width:260px;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:10px;box-shadow:0 12px 32px #0006;z-index:1000;overflow:hidden;animation:svelte-11yu8dz-dropdown-in .15s ease}@keyframes svelte-11yu8dz-dropdown-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.dropdown-header.svelte-11yu8dz{display:flex;align-items:center;justify-content:space-between;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);padding:10px 12px 6px}.dropdown-count.svelte-11yu8dz{font-size:9px;font-weight:600;min-width:16px;height:16px;display:flex;align-items:center;justify-content:center;border-radius:8px;background:var(--color-bg-elevated);color:var(--color-text-secondary)}.dropdown-items.svelte-11yu8dz{max-height:240px;overflow-y:auto;padding:2px 4px;scrollbar-width:thin;scrollbar-color:var(--color-border) transparent}.dropdown-item.svelte-11yu8dz{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;background:none;border:none;border-radius:6px;color:var(--color-text-primary);font-family:var(--font-mono);font-size:12px;cursor:pointer;text-align:left;transition:background .1s}.dropdown-item.svelte-11yu8dz:hover{background:var(--color-bg-elevated)}.dropdown-item.active.svelte-11yu8dz{color:var(--color-accent);background:oklch(from var(--color-accent) l c h / 8%)}.dropdown-item-dot.svelte-11yu8dz{width:6px;height:6px;border-radius:50%;background:var(--color-border);flex-shrink:0;transition:background .15s}.dropdown-item-dot.dot-active.svelte-11yu8dz{background:var(--color-accent);box-shadow:0 0 6px oklch(from var(--color-accent) l c h / 40%)}.dropdown-item-name.svelte-11yu8dz{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-item-delete.svelte-11yu8dz{display:flex;align-items:center;background:none;border:none;color:var(--color-text-secondary);cursor:pointer;padding:2px;border-radius:4px;opacity:0;transition:opacity .15s,color .15s}.dropdown-item.svelte-11yu8dz:hover .dropdown-item-delete:where(.svelte-11yu8dz){opacity:1}.dropdown-item-delete.svelte-11yu8dz:hover{color:var(--color-error)}.dropdown-create.svelte-11yu8dz{display:flex;align-items:center;gap:6px;padding:8px;border-top:1px solid var(--color-border)}.dropdown-input.svelte-11yu8dz{flex:1;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;padding:6px 10px;font-family:var(--font-mono);font-size:12px;color:var(--color-text-primary);outline:none;transition:border-color .15s}.dropdown-input.svelte-11yu8dz:focus{border-color:var(--color-accent)}.dropdown-input.svelte-11yu8dz::placeholder{color:var(--color-text-secondary);opacity:.5}.dropdown-create-btn.svelte-11yu8dz{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:var(--color-accent);color:#fff;border:none;border-radius:6px;cursor:pointer;flex-shrink:0;transition:opacity .15s}.dropdown-create-btn.svelte-11yu8dz:hover:not(:disabled){opacity:.9}.dropdown-create-btn.svelte-11yu8dz:disabled{opacity:.4;cursor:not-allowed}.dropdown-active-label.svelte-11yu8dz{font-size:9px;font-weight:600;color:var(--color-accent);background:oklch(from var(--color-accent) l c h / 10%);padding:1px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.04em;margin-left:auto}.dropdown-confirm-delete.svelte-11yu8dz{padding:14px 12px;text-align:center}.confirm-delete-msg.svelte-11yu8dz{font-size:13px;color:var(--color-text-primary);margin:0 0 4px}.confirm-delete-warn.svelte-11yu8dz{font-size:11px;color:var(--color-text-secondary);margin:0 0 12px;opacity:.7}.confirm-delete-actions.svelte-11yu8dz{display:flex;gap:8px;justify-content:center}.confirm-cancel-btn.svelte-11yu8dz{padding:5px 14px;border:1px solid var(--color-border);border-radius:6px;background:transparent;color:var(--color-text-secondary);font-size:12px;cursor:pointer;transition:background .15s}.confirm-cancel-btn.svelte-11yu8dz:hover{background:var(--color-bg-elevated);color:var(--color-text-primary)}.confirm-delete-btn.svelte-11yu8dz{padding:5px 14px;border:1px solid rgba(239,68,68,.3);border-radius:6px;background:#ef444426;color:var(--color-error, #ef4444);font-size:12px;font-weight:600;cursor:pointer;transition:background .15s}.confirm-delete-btn.svelte-11yu8dz:hover{background:#ef444440}.btn-save.svelte-11yu8dz{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:transparent;border:none;color:var(--color-text-secondary);border-radius:6px;cursor:pointer;transition:background .15s,color .15s}.btn-save.svelte-11yu8dz:hover{background:var(--color-bg-elevated);color:var(--color-text-primary)}.top-bar-spacer.svelte-11yu8dz{flex:1}@media(max-width:850px){.brand.svelte-11yu8dz{display:none}}.top-bar-right.svelte-11yu8dz{display:flex;align-items:center;gap:4px;flex-shrink:0}.btn-run.svelte-11yu8dz{display:flex;align-items:center;gap:6px;background:var(--color-accent);color:#fff;border:none;padding:5px 12px;border-radius:6px;font-family:var(--font-sans);font-size:12px;font-weight:600;cursor:pointer;transition:opacity .15s,background .3s ease}.btn-run.svelte-11yu8dz:hover:not(:disabled){opacity:.9}.btn-run.svelte-11yu8dz:disabled{cursor:not-allowed;opacity:.7}.btn-run-active.svelte-11yu8dz{background:var(--color-success)}.btn-runtime.svelte-11yu8dz{display:flex;align-items:center;gap:5px;background:transparent;border:1px solid var(--color-border);color:var(--color-text-secondary);padding:4px 10px;border-radius:6px;font-family:var(--font-sans);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.btn-runtime.svelte-11yu8dz:hover:not(:disabled){background:var(--color-bg-elevated);color:var(--color-text-primary)}.btn-runtime.svelte-11yu8dz:disabled{opacity:.5;cursor:not-allowed}.btn-runtime.runtime-running.svelte-11yu8dz{border-color:color-mix(in srgb,var(--color-success) 40%,transparent);color:var(--color-success)}.btn-runtime.runtime-error.svelte-11yu8dz{border-color:color-mix(in srgb,var(--color-error) 40%,transparent);color:var(--color-error)}.btn-runtime.runtime-starting.svelte-11yu8dz{border-color:color-mix(in srgb,#f59e0b 40%,transparent);color:#f59e0b}.runtime-dot.svelte-11yu8dz{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .3s}.runtime-dot.rt-stopped.svelte-11yu8dz{background:var(--color-text-secondary)}.runtime-dot.rt-running.svelte-11yu8dz{background:var(--color-success);box-shadow:0 0 6px color-mix(in srgb,var(--color-success) 50%,transparent)}.runtime-dot.rt-error.svelte-11yu8dz{background:var(--color-error);box-shadow:0 0 6px color-mix(in srgb,var(--color-error) 50%,transparent)}.runtime-dot.rt-starting.svelte-11yu8dz{background:#f59e0b;animation:svelte-11yu8dz-runtime-pulse 1s ease-in-out infinite}@keyframes svelte-11yu8dz-runtime-pulse{0%,to{opacity:.4}50%{opacity:1}}.btn-icon.svelte-11yu8dz{position:relative;display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:transparent;border:none;color:var(--color-text-secondary);border-radius:6px;cursor:pointer;transition:background .15s,color .15s}.btn-icon.svelte-11yu8dz:hover:not(:disabled){background:var(--color-bg-elevated);color:var(--color-text-primary)}.btn-icon.svelte-11yu8dz:disabled{cursor:not-allowed;opacity:.5}.btn-debug-active.svelte-11yu8dz{color:var(--color-warning)}.architect-active.svelte-11yu8dz{color:var(--color-accent);background:oklch(from var(--color-accent) l c h / 10%)}.divider.svelte-11yu8dz{width:1px;height:20px;background:var(--color-border);margin:0 4px}.pulse-dot.svelte-11yu8dz{width:6px;height:6px;border-radius:50%;background:#fff;animation:svelte-11yu8dz-pulse-indicator 1s ease-in-out infinite}.debug-dot.svelte-11yu8dz{position:absolute;top:4px;right:4px;width:5px;height:5px;background:var(--color-warning)}@keyframes svelte-11yu8dz-pulse-indicator{0%,to{opacity:.4}50%{opacity:1}}.spin-icon.svelte-11yu8dz{display:flex;align-items:center;animation:svelte-11yu8dz-spin 1s linear infinite}@keyframes svelte-11yu8dz-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.run-dialog-backdrop.svelte-11yu8dz{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:10000}.run-dialog.svelte-11yu8dz{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:14px;padding:24px;width:480px;max-width:90vw;box-shadow:0 20px 60px #00000080}.run-dialog-title.svelte-11yu8dz{font-size:16px;font-weight:600;color:var(--color-text-primary);margin:0 0 4px}.run-dialog-hint.svelte-11yu8dz{font-size:12px;color:var(--color-text-secondary);margin:0 0 14px}.run-dialog-input.svelte-11yu8dz{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:8px;padding:10px 12px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);resize:vertical;outline:none;box-sizing:border-box}.run-dialog-input.svelte-11yu8dz:focus{border-color:var(--color-accent)}.run-dialog-input.svelte-11yu8dz::placeholder{color:var(--color-text-secondary);opacity:.5}.run-dialog-actions.svelte-11yu8dz{display:flex;justify-content:flex-end;gap:8px;margin-top:14px}.run-dialog-cancel.svelte-11yu8dz{background:transparent;border:1px solid var(--color-border);border-radius:6px;padding:7px 14px;font-size:12px;color:var(--color-text-secondary);cursor:pointer}.run-dialog-go.svelte-11yu8dz{display:flex;align-items:center;gap:6px;background:var(--color-accent);border:none;border-radius:6px;padding:7px 16px;font-size:12px;font-weight:600;color:#fff;cursor:pointer}.run-dialog-go.svelte-11yu8dz:hover{opacity:.9}.command-palette-backdrop.svelte-1g6akjj{position:fixed;inset:0;z-index:9999;background:#0009;display:flex;align-items:flex-start;justify-content:center;padding-top:15vh;animation:svelte-1g6akjj-backdrop-fade-in .12s ease-out}@keyframes svelte-1g6akjj-backdrop-fade-in{0%{opacity:0}to{opacity:1}}.command-palette.svelte-1g6akjj{width:560px;max-width:90vw;max-height:480px;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:12px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 16px 48px #0009,0 0 80px color-mix(in srgb,var(--color-accent) 4%,transparent);animation:svelte-1g6akjj-palette-slide-in .15s ease-out}@keyframes svelte-1g6akjj-palette-slide-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.command-palette-input-wrapper.svelte-1g6akjj{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--color-border);color:var(--color-text-secondary)}.command-palette-input.svelte-1g6akjj{flex:1;background:transparent;border:none;outline:none;color:var(--color-text-primary);font-family:var(--font-sans);font-size:15px;line-height:1;caret-color:var(--color-accent)}.command-palette-input.svelte-1g6akjj::placeholder{color:var(--color-text-secondary);opacity:.6}.command-palette-kbd.svelte-1g6akjj{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.command-palette-results.svelte-1g6akjj{flex:1;overflow-y:auto;padding:6px}.command-palette-empty.svelte-1g6akjj{padding:32px 16px;text-align:center;color:var(--color-text-secondary);font-size:13px;font-family:var(--font-sans)}.command-palette-category.svelte-1g6akjj{font-family:var(--font-sans);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-secondary);padding:10px 10px 4px;-webkit-user-select:none;user-select:none}.command-palette-item.svelte-1g6akjj{display:flex;align-items:center;gap:10px;width:100%;padding:8px 10px;background:transparent;border:none;border-radius:8px;cursor:pointer;transition:background .08s ease;text-align:left}.command-palette-item.svelte-1g6akjj:hover,.command-palette-item.selected.svelte-1g6akjj{background:var(--color-bg-elevated)}.command-palette-item.selected.svelte-1g6akjj{outline:1px solid rgba(255,255,255,.06)}.command-palette-item-icon.svelte-1g6akjj{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;background:#ffffff0a;color:var(--color-text-secondary);flex-shrink:0}.command-palette-item.selected.svelte-1g6akjj .command-palette-item-icon:where(.svelte-1g6akjj){color:var(--color-accent);background:color-mix(in srgb,var(--color-accent) 10%,transparent)}.command-palette-item-label.svelte-1g6akjj{font-family:var(--font-sans);font-size:13px;font-weight:500;color:var(--color-text-primary);flex:1}.command-palette-item-shortcut.svelte-1g6akjj{font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.command-palette-footer.svelte-1g6akjj{display:flex;align-items:center;gap:16px;padding:10px 16px;border-top:1px solid var(--color-border)}.command-palette-hint.svelte-1g6akjj{display:flex;align-items:center;gap:4px;font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);opacity:.7}.command-palette-hint.svelte-1g6akjj kbd:where(.svelte-1g6akjj){font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:3px;padding:1px 4px;line-height:1.4}.shortcuts-backdrop.svelte-9545z7{position:fixed;inset:0;z-index:9999;background:#0009;display:flex;align-items:flex-start;justify-content:center;padding-top:12vh;animation:svelte-9545z7-shortcuts-backdrop-in .12s ease-out}@keyframes svelte-9545z7-shortcuts-backdrop-in{0%{opacity:0}to{opacity:1}}.shortcuts-modal.svelte-9545z7{width:480px;max-width:90vw;max-height:70vh;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:12px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 16px 48px #0009,0 0 80px color-mix(in srgb,var(--color-accent) 4%,transparent);animation:svelte-9545z7-shortcuts-slide-in .15s ease-out}@keyframes svelte-9545z7-shortcuts-slide-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.shortcuts-header.svelte-9545z7{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--color-border)}.shortcuts-title.svelte-9545z7{display:flex;align-items:center;gap:10px;font-family:var(--font-sans);font-size:15px;font-weight:600;color:var(--color-text-primary)}.shortcuts-close-hint.svelte-9545z7{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.shortcuts-body.svelte-9545z7{flex:1;overflow-y:auto;padding:8px 20px 20px}.shortcuts-group.svelte-9545z7{margin-top:12px}.shortcuts-category.svelte-9545z7{font-family:var(--font-sans);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-secondary);padding:4px 0 8px;-webkit-user-select:none;user-select:none}.shortcuts-row.svelte-9545z7{display:flex;align-items:center;justify-content:space-between;padding:7px 0;border-bottom:1px solid rgba(255,255,255,.04)}.shortcuts-row.svelte-9545z7:last-child{border-bottom:none}.shortcuts-description.svelte-9545z7{font-family:var(--font-sans);font-size:13px;font-weight:400;color:var(--color-text-primary)}.shortcuts-keys.svelte-9545z7{display:flex;align-items:center;gap:4px;flex-shrink:0}.shortcuts-kbd.svelte-9545z7{font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:4px;padding:2px 7px;line-height:1.4;white-space:nowrap}.shortcuts-separator.svelte-9545z7{font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);opacity:.5}.settings-backdrop.svelte-1hvu725{position:fixed;inset:0;z-index:9999;background:#0009;display:flex;align-items:flex-start;justify-content:center;padding-top:8vh;animation:svelte-1hvu725-settings-backdrop-in .12s ease-out}@keyframes svelte-1hvu725-settings-backdrop-in{0%{opacity:0}to{opacity:1}}.settings-modal.svelte-1hvu725{width:640px;max-width:90vw;max-height:82vh;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:14px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 20px 60px #00000080,0 0 100px oklch(from var(--color-accent) l c h / 4%);animation:svelte-1hvu725-settings-slide-in .15s ease-out}@keyframes svelte-1hvu725-settings-slide-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.settings-header.svelte-1hvu725{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--color-border)}.settings-title.svelte-1hvu725{display:flex;align-items:center;gap:10px;font-family:var(--font-sans);font-size:15px;font-weight:600;color:var(--color-text-primary)}.settings-close-hint.svelte-1hvu725{font-family:var(--font-mono);font-size:10px;font-weight:500;color:var(--color-text-secondary);background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;line-height:1.4}.settings-tabs.svelte-1hvu725{display:flex;border-bottom:1px solid var(--color-border);padding:0 20px}.settings-tab.svelte-1hvu725{background:transparent;border:none;border-bottom:2px solid transparent;color:var(--color-text-secondary);font-family:var(--font-sans);font-size:13px;font-weight:500;padding:10px 16px;cursor:pointer;transition:color .15s,border-color .15s}.settings-tab.svelte-1hvu725:hover{color:var(--color-text-primary)}.settings-tab.active.svelte-1hvu725{color:var(--color-accent);border-bottom-color:var(--color-accent)}.settings-body.svelte-1hvu725{flex:1;overflow-y:auto;padding:16px 20px}.providers-list.svelte-1hvu725{display:flex;flex-direction:column;gap:12px}.provider-section.svelte-1hvu725{border:1px solid var(--color-border);border-radius:8px;padding:14px 16px;background:var(--color-bg-primary);transition:border-color .15s}.provider-section.configured.svelte-1hvu725{border-color:oklch(from var(--color-success) l c h / 30%);background:oklch(from var(--color-success) l c h / 3%)}.provider-header.svelte-1hvu725{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.provider-name.svelte-1hvu725{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary)}.provider-badge.svelte-1hvu725{display:flex;align-items:center;gap:4px;font-family:var(--font-sans);font-size:10px;font-weight:600;color:var(--color-success);background:color-mix(in srgb,var(--color-success) 12%,transparent);border-radius:4px;padding:2px 8px}.provider-field.svelte-1hvu725{margin-top:8px}.field-label.svelte-1hvu725{display:block;font-family:var(--font-sans);font-size:11px;font-weight:500;color:var(--color-text-secondary);margin-bottom:4px}.field-optional.svelte-1hvu725{opacity:.5;font-weight:400}.field-input.svelte-1hvu725{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;padding:8px 10px;font-family:var(--font-mono);font-size:12px;color:var(--color-text-primary);outline:none;transition:border-color .15s;box-sizing:border-box}.field-text.svelte-1hvu725{font-family:var(--font-sans);font-size:13px}.field-input.svelte-1hvu725:focus{border-color:var(--color-accent)}.field-input.svelte-1hvu725::placeholder{color:var(--color-text-secondary);opacity:.5}.field-textarea.svelte-1hvu725{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;padding:8px 10px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);outline:none;transition:border-color .15s;box-sizing:border-box;resize:vertical;min-height:60px}.field-textarea.svelte-1hvu725:focus{border-color:var(--color-accent)}.field-textarea.svelte-1hvu725::placeholder{color:var(--color-text-secondary);opacity:.5}.field-range.svelte-1hvu725{width:100%;accent-color:var(--color-accent)}.model-defaults.svelte-1hvu725{display:flex;flex-direction:column;gap:16px}.profile-section.svelte-1hvu725{border:1px solid var(--color-border);border-radius:8px;padding:16px;background:var(--color-bg-primary)}.section-title.svelte-1hvu725{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary);margin:0 0 4px}.section-desc.svelte-1hvu725{font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);margin:0 0 12px;opacity:.7}.profile-row.svelte-1hvu725{display:flex;gap:12px}.profile-half.svelte-1hvu725{flex:1}.settings-footer.svelte-1hvu725{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;border-top:1px solid var(--color-border)}.btn-cancel.svelte-1hvu725{background:transparent;border:1px solid var(--color-border);border-radius:6px;padding:7px 16px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:background .15s}.btn-cancel.svelte-1hvu725:hover{background:var(--color-bg-elevated)}.btn-save.svelte-1hvu725{background:var(--color-accent);border:none;border-radius:6px;padding:7px 16px;font-family:var(--font-sans);font-size:12px;font-weight:600;color:#fff;cursor:pointer;transition:opacity .15s}.btn-save.svelte-1hvu725:hover:not(:disabled){opacity:.9}.btn-save.svelte-1hvu725:disabled{opacity:.6;cursor:not-allowed}.wizard-backdrop.svelte-tj3wu{position:fixed;inset:0;z-index:10000;background:#000000bf;display:flex;align-items:center;justify-content:center;animation:svelte-tj3wu-wizard-backdrop-in .2s ease-out}@keyframes svelte-tj3wu-wizard-backdrop-in{0%{opacity:0}to{opacity:1}}.wizard-modal.svelte-tj3wu{width:580px;max-width:90vw;max-height:85vh;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:16px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 0 0 1px #ffffff0a,0 24px 64px #000000b3,0 0 120px color-mix(in srgb,var(--color-accent) 6%,transparent);animation:svelte-tj3wu-wizard-slide-in .25s ease-out}@keyframes svelte-tj3wu-wizard-slide-in{0%{opacity:0;transform:translateY(16px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}.wizard-progress.svelte-tj3wu{display:flex;align-items:center;padding:20px 32px 0}.wizard-step-indicator.svelte-tj3wu{display:flex;align-items:center;flex:1}.wizard-step-indicator.svelte-tj3wu:last-child{flex:0}.wizard-step-dot.svelte-tj3wu{width:24px;height:24px;border-radius:50%;background:var(--color-bg-elevated);border:2px solid var(--color-border);display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary);font-size:11px;font-weight:600;flex-shrink:0;transition:all .2s ease}.wizard-step-num.svelte-tj3wu{font-family:var(--font-sans)}.wizard-step-indicator.active.svelte-tj3wu .wizard-step-dot:where(.svelte-tj3wu){border-color:var(--color-accent);background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent)}.wizard-step-indicator.completed.svelte-tj3wu .wizard-step-dot:where(.svelte-tj3wu){border-color:var(--color-success);background:var(--color-success);color:#fff}.wizard-step-line.svelte-tj3wu{flex:1;height:2px;background:var(--color-border);margin:0 6px;transition:background .2s}.wizard-step-line.filled.svelte-tj3wu{background:var(--color-success)}.wizard-body.svelte-tj3wu{flex:1;overflow-y:auto;padding:24px 32px}.wizard-welcome.svelte-tj3wu{display:flex;flex-direction:column;align-items:center;text-align:center;padding:16px 0}.wizard-logo.svelte-tj3wu{width:64px;height:64px;border-radius:14px;margin-bottom:20px}.wizard-heading.svelte-tj3wu{font-family:var(--font-sans);font-size:22px;font-weight:700;color:var(--color-text-primary);margin:0 0 8px}.wizard-text.svelte-tj3wu{font-family:var(--font-sans);font-size:13px;color:var(--color-text-secondary);margin:0 0 16px;line-height:1.6}.wizard-text.svelte-tj3wu strong:where(.svelte-tj3wu){color:var(--color-text-primary);font-weight:600}.wizard-text-subtle.svelte-tj3wu{font-size:12px;opacity:.7;margin-top:-8px}.wizard-text.svelte-tj3wu code:where(.svelte-tj3wu){font-family:var(--font-mono);font-size:11px;background:var(--color-bg-elevated);padding:2px 6px;border-radius:4px}.wizard-features.svelte-tj3wu{display:flex;gap:16px;margin-top:8px}.wizard-feature.svelte-tj3wu{display:flex;align-items:center;gap:6px;font-family:var(--font-sans);font-size:12px;color:var(--color-text-secondary);background:#ffffff08;padding:8px 14px;border-radius:8px;border:1px solid var(--color-border)}.wizard-step-title.svelte-tj3wu{font-family:var(--font-sans);font-size:16px;font-weight:600;color:var(--color-text-primary);margin:0 0 4px}.wizard-hint.svelte-tj3wu{font-family:var(--font-sans);font-size:12px;color:var(--color-warning);margin:12px 0 0;text-align:center}.wizard-providers-grid.svelte-tj3wu{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}.wizard-provider-card.svelte-tj3wu{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:16px 12px 14px;background:#ffffff05;border:1px solid var(--color-border);border-radius:10px;cursor:pointer;transition:border-color .15s,background .15s,transform .1s}.wizard-provider-card.svelte-tj3wu:hover{background:#ffffff0a;transform:translateY(-1px)}.wizard-provider-card.selected.svelte-tj3wu{border-color:var(--color-accent);background:color-mix(in srgb,var(--color-accent) 6%,transparent)}.wizard-provider-check.svelte-tj3wu{position:absolute;top:6px;right:6px;display:flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;background:var(--color-accent);color:#fff}.wizard-provider-label.svelte-tj3wu{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary)}.wizard-provider-desc.svelte-tj3wu{font-family:var(--font-sans);font-size:10px;color:var(--color-text-secondary);opacity:.7}.wizard-keys-list.svelte-tj3wu{display:flex;flex-direction:column;gap:12px}.wizard-key-section.svelte-tj3wu{border:1px solid var(--color-border);border-radius:10px;padding:14px 16px;background:#ffffff05}.wizard-key-provider.svelte-tj3wu{font-family:var(--font-sans);font-size:13px;font-weight:600;color:var(--color-text-primary)}.wizard-key-field.svelte-tj3wu{margin-top:10px}.wizard-key-label.svelte-tj3wu{display:block;font-family:var(--font-sans);font-size:11px;font-weight:500;color:var(--color-text-secondary);margin-bottom:4px}.wizard-key-input.svelte-tj3wu{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;padding:8px 10px;font-family:var(--font-mono);font-size:12px;color:var(--color-text-primary);outline:none;transition:border-color .15s;box-sizing:border-box}.wizard-text-input.svelte-tj3wu{font-family:var(--font-sans);font-size:13px}.wizard-key-input.svelte-tj3wu:focus{border-color:var(--color-accent)}.wizard-key-input.svelte-tj3wu::placeholder{color:var(--color-text-secondary);opacity:.5}.wizard-defaults.svelte-tj3wu{display:flex;flex-direction:column;gap:12px}.wizard-default-card.svelte-tj3wu{border:1px solid var(--color-border);border-radius:10px;padding:14px 16px;background:#ffffff05}.wizard-defaults-row.svelte-tj3wu{display:flex;gap:12px}.wizard-default-half.svelte-tj3wu{flex:1}.wizard-model-hint.svelte-tj3wu{display:block;font-family:var(--font-sans);font-size:10px;color:var(--color-text-secondary);margin-top:6px;opacity:.7}.wizard-optional.svelte-tj3wu{opacity:.5;font-weight:400}.wizard-textarea.svelte-tj3wu{width:100%;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;padding:8px 10px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);outline:none;transition:border-color .15s;box-sizing:border-box;resize:vertical;min-height:60px}.wizard-textarea.svelte-tj3wu:focus{border-color:var(--color-accent)}.wizard-textarea.svelte-tj3wu::placeholder{color:var(--color-text-secondary);opacity:.5}.wizard-range-wrapper.svelte-tj3wu{display:flex;align-items:center;gap:10px}.wizard-range.svelte-tj3wu{flex:1;accent-color:var(--color-accent)}.wizard-range-value.svelte-tj3wu{font-family:var(--font-mono);font-size:12px;color:var(--color-accent);font-weight:600;min-width:32px;text-align:right}.wizard-done-icon.svelte-tj3wu{display:flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:50%;background:color-mix(in srgb,var(--color-success) 14%,transparent);color:var(--color-success);margin-bottom:16px}.wizard-footer.svelte-tj3wu{display:flex;align-items:center;justify-content:space-between;padding:14px 24px;border-top:1px solid var(--color-border)}.wizard-footer-left.svelte-tj3wu{display:flex;align-items:center;gap:8px}.wizard-btn-skip.svelte-tj3wu{background:transparent;border:none;padding:7px 12px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:color .15s}.wizard-btn-skip.svelte-tj3wu:hover{color:var(--color-text-primary)}.wizard-btn-back.svelte-tj3wu{background:transparent;border:1px solid var(--color-border);border-radius:6px;padding:7px 14px;font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--color-text-secondary);cursor:pointer;transition:background .15s}.wizard-btn-back.svelte-tj3wu:hover{background:var(--color-bg-elevated)}.wizard-btn-next.svelte-tj3wu{background:var(--color-accent);border:none;border-radius:6px;padding:7px 18px;font-family:var(--font-sans);font-size:12px;font-weight:600;color:#fff;cursor:pointer;transition:opacity .15s}.wizard-btn-next.svelte-tj3wu:hover:not(:disabled){opacity:.9}.wizard-btn-next.svelte-tj3wu:disabled{opacity:.4;cursor:not-allowed}.wizard-btn-launch.svelte-tj3wu{display:flex;align-items:center;gap:6px;padding:8px 20px}.toast-container.svelte-lxvwit{position:fixed;bottom:24px;right:24px;z-index:20000;display:flex;flex-direction:column-reverse;gap:8px;max-width:400px}.toast.svelte-lxvwit{display:flex;align-items:center;gap:10px;padding:12px 16px;background:var(--color-bg-secondary);border:1px solid oklch(from var(--toast-color) l c h / 30%);border-left:3px solid var(--toast-color);border-radius:8px;box-shadow:0 8px 24px #0006;animation:svelte-lxvwit-toast-in .2s ease-out}@keyframes svelte-lxvwit-toast-in{0%{opacity:0;transform:translateY(8px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}.toast-icon.svelte-lxvwit{display:flex;align-items:center;color:var(--toast-color);flex-shrink:0}.toast-message.svelte-lxvwit{flex:1;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);line-height:1.4}.toast-close.svelte-lxvwit{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:none;border:none;border-radius:4px;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.toast-close.svelte-lxvwit:hover{background:#ffffff0f;color:var(--color-text-primary)}.architect-sidebar.svelte-mwxll1{position:relative;min-width:280px;background:var(--color-bg-secondary, #12121a);border-right:1px solid var(--color-border, #2a2a3a);display:flex;flex-direction:column;overflow:hidden;flex-shrink:0;animation:svelte-mwxll1-sidebarSlideIn .2s ease-out}.architect-sidebar.dragging.svelte-mwxll1{-webkit-user-select:none;user-select:none}@keyframes svelte-mwxll1-sidebarSlideIn{0%{transform:translate(-20px);opacity:0}to{transform:translate(0);opacity:1}}.sidebar-header.svelte-mwxll1{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.header-left.svelte-mwxll1{display:flex;align-items:center;gap:8px}.header-icon-circle.svelte-mwxll1{width:28px;height:28px;border-radius:50%;background:oklch(from var(--color-accent, #ff6b35) l c h / 12%);color:var(--color-accent, #ff6b35);display:flex;align-items:center;justify-content:center;flex-shrink:0}.header-name.svelte-mwxll1{font-size:13px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.collapse-btn.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.collapse-btn.svelte-mwxll1:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.resize-handle.svelte-mwxll1{position:absolute;top:0;right:-2px;width:5px;height:100%;cursor:ew-resize;z-index:10}.resize-handle.svelte-mwxll1:hover{background:oklch(from var(--color-accent, #ff6b35) l c h / 30%)}.messages.svelte-mwxll1{flex:1;overflow-y:auto;padding:16px}.empty-state.svelte-mwxll1{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:10px;color:var(--color-text-secondary, #8888a0);opacity:.7;padding:24px}.empty-icon-circle.svelte-mwxll1{width:72px;height:72px;border-radius:50%;background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);color:var(--color-accent, #ff6b35);display:flex;align-items:center;justify-content:center;margin-bottom:4px}.empty-title.svelte-mwxll1{font-size:15px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.empty-hint.svelte-mwxll1{font-size:12px;color:var(--color-text-secondary, #8888a0);text-align:center;max-width:320px;line-height:1.5}.message.svelte-mwxll1{display:flex;gap:10px;margin-bottom:16px}.message-avatar.svelte-mwxll1{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px}.message.user.svelte-mwxll1 .message-avatar:where(.svelte-mwxll1){background:oklch(from var(--color-accent, #ff6b35) l c h / 15%);color:var(--color-accent, #ff6b35)}.message.assistant.svelte-mwxll1 .message-avatar:where(.svelte-mwxll1){background:#ffffff0f;color:var(--color-text-secondary, #8888a0)}.message-body.svelte-mwxll1{flex:1;min-width:0}.message-header.svelte-mwxll1{display:flex;align-items:baseline;gap:8px;margin-bottom:4px}.message-role.svelte-mwxll1{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.message-time.svelte-mwxll1{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6}.message-content.svelte-mwxll1{font-size:13px;line-height:1.6;color:var(--color-text-primary, #e8e8ed);white-space:pre-wrap;word-break:break-word}.message.user.svelte-mwxll1 .message-content:where(.svelte-mwxll1){background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);border-radius:8px;padding:8px 12px}.message.assistant.svelte-mwxll1 .message-content:where(.svelte-mwxll1){background:var(--color-bg-elevated, #1a1a26);border-radius:8px;padding:8px 12px}.message-content.markdown.svelte-mwxll1{white-space:normal}.message-content.markdown.svelte-mwxll1 p{margin:0 0 8px}.message-content.markdown.svelte-mwxll1 p:last-child{margin-bottom:0}.message-content.markdown.svelte-mwxll1 h1,.message-content.markdown.svelte-mwxll1 h2,.message-content.markdown.svelte-mwxll1 h3{margin:12px 0 6px;font-weight:600;line-height:1.3}.message-content.markdown.svelte-mwxll1 h1{font-size:16px}.message-content.markdown.svelte-mwxll1 h2{font-size:14px}.message-content.markdown.svelte-mwxll1 h3{font-size:13px}.message-content.markdown.svelte-mwxll1 code{font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:11px;background:#ffffff0f;padding:1px 4px;border-radius:3px}.message-content.markdown.svelte-mwxll1 pre{background:#0000004d;border-radius:6px;padding:10px 12px;overflow-x:auto;margin:8px 0}.message-content.markdown.svelte-mwxll1 pre code{background:none;padding:0;font-size:11px;line-height:1.5}.message-content.markdown.svelte-mwxll1 ul,.message-content.markdown.svelte-mwxll1 ol{margin:6px 0;padding-left:20px}.message-content.markdown.svelte-mwxll1 li{margin-bottom:2px}.message-content.markdown.svelte-mwxll1 blockquote{border-left:3px solid var(--color-accent, #ff6b35);margin:8px 0;padding:4px 12px;color:var(--color-text-secondary, #8888a0)}.message-content.markdown.svelte-mwxll1 a{color:var(--color-accent, #ff6b35);text-decoration:underline}.message-content.markdown.svelte-mwxll1 table{border-collapse:collapse;width:100%;margin:8px 0;font-size:11px}.message-content.markdown.svelte-mwxll1 th,.message-content.markdown.svelte-mwxll1 td{border:1px solid var(--color-border, #2a2a3a);padding:4px 8px;text-align:left}.message-content.markdown.svelte-mwxll1 th{background:#ffffff0a;font-weight:600}.streaming-cursor.svelte-mwxll1{display:inline-block;width:6px;height:14px;background:var(--color-accent, #ff6b35);margin-left:2px;animation:svelte-mwxll1-blink .8s step-end infinite;vertical-align:text-bottom}@keyframes svelte-mwxll1-blink{0%,to{opacity:1}50%{opacity:0}}.thinking-indicator.svelte-mwxll1{display:flex;align-items:center;gap:8px;padding:4px 0}.thinking-spinner.svelte-mwxll1{font-size:16px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);color:var(--color-accent, #ff6b35);flex-shrink:0;line-height:1}.thinking-message.svelte-mwxll1{font-size:12px;color:var(--color-text-secondary, #8888a0);font-style:italic;animation:svelte-mwxll1-msg-fade .4s ease}@keyframes svelte-mwxll1-msg-fade{0%{opacity:0;transform:translate(4px)}to{opacity:1;transform:translate(0)}}.tool-calls-container.svelte-mwxll1{margin-top:8px;border:1px solid var(--color-border, #2a2a3a);border-radius:8px;overflow:hidden;background:#00000026}.tool-calls-header.svelte-mwxll1{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s ease;gap:8px}.tool-calls-header.svelte-mwxll1:hover{background:#ffffff08}.tool-calls-header-left.svelte-mwxll1{display:flex;align-items:center;gap:6px;color:var(--color-accent, #ff6b35);flex-shrink:0}.tool-chevron.svelte-mwxll1{display:flex;align-items:center;transition:transform .2s ease}.tool-chevron.expanded.svelte-mwxll1{transform:rotate(90deg)}.tool-calls-count.svelte-mwxll1{font-size:11px;font-weight:600;white-space:nowrap}.tool-calls-summary.svelte-mwxll1{font-size:10px;color:var(--color-text-secondary, #8888a0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}.tool-calls-body.svelte-mwxll1{border-top:1px solid var(--color-border, #2a2a3a);display:flex;flex-direction:column}.tool-call-item.svelte-mwxll1{padding:8px 10px;border-bottom:1px solid rgba(255,255,255,.03)}.tool-call-item.svelte-mwxll1:last-child{border-bottom:none}.tool-call-row.svelte-mwxll1{display:flex;align-items:center;gap:6px;margin-bottom:2px}.tool-call-index.svelte-mwxll1{width:16px;height:16px;border-radius:50%;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);font-size:9px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0}.tool-call-name.svelte-mwxll1{font-size:11px;font-weight:600;color:var(--color-accent, #ff6b35)}.tool-call-ok{color:#4ade80;flex-shrink:0}.tool-call-args.svelte-mwxll1{margin:4px 0 0 22px;display:flex;flex-direction:column;gap:1px}.tool-arg-line.svelte-mwxll1{display:flex;gap:6px;font-size:10px;line-height:1.5}.tool-arg-key.svelte-mwxll1{color:var(--color-text-secondary, #8888a0);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);flex-shrink:0}.tool-arg-val.svelte-mwxll1{color:var(--color-text-primary, #e8e8ed);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);word-break:break-word}.tool-call-result.svelte-mwxll1{margin:4px 0 0 22px;padding:4px 8px;background:#4ade800f;border-left:2px solid rgba(74,222,128,.3);border-radius:0 4px 4px 0;display:flex;gap:6px;font-size:10px;line-height:1.5}.tool-result-label.svelte-mwxll1{color:#4ade80;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-weight:600;flex-shrink:0}.tool-result-val.svelte-mwxll1{color:var(--color-text-secondary, #8888a0);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);word-break:break-word}.error-bar.svelte-mwxll1{display:flex;align-items:center;gap:8px;padding:6px 12px;background:#ef44441a;border-top:1px solid rgba(239,68,68,.2);font-size:11px;color:var(--color-error, #ef4444);flex-shrink:0}.retry-btn.svelte-mwxll1{margin-left:auto;padding:2px 10px;border:1px solid rgba(239,68,68,.3);border-radius:4px;background:#ef444426;color:var(--color-error, #ef4444);font-size:11px;cursor:pointer;white-space:nowrap}.retry-btn.svelte-mwxll1:hover{background:#ef444440}.input-area.svelte-mwxll1{flex-shrink:0;border-top:1px solid var(--color-border, #2a2a3a);padding:8px 12px;display:flex;flex-direction:column;gap:6px}.file-input-hidden.svelte-mwxll1{display:none}.attachment-badges.svelte-mwxll1{display:flex;flex-wrap:wrap;gap:6px}.attachment-badge.svelte-mwxll1{display:flex;align-items:center;gap:6px;padding:4px 8px;background:var(--color-bg-elevated, #1a1a26);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;max-width:200px;transition:border-color .15s}.attachment-badge.svelte-mwxll1:hover{border-color:var(--color-text-secondary, #8888a0)}.attachment-badge.has-preview.svelte-mwxll1{padding:3px 8px 3px 3px}.attachment-thumb.svelte-mwxll1{width:32px;height:32px;object-fit:cover;border-radius:5px;flex-shrink:0}.attachment-icon.svelte-mwxll1{width:28px;height:28px;border-radius:6px;background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);color:var(--color-accent, #ff6b35);display:flex;align-items:center;justify-content:center;flex-shrink:0}.attachment-info.svelte-mwxll1{display:flex;flex-direction:column;min-width:0}.attachment-name.svelte-mwxll1{font-size:11px;font-weight:500;color:var(--color-text-primary, #e8e8ed);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.attachment-badge-wrapper.svelte-mwxll1{position:relative}.attachment-type-btn.svelte-mwxll1{display:inline-flex;align-items:center;gap:3px;background:none;border:none;padding:0;cursor:pointer;font-size:9px;color:var(--color-text-secondary, #8888a0);transition:color .15s}.attachment-type-btn.svelte-mwxll1:hover{color:var(--color-accent, #ff6b35)}.type-dropdown.svelte-mwxll1{position:absolute;bottom:calc(100% + 4px);left:0;min-width:160px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;box-shadow:0 8px 24px #0006;z-index:100;overflow:hidden;padding:4px}.type-option.svelte-mwxll1{display:block;width:100%;text-align:left;padding:5px 10px;border:none;background:transparent;border-radius:5px;color:var(--color-text-primary, #e8e8ed);font-size:11px;cursor:pointer;transition:background .1s}.type-option.svelte-mwxll1:hover{background:#ffffff0f}.type-option.selected.svelte-mwxll1{color:var(--color-accent, #ff6b35);background:oklch(from var(--color-accent, #ff6b35) l c h / 10%)}.attachment-remove.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;background:transparent;border-radius:50%;color:var(--color-text-secondary, #8888a0);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.attachment-remove.svelte-mwxll1:hover{background:#ef444426;color:var(--color-error, #ef4444)}.input-row.svelte-mwxll1{display:flex;gap:4px;align-items:flex-end}.attach-btn.svelte-mwxll1{color:var(--color-text-secondary, #8888a0)}.attach-btn.svelte-mwxll1:hover:not(:disabled){color:var(--color-accent, #ff6b35)}.attach-container.svelte-mwxll1{position:relative}.attach-dropdown.svelte-mwxll1{position:absolute;bottom:calc(100% + 6px);left:0;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;box-shadow:0 8px 24px #0006;overflow:hidden;z-index:100;min-width:140px}.attach-option.svelte-mwxll1{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;background:none;border:none;color:var(--color-text-primary, #e8e8ed);font-size:12px;cursor:pointer;transition:background .1s}.attach-option.svelte-mwxll1:hover{background:var(--color-bg-elevated, #1a1a26)}.chat-input.svelte-mwxll1{flex:1;background:transparent;border:none;outline:none;color:var(--color-text-primary, #e8e8ed);font-size:13px;font-family:inherit;line-height:1.5;resize:none;padding:4px 0}.chat-input.svelte-mwxll1::placeholder{color:var(--color-text-secondary, #8888a0);opacity:.5}.chat-input.svelte-mwxll1:disabled{opacity:.5}.input-actions.svelte-mwxll1{display:flex;align-items:center;gap:4px;flex-shrink:0}.action-btn.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-mwxll1:hover:not(:disabled){background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-mwxll1:disabled{opacity:.3;cursor:default}.send-btn.svelte-mwxll1:not(:disabled){color:var(--color-accent, #ff6b35)}.send-btn.svelte-mwxll1:hover:not(:disabled){background:oklch(from var(--color-accent, #ff6b35) l c h / 12%)}.spin-icon{animation:svelte-mwxll1-chat-spin 1s linear infinite}@keyframes svelte-mwxll1-chat-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.message-content.markdown.svelte-mwxll1 .code-block-wrapper{position:relative;margin:8px 0;border-radius:8px;overflow:hidden;border:1px solid var(--color-border, #2a2a3a)}.message-content.markdown.svelte-mwxll1 .code-block-header{display:flex;align-items:center;justify-content:space-between;padding:4px 10px;background:#ffffff08;border-bottom:1px solid var(--color-border, #2a2a3a)}.message-content.markdown.svelte-mwxll1 .code-lang{font-size:10px;font-weight:600;color:var(--color-text-secondary, #8888a0);text-transform:uppercase;letter-spacing:.04em}.message-content.markdown.svelte-mwxll1 .code-copy-btn{font-size:10px;font-weight:500;color:var(--color-text-secondary, #8888a0);background:none;border:1px solid var(--color-border, #2a2a3a);border-radius:4px;padding:2px 8px;cursor:pointer;transition:color .15s,border-color .15s}.message-content.markdown.svelte-mwxll1 .code-copy-btn:hover{color:var(--color-text-primary, #e8e8ed);border-color:var(--color-text-secondary, #8888a0)}.message-content.markdown.svelte-mwxll1 .code-copy-btn[data-copied=true]{color:var(--color-success, #22c55e);border-color:var(--color-success, #22c55e)}.message-content.markdown.svelte-mwxll1 .code-block-wrapper pre{margin:0;border-radius:0;border:none}.message-content.markdown.svelte-mwxll1 .hljs{color:#abb2bf;background:#0000004d}.message-content.markdown.svelte-mwxll1 .hljs-keyword,.message-content.markdown.svelte-mwxll1 .hljs-selector-tag,.message-content.markdown.svelte-mwxll1 .hljs-literal,.message-content.markdown.svelte-mwxll1 .hljs-section,.message-content.markdown.svelte-mwxll1 .hljs-link{color:#c678dd}.message-content.markdown.svelte-mwxll1 .hljs-string,.message-content.markdown.svelte-mwxll1 .hljs-addition{color:#98c379}.message-content.markdown.svelte-mwxll1 .hljs-number,.message-content.markdown.svelte-mwxll1 .hljs-regexp,.message-content.markdown.svelte-mwxll1 .hljs-meta{color:#d19a66}.message-content.markdown.svelte-mwxll1 .hljs-comment,.message-content.markdown.svelte-mwxll1 .hljs-quote{color:#5c6370;font-style:italic}.message-content.markdown.svelte-mwxll1 .hljs-title,.message-content.markdown.svelte-mwxll1 .hljs-name{color:#61afef}.message-content.markdown.svelte-mwxll1 .hljs-variable,.message-content.markdown.svelte-mwxll1 .hljs-template-variable{color:#e06c75}.message-content.markdown.svelte-mwxll1 .hljs-built_in,.message-content.markdown.svelte-mwxll1 .hljs-type{color:#e6c07b}.message-content.markdown.svelte-mwxll1 .hljs-attr,.message-content.markdown.svelte-mwxll1 .hljs-attribute{color:#d19a66}.message-content.markdown.svelte-mwxll1 .hljs-deletion{color:#e06c75}.message-content.markdown.svelte-mwxll1 .hljs-params{color:#abb2bf}.message-content.markdown.svelte-mwxll1 .hljs-function{color:#61afef}.plan-card.svelte-mwxll1{flex-shrink:0;margin:0 10px 8px;border:1px solid var(--color-border, #2a2a3a);border-radius:12px;background:var(--color-bg-elevated, #1a1a26);overflow:hidden;animation:svelte-mwxll1-planSlideUp .25s ease-out;max-height:min(55vh,440px);display:flex;flex-direction:column;box-shadow:0 4px 20px #00000040}@keyframes svelte-mwxll1-planSlideUp{0%{transform:translateY(12px);opacity:0}to{transform:translateY(0);opacity:1}}.plan-header.svelte-mwxll1{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.plan-header-left.svelte-mwxll1{display:flex;align-items:center;gap:7px}.plan-icon.svelte-mwxll1{width:22px;height:22px;border-radius:6px;background:oklch(from var(--color-accent, #ff6b35) l c h / 12%);color:var(--color-accent, #ff6b35);display:flex;align-items:center;justify-content:center;flex-shrink:0}.plan-title.svelte-mwxll1{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed);letter-spacing:.02em}.plan-dismiss.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;border-radius:5px;color:var(--color-text-secondary, #8888a0);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.plan-dismiss.svelte-mwxll1:hover{background:#ffffff14;color:var(--color-text-primary, #e8e8ed)}.plan-body.svelte-mwxll1{flex:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--color-border, #2a2a3a) transparent;padding:10px 12px 6px}.plan-summary.svelte-mwxll1{font-size:12px;line-height:1.55;color:var(--color-text-primary, #e8e8ed);margin:0 0 8px}.plan-steps.svelte-mwxll1{display:flex;flex-direction:column;gap:2px;margin:0 0 6px}.plan-step.svelte-mwxll1{display:flex;align-items:flex-start;gap:8px;padding:5px 8px;font-size:12px;line-height:1.5;color:var(--color-text-primary, #e8e8ed);border-radius:6px;transition:background .1s}.plan-step.svelte-mwxll1:hover{background:#ffffff08}.step-number.svelte-mwxll1{width:18px;height:18px;border-radius:5px;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);font-size:10px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px}.step-text.svelte-mwxll1{flex:1}.plan-question.svelte-mwxll1{font-size:12px;font-weight:500;color:var(--color-text-primary, #e8e8ed);margin:4px 0 2px;line-height:1.5}.plan-footer.svelte-mwxll1{flex-shrink:0;border-top:1px solid var(--color-border, #2a2a3a);padding:8px 10px;display:flex;flex-direction:column;gap:6px}.plan-options.svelte-mwxll1{display:flex;flex-direction:column;gap:4px}.plan-option-btn.svelte-mwxll1{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--color-border, #2a2a3a);border-radius:8px;background:var(--color-bg-secondary, #12121a);color:var(--color-text-primary, #e8e8ed);cursor:pointer;font-size:12px;line-height:1.4;text-align:left;transition:border-color .15s,background .15s}.plan-option-btn.svelte-mwxll1:hover{border-color:var(--color-accent, #ff6b35);background:oklch(from var(--color-accent, #ff6b35) l c h / 6%)}.plan-option-key.svelte-mwxll1{width:20px;height:20px;border-radius:5px;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);font-size:10px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);transition:background .15s,color .15s}.plan-option-btn.svelte-mwxll1:hover .plan-option-key:where(.svelte-mwxll1){background:oklch(from var(--color-accent, #ff6b35) l c h / 15%);color:var(--color-accent, #ff6b35)}.plan-option-text.svelte-mwxll1{flex:1}.plan-custom-input.svelte-mwxll1{display:flex;align-items:flex-end;gap:4px}.plan-answer-input.svelte-mwxll1{flex:1;background:var(--color-bg-primary, #0e0e14);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;color:var(--color-text-primary, #e8e8ed);font-size:12px;font-family:inherit;padding:7px 10px;resize:none;outline:none;transition:border-color .15s;box-sizing:border-box}.plan-answer-input.svelte-mwxll1:focus{border-color:var(--color-accent, #ff6b35)}.plan-answer-input.svelte-mwxll1::placeholder{color:var(--color-text-secondary, #8888a0);opacity:.4}.plan-send-btn.svelte-mwxll1{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.plan-send-btn.svelte-mwxll1:hover{background:oklch(from var(--color-accent, #ff6b35) l c h / 12%);color:var(--color-accent, #ff6b35)}.app-shell.svelte-vr1z90{display:flex;flex-direction:column;height:100vh;width:100vw;overflow:hidden;background:var(--color-bg-primary);color:var(--color-text-primary)}.home-content.svelte-vr1z90{flex:1;min-height:0;overflow:auto}.app-body.svelte-vr1z90{display:flex;flex:1;min-height:0}.app-content.svelte-vr1z90{flex:1;min-width:0;overflow:auto}.app-footer.svelte-vr1z90{height:34px;min-height:34px;display:flex;align-items:center;justify-content:center;gap:4px;font-family:var(--font-sans);font-size:11px;color:var(--color-text-secondary);background:var(--color-bg-secondary);border-top:1px solid var(--color-border);opacity:.7;-webkit-user-select:none;user-select:none}.heart.svelte-vr1z90{color:#ef4444;display:inline-block;animation:svelte-vr1z90-heartbeat 1.2s ease-in-out infinite}@keyframes svelte-vr1z90-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.25)}30%{transform:scale(1)}45%{transform:scale(1.15)}60%{transform:scale(1)}} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/2.1uTRQMkx.css b/studio-desktop/frontend-dist/_app/immutable/assets/2.1uTRQMkx.css deleted file mode 100644 index 7817aabd..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/2.1uTRQMkx.css +++ /dev/null @@ -1 +0,0 @@ -.home-page.svelte-1uha8ag{position:relative;display:flex;flex-direction:column;align-items:center;min-height:100%;overflow-x:hidden;overflow-y:auto;background:var(--color-bg-primary)}.bg-effects.svelte-1uha8ag{position:fixed;inset:0;pointer-events:none;z-index:0;overflow:hidden}.bg-orb.svelte-1uha8ag{position:absolute;border-radius:50%;filter:blur(120px);will-change:transform,opacity}.bg-orb-1.svelte-1uha8ag{width:700px;height:700px;top:-15%;left:-10%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 60%);opacity:.14;animation:svelte-1uha8ag-orb-drift-1 22s ease-in-out infinite}.bg-orb-2.svelte-1uha8ag{width:550px;height:550px;bottom:-12%;right:-8%;background:radial-gradient(circle,oklch(from var(--color-accent) calc(l + .1) c h) 0%,transparent 60%);opacity:.1;animation:svelte-1uha8ag-orb-drift-2 28s ease-in-out infinite}.bg-orb-3.svelte-1uha8ag{width:400px;height:400px;top:35%;right:15%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 60%);opacity:.06;animation:svelte-1uha8ag-orb-drift-3 18s ease-in-out infinite}@keyframes svelte-1uha8ag-orb-drift-1{0%,to{transform:translate(0) scale(1)}33%{transform:translate(60px,40px) scale(1.1)}66%{transform:translate(-30px,20px) scale(.95)}}@keyframes svelte-1uha8ag-orb-drift-2{0%,to{transform:translate(0) scale(1)}33%{transform:translate(-50px,-30px) scale(1.05)}66%{transform:translate(40px,-50px) scale(.9)}}@keyframes svelte-1uha8ag-orb-drift-3{0%,to{transform:translate(0) scale(1);opacity:.04}50%{transform:translate(-40px,30px) scale(1.15);opacity:.08}}.bg-grid.svelte-1uha8ag{position:absolute;inset:0;background-image:linear-gradient(to right,rgba(255,255,255,.06) 1px,transparent 1px),linear-gradient(to bottom,rgba(255,255,255,.06) 1px,transparent 1px);background-size:52px 52px;mask-image:radial-gradient(ellipse 90% 80% at 50% 30%,black 5%,transparent 70%);-webkit-mask-image:radial-gradient(ellipse 90% 80% at 50% 30%,black 5%,transparent 70%);animation:svelte-1uha8ag-grid-fade-in 1.2s ease-out}@keyframes svelte-1uha8ag-grid-fade-in{0%{opacity:0}to{opacity:1}}.bg-vignette.svelte-1uha8ag{position:absolute;inset:0;background:radial-gradient(ellipse 80% 80% at 50% 50%,transparent 30%,rgba(0,0,0,.4) 100%)}.page-content.svelte-1uha8ag{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;width:100%;max-width:860px;padding:0 32px 48px}.hero-section.svelte-1uha8ag{display:flex;flex-direction:column;align-items:center;text-align:center;gap:12px;padding-top:clamp(56px,12vh,120px);padding-bottom:8px}.hero-title.svelte-1uha8ag{font-size:30px;font-weight:700;color:var(--color-text-primary);margin:0;letter-spacing:-.02em;font-family:var(--font-sans);line-height:1.2}.hero-subtitle.svelte-1uha8ag{font-size:14px;color:var(--color-text-secondary);margin:0;font-family:var(--font-sans);max-width:420px;line-height:1.5;opacity:.8}.prompt-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;align-items:center;gap:10px;margin-top:28px}.prompt-box.svelte-1uha8ag{display:flex;flex-direction:column;width:100%;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:16px;overflow:hidden;transition:border-color .2s,box-shadow .2s}.prompt-box.svelte-1uha8ag:focus-within{border-color:oklch(from var(--color-accent) l c h / 50%);box-shadow:0 0 0 3px oklch(from var(--color-accent) l c h / 6%),0 8px 32px -8px oklch(from var(--color-accent) l c h / 10%)}.prompt-box.disabled.svelte-1uha8ag{opacity:.55;pointer-events:none}.prompt-input.svelte-1uha8ag{width:100%;background:none;border:none;outline:none;color:var(--color-text-primary);font-size:15px;font-family:var(--font-sans);line-height:1.55;padding:18px 20px 8px;resize:none;min-height:60px;max-height:180px}.prompt-input.svelte-1uha8ag::placeholder{color:var(--color-text-secondary);opacity:.5}.prompt-input.svelte-1uha8ag:disabled{opacity:.5}.attachment-chips.svelte-1uha8ag{display:flex;flex-wrap:wrap;gap:6px;padding:4px 18px 0}.attachment-chip.svelte-1uha8ag{display:flex;align-items:center;gap:5px;padding:4px 10px;background:oklch(from var(--color-accent) l c h / 8%);border:1px solid oklch(from var(--color-accent) l c h / 18%);border-radius:8px;font-size:11px;font-family:var(--font-sans);max-width:220px}.chip-icon.svelte-1uha8ag{display:flex;color:var(--color-accent);flex-shrink:0}.chip-name.svelte-1uha8ag{color:var(--color-text-primary);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chip-size.svelte-1uha8ag{color:var(--color-text-secondary);opacity:.7;flex-shrink:0}.chip-remove.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;border:none;background:transparent;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.chip-remove.svelte-1uha8ag:hover{background:#ffffff1a;color:var(--color-text-primary)}.prompt-toolbar.svelte-1uha8ag{display:flex;align-items:center;justify-content:space-between;padding:8px 12px}.toolbar-left.svelte-1uha8ag,.toolbar-right.svelte-1uha8ag{display:flex;align-items:center;gap:4px}.toolbar-btn.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:var(--color-text-secondary);cursor:pointer;transition:all .15s}.toolbar-btn.svelte-1uha8ag:hover:not(:disabled){background:#ffffff0f;color:var(--color-text-primary)}.toolbar-btn.svelte-1uha8ag:disabled{opacity:.35;cursor:default}.send-btn.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:10px;border:none;background:var(--color-accent);color:#fff;cursor:pointer;transition:all .15s}.send-btn.svelte-1uha8ag:hover:not(:disabled){filter:brightness(1.12);transform:scale(1.04)}.send-btn.svelte-1uha8ag:disabled{opacity:.3;cursor:default}.spinner-icon{animation:svelte-1uha8ag-spin .8s linear infinite}@keyframes svelte-1uha8ag-spin{to{transform:rotate(360deg)}}.sending-hint.svelte-1uha8ag{font-size:12px;color:var(--color-text-secondary);margin:0;font-family:var(--font-sans);animation:svelte-1uha8ag-pulse-text 1.5s ease-in-out infinite}@keyframes svelte-1uha8ag-pulse-text{0%,to{opacity:.5}50%{opacity:1}}.section-label.svelte-1uha8ag{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--color-text-secondary);font-family:var(--font-sans);text-transform:uppercase;letter-spacing:.06em;padding-left:4px}.templates-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;gap:14px;margin-top:36px}.templates-row.svelte-1uha8ag{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px}.template-card.svelte-1uha8ag{display:flex;flex-direction:column;gap:12px;padding:18px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:14px;cursor:pointer;text-align:left;position:relative;transition:border-color .2s,background .2s,transform .2s,box-shadow .2s}.template-card.svelte-1uha8ag:hover{border-color:oklch(from var(--color-accent) l c h / 45%);background:oklch(from var(--color-accent) l c h / 4%);transform:translateY(-2px);box-shadow:0 8px 24px -8px oklch(from var(--color-accent) l c h / 10%)}.template-icon.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:10px;background:oklch(from var(--color-accent) l c h / 10%);color:var(--color-accent);transition:background .2s}.template-card.svelte-1uha8ag:hover .template-icon:where(.svelte-1uha8ag){background:oklch(from var(--color-accent) l c h / 16%)}.template-info.svelte-1uha8ag{display:flex;flex-direction:column;gap:4px;flex:1}.template-name.svelte-1uha8ag{font-size:13px;font-weight:600;color:var(--color-text-primary);font-family:var(--font-sans);line-height:1.3}.template-desc.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.template-arrow.svelte-1uha8ag{position:absolute;top:16px;right:16px;color:var(--color-text-secondary);opacity:0;transition:opacity .2s,color .2s,transform .2s;display:flex}.template-card.svelte-1uha8ag:hover .template-arrow:where(.svelte-1uha8ag){opacity:1;color:var(--color-accent);transform:translate(2px)}.recent-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;gap:14px;margin-top:36px}.recent-row.svelte-1uha8ag{display:flex;gap:10px;overflow-x:auto;padding-bottom:4px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none}.recent-row.svelte-1uha8ag::-webkit-scrollbar{height:0;display:none}.recent-card.svelte-1uha8ag{display:flex;align-items:center;gap:12px;min-width:220px;max-width:280px;padding:14px 16px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:12px;cursor:pointer;text-align:left;position:relative;transition:border-color .2s,background .2s,transform .2s,box-shadow .2s;scroll-snap-align:start;flex-shrink:0}.recent-card.svelte-1uha8ag:hover{border-color:oklch(from var(--color-accent) l c h / 40%);background:oklch(from var(--color-accent) l c h / 3%);transform:translateY(-1px);box-shadow:0 4px 16px -4px oklch(from var(--color-accent) l c h / 8%)}.recent-card-icon.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:34px;height:34px;min-width:34px;border-radius:9px;background:oklch(from var(--color-accent) l c h / 8%);color:var(--color-accent);opacity:.8;transition:opacity .2s}.recent-card.svelte-1uha8ag:hover .recent-card-icon:where(.svelte-1uha8ag){opacity:1}.recent-card-info.svelte-1uha8ag{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.recent-card-name.svelte-1uha8ag{font-size:13px;font-weight:600;color:var(--color-text-primary);font-family:var(--font-sans);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.recent-card-date.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);opacity:.7}.recent-card-arrow.svelte-1uha8ag{display:flex;color:var(--color-text-secondary);opacity:0;transition:opacity .2s,color .2s,transform .2s;flex-shrink:0}.recent-card.svelte-1uha8ag:hover .recent-card-arrow:where(.svelte-1uha8ag){opacity:1;color:var(--color-accent);transform:translate(2px)}@media(max-width:640px){.hero-title.svelte-1uha8ag{font-size:24px}.templates-row.svelte-1uha8ag{grid-template-columns:repeat(2,1fr)}.recent-card.svelte-1uha8ag{min-width:200px}.page-content.svelte-1uha8ag{padding:0 16px 40px}} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/2.B5Y56XZl.css b/studio-desktop/frontend-dist/_app/immutable/assets/2.B5Y56XZl.css deleted file mode 100644 index d0670a3d..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/2.B5Y56XZl.css +++ /dev/null @@ -1 +0,0 @@ -.home-page.svelte-1uha8ag{position:relative;display:flex;flex-direction:column;align-items:center;min-height:100%;overflow-x:hidden;overflow-y:auto;background:var(--color-bg-primary)}.bg-effects.svelte-1uha8ag{position:fixed;inset:0;pointer-events:none;z-index:0;overflow:hidden}.bg-orb.svelte-1uha8ag{position:absolute;border-radius:50%;filter:blur(100px);will-change:transform,opacity}.bg-orb-1.svelte-1uha8ag{width:650px;height:650px;top:-12%;left:-8%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 65%);opacity:.15;animation:svelte-1uha8ag-orb-drift-1 20s ease-in-out infinite}.bg-orb-2.svelte-1uha8ag{width:500px;height:500px;bottom:-10%;right:-10%;background:radial-gradient(circle,oklch(from var(--color-accent) calc(l + .1) c h) 0%,transparent 65%);opacity:.1;animation:svelte-1uha8ag-orb-drift-2 25s ease-in-out infinite}.bg-orb-3.svelte-1uha8ag{width:350px;height:350px;top:40%;right:20%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 65%);opacity:.07;animation:svelte-1uha8ag-orb-drift-3 18s ease-in-out infinite}@keyframes svelte-1uha8ag-orb-drift-1{0%,to{transform:translate(0) scale(1)}33%{transform:translate(60px,40px) scale(1.1)}66%{transform:translate(-30px,20px) scale(.95)}}@keyframes svelte-1uha8ag-orb-drift-2{0%,to{transform:translate(0) scale(1)}33%{transform:translate(-50px,-30px) scale(1.05)}66%{transform:translate(40px,-50px) scale(.9)}}@keyframes svelte-1uha8ag-orb-drift-3{0%,to{transform:translate(0) scale(1);opacity:.04}50%{transform:translate(-40px,30px) scale(1.15);opacity:.08}}.bg-grid.svelte-1uha8ag{position:absolute;inset:0;background-image:linear-gradient(to right,rgba(255,255,255,.04) 1px,transparent 1px),linear-gradient(to bottom,rgba(255,255,255,.04) 1px,transparent 1px);background-size:48px 48px;mask-image:radial-gradient(ellipse 80% 70% at 50% 35%,black 10%,transparent 75%);-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 35%,black 10%,transparent 75%);animation:svelte-1uha8ag-grid-fade-in 1.5s ease-out}@keyframes svelte-1uha8ag-grid-fade-in{0%{opacity:0}to{opacity:1}}.bg-vignette.svelte-1uha8ag{position:absolute;inset:0;background:radial-gradient(ellipse 80% 80% at 50% 50%,transparent 40%,rgba(0,0,0,.35) 100%)}.page-content.svelte-1uha8ag{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;width:100%;max-width:860px;padding:0 32px 48px}.hero-section.svelte-1uha8ag{display:flex;flex-direction:column;align-items:center;text-align:center;gap:14px;padding-top:clamp(48px,10vh,100px);padding-bottom:8px}.hero-icon.svelte-1uha8ag{position:relative;display:flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:16px;background:oklch(from var(--color-accent) l c h / 14%);color:var(--color-accent);flex-shrink:0}.hero-icon-glow.svelte-1uha8ag{position:absolute;inset:-8px;border-radius:20px;background:oklch(from var(--color-accent) l c h / 8%);animation:svelte-1uha8ag-icon-pulse 3s ease-in-out infinite}@keyframes svelte-1uha8ag-icon-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.08)}}.hero-title.svelte-1uha8ag{font-size:32px;font-weight:700;color:var(--color-text-primary);margin:0;letter-spacing:-.025em;font-family:var(--font-sans);line-height:1.15}.hero-subtitle.svelte-1uha8ag{font-size:14px;color:var(--color-text-secondary);margin:0;font-family:var(--font-sans);max-width:400px;line-height:1.6}.prompt-section.svelte-1uha8ag{width:100%;max-width:640px;display:flex;flex-direction:column;align-items:center;gap:10px;margin-top:28px}.prompt-box.svelte-1uha8ag{display:flex;align-items:flex-end;width:100%;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:14px;padding:8px;gap:4px;transition:border-color .2s,box-shadow .2s}.prompt-box.svelte-1uha8ag:focus-within{border-color:oklch(from var(--color-accent) l c h / 60%);box-shadow:0 0 0 3px oklch(from var(--color-accent) l c h / 8%),0 8px 32px -8px oklch(from var(--color-accent) l c h / 12%)}.prompt-box.disabled.svelte-1uha8ag{opacity:.55;pointer-events:none}.prompt-action-btn.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:38px;height:38px;min-width:38px;border-radius:10px;border:none;cursor:pointer;transition:all .15s;flex-shrink:0}.attach-btn.svelte-1uha8ag{background:var(--color-bg-secondary);border:1px solid var(--color-border);color:var(--color-text-secondary)}.attach-btn.svelte-1uha8ag:hover:not(:disabled){border-color:oklch(from var(--color-accent) l c h / 50%);color:var(--color-accent)}.attach-btn.svelte-1uha8ag:disabled{opacity:.4;cursor:default}.send-btn.svelte-1uha8ag{background:var(--color-accent);color:#fff}.send-btn.svelte-1uha8ag:hover:not(:disabled){filter:brightness(1.12);transform:scale(1.04)}.send-btn.svelte-1uha8ag:disabled{opacity:.3;cursor:default}.prompt-input-area.svelte-1uha8ag{flex:1;display:flex;flex-direction:column;min-width:0}.prompt-input.svelte-1uha8ag{flex:1;background:none;border:none;outline:none;color:var(--color-text-primary);font-size:14px;font-family:var(--font-sans);line-height:1.55;padding:8px 10px;resize:none;min-height:44px;max-height:160px}.attachment-chips.svelte-1uha8ag{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px 0}.attachment-chip.svelte-1uha8ag{display:flex;align-items:center;gap:5px;padding:3px 8px;background:oklch(from var(--color-accent) l c h / 8%);border:1px solid oklch(from var(--color-accent) l c h / 20%);border-radius:7px;font-size:11px;font-family:var(--font-sans);max-width:200px}.chip-icon.svelte-1uha8ag{display:flex;color:var(--color-accent);flex-shrink:0}.chip-name.svelte-1uha8ag{color:var(--color-text-primary);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chip-size.svelte-1uha8ag{color:var(--color-text-secondary);opacity:.7;flex-shrink:0}.chip-remove.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;border:none;background:transparent;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.chip-remove.svelte-1uha8ag:hover{background:#ffffff1a;color:var(--color-text-primary)}.prompt-input.svelte-1uha8ag::placeholder{color:var(--color-text-secondary);opacity:.45}.prompt-input.svelte-1uha8ag:disabled{opacity:.5}.spinner-icon{animation:svelte-1uha8ag-spin .8s linear infinite}@keyframes svelte-1uha8ag-spin{to{transform:rotate(360deg)}}.sending-hint.svelte-1uha8ag{font-size:12px;color:var(--color-text-secondary);margin:0;font-family:var(--font-sans);animation:svelte-1uha8ag-pulse-text 1.5s ease-in-out infinite}@keyframes svelte-1uha8ag-pulse-text{0%,to{opacity:.5}50%{opacity:1}}.section-label.svelte-1uha8ag{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--color-text-secondary);font-family:var(--font-sans);text-transform:uppercase;letter-spacing:.06em;padding-left:4px}.templates-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;gap:14px;margin-top:40px}.templates-row.svelte-1uha8ag{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px}.template-card.svelte-1uha8ag{display:flex;flex-direction:column;gap:12px;padding:18px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:14px;cursor:pointer;text-align:left;position:relative;transition:border-color .2s,background .2s,transform .2s,box-shadow .2s}.template-card.svelte-1uha8ag:hover{border-color:oklch(from var(--color-accent) l c h / 45%);background:oklch(from var(--color-accent) l c h / 4%);transform:translateY(-2px);box-shadow:0 8px 24px -8px oklch(from var(--color-accent) l c h / 10%)}.template-icon.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:11px;background:oklch(from var(--color-accent) l c h / 10%);color:var(--color-accent);transition:background .2s}.template-card.svelte-1uha8ag:hover .template-icon:where(.svelte-1uha8ag){background:oklch(from var(--color-accent) l c h / 16%)}.template-info.svelte-1uha8ag{display:flex;flex-direction:column;gap:4px;flex:1}.template-name.svelte-1uha8ag{font-size:13px;font-weight:600;color:var(--color-text-primary);font-family:var(--font-sans);line-height:1.3}.template-desc.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.template-arrow.svelte-1uha8ag{position:absolute;top:16px;right:16px;color:var(--color-text-secondary);opacity:0;transition:opacity .2s,color .2s,transform .2s;display:flex}.template-card.svelte-1uha8ag:hover .template-arrow:where(.svelte-1uha8ag){opacity:1;color:var(--color-accent);transform:translate(2px)}.recent-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;gap:14px;margin-top:36px}.recent-row.svelte-1uha8ag{display:flex;gap:10px;overflow-x:auto;padding-bottom:4px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch}.recent-row.svelte-1uha8ag::-webkit-scrollbar{height:0;display:none}.recent-row.svelte-1uha8ag{scrollbar-width:none}.recent-card.svelte-1uha8ag{display:flex;align-items:center;gap:12px;min-width:220px;max-width:280px;padding:14px 16px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:12px;cursor:pointer;text-align:left;position:relative;transition:border-color .2s,background .2s,transform .2s,box-shadow .2s;scroll-snap-align:start;flex-shrink:0}.recent-card.svelte-1uha8ag:hover{border-color:oklch(from var(--color-accent) l c h / 40%);background:oklch(from var(--color-accent) l c h / 3%);transform:translateY(-1px);box-shadow:0 4px 16px -4px oklch(from var(--color-accent) l c h / 8%)}.recent-card-icon.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:34px;height:34px;min-width:34px;border-radius:9px;background:oklch(from var(--color-accent) l c h / 8%);color:var(--color-accent);opacity:.8;transition:opacity .2s}.recent-card.svelte-1uha8ag:hover .recent-card-icon:where(.svelte-1uha8ag){opacity:1}.recent-card-info.svelte-1uha8ag{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.recent-card-name.svelte-1uha8ag{font-size:13px;font-weight:600;color:var(--color-text-primary);font-family:var(--font-sans);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.recent-card-date.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);opacity:.7}.recent-card-arrow.svelte-1uha8ag{display:flex;color:var(--color-text-secondary);opacity:0;transition:opacity .2s,color .2s,transform .2s;flex-shrink:0}.recent-card.svelte-1uha8ag:hover .recent-card-arrow:where(.svelte-1uha8ag){opacity:1;color:var(--color-accent);transform:translate(2px)}@media(max-width:640px){.hero-title.svelte-1uha8ag{font-size:26px}.templates-row.svelte-1uha8ag{grid-template-columns:repeat(2,1fr)}.recent-card.svelte-1uha8ag{min-width:200px}.page-content.svelte-1uha8ag{padding:0 16px 40px}} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/2.BExnFsh0.css b/studio-desktop/frontend-dist/_app/immutable/assets/2.BExnFsh0.css deleted file mode 100644 index 5a045da6..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/2.BExnFsh0.css +++ /dev/null @@ -1 +0,0 @@ -.home-page.svelte-1uha8ag{position:relative;display:flex;flex-direction:column;align-items:center;min-height:100%;overflow-x:hidden;overflow-y:auto;background:var(--color-bg-primary)}.bg-effects.svelte-1uha8ag{position:fixed;inset:0;pointer-events:none;z-index:0;overflow:hidden}.bg-orb.svelte-1uha8ag{position:absolute;border-radius:50%;filter:blur(100px);will-change:transform,opacity}.bg-orb-1.svelte-1uha8ag{width:600px;height:600px;top:-10%;left:-5%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 70%);opacity:.12;animation:svelte-1uha8ag-orb-drift-1 20s ease-in-out infinite}.bg-orb-2.svelte-1uha8ag{width:500px;height:500px;bottom:-10%;right:-10%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 70%);opacity:.08;animation:svelte-1uha8ag-orb-drift-2 25s ease-in-out infinite}.bg-orb-3.svelte-1uha8ag{width:350px;height:350px;top:40%;right:20%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 70%);opacity:.06;animation:svelte-1uha8ag-orb-drift-3 18s ease-in-out infinite}@keyframes svelte-1uha8ag-orb-drift-1{0%,to{transform:translate(0) scale(1)}33%{transform:translate(60px,40px) scale(1.1)}66%{transform:translate(-30px,20px) scale(.95)}}@keyframes svelte-1uha8ag-orb-drift-2{0%,to{transform:translate(0) scale(1)}33%{transform:translate(-50px,-30px) scale(1.05)}66%{transform:translate(40px,-50px) scale(.9)}}@keyframes svelte-1uha8ag-orb-drift-3{0%,to{transform:translate(0) scale(1);opacity:.04}50%{transform:translate(-40px,30px) scale(1.15);opacity:.08}}.bg-grid.svelte-1uha8ag{position:absolute;inset:0;background-image:linear-gradient(to right,rgba(255,255,255,.03) 1px,transparent 1px),linear-gradient(to bottom,rgba(255,255,255,.03) 1px,transparent 1px);background-size:40px 40px;mask-image:radial-gradient(ellipse 70% 60% at 50% 40%,black 20%,transparent 80%);-webkit-mask-image:radial-gradient(ellipse 70% 60% at 50% 40%,black 20%,transparent 80%)}.page-content.svelte-1uha8ag{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;width:100%;max-width:860px;padding:0 32px 48px}.hero-section.svelte-1uha8ag{display:flex;flex-direction:column;align-items:center;text-align:center;gap:14px;padding-top:clamp(48px,10vh,100px);padding-bottom:8px}.hero-icon.svelte-1uha8ag{position:relative;display:flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:16px;background:oklch(from var(--color-accent) l c h / 14%);color:var(--color-accent);flex-shrink:0}.hero-icon-glow.svelte-1uha8ag{position:absolute;inset:-8px;border-radius:20px;background:oklch(from var(--color-accent) l c h / 8%);animation:svelte-1uha8ag-icon-pulse 3s ease-in-out infinite}@keyframes svelte-1uha8ag-icon-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.08)}}.hero-title.svelte-1uha8ag{font-size:32px;font-weight:700;color:var(--color-text-primary);margin:0;letter-spacing:-.025em;font-family:var(--font-sans);line-height:1.15}.hero-subtitle.svelte-1uha8ag{font-size:14px;color:var(--color-text-secondary);margin:0;font-family:var(--font-sans);max-width:400px;line-height:1.6}.prompt-section.svelte-1uha8ag{width:100%;max-width:640px;display:flex;flex-direction:column;align-items:center;gap:10px;margin-top:28px}.prompt-box.svelte-1uha8ag{display:flex;align-items:flex-end;width:100%;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:14px;padding:8px;gap:4px;transition:border-color .2s,box-shadow .2s}.prompt-box.svelte-1uha8ag:focus-within{border-color:oklch(from var(--color-accent) l c h / 60%);box-shadow:0 0 0 3px oklch(from var(--color-accent) l c h / 8%),0 8px 32px -8px oklch(from var(--color-accent) l c h / 12%)}.prompt-box.disabled.svelte-1uha8ag{opacity:.55;pointer-events:none}.prompt-action-btn.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:38px;height:38px;min-width:38px;border-radius:10px;border:none;cursor:pointer;transition:all .15s;flex-shrink:0}.attach-btn.svelte-1uha8ag{background:var(--color-bg-secondary);border:1px solid var(--color-border);color:var(--color-text-secondary)}.attach-btn.svelte-1uha8ag:hover:not(:disabled){border-color:oklch(from var(--color-accent) l c h / 50%);color:var(--color-accent)}.attach-btn.svelte-1uha8ag:disabled{opacity:.4;cursor:default}.send-btn.svelte-1uha8ag{background:var(--color-accent);color:#fff}.send-btn.svelte-1uha8ag:hover:not(:disabled){filter:brightness(1.12);transform:scale(1.04)}.send-btn.svelte-1uha8ag:disabled{opacity:.3;cursor:default}.prompt-input.svelte-1uha8ag{flex:1;background:none;border:none;outline:none;color:var(--color-text-primary);font-size:14px;font-family:var(--font-sans);line-height:1.55;padding:8px 10px;resize:none;min-height:44px;max-height:160px}.prompt-input.svelte-1uha8ag::placeholder{color:var(--color-text-secondary);opacity:.45}.prompt-input.svelte-1uha8ag:disabled{opacity:.5}.spinner-icon{animation:svelte-1uha8ag-spin .8s linear infinite}@keyframes svelte-1uha8ag-spin{to{transform:rotate(360deg)}}.sending-hint.svelte-1uha8ag{font-size:12px;color:var(--color-text-secondary);margin:0;font-family:var(--font-sans);animation:svelte-1uha8ag-pulse-text 1.5s ease-in-out infinite}@keyframes svelte-1uha8ag-pulse-text{0%,to{opacity:.5}50%{opacity:1}}.section-label.svelte-1uha8ag{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--color-text-secondary);font-family:var(--font-sans);text-transform:uppercase;letter-spacing:.06em;padding-left:4px}.templates-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;gap:14px;margin-top:40px}.templates-row.svelte-1uha8ag{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px}.template-card.svelte-1uha8ag{display:flex;flex-direction:column;gap:12px;padding:18px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:14px;cursor:pointer;text-align:left;position:relative;transition:border-color .2s,background .2s,transform .2s,box-shadow .2s}.template-card.svelte-1uha8ag:hover{border-color:oklch(from var(--color-accent) l c h / 45%);background:oklch(from var(--color-accent) l c h / 4%);transform:translateY(-2px);box-shadow:0 8px 24px -8px oklch(from var(--color-accent) l c h / 10%)}.template-icon.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:11px;background:oklch(from var(--color-accent) l c h / 10%);color:var(--color-accent);transition:background .2s}.template-card.svelte-1uha8ag:hover .template-icon:where(.svelte-1uha8ag){background:oklch(from var(--color-accent) l c h / 16%)}.template-info.svelte-1uha8ag{display:flex;flex-direction:column;gap:4px;flex:1}.template-name.svelte-1uha8ag{font-size:13px;font-weight:600;color:var(--color-text-primary);font-family:var(--font-sans);line-height:1.3}.template-desc.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.template-arrow.svelte-1uha8ag{position:absolute;top:16px;right:16px;color:var(--color-text-secondary);opacity:0;transition:opacity .2s,color .2s,transform .2s;display:flex}.template-card.svelte-1uha8ag:hover .template-arrow:where(.svelte-1uha8ag){opacity:1;color:var(--color-accent);transform:translate(2px)}.recent-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;gap:14px;margin-top:36px}.recent-row.svelte-1uha8ag{display:flex;gap:10px;overflow-x:auto;padding-bottom:4px;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch}.recent-row.svelte-1uha8ag::-webkit-scrollbar{height:0;display:none}.recent-row.svelte-1uha8ag{scrollbar-width:none}.recent-card.svelte-1uha8ag{display:flex;align-items:center;gap:12px;min-width:220px;max-width:280px;padding:14px 16px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:12px;cursor:pointer;text-align:left;position:relative;transition:border-color .2s,background .2s,transform .2s,box-shadow .2s;scroll-snap-align:start;flex-shrink:0}.recent-card.svelte-1uha8ag:hover{border-color:oklch(from var(--color-accent) l c h / 40%);background:oklch(from var(--color-accent) l c h / 3%);transform:translateY(-1px);box-shadow:0 4px 16px -4px oklch(from var(--color-accent) l c h / 8%)}.recent-card-icon.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:34px;height:34px;min-width:34px;border-radius:9px;background:oklch(from var(--color-accent) l c h / 8%);color:var(--color-accent);opacity:.8;transition:opacity .2s}.recent-card.svelte-1uha8ag:hover .recent-card-icon:where(.svelte-1uha8ag){opacity:1}.recent-card-info.svelte-1uha8ag{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.recent-card-name.svelte-1uha8ag{font-size:13px;font-weight:600;color:var(--color-text-primary);font-family:var(--font-sans);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.recent-card-date.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);opacity:.7}.recent-card-arrow.svelte-1uha8ag{display:flex;color:var(--color-text-secondary);opacity:0;transition:opacity .2s,color .2s,transform .2s;flex-shrink:0}.recent-card.svelte-1uha8ag:hover .recent-card-arrow:where(.svelte-1uha8ag){opacity:1;color:var(--color-accent);transform:translate(2px)}@media(max-width:640px){.hero-title.svelte-1uha8ag{font-size:26px}.templates-row.svelte-1uha8ag{grid-template-columns:repeat(2,1fr)}.recent-card.svelte-1uha8ag{min-width:200px}.page-content.svelte-1uha8ag{padding:0 16px 40px}} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/2.iGbBghFD.css b/studio-desktop/frontend-dist/_app/immutable/assets/2.iGbBghFD.css deleted file mode 100644 index ac3f882a..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/2.iGbBghFD.css +++ /dev/null @@ -1 +0,0 @@ -.home-page.svelte-1uha8ag{position:relative;display:flex;flex-direction:column;align-items:center;min-height:100%;overflow-x:hidden;overflow-y:auto;background:var(--color-bg-primary)}.bg-effects.svelte-1uha8ag{position:fixed;inset:0;pointer-events:none;z-index:0;overflow:hidden}.bg-orb.svelte-1uha8ag{position:absolute;border-radius:50%;filter:blur(120px);will-change:transform,opacity}.bg-orb-1.svelte-1uha8ag{width:700px;height:700px;top:-15%;left:-10%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 60%);opacity:.14;animation:svelte-1uha8ag-orb-drift-1 22s ease-in-out infinite}.bg-orb-2.svelte-1uha8ag{width:550px;height:550px;bottom:-12%;right:-8%;background:radial-gradient(circle,oklch(from var(--color-accent) calc(l + .1) c h) 0%,transparent 60%);opacity:.1;animation:svelte-1uha8ag-orb-drift-2 28s ease-in-out infinite}.bg-orb-3.svelte-1uha8ag{width:400px;height:400px;top:35%;right:15%;background:radial-gradient(circle,var(--color-accent) 0%,transparent 60%);opacity:.06;animation:svelte-1uha8ag-orb-drift-3 18s ease-in-out infinite}@keyframes svelte-1uha8ag-orb-drift-1{0%,to{transform:translate(0) scale(1)}33%{transform:translate(60px,40px) scale(1.1)}66%{transform:translate(-30px,20px) scale(.95)}}@keyframes svelte-1uha8ag-orb-drift-2{0%,to{transform:translate(0) scale(1)}33%{transform:translate(-50px,-30px) scale(1.05)}66%{transform:translate(40px,-50px) scale(.9)}}@keyframes svelte-1uha8ag-orb-drift-3{0%,to{transform:translate(0) scale(1);opacity:.04}50%{transform:translate(-40px,30px) scale(1.15);opacity:.08}}.bg-grid.svelte-1uha8ag{position:absolute;inset:0;background-image:linear-gradient(to right,rgba(255,255,255,.1) 1px,transparent 1px),linear-gradient(to bottom,rgba(255,255,255,.1) 1px,transparent 1px);background-size:48px 48px;mask-image:radial-gradient(ellipse 100% 90% at 50% 35%,black 10%,transparent 80%);-webkit-mask-image:radial-gradient(ellipse 100% 90% at 50% 35%,black 10%,transparent 80%);animation:svelte-1uha8ag-grid-fade-in 1.2s ease-out}@keyframes svelte-1uha8ag-grid-fade-in{0%{opacity:0}to{opacity:1}}.bg-vignette.svelte-1uha8ag{position:absolute;inset:0;background:radial-gradient(ellipse 80% 80% at 50% 50%,transparent 30%,rgba(0,0,0,.4) 100%)}.page-content.svelte-1uha8ag{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;width:100%;max-width:860px;padding:0 32px 48px}.hero-section.svelte-1uha8ag{display:flex;flex-direction:column;align-items:center;text-align:center;gap:12px;padding-top:clamp(56px,12vh,120px);padding-bottom:8px}.hero-title.svelte-1uha8ag{font-size:30px;font-weight:700;color:var(--color-text-primary);margin:0;letter-spacing:-.02em;font-family:var(--font-sans);line-height:1.2}.hero-subtitle.svelte-1uha8ag{font-size:14px;color:var(--color-text-secondary);margin:0;font-family:var(--font-sans);max-width:420px;line-height:1.5;opacity:.8}.prompt-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;align-items:center;gap:10px;margin-top:28px}.prompt-box.svelte-1uha8ag{display:flex;flex-direction:column;width:100%;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:16px;overflow:hidden;transition:border-color .2s,box-shadow .2s}.prompt-box.svelte-1uha8ag:focus-within{border-color:oklch(from var(--color-accent) l c h / 50%);box-shadow:0 0 0 3px oklch(from var(--color-accent) l c h / 6%),0 8px 32px -8px oklch(from var(--color-accent) l c h / 10%)}.prompt-box.disabled.svelte-1uha8ag{opacity:.55;pointer-events:none}.prompt-input.svelte-1uha8ag{width:100%;background:none;border:none;outline:none;color:var(--color-text-primary);font-size:15px;font-family:var(--font-sans);line-height:1.55;padding:18px 20px 8px;resize:none;min-height:60px;max-height:180px}.prompt-input.svelte-1uha8ag::placeholder{color:var(--color-text-secondary);opacity:.5}.prompt-input.svelte-1uha8ag:disabled{opacity:.5}.attachment-chips.svelte-1uha8ag{display:flex;flex-wrap:wrap;gap:6px;padding:4px 18px 0}.attachment-chip.svelte-1uha8ag{display:flex;align-items:center;gap:5px;padding:4px 10px;background:oklch(from var(--color-accent) l c h / 8%);border:1px solid oklch(from var(--color-accent) l c h / 18%);border-radius:8px;font-size:11px;font-family:var(--font-sans);max-width:220px}.chip-icon.svelte-1uha8ag{display:flex;color:var(--color-accent);flex-shrink:0}.chip-name.svelte-1uha8ag{color:var(--color-text-primary);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chip-size.svelte-1uha8ag{color:var(--color-text-secondary);opacity:.7;flex-shrink:0}.chip-remove.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;border:none;background:transparent;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0;transition:background .15s,color .15s}.chip-remove.svelte-1uha8ag:hover{background:#ffffff1a;color:var(--color-text-primary)}.prompt-toolbar.svelte-1uha8ag{display:flex;align-items:center;justify-content:space-between;padding:8px 12px}.toolbar-left.svelte-1uha8ag,.toolbar-right.svelte-1uha8ag{display:flex;align-items:center;gap:4px}.toolbar-btn.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:var(--color-text-secondary);cursor:pointer;transition:all .15s}.toolbar-btn.svelte-1uha8ag:hover:not(:disabled){background:#ffffff0f;color:var(--color-text-primary)}.toolbar-btn.svelte-1uha8ag:disabled{opacity:.35;cursor:default}.send-btn.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:10px;border:none;background:var(--color-accent);color:#fff;cursor:pointer;transition:all .15s}.send-btn.svelte-1uha8ag:hover:not(:disabled){filter:brightness(1.12);transform:scale(1.04)}.send-btn.svelte-1uha8ag:disabled{opacity:.3;cursor:default}.spinner-icon{animation:svelte-1uha8ag-spin .8s linear infinite}@keyframes svelte-1uha8ag-spin{to{transform:rotate(360deg)}}.sending-hint.svelte-1uha8ag{font-size:12px;color:var(--color-text-secondary);margin:0;font-family:var(--font-sans);animation:svelte-1uha8ag-pulse-text 1.5s ease-in-out infinite}@keyframes svelte-1uha8ag-pulse-text{0%,to{opacity:.5}50%{opacity:1}}.section-label.svelte-1uha8ag{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:600;color:var(--color-text-secondary);font-family:var(--font-sans);text-transform:uppercase;letter-spacing:.06em;padding-left:4px}.templates-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;gap:14px;margin-top:36px}.templates-row.svelte-1uha8ag{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px}.template-card.svelte-1uha8ag{display:flex;flex-direction:column;gap:12px;padding:18px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:14px;cursor:pointer;text-align:left;position:relative;transition:border-color .2s,background .2s,transform .2s,box-shadow .2s}.template-card.svelte-1uha8ag:hover{border-color:oklch(from var(--color-accent) l c h / 45%);background:oklch(from var(--color-accent) l c h / 4%);transform:translateY(-2px);box-shadow:0 8px 24px -8px oklch(from var(--color-accent) l c h / 10%)}.template-icon.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:10px;background:oklch(from var(--color-accent) l c h / 10%);color:var(--color-accent);transition:background .2s}.template-card.svelte-1uha8ag:hover .template-icon:where(.svelte-1uha8ag){background:oklch(from var(--color-accent) l c h / 16%)}.template-info.svelte-1uha8ag{display:flex;flex-direction:column;gap:4px;flex:1}.template-name.svelte-1uha8ag{font-size:13px;font-weight:600;color:var(--color-text-primary);font-family:var(--font-sans);line-height:1.3}.template-desc.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.template-arrow.svelte-1uha8ag{position:absolute;top:16px;right:16px;color:var(--color-text-secondary);opacity:0;transition:opacity .2s,color .2s,transform .2s;display:flex}.template-card.svelte-1uha8ag:hover .template-arrow:where(.svelte-1uha8ag){opacity:1;color:var(--color-accent);transform:translate(2px)}.projects-section.svelte-1uha8ag{width:100%;display:flex;flex-direction:column;gap:14px;margin-top:36px}.section-header.svelte-1uha8ag{display:flex;align-items:center;justify-content:space-between}.clear-all-btn.svelte-1uha8ag{font-size:11px;font-family:var(--font-sans);color:var(--color-text-secondary);background:none;border:none;cursor:pointer;padding:2px 8px;border-radius:4px;opacity:.6;transition:opacity .15s,color .15s}.clear-all-btn.svelte-1uha8ag:hover{opacity:1;color:#f87171}.delete-all-confirm.svelte-1uha8ag{display:flex;align-items:center;gap:8px}.delete-all-text.svelte-1uha8ag{font-size:11px;font-family:var(--font-sans);color:#f87171;font-weight:500}.confirm-btn.svelte-1uha8ag{font-size:11px;font-family:var(--font-sans);font-weight:500;padding:3px 10px;border-radius:6px;border:none;cursor:pointer;transition:all .15s}.confirm-btn.danger.svelte-1uha8ag{background:#f87171;color:#fff}.confirm-btn.danger.svelte-1uha8ag:hover{background:#ef4444}.confirm-btn.cancel.svelte-1uha8ag{background:#ffffff0f;color:var(--color-text-secondary)}.confirm-btn.cancel.svelte-1uha8ag:hover{background:#ffffff1a;color:var(--color-text-primary)}.search-bar.svelte-1uha8ag{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:10px;transition:border-color .2s,box-shadow .2s;color:var(--color-text-secondary)}.search-bar.svelte-1uha8ag:focus-within{border-color:oklch(from var(--color-accent) l c h / 45%);box-shadow:0 0 0 3px oklch(from var(--color-accent) l c h / 6%)}.search-input.svelte-1uha8ag{flex:1;background:none;border:none;outline:none;font-size:13px;font-family:var(--font-sans);color:var(--color-text-primary)}.search-input.svelte-1uha8ag::placeholder{color:var(--color-text-secondary);opacity:.5}.search-clear.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;border:none;background:transparent;color:var(--color-text-secondary);cursor:pointer;transition:background .15s,color .15s}.search-clear.svelte-1uha8ag:hover{background:#ffffff14;color:var(--color-text-primary)}.projects-grid.svelte-1uha8ag{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px}.project-card.svelte-1uha8ag{display:flex;flex-direction:column;gap:12px;padding:18px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:14px;cursor:pointer;text-align:left;position:relative;transition:border-color .2s,background .2s,transform .2s,box-shadow .2s}.project-card.svelte-1uha8ag:hover{border-color:oklch(from var(--color-accent) l c h / 45%);background:oklch(from var(--color-accent) l c h / 4%);transform:translateY(-2px);box-shadow:0 8px 24px -8px oklch(from var(--color-accent) l c h / 10%)}.project-card.deleting.svelte-1uha8ag{border-color:#f871714d;background:#f871710a;cursor:default;min-height:140px;justify-content:center;align-items:center}.project-icon.svelte-1uha8ag{display:flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:10px;background:oklch(from var(--color-accent) l c h / 10%);color:var(--color-accent);transition:background .2s}.project-card.svelte-1uha8ag:hover .project-icon:where(.svelte-1uha8ag){background:oklch(from var(--color-accent) l c h / 16%)}.project-info.svelte-1uha8ag{display:flex;flex-direction:column;gap:4px;flex:1;min-width:0}.project-name.svelte-1uha8ag{font-size:13px;font-weight:600;color:var(--color-text-primary);font-family:var(--font-sans);line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.project-desc.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.project-date.svelte-1uha8ag{font-size:11px;color:var(--color-text-secondary);font-family:var(--font-sans);opacity:.7}.project-arrow.svelte-1uha8ag{position:absolute;bottom:16px;right:16px;color:var(--color-text-secondary);opacity:0;transition:opacity .2s,color .2s,transform .2s;display:flex}.project-card.svelte-1uha8ag:hover .project-arrow:where(.svelte-1uha8ag){opacity:1;color:var(--color-accent);transform:translate(2px)}.no-results.svelte-1uha8ag{font-size:13px;color:var(--color-text-secondary);font-family:var(--font-sans);text-align:center;padding:20px 0;opacity:.7;margin:0}.delete-confirm-content.svelte-1uha8ag{display:flex;flex-direction:column;align-items:center;gap:10px;width:100%;padding:4px 0}.delete-confirm-text.svelte-1uha8ag{font-size:12px;font-family:var(--font-sans);color:var(--color-text-primary);font-weight:500;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.delete-confirm-actions.svelte-1uha8ag{display:flex;gap:6px}.rename-input.svelte-1uha8ag,.desc-input.svelte-1uha8ag{font-size:13px;font-family:var(--font-sans);color:var(--color-text-primary);background:#ffffff0f;border:1px solid oklch(from var(--color-accent) l c h / 40%);border-radius:6px;padding:2px 6px;outline:none;width:100%}.rename-input.svelte-1uha8ag{font-weight:600}.desc-input.svelte-1uha8ag{font-size:11px;opacity:.9}.rename-input.svelte-1uha8ag:focus,.desc-input.svelte-1uha8ag:focus{border-color:var(--color-accent);box-shadow:0 0 0 2px oklch(from var(--color-accent) l c h / 12%)}.card-menu-btn.svelte-1uha8ag{position:absolute;top:6px;right:6px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;border:none;background:transparent;color:var(--color-text-secondary);cursor:pointer;opacity:0;transition:opacity .15s,background .15s,color .15s;z-index:2}.project-card.svelte-1uha8ag:hover .card-menu-btn:where(.svelte-1uha8ag){opacity:.6}.card-menu-btn.svelte-1uha8ag:hover{opacity:1!important;background:#ffffff14;color:var(--color-text-primary)}.card-menu.svelte-1uha8ag{position:absolute;top:32px;right:6px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:10px;padding:4px;min-width:140px;box-shadow:0 8px 24px #0000004d;z-index:10;animation:svelte-1uha8ag-menu-in .12s ease-out}@keyframes svelte-1uha8ag-menu-in{0%{opacity:0;transform:translateY(-4px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}.menu-item.svelte-1uha8ag{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;background:none;border:none;border-radius:7px;font-size:12px;font-family:var(--font-sans);color:var(--color-text-primary);cursor:pointer;transition:background .12s}.menu-item.svelte-1uha8ag:hover{background:#ffffff0f}.menu-item.danger.svelte-1uha8ag{color:#f87171}.menu-item.danger.svelte-1uha8ag:hover{background:#f8717114}.menu-divider.svelte-1uha8ag{height:1px;background:var(--color-border);margin:3px 6px}.backdrop.svelte-1uha8ag{position:fixed;inset:0;z-index:5;background:transparent;border:none;cursor:default}@media(max-width:640px){.hero-title.svelte-1uha8ag{font-size:24px}.templates-row.svelte-1uha8ag,.projects-grid.svelte-1uha8ag{grid-template-columns:repeat(2,1fr)}.page-content.svelte-1uha8ag{padding:0 16px 40px}} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/3.bRsBZawq.css b/studio-desktop/frontend-dist/_app/immutable/assets/3.bRsBZawq.css deleted file mode 100644 index 6cd0e4b6..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/3.bRsBZawq.css +++ /dev/null @@ -1 +0,0 @@ -.transparent.svelte-1wg91mu{background:transparent}.a11y-hidden.svelte-13pq11u{display:none}.a11y-live-msg.svelte-13pq11u{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(0px,0px,0px,0px);clip-path:inset(100%)}.svelte-flow__selection.svelte-1vr3gfi{position:absolute;top:0;left:0}.svelte-flow__selection-wrapper.svelte-sf2y5e{position:absolute;top:0;left:0;z-index:2000;pointer-events:all}.svelte-flow__selection-wrapper.svelte-sf2y5e:focus,.svelte-flow__selection-wrapper.svelte-sf2y5e:focus-visible{outline:none}.svelte-flow.svelte-mkap6j{width:100%;height:100%;overflow:hidden;position:relative;z-index:0;background-color:var(--background-color, var(--background-color-default))}:root{--background-color-default: #fff;--background-pattern-color-default: #ddd;--minimap-mask-color-default: rgb(240, 240, 240, .6);--minimap-mask-stroke-color-default: none;--minimap-mask-stroke-width-default: 1;--controls-button-background-color-default: #fefefe;--controls-button-background-color-hover-default: #f4f4f4;--controls-button-color-default: inherit;--controls-button-color-hover-default: inherit;--controls-button-border-color-default: #eee}.agent-node.svelte-uofr5c{width:220px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #6366f11a,0 0 0 1px #6366f12e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.agent-node.exec-running.svelte-uofr5c{box-shadow:none}.agent-node.exec-running.svelte-uofr5c:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#6366f1 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-uofr5c-agent-spin 1.2s linear infinite;pointer-events:none}.agent-node.exec-complete.svelte-uofr5c{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.agent-node.exec-error.svelte-uofr5c{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-uofr5c-agent-spin{to{transform:rotate(360deg)}}.agent-header.svelte-uofr5c{background:linear-gradient(135deg,#6366f1,#4f46e5);padding:6px 10px 8px;display:flex;flex-direction:column;gap:4px}.agent-node.exec-running.svelte-uofr5c .agent-header:where(.svelte-uofr5c){background:linear-gradient(135deg,#6366f1,#818cf8)}.agent-node.exec-error.svelte-uofr5c .agent-header:where(.svelte-uofr5c){background:linear-gradient(135deg,#6366f1,#7c3aed,#ef4444)}.header-top-row.svelte-uofr5c{display:flex;align-items:center;justify-content:space-between;min-height:16px}.header-badges.svelte-uofr5c{display:flex;align-items:center;gap:4px;min-width:0}.multimodal-badge.svelte-uofr5c{display:flex;align-items:center;justify-content:center;width:18px;height:14px;border-radius:7px;background:#ffffff1f;color:#ffffffb3;flex-shrink:0}.model-badge.svelte-uofr5c{font-size:9px;font-weight:600;color:#ffffffb3;background:#ffffff1f;padding:1px 6px;border-radius:8px;letter-spacing:.02em;line-height:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px}.settings-icon.svelte-uofr5c{color:#ffffff59;display:flex;align-items:center;cursor:pointer;transition:color .15s ease}.settings-icon.svelte-uofr5c:hover{color:#ffffffb3}.header-main-row.svelte-uofr5c{display:flex;align-items:center;gap:6px;color:#fff}.agent-title.svelte-uofr5c{flex:1;font-size:12px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-uofr5c{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-uofr5c{background:#ffffff4d}.dot-running.svelte-uofr5c{background:#22c55e;animation:svelte-uofr5c-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-uofr5c{background:#ef4444}.dot-complete.svelte-uofr5c{background:#22c55e}@keyframes svelte-uofr5c-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-uofr5c{display:flex;align-items:center;color:#22c55e}.state-error.svelte-uofr5c{color:#ef4444}.agent-body.svelte-uofr5c{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-uofr5c{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin.svelte-uofr5c{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-uofr5c:hover{color:#b0b0c8}.pin-dot.svelte-uofr5c{width:6px;height:6px;border-radius:50%;background:#6366f1;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-uofr5c:hover .pin-dot:where(.svelte-uofr5c){transform:scale(1.4);box-shadow:0 0 6px #6366f180}.description-text.svelte-uofr5c{font-size:10px;color:#a0a0b8;padding:2px 10px 4px;line-height:1.4}.instructions-section.svelte-uofr5c{margin:4px 8px 2px;padding:5px 7px;background:#6366f10a;border:1px solid rgba(99,102,241,.08);border-radius:5px}.section-label.svelte-uofr5c{font-size:8px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#6366f1;opacity:.6}.instructions-text.svelte-uofr5c{font-size:10px;color:#7a7a94;font-family:JetBrains Mono,monospace;line-height:1.35;margin:2px 0 0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.tool-node.svelte-107d6w1{width:180px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #8b5cf61a,0 0 0 1px #8b5cf62e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.tool-node.exec-running.svelte-107d6w1{box-shadow:none}.tool-node.exec-running.svelte-107d6w1:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#8b5cf6 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-107d6w1-tool-spin 1.2s linear infinite;pointer-events:none}.tool-node.exec-complete.svelte-107d6w1{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.tool-node.exec-error.svelte-107d6w1{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-107d6w1-tool-spin{to{transform:rotate(360deg)}}.tool-header.svelte-107d6w1{background:linear-gradient(135deg,#8b5cf6,#7c3aed);padding:7px 10px}.tool-node.exec-running.svelte-107d6w1 .tool-header:where(.svelte-107d6w1){background:linear-gradient(135deg,#8b5cf6,#a78bfa)}.tool-node.exec-error.svelte-107d6w1 .tool-header:where(.svelte-107d6w1){background:linear-gradient(135deg,#8b5cf6,#9333ea,#ef4444)}.header-row.svelte-107d6w1{display:flex;align-items:center;gap:5px;color:#fff}.tool-icon-wrap.svelte-107d6w1{display:flex;align-items:center;justify-content:center;width:22px;height:22px;background:#ffffff26;border-radius:5px;flex-shrink:0}.tool-title.svelte-107d6w1{flex:1;font-size:11px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-107d6w1{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-107d6w1{background:#ffffff4d}.dot-running.svelte-107d6w1{background:#22c55e;animation:svelte-107d6w1-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-107d6w1{background:#ef4444}.dot-complete.svelte-107d6w1{background:#22c55e}@keyframes svelte-107d6w1-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-107d6w1{display:flex;align-items:center;color:#22c55e}.state-error.svelte-107d6w1{color:#ef4444}.tool-body.svelte-107d6w1{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-107d6w1{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin.svelte-107d6w1{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-107d6w1:hover{color:#b0b0c8}.pin-dot.svelte-107d6w1{width:6px;height:6px;border-radius:50%;background:#8b5cf6;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-107d6w1:hover .pin-dot:where(.svelte-107d6w1){transform:scale(1.4);box-shadow:0 0 6px #8b5cf680}.prop-row.svelte-107d6w1{display:flex;justify-content:space-between;padding:2px 10px;font-size:10px}.prop-key.svelte-107d6w1{color:#6a6a80;font-family:JetBrains Mono,monospace}.prop-val.svelte-107d6w1{color:#a0a0b8;font-family:JetBrains Mono,monospace;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100px;text-align:right}.tool-description.svelte-107d6w1{font-size:10px;color:#8888a0;padding:2px 10px 4px;line-height:1.35}.reason-node.svelte-15a1m3{width:200px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #ec48991a,0 0 0 1px #ec48992e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.reason-node.exec-running.svelte-15a1m3{box-shadow:none}.reason-node.exec-running.svelte-15a1m3:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#ec4899 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-15a1m3-reasoning-spin 1.2s linear infinite;pointer-events:none}.reason-node.exec-complete.svelte-15a1m3{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.reason-node.exec-error.svelte-15a1m3{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-15a1m3-reasoning-spin{to{transform:rotate(360deg)}}.reason-header.svelte-15a1m3{background:linear-gradient(135deg,#ec4899,#db2777);padding:7px 10px 8px;display:flex;flex-direction:column;gap:3px}.reason-node.exec-running.svelte-15a1m3 .reason-header:where(.svelte-15a1m3){background:linear-gradient(135deg,#ec4899,#f472b6)}.reason-node.exec-error.svelte-15a1m3 .reason-header:where(.svelte-15a1m3){background:linear-gradient(135deg,#ec4899,#be185d,#ef4444)}.header-row.svelte-15a1m3{display:flex;align-items:center;gap:5px;color:#fff}.brain-icon-wrap.svelte-15a1m3{display:flex;align-items:center;justify-content:center;width:22px;height:22px;background:#ffffff26;border-radius:6px;flex-shrink:0}.reason-title.svelte-15a1m3{flex:1;font-size:11px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pattern-name.svelte-15a1m3{font-size:10px;font-weight:600;color:#ffffffbf;background:#ffffff1a;padding:1px 7px;border-radius:8px;align-self:flex-start;letter-spacing:.02em}.status-dot.svelte-15a1m3{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-15a1m3{background:#ffffff4d}.dot-running.svelte-15a1m3{background:#22c55e;animation:svelte-15a1m3-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-15a1m3{background:#ef4444}.dot-complete.svelte-15a1m3{background:#22c55e}@keyframes svelte-15a1m3-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-15a1m3{display:flex;align-items:center;color:#22c55e}.state-error.svelte-15a1m3{color:#ef4444}.reason-body.svelte-15a1m3{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-15a1m3{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin.svelte-15a1m3{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-15a1m3:hover{color:#b0b0c8}.pin-dot.svelte-15a1m3{width:6px;height:6px;border-radius:50%;background:#ec4899;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-15a1m3:hover .pin-dot:where(.svelte-15a1m3){transform:scale(1.4);box-shadow:0 0 6px #ec489980}.reason-description.svelte-15a1m3{font-size:10px;color:#8888a0;padding:2px 10px 4px;line-height:1.35}.steps-row.svelte-15a1m3{display:flex;align-items:center;justify-content:space-between;padding:4px 10px 0}.steps-label.svelte-15a1m3{font-size:9px;color:#6a6a80;font-family:JetBrains Mono,monospace;text-transform:uppercase;letter-spacing:.04em}.steps-badge.svelte-15a1m3{font-size:10px;font-weight:700;color:#f9a8d4;background:#ec48991a;border:1px solid rgba(236,72,153,.15);padding:1px 8px;border-radius:8px;font-variant-numeric:tabular-nums}.cond-node.svelte-9dvt8o{width:200px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #f59e0b1a,0 0 0 1px #f59e0b2e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.cond-node.exec-running.svelte-9dvt8o{box-shadow:none}.cond-node.exec-running.svelte-9dvt8o:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#f59e0b 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-9dvt8o-spin-border 1.2s linear infinite;pointer-events:none}.cond-node.exec-complete.svelte-9dvt8o{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.cond-node.exec-error.svelte-9dvt8o{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-9dvt8o-spin-border{to{transform:rotate(360deg)}}.cond-header.svelte-9dvt8o{position:relative;background:linear-gradient(135deg,#f59e0b,#d97706);padding:8px 10px;overflow:hidden}.cond-node.exec-running.svelte-9dvt8o .cond-header:where(.svelte-9dvt8o){background:linear-gradient(135deg,#f59e0b,#fbbf24)}.cond-node.exec-error.svelte-9dvt8o .cond-header:where(.svelte-9dvt8o){background:linear-gradient(135deg,#f59e0b,#ea580c,#ef4444)}.hex-accent.svelte-9dvt8o{position:absolute;top:-6px;right:-6px;width:28px;height:28px;background:#ffffff14;transform:rotate(45deg);border-radius:4px}.header-content.svelte-9dvt8o{display:flex;align-items:center;gap:5px;color:#fff;position:relative;z-index:1}.cond-title.svelte-9dvt8o{flex:1;font-size:11px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-9dvt8o{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-9dvt8o{background:#ffffff4d}.dot-running.svelte-9dvt8o{background:#22c55e;animation:svelte-9dvt8o-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-9dvt8o{background:#ef4444}.dot-complete.svelte-9dvt8o{background:#22c55e}@keyframes svelte-9dvt8o-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-9dvt8o{display:flex;align-items:center;color:#22c55e}.state-error.svelte-9dvt8o{color:#ef4444}.cond-body.svelte-9dvt8o{background:#1a1a26;padding:8px 0 6px}.condition-expr.svelte-9dvt8o{margin:0 8px 6px;padding:5px 7px;background:#f59e0b0d;border:1px solid rgba(245,158,11,.1);border-radius:5px}.expr-code.svelte-9dvt8o{font-size:10px;font-family:JetBrains Mono,monospace;color:#fbbf24;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cond-description.svelte-9dvt8o{font-size:10px;color:#8888a0;padding:0 10px 4px;line-height:1.35}.branch-pins.svelte-9dvt8o{display:flex;justify-content:space-between;padding:4px 10px 0}.branch-in.svelte-9dvt8o{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;align-self:center}.branch-outputs.svelte-9dvt8o{display:flex;flex-direction:column;align-items:flex-end;gap:8px}.branch-out.svelte-9dvt8o{display:flex;align-items:center;gap:4px;font-size:9px;transition:opacity .15s ease}.branch-out.svelte-9dvt8o:hover{opacity:.8}.pin-dot.svelte-9dvt8o{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:transform .15s ease,box-shadow .15s ease}.branch-out.svelte-9dvt8o:hover .pin-dot:where(.svelte-9dvt8o),.branch-in.svelte-9dvt8o:hover .pin-dot:where(.svelte-9dvt8o){transform:scale(1.3)}.dot-in.svelte-9dvt8o{background:#f59e0b}.dot-true.svelte-9dvt8o{background:#22c55e;box-shadow:0 0 4px #22c55e4d}.dot-false.svelte-9dvt8o{background:#ef4444;box-shadow:0 0 4px #ef44444d}.pin-label.svelte-9dvt8o{color:#8888a0}.label-true.svelte-9dvt8o{color:#4ade80;font-weight:600}.label-false.svelte-9dvt8o{color:#f87171;font-weight:600}.bp-node.svelte-mcwl9o{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #06b6d41f,0 0 0 1px #06b6d433;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-mcwl9o{box-shadow:none}.bp-node.exec-running.svelte-mcwl9o:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#06b6d4 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-mcwl9o-memory-spin 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-mcwl9o{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-mcwl9o{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-mcwl9o-memory-spin{to{transform:rotate(360deg)}}.bp-header.svelte-mcwl9o{height:32px;background:linear-gradient(135deg,#06b6d4,#0891b2);color:#fff;display:flex;flex-direction:row;align-items:center;gap:6px;padding:0 10px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-mcwl9o{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-mcwl9o{display:flex;align-items:center;color:#22c55e}.bp-state-error.svelte-mcwl9o{color:#ef4444}.bp-body.svelte-mcwl9o{background:#1a1a26;padding:8px 0}.bp-pins.svelte-mcwl9o{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-in.svelte-mcwl9o,.bp-pin-out.svelte-mcwl9o{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0}.bp-dot.svelte-mcwl9o{width:6px;height:6px;border-radius:50%;background:#06b6d4}.bp-prop.svelte-mcwl9o{display:flex;justify-content:space-between;padding:2px 10px;font-size:10px}.bp-key.svelte-mcwl9o{color:#6a6a80;font-family:JetBrains Mono,monospace}.bp-val.svelte-mcwl9o{color:#a0a0b8;font-family:JetBrains Mono,monospace;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px;text-align:right}.bp-node.svelte-1y5xb8x{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #f59e0b1f,0 0 0 1px #f59e0b33;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-1y5xb8x{box-shadow:none}.bp-node.exec-running.svelte-1y5xb8x:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#f59e0b 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-1y5xb8x-validator-spin 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-1y5xb8x{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-1y5xb8x{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-1y5xb8x-validator-spin{to{transform:rotate(360deg)}}.bp-header.svelte-1y5xb8x{height:32px;background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;display:flex;flex-direction:row;align-items:center;gap:6px;padding:0 10px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-1y5xb8x{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-1y5xb8x{display:flex;align-items:center;color:#22c55e}.bp-state-error.svelte-1y5xb8x{color:#ef4444}.bp-body.svelte-1y5xb8x{background:#1a1a26;padding:8px 0}.bp-pins.svelte-1y5xb8x{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-in.svelte-1y5xb8x,.bp-pin-out.svelte-1y5xb8x{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0}.bp-dot.svelte-1y5xb8x{width:6px;height:6px;border-radius:50%;background:#f59e0b}.bp-prop.svelte-1y5xb8x{display:flex;justify-content:space-between;padding:2px 10px;font-size:10px}.bp-key.svelte-1y5xb8x{color:#6a6a80;font-family:JetBrains Mono,monospace}.bp-val.svelte-1y5xb8x{color:#a0a0b8;font-family:JetBrains Mono,monospace;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px;text-align:right}.bp-node.svelte-1ebq9zd{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #3b82f61f,0 0 0 1px #3b82f633;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-1ebq9zd{box-shadow:none}.bp-node.exec-running.svelte-1ebq9zd:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#3b82f6 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-1ebq9zd-spin-border 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-1ebq9zd{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-1ebq9zd{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-1ebq9zd-spin-border{to{transform:rotate(360deg)}}.bp-header.svelte-1ebq9zd{display:flex;align-items:center;gap:6px;padding:0 10px;height:32px;background:linear-gradient(135deg,#3b82f6,color-mix(in srgb,#3b82f6 70%,#000));color:#fff;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-1ebq9zd{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-1ebq9zd{margin-left:auto;display:flex;align-items:center;color:var(--color-success, #22c55e)}.bp-state-error.svelte-1ebq9zd{color:var(--color-error, #ef4444)}.bp-body.svelte-1ebq9zd{background:#1a1a26;padding:8px 0}.bp-pins.svelte-1ebq9zd{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-in.svelte-1ebq9zd,.bp-pin-out.svelte-1ebq9zd{display:flex;align-items:center;gap:4px}.bp-pin-in.svelte-1ebq9zd,.bp-pin-out.svelte-1ebq9zd{font-size:9px;color:#8888a0}.bp-dot.svelte-1ebq9zd{width:6px;height:6px;border-radius:50%;background:#3b82f6;flex-shrink:0}.bp-prop.svelte-1ebq9zd{display:flex;justify-content:space-between;align-items:baseline;padding:2px 10px;gap:8px}.bp-key.svelte-1ebq9zd{font-size:10px;color:#6a6a80;font-family:var(--font-mono, monospace);white-space:nowrap}.bp-val.svelte-1ebq9zd{font-size:10px;color:#a0a0b8;font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:140px;text-align:right}.bp-node.svelte-5h9d64{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #64748b1f,0 0 0 1px #64748b33;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-5h9d64{box-shadow:none}.bp-node.exec-running.svelte-5h9d64:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#64748b 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-5h9d64-spin-border 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-5h9d64{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-5h9d64{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-5h9d64-spin-border{to{transform:rotate(360deg)}}.bp-header.svelte-5h9d64{display:flex;align-items:center;gap:6px;padding:0 10px;height:32px;background:linear-gradient(135deg,#64748b,color-mix(in srgb,#64748b 70%,#000));color:#fff;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-5h9d64{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-5h9d64{margin-left:auto;display:flex;align-items:center;color:var(--color-success, #22c55e)}.bp-state-error.svelte-5h9d64{color:var(--color-error, #ef4444)}.bp-body.svelte-5h9d64{background:#1a1a26;padding:8px 0}.bp-pins-multi.svelte-5h9d64{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-col-left.svelte-5h9d64{display:flex;flex-direction:column;justify-content:center;gap:6px}.bp-pin-col-right.svelte-5h9d64{display:flex;flex-direction:column;align-items:flex-end;gap:6px}.bp-pin-in.svelte-5h9d64,.bp-pin-out.svelte-5h9d64{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0}.bp-dot.svelte-5h9d64{width:6px;height:6px;border-radius:50%;background:#64748b;flex-shrink:0}.bp-prop.svelte-5h9d64{display:flex;justify-content:space-between;align-items:baseline;padding:2px 10px;gap:8px}.bp-key.svelte-5h9d64{font-size:10px;color:#6a6a80;font-family:var(--font-mono, monospace);white-space:nowrap}.bp-val.svelte-5h9d64{font-size:10px;color:#a0a0b8;font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:140px;text-align:right}.bp-node.svelte-k2gv2h{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #64748b1f,0 0 0 1px #64748b33;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-k2gv2h{box-shadow:none}.bp-node.exec-running.svelte-k2gv2h:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#64748b 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-k2gv2h-spin-border 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-k2gv2h{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-k2gv2h{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-k2gv2h-spin-border{to{transform:rotate(360deg)}}.bp-header.svelte-k2gv2h{display:flex;align-items:center;gap:6px;padding:0 10px;height:32px;background:linear-gradient(135deg,#64748b,color-mix(in srgb,#64748b 70%,#000));color:#fff;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-k2gv2h{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-k2gv2h{margin-left:auto;display:flex;align-items:center;color:var(--color-success, #22c55e)}.bp-state-error.svelte-k2gv2h{color:var(--color-error, #ef4444)}.bp-body.svelte-k2gv2h{background:#1a1a26;padding:8px 0}.bp-pins-multi.svelte-k2gv2h{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-col-left.svelte-k2gv2h{display:flex;flex-direction:column;justify-content:center;gap:6px}.bp-pin-col-right.svelte-k2gv2h{display:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:6px}.bp-pin-in.svelte-k2gv2h,.bp-pin-out.svelte-k2gv2h{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0}.bp-dot.svelte-k2gv2h{width:6px;height:6px;border-radius:50%;background:#64748b;flex-shrink:0}.bp-prop.svelte-k2gv2h{display:flex;justify-content:space-between;align-items:baseline;padding:2px 10px;gap:8px}.bp-key.svelte-k2gv2h{font-size:10px;color:#6a6a80;font-family:var(--font-mono, monospace);white-space:nowrap}.bp-val.svelte-k2gv2h{font-size:10px;color:#a0a0b8;font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:140px;text-align:right}.input-node.svelte-170rmgf{width:220px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #10b9811a,0 0 0 1px #10b9812e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.input-node.exec-running.svelte-170rmgf{box-shadow:none}.input-node.exec-running.svelte-170rmgf:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#10b981 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-170rmgf-input-spin 1.2s linear infinite;pointer-events:none}.input-node.exec-complete.svelte-170rmgf{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.input-node.exec-error.svelte-170rmgf{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-170rmgf-input-spin{to{transform:rotate(360deg)}}.input-header.svelte-170rmgf{background:linear-gradient(135deg,#10b981,#059669);padding:6px 10px 8px;display:flex;flex-direction:column;gap:4px}.input-node.exec-running.svelte-170rmgf .input-header:where(.svelte-170rmgf){background:linear-gradient(135deg,#10b981,#34d399)}.input-node.exec-error.svelte-170rmgf .input-header:where(.svelte-170rmgf){background:linear-gradient(135deg,#10b981,#047857,#ef4444)}.header-top-row.svelte-170rmgf{display:flex;align-items:center;justify-content:space-between;min-height:16px}.header-badges.svelte-170rmgf{display:flex;align-items:center;gap:4px;min-width:0}.trigger-badge.svelte-170rmgf{font-size:9px;font-weight:600;color:#ffffffb3;background:#ffffff1f;padding:1px 6px;border-radius:8px;letter-spacing:.02em;line-height:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px;text-transform:capitalize}.settings-icon.svelte-170rmgf{color:#ffffff59;display:flex;align-items:center;cursor:pointer;transition:color .15s ease}.settings-icon.svelte-170rmgf:hover{color:#ffffffb3}.header-main-row.svelte-170rmgf{display:flex;align-items:center;gap:6px;color:#fff}.icon-wrap.svelte-170rmgf{display:flex;align-items:center;justify-content:center;width:22px;height:22px;background:#ffffff26;border-radius:6px;flex-shrink:0}.input-title.svelte-170rmgf{flex:1;font-size:12px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-170rmgf{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-170rmgf{background:#ffffff4d}.dot-running.svelte-170rmgf{background:#22c55e;animation:svelte-170rmgf-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-170rmgf{background:#ef4444}.dot-complete.svelte-170rmgf{background:#22c55e}@keyframes svelte-170rmgf-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-170rmgf{display:flex;align-items:center;color:#22c55e}.state-error.svelte-170rmgf{color:#ef4444}.input-body.svelte-170rmgf{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-170rmgf{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin-spacer.svelte-170rmgf{flex:1}.pin.svelte-170rmgf{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-170rmgf:hover{color:#b0b0c8}.pin-dot.svelte-170rmgf{width:6px;height:6px;border-radius:50%;background:#10b981;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-170rmgf:hover .pin-dot:where(.svelte-170rmgf){transform:scale(1.4);box-shadow:0 0 6px #10b98180}.description-text.svelte-170rmgf{font-size:10px;color:#a0a0b8;padding:2px 10px 4px;line-height:1.4}.config-section.svelte-170rmgf{margin:4px 8px 2px;padding:5px 7px;background:#10b9810a;border:1px solid rgba(16,185,129,.08);border-radius:5px}.section-label.svelte-170rmgf{font-size:8px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#10b981;opacity:.6}.config-text.svelte-170rmgf{font-size:10px;color:#7a7a94;font-family:JetBrains Mono,monospace;line-height:1.35;margin:2px 0 0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.output-node.svelte-198t6xy{width:220px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #3b82f61a,0 0 0 1px #3b82f62e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.output-node.exec-running.svelte-198t6xy{box-shadow:none}.output-node.exec-running.svelte-198t6xy:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#3b82f6 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-198t6xy-output-spin 1.2s linear infinite;pointer-events:none}.output-node.exec-complete.svelte-198t6xy{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.output-node.exec-error.svelte-198t6xy{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-198t6xy-output-spin{to{transform:rotate(360deg)}}.output-header.svelte-198t6xy{background:linear-gradient(135deg,#3b82f6,#2563eb);padding:6px 10px 8px;display:flex;flex-direction:column;gap:4px}.output-node.exec-running.svelte-198t6xy .output-header:where(.svelte-198t6xy){background:linear-gradient(135deg,#3b82f6,#60a5fa)}.output-node.exec-error.svelte-198t6xy .output-header:where(.svelte-198t6xy){background:linear-gradient(135deg,#3b82f6,#1d4ed8,#ef4444)}.header-top-row.svelte-198t6xy{display:flex;align-items:center;justify-content:space-between;min-height:16px}.header-badges.svelte-198t6xy{display:flex;align-items:center;gap:4px;min-width:0}.dest-badge.svelte-198t6xy{font-size:9px;font-weight:600;color:#ffffffb3;background:#ffffff1f;padding:1px 6px;border-radius:8px;letter-spacing:.02em;line-height:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px;text-transform:capitalize}.settings-icon.svelte-198t6xy{color:#ffffff59;display:flex;align-items:center;cursor:pointer;transition:color .15s ease}.settings-icon.svelte-198t6xy:hover{color:#ffffffb3}.header-main-row.svelte-198t6xy{display:flex;align-items:center;gap:6px;color:#fff}.icon-wrap.svelte-198t6xy{display:flex;align-items:center;justify-content:center;width:22px;height:22px;background:#ffffff26;border-radius:6px;flex-shrink:0}.output-title.svelte-198t6xy{flex:1;font-size:12px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-198t6xy{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-198t6xy{background:#ffffff4d}.dot-running.svelte-198t6xy{background:#22c55e;animation:svelte-198t6xy-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-198t6xy{background:#ef4444}.dot-complete.svelte-198t6xy{background:#22c55e}@keyframes svelte-198t6xy-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-198t6xy{display:flex;align-items:center;color:#22c55e}.state-error.svelte-198t6xy{color:#ef4444}.output-body.svelte-198t6xy{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-198t6xy{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin-spacer.svelte-198t6xy{flex:1}.pin.svelte-198t6xy{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-198t6xy:hover{color:#b0b0c8}.pin-dot.svelte-198t6xy{width:6px;height:6px;border-radius:50%;background:#3b82f6;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-198t6xy:hover .pin-dot:where(.svelte-198t6xy){transform:scale(1.4);box-shadow:0 0 6px #3b82f680}.description-text.svelte-198t6xy{font-size:10px;color:#a0a0b8;padding:2px 10px 4px;line-height:1.4}.config-section.svelte-198t6xy{margin:4px 8px 2px;padding:5px 7px;background:#3b82f60a;border:1px solid rgba(59,130,246,.08);border-radius:5px}.section-label.svelte-198t6xy{font-size:8px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#3b82f6;opacity:.6}.config-text.svelte-198t6xy{font-size:10px;color:#7a7a94;font-family:JetBrains Mono,monospace;line-height:1.35;margin:2px 0 0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.canvas-wrapper.svelte-e4xfdd{width:100%;height:100%;position:relative}.stats-bar.svelte-e4xfdd{position:absolute;top:12px;left:50%;transform:translate(-50%);z-index:5;display:flex;align-items:center;gap:0;background:#12121cd1;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.06);border-radius:20px;padding:5px 14px;box-shadow:0 2px 12px #0000004d;pointer-events:none;-webkit-user-select:none;user-select:none}.stat-item.svelte-e4xfdd{display:flex;align-items:center;gap:5px;padding:0 8px;color:#a0a0b8cc;font-size:11px;font-family:var(--font-sans, system-ui, sans-serif);white-space:nowrap}.stat-label.svelte-e4xfdd{color:#8888a099;font-weight:500}.stat-value.svelte-e4xfdd{color:#e8e8ede6;font-weight:600;font-variant-numeric:tabular-nums}.stat-divider.svelte-e4xfdd{width:1px;height:14px;background:#ffffff14;flex-shrink:0}.empty-overlay.svelte-e4xfdd{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:1}.empty-container.svelte-e4xfdd{display:flex;flex-direction:column;align-items:center;gap:12px;padding:40px 48px;border:2px dashed var(--color-border, #2a2a3a);border-radius:16px;color:var(--color-text-secondary, #8888a0);opacity:.6}.empty-headline.svelte-e4xfdd{font-size:16px;font-weight:600;color:var(--color-text-primary, #e8e8ed);margin:0}.empty-hint.svelte-e4xfdd{font-size:12px;color:var(--color-text-secondary, #8888a0);margin:0}.form-field.svelte-nvi5du{display:flex;flex-direction:column;gap:6px}.field-label.svelte-nvi5du{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0)}.field-input.svelte-nvi5du{background:var(--bg-elevated, #1a1a26);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;padding:8px 10px;font-size:12px;color:var(--color-text-primary, #e8e8ed);font-family:inherit;outline:none;transition:border-color .15s ease,box-shadow .15s ease;width:100%;box-sizing:border-box}.field-input.svelte-nvi5du:focus{border-color:var(--color-accent, #ff6b35);box-shadow:0 0 0 2px #ff6b3526}.field-input.svelte-nvi5du::placeholder{color:var(--color-text-secondary, #8888a0);opacity:.5}.field-textarea.svelte-nvi5du{resize:none;min-height:60px;line-height:1.5}.field-select.svelte-nvi5du{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238888a0' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:28px;cursor:pointer}.field-select.svelte-nvi5du option:where(.svelte-nvi5du){background:var(--bg-elevated, #1a1a26);color:var(--color-text-primary, #e8e8ed)}.config-panel.svelte-16rdffs{width:100%;background:var(--color-bg-secondary, #12121a);display:flex;flex-direction:column;overflow-y:auto}.panel-header.svelte-16rdffs{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--color-border, #2a2a3a)}.header-left.svelte-16rdffs{display:flex;align-items:center;gap:10px;min-width:0}.header-icon.svelte-16rdffs{width:28px;height:28px;border-radius:8px;background:oklch(from var(--node-color, #ff6b35) l c h / 15%);color:var(--node-color, #ff6b35);display:flex;align-items:center;justify-content:center;flex-shrink:0}.header-info.svelte-16rdffs{display:flex;flex-direction:column;min-width:0}.header-title.svelte-16rdffs{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.header-id.svelte-16rdffs{font-size:10px;font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-text-secondary, #8888a0);opacity:.7;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.close-btn.svelte-16rdffs{width:28px;height:28px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .15s ease,color .15s ease}.close-btn.svelte-16rdffs:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.panel-body.svelte-16rdffs{padding:16px;display:flex;flex-direction:column;gap:20px}.node-type-row.svelte-16rdffs{display:flex;align-items:center}.node-type-badge.svelte-16rdffs{display:inline-flex;padding:3px 10px;border-radius:10px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;background:oklch(from var(--badge-color, #ff6b35) l c h / 12%);color:var(--badge-color, #ff6b35);border:1px solid oklch(from var(--badge-color, #ff6b35) l c h / 20%)}.section.svelte-16rdffs{display:flex;flex-direction:column;gap:10px}.section-title.svelte-16rdffs{display:flex;align-items:center;gap:6px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0);padding-bottom:4px;border-bottom:1px solid var(--color-border, #2a2a3a)}.field-group.svelte-16rdffs{display:flex;flex-direction:column;gap:12px}.form-field.svelte-16rdffs{display:flex;flex-direction:column;gap:6px}.field-label.svelte-16rdffs{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0)}.info-card.svelte-16rdffs{background:#6366f10f;border:1px solid rgba(99,102,241,.15);border-radius:6px;padding:8px 10px;display:flex;flex-direction:column;gap:4px}.info-card-muted.svelte-16rdffs{background:#ffffff05;border-color:var(--color-border, #2a2a3a)}.info-card-header.svelte-16rdffs{display:flex;align-items:center;gap:5px;color:var(--color-accent, #ff6b35);font-size:11px;font-weight:600}.info-card-text.svelte-16rdffs{font-size:10px;line-height:1.5;color:var(--color-text-secondary, #8888a0);margin:0}.info-card-text.svelte-16rdffs code{font-family:var(--font-mono, "JetBrains Mono", monospace);font-size:10px;background:#ffffff0f;padding:1px 4px;border-radius:3px;color:var(--color-text-primary, #e8e8ed)}.info-card-hint.svelte-16rdffs{font-size:10px;line-height:1.4;color:var(--color-accent, #ff6b35);margin:2px 0 0;font-style:italic}.info-params.svelte-16rdffs{display:flex;flex-direction:column;gap:2px;margin-top:4px;padding-top:4px;border-top:1px solid rgba(255,255,255,.05)}.info-param-row.svelte-16rdffs{display:flex;align-items:center;gap:6px;font-size:10px}.info-param-name.svelte-16rdffs{font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-text-primary, #e8e8ed);font-weight:500}.info-param-type.svelte-16rdffs{font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-text-secondary, #8888a0);font-size:9px}.connections-list.svelte-16rdffs{display:flex;flex-direction:column;gap:8px}.connection-group.svelte-16rdffs{display:flex;flex-direction:column;gap:4px}.connection-label.svelte-16rdffs{font-size:10px;font-weight:500;color:var(--color-text-secondary, #8888a0);opacity:.7}.connection-item.svelte-16rdffs{display:flex;align-items:center;gap:6px;padding:5px 8px;background:#ffffff08;border:1px solid var(--color-border, #2a2a3a);border-radius:6px;cursor:pointer;font-size:11px;color:var(--color-text-primary, #e8e8ed);transition:background .15s,border-color .15s}.connection-item.svelte-16rdffs:hover{background:#ffffff0f;border-color:var(--color-accent, #ff6b35)}.connection-node-name.svelte-16rdffs{font-weight:500}.connection-this.svelte-16rdffs{font-size:10px;color:var(--color-text-secondary, #8888a0);font-style:italic}.position-row.svelte-16rdffs{display:flex;gap:16px}.position-value.svelte-16rdffs{font-size:11px;font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-text-secondary, #8888a0)}.danger-section.svelte-16rdffs{padding-top:8px;border-top:1px solid rgba(239,68,68,.15)}.delete-btn.svelte-16rdffs{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;padding:8px 12px;background:#ef444414;border:1px solid rgba(239,68,68,.2);border-radius:6px;color:var(--color-error, #ef4444);font-size:12px;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s}.delete-btn.svelte-16rdffs:hover{background:#ef444426;border-color:#ef444459}.mm-section.svelte-16rdffs{border:1px solid var(--color-border, #2a2a3a);border-radius:6px;overflow:hidden}.mm-toggle.svelte-16rdffs{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 10px;background:#ffffff05;border:none;cursor:pointer;color:var(--color-text-primary, #e8e8ed)}.mm-toggle.svelte-16rdffs:hover{background:#ffffff0a}.mm-toggle-label.svelte-16rdffs{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0)}.mm-toggle-switch.svelte-16rdffs{width:28px;height:16px;border-radius:8px;background:var(--color-border, #2a2a3a);position:relative;transition:background .15s}.mm-toggle-switch.mm-on.svelte-16rdffs{background:var(--color-accent, #ff6b35)}.mm-toggle-thumb.svelte-16rdffs{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:#fff;transition:transform .15s}.mm-on.svelte-16rdffs .mm-toggle-thumb:where(.svelte-16rdffs){transform:translate(12px)}.mm-options.svelte-16rdffs{padding:8px 10px;display:flex;flex-direction:column;gap:10px;border-top:1px solid var(--color-border, #2a2a3a)}.mm-group.svelte-16rdffs{display:flex;flex-direction:column;gap:4px}.mm-group-label.svelte-16rdffs{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary, #8888a0);opacity:.7}.mm-check.svelte-16rdffs,.mm-radio.svelte-16rdffs{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--color-text-primary, #e8e8ed);cursor:pointer}.mm-check.svelte-16rdffs input:where(.svelte-16rdffs),.mm-radio.svelte-16rdffs input:where(.svelte-16rdffs){accent-color:var(--color-accent, #ff6b35)}.mm-range-row.svelte-16rdffs{display:flex;align-items:center;gap:8px}.mm-range.svelte-16rdffs{flex:1;accent-color:var(--color-accent, #ff6b35)}.mm-range-val.svelte-16rdffs{font-size:10px;font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-accent, #ff6b35);min-width:40px;text-align:right}.mm-radio-row.svelte-16rdffs{display:flex;gap:12px}.component-panel.svelte-1ecj58j{min-width:240px;background:var(--color-bg-secondary, #12121a);border-left:1px solid var(--color-border, #2a2a3a);display:flex;flex-direction:column;overflow:hidden;flex-shrink:0;position:relative}.component-panel.dragging.svelte-1ecj58j{-webkit-user-select:none;user-select:none}.resize-handle.svelte-1ecj58j{position:absolute;top:0;left:-2px;width:5px;height:100%;cursor:ew-resize;z-index:10}.resize-handle.svelte-1ecj58j:hover{background:oklch(from var(--color-accent, #ff6b35) l c h / 30%)}.panel-tab-header.svelte-1ecj58j{display:flex;align-items:center;gap:2px;padding:0 8px;height:36px;min-height:36px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.panel-tab-btn.svelte-1ecj58j{display:flex;align-items:center;gap:5px;padding:6px 10px;border:none;background:transparent;border-bottom:2px solid transparent;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:color .15s ease,border-color .15s ease;margin-bottom:-1px}.panel-tab-btn.svelte-1ecj58j:hover{color:var(--color-text-primary, #e8e8ed)}.panel-tab-btn.active.svelte-1ecj58j{color:var(--color-text-primary, #e8e8ed);border-bottom-color:var(--color-accent, #ff6b35)}.panel-content.svelte-1ecj58j{flex:1;overflow-y:auto}.palette-items.svelte-1ecj58j{display:flex;flex-direction:column;gap:2px;padding:8px}.palette-item.svelte-1ecj58j{display:flex;align-items:center;gap:10px;padding:8px;border:none;background:transparent;border-radius:8px;cursor:pointer;transition:background .15s ease,transform .1s ease;width:100%;text-align:left}.palette-item.svelte-1ecj58j:hover{background:#ffffff0d}.palette-item.svelte-1ecj58j:active{transform:scale(.97)}.palette-icon.svelte-1ecj58j{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.palette-label.svelte-1ecj58j{font-size:12px;font-weight:500;color:var(--color-text-primary, #e8e8ed)}.palette-group-label.svelte-1ecj58j{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-secondary, #8888a0);padding:6px 8px 2px;opacity:.7}.console-tab.svelte-dlnc6c{display:flex;flex-direction:column;height:100%;overflow:hidden}.console-toolbar.svelte-dlnc6c{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.event-count.svelte-dlnc6c{font-size:11px;color:var(--color-text-secondary, #8888a0)}.toolbar-btn.svelte-dlnc6c{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.toolbar-btn.svelte-dlnc6c:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.console-output.svelte-dlnc6c{flex:1;overflow-y:auto;padding:8px 12px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:11px;line-height:1.6}.empty-state.svelte-dlnc6c{display:flex;align-items:center;justify-content:center;height:100%;padding:24px}.empty-text.svelte-dlnc6c{color:var(--color-text-secondary, #8888a0);font-size:12px}.log-line.svelte-dlnc6c{display:flex;align-items:baseline;gap:8px;padding:2px 0;white-space:nowrap}.log-timestamp.svelte-dlnc6c{color:var(--color-text-secondary, #8888a0);opacity:.6;flex-shrink:0}.log-badge.svelte-dlnc6c{font-size:9px;font-weight:700;letter-spacing:.05em;padding:1px 6px;border-radius:3px;flex-shrink:0}.badge-info.svelte-dlnc6c{background:#3b82f626;color:var(--color-info, #3b82f6)}.badge-success.svelte-dlnc6c{background:#22c55e26;color:var(--color-success, #22c55e)}.badge-error.svelte-dlnc6c{background:#ef444426;color:var(--color-error, #ef4444)}.badge-warning.svelte-dlnc6c{background:#f59e0b26;color:var(--color-warning, #f59e0b)}.log-node.svelte-dlnc6c{color:var(--color-accent, #ff6b35);font-weight:500;flex-shrink:0}.log-pipeline.svelte-dlnc6c{color:var(--color-text-secondary, #8888a0);flex-shrink:0}.log-extra.svelte-dlnc6c{color:var(--color-text-secondary, #8888a0);opacity:.8;overflow:hidden;text-overflow:ellipsis}.code-tab.svelte-a1zyks{display:flex;flex-direction:column;height:100%;overflow:hidden}.code-toolbar.svelte-a1zyks{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.toolbar-label.svelte-a1zyks{font-size:11px;color:var(--color-text-secondary, #8888a0);font-weight:500;display:flex;align-items:center;gap:8px}.auto-sync-indicator.svelte-a1zyks{font-size:10px;color:var(--color-info, #3b82f6);font-weight:400;animation:svelte-a1zyks-pulse-opacity 1.2s ease-in-out infinite}@keyframes svelte-a1zyks-pulse-opacity{0%,to{opacity:.6}50%{opacity:1}}.toolbar-actions.svelte-a1zyks{display:flex;gap:4px;align-items:center}.toolbar-btn.svelte-a1zyks{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.toolbar-btn.svelte-a1zyks:hover:not(:disabled){background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.toolbar-btn.svelte-a1zyks:disabled{opacity:.4;cursor:not-allowed}.auto-toggle.svelte-a1zyks{display:flex;align-items:center;gap:5px;padding:2px 6px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:background .15s ease}.auto-toggle.svelte-a1zyks:hover{background:#ffffff0d}.auto-toggle-label.svelte-a1zyks{font-size:10px;font-weight:500;color:var(--color-text-secondary, #8888a0);transition:color .15s ease}.auto-toggle.active.svelte-a1zyks .auto-toggle-label:where(.svelte-a1zyks){color:var(--color-text-primary, #e8e8ed)}.auto-toggle-track.svelte-a1zyks{position:relative;width:22px;height:12px;background:#ffffff1a;border-radius:6px;transition:background .2s ease}.auto-toggle.active.svelte-a1zyks .auto-toggle-track:where(.svelte-a1zyks){background:var(--color-accent, #ff6b35)}.auto-toggle-thumb.svelte-a1zyks{position:absolute;top:2px;left:2px;width:8px;height:8px;background:var(--color-text-secondary, #8888a0);border-radius:50%;transition:transform .2s ease,background .2s ease}.auto-toggle.active.svelte-a1zyks .auto-toggle-thumb:where(.svelte-a1zyks){transform:translate(10px);background:#fff}.code-content.svelte-a1zyks{flex:1;overflow-y:auto;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:12px;line-height:1.6}.code-state.svelte-a1zyks{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:8px;color:var(--color-text-secondary, #8888a0);font-size:12px}.code-error.svelte-a1zyks{color:var(--color-error, #ef4444)}.code-block-wrapper.svelte-a1zyks{padding:12px 0}.code-table.svelte-a1zyks{border-collapse:collapse;width:100%}.code-line.svelte-a1zyks{line-height:1.6}.line-number.svelte-a1zyks{-webkit-user-select:none;user-select:none;text-align:right;padding:0 12px;color:#8888a066;font-size:11px;min-width:36px;vertical-align:top;white-space:nowrap}.line-content.svelte-a1zyks{white-space:pre;color:var(--color-text-primary, #e8e8ed);tab-size:4;padding-right:12px}.code-content.svelte-a1zyks .hl-keyword{color:#c678dd}.code-content.svelte-a1zyks .hl-string{color:#98c379}.code-content.svelte-a1zyks .hl-comment{color:#5c6370;font-style:italic}.code-content.svelte-a1zyks .hl-number{color:#d19a66}.code-content.svelte-a1zyks .hl-decorator{color:#e5c07b}.code-content.svelte-a1zyks .hl-funcname{color:#61afef}.code-content.svelte-a1zyks .hl-builtin{color:#56b6c2}.spinning.svelte-a1zyks svg{animation:svelte-a1zyks-spin 1s linear infinite}@keyframes svelte-a1zyks-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.timeline-tab.svelte-164d9ci{display:flex;flex-direction:column;height:100%;overflow:hidden}.empty-state.svelte-164d9ci{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:12px;padding:24px}.empty-icon.svelte-164d9ci{color:var(--color-text-secondary, #8888a0);opacity:.4}.empty-text.svelte-164d9ci{font-size:12px;color:var(--color-text-secondary, #8888a0);text-align:center}.timeline-toolbar.svelte-164d9ci{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.toolbar-left.svelte-164d9ci{display:flex;align-items:center;gap:8px}.toolbar-label.svelte-164d9ci{font-size:11px;font-weight:600;color:var(--color-text-primary, #e8e8ed);text-transform:uppercase;letter-spacing:.05em}.checkpoint-count.svelte-164d9ci{font-size:11px;color:var(--color-accent, #ff6b35);font-weight:500}.toolbar-btn.svelte-164d9ci{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.toolbar-btn.svelte-164d9ci:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.timeline-scroll.svelte-164d9ci{flex-shrink:0;overflow-x:auto;overflow-y:hidden;padding:12px 16px;border-bottom:1px solid var(--color-border, #2a2a3a)}.timeline-track.svelte-164d9ci{display:flex;align-items:center;gap:24px;position:relative;min-width:max-content;padding:8px 0}.timeline-line.svelte-164d9ci{position:absolute;top:50%;left:0;right:0;height:2px;background:var(--color-border, #2a2a3a);transform:translateY(-50%);pointer-events:none}.checkpoint-dot-wrapper.svelte-164d9ci{display:flex;flex-direction:column;align-items:center;gap:6px;position:relative;z-index:1;background:none;border:none;padding:4px;cursor:pointer}.checkpoint-dot.svelte-164d9ci{width:12px;height:12px;border-radius:50%;background:var(--dot-color);transition:transform .15s ease,box-shadow .15s ease;flex-shrink:0}.checkpoint-dot-wrapper.svelte-164d9ci:hover .checkpoint-dot:where(.svelte-164d9ci){transform:scale(1.3)}.checkpoint-dot.selected.svelte-164d9ci{width:16px;height:16px;box-shadow:0 0 0 3px #ff6b354d,0 0 12px #ff6b3533}.checkpoint-dot.compare.svelte-164d9ci{width:16px;height:16px;box-shadow:0 0 0 3px #3b82f64d,0 0 12px #3b82f633}.checkpoint-dot.forked.svelte-164d9ci{border:2px solid var(--color-info, #3b82f6);background:var(--color-bg-elevated, #1a1a26)}.dot-label.svelte-164d9ci{font-size:9px;color:var(--color-text-secondary, #8888a0);font-weight:500}.checkpoint-dot-wrapper.selected.svelte-164d9ci .dot-label:where(.svelte-164d9ci){color:var(--color-accent, #ff6b35);font-weight:700}.checkpoint-dot-wrapper.compare.svelte-164d9ci .dot-label:where(.svelte-164d9ci){color:var(--color-info, #3b82f6);font-weight:700}.debug-controls.svelte-164d9ci{display:flex;align-items:center;gap:8px;padding:6px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.debug-btn.svelte-164d9ci{display:flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid var(--color-border, #2a2a3a);background:var(--color-bg-elevated, #1a1a26);border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:11px;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.debug-btn.svelte-164d9ci:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed);border-color:var(--color-text-secondary, #8888a0)}.debug-btn.active.svelte-164d9ci{border-color:var(--color-info, #3b82f6);color:var(--color-info, #3b82f6)}.debug-hint.svelte-164d9ci{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;margin-left:4px}.diff-panel.svelte-164d9ci{flex-shrink:0;border-bottom:1px solid var(--color-border, #2a2a3a);padding:8px 12px}.diff-header.svelte-164d9ci{font-size:11px;font-weight:600;color:var(--color-text-primary, #e8e8ed);margin-bottom:6px}.diff-body.svelte-164d9ci{display:flex;flex-wrap:wrap;gap:8px}.diff-section.svelte-164d9ci{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.diff-label.svelte-164d9ci{font-size:9px;font-weight:700;letter-spacing:.05em;padding:1px 6px;border-radius:3px}.diff-added.svelte-164d9ci{background:#22c55e26;color:var(--color-success, #22c55e)}.diff-removed.svelte-164d9ci{background:#ef444426;color:var(--color-error, #ef4444)}.diff-changed.svelte-164d9ci{background:#f59e0b26;color:var(--color-warning, #f59e0b)}.diff-key.svelte-164d9ci{font-size:11px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);color:var(--color-text-primary, #e8e8ed);background:var(--color-bg-elevated, #1a1a26);padding:1px 6px;border-radius:3px}.diff-empty.svelte-164d9ci{font-size:11px;color:var(--color-text-secondary, #8888a0)}.detail-panel.svelte-164d9ci{flex:1;overflow-y:auto;padding:10px 12px}.detail-header.svelte-164d9ci{display:flex;align-items:center;gap:8px;margin-bottom:10px}.detail-node-badge.svelte-164d9ci{font-size:11px;font-weight:600;padding:2px 8px;border-radius:4px}.detail-time.svelte-164d9ci{font-size:11px;color:var(--color-text-secondary, #8888a0)}.detail-timestamp.svelte-164d9ci{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace)}.detail-branch.svelte-164d9ci{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--color-info, #3b82f6);margin-bottom:10px;padding:4px 8px;background:#3b82f614;border-radius:4px}.branch-parent.svelte-164d9ci{color:var(--color-text-secondary, #8888a0);font-size:10px}.json-section.svelte-164d9ci{margin-bottom:6px}.json-toggle.svelte-164d9ci{display:flex;align-items:center;gap:4px;width:100%;padding:4px 6px;border:none;background:transparent;border-radius:4px;cursor:pointer;color:var(--color-text-primary, #e8e8ed);transition:background .15s ease}.json-toggle.svelte-164d9ci:hover{background:#ffffff08}.json-label.svelte-164d9ci{font-size:11px;font-weight:600}.json-count.svelte-164d9ci{font-size:10px;color:var(--color-text-secondary, #8888a0);margin-left:4px}.json-tree.svelte-164d9ci{padding:4px 8px 4px 20px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:11px;line-height:1.6}.json-row.svelte-164d9ci{display:flex;gap:6px;padding:1px 0}.json-key.svelte-164d9ci{color:var(--color-accent, #ff6b35);flex-shrink:0}.json-value.svelte-164d9ci{color:var(--color-text-primary, #e8e8ed);opacity:.8;white-space:pre-wrap;word-break:break-all}.json-empty.svelte-164d9ci{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;font-style:italic}.history-panel.svelte-1jltp3m{display:flex;flex-direction:column;height:100%;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-1jltp3m{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-1jltp3m{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.refresh-btn.svelte-1jltp3m{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.refresh-btn.svelte-1jltp3m:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.refresh-btn.svelte-1jltp3m:disabled{opacity:.4;cursor:default}.versions-list.svelte-1jltp3m{flex:1;overflow-y:auto;padding:4px 0}.versions-list.svelte-1jltp3m::-webkit-scrollbar{width:6px}.versions-list.svelte-1jltp3m::-webkit-scrollbar-track{background:transparent}.versions-list.svelte-1jltp3m::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.empty-state.svelte-1jltp3m{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.version-item.svelte-1jltp3m{display:flex;align-items:center;gap:8px;padding:6px 12px;margin:0 4px;border-radius:6px;position:relative;flex-wrap:wrap;transition:background .12s ease}.version-item.svelte-1jltp3m:hover{background:var(--color-bg-secondary, #12121a)}.version-item.confirming.svelte-1jltp3m{background:var(--color-bg-elevated, #1a1a2a)}.version-icon.svelte-1jltp3m{display:flex;align-items:center;color:var(--color-text-secondary, #8888a0);flex-shrink:0}.version-info.svelte-1jltp3m{flex:1;min-width:0;display:flex;align-items:baseline;gap:8px}.version-sha.svelte-1jltp3m{font-family:var(--font-mono, "SF Mono", "Fira Code", monospace);font-size:11px;color:var(--color-text-secondary, #8888a0);flex-shrink:0}.version-message.svelte-1jltp3m{font-size:12px;color:var(--color-text-primary, #e8e8ed);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.version-time.svelte-1jltp3m{font-size:11px;color:var(--color-text-secondary, #8888a0);opacity:.7;flex-shrink:0;margin-left:auto}.version-actions.svelte-1jltp3m{display:flex;align-items:center;gap:2px;flex-shrink:0}.action-btn.svelte-1jltp3m{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-1jltp3m:hover{background:#ffffff14;color:var(--color-text-primary, #e8e8ed)}.bookmark-btn.bookmarked.svelte-1jltp3m{color:var(--color-accent, #ff6b35)}.restore-btn.svelte-1jltp3m{opacity:0;transition:opacity .15s ease,background .15s ease,color .15s ease}.version-item.svelte-1jltp3m:hover .restore-btn:where(.svelte-1jltp3m),.restore-btn.visible.svelte-1jltp3m{opacity:1}.confirm-bar.svelte-1jltp3m{display:flex;align-items:center;gap:8px;width:100%;padding:6px 0 2px 22px}.confirm-text.svelte-1jltp3m{font-size:11px;color:var(--color-text-secondary, #8888a0)}.confirm-btn.svelte-1jltp3m{padding:3px 10px;border:none;border-radius:4px;font-size:11px;font-weight:500;cursor:pointer;transition:background .15s ease}.confirm-yes.svelte-1jltp3m{background:var(--color-accent, #ff6b35);color:#fff}.confirm-yes.svelte-1jltp3m:hover{filter:brightness(1.1)}.confirm-no.svelte-1jltp3m{background:#ffffff0f;color:var(--color-text-secondary, #8888a0)}.confirm-no.svelte-1jltp3m:hover{background:#ffffff1a;color:var(--color-text-primary, #e8e8ed)}.panel.svelte-1g6pzvd{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-1g6pzvd{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.sub-tabs.svelte-1g6pzvd{display:flex;align-items:center;gap:2px}.sub-tab.svelte-1g6pzvd{display:flex;align-items:center;gap:5px;padding:5px 10px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s ease,color .15s ease}.sub-tab.svelte-1g6pzvd:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.sub-tab.active.svelte-1g6pzvd{background:#ffffff14;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-1g6pzvd{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-1g6pzvd:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.content.svelte-1g6pzvd{flex:1;overflow-y:auto;padding:8px}.content.svelte-1g6pzvd::-webkit-scrollbar{width:6px}.content.svelte-1g6pzvd::-webkit-scrollbar-track{background:transparent}.content.svelte-1g6pzvd::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.empty-state.svelte-1g6pzvd{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.connector-grid.svelte-1g6pzvd{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:8px}.connector-card.svelte-1g6pzvd{display:flex;align-items:flex-start;gap:10px;padding:10px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;transition:border-color .15s ease}.connector-card.svelte-1g6pzvd:hover{border-color:var(--color-text-secondary, #8888a0)}.connector-icon.svelte-1g6pzvd{font-size:20px;flex-shrink:0;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:var(--color-bg-elevated, #1a1a2a);border-radius:6px}.connector-info.svelte-1g6pzvd{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.connector-header-row.svelte-1g6pzvd{display:flex;align-items:center;gap:6px}.connector-name.svelte-1g6pzvd{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.installed-badge.svelte-1g6pzvd{font-size:9px;font-weight:600;padding:1px 5px;border-radius:3px;background:#22c55e26;color:#22c55e}.connector-desc.svelte-1g6pzvd{font-size:11px;color:var(--color-text-secondary, #8888a0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.connector-category.svelte-1g6pzvd{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;text-transform:uppercase;letter-spacing:.03em}.connector-actions.svelte-1g6pzvd{flex-shrink:0}.install-btn.svelte-1g6pzvd{display:flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid var(--color-border, #2a2a3a);background:transparent;border-radius:4px;color:var(--color-text-primary, #e8e8ed);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s ease,border-color .15s ease}.install-btn.svelte-1g6pzvd:hover:not(:disabled){background:#ffffff0d;border-color:var(--color-accent, #ff6b35)}.install-btn.svelte-1g6pzvd:disabled{opacity:.5;cursor:default}.tools-list.svelte-1g6pzvd{display:flex;flex-direction:column;gap:4px}.tool-item.svelte-1g6pzvd{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;transition:border-color .15s ease}.tool-item.svelte-1g6pzvd:hover{border-color:var(--color-text-secondary, #8888a0)}.tool-info.svelte-1g6pzvd{flex:1;min-width:0;display:flex;align-items:center;gap:8px}.tool-name.svelte-1g6pzvd{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed);flex-shrink:0}.tool-type.svelte-1g6pzvd{font-size:10px;padding:1px 5px;border-radius:3px;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);flex-shrink:0}.tool-desc.svelte-1g6pzvd{font-size:11px;color:var(--color-text-secondary, #8888a0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.tool-actions.svelte-1g6pzvd{display:flex;align-items:center;gap:2px;flex-shrink:0}.icon-btn.svelte-1g6pzvd{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.icon-btn.svelte-1g6pzvd:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.panel.svelte-3xr44d{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-3xr44d{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-3xr44d{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.header-actions.svelte-3xr44d{display:flex;align-items:center;gap:4px}.action-btn.svelte-3xr44d{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-3xr44d:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.text-btn.svelte-3xr44d{width:auto;gap:5px;padding:0 8px;font-size:11px;font-weight:500}.content.svelte-3xr44d{flex:1;overflow-y:auto;padding:8px 12px}.content.svelte-3xr44d::-webkit-scrollbar{width:6px}.content.svelte-3xr44d::-webkit-scrollbar-track{background:transparent}.content.svelte-3xr44d::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.section.svelte-3xr44d{margin-bottom:12px}.section-label.svelte-3xr44d{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0);margin-bottom:6px}.mini-empty.svelte-3xr44d{display:flex;align-items:center;gap:6px;padding:12px;color:var(--color-text-secondary, #8888a0);font-size:11px;opacity:.6}.dataset-list.svelte-3xr44d{display:flex;flex-direction:column;gap:2px}.dataset-item.svelte-3xr44d{display:flex;align-items:center;gap:6px;padding:5px 8px;border:1px solid transparent;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:12px;cursor:pointer;text-align:left;transition:background .12s ease,color .12s ease,border-color .12s ease}.dataset-item.svelte-3xr44d:hover{background:var(--color-bg-secondary, #12121a);color:var(--color-text-primary, #e8e8ed)}.dataset-item.selected.svelte-3xr44d{background:var(--color-bg-elevated, #1a1a2a);border-color:var(--color-accent, #ff6b35);color:var(--color-text-primary, #e8e8ed)}.ds-name.svelte-3xr44d{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ds-meta.svelte-3xr44d{font-size:10px;opacity:.6;flex-shrink:0}.run-section.svelte-3xr44d{margin-bottom:12px}.run-btn.svelte-3xr44d{display:flex;align-items:center;gap:6px;padding:6px 14px;border:none;background:var(--color-accent, #ff6b35);border-radius:4px;color:#fff;font-size:12px;font-weight:600;cursor:pointer;transition:filter .15s ease,opacity .15s ease}.run-btn.svelte-3xr44d:hover:not(:disabled){filter:brightness(1.1)}.run-btn.svelte-3xr44d:disabled{opacity:.4;cursor:default}.metrics-row.svelte-3xr44d{display:flex;gap:8px;margin-bottom:10px}.metric-card.svelte-3xr44d{flex:1;padding:8px 10px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;display:flex;flex-direction:column;align-items:center;gap:2px}.metric-card.success.svelte-3xr44d{border-color:#22c55e4d}.metric-card.error.svelte-3xr44d{border-color:#ef44444d}.metric-value.svelte-3xr44d{font-size:16px;font-weight:700;color:var(--color-text-primary, #e8e8ed)}.metric-card.success.svelte-3xr44d .metric-value:where(.svelte-3xr44d){color:#22c55e}.metric-card.error.svelte-3xr44d .metric-value:where(.svelte-3xr44d){color:#ef4444}.metric-label.svelte-3xr44d{font-size:10px;color:var(--color-text-secondary, #8888a0);text-transform:uppercase;letter-spacing:.03em}.results-list.svelte-3xr44d{display:flex;flex-direction:column;gap:2px}.result-row.svelte-3xr44d{display:flex;align-items:center;gap:6px;padding:4px 8px;border-radius:4px;font-size:11px}.result-row.passed.svelte-3xr44d{color:#22c55e}.result-row.failed.svelte-3xr44d{color:#ef4444}.result-icon.svelte-3xr44d{display:flex;align-items:center;flex-shrink:0}.result-input.svelte-3xr44d{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--color-text-primary, #e8e8ed)}.result-error.svelte-3xr44d{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.7;flex-shrink:0;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panel.svelte-oe5i1m{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-oe5i1m{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-oe5i1m{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.header-actions.svelte-oe5i1m{display:flex;align-items:center;gap:4px}.action-btn.svelte-oe5i1m{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-oe5i1m:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.text-btn.svelte-oe5i1m{width:auto;gap:5px;padding:0 8px;font-size:11px;font-weight:500}.content.svelte-oe5i1m{flex:1;overflow-y:auto;padding:8px 12px}.content.svelte-oe5i1m::-webkit-scrollbar{width:6px}.content.svelte-oe5i1m::-webkit-scrollbar-track{background:transparent}.content.svelte-oe5i1m::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.empty-state.svelte-oe5i1m{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.create-form.svelte-oe5i1m{padding:10px;margin-bottom:12px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px}.form-row.svelte-oe5i1m{margin-bottom:8px}.form-label.svelte-oe5i1m{display:block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0);margin-bottom:4px}.form-input.svelte-oe5i1m{width:100%;padding:5px 8px;border:1px solid var(--color-border, #2a2a3a);background:var(--color-bg-primary, #0a0a12);border-radius:4px;color:var(--color-text-primary, #e8e8ed);font-size:12px;font-family:var(--font-sans, system-ui, -apple-system, sans-serif);outline:none;transition:border-color .15s ease;box-sizing:border-box}.form-input.svelte-oe5i1m:focus{border-color:var(--color-accent, #ff6b35)}.form-input.small.svelte-oe5i1m{width:auto;flex:1;min-width:0}.form-input.tiny.svelte-oe5i1m{width:50px;text-align:center}.variants-config.svelte-oe5i1m{display:flex;flex-direction:column;gap:4px}.variant-row.svelte-oe5i1m{display:flex;align-items:center;gap:6px}.traffic-input.svelte-oe5i1m{display:flex;align-items:center;gap:2px;flex-shrink:0}.traffic-pct.svelte-oe5i1m{font-size:11px;color:var(--color-text-secondary, #8888a0)}.add-variant-btn.svelte-oe5i1m{display:flex;align-items:center;gap:4px;padding:4px 8px;border:1px dashed var(--color-border, #2a2a3a);background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:11px;cursor:pointer;transition:border-color .15s ease,color .15s ease;width:fit-content}.add-variant-btn.svelte-oe5i1m:hover{border-color:var(--color-text-secondary, #8888a0);color:var(--color-text-primary, #e8e8ed)}.form-actions.svelte-oe5i1m{display:flex;gap:6px;margin-top:8px}.create-btn.svelte-oe5i1m{padding:5px 12px;border:none;background:var(--color-accent, #ff6b35);border-radius:4px;color:#fff;font-size:11px;font-weight:600;cursor:pointer;transition:filter .15s ease,opacity .15s ease}.create-btn.svelte-oe5i1m:hover:not(:disabled){filter:brightness(1.1)}.create-btn.svelte-oe5i1m:disabled{opacity:.4;cursor:default}.cancel-btn.svelte-oe5i1m{padding:5px 12px;border:1px solid var(--color-border, #2a2a3a);background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s ease,color .15s ease}.cancel-btn.svelte-oe5i1m:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.icon-btn.svelte-oe5i1m{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.icon-btn.svelte-oe5i1m:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.experiment-list.svelte-oe5i1m{display:flex;flex-direction:column;gap:8px}.experiment-card.svelte-oe5i1m{padding:10px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px}.exp-header.svelte-oe5i1m{display:flex;align-items:center;gap:8px;color:var(--color-text-secondary, #8888a0);margin-bottom:8px}.exp-name.svelte-oe5i1m{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.status-badge.svelte-oe5i1m{font-size:9px;font-weight:700;padding:1px 6px;border-radius:3px;text-transform:uppercase;letter-spacing:.03em}.badge-draft.svelte-oe5i1m{background:#ffffff0f;color:var(--color-text-secondary, #8888a0)}.badge-running.svelte-oe5i1m{background:#3b82f626;color:#3b82f6}.badge-completed.svelte-oe5i1m{background:#22c55e26;color:#22c55e}.exp-date.svelte-oe5i1m{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;margin-left:auto}.variants-list.svelte-oe5i1m{display:flex;flex-direction:column;gap:4px}.variant-item.svelte-oe5i1m{display:flex;align-items:center;gap:8px}.variant-name.svelte-oe5i1m{font-size:11px;color:var(--color-text-primary, #e8e8ed);min-width:80px;flex-shrink:0}.traffic-bar-container.svelte-oe5i1m{flex:1;height:4px;background:var(--color-bg-primary, #0a0a12);border-radius:2px;overflow:hidden}.traffic-bar.svelte-oe5i1m{height:100%;background:var(--color-accent, #ff6b35);border-radius:2px;transition:width .3s ease}.variant-traffic.svelte-oe5i1m{font-size:10px;color:var(--color-text-secondary, #8888a0);min-width:28px;text-align:right;flex-shrink:0}.panel.svelte-1boqyeh{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-1boqyeh{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-1boqyeh{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.header-actions.svelte-1boqyeh{display:flex;align-items:center;gap:6px}.action-btn.svelte-1boqyeh{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-1boqyeh:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.text-btn.svelte-1boqyeh{width:auto;gap:5px;padding:0 8px;font-size:11px;font-weight:500}.export-btn.svelte-1boqyeh{display:flex;align-items:center;gap:5px;padding:5px 12px;border:none;background:var(--color-accent, #ff6b35);border-radius:4px;color:#fff;font-size:11px;font-weight:600;cursor:pointer;transition:filter .15s ease,opacity .15s ease}.export-btn.svelte-1boqyeh:hover:not(:disabled){filter:brightness(1.1)}.export-btn.svelte-1boqyeh:disabled{opacity:.5;cursor:default}.content.svelte-1boqyeh{flex:1;overflow:hidden;display:flex;flex-direction:column}.empty-state.svelte-1boqyeh{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.code-container.svelte-1boqyeh{flex:1;overflow:auto}.code-container.svelte-1boqyeh::-webkit-scrollbar{width:6px;height:6px}.code-container.svelte-1boqyeh::-webkit-scrollbar-track{background:transparent}.code-container.svelte-1boqyeh::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.code-block.svelte-1boqyeh{margin:0;padding:12px;background:var(--color-bg-secondary, #12121a);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:12px;line-height:1.6;color:var(--color-text-primary, #e8e8ed);white-space:pre;tab-size:4;min-height:100%;box-sizing:border-box}.code-block.svelte-1boqyeh code:where(.svelte-1boqyeh){font-family:inherit}.panel.svelte-1bsb2d0{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-1bsb2d0{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-1bsb2d0{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-1bsb2d0{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-1bsb2d0:hover:not(:disabled){background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-1bsb2d0:disabled{opacity:.4;cursor:default}.content.svelte-1bsb2d0{flex:1;overflow-y:auto;padding:10px 12px}.content.svelte-1bsb2d0::-webkit-scrollbar{width:6px}.content.svelte-1bsb2d0::-webkit-scrollbar-track{background:transparent}.content.svelte-1bsb2d0::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.empty-state.svelte-1bsb2d0{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.metrics-grid.svelte-1bsb2d0{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px}.metric-card.svelte-1bsb2d0{display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px}.metric-icon.svelte-1bsb2d0{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;background:var(--color-bg-elevated, #1a1a2a);color:var(--color-accent, #ff6b35);flex-shrink:0}.metric-body.svelte-1bsb2d0{display:flex;flex-direction:column;gap:1px}.metric-value.svelte-1bsb2d0{font-size:16px;font-weight:700;color:var(--color-text-primary, #e8e8ed);line-height:1.1}.metric-label.svelte-1bsb2d0{font-size:10px;color:var(--color-text-secondary, #8888a0);text-transform:uppercase;letter-spacing:.03em}.breakdown-section.svelte-1bsb2d0{display:flex;flex-direction:column;gap:12px}.breakdown-title.svelte-1bsb2d0{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0);margin-bottom:6px}.breakdown-table.svelte-1bsb2d0{background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;overflow:hidden}.table-header.svelte-1bsb2d0{display:flex;padding:6px 10px;background:var(--color-bg-elevated, #1a1a2a);border-bottom:1px solid var(--color-border, #2a2a3a)}.table-header.svelte-1bsb2d0 .col-name:where(.svelte-1bsb2d0),.table-header.svelte-1bsb2d0 .col-num:where(.svelte-1bsb2d0){font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.03em;color:var(--color-text-secondary, #8888a0)}.table-row.svelte-1bsb2d0{display:flex;padding:5px 10px;border-bottom:1px solid var(--color-border, #2a2a3a);transition:background .12s ease}.table-row.svelte-1bsb2d0:last-child{border-bottom:none}.table-row.svelte-1bsb2d0:hover{background:#ffffff05}.col-name.svelte-1bsb2d0{flex:2;font-size:11px;color:var(--color-text-primary, #e8e8ed);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.col-num.svelte-1bsb2d0{flex:1;font-size:11px;color:var(--color-text-secondary, #8888a0);text-align:right;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace)}.panel.svelte-tctccr{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-tctccr{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0;gap:8px}.title.svelte-tctccr{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.file-path.svelte-tctccr{font-size:11px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);color:var(--color-text-primary, #e8e8ed);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.back-btn.svelte-tctccr{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.back-btn.svelte-tctccr:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-tctccr{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.action-btn.svelte-tctccr:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.content.svelte-tctccr{flex:1;overflow:hidden;display:flex;flex-direction:column}.empty-state.svelte-tctccr{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.file-list.svelte-tctccr{flex:1;overflow-y:auto;padding:4px 0}.file-list.svelte-tctccr::-webkit-scrollbar{width:6px}.file-list.svelte-tctccr::-webkit-scrollbar-track{background:transparent}.file-list.svelte-tctccr::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.file-item.svelte-tctccr{display:flex;align-items:center;gap:8px;padding:5px 12px;border:none;background:transparent;color:var(--color-text-secondary, #8888a0);font-size:12px;cursor:pointer;width:100%;text-align:left;transition:background .12s ease,color .12s ease;font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.file-item.svelte-tctccr:hover{background:var(--color-bg-secondary, #12121a);color:var(--color-text-primary, #e8e8ed)}.file-item.dir.svelte-tctccr{color:var(--color-accent, #ff6b35);cursor:default}.file-name.svelte-tctccr{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-ext.svelte-tctccr{font-size:9px;font-weight:600;padding:1px 4px;border-radius:2px;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);flex-shrink:0;text-transform:uppercase}.ext-python.svelte-tctccr{background:#3572a533;color:#5b9bd5}.ext-js.svelte-tctccr{background:#f0db4f26;color:#f0db4f}.ext-json.svelte-tctccr{background:#ffffff0f;color:var(--color-text-secondary, #8888a0)}.ext-yaml.svelte-tctccr{background:#cbab5126;color:#cbab51}.ext-md.svelte-tctccr{background:#3b82f626;color:#3b82f6}.file-size.svelte-tctccr{font-size:10px;opacity:.5;flex-shrink:0;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace)}.code-viewer.svelte-tctccr{flex:1;overflow:auto}.code-viewer.svelte-tctccr::-webkit-scrollbar{width:6px;height:6px}.code-viewer.svelte-tctccr::-webkit-scrollbar-track{background:transparent}.code-viewer.svelte-tctccr::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.code-block.svelte-tctccr{margin:0;padding:12px;background:var(--color-bg-secondary, #12121a);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:12px;line-height:1.6;color:var(--color-text-primary, #e8e8ed);white-space:pre;tab-size:4;min-height:100%;box-sizing:border-box}.code-block.svelte-tctccr code:where(.svelte-tctccr){font-family:inherit}.oracle-panel.svelte-b2w21g{display:flex;flex-direction:column;height:100%;overflow:hidden}.oracle-header.svelte-b2w21g{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.oracle-title-row.svelte-b2w21g{display:flex;align-items:center;gap:8px;color:var(--color-text-primary, #e8e8ed);font-size:12px;font-weight:600}.oracle-title.svelte-b2w21g{font-family:var(--font-sans)}.oracle-badge.svelte-b2w21g{min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--color-accent, #ff6b35);color:#fff;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}.oracle-analyze-btn.svelte-b2w21g{display:flex;align-items:center;gap:5px;padding:5px 12px;border:1px solid var(--color-border, #2a2a3a);border-radius:6px;background:#ffffff08;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.oracle-analyze-btn.svelte-b2w21g:hover:not(:disabled){background:#ffffff0f;color:var(--color-text-primary, #e8e8ed);border-color:var(--color-accent, #ff6b35)}.oracle-analyze-btn.svelte-b2w21g:disabled{opacity:.4;cursor:not-allowed}.oracle-spinner{animation:svelte-b2w21g-spin 1s linear infinite}@keyframes svelte-b2w21g-spin{to{transform:rotate(360deg)}}.oracle-content.svelte-b2w21g{flex:1;overflow-y:auto;padding:8px}.oracle-empty.svelte-b2w21g{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--color-text-secondary, #8888a0);gap:8px;opacity:.5;text-align:center;padding:20px}.oracle-empty.svelte-b2w21g p:where(.svelte-b2w21g){font-size:12px;margin:0}.oracle-empty-hint.svelte-b2w21g{font-size:11px;max-width:280px;line-height:1.5}.insight-card.svelte-b2w21g{background:#ffffff05;border:1px solid var(--color-border, #2a2a3a);border-radius:8px;margin-bottom:6px;overflow:hidden;transition:opacity .2s}.insight-card.skipped.svelte-b2w21g{opacity:.5}.insight-header.svelte-b2w21g{display:flex;align-items:center;gap:8px;padding:8px 10px;cursor:pointer;transition:background .15s}.insight-header.svelte-b2w21g:hover{background:#ffffff08}.insight-severity.svelte-b2w21g{display:flex;align-items:center;flex-shrink:0}.insight-title.svelte-b2w21g{flex:1;font-size:11px;font-weight:600;color:var(--color-text-primary, #e8e8ed);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.insight-card.skipped.svelte-b2w21g .insight-title:where(.svelte-b2w21g){text-decoration:line-through}.insight-time.svelte-b2w21g{font-size:9px;color:var(--color-text-secondary, #8888a0);opacity:.6;flex-shrink:0}.insight-body.svelte-b2w21g{padding:0 10px 8px}.insight-desc.svelte-b2w21g{font-size:11px;line-height:1.5;color:var(--color-text-secondary, #8888a0);margin:0}.insight-actions.svelte-b2w21g{display:flex;gap:4px;padding:0 8px 8px}.insight-btn.svelte-b2w21g{display:flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid var(--color-border, #2a2a3a);border-radius:4px;background:transparent;font-size:10px;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s,color .15s}.insight-btn.approve.svelte-b2w21g{color:#22c55e;border-color:#22c55e4d}.insight-btn.approve.svelte-b2w21g:hover{background:#22c55e1a;border-color:#22c55e80}.insight-btn.skip.svelte-b2w21g{color:var(--color-text-secondary, #8888a0)}.insight-btn.skip.svelte-b2w21g:hover{background:#ffffff0d}.insight-status-badge.svelte-b2w21g{font-size:9px;font-weight:600;padding:3px 10px 6px;text-transform:uppercase;letter-spacing:.04em}.approved-badge.svelte-b2w21g{color:#22c55e}.skipped-badge.svelte-b2w21g{color:var(--color-text-secondary, #8888a0);opacity:.5}.panel.svelte-o0ko81{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary);font-family:var(--font-sans)}.header.svelte-o0ko81{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border);flex-shrink:0}.title.svelte-o0ko81{font-size:12px;font-weight:600;color:var(--color-text-primary)}.action-btn.svelte-o0ko81{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-o0ko81:hover:not(:disabled){background:#ffffff0d;color:var(--color-text-primary)}.action-btn.svelte-o0ko81:disabled{opacity:.4;cursor:default}.content.svelte-o0ko81{flex:1;overflow-y:auto;padding:0}.content.svelte-o0ko81::-webkit-scrollbar{width:6px}.content.svelte-o0ko81::-webkit-scrollbar-track{background:transparent}.content.svelte-o0ko81::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:3px}.empty-state.svelte-o0ko81{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary);font-size:12px;opacity:.6;padding:20px;text-align:center}.exec-table.svelte-o0ko81{width:100%}.table-header.svelte-o0ko81{display:flex;align-items:center;padding:8px 12px;background:var(--color-bg-elevated);border-bottom:1px solid var(--color-border)}.table-header.svelte-o0ko81 span:where(.svelte-o0ko81){font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary)}.col-status.svelte-o0ko81{width:48px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.col-id.svelte-o0ko81{flex:2;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-duration.svelte-o0ko81{flex:1;text-align:right}.col-expand.svelte-o0ko81{width:28px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--color-text-secondary)}.table-row-wrapper.svelte-o0ko81{border-bottom:1px solid var(--color-border)}.table-row-wrapper.svelte-o0ko81:last-child{border-bottom:none}.table-row.svelte-o0ko81{display:flex;align-items:center;width:100%;padding:7px 12px;background:none;border:none;cursor:pointer;font-size:11px;color:var(--color-text-primary);transition:background .12s ease;text-align:left}.table-row.svelte-o0ko81:hover{background:#ffffff05}.table-row.svelte-o0ko81 code:where(.svelte-o0ko81){font-family:var(--font-mono);font-size:11px}.status-dot.svelte-o0ko81{width:7px;height:7px;border-radius:50%;display:inline-block}.exec-detail.svelte-o0ko81{padding:8px 16px 12px 60px;background:var(--color-bg-secondary);border-top:1px solid var(--color-border);display:flex;flex-direction:column;gap:6px;animation:svelte-o0ko81-detail-in .1s ease-out}@keyframes svelte-o0ko81-detail-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.detail-row.svelte-o0ko81{display:flex;align-items:center;gap:12px}.detail-label.svelte-o0ko81{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary);min-width:60px}.detail-value.svelte-o0ko81{font-family:var(--font-mono);font-size:11px;color:var(--color-text-primary);word-break:break-all}.bottom-panel.svelte-1m9rotx{background:var(--color-bg-secondary, #12121a);border-top:1px solid var(--color-border, #2a2a3a);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden;transition:height .2s ease}.bottom-panel.dragging.svelte-1m9rotx{transition:none;-webkit-user-select:none;user-select:none}.drag-handle.svelte-1m9rotx{height:12px;cursor:ns-resize;display:flex;align-items:center;justify-content:center;flex-shrink:0}.drag-handle.svelte-1m9rotx:hover .drag-indicator:where(.svelte-1m9rotx){background:var(--color-text-secondary, #8888a0)}.drag-indicator.svelte-1m9rotx{width:40px;height:2px;border-radius:1px;background:var(--color-border, #2a2a3a);transition:background .15s ease}.tab-bar.svelte-1m9rotx{display:flex;align-items:center;justify-content:space-between;padding:0 8px;height:36px;min-height:36px;flex-shrink:0;border-bottom:1px solid var(--color-border, #2a2a3a)}.tab-list.svelte-1m9rotx{display:flex;align-items:center;gap:2px;overflow-x:auto;scrollbar-width:none;flex:1;min-width:0}.tab-list.svelte-1m9rotx::-webkit-scrollbar{display:none}.tab-btn.svelte-1m9rotx{display:flex;align-items:center;gap:6px;padding:6px 12px;border:none;background:transparent;border-bottom:2px solid transparent;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:color .15s ease,border-color .15s ease;margin-bottom:-1px}.tab-btn.svelte-1m9rotx:hover{color:var(--color-text-primary, #e8e8ed)}.tab-btn.active.svelte-1m9rotx{color:var(--color-text-primary, #e8e8ed);border-bottom-color:var(--color-accent, #ff6b35)}.tab-badge.svelte-1m9rotx{min-width:16px;height:16px;padding:0 4px;border-radius:8px;font-size:9px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1}.tab-badge.error.svelte-1m9rotx{background:#ef444433;color:var(--color-error, #ef4444);border:1px solid rgba(239,68,68,.3)}.tab-badge.accent.svelte-1m9rotx{background:oklch(from var(--color-accent, #ff6b35) l c h / 15%);color:var(--color-accent, #ff6b35);border:1px solid oklch(from var(--color-accent, #ff6b35) l c h / 25%)}.toggle-btn.svelte-1m9rotx{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.toggle-btn.svelte-1m9rotx:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.tab-content.svelte-1m9rotx{flex:1;overflow:hidden;position:relative}.construct-page.svelte-1ri5xm6{display:flex;flex-direction:column;height:100%;width:100%}.top-area.svelte-1ri5xm6{display:flex;flex:1;min-height:0;overflow:hidden} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/3.wdEcXtf1.css b/studio-desktop/frontend-dist/_app/immutable/assets/3.wdEcXtf1.css deleted file mode 100644 index df2a5cc3..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/3.wdEcXtf1.css +++ /dev/null @@ -1 +0,0 @@ -.transparent.svelte-1wg91mu{background:transparent}.a11y-hidden.svelte-13pq11u{display:none}.a11y-live-msg.svelte-13pq11u{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(0px,0px,0px,0px);clip-path:inset(100%)}.svelte-flow__selection.svelte-1vr3gfi{position:absolute;top:0;left:0}.svelte-flow__selection-wrapper.svelte-sf2y5e{position:absolute;top:0;left:0;z-index:2000;pointer-events:all}.svelte-flow__selection-wrapper.svelte-sf2y5e:focus,.svelte-flow__selection-wrapper.svelte-sf2y5e:focus-visible{outline:none}.svelte-flow.svelte-mkap6j{width:100%;height:100%;overflow:hidden;position:relative;z-index:0;background-color:var(--background-color, var(--background-color-default))}:root{--background-color-default: #fff;--background-pattern-color-default: #ddd;--minimap-mask-color-default: rgb(240, 240, 240, .6);--minimap-mask-stroke-color-default: none;--minimap-mask-stroke-width-default: 1;--controls-button-background-color-default: #fefefe;--controls-button-background-color-hover-default: #f4f4f4;--controls-button-color-default: inherit;--controls-button-color-hover-default: inherit;--controls-button-border-color-default: #eee}.agent-node.svelte-uofr5c{width:220px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #6366f11a,0 0 0 1px #6366f12e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.agent-node.exec-running.svelte-uofr5c{box-shadow:none}.agent-node.exec-running.svelte-uofr5c:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#6366f1 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-uofr5c-agent-spin 1.2s linear infinite;pointer-events:none}.agent-node.exec-complete.svelte-uofr5c{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.agent-node.exec-error.svelte-uofr5c{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-uofr5c-agent-spin{to{transform:rotate(360deg)}}.agent-header.svelte-uofr5c{background:linear-gradient(135deg,#6366f1,#4f46e5);padding:6px 10px 8px;display:flex;flex-direction:column;gap:4px}.agent-node.exec-running.svelte-uofr5c .agent-header:where(.svelte-uofr5c){background:linear-gradient(135deg,#6366f1,#818cf8)}.agent-node.exec-error.svelte-uofr5c .agent-header:where(.svelte-uofr5c){background:linear-gradient(135deg,#6366f1,#7c3aed,#ef4444)}.header-top-row.svelte-uofr5c{display:flex;align-items:center;justify-content:space-between;min-height:16px}.header-badges.svelte-uofr5c{display:flex;align-items:center;gap:4px;min-width:0}.multimodal-badge.svelte-uofr5c{display:flex;align-items:center;justify-content:center;width:18px;height:14px;border-radius:7px;background:#ffffff1f;color:#ffffffb3;flex-shrink:0}.model-badge.svelte-uofr5c{font-size:9px;font-weight:600;color:#ffffffb3;background:#ffffff1f;padding:1px 6px;border-radius:8px;letter-spacing:.02em;line-height:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px}.settings-icon.svelte-uofr5c{color:#ffffff59;display:flex;align-items:center;cursor:pointer;transition:color .15s ease}.settings-icon.svelte-uofr5c:hover{color:#ffffffb3}.header-main-row.svelte-uofr5c{display:flex;align-items:center;gap:6px;color:#fff}.agent-title.svelte-uofr5c{flex:1;font-size:12px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-uofr5c{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-uofr5c{background:#ffffff4d}.dot-running.svelte-uofr5c{background:#22c55e;animation:svelte-uofr5c-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-uofr5c{background:#ef4444}.dot-complete.svelte-uofr5c{background:#22c55e}@keyframes svelte-uofr5c-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-uofr5c{display:flex;align-items:center;color:#22c55e}.state-error.svelte-uofr5c{color:#ef4444}.agent-body.svelte-uofr5c{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-uofr5c{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin.svelte-uofr5c{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-uofr5c:hover{color:#b0b0c8}.pin-dot.svelte-uofr5c{width:6px;height:6px;border-radius:50%;background:#6366f1;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-uofr5c:hover .pin-dot:where(.svelte-uofr5c){transform:scale(1.4);box-shadow:0 0 6px #6366f180}.description-text.svelte-uofr5c{font-size:10px;color:#a0a0b8;padding:2px 10px 4px;line-height:1.4}.instructions-section.svelte-uofr5c{margin:4px 8px 2px;padding:5px 7px;background:#6366f10a;border:1px solid rgba(99,102,241,.08);border-radius:5px}.section-label.svelte-uofr5c{font-size:8px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#6366f1;opacity:.6}.instructions-text.svelte-uofr5c{font-size:10px;color:#7a7a94;font-family:JetBrains Mono,monospace;line-height:1.35;margin:2px 0 0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.tool-node.svelte-107d6w1{width:180px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #8b5cf61a,0 0 0 1px #8b5cf62e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.tool-node.exec-running.svelte-107d6w1{box-shadow:none}.tool-node.exec-running.svelte-107d6w1:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#8b5cf6 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-107d6w1-tool-spin 1.2s linear infinite;pointer-events:none}.tool-node.exec-complete.svelte-107d6w1{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.tool-node.exec-error.svelte-107d6w1{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-107d6w1-tool-spin{to{transform:rotate(360deg)}}.tool-header.svelte-107d6w1{background:linear-gradient(135deg,#8b5cf6,#7c3aed);padding:7px 10px}.tool-node.exec-running.svelte-107d6w1 .tool-header:where(.svelte-107d6w1){background:linear-gradient(135deg,#8b5cf6,#a78bfa)}.tool-node.exec-error.svelte-107d6w1 .tool-header:where(.svelte-107d6w1){background:linear-gradient(135deg,#8b5cf6,#9333ea,#ef4444)}.header-row.svelte-107d6w1{display:flex;align-items:center;gap:5px;color:#fff}.tool-icon-wrap.svelte-107d6w1{display:flex;align-items:center;justify-content:center;width:22px;height:22px;background:#ffffff26;border-radius:5px;flex-shrink:0}.tool-title.svelte-107d6w1{flex:1;font-size:11px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-107d6w1{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-107d6w1{background:#ffffff4d}.dot-running.svelte-107d6w1{background:#22c55e;animation:svelte-107d6w1-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-107d6w1{background:#ef4444}.dot-complete.svelte-107d6w1{background:#22c55e}@keyframes svelte-107d6w1-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-107d6w1{display:flex;align-items:center;color:#22c55e}.state-error.svelte-107d6w1{color:#ef4444}.tool-body.svelte-107d6w1{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-107d6w1{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin.svelte-107d6w1{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-107d6w1:hover{color:#b0b0c8}.pin-dot.svelte-107d6w1{width:6px;height:6px;border-radius:50%;background:#8b5cf6;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-107d6w1:hover .pin-dot:where(.svelte-107d6w1){transform:scale(1.4);box-shadow:0 0 6px #8b5cf680}.prop-row.svelte-107d6w1{display:flex;justify-content:space-between;padding:2px 10px;font-size:10px}.prop-key.svelte-107d6w1{color:#6a6a80;font-family:JetBrains Mono,monospace}.prop-val.svelte-107d6w1{color:#a0a0b8;font-family:JetBrains Mono,monospace;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100px;text-align:right}.tool-description.svelte-107d6w1{font-size:10px;color:#8888a0;padding:2px 10px 4px;line-height:1.35}.reason-node.svelte-15a1m3{width:200px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #ec48991a,0 0 0 1px #ec48992e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.reason-node.exec-running.svelte-15a1m3{box-shadow:none}.reason-node.exec-running.svelte-15a1m3:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#ec4899 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-15a1m3-reasoning-spin 1.2s linear infinite;pointer-events:none}.reason-node.exec-complete.svelte-15a1m3{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.reason-node.exec-error.svelte-15a1m3{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-15a1m3-reasoning-spin{to{transform:rotate(360deg)}}.reason-header.svelte-15a1m3{background:linear-gradient(135deg,#ec4899,#db2777);padding:7px 10px 8px;display:flex;flex-direction:column;gap:3px}.reason-node.exec-running.svelte-15a1m3 .reason-header:where(.svelte-15a1m3){background:linear-gradient(135deg,#ec4899,#f472b6)}.reason-node.exec-error.svelte-15a1m3 .reason-header:where(.svelte-15a1m3){background:linear-gradient(135deg,#ec4899,#be185d,#ef4444)}.header-row.svelte-15a1m3{display:flex;align-items:center;gap:5px;color:#fff}.brain-icon-wrap.svelte-15a1m3{display:flex;align-items:center;justify-content:center;width:22px;height:22px;background:#ffffff26;border-radius:6px;flex-shrink:0}.reason-title.svelte-15a1m3{flex:1;font-size:11px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pattern-name.svelte-15a1m3{font-size:10px;font-weight:600;color:#ffffffbf;background:#ffffff1a;padding:1px 7px;border-radius:8px;align-self:flex-start;letter-spacing:.02em}.status-dot.svelte-15a1m3{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-15a1m3{background:#ffffff4d}.dot-running.svelte-15a1m3{background:#22c55e;animation:svelte-15a1m3-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-15a1m3{background:#ef4444}.dot-complete.svelte-15a1m3{background:#22c55e}@keyframes svelte-15a1m3-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-15a1m3{display:flex;align-items:center;color:#22c55e}.state-error.svelte-15a1m3{color:#ef4444}.reason-body.svelte-15a1m3{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-15a1m3{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin.svelte-15a1m3{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-15a1m3:hover{color:#b0b0c8}.pin-dot.svelte-15a1m3{width:6px;height:6px;border-radius:50%;background:#ec4899;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-15a1m3:hover .pin-dot:where(.svelte-15a1m3){transform:scale(1.4);box-shadow:0 0 6px #ec489980}.reason-description.svelte-15a1m3{font-size:10px;color:#8888a0;padding:2px 10px 4px;line-height:1.35}.steps-row.svelte-15a1m3{display:flex;align-items:center;justify-content:space-between;padding:4px 10px 0}.steps-label.svelte-15a1m3{font-size:9px;color:#6a6a80;font-family:JetBrains Mono,monospace;text-transform:uppercase;letter-spacing:.04em}.steps-badge.svelte-15a1m3{font-size:10px;font-weight:700;color:#f9a8d4;background:#ec48991a;border:1px solid rgba(236,72,153,.15);padding:1px 8px;border-radius:8px;font-variant-numeric:tabular-nums}.cond-node.svelte-9dvt8o{width:200px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #f59e0b1a,0 0 0 1px #f59e0b2e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.cond-node.exec-running.svelte-9dvt8o{box-shadow:none}.cond-node.exec-running.svelte-9dvt8o:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#f59e0b 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-9dvt8o-spin-border 1.2s linear infinite;pointer-events:none}.cond-node.exec-complete.svelte-9dvt8o{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.cond-node.exec-error.svelte-9dvt8o{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-9dvt8o-spin-border{to{transform:rotate(360deg)}}.cond-header.svelte-9dvt8o{position:relative;background:linear-gradient(135deg,#f59e0b,#d97706);padding:8px 10px;overflow:hidden}.cond-node.exec-running.svelte-9dvt8o .cond-header:where(.svelte-9dvt8o){background:linear-gradient(135deg,#f59e0b,#fbbf24)}.cond-node.exec-error.svelte-9dvt8o .cond-header:where(.svelte-9dvt8o){background:linear-gradient(135deg,#f59e0b,#ea580c,#ef4444)}.hex-accent.svelte-9dvt8o{position:absolute;top:-6px;right:-6px;width:28px;height:28px;background:#ffffff14;transform:rotate(45deg);border-radius:4px}.header-content.svelte-9dvt8o{display:flex;align-items:center;gap:5px;color:#fff;position:relative;z-index:1}.cond-title.svelte-9dvt8o{flex:1;font-size:11px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-9dvt8o{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-9dvt8o{background:#ffffff4d}.dot-running.svelte-9dvt8o{background:#22c55e;animation:svelte-9dvt8o-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-9dvt8o{background:#ef4444}.dot-complete.svelte-9dvt8o{background:#22c55e}@keyframes svelte-9dvt8o-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-9dvt8o{display:flex;align-items:center;color:#22c55e}.state-error.svelte-9dvt8o{color:#ef4444}.cond-body.svelte-9dvt8o{background:#1a1a26;padding:8px 0 6px}.condition-expr.svelte-9dvt8o{margin:0 8px 6px;padding:5px 7px;background:#f59e0b0d;border:1px solid rgba(245,158,11,.1);border-radius:5px}.expr-code.svelte-9dvt8o{font-size:10px;font-family:JetBrains Mono,monospace;color:#fbbf24;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cond-description.svelte-9dvt8o{font-size:10px;color:#8888a0;padding:0 10px 4px;line-height:1.35}.branch-pins.svelte-9dvt8o{display:flex;justify-content:space-between;padding:4px 10px 0}.branch-in.svelte-9dvt8o{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;align-self:center}.branch-outputs.svelte-9dvt8o{display:flex;flex-direction:column;align-items:flex-end;gap:8px}.branch-out.svelte-9dvt8o{display:flex;align-items:center;gap:4px;font-size:9px;transition:opacity .15s ease}.branch-out.svelte-9dvt8o:hover{opacity:.8}.pin-dot.svelte-9dvt8o{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:transform .15s ease,box-shadow .15s ease}.branch-out.svelte-9dvt8o:hover .pin-dot:where(.svelte-9dvt8o),.branch-in.svelte-9dvt8o:hover .pin-dot:where(.svelte-9dvt8o){transform:scale(1.3)}.dot-in.svelte-9dvt8o{background:#f59e0b}.dot-true.svelte-9dvt8o{background:#22c55e;box-shadow:0 0 4px #22c55e4d}.dot-false.svelte-9dvt8o{background:#ef4444;box-shadow:0 0 4px #ef44444d}.pin-label.svelte-9dvt8o{color:#8888a0}.label-true.svelte-9dvt8o{color:#4ade80;font-weight:600}.label-false.svelte-9dvt8o{color:#f87171;font-weight:600}.bp-node.svelte-mcwl9o{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #06b6d41f,0 0 0 1px #06b6d433;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-mcwl9o{box-shadow:none}.bp-node.exec-running.svelte-mcwl9o:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#06b6d4 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-mcwl9o-memory-spin 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-mcwl9o{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-mcwl9o{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-mcwl9o-memory-spin{to{transform:rotate(360deg)}}.bp-header.svelte-mcwl9o{height:32px;background:linear-gradient(135deg,#06b6d4,#0891b2);color:#fff;display:flex;flex-direction:row;align-items:center;gap:6px;padding:0 10px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-mcwl9o{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-mcwl9o{display:flex;align-items:center;color:#22c55e}.bp-state-error.svelte-mcwl9o{color:#ef4444}.bp-body.svelte-mcwl9o{background:#1a1a26;padding:8px 0}.bp-pins.svelte-mcwl9o{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-in.svelte-mcwl9o,.bp-pin-out.svelte-mcwl9o{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0}.bp-dot.svelte-mcwl9o{width:6px;height:6px;border-radius:50%;background:#06b6d4}.bp-prop.svelte-mcwl9o{display:flex;justify-content:space-between;padding:2px 10px;font-size:10px}.bp-key.svelte-mcwl9o{color:#6a6a80;font-family:JetBrains Mono,monospace}.bp-val.svelte-mcwl9o{color:#a0a0b8;font-family:JetBrains Mono,monospace;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px;text-align:right}.bp-node.svelte-1y5xb8x{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #f59e0b1f,0 0 0 1px #f59e0b33;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-1y5xb8x{box-shadow:none}.bp-node.exec-running.svelte-1y5xb8x:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#f59e0b 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-1y5xb8x-validator-spin 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-1y5xb8x{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-1y5xb8x{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-1y5xb8x-validator-spin{to{transform:rotate(360deg)}}.bp-header.svelte-1y5xb8x{height:32px;background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;display:flex;flex-direction:row;align-items:center;gap:6px;padding:0 10px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-1y5xb8x{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-1y5xb8x{display:flex;align-items:center;color:#22c55e}.bp-state-error.svelte-1y5xb8x{color:#ef4444}.bp-body.svelte-1y5xb8x{background:#1a1a26;padding:8px 0}.bp-pins.svelte-1y5xb8x{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-in.svelte-1y5xb8x,.bp-pin-out.svelte-1y5xb8x{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0}.bp-dot.svelte-1y5xb8x{width:6px;height:6px;border-radius:50%;background:#f59e0b}.bp-prop.svelte-1y5xb8x{display:flex;justify-content:space-between;padding:2px 10px;font-size:10px}.bp-key.svelte-1y5xb8x{color:#6a6a80;font-family:JetBrains Mono,monospace}.bp-val.svelte-1y5xb8x{color:#a0a0b8;font-family:JetBrains Mono,monospace;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px;text-align:right}.bp-node.svelte-1ebq9zd{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #3b82f61f,0 0 0 1px #3b82f633;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-1ebq9zd{box-shadow:none}.bp-node.exec-running.svelte-1ebq9zd:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#3b82f6 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-1ebq9zd-spin-border 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-1ebq9zd{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-1ebq9zd{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-1ebq9zd-spin-border{to{transform:rotate(360deg)}}.bp-header.svelte-1ebq9zd{display:flex;align-items:center;gap:6px;padding:0 10px;height:32px;background:linear-gradient(135deg,#3b82f6,color-mix(in srgb,#3b82f6 70%,#000));color:#fff;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-1ebq9zd{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-1ebq9zd{margin-left:auto;display:flex;align-items:center;color:var(--color-success, #22c55e)}.bp-state-error.svelte-1ebq9zd{color:var(--color-error, #ef4444)}.bp-body.svelte-1ebq9zd{background:#1a1a26;padding:8px 0}.bp-pins.svelte-1ebq9zd{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-in.svelte-1ebq9zd,.bp-pin-out.svelte-1ebq9zd{display:flex;align-items:center;gap:4px}.bp-pin-in.svelte-1ebq9zd,.bp-pin-out.svelte-1ebq9zd{font-size:9px;color:#8888a0}.bp-dot.svelte-1ebq9zd{width:6px;height:6px;border-radius:50%;background:#3b82f6;flex-shrink:0}.bp-prop.svelte-1ebq9zd{display:flex;justify-content:space-between;align-items:baseline;padding:2px 10px;gap:8px}.bp-key.svelte-1ebq9zd{font-size:10px;color:#6a6a80;font-family:var(--font-mono, monospace);white-space:nowrap}.bp-val.svelte-1ebq9zd{font-size:10px;color:#a0a0b8;font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:140px;text-align:right}.bp-node.svelte-5h9d64{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #64748b1f,0 0 0 1px #64748b33;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-5h9d64{box-shadow:none}.bp-node.exec-running.svelte-5h9d64:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#64748b 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-5h9d64-spin-border 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-5h9d64{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-5h9d64{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-5h9d64-spin-border{to{transform:rotate(360deg)}}.bp-header.svelte-5h9d64{display:flex;align-items:center;gap:6px;padding:0 10px;height:32px;background:linear-gradient(135deg,#64748b,color-mix(in srgb,#64748b 70%,#000));color:#fff;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-5h9d64{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-5h9d64{margin-left:auto;display:flex;align-items:center;color:var(--color-success, #22c55e)}.bp-state-error.svelte-5h9d64{color:var(--color-error, #ef4444)}.bp-body.svelte-5h9d64{background:#1a1a26;padding:8px 0}.bp-pins-multi.svelte-5h9d64{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-col-left.svelte-5h9d64{display:flex;flex-direction:column;justify-content:center;gap:6px}.bp-pin-col-right.svelte-5h9d64{display:flex;flex-direction:column;align-items:flex-end;gap:6px}.bp-pin-in.svelte-5h9d64,.bp-pin-out.svelte-5h9d64{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0}.bp-dot.svelte-5h9d64{width:6px;height:6px;border-radius:50%;background:#64748b;flex-shrink:0}.bp-prop.svelte-5h9d64{display:flex;justify-content:space-between;align-items:baseline;padding:2px 10px;gap:8px}.bp-key.svelte-5h9d64{font-size:10px;color:#6a6a80;font-family:var(--font-mono, monospace);white-space:nowrap}.bp-val.svelte-5h9d64{font-size:10px;color:#a0a0b8;font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:140px;text-align:right}.bp-node.svelte-k2gv2h{min-width:200px;max-width:260px;border-radius:8px;overflow:hidden;box-shadow:0 4px 16px #64748b1f,0 0 0 1px #64748b33;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.bp-node.exec-running.svelte-k2gv2h{box-shadow:none}.bp-node.exec-running.svelte-k2gv2h:after{content:"";position:absolute;inset:-2px;border-radius:10px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#64748b 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-k2gv2h-spin-border 1.2s linear infinite;pointer-events:none}.bp-node.exec-complete.svelte-k2gv2h{box-shadow:0 0 16px #22c55e66,0 0 0 1px #22c55e80}.bp-node.exec-error.svelte-k2gv2h{box-shadow:0 0 16px #ef444466,0 0 0 1px #ef444480}@keyframes svelte-k2gv2h-spin-border{to{transform:rotate(360deg)}}.bp-header.svelte-k2gv2h{display:flex;align-items:center;gap:6px;padding:0 10px;height:32px;background:linear-gradient(135deg,#64748b,color-mix(in srgb,#64748b 70%,#000));color:#fff;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.bp-title.svelte-k2gv2h{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bp-state.svelte-k2gv2h{margin-left:auto;display:flex;align-items:center;color:var(--color-success, #22c55e)}.bp-state-error.svelte-k2gv2h{color:var(--color-error, #ef4444)}.bp-body.svelte-k2gv2h{background:#1a1a26;padding:8px 0}.bp-pins-multi.svelte-k2gv2h{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.bp-pin-col-left.svelte-k2gv2h{display:flex;flex-direction:column;justify-content:center;gap:6px}.bp-pin-col-right.svelte-k2gv2h{display:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:6px}.bp-pin-in.svelte-k2gv2h,.bp-pin-out.svelte-k2gv2h{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0}.bp-dot.svelte-k2gv2h{width:6px;height:6px;border-radius:50%;background:#64748b;flex-shrink:0}.bp-prop.svelte-k2gv2h{display:flex;justify-content:space-between;align-items:baseline;padding:2px 10px;gap:8px}.bp-key.svelte-k2gv2h{font-size:10px;color:#6a6a80;font-family:var(--font-mono, monospace);white-space:nowrap}.bp-val.svelte-k2gv2h{font-size:10px;color:#a0a0b8;font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:140px;text-align:right}.input-node.svelte-170rmgf{width:220px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #10b9811a,0 0 0 1px #10b9812e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.input-node.exec-running.svelte-170rmgf{box-shadow:none}.input-node.exec-running.svelte-170rmgf:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#10b981 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-170rmgf-input-spin 1.2s linear infinite;pointer-events:none}.input-node.exec-complete.svelte-170rmgf{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.input-node.exec-error.svelte-170rmgf{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-170rmgf-input-spin{to{transform:rotate(360deg)}}.input-header.svelte-170rmgf{background:linear-gradient(135deg,#10b981,#059669);padding:6px 10px 8px;display:flex;flex-direction:column;gap:4px}.input-node.exec-running.svelte-170rmgf .input-header:where(.svelte-170rmgf){background:linear-gradient(135deg,#10b981,#34d399)}.input-node.exec-error.svelte-170rmgf .input-header:where(.svelte-170rmgf){background:linear-gradient(135deg,#10b981,#047857,#ef4444)}.header-top-row.svelte-170rmgf{display:flex;align-items:center;justify-content:space-between;min-height:16px}.header-badges.svelte-170rmgf{display:flex;align-items:center;gap:4px;min-width:0}.trigger-badge.svelte-170rmgf{font-size:9px;font-weight:600;color:#ffffffb3;background:#ffffff1f;padding:1px 6px;border-radius:8px;letter-spacing:.02em;line-height:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px;text-transform:capitalize}.settings-icon.svelte-170rmgf{color:#ffffff59;display:flex;align-items:center;cursor:pointer;transition:color .15s ease}.settings-icon.svelte-170rmgf:hover{color:#ffffffb3}.header-main-row.svelte-170rmgf{display:flex;align-items:center;gap:6px;color:#fff}.icon-wrap.svelte-170rmgf{display:flex;align-items:center;justify-content:center;width:22px;height:22px;background:#ffffff26;border-radius:6px;flex-shrink:0}.input-title.svelte-170rmgf{flex:1;font-size:12px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-170rmgf{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-170rmgf{background:#ffffff4d}.dot-running.svelte-170rmgf{background:#22c55e;animation:svelte-170rmgf-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-170rmgf{background:#ef4444}.dot-complete.svelte-170rmgf{background:#22c55e}@keyframes svelte-170rmgf-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-170rmgf{display:flex;align-items:center;color:#22c55e}.state-error.svelte-170rmgf{color:#ef4444}.input-body.svelte-170rmgf{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-170rmgf{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin-spacer.svelte-170rmgf{flex:1}.pin.svelte-170rmgf{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-170rmgf:hover{color:#b0b0c8}.pin-dot.svelte-170rmgf{width:6px;height:6px;border-radius:50%;background:#10b981;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-170rmgf:hover .pin-dot:where(.svelte-170rmgf){transform:scale(1.4);box-shadow:0 0 6px #10b98180}.description-text.svelte-170rmgf{font-size:10px;color:#a0a0b8;padding:2px 10px 4px;line-height:1.4}.config-section.svelte-170rmgf{margin:4px 8px 2px;padding:5px 7px;background:#10b9810a;border:1px solid rgba(16,185,129,.08);border-radius:5px}.section-label.svelte-170rmgf{font-size:8px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#10b981;opacity:.6}.config-text.svelte-170rmgf{font-size:10px;color:#7a7a94;font-family:JetBrains Mono,monospace;line-height:1.35;margin:2px 0 0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.output-node.svelte-198t6xy{width:220px;border-radius:10px;overflow:hidden;box-shadow:0 4px 20px #3b82f61a,0 0 0 1px #3b82f62e;transition:box-shadow .3s ease;position:relative;font-family:var(--font-sans, system-ui, sans-serif)}.output-node.exec-running.svelte-198t6xy{box-shadow:none}.output-node.exec-running.svelte-198t6xy:after{content:"";position:absolute;inset:-2px;border-radius:12px;padding:2px;background:conic-gradient(from 0deg,transparent 0%,#3b82f6 30%,transparent 60%);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask-composite:exclude;animation:svelte-198t6xy-output-spin 1.2s linear infinite;pointer-events:none}.output-node.exec-complete.svelte-198t6xy{box-shadow:0 0 20px #22c55e59,0 0 0 1px #22c55e73}.output-node.exec-error.svelte-198t6xy{box-shadow:0 0 20px #ef444459,0 0 0 1px #ef444473}@keyframes svelte-198t6xy-output-spin{to{transform:rotate(360deg)}}.output-header.svelte-198t6xy{background:linear-gradient(135deg,#3b82f6,#2563eb);padding:6px 10px 8px;display:flex;flex-direction:column;gap:4px}.output-node.exec-running.svelte-198t6xy .output-header:where(.svelte-198t6xy){background:linear-gradient(135deg,#3b82f6,#60a5fa)}.output-node.exec-error.svelte-198t6xy .output-header:where(.svelte-198t6xy){background:linear-gradient(135deg,#3b82f6,#1d4ed8,#ef4444)}.header-top-row.svelte-198t6xy{display:flex;align-items:center;justify-content:space-between;min-height:16px}.header-badges.svelte-198t6xy{display:flex;align-items:center;gap:4px;min-width:0}.dest-badge.svelte-198t6xy{font-size:9px;font-weight:600;color:#ffffffb3;background:#ffffff1f;padding:1px 6px;border-radius:8px;letter-spacing:.02em;line-height:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:140px;text-transform:capitalize}.settings-icon.svelte-198t6xy{color:#ffffff59;display:flex;align-items:center;cursor:pointer;transition:color .15s ease}.settings-icon.svelte-198t6xy:hover{color:#ffffffb3}.header-main-row.svelte-198t6xy{display:flex;align-items:center;gap:6px;color:#fff}.icon-wrap.svelte-198t6xy{display:flex;align-items:center;justify-content:center;width:22px;height:22px;background:#ffffff26;border-radius:6px;flex-shrink:0}.output-title.svelte-198t6xy{flex:1;font-size:12px;font-weight:700;letter-spacing:.02em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-dot.svelte-198t6xy{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background .2s ease}.dot-idle.svelte-198t6xy{background:#ffffff4d}.dot-running.svelte-198t6xy{background:#22c55e;animation:svelte-198t6xy-pulse-dot 1s ease-in-out infinite}.dot-error.svelte-198t6xy{background:#ef4444}.dot-complete.svelte-198t6xy{background:#22c55e}@keyframes svelte-198t6xy-pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.75)}}.state-icon.svelte-198t6xy{display:flex;align-items:center;color:#22c55e}.state-error.svelte-198t6xy{color:#ef4444}.output-body.svelte-198t6xy{background:#1a1a26;padding:8px 0 6px}.pins-row.svelte-198t6xy{display:flex;justify-content:space-between;padding:0 10px;margin-bottom:6px}.pin-spacer.svelte-198t6xy{flex:1}.pin.svelte-198t6xy{display:flex;align-items:center;gap:4px;font-size:9px;color:#8888a0;transition:color .15s ease}.pin.svelte-198t6xy:hover{color:#b0b0c8}.pin-dot.svelte-198t6xy{width:6px;height:6px;border-radius:50%;background:#3b82f6;transition:transform .15s ease,box-shadow .15s ease}.pin.svelte-198t6xy:hover .pin-dot:where(.svelte-198t6xy){transform:scale(1.4);box-shadow:0 0 6px #3b82f680}.description-text.svelte-198t6xy{font-size:10px;color:#a0a0b8;padding:2px 10px 4px;line-height:1.4}.config-section.svelte-198t6xy{margin:4px 8px 2px;padding:5px 7px;background:#3b82f60a;border:1px solid rgba(59,130,246,.08);border-radius:5px}.section-label.svelte-198t6xy{font-size:8px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#3b82f6;opacity:.6}.config-text.svelte-198t6xy{font-size:10px;color:#7a7a94;font-family:JetBrains Mono,monospace;line-height:1.35;margin:2px 0 0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.canvas-wrapper.svelte-e4xfdd{width:100%;height:100%;position:relative}.stats-bar.svelte-e4xfdd{position:absolute;top:12px;left:50%;transform:translate(-50%);z-index:5;display:flex;align-items:center;gap:0;background:#12121cd1;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.06);border-radius:20px;padding:5px 14px;box-shadow:0 2px 12px #0000004d;pointer-events:none;-webkit-user-select:none;user-select:none}.stat-item.svelte-e4xfdd{display:flex;align-items:center;gap:5px;padding:0 8px;color:#a0a0b8cc;font-size:11px;font-family:var(--font-sans, system-ui, sans-serif);white-space:nowrap}.stat-label.svelte-e4xfdd{color:#8888a099;font-weight:500}.stat-value.svelte-e4xfdd{color:#e8e8ede6;font-weight:600;font-variant-numeric:tabular-nums}.stat-divider.svelte-e4xfdd{width:1px;height:14px;background:#ffffff14;flex-shrink:0}.empty-overlay.svelte-e4xfdd{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:1}.empty-container.svelte-e4xfdd{display:flex;flex-direction:column;align-items:center;gap:12px;padding:40px 48px;border:2px dashed var(--color-border, #2a2a3a);border-radius:16px;color:var(--color-text-secondary, #8888a0);opacity:.6}.empty-headline.svelte-e4xfdd{font-size:16px;font-weight:600;color:var(--color-text-primary, #e8e8ed);margin:0}.empty-hint.svelte-e4xfdd{font-size:12px;color:var(--color-text-secondary, #8888a0);margin:0}.form-field.svelte-nvi5du{display:flex;flex-direction:column;gap:6px}.field-label.svelte-nvi5du{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0)}.field-input.svelte-nvi5du{background:var(--bg-elevated, #1a1a26);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;padding:8px 10px;font-size:12px;color:var(--color-text-primary, #e8e8ed);font-family:inherit;outline:none;transition:border-color .15s ease,box-shadow .15s ease;width:100%;box-sizing:border-box}.field-input.svelte-nvi5du:focus{border-color:var(--color-accent, #ff6b35);box-shadow:0 0 0 2px #ff6b3526}.field-input.svelte-nvi5du::placeholder{color:var(--color-text-secondary, #8888a0);opacity:.5}.field-textarea.svelte-nvi5du{resize:none;min-height:60px;line-height:1.5}.field-select.svelte-nvi5du{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238888a0' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:28px;cursor:pointer}.field-select.svelte-nvi5du option:where(.svelte-nvi5du){background:var(--bg-elevated, #1a1a26);color:var(--color-text-primary, #e8e8ed)}.config-panel.svelte-16rdffs{width:100%;background:var(--color-bg-secondary, #12121a);display:flex;flex-direction:column;overflow-y:auto}.panel-header.svelte-16rdffs{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--color-border, #2a2a3a)}.header-left.svelte-16rdffs{display:flex;align-items:center;gap:10px;min-width:0}.header-icon.svelte-16rdffs{width:28px;height:28px;border-radius:8px;background:oklch(from var(--node-color, #ff6b35) l c h / 15%);color:var(--node-color, #ff6b35);display:flex;align-items:center;justify-content:center;flex-shrink:0}.header-info.svelte-16rdffs{display:flex;flex-direction:column;min-width:0}.header-title.svelte-16rdffs{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.header-id.svelte-16rdffs{font-size:10px;font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-text-secondary, #8888a0);opacity:.7;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.close-btn.svelte-16rdffs{width:28px;height:28px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .15s ease,color .15s ease}.close-btn.svelte-16rdffs:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.panel-body.svelte-16rdffs{padding:16px;display:flex;flex-direction:column;gap:20px}.node-type-row.svelte-16rdffs{display:flex;align-items:center}.node-type-badge.svelte-16rdffs{display:inline-flex;padding:3px 10px;border-radius:10px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;background:oklch(from var(--badge-color, #ff6b35) l c h / 12%);color:var(--badge-color, #ff6b35);border:1px solid oklch(from var(--badge-color, #ff6b35) l c h / 20%)}.section.svelte-16rdffs{display:flex;flex-direction:column;gap:10px}.section-title.svelte-16rdffs{display:flex;align-items:center;gap:6px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0);padding-bottom:4px;border-bottom:1px solid var(--color-border, #2a2a3a)}.field-group.svelte-16rdffs{display:flex;flex-direction:column;gap:12px}.form-field.svelte-16rdffs{display:flex;flex-direction:column;gap:6px}.field-label.svelte-16rdffs{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0)}.info-card.svelte-16rdffs{background:#6366f10f;border:1px solid rgba(99,102,241,.15);border-radius:6px;padding:8px 10px;display:flex;flex-direction:column;gap:4px}.info-card-muted.svelte-16rdffs{background:#ffffff05;border-color:var(--color-border, #2a2a3a)}.info-card-header.svelte-16rdffs{display:flex;align-items:center;gap:5px;color:var(--color-accent, #ff6b35);font-size:11px;font-weight:600}.info-card-text.svelte-16rdffs{font-size:10px;line-height:1.5;color:var(--color-text-secondary, #8888a0);margin:0}.info-card-text.svelte-16rdffs code{font-family:var(--font-mono, "JetBrains Mono", monospace);font-size:10px;background:#ffffff0f;padding:1px 4px;border-radius:3px;color:var(--color-text-primary, #e8e8ed)}.info-card-hint.svelte-16rdffs{font-size:10px;line-height:1.4;color:var(--color-accent, #ff6b35);margin:2px 0 0;font-style:italic}.info-params.svelte-16rdffs{display:flex;flex-direction:column;gap:2px;margin-top:4px;padding-top:4px;border-top:1px solid rgba(255,255,255,.05)}.info-param-row.svelte-16rdffs{display:flex;align-items:center;gap:6px;font-size:10px}.info-param-name.svelte-16rdffs{font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-text-primary, #e8e8ed);font-weight:500}.info-param-type.svelte-16rdffs{font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-text-secondary, #8888a0);font-size:9px}.connections-list.svelte-16rdffs{display:flex;flex-direction:column;gap:8px}.connection-group.svelte-16rdffs{display:flex;flex-direction:column;gap:4px}.connection-label.svelte-16rdffs{font-size:10px;font-weight:500;color:var(--color-text-secondary, #8888a0);opacity:.7}.connection-item.svelte-16rdffs{display:flex;align-items:center;gap:6px;padding:5px 8px;background:#ffffff08;border:1px solid var(--color-border, #2a2a3a);border-radius:6px;cursor:pointer;font-size:11px;color:var(--color-text-primary, #e8e8ed);transition:background .15s,border-color .15s}.connection-item.svelte-16rdffs:hover{background:#ffffff0f;border-color:var(--color-accent, #ff6b35)}.connection-node-name.svelte-16rdffs{font-weight:500}.connection-this.svelte-16rdffs{font-size:10px;color:var(--color-text-secondary, #8888a0);font-style:italic}.position-row.svelte-16rdffs{display:flex;gap:16px}.position-value.svelte-16rdffs{font-size:11px;font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-text-secondary, #8888a0)}.danger-section.svelte-16rdffs{padding-top:8px;border-top:1px solid rgba(239,68,68,.15)}.delete-btn.svelte-16rdffs{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;padding:8px 12px;background:#ef444414;border:1px solid rgba(239,68,68,.2);border-radius:6px;color:var(--color-error, #ef4444);font-size:12px;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s}.delete-btn.svelte-16rdffs:hover{background:#ef444426;border-color:#ef444459}.mm-section.svelte-16rdffs{border:1px solid var(--color-border, #2a2a3a);border-radius:6px;overflow:hidden}.mm-toggle.svelte-16rdffs{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 10px;background:#ffffff05;border:none;cursor:pointer;color:var(--color-text-primary, #e8e8ed)}.mm-toggle.svelte-16rdffs:hover{background:#ffffff0a}.mm-toggle-label.svelte-16rdffs{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0)}.mm-toggle-switch.svelte-16rdffs{width:28px;height:16px;border-radius:8px;background:var(--color-border, #2a2a3a);position:relative;transition:background .15s}.mm-toggle-switch.mm-on.svelte-16rdffs{background:var(--color-accent, #ff6b35)}.mm-toggle-thumb.svelte-16rdffs{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:#fff;transition:transform .15s}.mm-on.svelte-16rdffs .mm-toggle-thumb:where(.svelte-16rdffs){transform:translate(12px)}.mm-options.svelte-16rdffs{padding:8px 10px;display:flex;flex-direction:column;gap:10px;border-top:1px solid var(--color-border, #2a2a3a)}.mm-group.svelte-16rdffs{display:flex;flex-direction:column;gap:4px}.mm-group-label.svelte-16rdffs{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary, #8888a0);opacity:.7}.mm-check.svelte-16rdffs,.mm-radio.svelte-16rdffs{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--color-text-primary, #e8e8ed);cursor:pointer}.mm-check.svelte-16rdffs input:where(.svelte-16rdffs),.mm-radio.svelte-16rdffs input:where(.svelte-16rdffs){accent-color:var(--color-accent, #ff6b35)}.mm-range-row.svelte-16rdffs{display:flex;align-items:center;gap:8px}.mm-range.svelte-16rdffs{flex:1;accent-color:var(--color-accent, #ff6b35)}.mm-range-val.svelte-16rdffs{font-size:10px;font-family:var(--font-mono, "JetBrains Mono", monospace);color:var(--color-accent, #ff6b35);min-width:40px;text-align:right}.mm-radio-row.svelte-16rdffs{display:flex;gap:12px}.component-panel.svelte-1ecj58j{min-width:240px;background:var(--color-bg-secondary, #12121a);border-left:1px solid var(--color-border, #2a2a3a);display:flex;flex-direction:column;overflow:hidden;flex-shrink:0;position:relative}.component-panel.dragging.svelte-1ecj58j{-webkit-user-select:none;user-select:none}.resize-handle.svelte-1ecj58j{position:absolute;top:0;left:-2px;width:5px;height:100%;cursor:ew-resize;z-index:10}.resize-handle.svelte-1ecj58j:hover{background:oklch(from var(--color-accent, #ff6b35) l c h / 30%)}.panel-tab-header.svelte-1ecj58j{display:flex;align-items:center;gap:2px;padding:0 8px;height:36px;min-height:36px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.panel-tab-btn.svelte-1ecj58j{display:flex;align-items:center;gap:5px;padding:6px 10px;border:none;background:transparent;border-bottom:2px solid transparent;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:color .15s ease,border-color .15s ease;margin-bottom:-1px}.panel-tab-btn.svelte-1ecj58j:hover{color:var(--color-text-primary, #e8e8ed)}.panel-tab-btn.active.svelte-1ecj58j{color:var(--color-text-primary, #e8e8ed);border-bottom-color:var(--color-accent, #ff6b35)}.panel-content.svelte-1ecj58j{flex:1;overflow-y:auto}.palette-items.svelte-1ecj58j{display:flex;flex-direction:column;gap:2px;padding:8px}.palette-items.svelte-1ecj58j .tooltip-wrapper{display:flex;width:100%}.palette-item.svelte-1ecj58j{display:flex;align-items:center;gap:10px;padding:8px;border:none;background:transparent;border-radius:8px;cursor:pointer;transition:background .15s ease,transform .1s ease;width:100%;text-align:left}.palette-item.svelte-1ecj58j:hover{background:#ffffff0d}.palette-item.svelte-1ecj58j:active{transform:scale(.97)}.palette-icon.svelte-1ecj58j{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.palette-label.svelte-1ecj58j{font-size:12px;font-weight:500;color:var(--color-text-primary, #e8e8ed)}.palette-group-label.svelte-1ecj58j{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-secondary, #8888a0);padding:6px 8px 2px;opacity:.7}.console-tab.svelte-dlnc6c{display:flex;flex-direction:column;height:100%;overflow:hidden}.console-toolbar.svelte-dlnc6c{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.event-count.svelte-dlnc6c{font-size:11px;color:var(--color-text-secondary, #8888a0)}.toolbar-btn.svelte-dlnc6c{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.toolbar-btn.svelte-dlnc6c:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.console-output.svelte-dlnc6c{flex:1;overflow-y:auto;padding:8px 12px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:11px;line-height:1.6}.empty-state.svelte-dlnc6c{display:flex;align-items:center;justify-content:center;height:100%;padding:24px}.empty-text.svelte-dlnc6c{color:var(--color-text-secondary, #8888a0);font-size:12px}.log-line.svelte-dlnc6c{display:flex;align-items:baseline;gap:8px;padding:2px 0;white-space:nowrap}.log-timestamp.svelte-dlnc6c{color:var(--color-text-secondary, #8888a0);opacity:.6;flex-shrink:0}.log-badge.svelte-dlnc6c{font-size:9px;font-weight:700;letter-spacing:.05em;padding:1px 6px;border-radius:3px;flex-shrink:0}.badge-info.svelte-dlnc6c{background:#3b82f626;color:var(--color-info, #3b82f6)}.badge-success.svelte-dlnc6c{background:#22c55e26;color:var(--color-success, #22c55e)}.badge-error.svelte-dlnc6c{background:#ef444426;color:var(--color-error, #ef4444)}.badge-warning.svelte-dlnc6c{background:#f59e0b26;color:var(--color-warning, #f59e0b)}.log-node.svelte-dlnc6c{color:var(--color-accent, #ff6b35);font-weight:500;flex-shrink:0}.log-pipeline.svelte-dlnc6c{color:var(--color-text-secondary, #8888a0);flex-shrink:0}.log-extra.svelte-dlnc6c{color:var(--color-text-secondary, #8888a0);opacity:.8;overflow:hidden;text-overflow:ellipsis}.thinking.svelte-gwema1{display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:12px;background:var(--color-bg-elevated);border:1px solid var(--color-border);animation:svelte-gwema1-fadeIn .3s ease}.thinking-dots.svelte-gwema1{display:flex;gap:4px}.dot.svelte-gwema1{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:svelte-gwema1-bounce 1.4s infinite ease-in-out both}.dot.svelte-gwema1:nth-child(1){animation-delay:-.32s}.dot.svelte-gwema1:nth-child(2){animation-delay:-.16s}.thinking-text.svelte-gwema1{font-size:.8rem;color:var(--color-text-secondary);font-style:italic}@keyframes svelte-gwema1-bounce{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}@keyframes svelte-gwema1-fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.message.svelte-1g5mx7p{padding:12px 16px;border-radius:12px;margin-bottom:8px;animation:svelte-1g5mx7p-slideIn .2s ease}.message.assistant.svelte-1g5mx7p{background:var(--color-bg-elevated);border:1px solid var(--color-border)}.message.user.svelte-1g5mx7p{background:var(--color-accent-muted);border:1px solid color-mix(in srgb,var(--accent) 20%,transparent)}.message-header.svelte-1g5mx7p{display:flex;align-items:center;gap:8px;margin-bottom:6px}.agent-badge.svelte-1g5mx7p,.user-badge.svelte-1g5mx7p{font-size:.7rem;font-weight:600;padding:2px 8px;border-radius:4px;text-transform:uppercase;letter-spacing:.5px}.user-badge.svelte-1g5mx7p{background:var(--color-bg-hover);color:var(--color-text-secondary)}.timestamp.svelte-1g5mx7p{font-size:.65rem;color:var(--color-text-muted)}.message-body.svelte-1g5mx7p{font-size:.875rem;line-height:1.6;color:var(--color-text-primary)}.message-body.svelte-1g5mx7p p{margin:.4em 0}.message-body.svelte-1g5mx7p code{background:var(--color-code-bg);padding:1px 5px;border-radius:4px;font-size:.8rem}.message-body.svelte-1g5mx7p pre{background:var(--color-code-bg);border:1px solid var(--color-code-border);border-radius:8px;padding:12px;overflow-x:auto;margin:8px 0}@keyframes svelte-1g5mx7p-slideIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.tool-call.svelte-9dvq12{border:1px solid var(--color-border);border-radius:8px;margin:6px 0;overflow:hidden;background:var(--color-bg-secondary)}.tool-header.svelte-9dvq12{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:none;background:none;color:var(--color-text-secondary);cursor:pointer;font-size:.8rem}.tool-header.svelte-9dvq12:hover{background:var(--color-bg-hover)}.tool-name.svelte-9dvq12{font-weight:500;flex:1;text-align:left}.tool-body.svelte-9dvq12{padding:0 12px 8px;border-top:1px solid var(--color-border)}.tool-section.svelte-9dvq12{margin-top:8px}.tool-label.svelte-9dvq12{font-size:.7rem;font-weight:600;text-transform:uppercase;color:var(--color-text-muted);letter-spacing:.5px}pre.svelte-9dvq12{margin:4px 0 0;padding:8px;border-radius:4px;background:var(--color-code-bg);font-size:.75rem;overflow-x:auto;color:var(--color-text-primary);white-space:pre-wrap;word-break:break-word}.modal-overlay.svelte-1f6rc4h{position:fixed;inset:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:10000;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.modal.svelte-1f6rc4h{background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:16px;padding:24px;max-width:480px;width:90%;box-shadow:0 0 0 1px #ffffff0a,0 20px 60px #00000080}.modal-header.svelte-1f6rc4h{display:flex;align-items:center;gap:10px;margin-bottom:12px}.modal-header.svelte-1f6rc4h h3:where(.svelte-1f6rc4h){margin:0;font-size:1rem;color:var(--color-text-primary)}.modal-desc.svelte-1f6rc4h{font-size:.875rem;color:var(--color-text-secondary);margin:0 0 12px}.command-preview.svelte-1f6rc4h{background:var(--color-code-bg);border:1px solid var(--color-code-border);border-radius:8px;padding:12px;font-size:.85rem;color:#22c55e;margin:0 0 16px;overflow-x:auto}.modal-actions.svelte-1f6rc4h{display:flex;gap:12px;justify-content:flex-end}.btn-deny.svelte-1f6rc4h,.btn-approve.svelte-1f6rc4h{display:flex;align-items:center;gap:6px;padding:8px 20px;border-radius:8px;border:none;cursor:pointer;font-size:.85rem;font-weight:500}.btn-deny.svelte-1f6rc4h{background:var(--color-bg-hover);color:var(--color-text-secondary)}.btn-deny.svelte-1f6rc4h:hover{background:var(--color-error);color:#fff}.btn-approve.svelte-1f6rc4h{background:#22c55e;color:#fff}.btn-approve.svelte-1f6rc4h:hover{background:#16a34a}.smith-container.svelte-a1zyks{display:flex;flex-direction:column;height:100%;background:linear-gradient(180deg,rgba(34,197,94,.01) 0%,var(--color-bg-primary) 100%)}.smith-toolbar.svelte-a1zyks{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--color-border);background:var(--color-bg-secondary);flex-shrink:0}.smith-label.svelte-a1zyks{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:#22c55e}.toolbar-actions.svelte-a1zyks{display:flex;gap:4px}.toolbar-btn.svelte-a1zyks{display:flex;align-items:center;gap:4px;padding:4px 8px;border:1px solid var(--color-border);border-radius:6px;background:var(--color-bg-elevated);color:var(--color-text-secondary);cursor:pointer;font-size:.75rem;transition:all .15s}.toolbar-btn.svelte-a1zyks:hover{color:var(--color-text-primary);border-color:var(--color-accent)}.copied-text.svelte-a1zyks{color:#22c55e;font-size:.7rem}.code-area.svelte-a1zyks{flex:3;overflow:auto;border-bottom:1px solid var(--color-border);min-height:0}.code-display.svelte-a1zyks{margin:0;padding:12px 16px;font-size:.8rem;line-height:1.6;color:var(--color-text-primary);background:var(--color-code-bg);white-space:pre-wrap;word-break:break-word;min-height:100%}.code-display.svelte-a1zyks code:where(.svelte-a1zyks){font-family:JetBrains Mono,Fira Code,monospace}.code-generating.svelte-a1zyks{display:flex;align-items:center;justify-content:center;gap:10px;height:100%;color:var(--color-text-muted);font-size:.85rem}.smith-spinner{animation:svelte-a1zyks-smith-spin 1s linear infinite}@keyframes svelte-a1zyks-smith-spin{to{transform:rotate(360deg)}}.chat-area.svelte-a1zyks{flex:2;display:flex;flex-direction:column;min-height:0}.messages.svelte-a1zyks{flex:1;overflow-y:auto;padding:12px;min-height:0}.input-bar.svelte-a1zyks{display:flex;gap:8px;padding:8px 12px;border-top:1px solid var(--color-border);background:var(--color-bg-secondary);flex-shrink:0}.input-bar.svelte-a1zyks input:where(.svelte-a1zyks){flex:1;padding:8px 12px;border:1px solid var(--color-border);border-radius:8px;background:var(--color-bg-elevated);color:var(--color-text-primary);font-size:.85rem;outline:none}.input-bar.svelte-a1zyks input:where(.svelte-a1zyks):focus{border-color:#22c55e}.input-bar.svelte-a1zyks input:where(.svelte-a1zyks)::placeholder{color:var(--color-text-muted)}.send-btn.svelte-a1zyks{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:8px;background:#22c55e;color:#fff;cursor:pointer;transition:background .15s}.send-btn.svelte-a1zyks:hover{background:#16a34a}.send-btn.svelte-a1zyks:disabled{opacity:.4;cursor:not-allowed}.timeline-tab.svelte-164d9ci{display:flex;flex-direction:column;height:100%;overflow:hidden}.empty-state.svelte-164d9ci{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:12px;padding:24px}.empty-icon.svelte-164d9ci{color:var(--color-text-secondary, #8888a0);opacity:.4}.empty-text.svelte-164d9ci{font-size:12px;color:var(--color-text-secondary, #8888a0);text-align:center}.timeline-toolbar.svelte-164d9ci{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.toolbar-left.svelte-164d9ci{display:flex;align-items:center;gap:8px}.toolbar-label.svelte-164d9ci{font-size:11px;font-weight:600;color:var(--color-text-primary, #e8e8ed);text-transform:uppercase;letter-spacing:.05em}.checkpoint-count.svelte-164d9ci{font-size:11px;color:var(--color-accent, #ff6b35);font-weight:500}.toolbar-btn.svelte-164d9ci{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.toolbar-btn.svelte-164d9ci:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.timeline-scroll.svelte-164d9ci{flex-shrink:0;overflow-x:auto;overflow-y:hidden;padding:12px 16px;border-bottom:1px solid var(--color-border, #2a2a3a)}.timeline-track.svelte-164d9ci{display:flex;align-items:center;gap:24px;position:relative;min-width:max-content;padding:8px 0}.timeline-line.svelte-164d9ci{position:absolute;top:50%;left:0;right:0;height:2px;background:var(--color-border, #2a2a3a);transform:translateY(-50%);pointer-events:none}.checkpoint-dot-wrapper.svelte-164d9ci{display:flex;flex-direction:column;align-items:center;gap:6px;position:relative;z-index:1;background:none;border:none;padding:4px;cursor:pointer}.checkpoint-dot.svelte-164d9ci{width:12px;height:12px;border-radius:50%;background:var(--dot-color);transition:transform .15s ease,box-shadow .15s ease;flex-shrink:0}.checkpoint-dot-wrapper.svelte-164d9ci:hover .checkpoint-dot:where(.svelte-164d9ci){transform:scale(1.3)}.checkpoint-dot.selected.svelte-164d9ci{width:16px;height:16px;box-shadow:0 0 0 3px #ff6b354d,0 0 12px #ff6b3533}.checkpoint-dot.compare.svelte-164d9ci{width:16px;height:16px;box-shadow:0 0 0 3px #3b82f64d,0 0 12px #3b82f633}.checkpoint-dot.forked.svelte-164d9ci{border:2px solid var(--color-info, #3b82f6);background:var(--color-bg-elevated, #1a1a26)}.dot-label.svelte-164d9ci{font-size:9px;color:var(--color-text-secondary, #8888a0);font-weight:500}.checkpoint-dot-wrapper.selected.svelte-164d9ci .dot-label:where(.svelte-164d9ci){color:var(--color-accent, #ff6b35);font-weight:700}.checkpoint-dot-wrapper.compare.svelte-164d9ci .dot-label:where(.svelte-164d9ci){color:var(--color-info, #3b82f6);font-weight:700}.debug-controls.svelte-164d9ci{display:flex;align-items:center;gap:8px;padding:6px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.debug-btn.svelte-164d9ci{display:flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid var(--color-border, #2a2a3a);background:var(--color-bg-elevated, #1a1a26);border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:11px;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.debug-btn.svelte-164d9ci:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed);border-color:var(--color-text-secondary, #8888a0)}.debug-btn.active.svelte-164d9ci{border-color:var(--color-info, #3b82f6);color:var(--color-info, #3b82f6)}.debug-hint.svelte-164d9ci{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;margin-left:4px}.diff-panel.svelte-164d9ci{flex-shrink:0;border-bottom:1px solid var(--color-border, #2a2a3a);padding:8px 12px}.diff-header.svelte-164d9ci{font-size:11px;font-weight:600;color:var(--color-text-primary, #e8e8ed);margin-bottom:6px}.diff-body.svelte-164d9ci{display:flex;flex-wrap:wrap;gap:8px}.diff-section.svelte-164d9ci{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.diff-label.svelte-164d9ci{font-size:9px;font-weight:700;letter-spacing:.05em;padding:1px 6px;border-radius:3px}.diff-added.svelte-164d9ci{background:#22c55e26;color:var(--color-success, #22c55e)}.diff-removed.svelte-164d9ci{background:#ef444426;color:var(--color-error, #ef4444)}.diff-changed.svelte-164d9ci{background:#f59e0b26;color:var(--color-warning, #f59e0b)}.diff-key.svelte-164d9ci{font-size:11px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);color:var(--color-text-primary, #e8e8ed);background:var(--color-bg-elevated, #1a1a26);padding:1px 6px;border-radius:3px}.diff-empty.svelte-164d9ci{font-size:11px;color:var(--color-text-secondary, #8888a0)}.detail-panel.svelte-164d9ci{flex:1;overflow-y:auto;padding:10px 12px}.detail-header.svelte-164d9ci{display:flex;align-items:center;gap:8px;margin-bottom:10px}.detail-node-badge.svelte-164d9ci{font-size:11px;font-weight:600;padding:2px 8px;border-radius:4px}.detail-time.svelte-164d9ci{font-size:11px;color:var(--color-text-secondary, #8888a0)}.detail-timestamp.svelte-164d9ci{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace)}.detail-branch.svelte-164d9ci{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--color-info, #3b82f6);margin-bottom:10px;padding:4px 8px;background:#3b82f614;border-radius:4px}.branch-parent.svelte-164d9ci{color:var(--color-text-secondary, #8888a0);font-size:10px}.json-section.svelte-164d9ci{margin-bottom:6px}.json-toggle.svelte-164d9ci{display:flex;align-items:center;gap:4px;width:100%;padding:4px 6px;border:none;background:transparent;border-radius:4px;cursor:pointer;color:var(--color-text-primary, #e8e8ed);transition:background .15s ease}.json-toggle.svelte-164d9ci:hover{background:#ffffff08}.json-label.svelte-164d9ci{font-size:11px;font-weight:600}.json-count.svelte-164d9ci{font-size:10px;color:var(--color-text-secondary, #8888a0);margin-left:4px}.json-tree.svelte-164d9ci{padding:4px 8px 4px 20px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:11px;line-height:1.6}.json-row.svelte-164d9ci{display:flex;gap:6px;padding:1px 0}.json-key.svelte-164d9ci{color:var(--color-accent, #ff6b35);flex-shrink:0}.json-value.svelte-164d9ci{color:var(--color-text-primary, #e8e8ed);opacity:.8;white-space:pre-wrap;word-break:break-all}.json-empty.svelte-164d9ci{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;font-style:italic}.history-panel.svelte-1jltp3m{display:flex;flex-direction:column;height:100%;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-1jltp3m{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-1jltp3m{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.refresh-btn.svelte-1jltp3m{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.refresh-btn.svelte-1jltp3m:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.refresh-btn.svelte-1jltp3m:disabled{opacity:.4;cursor:default}.versions-list.svelte-1jltp3m{flex:1;overflow-y:auto;padding:4px 0}.versions-list.svelte-1jltp3m::-webkit-scrollbar{width:6px}.versions-list.svelte-1jltp3m::-webkit-scrollbar-track{background:transparent}.versions-list.svelte-1jltp3m::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.empty-state.svelte-1jltp3m{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.version-item.svelte-1jltp3m{display:flex;align-items:center;gap:8px;padding:6px 12px;margin:0 4px;border-radius:6px;position:relative;flex-wrap:wrap;transition:background .12s ease}.version-item.svelte-1jltp3m:hover{background:var(--color-bg-secondary, #12121a)}.version-item.confirming.svelte-1jltp3m{background:var(--color-bg-elevated, #1a1a2a)}.version-icon.svelte-1jltp3m{display:flex;align-items:center;color:var(--color-text-secondary, #8888a0);flex-shrink:0}.version-info.svelte-1jltp3m{flex:1;min-width:0;display:flex;align-items:baseline;gap:8px}.version-sha.svelte-1jltp3m{font-family:var(--font-mono, "SF Mono", "Fira Code", monospace);font-size:11px;color:var(--color-text-secondary, #8888a0);flex-shrink:0}.version-message.svelte-1jltp3m{font-size:12px;color:var(--color-text-primary, #e8e8ed);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.version-time.svelte-1jltp3m{font-size:11px;color:var(--color-text-secondary, #8888a0);opacity:.7;flex-shrink:0;margin-left:auto}.version-actions.svelte-1jltp3m{display:flex;align-items:center;gap:2px;flex-shrink:0}.action-btn.svelte-1jltp3m{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-1jltp3m:hover{background:#ffffff14;color:var(--color-text-primary, #e8e8ed)}.bookmark-btn.bookmarked.svelte-1jltp3m{color:var(--color-accent, #ff6b35)}.restore-btn.svelte-1jltp3m{opacity:0;transition:opacity .15s ease,background .15s ease,color .15s ease}.version-item.svelte-1jltp3m:hover .restore-btn:where(.svelte-1jltp3m),.restore-btn.visible.svelte-1jltp3m{opacity:1}.confirm-bar.svelte-1jltp3m{display:flex;align-items:center;gap:8px;width:100%;padding:6px 0 2px 22px}.confirm-text.svelte-1jltp3m{font-size:11px;color:var(--color-text-secondary, #8888a0)}.confirm-btn.svelte-1jltp3m{padding:3px 10px;border:none;border-radius:4px;font-size:11px;font-weight:500;cursor:pointer;transition:background .15s ease}.confirm-yes.svelte-1jltp3m{background:var(--color-accent, #ff6b35);color:#fff}.confirm-yes.svelte-1jltp3m:hover{filter:brightness(1.1)}.confirm-no.svelte-1jltp3m{background:#ffffff0f;color:var(--color-text-secondary, #8888a0)}.confirm-no.svelte-1jltp3m:hover{background:#ffffff1a;color:var(--color-text-primary, #e8e8ed)}.panel.svelte-1g6pzvd{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-1g6pzvd{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.sub-tabs.svelte-1g6pzvd{display:flex;align-items:center;gap:2px}.sub-tab.svelte-1g6pzvd{display:flex;align-items:center;gap:5px;padding:5px 10px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s,color .15s}.sub-tab.svelte-1g6pzvd:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.sub-tab.active.svelte-1g6pzvd{background:#ffffff14;color:var(--color-text-primary, #e8e8ed)}.header-actions.svelte-1g6pzvd{display:flex;align-items:center;gap:4px}.create-btn.svelte-1g6pzvd{display:flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid var(--color-accent, #ff6b35);background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);border-radius:6px;color:var(--color-accent, #ff6b35);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s}.create-btn.svelte-1g6pzvd:hover{background:oklch(from var(--color-accent, #ff6b35) l c h / 18%)}.action-btn.svelte-1g6pzvd{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s,color .15s}.action-btn.svelte-1g6pzvd:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.content.svelte-1g6pzvd{flex:1;overflow-y:auto;padding:12px}.content.svelte-1g6pzvd::-webkit-scrollbar{width:6px}.content.svelte-1g6pzvd::-webkit-scrollbar-track{background:transparent}.content.svelte-1g6pzvd::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.empty-state.svelte-1g6pzvd{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:13px}.empty-text.svelte-1g6pzvd{display:flex;flex-direction:column;align-items:center;gap:4px;text-align:center}.empty-sub.svelte-1g6pzvd{font-size:11px;opacity:.6}.empty-create-btn.svelte-1g6pzvd{display:flex;align-items:center;gap:6px;padding:8px 16px;border:1px solid var(--color-accent, #ff6b35);background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);border-radius:8px;color:var(--color-accent, #ff6b35);font-size:12px;font-weight:500;cursor:pointer;transition:background .15s;margin-top:4px}.empty-create-btn.svelte-1g6pzvd:hover{background:oklch(from var(--color-accent, #ff6b35) l c h / 18%)}.connector-grid.svelte-1g6pzvd{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px}.connector-card.svelte-1g6pzvd{display:flex;flex-direction:column;gap:8px;padding:14px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:10px;transition:border-color .15s,box-shadow .15s}.connector-card.svelte-1g6pzvd:hover{border-color:#ffffff1f;box-shadow:0 2px 12px -4px #0000004d}.connector-card.installed.svelte-1g6pzvd{border-color:#22c55e33}.card-top.svelte-1g6pzvd{display:flex;align-items:flex-start;gap:10px}.connector-icon.svelte-1g6pzvd{width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:oklch(from var(--cat-color, #6366f1) l c h / 12%);color:var(--cat-color, #6366f1)}.connector-meta.svelte-1g6pzvd{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.connector-header-row.svelte-1g6pzvd{display:flex;align-items:center;gap:6px}.connector-name.svelte-1g6pzvd{font-size:13px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.installed-badge.svelte-1g6pzvd{display:inline-flex;align-items:center;gap:3px;font-size:9px;font-weight:600;padding:1px 6px;border-radius:4px;background:#22c55e26;color:#22c55e}.connector-category.svelte-1g6pzvd{font-size:9px;font-weight:600;letter-spacing:.06em;opacity:.8}.connector-desc.svelte-1g6pzvd{font-size:11px;color:var(--color-text-secondary, #8888a0);line-height:1.45;margin:0;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.card-footer.svelte-1g6pzvd{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:2px}.guide-toggle.svelte-1g6pzvd{display:flex;align-items:center;gap:4px;padding:0;border:none;background:transparent;color:var(--color-text-secondary, #8888a0);font-size:10px;cursor:pointer;transition:color .15s}.guide-toggle.svelte-1g6pzvd:hover{color:var(--color-text-primary, #e8e8ed)}.install-btn.svelte-1g6pzvd{display:flex;align-items:center;gap:5px;padding:5px 12px;border:1px solid var(--color-border, #2a2a3a);background:transparent;border-radius:6px;color:var(--color-text-primary, #e8e8ed);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s;margin-left:auto}.install-btn.svelte-1g6pzvd:hover:not(:disabled){background:#ffffff0d;border-color:var(--color-accent, #ff6b35)}.install-btn.svelte-1g6pzvd:disabled{opacity:.5;cursor:default}.setup-guide.svelte-1g6pzvd{padding:10px;background:var(--color-bg-elevated, #1a1a2a);border-radius:6px;margin-top:2px}.guide-step.svelte-1g6pzvd{font-size:11px;color:var(--color-text-secondary, #8888a0);line-height:1.6;margin:0 0 2px}.tools-list.svelte-1g6pzvd{display:flex;flex-direction:column;gap:6px}.tool-item.svelte-1g6pzvd{display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:8px;transition:border-color .15s}.tool-item.svelte-1g6pzvd:hover{border-color:#ffffff1f}.tool-icon-wrap.svelte-1g6pzvd{width:32px;height:32px;border-radius:7px;display:flex;align-items:center;justify-content:center;background:oklch(from var(--color-accent, #ff6b35) l c h / 10%);color:var(--color-accent, #ff6b35);flex-shrink:0}.tool-info.svelte-1g6pzvd{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.tool-header.svelte-1g6pzvd{display:flex;align-items:center;gap:8px}.tool-name.svelte-1g6pzvd{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.tool-type-badge.svelte-1g6pzvd{font-size:9px;padding:1px 6px;border-radius:4px;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);font-weight:500;text-transform:uppercase;letter-spacing:.04em}.tool-desc.svelte-1g6pzvd{font-size:11px;color:var(--color-text-secondary, #8888a0);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-actions.svelte-1g6pzvd{display:flex;align-items:center;gap:2px;flex-shrink:0}.icon-btn.svelte-1g6pzvd{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s,color .15s}.icon-btn.svelte-1g6pzvd:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.icon-btn.danger.svelte-1g6pzvd:hover{color:#ef4444;background:#ef44441a}.create-form.svelte-1g6pzvd{background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:10px;padding:16px;margin-bottom:12px}.form-header.svelte-1g6pzvd{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.form-title.svelte-1g6pzvd{font-size:13px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.form-grid.svelte-1g6pzvd{display:grid;grid-template-columns:1fr 1fr;gap:10px}.form-field.svelte-1g6pzvd{display:flex;flex-direction:column;gap:4px}.form-field.full-width.svelte-1g6pzvd{grid-column:1 / -1}.field-label.svelte-1g6pzvd{font-size:10px;font-weight:600;color:var(--color-text-secondary, #8888a0);text-transform:uppercase;letter-spacing:.04em}.field-input.svelte-1g6pzvd{padding:7px 10px;background:var(--color-bg-primary, #0a0a12);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;color:var(--color-text-primary, #e8e8ed);font-size:12px;font-family:var(--font-sans, system-ui);outline:none;transition:border-color .15s}.field-input.svelte-1g6pzvd:focus{border-color:var(--color-accent, #ff6b35)}.code-input.svelte-1g6pzvd{font-family:var(--font-mono, "JetBrains Mono", monospace);font-size:11px;line-height:1.5;resize:vertical;min-height:80px}.form-actions.svelte-1g6pzvd{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:14px}.cancel-btn.svelte-1g6pzvd{padding:6px 14px;border:1px solid var(--color-border, #2a2a3a);background:transparent;border-radius:6px;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s,color .15s}.cancel-btn.svelte-1g6pzvd:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.save-btn.svelte-1g6pzvd{display:flex;align-items:center;gap:5px;padding:6px 14px;border:none;background:var(--color-accent, #ff6b35);border-radius:6px;color:#fff;font-size:11px;font-weight:500;cursor:pointer;transition:filter .15s}.save-btn.svelte-1g6pzvd:hover:not(:disabled){filter:brightness(1.12)}.save-btn.svelte-1g6pzvd:disabled{opacity:.5;cursor:default}.spin{animation:svelte-1g6pzvd-spin 1s linear infinite}@keyframes svelte-1g6pzvd-spin{to{transform:rotate(360deg)}}.panel.svelte-3xr44d{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-3xr44d{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-3xr44d{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.header-actions.svelte-3xr44d{display:flex;align-items:center;gap:4px}.action-btn.svelte-3xr44d{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-3xr44d:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.text-btn.svelte-3xr44d{width:auto;gap:5px;padding:0 8px;font-size:11px;font-weight:500}.content.svelte-3xr44d{flex:1;overflow-y:auto;padding:8px 12px}.content.svelte-3xr44d::-webkit-scrollbar{width:6px}.content.svelte-3xr44d::-webkit-scrollbar-track{background:transparent}.content.svelte-3xr44d::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.section.svelte-3xr44d{margin-bottom:12px}.section-label.svelte-3xr44d{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0);margin-bottom:6px}.mini-empty.svelte-3xr44d{display:flex;align-items:center;gap:6px;padding:12px;color:var(--color-text-secondary, #8888a0);font-size:11px;opacity:.6}.dataset-list.svelte-3xr44d{display:flex;flex-direction:column;gap:2px}.dataset-item.svelte-3xr44d{display:flex;align-items:center;gap:6px;padding:5px 8px;border:1px solid transparent;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:12px;cursor:pointer;text-align:left;transition:background .12s ease,color .12s ease,border-color .12s ease}.dataset-item.svelte-3xr44d:hover{background:var(--color-bg-secondary, #12121a);color:var(--color-text-primary, #e8e8ed)}.dataset-item.selected.svelte-3xr44d{background:var(--color-bg-elevated, #1a1a2a);border-color:var(--color-accent, #ff6b35);color:var(--color-text-primary, #e8e8ed)}.ds-name.svelte-3xr44d{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ds-meta.svelte-3xr44d{font-size:10px;opacity:.6;flex-shrink:0}.run-section.svelte-3xr44d{margin-bottom:12px}.run-btn.svelte-3xr44d{display:flex;align-items:center;gap:6px;padding:6px 14px;border:none;background:var(--color-accent, #ff6b35);border-radius:4px;color:#fff;font-size:12px;font-weight:600;cursor:pointer;transition:filter .15s ease,opacity .15s ease}.run-btn.svelte-3xr44d:hover:not(:disabled){filter:brightness(1.1)}.run-btn.svelte-3xr44d:disabled{opacity:.4;cursor:default}.metrics-row.svelte-3xr44d{display:flex;gap:8px;margin-bottom:10px}.metric-card.svelte-3xr44d{flex:1;padding:8px 10px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;display:flex;flex-direction:column;align-items:center;gap:2px}.metric-card.success.svelte-3xr44d{border-color:#22c55e4d}.metric-card.error.svelte-3xr44d{border-color:#ef44444d}.metric-value.svelte-3xr44d{font-size:16px;font-weight:700;color:var(--color-text-primary, #e8e8ed)}.metric-card.success.svelte-3xr44d .metric-value:where(.svelte-3xr44d){color:#22c55e}.metric-card.error.svelte-3xr44d .metric-value:where(.svelte-3xr44d){color:#ef4444}.metric-label.svelte-3xr44d{font-size:10px;color:var(--color-text-secondary, #8888a0);text-transform:uppercase;letter-spacing:.03em}.results-list.svelte-3xr44d{display:flex;flex-direction:column;gap:2px}.result-row.svelte-3xr44d{display:flex;align-items:center;gap:6px;padding:4px 8px;border-radius:4px;font-size:11px}.result-row.passed.svelte-3xr44d{color:#22c55e}.result-row.failed.svelte-3xr44d{color:#ef4444}.result-icon.svelte-3xr44d{display:flex;align-items:center;flex-shrink:0}.result-input.svelte-3xr44d{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--color-text-primary, #e8e8ed)}.result-error.svelte-3xr44d{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.7;flex-shrink:0;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panel.svelte-oe5i1m{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-oe5i1m{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-oe5i1m{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.header-actions.svelte-oe5i1m{display:flex;align-items:center;gap:4px}.action-btn.svelte-oe5i1m{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-oe5i1m:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.text-btn.svelte-oe5i1m{width:auto;gap:5px;padding:0 8px;font-size:11px;font-weight:500}.content.svelte-oe5i1m{flex:1;overflow-y:auto;padding:8px 12px}.content.svelte-oe5i1m::-webkit-scrollbar{width:6px}.content.svelte-oe5i1m::-webkit-scrollbar-track{background:transparent}.content.svelte-oe5i1m::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.empty-state.svelte-oe5i1m{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.create-form.svelte-oe5i1m{padding:10px;margin-bottom:12px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px}.form-row.svelte-oe5i1m{margin-bottom:8px}.form-label.svelte-oe5i1m{display:block;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0);margin-bottom:4px}.form-input.svelte-oe5i1m{width:100%;padding:5px 8px;border:1px solid var(--color-border, #2a2a3a);background:var(--color-bg-primary, #0a0a12);border-radius:4px;color:var(--color-text-primary, #e8e8ed);font-size:12px;font-family:var(--font-sans, system-ui, -apple-system, sans-serif);outline:none;transition:border-color .15s ease;box-sizing:border-box}.form-input.svelte-oe5i1m:focus{border-color:var(--color-accent, #ff6b35)}.form-input.small.svelte-oe5i1m{width:auto;flex:1;min-width:0}.form-input.tiny.svelte-oe5i1m{width:50px;text-align:center}.variants-config.svelte-oe5i1m{display:flex;flex-direction:column;gap:4px}.variant-row.svelte-oe5i1m{display:flex;align-items:center;gap:6px}.traffic-input.svelte-oe5i1m{display:flex;align-items:center;gap:2px;flex-shrink:0}.traffic-pct.svelte-oe5i1m{font-size:11px;color:var(--color-text-secondary, #8888a0)}.add-variant-btn.svelte-oe5i1m{display:flex;align-items:center;gap:4px;padding:4px 8px;border:1px dashed var(--color-border, #2a2a3a);background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:11px;cursor:pointer;transition:border-color .15s ease,color .15s ease;width:fit-content}.add-variant-btn.svelte-oe5i1m:hover{border-color:var(--color-text-secondary, #8888a0);color:var(--color-text-primary, #e8e8ed)}.form-actions.svelte-oe5i1m{display:flex;gap:6px;margin-top:8px}.create-btn.svelte-oe5i1m{padding:5px 12px;border:none;background:var(--color-accent, #ff6b35);border-radius:4px;color:#fff;font-size:11px;font-weight:600;cursor:pointer;transition:filter .15s ease,opacity .15s ease}.create-btn.svelte-oe5i1m:hover:not(:disabled){filter:brightness(1.1)}.create-btn.svelte-oe5i1m:disabled{opacity:.4;cursor:default}.cancel-btn.svelte-oe5i1m{padding:5px 12px;border:1px solid var(--color-border, #2a2a3a);background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s ease,color .15s ease}.cancel-btn.svelte-oe5i1m:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.icon-btn.svelte-oe5i1m{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.icon-btn.svelte-oe5i1m:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.experiment-list.svelte-oe5i1m{display:flex;flex-direction:column;gap:8px}.experiment-card.svelte-oe5i1m{padding:10px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px}.exp-header.svelte-oe5i1m{display:flex;align-items:center;gap:8px;color:var(--color-text-secondary, #8888a0);margin-bottom:8px}.exp-name.svelte-oe5i1m{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.status-badge.svelte-oe5i1m{font-size:9px;font-weight:700;padding:1px 6px;border-radius:3px;text-transform:uppercase;letter-spacing:.03em}.badge-draft.svelte-oe5i1m{background:#ffffff0f;color:var(--color-text-secondary, #8888a0)}.badge-running.svelte-oe5i1m{background:#3b82f626;color:#3b82f6}.badge-completed.svelte-oe5i1m{background:#22c55e26;color:#22c55e}.exp-date.svelte-oe5i1m{font-size:10px;color:var(--color-text-secondary, #8888a0);opacity:.6;margin-left:auto}.variants-list.svelte-oe5i1m{display:flex;flex-direction:column;gap:4px}.variant-item.svelte-oe5i1m{display:flex;align-items:center;gap:8px}.variant-name.svelte-oe5i1m{font-size:11px;color:var(--color-text-primary, #e8e8ed);min-width:80px;flex-shrink:0}.traffic-bar-container.svelte-oe5i1m{flex:1;height:4px;background:var(--color-bg-primary, #0a0a12);border-radius:2px;overflow:hidden}.traffic-bar.svelte-oe5i1m{height:100%;background:var(--color-accent, #ff6b35);border-radius:2px;transition:width .3s ease}.variant-traffic.svelte-oe5i1m{font-size:10px;color:var(--color-text-secondary, #8888a0);min-width:28px;text-align:right;flex-shrink:0}.panel.svelte-1boqyeh{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-1boqyeh{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-1boqyeh{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.header-actions.svelte-1boqyeh{display:flex;align-items:center;gap:6px}.action-btn.svelte-1boqyeh{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-1boqyeh:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.text-btn.svelte-1boqyeh{width:auto;gap:5px;padding:0 8px;font-size:11px;font-weight:500}.export-btn.svelte-1boqyeh{display:flex;align-items:center;gap:5px;padding:5px 12px;border:none;background:var(--color-accent, #ff6b35);border-radius:4px;color:#fff;font-size:11px;font-weight:600;cursor:pointer;transition:filter .15s ease,opacity .15s ease}.export-btn.svelte-1boqyeh:hover:not(:disabled){filter:brightness(1.1)}.export-btn.svelte-1boqyeh:disabled{opacity:.5;cursor:default}.content.svelte-1boqyeh{flex:1;overflow:hidden;display:flex;flex-direction:column}.empty-state.svelte-1boqyeh{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.code-container.svelte-1boqyeh{flex:1;overflow:auto}.code-container.svelte-1boqyeh::-webkit-scrollbar{width:6px;height:6px}.code-container.svelte-1boqyeh::-webkit-scrollbar-track{background:transparent}.code-container.svelte-1boqyeh::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.code-block.svelte-1boqyeh{margin:0;padding:12px;background:var(--color-bg-secondary, #12121a);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:12px;line-height:1.6;color:var(--color-text-primary, #e8e8ed);white-space:pre;tab-size:4;min-height:100%;box-sizing:border-box}.code-block.svelte-1boqyeh code:where(.svelte-1boqyeh){font-family:inherit}.panel.svelte-1bsb2d0{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-1bsb2d0{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.title.svelte-1bsb2d0{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-1bsb2d0{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-1bsb2d0:hover:not(:disabled){background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-1bsb2d0:disabled{opacity:.4;cursor:default}.content.svelte-1bsb2d0{flex:1;overflow-y:auto;padding:10px 12px}.content.svelte-1bsb2d0::-webkit-scrollbar{width:6px}.content.svelte-1bsb2d0::-webkit-scrollbar-track{background:transparent}.content.svelte-1bsb2d0::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.empty-state.svelte-1bsb2d0{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.metrics-grid.svelte-1bsb2d0{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px}.metric-card.svelte-1bsb2d0{display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px}.metric-icon.svelte-1bsb2d0{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;background:var(--color-bg-elevated, #1a1a2a);color:var(--color-accent, #ff6b35);flex-shrink:0}.metric-body.svelte-1bsb2d0{display:flex;flex-direction:column;gap:1px}.metric-value.svelte-1bsb2d0{font-size:16px;font-weight:700;color:var(--color-text-primary, #e8e8ed);line-height:1.1}.metric-label.svelte-1bsb2d0{font-size:10px;color:var(--color-text-secondary, #8888a0);text-transform:uppercase;letter-spacing:.03em}.breakdown-section.svelte-1bsb2d0{display:flex;flex-direction:column;gap:12px}.breakdown-title.svelte-1bsb2d0{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary, #8888a0);margin-bottom:6px}.breakdown-table.svelte-1bsb2d0{background:var(--color-bg-secondary, #12121a);border:1px solid var(--color-border, #2a2a3a);border-radius:6px;overflow:hidden}.table-header.svelte-1bsb2d0{display:flex;padding:6px 10px;background:var(--color-bg-elevated, #1a1a2a);border-bottom:1px solid var(--color-border, #2a2a3a)}.table-header.svelte-1bsb2d0 .col-name:where(.svelte-1bsb2d0),.table-header.svelte-1bsb2d0 .col-num:where(.svelte-1bsb2d0){font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.03em;color:var(--color-text-secondary, #8888a0)}.table-row.svelte-1bsb2d0{display:flex;padding:5px 10px;border-bottom:1px solid var(--color-border, #2a2a3a);transition:background .12s ease}.table-row.svelte-1bsb2d0:last-child{border-bottom:none}.table-row.svelte-1bsb2d0:hover{background:#ffffff05}.col-name.svelte-1bsb2d0{flex:2;font-size:11px;color:var(--color-text-primary, #e8e8ed);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.col-num.svelte-1bsb2d0{flex:1;font-size:11px;color:var(--color-text-secondary, #8888a0);text-align:right;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace)}.panel.svelte-tctccr{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary, #0a0a12);font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.header.svelte-tctccr{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0;gap:8px}.title.svelte-tctccr{font-size:12px;font-weight:600;color:var(--color-text-primary, #e8e8ed)}.file-path.svelte-tctccr{font-size:11px;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);color:var(--color-text-primary, #e8e8ed);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.back-btn.svelte-tctccr{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.back-btn.svelte-tctccr:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.action-btn.svelte-tctccr{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease;flex-shrink:0}.action-btn.svelte-tctccr:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.content.svelte-tctccr{flex:1;overflow:hidden;display:flex;flex-direction:column}.empty-state.svelte-tctccr{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary, #8888a0);font-size:12px;opacity:.6}.file-list.svelte-tctccr{flex:1;overflow-y:auto;padding:4px 0}.file-list.svelte-tctccr::-webkit-scrollbar{width:6px}.file-list.svelte-tctccr::-webkit-scrollbar-track{background:transparent}.file-list.svelte-tctccr::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.file-item.svelte-tctccr{display:flex;align-items:center;gap:8px;padding:5px 12px;border:none;background:transparent;color:var(--color-text-secondary, #8888a0);font-size:12px;cursor:pointer;width:100%;text-align:left;transition:background .12s ease,color .12s ease;font-family:var(--font-sans, system-ui, -apple-system, sans-serif)}.file-item.svelte-tctccr:hover{background:var(--color-bg-secondary, #12121a);color:var(--color-text-primary, #e8e8ed)}.file-item.dir.svelte-tctccr{color:var(--color-accent, #ff6b35);cursor:default}.file-name.svelte-tctccr{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-ext.svelte-tctccr{font-size:9px;font-weight:600;padding:1px 4px;border-radius:2px;background:#ffffff0f;color:var(--color-text-secondary, #8888a0);flex-shrink:0;text-transform:uppercase}.ext-python.svelte-tctccr{background:#3572a533;color:#5b9bd5}.ext-js.svelte-tctccr{background:#f0db4f26;color:#f0db4f}.ext-json.svelte-tctccr{background:#ffffff0f;color:var(--color-text-secondary, #8888a0)}.ext-yaml.svelte-tctccr{background:#cbab5126;color:#cbab51}.ext-md.svelte-tctccr{background:#3b82f626;color:#3b82f6}.file-size.svelte-tctccr{font-size:10px;opacity:.5;flex-shrink:0;font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace)}.code-viewer.svelte-tctccr{flex:1;overflow:auto}.code-viewer.svelte-tctccr::-webkit-scrollbar{width:6px;height:6px}.code-viewer.svelte-tctccr::-webkit-scrollbar-track{background:transparent}.code-viewer.svelte-tctccr::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.code-block.svelte-tctccr{margin:0;padding:12px;background:var(--color-bg-secondary, #12121a);font-family:var(--font-mono, "JetBrains Mono", ui-monospace, monospace);font-size:12px;line-height:1.6;color:var(--color-text-primary, #e8e8ed);white-space:pre;tab-size:4;min-height:100%;box-sizing:border-box}.code-block.svelte-tctccr code:where(.svelte-tctccr){font-family:inherit}.oracle-panel.svelte-b2w21g{display:flex;flex-direction:column;height:100%;overflow:hidden}.oracle-header.svelte-b2w21g{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;border-bottom:1px solid var(--color-border, #2a2a3a);flex-shrink:0;gap:8px}.oracle-tabs.svelte-b2w21g{display:flex;gap:2px;background:#ffffff08;border-radius:6px;padding:2px}.oracle-tab.svelte-b2w21g{display:flex;align-items:center;gap:5px;padding:4px 10px;border:none;border-radius:4px;background:transparent;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s,color .15s}.oracle-tab.svelte-b2w21g:hover{color:var(--color-text-primary, #e8e8ed)}.oracle-tab.active.svelte-b2w21g{background:#ffffff14;color:var(--color-text-primary, #e8e8ed)}.tab-badge.svelte-b2w21g{min-width:16px;height:16px;padding:0 4px;border-radius:8px;background:var(--color-accent, #ff6b35);color:#fff;font-size:9px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}.oracle-analyze-btn.svelte-b2w21g{display:flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--color-border, #2a2a3a);border-radius:6px;background:#ffffff08;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.oracle-analyze-btn.svelte-b2w21g:hover:not(:disabled){background:#ffffff0f;color:var(--color-text-primary, #e8e8ed);border-color:var(--color-accent, #ff6b35)}.oracle-analyze-btn.svelte-b2w21g:disabled{opacity:.4;cursor:not-allowed}.oracle-clear-btn.svelte-b2w21g{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:1px solid var(--color-border, #2a2a3a);border-radius:6px;background:transparent;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s,color .15s}.oracle-clear-btn.svelte-b2w21g:hover{background:#ef44441a;color:#ef4444}.oracle-spinner{animation:svelte-b2w21g-spin 1s linear infinite}@keyframes svelte-b2w21g-spin{to{transform:rotate(360deg)}}.oracle-content.svelte-b2w21g{flex:1;overflow-y:auto;padding:8px}.oracle-empty.svelte-b2w21g{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--color-text-secondary, #8888a0);gap:8px;opacity:.5;text-align:center;padding:20px}.oracle-empty.svelte-b2w21g p:where(.svelte-b2w21g){font-size:12px;margin:0}.oracle-empty-hint.svelte-b2w21g{font-size:11px;max-width:280px;line-height:1.5}.insight-card.svelte-b2w21g{background:#ffffff05;border:1px solid var(--color-border, #2a2a3a);border-radius:8px;margin-bottom:6px;overflow:hidden;transition:opacity .2s}.insight-card.skipped.svelte-b2w21g{opacity:.5}.insight-header.svelte-b2w21g{display:flex;align-items:center;gap:8px;padding:8px 10px;cursor:pointer;transition:background .15s}.insight-header.svelte-b2w21g:hover{background:#ffffff08}.insight-severity.svelte-b2w21g{display:flex;align-items:center;flex-shrink:0}.insight-title.svelte-b2w21g{flex:1;font-size:11px;font-weight:600;color:var(--color-text-primary, #e8e8ed);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.insight-card.skipped.svelte-b2w21g .insight-title:where(.svelte-b2w21g){text-decoration:line-through}.insight-time.svelte-b2w21g{font-size:9px;color:var(--color-text-secondary, #8888a0);opacity:.6;flex-shrink:0}.insight-body.svelte-b2w21g{padding:0 10px 8px}.insight-desc.svelte-b2w21g{font-size:11px;line-height:1.5;color:var(--color-text-secondary, #8888a0);margin:0}.insight-actions.svelte-b2w21g{display:flex;gap:4px;padding:0 8px 8px}.insight-btn.svelte-b2w21g{display:flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid var(--color-border, #2a2a3a);border-radius:4px;background:transparent;font-size:10px;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s,color .15s}.insight-btn.approve.svelte-b2w21g{color:#22c55e;border-color:#22c55e4d}.insight-btn.approve.svelte-b2w21g:hover{background:#22c55e1a;border-color:#22c55e80}.insight-btn.skip.svelte-b2w21g{color:var(--color-text-secondary, #8888a0)}.insight-btn.skip.svelte-b2w21g:hover{background:#ffffff0d}.insight-status-badge.svelte-b2w21g{font-size:9px;font-weight:600;padding:3px 10px 6px;text-transform:uppercase;letter-spacing:.04em}.approved-badge.svelte-b2w21g{color:#22c55e}.skipped-badge.svelte-b2w21g{color:var(--color-text-secondary, #8888a0);opacity:.5}.oracle-chat.svelte-b2w21g{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px;background:linear-gradient(180deg,rgba(139,92,246,.02) 0%,var(--color-bg-primary, #1a1a2e) 100%)}.oracle-chat.svelte-b2w21g::-webkit-scrollbar{width:5px}.oracle-chat.svelte-b2w21g::-webkit-scrollbar-track{background:transparent}.oracle-chat.svelte-b2w21g::-webkit-scrollbar-thumb{background:var(--color-border, #2a2a3a);border-radius:3px}.chat-welcome.svelte-b2w21g{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--color-text-secondary, #8888a0);gap:8px;opacity:.6;text-align:center;padding:20px}.chat-welcome-title.svelte-b2w21g{font-size:13px;font-weight:600;margin:0;color:var(--color-text-primary, #e8e8ed)}.chat-welcome-hint.svelte-b2w21g{font-size:11px;max-width:260px;line-height:1.5;margin:0}.chat-input-area.svelte-b2w21g{display:flex;align-items:flex-end;gap:6px;padding:8px 10px;border-top:1px solid var(--color-border, #2a2a3a);flex-shrink:0}.chat-input.svelte-b2w21g{flex:1;min-height:32px;max-height:80px;padding:6px 10px;border:1px solid var(--color-border, #2a2a3a);border-radius:8px;background:#ffffff08;color:var(--color-text-primary, #e8e8ed);font-family:var(--font-sans);font-size:12px;resize:none;outline:none;transition:border-color .15s}.chat-input.svelte-b2w21g:focus{border-color:#8b5cf680}.chat-input.svelte-b2w21g::placeholder{color:var(--color-text-secondary, #8888a0);opacity:.5}.chat-input.svelte-b2w21g:disabled{opacity:.4}.chat-send-btn.svelte-b2w21g{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:8px;background:#8b5cf633;color:#8b5cf6;cursor:pointer;transition:background .15s,color .15s;flex-shrink:0}.chat-send-btn.svelte-b2w21g:hover:not(:disabled){background:#8b5cf659;color:#a78bfa}.chat-send-btn.svelte-b2w21g:disabled{opacity:.3;cursor:not-allowed}.panel.svelte-o0ko81{height:100%;display:flex;flex-direction:column;background:var(--color-bg-primary);font-family:var(--font-sans)}.header.svelte-o0ko81{display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;min-height:40px;border-bottom:1px solid var(--color-border);flex-shrink:0}.title.svelte-o0ko81{font-size:12px;font-weight:600;color:var(--color-text-primary)}.action-btn.svelte-o0ko81{display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary);cursor:pointer;transition:background .15s ease,color .15s ease}.action-btn.svelte-o0ko81:hover:not(:disabled){background:#ffffff0d;color:var(--color-text-primary)}.action-btn.svelte-o0ko81:disabled{opacity:.4;cursor:default}.content.svelte-o0ko81{flex:1;overflow-y:auto;padding:0}.content.svelte-o0ko81::-webkit-scrollbar{width:6px}.content.svelte-o0ko81::-webkit-scrollbar-track{background:transparent}.content.svelte-o0ko81::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:3px}.empty-state.svelte-o0ko81{display:flex;align-items:center;justify-content:center;gap:8px;height:100%;color:var(--color-text-secondary);font-size:12px;opacity:.6;padding:20px;text-align:center}.exec-table.svelte-o0ko81{width:100%}.table-header.svelte-o0ko81{display:flex;align-items:center;padding:8px 12px;background:var(--color-bg-elevated);border-bottom:1px solid var(--color-border)}.table-header.svelte-o0ko81 span:where(.svelte-o0ko81){font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary)}.col-status.svelte-o0ko81{width:48px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.col-id.svelte-o0ko81{flex:2;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-duration.svelte-o0ko81{flex:1;text-align:right}.col-expand.svelte-o0ko81{width:28px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--color-text-secondary)}.table-row-wrapper.svelte-o0ko81{border-bottom:1px solid var(--color-border)}.table-row-wrapper.svelte-o0ko81:last-child{border-bottom:none}.table-row.svelte-o0ko81{display:flex;align-items:center;width:100%;padding:7px 12px;background:none;border:none;cursor:pointer;font-size:11px;color:var(--color-text-primary);transition:background .12s ease;text-align:left}.table-row.svelte-o0ko81:hover{background:#ffffff05}.table-row.svelte-o0ko81 code:where(.svelte-o0ko81){font-family:var(--font-mono);font-size:11px}.status-dot.svelte-o0ko81{width:7px;height:7px;border-radius:50%;display:inline-block}.exec-detail.svelte-o0ko81{padding:8px 16px 12px 60px;background:var(--color-bg-secondary);border-top:1px solid var(--color-border);display:flex;flex-direction:column;gap:6px;animation:svelte-o0ko81-detail-in .1s ease-out}@keyframes svelte-o0ko81-detail-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.detail-row.svelte-o0ko81{display:flex;align-items:center;gap:12px}.detail-label.svelte-o0ko81{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary);min-width:60px}.detail-value.svelte-o0ko81{font-family:var(--font-mono);font-size:11px;color:var(--color-text-primary);word-break:break-all}.bottom-panel.svelte-1m9rotx{background:var(--color-bg-secondary, #12121a);border-top:1px solid var(--color-border, #2a2a3a);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden;transition:height .2s ease}.bottom-panel.dragging.svelte-1m9rotx{transition:none;-webkit-user-select:none;user-select:none}.drag-handle.svelte-1m9rotx{height:12px;cursor:ns-resize;display:flex;align-items:center;justify-content:center;flex-shrink:0}.drag-handle.svelte-1m9rotx:hover .drag-indicator:where(.svelte-1m9rotx){background:var(--color-text-secondary, #8888a0)}.drag-indicator.svelte-1m9rotx{width:40px;height:2px;border-radius:1px;background:var(--color-border, #2a2a3a);transition:background .15s ease}.tab-bar.svelte-1m9rotx{display:flex;align-items:center;justify-content:space-between;padding:0 8px;height:36px;min-height:36px;flex-shrink:0;border-bottom:1px solid var(--color-border, #2a2a3a)}.tab-list.svelte-1m9rotx{display:flex;align-items:center;gap:2px;overflow-x:auto;scrollbar-width:none;flex:1;min-width:0}.tab-list.svelte-1m9rotx::-webkit-scrollbar{display:none}.tab-btn.svelte-1m9rotx{display:flex;align-items:center;gap:6px;padding:6px 12px;border:none;background:transparent;border-bottom:2px solid transparent;color:var(--color-text-secondary, #8888a0);font-size:11px;font-weight:500;cursor:pointer;transition:color .15s ease,border-color .15s ease;margin-bottom:-1px}.tab-btn.svelte-1m9rotx:hover{color:var(--color-text-primary, #e8e8ed)}.tab-btn.active.svelte-1m9rotx{color:var(--color-text-primary, #e8e8ed);border-bottom-color:var(--color-accent, #ff6b35)}.tab-badge.svelte-1m9rotx{min-width:16px;height:16px;padding:0 4px;border-radius:8px;font-size:9px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1}.tab-badge.error.svelte-1m9rotx{background:#ef444433;color:var(--color-error, #ef4444);border:1px solid rgba(239,68,68,.3)}.tab-badge.accent.svelte-1m9rotx{background:oklch(from var(--color-accent, #ff6b35) l c h / 15%);color:var(--color-accent, #ff6b35);border:1px solid oklch(from var(--color-accent, #ff6b35) l c h / 25%)}.toggle-btn.svelte-1m9rotx{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;background:transparent;border-radius:4px;color:var(--color-text-secondary, #8888a0);cursor:pointer;transition:background .15s ease,color .15s ease}.toggle-btn.svelte-1m9rotx:hover{background:#ffffff0d;color:var(--color-text-primary, #e8e8ed)}.tab-content.svelte-1m9rotx{flex:1;overflow:hidden;position:relative}.construct-page.svelte-1ri5xm6{display:flex;flex-direction:column;height:100%;width:100%}.top-area.svelte-1ri5xm6{display:flex;flex:1;min-height:0;overflow:hidden} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/file.DU3A4Afm.css b/studio-desktop/frontend-dist/_app/immutable/assets/file.DU3A4Afm.css deleted file mode 100644 index 20d52923..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/file.DU3A4Afm.css +++ /dev/null @@ -1 +0,0 @@ -.model-selector.svelte-1de56kq{position:relative}.selector-input-wrapper.svelte-1de56kq{display:flex;align-items:center;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;transition:border-color .15s}.selector-input-wrapper.svelte-1de56kq:focus-within{border-color:var(--color-accent)}.selector-input.svelte-1de56kq{flex:1;background:transparent;border:none;outline:none;padding:8px 10px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);min-width:0}.selector-input.svelte-1de56kq::placeholder{color:var(--color-text-secondary);opacity:.5}.selector-chevron.svelte-1de56kq{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:none;border:none;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0}.selected-model-id.svelte-1de56kq{font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);margin-top:4px;padding-left:2px}.dropdown-backdrop.svelte-1de56kq{position:fixed;inset:0;z-index:10000}.dropdown.svelte-1de56kq{z-index:10001;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:8px;box-shadow:0 12px 32px #00000080;max-height:300px;overflow-y:auto;padding:4px;animation:svelte-1de56kq-dropdown-in .12s ease-out}@keyframes svelte-1de56kq-dropdown-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.dropdown-empty.svelte-1de56kq{padding:16px;text-align:center;font-size:12px;color:var(--color-text-secondary)}.dropdown-group.svelte-1de56kq{padding:4px 0}.dropdown-group-label.svelte-1de56kq{display:flex;align-items:center;gap:8px;padding:6px 10px 4px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary)}.unconfigured-badge.svelte-1de56kq{font-size:9px;font-weight:500;text-transform:none;letter-spacing:normal;color:var(--color-warning);opacity:.7}.dropdown-item.svelte-1de56kq{display:flex;align-items:center;justify-content:space-between;width:100%;padding:7px 10px;background:transparent;border:none;border-radius:6px;cursor:pointer;text-align:left;transition:background .1s}.dropdown-item.svelte-1de56kq:hover{background:var(--color-bg-elevated)}.dropdown-item.selected.svelte-1de56kq{background:oklch(from var(--color-accent) l c h / 10%)}.model-name.svelte-1de56kq{font-size:12px;font-weight:500;color:var(--color-text-primary)}.model-meta.svelte-1de56kq{font-size:10px;font-family:var(--font-mono);color:var(--color-text-secondary)}.dropdown-hint.svelte-1de56kq{display:flex;align-items:center;gap:6px;padding:8px 10px;border-top:1px solid var(--color-border);margin-top:4px;font-size:11px;color:var(--color-text-secondary);opacity:.6} diff --git a/studio-desktop/frontend-dist/_app/immutable/assets/marked.D37p7-Ro.css b/studio-desktop/frontend-dist/_app/immutable/assets/marked.D37p7-Ro.css deleted file mode 100644 index 558586bf..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/assets/marked.D37p7-Ro.css +++ /dev/null @@ -1 +0,0 @@ -.tooltip-wrapper.svelte-mm2dif{display:inline-flex}.tooltip-portal.svelte-mm2dif{position:fixed;z-index:99999;pointer-events:none;padding:6px 10px;background:#1e1e2a;border:1px solid rgba(255,255,255,.1);border-radius:8px;box-shadow:0 8px 24px #00000080,0 0 0 1px #ffffff08;display:flex;flex-direction:column;gap:3px;max-width:240px;opacity:0;transform:translateY(2px);transition:opacity .15s ease,transform .15s ease}.tooltip-portal.visible.svelte-mm2dif{opacity:1;transform:translateY(0)}.tip-text.svelte-mm2dif{font-family:var(--font-sans, system-ui);font-size:11px;font-weight:600;color:#e8e8ed;white-space:nowrap;display:flex;align-items:center;gap:6px}.tip-kbd.svelte-mm2dif{display:inline-flex;align-items:center;font-family:var(--font-mono, monospace);font-size:10px;font-weight:500;color:#8888a0;background:#ffffff0f;border:1px solid rgba(255,255,255,.08);border-radius:4px;padding:1px 5px;line-height:1.4}.tip-desc.svelte-mm2dif{font-family:var(--font-sans, system-ui);font-size:10px;font-weight:400;color:#8888a0;line-height:1.4;white-space:normal}.model-selector.svelte-1de56kq{position:relative}.selector-input-wrapper.svelte-1de56kq{display:flex;align-items:center;background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:6px;transition:border-color .15s}.selector-input-wrapper.svelte-1de56kq:focus-within{border-color:var(--color-accent)}.selector-input.svelte-1de56kq{flex:1;background:transparent;border:none;outline:none;padding:8px 10px;font-family:var(--font-sans);font-size:13px;color:var(--color-text-primary);min-width:0}.selector-input.svelte-1de56kq::placeholder{color:var(--color-text-secondary);opacity:.5}.selector-chevron.svelte-1de56kq{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:none;border:none;color:var(--color-text-secondary);cursor:pointer;flex-shrink:0}.selected-model-id.svelte-1de56kq{font-family:var(--font-mono);font-size:10px;color:var(--color-text-secondary);margin-top:4px;padding-left:2px}.dropdown-backdrop.svelte-1de56kq{position:fixed;inset:0;z-index:10000}.dropdown.svelte-1de56kq{z-index:10001;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:8px;box-shadow:0 12px 32px #00000080;max-height:300px;overflow-y:auto;padding:4px;animation:svelte-1de56kq-dropdown-in .12s ease-out}@keyframes svelte-1de56kq-dropdown-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.dropdown-empty.svelte-1de56kq{padding:16px;text-align:center;font-size:12px;color:var(--color-text-secondary)}.dropdown-group.svelte-1de56kq{padding:4px 0}.dropdown-group-label.svelte-1de56kq{display:flex;align-items:center;gap:8px;padding:6px 10px 4px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary)}.unconfigured-badge.svelte-1de56kq{font-size:9px;font-weight:500;text-transform:none;letter-spacing:normal;color:var(--color-warning);opacity:.7}.dropdown-item.svelte-1de56kq{display:flex;align-items:center;justify-content:space-between;width:100%;padding:7px 10px;background:transparent;border:none;border-radius:6px;cursor:pointer;text-align:left;transition:background .1s}.dropdown-item.svelte-1de56kq:hover{background:var(--color-bg-elevated)}.dropdown-item.selected.svelte-1de56kq{background:oklch(from var(--color-accent) l c h / 10%)}.model-name.svelte-1de56kq{font-size:12px;font-weight:500;color:var(--color-text-primary)}.model-meta.svelte-1de56kq{font-size:10px;font-family:var(--font-mono);color:var(--color-text-secondary)}.dropdown-hint.svelte-1de56kq{display:flex;align-items:center;gap:6px;padding:8px 10px;border-top:1px solid var(--color-border);margin-top:4px;font-size:11px;color:var(--color-text-secondary);opacity:.6} diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/0zSFSexy.js b/studio-desktop/frontend-dist/_app/immutable/chunks/0zSFSexy.js deleted file mode 100644 index 50560ecd..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/0zSFSexy.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a2 as ge,d as ot,av as rt,h as b,e as X,aw as it,b as ye,t as Q,r as At,a6 as Ot,s as Je,g as G,i as W,ax as Et,ay as Nt,az as Ge,_ as H,aA as q,a3 as le,aB as Pt,a5 as It,ap as Rt,aC as ct,aD as De,aE as Mt,aF as jt,O as xt,ak as Ye,aG as zt,$ as lt,a1 as dt,aH as Ie,a9 as $e,aI as Ut,aJ as Lt,aK as Dt,a0 as be,aL as Vt,aM as Ht,E as qt,aN as ve,aO as Ft,aP as Bt,aQ as Wt,aR as Jt,ai as Gt,ae as Ve,aS as ut,a7 as He,aT as Yt,aU as ft,aV as Ce,aW as ht,aX as Kt,aY as Xt,aZ as fe,a_ as Qt,V as Zt,T as ea,a$ as ta,Y as aa,b0 as na,b1 as sa,b2 as oa,b3 as ra,b4 as ia,b5 as ca,b6 as la,b7 as da,P as ua,m as Se,a8 as qe,p as fa,a as O,j as ha,b8 as pa,v as Y,B as va,D as ga,C as ma,c as j,f as x,S as _a,b9 as ya,ba as Fe,w as P,ad as E}from"./BESIXtBI.js";import"./DsnmJJEf.js";import{i as $a}from"./CiPkpaXo.js";import{B as ba,l as N,p as K,s as D,_ as Ke}from"./CJh9TUc0.js";function Sa(e,t){return t}function wa(e,t,a){for(var n=[],s=t.length,r,o=t.length,i=0;i{if(r){if(r.pending.delete(v),r.done.add(v),r.pending.size===0){var h=e.outrogroups;Ue(De(r.done)),h.delete(r),h.size===0&&(e.outrogroups=null)}}else o-=1},!1)}if(o===0){var d=n.length===0&&a!==null;if(d){var l=a,c=l.parentNode;Dt(c),c.append(l),e.items.clear()}Ue(t,!d)}else r={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(r)}function Ue(e,t=!0){for(var a=0;a{var p=a();return ct(p)?p:p==null?[]:De(p)}),h,m=!0;function S(){f.fallback=c,ka(f,h,o,t,n),c!==null&&(h.length===0?(c.f&q)===0?lt(c):(c.f^=q,re(c,null,o)):dt(c,()=>{c=null}))}var T=ot(()=>{h=Q(v);var p=h.length;let R=!1;if(b){var U=At(o)===Ot;U!==(p===0)&&(o=Je(),X(o),G(!1),R=!0)}for(var $=new Set,L=H,_=It(),g=0;gr(o)):(c=le(()=>r(Xe??=ge())),c.f|=q)),p>$.size&&Pt(),b&&p>0&&X(Je()),!m)if(_){for(const[Ne,Pe]of i)$.has(Ne)||L.skip_effect(Pe.e);L.oncommit(S),L.ondiscard(()=>{})}else S();R&&G(!0),Q(v)}),f={effect:T,items:i,outrogroups:null,fallback:c};m=!1,b&&(o=W)}function ne(e){for(;e!==null&&(e.f&Ut)===0;)e=e.next;return e}function ka(e,t,a,n,s){var r=(n&Lt)!==0,o=t.length,i=e.items,d=ne(e.effect.first),l,c=null,v,h=[],m=[],S,T,f,p;if(r)for(p=0;p0){var A=(n&rt)!==0&&o===0?a:null;if(r){for(p=0;p{if(v!==void 0)for(f of v)f.nodes?.a?.apply()})}function Ca(e,t,a,n,s,r,o,i){var d=(o&Mt)!==0?(o&jt)===0?xt(a,!1,!1):Ye(a):null,l=(o&zt)!==0?Ye(s):null;return{v:d,i:l,e:le(()=>(r(t,d??a,l??s,i),()=>{e.delete(n)}))}}function re(e,t,a){if(e.nodes)for(var n=e.nodes.start,s=e.nodes.end,r=t&&(t.f&q)===0?t.nodes.start:a;n!==null;){var o=Vt(n);if(r.before(n),n===s)return;n=o}}function B(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function z(e,t,a,n,s){b&&ye();var r=t.$$slots?.[a],o=!1;r===!0&&(r=t.children,o=!0),r===void 0||r(e,o?()=>n:n)}function Aa(e,t,a,n,s,r){let o=b;b&&ye();var i=null;b&&W.nodeType===Ht&&(i=W,ye());var d=b?W:e,l=new ba(d,!1);ot(()=>{const c=t()||null;var v=Bt;if(c===null){l.ensure(null,null),ve(!0);return}return l.ensure(c,h=>{if(c){if(i=b?i:Ft(c,v),Wt(i,i),n){b&&Jt(c)&&i.append(document.createComment(""));var m=b?it(i):i.appendChild(ge());b&&(m===null?G(!1):X(m)),n(i,m)}Gt.nodes.end=i,h.before(i)}b&&X(h)}),ve(!0),()=>{c&&ve(!1)}},qt),Ve(()=>{ve(!0)}),o&&(G(!0),X(d))}function Oa(e,t){var a=void 0,n;ut(()=>{a!==(a=t())&&(n&&(be(n),n=null),a&&(n=le(()=>{He(()=>a(e))})))})}function pt(e){var t,a,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var s=e.length;for(t=0;t=0;){var i=o+r;(o===0||Qe.includes(n[o-1]))&&(i===n.length||Qe.includes(n[i]))?n=(o===0?"":n.substring(0,o))+n.substring(i+1):o=i}}return n===""?null:n}function Ze(e,t=!1){var a=t?" !important;":";",n="";for(var s of Object.keys(e)){var r=e[s];r!=null&&r!==""&&(n+=" "+s+": "+r+a)}return n}function Re(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function Ia(e,t){if(t){var a="",n,s;if(Array.isArray(t)?(n=t[0],s=t[1]):n=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var r=!1,o=0,i=!1,d=[];n&&d.push(...Object.keys(n).map(Re)),s&&d.push(...Object.keys(s).map(Re));var l=0,c=-1;const T=e.length;for(var v=0;v{we(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Ve(()=>{t.disconnect()})}function pn(e,t,a=t){var n=new WeakSet,s=!0;Ce(e,"change",r=>{var o=r?"[selected]":":checked",i;if(e.multiple)i=[].map.call(e.querySelectorAll(o),ie);else{var d=e.querySelector(o)??e.querySelector("option:not([disabled])");i=d&&ie(d)}a(i),H!==null&&n.add(H)}),He(()=>{var r=t();if(e===document.activeElement){var o=ht??H;if(n.has(o))return}if(we(e,r,s),s&&r===void 0){var i=e.querySelector(":checked");i!==null&&(r=ie(i),a(r))}e.__value=r,s=!1}),vt(e)}function ie(e){return"__value"in e?e.__value:e.value}const se=Symbol("class"),oe=Symbol("style"),gt=Symbol("is custom element"),mt=Symbol("is html"),ja=fe?"link":"LINK",xa=fe?"input":"INPUT",za=fe?"option":"OPTION",Ua=fe?"select":"SELECT",La=fe?"progress":"PROGRESS";function Da(e){if(b){var t=!1,a=()=>{if(!t){if(t=!0,e.hasAttribute("value")){var n=e.value;Te(e,"value",null),e.value=n}if(e.hasAttribute("checked")){var s=e.checked;Te(e,"checked",null),e.checked=s}}};e.__on_r=a,$e(a),oa()}}function vn(e,t){var a=Ae(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==La)||(e.value=t??"")}function gn(e,t){var a=Ae(e);a.checked!==(a.checked=t??void 0)&&(e.checked=t)}function Va(e,t){t?e.hasAttribute("selected")||e.setAttribute("selected",""):e.removeAttribute("selected")}function Te(e,t,a,n){var s=Ae(e);b&&(s[t]=e.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&e.nodeName===ja)||s[t]!==(s[t]=a)&&(t==="loading"&&(e[ca]=a),a==null?e.removeAttribute(t):typeof a!="string"&&_t(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Ha(e,t,a,n,s=!1,r=!1){if(b&&s&&e.nodeName===xa){var o=e,i=o.type==="checkbox"?"defaultChecked":"defaultValue";i in a||Da(o)}var d=Ae(e),l=d[gt],c=!d[mt];let v=b&&l;v&&G(!1);var h=t||{},m=e.nodeName===za;for(var S in t)S in a||(a[S]=null);a.class?a.class=Na(a.class):(n||a[se])&&(a.class=null),a[oe]&&(a.style??=null);var T=_t(e);for(const _ in a){let g=a[_];if(m&&_==="value"&&g==null){e.value=e.__value="",h[_]=g;continue}if(_==="class"){var f=e.namespaceURI==="http://www.w3.org/1999/xhtml";Ra(e,f,g,n,t?.[se],a[se]),h[_]=g,h[se]=a[se];continue}if(_==="style"){Ma(e,g,t?.[oe],a[oe]),h[_]=g,h[oe]=a[oe];continue}var p=h[_];if(!(g===p&&!(g===void 0&&e.hasAttribute(_)))){h[_]=g;var R=_[0]+_[1];if(R!=="$$")if(R==="on"){const w={},A="$$"+_;let y=_.slice(2);var U=la(y);if(Qt(y)&&(y=y.slice(0,-7),w.capture=!0),!U&&p){if(g!=null)continue;e.removeEventListener(y,h[A],w),h[A]=null}if(U)Zt(y,e,g),ea([y]);else if(g!=null){let Ne=function(Pe){h[_].call(this,Pe)};h[A]=ta(y,e,Ne,w)}}else if(_==="style")Te(e,_,g);else if(_==="autofocus")aa(e,!!g);else if(!l&&(_==="__value"||_==="value"&&g!=null))e.value=e.__value=g;else if(_==="selected"&&m)Va(e,g);else{var $=_;c||($=na($));var L=$==="defaultValue"||$==="defaultChecked";if(g==null&&!l&&!L)if(d[_]=null,$==="value"||$==="checked"){let w=e;const A=t===void 0;if($==="value"){let y=w.defaultValue;w.removeAttribute($),w.defaultValue=y,w.value=w.__value=A?y:null}else{let y=w.defaultChecked;w.removeAttribute($),w.defaultChecked=y,w.checked=A?y:!1}}else e.removeAttribute(_);else L||T.includes($)&&(l||typeof g!="string")?(e[$]=g,$ in d&&(d[$]=sa)):typeof g!="function"&&Te(e,$,g)}}}return v&&G(!0),h}function et(e,t,a=[],n=[],s=[],r,o=!1,i=!1){Kt(s,a,n,d=>{var l=void 0,c={},v=e.nodeName===Ua,h=!1;if(ut(()=>{var S=t(...d.map(Q)),T=Ha(e,l,S,r,o,i);h&&v&&"value"in S&&we(e,S.value);for(let p of Object.getOwnPropertySymbols(c))S[p]||be(c[p]);for(let p of Object.getOwnPropertySymbols(S)){var f=S[p];p.description===Xt&&(!l||f!==l[p])&&(c[p]&&be(c[p]),c[p]=le(()=>Oa(e,()=>f))),T[p]=f}l=T}),v){var m=e;He(()=>{we(m,l.value,!0),vt(m)})}h=!0})}function Ae(e){return e.__attributes??={[gt]:e.nodeName.includes("-"),[mt]:e.namespaceURI===ra}}var tt=new Map;function _t(e){var t=e.getAttribute("is")||e.nodeName,a=tt.get(t);if(a)return a;tt.set(t,a=[]);for(var n,s=e,r=Element.prototype;r!==s;){n=da(s);for(var o in n)n[o].set&&a.push(o);s=ia(s)}return a}function mn(e,t,a=t){var n=new WeakSet;Ce(e,"input",async s=>{var r=s?e.defaultValue:e.value;if(r=xe(e)?ze(r):r,a(r),H!==null&&n.add(H),await ua(),r!==(r=t())){var o=e.selectionStart,i=e.selectionEnd,d=e.value.length;if(e.value=r??"",i!==null){var l=e.value.length;o===i&&i===d&&l>d?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(i,l))}}}),(b&&e.defaultValue!==e.value||Se(t)==null&&e.value)&&(a(xe(e)?ze(e.value):e.value),H!==null&&n.add(H)),qe(()=>{var s=t();if(e===document.activeElement){var r=ht??H;if(n.has(r))return}xe(e)&&s===ze(e.value)||e.type==="date"&&!s&&!e.value||s!==e.value&&(e.value=s??"")})}const je=new Set;function _n(e,t,a,n,s=n){var r=a.getAttribute("type")==="checkbox",o=e;let i=!1;if(t!==null)for(var d of t)o=o[d]??=[];o.push(a),Ce(a,"change",()=>{var l=a.__value;r&&(l=at(o,l,a.checked)),s(l)},()=>s(r?[]:null)),qe(()=>{var l=n();if(b&&a.defaultChecked!==a.checked){i=!0;return}r?(l=l||[],a.checked=l.includes(a.__value)):a.checked=ft(a.__value,l)}),Ve(()=>{var l=o.indexOf(a);l!==-1&&o.splice(l,1)}),je.has(o)||(je.add(o),$e(()=>{o.sort((l,c)=>l.compareDocumentPosition(c)===4?-1:1),je.delete(o)})),$e(()=>{if(i){var l;if(r)l=at(o,l,a.checked);else{var c=o.find(v=>v.checked);l=c?.__value}s(l)}})}function yn(e,t,a=t){Ce(e,"change",n=>{var s=n?e.defaultChecked:e.checked;a(s)}),(b&&e.defaultChecked!==e.checked||Se(t)==null)&&a(e.checked),qe(()=>{var n=t();e.checked=!!n})}function at(e,t,a){for(var n=new Set,s=0;s{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1};const nt=(...e)=>e.filter((t,a,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===a).join(" ").trim();var Ba=pa("");function V(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]),n=N(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);fa(t,!1);let s=K(t,"name",8,void 0),r=K(t,"color",8,"currentColor"),o=K(t,"size",8,24),i=K(t,"strokeWidth",8,2),d=K(t,"absoluteStrokeWidth",8,!1),l=K(t,"iconNode",24,()=>[]);$a();var c=Ba();et(c,(m,S,T)=>({...qa,...m,...n,width:o(),height:o(),stroke:r(),"stroke-width":S,class:T}),[()=>Fa(n)?void 0:{"aria-hidden":"true"},()=>(Y(d()),Y(i()),Y(o()),Se(()=>d()?Number(i())*24/Number(o()):i())),()=>(Y(nt),Y(s()),Y(a),Se(()=>nt("lucide-icon","lucide",s()?`lucide-${s()}`:"",a.class)))]);var v=va(c);Ta(v,1,l,Sa,(m,S)=>{var T=_a(()=>ya(Q(S),2));let f=()=>Q(T)[0],p=()=>Q(T)[1];var R=j(),U=x(R);Aa(U,f,!0,($,L)=>{et($,()=>({...p()}))}),O(m,R)});var h=ga(v);z(h,t,"default",{}),ma(c),O(e,c),ha()}function $n(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M12 2v4"}],["path",{d:"m16.2 7.8 2.9-2.9"}],["path",{d:"M18 12h4"}],["path",{d:"m16.2 16.2 2.9 2.9"}],["path",{d:"M12 18v4"}],["path",{d:"m4.9 19.1 2.9-2.9"}],["path",{d:"M2 12h4"}],["path",{d:"m4.9 4.9 2.9 2.9"}]];V(e,D({name:"loader"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}function bn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];V(e,D({name:"plus"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}function Sn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];V(e,D({name:"trash-2"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}class Wa{ws=null;listeners=new Map;url;reconnectAttempts=0;maxReconnectAttempts=5;reconnectTimer=null;_intentionalClose=!1;constructor(t){const a=window.location.protocol==="https:"?"wss:":"ws:";this.url=`${a}//${window.location.host}${t}`}connect(){this._intentionalClose=!1,this.ws=new WebSocket(this.url),this.ws.onopen=()=>{this.reconnectAttempts=0,this.notify("_open",{type:"_open",timestamp:""})},this.ws.onmessage=t=>{try{const a=JSON.parse(t.data);this.notify(a.type,a),this.notify("*",a)}catch{console.warn("[StudioWebSocket] Unparseable frame:",t.data)}},this.ws.onclose=()=>{this.notify("_close",{type:"_close",timestamp:""}),this._intentionalClose||this.attemptReconnect()},this.ws.onerror=()=>{this.notify("_error",{type:"_error",timestamp:""})}}attemptReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){this.notify("_reconnect_failed",{type:"_reconnect_failed",timestamp:""});return}this.reconnectAttempts++;const t=Math.min(1e3*Math.pow(2,this.reconnectAttempts-1),1e4);this.reconnectTimer=setTimeout(()=>{this.connect()},t)}notify(t,a){const n=this.listeners.get(t);if(n)for(const s of n)try{s(a)}catch(r){console.error(`[StudioWebSocket] Listener error for '${t}':`,r)}}on(t,a){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(a),()=>this.listeners.get(t)?.delete(a)}send(t){this.ws?.readyState===WebSocket.OPEN?this.ws.send(JSON.stringify(t)):console.warn("[StudioWebSocket] Cannot send: WebSocket not open")}get connected(){return this.ws?.readyState===WebSocket.OPEN}disconnect(){this._intentionalClose=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws?.close(),this.ws=null}}const C=P([]),F=P([]),Oe=P(!1);let Z=null,de=!1;const Ja=2e3;function st(){de&&(Oe.set(!0),Z&&clearTimeout(Z),Z=setTimeout(()=>{Ga()},Ja))}async function Ga(){const{currentProject:e}=await Ke(async()=>{const{currentProject:r}=await Promise.resolve().then(()=>ln);return{currentProject:r}},void 0,import.meta.url),{api:t}=await Ke(async()=>{const{api:r}=await Promise.resolve().then(()=>Xa);return{api:r}},void 0,import.meta.url),a=E(e);if(!a)return;const n=Ya();if(E(C).length!==0)try{await t.projects.savePipeline(a.name,"main",n),Oe.set(!1)}catch{}}function wn(){de||(de=!0,C.subscribe(()=>{st()}),F.subscribe(()=>{st()}))}function yt(){return de=!1,Z&&(clearTimeout(Z),Z=null),()=>{de=!0}}function Ya(){const e=E(C),t=E(F);return{nodes:e.map(a=>({id:a.id,type:a.type??"pipeline_step",label:a.data?.label??a.id,position:a.position,data:a.data??{},width:a.measured?.width??a.width??null,height:a.measured?.height??a.height??null})),edges:t.map(a=>({id:a.id,source:a.source,target:a.target,source_handle:a.sourceHandle??"output",target_handle:a.targetHandle??"input",label:a.label??null})),metadata:{}}}const $t=P(null),Tn=Fe([C,$t],([e,t])=>t?e.find(a=>a.id===t)??null:null),bt=P(new Map);function kn(e,t){bt.update(a=>{const n=new Map(a);return n.set(e,t),n}),Ka(e,"_executionState",t)}function Cn(){bt.update(e=>{const t=new Map;for(const[a]of e)t.set(a,"idle");return t}),C.update(e=>e.map(t=>({...t,data:{...t.data,_executionState:"idle"}})))}let me=0;function ue(){const e=E(C);let t=0;for(const a of e){const n=a.id.match(/-(\d+)$/);if(n){const s=parseInt(n[1],10);s>t&&(t=s)}}me=t}function An(e,t){me++;const a=`${e}-${me}`,n=E(C),s=E($t);let r=250,o=200;const i=280,d=0;if(s){const c=n.find(v=>v.id===s);c&&(r=c.position.x+i,o=c.position.y+d)}else if(n.length>0){let c=-1/0,v=200;for(const h of n)h.position.x>c&&(c=h.position.x,v=h.position.y);r=c+i,o=v}n.some(c=>Math.abs(c.position.x-r)<20&&Math.abs(c.position.y-o)<20)&&(o+=120),C.update(c=>[...c,{id:a,type:e,position:{x:r,y:o},data:{label:`${t} ${me}`}}])}function Ka(e,t,a){C.update(n=>n.map(s=>s.id===e?{...s,data:{...s.data,[t]:a}}:s))}const St="/api";async function u(e,t){const a=await fetch(`${St}${e}`,{headers:{"Content-Type":"application/json"},...t});if(!a.ok){const n=await a.json().catch(()=>({detail:a.statusText}));throw new Error(n.detail||a.statusText)}return a.json()}const I={health:()=>u("/health"),registry:{agents:()=>u("/registry/agents"),tools:()=>u("/registry/tools"),patterns:()=>u("/registry/patterns")},projects:{list:()=>u("/projects"),create:(e,t)=>u("/projects",{method:"POST",body:JSON.stringify({name:e,description:t})}),delete:e=>u(`/projects/${encodeURIComponent(e)}`,{method:"DELETE"}),rename:(e,t)=>u(`/projects/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify({new_name:t})}),updateDescription:(e,t)=>u(`/projects/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify({description:t})}),deleteAll:()=>u("/projects",{method:"DELETE"}),savePipeline:(e,t,a)=>u(`/projects/${encodeURIComponent(e)}/pipelines/${encodeURIComponent(t)}`,{method:"POST",body:JSON.stringify({graph:a})}),loadPipeline:(e,t)=>u(`/projects/${encodeURIComponent(e)}/pipelines/${encodeURIComponent(t)}`),getHistory:e=>u(`/projects/${encodeURIComponent(e)}/history`),restoreVersion:(e,t)=>u(`/projects/${encodeURIComponent(e)}/restore`,{method:"POST",body:JSON.stringify({commit_sha:t})}),bookmarkVersion:(e,t,a)=>u(`/projects/${encodeURIComponent(e)}/bookmark`,{method:"POST",body:JSON.stringify({commit_sha:t,label:a})})},files:{list:e=>u(`/projects/${encodeURIComponent(e)}/files`),read:(e,t)=>u(`/projects/${encodeURIComponent(e)}/files/${t}`)},evaluate:{uploadDataset:(e,t)=>{const a=new FormData;return a.append("file",t),fetch(`${St}/projects/${encodeURIComponent(e)}/datasets/upload`,{method:"POST",body:a}).then(async n=>{if(!n.ok){const s=await n.json().catch(()=>({detail:n.statusText}));throw new Error(s.detail||n.statusText)}return n.json()})},listDatasets:e=>u(`/projects/${encodeURIComponent(e)}/datasets`),run:(e,t,a)=>u("/evaluate/run",{method:"POST",body:JSON.stringify({project:e,dataset:t,graph:a})})},experiments:{list:e=>u(`/projects/${encodeURIComponent(e)}/experiments`),create:(e,t,a)=>u(`/projects/${encodeURIComponent(e)}/experiments`,{method:"POST",body:JSON.stringify({name:t,variants:a})}),get:(e,t)=>u(`/projects/${encodeURIComponent(e)}/experiments/${t}`),delete:(e,t)=>u(`/projects/${encodeURIComponent(e)}/experiments/${t}`,{method:"DELETE"}),runVariant:(e,t,a,n,s)=>u(`/projects/${encodeURIComponent(e)}/experiments/${t}/run`,{method:"POST",body:JSON.stringify({variant_name:a,graph:n,input:s??""})})},codegen:{smith:e=>u("/codegen/smith",{method:"POST",body:JSON.stringify({graph:e})})},monitoring:{usage:()=>u("/monitoring/usage")},checkpoints:{list:()=>u("/checkpoints"),get:e=>u(`/checkpoints/${e}`),fork:(e,t)=>u("/checkpoints/fork",{method:"POST",body:JSON.stringify({from_index:e,modified_state:t})}),rewind:e=>u(`/checkpoints/${e}/rewind`,{method:"POST"}),diff:(e,t)=>u("/checkpoints/diff",{method:"POST",body:JSON.stringify({index_a:e,index_b:t})}),clear:()=>u("/checkpoints",{method:"DELETE"})},settings:{get:()=>u("/settings"),save:e=>u("/settings",{method:"POST",body:JSON.stringify(e)}),status:()=>u("/settings/status"),services:{list:()=>u("/settings/services"),add:e=>u("/settings/services",{method:"POST",body:JSON.stringify(e)}),delete:e=>u(`/settings/services/${e}`,{method:"DELETE"}),test:e=>u(`/settings/services/${e}/test`,{method:"POST"})}},assistant:{getHistory:e=>u(`/assistant/${encodeURIComponent(e)}/history`),saveHistory:(e,t)=>u(`/assistant/${encodeURIComponent(e)}/history`,{method:"POST",body:JSON.stringify({messages:t})}),inferProjectName:e=>u("/assistant/infer-project-name",{method:"POST",body:JSON.stringify({message:e})})},oracle:{getInsights:e=>u(`/oracle/${encodeURIComponent(e)}/insights`),approveInsight:(e,t)=>u(`/oracle/${encodeURIComponent(e)}/insights/${t}/approve`,{method:"POST"}),skipInsight:(e,t)=>u(`/oracle/${encodeURIComponent(e)}/insights/${t}/skip`,{method:"POST"})},tunnel:{status:()=>u("/tunnel/status"),start:()=>u("/tunnel/start",{method:"POST"}),stop:()=>u("/tunnel/stop",{method:"POST"})},runtime:{start:e=>u(`/projects/${encodeURIComponent(e)}/runtime/start`,{method:"POST"}),stop:e=>u(`/projects/${encodeURIComponent(e)}/runtime/stop`,{method:"POST"}),status:e=>u(`/projects/${encodeURIComponent(e)}/runtime/status`),executions:e=>u(`/projects/${encodeURIComponent(e)}/runtime/executions`)},customTools:{list:()=>u("/custom-tools"),get:e=>u(`/custom-tools/${e}`),save:e=>u("/custom-tools",{method:"POST",body:JSON.stringify(e)}),delete:e=>u(`/custom-tools/${e}`,{method:"DELETE"}),register:e=>u(`/custom-tools/${e}/register`,{method:"POST"}),test:e=>u(`/custom-tools/${e}/test`,{method:"POST"}),catalog:()=>u("/custom-tools/catalog"),installConnector:(e,t)=>u(`/custom-tools/catalog/${e}/install`,{method:"POST",body:JSON.stringify(t??{})}),verifyConnector:e=>u(`/custom-tools/catalog/${e}/verify`,{method:"POST"})}},Xa=Object.freeze(Object.defineProperty({__proto__:null,api:I},Symbol.toStringTag,{value:"Module"})),he=P([]),Le=P(!1),ke=P(!1),J=P([]),ce=P(!1);let k=null,wt=0,M="",ee=null,_e=null;function Tt(e,t){if(k?.connected){const a=e??E(C),n=t??E(F);k.send({action:"sync_canvas",nodes:a,edges:n})}}function Qa(){Be(),_e=Fe([C,F],([t,a])=>({nodes:t,edges:a})).subscribe(({nodes:t,edges:a})=>{ee&&clearTimeout(ee),ee=setTimeout(()=>{Tt(t,a)},500)})}function Be(){_e&&(_e(),_e=null),ee&&(clearTimeout(ee),ee=null)}function Za(e){kt(),k=new Wa(`/ws/oracle?project=${encodeURIComponent(e)}`),k.on("_open",()=>{Le.set(!0),Tt(),Qa()}),k.on("_close",()=>{Le.set(!1),Be()}),k.on("insight",t=>{const a=t;he.update(n=>[a,...n])}),k.on("analysis_complete",()=>{ke.set(!1)}),k.on("oracle_token",t=>{const a=t.content;M||(M=`oracle_msg_${++wt}`,J.update(n=>[...n,{id:M,role:"oracle",content:"",timestamp:new Date().toISOString(),streaming:!0}]),ce.set(!0)),J.update(n=>n.map(s=>s.id===M?{...s,content:s.content+a}:s))}),k.on("oracle_response_complete",t=>{const a=t.full_text;M&&J.update(n=>n.map(s=>s.id===M?{...s,content:a,streaming:!1}:s)),M="",ce.set(!1)}),k.on("error",()=>{ke.set(!1),M&&(J.update(t=>t.map(a=>a.id===M?{...a,streaming:!1}:a)),M="",ce.set(!1))}),k.on("canvas_synced",()=>{}),k.connect()}function kt(){Be(),k&&(k.disconnect(),k=null),Le.set(!1),ke.set(!1),he.set([]),J.set([]),M="",ce.set(!1)}function On(){k?.connected&&(ke.set(!0),k.send({action:"analyze"}))}function En(e){if(!k?.connected||!e.trim())return;const t=`oracle_user_${++wt}`;J.update(a=>[...a,{id:t,role:"user",content:e.trim(),timestamp:new Date().toISOString()}]),k.send({action:"chat",message:e.trim()})}function Nn(){J.set([]),M="",ce.set(!1)}async function Pn(e,t){const a=await I.oracle.approveInsight(e,t);return he.update(n=>n.map(s=>s.id===t?{...s,status:"approved"}:s)),a.action_instruction??null}async function In(e,t){await I.oracle.skipInsight(e,t),he.update(a=>a.map(n=>n.id===t?{...n,status:"skipped"}:n))}async function en(e){const t=await I.oracle.getInsights(e);he.set(t)}const tn=[{id:"blank",name:"Blank Canvas",description:"Start with an empty canvas and build from scratch",nodes:[],edges:[]},{id:"simple-qa",name:"Q&A Agent",description:"A conversational agent with web search capabilities",architectPrompt:"Build a simple Q&A agent pipeline. Create one agent node with clear instructions for answering user questions helpfully and concisely. Connect it to a search tool so it can look up information when needed. Configure the agent with a good model and detailed instructions.",nodes:[],edges:[]},{id:"multi-agent",name:"Multi-Agent Team",description:"Multiple specialized agents that collaborate on complex tasks",architectPrompt:"Build a multi-agent team pipeline with 3 specialized agents: (1) a Router agent that analyzes the incoming request and decides which specialist to delegate to, (2) a Research agent that gathers information using search tools, and (3) a Writer agent that produces the final polished output. Connect the Router to a condition node that branches to the appropriate specialist based on the task type. Connect both specialists to a final output. Configure every agent with proper model, instructions, and description.",nodes:[],edges:[]},{id:"rag-pipeline",name:"RAG Pipeline",description:"Retrieval-augmented generation with context injection",architectPrompt:"Build a RAG (Retrieval-Augmented Generation) pipeline. Create: (1) an Input node for receiving queries, (2) a Retrieval agent that searches a knowledge base for relevant context, (3) a Reasoning node using chain_of_thought to synthesize the retrieved information, (4) a Generator agent that produces a well-grounded answer using the retrieved context, and (5) an Output node for the final response. Connect them in sequence. Configure all agents with proper models and instructions that emphasize grounding answers in retrieved context.",nodes:[],edges:[]},{id:"reasoning-pipeline",name:"Reasoning Chain",description:"Multi-step reasoning with quality validation and retry logic",architectPrompt:"Build a reasoning pipeline with quality control. Create: (1) an Input agent that receives and preprocesses user questions, (2) a Reasoning node using chain_of_thought pattern with maxSteps=5, (3) a Validator node that checks the reasoning output is not empty, (4) a Condition node that branches on quality: if valid, route to the Output agent; if invalid, route to a Retry agent that attempts the question with a different approach. Connect the Retry agent back to the Reasoning node for another pass. Configure all agents with proper models and detailed instructions.",nodes:[],edges:[]},{id:"content-pipeline",name:"Content Generator",description:"Research, draft, and review content with quality checks",architectPrompt:"Build a content generation pipeline with three stages: (1) a Research agent that gathers information on a topic using search tools, (2) a Writer agent that drafts content based on the research, and (3) a Reviewer agent that critiques the draft for accuracy, clarity, and completeness. Add a Reasoning node with reflexion pattern between the Writer and Reviewer for self-improvement. Add a Validator node after the Reviewer to ensure the output meets quality standards. Configure all agents with proper models, detailed instructions about their specific role, and descriptions.",nodes:[],edges:[]},{id:"data-processing",name:"Data Processor",description:"Extract, transform, and validate structured data from text",architectPrompt:'Build a data processing pipeline. Create: (1) an Input node with trigger_type="manual", (2) an Extractor agent that receives unstructured text and extracts structured data fields, (3) a Validator node to ensure extracted data is valid, (4) a Custom Code node for any data transformation logic (provide a placeholder async def execute function), (5) an Output node with destination_type="response". Connect them in sequence. Configure the Extractor agent with detailed instructions about what fields to extract and expected formats.',nodes:[],edges:[]},{id:"parallel-analysis",name:"Parallel Analysis",description:"Fan-out to multiple analysts, then merge their results",architectPrompt:'Build a parallel analysis pipeline using fan-out/fan-in pattern. Create: (1) a Coordinator agent that receives a complex question, (2) a Fan-Out node that splits the work, (3) three parallel Agent nodes: a Technical Analyst, a Business Analyst, and a Risk Analyst, each with specialized instructions for their domain, (4) a Fan-In node with merge_expression="collect" to gather all results, and (5) a Synthesizer agent that combines the parallel analyses into a unified report. Connect them properly: Coordinator to Fan-Out, Fan-Out to all three analysts, all three analysts to Fan-In, Fan-In to Synthesizer. Configure every agent with a proper model and role-specific instructions.',nodes:[],edges:[]}],Ct="fireflyStudio:selectedProject",te=P(null),ae=P([]);async function Ee(e){te.set(e);try{localStorage.setItem(Ct,e.name)}catch{}const t=yt();try{const a=await I.projects.loadPipeline(e.name,"main");if(a&&typeof a=="object"){const n=a;n.nodes&&C.set(n.nodes),n.edges&&F.set(n.edges),ue()}}catch{C.set([]),F.set([]),ue()}Oe.set(!1),t(),kt(),Za(e.name),en(e.name).catch(()=>{})}async function an(e,t){await I.projects.rename(e,t);const a=E(te);if(await pe(),a?.name===e){const s=E(ae).find(r=>r.name===t);s&&Ee(s)}}async function nn(e,t){await I.projects.updateDescription(e,t),await pe()}async function sn(e){await I.projects.delete(e),E(te)?.name===e&&(te.set(null),C.set([]),F.set([]),ue()),await pe()}async function on(){const e=await I.projects.deleteAll();return te.set(null),C.set([]),F.set([]),ue(),ae.set([]),e.count}async function rn(e){const t=await I.projects.create(e);await pe();const n=E(ae).find(s=>s.name===e);return n&&Ee(n),t}async function pe(){try{let e=await I.projects.list();if(e.length===0){ae.set([]);return}ae.set(e);let t;try{const a=localStorage.getItem(Ct);a&&(t=e.find(n=>n.name===a))}catch{}Ee(t??e[0])}catch(e){console.warn("[studio] Failed to initialise projects:",e)}}function cn(e,t){const a=tn.find(r=>r.id===e);if(!a)return;const n=a.nodes,s=yt();C.set(n),F.set(a.edges),ue(),Oe.set(!0),s()}const ln=Object.freeze(Object.defineProperty({__proto__:null,createAndSelectProject:rn,currentProject:te,deleteAllProjects:on,deleteProject:sn,initProjects:pe,loadTemplate:cn,projects:ae,renameProject:an,selectProject:Ee,updateProjectDescription:nn},Symbol.toStringTag,{value:"Module"}));function Rn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2"}],["rect",{x:"14",y:"2",width:"8",height:"8",rx:"1"}]];V(e,D({name:"blocks"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}function Mn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M12 18V5"}],["path",{d:"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4"}],["path",{d:"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5"}],["path",{d:"M17.997 5.125a4 4 0 0 1 2.526 5.77"}],["path",{d:"M18 18a4 4 0 0 0 2-7.464"}],["path",{d:"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517"}],["path",{d:"M6 18a4 4 0 0 1-2-7.464"}],["path",{d:"M6.003 5.125a4 4 0 0 0-2.526 5.77"}]];V(e,D({name:"brain"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}function jn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5"}],["path",{d:"M3 12A9 3 0 0 0 21 12"}]];V(e,D({name:"database"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}function xn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"m21 21-4.34-4.34"}],["circle",{cx:"11",cy:"11",r:"8"}]];V(e,D({name:"search"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}const We=P(null),zn=Fe(We,e=>{const t=new Set;if(!e)return t;const a=e.credentials;return a.openai_api_key&&t.add("openai"),a.anthropic_api_key&&t.add("anthropic"),a.google_api_key&&t.add("google"),a.groq_api_key&&t.add("groq"),a.mistral_api_key&&t.add("mistral"),a.deepseek_api_key&&t.add("deepseek"),a.cohere_api_key&&t.add("cohere"),a.azure_openai_api_key&&t.add("azure"),a.aws_access_key_id&&t.add("bedrock"),a.ollama_base_url&&t.add("ollama"),t});async function Un(){try{const e=await I.settings.get();We.set(e)}catch(e){console.warn("[studio] Failed to load settings:",e)}}async function Ln(e,t,a,n,s){const r={};e!==void 0&&(r.credentials=e),t!==void 0&&(r.model_defaults=t),a!==void 0&&(r.setup_complete=a),n!==void 0&&(r.user_profile=n),s!=null&&(r.tool_credentials=s);try{const o=await I.settings.save(r);We.set(o)}catch(o){throw console.error("[studio] Failed to save settings:",o),o}}function Dn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];V(e,D({name:"x"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}function Vn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"}],["path",{d:"M20 2v4"}],["path",{d:"M22 4h-4"}],["circle",{cx:"4",cy:"20",r:"2"}]];V(e,D({name:"sparkles"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}function Hn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}],["path",{d:"M10 9H8"}],["path",{d:"M16 13H8"}],["path",{d:"M16 17H8"}]];V(e,D({name:"file-text"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}function qn(e,t){const a=N(t,["children","$$slots","$$events","$$legacy"]);const n=[["path",{d:"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"}],["path",{d:"M6 12h16"}]];V(e,D({name:"send-horizontal"},()=>a,{get iconNode(){return n},children:(s,r)=>{var o=j(),i=x(o);z(i,t,"default",{}),O(s,o)},$$slots:{default:!0}}))}export{oe as $,On as A,Rn as B,Cn as C,jn as D,te as E,Hn as F,C as G,Oe as H,V as I,Ya as J,pe as K,$n as L,An as M,Ln as N,gn as O,bn as P,Un as Q,Tt as R,Vn as S,Sn as T,F as U,ue as V,$t as W,Dn as X,wn as Y,et as Z,se as _,Ra as a,Na as a0,pn as a1,Ka as a2,Tn as a3,yn as a4,_n as a5,J as a6,Nn as a7,he as a8,ke as a9,Le as aa,ce as ab,En as ac,Pn as ad,In as ae,mn as b,I as c,rn as d,Ta as e,tn as f,We as g,Mn as h,Te as i,qn as j,sn as k,cn as l,Ee as m,xn as n,an as o,ae as p,on as q,Da as r,z as s,Ma as t,nn as u,vn as v,zn as w,Sa as x,Wa as y,kn as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/8I91iWf8.js b/studio-desktop/frontend-dist/_app/immutable/chunks/8I91iWf8.js deleted file mode 100644 index 47bda07a..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/8I91iWf8.js +++ /dev/null @@ -1 +0,0 @@ -import{w as s}from"./BESIXtBI.js";const a=s(!0),e=s(!1),n=s("console"),o=s(!0),c=s(!1),l=s(!1),r=s(!1),p=s(!1),i=s(null);export{e as a,n as b,o as c,c as d,l as e,p as f,i as p,a as r,r as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/91PP6ILK.js b/studio-desktop/frontend-dist/_app/immutable/chunks/91PP6ILK.js deleted file mode 100644 index b08c6615..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/91PP6ILK.js +++ /dev/null @@ -1,6 +0,0 @@ -import{z as U,h as ze,a as Pe,a9 as Fe,ba as st,e as De,av as it,aJ as dt,bb as lt,bc as ct,aO as Ce,c as ut,aM as ft,aN as pt,bd as vt,au as _e,b as $t,E as Le,be as ht,bf as mt,bg as _t,Y as gt,m as yt,bh as wt,aj as kt,_ as xt,a0 as ae,bi as Oe,f as c,g as l,i as d,w as B,b9 as bt,G as Nt,p as Mt,B as S,t as m,L as D,D as E,C as W,bj as zt,K as J,j as Pt,I as ne,F as ce,M as Dt,A as I,O as Ae}from"./DCyBifBO.js";import{B as Ct,l as f,s as p,p as ge,b as Se,i as ue,a as At,c as St}from"./v7tHB-Lt.js";import"./DsnmJJEf.js";import"./l8YpzWR9.js";import{I as v,s as $,j as fe,r as Wt,S as qt,k as He,c as Re,m as Tt,h as We,n as Et,o as Gt,e as qe,q as Te,a as Ft}from"./BAxs8Xtu.js";function la(t,e,a=!1,o=!1,r=!1){var i=t,n="";U(()=>{var s=Fe;if(n===(n=e()??"")){ze&&Pe();return}if(s.nodes!==null&&(st(s.nodes.start,s.nodes.end),s.nodes=null),n!==""){if(ze){De.data;for(var h=Pe(),_=h;h!==null&&(h.nodeType!==it||h.data!=="");)_=h,h=dt(h);if(h===null)throw lt(),ct;Ce(De,_),i=ut(h);return}var w=a?pt:o?vt:void 0,b=ft(a?"svg":o?"math":"template",w);b.innerHTML=n;var k=a||o?b:b.content;if(Ce(_e(k),k.lastChild),a||o)for(;_e(k);)i.before(_e(k));else i.before(k)}})}function ca(t,e,...a){var o=new Ct(t);$t(()=>{const r=e()??null;o.ensure(r,r&&(i=>r(i,...a)))},Le)}const Lt=()=>performance.now(),T={tick:t=>requestAnimationFrame(t),now:()=>Lt(),tasks:new Set};function Be(){const t=T.now();T.tasks.forEach(e=>{e.c(t)||(T.tasks.delete(e),e.f())}),T.tasks.size!==0&&T.tick(Be)}function Ot(t){let e;return T.tasks.size===0&&T.tick(Be),{promise:new Promise(a=>{T.tasks.add(e={c:t,f:a})}),abort(){T.tasks.delete(e)}}}function pe(t,e){Oe(()=>{t.dispatchEvent(new CustomEvent(e))})}function Ht(t){if(t==="float")return"cssFloat";if(t==="offset")return"cssOffset";if(t.startsWith("--"))return t;const e=t.split("-");return e.length===1?e[0]:e[0]+e.slice(1).map(a=>a[0].toUpperCase()+a.slice(1)).join("")}function Ee(t){const e={},a=t.split(";");for(const o of a){const[r,i]=o.split(":");if(!r||i===void 0)break;const n=Ht(r.trim());e[n]=i.trim()}return e}const Rt=t=>t;function ua(t,e,a,o){var r=(t&wt)!==0,i="both",n,s=e.inert,h=e.style.overflow,_,w;function b(){return Oe(()=>n??=a()(e,o?.()??{},{direction:i}))}var k={is_global:r,in(){e.inert=s,_=ye(e,b(),w,1,()=>{pe(e,"introend"),_?.abort(),_=n=void 0,e.style.overflow=h})},out(C){e.inert=!0,w=ye(e,b(),_,0,()=>{pe(e,"outroend"),C?.()})},stop:()=>{_?.abort(),w?.abort()}},q=Fe;if((q.nodes.t??=[]).push(k),ht){var z=r;if(!z){for(var g=q.parent;g&&(g.f&Le)!==0;)for(;(g=g.parent)&&(g.f&mt)===0;);z=!g||(g.f&_t)!==0}z&>(()=>{yt(()=>k.in())})}}function ye(t,e,a,o,r){var i=o===1;if(kt(e)){var n,s=!1;return xt(()=>{if(!s){var C=e({direction:i?"in":"out"});n=ye(t,C,a,o,r)}}),{abort:()=>{s=!0,n?.abort()},deactivate:()=>n.deactivate(),reset:()=>n.reset(),t:()=>n.t()}}if(a?.deactivate(),!e?.duration&&!e?.delay)return pe(t,i?"introstart":"outrostart"),r(),{abort:ae,deactivate:ae,reset:ae,t:()=>o};const{delay:h=0,css:_,tick:w,easing:b=Rt}=e;var k=[];if(i&&a===void 0&&(w&&w(0,1),_)){var q=Ee(_(0,1));k.push(q,q)}var z=()=>1-o,g=t.animate(k,{duration:h,fill:"forwards"});return g.onfinish=()=>{g.cancel(),pe(t,i?"introstart":"outrostart");var C=a?.t()??1-o;a?.abort();var Q=o-C,V=e.duration*Math.abs(Q),ie=[];if(V>0){var de=!1;if(_)for(var L=Math.ceil(V/16.666666666666668),O=0;O<=L;O+=1){var A=C+Q*b(O/L),H=Ee(_(A,1-A));ie.push(H),de||=H.overflow==="hidden"}de&&(t.style.overflow="hidden"),z=()=>{var j=g.currentTime;return C+Q*b(j/V)},w&&Ot(()=>{if(g.playState!=="running")return!1;var j=z();return w(j,1-j),!0})}g=t.animate(ie,{duration:V,fill:"forwards"}),g.onfinish=()=>{z=()=>o,w?.(o,1-o),r()}},{abort:()=>{g&&(g.cancel(),g.effect=null,g.onfinish=ae)},deactivate:()=>{r=ae},reset:()=>{o===0&&w?.(1,0)},t:()=>z()}}function fa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];v(t,p({name:"play"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function pa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];v(t,p({name:"settings"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Bt(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m6 9 6 6 6-6"}]];v(t,p({name:"chevron-down"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function va(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];v(t,p({name:"trash-2"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function $a(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"}]];v(t,p({name:"link"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}const oe=B(!1),re=B(!1),It=B([]),G=B(new Set),Vt=B([]);function F(t){const e={...t,timestamp:t.timestamp??new Date().toISOString()};It.update(a=>[...a,e])}const Ie=B([]);let jt=0;function Z(t,e="info",a=5e3){const o=`toast-${++jt}`;return Ie.update(r=>[...r,{id:o,message:t,type:e,duration:a}]),a>0&&setTimeout(()=>Kt(o),a),o}function Kt(t){Ie.update(e=>e.filter(a=>a.id!==t))}let y=null;const N=[];function ha(){y||(y=new qt("/ws/execution"),y.connect(),N.push(y.on("node_start",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.add(t.node_id),a}),fe(t.node_id,"running")),F(t)})),N.push(y.on("node_complete",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"complete")),F(t)})),N.push(y.on("node_error",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"error")),F(t)})),N.push(y.on("node_skip",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"skipped")),F(t)})),N.push(y.on("debug_enabled",t=>{F(t),Z("Debug mode active","info")})),N.push(y.on("error",t=>{F(t),Z(t.message||t.error||"An error occurred","error")})),N.push(y.on("pipeline_complete",t=>{G.set(new Set),oe.set(!1),re.set(!1),F(t),Wt()})),N.push(y.on("checkpoint_created",t=>{Vt.update(e=>[...e,t])})),N.push(y.on("pipeline_result",t=>{G.set(new Set),oe.set(!1),re.set(!1),F(t)})),N.push(y.on("_close",()=>{G.set(new Set),oe.set(!1),re.set(!1)})),N.push(y.on("_error",()=>{G.set(new Set),oe.set(!1),re.set(!1),Z("Execution connection lost. Attempting to reconnect...","warning")})),N.push(y.on("_reconnect_failed",()=>{Z("Could not reconnect to execution server. Please refresh the page.","error",0)})))}function ma(){for(const t of N)t();N.length=0,y?.disconnect(),y=null}function _a(t,e){return!y||!y.connected?(Z("Cannot run pipeline: not connected to execution server","error"),!1):(He(),oe.set(!0),y.send({action:"run",graph:t,inputs:e??null}),!0)}function ga(t,e){return!y||!y.connected?(Z("Cannot debug pipeline: not connected to execution server","error"),!1):(He(),re.set(!0),y.send({action:"debug",graph:t,inputs:null}),!0)}function ya(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"}]];v(t,p({name:"copy"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function wa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M20 6 9 17l-5-5"}]];v(t,p({name:"check"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function ka(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2"}],["path",{d:"M6.453 15h11.094"}],["path",{d:"M8.5 2h7"}]];v(t,p({name:"flask-conical"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function xa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M15 6a9 9 0 0 0-9 9V3"}],["circle",{cx:"18",cy:"6",r:"3"}],["circle",{cx:"6",cy:"18",r:"3"}]];v(t,p({name:"git-branch"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function ba(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"}],["path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09"}],["path",{d:"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z"}],["path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05"}]];v(t,p({name:"rocket"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Na(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"}]];v(t,p({name:"activity"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ma(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"}]];v(t,p({name:"folder-open"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function za(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 8V4H8"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}],["path",{d:"M2 14h2"}],["path",{d:"M20 14h2"}],["path",{d:"M15 13v2"}],["path",{d:"M9 13v2"}]];v(t,p({name:"bot"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Pa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z"}]];v(t,p({name:"wrench"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Da(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["circle",{cx:"12",cy:"12",r:"1"}]];v(t,p({name:"circle-dot"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ca(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"}]];v(t,p({name:"shield"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Aa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m16 18 6-6-6-6"}],["path",{d:"m8 6-6 6 6 6"}]];v(t,p({name:"code"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Sa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["circle",{cx:"18",cy:"6",r:"3"}],["path",{d:"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9"}],["path",{d:"M12 12v3"}]];v(t,p({name:"git-fork"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Wa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M6 21V9a9 9 0 0 0 9 9"}]];v(t,p({name:"git-merge"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function qa(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M2 12 7 2"}],["path",{d:"m7 12 5-10"}],["path",{d:"m12 12 5-10"}],["path",{d:"m17 12 5-10"}],["path",{d:"M4.5 7h15"}],["path",{d:"M12 16v6"}]];v(t,p({name:"antenna"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ta(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];v(t,p({name:"download"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ea(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 19h8"}],["path",{d:"m4 17 6-6-6-6"}]];v(t,p({name:"terminal"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ga(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 6v6l4 2"}]];v(t,p({name:"clock"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Yt(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m21 21-4.34-4.34"}],["circle",{cx:"11",cy:"11",r:"8"}]];v(t,p({name:"search"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}const we=B(null),Jt=bt(we,t=>{const e=new Set;if(!t)return e;const a=t.credentials;return a.openai_api_key&&e.add("openai"),a.anthropic_api_key&&e.add("anthropic"),a.google_api_key&&e.add("google"),a.groq_api_key&&e.add("groq"),a.mistral_api_key&&e.add("mistral"),a.deepseek_api_key&&e.add("deepseek"),a.cohere_api_key&&e.add("cohere"),a.azure_openai_api_key&&e.add("azure"),a.aws_access_key_id&&e.add("bedrock"),a.ollama_base_url&&e.add("ollama"),e});async function Fa(){try{const t=await Re.settings.get();we.set(t)}catch(t){console.warn("[studio] Failed to load settings:",t)}}async function La(t,e,a,o){const r={};t!==void 0&&(r.credentials=t),e!==void 0&&(r.model_defaults=e),r.setup_complete=a,o!==void 0&&(r.user_profile=o);try{const i=await Re.settings.save(r);we.set(i)}catch(i){throw console.error("[studio] Failed to save settings:",i),i}}const se=[{provider:"openai",label:"OpenAI",models:[{id:"openai:gpt-4.1",name:"GPT-4.1",provider:"openai",contextWindow:1047576,isDefault:!0},{id:"openai:gpt-4.1-mini",name:"GPT-4.1 Mini",provider:"openai",contextWindow:1047576,isDefault:!1},{id:"openai:gpt-4.1-nano",name:"GPT-4.1 Nano",provider:"openai",contextWindow:1047576,isDefault:!1},{id:"openai:gpt-4o",name:"GPT-4o",provider:"openai",contextWindow:128e3,isDefault:!1},{id:"openai:gpt-4o-mini",name:"GPT-4o Mini",provider:"openai",contextWindow:128e3,isDefault:!1},{id:"openai:o3",name:"o3",provider:"openai",contextWindow:2e5,isDefault:!1},{id:"openai:o4-mini",name:"o4-mini",provider:"openai",contextWindow:2e5,isDefault:!1}]},{provider:"anthropic",label:"Anthropic",models:[{id:"anthropic:claude-sonnet-4-6",name:"Claude Sonnet 4.6",provider:"anthropic",contextWindow:2e5,isDefault:!0},{id:"anthropic:claude-opus-4-6",name:"Claude Opus 4.6",provider:"anthropic",contextWindow:2e5,isDefault:!1},{id:"anthropic:claude-haiku-4-5",name:"Claude Haiku 4.5",provider:"anthropic",contextWindow:2e5,isDefault:!1}]},{provider:"google",label:"Google Gemini",models:[{id:"google:gemini-2.5-pro",name:"Gemini 2.5 Pro",provider:"google",contextWindow:1048576,isDefault:!0},{id:"google:gemini-2.5-flash",name:"Gemini 2.5 Flash",provider:"google",contextWindow:1048576,isDefault:!1},{id:"google:gemini-2.0-flash",name:"Gemini 2.0 Flash",provider:"google",contextWindow:1048576,isDefault:!1}]},{provider:"groq",label:"Groq",models:[{id:"groq:llama-3.3-70b-versatile",name:"Llama 3.3 70B",provider:"groq",contextWindow:128e3,isDefault:!0},{id:"groq:mixtral-8x7b-32768",name:"Mixtral 8x7B",provider:"groq",contextWindow:32768,isDefault:!1},{id:"groq:gemma2-9b-it",name:"Gemma 2 9B",provider:"groq",contextWindow:8192,isDefault:!1}]},{provider:"mistral",label:"Mistral",models:[{id:"mistral:mistral-large-latest",name:"Mistral Large",provider:"mistral",contextWindow:128e3,isDefault:!0},{id:"mistral:mistral-small-latest",name:"Mistral Small",provider:"mistral",contextWindow:128e3,isDefault:!1},{id:"mistral:codestral-latest",name:"Codestral",provider:"mistral",contextWindow:256e3,isDefault:!1}]},{provider:"deepseek",label:"DeepSeek",models:[{id:"deepseek:deepseek-chat",name:"DeepSeek Chat",provider:"deepseek",contextWindow:64e3,isDefault:!0},{id:"deepseek:deepseek-reasoner",name:"DeepSeek Reasoner",provider:"deepseek",contextWindow:64e3,isDefault:!1}]},{provider:"cohere",label:"Cohere",models:[{id:"cohere:command-r-plus",name:"Command R+",provider:"cohere",contextWindow:128e3,isDefault:!0},{id:"cohere:command-r",name:"Command R",provider:"cohere",contextWindow:128e3,isDefault:!1}]},{provider:"azure",label:"Azure OpenAI",models:[{id:"azure:gpt-4o",name:"GPT-4o (Azure)",provider:"azure",contextWindow:128e3,isDefault:!0},{id:"azure:gpt-4o-mini",name:"GPT-4o Mini (Azure)",provider:"azure",contextWindow:128e3,isDefault:!1}]},{provider:"bedrock",label:"Amazon Bedrock",models:[{id:"bedrock:anthropic.claude-3-5-sonnet-20241022-v2:0",name:"Claude 3.5 Sonnet (Bedrock)",provider:"bedrock",contextWindow:2e5,isDefault:!0},{id:"bedrock:anthropic.claude-3-haiku-20240307-v1:0",name:"Claude 3 Haiku (Bedrock)",provider:"bedrock",contextWindow:2e5,isDefault:!1},{id:"bedrock:amazon.nova-pro-v1:0",name:"Amazon Nova Pro",provider:"bedrock",contextWindow:3e5,isDefault:!1}]},{provider:"ollama",label:"Ollama",models:[{id:"ollama:llama3.3",name:"Llama 3.3",provider:"ollama",contextWindow:128e3,isDefault:!0},{id:"ollama:mistral",name:"Mistral",provider:"ollama",contextWindow:32768,isDefault:!1},{id:"ollama:codellama",name:"Code Llama",provider:"ollama",contextWindow:16384,isDefault:!1},{id:"ollama:phi4",name:"Phi-4",provider:"ollama",contextWindow:16384,isDefault:!1}]}];function Oa(t){return se.find(a=>a.provider===t)?.models.find(a=>a.isDefault)}function Ut(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}var Zt=I('
'),Qt=I(''),Xt=I('Not configured'),ea=I(''),ta=I(''),aa=I(' ',1),na=I('
');function Ha(t,e){Mt(e,!0);const a=()=>St(Jt,"$configuredProviders",o),[o,r]=At();let i=ge(e,"value",15,""),n=ge(e,"placeholder",3,"Select or type a model..."),s=ge(e,"showAllProviders",3,!1),h=ne(!1),_=ne(""),w=ne(null),b=ne(null),k=ne(""),q=Ae(()=>{const u=a();let x;if(s()||u.size===0)x=se;else{const M=se.filter(X=>u.has(X.provider)),R=se.filter(X=>!u.has(X.provider));x=[...M,...R]}if(!m(_).trim())return x;const P=m(_).toLowerCase();return x.map(M=>({...M,models:M.models.filter(R=>R.name.toLowerCase().includes(P)||R.id.toLowerCase().includes(P)||M.label.toLowerCase().includes(P))})).filter(M=>M.models.length>0)});function z(u){i(u.id),D(_,""),D(h,!1)}function g(){if(!m(b))return;const u=m(b).getBoundingClientRect(),x=Math.min(300,window.innerHeight-u.bottom-8);D(k,`position:fixed; top:${u.bottom+4}px; left:${u.left}px; width:${u.width}px; max-height:${x}px;`)}function C(){D(h,!0),D(_,""),requestAnimationFrame(g)}function Q(u){const x=u.target;D(_,x.value,!0),i(x.value),D(h,!0)}function V(u){u.key==="Escape"&&(D(h,!1),m(w)?.blur())}function ie(){D(h,!1)}function de(u){for(const x of se){const P=x.models.find(M=>M.id===u);if(P)return P.name}return u}var L=na(),O=S(L),A=S(O);Tt(A),Se(A,u=>D(w,u),()=>m(w));var H=E(A,2);We(H,"tabindex",-1);var j=S(H);Bt(j,{size:14}),W(H),W(O);var ke=E(O,2);{var je=u=>{var x=Zt(),P=S(x,!0);W(x),U(()=>ce(P,i())),d(u,x)};ue(ke,u=>{i()&&!m(h)&&u(je)})}var Ke=E(ke,2);{var Ye=u=>{var x=aa(),P=l(x),M=E(P,2),R=S(M);{var X=K=>{var le=Qt();d(K,le)},Je=K=>{var le=c(),Ze=l(le);qe(Ze,17,()=>m(q),Te,(Qe,ve)=>{var $e=ta(),he=S($e),be=S(he),Xe=E(be);{var et=ee=>{var Y=Xt();d(ee,Y)},tt=Ae(()=>!a().has(m(ve).provider)&&a().size>0);ue(Xe,ee=>{m(tt)&&ee(et)})}W(he);var at=E(he,2);qe(at,17,()=>m(ve).models,Te,(ee,Y)=>{var te=ea();let Ne;var me=S(te),nt=S(me,!0);W(me);var Me=E(me,2),ot=S(Me);W(Me),W(te),U(rt=>{Ne=Ft(te,1,"dropdown-item svelte-1de56kq",null,Ne,{selected:i()===m(Y).id}),ce(nt,m(Y).name),ce(ot,`${rt??""} ctx`)},[()=>Ut(m(Y).contextWindow)]),J("click",te,()=>z(m(Y))),d(ee,te)}),W($e),U(()=>ce(be,`${m(ve).label??""} `)),d(Qe,$e)}),d(K,le)};ue(R,K=>{m(q).length===0?K(X):K(Je,!1)})}var xe=E(R,2),Ue=S(xe);Yt(Ue,{size:12}),Dt(2),W(xe),W(M),U(()=>Gt(M,m(k))),J("click",P,ie),J("keydown",P,()=>{}),d(u,x)};ue(Ke,u=>{m(h)&&u(Ye)})}W(L),Se(L,u=>D(b,u),()=>m(b)),U(u=>{Et(A,u),We(A,"placeholder",n())},[()=>m(h)?m(_):i()?de(i()):""]),zt("focus",A,C),J("input",A,Q),J("keydown",A,V),J("click",H,()=>{D(h,!m(h)),m(h)&&m(w)?.focus()}),d(t,L),Pt(),r()}Nt(["input","keydown","click"]);function Ra(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"}]];v(t,p({name:"zap"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ve(t){const e=t-1;return e*e*e+1}function Ge(t){const e=typeof t=="string"&&t.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/);return e?[parseFloat(e[1]),e[2]||"px"]:[t,"px"]}function Ba(t,{delay:e=0,duration:a=400,easing:o=Ve,x:r=0,y:i=0,opacity:n=0}={}){const s=getComputedStyle(t),h=+s.opacity,_=s.transform==="none"?"":s.transform,w=h*(1-n),[b,k]=Ge(r),[q,z]=Ge(i);return{delay:e,duration:a,easing:o,css:(g,C)=>` - transform: ${_} translate(${(1-g)*b}${k}, ${(1-g)*q}${z}); - opacity: ${h-w*C}`}}function Ia(t,{delay:e=0,duration:a=400,easing:o=Ve,start:r=0,opacity:i=0}={}){const n=getComputedStyle(t),s=+n.opacity,h=n.transform==="none"?"":n.transform,_=1-r,w=s*(1-i);return{delay:e,duration:a,easing:o,css:(b,k)=>` - transform: ${h} scale(${1-_*k}); - opacity: ${s-w*k} - `}}function Va(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16"}]];v(t,p({name:"circle-alert"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function ja(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"}],["path",{d:"M12 9v4"}],["path",{d:"M12 17h.01"}]];v(t,p({name:"triangle-alert"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ka(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 16v-4"}],["path",{d:"M12 8h.01"}]];v(t,p({name:"info"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ya(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m9 18 6-6-6-6"}]];v(t,p({name:"chevron-right"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ja(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m9 12 2 2 4-4"}]];v(t,p({name:"circle-check"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ua(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}]];v(t,p({name:"file"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}export{Na as A,za as B,wa as C,Ta as D,Ba as E,ka as F,xa as G,Ya as H,Ka as I,la as J,Ja as K,$a as L,Ha as M,Ua as N,ca as O,fa as P,Ia as Q,ba as R,pa as S,va as T,It as U,Vt as V,Pa as W,ha as X,ma as Y,Ra as Z,Z as a,ya as b,Bt as c,ga as d,re as e,Ma as f,qa as g,Da as h,oe as i,Ca as j,Aa as k,Sa as l,Wa as m,Ea as n,Ga as o,Yt as p,La as q,_a as r,we as s,Fa as t,Oa as u,Ie as v,ja as w,Va as x,Kt as y,ua as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/BAxs8Xtu.js b/studio-desktop/frontend-dist/_app/immutable/chunks/BAxs8Xtu.js deleted file mode 100644 index 11582911..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/BAxs8Xtu.js +++ /dev/null @@ -1,2 +0,0 @@ -import{T as ne,b as Je,at as Fe,h as S,c as G,au as Be,a as ie,t as U,r as ct,X as ft,s as Ie,d as W,e as z,av as dt,aw as ut,ax as je,P as M,ay as C,U as te,az as ht,W as pt,ag as vt,aA as Ge,aB as Ee,aC as gt,aD as mt,a1 as _t,ab as Le,aE as yt,Q as Ue,S as qe,aF as _e,_ as oe,aG as bt,aH as St,aI as $t,R as le,aJ as wt,aK as Tt,E as At,aL as se,aM as Nt,aN as kt,aO as Et,aP as Ot,a9 as Pt,a4 as Oe,aQ as Ye,Y as Pe,aR as Mt,aS as Ke,aT as pe,aU as Qe,aV as Ct,aW as It,aX as ae,aY as jt,K as Lt,G as xt,aZ as Rt,a_ as Ht,a$ as Dt,b0 as zt,b1 as Wt,b2 as Vt,b3 as Jt,b4 as Ft,b5 as Bt,b6 as Gt,ar as Ut,m as ce,Z as Me,p as qt,i as I,j as Yt,b7 as Kt,v as F,B as Qt,D as Xt,C as Zt,f as R,g as H,O as ea,b8 as ta,b9 as aa,w as L,a3 as q}from"./DCyBifBO.js";import"./DsnmJJEf.js";import{i as sa}from"./l8YpzWR9.js";import{B as na,l as j,p as B,s as V}from"./v7tHB-Lt.js";function ra(e,t){return t}function ia(e,t,a){for(var s=[],n=t.length,i,r=t.length,o=0;o{if(i){if(i.pending.delete(v),i.done.add(v),i.pending.size===0){var u=e.outrogroups;Te(Ee(i.done)),u.delete(i),u.size===0&&(e.outrogroups=null)}}else r-=1},!1)}if(r===0){var f=s.length===0&&a!==null;if(f){var c=a,l=c.parentNode;$t(l),l.append(c),e.items.clear()}Te(t,!f)}else i={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(i)}function Te(e,t=!0){for(var a=0;a{var p=a();return Ge(p)?p:p==null?[]:Ee(p)}),u,m=!0;function $(){d.fallback=l,la(d,u,r,t,s),l!==null&&(u.length===0?(l.f&C)===0?Ue(l):(l.f^=C,Z(l,null,r)):qe(l,()=>{l=null}))}var T=Je(()=>{u=U(v);var p=u.length;let k=!1;if(S){var E=ct(r)===ft;E!==(p===0)&&(r=Ie(),G(r),W(!1),k=!0)}for(var b=new Set,O=M,_=pt(),g=0;gi(r)):(l=te(()=>i(xe??=ne())),l.f|=C)),p>b.size&&ht(),S&&p>0&&G(Ie()),!m)if(_){for(const[ge,me]of o)b.has(ge)||O.skip_effect(me.e);O.oncommit($),O.ondiscard(()=>{})}else $();k&&W(!0),U(v)}),d={effect:T,items:o,outrogroups:null,fallback:l};m=!1,S&&(r=z)}function K(e){for(;e!==null&&(e.f&bt)===0;)e=e.next;return e}function la(e,t,a,s,n){var i=(s&St)!==0,r=t.length,o=e.items,f=K(e.effect.first),c,l=null,v,u=[],m=[],$,T,d,p;if(i)for(p=0;p0){var N=(s&Fe)!==0&&r===0?a:null;if(i){for(p=0;p{if(v!==void 0)for(d of v)d.nodes?.a?.apply()})}function ca(e,t,a,s,n,i,r,o){var f=(r>)!==0?(r&mt)===0?_t(a,!1,!1):Le(a):null,c=(r&yt)!==0?Le(n):null;return{v:f,i:c,e:te(()=>(i(t,f??a,c??n,o),()=>{e.delete(s)}))}}function Z(e,t,a){if(e.nodes)for(var s=e.nodes.start,n=e.nodes.end,i=t&&(t.f&C)===0?t.nodes.start:a;s!==null;){var r=wt(s);if(i.before(s),s===n)return;s=r}}function x(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function D(e,t,a,s,n){S&&ie();var i=t.$$slots?.[a],r=!1;i===!0&&(i=t.children,r=!0),i===void 0||i(e,r?()=>s:s)}function fa(e,t,a,s,n,i){let r=S;S&&ie();var o=null;S&&z.nodeType===Tt&&(o=z,ie());var f=S?z:e,c=new na(f,!1);Je(()=>{const l=t()||null;var v=kt;if(l===null){c.ensure(null,null),se(!0);return}return c.ensure(l,u=>{if(l){if(o=S?o:Nt(l,v),Et(o,o),s){S&&Ot(l)&&o.append(document.createComment(""));var m=S?Be(o):o.appendChild(ne());S&&(m===null?W(!1):G(m)),s(o,m)}Pt.nodes.end=o,u.before(o)}S&&G(u)}),se(!0),()=>{l&&se(!1)}},At),Oe(()=>{se(!0)}),r&&(W(!0),G(f))}function da(e,t){var a=void 0,s;Ye(()=>{a!==(a=t())&&(s&&(le(s),s=null),a&&(s=te(()=>{Pe(()=>a(e))})))})}function Xe(e){var t,a,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var n=e.length;for(t=0;t=0;){var o=r+i;(r===0||Re.includes(s[r-1]))&&(o===s.length||Re.includes(s[o]))?s=(r===0?"":s.substring(0,r))+s.substring(o+1):r=o}}return s===""?null:s}function He(e,t=!1){var a=t?" !important;":";",s="";for(var n of Object.keys(e)){var i=e[n];i!=null&&i!==""&&(s+=" "+n+": "+i+a)}return s}function ye(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function va(e,t){if(t){var a="",s,n;if(Array.isArray(t)?(s=t[0],n=t[1]):s=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var i=!1,r=0,o=!1,f=[];s&&f.push(...Object.keys(s).map(ye)),n&&f.push(...Object.keys(n).map(ye));var c=0,l=-1;const T=e.length;for(var v=0;v{fe(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Oe(()=>{t.disconnect()})}function za(e,t,a=t){var s=new WeakSet,n=!0;pe(e,"change",i=>{var r=i?"[selected]":":checked",o;if(e.multiple)o=[].map.call(e.querySelectorAll(r),ee);else{var f=e.querySelector(r)??e.querySelector("option:not([disabled])");o=f&&ee(f)}a(o),M!==null&&s.add(M)}),Pe(()=>{var i=t();if(e===document.activeElement){var r=Qe??M;if(s.has(r))return}if(fe(e,i,n),n&&i===void 0){var o=e.querySelector(":checked");o!==null&&(i=ee(o),a(i))}e.__value=i,n=!1}),Ze(e)}function ee(e){return"__value"in e?e.__value:e.value}const Q=Symbol("class"),X=Symbol("style"),et=Symbol("is custom element"),tt=Symbol("is html"),_a=ae?"link":"LINK",ya=ae?"input":"INPUT",ba=ae?"option":"OPTION",Sa=ae?"select":"SELECT",$a=ae?"progress":"PROGRESS";function wa(e){if(S){var t=!1,a=()=>{if(!t){if(t=!0,e.hasAttribute("value")){var s=e.value;de(e,"value",null),e.value=s}if(e.hasAttribute("checked")){var n=e.checked;de(e,"checked",null),e.checked=n}}};e.__on_r=a,oe(a),Wt()}}function Wa(e,t){var a=Ce(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==$a)||(e.value=t??"")}function Ta(e,t){t?e.hasAttribute("selected")||e.setAttribute("selected",""):e.removeAttribute("selected")}function de(e,t,a,s){var n=Ce(e);S&&(n[t]=e.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&e.nodeName===_a)||n[t]!==(n[t]=a)&&(t==="loading"&&(e[Ft]=a),a==null?e.removeAttribute(t):typeof a!="string"&&at(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Aa(e,t,a,s,n=!1,i=!1){if(S&&n&&e.nodeName===ya){var r=e,o=r.type==="checkbox"?"defaultChecked":"defaultValue";o in a||wa(r)}var f=Ce(e),c=f[et],l=!f[tt];let v=S&&c;v&&W(!1);var u=t||{},m=e.nodeName===ba;for(var $ in t)$ in a||(a[$]=null);a.class?a.class=ha(a.class):(s||a[Q])&&(a.class=null),a[X]&&(a.style??=null);var T=at(e);for(const _ in a){let g=a[_];if(m&&_==="value"&&g==null){e.value=e.__value="",u[_]=g;continue}if(_==="class"){var d=e.namespaceURI==="http://www.w3.org/1999/xhtml";ga(e,d,g,s,t?.[Q],a[Q]),u[_]=g,u[Q]=a[Q];continue}if(_==="style"){ma(e,g,t?.[X],a[X]),u[_]=g,u[X]=a[X];continue}var p=u[_];if(!(g===p&&!(g===void 0&&e.hasAttribute(_)))){u[_]=g;var k=_[0]+_[1];if(k!=="$$")if(k==="on"){const w={},N="$$"+_;let y=_.slice(2);var E=Bt(y);if(jt(y)&&(y=y.slice(0,-7),w.capture=!0),!E&&p){if(g!=null)continue;e.removeEventListener(y,u[N],w),u[N]=null}if(E)Lt(y,e,g),xt([y]);else if(g!=null){let ge=function(me){u[_].call(this,me)};u[N]=Rt(y,e,ge,w)}}else if(_==="style")de(e,_,g);else if(_==="autofocus")Ht(e,!!g);else if(!c&&(_==="__value"||_==="value"&&g!=null))e.value=e.__value=g;else if(_==="selected"&&m)Ta(e,g);else{var b=_;l||(b=Dt(b));var O=b==="defaultValue"||b==="defaultChecked";if(g==null&&!c&&!O)if(f[_]=null,b==="value"||b==="checked"){let w=e;const N=t===void 0;if(b==="value"){let y=w.defaultValue;w.removeAttribute(b),w.defaultValue=y,w.value=w.__value=N?y:null}else{let y=w.defaultChecked;w.removeAttribute(b),w.defaultChecked=y,w.checked=N?y:!1}}else e.removeAttribute(_);else O||T.includes(b)&&(c||typeof g!="string")?(e[b]=g,b in f&&(f[b]=zt)):typeof g!="function"&&de(e,b,g)}}}return v&&W(!0),u}function De(e,t,a=[],s=[],n=[],i,r=!1,o=!1){Ct(n,a,s,f=>{var c=void 0,l={},v=e.nodeName===Sa,u=!1;if(Ye(()=>{var $=t(...f.map(U)),T=Aa(e,c,$,i,r,o);u&&v&&"value"in $&&fe(e,$.value);for(let p of Object.getOwnPropertySymbols(l))$[p]||le(l[p]);for(let p of Object.getOwnPropertySymbols($)){var d=$[p];p.description===It&&(!c||d!==c[p])&&(l[p]&&le(l[p]),l[p]=te(()=>da(e,()=>d))),T[p]=d}c=T}),v){var m=e;Pe(()=>{fe(m,c.value,!0),Ze(m)})}u=!0})}function Ce(e){return e.__attributes??={[et]:e.nodeName.includes("-"),[tt]:e.namespaceURI===Vt}}var ze=new Map;function at(e){var t=e.getAttribute("is")||e.nodeName,a=ze.get(t);if(a)return a;ze.set(t,a=[]);for(var s,n=e,i=Element.prototype;i!==n;){s=Gt(n);for(var r in s)s[r].set&&a.push(r);n=Jt(n)}return a}function Va(e,t,a=t){var s=new WeakSet;pe(e,"input",async n=>{var i=n?e.defaultValue:e.value;if(i=$e(e)?we(i):i,a(i),M!==null&&s.add(M),await Ut(),i!==(i=t())){var r=e.selectionStart,o=e.selectionEnd,f=e.value.length;if(e.value=i??"",o!==null){var c=e.value.length;r===o&&o===f&&c>f?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=r,e.selectionEnd=Math.min(o,c))}}}),(S&&e.defaultValue!==e.value||ce(t)==null&&e.value)&&(a($e(e)?we(e.value):e.value),M!==null&&s.add(M)),Me(()=>{var n=t();if(e===document.activeElement){var i=Qe??M;if(s.has(i))return}$e(e)&&n===we(e.value)||e.type==="date"&&!n&&!e.value||n!==e.value&&(e.value=n??"")})}const Se=new Set;function Ja(e,t,a,s,n=s){var i=a.getAttribute("type")==="checkbox",r=e;let o=!1;if(t!==null)for(var f of t)r=r[f]??=[];r.push(a),pe(a,"change",()=>{var c=a.__value;i&&(c=We(r,c,a.checked)),n(c)},()=>n(i?[]:null)),Me(()=>{var c=s();if(S&&a.defaultChecked!==a.checked){o=!0;return}i?(c=c||[],a.checked=c.includes(a.__value)):a.checked=Ke(a.__value,c)}),Oe(()=>{var c=r.indexOf(a);c!==-1&&r.splice(c,1)}),Se.has(r)||(Se.add(r),oe(()=>{r.sort((c,l)=>c.compareDocumentPosition(l)===4?-1:1),Se.delete(r)})),oe(()=>{if(o){var c;if(i)c=We(r,c,a.checked);else{var l=r.find(v=>v.checked);c=l?.__value}n(c)}})}function Fa(e,t,a=t){pe(e,"change",s=>{var n=s?e.defaultChecked:e.checked;a(n)}),(S&&e.defaultChecked!==e.checked||ce(t)==null)&&a(e.checked),Me(()=>{var s=t();e.checked=!!s})}function We(e,t,a){for(var s=new Set,n=0;n{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1};const Ve=(...e)=>e.filter((t,a,s)=>!!t&&t.trim()!==""&&s.indexOf(t)===a).join(" ").trim();var Ea=Kt("");function J(e,t){const a=j(t,["children","$$slots","$$events","$$legacy"]),s=j(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);qt(t,!1);let n=B(t,"name",8,void 0),i=B(t,"color",8,"currentColor"),r=B(t,"size",8,24),o=B(t,"strokeWidth",8,2),f=B(t,"absoluteStrokeWidth",8,!1),c=B(t,"iconNode",24,()=>[]);sa();var l=Ea();De(l,(m,$,T)=>({...Na,...m,...s,width:r(),height:r(),stroke:i(),"stroke-width":$,class:T}),[()=>ka(s)?void 0:{"aria-hidden":"true"},()=>(F(f()),F(o()),F(r()),ce(()=>f()?Number(o())*24/Number(r()):o())),()=>(F(Ve),F(n()),F(a),ce(()=>Ve("lucide-icon","lucide",n()?`lucide-${n()}`:"",a.class)))]);var v=Qt(l);oa(v,1,c,ra,(m,$)=>{var T=ea(()=>ta(U($),2));let d=()=>U(T)[0],p=()=>U(T)[1];var k=R(),E=H(k);fa(E,d,!0,(b,O)=>{De(b,()=>({...p()}))}),I(m,k)});var u=Xt(v);D(u,t,"default",{}),Zt(l),I(e,l),Yt()}function Ba(e,t){const a=j(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 2v4"}],["path",{d:"m16.2 7.8 2.9-2.9"}],["path",{d:"M18 12h4"}],["path",{d:"m16.2 16.2 2.9 2.9"}],["path",{d:"M12 18v4"}],["path",{d:"m4.9 19.1 2.9-2.9"}],["path",{d:"M2 12h4"}],["path",{d:"m4.9 4.9 2.9 2.9"}]];J(e,V({name:"loader"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=H(r);D(o,t,"default",{}),I(n,r)},$$slots:{default:!0}}))}function Ga(e,t){const a=j(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];J(e,V({name:"plus"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=H(r);D(o,t,"default",{}),I(n,r)},$$slots:{default:!0}}))}class Oa{ws=null;listeners=new Map;url;reconnectAttempts=0;maxReconnectAttempts=5;reconnectTimer=null;_intentionalClose=!1;constructor(t){const a=window.location.protocol==="https:"?"wss:":"ws:";this.url=`${a}//${window.location.host}${t}`}connect(){this._intentionalClose=!1,this.ws=new WebSocket(this.url),this.ws.onopen=()=>{this.reconnectAttempts=0,this.notify("_open",{type:"_open",timestamp:""})},this.ws.onmessage=t=>{try{const a=JSON.parse(t.data);this.notify(a.type,a),this.notify("*",a)}catch{console.warn("[StudioWebSocket] Unparseable frame:",t.data)}},this.ws.onclose=()=>{this.notify("_close",{type:"_close",timestamp:""}),this._intentionalClose||this.attemptReconnect()},this.ws.onerror=()=>{this.notify("_error",{type:"_error",timestamp:""})}}attemptReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){this.notify("_reconnect_failed",{type:"_reconnect_failed",timestamp:""});return}this.reconnectAttempts++;const t=Math.min(1e3*Math.pow(2,this.reconnectAttempts-1),1e4);this.reconnectTimer=setTimeout(()=>{this.connect()},t)}notify(t,a){const s=this.listeners.get(t);if(s)for(const n of s)try{n(a)}catch(i){console.error(`[StudioWebSocket] Listener error for '${t}':`,i)}}on(t,a){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(a),()=>this.listeners.get(t)?.delete(a)}send(t){this.ws?.readyState===WebSocket.OPEN?this.ws.send(JSON.stringify(t)):console.warn("[StudioWebSocket] Cannot send: WebSocket not open")}get connected(){return this.ws?.readyState===WebSocket.OPEN}disconnect(){this._intentionalClose=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws?.close(),this.ws=null}}const P=L([]),ue=L([]);function Ua(){const e=q(P),t=q(ue);return{nodes:e.map(a=>({id:a.id,type:a.type??"pipeline_step",label:a.data?.label??a.id,position:a.position,data:a.data??{},width:a.measured?.width??a.width??null,height:a.measured?.height??a.height??null})),edges:t.map(a=>({id:a.id,source:a.source,target:a.target,source_handle:a.sourceHandle??"output",target_handle:a.targetHandle??"input",label:a.label??null})),metadata:{}}}const st=L(null),qa=aa([P,st],([e,t])=>t?e.find(a=>a.id===t)??null:null),nt=L(new Map);function Ya(e,t){nt.update(a=>{const s=new Map(a);return s.set(e,t),s}),Pa(e,"_executionState",t)}function Ka(){nt.update(e=>{const t=new Map;for(const[a]of e)t.set(a,"idle");return t}),P.update(e=>e.map(t=>({...t,data:{...t.data,_executionState:"idle"}})))}let re=0;function Ae(){const e=q(P);let t=0;for(const a of e){const s=a.id.match(/-(\d+)$/);if(s){const n=parseInt(s[1],10);n>t&&(t=n)}}re=t}function Qa(e,t){re++;const a=`${e}-${re}`,s=q(P),n=q(st);let i=250,r=200;const o=280,f=0;if(n){const l=s.find(v=>v.id===n);l&&(i=l.position.x+o,r=l.position.y+f)}else if(s.length>0){let l=-1/0,v=200;for(const u of s)u.position.x>l&&(l=u.position.x,v=u.position.y);i=l+o,r=v}s.some(l=>Math.abs(l.position.x-i)<20&&Math.abs(l.position.y-r)<20)&&(r+=120),P.update(l=>[...l,{id:a,type:e,position:{x:i,y:r},data:{label:`${t} ${re}`}}])}function Pa(e,t,a){P.update(s=>s.map(n=>n.id===e?{...n,data:{...n.data,[t]:a}}:n))}const rt="/api";async function h(e,t){const a=await fetch(`${rt}${e}`,{headers:{"Content-Type":"application/json"},...t});if(!a.ok){const s=await a.json().catch(()=>({detail:a.statusText}));throw new Error(s.detail||a.statusText)}return a.json()}const Y={health:()=>h("/health"),registry:{agents:()=>h("/registry/agents"),tools:()=>h("/registry/tools"),patterns:()=>h("/registry/patterns")},projects:{list:()=>h("/projects"),create:(e,t)=>h("/projects",{method:"POST",body:JSON.stringify({name:e,description:t})}),delete:e=>h(`/projects/${e}`,{method:"DELETE"}),savePipeline:(e,t,a)=>h(`/projects/${e}/pipelines/${t}`,{method:"POST",body:JSON.stringify({graph:a})}),loadPipeline:(e,t)=>h(`/projects/${e}/pipelines/${t}`),getHistory:e=>h(`/projects/${e}/history`),restoreVersion:(e,t)=>h(`/projects/${e}/restore`,{method:"POST",body:JSON.stringify({commit_sha:t})}),bookmarkVersion:(e,t,a)=>h(`/projects/${e}/bookmark`,{method:"POST",body:JSON.stringify({commit_sha:t,label:a})})},files:{list:e=>h(`/projects/${e}/files`),read:(e,t)=>h(`/projects/${e}/files/${t}`)},evaluate:{uploadDataset:(e,t)=>{const a=new FormData;return a.append("file",t),fetch(`${rt}/projects/${e}/datasets/upload`,{method:"POST",body:a}).then(async s=>{if(!s.ok){const n=await s.json().catch(()=>({detail:s.statusText}));throw new Error(n.detail||s.statusText)}return s.json()})},listDatasets:e=>h(`/projects/${e}/datasets`),run:(e,t,a)=>h("/evaluate/run",{method:"POST",body:JSON.stringify({project:e,dataset:t,graph:a})})},experiments:{list:e=>h(`/projects/${e}/experiments`),create:(e,t,a)=>h(`/projects/${e}/experiments`,{method:"POST",body:JSON.stringify({name:t,variants:a})}),get:(e,t)=>h(`/projects/${e}/experiments/${t}`),delete:(e,t)=>h(`/projects/${e}/experiments/${t}`,{method:"DELETE"}),runVariant:(e,t,a,s,n)=>h(`/projects/${e}/experiments/${t}/run`,{method:"POST",body:JSON.stringify({variant_name:a,graph:s,input:n??""})})},codegen:{toCode:e=>h("/codegen/to-code",{method:"POST",body:JSON.stringify({graph:e})})},monitoring:{usage:()=>h("/monitoring/usage")},checkpoints:{list:()=>h("/checkpoints"),get:e=>h(`/checkpoints/${e}`),fork:(e,t)=>h("/checkpoints/fork",{method:"POST",body:JSON.stringify({from_index:e,modified_state:t})}),rewind:e=>h(`/checkpoints/${e}/rewind`,{method:"POST"}),diff:(e,t)=>h("/checkpoints/diff",{method:"POST",body:JSON.stringify({index_a:e,index_b:t})}),clear:()=>h("/checkpoints",{method:"DELETE"})},settings:{get:()=>h("/settings"),save:e=>h("/settings",{method:"POST",body:JSON.stringify(e)}),status:()=>h("/settings/status")},assistant:{getHistory:e=>h(`/assistant/${e}/history`),saveHistory:(e,t)=>h(`/assistant/${e}/history`,{method:"POST",body:JSON.stringify({messages:t})}),inferProjectName:e=>h("/assistant/infer-project-name",{method:"POST",body:JSON.stringify({message:e})})},oracle:{getInsights:e=>h(`/oracle/${e}/insights`),approveInsight:(e,t)=>h(`/oracle/${e}/insights/${t}/approve`,{method:"POST"}),skipInsight:(e,t)=>h(`/oracle/${e}/insights/${t}/skip`,{method:"POST"})},tunnel:{status:()=>h("/tunnel/status"),start:()=>h("/tunnel/start",{method:"POST"}),stop:()=>h("/tunnel/stop",{method:"POST"})},runtime:{start:e=>h(`/projects/${e}/runtime/start`,{method:"POST"}),stop:e=>h(`/projects/${e}/runtime/stop`,{method:"POST"}),status:e=>h(`/projects/${e}/runtime/status`),executions:e=>h(`/projects/${e}/runtime/executions`)},customTools:{list:()=>h("/custom-tools"),get:e=>h(`/custom-tools/${e}`),save:e=>h("/custom-tools",{method:"POST",body:JSON.stringify(e)}),delete:e=>h(`/custom-tools/${e}`,{method:"DELETE"}),register:e=>h(`/custom-tools/${e}/register`,{method:"POST"}),test:e=>h(`/custom-tools/${e}/test`,{method:"POST"}),catalog:()=>h("/custom-tools/catalog"),installConnector:(e,t)=>h(`/custom-tools/catalog/${e}/install`,{method:"POST",body:JSON.stringify(t??{})}),verifyConnector:e=>h(`/custom-tools/catalog/${e}/verify`,{method:"POST"})}},ve=L([]),Ne=L(!1),he=L(!1);let A=null;function Ma(e){it(),A=new Oa(`/ws/oracle?project=${encodeURIComponent(e)}`),A.on("_open",()=>{Ne.set(!0)}),A.on("_close",()=>{Ne.set(!1)}),A.on("insight",t=>{const a=t;ve.update(s=>[a,...s])}),A.on("analysis_complete",()=>{he.set(!1)}),A.on("error",()=>{he.set(!1)}),A.on("canvas_synced",()=>{}),A.connect()}function it(){A&&(A.disconnect(),A=null),Ne.set(!1),he.set(!1)}function Xa(e,t){A?.connected&&A.send({action:"sync_canvas",nodes:e,edges:t})}function Za(){A?.connected&&(he.set(!0),A.send({action:"analyze"}))}async function es(e,t){const a=await Y.oracle.approveInsight(e,t);return ve.update(s=>s.map(n=>n.id===t?{...n,status:"approved"}:n)),a.action_instruction??null}async function ts(e,t){await Y.oracle.skipInsight(e,t),ve.update(a=>a.map(s=>s.id===t?{...s,status:"skipped"}:s))}async function Ca(e){const t=await Y.oracle.getInsights(e);ve.set(t)}const Ia=[{id:"blank",name:"Blank",description:"Start with an empty canvas",nodes:[],edges:[]},{id:"simple-qa",name:"Simple Q&A Agent",description:"A single agent with a tool — the simplest working pipeline",nodes:[{id:"agent-1",type:"agent",position:{x:200,y:200},data:{label:"Q&A Agent",model:"openai:gpt-4.1",instructions:"You are a helpful assistant. Answer the user's questions clearly and concisely.",description:"Main Q&A agent"}},{id:"tool-1",type:"tool",position:{x:500,y:200},data:{label:"Web Search",description:"Search the web for relevant information"}}],edges:[{id:"edge-1",source:"agent-1",target:"tool-1",animated:!0}]},{id:"reasoning-pipeline",name:"Reasoning Pipeline",description:"Multi-step pipeline with reasoning, branching, and validation",nodes:[{id:"agent-1",type:"agent",position:{x:100,y:200},data:{label:"Input Agent",model:"openai:gpt-4.1",instructions:"Analyze the user input and prepare it for reasoning.",description:"Receives and preprocesses user input"}},{id:"reasoning-1",type:"reasoning",position:{x:350,y:200},data:{label:"Chain of Thought",pattern:"chain_of_thought",maxSteps:5}},{id:"condition-1",type:"condition",position:{x:600,y:200},data:{label:"Quality Check",condition:"result.confidence > 0.8"}},{id:"agent-2",type:"agent",position:{x:850,y:150},data:{label:"Output Agent",model:"openai:gpt-4.1-mini",instructions:"Format and present the final answer to the user.",description:"Formats final response"}},{id:"agent-3",type:"agent",position:{x:850,y:300},data:{label:"Retry Agent",model:"openai:gpt-4.1",instructions:"The previous reasoning was not confident enough. Try again with more detail.",description:"Retries with more detail"}}],edges:[{id:"edge-1",source:"agent-1",target:"reasoning-1",animated:!0},{id:"edge-2",source:"reasoning-1",target:"condition-1",animated:!0},{id:"edge-3",source:"condition-1",target:"agent-2",animated:!0},{id:"edge-4",source:"condition-1",target:"agent-3",animated:!0}]}],ot="fireflyStudio:selectedProject",ja=L(null),ke=L([]);async function lt(e){ja.set(e);try{localStorage.setItem(ot,e.name)}catch{}try{const t=await Y.projects.loadPipeline(e.name,"main");if(t&&typeof t=="object"){const a=t;a.nodes&&P.set(a.nodes),a.edges&&ue.set(a.edges),Ae()}}catch{P.set([]),ue.set([]),Ae()}it(),Ma(e.name),Ca(e.name).catch(()=>{})}async function as(e){const t=await Y.projects.create(e);await La();const s=q(ke).find(n=>n.name===e);return s&<(s),t}async function La(){try{let e=await Y.projects.list();if(e.length===0){ke.set([]);return}ke.set(e);let t;try{const a=localStorage.getItem(ot);a&&(t=e.find(s=>s.name===a))}catch{}lt(t??e[0])}catch(e){console.warn("[studio] Failed to initialise projects:",e)}}function ss(e,t){const a=Ia.find(n=>n.id===e);if(!a)return;const s=a.nodes;P.set(s),ue.set(a.edges),Ae()}function ns(e,t){const a=j(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2"}],["rect",{x:"14",y:"2",width:"8",height:"8",rx:"1"}]];J(e,V({name:"blocks"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=H(r);D(o,t,"default",{}),I(n,r)},$$slots:{default:!0}}))}function rs(e,t){const a=j(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 18V5"}],["path",{d:"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4"}],["path",{d:"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5"}],["path",{d:"M17.997 5.125a4 4 0 0 1 2.526 5.77"}],["path",{d:"M18 18a4 4 0 0 0 2-7.464"}],["path",{d:"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517"}],["path",{d:"M6 18a4 4 0 0 1-2-7.464"}],["path",{d:"M6.003 5.125a4 4 0 0 0-2.526 5.77"}]];J(e,V({name:"brain"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=H(r);D(o,t,"default",{}),I(n,r)},$$slots:{default:!0}}))}function is(e,t){const a=j(t,["children","$$slots","$$events","$$legacy"]);const s=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5"}],["path",{d:"M3 12A9 3 0 0 0 21 12"}]];J(e,V({name:"database"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=H(r);D(o,t,"default",{}),I(n,r)},$$slots:{default:!0}}))}function os(e,t){const a=j(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];J(e,V({name:"x"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=H(r);D(o,t,"default",{}),I(n,r)},$$slots:{default:!0}}))}function ls(e,t){const a=j(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}],["path",{d:"M10 9H8"}],["path",{d:"M16 13H8"}],["path",{d:"M16 17H8"}]];J(e,V({name:"file-text"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=H(r);D(o,t,"default",{}),I(n,r)},$$slots:{default:!0}}))}export{Ae as A,rs as B,st as C,is as D,De as E,ls as F,Q as G,X as H,J as I,ha as J,za as K,Ba as L,Pa as M,qa as N,Fa as O,Ga as P,Ja as Q,ve as R,Oa as S,Ne as T,he as U,es as V,ts as W,os as X,ga as a,Va as b,Y as c,as as d,oa as e,Ia as f,ns as g,de as h,lt as i,Ya as j,Ka as k,ss as l,wa as m,Wa as n,ma as o,ke as p,ra as q,Za as r,D as s,ja as t,Ua as u,P as v,La as w,Qa as x,Xa as y,ue as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/BB2KRr3j.js b/studio-desktop/frontend-dist/_app/immutable/chunks/BB2KRr3j.js deleted file mode 100644 index bd32d600..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/BB2KRr3j.js +++ /dev/null @@ -1 +0,0 @@ -import{R as O,T as $,U as w,V as C,W as E,X as I,h as P,j as H,Y as Z,Z as q,e as z,d as G,E as V,r as W,H as X,_ as J,s as Q,g as k,i as D,$ as N,a0 as ee,a1 as se,a2 as re,y as b,a3 as ne,a4 as te,N as L,a5 as g,a6 as ie,a7 as Y,a8 as ae,a9 as R,aa as ue,ab as fe,ac as oe,u as ce,ad as le,ae as de,af as pe,A as _e,ag as he,ah as y,ai as M,aj as h,S as B,ak as U,al as ve,am as be}from"./BNectIeB.js";class me{anchor;#s=new Map;#r=new Map;#e=new Map;#n=new Set;#t=!0;constructor(e,n=!0){this.anchor=e,this.#t=n}#i=()=>{var e=O;if(this.#s.has(e)){var n=this.#s.get(e),r=this.#r.get(n);if(r)$(r),this.#n.delete(n);else{var t=this.#e.get(n);t&&(this.#r.set(n,t.effect),this.#e.delete(n),t.fragment.lastChild.remove(),this.anchor.before(t.fragment),r=t.effect)}for(const[i,u]of this.#s){if(this.#s.delete(i),i===e)break;const a=this.#e.get(u);a&&(w(a.effect),this.#e.delete(u))}for(const[i,u]of this.#r){if(i===n||this.#n.has(i))continue;const a=()=>{if(Array.from(this.#s.values()).includes(i)){var c=document.createDocumentFragment();Z(u,c),c.append(E()),this.#e.set(i,{effect:u,fragment:c})}else w(u);this.#n.delete(i),this.#r.delete(i)};this.#t||!r?(this.#n.add(i),C(u,a,!1)):a()}}};#a=e=>{this.#s.delete(e);const n=Array.from(this.#s.values());for(const[r,t]of this.#e)n.includes(r)||(w(t.effect),this.#e.delete(r))};ensure(e,n){var r=O,t=q();if(n&&!this.#r.has(e)&&!this.#e.has(e))if(t){var i=document.createDocumentFragment(),u=E();i.append(u),this.#e.set(e,{effect:I(()=>n(u)),fragment:i})}else this.#r.set(e,I(()=>n(this.anchor)));if(this.#s.set(r,e),t){for(const[a,f]of this.#r)a===e?r.unskip_effect(f):r.skip_effect(f);for(const[a,f]of this.#e)a===e?r.unskip_effect(f.effect):r.skip_effect(f.effect);r.oncommit(this.#i),r.ondiscard(this.#a)}else P&&(this.anchor=H),this.#i()}}function Te(s,e,n=!1){P&&G();var r=new me(s),t=n?V:0;function i(u,a){if(P){const l=W(s);var f;if(l===X?f=0:l===J?f=!1:f=parseInt(l.substring(1)),u!==f){var c=Q();k(c),r.anchor=c,D(!1),r.ensure(u,a),D(!0);return}}r.ensure(u,a)}z(()=>{var u=!1;e((a,f=0)=>{u=!0,i(f,a)}),u||i(!1,null)},t)}let v=!1,x=Symbol();function Ae(s,e,n){const r=n[e]??={store:null,source:ee(void 0),unsubscribe:N};if(r.store!==s&&!(x in n))if(r.unsubscribe(),r.store=s??null,s==null)r.source.v=void 0,r.unsubscribe=N;else{var t=!0;r.unsubscribe=se(s,i=>{t?r.source.v=i:L(r.source,i)}),t=!1}return s&&x in n?re(s):b(r.source)}function Oe(s,e){return s.set(e),e}function Ee(){const s={};function e(){ne(()=>{for(var n in s)s[n].unsubscribe();te(s,x,{enumerable:!1,value:!0})})}return[s,e]}function Ie(){v=!0}function Se(s){var e=v;try{return v=!1,[s(),v]}finally{v=e}}const we={get(s,e){if(!s.exclude.includes(e))return s.props[e]},set(s,e){return!1},getOwnPropertyDescriptor(s,e){if(!s.exclude.includes(e)&&e in s.props)return{enumerable:!0,configurable:!0,value:s.props[e]}},has(s,e){return s.exclude.includes(e)?!1:e in s.props},ownKeys(s){return Reflect.ownKeys(s.props).filter(e=>!s.exclude.includes(e))}};function De(s,e,n){return new Proxy({props:s,exclude:e},we)}const Pe={get(s,e){if(!s.exclude.includes(e))return b(s.version),e in s.special?s.special[e]():s.props[e]},set(s,e,n){if(!(e in s.special)){var r=R;try{M(s.parent_effect),s.special[e]=xe({get[e](){return s.props[e]}},e,Y)}finally{M(r)}}return s.special[e](n),y(s.version),!0},getOwnPropertyDescriptor(s,e){if(!s.exclude.includes(e)&&e in s.props)return{enumerable:!0,configurable:!0,value:s.props[e]}},deleteProperty(s,e){return s.exclude.includes(e)||(s.exclude.push(e),y(s.version)),!0},has(s,e){return s.exclude.includes(e)?!1:e in s.props},ownKeys(s){return Reflect.ownKeys(s.props).filter(e=>!s.exclude.includes(e))}};function Ne(s,e){return new Proxy({props:s,exclude:e,special:{},version:fe(0),parent_effect:R},Pe)}const ge={get(s,e){let n=s.props.length;for(;n--;){let r=s.props[n];if(h(r)&&(r=r()),typeof r=="object"&&r!==null&&e in r)return r[e]}},set(s,e,n){let r=s.props.length;for(;r--;){let t=s.props[r];h(t)&&(t=t());const i=g(t,e);if(i&&i.set)return i.set(n),!0}return!1},getOwnPropertyDescriptor(s,e){let n=s.props.length;for(;n--;){let r=s.props[n];if(h(r)&&(r=r()),typeof r=="object"&&r!==null&&e in r){const t=g(r,e);return t&&!t.configurable&&(t.configurable=!0),t}}},has(s,e){if(e===B||e===U)return!1;for(let n of s.props)if(h(n)&&(n=n()),n!=null&&e in n)return!0;return!1},ownKeys(s){const e=[];for(let n of s.props)if(h(n)&&(n=n()),!!n){for(const r in n)e.includes(r)||e.push(r);for(const r of Object.getOwnPropertySymbols(n))e.includes(r)||e.push(r)}return e}};function ye(...s){return new Proxy({props:s},ge)}function xe(s,e,n,r){var t=!le||(n&de)!==0,i=(n&oe)!==0,u=(n&ve)!==0,a=r,f=!0,c=()=>(f&&(f=!1,a=u?ce(r):r),a),l;if(i){var j=B in s||U in s;l=g(s,e)?.set??(j&&e in s?o=>s[e]=o:void 0)}var p,T=!1;i?[p,T]=Se(()=>s[e]):p=s[e],p===void 0&&r!==void 0&&(p=c(),l&&(t&&ie(),l(p)));var d;if(t?d=()=>{var o=s[e];return o===void 0?c():(f=!0,o)}:d=()=>{var o=s[e];return o!==void 0&&(a=void 0),o===void 0?a:o},t&&(n&Y)===0)return d;if(l){var K=s.$$legacy;return(function(o,m){return arguments.length>0?((!t||!m||K||T)&&l(m?d():o),o):d()})}var S=!1,_=((n&pe)!==0?_e:he)(()=>(S=!1,d()));i&&b(_);var F=R;return(function(o,m){if(arguments.length>0){const A=m?b(_):t&&i?ae(o):o;return L(_,A),S=!0,a!==void 0&&(a=A),o}return be&&S||(F.f&ue)!==0?_.v:b(_)})}export{me as B,Ee as a,Ae as b,Oe as c,Te as i,Ne as l,Ie as m,xe as p,De as r,ye as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/BCCFcAOv.js b/studio-desktop/frontend-dist/_app/immutable/chunks/BCCFcAOv.js deleted file mode 100644 index 6caae12d..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/BCCFcAOv.js +++ /dev/null @@ -1 +0,0 @@ -import{w as s}from"./DCyBifBO.js";const a=s(!0),e=s(!1),n=s("console"),o=s(!0),c=s(!1),l=s(!1),r=s(!1),p=s(!1),i=s(null);export{e as a,n as b,o as c,c as d,l as e,p as f,i as p,a as r,r as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/BESIXtBI.js b/studio-desktop/frontend-dist/_app/immutable/chunks/BESIXtBI.js deleted file mode 100644 index 30ad3545..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/BESIXtBI.js +++ /dev/null @@ -1,2 +0,0 @@ -var Nn=Array.isArray,On=Array.prototype.indexOf,me=Array.prototype.includes,Rn=Array.from,kn=Object.defineProperty,Ne=Object.getOwnPropertyDescriptor,Mn=Object.getOwnPropertyDescriptors,Dn=Object.prototype,Cn=Array.prototype,Rt=Object.getPrototypeOf,bt=Object.isExtensible;function Wr(e){return typeof e=="function"}const de=()=>{};function $r(e){return e()}function kt(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function Gr(e,t,n=!1){return e===void 0?n?t():t:e}function Kr(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}function Xr(e,t){var n={};for(var r in e)t.includes(r)||(n[r]=e[r]);for(var s of Object.getOwnPropertySymbols(e))Object.propertyIsEnumerable.call(e,s)&&!t.includes(s)&&(n[s]=e[s]);return n}const S=2,De=4,Ce=8,ot=1<<24,Z=16,$=32,le=64,Je=128,C=512,T=1024,x=2048,Y=4096,z=8192,re=16384,fe=32768,ke=65536,yt=1<<17,Dt=1<<18,be=1<<19,Ct=1<<20,Zr=1<<25,pe=65536,Qe=1<<21,ut=1<<22,se=1<<23,he=Symbol("$state"),Jr=Symbol("legacy props"),Qr=Symbol(""),ue=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},ts=!!globalThis.document?.contentType&&globalThis.document.contentType.includes("xml"),ns=1,Ie=3,We=8;function ct(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function In(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function rs(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Pn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Ln(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Fn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function jn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Vn(){throw new Error("https://svelte.dev/e/hydration_failed")}function ss(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Hn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function qn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Yn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Bn(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const is=1,as=2,fs=4,ls=8,os=16,us=1,cs=2,_s=4,ds=8,hs=16,vs=4,It=1,zn=2,Pt="[",Lt="[!",wt="[?",Ft="]",Ee={},A=Symbol(),Un="http://www.w3.org/1999/xhtml",ps="http://www.w3.org/2000/svg",gs="http://www.w3.org/1998/Math/MathML",bs="@attach";function $e(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function ys(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Wn(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let E=!1;function He(e){E=e}let b;function B(e){if(e===null)throw $e(),Ee;return b=e}function jt(){return B(J(b))}function ws(e){if(E){if(J(b)!==null)throw $e(),Ee;b=e}}function $n(e=1){if(E){for(var t=e,n=b;t--;)n=J(n);b=n}}function Gn(e=!0){for(var t=0,n=b;;){if(n.nodeType===We){var r=n.data;if(r===Ft){if(t===0)return n;t-=1}else(r===Pt||r===Lt||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=J(n);e&&n.remove(),n=s}}function ms(e){if(!e||e.nodeType!==We)throw $e(),Ee;return e.data}function Vt(e){return e===this.v}function Ht(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function qt(e){return!Ht(e,this.v)}let Pe=!1;function Es(){Pe=!0}let y=null;function Te(e){y=e}function Kn(e){return _t().get(e)}function Xn(e,t){return _t().set(e,t),t}function Zn(e){return _t().has(e)}function Jn(e,t=!1,n){y={p:y,i:!1,c:null,e:null,s:e,x:null,l:Pe&&!t?{s:null,u:null,$:[]}:null}}function Qn(e){var t=y,n=t.e;if(n!==null){t.e=null;for(var r of n)ln(r)}return t.i=!0,y=t.p,{}}function Le(){return!Pe||y!==null&&y.l===null}function _t(e){return y===null&&ct(),y.c??=new Map(er(y)||void 0)}function er(e){let t=e.p;for(;t!==null;){const n=t.c;if(n!==null)return n;t=t.p}return null}let ce=[];function Yt(){var e=ce;ce=[],kt(e)}function ie(e){if(ce.length===0&&!Oe){var t=ce;queueMicrotask(()=>{t===ce&&Yt()})}ce.push(e)}function tr(){for(;ce.length>0;)Yt()}function Bt(e){var t=v;if(t===null)return h.f|=se,e;if((t.f&fe)===0&&(t.f&De)===0)throw e;te(e,t)}function te(e,t){for(;t!==null;){if((t.f&Je)!==0){if((t.f&fe)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const nr=-7169;function m(e,t){e.f=e.f&nr|t}function dt(e){(e.f&C)!==0||e.deps===null?m(e,T):m(e,Y)}function zt(e){if(e!==null)for(const t of e)(t.f&S)===0||(t.f&pe)===0||(t.f^=pe,zt(t.deps))}function Ut(e,t,n){(e.f&x)!==0?t.add(e):(e.f&Y)!==0&&n.add(e),zt(e.deps),m(e,T)}const qe=new Set;let w=null,mt=null,F=null,O=[],Ge=null,et=!1,Oe=!1;class U{current=new Map;previous=new Map;#n=new Set;#u=new Set;#s=0;#f=0;#r=null;#i=new Set;#e=new Set;#t=new Map;is_fork=!1;#a=!1;#o(){return this.is_fork||this.#f>0}skip_effect(t){this.#t.has(t)||this.#t.set(t,{d:[],m:[]})}unskip_effect(t){var n=this.#t.get(t);if(n){this.#t.delete(t);for(var r of n.d)m(r,x),j(r);for(r of n.m)m(r,Y),j(r)}}process(t){O=[],this.apply();var n=[],r=[];for(const s of t)this.#l(s,n,r);if(this.#o()){this.#c(r),this.#c(n);for(const[s,i]of this.#t)Xt(s,i)}else{for(const s of this.#n)s();this.#n.clear(),this.#s===0&&this.#d(),mt=this,w=null,Et(r),Et(n),mt=null,this.#r?.resolve()}F=null}#l(t,n,r){t.f^=T;for(var s=t.first;s!==null;){var i=s.f,f=(i&($|le))!==0,o=f&&(i&T)!==0,a=o||(i&z)!==0||this.#t.has(s);if(!a&&s.fn!==null){f?s.f^=T:(i&De)!==0?n.push(s):je(s)&&((i&Z)!==0&&this.#e.add(s),Ae(s));var l=s.first;if(l!==null){s=l;continue}}for(;s!==null;){var c=s.next;if(c!==null){s=c;break}s=s.parent}}}#c(t){for(var n=0;n0){if($t(),w!==null&&w!==this)return}else this.#s===0&&this.process([]);this.deactivate()}discard(){for(const t of this.#u)t(this);this.#u.clear()}#d(){if(qe.size>1){this.previous.clear();var t=F,n=!0;for(const s of qe){if(s===this){n=!1;continue}const i=[];for(const[o,a]of this.current){if(s.current.has(o))if(n&&a!==s.current.get(o))s.current.set(o,a);else continue;i.push(o)}if(i.length===0)continue;const f=[...s.current.keys()].filter(o=>!this.current.has(o));if(f.length>0){var r=O;O=[];const o=new Set,a=new Map;for(const l of i)Gt(l,f,o,a);if(O.length>0){w=s,s.apply();for(const l of O)s.#l(l,[],[]);s.deactivate()}O=r}}w=null,F=t}qe.delete(this)}increment(t){this.#s+=1,t&&(this.#f+=1)}decrement(t){this.#s-=1,t&&(this.#f-=1),!this.#a&&(this.#a=!0,ie(()=>{this.#a=!1,this.#o()?O.length>0&&this.flush():this.revive()}))}revive(){for(const t of this.#i)this.#e.delete(t),m(t,x),j(t);for(const t of this.#e)m(t,Y),j(t);this.flush()}oncommit(t){this.#n.add(t)}ondiscard(t){this.#u.add(t)}settled(){return(this.#r??=Mt()).promise}static ensure(){if(w===null){const t=w=new U;qe.add(w),Oe||ie(()=>{w===t&&t.flush()})}return w}apply(){}}function Wt(e){var t=Oe;Oe=!0;try{for(var n;;){if(tr(),O.length===0&&(w?.flush(),O.length===0))return Ge=null,n;$t()}}finally{Oe=t}}function $t(){et=!0;var e=null;try{for(var t=0;O.length>0;){var n=U.ensure();if(t++>1e3){var r,s;rr()}n.process(O),ae.clear()}}finally{O=[],et=!1,Ge=null}}function rr(){try{jn()}catch(e){te(e,Ge)}}let K=null;function Et(e){var t=e.length;if(t!==0){for(var n=0;n0)){ae.clear();for(const s of K){if((s.f&(re|z))!==0)continue;const i=[s];let f=s.parent;for(;f!==null;)K.has(f)&&(K.delete(f),i.push(f)),f=f.parent;for(let o=i.length-1;o>=0;o--){const a=i[o];(a.f&(re|z))===0&&Ae(a)}}K.clear()}}K=null}}function Gt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const i=s.f;(i&S)!==0?Gt(s,t,n,r):(i&(ut|Z))!==0&&(i&x)===0&&Kt(s,t,r)&&(m(s,x),j(s))}}function Kt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(me.call(t,s))return!0;if((s.f&S)!==0&&Kt(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function j(e){var t=Ge=e,n=t.b;if(n?.is_pending&&(e.f&(De|Ce|ot))!==0&&(e.f&fe)===0){n.defer_effect(e);return}for(;t.parent!==null;){t=t.parent;var r=t.f;if(et&&t===v&&(r&Z)!==0&&(r&Dt)===0&&(r&fe)!==0)return;if((r&(le|$))!==0){if((r&T)===0)return;t.f^=T}}O.push(t)}function Xt(e,t){if(!((e.f&$)!==0&&(e.f&T)!==0)){(e.f&x)!==0?t.d.push(e):(e.f&Y)!==0&&t.m.push(e),m(e,T);for(var n=e.first;n!==null;)Xt(n,t),n=n.next}}function sr(e){let t=0,n=Fe(0),r;return()=>{pt()&&(ne(n),Tr(()=>(t===0&&(r=Ve(()=>e(()=>Re(n)))),t+=1,()=>{ie(()=>{t-=1,t===0&&(r?.(),r=void 0,Re(n))})})))}}var ir=ke|be;function ar(e,t,n,r){new fr(e,t,n,r)}class fr{parent;is_pending=!1;transform_error;#n;#u=E?b:null;#s;#f;#r;#i=null;#e=null;#t=null;#a=null;#o=0;#l=0;#c=!1;#d=new Set;#h=new Set;#_=null;#y=sr(()=>(this.#_=Fe(this.#o),()=>{this.#_=null}));constructor(t,n,r,s){this.#n=t,this.#s=n,this.#f=i=>{var f=v;f.b=this,f.f|=Je,r(i)},this.parent=v.b,this.transform_error=s??this.parent?.transform_error??(i=>i),this.#r=Ar(()=>{if(E){const i=this.#u;jt();const f=i.data===Lt;if(i.data.startsWith(wt)){const a=JSON.parse(i.data.slice(wt.length));this.#m(a)}else f?this.#E():this.#w()}else this.#g()},ir),E&&(this.#n=b)}#w(){try{this.#i=oe(()=>this.#f(this.#n))}catch(t){this.error(t)}}#m(t){const n=this.#s.failed;n&&(this.#t=oe(()=>{n(this.#n,()=>t,()=>()=>{})}))}#E(){const t=this.#s.pending;t&&(this.is_pending=!0,this.#e=oe(()=>t(this.#n)),ie(()=>{var n=this.#a=document.createDocumentFragment(),r=X();n.append(r),this.#i=this.#p(()=>(U.ensure(),oe(()=>this.#f(r)))),this.#l===0&&(this.#n.before(n),this.#a=null,Be(this.#e,()=>{this.#e=null}),this.#v())}))}#g(){try{if(this.is_pending=this.has_pending_snippet(),this.#l=0,this.#o=0,this.#i=oe(()=>{this.#f(this.#n)}),this.#l>0){var t=this.#a=document.createDocumentFragment();Nr(this.#i,t);const n=this.#s.pending;this.#e=oe(()=>n(this.#n))}else this.#v()}catch(n){this.error(n)}}#v(){this.is_pending=!1;for(const t of this.#d)m(t,x),j(t);for(const t of this.#h)m(t,Y),j(t);this.#d.clear(),this.#h.clear()}defer_effect(t){Ut(t,this.#d,this.#h)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#s.pending}#p(t){var n=v,r=h,s=y;W(this.#r),P(this.#r),Te(this.#r.ctx);try{return t()}catch(i){return Bt(i),null}finally{W(n),P(r),Te(s)}}#b(t){if(!this.has_pending_snippet()){this.parent&&this.parent.#b(t);return}this.#l+=t,this.#l===0&&(this.#v(),this.#e&&Be(this.#e,()=>{this.#e=null}),this.#a&&(this.#n.before(this.#a),this.#a=null))}update_pending_count(t){this.#b(t),this.#o+=t,!(!this.#_||this.#c)&&(this.#c=!0,ie(()=>{this.#c=!1,this.#_&&Ue(this.#_,this.#o)}))}get_effect_pending(){return this.#y(),ne(this.#_)}error(t){var n=this.#s.onerror;let r=this.#s.failed;if(!n&&!r)throw t;this.#i&&(H(this.#i),this.#i=null),this.#e&&(H(this.#e),this.#e=null),this.#t&&(H(this.#t),this.#t=null),E&&(B(this.#u),$n(),B(Gn()));var s=!1,i=!1;const f=()=>{if(s){Wn();return}s=!0,i&&Bn(),this.#t!==null&&Be(this.#t,()=>{this.#t=null}),this.#p(()=>{U.ensure(),this.#g()})},o=a=>{try{i=!0,n?.(a,f),i=!1}catch(l){te(l,this.#r&&this.#r.parent)}r&&(this.#t=this.#p(()=>{U.ensure();try{return oe(()=>{var l=v;l.b=this,l.f|=Je,r(this.#n,()=>a,()=>f)})}catch(l){return te(l,this.#r.parent),null}}))};ie(()=>{var a;try{a=this.transform_error(t)}catch(l){te(l,this.#r&&this.#r.parent);return}a!==null&&typeof a=="object"&&typeof a.then=="function"?a.then(o,l=>te(l,this.#r&&this.#r.parent)):o(a)})}}function lr(e,t,n,r){const s=Le()?ht:_r;var i=e.filter(u=>!u.settled);if(n.length===0&&i.length===0){r(t.map(s));return}var f=v,o=or(),a=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(u=>u.promise)):null;function l(u){o();try{r(u)}catch(_){(f.f&re)===0&&te(_,f)}tt()}if(n.length===0){a.then(()=>l(t.map(s)));return}function c(){o(),Promise.all(n.map(u=>cr(u))).then(u=>l([...t.map(s),...u])).catch(u=>te(u,f))}a?a.then(c):c()}function or(){var e=v,t=h,n=y,r=w;return function(i=!0){W(e),P(t),Te(n),i&&r?.activate()}}function tt(e=!0){W(null),P(null),Te(null),e&&w?.deactivate()}function ur(){var e=v.b,t=w,n=e.is_rendered();return e.update_pending_count(1),t.increment(n),()=>{e.update_pending_count(-1),t.decrement(n)}}function ht(e){var t=S|x,n=h!==null&&(h.f&S)!==0?h:null;return v!==null&&(v.f|=be),{ctx:y,deps:null,effects:null,equals:Vt,f:t,fn:e,reactions:null,rv:0,v:A,wv:0,parent:n??v,ac:null}}function cr(e,t,n){v===null&&In();var s=void 0,i=Fe(A),f=!h,o=new Map;return Er(()=>{var a=Mt();s=a.promise;try{Promise.resolve(e()).then(a.resolve,a.reject).finally(tt)}catch(_){a.reject(_),tt()}var l=w;if(f){var c=ur();o.get(l)?.reject(ue),o.delete(l),o.set(l,a)}const u=(_,p=void 0)=>{if(l.activate(),p)p!==ue&&(i.f|=se,Ue(i,p));else{(i.f&se)!==0&&(i.f^=se),Ue(i,_);for(const[d,g]of o){if(o.delete(d),d===l)break;g.reject(ue)}}c&&c()};a.promise.then(u,_=>u(null,_||"unknown"))}),fn(()=>{for(const a of o.values())a.reject(ue)}),new Promise(a=>{function l(c){function u(){c===s?a(i):l(s)}c.then(u,u)}l(s)})}function Ts(e){const t=ht(e);return dn(t),t}function _r(e){const t=ht(e);return t.equals=qt,t}function dr(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Qt&&pr()}return t}function pr(){Qt=!1;for(const e of nt)(e.f&T)!==0&&m(e,Y),je(e)&&Ae(e);nt.clear()}function Ss(e,t=1){var n=ne(e),r=t===1?n++:n--;return ee(e,n),r}function Re(e){ee(e,e.v+1)}function en(e,t){var n=e.reactions;if(n!==null)for(var r=Le(),s=n.length,i=0;i{if(ve===i)return o();var a=h,l=ve;P(null),Nt(i);var c=o();return P(a),Nt(l),c};return r&&n.set("length",Q(e.length)),new Proxy(e,{defineProperty(o,a,l){(!("value"in l)||l.configurable===!1||l.enumerable===!1||l.writable===!1)&&Hn();var c=n.get(a);return c===void 0?f(()=>{var u=Q(l.value);return n.set(a,u),u}):ee(c,l.value,!0),!0},deleteProperty(o,a){var l=n.get(a);if(l===void 0){if(a in o){const c=f(()=>Q(A));n.set(a,c),Re(s)}}else ee(l,A),Re(s);return!0},get(o,a,l){if(a===he)return e;var c=n.get(a),u=a in o;if(c===void 0&&(!u||Ne(o,a)?.writable)&&(c=f(()=>{var p=Se(u?o[a]:A),d=Q(p);return d}),n.set(a,c)),c!==void 0){var _=ne(c);return _===A?void 0:_}return Reflect.get(o,a,l)},getOwnPropertyDescriptor(o,a){var l=Reflect.getOwnPropertyDescriptor(o,a);if(l&&"value"in l){var c=n.get(a);c&&(l.value=ne(c))}else if(l===void 0){var u=n.get(a),_=u?.v;if(u!==void 0&&_!==A)return{enumerable:!0,configurable:!0,value:_,writable:!0}}return l},has(o,a){if(a===he)return!0;var l=n.get(a),c=l!==void 0&&l.v!==A||Reflect.has(o,a);if(l!==void 0||v!==null&&(!c||Ne(o,a)?.writable)){l===void 0&&(l=f(()=>{var _=c?Se(o[a]):A,p=Q(_);return p}),n.set(a,l));var u=ne(l);if(u===A)return!1}return c},set(o,a,l,c){var u=n.get(a),_=a in o;if(r&&a==="length")for(var p=l;pQ(A)),n.set(p+"",d))}if(u===void 0)(!_||Ne(o,a)?.writable)&&(u=f(()=>Q(void 0)),ee(u,Se(l)),n.set(a,u));else{_=u.v!==A;var g=f(()=>Se(l));ee(u,g)}var N=Reflect.getOwnPropertyDescriptor(o,a);if(N?.set&&N.set.call(c,l),!_){if(r&&typeof a=="string"){var G=n.get("length"),ye=Number(a);Number.isInteger(ye)&&ye>=G.v&&ee(G,ye+1)}Re(s)}return!0},ownKeys(o){ne(s);var a=Reflect.ownKeys(o).filter(u=>{var _=n.get(u);return _===void 0||_.v!==A});for(var[l,c]of n)c.v!==A&&!(l in o)&&a.push(l);return a},setPrototypeOf(){qn()}})}function Tt(e){try{if(e!==null&&typeof e=="object"&&he in e)return e[he]}catch{}return e}function xs(e,t){return Object.is(Tt(e),Tt(t))}var At,tn,nn,rn;function rt(){if(At===void 0){At=window,tn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;nn=Ne(t,"firstChild").get,rn=Ne(t,"nextSibling").get,bt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),bt(n)&&(n.__t=void 0)}}function X(e=""){return document.createTextNode(e)}function D(e){return nn.call(e)}function J(e){return rn.call(e)}function Ns(e,t){if(!E)return D(e);var n=D(b);if(n===null)n=b.appendChild(X());else if(t&&n.nodeType!==Ie){var r=X();return n?.before(r),B(r),r}return t&&Ke(n),B(n),n}function Os(e,t=!1){if(!E){var n=D(e);return n instanceof Comment&&n.data===""?J(n):n}if(t){if(b?.nodeType!==Ie){var r=X();return b?.before(r),B(r),r}Ke(b)}return b}function Rs(e,t=1,n=!1){let r=E?b:e;for(var s;t--;)s=r,r=J(r);if(!E)return r;if(n){if(r?.nodeType!==Ie){var i=X();return r===null?s?.after(i):r.before(i),B(i),i}Ke(r)}return B(r),r}function sn(e){e.textContent=""}function ks(){return!1}function gr(e,t,n){return document.createElementNS(t??Un,e,void 0)}function Ke(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Ie;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Ms(e,t){if(t){const n=document.body;e.autofocus=!0,ie(()=>{document.activeElement===n&&e.focus()})}}function Ds(e){E&&D(e)!==null&&sn(e)}let St=!1;function br(){St||(St=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function Xe(e){var t=h,n=v;P(null),W(null);try{return e()}finally{P(t),W(n)}}function Cs(e,t,n,r=n){e.addEventListener(t,()=>Xe(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),br()}function an(e){v===null&&(h===null&&Fn(),Ln()),ge&&Pn()}function yr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function L(e,t,n){var r=v;r!==null&&(r.f&z)!==0&&(e|=z);var s={ctx:y,deps:null,nodes:null,f:e|x|C,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};if(n)try{Ae(s)}catch(o){throw H(s),o}else t!==null&&j(s);var i=s;if(n&&i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&be)===0&&(i=i.first,(e&Z)!==0&&(e&ke)!==0&&i!==null&&(i.f|=ke)),i!==null&&(i.parent=r,r!==null&&yr(i,r),h!==null&&(h.f&S)!==0&&(e&le)===0)){var f=h;(f.effects??=[]).push(i)}return s}function pt(){return h!==null&&!V}function fn(e){const t=L(Ce,null,!1);return m(t,T),t.teardown=e,t}function wr(e){an();var t=v.f,n=!h&&(t&$)!==0&&(t&fe)===0;if(n){var r=y;(r.e??=[]).push(e)}else return ln(e)}function ln(e){return L(De|Ct,e,!1)}function Is(e){return an(),L(Ce|Ct,e,!0)}function Ps(e){U.ensure();const t=L(le|be,e,!0);return()=>{H(t)}}function mr(e){U.ensure();const t=L(le|be,e,!0);return(n={})=>new Promise(r=>{n.outro?Be(t,()=>{H(t),r(void 0)}):(H(t),r(void 0))})}function Ls(e){return L(De,e,!1)}function Er(e){return L(ut|be,e,!0)}function Tr(e,t=0){return L(Ce|t,e,!0)}function Fs(e,t=[],n=[],r=[]){lr(r,t,n,s=>{L(Ce,()=>e(...s.map(ne)),!0)})}function Ar(e,t=0){var n=L(Z|t,e,!0);return n}function js(e,t=0){var n=L(ot|t,e,!0);return n}function oe(e){return L($|be,e,!0)}function on(e){var t=e.teardown;if(t!==null){const n=ge,r=h;xt(!0),P(null);try{t.call(null)}finally{xt(n),P(r)}}}function gt(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&Xe(()=>{s.abort(ue)});var r=n.next;(n.f&le)!==0?n.parent=null:H(n,t),n=r}}function Sr(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&$)===0&&H(t),t=n}}function H(e,t=!0){var n=!1;(t||(e.f&Dt)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(xr(e.nodes.start,e.nodes.end),n=!0),gt(e,t&&!n),Me(e,0),m(e,re);var r=e.nodes&&e.nodes.t;if(r!==null)for(const i of r)i.stop();on(e);var s=e.parent;s!==null&&s.first!==null&&un(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=null}function xr(e,t){for(;e!==null;){var n=e===t?null:J(e);e.remove(),e=n}}function un(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Be(e,t,n=!0){var r=[];cn(e,r,!0);var s=()=>{n&&H(e),t&&t()},i=r.length;if(i>0){var f=()=>--i||s();for(var o of r)o.out(f)}else s()}function cn(e,t,n){if((e.f&z)===0){e.f^=z;var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)(o.is_global||n)&&t.push(o);for(var s=e.first;s!==null;){var i=s.next,f=(s.f&ke)!==0||(s.f&$)!==0&&(e.f&Z)!==0;cn(s,t,f?n:!1),s=i}}}function Vs(e){_n(e,!0)}function _n(e,t){if((e.f&z)!==0){e.f^=z,(e.f&T)===0&&(m(e,x),j(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&ke)!==0||(n.f&$)!==0;_n(n,s?t:!1),n=r}var i=e.nodes&&e.nodes.t;if(i!==null)for(const f of i)(f.is_global||t)&&f.in()}}function Nr(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:J(n);t.append(n),n=s}}let ze=!1,ge=!1;function xt(e){ge=e}let h=null,V=!1;function P(e){h=e}let v=null;function W(e){v=e}let I=null;function dn(e){h!==null&&(I===null?I=[e]:I.push(e))}let R=null,k=0,M=null;function Or(e){M=e}let hn=1,_e=0,ve=_e;function Nt(e){ve=e}function vn(){return++hn}function je(e){var t=e.f;if((t&x)!==0)return!0;if(t&S&&(e.f&=~pe),(t&Y)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&C)!==0&&F===null&&m(e,T)}return!1}function pn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(I!==null&&me.call(I,e)))for(var s=0;s{e.ac.abort(ue)}),e.ac=null);try{e.f|=Qe;var c=e.fn,u=c();e.f|=fe;var _=e.deps,p=w?.is_fork;if(R!==null){var d;if(p||Me(e,k),_!==null&&k>0)for(_.length=k+R.length,d=0;dn?.call(this,i))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?ie(()=>{t.addEventListener(e,s,r)}):t.addEventListener(e,s,r),s}function Us(e,t,n,r={}){var s=mn(t,e,n,r);return()=>{e.removeEventListener(t,s,r)}}function Ws(e,t,n,r,s){var i={capture:r,passive:s},f=mn(e,t,n,i);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&fn(()=>{t.removeEventListener(e,f,i)})}function $s(e,t,n){(t[xe]??={})[e]=n}function Gs(e){for(var t=0;t{throw N});throw _}}finally{e[xe]=t,delete e.currentTarget,P(c),W(u)}}}const Fr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function jr(e){return Fr?.createHTML(e)??e}function En(e){var t=gr("template");return t.innerHTML=jr(e.replaceAll("","")),t.content}function q(e,t){var n=v;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function Ks(e,t){var n=(t&It)!==0,r=(t&zn)!==0,s,i=!e.startsWith("");return()=>{if(E)return q(b,null),b;s===void 0&&(s=En(i?e:""+e),n||(s=D(s)));var f=r||tn?document.importNode(s,!0):s.cloneNode(!0);if(n){var o=D(f),a=f.lastChild;q(o,a)}else q(f,f);return f}}function Vr(e,t,n="svg"){var r=!e.startsWith(""),s=(t&It)!==0,i=`<${n}>${r?e:""+e}`,f;return()=>{if(E)return q(b,null),b;if(!f){var o=En(i),a=D(o);if(s)for(f=document.createDocumentFragment();D(a);)f.appendChild(D(a));else f=D(a)}var l=f.cloneNode(!0);if(s){var c=D(l),u=l.lastChild;q(c,u)}else q(l,l);return l}}function Xs(e,t){return Vr(e,t,"svg")}function Zs(e=""){if(!E){var t=X(e+"");return q(t,t),t}var n=b;return n.nodeType!==Ie?(n.before(n=X()),B(n)):Ke(n),q(n,n),n}function Js(){if(E)return q(b,null),b;var e=document.createDocumentFragment(),t=document.createComment(""),n=X();return e.append(t,n),q(t,n),e}function Qs(e,t){if(E){var n=v;((n.f&fe)===0||n.nodes.end===null)&&(n.nodes.end=b),jt();return}e!==null&&e.before(t)}let ft=!0;function ei(e){ft=e}function ti(e,t){var n=t==null?"":typeof t=="object"?t+"":t;n!==(e.__t??=e.nodeValue)&&(e.__t=n,e.nodeValue=n+"")}function Tn(e,t){return An(e,t)}function Hr(e,t){rt(),t.intro=t.intro??!1;const n=t.target,r=E,s=b;try{for(var i=D(n);i&&(i.nodeType!==We||i.data!==Pt);)i=J(i);if(!i)throw Ee;He(!0),B(i);const f=An(e,{...t,anchor:i});return He(!1),f}catch(f){if(f instanceof Error&&f.message.split(` -`).some(o=>o.startsWith("https://svelte.dev/e/")))throw f;return f!==Ee&&console.warn("Failed to hydrate: ",f),t.recover===!1&&Vn(),rt(),sn(n),He(!1),Tn(e,t)}finally{He(r),B(s)}}const Ye=new Map;function An(e,{target:t,anchor:n,props:r={},events:s,context:i,intro:f=!0,transformError:o}){rt();var a=void 0,l=mr(()=>{var c=n??t.appendChild(X());ar(c,{pending:()=>{}},p=>{Jn({});var d=y;if(i&&(d.c=i),s&&(r.$$events=s),E&&q(p,null),ft=f,a=e(p,r)||{},ft=!0,E&&(v.nodes.end=b,b===null||b.nodeType!==We||b.data!==Ft))throw $e(),Ee;Qn()},o);var u=new Set,_=p=>{for(var d=0;d{for(var p of u)for(const N of[t,document]){var d=Ye.get(N),g=d.get(p);--g==0?(N.removeEventListener(p,at),d.delete(p),d.size===0&&Ye.delete(N)):d.set(p,g)}it.delete(_),c!==n&&c.parentNode?.removeChild(c)}});return lt.set(a,l),a}let lt=new WeakMap;function qr(e,t){const n=lt.get(e);return n?(lt.delete(e),n(t)):Promise.resolve()}function Sn(e,t,n){if(e==null)return t(void 0),n&&n(void 0),de;const r=Ve(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const we=[];function Yr(e,t){return{subscribe:Br(e,t).subscribe}}function Br(e,t=de){let n=null;const r=new Set;function s(o){if(Ht(e,o)&&(e=o,n)){const a=!we.length;for(const l of r)l[1](),we.push(l,e);if(a){for(let l=0;l{r.delete(l),r.size===0&&n&&(n(),n=null)}}return{set:s,update:i,subscribe:f}}function ni(e,t,n){const r=!Array.isArray(e),s=r?[e]:e;if(!s.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const i=t.length<2;return Yr(n,(f,o)=>{let a=!1;const l=[];let c=0,u=de;const _=()=>{if(c)return;u();const d=t(r?l[0]:l,f,o);i?f(d):u=typeof d=="function"?d:de},p=s.map((d,g)=>Sn(d,N=>{l[g]=N,c&=~(1<{c|=1<t=n)(),t}function xn(e){y===null&&ct(),Pe&&y.l!==null?Ur(y).m.push(e):wr(()=>{const t=Ve(e);if(typeof t=="function")return t})}function zr(e){y===null&&ct(),xn(()=>()=>Ve(e))}function Ur(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}const si=Object.freeze(Object.defineProperty({__proto__:null,flushSync:Wt,getContext:Kn,hasContext:Zn,hydrate:Hr,mount:Tn,onDestroy:zr,onMount:xn,setContext:Xn,settled:Mr,tick:kr,unmount:qr,untrack:Ve},Symbol.toStringTag,{value:"Module"}));export{Vs as $,Ks as A,Ns as B,ws as C,Rs as D,ke as E,ti as F,ee as G,Pt as H,Hr as I,Tn as J,Wt as K,Jr as L,kn as M,qr as N,As as O,kr as P,Q,Zs as R,Ts as S,Gs as T,Se as U,$s as V,$n as W,Ds as X,Ms as Y,Ws as Z,w as _,Qs as a,mn as a$,H as a0,Be as a1,X as a2,oe as a3,Nr as a4,ks as a5,Lt as a6,Ls as a7,Tr as a8,ie as a9,Zr as aA,rs as aB,Nn as aC,Rn as aD,is as aE,os as aF,as as aG,z as aH,$ as aI,ls as aJ,sn as aK,J as aL,ns as aM,ei as aN,gr as aO,ps as aP,q as aQ,zs as aR,js as aS,ys as aT,xs as aU,Cs as aV,mt as aW,lr as aX,bs as aY,ts as aZ,qs as a_,he as aa,de as ab,Sn as ac,ri as ad,fn as ae,Ne as af,ss as ag,_s as ah,v as ai,re as aj,Fe as ak,ds as al,Pe as am,cs as an,us as ao,_r as ap,Ss as aq,W as ar,Wr as as,hs as at,ge as au,fs as av,D as aw,We as ax,Ft as ay,Ue as az,jt as b,Bs as b0,A as b1,br as b2,Un as b3,Rt as b4,Qr as b5,Ys as b6,Mn as b7,Xs as b8,Kr as b9,Mr as bA,ni as ba,xr as bb,$e as bc,Ee as bd,gs as be,ft as bf,Z as bg,fe as bh,vs as bi,Xe as bj,Le as bk,Dt as bl,be as bm,zr as bn,At as bo,Dn as bp,Ht as bq,Zn as br,Kn as bs,Xn as bt,Ps as bu,sr as bv,Us as bw,Gr as bx,Xr as by,si as bz,Js as c,Ar as d,B as e,Os as f,He as g,E as h,b as i,Qn as j,y as k,wr as l,Ve as m,kt as n,xn as o,Jn as p,$r as q,ms as r,Gn as s,ne as t,Is as u,Hs as v,Br as w,ht as x,Es as y,Fs as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/BI8CVrNj.js b/studio-desktop/frontend-dist/_app/immutable/chunks/BI8CVrNj.js deleted file mode 100644 index 8e21cbd5..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/BI8CVrNj.js +++ /dev/null @@ -1,64 +0,0 @@ -import{z as X,h as et,b as tt,ai as kt,bb as Ut,i as nt,ax as Kt,aL as Yt,bc as Jt,bd as en,aQ as rt,e as tn,aO as nn,aP as rn,be as sn,aw as qe,d as an,E as mt,bf as ln,bg as on,bh as cn,a7 as un,m as pn,bi as dn,as as hn,a9 as fn,ab as pe,bj as $t,c as v,f as m,a as h,w as de,T as xt,p as vt,o as gn,Z as Ee,V as te,j as bt,A as j,B as C,C as D,t as g,G as T,D as Z,Q as U,F as ae,W as kn,S as st}from"./BESIXtBI.js";import"./DsnmJJEf.js";import"./CiPkpaXo.js";import{I as b,s as w,a as wt,t as yt,r as mn,i as at,v as $n,n as xn,w as vn,e as it,x as lt}from"./0zSFSexy.js";import{B as bn,l as y,s as _,p as ne,b as _e,i as ie,a as wn,c as yn}from"./CJh9TUc0.js";function Br(r,e,n=!1,s=!1,t=!1){var i=r,a="";X(()=>{var l=kt;if(a===(a=e()??"")){et&&tt();return}if(l.nodes!==null&&(Ut(l.nodes.start,l.nodes.end),l.nodes=null),a!==""){if(et){nt.data;for(var o=tt(),u=o;o!==null&&(o.nodeType!==Kt||o.data!=="");)u=o,o=Yt(o);if(o===null)throw Jt(),en;rt(nt,u),i=tn(o);return}var c=n?rn:s?sn:void 0,d=nn(n?"svg":s?"math":"template",c);d.innerHTML=a;var p=n||s?d:d.content;if(rt(qe(p),p.lastChild),n||s)for(;qe(p);)i.before(qe(p));else i.before(p)}})}function _n(r,e,...n){var s=new bn(r);an(()=>{const t=e()??null;s.ensure(t,t&&(i=>t(i,...n)))},mt)}const Sn=()=>performance.now(),J={tick:r=>requestAnimationFrame(r),now:()=>Sn(),tasks:new Set};function _t(){const r=J.now();J.tasks.forEach(e=>{e.c(r)||(J.tasks.delete(e),e.f())}),J.tasks.size!==0&&J.tick(_t)}function zn(r){let e;return J.tasks.size===0&&J.tick(_t),{promise:new Promise(n=>{J.tasks.add(e={c:r,f:n})}),abort(){J.tasks.delete(e)}}}function Se(r,e){$t(()=>{r.dispatchEvent(new CustomEvent(e))})}function Rn(r){if(r==="float")return"cssFloat";if(r==="offset")return"cssOffset";if(r.startsWith("--"))return r;const e=r.split("-");return e.length===1?e[0]:e[0]+e.slice(1).map(n=>n[0].toUpperCase()+n.slice(1)).join("")}function ot(r){const e={},n=r.split(";");for(const s of n){const[t,i]=s.split(":");if(!t||i===void 0)break;const a=Rn(t.trim());e[a]=i.trim()}return e}const Tn=r=>r;function Wr(r,e,n,s){var t=(r&dn)!==0,i="both",a,l=e.inert,o=e.style.overflow,u,c;function d(){return $t(()=>a??=n()(e,s?.()??{},{direction:i}))}var p={is_global:t,in(){e.inert=l,u=Le(e,d(),c,1,()=>{Se(e,"introend"),u?.abort(),u=a=void 0,e.style.overflow=o})},out(M){e.inert=!0,c=Le(e,d(),u,0,()=>{Se(e,"outroend"),M?.()})},stop:()=>{u?.abort(),c?.abort()}},S=kt;if((S.nodes.t??=[]).push(p),ln){var f=t;if(!f){for(var $=S.parent;$&&($.f&mt)!==0;)for(;($=$.parent)&&($.f&on)===0;);f=!$||($.f&cn)!==0}f&&un(()=>{pn(()=>p.in())})}}function Le(r,e,n,s,t){var i=s===1;if(hn(e)){var a,l=!1;return fn(()=>{if(!l){var M=e({direction:i?"in":"out"});a=Le(r,M,n,s,t)}}),{abort:()=>{l=!0,a?.abort()},deactivate:()=>a.deactivate(),reset:()=>a.reset(),t:()=>a.t()}}if(n?.deactivate(),!e?.duration&&!e?.delay)return Se(r,i?"introstart":"outrostart"),t(),{abort:pe,deactivate:pe,reset:pe,t:()=>s};const{delay:o=0,css:u,tick:c,easing:d=Tn}=e;var p=[];if(i&&n===void 0&&(c&&c(0,1),u)){var S=ot(u(0,1));p.push(S,S)}var f=()=>1-s,$=r.animate(p,{duration:o,fill:"forwards"});return $.onfinish=()=>{$.cancel(),Se(r,i?"introstart":"outrostart");var M=n?.t()??1-s;n?.abort();var N=s-M,O=e.duration*Math.abs(N),W=[];if(O>0){var K=!1;if(u)for(var L=Math.ceil(O/16.666666666666668),q=0;q<=L;q+=1){var I=M+N*d(q/L),Y=ot(u(I,1-I));W.push(Y),K||=Y.overflow==="hidden"}K&&(r.style.overflow="hidden"),f=()=>{var ee=$.currentTime;return M+N*d(ee/O)},c&&zn(()=>{if($.playState!=="running")return!1;var ee=f();return c(ee,1-ee),!0})}$=r.animate(W,{duration:O,fill:"forwards"}),$.onfinish=()=>{f=()=>s,c?.(s,1-s),t()}},{abort:()=>{$&&($.cancel(),$.effect=null,$.onfinish=pe)},deactivate:()=>{t=pe},reset:()=>{s===0&&c?.(1,0)},t:()=>f()}}function Hr(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];b(r,_({name:"play"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function Gr(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];b(r,_({name:"settings"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function An(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"m6 9 6 6 6-6"}]];b(r,_({name:"chevron-down"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function Or(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"}]];b(r,_({name:"link"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}const Zr=de(!1),Fr=de(!1),Pn=de([]),Qr=de(new Set),jr=de([]);function Vr(r){const e={...r,timestamp:r.timestamp??new Date().toISOString()};Pn.update(n=>[...n,e])}const St=de([]);let Mn=0;function Xr(r,e="info",n=5e3){const s=`toast-${++Mn}`;return St.update(t=>[...t,{id:s,message:r,type:e,duration:n}]),n>0&&setTimeout(()=>Nn(s),n),s}function Nn(r){St.update(e=>e.filter(n=>n.id!==r))}function Ur(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"}]];b(r,_({name:"copy"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function Kr(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M20 6 9 17l-5-5"}]];b(r,_({name:"check"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function Yr(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"}],["path",{d:"M2 12h20"}]];b(r,_({name:"globe"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function Jr(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 19h8"}],["path",{d:"m4 17 6-6-6-6"}]];b(r,_({name:"terminal"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function es(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"}],["path",{d:"M12 9v4"}],["path",{d:"M12 17h.01"}]];b(r,_({name:"triangle-alert"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}var Cn=j(' '),Dn=j(' '),qn=j(' '),En=j('
',1);function ts(r,e){vt(e,!0);let n=ne(e,"text",3,""),s=ne(e,"description",3,""),t=ne(e,"shortcut",3,""),i=ne(e,"position",3,"bottom"),a=ne(e,"delay",3,400),l=U(!1),o=U(void 0),u=U(void 0),c=null,d=U(0),p=U(0);function S(){c=setTimeout(()=>{g(u)&&g(o)&&$(),T(l,!0)},a())}function f(){c&&(clearTimeout(c),c=null),T(l,!1)}function $(){if(!g(u)||!g(o))return;const z=g(u).getBoundingClientRect(),A=g(o).getBoundingClientRect(),H=6;switch(i()){case"top":T(d,z.left+z.width/2-A.width/2),T(p,z.top-A.height-H);break;case"bottom":T(d,z.left+z.width/2-A.width/2),T(p,z.bottom+H);break;case"left":T(d,z.left-A.width-H),T(p,z.top+z.height/2-A.height/2);break;case"right":T(d,z.right+H),T(p,z.top+z.height/2-A.height/2);break}const k=8;T(d,Math.max(k,Math.min(g(d),window.innerWidth-A.width-k)),!0),T(p,Math.max(k,Math.min(g(p),window.innerHeight-A.height-k)),!0)}gn(()=>()=>{c&&clearTimeout(c)});var M=En(),N=m(M),O=C(N);_n(O,()=>e.children??pe),D(N),_e(N,z=>T(u,z),()=>g(u));var W=Z(N,2);let K;var L=C(W);{var q=z=>{var A=Cn(),H=C(A,!0);D(A),X(()=>ae(H,n())),h(z,A)};ie(L,z=>{n()&&z(q)})}var I=Z(L,2);{var Y=z=>{var A=Dn(),H=C(A,!0);D(A),X(()=>ae(H,t())),h(z,A)};ie(I,z=>{t()&&z(Y)})}var ee=Z(I,2);{var be=z=>{var A=qn(),H=C(A,!0);D(A),X(()=>ae(H,s())),h(z,A)};ie(ee,z=>{s()&&z(be)})}D(W),_e(W,z=>T(o,z),()=>g(o)),X(()=>{K=wt(W,1,"tooltip-portal svelte-mm2dif",null,K,{visible:g(l)}),yt(W,`left: ${g(d)??""}px; top: ${g(p)??""}px;`)}),Ee("mouseenter",N,S),Ee("mouseleave",N,f),te("focusin",N,S),te("focusout",N,f),h(r,M),bt()}xt(["focusin","focusout"]);function ns(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2"}],["path",{d:"M6.453 15h11.094"}],["path",{d:"M8.5 2h7"}]];b(r,_({name:"flask-conical"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function rs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M15 6a9 9 0 0 0-9 9V3"}],["circle",{cx:"18",cy:"6",r:"3"}],["circle",{cx:"6",cy:"18",r:"3"}]];b(r,_({name:"git-branch"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function ss(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"}],["path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09"}],["path",{d:"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z"}],["path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05"}]];b(r,_({name:"rocket"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function as(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"}]];b(r,_({name:"activity"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function is(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"}]];b(r,_({name:"folder-open"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function ls(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 8V4H8"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}],["path",{d:"M2 14h2"}],["path",{d:"M20 14h2"}],["path",{d:"M15 13v2"}],["path",{d:"M9 13v2"}]];b(r,_({name:"bot"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function os(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z"}]];b(r,_({name:"wrench"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function cs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["circle",{cx:"12",cy:"12",r:"10"}],["circle",{cx:"12",cy:"12",r:"1"}]];b(r,_({name:"circle-dot"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function us(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"}]];b(r,_({name:"shield"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function ps(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"m16 18 6-6-6-6"}],["path",{d:"m8 6-6 6 6 6"}]];b(r,_({name:"code"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function ds(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["circle",{cx:"12",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["circle",{cx:"18",cy:"6",r:"3"}],["path",{d:"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9"}],["path",{d:"M12 12v3"}]];b(r,_({name:"git-fork"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function hs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M6 21V9a9 9 0 0 0 9 9"}]];b(r,_({name:"git-merge"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function fs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M2 12 7 2"}],["path",{d:"m7 12 5-10"}],["path",{d:"m12 12 5-10"}],["path",{d:"m17 12 5-10"}],["path",{d:"M4.5 7h15"}],["path",{d:"M12 16v6"}]];b(r,_({name:"antenna"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function gs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];b(r,_({name:"download"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function ks(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 6v6l4 2"}]];b(r,_({name:"clock"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function ms(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"}]];b(r,_({name:"message-square"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function $s(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M10 5H3"}],["path",{d:"M12 19H3"}],["path",{d:"M14 3v4"}],["path",{d:"M16 17v4"}],["path",{d:"M21 12h-9"}],["path",{d:"M21 19h-5"}],["path",{d:"M21 5h-7"}],["path",{d:"M8 10v4"}],["path",{d:"M8 12H3"}]];b(r,_({name:"sliders-horizontal"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function xs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 16v-4"}],["path",{d:"M12 8h.01"}]];b(r,_({name:"info"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function vs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"}],["circle",{cx:"12",cy:"12",r:"3"}]];b(r,_({name:"eye"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function bs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"}]];b(r,_({name:"zap"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}const $e=[{provider:"openai",label:"OpenAI",models:[{id:"openai:gpt-4.1",name:"GPT-4.1",provider:"openai",contextWindow:1047576,isDefault:!0},{id:"openai:gpt-4.1-mini",name:"GPT-4.1 Mini",provider:"openai",contextWindow:1047576,isDefault:!1},{id:"openai:gpt-4.1-nano",name:"GPT-4.1 Nano",provider:"openai",contextWindow:1047576,isDefault:!1},{id:"openai:gpt-4o",name:"GPT-4o",provider:"openai",contextWindow:128e3,isDefault:!1},{id:"openai:gpt-4o-mini",name:"GPT-4o Mini",provider:"openai",contextWindow:128e3,isDefault:!1},{id:"openai:o3",name:"o3",provider:"openai",contextWindow:2e5,isDefault:!1},{id:"openai:o4-mini",name:"o4-mini",provider:"openai",contextWindow:2e5,isDefault:!1}]},{provider:"anthropic",label:"Anthropic",models:[{id:"anthropic:claude-sonnet-4-6",name:"Claude Sonnet 4.6",provider:"anthropic",contextWindow:2e5,isDefault:!0},{id:"anthropic:claude-opus-4-6",name:"Claude Opus 4.6",provider:"anthropic",contextWindow:2e5,isDefault:!1},{id:"anthropic:claude-haiku-4-5",name:"Claude Haiku 4.5",provider:"anthropic",contextWindow:2e5,isDefault:!1}]},{provider:"google",label:"Google Gemini",models:[{id:"google:gemini-2.5-pro",name:"Gemini 2.5 Pro",provider:"google",contextWindow:1048576,isDefault:!0},{id:"google:gemini-2.5-flash",name:"Gemini 2.5 Flash",provider:"google",contextWindow:1048576,isDefault:!1},{id:"google:gemini-2.0-flash",name:"Gemini 2.0 Flash",provider:"google",contextWindow:1048576,isDefault:!1}]},{provider:"groq",label:"Groq",models:[{id:"groq:llama-3.3-70b-versatile",name:"Llama 3.3 70B",provider:"groq",contextWindow:128e3,isDefault:!0},{id:"groq:mixtral-8x7b-32768",name:"Mixtral 8x7B",provider:"groq",contextWindow:32768,isDefault:!1},{id:"groq:gemma2-9b-it",name:"Gemma 2 9B",provider:"groq",contextWindow:8192,isDefault:!1}]},{provider:"mistral",label:"Mistral",models:[{id:"mistral:mistral-large-latest",name:"Mistral Large",provider:"mistral",contextWindow:128e3,isDefault:!0},{id:"mistral:mistral-small-latest",name:"Mistral Small",provider:"mistral",contextWindow:128e3,isDefault:!1},{id:"mistral:codestral-latest",name:"Codestral",provider:"mistral",contextWindow:256e3,isDefault:!1}]},{provider:"deepseek",label:"DeepSeek",models:[{id:"deepseek:deepseek-chat",name:"DeepSeek Chat",provider:"deepseek",contextWindow:64e3,isDefault:!0},{id:"deepseek:deepseek-reasoner",name:"DeepSeek Reasoner",provider:"deepseek",contextWindow:64e3,isDefault:!1}]},{provider:"cohere",label:"Cohere",models:[{id:"cohere:command-r-plus",name:"Command R+",provider:"cohere",contextWindow:128e3,isDefault:!0},{id:"cohere:command-r",name:"Command R",provider:"cohere",contextWindow:128e3,isDefault:!1}]},{provider:"azure",label:"Azure OpenAI",models:[{id:"azure:gpt-4o",name:"GPT-4o (Azure)",provider:"azure",contextWindow:128e3,isDefault:!0},{id:"azure:gpt-4o-mini",name:"GPT-4o Mini (Azure)",provider:"azure",contextWindow:128e3,isDefault:!1}]},{provider:"bedrock",label:"Amazon Bedrock",models:[{id:"bedrock:anthropic.claude-3-5-sonnet-20241022-v2:0",name:"Claude 3.5 Sonnet (Bedrock)",provider:"bedrock",contextWindow:2e5,isDefault:!0},{id:"bedrock:anthropic.claude-3-haiku-20240307-v1:0",name:"Claude 3 Haiku (Bedrock)",provider:"bedrock",contextWindow:2e5,isDefault:!1},{id:"bedrock:amazon.nova-pro-v1:0",name:"Amazon Nova Pro",provider:"bedrock",contextWindow:3e5,isDefault:!1}]},{provider:"ollama",label:"Ollama",models:[{id:"ollama:llama3.3",name:"Llama 3.3",provider:"ollama",contextWindow:128e3,isDefault:!0},{id:"ollama:mistral",name:"Mistral",provider:"ollama",contextWindow:32768,isDefault:!1},{id:"ollama:codellama",name:"Code Llama",provider:"ollama",contextWindow:16384,isDefault:!1},{id:"ollama:phi4",name:"Phi-4",provider:"ollama",contextWindow:16384,isDefault:!1}]}];function ws(r){return $e.find(n=>n.provider===r)?.models.find(n=>n.isDefault)}function Ln(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${Math.round(r/1e3)}K`:String(r)}var In=j('
'),Bn=j(''),Wn=j('Not configured'),Hn=j(''),Gn=j(''),On=j(' ',1),Zn=j('
');function ys(r,e){vt(e,!0);const n=()=>yn(vn,"$configuredProviders",s),[s,t]=wn();let i=ne(e,"value",15,""),a=ne(e,"placeholder",3,"Select or type a model..."),l=ne(e,"showAllProviders",3,!1),o=U(!1),u=U(""),c=U(null),d=U(null),p=U(""),S=st(()=>{const k=n();let P;if(l()||k.size===0)P=$e;else{const B=$e.filter(he=>k.has(he.provider)),re=$e.filter(he=>!k.has(he.provider));P=[...B,...re]}if(!g(u).trim())return P;const G=g(u).toLowerCase();return P.map(B=>({...B,models:B.models.filter(re=>re.name.toLowerCase().includes(G)||re.id.toLowerCase().includes(G)||B.label.toLowerCase().includes(G))})).filter(B=>B.models.length>0)});function f(k){i(k.id),T(u,""),T(o,!1)}function $(){if(!g(d))return;const k=g(d).getBoundingClientRect(),P=Math.min(300,window.innerHeight-k.bottom-8);T(p,`position:fixed; top:${k.bottom+4}px; left:${k.left}px; width:${k.width}px; max-height:${P}px;`)}function M(){T(o,!0),T(u,""),requestAnimationFrame($)}function N(k){const P=k.target;T(u,P.value,!0),i(P.value),T(o,!0)}function O(k){k.key==="Escape"&&(T(o,!1),g(c)?.blur())}function W(){T(o,!1)}function K(k){for(const P of $e){const G=P.models.find(B=>B.id===k);if(G)return G.name}return k}var L=Zn(),q=C(L),I=C(q);mn(I),_e(I,k=>T(c,k),()=>g(c));var Y=Z(I,2);at(Y,"tabindex",-1);var ee=C(Y);An(ee,{size:14}),D(Y),D(q);var be=Z(q,2);{var z=k=>{var P=In(),G=C(P,!0);D(P),X(()=>ae(G,i())),h(k,P)};ie(be,k=>{i()&&!g(o)&&k(z)})}var A=Z(be,2);{var H=k=>{var P=On(),G=m(P),B=Z(G,2),re=C(B);{var he=ce=>{var we=Bn();h(ce,we)},Bt=ce=>{var we=v(),Ht=m(we);it(Ht,17,()=>g(S),lt,(Gt,Me)=>{var Ne=Gn(),Ce=C(Ne),Ke=C(Ce),Ot=Z(Ke);{var Zt=fe=>{var ue=Wn();h(fe,ue)},Ft=st(()=>!n().has(g(Me).provider)&&n().size>0);ie(Ot,fe=>{g(Ft)&&fe(Zt)})}D(Ce);var Qt=Z(Ce,2);it(Qt,17,()=>g(Me).models,lt,(fe,ue)=>{var ge=Hn();let Ye;var De=C(ge),jt=C(De,!0);D(De);var Je=Z(De,2),Vt=C(Je);D(Je),D(ge),X(Xt=>{Ye=wt(ge,1,"dropdown-item svelte-1de56kq",null,Ye,{selected:i()===g(ue).id}),ae(jt,g(ue).name),ae(Vt,`${Xt??""} ctx`)},[()=>Ln(g(ue).contextWindow)]),te("click",ge,()=>f(g(ue))),h(fe,ge)}),D(Ne),X(()=>ae(Ke,`${g(Me).label??""} `)),h(Gt,Ne)}),h(ce,we)};ie(re,ce=>{g(S).length===0?ce(he):ce(Bt,!1)})}var Ue=Z(re,2),Wt=C(Ue);xn(Wt,{size:12}),kn(2),D(Ue),D(B),X(()=>yt(B,g(p))),te("click",G,W),te("keydown",G,()=>{}),h(k,P)};ie(A,k=>{g(o)&&k(H)})}D(L),_e(L,k=>T(d,k),()=>g(d)),X(k=>{$n(I,k),at(I,"placeholder",a())},[()=>g(o)?g(u):i()?K(i()):""]),Ee("focus",I,M),te("input",I,N),te("keydown",I,O),te("click",Y,()=>{T(o,!g(o)),g(o)&&g(c)?.focus()}),h(r,L),bt(),t()}xt(["input","keydown","click"]);function zt(r){const e=r-1;return e*e*e+1}function ct(r){const e=typeof r=="string"&&r.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/);return e?[parseFloat(e[1]),e[2]||"px"]:[r,"px"]}function _s(r,{delay:e=0,duration:n=400,easing:s=zt,x:t=0,y:i=0,opacity:a=0}={}){const l=getComputedStyle(r),o=+l.opacity,u=l.transform==="none"?"":l.transform,c=o*(1-a),[d,p]=ct(t),[S,f]=ct(i);return{delay:e,duration:n,easing:s,css:($,M)=>` - transform: ${u} translate(${(1-$)*d}${p}, ${(1-$)*S}${f}); - opacity: ${o-c*M}`}}function Ss(r,{delay:e=0,duration:n=400,easing:s=zt,start:t=0,opacity:i=0}={}){const a=getComputedStyle(r),l=+a.opacity,o=a.transform==="none"?"":a.transform,u=1-t,c=l*(1-i);return{delay:e,duration:n,easing:s,css:(d,p)=>` - transform: ${o} scale(${1-u*p}); - opacity: ${l-c*p} - `}}function zs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["circle",{cx:"12",cy:"12",r:"10"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16"}]];b(r,_({name:"circle-alert"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function Rs(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"m9 18 6-6-6-6"}]];b(r,_({name:"chevron-right"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function Ts(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m9 12 2 2 4-4"}]];b(r,_({name:"circle-check"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function As(r,e){const n=y(e,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}]];b(r,_({name:"file"},()=>n,{get iconNode(){return s},children:(t,i)=>{var a=v(),l=m(a);w(l,e,"default",{}),h(t,a)},$$slots:{default:!0}}))}function He(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var oe=He();function Rt(r){oe=r}var se={exec:()=>null};function x(r,e=""){let n=typeof r=="string"?r:r.source,s={replace:(t,i)=>{let a=typeof i=="string"?i:i.source;return a=a.replace(E.caret,"$1"),n=n.replace(t,a),s},getRegex:()=>new RegExp(n,e)};return s}var Fn=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:r=>new RegExp(`^( {0,3}${r})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:r=>new RegExp(`^ {0,${Math.min(3,r-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:r=>new RegExp(`^ {0,${Math.min(3,r-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:r=>new RegExp(`^ {0,${Math.min(3,r-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:r=>new RegExp(`^ {0,${Math.min(3,r-1)}}#`),htmlBeginRegex:r=>new RegExp(`^ {0,${Math.min(3,r-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:r=>new RegExp(`^ {0,${Math.min(3,r-1)}}>`)},Qn=/^(?:[ \t]*(?:\n|$))+/,jn=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Vn=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ve=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Xn=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Ge=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Tt=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,At=x(Tt).replace(/bull/g,Ge).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Un=x(Tt).replace(/bull/g,Ge).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Oe=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Kn=/^[^\n]+/,Ze=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Yn=x(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",Ze).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Jn=x(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,Ge).getRegex(),Ae="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Fe=/|$))/,er=x("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",Fe).replace("tag",Ae).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Pt=x(Oe).replace("hr",ve).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Ae).getRegex(),tr=x(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Pt).getRegex(),Qe={blockquote:tr,code:jn,def:Yn,fences:Vn,heading:Xn,hr:ve,html:er,lheading:At,list:Jn,newline:Qn,paragraph:Pt,table:se,text:Kn},ut=x("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",ve).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Ae).getRegex(),nr={...Qe,lheading:Un,table:ut,paragraph:x(Oe).replace("hr",ve).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ut).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Ae).getRegex()},rr={...Qe,html:x(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",Fe).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:se,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:x(Oe).replace("hr",ve).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",At).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},sr=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ar=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Mt=/^( {2,}|\\)\n(?!\s*$)/,ir=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Fn?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),qt=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,hr=x(qt,"u").replace(/punct/g,Pe).getRegex(),fr=x(qt,"u").replace(/punct/g,Ct).getRegex(),Et="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",gr=x(Et,"gu").replace(/notPunctSpace/g,Nt).replace(/punctSpace/g,je).replace(/punct/g,Pe).getRegex(),kr=x(Et,"gu").replace(/notPunctSpace/g,cr).replace(/punctSpace/g,or).replace(/punct/g,Ct).getRegex(),mr=x("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Nt).replace(/punctSpace/g,je).replace(/punct/g,Pe).getRegex(),$r=x(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,Dt).getRegex(),xr="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",vr=x(xr,"gu").replace(/notPunctSpace/g,pr).replace(/punctSpace/g,ur).replace(/punct/g,Dt).getRegex(),br=x(/\\(punct)/,"gu").replace(/punct/g,Pe).getRegex(),wr=x(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),yr=x(Fe).replace("(?:-->|$)","-->").getRegex(),_r=x("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",yr).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ze=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,Sr=x(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",ze).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Lt=x(/^!?\[(label)\]\[(ref)\]/).replace("label",ze).replace("ref",Ze).getRegex(),It=x(/^!?\[(ref)\](?:\[\])?/).replace("ref",Ze).getRegex(),zr=x("reflink|nolink(?!\\()","g").replace("reflink",Lt).replace("nolink",It).getRegex(),pt=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Ve={_backpedal:se,anyPunctuation:br,autolink:wr,blockSkip:dr,br:Mt,code:ar,del:se,delLDelim:se,delRDelim:se,emStrongLDelim:hr,emStrongRDelimAst:gr,emStrongRDelimUnd:mr,escape:sr,link:Sr,nolink:It,punctuation:lr,reflink:Lt,reflinkSearch:zr,tag:_r,text:ir,url:se},Rr={...Ve,link:x(/^!?\[(label)\]\((.*?)\)/).replace("label",ze).getRegex(),reflink:x(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",ze).getRegex()},Ie={...Ve,emStrongRDelimAst:kr,emStrongLDelim:fr,delLDelim:$r,delRDelim:vr,url:x(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",pt).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:x(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},dt=r=>Ar[r];function V(r,e){if(e){if(E.escapeTest.test(r))return r.replace(E.escapeReplace,dt)}else if(E.escapeTestNoEncode.test(r))return r.replace(E.escapeReplaceNoEncode,dt);return r}function ht(r){try{r=encodeURI(r).replace(E.percentDecode,"%")}catch{return null}return r}function ft(r,e){let n=r.replace(E.findPipe,(i,a,l)=>{let o=!1,u=a;for(;--u>=0&&l[u]==="\\";)o=!o;return o?"|":" |"}),s=n.split(E.splitPipe),t=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length0?-2:-1}function Mr(r,e=0){let n=e,s="";for(let t of r)if(t===" "){let i=4-n%4;s+=" ".repeat(i),n+=i}else s+=t,n++;return s}function gt(r,e,n,s,t){let i=e.href,a=e.title||null,l=r[1].replace(t.other.outputLinkReplace,"$1");s.state.inLink=!0;let o={type:r[0].charAt(0)==="!"?"image":"link",raw:n,href:i,title:a,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,o}function Nr(r,e,n){let s=r.match(n.other.indentCodeCompensation);if(s===null)return e;let t=s[1];return e.split(` -`).map(i=>{let a=i.match(n.other.beginningSpace);if(a===null)return i;let[l]=a;return l.length>=t.length?i.slice(t.length):i}).join(` -`)}var Re=class{options;rules;lexer;constructor(r){this.options=r||oe}space(r){let e=this.rules.block.newline.exec(r);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(r){let e=this.rules.block.code.exec(r);if(e){let n=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?n:me(n,` -`)}}}fences(r){let e=this.rules.block.fences.exec(r);if(e){let n=e[0],s=Nr(n,e[3]||"",this.rules);return{type:"code",raw:n,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(r){let e=this.rules.block.heading.exec(r);if(e){let n=e[2].trim();if(this.rules.other.endingHash.test(n)){let s=me(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(n=s.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(r){let e=this.rules.block.hr.exec(r);if(e)return{type:"hr",raw:me(e[0],` -`)}}blockquote(r){let e=this.rules.block.blockquote.exec(r);if(e){let n=me(e[0],` -`).split(` -`),s="",t="",i=[];for(;n.length>0;){let a=!1,l=[],o;for(o=0;o1,t={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");let i=this.rules.other.listItemRegex(n),a=!1;for(;r;){let o=!1,u="",c="";if(!(e=i.exec(r))||this.rules.block.hr.test(r))break;u=e[0],r=r.substring(u.length);let d=Mr(e[2].split(` -`,1)[0],e[1].length),p=r.split(` -`,1)[0],S=!d.trim(),f=0;if(this.options.pedantic?(f=2,c=d.trimStart()):S?f=e[1].length+1:(f=d.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=d.slice(f),f+=e[1].length),S&&this.rules.other.blankLine.test(p)&&(u+=p+` -`,r=r.substring(p.length+1),o=!0),!o){let $=this.rules.other.nextBulletRegex(f),M=this.rules.other.hrRegex(f),N=this.rules.other.fencesBeginRegex(f),O=this.rules.other.headingBeginRegex(f),W=this.rules.other.htmlBeginRegex(f),K=this.rules.other.blockquoteBeginRegex(f);for(;r;){let L=r.split(` -`,1)[0],q;if(p=L,this.options.pedantic?(p=p.replace(this.rules.other.listReplaceNesting," "),q=p):q=p.replace(this.rules.other.tabCharGlobal," "),N.test(p)||O.test(p)||W.test(p)||K.test(p)||$.test(p)||M.test(p))break;if(q.search(this.rules.other.nonSpaceChar)>=f||!p.trim())c+=` -`+q.slice(f);else{if(S||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||N.test(d)||O.test(d)||M.test(d))break;c+=` -`+p}S=!p.trim(),u+=L+` -`,r=r.substring(L.length+1),d=q.slice(f)}}t.loose||(a?t.loose=!0:this.rules.other.doubleBlankLine.test(u)&&(a=!0)),t.items.push({type:"list_item",raw:u,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),t.raw+=u}let l=t.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;t.raw=t.raw.trimEnd();for(let o of t.items){if(this.lexer.state.top=!1,o.tokens=this.lexer.blockTokens(o.text,[]),o.task){if(o.text=o.text.replace(this.rules.other.listReplaceTask,""),o.tokens[0]?.type==="text"||o.tokens[0]?.type==="paragraph"){o.tokens[0].raw=o.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),o.tokens[0].text=o.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,"");break}}let u=this.rules.other.listTaskCheckbox.exec(o.raw);if(u){let c={type:"checkbox",raw:u[0]+" ",checked:u[0]!=="[ ]"};o.checked=c.checked,t.loose?o.tokens[0]&&["paragraph","text"].includes(o.tokens[0].type)&&"tokens"in o.tokens[0]&&o.tokens[0].tokens?(o.tokens[0].raw=c.raw+o.tokens[0].raw,o.tokens[0].text=c.raw+o.tokens[0].text,o.tokens[0].tokens.unshift(c)):o.tokens.unshift({type:"paragraph",raw:c.raw,text:c.raw,tokens:[c]}):o.tokens.unshift(c)}}if(!t.loose){let u=o.tokens.filter(d=>d.type==="space"),c=u.length>0&&u.some(d=>this.rules.other.anyLine.test(d.raw));t.loose=c}}if(t.loose)for(let o of t.items){o.loose=!0;for(let u of o.tokens)u.type==="text"&&(u.type="paragraph")}return t}}html(r){let e=this.rules.block.html.exec(r);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(r){let e=this.rules.block.def.exec(r);if(e){let n=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",t=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:n,raw:e[0],href:s,title:t}}}table(r){let e=this.rules.block.table.exec(r);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let n=ft(e[1]),s=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),t=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` -`):[],i={type:"table",raw:e[0],header:[],align:[],rows:[]};if(n.length===s.length){for(let a of s)this.rules.other.tableAlignRight.test(a)?i.align.push("right"):this.rules.other.tableAlignCenter.test(a)?i.align.push("center"):this.rules.other.tableAlignLeft.test(a)?i.align.push("left"):i.align.push(null);for(let a=0;a({text:l,tokens:this.lexer.inline(l),header:!1,align:i.align[o]})));return i}}lheading(r){let e=this.rules.block.lheading.exec(r);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(r){let e=this.rules.block.paragraph.exec(r);if(e){let n=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:n,tokens:this.lexer.inline(n)}}}text(r){let e=this.rules.block.text.exec(r);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(r){let e=this.rules.inline.escape.exec(r);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(r){let e=this.rules.inline.tag.exec(r);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(r){let e=this.rules.inline.link.exec(r);if(e){let n=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let i=me(n.slice(0,-1),"\\");if((n.length-i.length)%2===0)return}else{let i=Pr(e[2],"()");if(i===-2)return;if(i>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+i;e[2]=e[2].substring(0,i),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let s=e[2],t="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(s);i&&(s=i[1],t=i[3])}else t=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?s=s.slice(1):s=s.slice(1,-1)),gt(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:t&&t.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(r,e){let n;if((n=this.rules.inline.reflink.exec(r))||(n=this.rules.inline.nolink.exec(r))){let s=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),t=e[s.toLowerCase()];if(!t){let i=n[0].charAt(0);return{type:"text",raw:i,text:i}}return gt(n,t,n[0],this.lexer,this.rules)}}emStrong(r,e,n=""){let s=this.rules.inline.emStrongLDelim.exec(r);if(!(!s||s[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[2])||!n||this.rules.inline.punctuation.exec(n))){let t=[...s[0]].length-1,i,a,l=t,o=0,u=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(u.lastIndex=0,e=e.slice(-1*r.length+t);(s=u.exec(e))!=null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(a=[...i].length,s[3]||s[4]){l+=a;continue}else if((s[5]||s[6])&&t%3&&!((t+a)%3)){o+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l+o);let c=[...s[0]][0].length,d=r.slice(0,t+s.index+c+a);if(Math.min(t,a)%2){let S=d.slice(1,-1);return{type:"em",raw:d,text:S,tokens:this.lexer.inlineTokens(S)}}let p=d.slice(2,-2);return{type:"strong",raw:d,text:p,tokens:this.lexer.inlineTokens(p)}}}}codespan(r){let e=this.rules.inline.code.exec(r);if(e){let n=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),t=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&t&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:e[0],text:n}}}br(r){let e=this.rules.inline.br.exec(r);if(e)return{type:"br",raw:e[0]}}del(r,e,n=""){let s=this.rules.inline.delLDelim.exec(r);if(s&&(!s[1]||!n||this.rules.inline.punctuation.exec(n))){let t=[...s[0]].length-1,i,a,l=t,o=this.rules.inline.delRDelim;for(o.lastIndex=0,e=e.slice(-1*r.length+t);(s=o.exec(e))!=null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(a=[...i].length,a!==t))continue;if(s[3]||s[4]){l+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l);let u=[...s[0]][0].length,c=r.slice(0,t+s.index+u+a),d=c.slice(t,-t);return{type:"del",raw:c,text:d,tokens:this.lexer.inlineTokens(d)}}}}autolink(r){let e=this.rules.inline.autolink.exec(r);if(e){let n,s;return e[2]==="@"?(n=e[1],s="mailto:"+n):(n=e[1],s=n),{type:"link",raw:e[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}url(r){let e;if(e=this.rules.inline.url.exec(r)){let n,s;if(e[2]==="@")n=e[0],s="mailto:"+n;else{let t;do t=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(t!==e[0]);n=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(r){let e=this.rules.inline.text.exec(r);if(e){let n=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:n}}}},F=class Be{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||oe,this.options.tokenizer=this.options.tokenizer||new Re,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:E,block:ye.normal,inline:ke.normal};this.options.pedantic?(n.block=ye.pedantic,n.inline=ke.pedantic):this.options.gfm&&(n.block=ye.gfm,this.options.breaks?n.inline=ke.breaks:n.inline=ke.gfm),this.tokenizer.rules=n}static get rules(){return{block:ye,inline:ke}}static lex(e,n){return new Be(n).lex(e)}static lexInline(e,n){return new Be(n).inlineTokens(e)}lex(e){e=e.replace(E.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let n=0;n(t=a.call({lexer:this},e,n))?(e=e.substring(t.raw.length),n.push(t),!0):!1))continue;if(t=this.tokenizer.space(e)){e=e.substring(t.raw.length);let a=n.at(-1);t.raw.length===1&&a!==void 0?a.raw+=` -`:n.push(t);continue}if(t=this.tokenizer.code(e)){e=e.substring(t.raw.length);let a=n.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+t.raw,a.text+=` -`+t.text,this.inlineQueue.at(-1).src=a.text):n.push(t);continue}if(t=this.tokenizer.fences(e)){e=e.substring(t.raw.length),n.push(t);continue}if(t=this.tokenizer.heading(e)){e=e.substring(t.raw.length),n.push(t);continue}if(t=this.tokenizer.hr(e)){e=e.substring(t.raw.length),n.push(t);continue}if(t=this.tokenizer.blockquote(e)){e=e.substring(t.raw.length),n.push(t);continue}if(t=this.tokenizer.list(e)){e=e.substring(t.raw.length),n.push(t);continue}if(t=this.tokenizer.html(e)){e=e.substring(t.raw.length),n.push(t);continue}if(t=this.tokenizer.def(e)){e=e.substring(t.raw.length);let a=n.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+t.raw,a.text+=` -`+t.raw,this.inlineQueue.at(-1).src=a.text):this.tokens.links[t.tag]||(this.tokens.links[t.tag]={href:t.href,title:t.title},n.push(t));continue}if(t=this.tokenizer.table(e)){e=e.substring(t.raw.length),n.push(t);continue}if(t=this.tokenizer.lheading(e)){e=e.substring(t.raw.length),n.push(t);continue}let i=e;if(this.options.extensions?.startBlock){let a=1/0,l=e.slice(1),o;this.options.extensions.startBlock.forEach(u=>{o=u.call({lexer:this},l),typeof o=="number"&&o>=0&&(a=Math.min(a,o))}),a<1/0&&a>=0&&(i=e.substring(0,a+1))}if(this.state.top&&(t=this.tokenizer.paragraph(i))){let a=n.at(-1);s&&a?.type==="paragraph"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+t.raw,a.text+=` -`+t.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):n.push(t),s=i.length!==e.length,e=e.substring(t.raw.length);continue}if(t=this.tokenizer.text(e)){e=e.substring(t.raw.length);let a=n.at(-1);a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+t.raw,a.text+=` -`+t.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):n.push(t);continue}if(e){let a="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(a);break}else throw new Error(a)}}return this.state.top=!0,n}inline(e,n=[]){return this.inlineQueue.push({src:e,tokens:n}),n}inlineTokens(e,n=[]){let s=e,t=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(t=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)o.includes(t[0].slice(t[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,t.index)+"["+"a".repeat(t[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(t=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,t.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(t=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)i=t[2]?t[2].length:0,s=s.slice(0,t.index+i)+"["+"a".repeat(t[0].length-i-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let a=!1,l="";for(;e;){a||(l=""),a=!1;let o;if(this.options.extensions?.inline?.some(c=>(o=c.call({lexer:this},e,n))?(e=e.substring(o.raw.length),n.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let c=n.at(-1);o.type==="text"&&c?.type==="text"?(c.raw+=o.raw,c.text+=o.text):n.push(o);continue}if(o=this.tokenizer.emStrong(e,s,l)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.del(e,s,l)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),n.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),n.push(o);continue}let u=e;if(this.options.extensions?.startInline){let c=1/0,d=e.slice(1),p;this.options.extensions.startInline.forEach(S=>{p=S.call({lexer:this},d),typeof p=="number"&&p>=0&&(c=Math.min(c,p))}),c<1/0&&c>=0&&(u=e.substring(0,c+1))}if(o=this.tokenizer.inlineText(u)){e=e.substring(o.raw.length),o.raw.slice(-1)!=="_"&&(l=o.raw.slice(-1)),a=!0;let c=n.at(-1);c?.type==="text"?(c.raw+=o.raw,c.text+=o.text):n.push(o);continue}if(e){let c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return n}},Te=class{options;parser;constructor(r){this.options=r||oe}space(r){return""}code({text:r,lang:e,escaped:n}){let s=(e||"").match(E.notSpaceStart)?.[0],t=r.replace(E.endingNewline,"")+` -`;return s?'
'+(n?t:V(t,!0))+`
-`:"
"+(n?t:V(t,!0))+`
-`}blockquote({tokens:r}){return`
-${this.parser.parse(r)}
-`}html({text:r}){return r}def(r){return""}heading({tokens:r,depth:e}){return`${this.parser.parseInline(r)} -`}hr(r){return`
-`}list(r){let e=r.ordered,n=r.start,s="";for(let a=0;a -`+s+" -`}listitem(r){return`
  • ${this.parser.parse(r.tokens)}
  • -`}checkbox({checked:r}){return" '}paragraph({tokens:r}){return`

    ${this.parser.parseInline(r)}

    -`}table(r){let e="",n="";for(let t=0;t${s}`),` - -`+e+` -`+s+`
    -`}tablerow({text:r}){return` -${r} -`}tablecell(r){let e=this.parser.parseInline(r.tokens),n=r.header?"th":"td";return(r.align?`<${n} align="${r.align}">`:`<${n}>`)+e+` -`}strong({tokens:r}){return`${this.parser.parseInline(r)}`}em({tokens:r}){return`${this.parser.parseInline(r)}`}codespan({text:r}){return`${V(r,!0)}`}br(r){return"
    "}del({tokens:r}){return`${this.parser.parseInline(r)}`}link({href:r,title:e,tokens:n}){let s=this.parser.parseInline(n),t=ht(r);if(t===null)return s;r=t;let i='
    ",i}image({href:r,title:e,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let t=ht(r);if(t===null)return V(n);r=t;let i=`${V(n)}{let a=t[i].flat(1/0);n=n.concat(this.walkTokens(a,e))}):t.tokens&&(n=n.concat(this.walkTokens(t.tokens,e)))}}return n}use(...r){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return r.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(t=>{if(!t.name)throw new Error("extension name required");if("renderer"in t){let i=e.renderers[t.name];i?e.renderers[t.name]=function(...a){let l=t.renderer.apply(this,a);return l===!1&&(l=i.apply(this,a)),l}:e.renderers[t.name]=t.renderer}if("tokenizer"in t){if(!t.level||t.level!=="block"&&t.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let i=e[t.level];i?i.unshift(t.tokenizer):e[t.level]=[t.tokenizer],t.start&&(t.level==="block"?e.startBlock?e.startBlock.push(t.start):e.startBlock=[t.start]:t.level==="inline"&&(e.startInline?e.startInline.push(t.start):e.startInline=[t.start]))}"childTokens"in t&&t.childTokens&&(e.childTokens[t.name]=t.childTokens)}),s.extensions=e),n.renderer){let t=this.defaults.renderer||new Te(this.defaults);for(let i in n.renderer){if(!(i in t))throw new Error(`renderer '${i}' does not exist`);if(["options","parser"].includes(i))continue;let a=i,l=n.renderer[a],o=t[a];t[a]=(...u)=>{let c=l.apply(t,u);return c===!1&&(c=o.apply(t,u)),c||""}}s.renderer=t}if(n.tokenizer){let t=this.defaults.tokenizer||new Re(this.defaults);for(let i in n.tokenizer){if(!(i in t))throw new Error(`tokenizer '${i}' does not exist`);if(["options","rules","lexer"].includes(i))continue;let a=i,l=n.tokenizer[a],o=t[a];t[a]=(...u)=>{let c=l.apply(t,u);return c===!1&&(c=o.apply(t,u)),c}}s.tokenizer=t}if(n.hooks){let t=this.defaults.hooks||new xe;for(let i in n.hooks){if(!(i in t))throw new Error(`hook '${i}' does not exist`);if(["options","block"].includes(i))continue;let a=i,l=n.hooks[a],o=t[a];xe.passThroughHooks.has(i)?t[a]=u=>{if(this.defaults.async&&xe.passThroughHooksRespectAsync.has(i))return(async()=>{let d=await l.call(t,u);return o.call(t,d)})();let c=l.call(t,u);return o.call(t,c)}:t[a]=(...u)=>{if(this.defaults.async)return(async()=>{let d=await l.apply(t,u);return d===!1&&(d=await o.apply(t,u)),d})();let c=l.apply(t,u);return c===!1&&(c=o.apply(t,u)),c}}s.hooks=t}if(n.walkTokens){let t=this.defaults.walkTokens,i=n.walkTokens;s.walkTokens=function(a){let l=[];return l.push(i.call(this,a)),t&&(l=l.concat(t.call(this,a))),l}}this.defaults={...this.defaults,...s}}),this}setOptions(r){return this.defaults={...this.defaults,...r},this}lexer(r,e){return F.lex(r,e??this.defaults)}parser(r,e){return Q.parse(r,e??this.defaults)}parseMarkdown(r){return(e,n)=>{let s={...n},t={...this.defaults,...s},i=this.onError(!!t.silent,!!t.async);if(this.defaults.async===!0&&s.async===!1)return i(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return i(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(t.hooks&&(t.hooks.options=t,t.hooks.block=r),t.async)return(async()=>{let a=t.hooks?await t.hooks.preprocess(e):e,l=await(t.hooks?await t.hooks.provideLexer():r?F.lex:F.lexInline)(a,t),o=t.hooks?await t.hooks.processAllTokens(l):l;t.walkTokens&&await Promise.all(this.walkTokens(o,t.walkTokens));let u=await(t.hooks?await t.hooks.provideParser():r?Q.parse:Q.parseInline)(o,t);return t.hooks?await t.hooks.postprocess(u):u})().catch(i);try{t.hooks&&(e=t.hooks.preprocess(e));let a=(t.hooks?t.hooks.provideLexer():r?F.lex:F.lexInline)(e,t);t.hooks&&(a=t.hooks.processAllTokens(a)),t.walkTokens&&this.walkTokens(a,t.walkTokens);let l=(t.hooks?t.hooks.provideParser():r?Q.parse:Q.parseInline)(a,t);return t.hooks&&(l=t.hooks.postprocess(l)),l}catch(a){return i(a)}}}onError(r,e){return n=>{if(n.message+=` -Please report this to https://github.com/markedjs/marked.`,r){let s="

    An error occurred:

    "+V(n.message+"",!0)+"
    ";return e?Promise.resolve(s):s}if(e)return Promise.reject(n);throw n}}},le=new Cr;function R(r,e){return le.parse(r,e)}R.options=R.setOptions=function(r){return le.setOptions(r),R.defaults=le.defaults,Rt(R.defaults),R};R.getDefaults=He;R.defaults=oe;R.use=function(...r){return le.use(...r),R.defaults=le.defaults,Rt(R.defaults),R};R.walkTokens=function(r,e){return le.walkTokens(r,e)};R.parseInline=le.parseInline;R.Parser=Q;R.parser=Q.parse;R.Renderer=Te;R.TextRenderer=Xe;R.Lexer=F;R.lexer=F.lex;R.Tokenizer=Re;R.Hooks=xe;R.parse=R;R.options;R.setOptions;R.use;R.walkTokens;R.parseInline;Q.parse;F.lex;export{as as A,ls as B,Kr as C,gs as D,vs as E,ns as F,Yr as G,_s as H,xs as I,R as J,Rs as K,Or as L,ms as M,Br as N,Ts as O,Hr as P,As as Q,ss as R,Gr as S,es as T,_n as U,Ss as V,os as W,Pn as X,bs as Z,Xr as a,Qr as b,Fr as c,jr as d,Ur as e,Jr as f,ts as g,An as h,Zr as i,rs as j,is as k,fs as l,cs as m,us as n,ps as o,Vr as p,ds as q,hs as r,ks as s,$s as t,ys as u,ws as v,St as w,zs as x,Nn as y,Wr as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/BNectIeB.js b/studio-desktop/frontend-dist/_app/immutable/chunks/BNectIeB.js deleted file mode 100644 index 2c1dd46e..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/BNectIeB.js +++ /dev/null @@ -1,2 +0,0 @@ -var Nn=Array.isArray,On=Array.prototype.indexOf,me=Array.prototype.includes,Rn=Array.from,kn=Object.defineProperty,Ne=Object.getOwnPropertyDescriptor,Mn=Object.getOwnPropertyDescriptors,Dn=Object.prototype,Cn=Array.prototype,Rt=Object.getPrototypeOf,bt=Object.isExtensible;function Wr(e){return typeof e=="function"}const de=()=>{};function $r(e){return e()}function kt(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function Gr(e,t,n=!1){return e===void 0?n?t():t:e}function Kr(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}function Xr(e,t){var n={};for(var r in e)t.includes(r)||(n[r]=e[r]);for(var s of Object.getOwnPropertySymbols(e))Object.propertyIsEnumerable.call(e,s)&&!t.includes(s)&&(n[s]=e[s]);return n}const S=2,De=4,Ce=8,ot=1<<24,Z=16,$=32,le=64,Je=128,C=512,T=1024,x=2048,Y=4096,z=8192,re=16384,fe=32768,ke=65536,yt=1<<17,Dt=1<<18,be=1<<19,Ct=1<<20,Zr=1<<25,pe=65536,Qe=1<<21,ut=1<<22,se=1<<23,he=Symbol("$state"),Jr=Symbol("legacy props"),Qr=Symbol(""),ue=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},ts=!!globalThis.document?.contentType&&globalThis.document.contentType.includes("xml"),ns=1,Ie=3,We=8;function ct(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function In(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function rs(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Pn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Ln(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Fn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function jn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Vn(){throw new Error("https://svelte.dev/e/hydration_failed")}function ss(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Hn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function qn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Yn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Bn(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const is=1,as=2,fs=4,ls=8,os=16,us=1,cs=2,_s=4,ds=8,hs=16,vs=4,It=1,zn=2,Pt="[",Lt="[!",wt="[?",Ft="]",Ee={},A=Symbol(),Un="http://www.w3.org/1999/xhtml",ps="http://www.w3.org/2000/svg",gs="http://www.w3.org/1998/Math/MathML",bs="@attach";function $e(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function ys(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Wn(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let E=!1;function He(e){E=e}let b;function B(e){if(e===null)throw $e(),Ee;return b=e}function jt(){return B(J(b))}function ws(e){if(E){if(J(b)!==null)throw $e(),Ee;b=e}}function $n(e=1){if(E){for(var t=e,n=b;t--;)n=J(n);b=n}}function Gn(e=!0){for(var t=0,n=b;;){if(n.nodeType===We){var r=n.data;if(r===Ft){if(t===0)return n;t-=1}else(r===Pt||r===Lt||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=J(n);e&&n.remove(),n=s}}function ms(e){if(!e||e.nodeType!==We)throw $e(),Ee;return e.data}function Vt(e){return e===this.v}function Ht(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function qt(e){return!Ht(e,this.v)}let Pe=!1;function Es(){Pe=!0}let y=null;function Te(e){y=e}function Kn(e){return _t().get(e)}function Xn(e,t){return _t().set(e,t),t}function Zn(e){return _t().has(e)}function Jn(e,t=!1,n){y={p:y,i:!1,c:null,e:null,s:e,x:null,l:Pe&&!t?{s:null,u:null,$:[]}:null}}function Qn(e){var t=y,n=t.e;if(n!==null){t.e=null;for(var r of n)ln(r)}return t.i=!0,y=t.p,{}}function Le(){return!Pe||y!==null&&y.l===null}function _t(e){return y===null&&ct(),y.c??=new Map(er(y)||void 0)}function er(e){let t=e.p;for(;t!==null;){const n=t.c;if(n!==null)return n;t=t.p}return null}let ce=[];function Yt(){var e=ce;ce=[],kt(e)}function ie(e){if(ce.length===0&&!Oe){var t=ce;queueMicrotask(()=>{t===ce&&Yt()})}ce.push(e)}function tr(){for(;ce.length>0;)Yt()}function Bt(e){var t=v;if(t===null)return h.f|=se,e;if((t.f&fe)===0&&(t.f&De)===0)throw e;te(e,t)}function te(e,t){for(;t!==null;){if((t.f&Je)!==0){if((t.f&fe)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const nr=-7169;function m(e,t){e.f=e.f&nr|t}function dt(e){(e.f&C)!==0||e.deps===null?m(e,T):m(e,Y)}function zt(e){if(e!==null)for(const t of e)(t.f&S)===0||(t.f&pe)===0||(t.f^=pe,zt(t.deps))}function Ut(e,t,n){(e.f&x)!==0?t.add(e):(e.f&Y)!==0&&n.add(e),zt(e.deps),m(e,T)}const qe=new Set;let w=null,mt=null,F=null,O=[],Ge=null,et=!1,Oe=!1;class U{current=new Map;previous=new Map;#n=new Set;#u=new Set;#s=0;#f=0;#r=null;#i=new Set;#e=new Set;#t=new Map;is_fork=!1;#a=!1;#o(){return this.is_fork||this.#f>0}skip_effect(t){this.#t.has(t)||this.#t.set(t,{d:[],m:[]})}unskip_effect(t){var n=this.#t.get(t);if(n){this.#t.delete(t);for(var r of n.d)m(r,x),j(r);for(r of n.m)m(r,Y),j(r)}}process(t){O=[],this.apply();var n=[],r=[];for(const s of t)this.#l(s,n,r);if(this.#o()){this.#c(r),this.#c(n);for(const[s,i]of this.#t)Xt(s,i)}else{for(const s of this.#n)s();this.#n.clear(),this.#s===0&&this.#d(),mt=this,w=null,Et(r),Et(n),mt=null,this.#r?.resolve()}F=null}#l(t,n,r){t.f^=T;for(var s=t.first;s!==null;){var i=s.f,f=(i&($|le))!==0,o=f&&(i&T)!==0,a=o||(i&z)!==0||this.#t.has(s);if(!a&&s.fn!==null){f?s.f^=T:(i&De)!==0?n.push(s):je(s)&&((i&Z)!==0&&this.#e.add(s),Ae(s));var l=s.first;if(l!==null){s=l;continue}}for(;s!==null;){var c=s.next;if(c!==null){s=c;break}s=s.parent}}}#c(t){for(var n=0;n0){if($t(),w!==null&&w!==this)return}else this.#s===0&&this.process([]);this.deactivate()}discard(){for(const t of this.#u)t(this);this.#u.clear()}#d(){if(qe.size>1){this.previous.clear();var t=F,n=!0;for(const s of qe){if(s===this){n=!1;continue}const i=[];for(const[o,a]of this.current){if(s.current.has(o))if(n&&a!==s.current.get(o))s.current.set(o,a);else continue;i.push(o)}if(i.length===0)continue;const f=[...s.current.keys()].filter(o=>!this.current.has(o));if(f.length>0){var r=O;O=[];const o=new Set,a=new Map;for(const l of i)Gt(l,f,o,a);if(O.length>0){w=s,s.apply();for(const l of O)s.#l(l,[],[]);s.deactivate()}O=r}}w=null,F=t}qe.delete(this)}increment(t){this.#s+=1,t&&(this.#f+=1)}decrement(t){this.#s-=1,t&&(this.#f-=1),!this.#a&&(this.#a=!0,ie(()=>{this.#a=!1,this.#o()?O.length>0&&this.flush():this.revive()}))}revive(){for(const t of this.#i)this.#e.delete(t),m(t,x),j(t);for(const t of this.#e)m(t,Y),j(t);this.flush()}oncommit(t){this.#n.add(t)}ondiscard(t){this.#u.add(t)}settled(){return(this.#r??=Mt()).promise}static ensure(){if(w===null){const t=w=new U;qe.add(w),Oe||ie(()=>{w===t&&t.flush()})}return w}apply(){}}function Wt(e){var t=Oe;Oe=!0;try{for(var n;;){if(tr(),O.length===0&&(w?.flush(),O.length===0))return Ge=null,n;$t()}}finally{Oe=t}}function $t(){et=!0;var e=null;try{for(var t=0;O.length>0;){var n=U.ensure();if(t++>1e3){var r,s;rr()}n.process(O),ae.clear()}}finally{O=[],et=!1,Ge=null}}function rr(){try{jn()}catch(e){te(e,Ge)}}let K=null;function Et(e){var t=e.length;if(t!==0){for(var n=0;n0)){ae.clear();for(const s of K){if((s.f&(re|z))!==0)continue;const i=[s];let f=s.parent;for(;f!==null;)K.has(f)&&(K.delete(f),i.push(f)),f=f.parent;for(let o=i.length-1;o>=0;o--){const a=i[o];(a.f&(re|z))===0&&Ae(a)}}K.clear()}}K=null}}function Gt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const i=s.f;(i&S)!==0?Gt(s,t,n,r):(i&(ut|Z))!==0&&(i&x)===0&&Kt(s,t,r)&&(m(s,x),j(s))}}function Kt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(me.call(t,s))return!0;if((s.f&S)!==0&&Kt(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function j(e){var t=Ge=e,n=t.b;if(n?.is_pending&&(e.f&(De|Ce|ot))!==0&&(e.f&fe)===0){n.defer_effect(e);return}for(;t.parent!==null;){t=t.parent;var r=t.f;if(et&&t===v&&(r&Z)!==0&&(r&Dt)===0&&(r&fe)!==0)return;if((r&(le|$))!==0){if((r&T)===0)return;t.f^=T}}O.push(t)}function Xt(e,t){if(!((e.f&$)!==0&&(e.f&T)!==0)){(e.f&x)!==0?t.d.push(e):(e.f&Y)!==0&&t.m.push(e),m(e,T);for(var n=e.first;n!==null;)Xt(n,t),n=n.next}}function sr(e){let t=0,n=Fe(0),r;return()=>{pt()&&(ne(n),Tr(()=>(t===0&&(r=Ve(()=>e(()=>Re(n)))),t+=1,()=>{ie(()=>{t-=1,t===0&&(r?.(),r=void 0,Re(n))})})))}}var ir=ke|be;function ar(e,t,n,r){new fr(e,t,n,r)}class fr{parent;is_pending=!1;transform_error;#n;#u=E?b:null;#s;#f;#r;#i=null;#e=null;#t=null;#a=null;#o=0;#l=0;#c=!1;#d=new Set;#h=new Set;#_=null;#y=sr(()=>(this.#_=Fe(this.#o),()=>{this.#_=null}));constructor(t,n,r,s){this.#n=t,this.#s=n,this.#f=i=>{var f=v;f.b=this,f.f|=Je,r(i)},this.parent=v.b,this.transform_error=s??this.parent?.transform_error??(i=>i),this.#r=Ar(()=>{if(E){const i=this.#u;jt();const f=i.data===Lt;if(i.data.startsWith(wt)){const a=JSON.parse(i.data.slice(wt.length));this.#m(a)}else f?this.#E():this.#w()}else this.#g()},ir),E&&(this.#n=b)}#w(){try{this.#i=oe(()=>this.#f(this.#n))}catch(t){this.error(t)}}#m(t){const n=this.#s.failed;n&&(this.#t=oe(()=>{n(this.#n,()=>t,()=>()=>{})}))}#E(){const t=this.#s.pending;t&&(this.is_pending=!0,this.#e=oe(()=>t(this.#n)),ie(()=>{var n=this.#a=document.createDocumentFragment(),r=X();n.append(r),this.#i=this.#p(()=>(U.ensure(),oe(()=>this.#f(r)))),this.#l===0&&(this.#n.before(n),this.#a=null,Be(this.#e,()=>{this.#e=null}),this.#v())}))}#g(){try{if(this.is_pending=this.has_pending_snippet(),this.#l=0,this.#o=0,this.#i=oe(()=>{this.#f(this.#n)}),this.#l>0){var t=this.#a=document.createDocumentFragment();Nr(this.#i,t);const n=this.#s.pending;this.#e=oe(()=>n(this.#n))}else this.#v()}catch(n){this.error(n)}}#v(){this.is_pending=!1;for(const t of this.#d)m(t,x),j(t);for(const t of this.#h)m(t,Y),j(t);this.#d.clear(),this.#h.clear()}defer_effect(t){Ut(t,this.#d,this.#h)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#s.pending}#p(t){var n=v,r=h,s=y;W(this.#r),P(this.#r),Te(this.#r.ctx);try{return t()}catch(i){return Bt(i),null}finally{W(n),P(r),Te(s)}}#b(t){if(!this.has_pending_snippet()){this.parent&&this.parent.#b(t);return}this.#l+=t,this.#l===0&&(this.#v(),this.#e&&Be(this.#e,()=>{this.#e=null}),this.#a&&(this.#n.before(this.#a),this.#a=null))}update_pending_count(t){this.#b(t),this.#o+=t,!(!this.#_||this.#c)&&(this.#c=!0,ie(()=>{this.#c=!1,this.#_&&Ue(this.#_,this.#o)}))}get_effect_pending(){return this.#y(),ne(this.#_)}error(t){var n=this.#s.onerror;let r=this.#s.failed;if(!n&&!r)throw t;this.#i&&(H(this.#i),this.#i=null),this.#e&&(H(this.#e),this.#e=null),this.#t&&(H(this.#t),this.#t=null),E&&(B(this.#u),$n(),B(Gn()));var s=!1,i=!1;const f=()=>{if(s){Wn();return}s=!0,i&&Bn(),this.#t!==null&&Be(this.#t,()=>{this.#t=null}),this.#p(()=>{U.ensure(),this.#g()})},o=a=>{try{i=!0,n?.(a,f),i=!1}catch(l){te(l,this.#r&&this.#r.parent)}r&&(this.#t=this.#p(()=>{U.ensure();try{return oe(()=>{var l=v;l.b=this,l.f|=Je,r(this.#n,()=>a,()=>f)})}catch(l){return te(l,this.#r.parent),null}}))};ie(()=>{var a;try{a=this.transform_error(t)}catch(l){te(l,this.#r&&this.#r.parent);return}a!==null&&typeof a=="object"&&typeof a.then=="function"?a.then(o,l=>te(l,this.#r&&this.#r.parent)):o(a)})}}function lr(e,t,n,r){const s=Le()?ht:_r;var i=e.filter(u=>!u.settled);if(n.length===0&&i.length===0){r(t.map(s));return}var f=v,o=or(),a=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(u=>u.promise)):null;function l(u){o();try{r(u)}catch(_){(f.f&re)===0&&te(_,f)}tt()}if(n.length===0){a.then(()=>l(t.map(s)));return}function c(){o(),Promise.all(n.map(u=>cr(u))).then(u=>l([...t.map(s),...u])).catch(u=>te(u,f))}a?a.then(c):c()}function or(){var e=v,t=h,n=y,r=w;return function(i=!0){W(e),P(t),Te(n),i&&r?.activate()}}function tt(e=!0){W(null),P(null),Te(null),e&&w?.deactivate()}function ur(){var e=v.b,t=w,n=e.is_rendered();return e.update_pending_count(1),t.increment(n),()=>{e.update_pending_count(-1),t.decrement(n)}}function ht(e){var t=S|x,n=h!==null&&(h.f&S)!==0?h:null;return v!==null&&(v.f|=be),{ctx:y,deps:null,effects:null,equals:Vt,f:t,fn:e,reactions:null,rv:0,v:A,wv:0,parent:n??v,ac:null}}function cr(e,t,n){v===null&&In();var s=void 0,i=Fe(A),f=!h,o=new Map;return Er(()=>{var a=Mt();s=a.promise;try{Promise.resolve(e()).then(a.resolve,a.reject).finally(tt)}catch(_){a.reject(_),tt()}var l=w;if(f){var c=ur();o.get(l)?.reject(ue),o.delete(l),o.set(l,a)}const u=(_,p=void 0)=>{if(l.activate(),p)p!==ue&&(i.f|=se,Ue(i,p));else{(i.f&se)!==0&&(i.f^=se),Ue(i,_);for(const[d,g]of o){if(o.delete(d),d===l)break;g.reject(ue)}}c&&c()};a.promise.then(u,_=>u(null,_||"unknown"))}),fn(()=>{for(const a of o.values())a.reject(ue)}),new Promise(a=>{function l(c){function u(){c===s?a(i):l(s)}c.then(u,u)}l(s)})}function Ts(e){const t=ht(e);return dn(t),t}function _r(e){const t=ht(e);return t.equals=qt,t}function dr(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Qt&&pr()}return t}function pr(){Qt=!1;for(const e of nt)(e.f&T)!==0&&m(e,Y),je(e)&&Ae(e);nt.clear()}function Ss(e,t=1){var n=ne(e),r=t===1?n++:n--;return ee(e,n),r}function Re(e){ee(e,e.v+1)}function en(e,t){var n=e.reactions;if(n!==null)for(var r=Le(),s=n.length,i=0;i{if(ve===i)return o();var a=h,l=ve;P(null),Nt(i);var c=o();return P(a),Nt(l),c};return r&&n.set("length",Q(e.length)),new Proxy(e,{defineProperty(o,a,l){(!("value"in l)||l.configurable===!1||l.enumerable===!1||l.writable===!1)&&Hn();var c=n.get(a);return c===void 0?f(()=>{var u=Q(l.value);return n.set(a,u),u}):ee(c,l.value,!0),!0},deleteProperty(o,a){var l=n.get(a);if(l===void 0){if(a in o){const c=f(()=>Q(A));n.set(a,c),Re(s)}}else ee(l,A),Re(s);return!0},get(o,a,l){if(a===he)return e;var c=n.get(a),u=a in o;if(c===void 0&&(!u||Ne(o,a)?.writable)&&(c=f(()=>{var p=Se(u?o[a]:A),d=Q(p);return d}),n.set(a,c)),c!==void 0){var _=ne(c);return _===A?void 0:_}return Reflect.get(o,a,l)},getOwnPropertyDescriptor(o,a){var l=Reflect.getOwnPropertyDescriptor(o,a);if(l&&"value"in l){var c=n.get(a);c&&(l.value=ne(c))}else if(l===void 0){var u=n.get(a),_=u?.v;if(u!==void 0&&_!==A)return{enumerable:!0,configurable:!0,value:_,writable:!0}}return l},has(o,a){if(a===he)return!0;var l=n.get(a),c=l!==void 0&&l.v!==A||Reflect.has(o,a);if(l!==void 0||v!==null&&(!c||Ne(o,a)?.writable)){l===void 0&&(l=f(()=>{var _=c?Se(o[a]):A,p=Q(_);return p}),n.set(a,l));var u=ne(l);if(u===A)return!1}return c},set(o,a,l,c){var u=n.get(a),_=a in o;if(r&&a==="length")for(var p=l;pQ(A)),n.set(p+"",d))}if(u===void 0)(!_||Ne(o,a)?.writable)&&(u=f(()=>Q(void 0)),ee(u,Se(l)),n.set(a,u));else{_=u.v!==A;var g=f(()=>Se(l));ee(u,g)}var N=Reflect.getOwnPropertyDescriptor(o,a);if(N?.set&&N.set.call(c,l),!_){if(r&&typeof a=="string"){var G=n.get("length"),ye=Number(a);Number.isInteger(ye)&&ye>=G.v&&ee(G,ye+1)}Re(s)}return!0},ownKeys(o){ne(s);var a=Reflect.ownKeys(o).filter(u=>{var _=n.get(u);return _===void 0||_.v!==A});for(var[l,c]of n)c.v!==A&&!(l in o)&&a.push(l);return a},setPrototypeOf(){qn()}})}function Tt(e){try{if(e!==null&&typeof e=="object"&&he in e)return e[he]}catch{}return e}function xs(e,t){return Object.is(Tt(e),Tt(t))}var At,tn,nn,rn;function rt(){if(At===void 0){At=window,tn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;nn=Ne(t,"firstChild").get,rn=Ne(t,"nextSibling").get,bt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),bt(n)&&(n.__t=void 0)}}function X(e=""){return document.createTextNode(e)}function D(e){return nn.call(e)}function J(e){return rn.call(e)}function Ns(e,t){if(!E)return D(e);var n=D(b);if(n===null)n=b.appendChild(X());else if(t&&n.nodeType!==Ie){var r=X();return n?.before(r),B(r),r}return t&&Ke(n),B(n),n}function Os(e,t=!1){if(!E){var n=D(e);return n instanceof Comment&&n.data===""?J(n):n}if(t){if(b?.nodeType!==Ie){var r=X();return b?.before(r),B(r),r}Ke(b)}return b}function Rs(e,t=1,n=!1){let r=E?b:e;for(var s;t--;)s=r,r=J(r);if(!E)return r;if(n){if(r?.nodeType!==Ie){var i=X();return r===null?s?.after(i):r.before(i),B(i),i}Ke(r)}return B(r),r}function sn(e){e.textContent=""}function ks(){return!1}function gr(e,t,n){return document.createElementNS(t??Un,e,void 0)}function Ke(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Ie;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Ms(e,t){if(t){const n=document.body;e.autofocus=!0,ie(()=>{document.activeElement===n&&e.focus()})}}function Ds(e){E&&D(e)!==null&&sn(e)}let St=!1;function br(){St||(St=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function Xe(e){var t=h,n=v;P(null),W(null);try{return e()}finally{P(t),W(n)}}function Cs(e,t,n,r=n){e.addEventListener(t,()=>Xe(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),br()}function an(e){v===null&&(h===null&&Fn(),Ln()),ge&&Pn()}function yr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function L(e,t,n){var r=v;r!==null&&(r.f&z)!==0&&(e|=z);var s={ctx:y,deps:null,nodes:null,f:e|x|C,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};if(n)try{Ae(s)}catch(o){throw H(s),o}else t!==null&&j(s);var i=s;if(n&&i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&be)===0&&(i=i.first,(e&Z)!==0&&(e&ke)!==0&&i!==null&&(i.f|=ke)),i!==null&&(i.parent=r,r!==null&&yr(i,r),h!==null&&(h.f&S)!==0&&(e&le)===0)){var f=h;(f.effects??=[]).push(i)}return s}function pt(){return h!==null&&!V}function fn(e){const t=L(Ce,null,!1);return m(t,T),t.teardown=e,t}function wr(e){an();var t=v.f,n=!h&&(t&$)!==0&&(t&fe)===0;if(n){var r=y;(r.e??=[]).push(e)}else return ln(e)}function ln(e){return L(De|Ct,e,!1)}function Is(e){return an(),L(Ce|Ct,e,!0)}function Ps(e){U.ensure();const t=L(le|be,e,!0);return()=>{H(t)}}function mr(e){U.ensure();const t=L(le|be,e,!0);return(n={})=>new Promise(r=>{n.outro?Be(t,()=>{H(t),r(void 0)}):(H(t),r(void 0))})}function Ls(e){return L(De,e,!1)}function Er(e){return L(ut|be,e,!0)}function Tr(e,t=0){return L(Ce|t,e,!0)}function Fs(e,t=[],n=[],r=[]){lr(r,t,n,s=>{L(Ce,()=>e(...s.map(ne)),!0)})}function Ar(e,t=0){var n=L(Z|t,e,!0);return n}function js(e,t=0){var n=L(ot|t,e,!0);return n}function oe(e){return L($|be,e,!0)}function on(e){var t=e.teardown;if(t!==null){const n=ge,r=h;xt(!0),P(null);try{t.call(null)}finally{xt(n),P(r)}}}function gt(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&Xe(()=>{s.abort(ue)});var r=n.next;(n.f&le)!==0?n.parent=null:H(n,t),n=r}}function Sr(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&$)===0&&H(t),t=n}}function H(e,t=!0){var n=!1;(t||(e.f&Dt)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(xr(e.nodes.start,e.nodes.end),n=!0),gt(e,t&&!n),Me(e,0),m(e,re);var r=e.nodes&&e.nodes.t;if(r!==null)for(const i of r)i.stop();on(e);var s=e.parent;s!==null&&s.first!==null&&un(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=null}function xr(e,t){for(;e!==null;){var n=e===t?null:J(e);e.remove(),e=n}}function un(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Be(e,t,n=!0){var r=[];cn(e,r,!0);var s=()=>{n&&H(e),t&&t()},i=r.length;if(i>0){var f=()=>--i||s();for(var o of r)o.out(f)}else s()}function cn(e,t,n){if((e.f&z)===0){e.f^=z;var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)(o.is_global||n)&&t.push(o);for(var s=e.first;s!==null;){var i=s.next,f=(s.f&ke)!==0||(s.f&$)!==0&&(e.f&Z)!==0;cn(s,t,f?n:!1),s=i}}}function Vs(e){_n(e,!0)}function _n(e,t){if((e.f&z)!==0){e.f^=z,(e.f&T)===0&&(m(e,x),j(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&ke)!==0||(n.f&$)!==0;_n(n,s?t:!1),n=r}var i=e.nodes&&e.nodes.t;if(i!==null)for(const f of i)(f.is_global||t)&&f.in()}}function Nr(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:J(n);t.append(n),n=s}}let ze=!1,ge=!1;function xt(e){ge=e}let h=null,V=!1;function P(e){h=e}let v=null;function W(e){v=e}let I=null;function dn(e){h!==null&&(I===null?I=[e]:I.push(e))}let R=null,k=0,M=null;function Or(e){M=e}let hn=1,_e=0,ve=_e;function Nt(e){ve=e}function vn(){return++hn}function je(e){var t=e.f;if((t&x)!==0)return!0;if(t&S&&(e.f&=~pe),(t&Y)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&C)!==0&&F===null&&m(e,T)}return!1}function pn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(I!==null&&me.call(I,e)))for(var s=0;s{e.ac.abort(ue)}),e.ac=null);try{e.f|=Qe;var c=e.fn,u=c();e.f|=fe;var _=e.deps,p=w?.is_fork;if(R!==null){var d;if(p||Me(e,k),_!==null&&k>0)for(_.length=k+R.length,d=0;dn?.call(this,i))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?ie(()=>{t.addEventListener(e,s,r)}):t.addEventListener(e,s,r),s}function Us(e,t,n,r={}){var s=mn(t,e,n,r);return()=>{e.removeEventListener(t,s,r)}}function Ws(e,t,n,r,s){var i={capture:r,passive:s},f=mn(e,t,n,i);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&fn(()=>{t.removeEventListener(e,f,i)})}function $s(e,t,n){(t[xe]??={})[e]=n}function Gs(e){for(var t=0;t{throw N});throw _}}finally{e[xe]=t,delete e.currentTarget,P(c),W(u)}}}const Fr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function jr(e){return Fr?.createHTML(e)??e}function En(e){var t=gr("template");return t.innerHTML=jr(e.replaceAll("","")),t.content}function q(e,t){var n=v;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function Ks(e,t){var n=(t&It)!==0,r=(t&zn)!==0,s,i=!e.startsWith("");return()=>{if(E)return q(b,null),b;s===void 0&&(s=En(i?e:""+e),n||(s=D(s)));var f=r||tn?document.importNode(s,!0):s.cloneNode(!0);if(n){var o=D(f),a=f.lastChild;q(o,a)}else q(f,f);return f}}function Vr(e,t,n="svg"){var r=!e.startsWith(""),s=(t&It)!==0,i=`<${n}>${r?e:""+e}`,f;return()=>{if(E)return q(b,null),b;if(!f){var o=En(i),a=D(o);if(s)for(f=document.createDocumentFragment();D(a);)f.appendChild(D(a));else f=D(a)}var l=f.cloneNode(!0);if(s){var c=D(l),u=l.lastChild;q(c,u)}else q(l,l);return l}}function Xs(e,t){return Vr(e,t,"svg")}function Zs(e=""){if(!E){var t=X(e+"");return q(t,t),t}var n=b;return n.nodeType!==Ie?(n.before(n=X()),B(n)):Ke(n),q(n,n),n}function Js(){if(E)return q(b,null),b;var e=document.createDocumentFragment(),t=document.createComment(""),n=X();return e.append(t,n),q(t,n),e}function Qs(e,t){if(E){var n=v;((n.f&fe)===0||n.nodes.end===null)&&(n.nodes.end=b),jt();return}e!==null&&e.before(t)}let ft=!0;function ei(e){ft=e}function ti(e,t){var n=t==null?"":typeof t=="object"?t+"":t;n!==(e.__t??=e.nodeValue)&&(e.__t=n,e.nodeValue=n+"")}function Tn(e,t){return An(e,t)}function Hr(e,t){rt(),t.intro=t.intro??!1;const n=t.target,r=E,s=b;try{for(var i=D(n);i&&(i.nodeType!==We||i.data!==Pt);)i=J(i);if(!i)throw Ee;He(!0),B(i);const f=An(e,{...t,anchor:i});return He(!1),f}catch(f){if(f instanceof Error&&f.message.split(` -`).some(o=>o.startsWith("https://svelte.dev/e/")))throw f;return f!==Ee&&console.warn("Failed to hydrate: ",f),t.recover===!1&&Vn(),rt(),sn(n),He(!1),Tn(e,t)}finally{He(r),B(s)}}const Ye=new Map;function An(e,{target:t,anchor:n,props:r={},events:s,context:i,intro:f=!0,transformError:o}){rt();var a=void 0,l=mr(()=>{var c=n??t.appendChild(X());ar(c,{pending:()=>{}},p=>{Jn({});var d=y;if(i&&(d.c=i),s&&(r.$$events=s),E&&q(p,null),ft=f,a=e(p,r)||{},ft=!0,E&&(v.nodes.end=b,b===null||b.nodeType!==We||b.data!==Ft))throw $e(),Ee;Qn()},o);var u=new Set,_=p=>{for(var d=0;d{for(var p of u)for(const N of[t,document]){var d=Ye.get(N),g=d.get(p);--g==0?(N.removeEventListener(p,at),d.delete(p),d.size===0&&Ye.delete(N)):d.set(p,g)}it.delete(_),c!==n&&c.parentNode?.removeChild(c)}});return lt.set(a,l),a}let lt=new WeakMap;function qr(e,t){const n=lt.get(e);return n?(lt.delete(e),n(t)):Promise.resolve()}function Sn(e,t,n){if(e==null)return t(void 0),n&&n(void 0),de;const r=Ve(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const we=[];function Yr(e,t){return{subscribe:Br(e,t).subscribe}}function Br(e,t=de){let n=null;const r=new Set;function s(o){if(Ht(e,o)&&(e=o,n)){const a=!we.length;for(const l of r)l[1](),we.push(l,e);if(a){for(let l=0;l{r.delete(l),r.size===0&&n&&(n(),n=null)}}return{set:s,update:i,subscribe:f}}function ni(e,t,n){const r=!Array.isArray(e),s=r?[e]:e;if(!s.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const i=t.length<2;return Yr(n,(f,o)=>{let a=!1;const l=[];let c=0,u=de;const _=()=>{if(c)return;u();const d=t(r?l[0]:l,f,o);i?f(d):u=typeof d=="function"?d:de},p=s.map((d,g)=>Sn(d,N=>{l[g]=N,c&=~(1<{c|=1<t=n)(),t}function xn(e){y===null&&ct(),Pe&&y.l!==null?Ur(y).m.push(e):wr(()=>{const t=Ve(e);if(typeof t=="function")return t})}function zr(e){y===null&&ct(),xn(()=>()=>Ve(e))}function Ur(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}const si=Object.freeze(Object.defineProperty({__proto__:null,flushSync:Wt,getContext:Kn,hasContext:Zn,hydrate:Hr,mount:Tn,onDestroy:zr,onMount:xn,setContext:Xn,settled:Mr,tick:kr,unmount:qr,untrack:Ve},Symbol.toStringTag,{value:"Module"}));export{de as $,ht as A,Es as B,Fs as C,Ks as D,ke as E,Ns as F,ws as G,Pt as H,Rs as I,ti as J,Gs as K,$s as L,Q as M,ee as N,$n as O,Ds as P,Ts as Q,w as R,he as S,Vs as T,H as U,Be as V,X as W,oe as X,Nr as Y,ks as Z,Lt as _,Qs as a,Bs as a$,As as a0,Sn as a1,ri as a2,fn as a3,kn as a4,Ne as a5,ss as a6,_s as a7,Se as a8,v as a9,Nn as aA,Rn as aB,is as aC,os as aD,as as aE,z as aF,$ as aG,ls as aH,sn as aI,J as aJ,ns as aK,ei as aL,gr as aM,ps as aN,q as aO,zs as aP,js as aQ,ys as aR,xs as aS,Cs as aT,mt as aU,lr as aV,bs as aW,ts as aX,qs as aY,mn as aZ,Ms as a_,re as aa,Fe as ab,ds as ac,Pe as ad,cs as ae,us as af,_r as ag,Ss as ah,W as ai,Wr as aj,Jr as ak,hs as al,ge as am,Hr as an,Tn as ao,Wt as ap,qr as aq,kr as ar,Zs as as,fs as at,D as au,We as av,Ft as aw,Ue as ax,Zr as ay,rs as az,Qn as b,A as b0,br as b1,Un as b2,Rt as b3,Qr as b4,Ys as b5,Mn as b6,Xs as b7,Kr as b8,ni as b9,Mr as bA,xr as ba,$e as bb,Ee as bc,gs as bd,ft as be,Z as bf,fe as bg,vs as bh,Xe as bi,Ws as bj,Le as bk,Dt as bl,be as bm,zr as bn,At as bo,Dn as bp,Ht as bq,Zn as br,Kn as bs,Xn as bt,Ps as bu,sr as bv,Us as bw,Gr as bx,Xr as by,si as bz,Js as c,jt as d,Ar as e,Os as f,B as g,E as h,He as i,b as j,Ls as k,Tr as l,y as m,Is as n,xn as o,Jn as p,ie as q,ms as r,Gn as s,wr as t,Ve as u,kt as v,Br as w,$r as x,ne as y,Hs as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/BWWgRDE1.js b/studio-desktop/frontend-dist/_app/immutable/chunks/BWWgRDE1.js deleted file mode 100644 index 171f7af6..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/BWWgRDE1.js +++ /dev/null @@ -1,2 +0,0 @@ -import{U as ne,b as Je,at as Be,h as S,c as q,au as Ge,a as ie,t as U,r as ft,Y as ut,s as je,d as W,e as V,av as ht,aw as pt,ax as Le,Q as C,ay as I,V as te,az as vt,X as gt,ah as _t,aA as qe,aB as Ee,aC as mt,aD as yt,a2 as bt,ac as xe,aE as St,R as Ue,T as Ye,aF as me,$ as oe,aG as $t,aH as wt,aI as kt,S as le,aJ as Tt,aK as At,E as Nt,aL as se,aM as Et,aN as Ot,aO as Pt,aP as Mt,aa as Ct,a5 as Oe,aQ as Ke,Z as Pe,aR as It,aS as Qe,aT as pe,aU as Xe,aV as jt,aW as Lt,aX as ae,aY as xt,K as Rt,G as zt,aZ as Ht,a_ as Dt,a$ as Vt,b0 as Wt,b1 as Ft,b2 as Jt,b3 as Bt,b4 as Gt,b5 as qt,b6 as Ut,as as Yt,m as ce,_ as Me,p as Kt,j,f as Qt,b7 as Xt,v as B,B as Zt,D as ea,C as ta,g as R,i as z,O as aa,b8 as sa,b9 as Ze,w as M,a4 as Y}from"./hL-aZVJ4.js";import"./DsnmJJEf.js";import{i as na}from"./D7CioVkw.js";import{B as ra,l as L,p as G,s as F}from"./B_6VzoXV.js";function ia(e,t){return t}function oa(e,t,a){for(var s=[],n=t.length,i,r=t.length,o=0;o{if(i){if(i.pending.delete(v),i.done.add(v),i.pending.size===0){var u=e.outrogroups;ke(Ee(i.done)),u.delete(i),u.size===0&&(e.outrogroups=null)}}else r-=1},!1)}if(r===0){var d=s.length===0&&a!==null;if(d){var c=a,l=c.parentNode;kt(l),l.append(c),e.items.clear()}ke(t,!d)}else i={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(i)}function ke(e,t=!0){for(var a=0;a{var p=a();return qe(p)?p:p==null?[]:Ee(p)}),u,_=!0;function $(){f.fallback=l,ca(f,u,r,t,s),l!==null&&(u.length===0?(l.f&I)===0?Ue(l):(l.f^=I,Z(l,null,r)):Ye(l,()=>{l=null}))}var k=Je(()=>{u=U(v);var p=u.length;let N=!1;if(S){var E=ft(r)===ut;E!==(p===0)&&(r=je(),q(r),W(!1),N=!0)}for(var b=new Set,O=C,m=gt(),g=0;gi(r)):(l=te(()=>i(Re??=ne())),l.f|=I)),p>b.size&&vt(),S&&p>0&&q(je()),!_)if(m){for(const[ge,_e]of o)b.has(ge)||O.skip_effect(_e.e);O.oncommit($),O.ondiscard(()=>{})}else $();N&&W(!0),U(v)}),f={effect:k,items:o,outrogroups:null,fallback:l};_=!1,S&&(r=V)}function K(e){for(;e!==null&&(e.f&$t)===0;)e=e.next;return e}function ca(e,t,a,s,n){var i=(s&wt)!==0,r=t.length,o=e.items,d=K(e.effect.first),c,l=null,v,u=[],_=[],$,k,f,p;if(i)for(p=0;p0){var A=(s&Be)!==0&&r===0?a:null;if(i){for(p=0;p{if(v!==void 0)for(f of v)f.nodes?.a?.apply()})}function da(e,t,a,s,n,i,r,o){var d=(r&mt)!==0?(r&yt)===0?bt(a,!1,!1):xe(a):null,c=(r&St)!==0?xe(n):null;return{v:d,i:c,e:te(()=>(i(t,d??a,c??n,o),()=>{e.delete(s)}))}}function Z(e,t,a){if(e.nodes)for(var s=e.nodes.start,n=e.nodes.end,i=t&&(t.f&I)===0?t.nodes.start:a;s!==null;){var r=Tt(s);if(i.before(s),s===n)return;s=r}}function x(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function H(e,t,a,s,n){S&&ie();var i=t.$$slots?.[a],r=!1;i===!0&&(i=t.children,r=!0),i===void 0||i(e,r?()=>s:s)}function fa(e,t,a,s,n,i){let r=S;S&&ie();var o=null;S&&V.nodeType===At&&(o=V,ie());var d=S?V:e,c=new ra(d,!1);Je(()=>{const l=t()||null;var v=Ot;if(l===null){c.ensure(null,null),se(!0);return}return c.ensure(l,u=>{if(l){if(o=S?o:Et(l,v),Pt(o,o),s){S&&Mt(l)&&o.append(document.createComment(""));var _=S?Ge(o):o.appendChild(ne());S&&(_===null?W(!1):q(_)),s(o,_)}Ct.nodes.end=o,u.before(o)}S&&q(u)}),se(!0),()=>{l&&se(!1)}},Nt),Oe(()=>{se(!0)}),r&&(W(!0),q(d))}function ua(e,t){var a=void 0,s;Ke(()=>{a!==(a=t())&&(s&&(le(s),s=null),a&&(s=te(()=>{Pe(()=>a(e))})))})}function et(e){var t,a,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var n=e.length;for(t=0;t=0;){var o=r+i;(r===0||ze.includes(s[r-1]))&&(o===s.length||ze.includes(s[o]))?s=(r===0?"":s.substring(0,r))+s.substring(o+1):r=o}}return s===""?null:s}function He(e,t=!1){var a=t?" !important;":";",s="";for(var n of Object.keys(e)){var i=e[n];i!=null&&i!==""&&(s+=" "+n+": "+i+a)}return s}function ye(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function ga(e,t){if(t){var a="",s,n;if(Array.isArray(t)?(s=t[0],n=t[1]):s=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var i=!1,r=0,o=!1,d=[];s&&d.push(...Object.keys(s).map(ye)),n&&d.push(...Object.keys(n).map(ye));var c=0,l=-1;const k=e.length;for(var v=0;v{de(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Oe(()=>{t.disconnect()})}function Va(e,t,a=t){var s=new WeakSet,n=!0;pe(e,"change",i=>{var r=i?"[selected]":":checked",o;if(e.multiple)o=[].map.call(e.querySelectorAll(r),ee);else{var d=e.querySelector(r)??e.querySelector("option:not([disabled])");o=d&&ee(d)}a(o),C!==null&&s.add(C)}),Pe(()=>{var i=t();if(e===document.activeElement){var r=Xe??C;if(s.has(r))return}if(de(e,i,n),n&&i===void 0){var o=e.querySelector(":checked");o!==null&&(i=ee(o),a(i))}e.__value=i,n=!1}),tt(e)}function ee(e){return"__value"in e?e.__value:e.value}const Q=Symbol("class"),X=Symbol("style"),at=Symbol("is custom element"),st=Symbol("is html"),ya=ae?"link":"LINK",ba=ae?"input":"INPUT",Sa=ae?"option":"OPTION",$a=ae?"select":"SELECT",wa=ae?"progress":"PROGRESS";function ka(e){if(S){var t=!1,a=()=>{if(!t){if(t=!0,e.hasAttribute("value")){var s=e.value;fe(e,"value",null),e.value=s}if(e.hasAttribute("checked")){var n=e.checked;fe(e,"checked",null),e.checked=n}}};e.__on_r=a,oe(a),Ft()}}function Wa(e,t){var a=Ce(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==wa)||(e.value=t??"")}function Ta(e,t){t?e.hasAttribute("selected")||e.setAttribute("selected",""):e.removeAttribute("selected")}function fe(e,t,a,s){var n=Ce(e);S&&(n[t]=e.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&e.nodeName===ya)||n[t]!==(n[t]=a)&&(t==="loading"&&(e[Gt]=a),a==null?e.removeAttribute(t):typeof a!="string"&&nt(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Aa(e,t,a,s,n=!1,i=!1){if(S&&n&&e.nodeName===ba){var r=e,o=r.type==="checkbox"?"defaultChecked":"defaultValue";o in a||ka(r)}var d=Ce(e),c=d[at],l=!d[st];let v=S&&c;v&&W(!1);var u=t||{},_=e.nodeName===Sa;for(var $ in t)$ in a||(a[$]=null);a.class?a.class=pa(a.class):(s||a[Q])&&(a.class=null),a[X]&&(a.style??=null);var k=nt(e);for(const m in a){let g=a[m];if(_&&m==="value"&&g==null){e.value=e.__value="",u[m]=g;continue}if(m==="class"){var f=e.namespaceURI==="http://www.w3.org/1999/xhtml";_a(e,f,g,s,t?.[Q],a[Q]),u[m]=g,u[Q]=a[Q];continue}if(m==="style"){ma(e,g,t?.[X],a[X]),u[m]=g,u[X]=a[X];continue}var p=u[m];if(!(g===p&&!(g===void 0&&e.hasAttribute(m)))){u[m]=g;var N=m[0]+m[1];if(N!=="$$")if(N==="on"){const w={},A="$$"+m;let y=m.slice(2);var E=qt(y);if(xt(y)&&(y=y.slice(0,-7),w.capture=!0),!E&&p){if(g!=null)continue;e.removeEventListener(y,u[A],w),u[A]=null}if(E)Rt(y,e,g),zt([y]);else if(g!=null){let ge=function(_e){u[m].call(this,_e)};u[A]=Ht(y,e,ge,w)}}else if(m==="style")fe(e,m,g);else if(m==="autofocus")Dt(e,!!g);else if(!c&&(m==="__value"||m==="value"&&g!=null))e.value=e.__value=g;else if(m==="selected"&&_)Ta(e,g);else{var b=m;l||(b=Vt(b));var O=b==="defaultValue"||b==="defaultChecked";if(g==null&&!c&&!O)if(d[m]=null,b==="value"||b==="checked"){let w=e;const A=t===void 0;if(b==="value"){let y=w.defaultValue;w.removeAttribute(b),w.defaultValue=y,w.value=w.__value=A?y:null}else{let y=w.defaultChecked;w.removeAttribute(b),w.defaultChecked=y,w.checked=A?y:!1}}else e.removeAttribute(m);else O||k.includes(b)&&(c||typeof g!="string")?(e[b]=g,b in d&&(d[b]=Wt)):typeof g!="function"&&fe(e,b,g)}}}return v&&W(!0),u}function De(e,t,a=[],s=[],n=[],i,r=!1,o=!1){jt(n,a,s,d=>{var c=void 0,l={},v=e.nodeName===$a,u=!1;if(Ke(()=>{var $=t(...d.map(U)),k=Aa(e,c,$,i,r,o);u&&v&&"value"in $&&de(e,$.value);for(let p of Object.getOwnPropertySymbols(l))$[p]||le(l[p]);for(let p of Object.getOwnPropertySymbols($)){var f=$[p];p.description===Lt&&(!c||f!==c[p])&&(l[p]&&le(l[p]),l[p]=te(()=>ua(e,()=>f))),k[p]=f}c=k}),v){var _=e;Pe(()=>{de(_,c.value,!0),tt(_)})}u=!0})}function Ce(e){return e.__attributes??={[at]:e.nodeName.includes("-"),[st]:e.namespaceURI===Jt}}var Ve=new Map;function nt(e){var t=e.getAttribute("is")||e.nodeName,a=Ve.get(t);if(a)return a;Ve.set(t,a=[]);for(var s,n=e,i=Element.prototype;i!==n;){s=Ut(n);for(var r in s)s[r].set&&a.push(r);n=Bt(n)}return a}function Fa(e,t,a=t){var s=new WeakSet;pe(e,"input",async n=>{var i=n?e.defaultValue:e.value;if(i=$e(e)?we(i):i,a(i),C!==null&&s.add(C),await Yt(),i!==(i=t())){var r=e.selectionStart,o=e.selectionEnd,d=e.value.length;if(e.value=i??"",o!==null){var c=e.value.length;r===o&&o===d&&c>d?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=r,e.selectionEnd=Math.min(o,c))}}}),(S&&e.defaultValue!==e.value||ce(t)==null&&e.value)&&(a($e(e)?we(e.value):e.value),C!==null&&s.add(C)),Me(()=>{var n=t();if(e===document.activeElement){var i=Xe??C;if(s.has(i))return}$e(e)&&n===we(e.value)||e.type==="date"&&!n&&!e.value||n!==e.value&&(e.value=n??"")})}const Se=new Set;function Ja(e,t,a,s,n=s){var i=a.getAttribute("type")==="checkbox",r=e;let o=!1;if(t!==null)for(var d of t)r=r[d]??=[];r.push(a),pe(a,"change",()=>{var c=a.__value;i&&(c=We(r,c,a.checked)),n(c)},()=>n(i?[]:null)),Me(()=>{var c=s();if(S&&a.defaultChecked!==a.checked){o=!0;return}i?(c=c||[],a.checked=c.includes(a.__value)):a.checked=Qe(a.__value,c)}),Oe(()=>{var c=r.indexOf(a);c!==-1&&r.splice(c,1)}),Se.has(r)||(Se.add(r),oe(()=>{r.sort((c,l)=>c.compareDocumentPosition(l)===4?-1:1),Se.delete(r)})),oe(()=>{if(o){var c;if(i)c=We(r,c,a.checked);else{var l=r.find(v=>v.checked);c=l?.__value}n(c)}})}function Ba(e,t,a=t){pe(e,"change",s=>{var n=s?e.defaultChecked:e.checked;a(n)}),(S&&e.defaultChecked!==e.checked||ce(t)==null)&&a(e.checked),Me(()=>{var s=t();e.checked=!!s})}function We(e,t,a){for(var s=new Set,n=0;n{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1};const Fe=(...e)=>e.filter((t,a,s)=>!!t&&t.trim()!==""&&s.indexOf(t)===a).join(" ").trim();var Oa=Xt("");function J(e,t){const a=L(t,["children","$$slots","$$events","$$legacy"]),s=L(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);Kt(t,!1);let n=G(t,"name",8,void 0),i=G(t,"color",8,"currentColor"),r=G(t,"size",8,24),o=G(t,"strokeWidth",8,2),d=G(t,"absoluteStrokeWidth",8,!1),c=G(t,"iconNode",24,()=>[]);na();var l=Oa();De(l,(_,$,k)=>({...Na,..._,...s,width:r(),height:r(),stroke:i(),"stroke-width":$,class:k}),[()=>Ea(s)?void 0:{"aria-hidden":"true"},()=>(B(d()),B(o()),B(r()),ce(()=>d()?Number(o())*24/Number(r()):o())),()=>(B(Fe),B(n()),B(a),ce(()=>Fe("lucide-icon","lucide",n()?`lucide-${n()}`:"",a.class)))]);var v=Zt(l);la(v,1,c,ia,(_,$)=>{var k=aa(()=>sa(U($),2));let f=()=>U(k)[0],p=()=>U(k)[1];var N=R(),E=z(N);fa(E,f,!0,(b,O)=>{De(b,()=>({...p()}))}),j(_,N)});var u=ea(v);H(u,t,"default",{}),ta(l),j(e,l),Qt()}function Ga(e,t){const a=L(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 2v4"}],["path",{d:"m16.2 7.8 2.9-2.9"}],["path",{d:"M18 12h4"}],["path",{d:"m16.2 16.2 2.9 2.9"}],["path",{d:"M12 18v4"}],["path",{d:"m4.9 19.1 2.9-2.9"}],["path",{d:"M2 12h4"}],["path",{d:"m4.9 4.9 2.9 2.9"}]];J(e,F({name:"loader"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=z(r);H(o,t,"default",{}),j(n,r)},$$slots:{default:!0}}))}function qa(e,t){const a=L(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];J(e,F({name:"plus"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=z(r);H(o,t,"default",{}),j(n,r)},$$slots:{default:!0}}))}class Pa{ws=null;listeners=new Map;url;reconnectAttempts=0;maxReconnectAttempts=5;reconnectTimer=null;_intentionalClose=!1;constructor(t){const a=window.location.protocol==="https:"?"wss:":"ws:";this.url=`${a}//${window.location.host}${t}`}connect(){this._intentionalClose=!1,this.ws=new WebSocket(this.url),this.ws.onopen=()=>{this.reconnectAttempts=0,this.notify("_open",{type:"_open",timestamp:""})},this.ws.onmessage=t=>{try{const a=JSON.parse(t.data);this.notify(a.type,a),this.notify("*",a)}catch{console.warn("[StudioWebSocket] Unparseable frame:",t.data)}},this.ws.onclose=()=>{this.notify("_close",{type:"_close",timestamp:""}),this._intentionalClose||this.attemptReconnect()},this.ws.onerror=()=>{this.notify("_error",{type:"_error",timestamp:""})}}attemptReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){this.notify("_reconnect_failed",{type:"_reconnect_failed",timestamp:""});return}this.reconnectAttempts++;const t=Math.min(1e3*Math.pow(2,this.reconnectAttempts-1),1e4);this.reconnectTimer=setTimeout(()=>{this.connect()},t)}notify(t,a){const s=this.listeners.get(t);if(s)for(const n of s)try{n(a)}catch(i){console.error(`[StudioWebSocket] Listener error for '${t}':`,i)}}on(t,a){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(a),()=>this.listeners.get(t)?.delete(a)}send(t){this.ws?.readyState===WebSocket.OPEN?this.ws.send(JSON.stringify(t)):console.warn("[StudioWebSocket] Cannot send: WebSocket not open")}get connected(){return this.ws?.readyState===WebSocket.OPEN}disconnect(){this._intentionalClose=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws?.close(),this.ws=null}}const P=M([]),ue=M([]);function Ua(){const e=Y(P),t=Y(ue);return{nodes:e.map(a=>({id:a.id,type:a.type??"pipeline_step",label:a.data?.label??a.id,position:a.position,data:a.data??{},width:a.measured?.width??a.width??null,height:a.measured?.height??a.height??null})),edges:t.map(a=>({id:a.id,source:a.source,target:a.target,source_handle:a.sourceHandle??"output",target_handle:a.targetHandle??"input",label:a.label??null})),metadata:{}}}const rt=M(null),Ya=Ze([P,rt],([e,t])=>t?e.find(a=>a.id===t)??null:null),it=M(new Map);function Ka(e,t){it.update(a=>{const s=new Map(a);return s.set(e,t),s}),Ma(e,"_executionState",t)}function Qa(){it.update(e=>{const t=new Map;for(const[a]of e)t.set(a,"idle");return t}),P.update(e=>e.map(t=>({...t,data:{...t.data,_executionState:"idle"}})))}let re=0;function Te(){const e=Y(P);let t=0;for(const a of e){const s=a.id.match(/-(\d+)$/);if(s){const n=parseInt(s[1],10);n>t&&(t=n)}}re=t}function Xa(e,t){re++;const a=`${e}-${re}`,s=Y(P),n=Y(rt);let i=250,r=200;const o=280,d=0;if(n){const l=s.find(v=>v.id===n);l&&(i=l.position.x+o,r=l.position.y+d)}else if(s.length>0){let l=-1/0,v=200;for(const u of s)u.position.x>l&&(l=u.position.x,v=u.position.y);i=l+o,r=v}s.some(l=>Math.abs(l.position.x-i)<20&&Math.abs(l.position.y-r)<20)&&(r+=120),P.update(l=>[...l,{id:a,type:e,position:{x:i,y:r},data:{label:`${t} ${re}`}}])}function Ma(e,t,a){P.update(s=>s.map(n=>n.id===e?{...n,data:{...n.data,[t]:a}}:n))}const ot="/api";async function h(e,t){const a=await fetch(`${ot}${e}`,{headers:{"Content-Type":"application/json"},...t});if(!a.ok){const s=await a.json().catch(()=>({detail:a.statusText}));throw new Error(s.detail||a.statusText)}return a.json()}const D={health:()=>h("/health"),registry:{agents:()=>h("/registry/agents"),tools:()=>h("/registry/tools"),patterns:()=>h("/registry/patterns")},projects:{list:()=>h("/projects"),create:(e,t)=>h("/projects",{method:"POST",body:JSON.stringify({name:e,description:t})}),delete:e=>h(`/projects/${e}`,{method:"DELETE"}),savePipeline:(e,t,a)=>h(`/projects/${e}/pipelines/${t}`,{method:"POST",body:JSON.stringify({graph:a})}),loadPipeline:(e,t)=>h(`/projects/${e}/pipelines/${t}`),getHistory:e=>h(`/projects/${e}/history`),restoreVersion:(e,t)=>h(`/projects/${e}/restore`,{method:"POST",body:JSON.stringify({commit_sha:t})}),bookmarkVersion:(e,t,a)=>h(`/projects/${e}/bookmark`,{method:"POST",body:JSON.stringify({commit_sha:t,label:a})})},files:{list:e=>h(`/projects/${e}/files`),read:(e,t)=>h(`/projects/${e}/files/${t}`)},evaluate:{uploadDataset:(e,t)=>{const a=new FormData;return a.append("file",t),fetch(`${ot}/projects/${e}/datasets/upload`,{method:"POST",body:a}).then(async s=>{if(!s.ok){const n=await s.json().catch(()=>({detail:s.statusText}));throw new Error(n.detail||s.statusText)}return s.json()})},listDatasets:e=>h(`/projects/${e}/datasets`),run:(e,t,a)=>h("/evaluate/run",{method:"POST",body:JSON.stringify({project:e,dataset:t,graph:a})})},experiments:{list:e=>h(`/projects/${e}/experiments`),create:(e,t,a)=>h(`/projects/${e}/experiments`,{method:"POST",body:JSON.stringify({name:t,variants:a})}),get:(e,t)=>h(`/projects/${e}/experiments/${t}`),delete:(e,t)=>h(`/projects/${e}/experiments/${t}`,{method:"DELETE"}),runVariant:(e,t,a,s,n)=>h(`/projects/${e}/experiments/${t}/run`,{method:"POST",body:JSON.stringify({variant_name:a,graph:s,input:n??""})})},codegen:{toCode:e=>h("/codegen/to-code",{method:"POST",body:JSON.stringify({graph:e})})},monitoring:{usage:()=>h("/monitoring/usage")},checkpoints:{list:()=>h("/checkpoints"),get:e=>h(`/checkpoints/${e}`),fork:(e,t)=>h("/checkpoints/fork",{method:"POST",body:JSON.stringify({from_index:e,modified_state:t})}),rewind:e=>h(`/checkpoints/${e}/rewind`,{method:"POST"}),diff:(e,t)=>h("/checkpoints/diff",{method:"POST",body:JSON.stringify({index_a:e,index_b:t})}),clear:()=>h("/checkpoints",{method:"DELETE"})},settings:{get:()=>h("/settings"),save:e=>h("/settings",{method:"POST",body:JSON.stringify(e)}),status:()=>h("/settings/status")},assistant:{getHistory:e=>h(`/assistant/${e}/history`),saveHistory:(e,t)=>h(`/assistant/${e}/history`,{method:"POST",body:JSON.stringify({messages:t})}),inferProjectName:e=>h("/assistant/infer-project-name",{method:"POST",body:JSON.stringify({message:e})})},oracle:{getInsights:e=>h(`/oracle/${e}/insights`),approveInsight:(e,t)=>h(`/oracle/${e}/insights/${t}/approve`,{method:"POST"}),skipInsight:(e,t)=>h(`/oracle/${e}/insights/${t}/skip`,{method:"POST"})},tunnel:{status:()=>h("/tunnel/status"),start:()=>h("/tunnel/start",{method:"POST"}),stop:()=>h("/tunnel/stop",{method:"POST"})},runtime:{start:e=>h(`/projects/${e}/runtime/start`,{method:"POST"}),stop:e=>h(`/projects/${e}/runtime/stop`,{method:"POST"}),status:e=>h(`/projects/${e}/runtime/status`),executions:e=>h(`/projects/${e}/runtime/executions`)},customTools:{list:()=>h("/custom-tools"),get:e=>h(`/custom-tools/${e}`),save:e=>h("/custom-tools",{method:"POST",body:JSON.stringify(e)}),delete:e=>h(`/custom-tools/${e}`,{method:"DELETE"}),register:e=>h(`/custom-tools/${e}/register`,{method:"POST"}),test:e=>h(`/custom-tools/${e}/test`,{method:"POST"}),catalog:()=>h("/custom-tools/catalog"),installConnector:(e,t)=>h(`/custom-tools/catalog/${e}/install`,{method:"POST",body:JSON.stringify(t??{})}),verifyConnector:e=>h(`/custom-tools/catalog/${e}/verify`,{method:"POST"})}},ve=M([]),Ae=M(!1),he=M(!1);let T=null;function Ca(e){lt(),T=new Pa(`/ws/oracle?project=${encodeURIComponent(e)}`),T.on("_open",()=>{Ae.set(!0)}),T.on("_close",()=>{Ae.set(!1)}),T.on("insight",t=>{const a=t;ve.update(s=>[a,...s])}),T.on("analysis_complete",()=>{he.set(!1)}),T.on("error",()=>{he.set(!1)}),T.on("canvas_synced",()=>{}),T.connect()}function lt(){T&&(T.disconnect(),T=null),Ae.set(!1),he.set(!1)}function Za(e,t){T?.connected&&T.send({action:"sync_canvas",nodes:e,edges:t})}function es(){T?.connected&&(he.set(!0),T.send({action:"analyze"}))}async function ts(e,t){const a=await D.oracle.approveInsight(e,t);return ve.update(s=>s.map(n=>n.id===t?{...n,status:"approved"}:n)),a.action_instruction??null}async function as(e,t){await D.oracle.skipInsight(e,t),ve.update(a=>a.map(s=>s.id===t?{...s,status:"skipped"}:s))}async function Ia(e){const t=await D.oracle.getInsights(e);ve.set(t)}const ja=[{id:"blank",name:"Blank",description:"Start with an empty canvas",nodes:[],edges:[]},{id:"simple-qa",name:"Simple Q&A Agent",description:"A single agent with a tool — the simplest working pipeline",nodes:[{id:"agent-1",type:"agent",position:{x:200,y:200},data:{label:"Q&A Agent",model:"openai:gpt-4.1",instructions:"You are a helpful assistant. Answer the user's questions clearly and concisely.",description:"Main Q&A agent"}},{id:"tool-1",type:"tool",position:{x:500,y:200},data:{label:"Web Search",description:"Search the web for relevant information"}}],edges:[{id:"edge-1",source:"agent-1",target:"tool-1",animated:!0}]},{id:"reasoning-pipeline",name:"Reasoning Pipeline",description:"Multi-step pipeline with reasoning, branching, and validation",nodes:[{id:"agent-1",type:"agent",position:{x:100,y:200},data:{label:"Input Agent",model:"openai:gpt-4.1",instructions:"Analyze the user input and prepare it for reasoning.",description:"Receives and preprocesses user input"}},{id:"reasoning-1",type:"reasoning",position:{x:350,y:200},data:{label:"Chain of Thought",pattern:"chain_of_thought",maxSteps:5}},{id:"condition-1",type:"condition",position:{x:600,y:200},data:{label:"Quality Check",condition:"result.confidence > 0.8"}},{id:"agent-2",type:"agent",position:{x:850,y:150},data:{label:"Output Agent",model:"openai:gpt-4.1-mini",instructions:"Format and present the final answer to the user.",description:"Formats final response"}},{id:"agent-3",type:"agent",position:{x:850,y:300},data:{label:"Retry Agent",model:"openai:gpt-4.1",instructions:"The previous reasoning was not confident enough. Try again with more detail.",description:"Retries with more detail"}}],edges:[{id:"edge-1",source:"agent-1",target:"reasoning-1",animated:!0},{id:"edge-2",source:"reasoning-1",target:"condition-1",animated:!0},{id:"edge-3",source:"condition-1",target:"agent-2",animated:!0},{id:"edge-4",source:"condition-1",target:"agent-3",animated:!0}]}],ct="fireflyStudio:selectedProject",La=M(null),Ne=M([]);async function dt(e){La.set(e);try{localStorage.setItem(ct,e.name)}catch{}try{const t=await D.projects.loadPipeline(e.name,"main");if(t&&typeof t=="object"){const a=t;a.nodes&&P.set(a.nodes),a.edges&&ue.set(a.edges),Te()}}catch{P.set([]),ue.set([]),Te()}lt(),Ca(e.name),Ia(e.name).catch(()=>{})}async function ss(e){const t=await D.projects.create(e);await xa();const s=Y(Ne).find(n=>n.name===e);return s&&dt(s),t}async function xa(){try{let e=await D.projects.list();if(e.length===0){Ne.set([]);return}Ne.set(e);let t;try{const a=localStorage.getItem(ct);a&&(t=e.find(s=>s.name===a))}catch{}dt(t??e[0])}catch(e){console.warn("[studio] Failed to initialise projects:",e)}}function ns(e,t){const a=ja.find(n=>n.id===e);if(!a)return;const s=a.nodes;P.set(s),ue.set(a.edges),Te()}function rs(e,t){const a=L(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2"}],["rect",{x:"14",y:"2",width:"8",height:"8",rx:"1"}]];J(e,F({name:"blocks"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=z(r);H(o,t,"default",{}),j(n,r)},$$slots:{default:!0}}))}function is(e,t){const a=L(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 18V5"}],["path",{d:"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4"}],["path",{d:"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5"}],["path",{d:"M17.997 5.125a4 4 0 0 1 2.526 5.77"}],["path",{d:"M18 18a4 4 0 0 0 2-7.464"}],["path",{d:"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517"}],["path",{d:"M6 18a4 4 0 0 1-2-7.464"}],["path",{d:"M6.003 5.125a4 4 0 0 0-2.526 5.77"}]];J(e,F({name:"brain"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=z(r);H(o,t,"default",{}),j(n,r)},$$slots:{default:!0}}))}function os(e,t){const a=L(t,["children","$$slots","$$events","$$legacy"]);const s=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5"}],["path",{d:"M3 12A9 3 0 0 0 21 12"}]];J(e,F({name:"database"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=z(r);H(o,t,"default",{}),j(n,r)},$$slots:{default:!0}}))}const Ie=M(null),ls=Ze(Ie,e=>{const t=new Set;if(!e)return t;const a=e.credentials;return a.openai_api_key&&t.add("openai"),a.anthropic_api_key&&t.add("anthropic"),a.google_api_key&&t.add("google"),a.groq_api_key&&t.add("groq"),a.mistral_api_key&&t.add("mistral"),a.deepseek_api_key&&t.add("deepseek"),a.cohere_api_key&&t.add("cohere"),a.azure_openai_api_key&&t.add("azure"),a.aws_access_key_id&&t.add("bedrock"),a.ollama_base_url&&t.add("ollama"),t});async function cs(){try{const e=await D.settings.get();Ie.set(e)}catch(e){console.warn("[studio] Failed to load settings:",e)}}async function ds(e,t,a,s){const n={};e!==void 0&&(n.credentials=e),t!==void 0&&(n.model_defaults=t),n.setup_complete=a,s!==void 0&&(n.user_profile=s);try{const i=await D.settings.save(n);Ie.set(i)}catch(i){throw console.error("[studio] Failed to save settings:",i),i}}function fs(e,t){const a=L(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];J(e,F({name:"x"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=z(r);H(o,t,"default",{}),j(n,r)},$$slots:{default:!0}}))}function us(e,t){const a=L(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}],["path",{d:"M10 9H8"}],["path",{d:"M16 13H8"}],["path",{d:"M16 17H8"}]];J(e,F({name:"file-text"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=R(),o=z(r);H(o,t,"default",{}),j(n,r)},$$slots:{default:!0}}))}export{as as $,ds as A,is as B,cs as C,os as D,Za as E,us as F,ue as G,Te as H,J as I,rt as J,De as K,Ga as L,Q as M,X as N,pa as O,qa as P,Va as Q,Ma as R,Pa as S,Ya as T,Ba as U,Ja as V,ve as W,fs as X,Ae as Y,he as Z,ts as _,_a as a,Fa as b,D as c,ss as d,la as e,ja as f,Ie as g,rs as h,fe as i,dt as j,Ka as k,ns as l,Qa as m,ka as n,Wa as o,Ne as p,ma as q,es as r,H as s,ls as t,ia as u,La as v,Ua as w,P as x,xa as y,Xa as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/BX0kmcoN.js b/studio-desktop/frontend-dist/_app/immutable/chunks/BX0kmcoN.js deleted file mode 100644 index abbb82aa..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/BX0kmcoN.js +++ /dev/null @@ -1 +0,0 @@ -import{h as o,a as v,b as y,E as f,r as l,s as m,c as p,d as i,H as T,e as A}from"./DCyBifBO.js";import{B as E}from"./v7tHB-Lt.js";function g(d,_,e){var s;o&&(s=A,v());var r=new E(d);y(()=>{var a=_()??null;if(o){var h=l(s),c=h===T,u=a!==null;if(c!==u){var t=m();p(t),r.anchor=t,i(!1),r.ensure(a,a&&(n=>e(n,a))),i(!0);return}}r.ensure(a,a&&(n=>e(n,a)))},f)}export{g as c}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/B_6VzoXV.js b/studio-desktop/frontend-dist/_app/immutable/chunks/B_6VzoXV.js deleted file mode 100644 index 1319b442..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/B_6VzoXV.js +++ /dev/null @@ -1 +0,0 @@ -import{Q as E,R as H,S as P,T as q,U as I,V as D,h as m,e as Z,W as z,X as G,b as J,a as Q,E as V,r as W,H as X,Y as k,s as ee,c as se,d as N,Z as re,_ as te,m as B,$ as ne,a0 as R,a1 as y,a2 as ie,a3 as ae,a4 as fe,t as b,a5 as ue,a6 as ce,L as U,a7 as g,a8 as oe,a9 as K,J as le,aa as T,ab as de,ac as pe,ad as he,ae as _e,af as ve,ag as be,x as Se,ah as we,ai as L,aj as M,ak as _,al as j,am as Pe,an as me}from"./hL-aZVJ4.js";class ge{anchor;#s=new Map;#r=new Map;#e=new Map;#t=new Set;#n=!0;constructor(e,t=!0){this.anchor=e,this.#n=t}#i=()=>{var e=E;if(this.#s.has(e)){var t=this.#s.get(e),r=this.#r.get(t);if(r)H(r),this.#t.delete(t);else{var n=this.#e.get(t);n&&(this.#r.set(t,n.effect),this.#e.delete(t),n.fragment.lastChild.remove(),this.anchor.before(n.fragment),r=n.effect)}for(const[i,f]of this.#s){if(this.#s.delete(i),i===e)break;const a=this.#e.get(f);a&&(P(a.effect),this.#e.delete(f))}for(const[i,f]of this.#r){if(i===t||this.#t.has(i))continue;const a=()=>{if(Array.from(this.#s.values()).includes(i)){var o=document.createDocumentFragment();z(f,o),o.append(I()),this.#e.set(i,{effect:f,fragment:o})}else P(f);this.#t.delete(i),this.#r.delete(i)};this.#n||!r?(this.#t.add(i),q(f,a,!1)):a()}}};#a=e=>{this.#s.delete(e);const t=Array.from(this.#s.values());for(const[r,n]of this.#e)t.includes(r)||(P(n.effect),this.#e.delete(r))};ensure(e,t){var r=E,n=G();if(t&&!this.#r.has(e)&&!this.#e.has(e))if(n){var i=document.createDocumentFragment(),f=I();i.append(f),this.#e.set(e,{effect:D(()=>t(f)),fragment:i})}else this.#r.set(e,D(()=>t(this.anchor)));if(this.#s.set(r,e),n){for(const[a,u]of this.#r)a===e?r.unskip_effect(u):r.skip_effect(u);for(const[a,u]of this.#e)a===e?r.unskip_effect(u.effect):r.skip_effect(u.effect);r.oncommit(this.#i),r.ondiscard(this.#a)}else m&&(this.anchor=Z),this.#i()}}function Ie(s,e,t=!1){m&&Q();var r=new ge(s),n=t?V:0;function i(f,a){if(m){const l=W(s);var u;if(l===X?u=0:l===k?u=!1:u=parseInt(l.substring(1)),f!==u){var o=ee();se(o),r.anchor=o,N(!1),r.ensure(f,a),N(!0);return}}r.ensure(f,a)}J(()=>{var f=!1;e((a,u=0)=>{f=!0,i(u,a)}),f||i(!1,null)},n)}function Y(s,e){return s===e||s?.[R]===e}function De(s={},e,t,r){return re(()=>{var n,i;return te(()=>{n=i,i=[],B(()=>{s!==t(...i)&&(e(s,...i),n&&Y(t(...n),s)&&e(null,...n))})}),()=>{ne(()=>{i&&Y(t(...i),s)&&e(null,...i)})}}),s}let v=!1,x=Symbol();function Ne(s,e,t){const r=t[e]??={store:null,source:ie(void 0),unsubscribe:y};if(r.store!==s&&!(x in t))if(r.unsubscribe(),r.store=s??null,s==null)r.source.v=void 0,r.unsubscribe=y;else{var n=!0;r.unsubscribe=ae(s,i=>{n?r.source.v=i:U(r.source,i)}),n=!1}return s&&x in t?fe(s):b(r.source)}function ye(s,e){return s.set(e),e}function Le(){const s={};function e(){ue(()=>{for(var t in s)s[t].unsubscribe();ce(s,x,{enumerable:!1,value:!0})})}return[s,e]}function Me(){v=!0}function xe(s){var e=v;try{return v=!1,[s(),v]}finally{v=e}}const Re={get(s,e){if(!s.exclude.includes(e))return s.props[e]},set(s,e){return!1},getOwnPropertyDescriptor(s,e){if(!s.exclude.includes(e)&&e in s.props)return{enumerable:!0,configurable:!0,value:s.props[e]}},has(s,e){return s.exclude.includes(e)?!1:e in s.props},ownKeys(s){return Reflect.ownKeys(s.props).filter(e=>!s.exclude.includes(e))}};function Ye(s,e,t){return new Proxy({props:s,exclude:e},Re)}const Te={get(s,e){if(!s.exclude.includes(e))return b(s.version),e in s.special?s.special[e]():s.props[e]},set(s,e,t){if(!(e in s.special)){var r=T;try{M(s.parent_effect),s.special[e]=Ae({get[e](){return s.props[e]}},e,K)}finally{M(r)}}return s.special[e](t),L(s.version),!0},getOwnPropertyDescriptor(s,e){if(!s.exclude.includes(e)&&e in s.props)return{enumerable:!0,configurable:!0,value:s.props[e]}},deleteProperty(s,e){return s.exclude.includes(e)||(s.exclude.push(e),L(s.version)),!0},has(s,e){return s.exclude.includes(e)?!1:e in s.props},ownKeys(s){return Reflect.ownKeys(s.props).filter(e=>!s.exclude.includes(e))}};function Be(s,e){return new Proxy({props:s,exclude:e,special:{},version:pe(0),parent_effect:T},Te)}const Oe={get(s,e){let t=s.props.length;for(;t--;){let r=s.props[t];if(_(r)&&(r=r()),typeof r=="object"&&r!==null&&e in r)return r[e]}},set(s,e,t){let r=s.props.length;for(;r--;){let n=s.props[r];_(n)&&(n=n());const i=g(n,e);if(i&&i.set)return i.set(t),!0}return!1},getOwnPropertyDescriptor(s,e){let t=s.props.length;for(;t--;){let r=s.props[t];if(_(r)&&(r=r()),typeof r=="object"&&r!==null&&e in r){const n=g(r,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(s,e){if(e===R||e===j)return!1;for(let t of s.props)if(_(t)&&(t=t()),t!=null&&e in t)return!0;return!1},ownKeys(s){const e=[];for(let t of s.props)if(_(t)&&(t=t()),!!t){for(const r in t)e.includes(r)||e.push(r);for(const r of Object.getOwnPropertySymbols(t))e.includes(r)||e.push(r)}return e}};function Ue(...s){return new Proxy({props:s},Oe)}function Ae(s,e,t,r){var n=!_e||(t&ve)!==0,i=(t&he)!==0,f=(t&Pe)!==0,a=r,u=!0,o=()=>(u&&(u=!1,a=f?B(r):r),a),l;if(i){var F=R in s||j in s;l=g(s,e)?.set??(F&&e in s?c=>s[e]=c:void 0)}var p,O=!1;i?[p,O]=xe(()=>s[e]):p=s[e],p===void 0&&r!==void 0&&(p=o(),l&&(n&&oe(),l(p)));var d;if(n?d=()=>{var c=s[e];return c===void 0?o():(u=!0,c)}:d=()=>{var c=s[e];return c!==void 0&&(a=void 0),c===void 0?a:c},n&&(t&K)===0)return d;if(l){var $=s.$$legacy;return(function(c,S){return arguments.length>0?((!n||!S||$||O)&&l(S?d():c),c):d()})}var w=!1,h=((t&be)!==0?Se:we)(()=>(w=!1,d()));i&&b(h);var C=T;return(function(c,S){if(arguments.length>0){const A=S?b(h):n&&i?le(c):c;return U(h,A),w=!0,a!==void 0&&(a=A),c}return me&&w||(C.f&de)!==0?h.v:b(h)})}export{ge as B,Le as a,De as b,Ne as c,ye as d,Ie as i,Be as l,Me as m,Ae as p,Ye as r,Ue as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/Biw60Ycb.js b/studio-desktop/frontend-dist/_app/immutable/chunks/Biw60Ycb.js deleted file mode 100644 index d3e71c0f..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/Biw60Ycb.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import"./CiPkpaXo.js";import{c as d,f as c,a as i}from"./BESIXtBI.js";import{I as l,s as $}from"./0zSFSexy.js";import{l as p,s as f}from"./CJh9TUc0.js";function N(a,t){const o=p(t,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M5 12h14"}],["path",{d:"m12 5 7 7-7 7"}]];l(a,f({name:"arrow-right"},()=>o,{get iconNode(){return r},children:(s,h)=>{var e=d(),n=c(e);$(n,t,"default",{}),i(s,e)},$$slots:{default:!0}}))}function y(a,t){const o=p(t,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"}]];l(a,f({name:"folder"},()=>o,{get iconNode(){return r},children:(s,h)=>{var e=d(),n=c(e);$(n,t,"default",{}),i(s,e)},$$slots:{default:!0}}))}function M(a,t){const o=p(t,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87"}],["circle",{cx:"9",cy:"7",r:"4"}]];l(a,f({name:"users"},()=>o,{get iconNode(){return r},children:(s,h)=>{var e=d(),n=c(e);$(n,t,"default",{}),i(s,e)},$$slots:{default:!0}}))}export{N as A,y as F,M as U}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/CCyXRANn.js b/studio-desktop/frontend-dist/_app/immutable/chunks/CCyXRANn.js deleted file mode 100644 index e1428710..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/CCyXRANn.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import"./FsCUQR17.js";import{c as n,f as d,a as c}from"./BNectIeB.js";import{I as i,s as p}from"./K2hNZgUo.js";import{l as $,s as h}from"./BB2KRr3j.js";function z(e,a){const o=$(a,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"}],["path",{d:"M20 2v4"}],["path",{d:"M22 4h-4"}],["circle",{cx:"4",cy:"20",r:"2"}]];i(e,h({name:"sparkles"},()=>o,{get iconNode(){return s},children:(r,m)=>{var t=n(),l=d(t);p(l,a,"default",{}),c(r,t)},$$slots:{default:!0}}))}function M(e,a){const o=$(a,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"}],["path",{d:"M6 12h16"}]];i(e,h({name:"send-horizontal"},()=>o,{get iconNode(){return s},children:(r,m)=>{var t=n(),l=d(t);p(l,a,"default",{}),c(r,t)},$$slots:{default:!0}}))}export{z as S,M as a}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/CFyDcTgg.js b/studio-desktop/frontend-dist/_app/immutable/chunks/CFyDcTgg.js deleted file mode 100644 index 728ff326..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/CFyDcTgg.js +++ /dev/null @@ -1 +0,0 @@ -import{h as o,a as v,b as y,E as f,r as l,s as m,c as p,d as i,H as T,e as A}from"./hL-aZVJ4.js";import{B as E}from"./B_6VzoXV.js";function g(d,_,e){var s;o&&(s=A,v());var r=new E(d);y(()=>{var a=_()??null;if(o){var h=l(s),c=h===T,u=a!==null;if(c!==u){var t=m();p(t),r.anchor=t,i(!1),r.ensure(a,a&&(n=>e(n,a))),i(!0);return}}r.ensure(a,a&&(n=>e(n,a)))},f)}export{g as c}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/CJh9TUc0.js b/studio-desktop/frontend-dist/_app/immutable/chunks/CJh9TUc0.js deleted file mode 100644 index 4d647b93..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/CJh9TUc0.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as I,$ as H,a0 as E,a1 as G,a2 as D,a3 as L,h as R,i as z,a4 as W,a5 as Z,d as J,b as Q,E as V,r as X,H as k,a6 as ee,s as re,e as se,g as N,a7 as te,a8 as ne,m as C,a9 as ie,aa as A,ab as M,O as ae,ac as ue,ad as fe,t as P,ae as oe,M as ce,G as Y,af as x,ag as le,ah as q,U as de,ai as T,aj as he,ak as pe,al as _e,am as ve,an as be,ao as me,x as we,ap as Pe,aq as $,ar as U,as as m,L as K,at as Se,au as ge}from"./BESIXtBI.js";class Ee{anchor;#r=new Map;#s=new Map;#e=new Map;#t=new Set;#n=!0;constructor(e,t=!0){this.anchor=e,this.#n=t}#i=()=>{var e=I;if(this.#r.has(e)){var t=this.#r.get(e),s=this.#s.get(t);if(s)H(s),this.#t.delete(t);else{var n=this.#e.get(t);n&&(this.#s.set(t,n.effect),this.#e.delete(t),n.fragment.lastChild.remove(),this.anchor.before(n.fragment),s=n.effect)}for(const[i,u]of this.#r){if(this.#r.delete(i),i===e)break;const a=this.#e.get(u);a&&(E(a.effect),this.#e.delete(u))}for(const[i,u]of this.#s){if(i===t||this.#t.has(i))continue;const a=()=>{if(Array.from(this.#r.values()).includes(i)){var d=document.createDocumentFragment();W(u,d),d.append(D()),this.#e.set(i,{effect:u,fragment:d})}else E(u);this.#t.delete(i),this.#s.delete(i)};this.#n||!s?(this.#t.add(i),G(u,a,!1)):a()}}};#a=e=>{this.#r.delete(e);const t=Array.from(this.#r.values());for(const[s,n]of this.#e)t.includes(s)||(E(n.effect),this.#e.delete(s))};ensure(e,t){var s=I,n=Z();if(t&&!this.#s.has(e)&&!this.#e.has(e))if(n){var i=document.createDocumentFragment(),u=D();i.append(u),this.#e.set(e,{effect:L(()=>t(u)),fragment:i})}else this.#s.set(e,L(()=>t(this.anchor)));if(this.#r.set(s,e),n){for(const[a,o]of this.#s)a===e?s.unskip_effect(o):s.skip_effect(o);for(const[a,o]of this.#e)a===e?s.unskip_effect(o.effect):s.skip_effect(o.effect);s.oncommit(this.#i),s.ondiscard(this.#a)}else R&&(this.anchor=z),this.#i()}}function Le(r,e,t=!1){R&&Q();var s=new Ee(r),n=t?V:0;function i(u,a){if(R){const f=X(r);var o;if(f===k?o=0:f===ee?o=!1:o=parseInt(f.substring(1)),u!==o){var d=re();se(d),s.anchor=d,N(!1),s.ensure(u,a),N(!0);return}}s.ensure(u,a)}J(()=>{var u=!1;e((a,o=0)=>{u=!0,i(o,a)}),u||i(!1,null)},n)}function B(r,e){return r===e||r?.[A]===e}function Ne(r={},e,t,s){return te(()=>{var n,i;return ne(()=>{n=i,i=[],C(()=>{r!==t(...i)&&(e(r,...i),n&&B(t(...n),r)&&e(null,...n))})}),()=>{ie(()=>{i&&B(t(...i),r)&&e(null,...i)})}}),r}let w=!1,O=Symbol();function Me(r,e,t){const s=t[e]??={store:null,source:ae(void 0),unsubscribe:M};if(s.store!==r&&!(O in t))if(s.unsubscribe(),s.store=r??null,r==null)s.source.v=void 0,s.unsubscribe=M;else{var n=!0;s.unsubscribe=ue(r,i=>{n?s.source.v=i:Y(s.source,i)}),n=!1}return r&&O in t?fe(r):P(s.source)}function $e(r,e){return r.set(e),e}function Ue(){const r={};function e(){oe(()=>{for(var t in r)r[t].unsubscribe();ce(r,O,{enumerable:!1,value:!0})})}return[r,e]}function Be(){w=!0}function Re(r){var e=w;try{return w=!1,[r(),w]}finally{w=e}}const xe={get(r,e){if(!r.exclude.includes(e))return r.props[e]},set(r,e){return!1},getOwnPropertyDescriptor(r,e){if(!r.exclude.includes(e)&&e in r.props)return{enumerable:!0,configurable:!0,value:r.props[e]}},has(r,e){return r.exclude.includes(e)?!1:e in r.props},ownKeys(r){return Reflect.ownKeys(r.props).filter(e=>!r.exclude.includes(e))}};function je(r,e,t){return new Proxy({props:r,exclude:e},xe)}const Oe={get(r,e){if(!r.exclude.includes(e))return P(r.version),e in r.special?r.special[e]():r.props[e]},set(r,e,t){if(!(e in r.special)){var s=T;try{U(r.parent_effect),r.special[e]=Te({get[e](){return r.props[e]}},e,q)}finally{U(s)}}return r.special[e](t),$(r.version),!0},getOwnPropertyDescriptor(r,e){if(!r.exclude.includes(e)&&e in r.props)return{enumerable:!0,configurable:!0,value:r.props[e]}},deleteProperty(r,e){return r.exclude.includes(e)||(r.exclude.push(e),$(r.version)),!0},has(r,e){return r.exclude.includes(e)?!1:e in r.props},ownKeys(r){return Reflect.ownKeys(r.props).filter(e=>!r.exclude.includes(e))}};function Ce(r,e){return new Proxy({props:r,exclude:e,special:{},version:pe(0),parent_effect:T},Oe)}const Ae={get(r,e){let t=r.props.length;for(;t--;){let s=r.props[t];if(m(s)&&(s=s()),typeof s=="object"&&s!==null&&e in s)return s[e]}},set(r,e,t){let s=r.props.length;for(;s--;){let n=r.props[s];m(n)&&(n=n());const i=x(n,e);if(i&&i.set)return i.set(t),!0}return!1},getOwnPropertyDescriptor(r,e){let t=r.props.length;for(;t--;){let s=r.props[t];if(m(s)&&(s=s()),typeof s=="object"&&s!==null&&e in s){const n=x(s,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(r,e){if(e===A||e===K)return!1;for(let t of r.props)if(m(t)&&(t=t()),t!=null&&e in t)return!0;return!1},ownKeys(r){const e=[];for(let t of r.props)if(m(t)&&(t=t()),!!t){for(const s in t)e.includes(s)||e.push(s);for(const s of Object.getOwnPropertySymbols(t))e.includes(s)||e.push(s)}return e}};function Ye(...r){return new Proxy({props:r},Ae)}function Te(r,e,t,s){var n=!ve||(t&be)!==0,i=(t&_e)!==0,u=(t&Se)!==0,a=s,o=!0,d=()=>(o&&(o=!1,a=u?C(s):s),a),f;if(i){var _=A in r||K in r;f=x(r,e)?.set??(_&&e in r?c=>r[e]=c:void 0)}var h,p=!1;i?[h,p]=Re(()=>r[e]):h=r[e],h===void 0&&s!==void 0&&(h=d(),f&&(n&&le(),f(h)));var l;if(n?l=()=>{var c=r[e];return c===void 0?d():(o=!0,c)}:l=()=>{var c=r[e];return c!==void 0&&(a=void 0),c===void 0?a:c},n&&(t&q)===0)return l;if(f){var v=r.$$legacy;return(function(c,S){return arguments.length>0?((!n||!S||v||p)&&f(S?l():c),c):l()})}var g=!1,b=((t&me)!==0?we:Pe)(()=>(g=!1,l()));i&&P(b);var F=T;return(function(c,S){if(arguments.length>0){const y=S?P(b):n&&i?de(c):c;return Y(b,y),g=!0,a!==void 0&&(a=y),c}return ge&&g||(F.f&he)!==0?b.v:P(b)})}const ye="modulepreload",Ie=function(r,e){return new URL(r,e).href},j={},qe=function(e,t,s){let n=Promise.resolve();if(t&&t.length>0){let d=function(f){return Promise.all(f.map(_=>Promise.resolve(_).then(h=>({status:"fulfilled",value:h}),h=>({status:"rejected",reason:h}))))};const u=document.getElementsByTagName("link"),a=document.querySelector("meta[property=csp-nonce]"),o=a?.nonce||a?.getAttribute("nonce");n=d(t.map(f=>{if(f=Ie(f,s),f in j)return;j[f]=!0;const _=f.endsWith(".css"),h=_?'[rel="stylesheet"]':"";if(s)for(let l=u.length-1;l>=0;l--){const v=u[l];if(v.href===f&&(!_||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${f}"]${h}`))return;const p=document.createElement("link");if(p.rel=_?"stylesheet":ye,_||(p.as="script"),p.crossOrigin="",p.href=f,o&&p.setAttribute("nonce",o),document.head.appendChild(p),_)return new Promise((l,v)=>{p.addEventListener("load",l),p.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${f}`)))})}))}function i(u){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=u,window.dispatchEvent(a),!a.defaultPrevented)throw u}return n.then(u=>{for(const a of u||[])a.status==="rejected"&&i(a.reason);return e().catch(i)})};export{Ee as B,qe as _,Ue as a,Ne as b,Me as c,$e as d,Le as i,Ce as l,Be as m,Te as p,je as r,Ye as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/CKy8R5Mg.js b/studio-desktop/frontend-dist/_app/immutable/chunks/CKy8R5Mg.js deleted file mode 100644 index ea68bdde..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/CKy8R5Mg.js +++ /dev/null @@ -1 +0,0 @@ -import{w as s}from"./BNectIeB.js";const a=s(!0),e=s(!1),n=s("console"),o=s(!0),c=s(!1),r=s(!1),l=s(!1),p=s(!1);export{e as a,n as b,o as c,c as d,r as e,p as f,a as r,l as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/CdQ27ih8.js b/studio-desktop/frontend-dist/_app/immutable/chunks/CdQ27ih8.js deleted file mode 100644 index 1a2642f3..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/CdQ27ih8.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import"./l8YpzWR9.js";import{f as l,g as c,i as d}from"./DCyBifBO.js";import{I as i,s as $}from"./BAxs8Xtu.js";import{l as p,s as h}from"./v7tHB-Lt.js";function y(t,e){const o=p(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"}],["path",{d:"M20 2v4"}],["path",{d:"M22 4h-4"}],["circle",{cx:"4",cy:"20",r:"2"}]];i(t,h({name:"sparkles"},()=>o,{get iconNode(){return r},children:(s,m)=>{var a=l(),n=c(a);$(n,e,"default",{}),d(s,a)},$$slots:{default:!0}}))}function z(t,e){const o=p(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2"}],["circle",{cx:"9",cy:"9",r:"2"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"}]];i(t,h({name:"image"},()=>o,{get iconNode(){return r},children:(s,m)=>{var a=l(),n=c(a);$(n,e,"default",{}),d(s,a)},$$slots:{default:!0}}))}function N(t,e){const o=p(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"}],["path",{d:"M6 12h16"}]];i(t,h({name:"send-horizontal"},()=>o,{get iconNode(){return r},children:(s,m)=>{var a=l(),n=c(a);$(n,e,"default",{}),d(s,a)},$$slots:{default:!0}}))}export{z as I,y as S,N as a}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/CiPkpaXo.js b/studio-desktop/frontend-dist/_app/immutable/chunks/CiPkpaXo.js deleted file mode 100644 index fdd8412f..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/CiPkpaXo.js +++ /dev/null @@ -1 +0,0 @@ -import{k as d,u as g,l as c,m,n as i,q as b,t as p,v,x as k,y}from"./BESIXtBI.js";function x(n=!1){const s=d,e=s.l.u;if(!e)return;let f=()=>v(s.s);if(n){let a=0,t={};const _=k(()=>{let l=!1;const r=s.s;for(const o in r)r[o]!==t[o]&&(t[o]=r[o],l=!0);return l&&a++,a});f=()=>p(_)}e.b.length&&g(()=>{u(s,f),i(e.b)}),c(()=>{const a=m(()=>e.m.map(b));return()=>{for(const t of a)typeof t=="function"&&t()}}),e.a.length&&c(()=>{u(s,f),i(e.a)})}function u(n,s){if(n.l.s)for(const e of n.l.s)p(e);s()}y();export{x as i}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/D7CioVkw.js b/studio-desktop/frontend-dist/_app/immutable/chunks/D7CioVkw.js deleted file mode 100644 index c63864e4..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/D7CioVkw.js +++ /dev/null @@ -1 +0,0 @@ -import{k as d,u as g,l as c,m,n as i,q as b,t as p,v,x as k,y}from"./hL-aZVJ4.js";function x(n=!1){const s=d,e=s.l.u;if(!e)return;let f=()=>v(s.s);if(n){let a=0,t={};const _=k(()=>{let l=!1;const r=s.s;for(const o in r)r[o]!==t[o]&&(t[o]=r[o],l=!0);return l&&a++,a});f=()=>p(_)}e.b.length&&g(()=>{u(s,f),i(e.b)}),c(()=>{const a=m(()=>e.m.map(b));return()=>{for(const t of a)typeof t=="function"&&t()}}),e.a.length&&c(()=>{u(s,f),i(e.a)})}function u(n,s){if(n.l.s)for(const e of n.l.s)p(e);s()}y();export{x as i}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DCyBifBO.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DCyBifBO.js deleted file mode 100644 index 3d493cd4..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DCyBifBO.js +++ /dev/null @@ -1,2 +0,0 @@ -var Nn=Array.isArray,On=Array.prototype.indexOf,me=Array.prototype.includes,Rn=Array.from,kn=Object.defineProperty,Ne=Object.getOwnPropertyDescriptor,Mn=Object.getOwnPropertyDescriptors,Dn=Object.prototype,Cn=Array.prototype,Rt=Object.getPrototypeOf,bt=Object.isExtensible;function Wr(e){return typeof e=="function"}const de=()=>{};function $r(e){return e()}function kt(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function Gr(e,t,n=!1){return e===void 0?n?t():t:e}function Kr(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}function Xr(e,t){var n={};for(var r in e)t.includes(r)||(n[r]=e[r]);for(var s of Object.getOwnPropertySymbols(e))Object.propertyIsEnumerable.call(e,s)&&!t.includes(s)&&(n[s]=e[s]);return n}const S=2,De=4,Ce=8,ot=1<<24,Z=16,$=32,le=64,Je=128,C=512,T=1024,x=2048,Y=4096,z=8192,re=16384,fe=32768,ke=65536,yt=1<<17,Dt=1<<18,be=1<<19,Ct=1<<20,Zr=1<<25,pe=65536,Qe=1<<21,ut=1<<22,se=1<<23,he=Symbol("$state"),Jr=Symbol("legacy props"),Qr=Symbol(""),ue=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},ts=!!globalThis.document?.contentType&&globalThis.document.contentType.includes("xml"),ns=1,Ie=3,We=8;function ct(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function In(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function rs(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Pn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Ln(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Fn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function jn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Vn(){throw new Error("https://svelte.dev/e/hydration_failed")}function ss(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Hn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function qn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Yn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Bn(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const is=1,as=2,fs=4,ls=8,os=16,us=1,cs=2,_s=4,ds=8,hs=16,vs=4,It=1,zn=2,Pt="[",Lt="[!",wt="[?",Ft="]",Ee={},A=Symbol(),Un="http://www.w3.org/1999/xhtml",ps="http://www.w3.org/2000/svg",gs="http://www.w3.org/1998/Math/MathML",bs="@attach";function $e(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function ys(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Wn(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let E=!1;function He(e){E=e}let b;function B(e){if(e===null)throw $e(),Ee;return b=e}function jt(){return B(J(b))}function ws(e){if(E){if(J(b)!==null)throw $e(),Ee;b=e}}function $n(e=1){if(E){for(var t=e,n=b;t--;)n=J(n);b=n}}function Gn(e=!0){for(var t=0,n=b;;){if(n.nodeType===We){var r=n.data;if(r===Ft){if(t===0)return n;t-=1}else(r===Pt||r===Lt||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=J(n);e&&n.remove(),n=s}}function ms(e){if(!e||e.nodeType!==We)throw $e(),Ee;return e.data}function Vt(e){return e===this.v}function Ht(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function qt(e){return!Ht(e,this.v)}let Pe=!1;function Es(){Pe=!0}let y=null;function Te(e){y=e}function Kn(e){return _t().get(e)}function Xn(e,t){return _t().set(e,t),t}function Zn(e){return _t().has(e)}function Jn(e,t=!1,n){y={p:y,i:!1,c:null,e:null,s:e,x:null,l:Pe&&!t?{s:null,u:null,$:[]}:null}}function Qn(e){var t=y,n=t.e;if(n!==null){t.e=null;for(var r of n)ln(r)}return t.i=!0,y=t.p,{}}function Le(){return!Pe||y!==null&&y.l===null}function _t(e){return y===null&&ct(),y.c??=new Map(er(y)||void 0)}function er(e){let t=e.p;for(;t!==null;){const n=t.c;if(n!==null)return n;t=t.p}return null}let ce=[];function Yt(){var e=ce;ce=[],kt(e)}function ie(e){if(ce.length===0&&!Oe){var t=ce;queueMicrotask(()=>{t===ce&&Yt()})}ce.push(e)}function tr(){for(;ce.length>0;)Yt()}function Bt(e){var t=v;if(t===null)return h.f|=se,e;if((t.f&fe)===0&&(t.f&De)===0)throw e;te(e,t)}function te(e,t){for(;t!==null;){if((t.f&Je)!==0){if((t.f&fe)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const nr=-7169;function m(e,t){e.f=e.f&nr|t}function dt(e){(e.f&C)!==0||e.deps===null?m(e,T):m(e,Y)}function zt(e){if(e!==null)for(const t of e)(t.f&S)===0||(t.f&pe)===0||(t.f^=pe,zt(t.deps))}function Ut(e,t,n){(e.f&x)!==0?t.add(e):(e.f&Y)!==0&&n.add(e),zt(e.deps),m(e,T)}const qe=new Set;let w=null,mt=null,F=null,O=[],Ge=null,et=!1,Oe=!1;class U{current=new Map;previous=new Map;#n=new Set;#u=new Set;#s=0;#f=0;#r=null;#i=new Set;#e=new Set;#t=new Map;is_fork=!1;#a=!1;#o(){return this.is_fork||this.#f>0}skip_effect(t){this.#t.has(t)||this.#t.set(t,{d:[],m:[]})}unskip_effect(t){var n=this.#t.get(t);if(n){this.#t.delete(t);for(var r of n.d)m(r,x),j(r);for(r of n.m)m(r,Y),j(r)}}process(t){O=[],this.apply();var n=[],r=[];for(const s of t)this.#l(s,n,r);if(this.#o()){this.#c(r),this.#c(n);for(const[s,i]of this.#t)Xt(s,i)}else{for(const s of this.#n)s();this.#n.clear(),this.#s===0&&this.#d(),mt=this,w=null,Et(r),Et(n),mt=null,this.#r?.resolve()}F=null}#l(t,n,r){t.f^=T;for(var s=t.first;s!==null;){var i=s.f,f=(i&($|le))!==0,o=f&&(i&T)!==0,a=o||(i&z)!==0||this.#t.has(s);if(!a&&s.fn!==null){f?s.f^=T:(i&De)!==0?n.push(s):je(s)&&((i&Z)!==0&&this.#e.add(s),Ae(s));var l=s.first;if(l!==null){s=l;continue}}for(;s!==null;){var c=s.next;if(c!==null){s=c;break}s=s.parent}}}#c(t){for(var n=0;n0){if($t(),w!==null&&w!==this)return}else this.#s===0&&this.process([]);this.deactivate()}discard(){for(const t of this.#u)t(this);this.#u.clear()}#d(){if(qe.size>1){this.previous.clear();var t=F,n=!0;for(const s of qe){if(s===this){n=!1;continue}const i=[];for(const[o,a]of this.current){if(s.current.has(o))if(n&&a!==s.current.get(o))s.current.set(o,a);else continue;i.push(o)}if(i.length===0)continue;const f=[...s.current.keys()].filter(o=>!this.current.has(o));if(f.length>0){var r=O;O=[];const o=new Set,a=new Map;for(const l of i)Gt(l,f,o,a);if(O.length>0){w=s,s.apply();for(const l of O)s.#l(l,[],[]);s.deactivate()}O=r}}w=null,F=t}qe.delete(this)}increment(t){this.#s+=1,t&&(this.#f+=1)}decrement(t){this.#s-=1,t&&(this.#f-=1),!this.#a&&(this.#a=!0,ie(()=>{this.#a=!1,this.#o()?O.length>0&&this.flush():this.revive()}))}revive(){for(const t of this.#i)this.#e.delete(t),m(t,x),j(t);for(const t of this.#e)m(t,Y),j(t);this.flush()}oncommit(t){this.#n.add(t)}ondiscard(t){this.#u.add(t)}settled(){return(this.#r??=Mt()).promise}static ensure(){if(w===null){const t=w=new U;qe.add(w),Oe||ie(()=>{w===t&&t.flush()})}return w}apply(){}}function Wt(e){var t=Oe;Oe=!0;try{for(var n;;){if(tr(),O.length===0&&(w?.flush(),O.length===0))return Ge=null,n;$t()}}finally{Oe=t}}function $t(){et=!0;var e=null;try{for(var t=0;O.length>0;){var n=U.ensure();if(t++>1e3){var r,s;rr()}n.process(O),ae.clear()}}finally{O=[],et=!1,Ge=null}}function rr(){try{jn()}catch(e){te(e,Ge)}}let K=null;function Et(e){var t=e.length;if(t!==0){for(var n=0;n0)){ae.clear();for(const s of K){if((s.f&(re|z))!==0)continue;const i=[s];let f=s.parent;for(;f!==null;)K.has(f)&&(K.delete(f),i.push(f)),f=f.parent;for(let o=i.length-1;o>=0;o--){const a=i[o];(a.f&(re|z))===0&&Ae(a)}}K.clear()}}K=null}}function Gt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const i=s.f;(i&S)!==0?Gt(s,t,n,r):(i&(ut|Z))!==0&&(i&x)===0&&Kt(s,t,r)&&(m(s,x),j(s))}}function Kt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(me.call(t,s))return!0;if((s.f&S)!==0&&Kt(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function j(e){var t=Ge=e,n=t.b;if(n?.is_pending&&(e.f&(De|Ce|ot))!==0&&(e.f&fe)===0){n.defer_effect(e);return}for(;t.parent!==null;){t=t.parent;var r=t.f;if(et&&t===v&&(r&Z)!==0&&(r&Dt)===0&&(r&fe)!==0)return;if((r&(le|$))!==0){if((r&T)===0)return;t.f^=T}}O.push(t)}function Xt(e,t){if(!((e.f&$)!==0&&(e.f&T)!==0)){(e.f&x)!==0?t.d.push(e):(e.f&Y)!==0&&t.m.push(e),m(e,T);for(var n=e.first;n!==null;)Xt(n,t),n=n.next}}function sr(e){let t=0,n=Fe(0),r;return()=>{pt()&&(ne(n),Tr(()=>(t===0&&(r=Ve(()=>e(()=>Re(n)))),t+=1,()=>{ie(()=>{t-=1,t===0&&(r?.(),r=void 0,Re(n))})})))}}var ir=ke|be;function ar(e,t,n,r){new fr(e,t,n,r)}class fr{parent;is_pending=!1;transform_error;#n;#u=E?b:null;#s;#f;#r;#i=null;#e=null;#t=null;#a=null;#o=0;#l=0;#c=!1;#d=new Set;#h=new Set;#_=null;#y=sr(()=>(this.#_=Fe(this.#o),()=>{this.#_=null}));constructor(t,n,r,s){this.#n=t,this.#s=n,this.#f=i=>{var f=v;f.b=this,f.f|=Je,r(i)},this.parent=v.b,this.transform_error=s??this.parent?.transform_error??(i=>i),this.#r=Ar(()=>{if(E){const i=this.#u;jt();const f=i.data===Lt;if(i.data.startsWith(wt)){const a=JSON.parse(i.data.slice(wt.length));this.#m(a)}else f?this.#E():this.#w()}else this.#g()},ir),E&&(this.#n=b)}#w(){try{this.#i=oe(()=>this.#f(this.#n))}catch(t){this.error(t)}}#m(t){const n=this.#s.failed;n&&(this.#t=oe(()=>{n(this.#n,()=>t,()=>()=>{})}))}#E(){const t=this.#s.pending;t&&(this.is_pending=!0,this.#e=oe(()=>t(this.#n)),ie(()=>{var n=this.#a=document.createDocumentFragment(),r=X();n.append(r),this.#i=this.#p(()=>(U.ensure(),oe(()=>this.#f(r)))),this.#l===0&&(this.#n.before(n),this.#a=null,Be(this.#e,()=>{this.#e=null}),this.#v())}))}#g(){try{if(this.is_pending=this.has_pending_snippet(),this.#l=0,this.#o=0,this.#i=oe(()=>{this.#f(this.#n)}),this.#l>0){var t=this.#a=document.createDocumentFragment();Nr(this.#i,t);const n=this.#s.pending;this.#e=oe(()=>n(this.#n))}else this.#v()}catch(n){this.error(n)}}#v(){this.is_pending=!1;for(const t of this.#d)m(t,x),j(t);for(const t of this.#h)m(t,Y),j(t);this.#d.clear(),this.#h.clear()}defer_effect(t){Ut(t,this.#d,this.#h)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#s.pending}#p(t){var n=v,r=h,s=y;W(this.#r),P(this.#r),Te(this.#r.ctx);try{return t()}catch(i){return Bt(i),null}finally{W(n),P(r),Te(s)}}#b(t){if(!this.has_pending_snippet()){this.parent&&this.parent.#b(t);return}this.#l+=t,this.#l===0&&(this.#v(),this.#e&&Be(this.#e,()=>{this.#e=null}),this.#a&&(this.#n.before(this.#a),this.#a=null))}update_pending_count(t){this.#b(t),this.#o+=t,!(!this.#_||this.#c)&&(this.#c=!0,ie(()=>{this.#c=!1,this.#_&&Ue(this.#_,this.#o)}))}get_effect_pending(){return this.#y(),ne(this.#_)}error(t){var n=this.#s.onerror;let r=this.#s.failed;if(!n&&!r)throw t;this.#i&&(H(this.#i),this.#i=null),this.#e&&(H(this.#e),this.#e=null),this.#t&&(H(this.#t),this.#t=null),E&&(B(this.#u),$n(),B(Gn()));var s=!1,i=!1;const f=()=>{if(s){Wn();return}s=!0,i&&Bn(),this.#t!==null&&Be(this.#t,()=>{this.#t=null}),this.#p(()=>{U.ensure(),this.#g()})},o=a=>{try{i=!0,n?.(a,f),i=!1}catch(l){te(l,this.#r&&this.#r.parent)}r&&(this.#t=this.#p(()=>{U.ensure();try{return oe(()=>{var l=v;l.b=this,l.f|=Je,r(this.#n,()=>a,()=>f)})}catch(l){return te(l,this.#r.parent),null}}))};ie(()=>{var a;try{a=this.transform_error(t)}catch(l){te(l,this.#r&&this.#r.parent);return}a!==null&&typeof a=="object"&&typeof a.then=="function"?a.then(o,l=>te(l,this.#r&&this.#r.parent)):o(a)})}}function lr(e,t,n,r){const s=Le()?ht:_r;var i=e.filter(u=>!u.settled);if(n.length===0&&i.length===0){r(t.map(s));return}var f=v,o=or(),a=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(u=>u.promise)):null;function l(u){o();try{r(u)}catch(_){(f.f&re)===0&&te(_,f)}tt()}if(n.length===0){a.then(()=>l(t.map(s)));return}function c(){o(),Promise.all(n.map(u=>cr(u))).then(u=>l([...t.map(s),...u])).catch(u=>te(u,f))}a?a.then(c):c()}function or(){var e=v,t=h,n=y,r=w;return function(i=!0){W(e),P(t),Te(n),i&&r?.activate()}}function tt(e=!0){W(null),P(null),Te(null),e&&w?.deactivate()}function ur(){var e=v.b,t=w,n=e.is_rendered();return e.update_pending_count(1),t.increment(n),()=>{e.update_pending_count(-1),t.decrement(n)}}function ht(e){var t=S|x,n=h!==null&&(h.f&S)!==0?h:null;return v!==null&&(v.f|=be),{ctx:y,deps:null,effects:null,equals:Vt,f:t,fn:e,reactions:null,rv:0,v:A,wv:0,parent:n??v,ac:null}}function cr(e,t,n){v===null&&In();var s=void 0,i=Fe(A),f=!h,o=new Map;return Er(()=>{var a=Mt();s=a.promise;try{Promise.resolve(e()).then(a.resolve,a.reject).finally(tt)}catch(_){a.reject(_),tt()}var l=w;if(f){var c=ur();o.get(l)?.reject(ue),o.delete(l),o.set(l,a)}const u=(_,p=void 0)=>{if(l.activate(),p)p!==ue&&(i.f|=se,Ue(i,p));else{(i.f&se)!==0&&(i.f^=se),Ue(i,_);for(const[d,g]of o){if(o.delete(d),d===l)break;g.reject(ue)}}c&&c()};a.promise.then(u,_=>u(null,_||"unknown"))}),fn(()=>{for(const a of o.values())a.reject(ue)}),new Promise(a=>{function l(c){function u(){c===s?a(i):l(s)}c.then(u,u)}l(s)})}function Ts(e){const t=ht(e);return dn(t),t}function _r(e){const t=ht(e);return t.equals=qt,t}function dr(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Qt&&pr()}return t}function pr(){Qt=!1;for(const e of nt)(e.f&T)!==0&&m(e,Y),je(e)&&Ae(e);nt.clear()}function Ss(e,t=1){var n=ne(e),r=t===1?n++:n--;return ee(e,n),r}function Re(e){ee(e,e.v+1)}function en(e,t){var n=e.reactions;if(n!==null)for(var r=Le(),s=n.length,i=0;i{if(ve===i)return o();var a=h,l=ve;P(null),Nt(i);var c=o();return P(a),Nt(l),c};return r&&n.set("length",Q(e.length)),new Proxy(e,{defineProperty(o,a,l){(!("value"in l)||l.configurable===!1||l.enumerable===!1||l.writable===!1)&&Hn();var c=n.get(a);return c===void 0?f(()=>{var u=Q(l.value);return n.set(a,u),u}):ee(c,l.value,!0),!0},deleteProperty(o,a){var l=n.get(a);if(l===void 0){if(a in o){const c=f(()=>Q(A));n.set(a,c),Re(s)}}else ee(l,A),Re(s);return!0},get(o,a,l){if(a===he)return e;var c=n.get(a),u=a in o;if(c===void 0&&(!u||Ne(o,a)?.writable)&&(c=f(()=>{var p=Se(u?o[a]:A),d=Q(p);return d}),n.set(a,c)),c!==void 0){var _=ne(c);return _===A?void 0:_}return Reflect.get(o,a,l)},getOwnPropertyDescriptor(o,a){var l=Reflect.getOwnPropertyDescriptor(o,a);if(l&&"value"in l){var c=n.get(a);c&&(l.value=ne(c))}else if(l===void 0){var u=n.get(a),_=u?.v;if(u!==void 0&&_!==A)return{enumerable:!0,configurable:!0,value:_,writable:!0}}return l},has(o,a){if(a===he)return!0;var l=n.get(a),c=l!==void 0&&l.v!==A||Reflect.has(o,a);if(l!==void 0||v!==null&&(!c||Ne(o,a)?.writable)){l===void 0&&(l=f(()=>{var _=c?Se(o[a]):A,p=Q(_);return p}),n.set(a,l));var u=ne(l);if(u===A)return!1}return c},set(o,a,l,c){var u=n.get(a),_=a in o;if(r&&a==="length")for(var p=l;pQ(A)),n.set(p+"",d))}if(u===void 0)(!_||Ne(o,a)?.writable)&&(u=f(()=>Q(void 0)),ee(u,Se(l)),n.set(a,u));else{_=u.v!==A;var g=f(()=>Se(l));ee(u,g)}var N=Reflect.getOwnPropertyDescriptor(o,a);if(N?.set&&N.set.call(c,l),!_){if(r&&typeof a=="string"){var G=n.get("length"),ye=Number(a);Number.isInteger(ye)&&ye>=G.v&&ee(G,ye+1)}Re(s)}return!0},ownKeys(o){ne(s);var a=Reflect.ownKeys(o).filter(u=>{var _=n.get(u);return _===void 0||_.v!==A});for(var[l,c]of n)c.v!==A&&!(l in o)&&a.push(l);return a},setPrototypeOf(){qn()}})}function Tt(e){try{if(e!==null&&typeof e=="object"&&he in e)return e[he]}catch{}return e}function xs(e,t){return Object.is(Tt(e),Tt(t))}var At,tn,nn,rn;function rt(){if(At===void 0){At=window,tn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;nn=Ne(t,"firstChild").get,rn=Ne(t,"nextSibling").get,bt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),bt(n)&&(n.__t=void 0)}}function X(e=""){return document.createTextNode(e)}function D(e){return nn.call(e)}function J(e){return rn.call(e)}function Ns(e,t){if(!E)return D(e);var n=D(b);if(n===null)n=b.appendChild(X());else if(t&&n.nodeType!==Ie){var r=X();return n?.before(r),B(r),r}return t&&Ke(n),B(n),n}function Os(e,t=!1){if(!E){var n=D(e);return n instanceof Comment&&n.data===""?J(n):n}if(t){if(b?.nodeType!==Ie){var r=X();return b?.before(r),B(r),r}Ke(b)}return b}function Rs(e,t=1,n=!1){let r=E?b:e;for(var s;t--;)s=r,r=J(r);if(!E)return r;if(n){if(r?.nodeType!==Ie){var i=X();return r===null?s?.after(i):r.before(i),B(i),i}Ke(r)}return B(r),r}function sn(e){e.textContent=""}function ks(){return!1}function gr(e,t,n){return document.createElementNS(t??Un,e,void 0)}function Ke(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Ie;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Ms(e,t){if(t){const n=document.body;e.autofocus=!0,ie(()=>{document.activeElement===n&&e.focus()})}}function Ds(e){E&&D(e)!==null&&sn(e)}let St=!1;function br(){St||(St=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function Xe(e){var t=h,n=v;P(null),W(null);try{return e()}finally{P(t),W(n)}}function Cs(e,t,n,r=n){e.addEventListener(t,()=>Xe(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),br()}function an(e){v===null&&(h===null&&Fn(),Ln()),ge&&Pn()}function yr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function L(e,t,n){var r=v;r!==null&&(r.f&z)!==0&&(e|=z);var s={ctx:y,deps:null,nodes:null,f:e|x|C,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};if(n)try{Ae(s)}catch(o){throw H(s),o}else t!==null&&j(s);var i=s;if(n&&i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&be)===0&&(i=i.first,(e&Z)!==0&&(e&ke)!==0&&i!==null&&(i.f|=ke)),i!==null&&(i.parent=r,r!==null&&yr(i,r),h!==null&&(h.f&S)!==0&&(e&le)===0)){var f=h;(f.effects??=[]).push(i)}return s}function pt(){return h!==null&&!V}function fn(e){const t=L(Ce,null,!1);return m(t,T),t.teardown=e,t}function wr(e){an();var t=v.f,n=!h&&(t&$)!==0&&(t&fe)===0;if(n){var r=y;(r.e??=[]).push(e)}else return ln(e)}function ln(e){return L(De|Ct,e,!1)}function Is(e){return an(),L(Ce|Ct,e,!0)}function Ps(e){U.ensure();const t=L(le|be,e,!0);return()=>{H(t)}}function mr(e){U.ensure();const t=L(le|be,e,!0);return(n={})=>new Promise(r=>{n.outro?Be(t,()=>{H(t),r(void 0)}):(H(t),r(void 0))})}function Ls(e){return L(De,e,!1)}function Er(e){return L(ut|be,e,!0)}function Tr(e,t=0){return L(Ce|t,e,!0)}function Fs(e,t=[],n=[],r=[]){lr(r,t,n,s=>{L(Ce,()=>e(...s.map(ne)),!0)})}function Ar(e,t=0){var n=L(Z|t,e,!0);return n}function js(e,t=0){var n=L(ot|t,e,!0);return n}function oe(e){return L($|be,e,!0)}function on(e){var t=e.teardown;if(t!==null){const n=ge,r=h;xt(!0),P(null);try{t.call(null)}finally{xt(n),P(r)}}}function gt(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&Xe(()=>{s.abort(ue)});var r=n.next;(n.f&le)!==0?n.parent=null:H(n,t),n=r}}function Sr(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&$)===0&&H(t),t=n}}function H(e,t=!0){var n=!1;(t||(e.f&Dt)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(xr(e.nodes.start,e.nodes.end),n=!0),gt(e,t&&!n),Me(e,0),m(e,re);var r=e.nodes&&e.nodes.t;if(r!==null)for(const i of r)i.stop();on(e);var s=e.parent;s!==null&&s.first!==null&&un(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=null}function xr(e,t){for(;e!==null;){var n=e===t?null:J(e);e.remove(),e=n}}function un(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Be(e,t,n=!0){var r=[];cn(e,r,!0);var s=()=>{n&&H(e),t&&t()},i=r.length;if(i>0){var f=()=>--i||s();for(var o of r)o.out(f)}else s()}function cn(e,t,n){if((e.f&z)===0){e.f^=z;var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)(o.is_global||n)&&t.push(o);for(var s=e.first;s!==null;){var i=s.next,f=(s.f&ke)!==0||(s.f&$)!==0&&(e.f&Z)!==0;cn(s,t,f?n:!1),s=i}}}function Vs(e){_n(e,!0)}function _n(e,t){if((e.f&z)!==0){e.f^=z,(e.f&T)===0&&(m(e,x),j(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&ke)!==0||(n.f&$)!==0;_n(n,s?t:!1),n=r}var i=e.nodes&&e.nodes.t;if(i!==null)for(const f of i)(f.is_global||t)&&f.in()}}function Nr(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:J(n);t.append(n),n=s}}let ze=!1,ge=!1;function xt(e){ge=e}let h=null,V=!1;function P(e){h=e}let v=null;function W(e){v=e}let I=null;function dn(e){h!==null&&(I===null?I=[e]:I.push(e))}let R=null,k=0,M=null;function Or(e){M=e}let hn=1,_e=0,ve=_e;function Nt(e){ve=e}function vn(){return++hn}function je(e){var t=e.f;if((t&x)!==0)return!0;if(t&S&&(e.f&=~pe),(t&Y)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&C)!==0&&F===null&&m(e,T)}return!1}function pn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(I!==null&&me.call(I,e)))for(var s=0;s{e.ac.abort(ue)}),e.ac=null);try{e.f|=Qe;var c=e.fn,u=c();e.f|=fe;var _=e.deps,p=w?.is_fork;if(R!==null){var d;if(p||Me(e,k),_!==null&&k>0)for(_.length=k+R.length,d=0;dn?.call(this,i))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?ie(()=>{t.addEventListener(e,s,r)}):t.addEventListener(e,s,r),s}function Us(e,t,n,r={}){var s=mn(t,e,n,r);return()=>{e.removeEventListener(t,s,r)}}function Ws(e,t,n,r,s){var i={capture:r,passive:s},f=mn(e,t,n,i);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&fn(()=>{t.removeEventListener(e,f,i)})}function $s(e,t,n){(t[xe]??={})[e]=n}function Gs(e){for(var t=0;t{throw N});throw _}}finally{e[xe]=t,delete e.currentTarget,P(c),W(u)}}}const Fr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function jr(e){return Fr?.createHTML(e)??e}function En(e){var t=gr("template");return t.innerHTML=jr(e.replaceAll("","")),t.content}function q(e,t){var n=v;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function Ks(e,t){var n=(t&It)!==0,r=(t&zn)!==0,s,i=!e.startsWith("");return()=>{if(E)return q(b,null),b;s===void 0&&(s=En(i?e:""+e),n||(s=D(s)));var f=r||tn?document.importNode(s,!0):s.cloneNode(!0);if(n){var o=D(f),a=f.lastChild;q(o,a)}else q(f,f);return f}}function Vr(e,t,n="svg"){var r=!e.startsWith(""),s=(t&It)!==0,i=`<${n}>${r?e:""+e}`,f;return()=>{if(E)return q(b,null),b;if(!f){var o=En(i),a=D(o);if(s)for(f=document.createDocumentFragment();D(a);)f.appendChild(D(a));else f=D(a)}var l=f.cloneNode(!0);if(s){var c=D(l),u=l.lastChild;q(c,u)}else q(l,l);return l}}function Xs(e,t){return Vr(e,t,"svg")}function Zs(e=""){if(!E){var t=X(e+"");return q(t,t),t}var n=b;return n.nodeType!==Ie?(n.before(n=X()),B(n)):Ke(n),q(n,n),n}function Js(){if(E)return q(b,null),b;var e=document.createDocumentFragment(),t=document.createComment(""),n=X();return e.append(t,n),q(t,n),e}function Qs(e,t){if(E){var n=v;((n.f&fe)===0||n.nodes.end===null)&&(n.nodes.end=b),jt();return}e!==null&&e.before(t)}let ft=!0;function ei(e){ft=e}function ti(e,t){var n=t==null?"":typeof t=="object"?t+"":t;n!==(e.__t??=e.nodeValue)&&(e.__t=n,e.nodeValue=n+"")}function Tn(e,t){return An(e,t)}function Hr(e,t){rt(),t.intro=t.intro??!1;const n=t.target,r=E,s=b;try{for(var i=D(n);i&&(i.nodeType!==We||i.data!==Pt);)i=J(i);if(!i)throw Ee;He(!0),B(i);const f=An(e,{...t,anchor:i});return He(!1),f}catch(f){if(f instanceof Error&&f.message.split(` -`).some(o=>o.startsWith("https://svelte.dev/e/")))throw f;return f!==Ee&&console.warn("Failed to hydrate: ",f),t.recover===!1&&Vn(),rt(),sn(n),He(!1),Tn(e,t)}finally{He(r),B(s)}}const Ye=new Map;function An(e,{target:t,anchor:n,props:r={},events:s,context:i,intro:f=!0,transformError:o}){rt();var a=void 0,l=mr(()=>{var c=n??t.appendChild(X());ar(c,{pending:()=>{}},p=>{Jn({});var d=y;if(i&&(d.c=i),s&&(r.$$events=s),E&&q(p,null),ft=f,a=e(p,r)||{},ft=!0,E&&(v.nodes.end=b,b===null||b.nodeType!==We||b.data!==Ft))throw $e(),Ee;Qn()},o);var u=new Set,_=p=>{for(var d=0;d{for(var p of u)for(const N of[t,document]){var d=Ye.get(N),g=d.get(p);--g==0?(N.removeEventListener(p,at),d.delete(p),d.size===0&&Ye.delete(N)):d.set(p,g)}it.delete(_),c!==n&&c.parentNode?.removeChild(c)}});return lt.set(a,l),a}let lt=new WeakMap;function qr(e,t){const n=lt.get(e);return n?(lt.delete(e),n(t)):Promise.resolve()}function Sn(e,t,n){if(e==null)return t(void 0),n&&n(void 0),de;const r=Ve(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const we=[];function Yr(e,t){return{subscribe:Br(e,t).subscribe}}function Br(e,t=de){let n=null;const r=new Set;function s(o){if(Ht(e,o)&&(e=o,n)){const a=!we.length;for(const l of r)l[1](),we.push(l,e);if(a){for(let l=0;l{r.delete(l),r.size===0&&n&&(n(),n=null)}}return{set:s,update:i,subscribe:f}}function ni(e,t,n){const r=!Array.isArray(e),s=r?[e]:e;if(!s.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const i=t.length<2;return Yr(n,(f,o)=>{let a=!1;const l=[];let c=0,u=de;const _=()=>{if(c)return;u();const d=t(r?l[0]:l,f,o);i?f(d):u=typeof d=="function"?d:de},p=s.map((d,g)=>Sn(d,N=>{l[g]=N,c&=~(1<{c|=1<t=n)(),t}function xn(e){y===null&&ct(),Pe&&y.l!==null?Ur(y).m.push(e):wr(()=>{const t=Ve(e);if(typeof t=="function")return t})}function zr(e){y===null&&ct(),xn(()=>()=>Ve(e))}function Ur(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}const si=Object.freeze(Object.defineProperty({__proto__:null,flushSync:Wt,getContext:Kn,hasContext:Zn,hydrate:Hr,mount:Tn,onDestroy:zr,onMount:xn,setContext:Xn,settled:Mr,tick:kr,unmount:qr,untrack:Ve},Symbol.toStringTag,{value:"Module"}));export{he as $,Ks as A,Ns as B,ws as C,Rs as D,ke as E,ti as F,Gs as G,Pt as H,Q as I,Se as J,$s as K,ee as L,$n as M,Ds as N,Ts as O,w as P,Vs as Q,H as R,Be as S,X as T,oe as U,Nr as V,ks as W,Lt as X,Ls as Y,Tr as Z,ie as _,jt as a,Bs as a$,de as a0,As as a1,Sn as a2,ri as a3,fn as a4,kn as a5,Ne as a6,ss as a7,_s as a8,v as a9,Nn as aA,Rn as aB,is as aC,os as aD,as as aE,z as aF,$ as aG,ls as aH,sn as aI,J as aJ,ns as aK,ei as aL,gr as aM,ps as aN,q as aO,zs as aP,js as aQ,ys as aR,xs as aS,Cs as aT,mt as aU,lr as aV,bs as aW,ts as aX,qs as aY,mn as aZ,Ms as a_,re as aa,Fe as ab,ds as ac,Pe as ad,cs as ae,us as af,_r as ag,Ss as ah,W as ai,Wr as aj,Jr as ak,hs as al,ge as am,Hr as an,Tn as ao,Wt as ap,qr as aq,kr as ar,Zs as as,fs as at,D as au,We as av,Ft as aw,Ue as ax,Zr as ay,rs as az,Ar as b,A as b0,br as b1,Un as b2,Rt as b3,Qr as b4,Ys as b5,Mn as b6,Xs as b7,Kr as b8,ni as b9,Mr as bA,xr as ba,$e as bb,Ee as bc,gs as bd,ft as be,Z as bf,fe as bg,vs as bh,Xe as bi,Ws as bj,Le as bk,Dt as bl,be as bm,zr as bn,At as bo,Dn as bp,Ht as bq,Zn as br,Kn as bs,Xn as bt,Ps as bu,sr as bv,Us as bw,Gr as bx,Xr as by,si as bz,B as c,He as d,b as e,Js as f,Os as g,E as h,Qs as i,Qn as j,y as k,wr as l,Ve as m,kt as n,xn as o,Jn as p,$r as q,ms as r,Gn as s,ne as t,Is as u,Hs as v,Br as w,ht as x,Es as y,Fs as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DEAaRqcq.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DEAaRqcq.js deleted file mode 100644 index 191ed358..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DEAaRqcq.js +++ /dev/null @@ -1 +0,0 @@ -import{w as ke,o as Ne,I as U,t as A,L as T,as as ee,bz as ht,bA as pt}from"./hL-aZVJ4.js";class Ee{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Se{constructor(t,n){this.status=t,this.location=n}}class Re extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function gt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function _t(e){return e.split("%25").map(decodeURI).join("%25")}function mt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function he({href:e}){return e.split("#")[0]}function vt(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;new TextDecoder;function wt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&G.delete(xe(e)),yt(e,t));const G=new Map;function bt(e,t){const n=xe(e,t),a=document.querySelector(n);if(a?.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const o=a.getAttribute("data-ttl");return o&&G.set(n,{body:r,init:i,ttl:1e3*Number(o)}),a.getAttribute("data-b64")!==null&&(r=wt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function kt(e,t,n){if(G.size>0){const a=xe(e,n),r=G.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const o=a.split(/\[(.+?)\](?!\])/);return"/"+o.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return pe(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return pe(String.fromCharCode(...c.slice(2).split("-").map(m=>parseInt(m,16))));const f=Et.exec(c),[,h,v,u,p]=f;return t.push({name:u,matcher:p,optional:!!h,rest:!!v,chained:v?l===1&&o[0]==="":!1}),v?"([^]*?)":h?"([^/]*)?":"([^/]+?)"}return pe(c)}).join("")}).join("")}/?$`),params:t}}function Rt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function xt(e){return e.slice(1).split("/").filter(Rt)}function Lt(e,t,n){const a={},r=e.slice(1),i=r.filter(s=>s!==void 0);let o=0;for(let s=0;sf).join("/"),o=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||n[c.matcher](l)){a[c.name]=l;const f=t[s+1],h=r[s+1];f&&!f.rest&&f.optional&&h&&c.chained&&(o=0),!f&&!h&&Object.keys(a).length===i.length&&(o=0);continue}if(c.optional&&c.chained){o++;continue}return}if(!o)return a}function pe(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Ut({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([s,[c,l,f]])=>{const{pattern:h,params:v}=St(s),u={id:s,exec:p=>{const m=h.exec(p);if(m)return Lt(m,v,a)},errors:[1,...f||[]].map(p=>e[p]),layouts:[0,...l||[]].map(o),leaf:i(c)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function i(s){const c=s<0;return c&&(s=~s),[c,e[s]]}function o(s){return s===void 0?s:[r.has(s),e[s]]}}function Ge(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function De(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}const x=globalThis.__sveltekit_xx1fst?.base??"",At=globalThis.__sveltekit_xx1fst?.assets??x??"",Tt="1771681752645",We="sveltekit:snapshot",ze="sveltekit:scroll",Ye="sveltekit:states",It="sveltekit:pageurl",K="sveltekit:history",W="sveltekit:navigation",j={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},le=location.origin;function Le(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function D(){return{x:pageXOffset,y:pageYOffset}}function V(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const qe={...j,"":j.hover};function He(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Je(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=He(e)}}function me(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const s=location.hash.split("#")[1]||"/";a.hash=`#${s}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||ue(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=a?.origin===le&&e.hasAttribute("download");return{url:a,external:i,target:r,download:o}}function te(e){let t=null,n=null,a=null,r=null,i=null,o=null,s=e;for(;s&&s!==document.documentElement;)a===null&&(a=V(s,"preload-code")),r===null&&(r=V(s,"preload-data")),t===null&&(t=V(s,"keepfocus")),n===null&&(n=V(s,"noscroll")),i===null&&(i=V(s,"reload")),o===null&&(o=V(s,"replacestate")),s=He(s);function c(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:qe[a??"off"],preload_data:qe[r??"off"],keepfocus:c(t),noscroll:c(n),reload:c(i),replace_state:c(o)}}function Ve(e){const t=ke(e);let n=!0;function a(){n=!0,t.update(o=>o)}function r(o){n=!1,t.set(o)}function i(o){let s;return t.subscribe(c=>{(s===void 0||n&&c!==s)&&o(s=c)})}return{notify:a,set:r,subscribe:i}}const Xe={v:()=>{}};function Pt(){const{set:e,subscribe:t}=ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${At}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const o=(await r.json()).version!==Tt;return o&&(e(!0),Xe.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:a}}function ue(e,t,n){return e.origin!==le||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function sn(e){}const Qe=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Qe];const Ot=new Set([...Qe]);[...Ot];function $t(e){return e.filter(t=>t!=null)}function Ue(e){return e instanceof Ee||e instanceof Re?e.status:500}function Ct(e){return e instanceof Re?e.text:"Internal Error"}let k,z,ge;const jt=Ne.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ne.toString());jt?(k={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},z={current:null},ge={current:!1}):(k=new class{#e=U({});get data(){return A(this.#e)}set data(t){T(this.#e,t)}#t=U(null);get form(){return A(this.#t)}set form(t){T(this.#t,t)}#n=U(null);get error(){return A(this.#n)}set error(t){T(this.#n,t)}#a=U({});get params(){return A(this.#a)}set params(t){T(this.#a,t)}#r=U({id:null});get route(){return A(this.#r)}set route(t){T(this.#r,t)}#o=U({});get state(){return A(this.#o)}set state(t){T(this.#o,t)}#s=U(-1);get status(){return A(this.#s)}set status(t){T(this.#s,t)}#i=U(new URL("https://example.com"));get url(){return A(this.#i)}set url(t){T(this.#i,t)}},z=new class{#e=U(null);get current(){return A(this.#e)}set current(t){T(this.#e,t)}},ge=new class{#e=U(!1);get current(){return A(this.#e)}set current(t){T(this.#e,t)}},Xe.v=()=>ge.current=!0);function Nt(e){Object.assign(k,e)}const{onMount:Dt}=ht,qt=new Set(["icon","shortcut icon","apple-touch-icon"]),C=Ge(ze)??{},Y=Ge(We)??{},$={url:Ve({}),page:Ve({}),navigating:ke(null),updated:Pt()};function Ae(e){C[e]=D()}function Vt(e,t){let n=e+1;for(;C[n];)delete C[n],n+=1;for(n=t+1;Y[n];)delete Y[n],n+=1}function H(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function Ze(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(x||"/");e&&await e.update()}}function Ke(){}let Te,ve,ne,I,we,y;const ae=[],re=[];let L=null;function ye(){L?.fork?.then(e=>e?.discard()),L=null}const Z=new Map,et=new Set,Kt=new Set,M=new Set;let _={branch:[],error:null,url:null},tt=!1,oe=!1,Me=!0,J=!1,F=!1,nt=!1,Ie=!1,at,w,R,N;const se=new Set,Be=new Map;async function fn(e,t,n){globalThis.__sveltekit_xx1fst?.data&&globalThis.__sveltekit_xx1fst.data,document.URL!==location.href&&(location.href=location.href),y=e,await e.hooks.init?.(),Te=Ut(e),I=document.documentElement,we=t,ve=e.nodes[0],ne=e.nodes[1],ve(),ne(),w=history.state?.[K],R=history.state?.[W],w||(w=R=Date.now(),history.replaceState({...history.state,[K]:w,[W]:R},""));const a=C[w];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await tn(we,n)):(await B({type:"enter",url:Le(y.hash?rn(new URL(location.href)):location.href),replace_state:!0}),r()),en()}function Mt(){ae.length=0,Ie=!1}function rt(e){re.some(t=>t?.snapshot)&&(Y[e]=re.map(t=>t?.snapshot?.capture()))}function ot(e){Y[e]?.forEach((t,n)=>{re[n]?.snapshot?.restore(t)})}function Fe(){Ae(w),De(ze,C),rt(R),De(We,Y)}async function st(e,t,n,a){let r;t.invalidateAll&&ye(),await B({type:"goto",url:Le(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{t.invalidateAll&&(Ie=!0,r=[...Be.keys()]),t.invalidate&&t.invalidate.forEach(Zt)}}),t.invalidateAll&&ee().then(ee).then(()=>{Be.forEach(({resource:i},o)=>{r?.includes(o)&&i.refresh?.()})})}async function Bt(e){if(e.id!==L?.id){ye();const t={};se.add(t),L={id:e.id,token:t,promise:ct({...e,preload:t}).then(n=>(se.delete(t),n.type==="loaded"&&n.state.error&&ye(),n)),fork:null}}return L.promise}async function _e(e){const t=(await fe(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].map(n=>n?.[1]()))}async function it(e,t,n){_=e.state;const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(k,e.props.page),at=new y.root({target:t,props:{...e.props,stores:$,components:re},hydrate:n,sync:!1}),await Promise.resolve(),ot(R),n){const r={from:null,to:{params:_.params,route:{id:_.route?.id??null},url:new URL(location.href),scroll:C[w]??D()},willUnload:!1,type:"enter",complete:Promise.resolve()};M.forEach(i=>i(r))}oe=!0}function ie({url:e,params:t,branch:n,status:a,error:r,route:i,form:o}){let s="never";if(x&&(e.pathname===x||e.pathname===x+"/"))s="always";else for(const u of n)u?.slash!==void 0&&(s=u.slash);e.pathname=gt(e.pathname,s),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:r,route:i},props:{constructors:$t(n).map(u=>u.node.component),page:je(k)}};o!==void 0&&(c.props.form=o);let l={},f=!k,h=0;for(let u=0;us(new URL(o))))return!0;return!1}function Oe(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function Wt(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(o=>i.includes(o))&&i.every(o=>r.includes(o))&&n.delete(a)}return n}function zt({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:je(k),constructors:[]}}}async function ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if(L?.id===e)return se.delete(L.token),L.promise;const{errors:o,layouts:s,leaf:c}=r,l=[...s,c];o.forEach(g=>g?.().catch(()=>{})),l.forEach(g=>g?.[1]().catch(()=>{}));const f=_.url?e!==ce(_.url):!1,h=_.route?r.id!==_.route.id:!1,v=Wt(_.url,n);let u=!1;const p=l.map(async(g,d)=>{if(!g)return;const E=_.branch[d];return g[1]===E?.loader&&!Gt(u,h,f,v,E.universal?.uses,a)?E:(u=!0,Pe({loader:g[1],url:n,params:a,route:r,parent:async()=>{const P={};for(let O=0;O{});const m=[];for(let g=0;gPromise.resolve({}),server_data_node:Oe(i)}),s={node:await ne(),loader:ne,universal:null,server:null,data:null};return ie({url:n,params:r,branch:[o,s],status:e,error:t,route:null})}catch(o){if(o instanceof Se)return st(new URL(o.location,location.href),{},0);throw o}}async function Ht(e){const t=e.href;if(Z.has(t))return Z.get(t);let n;try{const a=(async()=>{let r=await y.hooks.reroute({url:new URL(e),fetch:async(i,o)=>Ft(i,o,e).promise})??e;if(typeof r=="string"){const i=new URL(e);y.hash?i.hash=r:i.pathname=r,r=i}return r})();Z.set(t,a),n=await a}catch{Z.delete(t);return}return n}async function fe(e,t){if(e&&!ue(e,x,y.hash)){const n=await Ht(e);if(!n)return;const a=Jt(n);for(const r of Te){const i=r.exec(a);if(i)return{id:ce(e),invalidating:t,route:r,params:mt(i),url:e}}}}function Jt(e){return _t(y.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(x.length))||"/"}function ce(e){return(y.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function lt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let o=!1;const s=Ce(_,n,e,t,i??null);a!==void 0&&(s.navigation.delta=a),r!==void 0&&(s.navigation.event=r);const c={...s.navigation,cancel:()=>{o=!0,s.reject(new Error("navigation cancelled"))}};return J||et.forEach(l=>l(c)),o?null:s}async function B({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o={},redirect_count:s=0,nav_token:c={},accept:l=Ke,block:f=Ke,event:h}){const v=N;N=c;const u=await fe(t,!1),p=e==="enter"?Ce(_,u,t,e):lt({url:t,type:e,delta:n?.delta,intent:u,scroll:n?.scroll,event:h});if(!p){f(),N===c&&(N=v);return}const m=w,g=R;l(),J=!0,oe&&p.navigation.type!=="enter"&&$.navigating.set(z.current=p.navigation);let d=u&&await ct(u);if(!d){if(ue(t,x,y.hash))return await H(t,i);d=await ut(t,{id:null},await X(new Re(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=u?.url||t,N!==c)return p.reject(new Error("navigation aborted")),!1;if(d.type==="redirect"){if(s<20){await B({type:e,url:new URL(d.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o,redirect_count:s+1,nav_token:c}),p.fulfil(void 0);return}d=await $e({status:500,error:await X(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else d.props.page.status>=400&&await $.updated.check()&&(await Ze(),await H(t,i));if(Mt(),Ae(m),rt(g),d.props.page.url.pathname!==t.pathname&&(t.pathname=d.props.page.url.pathname),o=n?n.state:o,!n){const b=i?0:1,Q={[K]:w+=b,[W]:R+=b,[Ye]:o};(i?history.replaceState:history.pushState).call(history,Q,"",t),i||Vt(w,R)}const E=u&&L?.id===u.id?L.fork:null;L=null,d.props.page.state=o;let S;if(oe){const b=(await Promise.all(Array.from(Kt,q=>q(p.navigation)))).filter(q=>typeof q=="function");if(b.length>0){let q=function(){b.forEach(de=>{M.delete(de)})};b.push(q),b.forEach(de=>{M.add(de)})}_=d.state,d.props.page&&(d.props.page.url=t);const Q=E&&await E;Q?S=Q.commit():(at.$set(d.props),Nt(d.props.page),S=pt?.()),nt=!0}else await it(d,we,!1);const{activeElement:P}=document;await S,await ee(),await ee();let O=null;if(Me){const b=n?n.scroll:r?D():null;b?scrollTo(b.x,b.y):(O=t.hash&&document.getElementById(ft(t)))?O.scrollIntoView():scrollTo(0,0)}const dt=document.activeElement!==P&&document.activeElement!==document.body;!a&&!dt&&an(t,!O),Me=!0,d.props.page&&Object.assign(k,d.props.page),J=!1,e==="popstate"&&ot(R),p.fulfil(void 0),p.navigation.to&&(p.navigation.to.scroll=D()),M.forEach(b=>b(p.navigation)),$.navigating.set(z.current=null)}async function ut(e,t,n,a,r){return e.origin===le&&e.pathname===location.pathname&&!tt?await $e({status:a,error:n,url:e,route:t}):await H(e,r)}function Xt(){let e,t={element:void 0,href:void 0},n;I.addEventListener("mousemove",s=>{const c=s.target;clearTimeout(e),e=setTimeout(()=>{i(c,j.hover)},20)});function a(s){s.defaultPrevented||i(s.composedPath()[0],j.tap)}I.addEventListener("mousedown",a),I.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(s=>{for(const c of s)c.isIntersecting&&(_e(new URL(c.target.href)),r.unobserve(c.target))},{threshold:0});async function i(s,c){const l=Je(s,I),f=l===t.element&&l?.href===t.href&&c>=n;if(!l||f)return;const{url:h,external:v,download:u}=me(l,x,y.hash);if(v||u)return;const p=te(l),m=h&&ce(_.url)===ce(h);if(!(p.reload||m))if(c<=p.preload_data){t={element:l,href:l.href},n=j.tap;const g=await fe(h,!1);if(!g)return;Bt(g)}else c<=p.preload_code&&(t={element:l,href:l.href},n=c,_e(h))}function o(){r.disconnect();for(const s of I.querySelectorAll("a")){const{url:c,external:l,download:f}=me(s,x,y.hash);if(l||f)continue;const h=te(s);h.reload||(h.preload_code===j.viewport&&r.observe(s),h.preload_code===j.eager&&_e(c))}}M.add(o),o()}function X(e,t){if(e instanceof Ee)return e.body;const n=Ue(e),a=Ct(e);return y.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function Qt(e,t){Dt(()=>(e.add(t),()=>{e.delete(t)}))}function dn(e){Qt(M,e)}function hn(e,t={}){return e=new URL(Le(e)),e.origin!==le?Promise.reject(new Error("goto: invalid URL")):st(e,t,0)}function Zt(e){if(typeof e=="function")ae.push(e);else{const{href:t}=new URL(e,location.href);ae.push(n=>n.href===t)}}function en(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(Fe(),!J){const a=Ce(_,void 0,null,"leave"),r={...a.navigation,cancel:()=>{n=!0,a.reject(new Error("navigation cancelled"))}};et.forEach(i=>i(r))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Fe()}),navigator.connection?.saveData||Xt(),I.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=Je(t.composedPath()[0],I);if(!n)return;const{url:a,external:r,target:i,download:o}=me(n,x,y.hash);if(!a)return;if(i==="_parent"||i==="_top"){if(window.parent!==window)return}else if(i&&i!=="_self")return;const s=te(n);if(!(n instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||o)return;const[l,f]=(y.hash?a.hash.replace(/^#/,""):a.href).split("#"),h=l===he(location);if(r||s.reload&&(!h||!f)){lt({url:a,type:"link",event:t})?J=!0:t.preventDefault();return}if(f!==void 0&&h){const[,v]=_.url.href.split("#");if(v===f){if(t.preventDefault(),f===""||f==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const u=n.ownerDocument.getElementById(decodeURIComponent(f));u&&(u.scrollIntoView(),u.focus())}return}if(F=!0,Ae(w),e(a),!s.replace_state)return;F=!1}t.preventDefault(),await new Promise(v=>{requestAnimationFrame(()=>{setTimeout(v,0)}),setTimeout(v,100)}),await B({type:"link",url:a,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??a.href===location.href,event:t})}),I.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),a=t.submitter;if((a?.formTarget||n.target)==="_blank"||(a?.formMethod||n.method)!=="get")return;const o=new URL(a?.hasAttribute("formaction")&&a?.formAction||n.action);if(ue(o,x,!1))return;const s=t.target,c=te(s);if(c.reload)return;t.preventDefault(),t.stopPropagation();const l=new FormData(s,a);o.search=new URLSearchParams(l).toString(),B({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!be){if(t.state?.[K]){const n=t.state[K];if(N={},n===w)return;const a=C[n],r=t.state[Ye]??{},i=new URL(t.state[It]??location.href),o=t.state[W],s=_.url?he(location)===he(_.url):!1;if(o===R&&(nt||s)){r!==k.state&&(k.state=r),e(i),C[w]=D(),a&&scrollTo(a.x,a.y),w=n;return}const l=n-w;await B({type:"popstate",url:i,popped:{state:r,scroll:a,delta:l},accept:()=>{w=n,R=o},block:()=>{history.go(-l)},nav_token:N,event:t})}else if(!F){const n=new URL(location.href);e(n),y.hash&&location.reload()}}}),addEventListener("hashchange",()=>{F&&(F=!1,history.replaceState({...history.state,[K]:++w,[W]:R},"",location.href))});for(const t of document.querySelectorAll("link"))qt.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&$.navigating.set(z.current=null)});function e(t){_.url=k.url=t,$.page.set(je(k)),$.page.notify()}}async function tn(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:o,data:s,form:c}){tt=!0;const l=new URL(location.href);let f;({params:r={},route:i={id:null}}=await fe(l,!1)||{}),f=Te.find(({id:u})=>u===i.id);let h,v=!0;try{const u=a.map(async(m,g)=>{const d=s[g];return d?.uses&&(d.uses=nn(d.uses)),Pe({loader:y.nodes[m],url:l,params:r,route:i,parent:async()=>{const E={};for(let S=0;S{const s=history.state;be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(s,"",e),t&&scrollTo(i,o),be=!1})}else{const i=document.body,o=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),o!==null?i.setAttribute("tabindex",o):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let o=0;o{if(r.rangeCount===i.length){for(let o=0;o{i=l,o=f});return s.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:D()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:r},willUnload:!t,type:a,complete:s},fulfil:i,reject:o}}function je(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function rn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function ft(e){let t;if(y.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{dn as a,fn as b,hn as g,sn as l,k as p,$ as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DQfFYHAU.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DQfFYHAU.js deleted file mode 100644 index 19f582d9..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DQfFYHAU.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import"./l8YpzWR9.js";import{f as n,g as p,i as d}from"./DCyBifBO.js";import{I as m,s as c}from"./BAxs8Xtu.js";import{l,s as $}from"./v7tHB-Lt.js";function w(t,r){const s=l(r,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M5 12h14"}],["path",{d:"m12 5 7 7-7 7"}]];m(t,$({name:"arrow-right"},()=>s,{get iconNode(){return a},children:(e,f)=>{var o=n(),i=p(o);c(i,r,"default",{}),d(e,o)},$$slots:{default:!0}}))}export{w as A}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DWKiSLzw.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DWKiSLzw.js deleted file mode 100644 index a81cbdff..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DWKiSLzw.js +++ /dev/null @@ -1,6 +0,0 @@ -import{z as J,h as Me,a as ze,aa as Ge,ba as ot,e as Pe,av as rt,aJ as st,bb as it,bc as dt,aO as De,c as lt,aM as ct,aN as ut,bd as ft,au as ge,b as pt,E as Le,be as $t,bf as vt,bg as ht,Z as mt,m as gt,bh as _t,ak as yt,$ as wt,a1 as ne,bi as Oe,g as c,i as l,j as d,w as Q,G as xt,p as kt,B as S,t as m,L as D,D as E,C as W,bj as Nt,K as Z,f as bt,I as ae,F as ce,M as Mt,A as B,O as Ce}from"./hL-aZVJ4.js";import{B as zt,l as f,s as p,p as _e,b as Ae,i as ue,a as Pt,c as Dt}from"./B_6VzoXV.js";import"./DsnmJJEf.js";import"./D7CioVkw.js";import{I as $,s as v,k as fe,r as Ct,S as At,m as He,n as St,i as Se,o as Wt,q as qt,t as Tt,e as We,u as qe,a as Et}from"./BWWgRDE1.js";function sn(t,e,a=!1,o=!1,r=!1){var i=t,n="";J(()=>{var s=Ge;if(n===(n=e()??"")){Me&&ze();return}if(s.nodes!==null&&(ot(s.nodes.start,s.nodes.end),s.nodes=null),n!==""){if(Me){Pe.data;for(var h=ze(),g=h;h!==null&&(h.nodeType!==rt||h.data!=="");)g=h,h=st(h);if(h===null)throw it(),dt;De(Pe,g),i=lt(h);return}var w=a?ut:o?ft:void 0,N=ct(a?"svg":o?"math":"template",w);N.innerHTML=n;var x=a||o?N:N.content;if(De(ge(x),x.lastChild),a||o)for(;ge(x);)i.before(ge(x));else i.before(x)}})}function dn(t,e,...a){var o=new zt(t);pt(()=>{const r=e()??null;o.ensure(r,r&&(i=>r(i,...a)))},Le)}const Gt=()=>performance.now(),T={tick:t=>requestAnimationFrame(t),now:()=>Gt(),tasks:new Set};function Re(){const t=T.now();T.tasks.forEach(e=>{e.c(t)||(T.tasks.delete(e),e.f())}),T.tasks.size!==0&&T.tick(Re)}function Lt(t){let e;return T.tasks.size===0&&T.tick(Re),{promise:new Promise(a=>{T.tasks.add(e={c:t,f:a})}),abort(){T.tasks.delete(e)}}}function pe(t,e){Oe(()=>{t.dispatchEvent(new CustomEvent(e))})}function Ot(t){if(t==="float")return"cssFloat";if(t==="offset")return"cssOffset";if(t.startsWith("--"))return t;const e=t.split("-");return e.length===1?e[0]:e[0]+e.slice(1).map(a=>a[0].toUpperCase()+a.slice(1)).join("")}function Te(t){const e={},a=t.split(";");for(const o of a){const[r,i]=o.split(":");if(!r||i===void 0)break;const n=Ot(r.trim());e[n]=i.trim()}return e}const Ht=t=>t;function ln(t,e,a,o){var r=(t&_t)!==0,i="both",n,s=e.inert,h=e.style.overflow,g,w;function N(){return Oe(()=>n??=a()(e,o?.()??{},{direction:i}))}var x={is_global:r,in(){e.inert=s,g=ye(e,N(),w,1,()=>{pe(e,"introend"),g?.abort(),g=n=void 0,e.style.overflow=h})},out(C){e.inert=!0,w=ye(e,N(),g,0,()=>{pe(e,"outroend"),C?.()})},stop:()=>{g?.abort(),w?.abort()}},q=Ge;if((q.nodes.t??=[]).push(x),$t){var z=r;if(!z){for(var _=q.parent;_&&(_.f&Le)!==0;)for(;(_=_.parent)&&(_.f&vt)===0;);z=!_||(_.f&ht)!==0}z&&mt(()=>{gt(()=>x.in())})}}function ye(t,e,a,o,r){var i=o===1;if(yt(e)){var n,s=!1;return wt(()=>{if(!s){var C=e({direction:i?"in":"out"});n=ye(t,C,a,o,r)}}),{abort:()=>{s=!0,n?.abort()},deactivate:()=>n.deactivate(),reset:()=>n.reset(),t:()=>n.t()}}if(a?.deactivate(),!e?.duration&&!e?.delay)return pe(t,i?"introstart":"outrostart"),r(),{abort:ne,deactivate:ne,reset:ne,t:()=>o};const{delay:h=0,css:g,tick:w,easing:N=Ht}=e;var x=[];if(i&&a===void 0&&(w&&w(0,1),g)){var q=Te(g(0,1));x.push(q,q)}var z=()=>1-o,_=t.animate(x,{duration:h,fill:"forwards"});return _.onfinish=()=>{_.cancel(),pe(t,i?"introstart":"outrostart");var C=a?.t()??1-o;a?.abort();var Y=o-C,I=e.duration*Math.abs(Y),ie=[];if(I>0){var de=!1;if(g)for(var O=Math.ceil(I/16.666666666666668),H=0;H<=O;H+=1){var A=C+Y*N(H/O),R=Te(g(A,1-A));ie.push(R),de||=R.overflow==="hidden"}de&&(t.style.overflow="hidden"),z=()=>{var V=_.currentTime;return C+Y*N(V/I)},w&&Lt(()=>{if(_.playState!=="running")return!1;var V=z();return w(V,1-V),!0})}_=t.animate(ie,{duration:I,fill:"forwards"}),_.onfinish=()=>{z=()=>o,w?.(o,1-o),r()}},{abort:()=>{_&&(_.cancel(),_.effect=null,_.onfinish=ne)},deactivate:()=>{r=ne},reset:()=>{o===0&&w?.(1,0)},t:()=>z()}}function cn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];$(t,p({name:"play"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function un(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];$(t,p({name:"settings"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Rt(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m6 9 6 6 6-6"}]];$(t,p({name:"chevron-down"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function fn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];$(t,p({name:"trash-2"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function pn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"}]];$(t,p({name:"link"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}const oe=Q(!1),re=Q(!1),Ft=Q([]),G=Q(new Set),Bt=Q([]);function L(t){const e={...t,timestamp:t.timestamp??new Date().toISOString()};Ft.update(a=>[...a,e])}const Fe=Q([]);let It=0;function U(t,e="info",a=5e3){const o=`toast-${++It}`;return Fe.update(r=>[...r,{id:o,message:t,type:e,duration:a}]),a>0&&setTimeout(()=>Vt(o),a),o}function Vt(t){Fe.update(e=>e.filter(a=>a.id!==t))}let y=null;const b=[];function $n(){y||(y=new At("/ws/execution"),y.connect(),b.push(y.on("node_start",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.add(t.node_id),a}),fe(t.node_id,"running")),L(t)})),b.push(y.on("node_complete",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"complete")),L(t)})),b.push(y.on("node_error",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"error")),L(t)})),b.push(y.on("node_skip",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"skipped")),L(t)})),b.push(y.on("debug_enabled",t=>{L(t),U("Debug mode active","info")})),b.push(y.on("error",t=>{L(t),U(t.message||t.error||"An error occurred","error")})),b.push(y.on("pipeline_complete",t=>{G.set(new Set),oe.set(!1),re.set(!1),L(t),Ct()})),b.push(y.on("checkpoint_created",t=>{Bt.update(e=>[...e,t])})),b.push(y.on("pipeline_result",t=>{G.set(new Set),oe.set(!1),re.set(!1),L(t)})),b.push(y.on("_close",()=>{G.set(new Set),oe.set(!1),re.set(!1)})),b.push(y.on("_error",()=>{G.set(new Set),oe.set(!1),re.set(!1),U("Execution connection lost. Attempting to reconnect...","warning")})),b.push(y.on("_reconnect_failed",()=>{U("Could not reconnect to execution server. Please refresh the page.","error",0)})))}function vn(){for(const t of b)t();b.length=0,y?.disconnect(),y=null}function hn(t,e){return!y||!y.connected?(U("Cannot run pipeline: not connected to execution server","error"),!1):(He(),oe.set(!0),y.send({action:"run",graph:t,inputs:e??null}),!0)}function mn(t,e){return!y||!y.connected?(U("Cannot debug pipeline: not connected to execution server","error"),!1):(He(),re.set(!0),y.send({action:"debug",graph:t,inputs:null}),!0)}function gn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"}]];$(t,p({name:"copy"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function _n(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M20 6 9 17l-5-5"}]];$(t,p({name:"check"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function yn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2"}],["path",{d:"M6.453 15h11.094"}],["path",{d:"M8.5 2h7"}]];$(t,p({name:"flask-conical"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function wn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M15 6a9 9 0 0 0-9 9V3"}],["circle",{cx:"18",cy:"6",r:"3"}],["circle",{cx:"6",cy:"18",r:"3"}]];$(t,p({name:"git-branch"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function xn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"}],["path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09"}],["path",{d:"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z"}],["path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05"}]];$(t,p({name:"rocket"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function kn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"}]];$(t,p({name:"activity"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Nn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"}]];$(t,p({name:"folder-open"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function bn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 8V4H8"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}],["path",{d:"M2 14h2"}],["path",{d:"M20 14h2"}],["path",{d:"M15 13v2"}],["path",{d:"M9 13v2"}]];$(t,p({name:"bot"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Mn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z"}]];$(t,p({name:"wrench"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function zn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["circle",{cx:"12",cy:"12",r:"1"}]];$(t,p({name:"circle-dot"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Pn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"}]];$(t,p({name:"shield"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Dn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m16 18 6-6-6-6"}],["path",{d:"m8 6-6 6 6 6"}]];$(t,p({name:"code"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Cn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["circle",{cx:"18",cy:"6",r:"3"}],["path",{d:"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9"}],["path",{d:"M12 12v3"}]];$(t,p({name:"git-fork"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function An(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M6 21V9a9 9 0 0 0 9 9"}]];$(t,p({name:"git-merge"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Sn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M2 12 7 2"}],["path",{d:"m7 12 5-10"}],["path",{d:"m12 12 5-10"}],["path",{d:"m17 12 5-10"}],["path",{d:"M4.5 7h15"}],["path",{d:"M12 16v6"}]];$(t,p({name:"antenna"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Wn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];$(t,p({name:"download"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function qn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 19h8"}],["path",{d:"m4 17 6-6-6-6"}]];$(t,p({name:"terminal"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Tn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 6v6l4 2"}]];$(t,p({name:"clock"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Kt(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m21 21-4.34-4.34"}],["circle",{cx:"11",cy:"11",r:"8"}]];$(t,p({name:"search"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}const se=[{provider:"openai",label:"OpenAI",models:[{id:"openai:gpt-4.1",name:"GPT-4.1",provider:"openai",contextWindow:1047576,isDefault:!0},{id:"openai:gpt-4.1-mini",name:"GPT-4.1 Mini",provider:"openai",contextWindow:1047576,isDefault:!1},{id:"openai:gpt-4.1-nano",name:"GPT-4.1 Nano",provider:"openai",contextWindow:1047576,isDefault:!1},{id:"openai:gpt-4o",name:"GPT-4o",provider:"openai",contextWindow:128e3,isDefault:!1},{id:"openai:gpt-4o-mini",name:"GPT-4o Mini",provider:"openai",contextWindow:128e3,isDefault:!1},{id:"openai:o3",name:"o3",provider:"openai",contextWindow:2e5,isDefault:!1},{id:"openai:o4-mini",name:"o4-mini",provider:"openai",contextWindow:2e5,isDefault:!1}]},{provider:"anthropic",label:"Anthropic",models:[{id:"anthropic:claude-sonnet-4-6",name:"Claude Sonnet 4.6",provider:"anthropic",contextWindow:2e5,isDefault:!0},{id:"anthropic:claude-opus-4-6",name:"Claude Opus 4.6",provider:"anthropic",contextWindow:2e5,isDefault:!1},{id:"anthropic:claude-haiku-4-5",name:"Claude Haiku 4.5",provider:"anthropic",contextWindow:2e5,isDefault:!1}]},{provider:"google",label:"Google Gemini",models:[{id:"google:gemini-2.5-pro",name:"Gemini 2.5 Pro",provider:"google",contextWindow:1048576,isDefault:!0},{id:"google:gemini-2.5-flash",name:"Gemini 2.5 Flash",provider:"google",contextWindow:1048576,isDefault:!1},{id:"google:gemini-2.0-flash",name:"Gemini 2.0 Flash",provider:"google",contextWindow:1048576,isDefault:!1}]},{provider:"groq",label:"Groq",models:[{id:"groq:llama-3.3-70b-versatile",name:"Llama 3.3 70B",provider:"groq",contextWindow:128e3,isDefault:!0},{id:"groq:mixtral-8x7b-32768",name:"Mixtral 8x7B",provider:"groq",contextWindow:32768,isDefault:!1},{id:"groq:gemma2-9b-it",name:"Gemma 2 9B",provider:"groq",contextWindow:8192,isDefault:!1}]},{provider:"mistral",label:"Mistral",models:[{id:"mistral:mistral-large-latest",name:"Mistral Large",provider:"mistral",contextWindow:128e3,isDefault:!0},{id:"mistral:mistral-small-latest",name:"Mistral Small",provider:"mistral",contextWindow:128e3,isDefault:!1},{id:"mistral:codestral-latest",name:"Codestral",provider:"mistral",contextWindow:256e3,isDefault:!1}]},{provider:"deepseek",label:"DeepSeek",models:[{id:"deepseek:deepseek-chat",name:"DeepSeek Chat",provider:"deepseek",contextWindow:64e3,isDefault:!0},{id:"deepseek:deepseek-reasoner",name:"DeepSeek Reasoner",provider:"deepseek",contextWindow:64e3,isDefault:!1}]},{provider:"cohere",label:"Cohere",models:[{id:"cohere:command-r-plus",name:"Command R+",provider:"cohere",contextWindow:128e3,isDefault:!0},{id:"cohere:command-r",name:"Command R",provider:"cohere",contextWindow:128e3,isDefault:!1}]},{provider:"azure",label:"Azure OpenAI",models:[{id:"azure:gpt-4o",name:"GPT-4o (Azure)",provider:"azure",contextWindow:128e3,isDefault:!0},{id:"azure:gpt-4o-mini",name:"GPT-4o Mini (Azure)",provider:"azure",contextWindow:128e3,isDefault:!1}]},{provider:"bedrock",label:"Amazon Bedrock",models:[{id:"bedrock:anthropic.claude-3-5-sonnet-20241022-v2:0",name:"Claude 3.5 Sonnet (Bedrock)",provider:"bedrock",contextWindow:2e5,isDefault:!0},{id:"bedrock:anthropic.claude-3-haiku-20240307-v1:0",name:"Claude 3 Haiku (Bedrock)",provider:"bedrock",contextWindow:2e5,isDefault:!1},{id:"bedrock:amazon.nova-pro-v1:0",name:"Amazon Nova Pro",provider:"bedrock",contextWindow:3e5,isDefault:!1}]},{provider:"ollama",label:"Ollama",models:[{id:"ollama:llama3.3",name:"Llama 3.3",provider:"ollama",contextWindow:128e3,isDefault:!0},{id:"ollama:mistral",name:"Mistral",provider:"ollama",contextWindow:32768,isDefault:!1},{id:"ollama:codellama",name:"Code Llama",provider:"ollama",contextWindow:16384,isDefault:!1},{id:"ollama:phi4",name:"Phi-4",provider:"ollama",contextWindow:16384,isDefault:!1}]}];function En(t){return se.find(a=>a.provider===t)?.models.find(a=>a.isDefault)}function jt(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}var Zt=B('
    '),Jt=B(''),Ut=B('Not configured'),Qt=B(''),Yt=B(''),Xt=B(' ',1),en=B('
    ');function Gn(t,e){kt(e,!0);const a=()=>Dt(Tt,"$configuredProviders",o),[o,r]=Pt();let i=_e(e,"value",15,""),n=_e(e,"placeholder",3,"Select or type a model..."),s=_e(e,"showAllProviders",3,!1),h=ae(!1),g=ae(""),w=ae(null),N=ae(null),x=ae(""),q=Ce(()=>{const u=a();let k;if(s()||u.size===0)k=se;else{const M=se.filter(X=>u.has(X.provider)),F=se.filter(X=>!u.has(X.provider));k=[...M,...F]}if(!m(g).trim())return k;const P=m(g).toLowerCase();return k.map(M=>({...M,models:M.models.filter(F=>F.name.toLowerCase().includes(P)||F.id.toLowerCase().includes(P)||M.label.toLowerCase().includes(P))})).filter(M=>M.models.length>0)});function z(u){i(u.id),D(g,""),D(h,!1)}function _(){if(!m(N))return;const u=m(N).getBoundingClientRect(),k=Math.min(300,window.innerHeight-u.bottom-8);D(x,`position:fixed; top:${u.bottom+4}px; left:${u.left}px; width:${u.width}px; max-height:${k}px;`)}function C(){D(h,!0),D(g,""),requestAnimationFrame(_)}function Y(u){const k=u.target;D(g,k.value,!0),i(k.value),D(h,!0)}function I(u){u.key==="Escape"&&(D(h,!1),m(w)?.blur())}function ie(){D(h,!1)}function de(u){for(const k of se){const P=k.models.find(M=>M.id===u);if(P)return P.name}return u}var O=en(),H=S(O),A=S(H);St(A),Ae(A,u=>D(w,u),()=>m(w));var R=E(A,2);Se(R,"tabindex",-1);var V=S(R);Rt(V,{size:14}),W(R),W(H);var we=E(H,2);{var Ie=u=>{var k=Zt(),P=S(k,!0);W(k),J(()=>ce(P,i())),d(u,k)};ue(we,u=>{i()&&!m(h)&&u(Ie)})}var Ve=E(we,2);{var Ke=u=>{var k=Xt(),P=l(k),M=E(P,2),F=S(M);{var X=K=>{var le=Jt();d(K,le)},je=K=>{var le=c(),Je=l(le);We(Je,17,()=>m(q),qe,(Ue,$e)=>{var ve=Yt(),he=S(ve),ke=S(he),Qe=E(ke);{var Ye=ee=>{var j=Ut();d(ee,j)},Xe=Ce(()=>!a().has(m($e).provider)&&a().size>0);ue(Qe,ee=>{m(Xe)&&ee(Ye)})}W(he);var et=E(he,2);We(et,17,()=>m($e).models,qe,(ee,j)=>{var te=Qt();let Ne;var me=S(te),tt=S(me,!0);W(me);var be=E(me,2),nt=S(be);W(be),W(te),J(at=>{Ne=Et(te,1,"dropdown-item svelte-1de56kq",null,Ne,{selected:i()===m(j).id}),ce(tt,m(j).name),ce(nt,`${at??""} ctx`)},[()=>jt(m(j).contextWindow)]),Z("click",te,()=>z(m(j))),d(ee,te)}),W(ve),J(()=>ce(ke,`${m($e).label??""} `)),d(Ue,ve)}),d(K,le)};ue(F,K=>{m(q).length===0?K(X):K(je,!1)})}var xe=E(F,2),Ze=S(xe);Kt(Ze,{size:12}),Mt(2),W(xe),W(M),J(()=>qt(M,m(x))),Z("click",P,ie),Z("keydown",P,()=>{}),d(u,k)};ue(Ve,u=>{m(h)&&u(Ke)})}W(O),Ae(O,u=>D(N,u),()=>m(N)),J(u=>{Wt(A,u),Se(A,"placeholder",n())},[()=>m(h)?m(g):i()?de(i()):""]),Nt("focus",A,C),Z("input",A,Y),Z("keydown",A,I),Z("click",R,()=>{D(h,!m(h)),m(h)&&m(w)?.focus()}),d(t,O),bt(),r()}xt(["input","keydown","click"]);function Ln(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"}]];$(t,p({name:"zap"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Be(t){const e=t-1;return e*e*e+1}function Ee(t){const e=typeof t=="string"&&t.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/);return e?[parseFloat(e[1]),e[2]||"px"]:[t,"px"]}function On(t,{delay:e=0,duration:a=400,easing:o=Be,x:r=0,y:i=0,opacity:n=0}={}){const s=getComputedStyle(t),h=+s.opacity,g=s.transform==="none"?"":s.transform,w=h*(1-n),[N,x]=Ee(r),[q,z]=Ee(i);return{delay:e,duration:a,easing:o,css:(_,C)=>` - transform: ${g} translate(${(1-_)*N}${x}, ${(1-_)*q}${z}); - opacity: ${h-w*C}`}}function Hn(t,{delay:e=0,duration:a=400,easing:o=Be,start:r=0,opacity:i=0}={}){const n=getComputedStyle(t),s=+n.opacity,h=n.transform==="none"?"":n.transform,g=1-r,w=s*(1-i);return{delay:e,duration:a,easing:o,css:(N,x)=>` - transform: ${h} scale(${1-g*x}); - opacity: ${s-w*x} - `}}function Rn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16"}]];$(t,p({name:"circle-alert"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Fn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"}],["path",{d:"M12 9v4"}],["path",{d:"M12 17h.01"}]];$(t,p({name:"triangle-alert"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Bn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 16v-4"}],["path",{d:"M12 8h.01"}]];$(t,p({name:"info"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function In(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m9 18 6-6-6-6"}]];$(t,p({name:"chevron-right"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Vn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m9 12 2 2 4-4"}]];$(t,p({name:"circle-check"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Kn(t,e){const a=f(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}]];$(t,p({name:"file"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);v(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}export{kn as A,bn as B,_n as C,Wn as D,Vn as E,yn as F,wn as G,Kn as H,Bn as I,dn as J,Hn as K,pn as L,Gn as M,Ft as N,Bt as O,cn as P,$n as Q,xn as R,un as S,fn as T,vn as U,Mn as W,Ln as Z,U as a,gn as b,Rt as c,mn as d,re as e,Nn as f,Sn as g,zn as h,oe as i,Pn as j,Dn as k,Cn as l,An as m,qn as n,Tn as o,Kt as p,En as q,hn as r,Fn as s,Fe as t,Rn as u,Vt as v,ln as w,On as x,In as y,sn as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DWbf9ulZ.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DWbf9ulZ.js deleted file mode 100644 index ac57eb8b..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DWbf9ulZ.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import"./D7CioVkw.js";import{g as l,i as c,j as d}from"./hL-aZVJ4.js";import{I as i,s as $}from"./BWWgRDE1.js";import{l as p,s as h}from"./B_6VzoXV.js";function y(t,e){const o=p(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"}],["path",{d:"M20 2v4"}],["path",{d:"M22 4h-4"}],["circle",{cx:"4",cy:"20",r:"2"}]];i(t,h({name:"sparkles"},()=>o,{get iconNode(){return r},children:(s,m)=>{var a=l(),n=c(a);$(n,e,"default",{}),d(s,a)},$$slots:{default:!0}}))}function z(t,e){const o=p(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2"}],["circle",{cx:"9",cy:"9",r:"2"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"}]];i(t,h({name:"image"},()=>o,{get iconNode(){return r},children:(s,m)=>{var a=l(),n=c(a);$(n,e,"default",{}),d(s,a)},$$slots:{default:!0}}))}function N(t,e){const o=p(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"}],["path",{d:"M6 12h16"}]];i(t,h({name:"send-horizontal"},()=>o,{get iconNode(){return r},children:(s,m)=>{var a=l(),n=c(a);$(n,e,"default",{}),d(s,a)},$$slots:{default:!0}}))}export{z as I,y as S,N as a}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DaAgYj3T.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DaAgYj3T.js deleted file mode 100644 index 0067a82a..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DaAgYj3T.js +++ /dev/null @@ -1 +0,0 @@ -import{h as o,b as v,d as y,E as f,r as l,s as m,e as p,g as i,H as T,i as g}from"./BESIXtBI.js";import{B as A}from"./CJh9TUc0.js";function b(d,_,e){var s;o&&(s=g,v());var r=new A(d);y(()=>{var a=_()??null;if(o){var h=l(s),c=h===T,u=a!==null;if(c!==u){var t=m();p(t),r.anchor=t,i(!1),r.ensure(a,a&&(n=>e(n,a))),i(!0);return}}r.ensure(a,a&&(n=>e(n,a)))},f)}export{b as c}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DaNA2RYx.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DaNA2RYx.js deleted file mode 100644 index a0457ef1..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DaNA2RYx.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import"./D7CioVkw.js";import{g as d,i,j as l}from"./hL-aZVJ4.js";import{I as c,s as $}from"./BWWgRDE1.js";import{l as p,s as m}from"./B_6VzoXV.js";function N(e,t){const r=p(t,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M5 12h14"}],["path",{d:"m12 5 7 7-7 7"}]];c(e,m({name:"arrow-right"},()=>r,{get iconNode(){return a},children:(s,f)=>{var o=d(),n=i(o);$(n,t,"default",{}),l(s,o)},$$slots:{default:!0}}))}function y(e,t){const r=p(t,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"}]];c(e,m({name:"folder"},()=>r,{get iconNode(){return a},children:(s,f)=>{var o=d(),n=i(o);$(n,t,"default",{}),l(s,o)},$$slots:{default:!0}}))}export{N as A,y as F}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DaZstLas.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DaZstLas.js deleted file mode 100644 index 647f2ea0..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DaZstLas.js +++ /dev/null @@ -1 +0,0 @@ -import{w as ke,o as Ne,M as U,y as A,N as T,ar as ee,bz as ht,bA as pt}from"./BNectIeB.js";class Ee{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Se{constructor(t,n){this.status=t,this.location=n}}class Re extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function gt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function _t(e){return e.split("%25").map(decodeURI).join("%25")}function mt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function he({href:e}){return e.split("#")[0]}function vt(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;new TextDecoder;function wt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&G.delete(xe(e)),yt(e,t));const G=new Map;function bt(e,t){const n=xe(e,t),a=document.querySelector(n);if(a?.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const o=a.getAttribute("data-ttl");return o&&G.set(n,{body:r,init:i,ttl:1e3*Number(o)}),a.getAttribute("data-b64")!==null&&(r=wt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function kt(e,t,n){if(G.size>0){const a=xe(e,n),r=G.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const o=a.split(/\[(.+?)\](?!\])/);return"/"+o.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return pe(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return pe(String.fromCharCode(...c.slice(2).split("-").map(m=>parseInt(m,16))));const f=Et.exec(c),[,h,v,u,p]=f;return t.push({name:u,matcher:p,optional:!!h,rest:!!v,chained:v?l===1&&o[0]==="":!1}),v?"([^]*?)":h?"([^/]*)?":"([^/]+?)"}return pe(c)}).join("")}).join("")}/?$`),params:t}}function Rt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function xt(e){return e.slice(1).split("/").filter(Rt)}function Lt(e,t,n){const a={},r=e.slice(1),i=r.filter(s=>s!==void 0);let o=0;for(let s=0;sf).join("/"),o=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||n[c.matcher](l)){a[c.name]=l;const f=t[s+1],h=r[s+1];f&&!f.rest&&f.optional&&h&&c.chained&&(o=0),!f&&!h&&Object.keys(a).length===i.length&&(o=0);continue}if(c.optional&&c.chained){o++;continue}return}if(!o)return a}function pe(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Ut({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([s,[c,l,f]])=>{const{pattern:h,params:v}=St(s),u={id:s,exec:p=>{const m=h.exec(p);if(m)return Lt(m,v,a)},errors:[1,...f||[]].map(p=>e[p]),layouts:[0,...l||[]].map(o),leaf:i(c)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function i(s){const c=s<0;return c&&(s=~s),[c,e[s]]}function o(s){return s===void 0?s:[r.has(s),e[s]]}}function Ge(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function qe(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}const x=globalThis.__sveltekit_1pqlk7r?.base??"",At=globalThis.__sveltekit_1pqlk7r?.assets??x??"",Tt="1771680439057",We="sveltekit:snapshot",ze="sveltekit:scroll",Ye="sveltekit:states",It="sveltekit:pageurl",M="sveltekit:history",W="sveltekit:navigation",j={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},le=location.origin;function Le(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function q(){return{x:pageXOffset,y:pageYOffset}}function V(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const De={...j,"":j.hover};function He(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Je(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=He(e)}}function me(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const s=location.hash.split("#")[1]||"/";a.hash=`#${s}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||ue(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=a?.origin===le&&e.hasAttribute("download");return{url:a,external:i,target:r,download:o}}function te(e){let t=null,n=null,a=null,r=null,i=null,o=null,s=e;for(;s&&s!==document.documentElement;)a===null&&(a=V(s,"preload-code")),r===null&&(r=V(s,"preload-data")),t===null&&(t=V(s,"keepfocus")),n===null&&(n=V(s,"noscroll")),i===null&&(i=V(s,"reload")),o===null&&(o=V(s,"replacestate")),s=He(s);function c(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:De[a??"off"],preload_data:De[r??"off"],keepfocus:c(t),noscroll:c(n),reload:c(i),replace_state:c(o)}}function Ve(e){const t=ke(e);let n=!0;function a(){n=!0,t.update(o=>o)}function r(o){n=!1,t.set(o)}function i(o){let s;return t.subscribe(c=>{(s===void 0||n&&c!==s)&&o(s=c)})}return{notify:a,set:r,subscribe:i}}const Xe={v:()=>{}};function Pt(){const{set:e,subscribe:t}=ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${At}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const o=(await r.json()).version!==Tt;return o&&(e(!0),Xe.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:a}}function ue(e,t,n){return e.origin!==le||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function sn(e){}const Qe=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Qe];const Ot=new Set([...Qe]);[...Ot];function $t(e){return e.filter(t=>t!=null)}function Ue(e){return e instanceof Ee||e instanceof Re?e.status:500}function Ct(e){return e instanceof Re?e.text:"Internal Error"}let k,z,ge;const jt=Ne.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ne.toString());jt?(k={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},z={current:null},ge={current:!1}):(k=new class{#e=U({});get data(){return A(this.#e)}set data(t){T(this.#e,t)}#t=U(null);get form(){return A(this.#t)}set form(t){T(this.#t,t)}#n=U(null);get error(){return A(this.#n)}set error(t){T(this.#n,t)}#a=U({});get params(){return A(this.#a)}set params(t){T(this.#a,t)}#r=U({id:null});get route(){return A(this.#r)}set route(t){T(this.#r,t)}#o=U({});get state(){return A(this.#o)}set state(t){T(this.#o,t)}#s=U(-1);get status(){return A(this.#s)}set status(t){T(this.#s,t)}#i=U(new URL("https://example.com"));get url(){return A(this.#i)}set url(t){T(this.#i,t)}},z=new class{#e=U(null);get current(){return A(this.#e)}set current(t){T(this.#e,t)}},ge=new class{#e=U(!1);get current(){return A(this.#e)}set current(t){T(this.#e,t)}},Xe.v=()=>ge.current=!0);function Nt(e){Object.assign(k,e)}const{onMount:qt}=ht,Dt=new Set(["icon","shortcut icon","apple-touch-icon"]),C=Ge(ze)??{},Y=Ge(We)??{},$={url:Ve({}),page:Ve({}),navigating:ke(null),updated:Pt()};function Ae(e){C[e]=q()}function Vt(e,t){let n=e+1;for(;C[n];)delete C[n],n+=1;for(n=t+1;Y[n];)delete Y[n],n+=1}function H(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function Ze(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(x||"/");e&&await e.update()}}function Me(){}let Te,ve,ne,I,we,y;const ae=[],re=[];let L=null;function ye(){L?.fork?.then(e=>e?.discard()),L=null}const Z=new Map,et=new Set,Mt=new Set,K=new Set;let _={branch:[],error:null,url:null},tt=!1,oe=!1,Ke=!0,J=!1,F=!1,nt=!1,Ie=!1,at,w,R,N;const se=new Set,Be=new Map;async function fn(e,t,n){globalThis.__sveltekit_1pqlk7r?.data&&globalThis.__sveltekit_1pqlk7r.data,document.URL!==location.href&&(location.href=location.href),y=e,await e.hooks.init?.(),Te=Ut(e),I=document.documentElement,we=t,ve=e.nodes[0],ne=e.nodes[1],ve(),ne(),w=history.state?.[M],R=history.state?.[W],w||(w=R=Date.now(),history.replaceState({...history.state,[M]:w,[W]:R},""));const a=C[w];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await tn(we,n)):(await B({type:"enter",url:Le(y.hash?rn(new URL(location.href)):location.href),replace_state:!0}),r()),en()}function Kt(){ae.length=0,Ie=!1}function rt(e){re.some(t=>t?.snapshot)&&(Y[e]=re.map(t=>t?.snapshot?.capture()))}function ot(e){Y[e]?.forEach((t,n)=>{re[n]?.snapshot?.restore(t)})}function Fe(){Ae(w),qe(ze,C),rt(R),qe(We,Y)}async function st(e,t,n,a){let r;t.invalidateAll&&ye(),await B({type:"goto",url:Le(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{t.invalidateAll&&(Ie=!0,r=[...Be.keys()]),t.invalidate&&t.invalidate.forEach(Zt)}}),t.invalidateAll&&ee().then(ee).then(()=>{Be.forEach(({resource:i},o)=>{r?.includes(o)&&i.refresh?.()})})}async function Bt(e){if(e.id!==L?.id){ye();const t={};se.add(t),L={id:e.id,token:t,promise:ct({...e,preload:t}).then(n=>(se.delete(t),n.type==="loaded"&&n.state.error&&ye(),n)),fork:null}}return L.promise}async function _e(e){const t=(await fe(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].map(n=>n?.[1]()))}async function it(e,t,n){_=e.state;const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(k,e.props.page),at=new y.root({target:t,props:{...e.props,stores:$,components:re},hydrate:n,sync:!1}),await Promise.resolve(),ot(R),n){const r={from:null,to:{params:_.params,route:{id:_.route?.id??null},url:new URL(location.href),scroll:C[w]??q()},willUnload:!1,type:"enter",complete:Promise.resolve()};K.forEach(i=>i(r))}oe=!0}function ie({url:e,params:t,branch:n,status:a,error:r,route:i,form:o}){let s="never";if(x&&(e.pathname===x||e.pathname===x+"/"))s="always";else for(const u of n)u?.slash!==void 0&&(s=u.slash);e.pathname=gt(e.pathname,s),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:r,route:i},props:{constructors:$t(n).map(u=>u.node.component),page:je(k)}};o!==void 0&&(c.props.form=o);let l={},f=!k,h=0;for(let u=0;us(new URL(o))))return!0;return!1}function Oe(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function Wt(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(o=>i.includes(o))&&i.every(o=>r.includes(o))&&n.delete(a)}return n}function zt({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:je(k),constructors:[]}}}async function ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if(L?.id===e)return se.delete(L.token),L.promise;const{errors:o,layouts:s,leaf:c}=r,l=[...s,c];o.forEach(g=>g?.().catch(()=>{})),l.forEach(g=>g?.[1]().catch(()=>{}));const f=_.url?e!==ce(_.url):!1,h=_.route?r.id!==_.route.id:!1,v=Wt(_.url,n);let u=!1;const p=l.map(async(g,d)=>{if(!g)return;const E=_.branch[d];return g[1]===E?.loader&&!Gt(u,h,f,v,E.universal?.uses,a)?E:(u=!0,Pe({loader:g[1],url:n,params:a,route:r,parent:async()=>{const P={};for(let O=0;O{});const m=[];for(let g=0;gPromise.resolve({}),server_data_node:Oe(i)}),s={node:await ne(),loader:ne,universal:null,server:null,data:null};return ie({url:n,params:r,branch:[o,s],status:e,error:t,route:null})}catch(o){if(o instanceof Se)return st(new URL(o.location,location.href),{},0);throw o}}async function Ht(e){const t=e.href;if(Z.has(t))return Z.get(t);let n;try{const a=(async()=>{let r=await y.hooks.reroute({url:new URL(e),fetch:async(i,o)=>Ft(i,o,e).promise})??e;if(typeof r=="string"){const i=new URL(e);y.hash?i.hash=r:i.pathname=r,r=i}return r})();Z.set(t,a),n=await a}catch{Z.delete(t);return}return n}async function fe(e,t){if(e&&!ue(e,x,y.hash)){const n=await Ht(e);if(!n)return;const a=Jt(n);for(const r of Te){const i=r.exec(a);if(i)return{id:ce(e),invalidating:t,route:r,params:mt(i),url:e}}}}function Jt(e){return _t(y.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(x.length))||"/"}function ce(e){return(y.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function lt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let o=!1;const s=Ce(_,n,e,t,i??null);a!==void 0&&(s.navigation.delta=a),r!==void 0&&(s.navigation.event=r);const c={...s.navigation,cancel:()=>{o=!0,s.reject(new Error("navigation cancelled"))}};return J||et.forEach(l=>l(c)),o?null:s}async function B({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o={},redirect_count:s=0,nav_token:c={},accept:l=Me,block:f=Me,event:h}){const v=N;N=c;const u=await fe(t,!1),p=e==="enter"?Ce(_,u,t,e):lt({url:t,type:e,delta:n?.delta,intent:u,scroll:n?.scroll,event:h});if(!p){f(),N===c&&(N=v);return}const m=w,g=R;l(),J=!0,oe&&p.navigation.type!=="enter"&&$.navigating.set(z.current=p.navigation);let d=u&&await ct(u);if(!d){if(ue(t,x,y.hash))return await H(t,i);d=await ut(t,{id:null},await X(new Re(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=u?.url||t,N!==c)return p.reject(new Error("navigation aborted")),!1;if(d.type==="redirect"){if(s<20){await B({type:e,url:new URL(d.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o,redirect_count:s+1,nav_token:c}),p.fulfil(void 0);return}d=await $e({status:500,error:await X(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else d.props.page.status>=400&&await $.updated.check()&&(await Ze(),await H(t,i));if(Kt(),Ae(m),rt(g),d.props.page.url.pathname!==t.pathname&&(t.pathname=d.props.page.url.pathname),o=n?n.state:o,!n){const b=i?0:1,Q={[M]:w+=b,[W]:R+=b,[Ye]:o};(i?history.replaceState:history.pushState).call(history,Q,"",t),i||Vt(w,R)}const E=u&&L?.id===u.id?L.fork:null;L=null,d.props.page.state=o;let S;if(oe){const b=(await Promise.all(Array.from(Mt,D=>D(p.navigation)))).filter(D=>typeof D=="function");if(b.length>0){let D=function(){b.forEach(de=>{K.delete(de)})};b.push(D),b.forEach(de=>{K.add(de)})}_=d.state,d.props.page&&(d.props.page.url=t);const Q=E&&await E;Q?S=Q.commit():(at.$set(d.props),Nt(d.props.page),S=pt?.()),nt=!0}else await it(d,we,!1);const{activeElement:P}=document;await S,await ee(),await ee();let O=null;if(Ke){const b=n?n.scroll:r?q():null;b?scrollTo(b.x,b.y):(O=t.hash&&document.getElementById(ft(t)))?O.scrollIntoView():scrollTo(0,0)}const dt=document.activeElement!==P&&document.activeElement!==document.body;!a&&!dt&&an(t,!O),Ke=!0,d.props.page&&Object.assign(k,d.props.page),J=!1,e==="popstate"&&ot(R),p.fulfil(void 0),p.navigation.to&&(p.navigation.to.scroll=q()),K.forEach(b=>b(p.navigation)),$.navigating.set(z.current=null)}async function ut(e,t,n,a,r){return e.origin===le&&e.pathname===location.pathname&&!tt?await $e({status:a,error:n,url:e,route:t}):await H(e,r)}function Xt(){let e,t={element:void 0,href:void 0},n;I.addEventListener("mousemove",s=>{const c=s.target;clearTimeout(e),e=setTimeout(()=>{i(c,j.hover)},20)});function a(s){s.defaultPrevented||i(s.composedPath()[0],j.tap)}I.addEventListener("mousedown",a),I.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(s=>{for(const c of s)c.isIntersecting&&(_e(new URL(c.target.href)),r.unobserve(c.target))},{threshold:0});async function i(s,c){const l=Je(s,I),f=l===t.element&&l?.href===t.href&&c>=n;if(!l||f)return;const{url:h,external:v,download:u}=me(l,x,y.hash);if(v||u)return;const p=te(l),m=h&&ce(_.url)===ce(h);if(!(p.reload||m))if(c<=p.preload_data){t={element:l,href:l.href},n=j.tap;const g=await fe(h,!1);if(!g)return;Bt(g)}else c<=p.preload_code&&(t={element:l,href:l.href},n=c,_e(h))}function o(){r.disconnect();for(const s of I.querySelectorAll("a")){const{url:c,external:l,download:f}=me(s,x,y.hash);if(l||f)continue;const h=te(s);h.reload||(h.preload_code===j.viewport&&r.observe(s),h.preload_code===j.eager&&_e(c))}}K.add(o),o()}function X(e,t){if(e instanceof Ee)return e.body;const n=Ue(e),a=Ct(e);return y.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function Qt(e,t){qt(()=>(e.add(t),()=>{e.delete(t)}))}function dn(e){Qt(K,e)}function hn(e,t={}){return e=new URL(Le(e)),e.origin!==le?Promise.reject(new Error("goto: invalid URL")):st(e,t,0)}function Zt(e){if(typeof e=="function")ae.push(e);else{const{href:t}=new URL(e,location.href);ae.push(n=>n.href===t)}}function en(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(Fe(),!J){const a=Ce(_,void 0,null,"leave"),r={...a.navigation,cancel:()=>{n=!0,a.reject(new Error("navigation cancelled"))}};et.forEach(i=>i(r))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Fe()}),navigator.connection?.saveData||Xt(),I.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=Je(t.composedPath()[0],I);if(!n)return;const{url:a,external:r,target:i,download:o}=me(n,x,y.hash);if(!a)return;if(i==="_parent"||i==="_top"){if(window.parent!==window)return}else if(i&&i!=="_self")return;const s=te(n);if(!(n instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||o)return;const[l,f]=(y.hash?a.hash.replace(/^#/,""):a.href).split("#"),h=l===he(location);if(r||s.reload&&(!h||!f)){lt({url:a,type:"link",event:t})?J=!0:t.preventDefault();return}if(f!==void 0&&h){const[,v]=_.url.href.split("#");if(v===f){if(t.preventDefault(),f===""||f==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const u=n.ownerDocument.getElementById(decodeURIComponent(f));u&&(u.scrollIntoView(),u.focus())}return}if(F=!0,Ae(w),e(a),!s.replace_state)return;F=!1}t.preventDefault(),await new Promise(v=>{requestAnimationFrame(()=>{setTimeout(v,0)}),setTimeout(v,100)}),await B({type:"link",url:a,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??a.href===location.href,event:t})}),I.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),a=t.submitter;if((a?.formTarget||n.target)==="_blank"||(a?.formMethod||n.method)!=="get")return;const o=new URL(a?.hasAttribute("formaction")&&a?.formAction||n.action);if(ue(o,x,!1))return;const s=t.target,c=te(s);if(c.reload)return;t.preventDefault(),t.stopPropagation();const l=new FormData(s,a);o.search=new URLSearchParams(l).toString(),B({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!be){if(t.state?.[M]){const n=t.state[M];if(N={},n===w)return;const a=C[n],r=t.state[Ye]??{},i=new URL(t.state[It]??location.href),o=t.state[W],s=_.url?he(location)===he(_.url):!1;if(o===R&&(nt||s)){r!==k.state&&(k.state=r),e(i),C[w]=q(),a&&scrollTo(a.x,a.y),w=n;return}const l=n-w;await B({type:"popstate",url:i,popped:{state:r,scroll:a,delta:l},accept:()=>{w=n,R=o},block:()=>{history.go(-l)},nav_token:N,event:t})}else if(!F){const n=new URL(location.href);e(n),y.hash&&location.reload()}}}),addEventListener("hashchange",()=>{F&&(F=!1,history.replaceState({...history.state,[M]:++w,[W]:R},"",location.href))});for(const t of document.querySelectorAll("link"))Dt.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&$.navigating.set(z.current=null)});function e(t){_.url=k.url=t,$.page.set(je(k)),$.page.notify()}}async function tn(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:o,data:s,form:c}){tt=!0;const l=new URL(location.href);let f;({params:r={},route:i={id:null}}=await fe(l,!1)||{}),f=Te.find(({id:u})=>u===i.id);let h,v=!0;try{const u=a.map(async(m,g)=>{const d=s[g];return d?.uses&&(d.uses=nn(d.uses)),Pe({loader:y.nodes[m],url:l,params:r,route:i,parent:async()=>{const E={};for(let S=0;S{const s=history.state;be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(s,"",e),t&&scrollTo(i,o),be=!1})}else{const i=document.body,o=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),o!==null?i.setAttribute("tabindex",o):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let o=0;o{if(r.rangeCount===i.length){for(let o=0;o{i=l,o=f});return s.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:q()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:r},willUnload:!t,type:a,complete:s},fulfil:i,reject:o}}function je(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function rn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function ft(e){let t;if(y.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{dn as a,fn as b,hn as g,sn as l,k as p,$ as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DfPw5QXW.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DfPw5QXW.js deleted file mode 100644 index 6a891a6b..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DfPw5QXW.js +++ /dev/null @@ -1 +0,0 @@ -import{h as d,d as y,e as _,E as v,r as k,s as A,g as E,i as h,H as S,j as b,k as l,l as R,u as g,q as B,S as N}from"./BNectIeB.js";import{B as p}from"./BB2KRr3j.js";function F(r,s,t){var n;d&&(n=b,y());var i=new p(r);_(()=>{var a=s()??null;if(d){var e=k(n),T=e===S,o=a!==null;if(T!==o){var u=A();E(u),i.anchor=u,h(!1),i.ensure(a,a&&(f=>t(f,a))),h(!0);return}}i.ensure(a,a&&(f=>t(f,a)))},v)}function c(r,s){return r===s||r?.[N]===s}function H(r={},s,t,n){return l(()=>{var i,a;return R(()=>{i=a,a=[],g(()=>{r!==t(...a)&&(s(r,...a),i&&c(t(...i),r)&&s(null,...i))})}),()=>{B(()=>{a&&c(t(...a),r)&&s(null,...a)})}}),r}export{H as b,F as c}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DhiGuJwU.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DhiGuJwU.js deleted file mode 100644 index e751c74c..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DhiGuJwU.js +++ /dev/null @@ -1 +0,0 @@ -import{w as ke,o as Ne,I as U,t as A,L as T,ar as ee,bz as ht,bA as pt}from"./DCyBifBO.js";class Ee{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Se{constructor(t,n){this.status=t,this.location=n}}class Re extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function gt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function _t(e){return e.split("%25").map(decodeURI).join("%25")}function mt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function he({href:e}){return e.split("#")[0]}function vt(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;new TextDecoder;function wt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&G.delete(xe(e)),yt(e,t));const G=new Map;function bt(e,t){const n=xe(e,t),a=document.querySelector(n);if(a?.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const o=a.getAttribute("data-ttl");return o&&G.set(n,{body:r,init:i,ttl:1e3*Number(o)}),a.getAttribute("data-b64")!==null&&(r=wt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function kt(e,t,n){if(G.size>0){const a=xe(e,n),r=G.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const o=a.split(/\[(.+?)\](?!\])/);return"/"+o.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return pe(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return pe(String.fromCharCode(...c.slice(2).split("-").map(m=>parseInt(m,16))));const f=Et.exec(c),[,h,v,u,p]=f;return t.push({name:u,matcher:p,optional:!!h,rest:!!v,chained:v?l===1&&o[0]==="":!1}),v?"([^]*?)":h?"([^/]*)?":"([^/]+?)"}return pe(c)}).join("")}).join("")}/?$`),params:t}}function Rt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function xt(e){return e.slice(1).split("/").filter(Rt)}function Lt(e,t,n){const a={},r=e.slice(1),i=r.filter(s=>s!==void 0);let o=0;for(let s=0;sf).join("/"),o=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||n[c.matcher](l)){a[c.name]=l;const f=t[s+1],h=r[s+1];f&&!f.rest&&f.optional&&h&&c.chained&&(o=0),!f&&!h&&Object.keys(a).length===i.length&&(o=0);continue}if(c.optional&&c.chained){o++;continue}return}if(!o)return a}function pe(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Ut({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([s,[c,l,f]])=>{const{pattern:h,params:v}=St(s),u={id:s,exec:p=>{const m=h.exec(p);if(m)return Lt(m,v,a)},errors:[1,...f||[]].map(p=>e[p]),layouts:[0,...l||[]].map(o),leaf:i(c)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function i(s){const c=s<0;return c&&(s=~s),[c,e[s]]}function o(s){return s===void 0?s:[r.has(s),e[s]]}}function Ge(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function De(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}const x=globalThis.__sveltekit_k1jsbc?.base??"",At=globalThis.__sveltekit_k1jsbc?.assets??x??"",Tt="1771681480583",We="sveltekit:snapshot",ze="sveltekit:scroll",Ye="sveltekit:states",It="sveltekit:pageurl",K="sveltekit:history",W="sveltekit:navigation",C={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},le=location.origin;function Le(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function D(){return{x:pageXOffset,y:pageYOffset}}function V(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const qe={...C,"":C.hover};function He(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Je(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=He(e)}}function me(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const s=location.hash.split("#")[1]||"/";a.hash=`#${s}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||ue(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=a?.origin===le&&e.hasAttribute("download");return{url:a,external:i,target:r,download:o}}function te(e){let t=null,n=null,a=null,r=null,i=null,o=null,s=e;for(;s&&s!==document.documentElement;)a===null&&(a=V(s,"preload-code")),r===null&&(r=V(s,"preload-data")),t===null&&(t=V(s,"keepfocus")),n===null&&(n=V(s,"noscroll")),i===null&&(i=V(s,"reload")),o===null&&(o=V(s,"replacestate")),s=He(s);function c(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:qe[a??"off"],preload_data:qe[r??"off"],keepfocus:c(t),noscroll:c(n),reload:c(i),replace_state:c(o)}}function Ve(e){const t=ke(e);let n=!0;function a(){n=!0,t.update(o=>o)}function r(o){n=!1,t.set(o)}function i(o){let s;return t.subscribe(c=>{(s===void 0||n&&c!==s)&&o(s=c)})}return{notify:a,set:r,subscribe:i}}const Xe={v:()=>{}};function Pt(){const{set:e,subscribe:t}=ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${At}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const o=(await r.json()).version!==Tt;return o&&(e(!0),Xe.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:a}}function ue(e,t,n){return e.origin!==le||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function sn(e){}const Qe=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Qe];const Ot=new Set([...Qe]);[...Ot];function $t(e){return e.filter(t=>t!=null)}function Ue(e){return e instanceof Ee||e instanceof Re?e.status:500}function jt(e){return e instanceof Re?e.text:"Internal Error"}let k,z,ge;const Ct=Ne.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ne.toString());Ct?(k={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},z={current:null},ge={current:!1}):(k=new class{#e=U({});get data(){return A(this.#e)}set data(t){T(this.#e,t)}#t=U(null);get form(){return A(this.#t)}set form(t){T(this.#t,t)}#n=U(null);get error(){return A(this.#n)}set error(t){T(this.#n,t)}#a=U({});get params(){return A(this.#a)}set params(t){T(this.#a,t)}#r=U({id:null});get route(){return A(this.#r)}set route(t){T(this.#r,t)}#o=U({});get state(){return A(this.#o)}set state(t){T(this.#o,t)}#s=U(-1);get status(){return A(this.#s)}set status(t){T(this.#s,t)}#i=U(new URL("https://example.com"));get url(){return A(this.#i)}set url(t){T(this.#i,t)}},z=new class{#e=U(null);get current(){return A(this.#e)}set current(t){T(this.#e,t)}},ge=new class{#e=U(!1);get current(){return A(this.#e)}set current(t){T(this.#e,t)}},Xe.v=()=>ge.current=!0);function Nt(e){Object.assign(k,e)}const{onMount:Dt}=ht,qt=new Set(["icon","shortcut icon","apple-touch-icon"]),j=Ge(ze)??{},Y=Ge(We)??{},$={url:Ve({}),page:Ve({}),navigating:ke(null),updated:Pt()};function Ae(e){j[e]=D()}function Vt(e,t){let n=e+1;for(;j[n];)delete j[n],n+=1;for(n=t+1;Y[n];)delete Y[n],n+=1}function H(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function Ze(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(x||"/");e&&await e.update()}}function Ke(){}let Te,ve,ne,I,we,y;const ae=[],re=[];let L=null;function ye(){L?.fork?.then(e=>e?.discard()),L=null}const Z=new Map,et=new Set,Kt=new Set,M=new Set;let _={branch:[],error:null,url:null},tt=!1,oe=!1,Me=!0,J=!1,F=!1,nt=!1,Ie=!1,at,w,R,N;const se=new Set,Be=new Map;async function fn(e,t,n){globalThis.__sveltekit_k1jsbc?.data&&globalThis.__sveltekit_k1jsbc.data,document.URL!==location.href&&(location.href=location.href),y=e,await e.hooks.init?.(),Te=Ut(e),I=document.documentElement,we=t,ve=e.nodes[0],ne=e.nodes[1],ve(),ne(),w=history.state?.[K],R=history.state?.[W],w||(w=R=Date.now(),history.replaceState({...history.state,[K]:w,[W]:R},""));const a=j[w];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await tn(we,n)):(await B({type:"enter",url:Le(y.hash?rn(new URL(location.href)):location.href),replace_state:!0}),r()),en()}function Mt(){ae.length=0,Ie=!1}function rt(e){re.some(t=>t?.snapshot)&&(Y[e]=re.map(t=>t?.snapshot?.capture()))}function ot(e){Y[e]?.forEach((t,n)=>{re[n]?.snapshot?.restore(t)})}function Fe(){Ae(w),De(ze,j),rt(R),De(We,Y)}async function st(e,t,n,a){let r;t.invalidateAll&&ye(),await B({type:"goto",url:Le(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{t.invalidateAll&&(Ie=!0,r=[...Be.keys()]),t.invalidate&&t.invalidate.forEach(Zt)}}),t.invalidateAll&&ee().then(ee).then(()=>{Be.forEach(({resource:i},o)=>{r?.includes(o)&&i.refresh?.()})})}async function Bt(e){if(e.id!==L?.id){ye();const t={};se.add(t),L={id:e.id,token:t,promise:ct({...e,preload:t}).then(n=>(se.delete(t),n.type==="loaded"&&n.state.error&&ye(),n)),fork:null}}return L.promise}async function _e(e){const t=(await fe(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].map(n=>n?.[1]()))}async function it(e,t,n){_=e.state;const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(k,e.props.page),at=new y.root({target:t,props:{...e.props,stores:$,components:re},hydrate:n,sync:!1}),await Promise.resolve(),ot(R),n){const r={from:null,to:{params:_.params,route:{id:_.route?.id??null},url:new URL(location.href),scroll:j[w]??D()},willUnload:!1,type:"enter",complete:Promise.resolve()};M.forEach(i=>i(r))}oe=!0}function ie({url:e,params:t,branch:n,status:a,error:r,route:i,form:o}){let s="never";if(x&&(e.pathname===x||e.pathname===x+"/"))s="always";else for(const u of n)u?.slash!==void 0&&(s=u.slash);e.pathname=gt(e.pathname,s),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:r,route:i},props:{constructors:$t(n).map(u=>u.node.component),page:Ce(k)}};o!==void 0&&(c.props.form=o);let l={},f=!k,h=0;for(let u=0;us(new URL(o))))return!0;return!1}function Oe(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function Wt(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(o=>i.includes(o))&&i.every(o=>r.includes(o))&&n.delete(a)}return n}function zt({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:Ce(k),constructors:[]}}}async function ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if(L?.id===e)return se.delete(L.token),L.promise;const{errors:o,layouts:s,leaf:c}=r,l=[...s,c];o.forEach(g=>g?.().catch(()=>{})),l.forEach(g=>g?.[1]().catch(()=>{}));const f=_.url?e!==ce(_.url):!1,h=_.route?r.id!==_.route.id:!1,v=Wt(_.url,n);let u=!1;const p=l.map(async(g,d)=>{if(!g)return;const E=_.branch[d];return g[1]===E?.loader&&!Gt(u,h,f,v,E.universal?.uses,a)?E:(u=!0,Pe({loader:g[1],url:n,params:a,route:r,parent:async()=>{const P={};for(let O=0;O{});const m=[];for(let g=0;gPromise.resolve({}),server_data_node:Oe(i)}),s={node:await ne(),loader:ne,universal:null,server:null,data:null};return ie({url:n,params:r,branch:[o,s],status:e,error:t,route:null})}catch(o){if(o instanceof Se)return st(new URL(o.location,location.href),{},0);throw o}}async function Ht(e){const t=e.href;if(Z.has(t))return Z.get(t);let n;try{const a=(async()=>{let r=await y.hooks.reroute({url:new URL(e),fetch:async(i,o)=>Ft(i,o,e).promise})??e;if(typeof r=="string"){const i=new URL(e);y.hash?i.hash=r:i.pathname=r,r=i}return r})();Z.set(t,a),n=await a}catch{Z.delete(t);return}return n}async function fe(e,t){if(e&&!ue(e,x,y.hash)){const n=await Ht(e);if(!n)return;const a=Jt(n);for(const r of Te){const i=r.exec(a);if(i)return{id:ce(e),invalidating:t,route:r,params:mt(i),url:e}}}}function Jt(e){return _t(y.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(x.length))||"/"}function ce(e){return(y.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function lt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let o=!1;const s=je(_,n,e,t,i??null);a!==void 0&&(s.navigation.delta=a),r!==void 0&&(s.navigation.event=r);const c={...s.navigation,cancel:()=>{o=!0,s.reject(new Error("navigation cancelled"))}};return J||et.forEach(l=>l(c)),o?null:s}async function B({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o={},redirect_count:s=0,nav_token:c={},accept:l=Ke,block:f=Ke,event:h}){const v=N;N=c;const u=await fe(t,!1),p=e==="enter"?je(_,u,t,e):lt({url:t,type:e,delta:n?.delta,intent:u,scroll:n?.scroll,event:h});if(!p){f(),N===c&&(N=v);return}const m=w,g=R;l(),J=!0,oe&&p.navigation.type!=="enter"&&$.navigating.set(z.current=p.navigation);let d=u&&await ct(u);if(!d){if(ue(t,x,y.hash))return await H(t,i);d=await ut(t,{id:null},await X(new Re(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=u?.url||t,N!==c)return p.reject(new Error("navigation aborted")),!1;if(d.type==="redirect"){if(s<20){await B({type:e,url:new URL(d.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o,redirect_count:s+1,nav_token:c}),p.fulfil(void 0);return}d=await $e({status:500,error:await X(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else d.props.page.status>=400&&await $.updated.check()&&(await Ze(),await H(t,i));if(Mt(),Ae(m),rt(g),d.props.page.url.pathname!==t.pathname&&(t.pathname=d.props.page.url.pathname),o=n?n.state:o,!n){const b=i?0:1,Q={[K]:w+=b,[W]:R+=b,[Ye]:o};(i?history.replaceState:history.pushState).call(history,Q,"",t),i||Vt(w,R)}const E=u&&L?.id===u.id?L.fork:null;L=null,d.props.page.state=o;let S;if(oe){const b=(await Promise.all(Array.from(Kt,q=>q(p.navigation)))).filter(q=>typeof q=="function");if(b.length>0){let q=function(){b.forEach(de=>{M.delete(de)})};b.push(q),b.forEach(de=>{M.add(de)})}_=d.state,d.props.page&&(d.props.page.url=t);const Q=E&&await E;Q?S=Q.commit():(at.$set(d.props),Nt(d.props.page),S=pt?.()),nt=!0}else await it(d,we,!1);const{activeElement:P}=document;await S,await ee(),await ee();let O=null;if(Me){const b=n?n.scroll:r?D():null;b?scrollTo(b.x,b.y):(O=t.hash&&document.getElementById(ft(t)))?O.scrollIntoView():scrollTo(0,0)}const dt=document.activeElement!==P&&document.activeElement!==document.body;!a&&!dt&&an(t,!O),Me=!0,d.props.page&&Object.assign(k,d.props.page),J=!1,e==="popstate"&&ot(R),p.fulfil(void 0),p.navigation.to&&(p.navigation.to.scroll=D()),M.forEach(b=>b(p.navigation)),$.navigating.set(z.current=null)}async function ut(e,t,n,a,r){return e.origin===le&&e.pathname===location.pathname&&!tt?await $e({status:a,error:n,url:e,route:t}):await H(e,r)}function Xt(){let e,t={element:void 0,href:void 0},n;I.addEventListener("mousemove",s=>{const c=s.target;clearTimeout(e),e=setTimeout(()=>{i(c,C.hover)},20)});function a(s){s.defaultPrevented||i(s.composedPath()[0],C.tap)}I.addEventListener("mousedown",a),I.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(s=>{for(const c of s)c.isIntersecting&&(_e(new URL(c.target.href)),r.unobserve(c.target))},{threshold:0});async function i(s,c){const l=Je(s,I),f=l===t.element&&l?.href===t.href&&c>=n;if(!l||f)return;const{url:h,external:v,download:u}=me(l,x,y.hash);if(v||u)return;const p=te(l),m=h&&ce(_.url)===ce(h);if(!(p.reload||m))if(c<=p.preload_data){t={element:l,href:l.href},n=C.tap;const g=await fe(h,!1);if(!g)return;Bt(g)}else c<=p.preload_code&&(t={element:l,href:l.href},n=c,_e(h))}function o(){r.disconnect();for(const s of I.querySelectorAll("a")){const{url:c,external:l,download:f}=me(s,x,y.hash);if(l||f)continue;const h=te(s);h.reload||(h.preload_code===C.viewport&&r.observe(s),h.preload_code===C.eager&&_e(c))}}M.add(o),o()}function X(e,t){if(e instanceof Ee)return e.body;const n=Ue(e),a=jt(e);return y.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function Qt(e,t){Dt(()=>(e.add(t),()=>{e.delete(t)}))}function dn(e){Qt(M,e)}function hn(e,t={}){return e=new URL(Le(e)),e.origin!==le?Promise.reject(new Error("goto: invalid URL")):st(e,t,0)}function Zt(e){if(typeof e=="function")ae.push(e);else{const{href:t}=new URL(e,location.href);ae.push(n=>n.href===t)}}function en(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(Fe(),!J){const a=je(_,void 0,null,"leave"),r={...a.navigation,cancel:()=>{n=!0,a.reject(new Error("navigation cancelled"))}};et.forEach(i=>i(r))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Fe()}),navigator.connection?.saveData||Xt(),I.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=Je(t.composedPath()[0],I);if(!n)return;const{url:a,external:r,target:i,download:o}=me(n,x,y.hash);if(!a)return;if(i==="_parent"||i==="_top"){if(window.parent!==window)return}else if(i&&i!=="_self")return;const s=te(n);if(!(n instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||o)return;const[l,f]=(y.hash?a.hash.replace(/^#/,""):a.href).split("#"),h=l===he(location);if(r||s.reload&&(!h||!f)){lt({url:a,type:"link",event:t})?J=!0:t.preventDefault();return}if(f!==void 0&&h){const[,v]=_.url.href.split("#");if(v===f){if(t.preventDefault(),f===""||f==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const u=n.ownerDocument.getElementById(decodeURIComponent(f));u&&(u.scrollIntoView(),u.focus())}return}if(F=!0,Ae(w),e(a),!s.replace_state)return;F=!1}t.preventDefault(),await new Promise(v=>{requestAnimationFrame(()=>{setTimeout(v,0)}),setTimeout(v,100)}),await B({type:"link",url:a,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??a.href===location.href,event:t})}),I.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),a=t.submitter;if((a?.formTarget||n.target)==="_blank"||(a?.formMethod||n.method)!=="get")return;const o=new URL(a?.hasAttribute("formaction")&&a?.formAction||n.action);if(ue(o,x,!1))return;const s=t.target,c=te(s);if(c.reload)return;t.preventDefault(),t.stopPropagation();const l=new FormData(s,a);o.search=new URLSearchParams(l).toString(),B({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!be){if(t.state?.[K]){const n=t.state[K];if(N={},n===w)return;const a=j[n],r=t.state[Ye]??{},i=new URL(t.state[It]??location.href),o=t.state[W],s=_.url?he(location)===he(_.url):!1;if(o===R&&(nt||s)){r!==k.state&&(k.state=r),e(i),j[w]=D(),a&&scrollTo(a.x,a.y),w=n;return}const l=n-w;await B({type:"popstate",url:i,popped:{state:r,scroll:a,delta:l},accept:()=>{w=n,R=o},block:()=>{history.go(-l)},nav_token:N,event:t})}else if(!F){const n=new URL(location.href);e(n),y.hash&&location.reload()}}}),addEventListener("hashchange",()=>{F&&(F=!1,history.replaceState({...history.state,[K]:++w,[W]:R},"",location.href))});for(const t of document.querySelectorAll("link"))qt.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&$.navigating.set(z.current=null)});function e(t){_.url=k.url=t,$.page.set(Ce(k)),$.page.notify()}}async function tn(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:o,data:s,form:c}){tt=!0;const l=new URL(location.href);let f;({params:r={},route:i={id:null}}=await fe(l,!1)||{}),f=Te.find(({id:u})=>u===i.id);let h,v=!0;try{const u=a.map(async(m,g)=>{const d=s[g];return d?.uses&&(d.uses=nn(d.uses)),Pe({loader:y.nodes[m],url:l,params:r,route:i,parent:async()=>{const E={};for(let S=0;S{const s=history.state;be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(s,"",e),t&&scrollTo(i,o),be=!1})}else{const i=document.body,o=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),o!==null?i.setAttribute("tabindex",o):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let o=0;o{if(r.rangeCount===i.length){for(let o=0;o{i=l,o=f});return s.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:D()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:r},willUnload:!t,type:a,complete:s},fulfil:i,reject:o}}function Ce(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function rn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function ft(e){let t;if(y.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{dn as a,fn as b,hn as g,sn as l,k as p,$ as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DiTIFvoL.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DiTIFvoL.js deleted file mode 100644 index 6b509c27..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DiTIFvoL.js +++ /dev/null @@ -1,6 +0,0 @@ -import{C as U,h as ze,d as Pe,a9 as He,ba as st,j as De,av as it,aJ as dt,bb as lt,bc as ct,aO as Ce,g as ut,aM as ft,aN as pt,bd as $t,au as ge,e as vt,E as Fe,be as ht,bf as mt,bg as gt,k as _t,u as yt,bh as wt,aj as kt,q as xt,$ as ae,bi as Le,c,f as l,a as d,w as V,b9 as Nt,K as bt,p as Mt,F as S,y as m,N as D,I as E,G as W,bj as zt,L as Q,b as Pt,M as ne,J as ce,O as Dt,D as B,Q as Ae}from"./BNectIeB.js";import{B as Ct,l as u,s as f,p as _e,i as ue,a as At,b as St}from"./BB2KRr3j.js";import"./DsnmJJEf.js";import"./FsCUQR17.js";import{I as p,s as $,i as fe,r as Wt,S as qt,j as Oe,c as Re,k as Tt,m as Se,n as Et,o as Gt,e as We,q as qe,a as Ht}from"./K2hNZgUo.js";import{b as Te}from"./DfPw5QXW.js";function ca(t,e,a=!1,o=!1,r=!1){var i=t,n="";U(()=>{var s=He;if(n===(n=e()??"")){ze&&Pe();return}if(s.nodes!==null&&(st(s.nodes.start,s.nodes.end),s.nodes=null),n!==""){if(ze){De.data;for(var h=Pe(),g=h;h!==null&&(h.nodeType!==it||h.data!=="");)g=h,h=dt(h);if(h===null)throw lt(),ct;Ce(De,g),i=ut(h);return}var w=a?pt:o?$t:void 0,N=ft(a?"svg":o?"math":"template",w);N.innerHTML=n;var k=a||o?N:N.content;if(Ce(ge(k),k.lastChild),a||o)for(;ge(k);)i.before(ge(k));else i.before(k)}})}function ua(t,e,...a){var o=new Ct(t);vt(()=>{const r=e()??null;o.ensure(r,r&&(i=>r(i,...a)))},Fe)}const Ft=()=>performance.now(),T={tick:t=>requestAnimationFrame(t),now:()=>Ft(),tasks:new Set};function Ve(){const t=T.now();T.tasks.forEach(e=>{e.c(t)||(T.tasks.delete(e),e.f())}),T.tasks.size!==0&&T.tick(Ve)}function Lt(t){let e;return T.tasks.size===0&&T.tick(Ve),{promise:new Promise(a=>{T.tasks.add(e={c:t,f:a})}),abort(){T.tasks.delete(e)}}}function pe(t,e){Le(()=>{t.dispatchEvent(new CustomEvent(e))})}function Ot(t){if(t==="float")return"cssFloat";if(t==="offset")return"cssOffset";if(t.startsWith("--"))return t;const e=t.split("-");return e.length===1?e[0]:e[0]+e.slice(1).map(a=>a[0].toUpperCase()+a.slice(1)).join("")}function Ee(t){const e={},a=t.split(";");for(const o of a){const[r,i]=o.split(":");if(!r||i===void 0)break;const n=Ot(r.trim());e[n]=i.trim()}return e}const Rt=t=>t;function fa(t,e,a,o){var r=(t&wt)!==0,i="both",n,s=e.inert,h=e.style.overflow,g,w;function N(){return Le(()=>n??=a()(e,o?.()??{},{direction:i}))}var k={is_global:r,in(){e.inert=s,g=ye(e,N(),w,1,()=>{pe(e,"introend"),g?.abort(),g=n=void 0,e.style.overflow=h})},out(C){e.inert=!0,w=ye(e,N(),g,0,()=>{pe(e,"outroend"),C?.()})},stop:()=>{g?.abort(),w?.abort()}},q=He;if((q.nodes.t??=[]).push(k),ht){var z=r;if(!z){for(var _=q.parent;_&&(_.f&Fe)!==0;)for(;(_=_.parent)&&(_.f&mt)===0;);z=!_||(_.f>)!==0}z&&_t(()=>{yt(()=>k.in())})}}function ye(t,e,a,o,r){var i=o===1;if(kt(e)){var n,s=!1;return xt(()=>{if(!s){var C=e({direction:i?"in":"out"});n=ye(t,C,a,o,r)}}),{abort:()=>{s=!0,n?.abort()},deactivate:()=>n.deactivate(),reset:()=>n.reset(),t:()=>n.t()}}if(a?.deactivate(),!e?.duration&&!e?.delay)return pe(t,i?"introstart":"outrostart"),r(),{abort:ae,deactivate:ae,reset:ae,t:()=>o};const{delay:h=0,css:g,tick:w,easing:N=Rt}=e;var k=[];if(i&&a===void 0&&(w&&w(0,1),g)){var q=Ee(g(0,1));k.push(q,q)}var z=()=>1-o,_=t.animate(k,{duration:h,fill:"forwards"});return _.onfinish=()=>{_.cancel(),pe(t,i?"introstart":"outrostart");var C=a?.t()??1-o;a?.abort();var Z=o-C,I=e.duration*Math.abs(Z),ie=[];if(I>0){var de=!1;if(g)for(var F=Math.ceil(I/16.666666666666668),L=0;L<=F;L+=1){var A=C+Z*N(L/F),O=Ee(g(A,1-A));ie.push(O),de||=O.overflow==="hidden"}de&&(t.style.overflow="hidden"),z=()=>{var j=_.currentTime;return C+Z*N(j/I)},w&&Lt(()=>{if(_.playState!=="running")return!1;var j=z();return w(j,1-j),!0})}_=t.animate(ie,{duration:I,fill:"forwards"}),_.onfinish=()=>{z=()=>o,w?.(o,1-o),r()}},{abort:()=>{_&&(_.cancel(),_.effect=null,_.onfinish=ae)},deactivate:()=>{r=ae},reset:()=>{o===0&&w?.(1,0)},t:()=>z()}}function pa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"}]];p(t,f({name:"play"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function $a(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"}],["circle",{cx:"12",cy:"12",r:"3"}]];p(t,f({name:"settings"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Vt(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m6 9 6 6 6-6"}]];p(t,f({name:"chevron-down"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function va(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];p(t,f({name:"trash-2"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function ha(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"}]];p(t,f({name:"link"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}const oe=V(!1),re=V(!1),Bt=V([]),G=V(new Set),It=V([]);function H(t){const e={...t,timestamp:t.timestamp??new Date().toISOString()};Bt.update(a=>[...a,e])}const Be=V([]);let jt=0;function Y(t,e="info",a=5e3){const o=`toast-${++jt}`;return Be.update(r=>[...r,{id:o,message:t,type:e,duration:a}]),a>0&&setTimeout(()=>Kt(o),a),o}function Kt(t){Be.update(e=>e.filter(a=>a.id!==t))}let y=null;const b=[];function ma(){y||(y=new qt("/ws/execution"),y.connect(),b.push(y.on("node_start",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.add(t.node_id),a}),fe(t.node_id,"running")),H(t)})),b.push(y.on("node_complete",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"complete")),H(t)})),b.push(y.on("node_error",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"error")),H(t)})),b.push(y.on("node_skip",t=>{t.node_id&&(G.update(e=>{const a=new Set(e);return a.delete(t.node_id),a}),fe(t.node_id,"skipped")),H(t)})),b.push(y.on("debug_enabled",t=>{H(t),Y("Debug mode active","info")})),b.push(y.on("error",t=>{H(t),Y(t.message||t.error||"An error occurred","error")})),b.push(y.on("pipeline_complete",t=>{G.set(new Set),oe.set(!1),re.set(!1),H(t),Wt()})),b.push(y.on("checkpoint_created",t=>{It.update(e=>[...e,t])})),b.push(y.on("pipeline_result",t=>{G.set(new Set),oe.set(!1),re.set(!1),H(t)})),b.push(y.on("_close",()=>{G.set(new Set),oe.set(!1),re.set(!1)})),b.push(y.on("_error",()=>{G.set(new Set),oe.set(!1),re.set(!1),Y("Execution connection lost. Attempting to reconnect...","warning")})),b.push(y.on("_reconnect_failed",()=>{Y("Could not reconnect to execution server. Please refresh the page.","error",0)})))}function ga(){for(const t of b)t();b.length=0,y?.disconnect(),y=null}function _a(t,e){return!y||!y.connected?(Y("Cannot run pipeline: not connected to execution server","error"),!1):(Oe(),oe.set(!0),y.send({action:"run",graph:t,inputs:e??null}),!0)}function ya(t,e){return!y||!y.connected?(Y("Cannot debug pipeline: not connected to execution server","error"),!1):(Oe(),re.set(!0),y.send({action:"debug",graph:t,inputs:null}),!0)}function wa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"}]];p(t,f({name:"copy"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function ka(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M20 6 9 17l-5-5"}]];p(t,f({name:"check"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function xa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2"}],["path",{d:"M6.453 15h11.094"}],["path",{d:"M8.5 2h7"}]];p(t,f({name:"flask-conical"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Na(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M15 6a9 9 0 0 0-9 9V3"}],["circle",{cx:"18",cy:"6",r:"3"}],["circle",{cx:"6",cy:"18",r:"3"}]];p(t,f({name:"git-branch"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function ba(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"}],["path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09"}],["path",{d:"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z"}],["path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05"}]];p(t,f({name:"rocket"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ma(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"}]];p(t,f({name:"activity"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function za(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"}]];p(t,f({name:"folder-open"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Pa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 8V4H8"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}],["path",{d:"M2 14h2"}],["path",{d:"M20 14h2"}],["path",{d:"M15 13v2"}],["path",{d:"M9 13v2"}]];p(t,f({name:"bot"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Da(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z"}]];p(t,f({name:"wrench"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ca(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["circle",{cx:"12",cy:"12",r:"1"}]];p(t,f({name:"circle-dot"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Aa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"}]];p(t,f({name:"shield"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Sa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m16 18 6-6-6-6"}],["path",{d:"m8 6-6 6 6 6"}]];p(t,f({name:"code"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Wa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["circle",{cx:"18",cy:"6",r:"3"}],["path",{d:"M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9"}],["path",{d:"M12 12v3"}]];p(t,f({name:"git-fork"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function qa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M6 21V9a9 9 0 0 0 9 9"}]];p(t,f({name:"git-merge"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ta(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M2 12 7 2"}],["path",{d:"m7 12 5-10"}],["path",{d:"m12 12 5-10"}],["path",{d:"m17 12 5-10"}],["path",{d:"M4.5 7h15"}],["path",{d:"M12 16v6"}]];p(t,f({name:"antenna"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ea(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 15V3"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}],["path",{d:"m7 10 5 5 5-5"}]];p(t,f({name:"download"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ga(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 19h8"}],["path",{d:"m4 17 6-6-6-6"}]];p(t,f({name:"terminal"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ha(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 6v6l4 2"}]];p(t,f({name:"clock"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Jt(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m21 21-4.34-4.34"}],["circle",{cx:"11",cy:"11",r:"8"}]];p(t,f({name:"search"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}const we=V(null),Qt=Nt(we,t=>{const e=new Set;if(!t)return e;const a=t.credentials;return a.openai_api_key&&e.add("openai"),a.anthropic_api_key&&e.add("anthropic"),a.google_api_key&&e.add("google"),a.groq_api_key&&e.add("groq"),a.mistral_api_key&&e.add("mistral"),a.deepseek_api_key&&e.add("deepseek"),a.cohere_api_key&&e.add("cohere"),a.azure_openai_api_key&&e.add("azure"),a.aws_access_key_id&&e.add("bedrock"),a.ollama_base_url&&e.add("ollama"),e});async function Fa(){try{const t=await Re.settings.get();we.set(t)}catch(t){console.warn("[studio] Failed to load settings:",t)}}async function La(t,e,a,o){const r={};t!==void 0&&(r.credentials=t),e!==void 0&&(r.model_defaults=e),r.setup_complete=a,o!==void 0&&(r.user_profile=o);try{const i=await Re.settings.save(r);we.set(i)}catch(i){throw console.error("[studio] Failed to save settings:",i),i}}const se=[{provider:"openai",label:"OpenAI",models:[{id:"openai:gpt-4.1",name:"GPT-4.1",provider:"openai",contextWindow:1047576,isDefault:!0},{id:"openai:gpt-4.1-mini",name:"GPT-4.1 Mini",provider:"openai",contextWindow:1047576,isDefault:!1},{id:"openai:gpt-4.1-nano",name:"GPT-4.1 Nano",provider:"openai",contextWindow:1047576,isDefault:!1},{id:"openai:gpt-4o",name:"GPT-4o",provider:"openai",contextWindow:128e3,isDefault:!1},{id:"openai:gpt-4o-mini",name:"GPT-4o Mini",provider:"openai",contextWindow:128e3,isDefault:!1},{id:"openai:o3",name:"o3",provider:"openai",contextWindow:2e5,isDefault:!1},{id:"openai:o4-mini",name:"o4-mini",provider:"openai",contextWindow:2e5,isDefault:!1}]},{provider:"anthropic",label:"Anthropic",models:[{id:"anthropic:claude-sonnet-4-6",name:"Claude Sonnet 4.6",provider:"anthropic",contextWindow:2e5,isDefault:!0},{id:"anthropic:claude-opus-4-6",name:"Claude Opus 4.6",provider:"anthropic",contextWindow:2e5,isDefault:!1},{id:"anthropic:claude-haiku-4-5",name:"Claude Haiku 4.5",provider:"anthropic",contextWindow:2e5,isDefault:!1}]},{provider:"google",label:"Google Gemini",models:[{id:"google:gemini-2.5-pro",name:"Gemini 2.5 Pro",provider:"google",contextWindow:1048576,isDefault:!0},{id:"google:gemini-2.5-flash",name:"Gemini 2.5 Flash",provider:"google",contextWindow:1048576,isDefault:!1},{id:"google:gemini-2.0-flash",name:"Gemini 2.0 Flash",provider:"google",contextWindow:1048576,isDefault:!1}]},{provider:"groq",label:"Groq",models:[{id:"groq:llama-3.3-70b-versatile",name:"Llama 3.3 70B",provider:"groq",contextWindow:128e3,isDefault:!0},{id:"groq:mixtral-8x7b-32768",name:"Mixtral 8x7B",provider:"groq",contextWindow:32768,isDefault:!1},{id:"groq:gemma2-9b-it",name:"Gemma 2 9B",provider:"groq",contextWindow:8192,isDefault:!1}]},{provider:"mistral",label:"Mistral",models:[{id:"mistral:mistral-large-latest",name:"Mistral Large",provider:"mistral",contextWindow:128e3,isDefault:!0},{id:"mistral:mistral-small-latest",name:"Mistral Small",provider:"mistral",contextWindow:128e3,isDefault:!1},{id:"mistral:codestral-latest",name:"Codestral",provider:"mistral",contextWindow:256e3,isDefault:!1}]},{provider:"deepseek",label:"DeepSeek",models:[{id:"deepseek:deepseek-chat",name:"DeepSeek Chat",provider:"deepseek",contextWindow:64e3,isDefault:!0},{id:"deepseek:deepseek-reasoner",name:"DeepSeek Reasoner",provider:"deepseek",contextWindow:64e3,isDefault:!1}]},{provider:"cohere",label:"Cohere",models:[{id:"cohere:command-r-plus",name:"Command R+",provider:"cohere",contextWindow:128e3,isDefault:!0},{id:"cohere:command-r",name:"Command R",provider:"cohere",contextWindow:128e3,isDefault:!1}]},{provider:"azure",label:"Azure OpenAI",models:[{id:"azure:gpt-4o",name:"GPT-4o (Azure)",provider:"azure",contextWindow:128e3,isDefault:!0},{id:"azure:gpt-4o-mini",name:"GPT-4o Mini (Azure)",provider:"azure",contextWindow:128e3,isDefault:!1}]},{provider:"bedrock",label:"Amazon Bedrock",models:[{id:"bedrock:anthropic.claude-3-5-sonnet-20241022-v2:0",name:"Claude 3.5 Sonnet (Bedrock)",provider:"bedrock",contextWindow:2e5,isDefault:!0},{id:"bedrock:anthropic.claude-3-haiku-20240307-v1:0",name:"Claude 3 Haiku (Bedrock)",provider:"bedrock",contextWindow:2e5,isDefault:!1},{id:"bedrock:amazon.nova-pro-v1:0",name:"Amazon Nova Pro",provider:"bedrock",contextWindow:3e5,isDefault:!1}]},{provider:"ollama",label:"Ollama",models:[{id:"ollama:llama3.3",name:"Llama 3.3",provider:"ollama",contextWindow:128e3,isDefault:!0},{id:"ollama:mistral",name:"Mistral",provider:"ollama",contextWindow:32768,isDefault:!1},{id:"ollama:codellama",name:"Code Llama",provider:"ollama",contextWindow:16384,isDefault:!1},{id:"ollama:phi4",name:"Phi-4",provider:"ollama",contextWindow:16384,isDefault:!1}]}];function Oa(t){return se.find(a=>a.provider===t)?.models.find(a=>a.isDefault)}function Ut(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}var Yt=B('
    '),Zt=B(''),Xt=B('Not configured'),ea=B(''),ta=B(''),aa=B(' ',1),na=B('
    ');function Ra(t,e){Mt(e,!0);const a=()=>St(Qt,"$configuredProviders",o),[o,r]=At();let i=_e(e,"value",15,""),n=_e(e,"placeholder",3,"Select or type a model..."),s=_e(e,"showAllProviders",3,!1),h=ne(!1),g=ne(""),w=ne(null),N=ne(null),k=ne(""),q=Ae(()=>{const v=a();let x;if(s()||v.size===0)x=se;else{const M=se.filter(X=>v.has(X.provider)),R=se.filter(X=>!v.has(X.provider));x=[...M,...R]}if(!m(g).trim())return x;const P=m(g).toLowerCase();return x.map(M=>({...M,models:M.models.filter(R=>R.name.toLowerCase().includes(P)||R.id.toLowerCase().includes(P)||M.label.toLowerCase().includes(P))})).filter(M=>M.models.length>0)});function z(v){i(v.id),D(g,""),D(h,!1)}function _(){if(!m(N))return;const v=m(N).getBoundingClientRect(),x=Math.min(300,window.innerHeight-v.bottom-8);D(k,`position:fixed; top:${v.bottom+4}px; left:${v.left}px; width:${v.width}px; max-height:${x}px;`)}function C(){D(h,!0),D(g,""),requestAnimationFrame(_)}function Z(v){const x=v.target;D(g,x.value,!0),i(x.value),D(h,!0)}function I(v){v.key==="Escape"&&(D(h,!1),m(w)?.blur())}function ie(){D(h,!1)}function de(v){for(const x of se){const P=x.models.find(M=>M.id===v);if(P)return P.name}return v}var F=na(),L=S(F),A=S(L);Tt(A),Te(A,v=>D(w,v),()=>m(w));var O=E(A,2);Se(O,"tabindex",-1);var j=S(O);Vt(j,{size:14}),W(O),W(L);var ke=E(L,2);{var je=v=>{var x=Yt(),P=S(x,!0);W(x),U(()=>ce(P,i())),d(v,x)};ue(ke,v=>{i()&&!m(h)&&v(je)})}var Ke=E(ke,2);{var Je=v=>{var x=aa(),P=l(x),M=E(P,2),R=S(M);{var X=K=>{var le=Zt();d(K,le)},Qe=K=>{var le=c(),Ye=l(le);We(Ye,17,()=>m(q),qe,(Ze,$e)=>{var ve=ta(),he=S(ve),Ne=S(he),Xe=E(Ne);{var et=ee=>{var J=Xt();d(ee,J)},tt=Ae(()=>!a().has(m($e).provider)&&a().size>0);ue(Xe,ee=>{m(tt)&&ee(et)})}W(he);var at=E(he,2);We(at,17,()=>m($e).models,qe,(ee,J)=>{var te=ea();let be;var me=S(te),nt=S(me,!0);W(me);var Me=E(me,2),ot=S(Me);W(Me),W(te),U(rt=>{be=Ht(te,1,"dropdown-item svelte-1de56kq",null,be,{selected:i()===m(J).id}),ce(nt,m(J).name),ce(ot,`${rt??""} ctx`)},[()=>Ut(m(J).contextWindow)]),Q("click",te,()=>z(m(J))),d(ee,te)}),W(ve),U(()=>ce(Ne,`${m($e).label??""} `)),d(Ze,ve)}),d(K,le)};ue(R,K=>{m(q).length===0?K(X):K(Qe,!1)})}var xe=E(R,2),Ue=S(xe);Jt(Ue,{size:12}),Dt(2),W(xe),W(M),U(()=>Gt(M,m(k))),Q("click",P,ie),Q("keydown",P,()=>{}),d(v,x)};ue(Ke,v=>{m(h)&&v(Je)})}W(F),Te(F,v=>D(N,v),()=>m(N)),U(v=>{Et(A,v),Se(A,"placeholder",n())},[()=>m(h)?m(g):i()?de(i()):""]),zt("focus",A,C),Q("input",A,Z),Q("keydown",A,I),Q("click",O,()=>{D(h,!m(h)),m(h)&&m(w)?.focus()}),d(t,F),Pt(),r()}bt(["input","keydown","click"]);function Va(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"}]];p(t,f({name:"zap"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ie(t){const e=t-1;return e*e*e+1}function Ge(t){const e=typeof t=="string"&&t.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/);return e?[parseFloat(e[1]),e[2]||"px"]:[t,"px"]}function Ba(t,{delay:e=0,duration:a=400,easing:o=Ie,x:r=0,y:i=0,opacity:n=0}={}){const s=getComputedStyle(t),h=+s.opacity,g=s.transform==="none"?"":s.transform,w=h*(1-n),[N,k]=Ge(r),[q,z]=Ge(i);return{delay:e,duration:a,easing:o,css:(_,C)=>` - transform: ${g} translate(${(1-_)*N}${k}, ${(1-_)*q}${z}); - opacity: ${h-w*C}`}}function Ia(t,{delay:e=0,duration:a=400,easing:o=Ie,start:r=0,opacity:i=0}={}){const n=getComputedStyle(t),s=+n.opacity,h=n.transform==="none"?"":n.transform,g=1-r,w=s*(1-i);return{delay:e,duration:a,easing:o,css:(N,k)=>` - transform: ${h} scale(${1-g*k}); - opacity: ${s-w*k} - `}}function ja(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16"}]];p(t,f({name:"circle-alert"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ka(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"}],["path",{d:"M12 9v4"}],["path",{d:"M12 17h.01"}]];p(t,f({name:"triangle-alert"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ja(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 16v-4"}],["path",{d:"M12 8h.01"}]];p(t,f({name:"info"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Qa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];p(t,f({name:"x"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ua(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m9 18 6-6-6-6"}]];p(t,f({name:"chevron-right"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Ya(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m9 12 2 2 4-4"}]];p(t,f({name:"circle-check"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Za(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}],["path",{d:"M10 9H8"}],["path",{d:"M16 13H8"}],["path",{d:"M16 17H8"}]];p(t,f({name:"file-text"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}function Xa(t,e){const a=u(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}]];p(t,f({name:"file"},()=>a,{get iconNode(){return o},children:(r,i)=>{var n=c(),s=l(n);$(s,e,"default",{}),d(r,n)},$$slots:{default:!0}}))}export{ga as $,Ma as A,Pa as B,ka as C,Ea as D,Ba as E,xa as F,Na as G,Ua as H,Ja as I,ca as J,Ya as K,ha as L,Ra as M,Za as N,Xa as O,pa as P,ua as Q,ba as R,$a as S,va as T,Ia as U,Bt as V,Da as W,Qa as X,It as Y,Va as Z,ma as _,Y as a,wa as b,Vt as c,ya as d,re as e,za as f,Ta as g,Ca as h,oe as i,Aa as j,Sa as k,Wa as l,qa as m,Ga as n,Ha as o,Jt as p,La as q,_a as r,we as s,Fa as t,Oa as u,Be as v,Ka as w,ja as x,Kt as y,fa as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/DsnmJJEf.js b/studio-desktop/frontend-dist/_app/immutable/chunks/DsnmJJEf.js deleted file mode 100644 index ca27dc73..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/DsnmJJEf.js +++ /dev/null @@ -1 +0,0 @@ -typeof window<"u"&&((window.__svelte??={}).v??=new Set).add("5"); diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/FsCUQR17.js b/studio-desktop/frontend-dist/_app/immutable/chunks/FsCUQR17.js deleted file mode 100644 index 1425011b..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/FsCUQR17.js +++ /dev/null @@ -1 +0,0 @@ -import{m as d,n as g,t as c,u as m,v as i,x as b,y as p,z as v,A as y,B as h}from"./BNectIeB.js";function x(n=!1){const s=d,e=s.l.u;if(!e)return;let f=()=>v(s.s);if(n){let a=0,t={};const _=y(()=>{let l=!1;const r=s.s;for(const o in r)r[o]!==t[o]&&(t[o]=r[o],l=!0);return l&&a++,a});f=()=>p(_)}e.b.length&&g(()=>{u(s,f),i(e.b)}),c(()=>{const a=m(()=>e.m.map(b));return()=>{for(const t of a)typeof t=="function"&&t()}}),e.a.length&&c(()=>{u(s,f),i(e.a)})}function u(n,s){if(n.l.s)for(const e of n.l.s)p(e);s()}h();export{x as i}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/K2hNZgUo.js b/studio-desktop/frontend-dist/_app/immutable/chunks/K2hNZgUo.js deleted file mode 100644 index 21f962ab..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/K2hNZgUo.js +++ /dev/null @@ -1,2 +0,0 @@ -import{W as ne,e as Je,at as Fe,h as S,g as W,au as Be,d as ie,y as V,r as ct,_ as ft,s as Ie,i as R,j as L,av as dt,aw as ut,ax as je,R as C,ay as M,X as Z,az as ht,Z as pt,ag as vt,aA as Ge,aB as Ee,aC as gt,aD as mt,a0 as _t,ab as Le,aE as yt,T as qe,V as Ue,aF as _e,q as oe,aG as bt,aH as St,aI as $t,U as le,aJ as wt,aK as Tt,E as At,aL as se,aM as kt,aN as Nt,aO as Et,aP as Ot,a9 as Pt,a3 as Oe,aQ as Ye,k as Pe,aR as Ct,aS as Ke,aT as pe,aU as Qe,aV as Mt,aW as It,aX as ee,aY as jt,L as Lt,K as Rt,aZ as xt,a_ as Dt,a$ as Ht,b0 as zt,b1 as Wt,b2 as Vt,b3 as Jt,b4 as Ft,b5 as Bt,b6 as Gt,ar as qt,u as ce,l as Ce,p as Ut,a as x,b as Yt,b7 as Kt,z as H,F as Qt,I as Xt,G as Zt,c as F,f as B,Q as ea,b8 as ta,b9 as aa,w as I,a2 as J}from"./BNectIeB.js";import"./DsnmJJEf.js";import{i as sa}from"./FsCUQR17.js";import{B as na,l as D,p as z,s as te}from"./BB2KRr3j.js";function ra(e,t){return t}function ia(e,t,a){for(var s=[],n=t.length,i,r=t.length,o=0;o{if(i){if(i.pending.delete(v),i.done.add(v),i.pending.size===0){var u=e.outrogroups;Te(Ee(i.done)),u.delete(i),u.size===0&&(e.outrogroups=null)}}else r-=1},!1)}if(r===0){var f=s.length===0&&a!==null;if(f){var c=a,l=c.parentNode;$t(l),l.append(c),e.items.clear()}Te(t,!f)}else i={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(i)}function Te(e,t=!0){for(var a=0;a{var p=a();return Ge(p)?p:p==null?[]:Ee(p)}),u,m=!0;function $(){d.fallback=l,la(d,u,r,t,s),l!==null&&(u.length===0?(l.f&M)===0?qe(l):(l.f^=M,Q(l,null,r)):Ue(l,()=>{l=null}))}var T=Je(()=>{u=V(v);var p=u.length;let N=!1;if(S){var E=ct(r)===ft;E!==(p===0)&&(r=Ie(),W(r),R(!1),N=!0)}for(var b=new Set,O=C,_=pt(),g=0;gi(r)):(l=Z(()=>i(Re??=ne())),l.f|=M)),p>b.size&&ht(),S&&p>0&&W(Ie()),!m)if(_){for(const[ge,me]of o)b.has(ge)||O.skip_effect(me.e);O.oncommit($),O.ondiscard(()=>{})}else $();N&&R(!0),V(v)}),d={effect:T,items:o,outrogroups:null,fallback:l};m=!1,S&&(r=L)}function U(e){for(;e!==null&&(e.f&bt)===0;)e=e.next;return e}function la(e,t,a,s,n){var i=(s&St)!==0,r=t.length,o=e.items,f=U(e.effect.first),c,l=null,v,u=[],m=[],$,T,d,p;if(i)for(p=0;p0){var k=(s&Fe)!==0&&r===0?a:null;if(i){for(p=0;p{if(v!==void 0)for(d of v)d.nodes?.a?.apply()})}function ca(e,t,a,s,n,i,r,o){var f=(r>)!==0?(r&mt)===0?_t(a,!1,!1):Le(a):null,c=(r&yt)!==0?Le(n):null;return{v:f,i:c,e:Z(()=>(i(t,f??a,c??n,o),()=>{e.delete(s)}))}}function Q(e,t,a){if(e.nodes)for(var s=e.nodes.start,n=e.nodes.end,i=t&&(t.f&M)===0?t.nodes.start:a;s!==null;){var r=wt(s);if(i.before(s),s===n)return;s=r}}function j(e,t,a){t===null?e.effect.first=a:t.next=a,a===null?e.effect.last=t:a.prev=t}function G(e,t,a,s,n){S&&ie();var i=t.$$slots?.[a],r=!1;i===!0&&(i=t.children,r=!0),i===void 0||i(e,r?()=>s:s)}function fa(e,t,a,s,n,i){let r=S;S&&ie();var o=null;S&&L.nodeType===Tt&&(o=L,ie());var f=S?L:e,c=new na(f,!1);Je(()=>{const l=t()||null;var v=Nt;if(l===null){c.ensure(null,null),se(!0);return}return c.ensure(l,u=>{if(l){if(o=S?o:kt(l,v),Et(o,o),s){S&&Ot(l)&&o.append(document.createComment(""));var m=S?Be(o):o.appendChild(ne());S&&(m===null?R(!1):W(m)),s(o,m)}Pt.nodes.end=o,u.before(o)}S&&W(u)}),se(!0),()=>{l&&se(!1)}},At),Oe(()=>{se(!0)}),r&&(R(!0),W(f))}function da(e,t){var a=void 0,s;Ye(()=>{a!==(a=t())&&(s&&(le(s),s=null),a&&(s=Z(()=>{Pe(()=>a(e))})))})}function Xe(e){var t,a,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var n=e.length;for(t=0;t=0;){var o=r+i;(r===0||xe.includes(s[r-1]))&&(o===s.length||xe.includes(s[o]))?s=(r===0?"":s.substring(0,r))+s.substring(o+1):r=o}}return s===""?null:s}function De(e,t=!1){var a=t?" !important;":";",s="";for(var n of Object.keys(e)){var i=e[n];i!=null&&i!==""&&(s+=" "+n+": "+i+a)}return s}function ye(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function va(e,t){if(t){var a="",s,n;if(Array.isArray(t)?(s=t[0],n=t[1]):s=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var i=!1,r=0,o=!1,f=[];s&&f.push(...Object.keys(s).map(ye)),n&&f.push(...Object.keys(n).map(ye));var c=0,l=-1;const T=e.length;for(var v=0;v{fe(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Oe(()=>{t.disconnect()})}function za(e,t,a=t){var s=new WeakSet,n=!0;pe(e,"change",i=>{var r=i?"[selected]":":checked",o;if(e.multiple)o=[].map.call(e.querySelectorAll(r),X);else{var f=e.querySelector(r)??e.querySelector("option:not([disabled])");o=f&&X(f)}a(o),C!==null&&s.add(C)}),Pe(()=>{var i=t();if(e===document.activeElement){var r=Qe??C;if(s.has(r))return}if(fe(e,i,n),n&&i===void 0){var o=e.querySelector(":checked");o!==null&&(i=X(o),a(i))}e.__value=i,n=!1}),Ze(e)}function X(e){return"__value"in e?e.__value:e.value}const Y=Symbol("class"),K=Symbol("style"),et=Symbol("is custom element"),tt=Symbol("is html"),_a=ee?"link":"LINK",ya=ee?"input":"INPUT",ba=ee?"option":"OPTION",Sa=ee?"select":"SELECT",$a=ee?"progress":"PROGRESS";function wa(e){if(S){var t=!1,a=()=>{if(!t){if(t=!0,e.hasAttribute("value")){var s=e.value;de(e,"value",null),e.value=s}if(e.hasAttribute("checked")){var n=e.checked;de(e,"checked",null),e.checked=n}}};e.__on_r=a,oe(a),Wt()}}function Wa(e,t){var a=Me(e);a.value===(a.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==$a)||(e.value=t??"")}function Ta(e,t){t?e.hasAttribute("selected")||e.setAttribute("selected",""):e.removeAttribute("selected")}function de(e,t,a,s){var n=Me(e);S&&(n[t]=e.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&e.nodeName===_a)||n[t]!==(n[t]=a)&&(t==="loading"&&(e[Ft]=a),a==null?e.removeAttribute(t):typeof a!="string"&&at(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function Aa(e,t,a,s,n=!1,i=!1){if(S&&n&&e.nodeName===ya){var r=e,o=r.type==="checkbox"?"defaultChecked":"defaultValue";o in a||wa(r)}var f=Me(e),c=f[et],l=!f[tt];let v=S&&c;v&&R(!1);var u=t||{},m=e.nodeName===ba;for(var $ in t)$ in a||(a[$]=null);a.class?a.class=ha(a.class):(s||a[Y])&&(a.class=null),a[K]&&(a.style??=null);var T=at(e);for(const _ in a){let g=a[_];if(m&&_==="value"&&g==null){e.value=e.__value="",u[_]=g;continue}if(_==="class"){var d=e.namespaceURI==="http://www.w3.org/1999/xhtml";ga(e,d,g,s,t?.[Y],a[Y]),u[_]=g,u[Y]=a[Y];continue}if(_==="style"){ma(e,g,t?.[K],a[K]),u[_]=g,u[K]=a[K];continue}var p=u[_];if(!(g===p&&!(g===void 0&&e.hasAttribute(_)))){u[_]=g;var N=_[0]+_[1];if(N!=="$$")if(N==="on"){const w={},k="$$"+_;let y=_.slice(2);var E=Bt(y);if(jt(y)&&(y=y.slice(0,-7),w.capture=!0),!E&&p){if(g!=null)continue;e.removeEventListener(y,u[k],w),u[k]=null}if(E)Lt(y,e,g),Rt([y]);else if(g!=null){let ge=function(me){u[_].call(this,me)};u[k]=xt(y,e,ge,w)}}else if(_==="style")de(e,_,g);else if(_==="autofocus")Dt(e,!!g);else if(!c&&(_==="__value"||_==="value"&&g!=null))e.value=e.__value=g;else if(_==="selected"&&m)Ta(e,g);else{var b=_;l||(b=Ht(b));var O=b==="defaultValue"||b==="defaultChecked";if(g==null&&!c&&!O)if(f[_]=null,b==="value"||b==="checked"){let w=e;const k=t===void 0;if(b==="value"){let y=w.defaultValue;w.removeAttribute(b),w.defaultValue=y,w.value=w.__value=k?y:null}else{let y=w.defaultChecked;w.removeAttribute(b),w.defaultChecked=y,w.checked=k?y:!1}}else e.removeAttribute(_);else O||T.includes(b)&&(c||typeof g!="string")?(e[b]=g,b in f&&(f[b]=zt)):typeof g!="function"&&de(e,b,g)}}}return v&&R(!0),u}function He(e,t,a=[],s=[],n=[],i,r=!1,o=!1){Mt(n,a,s,f=>{var c=void 0,l={},v=e.nodeName===Sa,u=!1;if(Ye(()=>{var $=t(...f.map(V)),T=Aa(e,c,$,i,r,o);u&&v&&"value"in $&&fe(e,$.value);for(let p of Object.getOwnPropertySymbols(l))$[p]||le(l[p]);for(let p of Object.getOwnPropertySymbols($)){var d=$[p];p.description===It&&(!c||d!==c[p])&&(l[p]&&le(l[p]),l[p]=Z(()=>da(e,()=>d))),T[p]=d}c=T}),v){var m=e;Pe(()=>{fe(m,c.value,!0),Ze(m)})}u=!0})}function Me(e){return e.__attributes??={[et]:e.nodeName.includes("-"),[tt]:e.namespaceURI===Vt}}var ze=new Map;function at(e){var t=e.getAttribute("is")||e.nodeName,a=ze.get(t);if(a)return a;ze.set(t,a=[]);for(var s,n=e,i=Element.prototype;i!==n;){s=Gt(n);for(var r in s)s[r].set&&a.push(r);n=Jt(n)}return a}function Va(e,t,a=t){var s=new WeakSet;pe(e,"input",async n=>{var i=n?e.defaultValue:e.value;if(i=$e(e)?we(i):i,a(i),C!==null&&s.add(C),await qt(),i!==(i=t())){var r=e.selectionStart,o=e.selectionEnd,f=e.value.length;if(e.value=i??"",o!==null){var c=e.value.length;r===o&&o===f&&c>f?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=r,e.selectionEnd=Math.min(o,c))}}}),(S&&e.defaultValue!==e.value||ce(t)==null&&e.value)&&(a($e(e)?we(e.value):e.value),C!==null&&s.add(C)),Ce(()=>{var n=t();if(e===document.activeElement){var i=Qe??C;if(s.has(i))return}$e(e)&&n===we(e.value)||e.type==="date"&&!n&&!e.value||n!==e.value&&(e.value=n??"")})}const Se=new Set;function Ja(e,t,a,s,n=s){var i=a.getAttribute("type")==="checkbox",r=e;let o=!1;if(t!==null)for(var f of t)r=r[f]??=[];r.push(a),pe(a,"change",()=>{var c=a.__value;i&&(c=We(r,c,a.checked)),n(c)},()=>n(i?[]:null)),Ce(()=>{var c=s();if(S&&a.defaultChecked!==a.checked){o=!0;return}i?(c=c||[],a.checked=c.includes(a.__value)):a.checked=Ke(a.__value,c)}),Oe(()=>{var c=r.indexOf(a);c!==-1&&r.splice(c,1)}),Se.has(r)||(Se.add(r),oe(()=>{r.sort((c,l)=>c.compareDocumentPosition(l)===4?-1:1),Se.delete(r)})),oe(()=>{if(o){var c;if(i)c=We(r,c,a.checked);else{var l=r.find(v=>v.checked);c=l?.__value}n(c)}})}function Fa(e,t,a=t){pe(e,"change",s=>{var n=s?e.defaultChecked:e.checked;a(n)}),(S&&e.defaultChecked!==e.checked||ce(t)==null)&&a(e.checked),Ce(()=>{var s=t();e.checked=!!s})}function We(e,t,a){for(var s=new Set,n=0;n{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1};const Ve=(...e)=>e.filter((t,a,s)=>!!t&&t.trim()!==""&&s.indexOf(t)===a).join(" ").trim();var Ea=Kt("");function ae(e,t){const a=D(t,["children","$$slots","$$events","$$legacy"]),s=D(a,["name","color","size","strokeWidth","absoluteStrokeWidth","iconNode"]);Ut(t,!1);let n=z(t,"name",8,void 0),i=z(t,"color",8,"currentColor"),r=z(t,"size",8,24),o=z(t,"strokeWidth",8,2),f=z(t,"absoluteStrokeWidth",8,!1),c=z(t,"iconNode",24,()=>[]);sa();var l=Ea();He(l,(m,$,T)=>({...ka,...m,...s,width:r(),height:r(),stroke:i(),"stroke-width":$,class:T}),[()=>Na(s)?void 0:{"aria-hidden":"true"},()=>(H(f()),H(o()),H(r()),ce(()=>f()?Number(o())*24/Number(r()):o())),()=>(H(Ve),H(n()),H(a),ce(()=>Ve("lucide-icon","lucide",n()?`lucide-${n()}`:"",a.class)))]);var v=Qt(l);oa(v,1,c,ra,(m,$)=>{var T=ea(()=>ta(V($),2));let d=()=>V(T)[0],p=()=>V(T)[1];var N=F(),E=B(N);fa(E,d,!0,(b,O)=>{He(b,()=>({...p()}))}),x(m,N)});var u=Xt(v);G(u,t,"default",{}),Zt(l),x(e,l),Yt()}function Ba(e,t){const a=D(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 2v4"}],["path",{d:"m16.2 7.8 2.9-2.9"}],["path",{d:"M18 12h4"}],["path",{d:"m16.2 16.2 2.9 2.9"}],["path",{d:"M12 18v4"}],["path",{d:"m4.9 19.1 2.9-2.9"}],["path",{d:"M2 12h4"}],["path",{d:"m4.9 4.9 2.9 2.9"}]];ae(e,te({name:"loader"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=F(),o=B(r);G(o,t,"default",{}),x(n,r)},$$slots:{default:!0}}))}function Ga(e,t){const a=D(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M5 12h14"}],["path",{d:"M12 5v14"}]];ae(e,te({name:"plus"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=F(),o=B(r);G(o,t,"default",{}),x(n,r)},$$slots:{default:!0}}))}class Oa{ws=null;listeners=new Map;url;reconnectAttempts=0;maxReconnectAttempts=5;reconnectTimer=null;_intentionalClose=!1;constructor(t){const a=window.location.protocol==="https:"?"wss:":"ws:";this.url=`${a}//${window.location.host}${t}`}connect(){this._intentionalClose=!1,this.ws=new WebSocket(this.url),this.ws.onopen=()=>{this.reconnectAttempts=0,this.notify("_open",{type:"_open",timestamp:""})},this.ws.onmessage=t=>{try{const a=JSON.parse(t.data);this.notify(a.type,a),this.notify("*",a)}catch{console.warn("[StudioWebSocket] Unparseable frame:",t.data)}},this.ws.onclose=()=>{this.notify("_close",{type:"_close",timestamp:""}),this._intentionalClose||this.attemptReconnect()},this.ws.onerror=()=>{this.notify("_error",{type:"_error",timestamp:""})}}attemptReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){this.notify("_reconnect_failed",{type:"_reconnect_failed",timestamp:""});return}this.reconnectAttempts++;const t=Math.min(1e3*Math.pow(2,this.reconnectAttempts-1),1e4);this.reconnectTimer=setTimeout(()=>{this.connect()},t)}notify(t,a){const s=this.listeners.get(t);if(s)for(const n of s)try{n(a)}catch(i){console.error(`[StudioWebSocket] Listener error for '${t}':`,i)}}on(t,a){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(a),()=>this.listeners.get(t)?.delete(a)}send(t){this.ws?.readyState===WebSocket.OPEN?this.ws.send(JSON.stringify(t)):console.warn("[StudioWebSocket] Cannot send: WebSocket not open")}get connected(){return this.ws?.readyState===WebSocket.OPEN}disconnect(){this._intentionalClose=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws?.close(),this.ws=null}}const P=I([]),ue=I([]);function qa(){const e=J(P),t=J(ue);return{nodes:e.map(a=>({id:a.id,type:a.type??"pipeline_step",label:a.data?.label??a.id,position:a.position,data:a.data??{},width:a.measured?.width??a.width??null,height:a.measured?.height??a.height??null})),edges:t.map(a=>({id:a.id,source:a.source,target:a.target,source_handle:a.sourceHandle??"output",target_handle:a.targetHandle??"input",label:a.label??null})),metadata:{}}}const st=I(null),Ua=aa([P,st],([e,t])=>t?e.find(a=>a.id===t)??null:null),nt=I(new Map);function Ya(e,t){nt.update(a=>{const s=new Map(a);return s.set(e,t),s}),Pa(e,"_executionState",t)}function Ka(){nt.update(e=>{const t=new Map;for(const[a]of e)t.set(a,"idle");return t}),P.update(e=>e.map(t=>({...t,data:{...t.data,_executionState:"idle"}})))}let re=0;function Ae(){const e=J(P);let t=0;for(const a of e){const s=a.id.match(/-(\d+)$/);if(s){const n=parseInt(s[1],10);n>t&&(t=n)}}re=t}function Qa(e,t){re++;const a=`${e}-${re}`,s=J(P),n=J(st);let i=250,r=200;const o=280,f=0;if(n){const l=s.find(v=>v.id===n);l&&(i=l.position.x+o,r=l.position.y+f)}else if(s.length>0){let l=-1/0,v=200;for(const u of s)u.position.x>l&&(l=u.position.x,v=u.position.y);i=l+o,r=v}s.some(l=>Math.abs(l.position.x-i)<20&&Math.abs(l.position.y-r)<20)&&(r+=120),P.update(l=>[...l,{id:a,type:e,position:{x:i,y:r},data:{label:`${t} ${re}`}}])}function Pa(e,t,a){P.update(s=>s.map(n=>n.id===e?{...n,data:{...n.data,[t]:a}}:n))}const rt="/api";async function h(e,t){const a=await fetch(`${rt}${e}`,{headers:{"Content-Type":"application/json"},...t});if(!a.ok){const s=await a.json().catch(()=>({detail:a.statusText}));throw new Error(s.detail||a.statusText)}return a.json()}const q={health:()=>h("/health"),registry:{agents:()=>h("/registry/agents"),tools:()=>h("/registry/tools"),patterns:()=>h("/registry/patterns")},projects:{list:()=>h("/projects"),create:(e,t)=>h("/projects",{method:"POST",body:JSON.stringify({name:e,description:t})}),delete:e=>h(`/projects/${e}`,{method:"DELETE"}),savePipeline:(e,t,a)=>h(`/projects/${e}/pipelines/${t}`,{method:"POST",body:JSON.stringify({graph:a})}),loadPipeline:(e,t)=>h(`/projects/${e}/pipelines/${t}`),getHistory:e=>h(`/projects/${e}/history`),restoreVersion:(e,t)=>h(`/projects/${e}/restore`,{method:"POST",body:JSON.stringify({commit_sha:t})}),bookmarkVersion:(e,t,a)=>h(`/projects/${e}/bookmark`,{method:"POST",body:JSON.stringify({commit_sha:t,label:a})})},files:{list:e=>h(`/projects/${e}/files`),read:(e,t)=>h(`/projects/${e}/files/${t}`)},evaluate:{uploadDataset:(e,t)=>{const a=new FormData;return a.append("file",t),fetch(`${rt}/projects/${e}/datasets/upload`,{method:"POST",body:a}).then(async s=>{if(!s.ok){const n=await s.json().catch(()=>({detail:s.statusText}));throw new Error(n.detail||s.statusText)}return s.json()})},listDatasets:e=>h(`/projects/${e}/datasets`),run:(e,t,a)=>h("/evaluate/run",{method:"POST",body:JSON.stringify({project:e,dataset:t,graph:a})})},experiments:{list:e=>h(`/projects/${e}/experiments`),create:(e,t,a)=>h(`/projects/${e}/experiments`,{method:"POST",body:JSON.stringify({name:t,variants:a})}),get:(e,t)=>h(`/projects/${e}/experiments/${t}`),delete:(e,t)=>h(`/projects/${e}/experiments/${t}`,{method:"DELETE"}),runVariant:(e,t,a,s,n)=>h(`/projects/${e}/experiments/${t}/run`,{method:"POST",body:JSON.stringify({variant_name:a,graph:s,input:n??""})})},codegen:{toCode:e=>h("/codegen/to-code",{method:"POST",body:JSON.stringify({graph:e})})},monitoring:{usage:()=>h("/monitoring/usage")},checkpoints:{list:()=>h("/checkpoints"),get:e=>h(`/checkpoints/${e}`),fork:(e,t)=>h("/checkpoints/fork",{method:"POST",body:JSON.stringify({from_index:e,modified_state:t})}),rewind:e=>h(`/checkpoints/${e}/rewind`,{method:"POST"}),diff:(e,t)=>h("/checkpoints/diff",{method:"POST",body:JSON.stringify({index_a:e,index_b:t})}),clear:()=>h("/checkpoints",{method:"DELETE"})},settings:{get:()=>h("/settings"),save:e=>h("/settings",{method:"POST",body:JSON.stringify(e)}),status:()=>h("/settings/status")},assistant:{getHistory:e=>h(`/assistant/${e}/history`),saveHistory:(e,t)=>h(`/assistant/${e}/history`,{method:"POST",body:JSON.stringify({messages:t})}),inferProjectName:e=>h("/assistant/infer-project-name",{method:"POST",body:JSON.stringify({message:e})})},oracle:{getInsights:e=>h(`/oracle/${e}/insights`),approveInsight:(e,t)=>h(`/oracle/${e}/insights/${t}/approve`,{method:"POST"}),skipInsight:(e,t)=>h(`/oracle/${e}/insights/${t}/skip`,{method:"POST"})},tunnel:{status:()=>h("/tunnel/status"),start:()=>h("/tunnel/start",{method:"POST"}),stop:()=>h("/tunnel/stop",{method:"POST"})},runtime:{start:e=>h(`/projects/${e}/runtime/start`,{method:"POST"}),stop:e=>h(`/projects/${e}/runtime/stop`,{method:"POST"}),status:e=>h(`/projects/${e}/runtime/status`),executions:e=>h(`/projects/${e}/runtime/executions`)},customTools:{list:()=>h("/custom-tools"),get:e=>h(`/custom-tools/${e}`),save:e=>h("/custom-tools",{method:"POST",body:JSON.stringify(e)}),delete:e=>h(`/custom-tools/${e}`,{method:"DELETE"}),register:e=>h(`/custom-tools/${e}/register`,{method:"POST"}),test:e=>h(`/custom-tools/${e}/test`,{method:"POST"}),catalog:()=>h("/custom-tools/catalog"),installConnector:(e,t)=>h(`/custom-tools/catalog/${e}/install`,{method:"POST",body:JSON.stringify(t??{})}),verifyConnector:e=>h(`/custom-tools/catalog/${e}/verify`,{method:"POST"})}},ve=I([]),ke=I(!1),he=I(!1);let A=null;function Ca(e){it(),A=new Oa(`/ws/oracle?project=${encodeURIComponent(e)}`),A.on("_open",()=>{ke.set(!0)}),A.on("_close",()=>{ke.set(!1)}),A.on("insight",t=>{const a=t;ve.update(s=>[a,...s])}),A.on("analysis_complete",()=>{he.set(!1)}),A.on("error",()=>{he.set(!1)}),A.on("canvas_synced",()=>{}),A.connect()}function it(){A&&(A.disconnect(),A=null),ke.set(!1),he.set(!1)}function Xa(e,t){A?.connected&&A.send({action:"sync_canvas",nodes:e,edges:t})}function Za(){A?.connected&&(he.set(!0),A.send({action:"analyze"}))}async function es(e,t){const a=await q.oracle.approveInsight(e,t);return ve.update(s=>s.map(n=>n.id===t?{...n,status:"approved"}:n)),a.action_instruction??null}async function ts(e,t){await q.oracle.skipInsight(e,t),ve.update(a=>a.map(s=>s.id===t?{...s,status:"skipped"}:s))}async function Ma(e){const t=await q.oracle.getInsights(e);ve.set(t)}const Ia=[{id:"blank",name:"Blank",description:"Start with an empty canvas",nodes:[],edges:[]},{id:"simple-qa",name:"Simple Q&A Agent",description:"A single agent with a tool — the simplest working pipeline",nodes:[{id:"agent-1",type:"agent",position:{x:200,y:200},data:{label:"Q&A Agent",model:"openai:gpt-4.1",instructions:"You are a helpful assistant. Answer the user's questions clearly and concisely.",description:"Main Q&A agent"}},{id:"tool-1",type:"tool",position:{x:500,y:200},data:{label:"Web Search",description:"Search the web for relevant information"}}],edges:[{id:"edge-1",source:"agent-1",target:"tool-1",animated:!0}]},{id:"reasoning-pipeline",name:"Reasoning Pipeline",description:"Multi-step pipeline with reasoning, branching, and validation",nodes:[{id:"agent-1",type:"agent",position:{x:100,y:200},data:{label:"Input Agent",model:"openai:gpt-4.1",instructions:"Analyze the user input and prepare it for reasoning.",description:"Receives and preprocesses user input"}},{id:"reasoning-1",type:"reasoning",position:{x:350,y:200},data:{label:"Chain of Thought",pattern:"chain_of_thought",maxSteps:5}},{id:"condition-1",type:"condition",position:{x:600,y:200},data:{label:"Quality Check",condition:"result.confidence > 0.8"}},{id:"agent-2",type:"agent",position:{x:850,y:150},data:{label:"Output Agent",model:"openai:gpt-4.1-mini",instructions:"Format and present the final answer to the user.",description:"Formats final response"}},{id:"agent-3",type:"agent",position:{x:850,y:300},data:{label:"Retry Agent",model:"openai:gpt-4.1",instructions:"The previous reasoning was not confident enough. Try again with more detail.",description:"Retries with more detail"}}],edges:[{id:"edge-1",source:"agent-1",target:"reasoning-1",animated:!0},{id:"edge-2",source:"reasoning-1",target:"condition-1",animated:!0},{id:"edge-3",source:"condition-1",target:"agent-2",animated:!0},{id:"edge-4",source:"condition-1",target:"agent-3",animated:!0}]}],ot="fireflyStudio:selectedProject",ja=I(null),Ne=I([]);async function lt(e){ja.set(e);try{localStorage.setItem(ot,e.name)}catch{}try{const t=await q.projects.loadPipeline(e.name,"main");if(t&&typeof t=="object"){const a=t;a.nodes&&P.set(a.nodes),a.edges&&ue.set(a.edges),Ae()}}catch{P.set([]),ue.set([]),Ae()}it(),Ca(e.name),Ma(e.name).catch(()=>{})}async function as(e){const t=await q.projects.create(e);await La();const s=J(Ne).find(n=>n.name===e);return s&<(s),t}async function La(){try{let e=await q.projects.list();if(e.length===0){Ne.set([]);return}Ne.set(e);let t;try{const a=localStorage.getItem(ot);a&&(t=e.find(s=>s.name===a))}catch{}lt(t??e[0])}catch(e){console.warn("[studio] Failed to initialise projects:",e)}}function ss(e,t){const a=Ia.find(n=>n.id===e);if(!a)return;const s=a.nodes;P.set(s),ue.set(a.edges),Ae()}function ns(e,t){const a=D(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2"}],["rect",{x:"14",y:"2",width:"8",height:"8",rx:"1"}]];ae(e,te({name:"blocks"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=F(),o=B(r);G(o,t,"default",{}),x(n,r)},$$slots:{default:!0}}))}function rs(e,t){const a=D(t,["children","$$slots","$$events","$$legacy"]);const s=[["path",{d:"M12 18V5"}],["path",{d:"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4"}],["path",{d:"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5"}],["path",{d:"M17.997 5.125a4 4 0 0 1 2.526 5.77"}],["path",{d:"M18 18a4 4 0 0 0 2-7.464"}],["path",{d:"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517"}],["path",{d:"M6 18a4 4 0 0 1-2-7.464"}],["path",{d:"M6.003 5.125a4 4 0 0 0-2.526 5.77"}]];ae(e,te({name:"brain"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=F(),o=B(r);G(o,t,"default",{}),x(n,r)},$$slots:{default:!0}}))}function is(e,t){const a=D(t,["children","$$slots","$$events","$$legacy"]);const s=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5"}],["path",{d:"M3 12A9 3 0 0 0 21 12"}]];ae(e,te({name:"database"},()=>a,{get iconNode(){return s},children:(n,i)=>{var r=F(),o=B(r);G(o,t,"default",{}),x(n,r)},$$slots:{default:!0}}))}export{Ae as A,rs as B,st as C,is as D,He as E,Y as F,K as G,ha as H,ae as I,za as J,Pa as K,Ba as L,Ua as M,Fa as N,Ja as O,Ga as P,ve as Q,ke as R,Oa as S,he as T,es as U,ts as V,ga as a,Va as b,q as c,as as d,oa as e,Ia as f,ns as g,lt as h,Ya as i,Ka as j,wa as k,ss as l,de as m,Wa as n,ma as o,Ne as p,ra as q,Za as r,G as s,ja as t,qa as u,P as v,La as w,Qa as x,Xa as y,ue as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/N_rdQ7t6.js b/studio-desktop/frontend-dist/_app/immutable/chunks/N_rdQ7t6.js deleted file mode 100644 index 92f6ead4..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/N_rdQ7t6.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import"./FsCUQR17.js";import{c as i,f as p,a as c}from"./BNectIeB.js";import{I as d,s as m}from"./K2hNZgUo.js";import{l,s as $}from"./BB2KRr3j.js";function w(t,r){const s=l(r,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M5 12h14"}],["path",{d:"m12 5 7 7-7 7"}]];d(t,$({name:"arrow-right"},()=>s,{get iconNode(){return a},children:(e,f)=>{var o=i(),n=p(o);m(n,r,"default",{}),c(e,o)},$$slots:{default:!0}}))}export{w as A}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/gvU2Nsg7.js b/studio-desktop/frontend-dist/_app/immutable/chunks/gvU2Nsg7.js deleted file mode 100644 index a2a780b7..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/gvU2Nsg7.js +++ /dev/null @@ -1 +0,0 @@ -import{w as ke,o as Ne,Q as U,t as A,G as T,P as ee,bz as ht,bA as pt}from"./BESIXtBI.js";class Ee{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Se{constructor(t,n){this.status=t,this.location=n}}class Re extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function gt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function _t(e){return e.split("%25").map(decodeURI).join("%25")}function mt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function he({href:e}){return e.split("#")[0]}function wt(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;new TextDecoder;function vt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&F.delete(xe(e)),yt(e,t));const F=new Map;function bt(e,t){const n=xe(e,t),a=document.querySelector(n);if(a?.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const o=a.getAttribute("data-ttl");return o&&F.set(n,{body:r,init:i,ttl:1e3*Number(o)}),a.getAttribute("data-b64")!==null&&(r=vt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function kt(e,t,n){if(F.size>0){const a=xe(e,n),r=F.get(a);if(r){if(performance.now(){const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const o=a.split(/\[(.+?)\](?!\])/);return"/"+o.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return pe(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return pe(String.fromCharCode(...c.slice(2).split("-").map(m=>parseInt(m,16))));const f=Et.exec(c),[,h,w,u,p]=f;return t.push({name:u,matcher:p,optional:!!h,rest:!!w,chained:w?l===1&&o[0]==="":!1}),w?"([^]*?)":h?"([^/]*)?":"([^/]+?)"}return pe(c)}).join("")}).join("")}/?$`),params:t}}function Rt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function xt(e){return e.slice(1).split("/").filter(Rt)}function Lt(e,t,n){const a={},r=e.slice(1),i=r.filter(s=>s!==void 0);let o=0;for(let s=0;sf).join("/"),o=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||n[c.matcher](l)){a[c.name]=l;const f=t[s+1],h=r[s+1];f&&!f.rest&&f.optional&&h&&c.chained&&(o=0),!f&&!h&&Object.keys(a).length===i.length&&(o=0);continue}if(c.optional&&c.chained){o++;continue}return}if(!o)return a}function pe(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Ut({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([s,[c,l,f]])=>{const{pattern:h,params:w}=St(s),u={id:s,exec:p=>{const m=h.exec(p);if(m)return Lt(m,w,a)},errors:[1,...f||[]].map(p=>e[p]),layouts:[0,...l||[]].map(o),leaf:i(c)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function i(s){const c=s<0;return c&&(s=~s),[c,e[s]]}function o(s){return s===void 0?s:[r.has(s),e[s]]}}function Fe(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function qe(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}const x=globalThis.__sveltekit_1om7kwq?.base??"",At=globalThis.__sveltekit_1om7kwq?.assets??x??"",Tt="1771694660316",We="sveltekit:snapshot",ze="sveltekit:scroll",Ye="sveltekit:states",It="sveltekit:pageurl",K="sveltekit:history",W="sveltekit:navigation",j={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},le=location.origin;function Le(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function q(){return{x:pageXOffset,y:pageYOffset}}function V(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const De={...j,"":j.hover};function He(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Je(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=He(e)}}function me(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const s=location.hash.split("#")[1]||"/";a.hash=`#${s}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||ue(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=a?.origin===le&&e.hasAttribute("download");return{url:a,external:i,target:r,download:o}}function te(e){let t=null,n=null,a=null,r=null,i=null,o=null,s=e;for(;s&&s!==document.documentElement;)a===null&&(a=V(s,"preload-code")),r===null&&(r=V(s,"preload-data")),t===null&&(t=V(s,"keepfocus")),n===null&&(n=V(s,"noscroll")),i===null&&(i=V(s,"reload")),o===null&&(o=V(s,"replacestate")),s=He(s);function c(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:De[a??"off"],preload_data:De[r??"off"],keepfocus:c(t),noscroll:c(n),reload:c(i),replace_state:c(o)}}function Ve(e){const t=ke(e);let n=!0;function a(){n=!0,t.update(o=>o)}function r(o){n=!1,t.set(o)}function i(o){let s;return t.subscribe(c=>{(s===void 0||n&&c!==s)&&o(s=c)})}return{notify:a,set:r,subscribe:i}}const Xe={v:()=>{}};function Pt(){const{set:e,subscribe:t}=ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${At}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const o=(await r.json()).version!==Tt;return o&&(e(!0),Xe.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:a}}function ue(e,t,n){return e.origin!==le||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function sn(e){}const Qe=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Qe];const Ot=new Set([...Qe]);[...Ot];function $t(e){return e.filter(t=>t!=null)}function Ue(e){return e instanceof Ee||e instanceof Re?e.status:500}function Ct(e){return e instanceof Re?e.text:"Internal Error"}let k,z,ge;const jt=Ne.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ne.toString());jt?(k={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},z={current:null},ge={current:!1}):(k=new class{#e=U({});get data(){return A(this.#e)}set data(t){T(this.#e,t)}#t=U(null);get form(){return A(this.#t)}set form(t){T(this.#t,t)}#n=U(null);get error(){return A(this.#n)}set error(t){T(this.#n,t)}#a=U({});get params(){return A(this.#a)}set params(t){T(this.#a,t)}#r=U({id:null});get route(){return A(this.#r)}set route(t){T(this.#r,t)}#o=U({});get state(){return A(this.#o)}set state(t){T(this.#o,t)}#s=U(-1);get status(){return A(this.#s)}set status(t){T(this.#s,t)}#i=U(new URL("https://example.com"));get url(){return A(this.#i)}set url(t){T(this.#i,t)}},z=new class{#e=U(null);get current(){return A(this.#e)}set current(t){T(this.#e,t)}},ge=new class{#e=U(!1);get current(){return A(this.#e)}set current(t){T(this.#e,t)}},Xe.v=()=>ge.current=!0);function Nt(e){Object.assign(k,e)}const{onMount:qt}=ht,Dt=new Set(["icon","shortcut icon","apple-touch-icon"]),C=Fe(ze)??{},Y=Fe(We)??{},$={url:Ve({}),page:Ve({}),navigating:ke(null),updated:Pt()};function Ae(e){C[e]=q()}function Vt(e,t){let n=e+1;for(;C[n];)delete C[n],n+=1;for(n=t+1;Y[n];)delete Y[n],n+=1}function H(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function Ze(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(x||"/");e&&await e.update()}}function Ke(){}let Te,we,ne,I,ve,y;const ae=[],re=[];let L=null;function ye(){L?.fork?.then(e=>e?.discard()),L=null}const Z=new Map,et=new Set,Kt=new Set,M=new Set;let _={branch:[],error:null,url:null},tt=!1,oe=!1,Me=!0,J=!1,G=!1,nt=!1,Ie=!1,at,v,R,N;const se=new Set,Be=new Map;async function fn(e,t,n){globalThis.__sveltekit_1om7kwq?.data&&globalThis.__sveltekit_1om7kwq.data,document.URL!==location.href&&(location.href=location.href),y=e,await e.hooks.init?.(),Te=Ut(e),I=document.documentElement,ve=t,we=e.nodes[0],ne=e.nodes[1],we(),ne(),v=history.state?.[K],R=history.state?.[W],v||(v=R=Date.now(),history.replaceState({...history.state,[K]:v,[W]:R},""));const a=C[v];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await tn(ve,n)):(await B({type:"enter",url:Le(y.hash?rn(new URL(location.href)):location.href),replace_state:!0}),r()),en()}function Mt(){ae.length=0,Ie=!1}function rt(e){re.some(t=>t?.snapshot)&&(Y[e]=re.map(t=>t?.snapshot?.capture()))}function ot(e){Y[e]?.forEach((t,n)=>{re[n]?.snapshot?.restore(t)})}function Ge(){Ae(v),qe(ze,C),rt(R),qe(We,Y)}async function st(e,t,n,a){let r;t.invalidateAll&&ye(),await B({type:"goto",url:Le(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{t.invalidateAll&&(Ie=!0,r=[...Be.keys()]),t.invalidate&&t.invalidate.forEach(Zt)}}),t.invalidateAll&&ee().then(ee).then(()=>{Be.forEach(({resource:i},o)=>{r?.includes(o)&&i.refresh?.()})})}async function Bt(e){if(e.id!==L?.id){ye();const t={};se.add(t),L={id:e.id,token:t,promise:ct({...e,preload:t}).then(n=>(se.delete(t),n.type==="loaded"&&n.state.error&&ye(),n)),fork:null}}return L.promise}async function _e(e){const t=(await fe(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].map(n=>n?.[1]()))}async function it(e,t,n){_=e.state;const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(k,e.props.page),at=new y.root({target:t,props:{...e.props,stores:$,components:re},hydrate:n,sync:!1}),await Promise.resolve(),ot(R),n){const r={from:null,to:{params:_.params,route:{id:_.route?.id??null},url:new URL(location.href),scroll:C[v]??q()},willUnload:!1,type:"enter",complete:Promise.resolve()};M.forEach(i=>i(r))}oe=!0}function ie({url:e,params:t,branch:n,status:a,error:r,route:i,form:o}){let s="never";if(x&&(e.pathname===x||e.pathname===x+"/"))s="always";else for(const u of n)u?.slash!==void 0&&(s=u.slash);e.pathname=gt(e.pathname,s),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:r,route:i},props:{constructors:$t(n).map(u=>u.node.component),page:je(k)}};o!==void 0&&(c.props.form=o);let l={},f=!k,h=0;for(let u=0;us(new URL(o))))return!0;return!1}function Oe(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function Wt(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(o=>i.includes(o))&&i.every(o=>r.includes(o))&&n.delete(a)}return n}function zt({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:je(k),constructors:[]}}}async function ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if(L?.id===e)return se.delete(L.token),L.promise;const{errors:o,layouts:s,leaf:c}=r,l=[...s,c];o.forEach(g=>g?.().catch(()=>{})),l.forEach(g=>g?.[1]().catch(()=>{}));const f=_.url?e!==ce(_.url):!1,h=_.route?r.id!==_.route.id:!1,w=Wt(_.url,n);let u=!1;const p=l.map(async(g,d)=>{if(!g)return;const E=_.branch[d];return g[1]===E?.loader&&!Ft(u,h,f,w,E.universal?.uses,a)?E:(u=!0,Pe({loader:g[1],url:n,params:a,route:r,parent:async()=>{const P={};for(let O=0;O{});const m=[];for(let g=0;gPromise.resolve({}),server_data_node:Oe(i)}),s={node:await ne(),loader:ne,universal:null,server:null,data:null};return ie({url:n,params:r,branch:[o,s],status:e,error:t,route:null})}catch(o){if(o instanceof Se)return st(new URL(o.location,location.href),{},0);throw o}}async function Ht(e){const t=e.href;if(Z.has(t))return Z.get(t);let n;try{const a=(async()=>{let r=await y.hooks.reroute({url:new URL(e),fetch:async(i,o)=>Gt(i,o,e).promise})??e;if(typeof r=="string"){const i=new URL(e);y.hash?i.hash=r:i.pathname=r,r=i}return r})();Z.set(t,a),n=await a}catch{Z.delete(t);return}return n}async function fe(e,t){if(e&&!ue(e,x,y.hash)){const n=await Ht(e);if(!n)return;const a=Jt(n);for(const r of Te){const i=r.exec(a);if(i)return{id:ce(e),invalidating:t,route:r,params:mt(i),url:e}}}}function Jt(e){return _t(y.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(x.length))||"/"}function ce(e){return(y.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function lt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let o=!1;const s=Ce(_,n,e,t,i??null);a!==void 0&&(s.navigation.delta=a),r!==void 0&&(s.navigation.event=r);const c={...s.navigation,cancel:()=>{o=!0,s.reject(new Error("navigation cancelled"))}};return J||et.forEach(l=>l(c)),o?null:s}async function B({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o={},redirect_count:s=0,nav_token:c={},accept:l=Ke,block:f=Ke,event:h}){const w=N;N=c;const u=await fe(t,!1),p=e==="enter"?Ce(_,u,t,e):lt({url:t,type:e,delta:n?.delta,intent:u,scroll:n?.scroll,event:h});if(!p){f(),N===c&&(N=w);return}const m=v,g=R;l(),J=!0,oe&&p.navigation.type!=="enter"&&$.navigating.set(z.current=p.navigation);let d=u&&await ct(u);if(!d){if(ue(t,x,y.hash))return await H(t,i);d=await ut(t,{id:null},await X(new Re(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=u?.url||t,N!==c)return p.reject(new Error("navigation aborted")),!1;if(d.type==="redirect"){if(s<20){await B({type:e,url:new URL(d.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:o,redirect_count:s+1,nav_token:c}),p.fulfil(void 0);return}d=await $e({status:500,error:await X(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else d.props.page.status>=400&&await $.updated.check()&&(await Ze(),await H(t,i));if(Mt(),Ae(m),rt(g),d.props.page.url.pathname!==t.pathname&&(t.pathname=d.props.page.url.pathname),o=n?n.state:o,!n){const b=i?0:1,Q={[K]:v+=b,[W]:R+=b,[Ye]:o};(i?history.replaceState:history.pushState).call(history,Q,"",t),i||Vt(v,R)}const E=u&&L?.id===u.id?L.fork:null;L=null,d.props.page.state=o;let S;if(oe){const b=(await Promise.all(Array.from(Kt,D=>D(p.navigation)))).filter(D=>typeof D=="function");if(b.length>0){let D=function(){b.forEach(de=>{M.delete(de)})};b.push(D),b.forEach(de=>{M.add(de)})}_=d.state,d.props.page&&(d.props.page.url=t);const Q=E&&await E;Q?S=Q.commit():(at.$set(d.props),Nt(d.props.page),S=pt?.()),nt=!0}else await it(d,ve,!1);const{activeElement:P}=document;await S,await ee(),await ee();let O=null;if(Me){const b=n?n.scroll:r?q():null;b?scrollTo(b.x,b.y):(O=t.hash&&document.getElementById(ft(t)))?O.scrollIntoView():scrollTo(0,0)}const dt=document.activeElement!==P&&document.activeElement!==document.body;!a&&!dt&&an(t,!O),Me=!0,d.props.page&&Object.assign(k,d.props.page),J=!1,e==="popstate"&&ot(R),p.fulfil(void 0),p.navigation.to&&(p.navigation.to.scroll=q()),M.forEach(b=>b(p.navigation)),$.navigating.set(z.current=null)}async function ut(e,t,n,a,r){return e.origin===le&&e.pathname===location.pathname&&!tt?await $e({status:a,error:n,url:e,route:t}):await H(e,r)}function Xt(){let e,t={element:void 0,href:void 0},n;I.addEventListener("mousemove",s=>{const c=s.target;clearTimeout(e),e=setTimeout(()=>{i(c,j.hover)},20)});function a(s){s.defaultPrevented||i(s.composedPath()[0],j.tap)}I.addEventListener("mousedown",a),I.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(s=>{for(const c of s)c.isIntersecting&&(_e(new URL(c.target.href)),r.unobserve(c.target))},{threshold:0});async function i(s,c){const l=Je(s,I),f=l===t.element&&l?.href===t.href&&c>=n;if(!l||f)return;const{url:h,external:w,download:u}=me(l,x,y.hash);if(w||u)return;const p=te(l),m=h&&ce(_.url)===ce(h);if(!(p.reload||m))if(c<=p.preload_data){t={element:l,href:l.href},n=j.tap;const g=await fe(h,!1);if(!g)return;Bt(g)}else c<=p.preload_code&&(t={element:l,href:l.href},n=c,_e(h))}function o(){r.disconnect();for(const s of I.querySelectorAll("a")){const{url:c,external:l,download:f}=me(s,x,y.hash);if(l||f)continue;const h=te(s);h.reload||(h.preload_code===j.viewport&&r.observe(s),h.preload_code===j.eager&&_e(c))}}M.add(o),o()}function X(e,t){if(e instanceof Ee)return e.body;const n=Ue(e),a=Ct(e);return y.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function Qt(e,t){qt(()=>(e.add(t),()=>{e.delete(t)}))}function dn(e){Qt(M,e)}function hn(e,t={}){return e=new URL(Le(e)),e.origin!==le?Promise.reject(new Error("goto: invalid URL")):st(e,t,0)}function Zt(e){if(typeof e=="function")ae.push(e);else{const{href:t}=new URL(e,location.href);ae.push(n=>n.href===t)}}function en(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(Ge(),!J){const a=Ce(_,void 0,null,"leave"),r={...a.navigation,cancel:()=>{n=!0,a.reject(new Error("navigation cancelled"))}};et.forEach(i=>i(r))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Ge()}),navigator.connection?.saveData||Xt(),I.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=Je(t.composedPath()[0],I);if(!n)return;const{url:a,external:r,target:i,download:o}=me(n,x,y.hash);if(!a)return;if(i==="_parent"||i==="_top"){if(window.parent!==window)return}else if(i&&i!=="_self")return;const s=te(n);if(!(n instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||o)return;const[l,f]=(y.hash?a.hash.replace(/^#/,""):a.href).split("#"),h=l===he(location);if(r||s.reload&&(!h||!f)){lt({url:a,type:"link",event:t})?J=!0:t.preventDefault();return}if(f!==void 0&&h){const[,w]=_.url.href.split("#");if(w===f){if(t.preventDefault(),f===""||f==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const u=n.ownerDocument.getElementById(decodeURIComponent(f));u&&(u.scrollIntoView(),u.focus())}return}if(G=!0,Ae(v),e(a),!s.replace_state)return;G=!1}t.preventDefault(),await new Promise(w=>{requestAnimationFrame(()=>{setTimeout(w,0)}),setTimeout(w,100)}),await B({type:"link",url:a,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??a.href===location.href,event:t})}),I.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),a=t.submitter;if((a?.formTarget||n.target)==="_blank"||(a?.formMethod||n.method)!=="get")return;const o=new URL(a?.hasAttribute("formaction")&&a?.formAction||n.action);if(ue(o,x,!1))return;const s=t.target,c=te(s);if(c.reload)return;t.preventDefault(),t.stopPropagation();const l=new FormData(s,a);o.search=new URLSearchParams(l).toString(),B({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!be){if(t.state?.[K]){const n=t.state[K];if(N={},n===v)return;const a=C[n],r=t.state[Ye]??{},i=new URL(t.state[It]??location.href),o=t.state[W],s=_.url?he(location)===he(_.url):!1;if(o===R&&(nt||s)){r!==k.state&&(k.state=r),e(i),C[v]=q(),a&&scrollTo(a.x,a.y),v=n;return}const l=n-v;await B({type:"popstate",url:i,popped:{state:r,scroll:a,delta:l},accept:()=>{v=n,R=o},block:()=>{history.go(-l)},nav_token:N,event:t})}else if(!G){const n=new URL(location.href);e(n),y.hash&&location.reload()}}}),addEventListener("hashchange",()=>{G&&(G=!1,history.replaceState({...history.state,[K]:++v,[W]:R},"",location.href))});for(const t of document.querySelectorAll("link"))Dt.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&$.navigating.set(z.current=null)});function e(t){_.url=k.url=t,$.page.set(je(k)),$.page.notify()}}async function tn(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:o,data:s,form:c}){tt=!0;const l=new URL(location.href);let f;({params:r={},route:i={id:null}}=await fe(l,!1)||{}),f=Te.find(({id:u})=>u===i.id);let h,w=!0;try{const u=a.map(async(m,g)=>{const d=s[g];return d?.uses&&(d.uses=nn(d.uses)),Pe({loader:y.nodes[m],url:l,params:r,route:i,parent:async()=>{const E={};for(let S=0;S{const s=history.state;be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(s,"",e),t&&scrollTo(i,o),be=!1})}else{const i=document.body,o=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),o!==null?i.setAttribute("tabindex",o):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let o=0;o{if(r.rangeCount===i.length){for(let o=0;o{i=l,o=f});return s.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:q()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:r},willUnload:!t,type:a,complete:s},fulfil:i,reject:o}}function je(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function rn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function ft(e){let t;if(y.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{dn as a,fn as b,hn as g,sn as l,k as p,$ as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/hL-aZVJ4.js b/studio-desktop/frontend-dist/_app/immutable/chunks/hL-aZVJ4.js deleted file mode 100644 index aac9940c..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/hL-aZVJ4.js +++ /dev/null @@ -1,2 +0,0 @@ -var Nn=Array.isArray,On=Array.prototype.indexOf,me=Array.prototype.includes,Rn=Array.from,kn=Object.defineProperty,Ne=Object.getOwnPropertyDescriptor,Mn=Object.getOwnPropertyDescriptors,Dn=Object.prototype,Cn=Array.prototype,Rt=Object.getPrototypeOf,bt=Object.isExtensible;function Wr(e){return typeof e=="function"}const de=()=>{};function $r(e){return e()}function kt(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function Gr(e,t,n=!1){return e===void 0?n?t():t:e}function Kr(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}function Xr(e,t){var n={};for(var r in e)t.includes(r)||(n[r]=e[r]);for(var s of Object.getOwnPropertySymbols(e))Object.propertyIsEnumerable.call(e,s)&&!t.includes(s)&&(n[s]=e[s]);return n}const S=2,De=4,Ce=8,ot=1<<24,Z=16,$=32,le=64,Je=128,C=512,T=1024,x=2048,Y=4096,z=8192,re=16384,fe=32768,ke=65536,yt=1<<17,Dt=1<<18,be=1<<19,Ct=1<<20,Zr=1<<25,pe=65536,Qe=1<<21,ut=1<<22,se=1<<23,he=Symbol("$state"),Jr=Symbol("legacy props"),Qr=Symbol(""),ue=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},ts=!!globalThis.document?.contentType&&globalThis.document.contentType.includes("xml"),ns=1,Ie=3,We=8;function ct(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function In(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function rs(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Pn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Ln(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Fn(e){throw new Error("https://svelte.dev/e/effect_orphan")}function jn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Vn(){throw new Error("https://svelte.dev/e/hydration_failed")}function ss(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Hn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function qn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Yn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Bn(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const is=1,as=2,fs=4,ls=8,os=16,us=1,cs=2,_s=4,ds=8,hs=16,vs=4,It=1,zn=2,Pt="[",Lt="[!",wt="[?",Ft="]",Ee={},A=Symbol(),Un="http://www.w3.org/1999/xhtml",ps="http://www.w3.org/2000/svg",gs="http://www.w3.org/1998/Math/MathML",bs="@attach";function $e(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function ys(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Wn(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let E=!1;function He(e){E=e}let b;function B(e){if(e===null)throw $e(),Ee;return b=e}function jt(){return B(J(b))}function ws(e){if(E){if(J(b)!==null)throw $e(),Ee;b=e}}function $n(e=1){if(E){for(var t=e,n=b;t--;)n=J(n);b=n}}function Gn(e=!0){for(var t=0,n=b;;){if(n.nodeType===We){var r=n.data;if(r===Ft){if(t===0)return n;t-=1}else(r===Pt||r===Lt||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=J(n);e&&n.remove(),n=s}}function ms(e){if(!e||e.nodeType!==We)throw $e(),Ee;return e.data}function Vt(e){return e===this.v}function Ht(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function qt(e){return!Ht(e,this.v)}let Pe=!1;function Es(){Pe=!0}let y=null;function Te(e){y=e}function Kn(e){return _t().get(e)}function Xn(e,t){return _t().set(e,t),t}function Zn(e){return _t().has(e)}function Jn(e,t=!1,n){y={p:y,i:!1,c:null,e:null,s:e,x:null,l:Pe&&!t?{s:null,u:null,$:[]}:null}}function Qn(e){var t=y,n=t.e;if(n!==null){t.e=null;for(var r of n)ln(r)}return t.i=!0,y=t.p,{}}function Le(){return!Pe||y!==null&&y.l===null}function _t(e){return y===null&&ct(),y.c??=new Map(er(y)||void 0)}function er(e){let t=e.p;for(;t!==null;){const n=t.c;if(n!==null)return n;t=t.p}return null}let ce=[];function Yt(){var e=ce;ce=[],kt(e)}function ie(e){if(ce.length===0&&!Oe){var t=ce;queueMicrotask(()=>{t===ce&&Yt()})}ce.push(e)}function tr(){for(;ce.length>0;)Yt()}function Bt(e){var t=v;if(t===null)return h.f|=se,e;if((t.f&fe)===0&&(t.f&De)===0)throw e;te(e,t)}function te(e,t){for(;t!==null;){if((t.f&Je)!==0){if((t.f&fe)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const nr=-7169;function m(e,t){e.f=e.f&nr|t}function dt(e){(e.f&C)!==0||e.deps===null?m(e,T):m(e,Y)}function zt(e){if(e!==null)for(const t of e)(t.f&S)===0||(t.f&pe)===0||(t.f^=pe,zt(t.deps))}function Ut(e,t,n){(e.f&x)!==0?t.add(e):(e.f&Y)!==0&&n.add(e),zt(e.deps),m(e,T)}const qe=new Set;let w=null,mt=null,F=null,O=[],Ge=null,et=!1,Oe=!1;class U{current=new Map;previous=new Map;#n=new Set;#u=new Set;#s=0;#f=0;#r=null;#i=new Set;#e=new Set;#t=new Map;is_fork=!1;#a=!1;#o(){return this.is_fork||this.#f>0}skip_effect(t){this.#t.has(t)||this.#t.set(t,{d:[],m:[]})}unskip_effect(t){var n=this.#t.get(t);if(n){this.#t.delete(t);for(var r of n.d)m(r,x),j(r);for(r of n.m)m(r,Y),j(r)}}process(t){O=[],this.apply();var n=[],r=[];for(const s of t)this.#l(s,n,r);if(this.#o()){this.#c(r),this.#c(n);for(const[s,i]of this.#t)Xt(s,i)}else{for(const s of this.#n)s();this.#n.clear(),this.#s===0&&this.#d(),mt=this,w=null,Et(r),Et(n),mt=null,this.#r?.resolve()}F=null}#l(t,n,r){t.f^=T;for(var s=t.first;s!==null;){var i=s.f,f=(i&($|le))!==0,o=f&&(i&T)!==0,a=o||(i&z)!==0||this.#t.has(s);if(!a&&s.fn!==null){f?s.f^=T:(i&De)!==0?n.push(s):je(s)&&((i&Z)!==0&&this.#e.add(s),Ae(s));var l=s.first;if(l!==null){s=l;continue}}for(;s!==null;){var c=s.next;if(c!==null){s=c;break}s=s.parent}}}#c(t){for(var n=0;n0){if($t(),w!==null&&w!==this)return}else this.#s===0&&this.process([]);this.deactivate()}discard(){for(const t of this.#u)t(this);this.#u.clear()}#d(){if(qe.size>1){this.previous.clear();var t=F,n=!0;for(const s of qe){if(s===this){n=!1;continue}const i=[];for(const[o,a]of this.current){if(s.current.has(o))if(n&&a!==s.current.get(o))s.current.set(o,a);else continue;i.push(o)}if(i.length===0)continue;const f=[...s.current.keys()].filter(o=>!this.current.has(o));if(f.length>0){var r=O;O=[];const o=new Set,a=new Map;for(const l of i)Gt(l,f,o,a);if(O.length>0){w=s,s.apply();for(const l of O)s.#l(l,[],[]);s.deactivate()}O=r}}w=null,F=t}qe.delete(this)}increment(t){this.#s+=1,t&&(this.#f+=1)}decrement(t){this.#s-=1,t&&(this.#f-=1),!this.#a&&(this.#a=!0,ie(()=>{this.#a=!1,this.#o()?O.length>0&&this.flush():this.revive()}))}revive(){for(const t of this.#i)this.#e.delete(t),m(t,x),j(t);for(const t of this.#e)m(t,Y),j(t);this.flush()}oncommit(t){this.#n.add(t)}ondiscard(t){this.#u.add(t)}settled(){return(this.#r??=Mt()).promise}static ensure(){if(w===null){const t=w=new U;qe.add(w),Oe||ie(()=>{w===t&&t.flush()})}return w}apply(){}}function Wt(e){var t=Oe;Oe=!0;try{for(var n;;){if(tr(),O.length===0&&(w?.flush(),O.length===0))return Ge=null,n;$t()}}finally{Oe=t}}function $t(){et=!0;var e=null;try{for(var t=0;O.length>0;){var n=U.ensure();if(t++>1e3){var r,s;rr()}n.process(O),ae.clear()}}finally{O=[],et=!1,Ge=null}}function rr(){try{jn()}catch(e){te(e,Ge)}}let K=null;function Et(e){var t=e.length;if(t!==0){for(var n=0;n0)){ae.clear();for(const s of K){if((s.f&(re|z))!==0)continue;const i=[s];let f=s.parent;for(;f!==null;)K.has(f)&&(K.delete(f),i.push(f)),f=f.parent;for(let o=i.length-1;o>=0;o--){const a=i[o];(a.f&(re|z))===0&&Ae(a)}}K.clear()}}K=null}}function Gt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const i=s.f;(i&S)!==0?Gt(s,t,n,r):(i&(ut|Z))!==0&&(i&x)===0&&Kt(s,t,r)&&(m(s,x),j(s))}}function Kt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(me.call(t,s))return!0;if((s.f&S)!==0&&Kt(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function j(e){var t=Ge=e,n=t.b;if(n?.is_pending&&(e.f&(De|Ce|ot))!==0&&(e.f&fe)===0){n.defer_effect(e);return}for(;t.parent!==null;){t=t.parent;var r=t.f;if(et&&t===v&&(r&Z)!==0&&(r&Dt)===0&&(r&fe)!==0)return;if((r&(le|$))!==0){if((r&T)===0)return;t.f^=T}}O.push(t)}function Xt(e,t){if(!((e.f&$)!==0&&(e.f&T)!==0)){(e.f&x)!==0?t.d.push(e):(e.f&Y)!==0&&t.m.push(e),m(e,T);for(var n=e.first;n!==null;)Xt(n,t),n=n.next}}function sr(e){let t=0,n=Fe(0),r;return()=>{pt()&&(ne(n),Tr(()=>(t===0&&(r=Ve(()=>e(()=>Re(n)))),t+=1,()=>{ie(()=>{t-=1,t===0&&(r?.(),r=void 0,Re(n))})})))}}var ir=ke|be;function ar(e,t,n,r){new fr(e,t,n,r)}class fr{parent;is_pending=!1;transform_error;#n;#u=E?b:null;#s;#f;#r;#i=null;#e=null;#t=null;#a=null;#o=0;#l=0;#c=!1;#d=new Set;#h=new Set;#_=null;#y=sr(()=>(this.#_=Fe(this.#o),()=>{this.#_=null}));constructor(t,n,r,s){this.#n=t,this.#s=n,this.#f=i=>{var f=v;f.b=this,f.f|=Je,r(i)},this.parent=v.b,this.transform_error=s??this.parent?.transform_error??(i=>i),this.#r=Ar(()=>{if(E){const i=this.#u;jt();const f=i.data===Lt;if(i.data.startsWith(wt)){const a=JSON.parse(i.data.slice(wt.length));this.#m(a)}else f?this.#E():this.#w()}else this.#g()},ir),E&&(this.#n=b)}#w(){try{this.#i=oe(()=>this.#f(this.#n))}catch(t){this.error(t)}}#m(t){const n=this.#s.failed;n&&(this.#t=oe(()=>{n(this.#n,()=>t,()=>()=>{})}))}#E(){const t=this.#s.pending;t&&(this.is_pending=!0,this.#e=oe(()=>t(this.#n)),ie(()=>{var n=this.#a=document.createDocumentFragment(),r=X();n.append(r),this.#i=this.#p(()=>(U.ensure(),oe(()=>this.#f(r)))),this.#l===0&&(this.#n.before(n),this.#a=null,Be(this.#e,()=>{this.#e=null}),this.#v())}))}#g(){try{if(this.is_pending=this.has_pending_snippet(),this.#l=0,this.#o=0,this.#i=oe(()=>{this.#f(this.#n)}),this.#l>0){var t=this.#a=document.createDocumentFragment();Nr(this.#i,t);const n=this.#s.pending;this.#e=oe(()=>n(this.#n))}else this.#v()}catch(n){this.error(n)}}#v(){this.is_pending=!1;for(const t of this.#d)m(t,x),j(t);for(const t of this.#h)m(t,Y),j(t);this.#d.clear(),this.#h.clear()}defer_effect(t){Ut(t,this.#d,this.#h)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#s.pending}#p(t){var n=v,r=h,s=y;W(this.#r),P(this.#r),Te(this.#r.ctx);try{return t()}catch(i){return Bt(i),null}finally{W(n),P(r),Te(s)}}#b(t){if(!this.has_pending_snippet()){this.parent&&this.parent.#b(t);return}this.#l+=t,this.#l===0&&(this.#v(),this.#e&&Be(this.#e,()=>{this.#e=null}),this.#a&&(this.#n.before(this.#a),this.#a=null))}update_pending_count(t){this.#b(t),this.#o+=t,!(!this.#_||this.#c)&&(this.#c=!0,ie(()=>{this.#c=!1,this.#_&&Ue(this.#_,this.#o)}))}get_effect_pending(){return this.#y(),ne(this.#_)}error(t){var n=this.#s.onerror;let r=this.#s.failed;if(!n&&!r)throw t;this.#i&&(H(this.#i),this.#i=null),this.#e&&(H(this.#e),this.#e=null),this.#t&&(H(this.#t),this.#t=null),E&&(B(this.#u),$n(),B(Gn()));var s=!1,i=!1;const f=()=>{if(s){Wn();return}s=!0,i&&Bn(),this.#t!==null&&Be(this.#t,()=>{this.#t=null}),this.#p(()=>{U.ensure(),this.#g()})},o=a=>{try{i=!0,n?.(a,f),i=!1}catch(l){te(l,this.#r&&this.#r.parent)}r&&(this.#t=this.#p(()=>{U.ensure();try{return oe(()=>{var l=v;l.b=this,l.f|=Je,r(this.#n,()=>a,()=>f)})}catch(l){return te(l,this.#r.parent),null}}))};ie(()=>{var a;try{a=this.transform_error(t)}catch(l){te(l,this.#r&&this.#r.parent);return}a!==null&&typeof a=="object"&&typeof a.then=="function"?a.then(o,l=>te(l,this.#r&&this.#r.parent)):o(a)})}}function lr(e,t,n,r){const s=Le()?ht:_r;var i=e.filter(u=>!u.settled);if(n.length===0&&i.length===0){r(t.map(s));return}var f=v,o=or(),a=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(u=>u.promise)):null;function l(u){o();try{r(u)}catch(_){(f.f&re)===0&&te(_,f)}tt()}if(n.length===0){a.then(()=>l(t.map(s)));return}function c(){o(),Promise.all(n.map(u=>cr(u))).then(u=>l([...t.map(s),...u])).catch(u=>te(u,f))}a?a.then(c):c()}function or(){var e=v,t=h,n=y,r=w;return function(i=!0){W(e),P(t),Te(n),i&&r?.activate()}}function tt(e=!0){W(null),P(null),Te(null),e&&w?.deactivate()}function ur(){var e=v.b,t=w,n=e.is_rendered();return e.update_pending_count(1),t.increment(n),()=>{e.update_pending_count(-1),t.decrement(n)}}function ht(e){var t=S|x,n=h!==null&&(h.f&S)!==0?h:null;return v!==null&&(v.f|=be),{ctx:y,deps:null,effects:null,equals:Vt,f:t,fn:e,reactions:null,rv:0,v:A,wv:0,parent:n??v,ac:null}}function cr(e,t,n){v===null&&In();var s=void 0,i=Fe(A),f=!h,o=new Map;return Er(()=>{var a=Mt();s=a.promise;try{Promise.resolve(e()).then(a.resolve,a.reject).finally(tt)}catch(_){a.reject(_),tt()}var l=w;if(f){var c=ur();o.get(l)?.reject(ue),o.delete(l),o.set(l,a)}const u=(_,p=void 0)=>{if(l.activate(),p)p!==ue&&(i.f|=se,Ue(i,p));else{(i.f&se)!==0&&(i.f^=se),Ue(i,_);for(const[d,g]of o){if(o.delete(d),d===l)break;g.reject(ue)}}c&&c()};a.promise.then(u,_=>u(null,_||"unknown"))}),fn(()=>{for(const a of o.values())a.reject(ue)}),new Promise(a=>{function l(c){function u(){c===s?a(i):l(s)}c.then(u,u)}l(s)})}function Ts(e){const t=ht(e);return dn(t),t}function _r(e){const t=ht(e);return t.equals=qt,t}function dr(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!Qt&&pr()}return t}function pr(){Qt=!1;for(const e of nt)(e.f&T)!==0&&m(e,Y),je(e)&&Ae(e);nt.clear()}function Ss(e,t=1){var n=ne(e),r=t===1?n++:n--;return ee(e,n),r}function Re(e){ee(e,e.v+1)}function en(e,t){var n=e.reactions;if(n!==null)for(var r=Le(),s=n.length,i=0;i{if(ve===i)return o();var a=h,l=ve;P(null),Nt(i);var c=o();return P(a),Nt(l),c};return r&&n.set("length",Q(e.length)),new Proxy(e,{defineProperty(o,a,l){(!("value"in l)||l.configurable===!1||l.enumerable===!1||l.writable===!1)&&Hn();var c=n.get(a);return c===void 0?f(()=>{var u=Q(l.value);return n.set(a,u),u}):ee(c,l.value,!0),!0},deleteProperty(o,a){var l=n.get(a);if(l===void 0){if(a in o){const c=f(()=>Q(A));n.set(a,c),Re(s)}}else ee(l,A),Re(s);return!0},get(o,a,l){if(a===he)return e;var c=n.get(a),u=a in o;if(c===void 0&&(!u||Ne(o,a)?.writable)&&(c=f(()=>{var p=Se(u?o[a]:A),d=Q(p);return d}),n.set(a,c)),c!==void 0){var _=ne(c);return _===A?void 0:_}return Reflect.get(o,a,l)},getOwnPropertyDescriptor(o,a){var l=Reflect.getOwnPropertyDescriptor(o,a);if(l&&"value"in l){var c=n.get(a);c&&(l.value=ne(c))}else if(l===void 0){var u=n.get(a),_=u?.v;if(u!==void 0&&_!==A)return{enumerable:!0,configurable:!0,value:_,writable:!0}}return l},has(o,a){if(a===he)return!0;var l=n.get(a),c=l!==void 0&&l.v!==A||Reflect.has(o,a);if(l!==void 0||v!==null&&(!c||Ne(o,a)?.writable)){l===void 0&&(l=f(()=>{var _=c?Se(o[a]):A,p=Q(_);return p}),n.set(a,l));var u=ne(l);if(u===A)return!1}return c},set(o,a,l,c){var u=n.get(a),_=a in o;if(r&&a==="length")for(var p=l;pQ(A)),n.set(p+"",d))}if(u===void 0)(!_||Ne(o,a)?.writable)&&(u=f(()=>Q(void 0)),ee(u,Se(l)),n.set(a,u));else{_=u.v!==A;var g=f(()=>Se(l));ee(u,g)}var N=Reflect.getOwnPropertyDescriptor(o,a);if(N?.set&&N.set.call(c,l),!_){if(r&&typeof a=="string"){var G=n.get("length"),ye=Number(a);Number.isInteger(ye)&&ye>=G.v&&ee(G,ye+1)}Re(s)}return!0},ownKeys(o){ne(s);var a=Reflect.ownKeys(o).filter(u=>{var _=n.get(u);return _===void 0||_.v!==A});for(var[l,c]of n)c.v!==A&&!(l in o)&&a.push(l);return a},setPrototypeOf(){qn()}})}function Tt(e){try{if(e!==null&&typeof e=="object"&&he in e)return e[he]}catch{}return e}function xs(e,t){return Object.is(Tt(e),Tt(t))}var At,tn,nn,rn;function rt(){if(At===void 0){At=window,tn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;nn=Ne(t,"firstChild").get,rn=Ne(t,"nextSibling").get,bt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),bt(n)&&(n.__t=void 0)}}function X(e=""){return document.createTextNode(e)}function D(e){return nn.call(e)}function J(e){return rn.call(e)}function Ns(e,t){if(!E)return D(e);var n=D(b);if(n===null)n=b.appendChild(X());else if(t&&n.nodeType!==Ie){var r=X();return n?.before(r),B(r),r}return t&&Ke(n),B(n),n}function Os(e,t=!1){if(!E){var n=D(e);return n instanceof Comment&&n.data===""?J(n):n}if(t){if(b?.nodeType!==Ie){var r=X();return b?.before(r),B(r),r}Ke(b)}return b}function Rs(e,t=1,n=!1){let r=E?b:e;for(var s;t--;)s=r,r=J(r);if(!E)return r;if(n){if(r?.nodeType!==Ie){var i=X();return r===null?s?.after(i):r.before(i),B(i),i}Ke(r)}return B(r),r}function sn(e){e.textContent=""}function ks(){return!1}function gr(e,t,n){return document.createElementNS(t??Un,e,void 0)}function Ke(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Ie;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Ms(e,t){if(t){const n=document.body;e.autofocus=!0,ie(()=>{document.activeElement===n&&e.focus()})}}function Ds(e){E&&D(e)!==null&&sn(e)}let St=!1;function br(){St||(St=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function Xe(e){var t=h,n=v;P(null),W(null);try{return e()}finally{P(t),W(n)}}function Cs(e,t,n,r=n){e.addEventListener(t,()=>Xe(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),br()}function an(e){v===null&&(h===null&&Fn(),Ln()),ge&&Pn()}function yr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function L(e,t,n){var r=v;r!==null&&(r.f&z)!==0&&(e|=z);var s={ctx:y,deps:null,nodes:null,f:e|x|C,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};if(n)try{Ae(s)}catch(o){throw H(s),o}else t!==null&&j(s);var i=s;if(n&&i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&be)===0&&(i=i.first,(e&Z)!==0&&(e&ke)!==0&&i!==null&&(i.f|=ke)),i!==null&&(i.parent=r,r!==null&&yr(i,r),h!==null&&(h.f&S)!==0&&(e&le)===0)){var f=h;(f.effects??=[]).push(i)}return s}function pt(){return h!==null&&!V}function fn(e){const t=L(Ce,null,!1);return m(t,T),t.teardown=e,t}function wr(e){an();var t=v.f,n=!h&&(t&$)!==0&&(t&fe)===0;if(n){var r=y;(r.e??=[]).push(e)}else return ln(e)}function ln(e){return L(De|Ct,e,!1)}function Is(e){return an(),L(Ce|Ct,e,!0)}function Ps(e){U.ensure();const t=L(le|be,e,!0);return()=>{H(t)}}function mr(e){U.ensure();const t=L(le|be,e,!0);return(n={})=>new Promise(r=>{n.outro?Be(t,()=>{H(t),r(void 0)}):(H(t),r(void 0))})}function Ls(e){return L(De,e,!1)}function Er(e){return L(ut|be,e,!0)}function Tr(e,t=0){return L(Ce|t,e,!0)}function Fs(e,t=[],n=[],r=[]){lr(r,t,n,s=>{L(Ce,()=>e(...s.map(ne)),!0)})}function Ar(e,t=0){var n=L(Z|t,e,!0);return n}function js(e,t=0){var n=L(ot|t,e,!0);return n}function oe(e){return L($|be,e,!0)}function on(e){var t=e.teardown;if(t!==null){const n=ge,r=h;xt(!0),P(null);try{t.call(null)}finally{xt(n),P(r)}}}function gt(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&Xe(()=>{s.abort(ue)});var r=n.next;(n.f&le)!==0?n.parent=null:H(n,t),n=r}}function Sr(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&$)===0&&H(t),t=n}}function H(e,t=!0){var n=!1;(t||(e.f&Dt)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(xr(e.nodes.start,e.nodes.end),n=!0),gt(e,t&&!n),Me(e,0),m(e,re);var r=e.nodes&&e.nodes.t;if(r!==null)for(const i of r)i.stop();on(e);var s=e.parent;s!==null&&s.first!==null&&un(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=null}function xr(e,t){for(;e!==null;){var n=e===t?null:J(e);e.remove(),e=n}}function un(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Be(e,t,n=!0){var r=[];cn(e,r,!0);var s=()=>{n&&H(e),t&&t()},i=r.length;if(i>0){var f=()=>--i||s();for(var o of r)o.out(f)}else s()}function cn(e,t,n){if((e.f&z)===0){e.f^=z;var r=e.nodes&&e.nodes.t;if(r!==null)for(const o of r)(o.is_global||n)&&t.push(o);for(var s=e.first;s!==null;){var i=s.next,f=(s.f&ke)!==0||(s.f&$)!==0&&(e.f&Z)!==0;cn(s,t,f?n:!1),s=i}}}function Vs(e){_n(e,!0)}function _n(e,t){if((e.f&z)!==0){e.f^=z,(e.f&T)===0&&(m(e,x),j(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&ke)!==0||(n.f&$)!==0;_n(n,s?t:!1),n=r}var i=e.nodes&&e.nodes.t;if(i!==null)for(const f of i)(f.is_global||t)&&f.in()}}function Nr(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:J(n);t.append(n),n=s}}let ze=!1,ge=!1;function xt(e){ge=e}let h=null,V=!1;function P(e){h=e}let v=null;function W(e){v=e}let I=null;function dn(e){h!==null&&(I===null?I=[e]:I.push(e))}let R=null,k=0,M=null;function Or(e){M=e}let hn=1,_e=0,ve=_e;function Nt(e){ve=e}function vn(){return++hn}function je(e){var t=e.f;if((t&x)!==0)return!0;if(t&S&&(e.f&=~pe),(t&Y)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&C)!==0&&F===null&&m(e,T)}return!1}function pn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(I!==null&&me.call(I,e)))for(var s=0;s{e.ac.abort(ue)}),e.ac=null);try{e.f|=Qe;var c=e.fn,u=c();e.f|=fe;var _=e.deps,p=w?.is_fork;if(R!==null){var d;if(p||Me(e,k),_!==null&&k>0)for(_.length=k+R.length,d=0;dn?.call(this,i))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?ie(()=>{t.addEventListener(e,s,r)}):t.addEventListener(e,s,r),s}function Us(e,t,n,r={}){var s=mn(t,e,n,r);return()=>{e.removeEventListener(t,s,r)}}function Ws(e,t,n,r,s){var i={capture:r,passive:s},f=mn(e,t,n,i);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&fn(()=>{t.removeEventListener(e,f,i)})}function $s(e,t,n){(t[xe]??={})[e]=n}function Gs(e){for(var t=0;t{throw N});throw _}}finally{e[xe]=t,delete e.currentTarget,P(c),W(u)}}}const Fr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function jr(e){return Fr?.createHTML(e)??e}function En(e){var t=gr("template");return t.innerHTML=jr(e.replaceAll("","")),t.content}function q(e,t){var n=v;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function Ks(e,t){var n=(t&It)!==0,r=(t&zn)!==0,s,i=!e.startsWith("");return()=>{if(E)return q(b,null),b;s===void 0&&(s=En(i?e:""+e),n||(s=D(s)));var f=r||tn?document.importNode(s,!0):s.cloneNode(!0);if(n){var o=D(f),a=f.lastChild;q(o,a)}else q(f,f);return f}}function Vr(e,t,n="svg"){var r=!e.startsWith(""),s=(t&It)!==0,i=`<${n}>${r?e:""+e}`,f;return()=>{if(E)return q(b,null),b;if(!f){var o=En(i),a=D(o);if(s)for(f=document.createDocumentFragment();D(a);)f.appendChild(D(a));else f=D(a)}var l=f.cloneNode(!0);if(s){var c=D(l),u=l.lastChild;q(c,u)}else q(l,l);return l}}function Xs(e,t){return Vr(e,t,"svg")}function Zs(e=""){if(!E){var t=X(e+"");return q(t,t),t}var n=b;return n.nodeType!==Ie?(n.before(n=X()),B(n)):Ke(n),q(n,n),n}function Js(){if(E)return q(b,null),b;var e=document.createDocumentFragment(),t=document.createComment(""),n=X();return e.append(t,n),q(t,n),e}function Qs(e,t){if(E){var n=v;((n.f&fe)===0||n.nodes.end===null)&&(n.nodes.end=b),jt();return}e!==null&&e.before(t)}let ft=!0;function ei(e){ft=e}function ti(e,t){var n=t==null?"":typeof t=="object"?t+"":t;n!==(e.__t??=e.nodeValue)&&(e.__t=n,e.nodeValue=n+"")}function Tn(e,t){return An(e,t)}function Hr(e,t){rt(),t.intro=t.intro??!1;const n=t.target,r=E,s=b;try{for(var i=D(n);i&&(i.nodeType!==We||i.data!==Pt);)i=J(i);if(!i)throw Ee;He(!0),B(i);const f=An(e,{...t,anchor:i});return He(!1),f}catch(f){if(f instanceof Error&&f.message.split(` -`).some(o=>o.startsWith("https://svelte.dev/e/")))throw f;return f!==Ee&&console.warn("Failed to hydrate: ",f),t.recover===!1&&Vn(),rt(),sn(n),He(!1),Tn(e,t)}finally{He(r),B(s)}}const Ye=new Map;function An(e,{target:t,anchor:n,props:r={},events:s,context:i,intro:f=!0,transformError:o}){rt();var a=void 0,l=mr(()=>{var c=n??t.appendChild(X());ar(c,{pending:()=>{}},p=>{Jn({});var d=y;if(i&&(d.c=i),s&&(r.$$events=s),E&&q(p,null),ft=f,a=e(p,r)||{},ft=!0,E&&(v.nodes.end=b,b===null||b.nodeType!==We||b.data!==Ft))throw $e(),Ee;Qn()},o);var u=new Set,_=p=>{for(var d=0;d{for(var p of u)for(const N of[t,document]){var d=Ye.get(N),g=d.get(p);--g==0?(N.removeEventListener(p,at),d.delete(p),d.size===0&&Ye.delete(N)):d.set(p,g)}it.delete(_),c!==n&&c.parentNode?.removeChild(c)}});return lt.set(a,l),a}let lt=new WeakMap;function qr(e,t){const n=lt.get(e);return n?(lt.delete(e),n(t)):Promise.resolve()}function Sn(e,t,n){if(e==null)return t(void 0),n&&n(void 0),de;const r=Ve(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const we=[];function Yr(e,t){return{subscribe:Br(e,t).subscribe}}function Br(e,t=de){let n=null;const r=new Set;function s(o){if(Ht(e,o)&&(e=o,n)){const a=!we.length;for(const l of r)l[1](),we.push(l,e);if(a){for(let l=0;l{r.delete(l),r.size===0&&n&&(n(),n=null)}}return{set:s,update:i,subscribe:f}}function ni(e,t,n){const r=!Array.isArray(e),s=r?[e]:e;if(!s.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const i=t.length<2;return Yr(n,(f,o)=>{let a=!1;const l=[];let c=0,u=de;const _=()=>{if(c)return;u();const d=t(r?l[0]:l,f,o);i?f(d):u=typeof d=="function"?d:de},p=s.map((d,g)=>Sn(d,N=>{l[g]=N,c&=~(1<{c|=1<t=n)(),t}function xn(e){y===null&&ct(),Pe&&y.l!==null?Ur(y).m.push(e):wr(()=>{const t=Ve(e);if(typeof t=="function")return t})}function zr(e){y===null&&ct(),xn(()=>()=>Ve(e))}function Ur(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}const si=Object.freeze(Object.defineProperty({__proto__:null,flushSync:Wt,getContext:Kn,hasContext:Zn,hydrate:Hr,mount:Tn,onDestroy:zr,onMount:xn,setContext:Xn,settled:Mr,tick:kr,unmount:qr,untrack:Ve},Symbol.toStringTag,{value:"Module"}));export{ie as $,Ks as A,Ns as B,ws as C,Rs as D,ke as E,ti as F,Gs as G,Pt as H,Q as I,Se as J,$s as K,ee as L,$n as M,Ds as N,Ts as O,Zs as P,w as Q,Vs as R,H as S,Be as T,X as U,oe as V,Nr as W,ks as X,Lt as Y,Ls as Z,Tr as _,jt as a,Bs as a$,he as a0,de as a1,As as a2,Sn as a3,ri as a4,fn as a5,kn as a6,Ne as a7,ss as a8,_s as a9,Nn as aA,Rn as aB,is as aC,os as aD,as as aE,z as aF,$ as aG,ls as aH,sn as aI,J as aJ,ns as aK,ei as aL,gr as aM,ps as aN,q as aO,zs as aP,js as aQ,ys as aR,xs as aS,Cs as aT,mt as aU,lr as aV,bs as aW,ts as aX,qs as aY,mn as aZ,Ms as a_,v as aa,re as ab,Fe as ac,ds as ad,Pe as ae,cs as af,us as ag,_r as ah,Ss as ai,W as aj,Wr as ak,Jr as al,hs as am,ge as an,Hr as ao,Tn as ap,Wt as aq,qr as ar,kr as as,fs as at,D as au,We as av,Ft as aw,Ue as ax,Zr as ay,rs as az,Ar as b,A as b0,br as b1,Un as b2,Rt as b3,Qr as b4,Ys as b5,Mn as b6,Xs as b7,Kr as b8,ni as b9,Mr as bA,xr as ba,$e as bb,Ee as bc,gs as bd,ft as be,Z as bf,fe as bg,vs as bh,Xe as bi,Ws as bj,Le as bk,Dt as bl,be as bm,zr as bn,At as bo,Dn as bp,Ht as bq,Zn as br,Kn as bs,Xn as bt,Ps as bu,sr as bv,Us as bw,Gr as bx,Xr as by,si as bz,B as c,He as d,b as e,Qn as f,Js as g,E as h,Os as i,Qs as j,y as k,wr as l,Ve as m,kt as n,xn as o,Jn as p,$r as q,ms as r,Gn as s,ne as t,Is as u,Hs as v,Br as w,ht as x,Es as y,Fs as z}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/l8YpzWR9.js b/studio-desktop/frontend-dist/_app/immutable/chunks/l8YpzWR9.js deleted file mode 100644 index 1ba2381b..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/l8YpzWR9.js +++ /dev/null @@ -1 +0,0 @@ -import{k as d,u as g,l as c,m,n as i,q as b,t as p,v,x as k,y}from"./DCyBifBO.js";function x(n=!1){const s=d,e=s.l.u;if(!e)return;let f=()=>v(s.s);if(n){let a=0,t={};const _=k(()=>{let l=!1;const r=s.s;for(const o in r)r[o]!==t[o]&&(t[o]=r[o],l=!0);return l&&a++,a});f=()=>p(_)}e.b.length&&g(()=>{u(s,f),i(e.b)}),c(()=>{const a=m(()=>e.m.map(b));return()=>{for(const t of a)typeof t=="function"&&t()}}),e.a.length&&c(()=>{u(s,f),i(e.a)})}function u(n,s){if(n.l.s)for(const e of n.l.s)p(e);s()}y();export{x as i}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/p0Zj8fW7.js b/studio-desktop/frontend-dist/_app/immutable/chunks/p0Zj8fW7.js deleted file mode 100644 index 8bd60d36..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/p0Zj8fW7.js +++ /dev/null @@ -1 +0,0 @@ -import"./DsnmJJEf.js";import"./CiPkpaXo.js";import{c as i,f as n,a as m}from"./BESIXtBI.js";import{I as p,s as d}from"./0zSFSexy.js";import{l,s as $}from"./CJh9TUc0.js";function x(e,r){const o=l(r,["children","$$slots","$$events","$$legacy"]);const s=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2"}],["circle",{cx:"9",cy:"9",r:"2"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"}]];p(e,$({name:"image"},()=>o,{get iconNode(){return s},children:(a,f)=>{var t=i(),c=n(t);d(c,r,"default",{}),m(a,t)},$$slots:{default:!0}}))}export{x as I}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/v7tHB-Lt.js b/studio-desktop/frontend-dist/_app/immutable/chunks/v7tHB-Lt.js deleted file mode 100644 index 8ccf5507..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/v7tHB-Lt.js +++ /dev/null @@ -1 +0,0 @@ -import{P as E,Q as H,R as w,S as q,T as I,U as D,h as m,e as Z,V as z,W as G,b as J,a as Q,E as V,r as W,H as X,X as k,s as ee,c as se,d as N,Y as re,Z as te,m as B,_ as ne,$ as R,a0 as y,a1 as ie,a2 as ae,a3 as fe,t as b,a4 as ue,a5 as ce,L as U,a6 as g,a7 as oe,a8 as K,J as le,a9 as T,aa as de,ab as pe,ac as he,ad as _e,ae as ve,af as be,x as Se,ag as Pe,ah as L,ai as M,aj as _,ak as j,al as we,am as me}from"./DCyBifBO.js";class ge{anchor;#s=new Map;#r=new Map;#e=new Map;#t=new Set;#n=!0;constructor(e,t=!0){this.anchor=e,this.#n=t}#i=()=>{var e=E;if(this.#s.has(e)){var t=this.#s.get(e),r=this.#r.get(t);if(r)H(r),this.#t.delete(t);else{var n=this.#e.get(t);n&&(this.#r.set(t,n.effect),this.#e.delete(t),n.fragment.lastChild.remove(),this.anchor.before(n.fragment),r=n.effect)}for(const[i,f]of this.#s){if(this.#s.delete(i),i===e)break;const a=this.#e.get(f);a&&(w(a.effect),this.#e.delete(f))}for(const[i,f]of this.#r){if(i===t||this.#t.has(i))continue;const a=()=>{if(Array.from(this.#s.values()).includes(i)){var o=document.createDocumentFragment();z(f,o),o.append(I()),this.#e.set(i,{effect:f,fragment:o})}else w(f);this.#t.delete(i),this.#r.delete(i)};this.#n||!r?(this.#t.add(i),q(f,a,!1)):a()}}};#a=e=>{this.#s.delete(e);const t=Array.from(this.#s.values());for(const[r,n]of this.#e)t.includes(r)||(w(n.effect),this.#e.delete(r))};ensure(e,t){var r=E,n=G();if(t&&!this.#r.has(e)&&!this.#e.has(e))if(n){var i=document.createDocumentFragment(),f=I();i.append(f),this.#e.set(e,{effect:D(()=>t(f)),fragment:i})}else this.#r.set(e,D(()=>t(this.anchor)));if(this.#s.set(r,e),n){for(const[a,u]of this.#r)a===e?r.unskip_effect(u):r.skip_effect(u);for(const[a,u]of this.#e)a===e?r.unskip_effect(u.effect):r.skip_effect(u.effect);r.oncommit(this.#i),r.ondiscard(this.#a)}else m&&(this.anchor=Z),this.#i()}}function Ie(s,e,t=!1){m&&Q();var r=new ge(s),n=t?V:0;function i(f,a){if(m){const l=W(s);var u;if(l===X?u=0:l===k?u=!1:u=parseInt(l.substring(1)),f!==u){var o=ee();se(o),r.anchor=o,N(!1),r.ensure(f,a),N(!0);return}}r.ensure(f,a)}J(()=>{var f=!1;e((a,u=0)=>{f=!0,i(u,a)}),f||i(!1,null)},n)}function Y(s,e){return s===e||s?.[R]===e}function De(s={},e,t,r){return re(()=>{var n,i;return te(()=>{n=i,i=[],B(()=>{s!==t(...i)&&(e(s,...i),n&&Y(t(...n),s)&&e(null,...n))})}),()=>{ne(()=>{i&&Y(t(...i),s)&&e(null,...i)})}}),s}let v=!1,x=Symbol();function Ne(s,e,t){const r=t[e]??={store:null,source:ie(void 0),unsubscribe:y};if(r.store!==s&&!(x in t))if(r.unsubscribe(),r.store=s??null,s==null)r.source.v=void 0,r.unsubscribe=y;else{var n=!0;r.unsubscribe=ae(s,i=>{n?r.source.v=i:U(r.source,i)}),n=!1}return s&&x in t?fe(s):b(r.source)}function ye(s,e){return s.set(e),e}function Le(){const s={};function e(){ue(()=>{for(var t in s)s[t].unsubscribe();ce(s,x,{enumerable:!1,value:!0})})}return[s,e]}function Me(){v=!0}function xe(s){var e=v;try{return v=!1,[s(),v]}finally{v=e}}const Re={get(s,e){if(!s.exclude.includes(e))return s.props[e]},set(s,e){return!1},getOwnPropertyDescriptor(s,e){if(!s.exclude.includes(e)&&e in s.props)return{enumerable:!0,configurable:!0,value:s.props[e]}},has(s,e){return s.exclude.includes(e)?!1:e in s.props},ownKeys(s){return Reflect.ownKeys(s.props).filter(e=>!s.exclude.includes(e))}};function Ye(s,e,t){return new Proxy({props:s,exclude:e},Re)}const Te={get(s,e){if(!s.exclude.includes(e))return b(s.version),e in s.special?s.special[e]():s.props[e]},set(s,e,t){if(!(e in s.special)){var r=T;try{M(s.parent_effect),s.special[e]=Ae({get[e](){return s.props[e]}},e,K)}finally{M(r)}}return s.special[e](t),L(s.version),!0},getOwnPropertyDescriptor(s,e){if(!s.exclude.includes(e)&&e in s.props)return{enumerable:!0,configurable:!0,value:s.props[e]}},deleteProperty(s,e){return s.exclude.includes(e)||(s.exclude.push(e),L(s.version)),!0},has(s,e){return s.exclude.includes(e)?!1:e in s.props},ownKeys(s){return Reflect.ownKeys(s.props).filter(e=>!s.exclude.includes(e))}};function Be(s,e){return new Proxy({props:s,exclude:e,special:{},version:pe(0),parent_effect:T},Te)}const Oe={get(s,e){let t=s.props.length;for(;t--;){let r=s.props[t];if(_(r)&&(r=r()),typeof r=="object"&&r!==null&&e in r)return r[e]}},set(s,e,t){let r=s.props.length;for(;r--;){let n=s.props[r];_(n)&&(n=n());const i=g(n,e);if(i&&i.set)return i.set(t),!0}return!1},getOwnPropertyDescriptor(s,e){let t=s.props.length;for(;t--;){let r=s.props[t];if(_(r)&&(r=r()),typeof r=="object"&&r!==null&&e in r){const n=g(r,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(s,e){if(e===R||e===j)return!1;for(let t of s.props)if(_(t)&&(t=t()),t!=null&&e in t)return!0;return!1},ownKeys(s){const e=[];for(let t of s.props)if(_(t)&&(t=t()),!!t){for(const r in t)e.includes(r)||e.push(r);for(const r of Object.getOwnPropertySymbols(t))e.includes(r)||e.push(r)}return e}};function Ue(...s){return new Proxy({props:s},Oe)}function Ae(s,e,t,r){var n=!_e||(t&ve)!==0,i=(t&he)!==0,f=(t&we)!==0,a=r,u=!0,o=()=>(u&&(u=!1,a=f?B(r):r),a),l;if(i){var F=R in s||j in s;l=g(s,e)?.set??(F&&e in s?c=>s[e]=c:void 0)}var p,O=!1;i?[p,O]=xe(()=>s[e]):p=s[e],p===void 0&&r!==void 0&&(p=o(),l&&(n&&oe(),l(p)));var d;if(n?d=()=>{var c=s[e];return c===void 0?o():(u=!0,c)}:d=()=>{var c=s[e];return c!==void 0&&(a=void 0),c===void 0?a:c},n&&(t&K)===0)return d;if(l){var $=s.$$legacy;return(function(c,S){return arguments.length>0?((!n||!S||$||O)&&l(S?d():c),c):d()})}var P=!1,h=((t&be)!==0?Se:Pe)(()=>(P=!1,d()));i&&b(h);var C=T;return(function(c,S){if(arguments.length>0){const A=S?b(h):n&&i?le(c):c;return U(h,A),P=!0,a!==void 0&&(a=A),c}return me&&P||(C.f&de)!==0?h.v:b(h)})}export{ge as B,Le as a,De as b,Ne as c,ye as d,Ie as i,Be as l,Me as m,Ae as p,Ye as r,Ue as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/chunks/yhLnWQwL.js b/studio-desktop/frontend-dist/_app/immutable/chunks/yhLnWQwL.js deleted file mode 100644 index 08dc20a5..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/chunks/yhLnWQwL.js +++ /dev/null @@ -1 +0,0 @@ -import{w as s}from"./hL-aZVJ4.js";const a=s(!0),e=s(!1),n=s("console"),o=s(!0),c=s(!1),l=s(!1),r=s(!1),p=s(!1),i=s(null);export{e as a,n as b,o as c,c as d,l as e,p as f,i as p,a as r,r as s}; diff --git a/studio-desktop/frontend-dist/_app/immutable/entry/app.BUQWwH8e.js b/studio-desktop/frontend-dist/_app/immutable/entry/app.BUQWwH8e.js deleted file mode 100644 index 2203c522..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/entry/app.BUQWwH8e.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.E-H85vrL.js","../chunks/DsnmJJEf.js","../chunks/hL-aZVJ4.js","../chunks/DWKiSLzw.js","../chunks/B_6VzoXV.js","../chunks/D7CioVkw.js","../chunks/BWWgRDE1.js","../assets/file.DU3A4Afm.css","../chunks/DEAaRqcq.js","../chunks/yhLnWQwL.js","../chunks/CFyDcTgg.js","../chunks/DWbf9ulZ.js","../assets/0.Dt_lC5bU.css","../nodes/1.CgtKuGLP.js","../nodes/2.DdY508-2.js","../chunks/DaNA2RYx.js","../assets/2.1uTRQMkx.css","../nodes/3.Cp-v9HuY.js","../assets/3.bRsBZawq.css","../nodes/4.oy6NDEc0.js","../nodes/5.BzoQF27Z.js","../nodes/6.Bwo4e0-2.js","../nodes/7.B1NCeFHv.js","../nodes/8.B42jxsZB.js","../nodes/9.D6xlIU6N.js"])))=>i.map(i=>d[i]); -import{L as A,al as z,t as f,ao as F,ap as G,aq as W,a6 as Y,ar as H,a2 as J,p as K,u as Q,l as X,o as Z,as as $,i as L,D as tt,j as p,f as et,I as w,g as k,B as rt,C as st,A as C,P as at,z as nt,F as ot,O as x}from"../chunks/hL-aZVJ4.js";import"../chunks/DsnmJJEf.js";import{p as D,i as I,b as T}from"../chunks/B_6VzoXV.js";import{c as V}from"../chunks/CFyDcTgg.js";function it(o){return class extends ct{constructor(t){super({component:o,...t})}}}class ct{#e;#t;constructor(t){var a=new Map,c=(r,e)=>{var s=J(e,!1,!1);return a.set(r,s),s};const l=new Proxy({...t.props||{},$$events:{}},{get(r,e){return f(a.get(e)??c(e,Reflect.get(r,e)))},has(r,e){return e===z?!0:(f(a.get(e)??c(e,Reflect.get(r,e))),Reflect.has(r,e))},set(r,e,s){return A(a.get(e)??c(e,s),s),Reflect.set(r,e,s)}});this.#t=(t.hydrate?F:G)(t.component,{target:t.target,anchor:t.anchor,props:l,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),(!t?.props?.$$host||t.sync===!1)&&W(),this.#e=l.$$events;for(const r of Object.keys(this.#t))r==="$set"||r==="$destroy"||r==="$on"||Y(this,r,{get(){return this.#t[r]},set(e){this.#t[r]=e},enumerable:!0});this.#t.$set=r=>{Object.assign(l,r)},this.#t.$destroy=()=>{H(this.#t)}}$set(t){this.#t.$set(t)}$on(t,a){this.#e[t]=this.#e[t]||[];const c=(...l)=>a.call(this,...l);return this.#e[t].push(c),()=>{this.#e[t]=this.#e[t].filter(l=>l!==c)}}$destroy(){this.#t.$destroy()}}const lt="modulepreload",ut=function(o,t){return new URL(o,t).href},S={},m=function(t,a,c){let l=Promise.resolve();if(a&&a.length>0){let R=function(i){return Promise.all(i.map(d=>Promise.resolve(d).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};const e=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),O=s?.nonce||s?.getAttribute("nonce");l=R(a.map(i=>{if(i=ut(i,c),i in S)return;S[i]=!0;const d=i.endsWith(".css"),_=d?'[rel="stylesheet"]':"";if(c)for(let h=e.length-1;h>=0;h--){const n=e[h];if(n.href===i&&(!d||n.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${_}`))return;const u=document.createElement("link");if(u.rel=d?"stylesheet":lt,d||(u.as="script"),u.crossOrigin="",u.href=i,O&&u.setAttribute("nonce",O),document.head.appendChild(u),d)return new Promise((h,n)=>{u.addEventListener("load",h),u.addEventListener("error",()=>n(new Error(`Unable to preload CSS for ${i}`)))})}))}function r(e){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=e,window.dispatchEvent(s),!s.defaultPrevented)throw e}return l.then(e=>{for(const s of e||[])s.status==="rejected"&&r(s.reason);return t().catch(r)})},pt={};var mt=C('
    '),dt=C(" ",1);function ft(o,t){K(t,!0);let a=D(t,"components",23,()=>[]),c=D(t,"data_0",3,null),l=D(t,"data_1",3,null);Q(()=>t.stores.page.set(t.page)),X(()=>{t.stores,t.page,t.constructors,a(),t.form,c(),l(),t.stores.page.notify()});let r=w(!1),e=w(!1),s=w(null);Z(()=>{const n=t.stores.page.subscribe(()=>{f(r)&&(A(e,!0),$().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(r,!0),n});const O=x(()=>t.constructors[1]);var R=dt(),i=L(R);{var d=n=>{const v=x(()=>t.constructors[0]);var g=k(),P=L(g);V(P,()=>f(v),(E,y)=>{T(y(E,{get data(){return c()},get form(){return t.form},get params(){return t.page.params},children:(b,ht)=>{var j=k(),M=L(j);V(M,()=>f(O),(N,B)=>{T(B(N,{get data(){return l()},get form(){return t.form},get params(){return t.page.params}}),U=>a()[1]=U,()=>a()?.[1])}),p(b,j)},$$slots:{default:!0}}),b=>a()[0]=b,()=>a()?.[0])}),p(n,g)},_=n=>{const v=x(()=>t.constructors[0]);var g=k(),P=L(g);V(P,()=>f(v),(E,y)=>{T(y(E,{get data(){return c()},get form(){return t.form},get params(){return t.page.params}}),b=>a()[0]=b,()=>a()?.[0])}),p(n,g)};I(i,n=>{t.constructors[1]?n(d):n(_,!1)})}var u=tt(i,2);{var h=n=>{var v=mt(),g=rt(v);{var P=E=>{var y=at();nt(()=>ot(y,f(s))),p(E,y)};I(g,E=>{f(e)&&E(P)})}st(v),p(n,v)};I(u,n=>{f(r)&&n(h)})}p(o,R),et()}const Pt=it(ft),bt=[()=>m(()=>import("../nodes/0.E-H85vrL.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>m(()=>import("../nodes/1.CgtKuGLP.js"),__vite__mapDeps([13,1,5,2,8]),import.meta.url),()=>m(()=>import("../nodes/2.DdY508-2.js"),__vite__mapDeps([14,1,2,4,6,5,8,9,11,15,16]),import.meta.url),()=>m(()=>import("../nodes/3.Cp-v9HuY.js"),__vite__mapDeps([17,1,5,2,4,6,3,7,10,15,9,18]),import.meta.url),()=>m(()=>import("../nodes/4.oy6NDEc0.js"),__vite__mapDeps([19,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/5.BzoQF27Z.js"),__vite__mapDeps([20,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/6.Bwo4e0-2.js"),__vite__mapDeps([21,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/7.B1NCeFHv.js"),__vite__mapDeps([22,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/8.B42jxsZB.js"),__vite__mapDeps([23,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/9.D6xlIU6N.js"),__vite__mapDeps([24,1,5,2,8,9]),import.meta.url)],Ot=[],Rt={"/":[2],"/construct":[3],"/deploy":[4],"/evaluate":[5],"/experiments":[6],"/files":[7],"/integrations":[8],"/monitor":[9]},q={handleError:(({error:o})=>{console.error(o)}),reroute:(()=>{}),transport:{}},_t=Object.fromEntries(Object.entries(q.transport).map(([o,t])=>[o,t.decode])),Lt=Object.fromEntries(Object.entries(q.transport).map(([o,t])=>[o,t.encode])),At=!1,wt=(o,t)=>_t[o](t);export{wt as decode,_t as decoders,Rt as dictionary,Lt as encoders,At as hash,q as hooks,pt as matchers,bt as nodes,Pt as root,Ot as server_loads}; diff --git a/studio-desktop/frontend-dist/_app/immutable/entry/app.BxupTnou.js b/studio-desktop/frontend-dist/_app/immutable/entry/app.BxupTnou.js deleted file mode 100644 index 3d7a46a0..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/entry/app.BxupTnou.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.625rWOO-.js","../chunks/DsnmJJEf.js","../chunks/BESIXtBI.js","../chunks/BI8CVrNj.js","../chunks/CiPkpaXo.js","../chunks/0zSFSexy.js","../chunks/CJh9TUc0.js","../assets/marked.D37p7-Ro.css","../chunks/gvU2Nsg7.js","../chunks/8I91iWf8.js","../chunks/DaAgYj3T.js","../chunks/p0Zj8fW7.js","../assets/0.D1o6gups.css","../nodes/1.CM9fyoZO.js","../nodes/2.B2KpwBSe.js","../chunks/Biw60Ycb.js","../assets/2.iGbBghFD.css","../nodes/3.7-a9x_uM.js","../assets/3.wdEcXtf1.css","../nodes/4.C8sTrwDE.js","../nodes/5.B_tkw_1h.js","../nodes/6.Dt6a6dFW.js","../nodes/7.wgNMEEjV.js","../nodes/8.Bg5shqvn.js","../nodes/9.F5w3hcSN.js"])))=>i.map(i=>d[i]); -import{p as P,i as b,b as O,_ as c}from"../chunks/CJh9TUc0.js";import{G as y,L as F,t as m,I as J,J as K,K as N,M as Q,N as Y,O as q,p as H,u as U,l as W,o as X,P as Z,f as E,D as $,a as h,j as tt,Q as p,c as R,B as et,C as rt,A as T,R as st,z as at,F as ot,S as A}from"../chunks/BESIXtBI.js";import"../chunks/DsnmJJEf.js";import{c as L}from"../chunks/DaAgYj3T.js";function nt(a){return class extends it{constructor(t){super({component:a,...t})}}}class it{#e;#t;constructor(t){var s=new Map,n=(e,r)=>{var u=q(r,!1,!1);return s.set(e,u),u};const i=new Proxy({...t.props||{},$$events:{}},{get(e,r){return m(s.get(r)??n(r,Reflect.get(e,r)))},has(e,r){return r===F?!0:(m(s.get(r)??n(r,Reflect.get(e,r))),Reflect.has(e,r))},set(e,r,u){return y(s.get(r)??n(r,u),u),Reflect.set(e,r,u)}});this.#t=(t.hydrate?J:K)(t.component,{target:t.target,anchor:t.anchor,props:i,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),(!t?.props?.$$host||t.sync===!1)&&N(),this.#e=i.$$events;for(const e of Object.keys(this.#t))e==="$set"||e==="$destroy"||e==="$on"||Q(this,e,{get(){return this.#t[e]},set(r){this.#t[e]=r},enumerable:!0});this.#t.$set=e=>{Object.assign(i,e)},this.#t.$destroy=()=>{Y(this.#t)}}$set(t){this.#t.$set(t)}$on(t,s){this.#e[t]=this.#e[t]||[];const n=(...i)=>s.call(this,...i);return this.#e[t].push(n),()=>{this.#e[t]=this.#e[t].filter(i=>i!==n)}}$destroy(){this.#t.$destroy()}}const gt={};var ct=T('
    '),ut=T(" ",1);function mt(a,t){H(t,!0);let s=P(t,"components",23,()=>[]),n=P(t,"data_0",3,null),i=P(t,"data_1",3,null);U(()=>t.stores.page.set(t.page)),W(()=>{t.stores,t.page,t.constructors,s(),t.form,n(),i(),t.stores.page.notify()});let e=p(!1),r=p(!1),u=p(null);X(()=>{const o=t.stores.page.subscribe(()=>{m(e)&&(y(r,!0),Z().then(()=>{y(u,document.title||"untitled page",!0)}))});return y(e,!0),o});const j=A(()=>t.constructors[1]);var x=ut(),D=E(x);{var w=o=>{const _=A(()=>t.constructors[0]);var l=R(),v=E(l);L(v,()=>m(_),(d,f)=>{O(f(d,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(g,lt)=>{var I=R(),M=E(I);L(M,()=>m(j),(G,z)=>{O(z(G,{get data(){return i()},get form(){return t.form},get params(){return t.page.params}}),B=>s()[1]=B,()=>s()?.[1])}),h(g,I)},$$slots:{default:!0}}),g=>s()[0]=g,()=>s()?.[0])}),h(o,l)},k=o=>{const _=A(()=>t.constructors[0]);var l=R(),v=E(l);L(v,()=>m(_),(d,f)=>{O(f(d,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),g=>s()[0]=g,()=>s()?.[0])}),h(o,l)};b(D,o=>{t.constructors[1]?o(w):o(k,!1)})}var C=$(D,2);{var S=o=>{var _=ct(),l=et(_);{var v=d=>{var f=st();at(()=>ot(f,m(u))),h(d,f)};b(l,d=>{m(r)&&d(v)})}rt(_),h(o,_)};b(C,o=>{m(e)&&o(S)})}h(a,x),tt()}const Et=nt(mt),yt=[()=>c(()=>import("../nodes/0.625rWOO-.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>c(()=>import("../nodes/1.CM9fyoZO.js"),__vite__mapDeps([13,1,4,2,8]),import.meta.url),()=>c(()=>import("../nodes/2.B2KpwBSe.js"),__vite__mapDeps([14,1,2,6,5,4,8,9,15,11,16]),import.meta.url),()=>c(()=>import("../nodes/3.7-a9x_uM.js"),__vite__mapDeps([17,1,4,2,6,5,3,7,10,15,9,18]),import.meta.url),()=>c(()=>import("../nodes/4.C8sTrwDE.js"),__vite__mapDeps([19,1,4,2,8,9]),import.meta.url),()=>c(()=>import("../nodes/5.B_tkw_1h.js"),__vite__mapDeps([20,1,4,2,8,9]),import.meta.url),()=>c(()=>import("../nodes/6.Dt6a6dFW.js"),__vite__mapDeps([21,1,4,2,8,9]),import.meta.url),()=>c(()=>import("../nodes/7.wgNMEEjV.js"),__vite__mapDeps([22,1,4,2,8,9]),import.meta.url),()=>c(()=>import("../nodes/8.Bg5shqvn.js"),__vite__mapDeps([23,1,4,2,8,9]),import.meta.url),()=>c(()=>import("../nodes/9.F5w3hcSN.js"),__vite__mapDeps([24,1,4,2,8,9]),import.meta.url)],Pt=[],bt={"/":[2],"/construct":[3],"/deploy":[4],"/evaluate":[5],"/experiments":[6],"/files":[7],"/integrations":[8],"/monitor":[9]},V={handleError:(({error:a})=>{console.error(a)}),reroute:(()=>{}),transport:{}},_t=Object.fromEntries(Object.entries(V.transport).map(([a,t])=>[a,t.decode])),Ot=Object.fromEntries(Object.entries(V.transport).map(([a,t])=>[a,t.encode])),pt=!1,Rt=(a,t)=>_t[a](t);export{Rt as decode,_t as decoders,bt as dictionary,Ot as encoders,pt as hash,V as hooks,gt as matchers,yt as nodes,Et as root,Pt as server_loads}; diff --git a/studio-desktop/frontend-dist/_app/immutable/entry/app.D52pZA79.js b/studio-desktop/frontend-dist/_app/immutable/entry/app.D52pZA79.js deleted file mode 100644 index 7f783d16..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/entry/app.D52pZA79.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DQYGG-fq.js","../chunks/DsnmJJEf.js","../chunks/DCyBifBO.js","../chunks/91PP6ILK.js","../chunks/v7tHB-Lt.js","../chunks/l8YpzWR9.js","../chunks/BAxs8Xtu.js","../assets/file.DU3A4Afm.css","../chunks/DhiGuJwU.js","../chunks/BCCFcAOv.js","../chunks/BX0kmcoN.js","../chunks/CdQ27ih8.js","../assets/0.Dt_lC5bU.css","../nodes/1.Czl_Q6cB.js","../nodes/2.BuNaGOOw.js","../chunks/DQfFYHAU.js","../assets/2.B5Y56XZl.css","../nodes/3.BOgUOg_l.js","../assets/3.bRsBZawq.css","../nodes/4.BDkuuGZp.js","../nodes/5.CyZ3q-f3.js","../nodes/6.D3NTFto7.js","../nodes/7.C5dO2UUz.js","../nodes/8.DYjLyWgX.js","../nodes/9.C_pv2wQA.js"])))=>i.map(i=>d[i]); -import{L as A,ak as z,t as f,an as F,ao as G,ap as W,a5 as Y,aq as H,a1 as J,p as K,u as Q,l as X,o as Z,ar as $,g as L,D as tt,i as p,j as et,I as w,f as k,B as rt,C as st,A as C,as as at,z as nt,F as ot,O as x}from"../chunks/DCyBifBO.js";import"../chunks/DsnmJJEf.js";import{p as D,i as I,b as T}from"../chunks/v7tHB-Lt.js";import{c as V}from"../chunks/BX0kmcoN.js";function it(o){return class extends ct{constructor(t){super({component:o,...t})}}}class ct{#e;#t;constructor(t){var a=new Map,c=(r,e)=>{var s=J(e,!1,!1);return a.set(r,s),s};const u=new Proxy({...t.props||{},$$events:{}},{get(r,e){return f(a.get(e)??c(e,Reflect.get(r,e)))},has(r,e){return e===z?!0:(f(a.get(e)??c(e,Reflect.get(r,e))),Reflect.has(r,e))},set(r,e,s){return A(a.get(e)??c(e,s),s),Reflect.set(r,e,s)}});this.#t=(t.hydrate?F:G)(t.component,{target:t.target,anchor:t.anchor,props:u,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),(!t?.props?.$$host||t.sync===!1)&&W(),this.#e=u.$$events;for(const r of Object.keys(this.#t))r==="$set"||r==="$destroy"||r==="$on"||Y(this,r,{get(){return this.#t[r]},set(e){this.#t[r]=e},enumerable:!0});this.#t.$set=r=>{Object.assign(u,r)},this.#t.$destroy=()=>{H(this.#t)}}$set(t){this.#t.$set(t)}$on(t,a){this.#e[t]=this.#e[t]||[];const c=(...u)=>a.call(this,...u);return this.#e[t].push(c),()=>{this.#e[t]=this.#e[t].filter(u=>u!==c)}}$destroy(){this.#t.$destroy()}}const ut="modulepreload",lt=function(o,t){return new URL(o,t).href},S={},m=function(t,a,c){let u=Promise.resolve();if(a&&a.length>0){let R=function(i){return Promise.all(i.map(d=>Promise.resolve(d).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};const e=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),O=s?.nonce||s?.getAttribute("nonce");u=R(a.map(i=>{if(i=lt(i,c),i in S)return;S[i]=!0;const d=i.endsWith(".css"),_=d?'[rel="stylesheet"]':"";if(c)for(let h=e.length-1;h>=0;h--){const n=e[h];if(n.href===i&&(!d||n.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${_}`))return;const l=document.createElement("link");if(l.rel=d?"stylesheet":ut,d||(l.as="script"),l.crossOrigin="",l.href=i,O&&l.setAttribute("nonce",O),document.head.appendChild(l),d)return new Promise((h,n)=>{l.addEventListener("load",h),l.addEventListener("error",()=>n(new Error(`Unable to preload CSS for ${i}`)))})}))}function r(e){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=e,window.dispatchEvent(s),!s.defaultPrevented)throw e}return u.then(e=>{for(const s of e||[])s.status==="rejected"&&r(s.reason);return t().catch(r)})},pt={};var mt=C('
    '),dt=C(" ",1);function ft(o,t){K(t,!0);let a=D(t,"components",23,()=>[]),c=D(t,"data_0",3,null),u=D(t,"data_1",3,null);Q(()=>t.stores.page.set(t.page)),X(()=>{t.stores,t.page,t.constructors,a(),t.form,c(),u(),t.stores.page.notify()});let r=w(!1),e=w(!1),s=w(null);Z(()=>{const n=t.stores.page.subscribe(()=>{f(r)&&(A(e,!0),$().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(r,!0),n});const O=x(()=>t.constructors[1]);var R=dt(),i=L(R);{var d=n=>{const v=x(()=>t.constructors[0]);var g=k(),P=L(g);V(P,()=>f(v),(E,y)=>{T(y(E,{get data(){return c()},get form(){return t.form},get params(){return t.page.params},children:(b,ht)=>{var j=k(),M=L(j);V(M,()=>f(O),(N,B)=>{T(B(N,{get data(){return u()},get form(){return t.form},get params(){return t.page.params}}),U=>a()[1]=U,()=>a()?.[1])}),p(b,j)},$$slots:{default:!0}}),b=>a()[0]=b,()=>a()?.[0])}),p(n,g)},_=n=>{const v=x(()=>t.constructors[0]);var g=k(),P=L(g);V(P,()=>f(v),(E,y)=>{T(y(E,{get data(){return c()},get form(){return t.form},get params(){return t.page.params}}),b=>a()[0]=b,()=>a()?.[0])}),p(n,g)};I(i,n=>{t.constructors[1]?n(d):n(_,!1)})}var l=tt(i,2);{var h=n=>{var v=mt(),g=rt(v);{var P=E=>{var y=at();nt(()=>ot(y,f(s))),p(E,y)};I(g,E=>{f(e)&&E(P)})}st(v),p(n,v)};I(l,n=>{f(r)&&n(h)})}p(o,R),et()}const Pt=it(ft),bt=[()=>m(()=>import("../nodes/0.DQYGG-fq.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>m(()=>import("../nodes/1.Czl_Q6cB.js"),__vite__mapDeps([13,1,5,2,8]),import.meta.url),()=>m(()=>import("../nodes/2.BuNaGOOw.js"),__vite__mapDeps([14,1,2,4,6,5,8,9,11,15,16]),import.meta.url),()=>m(()=>import("../nodes/3.BOgUOg_l.js"),__vite__mapDeps([17,1,5,2,4,6,3,7,10,15,9,18]),import.meta.url),()=>m(()=>import("../nodes/4.BDkuuGZp.js"),__vite__mapDeps([19,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/5.CyZ3q-f3.js"),__vite__mapDeps([20,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/6.D3NTFto7.js"),__vite__mapDeps([21,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/7.C5dO2UUz.js"),__vite__mapDeps([22,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/8.DYjLyWgX.js"),__vite__mapDeps([23,1,5,2,8,9]),import.meta.url),()=>m(()=>import("../nodes/9.C_pv2wQA.js"),__vite__mapDeps([24,1,5,2,8,9]),import.meta.url)],Ot=[],Rt={"/":[2],"/construct":[3],"/deploy":[4],"/evaluate":[5],"/experiments":[6],"/files":[7],"/integrations":[8],"/monitor":[9]},q={handleError:(({error:o})=>{console.error(o)}),reroute:(()=>{}),transport:{}},_t=Object.fromEntries(Object.entries(q.transport).map(([o,t])=>[o,t.decode])),Lt=Object.fromEntries(Object.entries(q.transport).map(([o,t])=>[o,t.encode])),At=!1,wt=(o,t)=>_t[o](t);export{wt as decode,_t as decoders,Rt as dictionary,Lt as encoders,At as hash,q as hooks,pt as matchers,bt as nodes,Pt as root,Ot as server_loads}; diff --git a/studio-desktop/frontend-dist/_app/immutable/entry/app.pDKzeQIC.js b/studio-desktop/frontend-dist/_app/immutable/entry/app.pDKzeQIC.js deleted file mode 100644 index e36fde05..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/entry/app.pDKzeQIC.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.B467-gvR.js","../chunks/DsnmJJEf.js","../chunks/BNectIeB.js","../chunks/DiTIFvoL.js","../chunks/BB2KRr3j.js","../chunks/FsCUQR17.js","../chunks/K2hNZgUo.js","../chunks/DfPw5QXW.js","../assets/file.DU3A4Afm.css","../chunks/DaZstLas.js","../chunks/CKy8R5Mg.js","../chunks/CCyXRANn.js","../assets/0.Dt_lC5bU.css","../nodes/1.BL8ytnJA.js","../nodes/2.aUmnlf6d.js","../chunks/N_rdQ7t6.js","../assets/2.BExnFsh0.css","../nodes/3.DIXAYc9g.js","../assets/3.bRsBZawq.css","../nodes/4.BooAkJEK.js","../nodes/5.qrTlHzif.js","../nodes/6.DbPQnfrb.js","../nodes/7.CMH5WMHy.js","../nodes/8.h4_RvxHO.js","../nodes/9.B77zeVLD.js"])))=>i.map(i=>d[i]); -import{N as w,ak as B,y as f,an as F,ao as J,ap as Q,a4 as W,aq as Y,a0 as z,p as H,n as K,t as X,o as Z,ar as $,f as L,I as tt,a as p,b as et,M as A,c as k,F as rt,G as st,D as C,as as at,C as nt,J as ot,Q as x}from"../chunks/BNectIeB.js";import"../chunks/DsnmJJEf.js";import{p as D,i as I}from"../chunks/BB2KRr3j.js";import{c as T,b as V}from"../chunks/DfPw5QXW.js";function it(o){return class extends ct{constructor(t){super({component:o,...t})}}}class ct{#e;#t;constructor(t){var a=new Map,c=(r,e)=>{var s=z(e,!1,!1);return a.set(r,s),s};const u=new Proxy({...t.props||{},$$events:{}},{get(r,e){return f(a.get(e)??c(e,Reflect.get(r,e)))},has(r,e){return e===B?!0:(f(a.get(e)??c(e,Reflect.get(r,e))),Reflect.has(r,e))},set(r,e,s){return w(a.get(e)??c(e,s),s),Reflect.set(r,e,s)}});this.#t=(t.hydrate?F:J)(t.component,{target:t.target,anchor:t.anchor,props:u,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),(!t?.props?.$$host||t.sync===!1)&&Q(),this.#e=u.$$events;for(const r of Object.keys(this.#t))r==="$set"||r==="$destroy"||r==="$on"||W(this,r,{get(){return this.#t[r]},set(e){this.#t[r]=e},enumerable:!0});this.#t.$set=r=>{Object.assign(u,r)},this.#t.$destroy=()=>{Y(this.#t)}}$set(t){this.#t.$set(t)}$on(t,a){this.#e[t]=this.#e[t]||[];const c=(...u)=>a.call(this,...u);return this.#e[t].push(c),()=>{this.#e[t]=this.#e[t].filter(u=>u!==c)}}$destroy(){this.#t.$destroy()}}const ut="modulepreload",lt=function(o,t){return new URL(o,t).href},j={},m=function(t,a,c){let u=Promise.resolve();if(a&&a.length>0){let O=function(i){return Promise.all(i.map(d=>Promise.resolve(d).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};const e=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),R=s?.nonce||s?.getAttribute("nonce");u=O(a.map(i=>{if(i=lt(i,c),i in j)return;j[i]=!0;const d=i.endsWith(".css"),_=d?'[rel="stylesheet"]':"";if(c)for(let h=e.length-1;h>=0;h--){const n=e[h];if(n.href===i&&(!d||n.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${_}`))return;const l=document.createElement("link");if(l.rel=d?"stylesheet":ut,d||(l.as="script"),l.crossOrigin="",l.href=i,R&&l.setAttribute("nonce",R),document.head.appendChild(l),d)return new Promise((h,n)=>{l.addEventListener("load",h),l.addEventListener("error",()=>n(new Error(`Unable to preload CSS for ${i}`)))})}))}function r(e){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=e,window.dispatchEvent(s),!s.defaultPrevented)throw e}return u.then(e=>{for(const s of e||[])s.status==="rejected"&&r(s.reason);return t().catch(r)})},pt={};var mt=C('
    '),dt=C(" ",1);function ft(o,t){H(t,!0);let a=D(t,"components",23,()=>[]),c=D(t,"data_0",3,null),u=D(t,"data_1",3,null);K(()=>t.stores.page.set(t.page)),X(()=>{t.stores,t.page,t.constructors,a(),t.form,c(),u(),t.stores.page.notify()});let r=A(!1),e=A(!1),s=A(null);Z(()=>{const n=t.stores.page.subscribe(()=>{f(r)&&(w(e,!0),$().then(()=>{w(s,document.title||"untitled page",!0)}))});return w(r,!0),n});const R=x(()=>t.constructors[1]);var O=dt(),i=L(O);{var d=n=>{const v=x(()=>t.constructors[0]);var g=k(),P=L(g);T(P,()=>f(v),(E,y)=>{V(y(E,{get data(){return c()},get form(){return t.form},get params(){return t.page.params},children:(b,ht)=>{var S=k(),N=L(S);T(N,()=>f(R),(q,G)=>{V(G(q,{get data(){return u()},get form(){return t.form},get params(){return t.page.params}}),U=>a()[1]=U,()=>a()?.[1])}),p(b,S)},$$slots:{default:!0}}),b=>a()[0]=b,()=>a()?.[0])}),p(n,g)},_=n=>{const v=x(()=>t.constructors[0]);var g=k(),P=L(g);T(P,()=>f(v),(E,y)=>{V(y(E,{get data(){return c()},get form(){return t.form},get params(){return t.page.params}}),b=>a()[0]=b,()=>a()?.[0])}),p(n,g)};I(i,n=>{t.constructors[1]?n(d):n(_,!1)})}var l=tt(i,2);{var h=n=>{var v=mt(),g=rt(v);{var P=E=>{var y=at();nt(()=>ot(y,f(s))),p(E,y)};I(g,E=>{f(e)&&E(P)})}st(v),p(n,v)};I(l,n=>{f(r)&&n(h)})}p(o,O),et()}const Pt=it(ft),bt=[()=>m(()=>import("../nodes/0.B467-gvR.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>m(()=>import("../nodes/1.BL8ytnJA.js"),__vite__mapDeps([13,1,5,2,9]),import.meta.url),()=>m(()=>import("../nodes/2.aUmnlf6d.js"),__vite__mapDeps([14,1,2,4,6,5,9,10,11,15,16]),import.meta.url),()=>m(()=>import("../nodes/3.DIXAYc9g.js"),__vite__mapDeps([17,1,5,2,4,6,3,7,8,15,10,18]),import.meta.url),()=>m(()=>import("../nodes/4.BooAkJEK.js"),__vite__mapDeps([19,1,5,2,9,10]),import.meta.url),()=>m(()=>import("../nodes/5.qrTlHzif.js"),__vite__mapDeps([20,1,5,2,9,10]),import.meta.url),()=>m(()=>import("../nodes/6.DbPQnfrb.js"),__vite__mapDeps([21,1,5,2,9,10]),import.meta.url),()=>m(()=>import("../nodes/7.CMH5WMHy.js"),__vite__mapDeps([22,1,5,2,9,10]),import.meta.url),()=>m(()=>import("../nodes/8.h4_RvxHO.js"),__vite__mapDeps([23,1,5,2,9,10]),import.meta.url),()=>m(()=>import("../nodes/9.B77zeVLD.js"),__vite__mapDeps([24,1,5,2,9,10]),import.meta.url)],Rt=[],Ot={"/":[2],"/construct":[3],"/deploy":[4],"/evaluate":[5],"/experiments":[6],"/files":[7],"/integrations":[8],"/monitor":[9]},M={handleError:(({error:o})=>{console.error(o)}),reroute:(()=>{}),transport:{}},_t=Object.fromEntries(Object.entries(M.transport).map(([o,t])=>[o,t.decode])),Lt=Object.fromEntries(Object.entries(M.transport).map(([o,t])=>[o,t.encode])),wt=!1,At=(o,t)=>_t[o](t);export{At as decode,_t as decoders,Ot as dictionary,Lt as encoders,wt as hash,M as hooks,pt as matchers,bt as nodes,Pt as root,Rt as server_loads}; diff --git a/studio-desktop/frontend-dist/_app/immutable/entry/start.BPjTRBau.js b/studio-desktop/frontend-dist/_app/immutable/entry/start.BPjTRBau.js deleted file mode 100644 index 570ea6a6..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/entry/start.BPjTRBau.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,b as r}from"../chunks/DEAaRqcq.js";export{o as load_css,r as start}; diff --git a/studio-desktop/frontend-dist/_app/immutable/entry/start.CAhOeSv1.js b/studio-desktop/frontend-dist/_app/immutable/entry/start.CAhOeSv1.js deleted file mode 100644 index ce963452..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/entry/start.CAhOeSv1.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,b as r}from"../chunks/DhiGuJwU.js";export{o as load_css,r as start}; diff --git a/studio-desktop/frontend-dist/_app/immutable/entry/start.DMvoP-ld.js b/studio-desktop/frontend-dist/_app/immutable/entry/start.DMvoP-ld.js deleted file mode 100644 index 0e2389d4..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/entry/start.DMvoP-ld.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,b as r}from"../chunks/gvU2Nsg7.js";export{o as load_css,r as start}; diff --git a/studio-desktop/frontend-dist/_app/immutable/entry/start.HPZzOot-.js b/studio-desktop/frontend-dist/_app/immutable/entry/start.HPZzOot-.js deleted file mode 100644 index 07c14de7..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/entry/start.HPZzOot-.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,b as r}from"../chunks/DaZstLas.js";export{o as load_css,r as start}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/0.625rWOO-.js b/studio-desktop/frontend-dist/_app/immutable/nodes/0.625rWOO-.js deleted file mode 100644 index 8148e1ea..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/0.625rWOO-.js +++ /dev/null @@ -1,13 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{h as gn,b as xr,bk as Sr,d as Os,a2 as Ar,bl as $r,bm as Nr,ax as Tr,aL as ps,g as gs,e as fs,i as Mr,aw as Rr,c as qe,f as J,a as d,w as Da,ad as ia,ba as zs,T as Ra,p as Sa,l as Ta,G as u,j as Aa,Q as ie,B as n,W as We,C as t,D as r,t as e,z as D,F as X,V as $,A as g,S as dt,o as wn,X as En,Z as as,U as ka,aq as Un,R as Hn,m as hs,bn as Is,b9 as Cr,bo as Or}from"../chunks/BESIXtBI.js";import{a as Tt,b as Ia,p as Pa,i as Za,c as Ya,d as zr,L as ns,G as Cn,T as Ps,C as ha,e as Qa,f as Fn,g as Na,S as ss,h as rs,P as Gn,F as Ls,j as Ir,R as Pr,A as Lr,k as Dr,l as jr,D as Br,B as fn,W as Ds,m as Ur,n as Hr,o as Fr,q as Gr,r as Kr,s as Wr,M as Kn,Z as _n,t as qr,I as js,E as On,u as Bs,v as Vr,w as Zr,x as Yr,y as Xr,z as Jr,H as Qr,J as zn,K as ei,N as ti,O as ai,Q as ni,U as Wn}from"../chunks/BI8CVrNj.js";import{I as wt,s as Et,y as si,z as cn,A as ri,C as Us,E as xa,c as Qt,a as Rt,L as kn,G as Ga,i as et,b as la,H as qn,J as Ka,p as In,e as yt,T as is,x as Ot,r as Jt,P as os,K as Vn,m as bs,B as ii,h as Hs,D as Zn,M as ma,n as Yn,g as Fs,S as Xn,X as mn,N as Jn,v as Va,t as Fa,O as oi,Q as Gs,R as li,U as Qn,V as ci,j as _s,F as ms,W as dn,Y as di}from"../chunks/0zSFSexy.js";import{B as ui,l as kt,s as xt,p as Ks,i as M,a as Ca,c as zt,b as hn}from"../chunks/CJh9TUc0.js";import{s as vi,a as pi,g as qa}from"../chunks/gvU2Nsg7.js";import{s as sn,c as Wa,d as es,a as un,r as gi,b as Pn,e as ts,f as bn,p as ys}from"../chunks/8I91iWf8.js";import{i as Ws}from"../chunks/CiPkpaXo.js";import{c as tn}from"../chunks/DaAgYj3T.js";import{I as fi}from"../chunks/p0Zj8fW7.js";const hi=Symbol("NaN");function bi(s,i,l){gn&&xr();var c=new ui(s),b=!Sr();Os(()=>{var x=i();x!==x&&(x=hi),b&&x!==null&&typeof x=="object"&&(x={}),c.ensure(x,l)})}function _i(s,i){let l=null,c=gn;var b;if(gn){l=Mr;for(var x=Rr(document.head);x!==null&&(x.nodeType!==Tr||x.data!==s);)x=ps(x);if(x===null)gs(!1);else{var v=ps(x);x.remove(),fs(v)}}gn||(b=document.head.appendChild(Ar()));try{Os(()=>i(b),$r|Nr)}finally{c&&(gs(!0),fs(l))}}const mi=!1,yi=!1,rd=Object.freeze(Object.defineProperty({__proto__:null,prerender:yi,ssr:mi},Symbol.toStringTag,{value:"Module"})),ls="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='100'%20cy='100'%20r='100'%20fill='url(%23paint0_linear_76_8)'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M100%2027C96.9983%2027.0001%2094.0805%2027.9929%2091.6991%2029.8243C89.3177%2031.6558%2087.6058%2034.2235%2086.8289%2037.1294C86.052%2040.0353%2086.2535%2043.1169%2087.4021%2045.8963C88.5507%2048.6758%2090.5823%2050.9977%2093.1818%2052.502V61.1667H72.7273C50.9091%2061.1667%2045.4545%2079.3912%2045.4545%2088.5V136.333C45.4545%20140.891%2048.1818%20150%2059.0909%20150H65.9091V122.667C65.9091%20120.854%2066.6274%20119.116%2067.9061%20117.835C69.1847%20116.553%2070.919%20115.833%2072.7273%20115.833H127.273C129.081%20115.833%20130.815%20116.553%20132.094%20117.835C133.373%20119.116%20134.091%20120.854%20134.091%20122.667V150H140.909C151.818%20150%20154.545%20140.891%20154.545%20136.333V88.5C154.545%2066.6333%20136.361%2061.1667%20127.273%2061.1667H106.818V52.502C109.418%2050.9977%20111.449%2048.6758%20112.598%2045.8963C113.747%2043.1169%20113.948%2040.0353%20113.171%2037.1294C112.394%2034.2235%20110.682%2031.6558%20108.301%2029.8243C105.92%2027.9929%20103.002%2027.0001%20100%2027ZM120.455%20150V129.5H106.818V150H120.455ZM93.1818%20150V129.5H79.5455V150H93.1818ZM161.364%20129.5V95.3333C165.911%2095.3333%20175%2098.0667%20175%20109V115.833C175%20120.391%20172.273%20129.5%20161.364%20129.5ZM38.6364%2095.3333V129.5C27.7273%20129.5%2025%20120.391%2025%20115.833V109C25%2098.0667%2034.0886%2095.3333%2038.6364%2095.3333ZM79.5455%2088.5C77.7372%2088.5%2076.0029%2089.2199%2074.7243%2090.5014C73.4456%2091.7829%2072.7273%2093.521%2072.7273%2095.3333C72.7273%2097.1456%2073.4456%2098.8837%2074.7243%20100.165C76.0029%20101.447%2077.7372%20102.167%2079.5455%20102.167H79.5523C81.3606%20102.167%2083.0948%20101.447%2084.3735%20100.165C85.6521%2098.8837%2086.3705%2097.1456%2086.3705%2095.3333C86.3705%2093.521%2085.6521%2091.7829%2084.3735%2090.5014C83.0948%2089.2199%2081.3606%2088.5%2079.5523%2088.5H79.5455ZM113.636%2095.3333C113.636%2093.521%20114.355%2091.7829%20115.633%2090.5014C116.912%2089.2199%20118.646%2088.5%20120.455%2088.5H120.461C122.27%2088.5%20124.004%2089.2199%20125.283%2090.5014C126.561%2091.7829%20127.28%2093.521%20127.28%2095.3333C127.28%2097.1456%20126.561%2098.8837%20125.283%20100.165C124.004%20101.447%20122.27%20102.167%20120.461%20102.167H120.455C118.646%20102.167%20116.912%20101.447%20115.633%20100.165C114.355%2098.8837%20113.636%2097.1456%20113.636%2095.3333Z'%20fill='white'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_76_8'%20x1='200'%20y1='100'%20x2='0'%20y2='100'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F68000'/%3e%3cstop%20offset='1'%20stop-color='%23FFF9C1'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e",wi=()=>{const s=vi;return{page:{subscribe:s.page.subscribe},navigating:{subscribe:s.navigating.subscribe},updated:s.updated}},Ei={subscribe(s){return wi().page.subscribe(s)}};function qs(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M12 20v-9"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z"}],["path",{d:"M14.12 3.88 16 2"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97"}],["path",{d:"M22 13h-4"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97"}],["path",{d:"M6 13H2"}],["path",{d:"m8 2 1.88 1.88"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13"}]];wt(s,xt({name:"bug"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function ki(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M9 3v18"}]];wt(s,xt({name:"panel-left"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function xi(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7"}]];wt(s,xt({name:"save"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Si(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M12 2v10"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04"}]];wt(s,xt({name:"power"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}const vn=Da(null),pn=Da(!1),La=Da("stopped");let Pt=null;const da=[];function Ai(){Pt||(Pt=new si("/ws/execution"),Pt.connect(),da.push(Pt.on("node_start",s=>{s.node_id&&(Ia.update(i=>{const l=new Set(i);return l.add(s.node_id),l}),cn(s.node_id,"running")),Pa(s)})),da.push(Pt.on("node_complete",s=>{s.node_id&&(Ia.update(i=>{const l=new Set(i);return l.delete(s.node_id),l}),cn(s.node_id,"complete")),Pa(s)})),da.push(Pt.on("node_error",s=>{s.node_id&&(Ia.update(i=>{const l=new Set(i);return l.delete(s.node_id),l}),cn(s.node_id,"error")),Pa(s)})),da.push(Pt.on("node_skip",s=>{s.node_id&&(Ia.update(i=>{const l=new Set(i);return l.delete(s.node_id),l}),cn(s.node_id,"skipped")),Pa(s)})),da.push(Pt.on("debug_enabled",s=>{Pa(s),Tt("Debug mode active","info")})),da.push(Pt.on("error",s=>{Pa(s),Tt(s.message||s.error||"An error occurred","error")})),da.push(Pt.on("pipeline_complete",s=>{Ia.set(new Set),Za.set(!1),Ya.set(!1),Pa(s),ri()})),da.push(Pt.on("checkpoint_created",s=>{zr.update(i=>[...i,s])})),da.push(Pt.on("pipeline_result",s=>{Ia.set(new Set),Za.set(!1),Ya.set(!1),Pa(s)})),da.push(Pt.on("_close",()=>{Ia.set(new Set),Za.set(!1),Ya.set(!1)})),da.push(Pt.on("_error",()=>{Ia.set(new Set),Za.set(!1),Ya.set(!1),Tt("Execution connection lost. Attempting to reconnect...","warning")})),da.push(Pt.on("_reconnect_failed",()=>{Tt("Could not reconnect to execution server. Please refresh the page.","error",0)})))}function $i(){for(const s of da)s();da.length=0,Pt?.disconnect(),Pt=null}function Vs(s,i){if(!Pt||!Pt.connected)return Tt("Cannot run pipeline: not connected to execution server","error"),!1;Us(),Za.set(!0);const l=ia(xa)?.name??"";return Pt.send({action:"run",graph:s,inputs:i??null,project:l}),!0}function cs(s,i){if(!Pt||!Pt.connected)return Tt("Cannot debug pipeline: not connected to execution server","error"),!1;Us(),Ya.set(!0);const l=ia(xa)?.name??"";return Pt.send({action:"debug",graph:s,inputs:null,project:l}),!0}const an=Da("checking"),Zs=Da(""),Ni={subscribe:an.subscribe};Zs.subscribe;zs(an,s=>s==="connected");let nn=null;async function ws(){try{const s=await fetch("/api/health",{signal:AbortSignal.timeout(3e3)});if(s.ok){const i=await s.json();an.set("connected"),Zs.set(i.version??"")}else an.set("disconnected")}catch{an.set("disconnected")}}function Ti(s=1e4){nn||(ws(),nn=setInterval(ws,s))}function Mi(){nn&&(clearInterval(nn),nn=null)}function Ri(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M15 3h6v6"}],["path",{d:"M10 14 21 3"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}]];wt(s,xt({name:"external-link"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}var Ci=g(' ',1),Oi=g(' ',1),zi=g('
    Publicly accessible
    '),Ii=g(`
    `),Pi=g('

    Send a POST request with JSON to run your pipeline remotely.

    Usage Example
     
    ',1),Li=g('

    Open this URL in any browser to access your studio remotely.

    '),Di=g('Anyone with this URL can access your studio'),ji=g(``);function Bi(s,i){Sa(i,!0);const l=()=>zt(vn,"$tunnelUrl",x),c=()=>zt(pn,"$tunnelActive",x),b=()=>zt(xa,"$currentProject",x),[x,v]=Ca();let p=Ks(i,"open",3,!1),K=ie(!1),R=ie(null),N=dt(l),te=dt(c),L=dt(()=>b()?.name??""),Q=ie(!1),Z=dt(()=>e(N)?`${e(N)}/api/projects/${e(L)}/run`:null),q=dt(()=>e(N)?e(N):null),V=dt(()=>e(Z)?`curl -X POST ${e(Z)} \\ - -H "Content-Type: application/json" \\ - -d '{"input": "Hello, world!"}'`:"");Ta(()=>{p()&&le()});async function le(){try{const y=await Qt.tunnel.status();pn.set(y.active),vn.set(y.url),u(Q,y.cloudflared_installed===!1)}catch{}}async function me(){u(K,!0),u(Q,!1);try{const y=await Qt.tunnel.start();y.error?(u(Q,!0),Tt("cloudflared is not installed","error")):(pn.set(!0),vn.set(y.url),Tt("Tunnel started — your studio is now publicly accessible","success"))}catch(y){const se=y?.message||y?.detail||"";se.includes("not installed")?(u(Q,!0),Tt("cloudflared is not installed","error")):Tt(se||"Failed to start tunnel","error")}finally{u(K,!1)}}async function tt(){u(K,!0);try{await Qt.tunnel.stop(),pn.set(!1),vn.set(null),Tt("Tunnel stopped","success")}catch{Tt("Failed to stop tunnel","error")}finally{u(K,!1)}}async function z(y,se){try{await navigator.clipboard.writeText(y),u(R,se,!0),setTimeout(()=>{u(R,null)},2e3)}catch{Tt("Failed to copy","error")}}function ne(y){y.target===y.currentTarget&&i.onclose()}function F(y){y.key==="Escape"&&(y.preventDefault(),i.onclose())}var $e=qe(),ye=J($e);{var Le=y=>{var se=ji(),pe=n(se),we=n(pe),G=n(we),je=n(G);ns(je,{size:18}),We(2),t(G),We(2),t(we);var Be=r(we,2),nt=n(Be),de=n(nt),Se=n(de),Oe=n(Se);let st;var rt=r(Oe,2),Nt=n(rt,!0);t(rt),t(Se);var lt=r(Se,2);let pt;var Ht=n(lt);{var Ft=_=>{var P=Ci(),U=J(P),j=n(U);kn(j,{size:13}),t(U);var be=r(U,2),he=n(be,!0);t(be),D(()=>X(he,e(te)?"Stopping...":"Starting...")),d(_,P)},ta=_=>{var P=Oi(),U=J(P);Cn(U,{size:13});var j=r(U,2),be=n(j,!0);t(j),D(()=>X(be,e(te)?"Stop Tunnel":"Start Tunnel")),d(_,P)};M(Ht,_=>{e(K)?_(Ft):_(ta,!1)})}t(lt),t(de);var at=r(de,4);{var W=_=>{var P=zi(),U=n(P);Cn(U,{size:11}),We(2),t(P),d(_,P)};M(at,_=>{e(te)&&e(N)&&_(W)})}t(nt);var oe=r(nt,2);{var ge=_=>{var P=Ii(),U=n(P),j=n(U);Ps(j,{size:14}),We(2),t(U);var be=r(U,4),he=n(be),Ue=r(n(he),2),Ce=r(n(Ue),2),He=n(Ce);{var St=vt=>{ha(vt,{size:11})},Vt=vt=>{Qa(vt,{size:11})};M(He,vt=>{e(R)==="brew"?vt(St):vt(Vt,!1)})}t(Ce),t(Ue),t(he);var ft=r(he,2),ut=r(n(ft),2),ht=r(n(ut),2),Fe=n(ht);{var It=vt=>{ha(vt,{size:11})},Lt=vt=>{Qa(vt,{size:11})};M(Fe,vt=>{e(R)==="linux"?vt(It):vt(Lt,!1)})}t(ht),t(ut),t(ft),t(be);var aa=r(be,2),ca=n(aa);Ri(ca,{size:12}),We(2),t(aa),t(P),$("click",Ce,()=>z("brew install cloudflared","brew")),$("click",ht,()=>z("curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared","linux")),d(_,P)};M(oe,_=>{e(Q)&&_(ge)})}var w=r(oe,2);{var C=_=>{var P=Li(),U=n(P),j=n(U),be=n(j);Cn(be,{size:13}),We(2),t(j);var he=r(j,2),Ue=n(he),Ce=n(Ue,!0);t(Ue);var He=r(Ue,2),St=n(He);{var Vt=Fe=>{ha(Fe,{size:13})},ft=Fe=>{Qa(Fe,{size:13})};M(St,Fe=>{e(R)==="studio"?Fe(Vt):Fe(ft,!1)})}t(He),t(he),We(2),t(U);var ut=r(U,2);{var ht=Fe=>{var It=Pi(),Lt=J(It),aa=n(Lt),ca=n(aa);Fn(ca,{size:13}),We(2),t(aa);var vt=r(aa,2),Ze=n(vt),Ye=n(Ze,!0);t(Ze);var h=r(Ze,2),k=n(h);{var m=Me=>{ha(Me,{size:13})},a=Me=>{Qa(Me,{size:13})};M(k,Me=>{e(R)==="api"?Me(m):Me(a,!1)})}t(h),t(vt),We(2),t(Lt);var o=r(Lt,2),f=n(o),O=n(f);Fn(O,{size:12});var _e=r(O,4),ze=n(_e);{var T=Me=>{ha(Me,{size:11})},A=Me=>{Qa(Me,{size:11})};M(ze,Me=>{e(R)==="curl"?Me(T):Me(A,!1)})}t(_e),t(f);var B=r(f,2),Je=n(B,!0);t(B),t(o),D(()=>{X(Ye,e(Z)),X(Je,e(V))}),$("click",h,()=>z(e(Z),"api")),$("click",_e,()=>z(e(V),"curl")),d(Fe,It)};M(ut,Fe=>{e(Z)&&Fe(ht)})}t(P),D(()=>X(Ce,e(q))),$("click",He,()=>z(e(q),"studio")),d(_,P)};M(w,_=>{e(te)&&e(N)&&_(C)})}t(Be);var ce=r(Be,2),fe=n(ce);{var Ee=_=>{var P=Di();d(_,P)};M(fe,_=>{e(te)&&_(Ee)})}var ke=r(fe,2);t(ce),t(pe),t(se),D(()=>{st=Rt(Oe,1,"tunnel-dot svelte-1vh905b",null,st,{"tunnel-dot-active":e(te)}),X(Nt,e(te)?"Tunnel Active":"Tunnel Inactive"),pt=Rt(lt,1,"tunnel-toggle-btn svelte-1vh905b",null,pt,{"tunnel-stop":e(te)}),lt.disabled=e(K)}),$("click",se,ne),$("keydown",se,F),$("click",lt,function(..._){(e(te)?tt:me)?.apply(this,_)}),$("click",ke,function(..._){i.onclose?.apply(this,_)}),d(y,se)};M(ye,y=>{p()&&y(Le)})}d(s,$e),Aa(),v()}Ra(["click","keydown"]);var Ui=g(' Firefly Agentic Studio'),Hi=g(""),Fi=g(''),Gi=g('active'),Ki=g(''),Wi=g('
    '),qi=g(' ',1),Vi=g('
    ',1),Zi=g(''),Yi=g(""),Xi=g(' /
    ',1),Ji=g(' Running... ',1),Qi=g(' Run',1),eo=g(""),to=g(''),ao=g(""),no=g(""),so=g('
    ',1),ro=g(''),io=g(''),oo=g(""),lo=g('

    Run Pipeline

    Provide input for your pipeline (or leave blank to run without input)

    '),co=g('
    ',1);function uo(s,i){Sa(i,!0);const l=()=>zt(Za,"$isRunning",N),c=()=>zt(Ya,"$isDebugging",N),b=()=>zt(Ni,"$connectionState",N),x=()=>zt(La,"$runtimeStatus",N),v=()=>zt(xa,"$currentProject",N),p=()=>zt(In,"$projects",N),K=()=>zt(qn,"$isDirty",N),R=()=>zt(Wa,"$architectSidebarOpen",N),[N,te]=Ca();let L=Ks(i,"isHomePage",3,!1),Q=dt(l),Z=dt(c),q=dt(()=>e(Q)||e(Z)),V=dt(b),le=ie(!1),me=ie(""),tt=ie(!1),z=ie(null),ne=ie(!1),F=ie(!1),$e=ie("");pi(()=>{u(le,!1),u(F,!1),u(ne,!1),u(z,null)}),wn(()=>{function _(){je()}return window.addEventListener("firefly:run-pipeline",_),()=>window.removeEventListener("firefly:run-pipeline",_)});function ye(){u(le,!e(le)),u(me,"")}async function Le(){const _=e(me).trim();if(!(!_||e(tt))){u(tt,!0);try{await Qt.projects.create(_),await Vn();const U=ia(In).find(j=>j.name===_);U&&bs(U),u(me,""),u(le,!1)}catch{Tt("Failed to create project","error")}finally{u(tt,!1)}}}async function y(_){_&&(bs(_),u(le,!1))}function se(_){if(ia(In).length<=1){Tt("Cannot delete the only project","error");return}u(z,_,!0)}async function pe(){if(!e(z))return;const _=e(z);u(z,null);try{await Qt.projects.delete(_),await Vn(),Tt(`Project "${_}" deleted`,"success")}catch{Tt("Failed to delete project","error")}}function we(){u(z,null)}async function G(){const _=ia(xa);if(_)try{const P=Ka();await Qt.projects.savePipeline(_.name,"main",P),qn.set(!1),Tt("Pipeline saved","success")}catch{Tt("Failed to save pipeline","error")}}function je(){ia(Ga).length!==0&&(u(F,!0),u($e,""))}function Be(){u(F,!1),Vs(Ka(),e($e)||void 0)}function nt(){cs(Ka())}function de(){Wa.update(_=>!_)}let Se=dt(x),Oe=ie(!1);Ta(()=>{const _=v();_&&!L()&&Qt.runtime.status(_.name).then(P=>{La.set(P.status)}).catch(()=>{La.set("stopped")})});async function st(){const _=ia(xa);if(!_||e(Oe))return;if(ia(Ga).length===0){Tt("Add nodes to your pipeline before starting the runtime","error");return}u(Oe,!0);try{e(Se)==="running"?(La.set("stopped"),await Qt.runtime.stop(_.name),La.set("stopped"),Tt("Runtime stopped","success")):(La.set("starting"),await Qt.runtime.start(_.name),La.set("running"),Tt("Runtime started","success"))}catch(U){La.set("error");const j=U?.message||"Runtime toggle failed";Tt(j,"error")}finally{u(Oe,!1)}}var rt=co(),Nt=J(rt),lt=n(Nt),pt=n(lt);Na(pt,{text:"Home",description:"Return to the home page",children:(_,P)=>{var U=Ui(),j=n(U);We(2),t(U),D(()=>et(j,"src",ls)),d(_,U)},$$slots:{default:!0}});var Ht=r(pt,2);{var Ft=_=>{var P=Xi(),U=J(P);{let ft=dt(()=>e(V)==="connected"?"Connected":e(V)==="disconnected"?"Disconnected":"Checking..."),ut=dt(()=>e(V)==="connected"?"Backend server is running and reachable":e(V)==="disconnected"?"Cannot reach the backend server":"Verifying connection to backend...");Na(U,{get text(){return e(ft)},get description(){return e(ut)},children:(ht,Fe)=>{var It=Hi();let Lt;D(()=>Lt=Rt(It,1,"conn-dot svelte-11yu8dz",null,Lt,{"conn-ok":e(V)==="connected","conn-fail":e(V)==="disconnected","conn-check":e(V)==="checking"})),d(ht,It)},$$slots:{default:!0}})}var j=r(U,4),be=n(j),he=r(n(be),2),Ue=n(he,!0);t(he);var Ce=r(he,2);rs(Ce,{size:10,class:"project-chevron"}),t(be);var He=r(be,2);{var St=ft=>{var ut=Vi(),ht=J(ut),Fe=r(ht,2),It=n(Fe),Lt=r(n(It),2),aa=n(Lt,!0);t(Lt),t(It);var ca=r(It,2);{var vt=Ye=>{var h=Fi(),k=n(h),m=r(n(k)),a=n(m,!0);t(m),We(),t(k);var o=r(k,4),f=n(o),O=r(f,2);t(o),t(h),D(()=>X(a,e(z))),$("click",f,we),$("click",O,pe),d(Ye,h)},Ze=Ye=>{var h=qi(),k=J(h);yt(k,5,p,Ot,(O,_e)=>{var ze=Wi();let T;var A=n(ze);let B;var Je=r(A,2),Me=n(Je,!0);t(Je);var Ae=r(Je,2);{var Ne=gt=>{var Mt=Gi();d(gt,Mt)};M(Ae,gt=>{v()?.name===e(_e).name&>(Ne)})}var At=r(Ae,2);{var Gt=gt=>{var Mt=Ki(),bt=n(Mt);is(bt,{size:12}),t(Mt),$("click",Mt,Zt=>{Zt.stopPropagation(),se(e(_e).name)}),d(gt,Mt)};M(At,gt=>{p().length>1&>(Gt)})}t(ze),D(()=>{T=Rt(ze,1,"dropdown-item svelte-11yu8dz",null,T,{active:v()?.name===e(_e).name}),B=Rt(A,1,"dropdown-item-dot svelte-11yu8dz",null,B,{"dot-active":v()?.name===e(_e).name}),X(Me,e(_e).name)}),$("click",ze,()=>y(e(_e))),d(O,ze)}),t(k);var m=r(k,2),a=n(m);Jt(a);var o=r(a,2),f=n(o);os(f,{size:14}),t(o),t(m),D(O=>o.disabled=O,[()=>!e(me).trim()||e(tt)]),$("keydown",a,O=>O.key==="Enter"&&Le()),la(a,()=>e(me),O=>u(me,O)),$("click",o,Le),d(Ye,h)};M(ca,Ye=>{e(z)?Ye(vt):Ye(Ze,!1)})}t(Fe),D(()=>X(aa,p().length)),$("click",ht,()=>{u(le,!1),u(z,null)}),$("keydown",ht,()=>{}),d(ft,ut)};M(He,ft=>{e(le)&&ft(St)})}t(j);var Vt=r(j,2);{let ft=dt(()=>K()?"Save Pipeline (unsaved changes)":"Save Pipeline");Na(Vt,{get text(){return e(ft)},shortcut:"Cmd+S",description:"Save the current pipeline graph to this project",children:(ut,ht)=>{var Fe=Yi();let It;var Lt=n(Fe);xi(Lt,{size:14});var aa=r(Lt,2);{var ca=vt=>{var Ze=Zi();d(vt,Ze)};M(aa,vt=>{K()&&vt(ca)})}t(Fe),D(()=>It=Rt(Fe,1,"btn-save svelte-11yu8dz",null,It,{"has-changes":K()})),$("click",Fe,G),d(ut,Fe)},$$slots:{default:!0}})}D(()=>X(Ue,v()?.name??"No project")),$("click",be,ye),d(_,P)};M(Ht,_=>{L()||_(Ft)})}t(lt);var ta=r(lt,4),at=n(ta);{var W=_=>{var P=so(),U=J(P);Na(U,{text:"Run Pipeline",description:"Execute the pipeline with an optional input prompt",children:(he,Ue)=>{var Ce=eo();let He;var St=n(Ce);{var Vt=ut=>{var ht=Ji(),Fe=J(ht),It=n(Fe);kn(It,{size:14}),t(Fe),We(4),d(ut,ht)},ft=ut=>{var ht=Qi(),Fe=J(ht);Gn(Fe,{size:14}),We(2),d(ut,ht)};M(St,ut=>{e(Q)?ut(Vt):ut(ft,!1)})}t(Ce),D(()=>{He=Rt(Ce,1,"btn-run svelte-11yu8dz",null,He,{"btn-run-active":e(Q)}),Ce.disabled=e(q)}),$("click",Ce,je),d(he,Ce)},$$slots:{default:!0}});var j=r(U,2);Na(j,{text:"Debug",description:"Run the pipeline in debug mode with step-by-step node execution",children:(he,Ue)=>{var Ce=ao();let He;var St=n(Ce);qs(St,{size:16});var Vt=r(St,2);{var ft=ut=>{var ht=to();d(ut,ht)};M(Vt,ut=>{e(Z)&&ut(ft)})}t(Ce),D(()=>{He=Rt(Ce,1,"btn-icon svelte-11yu8dz",null,He,{"btn-debug-active":e(Z)}),Ce.disabled=e(q)}),$("click",Ce,nt),d(he,Ce)},$$slots:{default:!0}});var be=r(j,2);{let he=dt(()=>e(Se)==="running"?"Stop Runtime":e(Se)==="starting"?"Starting...":e(Se)==="error"?"Runtime Error":"Start Runtime"),Ue=dt(()=>e(Se)==="running"?"Stop background processes (queue consumers, schedulers)":e(Se)==="starting"?"Runtime is initialising queue consumers and schedulers":e(Se)==="error"?"The runtime encountered an error — click to retry":"Start background processes for queue triggers, schedules, and live API serving");Na(be,{get text(){return e(he)},get description(){return e(Ue)},children:(Ce,He)=>{var St=no();let Vt;var ft=n(St);let ut;var ht=r(ft,2);Si(ht,{size:13}),t(St),D(()=>{Vt=Rt(St,1,"btn-runtime svelte-11yu8dz",null,Vt,{"runtime-running":e(Se)==="running","runtime-error":e(Se)==="error","runtime-starting":e(Se)==="starting"}),St.disabled=e(Oe),ut=Rt(ft,1,"runtime-dot svelte-11yu8dz",null,ut,{"rt-running":e(Se)==="running","rt-stopped":e(Se)==="stopped","rt-error":e(Se)==="error","rt-starting":e(Se)==="starting"})}),$("click",St,st),d(Ce,St)},$$slots:{default:!0}})}We(2),d(_,P)};M(at,_=>{L()||_(W)})}var oe=r(at,2);{var ge=_=>{Na(_,{text:"Share & Expose",description:"Create a public tunnel URL to share your studio with others via Cloudflare",children:(P,U)=>{var j=ro(),be=n(j);ns(be,{size:16}),t(j),$("click",j,()=>u(ne,!0)),d(P,j)},$$slots:{default:!0}})};M(oe,_=>{L()||_(ge)})}var w=r(oe,2);Na(w,{text:"Settings",description:"Configure API keys, model defaults, and studio preferences",children:(_,P)=>{var U=io(),j=n(U);ss(j,{size:16}),t(U),$("click",U,()=>sn.set(!0)),d(_,U)},$$slots:{default:!0}});var C=r(w,2);{var ce=_=>{Na(_,{text:"The Architect",shortcut:"Cmd+/",description:"Toggle the AI assistant sidebar — describe what you want to build and The Architect will design it",children:(P,U)=>{var j=oo();let be;var he=n(j);ki(he,{size:16}),t(j),D(()=>be=Rt(j,1,"btn-icon svelte-11yu8dz",null,be,{"architect-active":R()})),$("click",j,de),d(P,j)},$$slots:{default:!0}})};M(C,_=>{L()||_(ce)})}t(ta),t(Nt);var fe=r(Nt,2);Bi(fe,{get open(){return e(ne)},onclose:()=>u(ne,!1)});var Ee=r(fe,2);{var ke=_=>{var P=lo(),U=n(P),j=r(n(U),4);En(j),et(j,"rows",4);var be=r(j,2),he=n(be),Ue=r(he,2),Ce=n(Ue);Gn(Ce,{size:14}),We(),t(Ue),t(be),t(U),t(P),$("click",P,()=>u(F,!1)),$("keydown",P,He=>He.key==="Escape"&&u(F,!1)),$("click",U,He=>He.stopPropagation()),$("keydown",U,()=>{}),$("keydown",j,He=>{He.key==="Enter"&&(He.metaKey||He.ctrlKey)&&Be()}),la(j,()=>e($e),He=>u($e,He)),$("click",he,()=>u(F,!1)),$("click",Ue,Be),d(_,P)};M(Ee,_=>{e(F)&&_(ke)})}d(s,rt),Aa(),te()}Ra(["click","keydown"]);function vo(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M3 15h18"}]];wt(s,xt({name:"panel-bottom"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function po(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M15 3v18"}]];wt(s,xt({name:"panel-right"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function go(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"m18 16 4-4-4-4"}],["path",{d:"m6 8-4 4 4 4"}],["path",{d:"m14.5 4-5 16"}]];wt(s,xt({name:"code-xml"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}var fo=g('
    No matching commands
    '),ho=g(' '),bo=g(''),_o=g('
    ',1),mo=g('
    ');function yo(s,i){Sa(i,!0);const l=()=>zt(es,"$commandPaletteOpen",c),[c,b]=Ca(),x=[{id:"nav-construct",label:"Go to Construct",category:"Navigation",icon:ii,action:()=>qa("/construct")},{id:"nav-evaluate",label:"Go to Evaluate",category:"Navigation",icon:Ls,action:()=>qa("/evaluate")},{id:"nav-experiments",label:"Go to Experiments",category:"Navigation",icon:Ir,action:()=>qa("/experiments")},{id:"nav-deploy",label:"Go to Deploy",category:"Navigation",icon:Pr,action:()=>qa("/deploy")},{id:"nav-monitor",label:"Go to Monitor",category:"Navigation",icon:Lr,action:()=>qa("/monitor")},{id:"nav-files",label:"Go to Files",category:"Navigation",icon:Dr,action:()=>qa("/files")},{id:"node-input",label:"Add Input Node",category:"Add Node",icon:jr,action:()=>ma("input","Input")},{id:"node-output",label:"Add Output Node",category:"Add Node",icon:Br,action:()=>ma("output","Output")},{id:"node-agent",label:"Add Agent Node",category:"Add Node",icon:fn,action:()=>ma("agent","Agent")},{id:"node-tool",label:"Add Tool Node",category:"Add Node",icon:Ds,action:()=>ma("tool","Tool")},{id:"node-reasoning",label:"Add Reasoning Node",category:"Add Node",icon:Hs,action:()=>ma("reasoning","Reasoning")},{id:"node-condition",label:"Add Condition Node",category:"Add Node",icon:Ur,action:()=>ma("condition","Condition")},{id:"node-memory",label:"Add Memory Node",category:"Add Node",icon:Zn,action:()=>ma("memory","Memory")},{id:"node-validator",label:"Add Validator Node",category:"Add Node",icon:Hr,action:()=>ma("validator","Validator")},{id:"node-code",label:"Add Code Node",category:"Add Node",icon:Fr,action:()=>ma("custom_code","Code")},{id:"node-fanout",label:"Add Fan Out Node",category:"Add Node",icon:Gr,action:()=>ma("fan_out","Fan Out")},{id:"node-fanin",label:"Add Fan In Node",category:"Add Node",icon:Kr,action:()=>ma("fan_in","Fan In")},{id:"open-settings",label:"Open Settings",category:"Settings",icon:ss,action:()=>sn.set(!0),shortcut:"⌘,"},{id:"pipeline-run",label:"Run Pipeline",category:"Pipeline Actions",icon:Gn,action:()=>Vs(Ka())},{id:"pipeline-debug",label:"Debug Pipeline",category:"Pipeline Actions",icon:qs,action:()=>cs(Ka())},{id:"view-bottom-panel",label:"Toggle Bottom Panel",category:"View",icon:vo,action:()=>un.update(z=>!z)},{id:"view-right-panel",label:"Toggle Right Panel",category:"View",icon:po,action:()=>gi.update(z=>!z)},{id:"view-tab-console",label:"Switch to Console Tab",category:"View",icon:Fn,action:()=>{un.set(!0),Pn.set("console")}},{id:"view-tab-code",label:"Switch to Code Tab",category:"View",icon:go,action:()=>{un.set(!0),Pn.set("code")}},{id:"view-tab-timeline",label:"Switch to Timeline Tab",category:"View",icon:Wr,action:()=>{un.set(!0),Pn.set("timeline")}},{id:"view-tab-chat",label:"Toggle AI Assistant Sidebar",category:"View",icon:Kn,action:()=>{Wa.update(z=>!z)}}];let v=ie(""),p=ie(0),K=ie(null);function R(z,ne){let F=0,$e=0,ye=-1;for(let Le=0;Le=0&&($e+=Le-ye-1),ye=Le,F++);return F===ne.length?$e:-1}let N=dt(()=>{if(!e(v).trim())return x;const z=e(v).toLowerCase(),ne=x.map(F=>{const $e=R(F.label.toLowerCase(),z),ye=R(F.category.toLowerCase(),z),Le=$e>=0&&ye>=0?Math.min($e,ye):Math.max($e,ye);return{cmd:F,score:Le}}).filter(F=>F.score>=0);return ne.sort((F,$e)=>F.score-$e.score),ne.map(F=>F.cmd)}),te=dt(()=>{const z=[];let ne=0;const F=new Map,$e=[];for(const ye of e(N))F.has(ye.category)||(F.set(ye.category,[]),$e.push(ye.category)),F.get(ye.category).push({...ye,globalIndex:ne}),ne++;for(const ye of $e)z.push({category:ye,items:F.get(ye)});return z});Ta(()=>{e(p)>=e(N).length&&u(p,Math.max(0,e(N).length-1),!0)}),Ta(()=>{l()&&(u(v,""),u(p,0),queueMicrotask(()=>e(K)?.focus()))});function L(){es.set(!1)}function Q(z){L(),queueMicrotask(()=>z.action())}function Z(z){if(z.key==="Escape"){z.preventDefault(),L();return}if(z.key==="ArrowDown"){z.preventDefault(),u(p,(e(p)+1)%e(N).length),q();return}if(z.key==="ArrowUp"){z.preventDefault(),u(p,(e(p)-1+e(N).length)%e(N).length),q();return}if(z.key==="Enter"){z.preventDefault();const ne=e(N)[e(p)];ne&&Q(ne);return}}function q(){queueMicrotask(()=>{const z=e(N)[e(p)];z&&document.getElementById(`cmd-item-${z.id}`)?.scrollIntoView({block:"nearest"})})}function V(z){z.target===z.currentTarget&&L()}var le=qe(),me=J(le);{var tt=z=>{var ne=mo(),F=n(ne),$e=n(F),ye=n($e);Yn(ye,{size:16});var Le=r(ye,2);Jt(Le),hn(Le,G=>u(K,G),()=>e(K)),We(2),t($e);var y=r($e,2),se=n(y);{var pe=G=>{var je=fo();d(G,je)},we=G=>{var je=qe(),Be=J(je);yt(Be,17,()=>e(te),Ot,(nt,de)=>{var Se=_o(),Oe=J(Se),st=n(Oe,!0);t(Oe);var rt=r(Oe,2);yt(rt,17,()=>e(de).items,Ot,(Nt,lt)=>{var pt=bo();let Ht;var Ft=n(pt),ta=n(Ft);tn(ta,()=>e(lt).icon,(w,C)=>{C(w,{size:16})}),t(Ft);var at=r(Ft,2),W=n(at,!0);t(at);var oe=r(at,2);{var ge=w=>{var C=ho(),ce=n(C,!0);t(C),D(()=>X(ce,e(lt).shortcut)),d(w,C)};M(oe,w=>{e(lt).shortcut&&w(ge)})}t(pt),D(()=>{et(pt,"id",`cmd-item-${e(lt).id??""}`),Ht=Rt(pt,1,"command-palette-item svelte-1g6akjj",null,Ht,{selected:e(lt).globalIndex===e(p)}),et(pt,"aria-selected",e(lt).globalIndex===e(p)),X(W,e(lt).label)}),$("click",pt,()=>Q(e(lt))),as("mouseenter",pt,()=>{u(p,e(lt).globalIndex,!0)}),d(Nt,pt)}),D(()=>X(st,e(de).category)),d(nt,Se)}),d(G,je)};M(se,G=>{e(N).length===0?G(pe):G(we,!1)})}t(y),We(2),t(F),t(ne),D(()=>et(Le,"aria-activedescendant",e(N).length>0?`cmd-item-${e(N)[e(p)]?.id}`:void 0)),$("click",ne,V),$("keydown",Le,Z),la(Le,()=>e(v),G=>u(v,G)),d(z,ne)};M(me,z=>{l()&&z(tt)})}d(s,le),Aa(),b()}Ra(["click","keydown"]);function wo(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M10 8h.01"}],["path",{d:"M12 12h.01"}],["path",{d:"M14 8h.01"}],["path",{d:"M16 12h.01"}],["path",{d:"M18 8h.01"}],["path",{d:"M6 8h.01"}],["path",{d:"M7 16h10"}],["path",{d:"M8 12h.01"}],["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2"}]];wt(s,xt({name:"keyboard"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}var Eo=g('+'),ko=g(' ',1),xo=g('
    '),So=g('
    '),Ao=g('
    ');function $o(s,i){Sa(i,!1);const l=()=>zt(ts,"$shortcutsModalOpen",c),[c,b]=Ca(),v=typeof navigator<"u"&&/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"⌘":"Ctrl",p=[{category:"General",shortcuts:[{keys:`${v} + K`,description:"Open command palette"},{keys:`${v} + ,`,description:"Open settings"},{keys:`${v} + /`,description:"Toggle AI assistant"},{keys:"?",description:"Show keyboard shortcuts"},{keys:"Esc",description:"Close modal / palette"}]},{category:"Pipeline",shortcuts:[{keys:`${v} + Enter`,description:"Run pipeline"},{keys:`${v} + Shift + D`,description:"Toggle debug mode"}]},{category:"Canvas",shortcuts:[{keys:"Delete / Backspace",description:"Remove selected node"},{keys:`${v} + D`,description:"Duplicate selected node"},{keys:"Space (hold)",description:"Pan canvas"},{keys:`${v} + +`,description:"Zoom in"},{keys:`${v} + -`,description:"Zoom out"}]}];function K(){ts.set(!1)}function R(Z){Z.target===Z.currentTarget&&K()}function N(Z){Z.key==="Escape"&&(Z.preventDefault(),K())}Ws();var te=qe(),L=J(te);{var Q=Z=>{var q=Ao(),V=n(q),le=n(V),me=n(le),tt=n(me);wo(tt,{size:18}),We(2),t(me),We(2),t(le);var z=r(le,2);yt(z,5,()=>p,Ot,(ne,F)=>{var $e=So(),ye=n($e),Le=n(ye,!0);t(ye);var y=r(ye,2);yt(y,1,()=>e(F).shortcuts,Ot,(se,pe)=>{var we=xo(),G=n(we),je=n(G,!0);t(G);var Be=r(G,2);yt(Be,5,()=>e(pe).keys.split(" + "),Ot,(nt,de,Se)=>{var Oe=ko(),st=J(Oe);{var rt=pt=>{var Ht=Eo();d(pt,Ht)};M(st,pt=>{Se>0&&pt(rt)})}var Nt=r(st,2),lt=n(Nt,!0);t(Nt),D(pt=>X(lt,pt),[()=>e(de).trim()]),d(nt,Oe)}),t(Be),t(we),D(()=>X(je,e(pe).description)),d(se,we)}),t($e),D(()=>X(Le,e(F).category)),d(ne,$e)}),t(z),t(V),t(q),$("click",q,R),$("keydown",q,N),d(Z,q)};M(L,Z=>{l()&&Z(Q)})}d(s,te),Aa(),b()}Ra(["click","keydown"]);function Ys(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"}],["circle",{cx:"12",cy:"7",r:"4"}]];wt(s,xt({name:"user"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function No(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor"}]];wt(s,xt({name:"key-round"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Es(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M12 20v2"}],["path",{d:"M12 2v2"}],["path",{d:"M17 20v2"}],["path",{d:"M17 2v2"}],["path",{d:"M2 12h2"}],["path",{d:"M2 17h2"}],["path",{d:"M2 7h2"}],["path",{d:"M20 12h2"}],["path",{d:"M20 17h2"}],["path",{d:"M20 7h2"}],["path",{d:"M7 20v2"}],["path",{d:"M7 2v2"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1"}]];wt(s,xt({name:"cpu"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Ln(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"}],["path",{d:"m2 2 20 20"}]];wt(s,xt({name:"eye-off"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function To(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M10.5 3 8 9l4 13 4-13-2.5-6"}],["path",{d:"M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z"}],["path",{d:"M2 9h20"}]];wt(s,xt({name:"gem"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Mo(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M12.8 19.6A2 2 0 1 0 14 16H2"}],["path",{d:"M17.5 8a2.5 2.5 0 1 1 2 4H2"}],["path",{d:"M9.8 4.4A2 2 0 1 1 11 8H2"}]];wt(s,xt({name:"wind"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Ro(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"m10.065 12.493-6.18 1.318a.934.934 0 0 1-1.108-.702l-.537-2.15a1.07 1.07 0 0 1 .691-1.265l13.504-4.44"}],["path",{d:"m13.56 11.747 4.332-.924"}],["path",{d:"m16 21-3.105-6.21"}],["path",{d:"M16.485 5.94a2 2 0 0 1 1.455-2.425l1.09-.272a1 1 0 0 1 1.212.727l1.515 6.06a1 1 0 0 1-.727 1.213l-1.09.272a2 2 0 0 1-2.425-1.455z"}],["path",{d:"m6.158 8.633 1.114 4.456"}],["path",{d:"m8 21 3.105-6.21"}],["circle",{cx:"12",cy:"13",r:"2"}]];wt(s,xt({name:"telescope"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Co(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17"}]];wt(s,xt({name:"layers"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Oo(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"}]];wt(s,xt({name:"cloud"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function ks(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18"}]];wt(s,xt({name:"server"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Xs(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21"}]];wt(s,xt({name:"monitor"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}var zo=g(' '),Io=g(''),Po=g(' Saved'),Lo=g('
    The Architect speaks with measured authority and philosophical precision. He will address you by name and guide you through the design of your pipeline.
    '),Do=g('
    A friendly, helpful AI assistant that guides you through building pipelines.
    '),jo=g(`

    Your Information

    The Architect and Oracle use this to personalise interactions.

    Assistant Personality

    Choose the AI assistant's persona. "The Architect" uses a philosophical, - Matrix-inspired personality. Any other name uses a standard helpful assistant.

    `,1),Bo=g(' Active'),Uo=g('
    '),Ho=g('
    '),Fo=g('

    Configure API keys for your LLM providers. Keys are stored locally and never sent to external services.

    ',1),Go=g(' Active'),Ko=g('
    '),Wo=g('
    '),qo=g(''),Vo=g(''),Zo=g('
    ',1),Yo=g('
    No service connections configured yet. Click "Add Service" to get started.
    '),Xo=g("
    "),Jo=g(''),Qo=g(''),el=g('
    '),tl=g(''),al=g('
    '),nl=g('
    '),sl=g('
    '),rl=g('

    Configure credentials for pipeline tools. These enable search, database, and messaging capabilities in your pipelines.

    Service Connections

    Manage external service connections for databases, queues, and third-party APIs.

    ',1),il=g('

    Default Model

    This model is used for new agent nodes and The Architect. You can override per-node.

    Generation Parameters

    Control the creativity and reliability of model outputs.

    Precise Creative

    Number of retry attempts if a model call fails.

    ',1),ol=g('

    Firefly Agentic Studio

    A visual IDE for building, testing, and deploying AI agent pipelines.

    Version 0.1.0-alpha
    Framework Firefly Framework GenAI
    Backend FastAPI + Python 3.11+
    Frontend SvelteKit 5 + TypeScript
    License Apache 2.0

    Keyboard Shortcuts

    Save Pipeline Cmd + S
    Toggle Architect Cmd + /
    Command Palette Cmd + K
    Close Modal / Panel ESC
    ',1),ll=g('

    ');function cl(s,i){Sa(i,!0);const l=()=>zt(sn,"$settingsModalOpen",b),c=()=>zt(Fs,"$settingsData",b),[b,x]=Ca(),v=[{id:"profile",label:"Profile",icon:Ys,desc:"Your name, role, and assistant personality"},{id:"providers",label:"API Keys",icon:No,desc:"Configure LLM provider credentials"},{id:"tools",label:"Tool Credentials",icon:Ds,desc:"Search, database, and messaging keys"},{id:"models",label:"Model Defaults",icon:qr,desc:"Default model, temperature, and retries"},{id:"about",label:"About",icon:js,desc:"Version and system information"}],p=[{label:"Search",icon:Yn,color:"#f59e0b",fields:[{key:"serpapi_api_key",label:"SerpAPI Key",placeholder:"API key"},{key:"serper_api_key",label:"Serper Key",placeholder:"API key"},{key:"tavily_api_key",label:"Tavily Key",placeholder:"tvly-..."}]},{label:"Data",icon:Zn,color:"#3b82f6",fields:[{key:"database_url",label:"Database URL",placeholder:"postgresql://..."},{key:"redis_url",label:"Redis URL",placeholder:"redis://localhost:6379"}]},{label:"Messaging",icon:Kn,color:"#8b5cf6",fields:[{key:"slack_bot_token",label:"Slack Bot Token",placeholder:"xoxb-..."},{key:"telegram_bot_token",label:"Telegram Bot Token",placeholder:"Bot token"}]}],K=[{id:"openai",label:"OpenAI",icon:Xn,color:"#10a37f",fields:[{key:"openai_api_key",label:"API Key",placeholder:"sk-..."}]},{id:"anthropic",label:"Anthropic",icon:Hs,color:"#d4a574",fields:[{key:"anthropic_api_key",label:"API Key",placeholder:"sk-ant-..."}]},{id:"google",label:"Google Gemini",icon:To,color:"#4285f4",fields:[{key:"google_api_key",label:"API Key",placeholder:"AIza..."}]},{id:"groq",label:"Groq",icon:_n,color:"#f55036",fields:[{key:"groq_api_key",label:"API Key",placeholder:"gsk_..."}]},{id:"mistral",label:"Mistral",icon:Mo,color:"#ff7000",fields:[{key:"mistral_api_key",label:"API Key",placeholder:"API key"}]},{id:"deepseek",label:"DeepSeek",icon:Ro,color:"#4d6bfe",fields:[{key:"deepseek_api_key",label:"API Key",placeholder:"API key"}]},{id:"cohere",label:"Cohere",icon:Co,color:"#39594d",fields:[{key:"cohere_api_key",label:"API Key",placeholder:"API key"}]},{id:"azure",label:"Azure OpenAI",icon:Oo,color:"#0078d4",fields:[{key:"azure_openai_api_key",label:"API Key",placeholder:"API key"},{key:"azure_openai_endpoint",label:"Endpoint URL",placeholder:"https://your-resource.openai.azure.com/"}]},{id:"bedrock",label:"Amazon Bedrock",icon:ks,color:"#ff9900",fields:[{key:"aws_access_key_id",label:"Access Key ID",placeholder:"AKIA..."},{key:"aws_secret_access_key",label:"Secret Access Key",placeholder:"Secret key"},{key:"aws_default_region",label:"Region",placeholder:"us-east-1"}]},{id:"ollama",label:"Ollama (Local)",icon:Xs,color:"#ffffff",fields:[{key:"ollama_base_url",label:"Base URL",placeholder:"http://localhost:11434"}]}],R=[{type:"serpapi",label:"SerpAPI",category:"Search",fields:["api_key"]},{type:"serper",label:"Serper",category:"Search",fields:["api_key"]},{type:"tavily",label:"Tavily",category:"Search",fields:["api_key"]},{type:"postgresql",label:"PostgreSQL",category:"Databases",fields:["host","port","username","password","database","ssl_enabled"],defaultPort:5432},{type:"mysql",label:"MySQL",category:"Databases",fields:["host","port","username","password","database","ssl_enabled"],defaultPort:3306},{type:"sqlite",label:"SQLite",category:"Databases",fields:["database"]},{type:"mongodb",label:"MongoDB",category:"Databases",fields:["host","port","username","password","database","connection_url"],defaultPort:27017},{type:"redis",label:"Redis",category:"Queues",fields:["host","port","password","database","ssl_enabled"],defaultPort:6379},{type:"rabbitmq",label:"RabbitMQ",category:"Queues",fields:["host","port","username","password","ssl_enabled"],defaultPort:5672},{type:"slack",label:"Slack",category:"Messaging",fields:["token"]},{type:"telegram",label:"Telegram",category:"Messaging",fields:["token"]},{type:"discord",label:"Discord",category:"Messaging",fields:["token"]}],N={Search:"#f59e0b",Databases:"#3b82f6",Queues:"#10b981",Messaging:"#8b5cf6"},te={api_key:"API Key",host:"Host",port:"Port",username:"Username",password:"Password",database:"Database",ssl_enabled:"SSL Enabled",connection_url:"Connection URL",token:"Token"};let L=ie(ka([])),Q=ie(!1),Z=ie(null),q=ie(null),V=ie(null),le=ie(!1);async function me(){try{u(L,await Qt.settings.services.list(),!0)}catch{u(L,[],!0)}u(le,!0)}async function tt(w){const C={id:globalThis.crypto.randomUUID(),service_type:w.type,label:w.label};"defaultPort"in w&&(C.port=w.defaultPort);try{const ce=await Qt.settings.services.add(C);await me(),u(Q,!1)}catch{}}async function z(w){u(V,w,!0);try{await Qt.settings.services.delete(w),u(L,e(L).filter(C=>C.id!==w),!0)}catch{}finally{u(V,null)}}async function ne(w){u(Z,w,!0),u(q,null);try{const C=await Qt.settings.services.test(w);u(q,{id:w,status:C.status,message:C.message},!0)}catch(C){u(q,{id:w,status:"error",message:C.message||"Connection failed"},!0)}finally{u(Z,null)}}async function F(w,C,ce){const fe=e(L).find(ke=>ke.id===w);if(!fe)return;const Ee={...fe,[C]:ce};try{await Qt.settings.services.add(Ee),u(L,e(L).map(ke=>ke.id===w?Ee:ke),!0)}catch{}}function $e(){const w={};for(const C of e(L)){const fe=R.find(Ee=>Ee.type===C.service_type)?.category??"Other";w[fe]||(w[fe]=[]),w[fe].push(C)}return Object.entries(w).map(([C,ce])=>({category:C,items:ce}))}function ye(w){return R.find(C=>C.type===w)?.fields??[]}const Le=[...new Set(R.map(w=>w.category))];let y=ie("profile"),se=ie(!1),pe=ie(!1),we=ie(ka({})),G=ie("openai:gpt-4o"),je=ie(.7),Be=ie(3),nt=ie(""),de=ie(""),Se=ie(""),Oe=ie("The Architect"),st=ie(ka({})),rt=ie(ka(new Set));function Nt(w){const C=new Set(e(rt));C.has(w)?C.delete(w):C.add(w),u(rt,C,!0)}Ta(()=>{l()&&c()&&(u(we,{},!0),u(st,{},!0),u(G,c().model_defaults.default_model,!0),u(je,c().model_defaults.temperature,!0),u(Be,c().model_defaults.retries,!0),c().user_profile&&(u(nt,c().user_profile.name||"",!0),u(de,c().user_profile.role||"",!0),u(Se,c().user_profile.context||"",!0),u(Oe,c().user_profile.assistant_name||"The Architect",!0)),u(y,"profile"),u(pe,!1),u(rt,new Set,!0),u(le,!1),u(L,[],!0))}),Ta(()=>{e(y)==="tools"&&!e(le)&&me()});function lt(w){if(!c())return!1;const C=c().credentials[w];return C!=null}function pt(w){if(!c())return!1;const C=c().tool_credentials;if(!C)return!1;const ce=C[w];return ce!=null&&ce!==""}let Ht=dt(()=>c()?K.filter(w=>w.fields.every(C=>lt(C.key))).length:0);function Ft(){sn.set(!1)}async function ta(){u(se,!0);try{const w={};for(const[Ee,ke]of Object.entries(e(we)))ke.trim()&&(w[Ee]=ke.trim());const C={name:e(nt).trim(),role:e(de).trim(),context:e(Se).trim(),assistant_name:e(Oe).trim()||"The Architect"},ce={};for(const[Ee,ke]of Object.entries(e(st)))ce[Ee]=ke.trim()||null;const fe=K.some(Ee=>Ee.fields.every(ke=>lt(ke.key)))||Object.values(w).some(Ee=>Ee!==null);await Jn(Object.keys(w).length>0?w:null,{default_model:e(G),temperature:e(je),retries:e(Be)},fe,C,Object.keys(ce).length>0?ce:null),u(pe,!0),setTimeout(()=>{u(pe,!1)},2e3)}catch{}finally{u(se,!1)}}function at(w){w.key==="Escape"&&(w.preventDefault(),Ft())}var W=qe(),oe=J(W);{var ge=w=>{var C=ll(),ce=n(C),fe=n(ce),Ee=n(fe),ke=n(Ee);ss(ke,{size:18}),We(2),t(Ee);var _=r(Ee,2);yt(_,21,()=>v,Ot,(Ze,Ye)=>{var h=Io();let k;var m=n(h);tn(m,()=>e(Ye).icon,(A,B)=>{B(A,{size:16})});var a=r(m,2),o=n(a),f=n(o,!0);t(o);var O=r(o,2),_e=n(O,!0);t(O),t(a);var ze=r(a,2);{var T=A=>{var B=zo(),Je=n(B);t(B),D(()=>X(Je,`${e(Ht)??""}/${K.length??""}`)),d(A,B)};M(ze,A=>{e(Ye).id==="providers"&&A(T)})}t(h),D(()=>{k=Rt(h,1,"sidebar-item svelte-1hvu725",null,k,{active:e(y)===e(Ye).id}),X(f,e(Ye).label),X(_e,e(Ye).desc)}),$("click",h,()=>u(y,e(Ye).id,!0)),d(Ze,h)}),t(_);var P=r(_,2),U=n(P),j=n(U);mn(j,{size:14}),We(4),t(U),t(P),t(fe);var be=r(fe,2),he=n(be),Ue=n(he),Ce=n(Ue,!0);t(Ue);var He=r(Ue,2),St=n(He);{var Vt=Ze=>{var Ye=Po(),h=n(Ye);ha(h,{size:14}),We(),t(Ye),d(Ze,Ye)};M(St,Ze=>{e(pe)&&Ze(Vt)})}var ft=r(St,2),ut=n(ft,!0);t(ft),t(He),t(he);var ht=r(he,2),Fe=n(ht);{var It=Ze=>{var Ye=jo(),h=J(Ye),k=r(n(h),4),m=n(k),a=r(n(m),2);Jt(a),t(m);var o=r(m,2),f=r(n(o),2);Jt(f),t(o),t(k);var O=r(k,2),_e=r(n(O),2);En(_e),t(O),t(h);var ze=r(h,2),T=r(n(ze),4),A=r(n(T),2);Jt(A),t(T);var B=r(T,2);{var Je=Ae=>{var Ne=Lo(),At=n(Ne);Es(At,{size:14}),We(2),t(Ne),d(Ae,Ne)},Me=Ae=>{var Ne=Do(),At=n(Ne);Es(At,{size:14}),We(2),t(Ne),d(Ae,Ne)};M(B,Ae=>{e(Oe)==="The Architect"?Ae(Je):Ae(Me,!1)})}t(ze),la(a,()=>e(nt),Ae=>u(nt,Ae)),la(f,()=>e(de),Ae=>u(de,Ae)),la(_e,()=>e(Se),Ae=>u(Se,Ae)),la(A,()=>e(Oe),Ae=>u(Oe,Ae)),d(Ze,Ye)},Lt=Ze=>{var Ye=Fo(),h=r(J(Ye),2);yt(h,21,()=>K,Ot,(k,m)=>{const a=dt(()=>e(m).fields.every(Ae=>lt(Ae.key)));var o=Ho();let f;var O=n(o),_e=n(O),ze=n(_e);tn(ze,()=>e(m).icon,(Ae,Ne)=>{Ne(Ae,{size:15})}),t(_e);var T=r(_e,2),A=n(T,!0);t(T);var B=r(T,2);{var Je=Ae=>{var Ne=Bo(),At=n(Ne);ha(At,{size:10}),We(),t(Ne),d(Ae,Ne)};M(B,Ae=>{e(a)&&Ae(Je)})}t(O);var Me=r(O,2);yt(Me,21,()=>e(m).fields,Ot,(Ae,Ne)=>{var At=Uo(),Gt=n(At),gt=n(Gt,!0);t(Gt);var Mt=r(Gt,2),bt=n(Mt);Jt(bt);var Zt=r(bt,2),oa=n(Zt);{var ea=Ct=>{Ln(Ct,{size:14})},Ge=dt(()=>e(rt).has(e(Ne).key)),Wt=Ct=>{On(Ct,{size:14})};M(oa,Ct=>{e(Ge)?Ct(ea):Ct(Wt,!1)})}t(Zt),t(Mt),t(At),D((Ct,_t)=>{et(Gt,"for",`settings-${e(Ne).key??""}`),X(gt,e(Ne).label),et(bt,"id",`settings-${e(Ne).key??""}`),et(bt,"type",Ct),et(bt,"placeholder",_t),Va(bt,e(we)[e(Ne).key]??"")},[()=>e(rt).has(e(Ne).key)?"text":"password",()=>lt(e(Ne).key)?"•••••••• (configured)":e(Ne).placeholder]),$("input",bt,Ct=>{e(we)[e(Ne).key]=Ct.target.value}),$("click",Zt,()=>Nt(e(Ne).key)),d(Ae,At)}),t(Me),t(o),D(()=>{f=Rt(o,1,"provider-card svelte-1hvu725",null,f,{configured:e(a)}),Fa(_e,`--provider-color: ${e(m).color??""}`),X(A,e(m).label)}),d(k,o)}),t(h),d(Ze,Ye)},aa=Ze=>{var Ye=rl(),h=r(J(Ye),2);yt(h,21,()=>p,Ot,(Ae,Ne)=>{const At=dt(()=>e(Ne).fields.some(_t=>pt(_t.key)));var Gt=Wo();let gt;var Mt=n(Gt),bt=n(Mt),Zt=n(bt);tn(Zt,()=>e(Ne).icon,(_t,$t)=>{$t(_t,{size:15})}),t(bt);var oa=r(bt,2),ea=n(oa,!0);t(oa);var Ge=r(oa,2);{var Wt=_t=>{var $t=Go(),Yt=n($t);ha(Yt,{size:10}),We(),t($t),d(_t,$t)};M(Ge,_t=>{e(At)&&_t(Wt)})}t(Mt);var Ct=r(Mt,2);yt(Ct,21,()=>e(Ne).fields,Ot,(_t,$t)=>{var Yt=Ko(),Xt=n(Yt),Oa=n(Xt,!0);t(Xt);var va=r(Xt,2),na=n(va);Jt(na);var pa=r(na,2),E=n(pa);{var re=H=>{Ln(H,{size:14})},Ie=dt(()=>e(rt).has(e($t).key)),ct=H=>{On(H,{size:14})};M(E,H=>{e(Ie)?H(re):H(ct,!1)})}t(pa),t(va),t(Yt),D((H,De)=>{et(Xt,"for",`settings-tool-${e($t).key??""}`),X(Oa,e($t).label),et(na,"id",`settings-tool-${e($t).key??""}`),et(na,"type",H),et(na,"placeholder",De),Va(na,e(st)[e($t).key]??"")},[()=>e(rt).has(e($t).key)?"text":"password",()=>pt(e($t).key)?"•••••••• (configured)":e($t).placeholder]),$("input",na,H=>{e(st)[e($t).key]=H.target.value}),$("click",pa,()=>Nt(e($t).key)),d(_t,Yt)}),t(Ct),t(Gt),D(()=>{gt=Rt(Gt,1,"provider-card svelte-1hvu725",null,gt,{configured:e(At)}),Fa(bt,`--provider-color: ${e(Ne).color??""}`),X(ea,e(Ne).label)}),d(Ae,Gt)}),t(h);var k=r(h,2),m=n(k),a=n(m),o=n(a);ns(o,{size:16}),We(2),t(a),We(2),t(m);var f=r(m,2),O=n(f),_e=n(O);os(_e,{size:14});var ze=r(_e,4);rs(ze,{size:12}),t(O);var T=r(O,2);{var A=Ae=>{var Ne=Zo(),At=J(Ne),Gt=r(At,2);yt(Gt,21,()=>Le,Ot,(gt,Mt)=>{var bt=Vo(),Zt=n(bt),oa=n(Zt,!0);t(Zt);var ea=r(Zt,2);yt(ea,17,()=>R.filter(Ge=>Ge.category===e(Mt)),Ot,(Ge,Wt)=>{var Ct=qo(),_t=n(Ct),$t=r(_t);t(Ct),D(()=>{Fa(_t,`background: ${N[e(Mt)]??"#888"??""}`),X($t,` ${e(Wt).label??""}`)}),$("click",Ct,()=>tt(e(Wt))),d(Ge,Ct)}),t(bt),D(()=>X(oa,e(Mt))),d(gt,bt)}),t(Gt),$("click",At,()=>u(Q,!1)),$("keydown",At,()=>{}),d(Ae,Ne)};M(T,Ae=>{e(Q)&&Ae(A)})}t(f);var B=r(f,2);{var Je=Ae=>{var Ne=Yo();d(Ae,Ne)},Me=Ae=>{var Ne=qe(),At=J(Ne);yt(At,17,$e,Ot,(Gt,gt)=>{var Mt=sl(),bt=n(Mt),Zt=n(bt,!0);t(bt);var oa=r(bt,2);yt(oa,21,()=>e(gt).items,ea=>ea.id,(ea,Ge)=>{const Wt=dt(()=>R.find(Qe=>Qe.type===e(Ge).service_type)),Ct=dt(()=>ye(e(Ge).service_type));var _t=nl(),$t=n(_t),Yt=n($t),Xt=n(Yt);{var Oa=Qe=>{Zn(Qe,{size:14})},va=Qe=>{ks(Qe,{size:14})},na=Qe=>{Kn(Qe,{size:14})},pa=Qe=>{Yn(Qe,{size:14})};M(Xt,Qe=>{e(gt).category==="Databases"?Qe(Oa):e(gt).category==="Queues"?Qe(va,1):e(gt).category==="Messaging"?Qe(na,2):Qe(pa,!1)})}t(Yt);var E=r(Yt,2),re=n(E,!0);t(E);var Ie=r(E,2),ct=n(Ie,!0);t(Ie);var H=r(Ie,2),De=n(H),it=n(De);{var Pe=Qe=>{kn(Qe,{size:13,class:"spinning"})},ue=Qe=>{Ls(Qe,{size:13})};M(it,Qe=>{e(Z)===e(Ge).id?Qe(Pe):Qe(ue,!1)})}t(De);var ot=r(De,2),Dt=n(ot);is(Dt,{size:13}),t(ot),t(H),t($t);var qt=r($t,2);{var ga=Qe=>{var Re=Xo();let sa;var jt=n(Re,!0);t(Re),D(()=>{sa=Rt(Re,1,"test-result-banner svelte-1hvu725",null,sa,{"test-success":e(q).status==="ok","test-error":e(q).status!=="ok"}),X(jt,e(q).message)}),d(Qe,Re)};M(qt,Qe=>{e(q)&&e(q).id===e(Ge).id&&Qe(ga)})}var ba=r(qt,2);yt(ba,21,()=>e(Ct),Ot,(Qe,Re)=>{var sa=al(),jt=n(sa),fa=n(jt,!0);t(jt);var Kt=r(jt,2);{var ya=Xe=>{var ee=Jo(),ae=n(ee);Jt(ae),We(2),t(ee),D(()=>{et(ae,"id",`svc-${e(Ge).id??""}-${e(Re)??""}`),oi(ae,e(Ge)[e(Re)]??!1)}),$("change",ae,Ke=>F(e(Ge).id,e(Re),Ke.target.checked)),d(Xe,ee)},ra=Xe=>{var ee=Qo();Jt(ee),D(ae=>{et(ee,"id",`svc-${e(Ge).id??""}-${e(Re)??""}`),et(ee,"placeholder",ae),Va(ee,e(Ge)[e(Re)]??"")},[()=>String(e(Wt)&&"defaultPort"in e(Wt)?e(Wt).defaultPort:"")]),$("change",ee,ae=>F(e(Ge).id,e(Re),parseInt(ae.target.value)||null)),d(Xe,ee)},ve=Xe=>{var ee=el(),ae=n(ee);Jt(ae);var Ke=r(ae,2),Ve=n(Ke);{var mt=Y=>{Ln(Y,{size:14})},S=dt(()=>e(rt).has(`svc-${e(Ge).id}-${e(Re)}`)),I=Y=>{On(Y,{size:14})};M(Ve,Y=>{e(S)?Y(mt):Y(I,!1)})}t(Ke),t(ee),D(Y=>{et(ae,"id",`svc-${e(Ge).id??""}-${e(Re)??""}`),et(ae,"type",Y),et(ae,"placeholder",te[e(Re)]??e(Re)),Va(ae,e(Ge)[e(Re)]??"")},[()=>e(rt).has(`svc-${e(Ge).id}-${e(Re)}`)?"text":"password"]),$("change",ae,Y=>F(e(Ge).id,e(Re),Y.target.value)),$("click",Ke,()=>Nt(`svc-${e(Ge).id}-${e(Re)}`)),d(Xe,ee)},ua=Xe=>{var ee=tl();Jt(ee),D(()=>{et(ee,"id",`svc-${e(Ge).id??""}-${e(Re)??""}`),et(ee,"placeholder",te[e(Re)]??e(Re)),Va(ee,e(Ge)[e(Re)]??"")}),$("change",ee,ae=>F(e(Ge).id,e(Re),ae.target.value)),d(Xe,ee)};M(Kt,Xe=>{e(Re)==="ssl_enabled"?Xe(ya):e(Re)==="port"?Xe(ra,1):e(Re)==="password"||e(Re)==="api_key"||e(Re)==="token"?Xe(ve,2):Xe(ua,!1)})}t(sa),D(()=>{et(jt,"for",`svc-${e(Ge).id??""}-${e(Re)??""}`),X(fa,te[e(Re)]??e(Re))}),d(Qe,sa)}),t(ba),t(_t),D(()=>{Fa(Yt,`background: ${N[e(gt).category]??"#888"??""}20; color: ${N[e(gt).category]??"#888"??""}`),X(re,e(Ge).label||e(Wt)?.label||e(Ge).service_type),X(ct,e(Ge).service_type),De.disabled=e(Z)===e(Ge).id,ot.disabled=e(V)===e(Ge).id}),$("click",De,()=>ne(e(Ge).id)),$("click",ot,()=>z(e(Ge).id)),d(ea,_t)}),t(oa),t(Mt),D(()=>{Fa(bt,`color: ${N[e(gt).category]??"#888"??""}`),X(Zt,e(gt).category)}),d(Gt,Mt)}),d(Ae,Ne)};M(B,Ae=>{e(L).length===0&&e(le)?Ae(Je):Ae(Me,!1)})}t(k),$("click",O,()=>u(Q,!e(Q))),d(Ze,Ye)},ca=Ze=>{var Ye=il(),h=J(Ye),k=r(n(h),4),m=r(n(k),2);Bs(m,{placeholder:"Select or type a model...",get value(){return e(G)},set value(B){u(G,B,!0)}}),t(k),t(h);var a=r(h,2),o=r(n(a),4),f=r(n(o),2),O=n(f);Jt(O);var _e=r(O,2),ze=n(_e,!0);t(_e),t(f),We(2),t(o);var T=r(o,2),A=r(n(T),4);Jt(A),t(T),t(a),D(B=>X(ze,B),[()=>e(je).toFixed(2)]),la(O,()=>e(je),B=>u(je,B)),la(A,()=>e(Be),B=>u(Be,B)),d(Ze,Ye)},vt=Ze=>{var Ye=ol();We(2),d(Ze,Ye)};M(Fe,Ze=>{e(y)==="profile"?Ze(It):e(y)==="providers"?Ze(Lt,1):e(y)==="tools"?Ze(aa,2):e(y)==="models"?Ze(ca,3):e(y)==="about"&&Ze(vt,4)})}t(ht),t(be),t(ce),t(C),D(Ze=>{X(Ce,Ze),ft.disabled=e(se),X(ut,e(se)?"Saving...":"Save Changes")},[()=>v.find(Ze=>Ze.id===e(y))?.label]),$("keydown",C,at),$("click",U,Ft),$("click",ft,ta),d(w,C)};M(oe,w=>{l()&&w(ge)})}d(s,W),Aa(),x()}Ra(["keydown","click","input","change"]);function dl(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4"}],["path",{d:"m21 2-9.6 9.6"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5"}]];wt(s,xt({name:"key"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}var ul=g(''),vl=g("
    "),pl=g('
    '),gl=g(`

    Welcome to Firefly Agentic Studio

    Build, test, and deploy AI agent pipelines visually. - We'll help you configure your AI providers in just a few steps.

    Visual pipeline builder
    Multi-provider AI support
    Local credential storage
    `),fl=g(''),hl=g(''),bl=g('

    Select at least one provider to continue

    '),_l=g('

    Choose your AI providers

    Select the providers you have API keys for. You can add more later in Settings.

    ',1),ml=g('
    '),yl=g('
    '),wl=g('

    Enter your API keys

    Credentials are stored locally at ~/.firefly-studio/settings.json and never sent to our servers.

    ',1),El=g('This will be used for all new agent nodes'),kl=g('

    Configure defaults

    Choose the default model for new agent nodes. You can override per-node later.

    ',1),xl=g('

    Personalise your experience

    Tell us about yourself so the AI assistant can address you properly and provide contextual help.

    ',1),Sl=g(`

    as default. The Architect and The Oracle are ready. - The Architect will build your pipelines, and The Oracle will guide your decisions.

    You can change these anytime from the Settings menu.

    `),Al=g(' ',1),$l=g('
    ',1),Nl=g(''),Tl=g(''),Ml=g(' ',1),Rl=g('
    ');function Cl(s,i){Sa(i,!0);const l=()=>zt(bn,"$firstStartWizardOpen",c),[c,b]=Ca(),x=[{id:"openai",label:"OpenAI",description:"GPT-4.1, o3, o4-mini",fields:[{key:"openai_api_key",label:"API Key",placeholder:"sk-..."}]},{id:"anthropic",label:"Anthropic",description:"Claude Sonnet, Opus, Haiku",fields:[{key:"anthropic_api_key",label:"API Key",placeholder:"sk-ant-..."}]},{id:"google",label:"Google Gemini",description:"Gemini 2.5 Pro & Flash",fields:[{key:"google_api_key",label:"API Key",placeholder:"AIza..."}]},{id:"groq",label:"Groq",description:"Fast Llama & Mixtral",fields:[{key:"groq_api_key",label:"API Key",placeholder:"gsk_..."}]},{id:"mistral",label:"Mistral",description:"Mistral Large & Codestral",fields:[{key:"mistral_api_key",label:"API Key",placeholder:"API key"}]},{id:"deepseek",label:"DeepSeek",description:"DeepSeek Chat & Reasoner",fields:[{key:"deepseek_api_key",label:"API Key",placeholder:"API key"}]},{id:"cohere",label:"Cohere",description:"Command R & R+",fields:[{key:"cohere_api_key",label:"API Key",placeholder:"API key"}]},{id:"azure",label:"Azure OpenAI",description:"Azure-hosted OpenAI models",fields:[{key:"azure_openai_api_key",label:"API Key",placeholder:"API key"},{key:"azure_openai_endpoint",label:"Endpoint URL",placeholder:"https://your-resource.openai.azure.com/"}]},{id:"bedrock",label:"Amazon Bedrock",description:"AWS-hosted foundation models",fields:[{key:"aws_access_key_id",label:"Access Key ID",placeholder:"AKIA..."},{key:"aws_secret_access_key",label:"Secret Access Key",placeholder:"Secret key"},{key:"aws_default_region",label:"Region",placeholder:"us-east-1"}]},{id:"ollama",label:"Ollama",description:"Local open-source models",fields:[{key:"ollama_base_url",label:"Base URL",placeholder:"http://localhost:11434"}]}],v=[{label:"Welcome"},{label:"Providers"},{label:"API Keys"},{label:"Defaults"},{label:"Profile"},{label:"Ready"}];let p=ie(0),K=ie(ka(new Set)),R=ka({}),N=ie(""),te=ie(.7),L=ie(3),Q=ie(!1),Z=ie(""),q=ie(""),V=ie("");const le=v.length;function me(){if(e(N))return;const we=["anthropic","openai","google","groq","mistral","deepseek","cohere","azure","bedrock","ollama"];for(const G of we)if(e(K).has(G)){const je=Vr(G);if(je){u(N,je.id,!0);return}}}function tt(we){const G=new Set(e(K));G.has(we)?G.delete(we):G.add(we),u(K,G,!0)}function z(){return x.filter(we=>e(K).has(we.id))}function ne(){e(p)===1&&e(K).size===0||e(p)0&&Un(p,-1)}async function $e(){u(Q,!0);try{const we={};for(const[je,Be]of Object.entries(R))Be.trim()&&(we[je]=Be.trim());const G={};e(Z).trim()&&(G.name=e(Z).trim()),e(q).trim()&&(G.role=e(q).trim()),e(V).trim()&&(G.context=e(V).trim()),G.assistant_name="The Architect",await Jn(Object.keys(we).length>0?we:null,{default_model:e(N),temperature:e(te),retries:e(L)},!0,Object.keys(G).length>0?G:null),u(p,le-1)}catch{}finally{u(Q,!1)}}async function ye(){try{await Jn(null,null,!0)}catch{}bn.set(!1)}async function Le(){await Gs(),bn.set(!1)}var y=qe(),se=J(y);{var pe=we=>{var G=Rl(),je=n(G),Be=n(je);yt(Be,21,()=>v,Ot,(W,oe,ge)=>{var w=pl();let C;var ce=n(w),fe=n(ce);{var Ee=U=>{ha(U,{size:10})},ke=U=>{var j=ul();j.textContent=ge+1,d(U,j)};M(fe,U=>{ge{var j=vl();let be;D(()=>be=Rt(j,1,"wizard-step-line svelte-tj3wu",null,be,{filled:ge{geC=Rt(w,1,"wizard-step-indicator svelte-tj3wu",null,C,{active:ge===e(p),completed:ge{var oe=gl(),ge=n(oe),w=r(ge,6),C=n(w),ce=n(C);_n(ce,{size:16}),We(2),t(C);var fe=r(C,2),Ee=n(fe);Xn(Ee,{size:16}),We(2),t(fe);var ke=r(fe,2),_=n(ke);dl(_,{size:16}),We(2),t(ke),t(w),t(oe),D(()=>et(ge,"src",ls)),d(W,oe)},Oe=W=>{var oe=_l(),ge=r(J(oe),4);yt(ge,21,()=>x,Ot,(ce,fe)=>{var Ee=hl();let ke;var _=n(Ee);{var P=Ce=>{var He=fl(),St=n(He);ha(St,{size:10}),t(He),d(Ce,He)},U=dt(()=>e(K).has(e(fe).id));M(_,Ce=>{e(U)&&Ce(P)})}var j=r(_,2),be=n(j,!0);t(j);var he=r(j,2),Ue=n(he,!0);t(he),t(Ee),D(Ce=>{ke=Rt(Ee,1,"wizard-provider-card svelte-tj3wu",null,ke,Ce),X(be,e(fe).label),X(Ue,e(fe).description)},[()=>({selected:e(K).has(e(fe).id)})]),$("click",Ee,()=>tt(e(fe).id)),d(ce,Ee)}),t(ge);var w=r(ge,2);{var C=ce=>{var fe=bl();d(ce,fe)};M(w,ce=>{e(K).size===0&&ce(C)})}d(W,oe)},st=W=>{var oe=wl(),ge=r(J(oe),4);yt(ge,21,z,Ot,(w,C)=>{var ce=yl(),fe=n(ce),Ee=n(fe,!0);t(fe);var ke=r(fe,2);yt(ke,17,()=>e(C).fields,Ot,(_,P)=>{var U=ml(),j=n(U),be=n(j,!0);t(j);var he=r(j,2);Jt(he),t(U),D(()=>{et(j,"for",`wizard-${e(P).key??""}`),X(be,e(P).label),et(he,"id",`wizard-${e(P).key??""}`),et(he,"placeholder",e(P).placeholder),Va(he,R[e(P).key]??"")}),$("input",he,Ue=>{R[e(P).key]=Ue.target.value}),d(_,U)}),t(ce),D(()=>X(Ee,e(C).label)),d(w,ce)}),t(ge),d(W,oe)},rt=W=>{var oe=kl(),ge=r(J(oe),4),w=n(ge),C=r(n(w),2);Bs(C,{placeholder:"Select or type a model...",get value(){return e(N)},set value(Ue){u(N,Ue,!0)}});var ce=r(C,2);{var fe=Ue=>{var Ce=El();d(Ue,Ce)};M(ce,Ue=>{e(N)&&Ue(fe)})}t(w);var Ee=r(w,2),ke=n(Ee),_=r(n(ke),2),P=n(_);Jt(P);var U=r(P,2),j=n(U,!0);t(U),t(_),t(ke);var be=r(ke,2),he=r(n(be),2);Jt(he),t(be),t(Ee),t(ge),D(Ue=>X(j,Ue),[()=>e(te).toFixed(2)]),la(P,()=>e(te),Ue=>u(te,Ue)),la(he,()=>e(L),Ue=>u(L,Ue)),d(W,oe)},Nt=W=>{var oe=xl(),ge=r(J(oe),4),w=n(ge),C=n(w),ce=r(n(C),2);Jt(ce),t(C);var fe=r(C,2),Ee=r(n(fe),2);Jt(Ee),t(fe),t(w);var ke=r(w,2),_=r(n(ke),2);En(_),t(ke),t(ge),la(ce,()=>e(Z),P=>u(Z,P)),la(Ee,()=>e(q),P=>u(q,P)),la(_,()=>e(V),P=>u(V,P)),d(W,oe)},lt=W=>{var oe=Sl(),ge=n(oe),w=n(ge);ha(w,{size:32}),t(ge);var C=r(ge,2),ce=n(C);{var fe=j=>{var be=Hn();D(()=>X(be,`Welcome, ${e(Z)??""}!`)),d(j,be)},Ee=j=>{var be=Hn("You're all set!");d(j,be)};M(ce,j=>{e(Z)?j(fe):j(Ee,!1)})}t(C);var ke=r(C,2),_=n(ke),P=r(_),U=n(P,!0);t(P),We(5),t(ke),We(2),t(oe),D(j=>{X(_,`Your ${e(K).size??""} provider${e(K).size!==1?"s are":" is"} configured - with `),X(U,j)},[()=>e(N)?e(N).split(":")[1]:"default model"]),d(W,oe)};M(de,W=>{e(p)===0?W(Se):e(p)===1?W(Oe,1):e(p)===2?W(st,2):e(p)===3?W(rt,3):e(p)===4?W(Nt,4):W(lt,!1)})}t(nt);var pt=r(nt,2),Ht=n(pt);{var Ft=W=>{var oe=Al(),ge=J(oe),w=r(ge,2);$("click",ge,ye),$("click",w,ne),d(W,oe)},ta=W=>{var oe=$l(),ge=r(J(oe),2),w=n(ge);Xn(w,{size:14}),We(),t(ge),$("click",ge,Le),d(W,oe)},at=W=>{var oe=Ml(),ge=J(oe),w=n(ge),C=r(w,2);t(ge);var ce=r(ge,2);{var fe=ke=>{var _=Nl(),P=n(_,!0);t(_),D(()=>{_.disabled=e(Q)||!e(N),X(P,e(Q)?"Saving...":"Finish Setup")}),$("click",_,$e),d(ke,_)},Ee=ke=>{var _=Tl();D(()=>_.disabled=e(p)===1&&e(K).size===0),$("click",_,ne),d(ke,_)};M(ce,ke=>{e(p)===4?ke(fe):ke(Ee,!1)})}$("click",w,ye),$("click",C,F),d(W,oe)};M(Ht,W=>{e(p)===0?W(Ft):e(p)===le-1?W(ta,1):W(at,!1)})}t(pt),t(je),t(G),d(we,G)};M(se,we=>{l()&&we(pe)})}d(s,y),Aa(),b()}Ra(["click","input"]);var Ol=g(''),zl=g('
    ');function Il(s,i){Sa(i,!1);const l=()=>zt(Zr,"$toasts",c),[c,b]=Ca(),x={success:ha,error:Yr,warning:Ps,info:js},v={success:"var(--color-success)",error:"var(--color-error)",warning:"var(--color-warning)",info:"var(--color-info)"};Ws();var p=qe(),K=J(p);{var R=N=>{var te=zl();yt(te,5,l,L=>L.id,(L,Q)=>{var Z=Ol();let q;var V=n(Z),le=n(V);tn(le,()=>x[e(Q).type],(F,$e)=>{$e(F,{size:16})}),t(V);var me=r(V,2),tt=n(me,!0);t(me);var z=r(me,2),ne=n(z);mn(ne,{size:14}),t(z),t(Z),D(()=>{q=Fa(Z,"",q,{"--toast-color":v[e(Q).type]}),X(tt,e(Q).message)}),$("click",z,()=>Xr(e(Q).id)),Jr(3,Z,()=>Qr,()=>({y:16,duration:200})),d(L,Z)}),t(te),d(N,te)};M(K,N=>{l().length>0&&N(R)})}d(s,p),Aa(),b()}Ra(["click"]);function Pl(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"}],["circle",{cx:"12",cy:"13",r:"3"}]];wt(s,xt({name:"camera"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Ll(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}],["path",{d:"M8 13h2"}],["path",{d:"M14 13h2"}],["path",{d:"M8 17h2"}],["path",{d:"M14 17h2"}]];wt(s,xt({name:"file-spreadsheet"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Dl(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"}]];wt(s,xt({name:"moon"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function jl(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M9 3v18"}],["path",{d:"m16 15-3-3 3-3"}]];wt(s,xt({name:"panel-left-close"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Bl(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551"}]];wt(s,xt({name:"paperclip"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Ul(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["path",{d:"M2 3h20"}],["path",{d:"M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3"}],["path",{d:"m7 21 5-5 5 5"}]];wt(s,xt({name:"presentation"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Hl(s,i){const l=kt(i,["children","$$slots","$$events","$$legacy"]);const c=[["circle",{cx:"12",cy:"12",r:"4"}],["path",{d:"M12 2v2"}],["path",{d:"M12 20v2"}],["path",{d:"m4.93 4.93 1.41 1.41"}],["path",{d:"m17.66 17.66 1.41 1.41"}],["path",{d:"M2 12h2"}],["path",{d:"M20 12h2"}],["path",{d:"m6.34 17.66-1.41 1.41"}],["path",{d:"m19.07 4.93-1.41 1.41"}]];wt(s,xt({name:"sun"},()=>l,{get iconNode(){return c},children:(b,x)=>{var v=qe(),p=J(v);Et(p,i,"default",{}),d(b,v)},$$slots:{default:!0}}))}function Fl(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}var Dn,xs;function Gl(){if(xs)return Dn;xs=1;function s(a){return a instanceof Map?a.clear=a.delete=a.set=function(){throw new Error("map is read-only")}:a instanceof Set&&(a.add=a.clear=a.delete=function(){throw new Error("set is read-only")}),Object.freeze(a),Object.getOwnPropertyNames(a).forEach(o=>{const f=a[o],O=typeof f;(O==="object"||O==="function")&&!Object.isFrozen(f)&&s(f)}),a}class i{constructor(o){o.data===void 0&&(o.data={}),this.data=o.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function l(a){return a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function c(a,...o){const f=Object.create(null);for(const O in a)f[O]=a[O];return o.forEach(function(O){for(const _e in O)f[_e]=O[_e]}),f}const b="",x=a=>!!a.scope,v=(a,{prefix:o})=>{if(a.startsWith("language:"))return a.replace("language:","language-");if(a.includes(".")){const f=a.split(".");return[`${o}${f.shift()}`,...f.map((O,_e)=>`${O}${"_".repeat(_e+1)}`)].join(" ")}return`${o}${a}`};class p{constructor(o,f){this.buffer="",this.classPrefix=f.classPrefix,o.walk(this)}addText(o){this.buffer+=l(o)}openNode(o){if(!x(o))return;const f=v(o.scope,{prefix:this.classPrefix});this.span(f)}closeNode(o){x(o)&&(this.buffer+=b)}value(){return this.buffer}span(o){this.buffer+=``}}const K=(a={})=>{const o={children:[]};return Object.assign(o,a),o};class R{constructor(){this.rootNode=K(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(o){this.top.children.push(o)}openNode(o){const f=K({scope:o});this.add(f),this.stack.push(f)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(o){return this.constructor._walk(o,this.rootNode)}static _walk(o,f){return typeof f=="string"?o.addText(f):f.children&&(o.openNode(f),f.children.forEach(O=>this._walk(o,O)),o.closeNode(f)),o}static _collapse(o){typeof o!="string"&&o.children&&(o.children.every(f=>typeof f=="string")?o.children=[o.children.join("")]:o.children.forEach(f=>{R._collapse(f)}))}}class N extends R{constructor(o){super(),this.options=o}addText(o){o!==""&&this.add(o)}startScope(o){this.openNode(o)}endScope(){this.closeNode()}__addSublanguage(o,f){const O=o.root;f&&(O.scope=`language:${f}`),this.add(O)}toHTML(){return new p(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function te(a){return a?typeof a=="string"?a:a.source:null}function L(a){return q("(?=",a,")")}function Q(a){return q("(?:",a,")*")}function Z(a){return q("(?:",a,")?")}function q(...a){return a.map(f=>te(f)).join("")}function V(a){const o=a[a.length-1];return typeof o=="object"&&o.constructor===Object?(a.splice(a.length-1,1),o):{}}function le(...a){return"("+(V(a).capture?"":"?:")+a.map(O=>te(O)).join("|")+")"}function me(a){return new RegExp(a.toString()+"|").exec("").length-1}function tt(a,o){const f=a&&a.exec(o);return f&&f.index===0}const z=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function ne(a,{joinWith:o}){let f=0;return a.map(O=>{f+=1;const _e=f;let ze=te(O),T="";for(;ze.length>0;){const A=z.exec(ze);if(!A){T+=ze;break}T+=ze.substring(0,A.index),ze=ze.substring(A.index+A[0].length),A[0][0]==="\\"&&A[1]?T+="\\"+String(Number(A[1])+_e):(T+=A[0],A[0]==="("&&f++)}return T}).map(O=>`(${O})`).join(o)}const F=/\b\B/,$e="[a-zA-Z]\\w*",ye="[a-zA-Z_]\\w*",Le="\\b\\d+(\\.\\d+)?",y="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",se="\\b(0b[01]+)",pe="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",we=(a={})=>{const o=/^#![ ]*\//;return a.binary&&(a.begin=q(o,/.*\b/,a.binary,/\b.*/)),c({scope:"meta",begin:o,end:/$/,relevance:0,"on:begin":(f,O)=>{f.index!==0&&O.ignoreMatch()}},a)},G={begin:"\\\\[\\s\\S]",relevance:0},je={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[G]},Be={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[G]},nt={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},de=function(a,o,f={}){const O=c({scope:"comment",begin:a,end:o,contains:[]},f);O.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const _e=le("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return O.contains.push({begin:q(/[ ]+/,"(",_e,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),O},Se=de("//","$"),Oe=de("/\\*","\\*/"),st=de("#","$"),rt={scope:"number",begin:Le,relevance:0},Nt={scope:"number",begin:y,relevance:0},lt={scope:"number",begin:se,relevance:0},pt={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[G,{begin:/\[/,end:/\]/,relevance:0,contains:[G]}]},Ht={scope:"title",begin:$e,relevance:0},Ft={scope:"title",begin:ye,relevance:0},ta={begin:"\\.\\s*"+ye,relevance:0};var W=Object.freeze({__proto__:null,APOS_STRING_MODE:je,BACKSLASH_ESCAPE:G,BINARY_NUMBER_MODE:lt,BINARY_NUMBER_RE:se,COMMENT:de,C_BLOCK_COMMENT_MODE:Oe,C_LINE_COMMENT_MODE:Se,C_NUMBER_MODE:Nt,C_NUMBER_RE:y,END_SAME_AS_BEGIN:function(a){return Object.assign(a,{"on:begin":(o,f)=>{f.data._beginMatch=o[1]},"on:end":(o,f)=>{f.data._beginMatch!==o[1]&&f.ignoreMatch()}})},HASH_COMMENT_MODE:st,IDENT_RE:$e,MATCH_NOTHING_RE:F,METHOD_GUARD:ta,NUMBER_MODE:rt,NUMBER_RE:Le,PHRASAL_WORDS_MODE:nt,QUOTE_STRING_MODE:Be,REGEXP_MODE:pt,RE_STARTERS_RE:pe,SHEBANG:we,TITLE_MODE:Ht,UNDERSCORE_IDENT_RE:ye,UNDERSCORE_TITLE_MODE:Ft});function oe(a,o){a.input[a.index-1]==="."&&o.ignoreMatch()}function ge(a,o){a.className!==void 0&&(a.scope=a.className,delete a.className)}function w(a,o){o&&a.beginKeywords&&(a.begin="\\b("+a.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",a.__beforeBegin=oe,a.keywords=a.keywords||a.beginKeywords,delete a.beginKeywords,a.relevance===void 0&&(a.relevance=0))}function C(a,o){Array.isArray(a.illegal)&&(a.illegal=le(...a.illegal))}function ce(a,o){if(a.match){if(a.begin||a.end)throw new Error("begin & end are not supported with match");a.begin=a.match,delete a.match}}function fe(a,o){a.relevance===void 0&&(a.relevance=1)}const Ee=(a,o)=>{if(!a.beforeMatch)return;if(a.starts)throw new Error("beforeMatch cannot be used with starts");const f=Object.assign({},a);Object.keys(a).forEach(O=>{delete a[O]}),a.keywords=f.keywords,a.begin=q(f.beforeMatch,L(f.begin)),a.starts={relevance:0,contains:[Object.assign(f,{endsParent:!0})]},a.relevance=0,delete f.beforeMatch},ke=["of","and","for","in","not","or","if","then","parent","list","value"],_="keyword";function P(a,o,f=_){const O=Object.create(null);return typeof a=="string"?_e(f,a.split(" ")):Array.isArray(a)?_e(f,a):Object.keys(a).forEach(function(ze){Object.assign(O,P(a[ze],o,ze))}),O;function _e(ze,T){o&&(T=T.map(A=>A.toLowerCase())),T.forEach(function(A){const B=A.split("|");O[B[0]]=[ze,U(B[0],B[1])]})}}function U(a,o){return o?Number(o):j(a)?0:1}function j(a){return ke.includes(a.toLowerCase())}const be={},he=a=>{console.error(a)},Ue=(a,...o)=>{console.log(`WARN: ${a}`,...o)},Ce=(a,o)=>{be[`${a}/${o}`]||(console.log(`Deprecated as of ${a}. ${o}`),be[`${a}/${o}`]=!0)},He=new Error;function St(a,o,{key:f}){let O=0;const _e=a[f],ze={},T={};for(let A=1;A<=o.length;A++)T[A+O]=_e[A],ze[A+O]=!0,O+=me(o[A-1]);a[f]=T,a[f]._emit=ze,a[f]._multi=!0}function Vt(a){if(Array.isArray(a.begin)){if(a.skip||a.excludeBegin||a.returnBegin)throw he("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),He;if(typeof a.beginScope!="object"||a.beginScope===null)throw he("beginScope must be object"),He;St(a,a.begin,{key:"beginScope"}),a.begin=ne(a.begin,{joinWith:""})}}function ft(a){if(Array.isArray(a.end)){if(a.skip||a.excludeEnd||a.returnEnd)throw he("skip, excludeEnd, returnEnd not compatible with endScope: {}"),He;if(typeof a.endScope!="object"||a.endScope===null)throw he("endScope must be object"),He;St(a,a.end,{key:"endScope"}),a.end=ne(a.end,{joinWith:""})}}function ut(a){a.scope&&typeof a.scope=="object"&&a.scope!==null&&(a.beginScope=a.scope,delete a.scope)}function ht(a){ut(a),typeof a.beginScope=="string"&&(a.beginScope={_wrap:a.beginScope}),typeof a.endScope=="string"&&(a.endScope={_wrap:a.endScope}),Vt(a),ft(a)}function Fe(a){function o(T,A){return new RegExp(te(T),"m"+(a.case_insensitive?"i":"")+(a.unicodeRegex?"u":"")+(A?"g":""))}class f{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(A,B){B.position=this.position++,this.matchIndexes[this.matchAt]=B,this.regexes.push([B,A]),this.matchAt+=me(A)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const A=this.regexes.map(B=>B[1]);this.matcherRe=o(ne(A,{joinWith:"|"}),!0),this.lastIndex=0}exec(A){this.matcherRe.lastIndex=this.lastIndex;const B=this.matcherRe.exec(A);if(!B)return null;const Je=B.findIndex((Ae,Ne)=>Ne>0&&Ae!==void 0),Me=this.matchIndexes[Je];return B.splice(0,Je),Object.assign(B,Me)}}class O{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(A){if(this.multiRegexes[A])return this.multiRegexes[A];const B=new f;return this.rules.slice(A).forEach(([Je,Me])=>B.addRule(Je,Me)),B.compile(),this.multiRegexes[A]=B,B}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(A,B){this.rules.push([A,B]),B.type==="begin"&&this.count++}exec(A){const B=this.getMatcher(this.regexIndex);B.lastIndex=this.lastIndex;let Je=B.exec(A);if(this.resumingScanAtSamePosition()&&!(Je&&Je.index===this.lastIndex)){const Me=this.getMatcher(0);Me.lastIndex=this.lastIndex+1,Je=Me.exec(A)}return Je&&(this.regexIndex+=Je.position+1,this.regexIndex===this.count&&this.considerAll()),Je}}function _e(T){const A=new O;return T.contains.forEach(B=>A.addRule(B.begin,{rule:B,type:"begin"})),T.terminatorEnd&&A.addRule(T.terminatorEnd,{type:"end"}),T.illegal&&A.addRule(T.illegal,{type:"illegal"}),A}function ze(T,A){const B=T;if(T.isCompiled)return B;[ge,ce,ht,Ee].forEach(Me=>Me(T,A)),a.compilerExtensions.forEach(Me=>Me(T,A)),T.__beforeBegin=null,[w,C,fe].forEach(Me=>Me(T,A)),T.isCompiled=!0;let Je=null;return typeof T.keywords=="object"&&T.keywords.$pattern&&(T.keywords=Object.assign({},T.keywords),Je=T.keywords.$pattern,delete T.keywords.$pattern),Je=Je||/\w+/,T.keywords&&(T.keywords=P(T.keywords,a.case_insensitive)),B.keywordPatternRe=o(Je,!0),A&&(T.begin||(T.begin=/\B|\b/),B.beginRe=o(B.begin),!T.end&&!T.endsWithParent&&(T.end=/\B|\b/),T.end&&(B.endRe=o(B.end)),B.terminatorEnd=te(B.end)||"",T.endsWithParent&&A.terminatorEnd&&(B.terminatorEnd+=(T.end?"|":"")+A.terminatorEnd)),T.illegal&&(B.illegalRe=o(T.illegal)),T.contains||(T.contains=[]),T.contains=[].concat(...T.contains.map(function(Me){return Lt(Me==="self"?T:Me)})),T.contains.forEach(function(Me){ze(Me,B)}),T.starts&&ze(T.starts,A),B.matcher=_e(B),B}if(a.compilerExtensions||(a.compilerExtensions=[]),a.contains&&a.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return a.classNameAliases=c(a.classNameAliases||{}),ze(a)}function It(a){return a?a.endsWithParent||It(a.starts):!1}function Lt(a){return a.variants&&!a.cachedVariants&&(a.cachedVariants=a.variants.map(function(o){return c(a,{variants:null},o)})),a.cachedVariants?a.cachedVariants:It(a)?c(a,{starts:a.starts?c(a.starts):null}):Object.isFrozen(a)?c(a):a}var aa="11.11.1";class ca extends Error{constructor(o,f){super(o),this.name="HTMLInjectionError",this.html=f}}const vt=l,Ze=c,Ye=Symbol("nomatch"),h=7,k=function(a){const o=Object.create(null),f=Object.create(null),O=[];let _e=!0;const ze="Could not find the language '{}', did you forget to load/include a language module?",T={disableAutodetect:!0,name:"Plain text",contains:[]};let A={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:N};function B(E){return A.noHighlightRe.test(E)}function Je(E){let re=E.className+" ";re+=E.parentNode?E.parentNode.className:"";const Ie=A.languageDetectRe.exec(re);if(Ie){const ct=_t(Ie[1]);return ct||(Ue(ze.replace("{}",Ie[1])),Ue("Falling back to no-highlight mode for this block.",E)),ct?Ie[1]:"no-highlight"}return re.split(/\s+/).find(ct=>B(ct)||_t(ct))}function Me(E,re,Ie){let ct="",H="";typeof re=="object"?(ct=E,Ie=re.ignoreIllegals,H=re.language):(Ce("10.7.0","highlight(lang, code, ...args) has been deprecated."),Ce("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),H=E,ct=re),Ie===void 0&&(Ie=!0);const De={code:ct,language:H};na("before:highlight",De);const it=De.result?De.result:Ae(De.language,De.code,Ie);return it.code=De.code,na("after:highlight",it),it}function Ae(E,re,Ie,ct){const H=Object.create(null);function De(S,I){return S.keywords[I]}function it(){if(!ve.keywords){Xe.addText(ee);return}let S=0;ve.keywordPatternRe.lastIndex=0;let I=ve.keywordPatternRe.exec(ee),Y="";for(;I;){Y+=ee.substring(S,I.index);const Te=Kt.case_insensitive?I[0].toLowerCase():I[0],xe=De(ve,Te);if(xe){const[Bt,wa]=xe;if(Xe.addText(Y),Y="",H[Te]=(H[Te]||0)+1,H[Te]<=h&&(ae+=wa),Bt.startsWith("_"))Y+=I[0];else{const ja=Kt.classNameAliases[Bt]||Bt;ot(I[0],ja)}}else Y+=I[0];S=ve.keywordPatternRe.lastIndex,I=ve.keywordPatternRe.exec(ee)}Y+=ee.substring(S),Xe.addText(Y)}function Pe(){if(ee==="")return;let S=null;if(typeof ve.subLanguage=="string"){if(!o[ve.subLanguage]){Xe.addText(ee);return}S=Ae(ve.subLanguage,ee,!0,ua[ve.subLanguage]),ua[ve.subLanguage]=S._top}else S=At(ee,ve.subLanguage.length?ve.subLanguage:null);ve.relevance>0&&(ae+=S.relevance),Xe.__addSublanguage(S._emitter,S.language)}function ue(){ve.subLanguage!=null?Pe():it(),ee=""}function ot(S,I){S!==""&&(Xe.startScope(I),Xe.addText(S),Xe.endScope())}function Dt(S,I){let Y=1;const Te=I.length-1;for(;Y<=Te;){if(!S._emit[Y]){Y++;continue}const xe=Kt.classNameAliases[S[Y]]||S[Y],Bt=I[Y];xe?ot(Bt,xe):(ee=Bt,it(),ee=""),Y++}}function qt(S,I){return S.scope&&typeof S.scope=="string"&&Xe.openNode(Kt.classNameAliases[S.scope]||S.scope),S.beginScope&&(S.beginScope._wrap?(ot(ee,Kt.classNameAliases[S.beginScope._wrap]||S.beginScope._wrap),ee=""):S.beginScope._multi&&(Dt(S.beginScope,I),ee="")),ve=Object.create(S,{parent:{value:ve}}),ve}function ga(S,I,Y){let Te=tt(S.endRe,Y);if(Te){if(S["on:end"]){const xe=new i(S);S["on:end"](I,xe),xe.isMatchIgnored&&(Te=!1)}if(Te){for(;S.endsParent&&S.parent;)S=S.parent;return S}}if(S.endsWithParent)return ga(S.parent,I,Y)}function ba(S){return ve.matcher.regexIndex===0?(ee+=S[0],1):(mt=!0,0)}function Qe(S){const I=S[0],Y=S.rule,Te=new i(Y),xe=[Y.__beforeBegin,Y["on:begin"]];for(const Bt of xe)if(Bt&&(Bt(S,Te),Te.isMatchIgnored))return ba(I);return Y.skip?ee+=I:(Y.excludeBegin&&(ee+=I),ue(),!Y.returnBegin&&!Y.excludeBegin&&(ee=I)),qt(Y,S),Y.returnBegin?0:I.length}function Re(S){const I=S[0],Y=re.substring(S.index),Te=ga(ve,S,Y);if(!Te)return Ye;const xe=ve;ve.endScope&&ve.endScope._wrap?(ue(),ot(I,ve.endScope._wrap)):ve.endScope&&ve.endScope._multi?(ue(),Dt(ve.endScope,S)):xe.skip?ee+=I:(xe.returnEnd||xe.excludeEnd||(ee+=I),ue(),xe.excludeEnd&&(ee=I));do ve.scope&&Xe.closeNode(),!ve.skip&&!ve.subLanguage&&(ae+=ve.relevance),ve=ve.parent;while(ve!==Te.parent);return Te.starts&&qt(Te.starts,S),xe.returnEnd?0:I.length}function sa(){const S=[];for(let I=ve;I!==Kt;I=I.parent)I.scope&&S.unshift(I.scope);S.forEach(I=>Xe.openNode(I))}let jt={};function fa(S,I){const Y=I&&I[0];if(ee+=S,Y==null)return ue(),0;if(jt.type==="begin"&&I.type==="end"&&jt.index===I.index&&Y===""){if(ee+=re.slice(I.index,I.index+1),!_e){const Te=new Error(`0 width match regex (${E})`);throw Te.languageName=E,Te.badRule=jt.rule,Te}return 1}if(jt=I,I.type==="begin")return Qe(I);if(I.type==="illegal"&&!Ie){const Te=new Error('Illegal lexeme "'+Y+'" for mode "'+(ve.scope||"")+'"');throw Te.mode=ve,Te}else if(I.type==="end"){const Te=Re(I);if(Te!==Ye)return Te}if(I.type==="illegal"&&Y==="")return ee+=` -`,1;if(Ve>1e5&&Ve>I.index*3)throw new Error("potential infinite loop, way more iterations than matches");return ee+=Y,Y.length}const Kt=_t(E);if(!Kt)throw he(ze.replace("{}",E)),new Error('Unknown language: "'+E+'"');const ya=Fe(Kt);let ra="",ve=ct||ya;const ua={},Xe=new A.__emitter(A);sa();let ee="",ae=0,Ke=0,Ve=0,mt=!1;try{if(Kt.__emitTokens)Kt.__emitTokens(re,Xe);else{for(ve.matcher.considerAll();;){Ve++,mt?mt=!1:ve.matcher.considerAll(),ve.matcher.lastIndex=Ke;const S=ve.matcher.exec(re);if(!S)break;const I=re.substring(Ke,S.index),Y=fa(I,S);Ke=S.index+Y}fa(re.substring(Ke))}return Xe.finalize(),ra=Xe.toHTML(),{language:E,value:ra,relevance:ae,illegal:!1,_emitter:Xe,_top:ve}}catch(S){if(S.message&&S.message.includes("Illegal"))return{language:E,value:vt(re),illegal:!0,relevance:0,_illegalBy:{message:S.message,index:Ke,context:re.slice(Ke-100,Ke+100),mode:S.mode,resultSoFar:ra},_emitter:Xe};if(_e)return{language:E,value:vt(re),illegal:!1,relevance:0,errorRaised:S,_emitter:Xe,_top:ve};throw S}}function Ne(E){const re={value:vt(E),illegal:!1,relevance:0,_top:T,_emitter:new A.__emitter(A)};return re._emitter.addText(E),re}function At(E,re){re=re||A.languages||Object.keys(o);const Ie=Ne(E),ct=re.filter(_t).filter(Yt).map(ue=>Ae(ue,E,!1));ct.unshift(Ie);const H=ct.sort((ue,ot)=>{if(ue.relevance!==ot.relevance)return ot.relevance-ue.relevance;if(ue.language&&ot.language){if(_t(ue.language).supersetOf===ot.language)return 1;if(_t(ot.language).supersetOf===ue.language)return-1}return 0}),[De,it]=H,Pe=De;return Pe.secondBest=it,Pe}function Gt(E,re,Ie){const ct=re&&f[re]||Ie;E.classList.add("hljs"),E.classList.add(`language-${ct}`)}function gt(E){let re=null;const Ie=Je(E);if(B(Ie))return;if(na("before:highlightElement",{el:E,language:Ie}),E.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",E);return}if(E.children.length>0&&(A.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(E)),A.throwUnescapedHTML))throw new ca("One of your code blocks includes unescaped HTML.",E.innerHTML);re=E;const ct=re.textContent,H=Ie?Me(ct,{language:Ie,ignoreIllegals:!0}):At(ct);E.innerHTML=H.value,E.dataset.highlighted="yes",Gt(E,Ie,H.language),E.result={language:H.language,re:H.relevance,relevance:H.relevance},H.secondBest&&(E.secondBest={language:H.secondBest.language,relevance:H.secondBest.relevance}),na("after:highlightElement",{el:E,result:H,text:ct})}function Mt(E){A=Ze(A,E)}const bt=()=>{ea(),Ce("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function Zt(){ea(),Ce("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let oa=!1;function ea(){function E(){ea()}if(document.readyState==="loading"){oa||window.addEventListener("DOMContentLoaded",E,!1),oa=!0;return}document.querySelectorAll(A.cssSelector).forEach(gt)}function Ge(E,re){let Ie=null;try{Ie=re(a)}catch(ct){if(he("Language definition for '{}' could not be registered.".replace("{}",E)),_e)he(ct);else throw ct;Ie=T}Ie.name||(Ie.name=E),o[E]=Ie,Ie.rawDefinition=re.bind(null,a),Ie.aliases&&$t(Ie.aliases,{languageName:E})}function Wt(E){delete o[E];for(const re of Object.keys(f))f[re]===E&&delete f[re]}function Ct(){return Object.keys(o)}function _t(E){return E=(E||"").toLowerCase(),o[E]||o[f[E]]}function $t(E,{languageName:re}){typeof E=="string"&&(E=[E]),E.forEach(Ie=>{f[Ie.toLowerCase()]=re})}function Yt(E){const re=_t(E);return re&&!re.disableAutodetect}function Xt(E){E["before:highlightBlock"]&&!E["before:highlightElement"]&&(E["before:highlightElement"]=re=>{E["before:highlightBlock"](Object.assign({block:re.el},re))}),E["after:highlightBlock"]&&!E["after:highlightElement"]&&(E["after:highlightElement"]=re=>{E["after:highlightBlock"](Object.assign({block:re.el},re))})}function Oa(E){Xt(E),O.push(E)}function va(E){const re=O.indexOf(E);re!==-1&&O.splice(re,1)}function na(E,re){const Ie=E;O.forEach(function(ct){ct[Ie]&&ct[Ie](re)})}function pa(E){return Ce("10.7.0","highlightBlock will be removed entirely in v12.0"),Ce("10.7.0","Please use highlightElement now."),gt(E)}Object.assign(a,{highlight:Me,highlightAuto:At,highlightAll:ea,highlightElement:gt,highlightBlock:pa,configure:Mt,initHighlighting:bt,initHighlightingOnLoad:Zt,registerLanguage:Ge,unregisterLanguage:Wt,listLanguages:Ct,getLanguage:_t,registerAliases:$t,autoDetection:Yt,inherit:Ze,addPlugin:Oa,removePlugin:va}),a.debugMode=function(){_e=!1},a.safeMode=function(){_e=!0},a.versionString=aa,a.regex={concat:q,lookahead:L,either:le,optional:Z,anyNumberOfTimes:Q};for(const E in W)typeof W[E]=="object"&&s(W[E]);return Object.assign(a,W),a},m=k({});return m.newInstance=()=>k({}),Dn=m,m.HighlightJS=m,m.default=m,Dn}var Kl=Gl();const Ut=Fl(Kl),Ss="[A-Za-z$_][0-9A-Za-z$_]*",Wl=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],ql=["true","false","null","undefined","NaN","Infinity"],Js=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Qs=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],er=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Vl=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],Zl=[].concat(er,Js,Qs);function As(s){const i=s.regex,l=(de,{after:Se})=>{const Oe="",end:""},x=/<[A-Za-z0-9\\._:-]+\s*\/>/,v={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(de,Se)=>{const Oe=de[0].length+de.index,st=de.input[Oe];if(st==="<"||st===","){Se.ignoreMatch();return}st===">"&&(l(de,{after:Oe})||Se.ignoreMatch());let rt;const Nt=de.input.substring(Oe);if(rt=Nt.match(/^\s*=/)){Se.ignoreMatch();return}if((rt=Nt.match(/^\s+extends\s+/))&&rt.index===0){Se.ignoreMatch();return}}},p={$pattern:Ss,keyword:Wl,literal:ql,built_in:Zl,"variable.language":Vl},K="[0-9](_?[0-9])*",R=`\\.(${K})`,N="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",te={className:"number",variants:[{begin:`(\\b(${N})((${R})|\\.)?|(${R}))[eE][+-]?(${K})\\b`},{begin:`\\b(${N})\\b((${R})\\b|\\.)?|(${R})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},L={className:"subst",begin:"\\$\\{",end:"\\}",keywords:p,contains:[]},Q={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[s.BACKSLASH_ESCAPE,L],subLanguage:"xml"}},Z={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[s.BACKSLASH_ESCAPE,L],subLanguage:"css"}},q={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[s.BACKSLASH_ESCAPE,L],subLanguage:"graphql"}},V={className:"string",begin:"`",end:"`",contains:[s.BACKSLASH_ESCAPE,L]},me={className:"comment",variants:[s.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:c+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),s.C_BLOCK_COMMENT_MODE,s.C_LINE_COMMENT_MODE]},tt=[s.APOS_STRING_MODE,s.QUOTE_STRING_MODE,Q,Z,q,V,{match:/\$\d+/},te];L.contains=tt.concat({begin:/\{/,end:/\}/,keywords:p,contains:["self"].concat(tt)});const z=[].concat(me,L.contains),ne=z.concat([{begin:/(\s*)\(/,end:/\)/,keywords:p,contains:["self"].concat(z)}]),F={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:ne},$e={variants:[{match:[/class/,/\s+/,c,/\s+/,/extends/,/\s+/,i.concat(c,"(",i.concat(/\./,c),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,c],scope:{1:"keyword",3:"title.class"}}]},ye={relevance:0,match:i.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...Js,...Qs]}},Le={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},y={variants:[{match:[/function/,/\s+/,c,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[F],illegal:/%/},se={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function pe(de){return i.concat("(?!",de.join("|"),")")}const we={match:i.concat(/\b/,pe([...er,"super","import"].map(de=>`${de}\\s*\\(`)),c,i.lookahead(/\s*\(/)),className:"title.function",relevance:0},G={begin:i.concat(/\./,i.lookahead(i.concat(c,/(?![0-9A-Za-z$_(])/))),end:c,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},je={match:[/get|set/,/\s+/,c,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},F]},Be="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+s.UNDERSCORE_IDENT_RE+")\\s*=>",nt={match:[/const|var|let/,/\s+/,c,/\s*/,/=\s*/,/(async\s*)?/,i.lookahead(Be)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[F]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:p,exports:{PARAMS_CONTAINS:ne,CLASS_REFERENCE:ye},illegal:/#(?![$_A-z])/,contains:[s.SHEBANG({label:"shebang",binary:"node",relevance:5}),Le,s.APOS_STRING_MODE,s.QUOTE_STRING_MODE,Q,Z,q,V,me,{match:/\$\d+/},te,ye,{scope:"attr",match:c+i.lookahead(":"),relevance:0},nt,{begin:"("+s.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[me,s.REGEXP_MODE,{className:"function",begin:Be,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:s.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:ne}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:b.begin,end:b.end},{match:x},{begin:v.begin,"on:begin":v.isTrulyOpeningTag,end:v.end}],subLanguage:"xml",contains:[{begin:v.begin,end:v.end,skip:!0,contains:["self"]}]}]},y,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+s.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[F,s.inherit(s.TITLE_MODE,{begin:c,className:"title.function"})]},{match:/\.\.\./,relevance:0},G,{match:"\\$"+c,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[F]},we,se,$e,je,{match:/\$[(.]/}]}}const yn="[A-Za-z$_][0-9A-Za-z$_]*",tr=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],ar=["true","false","null","undefined","NaN","Infinity"],nr=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],sr=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],rr=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],ir=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],or=[].concat(rr,nr,sr);function Yl(s){const i=s.regex,l=(de,{after:Se})=>{const Oe="",end:""},x=/<[A-Za-z0-9\\._:-]+\s*\/>/,v={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(de,Se)=>{const Oe=de[0].length+de.index,st=de.input[Oe];if(st==="<"||st===","){Se.ignoreMatch();return}st===">"&&(l(de,{after:Oe})||Se.ignoreMatch());let rt;const Nt=de.input.substring(Oe);if(rt=Nt.match(/^\s*=/)){Se.ignoreMatch();return}if((rt=Nt.match(/^\s+extends\s+/))&&rt.index===0){Se.ignoreMatch();return}}},p={$pattern:yn,keyword:tr,literal:ar,built_in:or,"variable.language":ir},K="[0-9](_?[0-9])*",R=`\\.(${K})`,N="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",te={className:"number",variants:[{begin:`(\\b(${N})((${R})|\\.)?|(${R}))[eE][+-]?(${K})\\b`},{begin:`\\b(${N})\\b((${R})\\b|\\.)?|(${R})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},L={className:"subst",begin:"\\$\\{",end:"\\}",keywords:p,contains:[]},Q={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[s.BACKSLASH_ESCAPE,L],subLanguage:"xml"}},Z={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[s.BACKSLASH_ESCAPE,L],subLanguage:"css"}},q={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[s.BACKSLASH_ESCAPE,L],subLanguage:"graphql"}},V={className:"string",begin:"`",end:"`",contains:[s.BACKSLASH_ESCAPE,L]},me={className:"comment",variants:[s.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:c+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),s.C_BLOCK_COMMENT_MODE,s.C_LINE_COMMENT_MODE]},tt=[s.APOS_STRING_MODE,s.QUOTE_STRING_MODE,Q,Z,q,V,{match:/\$\d+/},te];L.contains=tt.concat({begin:/\{/,end:/\}/,keywords:p,contains:["self"].concat(tt)});const z=[].concat(me,L.contains),ne=z.concat([{begin:/(\s*)\(/,end:/\)/,keywords:p,contains:["self"].concat(z)}]),F={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:ne},$e={variants:[{match:[/class/,/\s+/,c,/\s+/,/extends/,/\s+/,i.concat(c,"(",i.concat(/\./,c),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,c],scope:{1:"keyword",3:"title.class"}}]},ye={relevance:0,match:i.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...nr,...sr]}},Le={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},y={variants:[{match:[/function/,/\s+/,c,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[F],illegal:/%/},se={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function pe(de){return i.concat("(?!",de.join("|"),")")}const we={match:i.concat(/\b/,pe([...rr,"super","import"].map(de=>`${de}\\s*\\(`)),c,i.lookahead(/\s*\(/)),className:"title.function",relevance:0},G={begin:i.concat(/\./,i.lookahead(i.concat(c,/(?![0-9A-Za-z$_(])/))),end:c,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},je={match:[/get|set/,/\s+/,c,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},F]},Be="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+s.UNDERSCORE_IDENT_RE+")\\s*=>",nt={match:[/const|var|let/,/\s+/,c,/\s*/,/=\s*/,/(async\s*)?/,i.lookahead(Be)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[F]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:p,exports:{PARAMS_CONTAINS:ne,CLASS_REFERENCE:ye},illegal:/#(?![$_A-z])/,contains:[s.SHEBANG({label:"shebang",binary:"node",relevance:5}),Le,s.APOS_STRING_MODE,s.QUOTE_STRING_MODE,Q,Z,q,V,me,{match:/\$\d+/},te,ye,{scope:"attr",match:c+i.lookahead(":"),relevance:0},nt,{begin:"("+s.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[me,s.REGEXP_MODE,{className:"function",begin:Be,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:s.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:ne}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:b.begin,end:b.end},{match:x},{begin:v.begin,"on:begin":v.isTrulyOpeningTag,end:v.end}],subLanguage:"xml",contains:[{begin:v.begin,end:v.end,skip:!0,contains:["self"]}]}]},y,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+s.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[F,s.inherit(s.TITLE_MODE,{begin:c,className:"title.function"})]},{match:/\.\.\./,relevance:0},G,{match:"\\$"+c,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[F]},we,se,$e,je,{match:/\$[(.]/}]}}function $s(s){const i=s.regex,l=Yl(s),c=yn,b=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],x={begin:[/namespace/,/\s+/,s.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},v={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:b},contains:[l.exports.CLASS_REFERENCE]},p={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},K=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],R={$pattern:yn,keyword:tr.concat(K),literal:ar,built_in:or.concat(b),"variable.language":ir},N={className:"meta",begin:"@"+c},te=(q,V,le)=>{const me=q.contains.findIndex(tt=>tt.label===V);if(me===-1)throw new Error("can not find mode to replace");q.contains.splice(me,1,le)};Object.assign(l.keywords,R),l.exports.PARAMS_CONTAINS.push(N);const L=l.contains.find(q=>q.scope==="attr"),Q=Object.assign({},L,{match:i.concat(c,i.lookahead(/\s*\?:/))});l.exports.PARAMS_CONTAINS.push([l.exports.CLASS_REFERENCE,L,Q]),l.contains=l.contains.concat([N,x,v,Q]),te(l,"shebang",s.SHEBANG()),te(l,"use_strict",p);const Z=l.contains.find(q=>q.label==="func.def");return Z.relevance=0,Object.assign(l,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),l}function Ns(s){const i=s.regex,l=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),c=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],p={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:c,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},K={className:"meta",begin:/^(>>>|\.\.\.) /},R={className:"subst",begin:/\{/,end:/\}/,keywords:p,illegal:/#/},N={begin:/\{\{/,relevance:0},te={className:"string",contains:[s.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[s.BACKSLASH_ESCAPE,K],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[s.BACKSLASH_ESCAPE,K],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[s.BACKSLASH_ESCAPE,K,N,R]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[s.BACKSLASH_ESCAPE,K,N,R]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[s.BACKSLASH_ESCAPE,N,R]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[s.BACKSLASH_ESCAPE,N,R]},s.APOS_STRING_MODE,s.QUOTE_STRING_MODE]},L="[0-9](_?[0-9])*",Q=`(\\b(${L}))?\\.(${L})|\\b(${L})\\.`,Z=`\\b|${c.join("|")}`,q={className:"number",relevance:0,variants:[{begin:`(\\b(${L})|(${Q}))[eE][+-]?(${L})[jJ]?(?=${Z})`},{begin:`(${Q})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${Z})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${Z})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${Z})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${Z})`},{begin:`\\b(${L})[jJ](?=${Z})`}]},V={className:"comment",begin:i.lookahead(/# type:/),end:/$/,keywords:p,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},le={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:p,contains:["self",K,q,te,s.HASH_COMMENT_MODE]}]};return R.contains=[te,q,K],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:p,illegal:/(<\/|\?)|=>/,contains:[K,q,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},te,V,s.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,l],scope:{1:"keyword",3:"title.function"},contains:[le]},{variants:[{match:[/\bclass/,/\s+/,l,/\s*/,/\(\s*/,l,/\s*\)/]},{match:[/\bclass/,/\s+/,l]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[q,le,te]}]}}function Xl(s){const i={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},l={match:/[{}[\],:]/,className:"punctuation",relevance:0},c=["true","false","null"],b={scope:"literal",beginKeywords:c.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:c},contains:[i,l,s.QUOTE_STRING_MODE,b,s.C_NUMBER_MODE,s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}function jn(s){const i=s.regex,l={},c={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[l]}]};Object.assign(l,{className:"variable",variants:[{begin:i.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},c]});const b={className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},x=s.inherit(s.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),v={begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},p={className:"string",begin:/"/,end:/"/,contains:[s.BACKSLASH_ESCAPE,l,b]};b.contains.push(p);const K={match:/\\"/},R={className:"string",begin:/'/,end:/'/},N={match:/\\'/},te={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,l]},L=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],Q=s.SHEBANG({binary:`(${L.join("|")})`,relevance:10}),Z={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},q=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],V=["true","false"],le={match:/(\/[a-z._-]+)+/},me=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],tt=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],z=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],ne=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:q,literal:V,built_in:[...me,...tt,"set","shopt",...z,...ne]},contains:[Q,s.SHEBANG(),Z,te,x,v,le,p,K,R,N,l]}}function Ts(s){const i="true false yes no null",l="[\\w#;/?:@&=+$,.~*'()[\\]]+",c={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},b={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},x={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},v={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[s.BACKSLASH_ESCAPE,b]},p=s.inherit(v,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),L={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},Q={end:",",endsWithParent:!0,excludeEnd:!0,keywords:i,relevance:0},Z={begin:/\{/,end:/\}/,contains:[Q],illegal:"\\n",relevance:0},q={begin:"\\[",end:"\\]",contains:[Q],illegal:"\\n",relevance:0},V=[c,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+l},{className:"type",begin:"!<"+l+">"},{className:"type",begin:"!"+l},{className:"type",begin:"!!"+l},{className:"meta",begin:"&"+s.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+s.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},s.HASH_COMMENT_MODE,{beginKeywords:i,keywords:{literal:i}},L,{className:"number",begin:s.C_NUMBER_RE+"\\b",relevance:0},Z,q,x,v],le=[...V];return le.pop(),le.push(p),Q.contains=le,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:V}}function Ms(s){const i=s.regex,l=i.concat(/[\p{L}_]/u,i.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),c=/[\p{L}0-9._:-]+/u,b={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},x={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},v=s.inherit(x,{begin:/\(/,end:/\)/}),p=s.inherit(s.APOS_STRING_MODE,{className:"string"}),K=s.inherit(s.QUOTE_STRING_MODE,{className:"string"}),R={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[x,K,p,v,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[x,v,K,p]}]}]},s.COMMENT(//,{relevance:10}),{begin://,relevance:10},b,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[K]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[R],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[R],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:i.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:l,relevance:0,starts:R}]},{className:"tag",begin:i.concat(/<\//,i.lookahead(i.concat(l,/>/))),contains:[{className:"name",begin:l,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}const Jl=s=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:s.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[s.APOS_STRING_MODE,s.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:s.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),Ql=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],ec=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],tc=[...Ql,...ec],ac=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),nc=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),sc=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),rc=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function ic(s){const i=s.regex,l=Jl(s),c={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},b="and or not only",x=/@-?\w[\w]*(-\w+)*/,v="[a-zA-Z-][a-zA-Z0-9_-]*",p=[s.APOS_STRING_MODE,s.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[l.BLOCK_COMMENT,c,l.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+v,relevance:0},l.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+nc.join("|")+")"},{begin:":(:)?("+sc.join("|")+")"}]},l.CSS_VARIABLE,{className:"attribute",begin:"\\b("+rc.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[l.BLOCK_COMMENT,l.HEXCOLOR,l.IMPORTANT,l.CSS_NUMBER_MODE,...p,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...p,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},l.FUNCTION_DISPATCH]},{begin:i.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:x},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:b,attribute:ac.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...p,l.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+tc.join("|")+")\\b"}]}}function oc(s){const i=s.regex,l=s.COMMENT("--","$"),c={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},b={begin:/"/,end:/"/,contains:[{match:/""/}]},x=["true","false","unknown"],v=["double precision","large object","with timezone","without timezone"],p=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],K=["add","asc","collation","desc","final","first","last","view"],R=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],N=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],te=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],L=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],Q=N,Z=[...R,...K].filter(ne=>!N.includes(ne)),q={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},V={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},le={match:i.concat(/\b/,i.either(...Q),/\s*\(/),relevance:0,keywords:{built_in:Q}};function me(ne){return i.concat(/\b/,i.either(...ne.map(F=>F.replace(/\s+/,"\\s+"))),/\b/)}const tt={scope:"keyword",match:me(L),relevance:0};function z(ne,{exceptions:F,when:$e}={}){const ye=$e;return F=F||[],ne.map(Le=>Le.match(/\|\d+$/)||F.includes(Le)?Le:ye(Le)?`${Le}|0`:Le)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:z(Z,{when:ne=>ne.length<3}),literal:x,type:p,built_in:te},contains:[{scope:"type",match:me(v)},tt,le,q,c,b,s.C_NUMBER_MODE,s.C_BLOCK_COMMENT_MODE,l,V]}}function Rs(s){const i=s.regex,l={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},c={begin:"^[-\\*]{3,}",end:"$"},b={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},x={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},v={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},p=/[A-Za-z][A-Za-z0-9+.-]*/,K={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:i.concat(/\[.+?\]\(/,p,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},R={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},N={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},te=s.inherit(R,{contains:[]}),L=s.inherit(N,{contains:[]});R.contains.push(L),N.contains.push(te);let Q=[l,K];return[R,N,te,L].forEach(le=>{le.contains=le.contains.concat(Q)}),Q=Q.concat(R,N),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:Q},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:Q}]}]},l,x,R,N,{className:"quote",begin:"^>\\s+",contains:Q,end:"$"},b,c,K,v,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}const Ma=Da([]),Ea=Da(!1);let lr=0;function en(s){const i=`msg_${++lr}`;return Ma.update(l=>[...l,{id:i,role:"user",content:s,timestamp:new Date().toISOString()}]),i}function Ha(){const s=`msg_${++lr}`;return Ma.update(i=>[...i,{id:s,role:"assistant",content:"",timestamp:new Date().toISOString(),streaming:!0,toolCalls:[]}]),Ea.set(!0),s}function lc(s,i){Ma.update(l=>l.map(c=>c.id===s?{...c,content:c.content+i}:c))}function Bn(s,i){Ma.update(l=>l.map(c=>c.id===s?{...c,content:i,streaming:!1}:c)),Ea.set(!1)}function cc(s,i){Ma.update(l=>l.map(c=>c.id===s?{...c,toolCalls:[...c.toolCalls||[],i]}:c))}function Cs(){Ma.set([]),Ea.set(!1)}var dc=g('
    '),uc=g(' '),vc=g('
    '),pc=g(''),gc=g(" ",1),fc=g('
    '),hc=g('
    '),bc=g('
    result
    '),_c=g('
    '),mc=g('
    '),yc=g('
    '),wc=g('
    '),Ec=g('

    '),kc=g('
    '),xc=g('
    '),Sc=g('

    '),Ac=g(''),$c=g('
    '),Nc=g('
    Plan
    '),Tc=g(''),Mc=g('
    '),Rc=g(''),Cc=g('
    '),Oc=g(""),zc=g('
    '),Ic=g('
    '),Pc=g('
    '),Lc=g('
    '),Dc=g('');function jc(s,i){Sa(i,!0);const l=()=>zt(Ma,"$chatMessages",p),c=()=>zt(Fs,"$settingsData",p),b=()=>zt(Ea,"$chatStreaming",p),x=()=>zt(xa,"$currentProjectStore",p),v=()=>zt(Wa,"$architectSidebarOpen",p),[p,K]=Ca();let R=ie(null);Ut.registerLanguage("javascript",As),Ut.registerLanguage("js",As),Ut.registerLanguage("typescript",$s),Ut.registerLanguage("ts",$s),Ut.registerLanguage("python",Ns),Ut.registerLanguage("py",Ns),Ut.registerLanguage("json",Xl),Ut.registerLanguage("bash",jn),Ut.registerLanguage("sh",jn),Ut.registerLanguage("shell",jn),Ut.registerLanguage("yaml",Ts),Ut.registerLanguage("yml",Ts),Ut.registerLanguage("xml",Ms),Ut.registerLanguage("html",Ms),Ut.registerLanguage("css",ic),Ut.registerLanguage("sql",oc),Ut.registerLanguage("markdown",Rs),Ut.registerLanguage("md",Rs);const N=new zn.Renderer;N.code=({text:h,lang:k})=>{const m=k&&Ut.getLanguage(k)?k:"";let a;try{a=m?Ut.highlight(h,{language:m}).value:Ut.highlightAuto(h).value}catch{a=h.replace(//g,">")}return`
    ${k||"code"}
    ${a}
    `},zn.setOptions({renderer:N});const te=[{value:"auto",label:"Auto-detect"},{value:"requirements",label:"Requirements Doc"},{value:"api_spec",label:"API Spec / OpenAPI"},{value:"data_sample",label:"Data Sample"},{value:"diagram",label:"Architecture Diagram"},{value:"config",label:"Config / Settings"},{value:"code",label:"Source Code"},{value:"documentation",label:"Documentation"},{value:"test_cases",label:"Test Cases"},{value:"schema",label:"Schema / Model"}],L={"image/png":"image","image/jpeg":"image","image/gif":"image","image/webp":"image","image/svg+xml":"image","image/bmp":"image","application/pdf":"pdf","application/msword":"document","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"document","application/vnd.oasis.opendocument.text":"document","application/rtf":"document","application/vnd.ms-excel":"spreadsheet","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"spreadsheet","application/vnd.oasis.opendocument.spreadsheet":"spreadsheet","text/csv":"spreadsheet","application/vnd.ms-powerpoint":"presentation","application/vnd.openxmlformats-officedocument.presentationml.presentation":"presentation","application/vnd.oasis.opendocument.presentation":"presentation","text/plain":"text","text/markdown":"text","application/json":"text","text/html":"text","text/css":"text","application/javascript":"text","application/x-yaml":"text","text/yaml":"text","application/xml":"text","text/xml":"text"},Q={".py":"text",".js":"text",".ts":"text",".jsx":"text",".tsx":"text",".json":"text",".md":"text",".txt":"text",".csv":"spreadsheet",".yaml":"text",".yml":"text",".xml":"text",".html":"text",".css":"text",".sql":"text",".sh":"text",".bash":"text",".r":"text",".rb":"text",".go":"text",".rs":"text",".java":"text",".kt":"text",".swift":"text",".pdf":"pdf",".doc":"document",".docx":"document",".odt":"document",".rtf":"document",".xls":"spreadsheet",".xlsx":"spreadsheet",".ods":"spreadsheet",".ppt":"presentation",".pptx":"presentation",".odp":"presentation",".png":"image",".jpg":"image",".jpeg":"image",".gif":"image",".webp":"image",".svg":"image",".bmp":"image"},Z=Object.keys(L).join(",")+",.py,.js,.ts,.jsx,.tsx,.sql,.sh,.r,.rb,.go,.rs,.java,.kt,.swift";function q(h){if(h.type&&L[h.type])return L[h.type];const k="."+h.name.split(".").pop()?.toLowerCase();return k&&Q[k]?Q[k]:"other"}let V=ie(ka([])),le=ie(void 0),me=ie(!1);async function tt(h){const k=Array.from(h);for(const m of k){if(m.size>20*1024*1024)continue;const a=q(m),o=await z(m),f={id:`file-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,name:m.name,type:m.type||"application/octet-stream",size:m.size,category:a,data:o,docType:"auto"};a==="image"&&(f.preview=`data:${m.type};base64,${o}`),u(V,[...e(V),f],!0)}}function z(h){return new Promise((k,m)=>{const a=new FileReader;a.onload=()=>{const o=a.result,f=o.includes(",")?o.split(",")[1]:o;k(f)},a.onerror=m,a.readAsDataURL(h)})}function ne(h){u(V,e(V).filter(k=>k.id!==h),!0)}let F=ie(null);function $e(h,k){u(V,e(V).map(m=>m.id===h?{...m,docType:k}:m),!0),u(F,null)}function ye(h){return!h||h==="auto"?"Auto-detect":te.find(k=>k.value===h)?.label??h}function Le(h){const k=h.target;k.files&&k.files.length>0&&(tt(k.files),k.value="")}function y(h){const k=h.clipboardData?.items;if(!k)return;const m=[];for(const a of Array.from(k))if(a.kind==="file"){const o=a.getAsFile();o&&m.push(o)}m.length>0&&(h.preventDefault(),tt(m))}const se=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],pe=["Drafting the blueprint...","Consulting the Oracle...","Aligning the nodes...","Designing the inevitable...","Architecting a masterpiece...","Tracing the path of causality...","Reshaping the construct...","Balancing the equation...","Loading the next iteration...","Surveying the pipeline...","Engineering the solution...","Selecting the right components...","Orchestrating the agents...","Running the simulation...","Weaving the connections...","Compiling the grand design...","Evaluating all possible paths...","Constructing the framework...","Visualizing the architecture...","Reticulating splines..."];let we=ie(ka(se[0])),G=ie(ka(pe[0])),je=null,Be=null,nt=0,de=0;const Se=dt(()=>l().some(h=>h.streaming&&!h.content));Ta(()=>{e(Se)?(nt=0,de=Math.floor(Math.random()*pe.length),u(G,pe[de],!0),je=setInterval(()=>{nt=(nt+1)%se.length,u(we,se[nt],!0)},80),Be=setInterval(()=>{de=(de+1)%pe.length,u(G,pe[de],!0)},2500)):(je&&(clearInterval(je),je=null),Be&&(clearInterval(Be),Be=null))});const Oe=dt(()=>c()?.user_profile?.assistant_name||"The Architect");let st=ka({});function rt(h){st[h]=!st[h]}function Nt(h){const k={};for(const m of h)k[m.tool]=(k[m.tool]||0)+1;return Object.entries(k).map(([m,a])=>a>1?`${m} x${a}`:m).join(", ")}function lt(h){return h.replace(/)<[^<]*)*<\/script>/gi,"").replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,"")}function pt(h){if(!h)return"";const k=zn(h,{async:!1});return lt(k)}let Ht=ie(""),Ft=ie(void 0),ta=ie(void 0),at=ie(null),W=ie(""),oe=ie(""),ge=null,w=ie(0),C=!1;const ce=5;let fe=ie(380),Ee=ie(!1),ke=ie(0),_=ie(0);const P=280,U=.5;function j(h){h.preventDefault(),u(Ee,!0),u(ke,h.clientX,!0),u(_,e(fe),!0),document.addEventListener("mousemove",be),document.addEventListener("mouseup",he)}function be(h){if(!e(Ee))return;const k=Math.floor(window.innerWidth*U),m=h.clientX-e(ke);u(fe,Math.max(P,Math.min(k,e(_)+m)),!0)}function he(){u(Ee,!1),document.removeEventListener("mousemove",be),document.removeEventListener("mouseup",he)}function Ue(h){Ga.update(k=>{const m=new Map;for(const o of k)m.set(o.id,o);for(const o of h.nodes){const f=m.get(o.id);f&&(f.data={...f.data,label:o.label||f.data.label,...o.config},o.position&&(f.position=o.position))}const a=h.nodes.filter(o=>!m.has(o.id)).map(o=>({id:o.id,type:o.type,position:o.position??{x:250,y:200},data:{label:o.label||o.id,...o.config}}));return[...k,...a]}),Qn.update(k=>{const m=new Set;for(const o of k)m.add(o.id);const a=h.edges.filter(o=>!m.has(o.id)).map(o=>({id:o.id,source:o.source,target:o.target,sourceHandle:o.source_handle??void 0,targetHandle:o.target_handle??void 0}));return[...k,...a]}),h.nodes.length===0&&(Ga.set([]),Qn.set([])),ci()}function Ce(){const h=window.location.protocol==="https:"?"wss:":"ws:",k=ia(xa),m=k?`?project=${encodeURIComponent(k.name)}`:"";return`${h}//${window.location.host}/ws/assistant${m}`}function He(){if(e(at)&&e(at).readyState===WebSocket.OPEN)return;u(oe,""),C=!1;let h;try{h=new WebSocket(Ce())}catch{u(oe,"AI Assistant requires a configured LLM provider. Check Settings.");return}h.onopen=()=>{u(oe,""),u(w,0);const k=ia(ys);if(k){ys.set(null),en(k.text),u(W,Ha(),!0);const m={action:"chat",message:k.text};k.attachments&&k.attachments.length>0&&(m.attachments=k.attachments);try{h.send(JSON.stringify(m))}catch{u(oe,"Failed to send initial message."),Ea.set(!1),u(W,"")}Fe()}},h.onmessage=k=>{let m;try{m=JSON.parse(k.data)}catch{return}if(m.type==="token")e(W)||u(W,Ha(),!0),lc(e(W),m.content),Fe();else if(m.type==="response_complete"){e(W)&&Bn(e(W),m.full_text),u(W,""),Fe();const a=ia(xa);if(a){const o=ia(Ma);Qt.assistant.saveHistory(a.name,o.map(f=>({role:f.role,content:f.content,timestamp:f.timestamp??new Date().toISOString(),toolCalls:f.toolCalls??[]}))).catch(()=>{})}}else if(m.type==="plan"){e(W)||u(W,Ha(),!0);let a=[],o=[];try{a=JSON.parse(m.steps)}catch{a=[]}try{o=JSON.parse(m.options)}catch{o=[]}u(R,{summary:m.summary||"",steps:a,options:o,question:m.question||"",msgId:e(W)},!0),Fe()}else if(m.type==="tool_call"){if(e(W)||u(W,Ha(),!0),m.tool==="present_plan"){Fe();return}let a=m.args;if(typeof a=="string")try{a=JSON.parse(a)}catch{a={raw:a}}(!a||typeof a!="object"||Array.isArray(a))&&(a={}),cc(e(W),{tool:m.tool,args:a,result:m.result}),Fe()}else if(m.type==="canvas_sync"){const a=m.canvas;a&&(Ue(a),li(a.nodes,a.edges))}else m.type==="error"&&(u(oe,m.message,!0),C=!0,e(W)?Bn(e(W),""):Ea.set(!1),u(W,""))},h.onclose=()=>{if(e(W)?(Bn(e(W),"[Connection lost]"),u(W,"")):Ea.set(!1),u(at,null),C){C=!1,u(w,ce);return}Un(w),e(w){},u(at,h,!0)}function St(){u(w,0),He()}function Vt(){ge&&(clearTimeout(ge),ge=null),e(at)?.close(),u(at,null)}function ft(){const h=e(Ht).trim();if(!h&&e(V).length===0||b()||!e(at))return;const k=h||`[${e(V).length} file${e(V).length>1?"s":""} attached]`;en(k),u(W,Ha(),!0);const m={action:"chat",message:h||"Please analyze the attached files."};e(V).length>0&&(m.attachments=e(V).map(a=>({name:a.name,type:a.type,category:a.category,size:a.size,data:a.data,docType:a.docType}))),u(Ht,""),u(V,[],!0);try{e(at).send(JSON.stringify(m))}catch{u(oe,"Failed to send message. Connection may be lost."),Ea.set(!1),u(W,"");return}Fe()}function ut(h){h.key==="Enter"&&!h.shiftKey&&(h.preventDefault(),ft())}function ht(){if(Cs(),e(at)&&e(at).readyState===WebSocket.OPEN)try{e(at).send(JSON.stringify({action:"clear_history"}))}catch{}u(oe,"")}function Fe(){requestAnimationFrame(()=>{e(Ft)&&(e(Ft).scrollTop=e(Ft).scrollHeight)})}function It(h){return new Date(h).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})}function Lt(h){if(!(!e(R)||!e(at))){en(h),u(W,Ha(),!0);try{e(at).send(JSON.stringify({action:"chat",message:h}))}catch{u(oe,"Failed to send plan selection."),Ea.set(!1),u(W,"")}u(R,null),Fe()}}function aa(){Wa.set(!1)}Ta(()=>{const h=x();hs(()=>{h&&e(at)&&(e(at).close(),u(at,null),He())})}),Ta(()=>{const h=x();h&&hs(()=>{Cs(),u(oe,""),Qt.assistant.getHistory(h.name).then(k=>{if(k&&k.length>0)for(const m of k)m.role==="user"?en(m.content):m.role==="assistant"&&Ma.update(a=>[...a,{id:`msg_hist_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,role:"assistant",content:m.content,timestamp:m.timestamp||new Date().toISOString(),streaming:!1,toolCalls:m.toolCalls??[]}])}).catch(()=>{})})});function ca(h){const m=h.detail?.instruction;if(!m||!e(at)||e(at).readyState!==WebSocket.OPEN)return;const o=`[Oracle Approved Insight] -`+m;en(o),u(W,Ha(),!0);try{e(at).send(JSON.stringify({action:"chat",message:o}))}catch{u(oe,"Failed to forward Oracle instruction."),Ea.set(!1),u(W,"")}Fe(),Wa.set(!0)}wn(()=>{He(),e(ta)?.focus(),window.addEventListener("oracle-approved",ca)}),Is(()=>{Vt(),window.removeEventListener("oracle-approved",ca),je&&clearInterval(je),Be&&clearInterval(Be),document.removeEventListener("mousemove",be),document.removeEventListener("mouseup",he)});var vt=qe(),Ze=J(vt);{var Ye=h=>{var k=Dc();let m,a;var o=n(k),f=n(o),O=n(f),_e=n(O);fn(_e,{size:16}),t(O);var ze=r(O,2),T=n(ze,!0);t(ze),t(f);var A=r(f,2),B=n(A);jl(B,{size:14}),t(A),t(o);var Je=r(o,2),Me=n(Je);{var Ae=H=>{var De=dc(),it=n(De),Pe=n(it);fn(Pe,{size:48}),t(it);var ue=r(it,2),ot=n(ue,!0);t(ue);var Dt=r(ue,2),qt=n(Dt,!0);t(Dt),t(De),D(()=>{X(ot,e(Oe)),X(qt,e(Oe)==="The Architect"?"I am The Architect. I designed the canvas upon which your agent pipelines take form. Describe what you wish to construct, and I shall design it.":`Ask ${e(Oe)} to help build your agent pipeline.`)}),d(H,De)},Ne=H=>{var De=qe(),it=J(De);yt(it,1,l,Pe=>Pe.id,(Pe,ue)=>{var ot=wc();let Dt;var qt=n(ot),ga=n(qt);{var ba=Ve=>{Ys(Ve,{size:18})},Qe=Ve=>{fn(Ve,{size:18})};M(ga,Ve=>{e(ue).role==="user"?Ve(ba):Ve(Qe,!1)})}t(qt);var Re=r(qt,2),sa=n(Re),jt=n(sa),fa=n(jt,!0);t(jt);var Kt=r(jt,2),ya=n(Kt,!0);t(Kt),t(sa);var ra=r(sa,2);let ve;var ua=n(ra);{var Xe=Ve=>{var mt=qe(),S=J(mt);{var I=Te=>{var xe=vc(),Bt=n(xe),wa=n(Bt,!0);t(Bt);var ja=r(Bt,2);bi(ja,()=>e(G),za=>{var Ba=uc(),xn=n(Ba,!0);t(Ba),D(()=>X(xn,e(G))),d(za,Ba)}),t(xe),D(()=>X(wa,e(we))),d(Te,xe)},Y=Te=>{var xe=gc(),Bt=J(xe);ti(Bt,()=>pt(e(ue).content));var wa=r(Bt,2);{var ja=za=>{var Ba=pc();d(za,Ba)};M(wa,za=>{e(ue).streaming&&za(ja)})}d(Te,xe)};M(S,Te=>{e(ue).streaming&&!e(ue).content?Te(I):Te(Y,!1)})}d(Ve,mt)},ee=Ve=>{var mt=Hn();D(()=>X(mt,e(ue).content)),d(Ve,mt)};M(ua,Ve=>{e(ue).role==="assistant"?Ve(Xe):Ve(ee,!1)})}t(ra);var ae=r(ra,2);{var Ke=Ve=>{var mt=yc(),S=n(mt),I=n(S),Y=n(I);let Te;var xe=n(Y);ei(xe,{size:12}),t(Y);var Bt=r(Y,2);_n(Bt,{size:12});var wa=r(Bt,2),ja=n(wa);t(wa),t(I);var za=r(I,2),Ba=n(za,!0);t(za),t(S);var xn=r(S,2);{var dr=Xa=>{var Sn=mc();yt(Sn,21,()=>e(ue).toolCalls,Ot,(ur,$a,vr)=>{var An=_c(),$n=n(An),ds=n($n);ds.textContent=vr+1;var Nn=r(ds,2),pr=n(Nn,!0);t(Nn);var gr=r(Nn,2);{var fr=_a=>{ai(_a,{size:11,class:"tool-call-ok"})};M(gr,_a=>{e($a).result&&_a(fr)})}t($n);var us=r($n,2);{var hr=_a=>{var Ua=hc();yt(Ua,21,()=>Object.entries(e($a).args),Ot,(on,Tn)=>{var ln=dt(()=>Cr(e(Tn),2));let yr=()=>e(ln)[0],Ja=()=>e(ln)[1];var Mn=fc(),Rn=n(Mn),wr=n(Rn);t(Rn);var vs=r(Rn,2),Er=n(vs,!0);t(vs),t(Mn),D(kr=>{X(wr,`${yr()??""}:`),X(Er,kr)},[()=>typeof Ja()=="string"?Ja().length>120?Ja().slice(0,117)+"...":Ja():JSON.stringify(Ja())]),d(on,Mn)}),t(Ua),d(_a,Ua)},br=dt(()=>e($a).args&&Object.keys(e($a).args).length>0);M(us,_a=>{e(br)&&_a(hr)})}var _r=r(us,2);{var mr=_a=>{var Ua=bc(),on=r(n(Ua),2),Tn=n(on,!0);t(on),t(Ua),D(ln=>X(Tn,ln),[()=>e($a).result.length>200?e($a).result.slice(0,197)+"...":e($a).result]),d(_a,Ua)};M(_r,_a=>{e($a).result&&_a(mr)})}t(An),D(()=>X(pr,e($a).tool)),d(ur,An)}),t(Sn),d(Xa,Sn)};M(xn,Xa=>{st[e(ue).id]&&Xa(dr)})}t(mt),D(Xa=>{Te=Rt(Y,1,"tool-chevron svelte-mwxll1",null,Te,{expanded:st[e(ue).id]}),X(ja,`${e(ue).toolCalls.length??""} tool - call${e(ue).toolCalls.length!==1?"s":""}`),X(Ba,Xa)},[()=>Nt(e(ue).toolCalls)]),$("click",S,()=>rt(e(ue).id)),d(Ve,mt)};M(ae,Ve=>{e(ue).toolCalls&&e(ue).toolCalls.length>0&&Ve(Ke)})}t(Re),t(ot),D(Ve=>{Dt=Rt(ot,1,"message svelte-mwxll1",null,Dt,{user:e(ue).role==="user",assistant:e(ue).role==="assistant"}),X(fa,e(ue).role==="user"?"You":e(Oe)),X(ya,Ve),ve=Rt(ra,1,"message-content svelte-mwxll1",null,ve,{markdown:e(ue).role==="assistant"})},[()=>It(e(ue).timestamp)]),d(Pe,ot)}),d(H,De)};M(Me,H=>{l().length===0?H(Ae):H(Ne,!1)})}t(Je),hn(Je,H=>u(Ft,H),()=>e(Ft));var At=r(Je,2);{var Gt=H=>{var De=Nc(),it=n(De),Pe=n(it),ue=n(Pe),ot=n(ue);_n(ot,{size:11}),t(ue),We(2),t(Pe);var Dt=r(Pe,2),qt=n(Dt);mn(qt,{size:12}),t(Dt),t(it);var ga=r(it,2),ba=n(ga);{var Qe=ae=>{var Ke=Ec(),Ve=n(Ke,!0);t(Ke),D(()=>X(Ve,e(R).summary)),d(ae,Ke)};M(ba,ae=>{e(R).summary&&ae(Qe)})}var Re=r(ba,2);{var sa=ae=>{var Ke=xc();yt(Ke,21,()=>e(R).steps,Ot,(Ve,mt,S)=>{var I=kc(),Y=n(I);Y.textContent=S+1;var Te=r(Y,2),xe=n(Te,!0);t(Te),t(I),D(()=>X(xe,e(mt))),d(Ve,I)}),t(Ke),d(ae,Ke)};M(Re,ae=>{e(R).steps.length>0&&ae(sa)})}var jt=r(Re,2);{var fa=ae=>{var Ke=Sc(),Ve=n(Ke,!0);t(Ke),D(()=>X(Ve,e(R).question)),d(ae,Ke)};M(jt,ae=>{e(R).question&&ae(fa)})}t(ga);var Kt=r(ga,2),ya=n(Kt);{var ra=ae=>{var Ke=$c();yt(Ke,21,()=>e(R).options,Ot,(Ve,mt,S)=>{var I=Ac(),Y=n(I),Te=n(Y,!0);t(Y);var xe=r(Y,2),Bt=n(xe,!0);t(xe),t(I),D(wa=>{X(Te,wa),X(Bt,e(mt))},[()=>String.fromCharCode(65+S)]),$("click",I,()=>Lt(e(mt))),d(Ve,I)}),t(Ke),d(ae,Ke)};M(ya,ae=>{e(R).options.length>0&&ae(ra)})}var ve=r(ya,2),ua=n(ve);et(ua,"rows",2);var Xe=r(ua,2),ee=n(Xe);_s(ee,{size:12}),t(Xe),t(ve),t(Kt),t(De),D(()=>et(ua,"placeholder",e(R).options.length>0?"Or type your own response...":"Type your response...")),$("click",Dt,()=>u(R,null)),$("keydown",ua,ae=>{if(ae.key==="Enter"&&!ae.shiftKey){ae.preventDefault();const Ke=ae.currentTarget;Ke.value.trim()&&Lt(Ke.value.trim())}}),$("click",Xe,ae=>{const Ke=ae.currentTarget.previousElementSibling;Ke?.value.trim()&&Lt(Ke.value.trim())}),d(H,De)};M(At,H=>{e(R)&&H(Gt)})}var gt=r(At,2);{var Mt=H=>{var De=Mc(),it=n(De),Pe=n(it,!0);t(it);var ue=r(it,2);{var ot=Dt=>{var qt=Tc();$("click",qt,St),d(Dt,qt)};M(ue,Dt=>{e(w)>=ce&&Dt(ot)})}t(De),D(()=>X(Pe,e(oe))),d(H,De)};M(gt,H=>{e(oe)&&H(Mt)})}var bt=r(gt,2),Zt=n(bt);{var oa=H=>{var De=Pc();yt(De,21,()=>e(V),it=>it.id,(it,Pe)=>{var ue=Ic(),ot=n(ue);let Dt;var qt=n(ot);{var ga=ee=>{var ae=Rc();D(()=>{et(ae,"src",e(Pe).preview),et(ae,"alt",e(Pe).name)}),d(ee,ae)},ba=ee=>{var ae=Cc(),Ke=n(ae);{var Ve=xe=>{ms(xe,{size:14})},mt=xe=>{Ll(xe,{size:14})},S=xe=>{Ul(xe,{size:14})},I=xe=>{ms(xe,{size:14})},Y=xe=>{fi(xe,{size:14})},Te=xe=>{ni(xe,{size:14})};M(Ke,xe=>{e(Pe).category==="pdf"?xe(Ve):e(Pe).category==="spreadsheet"?xe(mt,1):e(Pe).category==="presentation"?xe(S,2):e(Pe).category==="document"?xe(I,3):e(Pe).category==="image"?xe(Y,4):xe(Te,!1)})}t(ae),d(ee,ae)};M(qt,ee=>{e(Pe).category==="image"&&e(Pe).preview?ee(ga):ee(ba,!1)})}var Qe=r(qt,2),Re=n(Qe),sa=n(Re,!0);t(Re);var jt=r(Re,2),fa=n(jt),Kt=n(fa,!0);t(fa);var ya=r(fa,2);rs(ya,{size:9}),t(jt),t(Qe);var ra=r(Qe,2),ve=n(ra);mn(ve,{size:12}),t(ra),t(ot);var ua=r(ot,2);{var Xe=ee=>{var ae=zc();yt(ae,21,()=>te,Ot,(Ke,Ve)=>{var mt=Oc();let S;var I=n(mt,!0);t(mt),D(()=>{S=Rt(mt,1,"type-option svelte-mwxll1",null,S,{selected:e(Pe).docType===e(Ve).value}),X(I,e(Ve).label)}),$("click",mt,()=>$e(e(Pe).id,e(Ve).value)),d(Ke,mt)}),t(ae),d(ee,ae)};M(ua,ee=>{e(F)===e(Pe).id&&ee(Xe)})}t(ue),D((ee,ae)=>{Dt=Rt(ot,1,"attachment-badge svelte-mwxll1",null,Dt,{"has-preview":e(Pe).category==="image"&&e(Pe).preview}),et(Re,"title",e(Pe).name),X(sa,ee),X(Kt,ae)},[()=>e(Pe).name.length>20?e(Pe).name.slice(0,17)+"...":e(Pe).name,()=>ye(e(Pe).docType)]),$("click",jt,()=>u(F,e(F)===e(Pe).id?null:e(Pe).id,!0)),$("click",ra,()=>ne(e(Pe).id)),d(it,ue)}),t(De),d(H,De)};M(Zt,H=>{e(V).length>0&&H(oa)})}var ea=r(Zt,2),Ge=n(ea),Wt=n(Ge),Ct=n(Wt);os(Ct,{size:16}),t(Wt);var _t=r(Wt,2);{var $t=H=>{var De=Lc(),it=n(De),Pe=n(it);Bl(Pe,{size:14}),We(2),t(it);var ue=r(it,2),ot=n(ue);Pl(ot,{size:14}),We(2),t(ue),t(De),$("click",it,()=>{e(le)?.click(),u(me,!1)}),$("click",ue,()=>{console.log("Screenshot not yet implemented"),u(me,!1)}),d(H,De)};M(_t,H=>{e(me)&&H($t)})}t(Ge);var Yt=r(Ge,2);hn(Yt,H=>u(le,H),()=>e(le));var Xt=r(Yt,2);En(Xt),et(Xt,"rows",1),hn(Xt,H=>u(ta,H),()=>e(ta));var Oa=r(Xt,2),va=n(Oa),na=n(va);is(na,{size:14}),t(va);var pa=r(va,2),E=n(pa);{var re=H=>{kn(H,{size:14,class:"spin-icon"})},Ie=H=>{_s(H,{size:14})};M(E,H=>{b()?H(re):H(Ie,!1)})}t(pa),t(Oa),t(ea),t(bt);var ct=r(bt,2);t(k),D(H=>{m=Rt(k,1,"architect-sidebar svelte-mwxll1",null,m,{dragging:e(Ee)}),a=Fa(k,"",a,{width:`${e(fe)??""}px`}),X(T,e(Oe)),Wt.disabled=b(),et(Yt,"accept",Z),et(Xt,"placeholder",`Ask ${e(Oe)??""}...`),Xt.disabled=b(),va.disabled=l().length===0,pa.disabled=H},[()=>!e(Ht).trim()&&e(V).length===0||b()||!e(at)]),$("click",A,aa),$("click",Wt,()=>u(me,!e(me))),$("change",Yt,Le),$("keydown",Xt,ut),as("paste",Xt,y),la(Xt,()=>e(Ht),H=>u(Ht,H)),$("click",va,ht),$("click",pa,ft),$("mousedown",ct,j),d(h,k)};M(Ze,h=>{v()&&h(Ye)})}d(s,vt),Aa(),K()}Ra(["click","keydown","change","mousedown"]);const cr="fireflyStudio:theme";function Bc(){const s=localStorage.getItem(cr);return s==="dark"||s==="light"||s==="system"?s:"dark"}const rn=Da(Bc()),Uc=zs(rn,s=>s!=="system"?s:window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light");function Hc(){rn.subscribe(i=>{localStorage.setItem(cr,i)}),Uc.subscribe(i=>{document.documentElement.setAttribute("data-theme",i)}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{rn.update(i=>i)})}function Fc(){rn.update(s=>s==="dark"?"light":s==="light"?"system":"dark")}var Gc=g('
    '),Kc=g('
    '),Wc=g('
    Made with by Firefly Software Solutions
    ',1);function qc(s,i){Sa(i,!0);const l=()=>zt(Ei,"$page",b),c=()=>zt(rn,"$themeMode",b),[b,x]=Ca(),v=dt(()=>l().url.pathname==="/"||l().url.pathname==="/index.html");wn(()=>{Ti();function y(se){se.preventDefault();const pe=se.reason instanceof Error?se.reason.message:String(se.reason);Tt(`Unhandled error: ${pe}`,"error"),console.error("[AppShell] Unhandled rejection:",se.reason)}return window.addEventListener("unhandledrejection",y),()=>{Mi(),window.removeEventListener("unhandledrejection",y)}});function p(){const y=document.activeElement;if(!y)return!1;const se=y.tagName.toLowerCase();return!!(se==="input"||se==="textarea"||y.isContentEditable)}function K(y){if(e(v))return;const se=y.metaKey||y.ctrlKey;if(y.key==="s"&&se){y.preventDefault();const pe=ia(xa);pe&&Qt.projects.savePipeline(pe.name,"main",Ka()).then(()=>{qn.set(!1),Tt("Pipeline saved","success")}).catch(()=>Tt("Failed to save pipeline","error"));return}if(y.key===","&&se){y.preventDefault(),sn.set(!0);return}if(y.key==="k"&&se){y.preventDefault(),es.update(pe=>!pe);return}if(y.key==="Enter"&&se){y.preventDefault(),window.dispatchEvent(new CustomEvent("firefly:run-pipeline"));return}if(y.key==="D"&&se&&y.shiftKey){y.preventDefault(),cs(Ka());return}if(y.key==="/"&&se){y.preventDefault(),Wa.update(pe=>!pe);return}if(y.key==="d"&&se&&!y.shiftKey){if(p())return;y.preventDefault();const pe=ia(dn);if(!pe)return;const G=ia(Ga).find(nt=>nt.id===pe);if(!G)return;const je=`${G.type}-dup-${Date.now()}`,Be=40;Ga.update(nt=>[...nt,{...G,id:je,position:{x:G.position.x+Be,y:G.position.y+Be},data:{...G.data}}]),dn.set(je);return}if((y.key==="Delete"||y.key==="Backspace")&&!se&&!y.shiftKey&&!y.altKey){if(p())return;const pe=ia(dn);if(!pe)return;y.preventDefault(),Ga.update(we=>we.filter(G=>G.id!==pe)),Qn.update(we=>we.filter(G=>G.source!==pe&&G.target!==pe)),dn.set(null);return}if(y.key==="?"&&!se&&!y.altKey){if(p())return;y.preventDefault(),ts.update(pe=>!pe);return}}var R=Wc();as("keydown",Or,K);var N=J(R),te=n(N);uo(te,{get isHomePage(){return e(v)}});var L=r(te,2);{var Q=y=>{var se=Gc(),pe=n(se);Wn(pe,()=>i.children),t(se),d(y,se)},Z=y=>{var se=Kc(),pe=n(se);jc(pe,{});var we=r(pe,2),G=n(we);Wn(G,()=>i.children),t(we),t(se),d(y,se)};M(L,y=>{e(v)?y(Q):y(Z,!1)})}var q=r(L,2),V=r(n(q),6),le=n(V);{var me=y=>{Dl(y,{size:14})},tt=y=>{Hl(y,{size:14})},z=y=>{Xs(y,{size:14})};M(le,y=>{c()==="dark"?y(me):c()==="light"?y(tt,1):y(z,!1)})}t(V),t(q),t(N);var ne=r(N,2);yo(ne,{});var F=r(ne,2);$o(F,{});var $e=r(F,2);cl($e,{});var ye=r($e,2);Cl(ye,{});var Le=r(ye,2);Il(Le,{}),D(()=>et(V,"title",`Theme: ${c()}`)),$("click",V,function(...y){Fc?.apply(this,y)}),d(s,R),Aa(),x()}Ra(["click"]);var Vc=g('');function id(s,i){Sa(i,!0),wn(async()=>{Hc(),await Vn(),di(),Ai();try{const l=await Qt.settings.status();(l.first_start||!l.setup_complete)&&bn.set(!0),await Gs()}catch{}}),Is(()=>$i()),_i("12qhfyh",l=>{var c=Vc();D(()=>et(c,"href",ls)),d(l,c)}),qc(s,{children:(l,c)=>{var b=qe(),x=J(b);Wn(x,()=>i.children),d(l,b)},$$slots:{default:!0}}),Aa()}export{id as component,rd as universal}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/0.B467-gvR.js b/studio-desktop/frontend-dist/_app/immutable/nodes/0.B467-gvR.js deleted file mode 100644 index 4f229b10..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/0.B467-gvR.js +++ /dev/null @@ -1,65 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{h as da,d as Br,bk as jr,e as Us,W as Ur,bl as Hr,bm as Fr,av as Gr,aJ as bs,i as ms,g as _s,j as Kr,au as qr,c as Ze,f as he,a as b,w as Ln,b9 as Zr,K as xn,p as on,t as In,b as cn,F as d,O as Je,G as o,I as g,y as s,C as le,J as ge,L as F,D as w,M as ve,Q as _t,N as m,P as ma,a2 as Ut,bj as Qa,a8 as On,as as Jn,ah as Ba,o as Ja,bn as Wr,b8 as Vr,bo as Yr}from"../chunks/BNectIeB.js";import{L as Hs,a as St,C as Hn,b as ys,S as es,c as Fs,P as ja,d as ts,r as ns,i as Xr,e as Qr,T as Gs,F as Jr,G as ei,R as ti,A as ni,f as ai,g as si,D as ri,B as ua,W as ii,h as li,j as oi,k as ci,l as di,m as ui,n as pi,o as gi,p as vi,s as Ks,q as Ua,M as qs,Z as Ha,t as Zs,u as hi,v as fi,I as bi,w as mi,x as _i,X as Fa,y as yi,z as ki,E as wi,H as xi,J as Ei,K as Si,N as ks,O as Ai,Q as Ga}from"../chunks/DiTIFvoL.js";import{I as yt,s as kt,c as Ht,a as it,L as as,t as kn,m as ot,b as $t,u as wn,v as Fn,p as Ca,e as gt,q as At,k as Mt,P as Ws,w as Ka,h as ws,g as Ti,B as Ni,D as Ri,x as Wt,n as Vs,o as Ys,y as $i,r as zi,z as qa,A as Mi,C as ra}from"../chunks/K2hNZgUo.js";import{B as Ci,l as wt,s as xt,p as Xs,i as Q,a as mn,b as ct}from"../chunks/BB2KRr3j.js";import{s as Oi,a as Ii,g as jn}from"../chunks/DaZstLas.js";import{s as ea,c as Gn,d as Za,a as ia,r as Pi,b as Oa,e as Wa,f as pa}from"../chunks/CKy8R5Mg.js";import{i as Qs}from"../chunks/FsCUQR17.js";import{b as ga,c as Js}from"../chunks/DfPw5QXW.js";import{S as xs,a as Es}from"../chunks/CCyXRANn.js";const Li=Symbol("NaN");function Di(t,e,n){da&&Br();var r=new Ci(t),a=!jr();Us(()=>{var c=e();c!==c&&(c=Li),a&&c!==null&&typeof c=="object"&&(c={}),r.ensure(c,n)})}function Bi(t,e){let n=null,r=da;var a;if(da){n=Kr;for(var c=qr(document.head);c!==null&&(c.nodeType!==Gr||c.data!==t);)c=bs(c);if(c===null)ms(!1);else{var i=bs(c);c.remove(),_s(i)}}da||(a=document.head.appendChild(Ur()));try{Us(()=>e(a),Hr|Fr)}finally{r&&(ms(!0),_s(n))}}const ji=!1,Ui=!1,Sd=Object.freeze(Object.defineProperty({__proto__:null,prerender:Ui,ssr:ji},Symbol.toStringTag,{value:"Module"})),ss="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='100'%20cy='100'%20r='100'%20fill='url(%23paint0_linear_76_8)'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M100%2027C96.9983%2027.0001%2094.0805%2027.9929%2091.6991%2029.8243C89.3177%2031.6558%2087.6058%2034.2235%2086.8289%2037.1294C86.052%2040.0353%2086.2535%2043.1169%2087.4021%2045.8963C88.5507%2048.6758%2090.5823%2050.9977%2093.1818%2052.502V61.1667H72.7273C50.9091%2061.1667%2045.4545%2079.3912%2045.4545%2088.5V136.333C45.4545%20140.891%2048.1818%20150%2059.0909%20150H65.9091V122.667C65.9091%20120.854%2066.6274%20119.116%2067.9061%20117.835C69.1847%20116.553%2070.919%20115.833%2072.7273%20115.833H127.273C129.081%20115.833%20130.815%20116.553%20132.094%20117.835C133.373%20119.116%20134.091%20120.854%20134.091%20122.667V150H140.909C151.818%20150%20154.545%20140.891%20154.545%20136.333V88.5C154.545%2066.6333%20136.361%2061.1667%20127.273%2061.1667H106.818V52.502C109.418%2050.9977%20111.449%2048.6758%20112.598%2045.8963C113.747%2043.1169%20113.948%2040.0353%20113.171%2037.1294C112.394%2034.2235%20110.682%2031.6558%20108.301%2029.8243C105.92%2027.9929%20103.002%2027.0001%20100%2027ZM120.455%20150V129.5H106.818V150H120.455ZM93.1818%20150V129.5H79.5455V150H93.1818ZM161.364%20129.5V95.3333C165.911%2095.3333%20175%2098.0667%20175%20109V115.833C175%20120.391%20172.273%20129.5%20161.364%20129.5ZM38.6364%2095.3333V129.5C27.7273%20129.5%2025%20120.391%2025%20115.833V109C25%2098.0667%2034.0886%2095.3333%2038.6364%2095.3333ZM79.5455%2088.5C77.7372%2088.5%2076.0029%2089.2199%2074.7243%2090.5014C73.4456%2091.7829%2072.7273%2093.521%2072.7273%2095.3333C72.7273%2097.1456%2073.4456%2098.8837%2074.7243%20100.165C76.0029%20101.447%2077.7372%20102.167%2079.5455%20102.167H79.5523C81.3606%20102.167%2083.0948%20101.447%2084.3735%20100.165C85.6521%2098.8837%2086.3705%2097.1456%2086.3705%2095.3333C86.3705%2093.521%2085.6521%2091.7829%2084.3735%2090.5014C83.0948%2089.2199%2081.3606%2088.5%2079.5523%2088.5H79.5455ZM113.636%2095.3333C113.636%2093.521%20114.355%2091.7829%20115.633%2090.5014C116.912%2089.2199%20118.646%2088.5%20120.455%2088.5H120.461C122.27%2088.5%20124.004%2089.2199%20125.283%2090.5014C126.561%2091.7829%20127.28%2093.521%20127.28%2095.3333C127.28%2097.1456%20126.561%2098.8837%20125.283%20100.165C124.004%20101.447%20122.27%20102.167%20120.461%20102.167H120.455C118.646%20102.167%20116.912%20101.447%20115.633%20100.165C114.355%2098.8837%20113.636%2097.1456%20113.636%2095.3333Z'%20fill='white'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_76_8'%20x1='200'%20y1='100'%20x2='0'%20y2='100'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F68000'/%3e%3cstop%20offset='1'%20stop-color='%23FFF9C1'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e",Hi=()=>{const t=Oi;return{page:{subscribe:t.page.subscribe},navigating:{subscribe:t.navigating.subscribe},updated:t.updated}},Fi={subscribe(t){return Hi().page.subscribe(t)}};function er(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M12 20v-9"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z"}],["path",{d:"M14.12 3.88 16 2"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97"}],["path",{d:"M22 13h-4"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97"}],["path",{d:"M6 13H2"}],["path",{d:"m8 2 1.88 1.88"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13"}]];yt(t,xt({name:"bug"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function Gi(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M9 3v18"}]];yt(t,xt({name:"panel-left"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function Ki(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7"}]];yt(t,xt({name:"save"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function qi(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M12 2v10"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04"}]];yt(t,xt({name:"power"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}const la=Ln(null),oa=Ln(!1),Un=Ln("stopped"),Xn=Ln("checking"),tr=Ln(""),Zi={subscribe:Xn.subscribe};tr.subscribe;Zr(Xn,t=>t==="connected");let Qn=null;async function Ss(){try{const t=await fetch("/api/health",{signal:AbortSignal.timeout(3e3)});if(t.ok){const e=await t.json();Xn.set("connected"),tr.set(e.version??"")}else Xn.set("disconnected")}catch{Xn.set("disconnected")}}function Wi(t=1e4){Qn||(Ss(),Qn=setInterval(Ss,t))}function Vi(){Qn&&(clearInterval(Qn),Qn=null)}function Yi(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"}],["path",{d:"M2 12h20"}]];yt(t,xt({name:"globe"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}var Xi=w(' ',1),Qi=w(" ",1),Ji=w('

    Send a POST request with a JSON body to run your pipeline remotely.

    '),el=w('
    ',1),tl=w('');function nl(t,e){on(e,!0);const n=()=>ct(la,"$tunnelUrl",c),r=()=>ct(oa,"$tunnelActive",c),a=()=>ct(kn,"$currentProject",c),[c,i]=mn();let u=Xs(e,"open",3,!1),p=ve(!1),f=ve(!1),h=_t(n),y=_t(r),_=_t(()=>a()?.name??""),z=_t(()=>s(h)?`${s(h)}/api/projects/${s(_)}/run`:null);In(()=>{u()&&A()});async function A(){try{const G=await Ht.tunnel.status();oa.set(G.active),la.set(G.url)}catch{}}async function O(){m(p,!0);try{const G=await Ht.tunnel.start();oa.set(!0),la.set(G.url),St("Tunnel started","success")}catch{St("Failed to start tunnel","error")}finally{m(p,!1)}}async function B(){m(p,!0);try{await Ht.tunnel.stop(),oa.set(!1),la.set(null),St("Tunnel stopped","success")}catch{St("Failed to stop tunnel","error")}finally{m(p,!1)}}async function te(G){try{await navigator.clipboard.writeText(G),m(f,!0),setTimeout(()=>{m(f,!1)},2e3)}catch{St("Failed to copy","error")}}function de(G){G.target===G.currentTarget&&e.onclose()}function $(G){G.key==="Escape"&&(G.preventDefault(),e.onclose())}var k=Ze(),E=he(k);{var C=G=>{var oe=tl(),ne=d(oe),Re=d(ne),et=d(Re),qe=d(et);Hs(qe,{size:18}),Je(2),o(et),Je(2),o(Re);var Ne=g(Re,2),se=d(Ne),$e=d(se),Ce=d($e),tt=d(Ce);let J;var Pe=g(tt,2),Oe=d(Pe,!0);o(Pe),o(Ce);var Le=g(Ce,2);let We;var rt=d(Le);{var at=M=>{var K=Xi(),j=he(K),q=d(j);as(q,{size:13}),o(j);var ee=g(j,2),ue=d(ee,!0);o(ee),le(()=>ge(ue,s(y)?"Stopping...":"Starting...")),b(M,K)},Xe=M=>{var K=Qi(),j=he(K);Yi(j,{size:13});var q=g(j,2),ee=d(q,!0);o(q),le(()=>ge(ee,s(y)?"Stop Tunnel":"Start Tunnel")),b(M,K)};Q(rt,M=>{s(p)?M(at):M(Xe,!1)})}o(Le),o($e),Je(2),o(se);var ut=g(se,2);{var pt=M=>{var K=el(),j=he(K),q=g(d(j),2),ee=d(q),ue=d(ee,!0);o(ee);var be=g(ee,2),Ee=d(be);{var _e=U=>{Hn(U,{size:13})},we=U=>{ys(U,{size:13})};Q(Ee,U=>{s(f)?U(_e):U(we,!1)})}o(be),o(q),o(j);var R=g(j,2);{var Z=U=>{var ye=Ji(),fe=g(d(ye),2),me=d(fe),ze=d(me,!0);o(me);var Ie=g(me,2),Te=d(Ie);ys(Te,{size:13}),o(Ie),o(fe),Je(2),o(ye),le(()=>ge(ze,s(z))),F("click",Ie,()=>te(s(z))),b(U,ye)};Q(R,U=>{s(z)&&U(Z)})}le(()=>ge(ue,s(h))),F("click",be,()=>te(s(h))),b(M,K)};Q(ut,M=>{s(y)&&s(h)&&M(pt)})}o(Ne);var ft=g(Ne,2),De=d(ft);o(ft),o(ne),o(oe),le(()=>{J=it(tt,1,"tunnel-dot svelte-1vh905b",null,J,{"tunnel-dot-active":s(y)}),ge(Oe,s(y)?"Tunnel Active":"Tunnel Inactive"),We=it(Le,1,"tunnel-toggle-btn svelte-1vh905b",null,We,{"tunnel-stop":s(y)}),Le.disabled=s(p)}),F("click",oe,de),F("keydown",oe,$),F("click",Le,function(...M){(s(y)?B:O)?.apply(this,M)}),F("click",De,function(...M){e.onclose?.apply(this,M)}),b(G,oe)};Q(E,G=>{u()&&G(C)})}b(t,k),cn(),i()}xn(["click","keydown"]);var al=w(''),sl=w('active'),rl=w(''),il=w('
    '),ll=w(' ',1),ol=w('
    ',1),cl=w(' /
    ',1),dl=w(' Running... ',1),ul=w(' Run',1),pl=w(''),gl=w('
    ',1),vl=w(''),hl=w(''),fl=w('

    Run Pipeline

    Provide input for your pipeline (or leave blank to run without input)

    '),bl=w('
    ',1);function ml(t,e){on(e,!0);const n=()=>ct(Xr,"$isRunning",f),r=()=>ct(Qr,"$isDebugging",f),a=()=>ct(Zi,"$connectionState",f),c=()=>ct(Un,"$runtimeStatus",f),i=()=>ct(kn,"$currentProject",f),u=()=>ct(Ca,"$projects",f),p=()=>ct(Gn,"$architectSidebarOpen",f),[f,h]=mn();let y=Xs(e,"isHomePage",3,!1),_=_t(n),z=_t(r),A=_t(()=>s(_)||s(z)),O=_t(a),B=ve(!1),te=ve(""),de=ve(!1),$=ve(null),k=ve(!1),E=ve(!1),C=ve("");Ii(()=>{m(B,!1),m(E,!1),m(k,!1),m($,null)});function G(){m(B,!s(B)),m(te,"")}async function oe(){const R=s(te).trim();if(!(!R||s(de))){m(de,!0);try{await Ht.projects.create(R),await Ka();const U=Ut(Ca).find(ye=>ye.name===R);U&&ws(U),m(te,""),m(B,!1)}catch{St("Failed to create project","error")}finally{m(de,!1)}}}async function ne(R){R&&(ws(R),m(B,!1))}function Re(R){if(Ut(Ca).length<=1){St("Cannot delete the only project","error");return}m($,R,!0)}async function et(){if(!s($))return;const R=s($);m($,null);try{await Ht.projects.delete(R),await Ka(),St(`Project "${R}" deleted`,"success")}catch{St("Failed to delete project","error")}}function qe(){m($,null)}async function Ne(){const R=Ut(kn);if(R)try{const Z=wn();await Ht.projects.savePipeline(R.name,"main",Z),St("Pipeline saved","success")}catch{St("Failed to save pipeline","error")}}function se(){Ut(Fn).length!==0&&(m(E,!0),m(C,""))}function $e(){m(E,!1),ns(wn(),s(C)||void 0)}function Ce(){ts(wn())}function tt(){Gn.update(R=>!R)}let J=_t(c),Pe=ve(!1);async function Oe(){const R=Ut(kn);if(!(!R||s(Pe))){m(Pe,!0);try{s(J)==="running"?(Un.set("stopped"),await Ht.runtime.stop(R.name),Un.set("stopped"),St("Runtime stopped","success")):(Un.set("starting"),await Ht.runtime.start(R.name),Un.set("running"),St("Runtime started","success"))}catch{Un.set("error"),St("Runtime toggle failed","error")}finally{m(Pe,!1)}}}var Le=bl(),We=he(Le),rt=d(We),at=d(rt),Xe=d(at);Je(2),o(at);var ut=g(at,2);{var pt=R=>{var Z=cl(),U=he(Z);let ye;var fe=g(U,4),me=d(fe),ze=g(d(me),2),Ie=d(ze,!0);o(ze);var Te=g(ze,2);Fs(Te,{size:10,class:"project-chevron"}),o(me);var bt=g(me,2);{var Ct=Tt=>{var Xt=ol(),It=he(Xt),_n=g(It,2),vt=d(_n),Nt=g(d(vt),2),Ft=d(Nt,!0);o(Nt),o(vt);var T=g(vt,2);{var Y=H=>{var l=al(),v=d(l),N=g(d(v)),ce=d(N,!0);o(N),Je(),o(v);var He=g(v,4),Ve=d(He),P=g(Ve,2);o(He),o(l),le(()=>ge(ce,s($))),F("click",Ve,qe),F("click",P,et),b(H,l)},I=H=>{var l=ll(),v=he(l);gt(v,5,u,At,(P,L)=>{var ae=il();let lt;var st=d(ae);let Qt;var Jt=g(st,2),En=d(Jt,!0);o(Jt);var Sn=g(Jt,2);{var An=Gt=>{var Pt=sl();b(Gt,Pt)};Q(Sn,Gt=>{i()?.name===s(L).name&&Gt(An)})}var Tn=g(Sn,2);{var Bn=Gt=>{var Pt=rl(),en=d(Pt);Gs(en,{size:12}),o(Pt),F("click",Pt,un=>{un.stopPropagation(),Re(s(L).name)}),b(Gt,Pt)};Q(Tn,Gt=>{u().length>1&&Gt(Bn)})}o(ae),le(()=>{lt=it(ae,1,"dropdown-item svelte-11yu8dz",null,lt,{active:i()?.name===s(L).name}),Qt=it(st,1,"dropdown-item-dot svelte-11yu8dz",null,Qt,{"dot-active":i()?.name===s(L).name}),ge(En,s(L).name)}),F("click",ae,()=>ne(s(L))),b(P,ae)}),o(v);var N=g(v,2),ce=d(N);Mt(ce);var He=g(ce,2),Ve=d(He);Ws(Ve,{size:14}),o(He),o(N),le(P=>He.disabled=P,[()=>!s(te).trim()||s(de)]),F("keydown",ce,P=>P.key==="Enter"&&oe()),$t(ce,()=>s(te),P=>m(te,P)),F("click",He,oe),b(H,l)};Q(T,H=>{s($)?H(Y):H(I,!1)})}o(_n),le(()=>ge(Ft,u().length)),F("click",It,()=>{m(B,!1),m($,null)}),F("keydown",It,()=>{}),b(Tt,Xt)};Q(bt,Tt=>{s(B)&&Tt(Ct)})}o(fe);var dn=g(fe,2),Ot=d(dn);Ki(Ot,{size:14}),o(dn),le(()=>{ye=it(U,1,"conn-dot svelte-11yu8dz",null,ye,{"conn-ok":s(O)==="connected","conn-fail":s(O)==="disconnected","conn-check":s(O)==="checking"}),ot(U,"title",s(O)==="connected"?"Backend connected":s(O)==="disconnected"?"Backend disconnected":"Checking connection..."),ge(Ie,i()?.name??"No project")}),F("click",me,G),F("click",dn,Ne),b(R,Z)};Q(ut,R=>{y()||R(pt)})}o(rt);var ft=g(rt,4),De=d(ft);{var M=R=>{var Z=gl(),U=he(Z);let ye;var fe=d(U);{var me=vt=>{var Nt=dl(),Ft=he(Nt),T=d(Ft);as(T,{size:14}),o(Ft),Je(4),b(vt,Nt)},ze=vt=>{var Nt=ul(),Ft=he(Nt);ja(Ft,{size:14}),Je(2),b(vt,Nt)};Q(fe,vt=>{s(_)?vt(me):vt(ze,!1)})}o(U);var Ie=g(U,2);let Te;var bt=d(Ie);er(bt,{size:16});var Ct=g(bt,2);{var dn=vt=>{var Nt=pl();b(vt,Nt)};Q(Ct,vt=>{s(z)&&vt(dn)})}o(Ie);var Ot=g(Ie,2);let Tt;var Xt=d(Ot);let It;var _n=g(Xt,2);qi(_n,{size:13}),o(Ot),Je(2),le(()=>{ye=it(U,1,"btn-run svelte-11yu8dz",null,ye,{"btn-run-active":s(_)}),U.disabled=s(A),Te=it(Ie,1,"btn-icon svelte-11yu8dz",null,Te,{"btn-debug-active":s(z)}),Ie.disabled=s(A),Tt=it(Ot,1,"btn-runtime svelte-11yu8dz",null,Tt,{"runtime-running":s(J)==="running","runtime-error":s(J)==="error","runtime-starting":s(J)==="starting"}),Ot.disabled=s(Pe),ot(Ot,"title",s(J)==="running"?"Stop runtime":"Start runtime"),It=it(Xt,1,"runtime-dot svelte-11yu8dz",null,It,{"rt-running":s(J)==="running","rt-stopped":s(J)==="stopped","rt-error":s(J)==="error","rt-starting":s(J)==="starting"})}),F("click",U,se),F("click",Ie,Ce),F("click",Ot,Oe),b(R,Z)};Q(De,R=>{y()||R(M)})}var K=g(De,2);{var j=R=>{var Z=vl(),U=d(Z);Hs(U,{size:16}),o(Z),F("click",Z,()=>m(k,!0)),b(R,Z)};Q(K,R=>{y()||R(j)})}var q=g(K,2),ee=d(q);es(ee,{size:16}),o(q);var ue=g(q,2);{var be=R=>{var Z=hl();let U;var ye=d(Z);Gi(ye,{size:16}),o(Z),le(()=>U=it(Z,1,"btn-icon svelte-11yu8dz",null,U,{"architect-active":p()})),F("click",Z,tt),b(R,Z)};Q(ue,R=>{y()||R(be)})}o(ft),o(We);var Ee=g(We,2);nl(Ee,{get open(){return s(k)},onclose:()=>m(k,!1)});var _e=g(Ee,2);{var we=R=>{var Z=fl(),U=d(Z),ye=g(d(U),4);ma(ye),ot(ye,"rows",4);var fe=g(ye,2),me=d(fe),ze=g(me,2),Ie=d(ze);ja(Ie,{size:14}),Je(),o(ze),o(fe),o(U),o(Z),F("click",Z,()=>m(E,!1)),F("keydown",Z,Te=>Te.key==="Escape"&&m(E,!1)),F("click",U,Te=>Te.stopPropagation()),F("keydown",U,()=>{}),F("keydown",ye,Te=>{Te.key==="Enter"&&(Te.metaKey||Te.ctrlKey)&&$e()}),$t(ye,()=>s(C),Te=>m(C,Te)),F("click",me,()=>m(E,!1)),F("click",ze,$e),b(R,Z)};Q(_e,R=>{s(E)&&R(we)})}le(()=>ot(Xe,"src",ss)),F("click",q,()=>ea.set(!0)),b(t,Le),cn(),h()}xn(["click","keydown"]);function _l(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M3 15h18"}]];yt(t,xt({name:"panel-bottom"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function yl(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M15 3v18"}]];yt(t,xt({name:"panel-right"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function kl(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m18 16 4-4-4-4"}],["path",{d:"m6 8-4 4 4 4"}],["path",{d:"m14.5 4-5 16"}]];yt(t,xt({name:"code-xml"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function wl(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"}]];yt(t,xt({name:"message-square"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}var xl=w('
    No matching commands
    '),El=w(' '),Sl=w(''),Al=w('
    ',1),Tl=w('
    ');function Nl(t,e){on(e,!0);const n=()=>ct(Za,"$commandPaletteOpen",r),[r,a]=mn(),c=[{id:"nav-construct",label:"Go to Construct",category:"Navigation",icon:Ti,action:()=>jn("/construct")},{id:"nav-evaluate",label:"Go to Evaluate",category:"Navigation",icon:Jr,action:()=>jn("/evaluate")},{id:"nav-experiments",label:"Go to Experiments",category:"Navigation",icon:ei,action:()=>jn("/experiments")},{id:"nav-deploy",label:"Go to Deploy",category:"Navigation",icon:ti,action:()=>jn("/deploy")},{id:"nav-monitor",label:"Go to Monitor",category:"Navigation",icon:ni,action:()=>jn("/monitor")},{id:"nav-files",label:"Go to Files",category:"Navigation",icon:ai,action:()=>jn("/files")},{id:"node-input",label:"Add Input Node",category:"Add Node",icon:si,action:()=>Wt("input","Input")},{id:"node-output",label:"Add Output Node",category:"Add Node",icon:ri,action:()=>Wt("output","Output")},{id:"node-agent",label:"Add Agent Node",category:"Add Node",icon:ua,action:()=>Wt("agent","Agent")},{id:"node-tool",label:"Add Tool Node",category:"Add Node",icon:ii,action:()=>Wt("tool","Tool")},{id:"node-reasoning",label:"Add Reasoning Node",category:"Add Node",icon:Ni,action:()=>Wt("reasoning","Reasoning")},{id:"node-condition",label:"Add Condition Node",category:"Add Node",icon:li,action:()=>Wt("condition","Condition")},{id:"node-memory",label:"Add Memory Node",category:"Add Node",icon:Ri,action:()=>Wt("memory","Memory")},{id:"node-validator",label:"Add Validator Node",category:"Add Node",icon:oi,action:()=>Wt("validator","Validator")},{id:"node-code",label:"Add Code Node",category:"Add Node",icon:ci,action:()=>Wt("custom_code","Code")},{id:"node-fanout",label:"Add Fan Out Node",category:"Add Node",icon:di,action:()=>Wt("fan_out","Fan Out")},{id:"node-fanin",label:"Add Fan In Node",category:"Add Node",icon:ui,action:()=>Wt("fan_in","Fan In")},{id:"open-settings",label:"Open Settings",category:"Settings",icon:es,action:()=>ea.set(!0),shortcut:"⌘,"},{id:"pipeline-run",label:"Run Pipeline",category:"Pipeline Actions",icon:ja,action:()=>ns(wn())},{id:"pipeline-debug",label:"Debug Pipeline",category:"Pipeline Actions",icon:er,action:()=>ts(wn())},{id:"view-bottom-panel",label:"Toggle Bottom Panel",category:"View",icon:_l,action:()=>ia.update(k=>!k)},{id:"view-right-panel",label:"Toggle Right Panel",category:"View",icon:yl,action:()=>Pi.update(k=>!k)},{id:"view-tab-console",label:"Switch to Console Tab",category:"View",icon:pi,action:()=>{ia.set(!0),Oa.set("console")}},{id:"view-tab-code",label:"Switch to Code Tab",category:"View",icon:kl,action:()=>{ia.set(!0),Oa.set("code")}},{id:"view-tab-timeline",label:"Switch to Timeline Tab",category:"View",icon:gi,action:()=>{ia.set(!0),Oa.set("timeline")}},{id:"view-tab-chat",label:"Toggle AI Assistant Sidebar",category:"View",icon:wl,action:()=>{Gn.update(k=>!k)}}];let i=ve(""),u=ve(0),p=ve(null);function f(k,E){let C=0,G=0,oe=-1;for(let ne=0;ne=0&&(G+=ne-oe-1),oe=ne,C++);return C===E.length?G:-1}let h=_t(()=>{if(!s(i).trim())return c;const k=s(i).toLowerCase(),E=c.map(C=>{const G=f(C.label.toLowerCase(),k),oe=f(C.category.toLowerCase(),k),ne=G>=0&&oe>=0?Math.min(G,oe):Math.max(G,oe);return{cmd:C,score:ne}}).filter(C=>C.score>=0);return E.sort((C,G)=>C.score-G.score),E.map(C=>C.cmd)}),y=_t(()=>{const k=[];let E=0;const C=new Map,G=[];for(const oe of s(h))C.has(oe.category)||(C.set(oe.category,[]),G.push(oe.category)),C.get(oe.category).push({...oe,globalIndex:E}),E++;for(const oe of G)k.push({category:oe,items:C.get(oe)});return k});In(()=>{s(u)>=s(h).length&&m(u,Math.max(0,s(h).length-1),!0)}),In(()=>{n()&&(m(i,""),m(u,0),queueMicrotask(()=>s(p)?.focus()))});function _(){Za.set(!1)}function z(k){_(),queueMicrotask(()=>k.action())}function A(k){if(k.key==="Escape"){k.preventDefault(),_();return}if(k.key==="ArrowDown"){k.preventDefault(),m(u,(s(u)+1)%s(h).length),O();return}if(k.key==="ArrowUp"){k.preventDefault(),m(u,(s(u)-1+s(h).length)%s(h).length),O();return}if(k.key==="Enter"){k.preventDefault();const E=s(h)[s(u)];E&&z(E);return}}function O(){queueMicrotask(()=>{const k=s(h)[s(u)];k&&document.getElementById(`cmd-item-${k.id}`)?.scrollIntoView({block:"nearest"})})}function B(k){k.target===k.currentTarget&&_()}var te=Ze(),de=he(te);{var $=k=>{var E=Tl(),C=d(E),G=d(C),oe=d(G);vi(oe,{size:16});var ne=g(oe,2);Mt(ne),ga(ne,se=>m(p,se),()=>s(p)),Je(2),o(G);var Re=g(G,2),et=d(Re);{var qe=se=>{var $e=xl();b(se,$e)},Ne=se=>{var $e=Ze(),Ce=he($e);gt(Ce,17,()=>s(y),At,(tt,J)=>{var Pe=Al(),Oe=he(Pe),Le=d(Oe,!0);o(Oe);var We=g(Oe,2);gt(We,17,()=>s(J).items,At,(rt,at)=>{var Xe=Sl();let ut;var pt=d(Xe),ft=d(pt);Js(ft,()=>s(at).icon,(q,ee)=>{ee(q,{size:16})}),o(pt);var De=g(pt,2),M=d(De,!0);o(De);var K=g(De,2);{var j=q=>{var ee=El(),ue=d(ee,!0);o(ee),le(()=>ge(ue,s(at).shortcut)),b(q,ee)};Q(K,q=>{s(at).shortcut&&q(j)})}o(Xe),le(()=>{ot(Xe,"id",`cmd-item-${s(at).id??""}`),ut=it(Xe,1,"command-palette-item svelte-1g6akjj",null,ut,{selected:s(at).globalIndex===s(u)}),ot(Xe,"aria-selected",s(at).globalIndex===s(u)),ge(M,s(at).label)}),F("click",Xe,()=>z(s(at))),Qa("mouseenter",Xe,()=>{m(u,s(at).globalIndex,!0)}),b(rt,Xe)}),le(()=>ge(Le,s(J).category)),b(tt,Pe)}),b(se,$e)};Q(et,se=>{s(h).length===0?se(qe):se(Ne,!1)})}o(Re),Je(2),o(C),o(E),le(()=>ot(ne,"aria-activedescendant",s(h).length>0?`cmd-item-${s(h)[s(u)]?.id}`:void 0)),F("click",E,B),F("keydown",ne,A),$t(ne,()=>s(i),se=>m(i,se)),b(k,E)};Q(de,k=>{n()&&k($)})}b(t,te),cn(),a()}xn(["click","keydown"]);function Rl(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M10 8h.01"}],["path",{d:"M12 12h.01"}],["path",{d:"M14 8h.01"}],["path",{d:"M16 12h.01"}],["path",{d:"M18 8h.01"}],["path",{d:"M6 8h.01"}],["path",{d:"M7 16h10"}],["path",{d:"M8 12h.01"}],["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2"}]];yt(t,xt({name:"keyboard"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}var $l=w('+'),zl=w(' ',1),Ml=w('
    '),Cl=w('
    '),Ol=w('
    ');function Il(t,e){on(e,!1);const n=()=>ct(Wa,"$shortcutsModalOpen",r),[r,a]=mn(),i=typeof navigator<"u"&&/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"⌘":"Ctrl",u=[{category:"General",shortcuts:[{keys:`${i} + K`,description:"Open command palette"},{keys:`${i} + ,`,description:"Open settings"},{keys:`${i} + /`,description:"Toggle AI assistant"},{keys:"?",description:"Show keyboard shortcuts"},{keys:"Esc",description:"Close modal / palette"}]},{category:"Pipeline",shortcuts:[{keys:`${i} + Enter`,description:"Run pipeline"},{keys:`${i} + Shift + D`,description:"Toggle debug mode"}]},{category:"Canvas",shortcuts:[{keys:"Delete / Backspace",description:"Remove selected node"},{keys:`${i} + D`,description:"Duplicate selected node"},{keys:"Space (hold)",description:"Pan canvas"},{keys:`${i} + +`,description:"Zoom in"},{keys:`${i} + -`,description:"Zoom out"}]}];function p(){Wa.set(!1)}function f(A){A.target===A.currentTarget&&p()}function h(A){A.key==="Escape"&&(A.preventDefault(),p())}Qs();var y=Ze(),_=he(y);{var z=A=>{var O=Ol(),B=d(O),te=d(B),de=d(te),$=d(de);Rl($,{size:18}),Je(2),o(de),Je(2),o(te);var k=g(te,2);gt(k,5,()=>u,At,(E,C)=>{var G=Cl(),oe=d(G),ne=d(oe,!0);o(oe);var Re=g(oe,2);gt(Re,1,()=>s(C).shortcuts,At,(et,qe)=>{var Ne=Ml(),se=d(Ne),$e=d(se,!0);o(se);var Ce=g(se,2);gt(Ce,5,()=>s(qe).keys.split(" + "),At,(tt,J,Pe)=>{var Oe=zl(),Le=he(Oe);{var We=Xe=>{var ut=$l();b(Xe,ut)};Q(Le,Xe=>{Pe>0&&Xe(We)})}var rt=g(Le,2),at=d(rt,!0);o(rt),le(Xe=>ge(at,Xe),[()=>s(J).trim()]),b(tt,Oe)}),o(Ce),o(Ne),le(()=>ge($e,s(qe).description)),b(et,Ne)}),o(G),le(()=>ge(ne,s(C).category)),b(E,G)}),o(k),o(B),o(O),F("click",O,f),F("keydown",O,h),b(A,O)};Q(_,A=>{n()&&A(z)})}b(t,y),cn(),a()}xn(["click","keydown"]);var Pl=w(' Configured'),Ll=w('
    '),Dl=w('
    '),Bl=w('
    '),jl=w('
    '),Ul=w('

    Your Information

    The assistant will use this to personalise interactions.

    Assistant Personality

    '),Hl=w('
    ');function Fl(t,e){on(e,!0);const n=()=>ct(ea,"$settingsModalOpen",a),r=()=>ct(Ks,"$settingsData",a),[a,c]=mn(),i=[{id:"openai",label:"OpenAI",fields:[{key:"openai_api_key",label:"API Key",placeholder:"sk-..."}]},{id:"anthropic",label:"Anthropic",fields:[{key:"anthropic_api_key",label:"API Key",placeholder:"sk-ant-..."}]},{id:"google",label:"Google Gemini",fields:[{key:"google_api_key",label:"API Key",placeholder:"AIza..."}]},{id:"groq",label:"Groq",fields:[{key:"groq_api_key",label:"API Key",placeholder:"gsk_..."}]},{id:"mistral",label:"Mistral",fields:[{key:"mistral_api_key",label:"API Key",placeholder:"API key"}]},{id:"deepseek",label:"DeepSeek",fields:[{key:"deepseek_api_key",label:"API Key",placeholder:"API key"}]},{id:"cohere",label:"Cohere",fields:[{key:"cohere_api_key",label:"API Key",placeholder:"API key"}]},{id:"azure",label:"Azure OpenAI",fields:[{key:"azure_openai_api_key",label:"API Key",placeholder:"API key"},{key:"azure_openai_endpoint",label:"Endpoint URL",placeholder:"https://your-resource.openai.azure.com/"}]},{id:"bedrock",label:"Amazon Bedrock",fields:[{key:"aws_access_key_id",label:"Access Key ID",placeholder:"AKIA..."},{key:"aws_secret_access_key",label:"Secret Access Key",placeholder:"Secret key"},{key:"aws_default_region",label:"Region",placeholder:"us-east-1"}]},{id:"ollama",label:"Ollama",fields:[{key:"ollama_base_url",label:"Base URL",placeholder:"http://localhost:11434"}]}];let u=ve("credentials"),p=ve(!1),f=ve(On({})),h=ve("openai:gpt-4o"),y=ve(.7),_=ve(3),z=ve(""),A=ve(""),O=ve(""),B=ve("The Architect");In(()=>{n()&&r()&&(m(f,{},!0),m(h,r().model_defaults.default_model,!0),m(y,r().model_defaults.temperature,!0),m(_,r().model_defaults.retries,!0),r().user_profile&&(m(z,r().user_profile.name||"",!0),m(A,r().user_profile.role||"",!0),m(O,r().user_profile.context||"",!0),m(B,r().user_profile.assistant_name||"The Architect",!0)),m(u,"credentials"))});function te(ne){if(!r())return!1;const Re=r().credentials[ne];return Re!=null}function de(){ea.set(!1)}async function $(){m(p,!0);try{const ne={};for(const[et,qe]of Object.entries(s(f)))qe.trim()&&(ne[et]=qe.trim());const Re={name:s(z).trim(),role:s(A).trim(),context:s(O).trim(),assistant_name:s(B).trim()||"The Architect"};await Ua(Object.keys(ne).length>0?ne:null,{default_model:s(h),temperature:s(y),retries:s(_)},!0,Re),de()}catch{}finally{m(p,!1)}}function k(ne){ne.target===ne.currentTarget&&de()}function E(ne){ne.key==="Escape"&&(ne.preventDefault(),de())}var C=Ze(),G=he(C);{var oe=ne=>{var Re=Hl(),et=d(Re),qe=d(et),Ne=d(qe),se=d(Ne);es(se,{size:18}),Je(2),o(Ne),Je(2),o(qe);var $e=g(qe,2),Ce=d($e);let tt;var J=g(Ce,2);let Pe;var Oe=g(J,2);let Le;o($e);var We=g($e,2),rt=d(We);{var at=K=>{var j=Bl();gt(j,21,()=>i,At,(q,ee)=>{var ue=Dl();let be;var Ee=d(ue),_e=d(Ee),we=d(_e,!0);o(_e);var R=g(_e,2);{var Z=fe=>{var me=Pl(),ze=d(me);Hn(ze,{size:10}),Je(),o(me),b(fe,me)},U=_t(()=>s(ee).fields.every(fe=>te(fe.key)));Q(R,fe=>{s(U)&&fe(Z)})}o(Ee);var ye=g(Ee,2);gt(ye,17,()=>s(ee).fields,At,(fe,me)=>{var ze=Ll(),Ie=d(ze),Te=d(Ie,!0);o(Ie);var bt=g(Ie,2);Mt(bt),o(ze),le(Ct=>{ot(Ie,"for",`settings-${s(me).key??""}`),ge(Te,s(me).label),ot(bt,"id",`settings-${s(me).key??""}`),ot(bt,"placeholder",Ct),Vs(bt,s(f)[s(me).key]??"")},[()=>te(s(me).key)?"••••••••":s(me).placeholder]),F("input",bt,Ct=>{s(f)[s(me).key]=Ct.target.value}),b(fe,ze)}),o(ue),le(fe=>{be=it(ue,1,"provider-section svelte-1hvu725",null,be,fe),ge(we,s(ee).label)},[()=>({configured:s(ee).fields.every(fe=>te(fe.key))})]),b(q,ue)}),o(j),b(K,j)},Xe=K=>{var j=jl(),q=d(j),ee=g(d(q),2);qs(ee,{placeholder:"Select or type a model...",get value(){return s(h)},set value(Z){m(h,Z,!0)}}),o(q);var ue=g(q,2),be=d(ue),Ee=d(be);o(be);var _e=g(be,2);Mt(_e),o(ue);var we=g(ue,2),R=g(d(we),2);Mt(R),o(we),o(j),le(Z=>ge(Ee,`Temperature: ${Z??""}`),[()=>s(y).toFixed(2)]),$t(_e,()=>s(y),Z=>m(y,Z)),$t(R,()=>s(_),Z=>m(_,Z)),b(K,j)},ut=K=>{var j=Ul(),q=d(j),ee=g(d(q),4),ue=d(ee),be=g(d(ue),2);Mt(be),o(ue);var Ee=g(ue,2),_e=g(d(Ee),2);Mt(_e),o(Ee),o(ee);var we=g(ee,2),R=g(d(we),2);ma(R),o(we),o(q);var Z=g(q,2),U=g(d(Z),2),ye=d(U);{var fe=Te=>{var bt=Jn("The Architect speaks with measured authority and philosophical precision.");b(Te,bt)},me=Te=>{var bt=Jn("Uses a friendly, helpful personality.");b(Te,bt)};Q(ye,Te=>{s(B)==="The Architect"?Te(fe):Te(me,!1)})}o(U);var ze=g(U,2),Ie=g(d(ze),2);Mt(Ie),o(ze),o(Z),o(j),$t(be,()=>s(z),Te=>m(z,Te)),$t(_e,()=>s(A),Te=>m(A,Te)),$t(R,()=>s(O),Te=>m(O,Te)),$t(Ie,()=>s(B),Te=>m(B,Te)),b(K,j)};Q(rt,K=>{s(u)==="credentials"?K(at):s(u)==="model"?K(Xe,1):K(ut,!1)})}o(We);var pt=g(We,2),ft=d(pt),De=g(ft,2),M=d(De,!0);o(De),o(pt),o(et),o(Re),le(()=>{tt=it(Ce,1,"settings-tab svelte-1hvu725",null,tt,{active:s(u)==="credentials"}),Pe=it(J,1,"settings-tab svelte-1hvu725",null,Pe,{active:s(u)==="model"}),Le=it(Oe,1,"settings-tab svelte-1hvu725",null,Le,{active:s(u)==="profile"}),De.disabled=s(p),ge(M,s(p)?"Saving...":"Save Settings")}),F("click",Re,k),F("keydown",Re,E),F("click",Ce,()=>m(u,"credentials")),F("click",J,()=>m(u,"model")),F("click",Oe,()=>m(u,"profile")),F("click",ft,de),F("click",De,$),b(ne,Re)};Q(G,ne=>{n()&&ne(oe)})}b(t,C),cn(),c()}xn(["click","keydown","input"]);function Gl(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4"}],["path",{d:"m21 2-9.6 9.6"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5"}]];yt(t,xt({name:"key"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function Kl(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"}],["circle",{cx:"12",cy:"7",r:"4"}]];yt(t,xt({name:"user"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}var ql=w(''),Zl=w("
    "),Wl=w('
    '),Vl=w(`

    Welcome to Firefly Agentic Studio

    Build, test, and deploy AI agent pipelines visually. - We'll help you configure your AI providers in just a few steps.

    Visual pipeline builder
    Multi-provider AI support
    Local credential storage
    `),Yl=w(''),Xl=w(''),Ql=w('

    Select at least one provider to continue

    '),Jl=w('

    Choose your AI providers

    Select the providers you have API keys for. You can add more later in Settings.

    ',1),eo=w('
    '),to=w('
    '),no=w('

    Enter your API keys

    Credentials are stored locally at ~/.firefly-studio/settings.json and never sent to our servers.

    ',1),ao=w('This will be used for all new agent nodes'),so=w('

    Configure defaults

    Choose the default model for new agent nodes. You can override per-node later.

    ',1),ro=w('

    Personalise your experience

    Tell us about yourself so the AI assistant can address you properly and provide contextual help.

    ',1),io=w(`

    as default. The Architect and The Oracle are ready. - The Architect will build your pipelines, and The Oracle will guide your decisions.

    You can change these anytime from the Settings menu.

    `),lo=w(' ',1),oo=w('
    ',1),co=w(''),uo=w(''),po=w(' ',1),go=w('
    ');function vo(t,e){on(e,!0);const n=()=>ct(pa,"$firstStartWizardOpen",r),[r,a]=mn(),c=[{id:"openai",label:"OpenAI",description:"GPT-4.1, o3, o4-mini",fields:[{key:"openai_api_key",label:"API Key",placeholder:"sk-..."}]},{id:"anthropic",label:"Anthropic",description:"Claude Sonnet, Opus, Haiku",fields:[{key:"anthropic_api_key",label:"API Key",placeholder:"sk-ant-..."}]},{id:"google",label:"Google Gemini",description:"Gemini 2.5 Pro & Flash",fields:[{key:"google_api_key",label:"API Key",placeholder:"AIza..."}]},{id:"groq",label:"Groq",description:"Fast Llama & Mixtral",fields:[{key:"groq_api_key",label:"API Key",placeholder:"gsk_..."}]},{id:"mistral",label:"Mistral",description:"Mistral Large & Codestral",fields:[{key:"mistral_api_key",label:"API Key",placeholder:"API key"}]},{id:"deepseek",label:"DeepSeek",description:"DeepSeek Chat & Reasoner",fields:[{key:"deepseek_api_key",label:"API Key",placeholder:"API key"}]},{id:"cohere",label:"Cohere",description:"Command R & R+",fields:[{key:"cohere_api_key",label:"API Key",placeholder:"API key"}]},{id:"azure",label:"Azure OpenAI",description:"Azure-hosted OpenAI models",fields:[{key:"azure_openai_api_key",label:"API Key",placeholder:"API key"},{key:"azure_openai_endpoint",label:"Endpoint URL",placeholder:"https://your-resource.openai.azure.com/"}]},{id:"bedrock",label:"Amazon Bedrock",description:"AWS-hosted foundation models",fields:[{key:"aws_access_key_id",label:"Access Key ID",placeholder:"AKIA..."},{key:"aws_secret_access_key",label:"Secret Access Key",placeholder:"Secret key"},{key:"aws_default_region",label:"Region",placeholder:"us-east-1"}]},{id:"ollama",label:"Ollama",description:"Local open-source models",fields:[{key:"ollama_base_url",label:"Base URL",placeholder:"http://localhost:11434"}]}],i=[{label:"Welcome"},{label:"Providers"},{label:"API Keys"},{label:"Defaults"},{label:"Profile"},{label:"Ready"}];let u=ve(0),p=ve(On(new Set)),f=On({}),h=ve(""),y=ve(.7),_=ve(3),z=ve(!1),A=ve(""),O=ve(""),B=ve("");const te=i.length;function de(){if(s(h))return;const Ne=["anthropic","openai","google","groq","mistral","deepseek","cohere","azure","bedrock","ollama"];for(const se of Ne)if(s(p).has(se)){const $e=hi(se);if($e){m(h,$e.id,!0);return}}}function $(Ne){const se=new Set(s(p));se.has(Ne)?se.delete(Ne):se.add(Ne),m(p,se,!0)}function k(){return c.filter(Ne=>s(p).has(Ne.id))}function E(){s(u)===1&&s(p).size===0||s(u)0&&Ba(u,-1)}async function G(){m(z,!0);try{const Ne={};for(const[$e,Ce]of Object.entries(f))Ce.trim()&&(Ne[$e]=Ce.trim());const se={};s(A).trim()&&(se.name=s(A).trim()),s(O).trim()&&(se.role=s(O).trim()),s(B).trim()&&(se.context=s(B).trim()),se.assistant_name="The Architect",await Ua(Object.keys(Ne).length>0?Ne:null,{default_model:s(h),temperature:s(y),retries:s(_)},!0,Object.keys(se).length>0?se:null),m(u,te-1)}catch{}finally{m(z,!1)}}async function oe(){try{await Ua(null,null,!0)}catch{}pa.set(!1)}async function ne(){await Zs(),pa.set(!1)}var Re=Ze(),et=he(Re);{var qe=Ne=>{var se=go(),$e=d(se),Ce=d($e);gt(Ce,21,()=>i,At,(M,K,j)=>{var q=Wl();let ee;var ue=d(q),be=d(ue);{var Ee=Z=>{Hn(Z,{size:10})},_e=Z=>{var U=ql();U.textContent=j+1,b(Z,U)};Q(be,Z=>{j{var U=Zl();let ye;le(()=>ye=it(U,1,"wizard-step-line svelte-tj3wu",null,ye,{filled:j{jee=it(q,1,"wizard-step-indicator svelte-tj3wu",null,ee,{active:j===s(u),completed:j{var K=Vl(),j=d(K),q=g(j,6),ee=d(q),ue=d(ee);Ha(ue,{size:16}),Je(2),o(ee);var be=g(ee,2),Ee=d(be);xs(Ee,{size:16}),Je(2),o(be);var _e=g(be,2),we=d(_e);Gl(we,{size:16}),Je(2),o(_e),o(q),o(K),le(()=>ot(j,"src",ss)),b(M,K)},Oe=M=>{var K=Jl(),j=g(he(K),4);gt(j,21,()=>c,At,(ue,be)=>{var Ee=Xl();let _e;var we=d(Ee);{var R=ze=>{var Ie=Yl(),Te=d(Ie);Hn(Te,{size:10}),o(Ie),b(ze,Ie)},Z=_t(()=>s(p).has(s(be).id));Q(we,ze=>{s(Z)&&ze(R)})}var U=g(we,2),ye=d(U,!0);o(U);var fe=g(U,2),me=d(fe,!0);o(fe),o(Ee),le(ze=>{_e=it(Ee,1,"wizard-provider-card svelte-tj3wu",null,_e,ze),ge(ye,s(be).label),ge(me,s(be).description)},[()=>({selected:s(p).has(s(be).id)})]),F("click",Ee,()=>$(s(be).id)),b(ue,Ee)}),o(j);var q=g(j,2);{var ee=ue=>{var be=Ql();b(ue,be)};Q(q,ue=>{s(p).size===0&&ue(ee)})}b(M,K)},Le=M=>{var K=no(),j=g(he(K),4);gt(j,21,k,At,(q,ee)=>{var ue=to(),be=d(ue),Ee=d(be,!0);o(be);var _e=g(be,2);gt(_e,17,()=>s(ee).fields,At,(we,R)=>{var Z=eo(),U=d(Z),ye=d(U,!0);o(U);var fe=g(U,2);Mt(fe),o(Z),le(()=>{ot(U,"for",`wizard-${s(R).key??""}`),ge(ye,s(R).label),ot(fe,"id",`wizard-${s(R).key??""}`),ot(fe,"placeholder",s(R).placeholder),Vs(fe,f[s(R).key]??"")}),F("input",fe,me=>{f[s(R).key]=me.target.value}),b(we,Z)}),o(ue),le(()=>ge(Ee,s(ee).label)),b(q,ue)}),o(j),b(M,K)},We=M=>{var K=so(),j=g(he(K),4),q=d(j),ee=g(d(q),2);qs(ee,{placeholder:"Select or type a model...",get value(){return s(h)},set value(me){m(h,me,!0)}});var ue=g(ee,2);{var be=me=>{var ze=ao();b(me,ze)};Q(ue,me=>{s(h)&&me(be)})}o(q);var Ee=g(q,2),_e=d(Ee),we=g(d(_e),2),R=d(we);Mt(R);var Z=g(R,2),U=d(Z,!0);o(Z),o(we),o(_e);var ye=g(_e,2),fe=g(d(ye),2);Mt(fe),o(ye),o(Ee),o(j),le(me=>ge(U,me),[()=>s(y).toFixed(2)]),$t(R,()=>s(y),me=>m(y,me)),$t(fe,()=>s(_),me=>m(_,me)),b(M,K)},rt=M=>{var K=ro(),j=g(he(K),4),q=d(j),ee=d(q),ue=g(d(ee),2);Mt(ue),o(ee);var be=g(ee,2),Ee=g(d(be),2);Mt(Ee),o(be),o(q);var _e=g(q,2),we=g(d(_e),2);ma(we),o(_e),o(j),$t(ue,()=>s(A),R=>m(A,R)),$t(Ee,()=>s(O),R=>m(O,R)),$t(we,()=>s(B),R=>m(B,R)),b(M,K)},at=M=>{var K=io(),j=d(K),q=d(j);Hn(q,{size:32}),o(j);var ee=g(j,2),ue=d(ee);{var be=U=>{var ye=Jn();le(()=>ge(ye,`Welcome, ${s(A)??""}!`)),b(U,ye)},Ee=U=>{var ye=Jn("You're all set!");b(U,ye)};Q(ue,U=>{s(A)?U(be):U(Ee,!1)})}o(ee);var _e=g(ee,2),we=d(_e),R=g(we),Z=d(R,!0);o(R),Je(5),o(_e),Je(2),o(K),le(U=>{ge(we,`Your ${s(p).size??""} provider${s(p).size!==1?"s are":" is"} configured - with `),ge(Z,U)},[()=>s(h)?s(h).split(":")[1]:"default model"]),b(M,K)};Q(J,M=>{s(u)===0?M(Pe):s(u)===1?M(Oe,1):s(u)===2?M(Le,2):s(u)===3?M(We,3):s(u)===4?M(rt,4):M(at,!1)})}o(tt);var Xe=g(tt,2),ut=d(Xe);{var pt=M=>{var K=lo(),j=he(K),q=g(j,2);F("click",j,oe),F("click",q,E),b(M,K)},ft=M=>{var K=oo(),j=g(he(K),2),q=d(j);xs(q,{size:14}),Je(),o(j),F("click",j,ne),b(M,K)},De=M=>{var K=po(),j=he(K),q=d(j),ee=g(q,2);o(j);var ue=g(j,2);{var be=_e=>{var we=co(),R=d(we,!0);o(we),le(()=>{we.disabled=s(z)||!s(h),ge(R,s(z)?"Saving...":"Finish Setup")}),F("click",we,G),b(_e,we)},Ee=_e=>{var we=uo();le(()=>we.disabled=s(u)===1&&s(p).size===0),F("click",we,E),b(_e,we)};Q(ue,_e=>{s(u)===4?_e(be):_e(Ee,!1)})}F("click",q,oe),F("click",ee,C),b(M,K)};Q(ut,M=>{s(u)===0?M(pt):s(u)===te-1?M(ft,1):M(De,!1)})}o(Xe),o($e),o(se),b(Ne,se)};Q(et,Ne=>{n()&&Ne(qe)})}b(t,Re),cn(),a()}xn(["click","input"]);var ho=w(''),fo=w('
    ');function bo(t,e){on(e,!1);const n=()=>ct(fi,"$toasts",r),[r,a]=mn(),c={success:Hn,error:_i,warning:mi,info:bi},i={success:"var(--color-success)",error:"var(--color-error)",warning:"var(--color-warning)",info:"var(--color-info)"};Qs();var u=Ze(),p=he(u);{var f=h=>{var y=fo();gt(y,5,n,_=>_.id,(_,z)=>{var A=ho();let O;var B=d(A),te=d(B);Js(te,()=>c[s(z).type],(C,G)=>{G(C,{size:16})}),o(B);var de=g(B,2),$=d(de,!0);o(de);var k=g(de,2),E=d(k);Fa(E,{size:14}),o(k),o(A),le(()=>{O=Ys(A,"",O,{"--toast-color":i[s(z).type]}),ge($,s(z).message)}),F("click",k,()=>yi(s(z).id)),ki(3,A,()=>wi,()=>({y:16,duration:200})),b(_,A)}),o(y),b(h,y)};Q(p,h=>{n().length>0&&h(f)})}b(t,u),cn(),a()}xn(["click"]);function mo(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"}],["circle",{cx:"12",cy:"13",r:"3"}]];yt(t,xt({name:"camera"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function _o(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}],["path",{d:"M8 13h2"}],["path",{d:"M14 13h2"}],["path",{d:"M8 17h2"}],["path",{d:"M14 17h2"}]];yt(t,xt({name:"file-spreadsheet"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function yo(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2"}],["circle",{cx:"9",cy:"9",r:"2"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"}]];yt(t,xt({name:"image"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function ko(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M9 3v18"}],["path",{d:"m16 15-3-3 3-3"}]];yt(t,xt({name:"panel-left-close"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function wo(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551"}]];yt(t,xt({name:"paperclip"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function xo(t,e){const n=wt(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M2 3h20"}],["path",{d:"M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3"}],["path",{d:"m7 21 5-5 5 5"}]];yt(t,xt({name:"presentation"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ze(),u=he(i);kt(u,e,"default",{}),b(a,i)},$$slots:{default:!0}}))}function rs(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Dn=rs();function nr(t){Dn=t}var Cn={exec:()=>null};function Ue(t,e=""){let n=typeof t=="string"?t:t.source,r={replace:(a,c)=>{let i=typeof c=="string"?c:c.source;return i=i.replace(zt.caret,"$1"),n=n.replace(a,i),r},getRegex:()=>new RegExp(n,e)};return r}var Eo=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}>`)},So=/^(?:[ \t]*(?:\n|$))+/,Ao=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,To=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ta=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,No=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,is=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,ar=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,sr=Ue(ar).replace(/bull/g,is).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Ro=Ue(ar).replace(/bull/g,is).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),ls=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,$o=/^[^\n]+/,os=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,zo=Ue(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",os).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Mo=Ue(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,is).getRegex(),_a="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",cs=/|$))/,Co=Ue("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",cs).replace("tag",_a).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),rr=Ue(ls).replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",_a).getRegex(),Oo=Ue(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",rr).getRegex(),ds={blockquote:Oo,code:Ao,def:zo,fences:To,heading:No,hr:ta,html:Co,lheading:sr,list:Mo,newline:So,paragraph:rr,table:Cn,text:$o},As=Ue("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",_a).getRegex(),Io={...ds,lheading:Ro,table:As,paragraph:Ue(ls).replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",As).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",_a).getRegex()},Po={...ds,html:Ue(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",cs).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Cn,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Ue(ls).replace("hr",ta).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",sr).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Lo=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Do=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,ir=/^( {2,}|\\)\n(?!\s*$)/,Bo=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Eo?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),dr=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,qo=Ue(dr,"u").replace(/punct/g,ya).getRegex(),Zo=Ue(dr,"u").replace(/punct/g,or).getRegex(),ur="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Wo=Ue(ur,"gu").replace(/notPunctSpace/g,lr).replace(/punctSpace/g,us).replace(/punct/g,ya).getRegex(),Vo=Ue(ur,"gu").replace(/notPunctSpace/g,Ho).replace(/punctSpace/g,Uo).replace(/punct/g,or).getRegex(),Yo=Ue("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,lr).replace(/punctSpace/g,us).replace(/punct/g,ya).getRegex(),Xo=Ue(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,cr).getRegex(),Qo="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Jo=Ue(Qo,"gu").replace(/notPunctSpace/g,Go).replace(/punctSpace/g,Fo).replace(/punct/g,cr).getRegex(),ec=Ue(/\\(punct)/,"gu").replace(/punct/g,ya).getRegex(),tc=Ue(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),nc=Ue(cs).replace("(?:-->|$)","-->").getRegex(),ac=Ue("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",nc).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),va=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,sc=Ue(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",va).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),pr=Ue(/^!?\[(label)\]\[(ref)\]/).replace("label",va).replace("ref",os).getRegex(),gr=Ue(/^!?\[(ref)\](?:\[\])?/).replace("ref",os).getRegex(),rc=Ue("reflink|nolink(?!\\()","g").replace("reflink",pr).replace("nolink",gr).getRegex(),Ts=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,ps={_backpedal:Cn,anyPunctuation:ec,autolink:tc,blockSkip:Ko,br:ir,code:Do,del:Cn,delLDelim:Cn,delRDelim:Cn,emStrongLDelim:qo,emStrongRDelimAst:Wo,emStrongRDelimUnd:Yo,escape:Lo,link:sc,nolink:gr,punctuation:jo,reflink:pr,reflinkSearch:rc,tag:ac,text:Bo,url:Cn},ic={...ps,link:Ue(/^!?\[(label)\]\((.*?)\)/).replace("label",va).getRegex(),reflink:Ue(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",va).getRegex()},Va={...ps,emStrongRDelimAst:Vo,emStrongLDelim:Zo,delLDelim:Xo,delRDelim:Jo,url:Ue(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Ts).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Ue(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},Ns=t=>oc[t];function ln(t,e){if(e){if(zt.escapeTest.test(t))return t.replace(zt.escapeReplace,Ns)}else if(zt.escapeTestNoEncode.test(t))return t.replace(zt.escapeReplaceNoEncode,Ns);return t}function Rs(t){try{t=encodeURI(t).replace(zt.percentDecode,"%")}catch{return null}return t}function $s(t,e){let n=t.replace(zt.findPipe,(c,i,u)=>{let p=!1,f=i;for(;--f>=0&&u[f]==="\\";)p=!p;return p?"|":" |"}),r=n.split(zt.splitPipe),a=0;if(r[0].trim()||r.shift(),r.length>0&&!r.at(-1)?.trim()&&r.pop(),e)if(r.length>e)r.splice(e);else for(;r.length0?-2:-1}function dc(t,e=0){let n=e,r="";for(let a of t)if(a===" "){let c=4-n%4;r+=" ".repeat(c),n+=c}else r+=a,n++;return r}function zs(t,e,n,r,a){let c=e.href,i=e.title||null,u=t[1].replace(a.other.outputLinkReplace,"$1");r.state.inLink=!0;let p={type:t[0].charAt(0)==="!"?"image":"link",raw:n,href:c,title:i,text:u,tokens:r.inlineTokens(u)};return r.state.inLink=!1,p}function uc(t,e,n){let r=t.match(n.other.indentCodeCompensation);if(r===null)return e;let a=r[1];return e.split(` -`).map(c=>{let i=c.match(n.other.beginningSpace);if(i===null)return c;let[u]=i;return u.length>=a.length?c.slice(a.length):c}).join(` -`)}var ha=class{options;rules;lexer;constructor(t){this.options=t||Dn}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let n=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Wn(n,` -`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let n=e[0],r=uc(n,e[3]||"",this.rules);return{type:"code",raw:n,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:r}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let n=e[2].trim();if(this.rules.other.endingHash.test(n)){let r=Wn(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:Wn(e[0],` -`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let n=Wn(e[0],` -`).split(` -`),r="",a="",c=[];for(;n.length>0;){let i=!1,u=[],p;for(p=0;p1,a={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");let c=this.rules.other.listItemRegex(n),i=!1;for(;t;){let p=!1,f="",h="";if(!(e=c.exec(t))||this.rules.block.hr.test(t))break;f=e[0],t=t.substring(f.length);let y=dc(e[2].split(` -`,1)[0],e[1].length),_=t.split(` -`,1)[0],z=!y.trim(),A=0;if(this.options.pedantic?(A=2,h=y.trimStart()):z?A=e[1].length+1:(A=y.search(this.rules.other.nonSpaceChar),A=A>4?1:A,h=y.slice(A),A+=e[1].length),z&&this.rules.other.blankLine.test(_)&&(f+=_+` -`,t=t.substring(_.length+1),p=!0),!p){let O=this.rules.other.nextBulletRegex(A),B=this.rules.other.hrRegex(A),te=this.rules.other.fencesBeginRegex(A),de=this.rules.other.headingBeginRegex(A),$=this.rules.other.htmlBeginRegex(A),k=this.rules.other.blockquoteBeginRegex(A);for(;t;){let E=t.split(` -`,1)[0],C;if(_=E,this.options.pedantic?(_=_.replace(this.rules.other.listReplaceNesting," "),C=_):C=_.replace(this.rules.other.tabCharGlobal," "),te.test(_)||de.test(_)||$.test(_)||k.test(_)||O.test(_)||B.test(_))break;if(C.search(this.rules.other.nonSpaceChar)>=A||!_.trim())h+=` -`+C.slice(A);else{if(z||y.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||te.test(y)||de.test(y)||B.test(y))break;h+=` -`+_}z=!_.trim(),f+=E+` -`,t=t.substring(E.length+1),y=C.slice(A)}}a.loose||(i?a.loose=!0:this.rules.other.doubleBlankLine.test(f)&&(i=!0)),a.items.push({type:"list_item",raw:f,task:!!this.options.gfm&&this.rules.other.listIsTask.test(h),loose:!1,text:h,tokens:[]}),a.raw+=f}let u=a.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;a.raw=a.raw.trimEnd();for(let p of a.items){if(this.lexer.state.top=!1,p.tokens=this.lexer.blockTokens(p.text,[]),p.task){if(p.text=p.text.replace(this.rules.other.listReplaceTask,""),p.tokens[0]?.type==="text"||p.tokens[0]?.type==="paragraph"){p.tokens[0].raw=p.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),p.tokens[0].text=p.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}}let f=this.rules.other.listTaskCheckbox.exec(p.raw);if(f){let h={type:"checkbox",raw:f[0]+" ",checked:f[0]!=="[ ]"};p.checked=h.checked,a.loose?p.tokens[0]&&["paragraph","text"].includes(p.tokens[0].type)&&"tokens"in p.tokens[0]&&p.tokens[0].tokens?(p.tokens[0].raw=h.raw+p.tokens[0].raw,p.tokens[0].text=h.raw+p.tokens[0].text,p.tokens[0].tokens.unshift(h)):p.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):p.tokens.unshift(h)}}if(!a.loose){let f=p.tokens.filter(y=>y.type==="space"),h=f.length>0&&f.some(y=>this.rules.other.anyLine.test(y.raw));a.loose=h}}if(a.loose)for(let p of a.items){p.loose=!0;for(let f of p.tokens)f.type==="text"&&(f.type="paragraph")}return a}}html(t){let e=this.rules.block.html.exec(t);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(t){let e=this.rules.block.def.exec(t);if(e){let n=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",a=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:n,raw:e[0],href:r,title:a}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let n=$s(e[1]),r=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),a=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` -`):[],c={type:"table",raw:e[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let i of r)this.rules.other.tableAlignRight.test(i)?c.align.push("right"):this.rules.other.tableAlignCenter.test(i)?c.align.push("center"):this.rules.other.tableAlignLeft.test(i)?c.align.push("left"):c.align.push(null);for(let i=0;i({text:u,tokens:this.lexer.inline(u),header:!1,align:c.align[p]})));return c}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let n=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:n,tokens:this.lexer.inline(n)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let n=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let c=Wn(n.slice(0,-1),"\\");if((n.length-c.length)%2===0)return}else{let c=cc(e[2],"()");if(c===-2)return;if(c>-1){let i=(e[0].indexOf("!")===0?5:4)+e[1].length+c;e[2]=e[2].substring(0,c),e[0]=e[0].substring(0,i).trim(),e[3]=""}}let r=e[2],a="";if(this.options.pedantic){let c=this.rules.other.pedanticHrefTitle.exec(r);c&&(r=c[1],a=c[3])}else a=e[3]?e[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),zs(e,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:a&&a.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let n;if((n=this.rules.inline.reflink.exec(t))||(n=this.rules.inline.nolink.exec(t))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),a=e[r.toLowerCase()];if(!a){let c=n[0].charAt(0);return{type:"text",raw:c,text:c}}return zs(n,a,n[0],this.lexer,this.rules)}}emStrong(t,e,n=""){let r=this.rules.inline.emStrongLDelim.exec(t);if(!(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(r[1]||r[2])||!n||this.rules.inline.punctuation.exec(n))){let a=[...r[0]].length-1,c,i,u=a,p=0,f=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(f.lastIndex=0,e=e.slice(-1*t.length+a);(r=f.exec(e))!=null;){if(c=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!c)continue;if(i=[...c].length,r[3]||r[4]){u+=i;continue}else if((r[5]||r[6])&&a%3&&!((a+i)%3)){p+=i;continue}if(u-=i,u>0)continue;i=Math.min(i,i+u+p);let h=[...r[0]][0].length,y=t.slice(0,a+r.index+h+i);if(Math.min(a,i)%2){let z=y.slice(1,-1);return{type:"em",raw:y,text:z,tokens:this.lexer.inlineTokens(z)}}let _=y.slice(2,-2);return{type:"strong",raw:y,text:_,tokens:this.lexer.inlineTokens(_)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let n=e[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(n),a=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&a&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:e[0],text:n}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t,e,n=""){let r=this.rules.inline.delLDelim.exec(t);if(r&&(!r[1]||!n||this.rules.inline.punctuation.exec(n))){let a=[...r[0]].length-1,c,i,u=a,p=this.rules.inline.delRDelim;for(p.lastIndex=0,e=e.slice(-1*t.length+a);(r=p.exec(e))!=null;){if(c=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!c||(i=[...c].length,i!==a))continue;if(r[3]||r[4]){u+=i;continue}if(u-=i,u>0)continue;i=Math.min(i,i+u);let f=[...r[0]][0].length,h=t.slice(0,a+r.index+f+i),y=h.slice(a,-a);return{type:"del",raw:h,text:y,tokens:this.lexer.inlineTokens(y)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let n,r;return e[2]==="@"?(n=e[1],r="mailto:"+n):(n=e[1],r=n),{type:"link",raw:e[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let n,r;if(e[2]==="@")n=e[0],r="mailto:"+n;else{let a;do a=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(a!==e[0]);n=e[0],e[1]==="www."?r="http://"+e[0]:r=e[0]}return{type:"link",raw:e[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let n=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:n}}}},Vt=class Ya{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Dn,this.options.tokenizer=this.options.tokenizer||new ha,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:zt,block:ca.normal,inline:Zn.normal};this.options.pedantic?(n.block=ca.pedantic,n.inline=Zn.pedantic):this.options.gfm&&(n.block=ca.gfm,this.options.breaks?n.inline=Zn.breaks:n.inline=Zn.gfm),this.tokenizer.rules=n}static get rules(){return{block:ca,inline:Zn}}static lex(e,n){return new Ya(n).lex(e)}static lexInline(e,n){return new Ya(n).inlineTokens(e)}lex(e){e=e.replace(zt.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let n=0;n(a=i.call({lexer:this},e,n))?(e=e.substring(a.raw.length),n.push(a),!0):!1))continue;if(a=this.tokenizer.space(e)){e=e.substring(a.raw.length);let i=n.at(-1);a.raw.length===1&&i!==void 0?i.raw+=` -`:n.push(a);continue}if(a=this.tokenizer.code(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.at(-1).src=i.text):n.push(a);continue}if(a=this.tokenizer.fences(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.heading(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.hr(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.blockquote(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.list(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.html(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.def(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[a.tag]||(this.tokens.links[a.tag]={href:a.href,title:a.title},n.push(a));continue}if(a=this.tokenizer.table(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.lheading(e)){e=e.substring(a.raw.length),n.push(a);continue}let c=e;if(this.options.extensions?.startBlock){let i=1/0,u=e.slice(1),p;this.options.extensions.startBlock.forEach(f=>{p=f.call({lexer:this},u),typeof p=="number"&&p>=0&&(i=Math.min(i,p))}),i<1/0&&i>=0&&(c=e.substring(0,i+1))}if(this.state.top&&(a=this.tokenizer.paragraph(c))){let i=n.at(-1);r&&i?.type==="paragraph"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):n.push(a),r=c.length!==e.length,e=e.substring(a.raw.length);continue}if(a=this.tokenizer.text(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):n.push(a);continue}if(e){let i="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(i);break}else throw new Error(i)}}return this.state.top=!0,n}inline(e,n=[]){return this.inlineQueue.push({src:e,tokens:n}),n}inlineTokens(e,n=[]){let r=e,a=null;if(this.tokens.links){let p=Object.keys(this.tokens.links);if(p.length>0)for(;(a=this.tokenizer.rules.inline.reflinkSearch.exec(r))!=null;)p.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(a=this.tokenizer.rules.inline.anyPunctuation.exec(r))!=null;)r=r.slice(0,a.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let c;for(;(a=this.tokenizer.rules.inline.blockSkip.exec(r))!=null;)c=a[2]?a[2].length:0,r=r.slice(0,a.index+c)+"["+"a".repeat(a[0].length-c-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);r=this.options.hooks?.emStrongMask?.call({lexer:this},r)??r;let i=!1,u="";for(;e;){i||(u=""),i=!1;let p;if(this.options.extensions?.inline?.some(h=>(p=h.call({lexer:this},e,n))?(e=e.substring(p.raw.length),n.push(p),!0):!1))continue;if(p=this.tokenizer.escape(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.tag(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.link(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(p.raw.length);let h=n.at(-1);p.type==="text"&&h?.type==="text"?(h.raw+=p.raw,h.text+=p.text):n.push(p);continue}if(p=this.tokenizer.emStrong(e,r,u)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.codespan(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.br(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.del(e,r,u)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.autolink(e)){e=e.substring(p.raw.length),n.push(p);continue}if(!this.state.inLink&&(p=this.tokenizer.url(e))){e=e.substring(p.raw.length),n.push(p);continue}let f=e;if(this.options.extensions?.startInline){let h=1/0,y=e.slice(1),_;this.options.extensions.startInline.forEach(z=>{_=z.call({lexer:this},y),typeof _=="number"&&_>=0&&(h=Math.min(h,_))}),h<1/0&&h>=0&&(f=e.substring(0,h+1))}if(p=this.tokenizer.inlineText(f)){e=e.substring(p.raw.length),p.raw.slice(-1)!=="_"&&(u=p.raw.slice(-1)),i=!0;let h=n.at(-1);h?.type==="text"?(h.raw+=p.raw,h.text+=p.text):n.push(p);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return n}},fa=class{options;parser;constructor(t){this.options=t||Dn}space(t){return""}code({text:t,lang:e,escaped:n}){let r=(e||"").match(zt.notSpaceStart)?.[0],a=t.replace(zt.endingNewline,"")+` -`;return r?'
    '+(n?a:ln(a,!0))+`
    -`:"
    "+(n?a:ln(a,!0))+`
    -`}blockquote({tokens:t}){return`
    -${this.parser.parse(t)}
    -`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} -`}hr(t){return`
    -`}list(t){let e=t.ordered,n=t.start,r="";for(let i=0;i -`+r+" -`}listitem(t){return`
  • ${this.parser.parse(t.tokens)}
  • -`}checkbox({checked:t}){return" '}paragraph({tokens:t}){return`

    ${this.parser.parseInline(t)}

    -`}table(t){let e="",n="";for(let a=0;a${r}`),` - -`+e+` -`+r+`
    -`}tablerow({text:t}){return` -${t} -`}tablecell(t){let e=this.parser.parseInline(t.tokens),n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+` -`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${ln(t,!0)}`}br(t){return"
    "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:n}){let r=this.parser.parseInline(n),a=Rs(t);if(a===null)return r;t=a;let c='
    ",c}image({href:t,title:e,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let a=Rs(t);if(a===null)return ln(n);t=a;let c=`${ln(n)}{let i=a[c].flat(1/0);n=n.concat(this.walkTokens(i,e))}):a.tokens&&(n=n.concat(this.walkTokens(a.tokens,e)))}}return n}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(a=>{if(!a.name)throw new Error("extension name required");if("renderer"in a){let c=e.renderers[a.name];c?e.renderers[a.name]=function(...i){let u=a.renderer.apply(this,i);return u===!1&&(u=c.apply(this,i)),u}:e.renderers[a.name]=a.renderer}if("tokenizer"in a){if(!a.level||a.level!=="block"&&a.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let c=e[a.level];c?c.unshift(a.tokenizer):e[a.level]=[a.tokenizer],a.start&&(a.level==="block"?e.startBlock?e.startBlock.push(a.start):e.startBlock=[a.start]:a.level==="inline"&&(e.startInline?e.startInline.push(a.start):e.startInline=[a.start]))}"childTokens"in a&&a.childTokens&&(e.childTokens[a.name]=a.childTokens)}),r.extensions=e),n.renderer){let a=this.defaults.renderer||new fa(this.defaults);for(let c in n.renderer){if(!(c in a))throw new Error(`renderer '${c}' does not exist`);if(["options","parser"].includes(c))continue;let i=c,u=n.renderer[i],p=a[i];a[i]=(...f)=>{let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h||""}}r.renderer=a}if(n.tokenizer){let a=this.defaults.tokenizer||new ha(this.defaults);for(let c in n.tokenizer){if(!(c in a))throw new Error(`tokenizer '${c}' does not exist`);if(["options","rules","lexer"].includes(c))continue;let i=c,u=n.tokenizer[i],p=a[i];a[i]=(...f)=>{let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h}}r.tokenizer=a}if(n.hooks){let a=this.defaults.hooks||new Yn;for(let c in n.hooks){if(!(c in a))throw new Error(`hook '${c}' does not exist`);if(["options","block"].includes(c))continue;let i=c,u=n.hooks[i],p=a[i];Yn.passThroughHooks.has(c)?a[i]=f=>{if(this.defaults.async&&Yn.passThroughHooksRespectAsync.has(c))return(async()=>{let y=await u.call(a,f);return p.call(a,y)})();let h=u.call(a,f);return p.call(a,h)}:a[i]=(...f)=>{if(this.defaults.async)return(async()=>{let y=await u.apply(a,f);return y===!1&&(y=await p.apply(a,f)),y})();let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h}}r.hooks=a}if(n.walkTokens){let a=this.defaults.walkTokens,c=n.walkTokens;r.walkTokens=function(i){let u=[];return u.push(c.call(this,i)),a&&(u=u.concat(a.call(this,i))),u}}this.defaults={...this.defaults,...r}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return Vt.lex(t,e??this.defaults)}parser(t,e){return Yt.parse(t,e??this.defaults)}parseMarkdown(t){return(e,n)=>{let r={...n},a={...this.defaults,...r},c=this.onError(!!a.silent,!!a.async);if(this.defaults.async===!0&&r.async===!1)return c(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return c(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return c(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(a.hooks&&(a.hooks.options=a,a.hooks.block=t),a.async)return(async()=>{let i=a.hooks?await a.hooks.preprocess(e):e,u=await(a.hooks?await a.hooks.provideLexer():t?Vt.lex:Vt.lexInline)(i,a),p=a.hooks?await a.hooks.processAllTokens(u):u;a.walkTokens&&await Promise.all(this.walkTokens(p,a.walkTokens));let f=await(a.hooks?await a.hooks.provideParser():t?Yt.parse:Yt.parseInline)(p,a);return a.hooks?await a.hooks.postprocess(f):f})().catch(c);try{a.hooks&&(e=a.hooks.preprocess(e));let i=(a.hooks?a.hooks.provideLexer():t?Vt.lex:Vt.lexInline)(e,a);a.hooks&&(i=a.hooks.processAllTokens(i)),a.walkTokens&&this.walkTokens(i,a.walkTokens);let u=(a.hooks?a.hooks.provideParser():t?Yt.parse:Yt.parseInline)(i,a);return a.hooks&&(u=a.hooks.postprocess(u)),u}catch(i){return c(i)}}}onError(t,e){return n=>{if(n.message+=` -Please report this to https://github.com/markedjs/marked.`,t){let r="

    An error occurred:

    "+ln(n.message+"",!0)+"
    ";return e?Promise.resolve(r):r}if(e)return Promise.reject(n);throw n}}},Pn=new pc;function Ke(t,e){return Pn.parse(t,e)}Ke.options=Ke.setOptions=function(t){return Pn.setOptions(t),Ke.defaults=Pn.defaults,nr(Ke.defaults),Ke};Ke.getDefaults=rs;Ke.defaults=Dn;Ke.use=function(...t){return Pn.use(...t),Ke.defaults=Pn.defaults,nr(Ke.defaults),Ke};Ke.walkTokens=function(t,e){return Pn.walkTokens(t,e)};Ke.parseInline=Pn.parseInline;Ke.Parser=Yt;Ke.parser=Yt.parse;Ke.Renderer=fa;Ke.TextRenderer=gs;Ke.Lexer=Vt;Ke.lexer=Vt.lex;Ke.Tokenizer=ha;Ke.Hooks=Yn;Ke.parse=Ke;Ke.options;Ke.setOptions;Ke.use;Ke.walkTokens;Ke.parseInline;Yt.parse;Vt.lex;function gc(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Ia,Ms;function vc(){if(Ms)return Ia;Ms=1;function t(l){return l instanceof Map?l.clear=l.delete=l.set=function(){throw new Error("map is read-only")}:l instanceof Set&&(l.add=l.clear=l.delete=function(){throw new Error("set is read-only")}),Object.freeze(l),Object.getOwnPropertyNames(l).forEach(v=>{const N=l[v],ce=typeof N;(ce==="object"||ce==="function")&&!Object.isFrozen(N)&&t(N)}),l}class e{constructor(v){v.data===void 0&&(v.data={}),this.data=v.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function n(l){return l.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(l,...v){const N=Object.create(null);for(const ce in l)N[ce]=l[ce];return v.forEach(function(ce){for(const He in ce)N[He]=ce[He]}),N}const a="
    ",c=l=>!!l.scope,i=(l,{prefix:v})=>{if(l.startsWith("language:"))return l.replace("language:","language-");if(l.includes(".")){const N=l.split(".");return[`${v}${N.shift()}`,...N.map((ce,He)=>`${ce}${"_".repeat(He+1)}`)].join(" ")}return`${v}${l}`};class u{constructor(v,N){this.buffer="",this.classPrefix=N.classPrefix,v.walk(this)}addText(v){this.buffer+=n(v)}openNode(v){if(!c(v))return;const N=i(v.scope,{prefix:this.classPrefix});this.span(N)}closeNode(v){c(v)&&(this.buffer+=a)}value(){return this.buffer}span(v){this.buffer+=``}}const p=(l={})=>{const v={children:[]};return Object.assign(v,l),v};class f{constructor(){this.rootNode=p(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(v){this.top.children.push(v)}openNode(v){const N=p({scope:v});this.add(N),this.stack.push(N)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(v){return this.constructor._walk(v,this.rootNode)}static _walk(v,N){return typeof N=="string"?v.addText(N):N.children&&(v.openNode(N),N.children.forEach(ce=>this._walk(v,ce)),v.closeNode(N)),v}static _collapse(v){typeof v!="string"&&v.children&&(v.children.every(N=>typeof N=="string")?v.children=[v.children.join("")]:v.children.forEach(N=>{f._collapse(N)}))}}class h extends f{constructor(v){super(),this.options=v}addText(v){v!==""&&this.add(v)}startScope(v){this.openNode(v)}endScope(){this.closeNode()}__addSublanguage(v,N){const ce=v.root;N&&(ce.scope=`language:${N}`),this.add(ce)}toHTML(){return new u(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function y(l){return l?typeof l=="string"?l:l.source:null}function _(l){return O("(?=",l,")")}function z(l){return O("(?:",l,")*")}function A(l){return O("(?:",l,")?")}function O(...l){return l.map(N=>y(N)).join("")}function B(l){const v=l[l.length-1];return typeof v=="object"&&v.constructor===Object?(l.splice(l.length-1,1),v):{}}function te(...l){return"("+(B(l).capture?"":"?:")+l.map(ce=>y(ce)).join("|")+")"}function de(l){return new RegExp(l.toString()+"|").exec("").length-1}function $(l,v){const N=l&&l.exec(v);return N&&N.index===0}const k=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function E(l,{joinWith:v}){let N=0;return l.map(ce=>{N+=1;const He=N;let Ve=y(ce),P="";for(;Ve.length>0;){const L=k.exec(Ve);if(!L){P+=Ve;break}P+=Ve.substring(0,L.index),Ve=Ve.substring(L.index+L[0].length),L[0][0]==="\\"&&L[1]?P+="\\"+String(Number(L[1])+He):(P+=L[0],L[0]==="("&&N++)}return P}).map(ce=>`(${ce})`).join(v)}const C=/\b\B/,G="[a-zA-Z]\\w*",oe="[a-zA-Z_]\\w*",ne="\\b\\d+(\\.\\d+)?",Re="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",et="\\b(0b[01]+)",qe="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",Ne=(l={})=>{const v=/^#![ ]*\//;return l.binary&&(l.begin=O(v,/.*\b/,l.binary,/\b.*/)),r({scope:"meta",begin:v,end:/$/,relevance:0,"on:begin":(N,ce)=>{N.index!==0&&ce.ignoreMatch()}},l)},se={begin:"\\\\[\\s\\S]",relevance:0},$e={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[se]},Ce={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[se]},tt={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},J=function(l,v,N={}){const ce=r({scope:"comment",begin:l,end:v,contains:[]},N);ce.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const He=te("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return ce.contains.push({begin:O(/[ ]+/,"(",He,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),ce},Pe=J("//","$"),Oe=J("/\\*","\\*/"),Le=J("#","$"),We={scope:"number",begin:ne,relevance:0},rt={scope:"number",begin:Re,relevance:0},at={scope:"number",begin:et,relevance:0},Xe={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[se,{begin:/\[/,end:/\]/,relevance:0,contains:[se]}]},ut={scope:"title",begin:G,relevance:0},pt={scope:"title",begin:oe,relevance:0},ft={begin:"\\.\\s*"+oe,relevance:0};var M=Object.freeze({__proto__:null,APOS_STRING_MODE:$e,BACKSLASH_ESCAPE:se,BINARY_NUMBER_MODE:at,BINARY_NUMBER_RE:et,COMMENT:J,C_BLOCK_COMMENT_MODE:Oe,C_LINE_COMMENT_MODE:Pe,C_NUMBER_MODE:rt,C_NUMBER_RE:Re,END_SAME_AS_BEGIN:function(l){return Object.assign(l,{"on:begin":(v,N)=>{N.data._beginMatch=v[1]},"on:end":(v,N)=>{N.data._beginMatch!==v[1]&&N.ignoreMatch()}})},HASH_COMMENT_MODE:Le,IDENT_RE:G,MATCH_NOTHING_RE:C,METHOD_GUARD:ft,NUMBER_MODE:We,NUMBER_RE:ne,PHRASAL_WORDS_MODE:tt,QUOTE_STRING_MODE:Ce,REGEXP_MODE:Xe,RE_STARTERS_RE:qe,SHEBANG:Ne,TITLE_MODE:ut,UNDERSCORE_IDENT_RE:oe,UNDERSCORE_TITLE_MODE:pt});function K(l,v){l.input[l.index-1]==="."&&v.ignoreMatch()}function j(l,v){l.className!==void 0&&(l.scope=l.className,delete l.className)}function q(l,v){v&&l.beginKeywords&&(l.begin="\\b("+l.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",l.__beforeBegin=K,l.keywords=l.keywords||l.beginKeywords,delete l.beginKeywords,l.relevance===void 0&&(l.relevance=0))}function ee(l,v){Array.isArray(l.illegal)&&(l.illegal=te(...l.illegal))}function ue(l,v){if(l.match){if(l.begin||l.end)throw new Error("begin & end are not supported with match");l.begin=l.match,delete l.match}}function be(l,v){l.relevance===void 0&&(l.relevance=1)}const Ee=(l,v)=>{if(!l.beforeMatch)return;if(l.starts)throw new Error("beforeMatch cannot be used with starts");const N=Object.assign({},l);Object.keys(l).forEach(ce=>{delete l[ce]}),l.keywords=N.keywords,l.begin=O(N.beforeMatch,_(N.begin)),l.starts={relevance:0,contains:[Object.assign(N,{endsParent:!0})]},l.relevance=0,delete N.beforeMatch},_e=["of","and","for","in","not","or","if","then","parent","list","value"],we="keyword";function R(l,v,N=we){const ce=Object.create(null);return typeof l=="string"?He(N,l.split(" ")):Array.isArray(l)?He(N,l):Object.keys(l).forEach(function(Ve){Object.assign(ce,R(l[Ve],v,Ve))}),ce;function He(Ve,P){v&&(P=P.map(L=>L.toLowerCase())),P.forEach(function(L){const ae=L.split("|");ce[ae[0]]=[Ve,Z(ae[0],ae[1])]})}}function Z(l,v){return v?Number(v):U(l)?0:1}function U(l){return _e.includes(l.toLowerCase())}const ye={},fe=l=>{console.error(l)},me=(l,...v)=>{console.log(`WARN: ${l}`,...v)},ze=(l,v)=>{ye[`${l}/${v}`]||(console.log(`Deprecated as of ${l}. ${v}`),ye[`${l}/${v}`]=!0)},Ie=new Error;function Te(l,v,{key:N}){let ce=0;const He=l[N],Ve={},P={};for(let L=1;L<=v.length;L++)P[L+ce]=He[L],Ve[L+ce]=!0,ce+=de(v[L-1]);l[N]=P,l[N]._emit=Ve,l[N]._multi=!0}function bt(l){if(Array.isArray(l.begin)){if(l.skip||l.excludeBegin||l.returnBegin)throw fe("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),Ie;if(typeof l.beginScope!="object"||l.beginScope===null)throw fe("beginScope must be object"),Ie;Te(l,l.begin,{key:"beginScope"}),l.begin=E(l.begin,{joinWith:""})}}function Ct(l){if(Array.isArray(l.end)){if(l.skip||l.excludeEnd||l.returnEnd)throw fe("skip, excludeEnd, returnEnd not compatible with endScope: {}"),Ie;if(typeof l.endScope!="object"||l.endScope===null)throw fe("endScope must be object"),Ie;Te(l,l.end,{key:"endScope"}),l.end=E(l.end,{joinWith:""})}}function dn(l){l.scope&&typeof l.scope=="object"&&l.scope!==null&&(l.beginScope=l.scope,delete l.scope)}function Ot(l){dn(l),typeof l.beginScope=="string"&&(l.beginScope={_wrap:l.beginScope}),typeof l.endScope=="string"&&(l.endScope={_wrap:l.endScope}),bt(l),Ct(l)}function Tt(l){function v(P,L){return new RegExp(y(P),"m"+(l.case_insensitive?"i":"")+(l.unicodeRegex?"u":"")+(L?"g":""))}class N{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(L,ae){ae.position=this.position++,this.matchIndexes[this.matchAt]=ae,this.regexes.push([ae,L]),this.matchAt+=de(L)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const L=this.regexes.map(ae=>ae[1]);this.matcherRe=v(E(L,{joinWith:"|"}),!0),this.lastIndex=0}exec(L){this.matcherRe.lastIndex=this.lastIndex;const ae=this.matcherRe.exec(L);if(!ae)return null;const lt=ae.findIndex((Qt,Jt)=>Jt>0&&Qt!==void 0),st=this.matchIndexes[lt];return ae.splice(0,lt),Object.assign(ae,st)}}class ce{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(L){if(this.multiRegexes[L])return this.multiRegexes[L];const ae=new N;return this.rules.slice(L).forEach(([lt,st])=>ae.addRule(lt,st)),ae.compile(),this.multiRegexes[L]=ae,ae}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(L,ae){this.rules.push([L,ae]),ae.type==="begin"&&this.count++}exec(L){const ae=this.getMatcher(this.regexIndex);ae.lastIndex=this.lastIndex;let lt=ae.exec(L);if(this.resumingScanAtSamePosition()&&!(lt&<.index===this.lastIndex)){const st=this.getMatcher(0);st.lastIndex=this.lastIndex+1,lt=st.exec(L)}return lt&&(this.regexIndex+=lt.position+1,this.regexIndex===this.count&&this.considerAll()),lt}}function He(P){const L=new ce;return P.contains.forEach(ae=>L.addRule(ae.begin,{rule:ae,type:"begin"})),P.terminatorEnd&&L.addRule(P.terminatorEnd,{type:"end"}),P.illegal&&L.addRule(P.illegal,{type:"illegal"}),L}function Ve(P,L){const ae=P;if(P.isCompiled)return ae;[j,ue,Ot,Ee].forEach(st=>st(P,L)),l.compilerExtensions.forEach(st=>st(P,L)),P.__beforeBegin=null,[q,ee,be].forEach(st=>st(P,L)),P.isCompiled=!0;let lt=null;return typeof P.keywords=="object"&&P.keywords.$pattern&&(P.keywords=Object.assign({},P.keywords),lt=P.keywords.$pattern,delete P.keywords.$pattern),lt=lt||/\w+/,P.keywords&&(P.keywords=R(P.keywords,l.case_insensitive)),ae.keywordPatternRe=v(lt,!0),L&&(P.begin||(P.begin=/\B|\b/),ae.beginRe=v(ae.begin),!P.end&&!P.endsWithParent&&(P.end=/\B|\b/),P.end&&(ae.endRe=v(ae.end)),ae.terminatorEnd=y(ae.end)||"",P.endsWithParent&&L.terminatorEnd&&(ae.terminatorEnd+=(P.end?"|":"")+L.terminatorEnd)),P.illegal&&(ae.illegalRe=v(P.illegal)),P.contains||(P.contains=[]),P.contains=[].concat(...P.contains.map(function(st){return It(st==="self"?P:st)})),P.contains.forEach(function(st){Ve(st,ae)}),P.starts&&Ve(P.starts,L),ae.matcher=He(ae),ae}if(l.compilerExtensions||(l.compilerExtensions=[]),l.contains&&l.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return l.classNameAliases=r(l.classNameAliases||{}),Ve(l)}function Xt(l){return l?l.endsWithParent||Xt(l.starts):!1}function It(l){return l.variants&&!l.cachedVariants&&(l.cachedVariants=l.variants.map(function(v){return r(l,{variants:null},v)})),l.cachedVariants?l.cachedVariants:Xt(l)?r(l,{starts:l.starts?r(l.starts):null}):Object.isFrozen(l)?r(l):l}var _n="11.11.1";class vt extends Error{constructor(v,N){super(v),this.name="HTMLInjectionError",this.html=N}}const Nt=n,Ft=r,T=Symbol("nomatch"),Y=7,I=function(l){const v=Object.create(null),N=Object.create(null),ce=[];let He=!0;const Ve="Could not find the language '{}', did you forget to load/include a language module?",P={disableAutodetect:!0,name:"Plain text",contains:[]};let L={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:h};function ae(S){return L.noHighlightRe.test(S)}function lt(S){let re=S.className+" ";re+=S.parentNode?S.parentNode.className:"";const Me=L.languageDetectRe.exec(re);if(Me){const W=tn(Me[1]);return W||(me(Ve.replace("{}",Me[1])),me("Falling back to no-highlight mode for this block.",S)),W?Me[1]:"no-highlight"}return re.split(/\s+/).find(W=>ae(W)||tn(W))}function st(S,re,Me){let W="",Se="";typeof re=="object"?(W=S,Me=re.ignoreIllegals,Se=re.language):(ze("10.7.0","highlight(lang, code, ...args) has been deprecated."),ze("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),Se=S,W=re),Me===void 0&&(Me=!0);const Be={code:W,language:Se};pn("before:highlight",Be);const ke=Be.result?Be.result:Qt(Be.language,Be.code,Me);return ke.code=Be.code,pn("after:highlight",ke),ke}function Qt(S,re,Me,W){const Se=Object.create(null);function Be(x,D){return x.keywords[D]}function ke(){if(!pe.keywords){je.addText(V);return}let x=0;pe.keywordPatternRe.lastIndex=0;let D=pe.keywordPatternRe.exec(V),ie="";for(;D;){ie+=V.substring(x,D.index);const X=Et.case_insensitive?D[0].toLowerCase():D[0],Ye=Be(pe,X);if(Ye){const[mt,$n]=Ye;if(je.addText(ie),ie="",Se[X]=(Se[X]||0)+1,Se[X]<=Y&&(Fe+=$n),mt.startsWith("_"))ie+=D[0];else{const rn=Et.classNameAliases[mt]||mt;Qe(D[0],rn)}}else ie+=D[0];x=pe.keywordPatternRe.lastIndex,D=pe.keywordPatternRe.exec(V)}ie+=V.substring(x),je.addText(ie)}function xe(){if(V==="")return;let x=null;if(typeof pe.subLanguage=="string"){if(!v[pe.subLanguage]){je.addText(V);return}x=Qt(pe.subLanguage,V,!0,sn[pe.subLanguage]),sn[pe.subLanguage]=x._top}else x=En(V,pe.subLanguage.length?pe.subLanguage:null);pe.relevance>0&&(Fe+=x.relevance),je.__addSublanguage(x._emitter,x.language)}function Ge(){pe.subLanguage!=null?xe():ke(),V=""}function Qe(x,D){x!==""&&(je.startScope(D),je.addText(x),je.endScope())}function Rt(x,D){let ie=1;const X=D.length-1;for(;ie<=X;){if(!x._emit[ie]){ie++;continue}const Ye=Et.classNameAliases[x[ie]]||x[ie],mt=D[ie];Ye?Qe(mt,Ye):(V=mt,ke(),V=""),ie++}}function nn(x,D){return x.scope&&typeof x.scope=="string"&&je.openNode(Et.classNameAliases[x.scope]||x.scope),x.beginScope&&(x.beginScope._wrap?(Qe(V,Et.classNameAliases[x.beginScope._wrap]||x.beginScope._wrap),V=""):x.beginScope._multi&&(Rt(x.beginScope,D),V="")),pe=Object.create(x,{parent:{value:pe}}),pe}function gn(x,D,ie){let X=$(x.endRe,ie);if(X){if(x["on:end"]){const Ye=new e(x);x["on:end"](D,Ye),Ye.isMatchIgnored&&(X=!1)}if(X){for(;x.endsParent&&x.parent;)x=x.parent;return x}}if(x.endsWithParent)return gn(x.parent,D,ie)}function vn(x){return pe.matcher.regexIndex===0?(V+=x[0],1):(ht=!0,0)}function Dt(x){const D=x[0],ie=x.rule,X=new e(ie),Ye=[ie.__beforeBegin,ie["on:begin"]];for(const mt of Ye)if(mt&&(mt(x,X),X.isMatchIgnored))return vn(D);return ie.skip?V+=D:(ie.excludeBegin&&(V+=D),Ge(),!ie.returnBegin&&!ie.excludeBegin&&(V=D)),nn(ie,x),ie.returnBegin?0:D.length}function hn(x){const D=x[0],ie=re.substring(x.index),X=gn(pe,x,ie);if(!X)return T;const Ye=pe;pe.endScope&&pe.endScope._wrap?(Ge(),Qe(D,pe.endScope._wrap)):pe.endScope&&pe.endScope._multi?(Ge(),Rt(pe.endScope,x)):Ye.skip?V+=D:(Ye.returnEnd||Ye.excludeEnd||(V+=D),Ge(),Ye.excludeEnd&&(V=D));do pe.scope&&je.closeNode(),!pe.skip&&!pe.subLanguage&&(Fe+=pe.relevance),pe=pe.parent;while(pe!==X.parent);return X.starts&&nn(X.starts,x),Ye.returnEnd?0:D.length}function Kt(){const x=[];for(let D=pe;D!==Et;D=D.parent)D.scope&&x.unshift(D.scope);x.forEach(D=>je.openNode(D))}let Bt={};function an(x,D){const ie=D&&D[0];if(V+=x,ie==null)return Ge(),0;if(Bt.type==="begin"&&D.type==="end"&&Bt.index===D.index&&ie===""){if(V+=re.slice(D.index,D.index+1),!He){const X=new Error(`0 width match regex (${S})`);throw X.languageName=S,X.badRule=Bt.rule,X}return 1}if(Bt=D,D.type==="begin")return Dt(D);if(D.type==="illegal"&&!Me){const X=new Error('Illegal lexeme "'+ie+'" for mode "'+(pe.scope||"")+'"');throw X.mode=pe,X}else if(D.type==="end"){const X=hn(D);if(X!==T)return X}if(D.type==="illegal"&&ie==="")return V+=` -`,1;if(nt>1e5&&nt>D.index*3)throw new Error("potential infinite loop, way more iterations than matches");return V+=ie,ie.length}const Et=tn(S);if(!Et)throw fe(Ve.replace("{}",S)),new Error('Unknown language: "'+S+'"');const jt=Tt(Et);let qt="",pe=W||jt;const sn={},je=new L.__emitter(L);Kt();let V="",Fe=0,Ae=0,nt=0,ht=!1;try{if(Et.__emitTokens)Et.__emitTokens(re,je);else{for(pe.matcher.considerAll();;){nt++,ht?ht=!1:pe.matcher.considerAll(),pe.matcher.lastIndex=Ae;const x=pe.matcher.exec(re);if(!x)break;const D=re.substring(Ae,x.index),ie=an(D,x);Ae=x.index+ie}an(re.substring(Ae))}return je.finalize(),qt=je.toHTML(),{language:S,value:qt,relevance:Fe,illegal:!1,_emitter:je,_top:pe}}catch(x){if(x.message&&x.message.includes("Illegal"))return{language:S,value:Nt(re),illegal:!0,relevance:0,_illegalBy:{message:x.message,index:Ae,context:re.slice(Ae-100,Ae+100),mode:x.mode,resultSoFar:qt},_emitter:je};if(He)return{language:S,value:Nt(re),illegal:!1,relevance:0,errorRaised:x,_emitter:je,_top:pe};throw x}}function Jt(S){const re={value:Nt(S),illegal:!1,relevance:0,_top:P,_emitter:new L.__emitter(L)};return re._emitter.addText(S),re}function En(S,re){re=re||L.languages||Object.keys(v);const Me=Jt(S),W=re.filter(tn).filter(Lt).map(Ge=>Qt(Ge,S,!1));W.unshift(Me);const Se=W.sort((Ge,Qe)=>{if(Ge.relevance!==Qe.relevance)return Qe.relevance-Ge.relevance;if(Ge.language&&Qe.language){if(tn(Ge.language).supersetOf===Qe.language)return 1;if(tn(Qe.language).supersetOf===Ge.language)return-1}return 0}),[Be,ke]=Se,xe=Be;return xe.secondBest=ke,xe}function Sn(S,re,Me){const W=re&&N[re]||Me;S.classList.add("hljs"),S.classList.add(`language-${W}`)}function An(S){let re=null;const Me=lt(S);if(ae(Me))return;if(pn("before:highlightElement",{el:S,language:Me}),S.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",S);return}if(S.children.length>0&&(L.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(S)),L.throwUnescapedHTML))throw new vt("One of your code blocks includes unescaped HTML.",S.innerHTML);re=S;const W=re.textContent,Se=Me?st(W,{language:Me,ignoreIllegals:!0}):En(W);S.innerHTML=Se.value,S.dataset.highlighted="yes",Sn(S,Me,Se.language),S.result={language:Se.language,re:Se.relevance,relevance:Se.relevance},Se.secondBest&&(S.secondBest={language:Se.secondBest.language,relevance:Se.secondBest.relevance}),pn("after:highlightElement",{el:S,result:Se,text:W})}function Tn(S){L=Ft(L,S)}const Bn=()=>{en(),ze("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function Gt(){en(),ze("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let Pt=!1;function en(){function S(){en()}if(document.readyState==="loading"){Pt||window.addEventListener("DOMContentLoaded",S,!1),Pt=!0;return}document.querySelectorAll(L.cssSelector).forEach(An)}function un(S,re){let Me=null;try{Me=re(l)}catch(W){if(fe("Language definition for '{}' could not be registered.".replace("{}",S)),He)fe(W);else throw W;Me=P}Me.name||(Me.name=S),v[S]=Me,Me.rawDefinition=re.bind(null,l),Me.aliases&&Nn(Me.aliases,{languageName:S})}function ka(S){delete v[S];for(const re of Object.keys(N))N[re]===S&&delete N[re]}function wa(){return Object.keys(v)}function tn(S){return S=(S||"").toLowerCase(),v[S]||v[N[S]]}function Nn(S,{languageName:re}){typeof S=="string"&&(S=[S]),S.forEach(Me=>{N[Me.toLowerCase()]=re})}function Lt(S){const re=tn(S);return re&&!re.disableAutodetect}function na(S){S["before:highlightBlock"]&&!S["before:highlightElement"]&&(S["before:highlightElement"]=re=>{S["before:highlightBlock"](Object.assign({block:re.el},re))}),S["after:highlightBlock"]&&!S["after:highlightElement"]&&(S["after:highlightElement"]=re=>{S["after:highlightBlock"](Object.assign({block:re.el},re))})}function Rn(S){na(S),ce.push(S)}function xa(S){const re=ce.indexOf(S);re!==-1&&ce.splice(re,1)}function pn(S,re){const Me=S;ce.forEach(function(W){W[Me]&&W[Me](re)})}function Ea(S){return ze("10.7.0","highlightBlock will be removed entirely in v12.0"),ze("10.7.0","Please use highlightElement now."),An(S)}Object.assign(l,{highlight:st,highlightAuto:En,highlightAll:en,highlightElement:An,highlightBlock:Ea,configure:Tn,initHighlighting:Bn,initHighlightingOnLoad:Gt,registerLanguage:un,unregisterLanguage:ka,listLanguages:wa,getLanguage:tn,registerAliases:Nn,autoDetection:Lt,inherit:Ft,addPlugin:Rn,removePlugin:xa}),l.debugMode=function(){He=!1},l.safeMode=function(){He=!0},l.versionString=_n,l.regex={concat:O,lookahead:_,either:te,optional:A,anyNumberOfTimes:z};for(const S in M)typeof M[S]=="object"&&t(M[S]);return Object.assign(l,M),l},H=I({});return H.newInstance=()=>I({}),Ia=H,H.HighlightJS=H,H.default=H,Ia}var hc=vc();const dt=gc(hc),Cs="[A-Za-z$_][0-9A-Za-z$_]*",fc=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],bc=["true","false","null","undefined","NaN","Infinity"],vr=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],hr=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],fr=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],mc=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],_c=[].concat(fr,vr,hr);function Os(t){const e=t.regex,n=(J,{after:Pe})=>{const Oe="",end:""},c=/<[A-Za-z0-9\\._:-]+\s*\/>/,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(J,Pe)=>{const Oe=J[0].length+J.index,Le=J.input[Oe];if(Le==="<"||Le===","){Pe.ignoreMatch();return}Le===">"&&(n(J,{after:Oe})||Pe.ignoreMatch());let We;const rt=J.input.substring(Oe);if(We=rt.match(/^\s*=/)){Pe.ignoreMatch();return}if((We=rt.match(/^\s+extends\s+/))&&We.index===0){Pe.ignoreMatch();return}}},u={$pattern:Cs,keyword:fc,literal:bc,built_in:_c,"variable.language":mc},p="[0-9](_?[0-9])*",f=`\\.(${p})`,h="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",y={className:"number",variants:[{begin:`(\\b(${h})((${f})|\\.)?|(${f}))[eE][+-]?(${p})\\b`},{begin:`\\b(${h})\\b((${f})\\b|\\.)?|(${f})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},_={className:"subst",begin:"\\$\\{",end:"\\}",keywords:u,contains:[]},z={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"xml"}},A={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"css"}},O={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"graphql"}},B={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,_]},de={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},$=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,z,A,O,B,{match:/\$\d+/},y];_.contains=$.concat({begin:/\{/,end:/\}/,keywords:u,contains:["self"].concat($)});const k=[].concat(de,_.contains),E=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:u,contains:["self"].concat(k)}]),C={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E},G={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},oe={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...vr,...hr]}},ne={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},Re={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[C],illegal:/%/},et={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function qe(J){return e.concat("(?!",J.join("|"),")")}const Ne={match:e.concat(/\b/,qe([...fr,"super","import"].map(J=>`${J}\\s*\\(`)),r,e.lookahead(/\s*\(/)),className:"title.function",relevance:0},se={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},$e={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},C]},Ce="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",tt={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(Ce)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[C]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:u,exports:{PARAMS_CONTAINS:E,CLASS_REFERENCE:oe},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),ne,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,z,A,O,B,de,{match:/\$\d+/},y,oe,{scope:"attr",match:r+e.lookahead(":"),relevance:0},tt,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[de,t.REGEXP_MODE,{className:"function",begin:Ce,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:c},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},Re,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[C,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},se,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[C]},Ne,et,G,$e,{match:/\$[(.]/}]}}const ba="[A-Za-z$_][0-9A-Za-z$_]*",br=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],mr=["true","false","null","undefined","NaN","Infinity"],_r=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],yr=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],kr=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],wr=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],xr=[].concat(kr,_r,yr);function yc(t){const e=t.regex,n=(J,{after:Pe})=>{const Oe="",end:""},c=/<[A-Za-z0-9\\._:-]+\s*\/>/,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(J,Pe)=>{const Oe=J[0].length+J.index,Le=J.input[Oe];if(Le==="<"||Le===","){Pe.ignoreMatch();return}Le===">"&&(n(J,{after:Oe})||Pe.ignoreMatch());let We;const rt=J.input.substring(Oe);if(We=rt.match(/^\s*=/)){Pe.ignoreMatch();return}if((We=rt.match(/^\s+extends\s+/))&&We.index===0){Pe.ignoreMatch();return}}},u={$pattern:ba,keyword:br,literal:mr,built_in:xr,"variable.language":wr},p="[0-9](_?[0-9])*",f=`\\.(${p})`,h="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",y={className:"number",variants:[{begin:`(\\b(${h})((${f})|\\.)?|(${f}))[eE][+-]?(${p})\\b`},{begin:`\\b(${h})\\b((${f})\\b|\\.)?|(${f})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},_={className:"subst",begin:"\\$\\{",end:"\\}",keywords:u,contains:[]},z={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"xml"}},A={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"css"}},O={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"graphql"}},B={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,_]},de={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},$=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,z,A,O,B,{match:/\$\d+/},y];_.contains=$.concat({begin:/\{/,end:/\}/,keywords:u,contains:["self"].concat($)});const k=[].concat(de,_.contains),E=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:u,contains:["self"].concat(k)}]),C={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E},G={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},oe={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[..._r,...yr]}},ne={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},Re={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[C],illegal:/%/},et={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function qe(J){return e.concat("(?!",J.join("|"),")")}const Ne={match:e.concat(/\b/,qe([...kr,"super","import"].map(J=>`${J}\\s*\\(`)),r,e.lookahead(/\s*\(/)),className:"title.function",relevance:0},se={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},$e={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},C]},Ce="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",tt={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(Ce)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[C]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:u,exports:{PARAMS_CONTAINS:E,CLASS_REFERENCE:oe},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),ne,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,z,A,O,B,de,{match:/\$\d+/},y,oe,{scope:"attr",match:r+e.lookahead(":"),relevance:0},tt,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[de,t.REGEXP_MODE,{className:"function",begin:Ce,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:c},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},Re,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[C,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},se,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[C]},Ne,et,G,$e,{match:/\$[(.]/}]}}function Is(t){const e=t.regex,n=yc(t),r=ba,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],c={begin:[/namespace/,/\s+/,t.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},i={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a},contains:[n.exports.CLASS_REFERENCE]},u={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},p=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],f={$pattern:ba,keyword:br.concat(p),literal:mr,built_in:xr.concat(a),"variable.language":wr},h={className:"meta",begin:"@"+r},y=(O,B,te)=>{const de=O.contains.findIndex($=>$.label===B);if(de===-1)throw new Error("can not find mode to replace");O.contains.splice(de,1,te)};Object.assign(n.keywords,f),n.exports.PARAMS_CONTAINS.push(h);const _=n.contains.find(O=>O.scope==="attr"),z=Object.assign({},_,{match:e.concat(r,e.lookahead(/\s*\?:/))});n.exports.PARAMS_CONTAINS.push([n.exports.CLASS_REFERENCE,_,z]),n.contains=n.contains.concat([h,c,i,z]),y(n,"shebang",t.SHEBANG()),y(n,"use_strict",u);const A=n.contains.find(O=>O.label==="func.def");return A.relevance=0,Object.assign(n,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n}function Ps(t){const e=t.regex,n=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],u={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},p={className:"meta",begin:/^(>>>|\.\.\.) /},f={className:"subst",begin:/\{/,end:/\}/,keywords:u,illegal:/#/},h={begin:/\{\{/,relevance:0},y={className:"string",contains:[t.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,p],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,p],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,p,h,f]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,p,h,f]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[t.BACKSLASH_ESCAPE,h,f]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,h,f]},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},_="[0-9](_?[0-9])*",z=`(\\b(${_}))?\\.(${_})|\\b(${_})\\.`,A=`\\b|${r.join("|")}`,O={className:"number",relevance:0,variants:[{begin:`(\\b(${_})|(${z}))[eE][+-]?(${_})[jJ]?(?=${A})`},{begin:`(${z})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${A})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${A})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${A})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${A})`},{begin:`\\b(${_})[jJ](?=${A})`}]},B={className:"comment",begin:e.lookahead(/# type:/),end:/$/,keywords:u,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},te={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:["self",p,O,y,t.HASH_COMMENT_MODE]}]};return f.contains=[y,O,p],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:u,illegal:/(<\/|\?)|=>/,contains:[p,O,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},y,B,t.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[te]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[O,te,y]}]}}function kc(t){const e={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},n={match:/[{}[\],:]/,className:"punctuation",relevance:0},r=["true","false","null"],a={scope:"literal",beginKeywords:r.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:r},contains:[e,n,t.QUOTE_STRING_MODE,a,t.C_NUMBER_MODE,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}function Pa(t){const e=t.regex,n={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{begin:e.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[t.BACKSLASH_ESCAPE]},c=t.inherit(t.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[t.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},u={className:"string",begin:/"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,n,a]};a.contains.push(u);const p={match:/\\"/},f={className:"string",begin:/'/,end:/'/},h={match:/\\'/},y={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},t.NUMBER_MODE,n]},_=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],z=t.SHEBANG({binary:`(${_.join("|")})`,relevance:10}),A={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[t.inherit(t.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},O=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],B=["true","false"],te={match:/(\/[a-z._-]+)+/},de=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],$=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],k=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],E=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:O,literal:B,built_in:[...de,...$,"set","shopt",...k,...E]},contains:[z,t.SHEBANG(),A,y,c,i,te,u,p,f,h,n]}}function Ls(t){const e="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},a={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},c={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},i={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[t.BACKSLASH_ESCAPE,a]},u=t.inherit(i,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),_={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},z={end:",",endsWithParent:!0,excludeEnd:!0,keywords:e,relevance:0},A={begin:/\{/,end:/\}/,contains:[z],illegal:"\\n",relevance:0},O={begin:"\\[",end:"\\]",contains:[z],illegal:"\\n",relevance:0},B=[r,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+t.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+t.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},t.HASH_COMMENT_MODE,{beginKeywords:e,keywords:{literal:e}},_,{className:"number",begin:t.C_NUMBER_RE+"\\b",relevance:0},A,O,c,i],te=[...B];return te.pop(),te.push(u),z.contains=te,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:B}}function Ds(t){const e=t.regex,n=e.concat(/[\p{L}_]/u,e.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,a={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},c={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},i=t.inherit(c,{begin:/\(/,end:/\)/}),u=t.inherit(t.APOS_STRING_MODE,{className:"string"}),p=t.inherit(t.QUOTE_STRING_MODE,{className:"string"}),f={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[c,p,u,i,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[c,i,p,u]}]}]},t.COMMENT(//,{relevance:10}),{begin://,relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[p]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[f],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[f],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:e.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:f}]},{className:"tag",begin:e.concat(/<\//,e.lookahead(e.concat(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}const wc=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),xc=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Ec=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],Sc=[...xc,...Ec],Ac=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),Tc=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),Nc=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),Rc=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function $c(t){const e=t.regex,n=wc(t),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},a="and or not only",c=/@-?\w[\w]*(-\w+)*/,i="[a-zA-Z-][a-zA-Z0-9_-]*",u=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[n.BLOCK_COMMENT,r,n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+i,relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+Tc.join("|")+")"},{begin:":(:)?("+Nc.join("|")+")"}]},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+Rc.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[n.BLOCK_COMMENT,n.HEXCOLOR,n.IMPORTANT,n.CSS_NUMBER_MODE,...u,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...u,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},n.FUNCTION_DISPATCH]},{begin:e.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:c},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:a,attribute:Ac.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...u,n.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+Sc.join("|")+")\\b"}]}}function zc(t){const e=t.regex,n=t.COMMENT("--","$"),r={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},a={begin:/"/,end:/"/,contains:[{match:/""/}]},c=["true","false","unknown"],i=["double precision","large object","with timezone","without timezone"],u=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],p=["add","asc","collation","desc","final","first","last","view"],f=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],h=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],y=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],_=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],z=h,A=[...f,...p].filter(E=>!h.includes(E)),O={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},B={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},te={match:e.concat(/\b/,e.either(...z),/\s*\(/),relevance:0,keywords:{built_in:z}};function de(E){return e.concat(/\b/,e.either(...E.map(C=>C.replace(/\s+/,"\\s+"))),/\b/)}const $={scope:"keyword",match:de(_),relevance:0};function k(E,{exceptions:C,when:G}={}){const oe=G;return C=C||[],E.map(ne=>ne.match(/\|\d+$/)||C.includes(ne)?ne:oe(ne)?`${ne}|0`:ne)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:k(A,{when:E=>E.length<3}),literal:c,type:u,built_in:y},contains:[{scope:"type",match:de(i)},$,te,O,r,a,t.C_NUMBER_MODE,t.C_BLOCK_COMMENT_MODE,n,B]}}function Bs(t){const e=t.regex,n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},r={begin:"^[-\\*]{3,}",end:"$"},a={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},c={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},u=/[A-Za-z][A-Za-z0-9+.-]*/,p={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.concat(/\[.+?\]\(/,u,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},f={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},h={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},y=t.inherit(f,{contains:[]}),_=t.inherit(h,{contains:[]});f.contains.push(_),h.contains.push(y);let z=[n,p];return[f,h,y,_].forEach(te=>{te.contains=te.contains.concat(z)}),z=z.concat(f,h),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:z},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:z}]}]},n,c,f,h,{className:"quote",begin:"^>\\s+",contains:z,end:"$"},a,r,p,i,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}const bn=Ln([]),yn=Ln(!1);let Er=0;function La(t){const e=`msg_${++Er}`;return bn.update(n=>[...n,{id:e,role:"user",content:t,timestamp:new Date().toISOString()}]),e}function Vn(){const t=`msg_${++Er}`;return bn.update(e=>[...e,{id:t,role:"assistant",content:"",timestamp:new Date().toISOString(),streaming:!0,toolCalls:[]}]),yn.set(!0),t}function Mc(t,e){bn.update(n=>n.map(r=>r.id===t?{...r,content:r.content+e}:r))}function Da(t,e){bn.update(n=>n.map(r=>r.id===t?{...r,content:e,streaming:!1}:r)),yn.set(!1)}function Cc(t,e){bn.update(n=>n.map(r=>r.id===t?{...r,toolCalls:[...r.toolCalls||[],e]}:r))}function js(){bn.set([]),yn.set(!1)}var Oc=w('
    '),Ic=w(' '),Pc=w('
    '),Lc=w(''),Dc=w(" ",1),Bc=w('
    '),jc=w('
    '),Uc=w('
    result
    '),Hc=w('
    '),Fc=w('
    '),Gc=w('
    '),Kc=w('
    '),qc=w('

    '),Zc=w('
    '),Wc=w('
    '),Vc=w('

    '),Yc=w(''),Xc=w('
    '),Qc=w('
    Plan
    '),Jc=w(''),ed=w('
    '),td=w(''),nd=w('
    '),ad=w(""),sd=w('
    '),rd=w('
    '),id=w('
    '),ld=w('
    '),od=w('');function cd(t,e){on(e,!0);const n=()=>ct(bn,"$chatMessages",u),r=()=>ct(Ks,"$settingsData",u),a=()=>ct(yn,"$chatStreaming",u),c=()=>ct(kn,"$currentProjectStore",u),i=()=>ct(Gn,"$architectSidebarOpen",u),[u,p]=mn();let f=ve(null);dt.registerLanguage("javascript",Os),dt.registerLanguage("js",Os),dt.registerLanguage("typescript",Is),dt.registerLanguage("ts",Is),dt.registerLanguage("python",Ps),dt.registerLanguage("py",Ps),dt.registerLanguage("json",kc),dt.registerLanguage("bash",Pa),dt.registerLanguage("sh",Pa),dt.registerLanguage("shell",Pa),dt.registerLanguage("yaml",Ls),dt.registerLanguage("yml",Ls),dt.registerLanguage("xml",Ds),dt.registerLanguage("html",Ds),dt.registerLanguage("css",$c),dt.registerLanguage("sql",zc),dt.registerLanguage("markdown",Bs),dt.registerLanguage("md",Bs);const h=new Ke.Renderer;h.code=({text:T,lang:Y})=>{const I=Y&&dt.getLanguage(Y)?Y:"";let H;try{H=I?dt.highlight(T,{language:I}).value:dt.highlightAuto(T).value}catch{H=T.replace(//g,">")}return`
    ${Y||"code"}
    ${H}
    `},Ke.setOptions({renderer:h});const y=[{value:"auto",label:"Auto-detect"},{value:"requirements",label:"Requirements Doc"},{value:"api_spec",label:"API Spec / OpenAPI"},{value:"data_sample",label:"Data Sample"},{value:"diagram",label:"Architecture Diagram"},{value:"config",label:"Config / Settings"},{value:"code",label:"Source Code"},{value:"documentation",label:"Documentation"},{value:"test_cases",label:"Test Cases"},{value:"schema",label:"Schema / Model"}],_={"image/png":"image","image/jpeg":"image","image/gif":"image","image/webp":"image","image/svg+xml":"image","image/bmp":"image","application/pdf":"pdf","application/msword":"document","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"document","application/vnd.oasis.opendocument.text":"document","application/rtf":"document","application/vnd.ms-excel":"spreadsheet","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"spreadsheet","application/vnd.oasis.opendocument.spreadsheet":"spreadsheet","text/csv":"spreadsheet","application/vnd.ms-powerpoint":"presentation","application/vnd.openxmlformats-officedocument.presentationml.presentation":"presentation","application/vnd.oasis.opendocument.presentation":"presentation","text/plain":"text","text/markdown":"text","application/json":"text","text/html":"text","text/css":"text","application/javascript":"text","application/x-yaml":"text","text/yaml":"text","application/xml":"text","text/xml":"text"},z={".py":"text",".js":"text",".ts":"text",".jsx":"text",".tsx":"text",".json":"text",".md":"text",".txt":"text",".csv":"spreadsheet",".yaml":"text",".yml":"text",".xml":"text",".html":"text",".css":"text",".sql":"text",".sh":"text",".bash":"text",".r":"text",".rb":"text",".go":"text",".rs":"text",".java":"text",".kt":"text",".swift":"text",".pdf":"pdf",".doc":"document",".docx":"document",".odt":"document",".rtf":"document",".xls":"spreadsheet",".xlsx":"spreadsheet",".ods":"spreadsheet",".ppt":"presentation",".pptx":"presentation",".odp":"presentation",".png":"image",".jpg":"image",".jpeg":"image",".gif":"image",".webp":"image",".svg":"image",".bmp":"image"},A=Object.keys(_).join(",")+",.py,.js,.ts,.jsx,.tsx,.sql,.sh,.r,.rb,.go,.rs,.java,.kt,.swift";function O(T){if(T.type&&_[T.type])return _[T.type];const Y="."+T.name.split(".").pop()?.toLowerCase();return Y&&z[Y]?z[Y]:"other"}let B=ve(On([])),te=ve(void 0),de=ve(!1);async function $(T){const Y=Array.from(T);for(const I of Y){if(I.size>20*1024*1024)continue;const H=O(I),l=await k(I),v={id:`file-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,name:I.name,type:I.type||"application/octet-stream",size:I.size,category:H,data:l,docType:"auto"};H==="image"&&(v.preview=`data:${I.type};base64,${l}`),m(B,[...s(B),v],!0)}}function k(T){return new Promise((Y,I)=>{const H=new FileReader;H.onload=()=>{const l=H.result,v=l.includes(",")?l.split(",")[1]:l;Y(v)},H.onerror=I,H.readAsDataURL(T)})}function E(T){m(B,s(B).filter(Y=>Y.id!==T),!0)}let C=ve(null);function G(T,Y){m(B,s(B).map(I=>I.id===T?{...I,docType:Y}:I),!0),m(C,null)}function oe(T){return!T||T==="auto"?"Auto-detect":y.find(Y=>Y.value===T)?.label??T}function ne(T){const Y=T.target;Y.files&&Y.files.length>0&&($(Y.files),Y.value="")}function Re(T){const Y=T.clipboardData?.items;if(!Y)return;const I=[];for(const H of Array.from(Y))if(H.kind==="file"){const l=H.getAsFile();l&&I.push(l)}I.length>0&&(T.preventDefault(),$(I))}const et=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],qe=["Drafting the blueprint...","Consulting the Oracle...","Aligning the nodes...","Designing the inevitable...","Architecting a masterpiece...","Tracing the path of causality...","Reshaping the construct...","Balancing the equation...","Loading the next iteration...","Surveying the pipeline...","Engineering the solution...","Selecting the right components...","Orchestrating the agents...","Running the simulation...","Weaving the connections...","Compiling the grand design...","Evaluating all possible paths...","Constructing the framework...","Visualizing the architecture...","Reticulating splines..."];let Ne=ve(On(et[0])),se=ve(On(qe[0])),$e=null,Ce=null,tt=0,J=0;const Pe=_t(()=>n().some(T=>T.streaming&&!T.content));In(()=>{s(Pe)?(tt=0,J=Math.floor(Math.random()*qe.length),m(se,qe[J],!0),$e=setInterval(()=>{tt=(tt+1)%et.length,m(Ne,et[tt],!0)},80),Ce=setInterval(()=>{J=(J+1)%qe.length,m(se,qe[J],!0)},2500)):($e&&(clearInterval($e),$e=null),Ce&&(clearInterval(Ce),Ce=null))});const Oe=_t(()=>r()?.user_profile?.assistant_name||"The Architect");let Le=On({});function We(T){Le[T]=!Le[T]}function rt(T){const Y={};for(const I of T)Y[I.tool]=(Y[I.tool]||0)+1;return Object.entries(Y).map(([I,H])=>H>1?`${I} x${H}`:I).join(", ")}function at(T){return T.replace(/)<[^<]*)*<\/script>/gi,"").replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,"")}function Xe(T){if(!T)return"";const Y=Ke(T,{async:!1});return at(Y)}let ut=ve(""),pt=ve(void 0),ft=ve(void 0),De=ve(null),M=ve(""),K=ve(""),j=null,q=ve(0),ee=!1;const ue=5;let be=ve(380),Ee=ve(!1),_e=ve(0),we=ve(0);const R=280,Z=.5;function U(T){T.preventDefault(),m(Ee,!0),m(_e,T.clientX,!0),m(we,s(be),!0),document.addEventListener("mousemove",ye),document.addEventListener("mouseup",fe)}function ye(T){if(!s(Ee))return;const Y=Math.floor(window.innerWidth*Z),I=T.clientX-s(_e);m(be,Math.max(R,Math.min(Y,s(we)+I)),!0)}function fe(){m(Ee,!1),document.removeEventListener("mousemove",ye),document.removeEventListener("mouseup",fe)}function me(T){Fn.update(Y=>{const I=new Map;for(const l of Y)I.set(l.id,l);for(const l of T.nodes){const v=I.get(l.id);v&&(v.data={...v.data,label:l.label||v.data.label,...l.config},l.position&&(v.position=l.position))}const H=T.nodes.filter(l=>!I.has(l.id)).map(l=>({id:l.id,type:l.type,position:l.position??{x:250,y:200},data:{label:l.label||l.id,...l.config}}));return[...Y,...H]}),qa.update(Y=>{const I=new Set;for(const l of Y)I.add(l.id);const H=T.edges.filter(l=>!I.has(l.id)).map(l=>({id:l.id,source:l.source,target:l.target,sourceHandle:l.source_handle??void 0,targetHandle:l.target_handle??void 0}));return[...Y,...H]}),T.nodes.length===0&&(Fn.set([]),qa.set([])),Mi()}function ze(){const T=window.location.protocol==="https:"?"wss:":"ws:",Y=Ut(kn),I=Y?`?project=${encodeURIComponent(Y.name)}`:"";return`${T}//${window.location.host}/ws/assistant${I}`}function Ie(){if(s(De)&&s(De).readyState===WebSocket.OPEN)return;m(K,""),ee=!1;let T;try{T=new WebSocket(ze())}catch{m(K,"AI Assistant requires a configured LLM provider. Check Settings.");return}T.onopen=()=>{m(K,""),m(q,0)},T.onmessage=Y=>{let I;try{I=JSON.parse(Y.data)}catch{return}if(I.type==="token")s(M)||m(M,Vn(),!0),Mc(s(M),I.content),Tt();else if(I.type==="response_complete"){s(M)&&Da(s(M),I.full_text),m(M,""),Tt();const H=Ut(kn);if(H){const l=Ut(bn);Ht.assistant.saveHistory(H.name,l.map(v=>({role:v.role,content:v.content,timestamp:v.timestamp??new Date().toISOString(),toolCalls:v.toolCalls??[]}))).catch(()=>{})}}else if(I.type==="plan"){s(M)||m(M,Vn(),!0);let H=[],l=[];try{H=JSON.parse(I.steps)}catch{H=[]}try{l=JSON.parse(I.options)}catch{l=[]}m(f,{summary:I.summary||"",steps:H,options:l,question:I.question||"",msgId:s(M)},!0),Tt()}else if(I.type==="tool_call"){if(s(M)||m(M,Vn(),!0),I.tool==="present_plan"){Tt();return}let H=I.args;if(typeof H=="string")try{H=JSON.parse(H)}catch{H={raw:H}}(!H||typeof H!="object"||Array.isArray(H))&&(H={}),Cc(s(M),{tool:I.tool,args:H,result:I.result}),Tt()}else if(I.type==="canvas_sync"){const H=I.canvas;H&&(me(H),$i(H.nodes,H.edges),zi())}else I.type==="error"&&(m(K,I.message,!0),ee=!0,s(M)?Da(s(M),""):yn.set(!1),m(M,""))},T.onclose=()=>{if(s(M)?(Da(s(M),"[Connection lost]"),m(M,"")):yn.set(!1),m(De,null),ee){ee=!1,m(q,ue);return}Ba(q),s(q){},m(De,T,!0)}function Te(){m(q,0),Ie()}function bt(){j&&(clearTimeout(j),j=null),s(De)?.close(),m(De,null)}function Ct(){const T=s(ut).trim();if(!T&&s(B).length===0||a()||!s(De))return;const Y=T||`[${s(B).length} file${s(B).length>1?"s":""} attached]`;La(Y),m(M,Vn(),!0);const I={action:"chat",message:T||"Please analyze the attached files."};s(B).length>0&&(I.attachments=s(B).map(H=>({name:H.name,type:H.type,category:H.category,size:H.size,data:H.data,docType:H.docType}))),m(ut,""),m(B,[],!0);try{s(De).send(JSON.stringify(I))}catch{m(K,"Failed to send message. Connection may be lost."),yn.set(!1),m(M,"");return}Tt()}function dn(T){T.key==="Enter"&&!T.shiftKey&&(T.preventDefault(),Ct())}function Ot(){if(js(),s(De)&&s(De).readyState===WebSocket.OPEN)try{s(De).send(JSON.stringify({action:"clear_history"}))}catch{}m(K,"")}function Tt(){requestAnimationFrame(()=>{s(pt)&&(s(pt).scrollTop=s(pt).scrollHeight)})}function Xt(T){return new Date(T).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})}function It(T){if(!(!s(f)||!s(De))){La(T),m(M,Vn(),!0);try{s(De).send(JSON.stringify({action:"chat",message:T}))}catch{m(K,"Failed to send plan selection."),yn.set(!1),m(M,"")}m(f,null),Tt()}}function _n(){Gn.set(!1)}In(()=>{c()&&s(De)&&(s(De).close(),m(De,null),Ie())}),In(()=>{const T=c();T&&Ht.assistant.getHistory(T.name).then(Y=>{if(Y&&Y.length>0){js();for(const I of Y)I.role==="user"?La(I.content):I.role==="assistant"&&bn.update(H=>[...H,{id:`msg_hist_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,role:"assistant",content:I.content,timestamp:I.timestamp||new Date().toISOString(),streaming:!1,toolCalls:I.toolCalls??[]}])}}).catch(()=>{})}),Ja(()=>{Ie(),s(ft)?.focus()}),Wr(()=>{bt(),$e&&clearInterval($e),Ce&&clearInterval(Ce),document.removeEventListener("mousemove",ye),document.removeEventListener("mouseup",fe)});var vt=Ze(),Nt=he(vt);{var Ft=T=>{var Y=od();let I,H;var l=d(Y),v=d(l),N=d(v),ce=d(N);ua(ce,{size:16}),o(N);var He=g(N,2),Ve=d(He,!0);o(He),o(v);var P=g(v,2),L=d(P);ko(L,{size:14}),o(P),o(l);var ae=g(l,2),lt=d(ae);{var st=W=>{var Se=Oc(),Be=d(Se),ke=d(Be);ua(ke,{size:48}),o(Be);var xe=g(Be,2),Ge=d(xe,!0);o(xe);var Qe=g(xe,2),Rt=d(Qe,!0);o(Qe),o(Se),le(()=>{ge(Ge,s(Oe)),ge(Rt,s(Oe)==="The Architect"?"I am The Architect. I designed the canvas upon which your agent pipelines take form. Describe what you wish to construct, and I shall design it.":`Ask ${s(Oe)} to help build your agent pipeline.`)}),b(W,Se)},Qt=W=>{var Se=Ze(),Be=he(Se);gt(Be,1,n,ke=>ke.id,(ke,xe)=>{var Ge=Kc();let Qe;var Rt=d(Ge),nn=d(Rt);{var gn=Ae=>{Kl(Ae,{size:18})},vn=Ae=>{ua(Ae,{size:18})};Q(nn,Ae=>{s(xe).role==="user"?Ae(gn):Ae(vn,!1)})}o(Rt);var Dt=g(Rt,2),hn=d(Dt),Kt=d(hn),Bt=d(Kt,!0);o(Kt);var an=g(Kt,2),Et=d(an,!0);o(an),o(hn);var jt=g(hn,2);let qt;var pe=d(jt);{var sn=Ae=>{var nt=Ze(),ht=he(nt);{var x=ie=>{var X=Pc(),Ye=d(X),mt=d(Ye,!0);o(Ye);var $n=g(Ye,2);Di($n,()=>s(se),rn=>{var zn=Ic(),Sa=d(zn,!0);o(zn),le(()=>ge(Sa,s(se))),b(rn,zn)}),o(X),le(()=>ge(mt,s(Ne))),b(ie,X)},D=ie=>{var X=Dc(),Ye=he(X);Ei(Ye,()=>Xe(s(xe).content));var mt=g(Ye,2);{var $n=rn=>{var zn=Lc();b(rn,zn)};Q(mt,rn=>{s(xe).streaming&&rn($n)})}b(ie,X)};Q(ht,ie=>{s(xe).streaming&&!s(xe).content?ie(x):ie(D,!1)})}b(Ae,nt)},je=Ae=>{var nt=Jn();le(()=>ge(nt,s(xe).content)),b(Ae,nt)};Q(pe,Ae=>{s(xe).role==="assistant"?Ae(sn):Ae(je,!1)})}o(jt);var V=g(jt,2);{var Fe=Ae=>{var nt=Gc(),ht=d(nt),x=d(ht),D=d(x);let ie;var X=d(D);xi(X,{size:12}),o(D);var Ye=g(D,2);Ha(Ye,{size:12});var mt=g(Ye,2),$n=d(mt);o(mt),o(x);var rn=g(x,2),zn=d(rn,!0);o(rn),o(ht);var Sa=g(ht,2);{var Sr=Kn=>{var Aa=Fc();gt(Aa,21,()=>s(xe).toolCalls,At,(Ar,fn,Tr)=>{var Ta=Hc(),Na=d(Ta),vs=d(Na);vs.textContent=Tr+1;var Ra=g(vs,2),Nr=d(Ra,!0);o(Ra);var Rr=g(Ra,2);{var $r=Zt=>{Si(Zt,{size:11,class:"tool-call-ok"})};Q(Rr,Zt=>{s(fn).result&&Zt($r)})}o(Na);var hs=g(Na,2);{var zr=Zt=>{var Mn=jc();gt(Mn,21,()=>Object.entries(s(fn).args),At,(aa,$a)=>{var sa=_t(()=>Vr(s($a),2));let Ir=()=>s(sa)[0],qn=()=>s(sa)[1];var za=Bc(),Ma=d(za),Pr=d(Ma);o(Ma);var fs=g(Ma,2),Lr=d(fs,!0);o(fs),o(za),le(Dr=>{ge(Pr,`${Ir()??""}:`),ge(Lr,Dr)},[()=>typeof qn()=="string"?qn().length>120?qn().slice(0,117)+"...":qn():JSON.stringify(qn())]),b(aa,za)}),o(Mn),b(Zt,Mn)},Mr=_t(()=>s(fn).args&&Object.keys(s(fn).args).length>0);Q(hs,Zt=>{s(Mr)&&Zt(zr)})}var Cr=g(hs,2);{var Or=Zt=>{var Mn=Uc(),aa=g(d(Mn),2),$a=d(aa,!0);o(aa),o(Mn),le(sa=>ge($a,sa),[()=>s(fn).result.length>200?s(fn).result.slice(0,197)+"...":s(fn).result]),b(Zt,Mn)};Q(Cr,Zt=>{s(fn).result&&Zt(Or)})}o(Ta),le(()=>ge(Nr,s(fn).tool)),b(Ar,Ta)}),o(Aa),b(Kn,Aa)};Q(Sa,Kn=>{Le[s(xe).id]&&Kn(Sr)})}o(nt),le(Kn=>{ie=it(D,1,"tool-chevron svelte-mwxll1",null,ie,{expanded:Le[s(xe).id]}),ge($n,`${s(xe).toolCalls.length??""} tool - call${s(xe).toolCalls.length!==1?"s":""}`),ge(zn,Kn)},[()=>rt(s(xe).toolCalls)]),F("click",ht,()=>We(s(xe).id)),b(Ae,nt)};Q(V,Ae=>{s(xe).toolCalls&&s(xe).toolCalls.length>0&&Ae(Fe)})}o(Dt),o(Ge),le(Ae=>{Qe=it(Ge,1,"message svelte-mwxll1",null,Qe,{user:s(xe).role==="user",assistant:s(xe).role==="assistant"}),ge(Bt,s(xe).role==="user"?"You":s(Oe)),ge(Et,Ae),qt=it(jt,1,"message-content svelte-mwxll1",null,qt,{markdown:s(xe).role==="assistant"})},[()=>Xt(s(xe).timestamp)]),b(ke,Ge)}),b(W,Se)};Q(lt,W=>{n().length===0?W(st):W(Qt,!1)})}o(ae),ga(ae,W=>m(pt,W),()=>s(pt));var Jt=g(ae,2);{var En=W=>{var Se=Qc(),Be=d(Se),ke=d(Be),xe=d(ke),Ge=d(xe);Ha(Ge,{size:11}),o(xe),Je(2),o(ke);var Qe=g(ke,2),Rt=d(Qe);Fa(Rt,{size:12}),o(Qe),o(Be);var nn=g(Be,2),gn=d(nn);{var vn=V=>{var Fe=qc(),Ae=d(Fe,!0);o(Fe),le(()=>ge(Ae,s(f).summary)),b(V,Fe)};Q(gn,V=>{s(f).summary&&V(vn)})}var Dt=g(gn,2);{var hn=V=>{var Fe=Wc();gt(Fe,21,()=>s(f).steps,At,(Ae,nt,ht)=>{var x=Zc(),D=d(x);D.textContent=ht+1;var ie=g(D,2),X=d(ie,!0);o(ie),o(x),le(()=>ge(X,s(nt))),b(Ae,x)}),o(Fe),b(V,Fe)};Q(Dt,V=>{s(f).steps.length>0&&V(hn)})}var Kt=g(Dt,2);{var Bt=V=>{var Fe=Vc(),Ae=d(Fe,!0);o(Fe),le(()=>ge(Ae,s(f).question)),b(V,Fe)};Q(Kt,V=>{s(f).question&&V(Bt)})}o(nn);var an=g(nn,2),Et=d(an);{var jt=V=>{var Fe=Xc();gt(Fe,21,()=>s(f).options,At,(Ae,nt,ht)=>{var x=Yc(),D=d(x),ie=d(D,!0);o(D);var X=g(D,2),Ye=d(X,!0);o(X),o(x),le(mt=>{ge(ie,mt),ge(Ye,s(nt))},[()=>String.fromCharCode(65+ht)]),F("click",x,()=>It(s(nt))),b(Ae,x)}),o(Fe),b(V,Fe)};Q(Et,V=>{s(f).options.length>0&&V(jt)})}var qt=g(Et,2),pe=d(qt);ot(pe,"rows",2);var sn=g(pe,2),je=d(sn);Es(je,{size:12}),o(sn),o(qt),o(an),o(Se),le(()=>ot(pe,"placeholder",s(f).options.length>0?"Or type your own response...":"Type your response...")),F("click",Qe,()=>m(f,null)),F("keydown",pe,V=>{if(V.key==="Enter"&&!V.shiftKey){V.preventDefault();const Fe=V.currentTarget;Fe.value.trim()&&It(Fe.value.trim())}}),F("click",sn,V=>{const Fe=V.currentTarget.previousElementSibling;Fe?.value.trim()&&It(Fe.value.trim())}),b(W,Se)};Q(Jt,W=>{s(f)&&W(En)})}var Sn=g(Jt,2);{var An=W=>{var Se=ed(),Be=d(Se),ke=d(Be,!0);o(Be);var xe=g(Be,2);{var Ge=Qe=>{var Rt=Jc();F("click",Rt,Te),b(Qe,Rt)};Q(xe,Qe=>{s(q)>=ue&&Qe(Ge)})}o(Se),le(()=>ge(ke,s(K))),b(W,Se)};Q(Sn,W=>{s(K)&&W(An)})}var Tn=g(Sn,2),Bn=d(Tn);{var Gt=W=>{var Se=id();gt(Se,21,()=>s(B),Be=>Be.id,(Be,ke)=>{var xe=rd(),Ge=d(xe);let Qe;var Rt=d(Ge);{var nn=je=>{var V=td();le(()=>{ot(V,"src",s(ke).preview),ot(V,"alt",s(ke).name)}),b(je,V)},gn=je=>{var V=nd(),Fe=d(V);{var Ae=X=>{ks(X,{size:14})},nt=X=>{_o(X,{size:14})},ht=X=>{xo(X,{size:14})},x=X=>{ks(X,{size:14})},D=X=>{yo(X,{size:14})},ie=X=>{Ai(X,{size:14})};Q(Fe,X=>{s(ke).category==="pdf"?X(Ae):s(ke).category==="spreadsheet"?X(nt,1):s(ke).category==="presentation"?X(ht,2):s(ke).category==="document"?X(x,3):s(ke).category==="image"?X(D,4):X(ie,!1)})}o(V),b(je,V)};Q(Rt,je=>{s(ke).category==="image"&&s(ke).preview?je(nn):je(gn,!1)})}var vn=g(Rt,2),Dt=d(vn),hn=d(Dt,!0);o(Dt);var Kt=g(Dt,2),Bt=d(Kt),an=d(Bt,!0);o(Bt);var Et=g(Bt,2);Fs(Et,{size:9}),o(Kt),o(vn);var jt=g(vn,2),qt=d(jt);Fa(qt,{size:12}),o(jt),o(Ge);var pe=g(Ge,2);{var sn=je=>{var V=sd();gt(V,21,()=>y,At,(Fe,Ae)=>{var nt=ad();let ht;var x=d(nt,!0);o(nt),le(()=>{ht=it(nt,1,"type-option svelte-mwxll1",null,ht,{selected:s(ke).docType===s(Ae).value}),ge(x,s(Ae).label)}),F("click",nt,()=>G(s(ke).id,s(Ae).value)),b(Fe,nt)}),o(V),b(je,V)};Q(pe,je=>{s(C)===s(ke).id&&je(sn)})}o(xe),le((je,V)=>{Qe=it(Ge,1,"attachment-badge svelte-mwxll1",null,Qe,{"has-preview":s(ke).category==="image"&&s(ke).preview}),ot(Dt,"title",s(ke).name),ge(hn,je),ge(an,V)},[()=>s(ke).name.length>20?s(ke).name.slice(0,17)+"...":s(ke).name,()=>oe(s(ke).docType)]),F("click",Kt,()=>m(C,s(C)===s(ke).id?null:s(ke).id,!0)),F("click",jt,()=>E(s(ke).id)),b(Be,xe)}),o(Se),b(W,Se)};Q(Bn,W=>{s(B).length>0&&W(Gt)})}var Pt=g(Bn,2),en=d(Pt),un=d(en),ka=d(un);Ws(ka,{size:16}),o(un);var wa=g(un,2);{var tn=W=>{var Se=ld(),Be=d(Se),ke=d(Be);wo(ke,{size:14}),Je(2),o(Be);var xe=g(Be,2),Ge=d(xe);mo(Ge,{size:14}),Je(2),o(xe),o(Se),F("click",Be,()=>{s(te)?.click(),m(de,!1)}),F("click",xe,()=>{console.log("Screenshot not yet implemented"),m(de,!1)}),b(W,Se)};Q(wa,W=>{s(de)&&W(tn)})}o(en);var Nn=g(en,2);ga(Nn,W=>m(te,W),()=>s(te));var Lt=g(Nn,2);ma(Lt),ot(Lt,"rows",1),ga(Lt,W=>m(ft,W),()=>s(ft));var na=g(Lt,2),Rn=d(na),xa=d(Rn);Gs(xa,{size:14}),o(Rn);var pn=g(Rn,2),Ea=d(pn);{var S=W=>{as(W,{size:14,class:"spin-icon"})},re=W=>{Es(W,{size:14})};Q(Ea,W=>{a()?W(S):W(re,!1)})}o(pn),o(na),o(Pt),o(Tn);var Me=g(Tn,2);o(Y),le(W=>{I=it(Y,1,"architect-sidebar svelte-mwxll1",null,I,{dragging:s(Ee)}),H=Ys(Y,"",H,{width:`${s(be)??""}px`}),ge(Ve,s(Oe)),un.disabled=a(),ot(Nn,"accept",A),ot(Lt,"placeholder",`Ask ${s(Oe)??""}...`),Lt.disabled=a(),Rn.disabled=n().length===0,pn.disabled=W},[()=>!s(ut).trim()&&s(B).length===0||a()||!s(De)]),F("click",P,_n),F("click",un,()=>m(de,!s(de))),F("change",Nn,ne),F("keydown",Lt,dn),Qa("paste",Lt,Re),$t(Lt,()=>s(ut),W=>m(ut,W)),F("click",Rn,Ot),F("click",pn,Ct),F("mousedown",Me,U),b(T,Y)};Q(Nt,T=>{i()&&T(Ft)})}b(t,vt),cn(),p()}xn(["click","keydown","change","mousedown"]);var dd=w('
    '),ud=w('
    '),pd=w('
    Made with by Firefly Software Solutions
    ',1);function gd(t,e){on(e,!0);const n=()=>ct(Fi,"$page",r),[r,a]=mn(),c=_t(()=>n().url.pathname==="/"||n().url.pathname==="/index.html");Ja(()=>{Wi();function $(k){k.preventDefault();const E=k.reason instanceof Error?k.reason.message:String(k.reason);St(`Unhandled error: ${E}`,"error"),console.error("[AppShell] Unhandled rejection:",k.reason)}return window.addEventListener("unhandledrejection",$),()=>{Vi(),window.removeEventListener("unhandledrejection",$)}});function i(){const $=document.activeElement;if(!$)return!1;const k=$.tagName.toLowerCase();return!!(k==="input"||k==="textarea"||$.isContentEditable)}function u($){if(s(c))return;const k=$.metaKey||$.ctrlKey;if($.key==="s"&&k){$.preventDefault();const E=Ut(kn);E&&Ht.projects.savePipeline(E.name,"main",wn()).then(()=>St("Pipeline saved","success")).catch(()=>St("Failed to save pipeline","error"));return}if($.key===","&&k){$.preventDefault(),ea.set(!0);return}if($.key==="k"&&k){$.preventDefault(),Za.update(E=>!E);return}if($.key==="Enter"&&k){$.preventDefault(),ns(wn());return}if($.key==="D"&&k&&$.shiftKey){$.preventDefault(),ts(wn());return}if($.key==="/"&&k){$.preventDefault(),Gn.update(E=>!E);return}if($.key==="d"&&k&&!$.shiftKey){if(i())return;$.preventDefault();const E=Ut(ra);if(!E)return;const G=Ut(Fn).find(Re=>Re.id===E);if(!G)return;const oe=`${G.type}-dup-${Date.now()}`,ne=40;Fn.update(Re=>[...Re,{...G,id:oe,position:{x:G.position.x+ne,y:G.position.y+ne},data:{...G.data}}]),ra.set(oe);return}if(($.key==="Delete"||$.key==="Backspace")&&!k&&!$.shiftKey&&!$.altKey){if(i())return;const E=Ut(ra);if(!E)return;$.preventDefault(),Fn.update(C=>C.filter(G=>G.id!==E)),qa.update(C=>C.filter(G=>G.source!==E&&G.target!==E)),ra.set(null);return}if($.key==="?"&&!k&&!$.altKey){if(i())return;$.preventDefault(),Wa.update(E=>!E);return}}var p=pd();Qa("keydown",Yr,u);var f=he(p),h=d(f);ml(h,{get isHomePage(){return s(c)}});var y=g(h,2);{var _=$=>{var k=dd(),E=d(k);Ga(E,()=>e.children),o(k),b($,k)},z=$=>{var k=ud(),E=d(k);cd(E,{});var C=g(E,2),G=d(C);Ga(G,()=>e.children),o(C),o(k),b($,k)};Q(y,$=>{s(c)?$(_):$(z,!1)})}Je(2),o(f);var A=g(f,2);Nl(A,{});var O=g(A,2);Il(O,{});var B=g(O,2);Fl(B,{});var te=g(B,2);vo(te,{});var de=g(te,2);bo(de,{}),b(t,p),cn(),a()}var vd=w('');function Ad(t,e){on(e,!0),Ja(async()=>{await Ka();try{const n=await Ht.settings.status();(n.first_start||!n.setup_complete)&&pa.set(!0),await Zs()}catch{}}),Bi("12qhfyh",n=>{var r=vd();le(()=>ot(r,"href",ss)),b(n,r)}),gd(t,{children:(n,r)=>{var a=Ze(),c=he(a);Ga(c,()=>e.children),b(n,a)},$$slots:{default:!0}}),cn()}export{Ad as component,Sd as universal}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/0.DQYGG-fq.js b/studio-desktop/frontend-dist/_app/immutable/nodes/0.DQYGG-fq.js deleted file mode 100644 index c5a21aea..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/0.DQYGG-fq.js +++ /dev/null @@ -1,65 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{h as ua,a as Ur,bk as Hr,b as Fs,T as Fr,bl as Gr,bm as Kr,av as qr,aJ as bs,d as ms,c as _s,e as Zr,au as Wr,f as Ye,g as fe,i as m,w as Ln,b9 as Vr,G as xn,p as on,l as In,j as cn,B as d,M as Je,C as o,D as g,t as s,z as le,F as ge,K as F,A as w,I as ve,O as _t,L as b,N as _a,a3 as Ct,bj as Qa,J as On,as as Jn,ah as Ba,m as ys,o as Ja,bn as Yr,b8 as Xr,bo as Qr}from"../chunks/DCyBifBO.js";import{L as Gs,a as wt,C as Fn,b as ks,S as es,c as Ks,P as ja,d as ts,r as ns,i as Jr,e as ei,T as qs,F as ti,G as ni,R as ai,A as si,f as ri,g as ii,D as li,B as pa,W as oi,h as ci,j as di,k as ui,l as pi,m as gi,n as vi,o as hi,p as fi,s as Zs,q as Ua,M as Ws,Z as Ha,t as Vs,u as bi,v as mi,I as _i,w as yi,x as ki,y as wi,z as xi,E as Ei,H as Si,J as Ai,K as Ti,N as Ni,O as Fa}from"../chunks/91PP6ILK.js";import{I as Et,s as St,c as Ht,a as it,L as as,t as kn,h as ot,b as $t,u as wn,v as Gn,p as Oa,e as gt,q as xt,m as Mt,P as Ys,w as Ga,i as ws,g as Ri,B as $i,D as zi,x as Wt,n as Xs,X as Ka,o as Qs,y as Mi,r as Ci,z as qa,A as Oi,F as xs,C as ra}from"../chunks/BAxs8Xtu.js";import{B as Ii,l as At,s as Tt,p as Js,i as Q,a as _n,c as ct,b as ga}from"../chunks/v7tHB-Lt.js";import{s as Pi,a as Li,g as jn}from"../chunks/DhiGuJwU.js";import{s as ea,c as Kn,d as Za,a as ia,r as Di,b as Ia,e as Wa,f as va,p as Es}from"../chunks/BCCFcAOv.js";import{i as er}from"../chunks/l8YpzWR9.js";import{c as tr}from"../chunks/BX0kmcoN.js";import{S as Ss,a as As,I as Bi}from"../chunks/CdQ27ih8.js";const ji=Symbol("NaN");function Ui(t,e,n){ua&&Ur();var r=new Ii(t),a=!Hr();Fs(()=>{var c=e();c!==c&&(c=ji),a&&c!==null&&typeof c=="object"&&(c={}),r.ensure(c,n)})}function Hi(t,e){let n=null,r=ua;var a;if(ua){n=Zr;for(var c=Wr(document.head);c!==null&&(c.nodeType!==qr||c.data!==t);)c=bs(c);if(c===null)ms(!1);else{var i=bs(c);c.remove(),_s(i)}}ua||(a=document.head.appendChild(Fr()));try{Fs(()=>e(a),Gr|Kr)}finally{r&&(ms(!0),_s(n))}}const Fi=!1,Gi=!1,Td=Object.freeze(Object.defineProperty({__proto__:null,prerender:Gi,ssr:Fi},Symbol.toStringTag,{value:"Module"})),ss="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='100'%20cy='100'%20r='100'%20fill='url(%23paint0_linear_76_8)'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M100%2027C96.9983%2027.0001%2094.0805%2027.9929%2091.6991%2029.8243C89.3177%2031.6558%2087.6058%2034.2235%2086.8289%2037.1294C86.052%2040.0353%2086.2535%2043.1169%2087.4021%2045.8963C88.5507%2048.6758%2090.5823%2050.9977%2093.1818%2052.502V61.1667H72.7273C50.9091%2061.1667%2045.4545%2079.3912%2045.4545%2088.5V136.333C45.4545%20140.891%2048.1818%20150%2059.0909%20150H65.9091V122.667C65.9091%20120.854%2066.6274%20119.116%2067.9061%20117.835C69.1847%20116.553%2070.919%20115.833%2072.7273%20115.833H127.273C129.081%20115.833%20130.815%20116.553%20132.094%20117.835C133.373%20119.116%20134.091%20120.854%20134.091%20122.667V150H140.909C151.818%20150%20154.545%20140.891%20154.545%20136.333V88.5C154.545%2066.6333%20136.361%2061.1667%20127.273%2061.1667H106.818V52.502C109.418%2050.9977%20111.449%2048.6758%20112.598%2045.8963C113.747%2043.1169%20113.948%2040.0353%20113.171%2037.1294C112.394%2034.2235%20110.682%2031.6558%20108.301%2029.8243C105.92%2027.9929%20103.002%2027.0001%20100%2027ZM120.455%20150V129.5H106.818V150H120.455ZM93.1818%20150V129.5H79.5455V150H93.1818ZM161.364%20129.5V95.3333C165.911%2095.3333%20175%2098.0667%20175%20109V115.833C175%20120.391%20172.273%20129.5%20161.364%20129.5ZM38.6364%2095.3333V129.5C27.7273%20129.5%2025%20120.391%2025%20115.833V109C25%2098.0667%2034.0886%2095.3333%2038.6364%2095.3333ZM79.5455%2088.5C77.7372%2088.5%2076.0029%2089.2199%2074.7243%2090.5014C73.4456%2091.7829%2072.7273%2093.521%2072.7273%2095.3333C72.7273%2097.1456%2073.4456%2098.8837%2074.7243%20100.165C76.0029%20101.447%2077.7372%20102.167%2079.5455%20102.167H79.5523C81.3606%20102.167%2083.0948%20101.447%2084.3735%20100.165C85.6521%2098.8837%2086.3705%2097.1456%2086.3705%2095.3333C86.3705%2093.521%2085.6521%2091.7829%2084.3735%2090.5014C83.0948%2089.2199%2081.3606%2088.5%2079.5523%2088.5H79.5455ZM113.636%2095.3333C113.636%2093.521%20114.355%2091.7829%20115.633%2090.5014C116.912%2089.2199%20118.646%2088.5%20120.455%2088.5H120.461C122.27%2088.5%20124.004%2089.2199%20125.283%2090.5014C126.561%2091.7829%20127.28%2093.521%20127.28%2095.3333C127.28%2097.1456%20126.561%2098.8837%20125.283%20100.165C124.004%20101.447%20122.27%20102.167%20120.461%20102.167H120.455C118.646%20102.167%20116.912%20101.447%20115.633%20100.165C114.355%2098.8837%20113.636%2097.1456%20113.636%2095.3333Z'%20fill='white'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_76_8'%20x1='200'%20y1='100'%20x2='0'%20y2='100'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F68000'/%3e%3cstop%20offset='1'%20stop-color='%23FFF9C1'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e",Ki=()=>{const t=Pi;return{page:{subscribe:t.page.subscribe},navigating:{subscribe:t.navigating.subscribe},updated:t.updated}},qi={subscribe(t){return Ki().page.subscribe(t)}};function nr(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M12 20v-9"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z"}],["path",{d:"M14.12 3.88 16 2"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97"}],["path",{d:"M22 13h-4"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97"}],["path",{d:"M6 13H2"}],["path",{d:"m8 2 1.88 1.88"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13"}]];Et(t,Tt({name:"bug"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Zi(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M9 3v18"}]];Et(t,Tt({name:"panel-left"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Wi(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7"}]];Et(t,Tt({name:"save"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Vi(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M12 2v10"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04"}]];Et(t,Tt({name:"power"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}const la=Ln(null),oa=Ln(!1),Un=Ln("stopped"),Xn=Ln("checking"),ar=Ln(""),Yi={subscribe:Xn.subscribe};ar.subscribe;Vr(Xn,t=>t==="connected");let Qn=null;async function Ts(){try{const t=await fetch("/api/health",{signal:AbortSignal.timeout(3e3)});if(t.ok){const e=await t.json();Xn.set("connected"),ar.set(e.version??"")}else Xn.set("disconnected")}catch{Xn.set("disconnected")}}function Xi(t=1e4){Qn||(Ts(),Qn=setInterval(Ts,t))}function Qi(){Qn&&(clearInterval(Qn),Qn=null)}function Ji(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"}],["path",{d:"M2 12h20"}]];Et(t,Tt({name:"globe"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}var el=w(' ',1),tl=w(" ",1),nl=w('

    Send a POST request with a JSON body to run your pipeline remotely.

    '),al=w('
    ',1),sl=w('');function rl(t,e){on(e,!0);const n=()=>ct(la,"$tunnelUrl",c),r=()=>ct(oa,"$tunnelActive",c),a=()=>ct(kn,"$currentProject",c),[c,i]=_n();let u=Js(e,"open",3,!1),p=ve(!1),f=ve(!1),h=_t(n),y=_t(r),_=_t(()=>a()?.name??""),C=_t(()=>s(h)?`${s(h)}/api/projects/${s(_)}/run`:null);In(()=>{u()&&T()});async function T(){try{const G=await Ht.tunnel.status();oa.set(G.active),la.set(G.url)}catch{}}async function I(){b(p,!0);try{const G=await Ht.tunnel.start();oa.set(!0),la.set(G.url),wt("Tunnel started","success")}catch{wt("Failed to start tunnel","error")}finally{b(p,!1)}}async function B(){b(p,!0);try{await Ht.tunnel.stop(),oa.set(!1),la.set(null),wt("Tunnel stopped","success")}catch{wt("Failed to stop tunnel","error")}finally{b(p,!1)}}async function te(G){try{await navigator.clipboard.writeText(G),b(f,!0),setTimeout(()=>{b(f,!1)},2e3)}catch{wt("Failed to copy","error")}}function de(G){G.target===G.currentTarget&&e.onclose()}function $(G){G.key==="Escape"&&(G.preventDefault(),e.onclose())}var k=Ye(),E=fe(k);{var O=G=>{var oe=sl(),ne=d(oe),Re=d(ne),et=d(Re),qe=d(et);Gs(qe,{size:18}),Je(2),o(et),Je(2),o(Re);var Ne=g(Re,2),se=d(Ne),$e=d(se),Ce=d($e),tt=d(Ce);let J;var Pe=g(tt,2),Oe=d(Pe,!0);o(Pe),o(Ce);var Le=g(Ce,2);let Ze;var rt=d(Le);{var at=z=>{var q=el(),j=fe(q),Z=d(j);as(Z,{size:13}),o(j);var ee=g(j,2),ue=d(ee,!0);o(ee),le(()=>ge(ue,s(y)?"Stopping...":"Starting...")),m(z,q)},Xe=z=>{var q=tl(),j=fe(q);Ji(j,{size:13});var Z=g(j,2),ee=d(Z,!0);o(Z),le(()=>ge(ee,s(y)?"Stop Tunnel":"Start Tunnel")),m(z,q)};Q(rt,z=>{s(p)?z(at):z(Xe,!1)})}o(Le),o($e),Je(2),o(se);var ut=g(se,2);{var pt=z=>{var q=al(),j=fe(q),Z=g(d(j),2),ee=d(Z),ue=d(ee,!0);o(ee);var be=g(ee,2),Ee=d(be);{var _e=U=>{Fn(U,{size:13})},we=U=>{ks(U,{size:13})};Q(Ee,U=>{s(f)?U(_e):U(we,!1)})}o(be),o(Z),o(j);var R=g(j,2);{var W=U=>{var ye=nl(),he=g(d(ye),2),me=d(he),ze=d(me,!0);o(me);var Ie=g(me,2),Te=d(Ie);ks(Te,{size:13}),o(Ie),o(he),Je(2),o(ye),le(()=>ge(ze,s(C))),F("click",Ie,()=>te(s(C))),m(U,ye)};Q(R,U=>{s(C)&&U(W)})}le(()=>ge(ue,s(h))),F("click",be,()=>te(s(h))),m(z,q)};Q(ut,z=>{s(y)&&s(h)&&z(pt)})}o(Ne);var ft=g(Ne,2),De=d(ft);o(ft),o(ne),o(oe),le(()=>{J=it(tt,1,"tunnel-dot svelte-1vh905b",null,J,{"tunnel-dot-active":s(y)}),ge(Oe,s(y)?"Tunnel Active":"Tunnel Inactive"),Ze=it(Le,1,"tunnel-toggle-btn svelte-1vh905b",null,Ze,{"tunnel-stop":s(y)}),Le.disabled=s(p)}),F("click",oe,de),F("keydown",oe,$),F("click",Le,function(...z){(s(y)?B:I)?.apply(this,z)}),F("click",De,function(...z){e.onclose?.apply(this,z)}),m(G,oe)};Q(E,G=>{u()&&G(O)})}m(t,k),cn(),i()}xn(["click","keydown"]);var il=w(''),ll=w('active'),ol=w(''),cl=w('
    '),dl=w(' ',1),ul=w('
    ',1),pl=w(' /
    ',1),gl=w(' Running... ',1),vl=w(' Run',1),hl=w(''),fl=w('
    ',1),bl=w(''),ml=w(''),_l=w('

    Run Pipeline

    Provide input for your pipeline (or leave blank to run without input)

    '),yl=w('
    ',1);function kl(t,e){on(e,!0);const n=()=>ct(Jr,"$isRunning",f),r=()=>ct(ei,"$isDebugging",f),a=()=>ct(Yi,"$connectionState",f),c=()=>ct(Un,"$runtimeStatus",f),i=()=>ct(kn,"$currentProject",f),u=()=>ct(Oa,"$projects",f),p=()=>ct(Kn,"$architectSidebarOpen",f),[f,h]=_n();let y=Js(e,"isHomePage",3,!1),_=_t(n),C=_t(r),T=_t(()=>s(_)||s(C)),I=_t(a),B=ve(!1),te=ve(""),de=ve(!1),$=ve(null),k=ve(!1),E=ve(!1),O=ve("");Li(()=>{b(B,!1),b(E,!1),b(k,!1),b($,null)});function G(){b(B,!s(B)),b(te,"")}async function oe(){const R=s(te).trim();if(!(!R||s(de))){b(de,!0);try{await Ht.projects.create(R),await Ga();const U=Ct(Oa).find(ye=>ye.name===R);U&&ws(U),b(te,""),b(B,!1)}catch{wt("Failed to create project","error")}finally{b(de,!1)}}}async function ne(R){R&&(ws(R),b(B,!1))}function Re(R){if(Ct(Oa).length<=1){wt("Cannot delete the only project","error");return}b($,R,!0)}async function et(){if(!s($))return;const R=s($);b($,null);try{await Ht.projects.delete(R),await Ga(),wt(`Project "${R}" deleted`,"success")}catch{wt("Failed to delete project","error")}}function qe(){b($,null)}async function Ne(){const R=Ct(kn);if(R)try{const W=wn();await Ht.projects.savePipeline(R.name,"main",W),wt("Pipeline saved","success")}catch{wt("Failed to save pipeline","error")}}function se(){Ct(Gn).length!==0&&(b(E,!0),b(O,""))}function $e(){b(E,!1),ns(wn(),s(O)||void 0)}function Ce(){ts(wn())}function tt(){Kn.update(R=>!R)}let J=_t(c),Pe=ve(!1);async function Oe(){const R=Ct(kn);if(!(!R||s(Pe))){b(Pe,!0);try{s(J)==="running"?(Un.set("stopped"),await Ht.runtime.stop(R.name),Un.set("stopped"),wt("Runtime stopped","success")):(Un.set("starting"),await Ht.runtime.start(R.name),Un.set("running"),wt("Runtime started","success"))}catch{Un.set("error"),wt("Runtime toggle failed","error")}finally{b(Pe,!1)}}}var Le=yl(),Ze=fe(Le),rt=d(Ze),at=d(rt),Xe=d(at);Je(2),o(at);var ut=g(at,2);{var pt=R=>{var W=pl(),U=fe(W);let ye;var he=g(U,4),me=d(he),ze=g(d(me),2),Ie=d(ze,!0);o(ze);var Te=g(ze,2);Ks(Te,{size:10,class:"project-chevron"}),o(me);var bt=g(me,2);{var Ot=yt=>{var Xt=ul(),Pt=fe(Xt),yn=g(Pt,2),vt=d(yn),Nt=g(d(vt),2),Ft=d(Nt,!0);o(Nt),o(vt);var A=g(vt,2);{var K=H=>{var l=il(),v=d(l),N=g(d(v)),ce=d(N,!0);o(N),Je(),o(v);var He=g(v,4),We=d(He),P=g(We,2);o(He),o(l),le(()=>ge(ce,s($))),F("click",We,qe),F("click",P,et),m(H,l)},M=H=>{var l=dl(),v=fe(l);gt(v,5,u,xt,(P,L)=>{var ae=cl();let lt;var st=d(ae);let Qt;var Jt=g(st,2),En=d(Jt,!0);o(Jt);var Sn=g(Jt,2);{var An=Gt=>{var Lt=ll();m(Gt,Lt)};Q(Sn,Gt=>{i()?.name===s(L).name&&Gt(An)})}var Tn=g(Sn,2);{var Bn=Gt=>{var Lt=ol(),en=d(Lt);qs(en,{size:12}),o(Lt),F("click",Lt,un=>{un.stopPropagation(),Re(s(L).name)}),m(Gt,Lt)};Q(Tn,Gt=>{u().length>1&&Gt(Bn)})}o(ae),le(()=>{lt=it(ae,1,"dropdown-item svelte-11yu8dz",null,lt,{active:i()?.name===s(L).name}),Qt=it(st,1,"dropdown-item-dot svelte-11yu8dz",null,Qt,{"dot-active":i()?.name===s(L).name}),ge(En,s(L).name)}),F("click",ae,()=>ne(s(L))),m(P,ae)}),o(v);var N=g(v,2),ce=d(N);Mt(ce);var He=g(ce,2),We=d(He);Ys(We,{size:14}),o(He),o(N),le(P=>He.disabled=P,[()=>!s(te).trim()||s(de)]),F("keydown",ce,P=>P.key==="Enter"&&oe()),$t(ce,()=>s(te),P=>b(te,P)),F("click",He,oe),m(H,l)};Q(A,H=>{s($)?H(K):H(M,!1)})}o(yn),le(()=>ge(Ft,u().length)),F("click",Pt,()=>{b(B,!1),b($,null)}),F("keydown",Pt,()=>{}),m(yt,Xt)};Q(bt,yt=>{s(B)&&yt(Ot)})}o(he);var dn=g(he,2),It=d(dn);Wi(It,{size:14}),o(dn),le(()=>{ye=it(U,1,"conn-dot svelte-11yu8dz",null,ye,{"conn-ok":s(I)==="connected","conn-fail":s(I)==="disconnected","conn-check":s(I)==="checking"}),ot(U,"title",s(I)==="connected"?"Backend connected":s(I)==="disconnected"?"Backend disconnected":"Checking connection..."),ge(Ie,i()?.name??"No project")}),F("click",me,G),F("click",dn,Ne),m(R,W)};Q(ut,R=>{y()||R(pt)})}o(rt);var ft=g(rt,4),De=d(ft);{var z=R=>{var W=fl(),U=fe(W);let ye;var he=d(U);{var me=vt=>{var Nt=gl(),Ft=fe(Nt),A=d(Ft);as(A,{size:14}),o(Ft),Je(4),m(vt,Nt)},ze=vt=>{var Nt=vl(),Ft=fe(Nt);ja(Ft,{size:14}),Je(2),m(vt,Nt)};Q(he,vt=>{s(_)?vt(me):vt(ze,!1)})}o(U);var Ie=g(U,2);let Te;var bt=d(Ie);nr(bt,{size:16});var Ot=g(bt,2);{var dn=vt=>{var Nt=hl();m(vt,Nt)};Q(Ot,vt=>{s(C)&&vt(dn)})}o(Ie);var It=g(Ie,2);let yt;var Xt=d(It);let Pt;var yn=g(Xt,2);Vi(yn,{size:13}),o(It),Je(2),le(()=>{ye=it(U,1,"btn-run svelte-11yu8dz",null,ye,{"btn-run-active":s(_)}),U.disabled=s(T),Te=it(Ie,1,"btn-icon svelte-11yu8dz",null,Te,{"btn-debug-active":s(C)}),Ie.disabled=s(T),yt=it(It,1,"btn-runtime svelte-11yu8dz",null,yt,{"runtime-running":s(J)==="running","runtime-error":s(J)==="error","runtime-starting":s(J)==="starting"}),It.disabled=s(Pe),ot(It,"title",s(J)==="running"?"Stop runtime":"Start runtime"),Pt=it(Xt,1,"runtime-dot svelte-11yu8dz",null,Pt,{"rt-running":s(J)==="running","rt-stopped":s(J)==="stopped","rt-error":s(J)==="error","rt-starting":s(J)==="starting"})}),F("click",U,se),F("click",Ie,Ce),F("click",It,Oe),m(R,W)};Q(De,R=>{y()||R(z)})}var q=g(De,2);{var j=R=>{var W=bl(),U=d(W);Gs(U,{size:16}),o(W),F("click",W,()=>b(k,!0)),m(R,W)};Q(q,R=>{y()||R(j)})}var Z=g(q,2),ee=d(Z);es(ee,{size:16}),o(Z);var ue=g(Z,2);{var be=R=>{var W=ml();let U;var ye=d(W);Zi(ye,{size:16}),o(W),le(()=>U=it(W,1,"btn-icon svelte-11yu8dz",null,U,{"architect-active":p()})),F("click",W,tt),m(R,W)};Q(ue,R=>{y()||R(be)})}o(ft),o(Ze);var Ee=g(Ze,2);rl(Ee,{get open(){return s(k)},onclose:()=>b(k,!1)});var _e=g(Ee,2);{var we=R=>{var W=_l(),U=d(W),ye=g(d(U),4);_a(ye),ot(ye,"rows",4);var he=g(ye,2),me=d(he),ze=g(me,2),Ie=d(ze);ja(Ie,{size:14}),Je(),o(ze),o(he),o(U),o(W),F("click",W,()=>b(E,!1)),F("keydown",W,Te=>Te.key==="Escape"&&b(E,!1)),F("click",U,Te=>Te.stopPropagation()),F("keydown",U,()=>{}),F("keydown",ye,Te=>{Te.key==="Enter"&&(Te.metaKey||Te.ctrlKey)&&$e()}),$t(ye,()=>s(O),Te=>b(O,Te)),F("click",me,()=>b(E,!1)),F("click",ze,$e),m(R,W)};Q(_e,R=>{s(E)&&R(we)})}le(()=>ot(Xe,"src",ss)),F("click",Z,()=>ea.set(!0)),m(t,Le),cn(),h()}xn(["click","keydown"]);function wl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M3 15h18"}]];Et(t,Tt({name:"panel-bottom"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function xl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M15 3v18"}]];Et(t,Tt({name:"panel-right"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function El(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m18 16 4-4-4-4"}],["path",{d:"m6 8-4 4 4 4"}],["path",{d:"m14.5 4-5 16"}]];Et(t,Tt({name:"code-xml"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Sl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"}]];Et(t,Tt({name:"message-square"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}var Al=w('
    No matching commands
    '),Tl=w(' '),Nl=w(''),Rl=w('
    ',1),$l=w('
    ');function zl(t,e){on(e,!0);const n=()=>ct(Za,"$commandPaletteOpen",r),[r,a]=_n(),c=[{id:"nav-construct",label:"Go to Construct",category:"Navigation",icon:Ri,action:()=>jn("/construct")},{id:"nav-evaluate",label:"Go to Evaluate",category:"Navigation",icon:ti,action:()=>jn("/evaluate")},{id:"nav-experiments",label:"Go to Experiments",category:"Navigation",icon:ni,action:()=>jn("/experiments")},{id:"nav-deploy",label:"Go to Deploy",category:"Navigation",icon:ai,action:()=>jn("/deploy")},{id:"nav-monitor",label:"Go to Monitor",category:"Navigation",icon:si,action:()=>jn("/monitor")},{id:"nav-files",label:"Go to Files",category:"Navigation",icon:ri,action:()=>jn("/files")},{id:"node-input",label:"Add Input Node",category:"Add Node",icon:ii,action:()=>Wt("input","Input")},{id:"node-output",label:"Add Output Node",category:"Add Node",icon:li,action:()=>Wt("output","Output")},{id:"node-agent",label:"Add Agent Node",category:"Add Node",icon:pa,action:()=>Wt("agent","Agent")},{id:"node-tool",label:"Add Tool Node",category:"Add Node",icon:oi,action:()=>Wt("tool","Tool")},{id:"node-reasoning",label:"Add Reasoning Node",category:"Add Node",icon:$i,action:()=>Wt("reasoning","Reasoning")},{id:"node-condition",label:"Add Condition Node",category:"Add Node",icon:ci,action:()=>Wt("condition","Condition")},{id:"node-memory",label:"Add Memory Node",category:"Add Node",icon:zi,action:()=>Wt("memory","Memory")},{id:"node-validator",label:"Add Validator Node",category:"Add Node",icon:di,action:()=>Wt("validator","Validator")},{id:"node-code",label:"Add Code Node",category:"Add Node",icon:ui,action:()=>Wt("custom_code","Code")},{id:"node-fanout",label:"Add Fan Out Node",category:"Add Node",icon:pi,action:()=>Wt("fan_out","Fan Out")},{id:"node-fanin",label:"Add Fan In Node",category:"Add Node",icon:gi,action:()=>Wt("fan_in","Fan In")},{id:"open-settings",label:"Open Settings",category:"Settings",icon:es,action:()=>ea.set(!0),shortcut:"⌘,"},{id:"pipeline-run",label:"Run Pipeline",category:"Pipeline Actions",icon:ja,action:()=>ns(wn())},{id:"pipeline-debug",label:"Debug Pipeline",category:"Pipeline Actions",icon:nr,action:()=>ts(wn())},{id:"view-bottom-panel",label:"Toggle Bottom Panel",category:"View",icon:wl,action:()=>ia.update(k=>!k)},{id:"view-right-panel",label:"Toggle Right Panel",category:"View",icon:xl,action:()=>Di.update(k=>!k)},{id:"view-tab-console",label:"Switch to Console Tab",category:"View",icon:vi,action:()=>{ia.set(!0),Ia.set("console")}},{id:"view-tab-code",label:"Switch to Code Tab",category:"View",icon:El,action:()=>{ia.set(!0),Ia.set("code")}},{id:"view-tab-timeline",label:"Switch to Timeline Tab",category:"View",icon:hi,action:()=>{ia.set(!0),Ia.set("timeline")}},{id:"view-tab-chat",label:"Toggle AI Assistant Sidebar",category:"View",icon:Sl,action:()=>{Kn.update(k=>!k)}}];let i=ve(""),u=ve(0),p=ve(null);function f(k,E){let O=0,G=0,oe=-1;for(let ne=0;ne=0&&(G+=ne-oe-1),oe=ne,O++);return O===E.length?G:-1}let h=_t(()=>{if(!s(i).trim())return c;const k=s(i).toLowerCase(),E=c.map(O=>{const G=f(O.label.toLowerCase(),k),oe=f(O.category.toLowerCase(),k),ne=G>=0&&oe>=0?Math.min(G,oe):Math.max(G,oe);return{cmd:O,score:ne}}).filter(O=>O.score>=0);return E.sort((O,G)=>O.score-G.score),E.map(O=>O.cmd)}),y=_t(()=>{const k=[];let E=0;const O=new Map,G=[];for(const oe of s(h))O.has(oe.category)||(O.set(oe.category,[]),G.push(oe.category)),O.get(oe.category).push({...oe,globalIndex:E}),E++;for(const oe of G)k.push({category:oe,items:O.get(oe)});return k});In(()=>{s(u)>=s(h).length&&b(u,Math.max(0,s(h).length-1),!0)}),In(()=>{n()&&(b(i,""),b(u,0),queueMicrotask(()=>s(p)?.focus()))});function _(){Za.set(!1)}function C(k){_(),queueMicrotask(()=>k.action())}function T(k){if(k.key==="Escape"){k.preventDefault(),_();return}if(k.key==="ArrowDown"){k.preventDefault(),b(u,(s(u)+1)%s(h).length),I();return}if(k.key==="ArrowUp"){k.preventDefault(),b(u,(s(u)-1+s(h).length)%s(h).length),I();return}if(k.key==="Enter"){k.preventDefault();const E=s(h)[s(u)];E&&C(E);return}}function I(){queueMicrotask(()=>{const k=s(h)[s(u)];k&&document.getElementById(`cmd-item-${k.id}`)?.scrollIntoView({block:"nearest"})})}function B(k){k.target===k.currentTarget&&_()}var te=Ye(),de=fe(te);{var $=k=>{var E=$l(),O=d(E),G=d(O),oe=d(G);fi(oe,{size:16});var ne=g(oe,2);Mt(ne),ga(ne,se=>b(p,se),()=>s(p)),Je(2),o(G);var Re=g(G,2),et=d(Re);{var qe=se=>{var $e=Al();m(se,$e)},Ne=se=>{var $e=Ye(),Ce=fe($e);gt(Ce,17,()=>s(y),xt,(tt,J)=>{var Pe=Rl(),Oe=fe(Pe),Le=d(Oe,!0);o(Oe);var Ze=g(Oe,2);gt(Ze,17,()=>s(J).items,xt,(rt,at)=>{var Xe=Nl();let ut;var pt=d(Xe),ft=d(pt);tr(ft,()=>s(at).icon,(Z,ee)=>{ee(Z,{size:16})}),o(pt);var De=g(pt,2),z=d(De,!0);o(De);var q=g(De,2);{var j=Z=>{var ee=Tl(),ue=d(ee,!0);o(ee),le(()=>ge(ue,s(at).shortcut)),m(Z,ee)};Q(q,Z=>{s(at).shortcut&&Z(j)})}o(Xe),le(()=>{ot(Xe,"id",`cmd-item-${s(at).id??""}`),ut=it(Xe,1,"command-palette-item svelte-1g6akjj",null,ut,{selected:s(at).globalIndex===s(u)}),ot(Xe,"aria-selected",s(at).globalIndex===s(u)),ge(z,s(at).label)}),F("click",Xe,()=>C(s(at))),Qa("mouseenter",Xe,()=>{b(u,s(at).globalIndex,!0)}),m(rt,Xe)}),le(()=>ge(Le,s(J).category)),m(tt,Pe)}),m(se,$e)};Q(et,se=>{s(h).length===0?se(qe):se(Ne,!1)})}o(Re),Je(2),o(O),o(E),le(()=>ot(ne,"aria-activedescendant",s(h).length>0?`cmd-item-${s(h)[s(u)]?.id}`:void 0)),F("click",E,B),F("keydown",ne,T),$t(ne,()=>s(i),se=>b(i,se)),m(k,E)};Q(de,k=>{n()&&k($)})}m(t,te),cn(),a()}xn(["click","keydown"]);function Ml(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M10 8h.01"}],["path",{d:"M12 12h.01"}],["path",{d:"M14 8h.01"}],["path",{d:"M16 12h.01"}],["path",{d:"M18 8h.01"}],["path",{d:"M6 8h.01"}],["path",{d:"M7 16h10"}],["path",{d:"M8 12h.01"}],["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2"}]];Et(t,Tt({name:"keyboard"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}var Cl=w('+'),Ol=w(' ',1),Il=w('
    '),Pl=w('
    '),Ll=w('
    ');function Dl(t,e){on(e,!1);const n=()=>ct(Wa,"$shortcutsModalOpen",r),[r,a]=_n(),i=typeof navigator<"u"&&/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"⌘":"Ctrl",u=[{category:"General",shortcuts:[{keys:`${i} + K`,description:"Open command palette"},{keys:`${i} + ,`,description:"Open settings"},{keys:`${i} + /`,description:"Toggle AI assistant"},{keys:"?",description:"Show keyboard shortcuts"},{keys:"Esc",description:"Close modal / palette"}]},{category:"Pipeline",shortcuts:[{keys:`${i} + Enter`,description:"Run pipeline"},{keys:`${i} + Shift + D`,description:"Toggle debug mode"}]},{category:"Canvas",shortcuts:[{keys:"Delete / Backspace",description:"Remove selected node"},{keys:`${i} + D`,description:"Duplicate selected node"},{keys:"Space (hold)",description:"Pan canvas"},{keys:`${i} + +`,description:"Zoom in"},{keys:`${i} + -`,description:"Zoom out"}]}];function p(){Wa.set(!1)}function f(T){T.target===T.currentTarget&&p()}function h(T){T.key==="Escape"&&(T.preventDefault(),p())}er();var y=Ye(),_=fe(y);{var C=T=>{var I=Ll(),B=d(I),te=d(B),de=d(te),$=d(de);Ml($,{size:18}),Je(2),o(de),Je(2),o(te);var k=g(te,2);gt(k,5,()=>u,xt,(E,O)=>{var G=Pl(),oe=d(G),ne=d(oe,!0);o(oe);var Re=g(oe,2);gt(Re,1,()=>s(O).shortcuts,xt,(et,qe)=>{var Ne=Il(),se=d(Ne),$e=d(se,!0);o(se);var Ce=g(se,2);gt(Ce,5,()=>s(qe).keys.split(" + "),xt,(tt,J,Pe)=>{var Oe=Ol(),Le=fe(Oe);{var Ze=Xe=>{var ut=Cl();m(Xe,ut)};Q(Le,Xe=>{Pe>0&&Xe(Ze)})}var rt=g(Le,2),at=d(rt,!0);o(rt),le(Xe=>ge(at,Xe),[()=>s(J).trim()]),m(tt,Oe)}),o(Ce),o(Ne),le(()=>ge($e,s(qe).description)),m(et,Ne)}),o(G),le(()=>ge(ne,s(O).category)),m(E,G)}),o(k),o(B),o(I),F("click",I,f),F("keydown",I,h),m(T,I)};Q(_,T=>{n()&&T(C)})}m(t,y),cn(),a()}xn(["click","keydown"]);var Bl=w(' Configured'),jl=w('
    '),Ul=w('
    '),Hl=w('
    '),Fl=w('
    '),Gl=w('

    Your Information

    The assistant will use this to personalise interactions.

    Assistant Personality

    '),Kl=w('
    ');function ql(t,e){on(e,!0);const n=()=>ct(ea,"$settingsModalOpen",a),r=()=>ct(Zs,"$settingsData",a),[a,c]=_n(),i=[{id:"openai",label:"OpenAI",fields:[{key:"openai_api_key",label:"API Key",placeholder:"sk-..."}]},{id:"anthropic",label:"Anthropic",fields:[{key:"anthropic_api_key",label:"API Key",placeholder:"sk-ant-..."}]},{id:"google",label:"Google Gemini",fields:[{key:"google_api_key",label:"API Key",placeholder:"AIza..."}]},{id:"groq",label:"Groq",fields:[{key:"groq_api_key",label:"API Key",placeholder:"gsk_..."}]},{id:"mistral",label:"Mistral",fields:[{key:"mistral_api_key",label:"API Key",placeholder:"API key"}]},{id:"deepseek",label:"DeepSeek",fields:[{key:"deepseek_api_key",label:"API Key",placeholder:"API key"}]},{id:"cohere",label:"Cohere",fields:[{key:"cohere_api_key",label:"API Key",placeholder:"API key"}]},{id:"azure",label:"Azure OpenAI",fields:[{key:"azure_openai_api_key",label:"API Key",placeholder:"API key"},{key:"azure_openai_endpoint",label:"Endpoint URL",placeholder:"https://your-resource.openai.azure.com/"}]},{id:"bedrock",label:"Amazon Bedrock",fields:[{key:"aws_access_key_id",label:"Access Key ID",placeholder:"AKIA..."},{key:"aws_secret_access_key",label:"Secret Access Key",placeholder:"Secret key"},{key:"aws_default_region",label:"Region",placeholder:"us-east-1"}]},{id:"ollama",label:"Ollama",fields:[{key:"ollama_base_url",label:"Base URL",placeholder:"http://localhost:11434"}]}];let u=ve("credentials"),p=ve(!1),f=ve(On({})),h=ve("openai:gpt-4o"),y=ve(.7),_=ve(3),C=ve(""),T=ve(""),I=ve(""),B=ve("The Architect");In(()=>{n()&&r()&&(b(f,{},!0),b(h,r().model_defaults.default_model,!0),b(y,r().model_defaults.temperature,!0),b(_,r().model_defaults.retries,!0),r().user_profile&&(b(C,r().user_profile.name||"",!0),b(T,r().user_profile.role||"",!0),b(I,r().user_profile.context||"",!0),b(B,r().user_profile.assistant_name||"The Architect",!0)),b(u,"credentials"))});function te(ne){if(!r())return!1;const Re=r().credentials[ne];return Re!=null}function de(){ea.set(!1)}async function $(){b(p,!0);try{const ne={};for(const[et,qe]of Object.entries(s(f)))qe.trim()&&(ne[et]=qe.trim());const Re={name:s(C).trim(),role:s(T).trim(),context:s(I).trim(),assistant_name:s(B).trim()||"The Architect"};await Ua(Object.keys(ne).length>0?ne:null,{default_model:s(h),temperature:s(y),retries:s(_)},!0,Re),de()}catch{}finally{b(p,!1)}}function k(ne){ne.target===ne.currentTarget&&de()}function E(ne){ne.key==="Escape"&&(ne.preventDefault(),de())}var O=Ye(),G=fe(O);{var oe=ne=>{var Re=Kl(),et=d(Re),qe=d(et),Ne=d(qe),se=d(Ne);es(se,{size:18}),Je(2),o(Ne),Je(2),o(qe);var $e=g(qe,2),Ce=d($e);let tt;var J=g(Ce,2);let Pe;var Oe=g(J,2);let Le;o($e);var Ze=g($e,2),rt=d(Ze);{var at=q=>{var j=Hl();gt(j,21,()=>i,xt,(Z,ee)=>{var ue=Ul();let be;var Ee=d(ue),_e=d(Ee),we=d(_e,!0);o(_e);var R=g(_e,2);{var W=he=>{var me=Bl(),ze=d(me);Fn(ze,{size:10}),Je(),o(me),m(he,me)},U=_t(()=>s(ee).fields.every(he=>te(he.key)));Q(R,he=>{s(U)&&he(W)})}o(Ee);var ye=g(Ee,2);gt(ye,17,()=>s(ee).fields,xt,(he,me)=>{var ze=jl(),Ie=d(ze),Te=d(Ie,!0);o(Ie);var bt=g(Ie,2);Mt(bt),o(ze),le(Ot=>{ot(Ie,"for",`settings-${s(me).key??""}`),ge(Te,s(me).label),ot(bt,"id",`settings-${s(me).key??""}`),ot(bt,"placeholder",Ot),Xs(bt,s(f)[s(me).key]??"")},[()=>te(s(me).key)?"••••••••":s(me).placeholder]),F("input",bt,Ot=>{s(f)[s(me).key]=Ot.target.value}),m(he,ze)}),o(ue),le(he=>{be=it(ue,1,"provider-section svelte-1hvu725",null,be,he),ge(we,s(ee).label)},[()=>({configured:s(ee).fields.every(he=>te(he.key))})]),m(Z,ue)}),o(j),m(q,j)},Xe=q=>{var j=Fl(),Z=d(j),ee=g(d(Z),2);Ws(ee,{placeholder:"Select or type a model...",get value(){return s(h)},set value(W){b(h,W,!0)}}),o(Z);var ue=g(Z,2),be=d(ue),Ee=d(be);o(be);var _e=g(be,2);Mt(_e),o(ue);var we=g(ue,2),R=g(d(we),2);Mt(R),o(we),o(j),le(W=>ge(Ee,`Temperature: ${W??""}`),[()=>s(y).toFixed(2)]),$t(_e,()=>s(y),W=>b(y,W)),$t(R,()=>s(_),W=>b(_,W)),m(q,j)},ut=q=>{var j=Gl(),Z=d(j),ee=g(d(Z),4),ue=d(ee),be=g(d(ue),2);Mt(be),o(ue);var Ee=g(ue,2),_e=g(d(Ee),2);Mt(_e),o(Ee),o(ee);var we=g(ee,2),R=g(d(we),2);_a(R),o(we),o(Z);var W=g(Z,2),U=g(d(W),2),ye=d(U);{var he=Te=>{var bt=Jn("The Architect speaks with measured authority and philosophical precision.");m(Te,bt)},me=Te=>{var bt=Jn("Uses a friendly, helpful personality.");m(Te,bt)};Q(ye,Te=>{s(B)==="The Architect"?Te(he):Te(me,!1)})}o(U);var ze=g(U,2),Ie=g(d(ze),2);Mt(Ie),o(ze),o(W),o(j),$t(be,()=>s(C),Te=>b(C,Te)),$t(_e,()=>s(T),Te=>b(T,Te)),$t(R,()=>s(I),Te=>b(I,Te)),$t(Ie,()=>s(B),Te=>b(B,Te)),m(q,j)};Q(rt,q=>{s(u)==="credentials"?q(at):s(u)==="model"?q(Xe,1):q(ut,!1)})}o(Ze);var pt=g(Ze,2),ft=d(pt),De=g(ft,2),z=d(De,!0);o(De),o(pt),o(et),o(Re),le(()=>{tt=it(Ce,1,"settings-tab svelte-1hvu725",null,tt,{active:s(u)==="credentials"}),Pe=it(J,1,"settings-tab svelte-1hvu725",null,Pe,{active:s(u)==="model"}),Le=it(Oe,1,"settings-tab svelte-1hvu725",null,Le,{active:s(u)==="profile"}),De.disabled=s(p),ge(z,s(p)?"Saving...":"Save Settings")}),F("click",Re,k),F("keydown",Re,E),F("click",Ce,()=>b(u,"credentials")),F("click",J,()=>b(u,"model")),F("click",Oe,()=>b(u,"profile")),F("click",ft,de),F("click",De,$),m(ne,Re)};Q(G,ne=>{n()&&ne(oe)})}m(t,O),cn(),c()}xn(["click","keydown","input"]);function Zl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4"}],["path",{d:"m21 2-9.6 9.6"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5"}]];Et(t,Tt({name:"key"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Wl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"}],["circle",{cx:"12",cy:"7",r:"4"}]];Et(t,Tt({name:"user"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}var Vl=w(''),Yl=w("
    "),Xl=w('
    '),Ql=w(`

    Welcome to Firefly Agentic Studio

    Build, test, and deploy AI agent pipelines visually. - We'll help you configure your AI providers in just a few steps.

    Visual pipeline builder
    Multi-provider AI support
    Local credential storage
    `),Jl=w(''),eo=w(''),to=w('

    Select at least one provider to continue

    '),no=w('

    Choose your AI providers

    Select the providers you have API keys for. You can add more later in Settings.

    ',1),ao=w('
    '),so=w('
    '),ro=w('

    Enter your API keys

    Credentials are stored locally at ~/.firefly-studio/settings.json and never sent to our servers.

    ',1),io=w('This will be used for all new agent nodes'),lo=w('

    Configure defaults

    Choose the default model for new agent nodes. You can override per-node later.

    ',1),oo=w('

    Personalise your experience

    Tell us about yourself so the AI assistant can address you properly and provide contextual help.

    ',1),co=w(`

    as default. The Architect and The Oracle are ready. - The Architect will build your pipelines, and The Oracle will guide your decisions.

    You can change these anytime from the Settings menu.

    `),uo=w(' ',1),po=w('
    ',1),go=w(''),vo=w(''),ho=w(' ',1),fo=w('
    ');function bo(t,e){on(e,!0);const n=()=>ct(va,"$firstStartWizardOpen",r),[r,a]=_n(),c=[{id:"openai",label:"OpenAI",description:"GPT-4.1, o3, o4-mini",fields:[{key:"openai_api_key",label:"API Key",placeholder:"sk-..."}]},{id:"anthropic",label:"Anthropic",description:"Claude Sonnet, Opus, Haiku",fields:[{key:"anthropic_api_key",label:"API Key",placeholder:"sk-ant-..."}]},{id:"google",label:"Google Gemini",description:"Gemini 2.5 Pro & Flash",fields:[{key:"google_api_key",label:"API Key",placeholder:"AIza..."}]},{id:"groq",label:"Groq",description:"Fast Llama & Mixtral",fields:[{key:"groq_api_key",label:"API Key",placeholder:"gsk_..."}]},{id:"mistral",label:"Mistral",description:"Mistral Large & Codestral",fields:[{key:"mistral_api_key",label:"API Key",placeholder:"API key"}]},{id:"deepseek",label:"DeepSeek",description:"DeepSeek Chat & Reasoner",fields:[{key:"deepseek_api_key",label:"API Key",placeholder:"API key"}]},{id:"cohere",label:"Cohere",description:"Command R & R+",fields:[{key:"cohere_api_key",label:"API Key",placeholder:"API key"}]},{id:"azure",label:"Azure OpenAI",description:"Azure-hosted OpenAI models",fields:[{key:"azure_openai_api_key",label:"API Key",placeholder:"API key"},{key:"azure_openai_endpoint",label:"Endpoint URL",placeholder:"https://your-resource.openai.azure.com/"}]},{id:"bedrock",label:"Amazon Bedrock",description:"AWS-hosted foundation models",fields:[{key:"aws_access_key_id",label:"Access Key ID",placeholder:"AKIA..."},{key:"aws_secret_access_key",label:"Secret Access Key",placeholder:"Secret key"},{key:"aws_default_region",label:"Region",placeholder:"us-east-1"}]},{id:"ollama",label:"Ollama",description:"Local open-source models",fields:[{key:"ollama_base_url",label:"Base URL",placeholder:"http://localhost:11434"}]}],i=[{label:"Welcome"},{label:"Providers"},{label:"API Keys"},{label:"Defaults"},{label:"Profile"},{label:"Ready"}];let u=ve(0),p=ve(On(new Set)),f=On({}),h=ve(""),y=ve(.7),_=ve(3),C=ve(!1),T=ve(""),I=ve(""),B=ve("");const te=i.length;function de(){if(s(h))return;const Ne=["anthropic","openai","google","groq","mistral","deepseek","cohere","azure","bedrock","ollama"];for(const se of Ne)if(s(p).has(se)){const $e=bi(se);if($e){b(h,$e.id,!0);return}}}function $(Ne){const se=new Set(s(p));se.has(Ne)?se.delete(Ne):se.add(Ne),b(p,se,!0)}function k(){return c.filter(Ne=>s(p).has(Ne.id))}function E(){s(u)===1&&s(p).size===0||s(u)0&&Ba(u,-1)}async function G(){b(C,!0);try{const Ne={};for(const[$e,Ce]of Object.entries(f))Ce.trim()&&(Ne[$e]=Ce.trim());const se={};s(T).trim()&&(se.name=s(T).trim()),s(I).trim()&&(se.role=s(I).trim()),s(B).trim()&&(se.context=s(B).trim()),se.assistant_name="The Architect",await Ua(Object.keys(Ne).length>0?Ne:null,{default_model:s(h),temperature:s(y),retries:s(_)},!0,Object.keys(se).length>0?se:null),b(u,te-1)}catch{}finally{b(C,!1)}}async function oe(){try{await Ua(null,null,!0)}catch{}va.set(!1)}async function ne(){await Vs(),va.set(!1)}var Re=Ye(),et=fe(Re);{var qe=Ne=>{var se=fo(),$e=d(se),Ce=d($e);gt(Ce,21,()=>i,xt,(z,q,j)=>{var Z=Xl();let ee;var ue=d(Z),be=d(ue);{var Ee=W=>{Fn(W,{size:10})},_e=W=>{var U=Vl();U.textContent=j+1,m(W,U)};Q(be,W=>{j{var U=Yl();let ye;le(()=>ye=it(U,1,"wizard-step-line svelte-tj3wu",null,ye,{filled:j{jee=it(Z,1,"wizard-step-indicator svelte-tj3wu",null,ee,{active:j===s(u),completed:j{var q=Ql(),j=d(q),Z=g(j,6),ee=d(Z),ue=d(ee);Ha(ue,{size:16}),Je(2),o(ee);var be=g(ee,2),Ee=d(be);Ss(Ee,{size:16}),Je(2),o(be);var _e=g(be,2),we=d(_e);Zl(we,{size:16}),Je(2),o(_e),o(Z),o(q),le(()=>ot(j,"src",ss)),m(z,q)},Oe=z=>{var q=no(),j=g(fe(q),4);gt(j,21,()=>c,xt,(ue,be)=>{var Ee=eo();let _e;var we=d(Ee);{var R=ze=>{var Ie=Jl(),Te=d(Ie);Fn(Te,{size:10}),o(Ie),m(ze,Ie)},W=_t(()=>s(p).has(s(be).id));Q(we,ze=>{s(W)&&ze(R)})}var U=g(we,2),ye=d(U,!0);o(U);var he=g(U,2),me=d(he,!0);o(he),o(Ee),le(ze=>{_e=it(Ee,1,"wizard-provider-card svelte-tj3wu",null,_e,ze),ge(ye,s(be).label),ge(me,s(be).description)},[()=>({selected:s(p).has(s(be).id)})]),F("click",Ee,()=>$(s(be).id)),m(ue,Ee)}),o(j);var Z=g(j,2);{var ee=ue=>{var be=to();m(ue,be)};Q(Z,ue=>{s(p).size===0&&ue(ee)})}m(z,q)},Le=z=>{var q=ro(),j=g(fe(q),4);gt(j,21,k,xt,(Z,ee)=>{var ue=so(),be=d(ue),Ee=d(be,!0);o(be);var _e=g(be,2);gt(_e,17,()=>s(ee).fields,xt,(we,R)=>{var W=ao(),U=d(W),ye=d(U,!0);o(U);var he=g(U,2);Mt(he),o(W),le(()=>{ot(U,"for",`wizard-${s(R).key??""}`),ge(ye,s(R).label),ot(he,"id",`wizard-${s(R).key??""}`),ot(he,"placeholder",s(R).placeholder),Xs(he,f[s(R).key]??"")}),F("input",he,me=>{f[s(R).key]=me.target.value}),m(we,W)}),o(ue),le(()=>ge(Ee,s(ee).label)),m(Z,ue)}),o(j),m(z,q)},Ze=z=>{var q=lo(),j=g(fe(q),4),Z=d(j),ee=g(d(Z),2);Ws(ee,{placeholder:"Select or type a model...",get value(){return s(h)},set value(me){b(h,me,!0)}});var ue=g(ee,2);{var be=me=>{var ze=io();m(me,ze)};Q(ue,me=>{s(h)&&me(be)})}o(Z);var Ee=g(Z,2),_e=d(Ee),we=g(d(_e),2),R=d(we);Mt(R);var W=g(R,2),U=d(W,!0);o(W),o(we),o(_e);var ye=g(_e,2),he=g(d(ye),2);Mt(he),o(ye),o(Ee),o(j),le(me=>ge(U,me),[()=>s(y).toFixed(2)]),$t(R,()=>s(y),me=>b(y,me)),$t(he,()=>s(_),me=>b(_,me)),m(z,q)},rt=z=>{var q=oo(),j=g(fe(q),4),Z=d(j),ee=d(Z),ue=g(d(ee),2);Mt(ue),o(ee);var be=g(ee,2),Ee=g(d(be),2);Mt(Ee),o(be),o(Z);var _e=g(Z,2),we=g(d(_e),2);_a(we),o(_e),o(j),$t(ue,()=>s(T),R=>b(T,R)),$t(Ee,()=>s(I),R=>b(I,R)),$t(we,()=>s(B),R=>b(B,R)),m(z,q)},at=z=>{var q=co(),j=d(q),Z=d(j);Fn(Z,{size:32}),o(j);var ee=g(j,2),ue=d(ee);{var be=U=>{var ye=Jn();le(()=>ge(ye,`Welcome, ${s(T)??""}!`)),m(U,ye)},Ee=U=>{var ye=Jn("You're all set!");m(U,ye)};Q(ue,U=>{s(T)?U(be):U(Ee,!1)})}o(ee);var _e=g(ee,2),we=d(_e),R=g(we),W=d(R,!0);o(R),Je(5),o(_e),Je(2),o(q),le(U=>{ge(we,`Your ${s(p).size??""} provider${s(p).size!==1?"s are":" is"} configured - with `),ge(W,U)},[()=>s(h)?s(h).split(":")[1]:"default model"]),m(z,q)};Q(J,z=>{s(u)===0?z(Pe):s(u)===1?z(Oe,1):s(u)===2?z(Le,2):s(u)===3?z(Ze,3):s(u)===4?z(rt,4):z(at,!1)})}o(tt);var Xe=g(tt,2),ut=d(Xe);{var pt=z=>{var q=uo(),j=fe(q),Z=g(j,2);F("click",j,oe),F("click",Z,E),m(z,q)},ft=z=>{var q=po(),j=g(fe(q),2),Z=d(j);Ss(Z,{size:14}),Je(),o(j),F("click",j,ne),m(z,q)},De=z=>{var q=ho(),j=fe(q),Z=d(j),ee=g(Z,2);o(j);var ue=g(j,2);{var be=_e=>{var we=go(),R=d(we,!0);o(we),le(()=>{we.disabled=s(C)||!s(h),ge(R,s(C)?"Saving...":"Finish Setup")}),F("click",we,G),m(_e,we)},Ee=_e=>{var we=vo();le(()=>we.disabled=s(u)===1&&s(p).size===0),F("click",we,E),m(_e,we)};Q(ue,_e=>{s(u)===4?_e(be):_e(Ee,!1)})}F("click",Z,oe),F("click",ee,O),m(z,q)};Q(ut,z=>{s(u)===0?z(pt):s(u)===te-1?z(ft,1):z(De,!1)})}o(Xe),o($e),o(se),m(Ne,se)};Q(et,Ne=>{n()&&Ne(qe)})}m(t,Re),cn(),a()}xn(["click","input"]);var mo=w(''),_o=w('
    ');function yo(t,e){on(e,!1);const n=()=>ct(mi,"$toasts",r),[r,a]=_n(),c={success:Fn,error:ki,warning:yi,info:_i},i={success:"var(--color-success)",error:"var(--color-error)",warning:"var(--color-warning)",info:"var(--color-info)"};er();var u=Ye(),p=fe(u);{var f=h=>{var y=_o();gt(y,5,n,_=>_.id,(_,C)=>{var T=mo();let I;var B=d(T),te=d(B);tr(te,()=>c[s(C).type],(O,G)=>{G(O,{size:16})}),o(B);var de=g(B,2),$=d(de,!0);o(de);var k=g(de,2),E=d(k);Ka(E,{size:14}),o(k),o(T),le(()=>{I=Qs(T,"",I,{"--toast-color":i[s(C).type]}),ge($,s(C).message)}),F("click",k,()=>wi(s(C).id)),xi(3,T,()=>Ei,()=>({y:16,duration:200})),m(_,T)}),o(y),m(h,y)};Q(p,h=>{n().length>0&&h(f)})}m(t,u),cn(),a()}xn(["click"]);function ko(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"}],["circle",{cx:"12",cy:"13",r:"3"}]];Et(t,Tt({name:"camera"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function wo(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}],["path",{d:"M8 13h2"}],["path",{d:"M14 13h2"}],["path",{d:"M8 17h2"}],["path",{d:"M14 17h2"}]];Et(t,Tt({name:"file-spreadsheet"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function xo(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M9 3v18"}],["path",{d:"m16 15-3-3 3-3"}]];Et(t,Tt({name:"panel-left-close"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Eo(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551"}]];Et(t,Tt({name:"paperclip"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function So(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M2 3h20"}],["path",{d:"M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3"}],["path",{d:"m7 21 5-5 5 5"}]];Et(t,Tt({name:"presentation"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function rs(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Dn=rs();function sr(t){Dn=t}var Cn={exec:()=>null};function Ue(t,e=""){let n=typeof t=="string"?t:t.source,r={replace:(a,c)=>{let i=typeof c=="string"?c:c.source;return i=i.replace(zt.caret,"$1"),n=n.replace(a,i),r},getRegex:()=>new RegExp(n,e)};return r}var Ao=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}>`)},To=/^(?:[ \t]*(?:\n|$))+/,No=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Ro=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ta=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,$o=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,is=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,rr=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ir=Ue(rr).replace(/bull/g,is).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),zo=Ue(rr).replace(/bull/g,is).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),ls=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Mo=/^[^\n]+/,os=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Co=Ue(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",os).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Oo=Ue(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,is).getRegex(),ya="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",cs=/|$))/,Io=Ue("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",cs).replace("tag",ya).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),lr=Ue(ls).replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",ya).getRegex(),Po=Ue(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",lr).getRegex(),ds={blockquote:Po,code:No,def:Co,fences:Ro,heading:$o,hr:ta,html:Io,lheading:ir,list:Oo,newline:To,paragraph:lr,table:Cn,text:Mo},Ns=Ue("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",ya).getRegex(),Lo={...ds,lheading:zo,table:Ns,paragraph:Ue(ls).replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Ns).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",ya).getRegex()},Do={...ds,html:Ue(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",cs).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Cn,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Ue(ls).replace("hr",ta).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",ir).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Bo=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,jo=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,or=/^( {2,}|\\)\n(?!\s*$)/,Uo=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Ao?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),pr=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Wo=Ue(pr,"u").replace(/punct/g,ka).getRegex(),Vo=Ue(pr,"u").replace(/punct/g,dr).getRegex(),gr="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Yo=Ue(gr,"gu").replace(/notPunctSpace/g,cr).replace(/punctSpace/g,us).replace(/punct/g,ka).getRegex(),Xo=Ue(gr,"gu").replace(/notPunctSpace/g,Go).replace(/punctSpace/g,Fo).replace(/punct/g,dr).getRegex(),Qo=Ue("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,cr).replace(/punctSpace/g,us).replace(/punct/g,ka).getRegex(),Jo=Ue(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,ur).getRegex(),ec="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",tc=Ue(ec,"gu").replace(/notPunctSpace/g,qo).replace(/punctSpace/g,Ko).replace(/punct/g,ur).getRegex(),nc=Ue(/\\(punct)/,"gu").replace(/punct/g,ka).getRegex(),ac=Ue(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),sc=Ue(cs).replace("(?:-->|$)","-->").getRegex(),rc=Ue("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",sc).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ha=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,ic=Ue(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",ha).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),vr=Ue(/^!?\[(label)\]\[(ref)\]/).replace("label",ha).replace("ref",os).getRegex(),hr=Ue(/^!?\[(ref)\](?:\[\])?/).replace("ref",os).getRegex(),lc=Ue("reflink|nolink(?!\\()","g").replace("reflink",vr).replace("nolink",hr).getRegex(),Rs=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,ps={_backpedal:Cn,anyPunctuation:nc,autolink:ac,blockSkip:Zo,br:or,code:jo,del:Cn,delLDelim:Cn,delRDelim:Cn,emStrongLDelim:Wo,emStrongRDelimAst:Yo,emStrongRDelimUnd:Qo,escape:Bo,link:ic,nolink:hr,punctuation:Ho,reflink:vr,reflinkSearch:lc,tag:rc,text:Uo,url:Cn},oc={...ps,link:Ue(/^!?\[(label)\]\((.*?)\)/).replace("label",ha).getRegex(),reflink:Ue(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",ha).getRegex()},Va={...ps,emStrongRDelimAst:Xo,emStrongLDelim:Vo,delLDelim:Jo,delRDelim:tc,url:Ue(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Rs).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Ue(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},$s=t=>dc[t];function ln(t,e){if(e){if(zt.escapeTest.test(t))return t.replace(zt.escapeReplace,$s)}else if(zt.escapeTestNoEncode.test(t))return t.replace(zt.escapeReplaceNoEncode,$s);return t}function zs(t){try{t=encodeURI(t).replace(zt.percentDecode,"%")}catch{return null}return t}function Ms(t,e){let n=t.replace(zt.findPipe,(c,i,u)=>{let p=!1,f=i;for(;--f>=0&&u[f]==="\\";)p=!p;return p?"|":" |"}),r=n.split(zt.splitPipe),a=0;if(r[0].trim()||r.shift(),r.length>0&&!r.at(-1)?.trim()&&r.pop(),e)if(r.length>e)r.splice(e);else for(;r.length0?-2:-1}function pc(t,e=0){let n=e,r="";for(let a of t)if(a===" "){let c=4-n%4;r+=" ".repeat(c),n+=c}else r+=a,n++;return r}function Cs(t,e,n,r,a){let c=e.href,i=e.title||null,u=t[1].replace(a.other.outputLinkReplace,"$1");r.state.inLink=!0;let p={type:t[0].charAt(0)==="!"?"image":"link",raw:n,href:c,title:i,text:u,tokens:r.inlineTokens(u)};return r.state.inLink=!1,p}function gc(t,e,n){let r=t.match(n.other.indentCodeCompensation);if(r===null)return e;let a=r[1];return e.split(` -`).map(c=>{let i=c.match(n.other.beginningSpace);if(i===null)return c;let[u]=i;return u.length>=a.length?c.slice(a.length):c}).join(` -`)}var fa=class{options;rules;lexer;constructor(t){this.options=t||Dn}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let n=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Vn(n,` -`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let n=e[0],r=gc(n,e[3]||"",this.rules);return{type:"code",raw:n,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:r}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let n=e[2].trim();if(this.rules.other.endingHash.test(n)){let r=Vn(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:Vn(e[0],` -`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let n=Vn(e[0],` -`).split(` -`),r="",a="",c=[];for(;n.length>0;){let i=!1,u=[],p;for(p=0;p1,a={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");let c=this.rules.other.listItemRegex(n),i=!1;for(;t;){let p=!1,f="",h="";if(!(e=c.exec(t))||this.rules.block.hr.test(t))break;f=e[0],t=t.substring(f.length);let y=pc(e[2].split(` -`,1)[0],e[1].length),_=t.split(` -`,1)[0],C=!y.trim(),T=0;if(this.options.pedantic?(T=2,h=y.trimStart()):C?T=e[1].length+1:(T=y.search(this.rules.other.nonSpaceChar),T=T>4?1:T,h=y.slice(T),T+=e[1].length),C&&this.rules.other.blankLine.test(_)&&(f+=_+` -`,t=t.substring(_.length+1),p=!0),!p){let I=this.rules.other.nextBulletRegex(T),B=this.rules.other.hrRegex(T),te=this.rules.other.fencesBeginRegex(T),de=this.rules.other.headingBeginRegex(T),$=this.rules.other.htmlBeginRegex(T),k=this.rules.other.blockquoteBeginRegex(T);for(;t;){let E=t.split(` -`,1)[0],O;if(_=E,this.options.pedantic?(_=_.replace(this.rules.other.listReplaceNesting," "),O=_):O=_.replace(this.rules.other.tabCharGlobal," "),te.test(_)||de.test(_)||$.test(_)||k.test(_)||I.test(_)||B.test(_))break;if(O.search(this.rules.other.nonSpaceChar)>=T||!_.trim())h+=` -`+O.slice(T);else{if(C||y.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||te.test(y)||de.test(y)||B.test(y))break;h+=` -`+_}C=!_.trim(),f+=E+` -`,t=t.substring(E.length+1),y=O.slice(T)}}a.loose||(i?a.loose=!0:this.rules.other.doubleBlankLine.test(f)&&(i=!0)),a.items.push({type:"list_item",raw:f,task:!!this.options.gfm&&this.rules.other.listIsTask.test(h),loose:!1,text:h,tokens:[]}),a.raw+=f}let u=a.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;a.raw=a.raw.trimEnd();for(let p of a.items){if(this.lexer.state.top=!1,p.tokens=this.lexer.blockTokens(p.text,[]),p.task){if(p.text=p.text.replace(this.rules.other.listReplaceTask,""),p.tokens[0]?.type==="text"||p.tokens[0]?.type==="paragraph"){p.tokens[0].raw=p.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),p.tokens[0].text=p.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}}let f=this.rules.other.listTaskCheckbox.exec(p.raw);if(f){let h={type:"checkbox",raw:f[0]+" ",checked:f[0]!=="[ ]"};p.checked=h.checked,a.loose?p.tokens[0]&&["paragraph","text"].includes(p.tokens[0].type)&&"tokens"in p.tokens[0]&&p.tokens[0].tokens?(p.tokens[0].raw=h.raw+p.tokens[0].raw,p.tokens[0].text=h.raw+p.tokens[0].text,p.tokens[0].tokens.unshift(h)):p.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):p.tokens.unshift(h)}}if(!a.loose){let f=p.tokens.filter(y=>y.type==="space"),h=f.length>0&&f.some(y=>this.rules.other.anyLine.test(y.raw));a.loose=h}}if(a.loose)for(let p of a.items){p.loose=!0;for(let f of p.tokens)f.type==="text"&&(f.type="paragraph")}return a}}html(t){let e=this.rules.block.html.exec(t);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(t){let e=this.rules.block.def.exec(t);if(e){let n=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",a=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:n,raw:e[0],href:r,title:a}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let n=Ms(e[1]),r=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),a=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` -`):[],c={type:"table",raw:e[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let i of r)this.rules.other.tableAlignRight.test(i)?c.align.push("right"):this.rules.other.tableAlignCenter.test(i)?c.align.push("center"):this.rules.other.tableAlignLeft.test(i)?c.align.push("left"):c.align.push(null);for(let i=0;i({text:u,tokens:this.lexer.inline(u),header:!1,align:c.align[p]})));return c}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let n=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:n,tokens:this.lexer.inline(n)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let n=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let c=Vn(n.slice(0,-1),"\\");if((n.length-c.length)%2===0)return}else{let c=uc(e[2],"()");if(c===-2)return;if(c>-1){let i=(e[0].indexOf("!")===0?5:4)+e[1].length+c;e[2]=e[2].substring(0,c),e[0]=e[0].substring(0,i).trim(),e[3]=""}}let r=e[2],a="";if(this.options.pedantic){let c=this.rules.other.pedanticHrefTitle.exec(r);c&&(r=c[1],a=c[3])}else a=e[3]?e[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),Cs(e,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:a&&a.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let n;if((n=this.rules.inline.reflink.exec(t))||(n=this.rules.inline.nolink.exec(t))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),a=e[r.toLowerCase()];if(!a){let c=n[0].charAt(0);return{type:"text",raw:c,text:c}}return Cs(n,a,n[0],this.lexer,this.rules)}}emStrong(t,e,n=""){let r=this.rules.inline.emStrongLDelim.exec(t);if(!(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(r[1]||r[2])||!n||this.rules.inline.punctuation.exec(n))){let a=[...r[0]].length-1,c,i,u=a,p=0,f=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(f.lastIndex=0,e=e.slice(-1*t.length+a);(r=f.exec(e))!=null;){if(c=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!c)continue;if(i=[...c].length,r[3]||r[4]){u+=i;continue}else if((r[5]||r[6])&&a%3&&!((a+i)%3)){p+=i;continue}if(u-=i,u>0)continue;i=Math.min(i,i+u+p);let h=[...r[0]][0].length,y=t.slice(0,a+r.index+h+i);if(Math.min(a,i)%2){let C=y.slice(1,-1);return{type:"em",raw:y,text:C,tokens:this.lexer.inlineTokens(C)}}let _=y.slice(2,-2);return{type:"strong",raw:y,text:_,tokens:this.lexer.inlineTokens(_)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let n=e[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(n),a=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&a&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:e[0],text:n}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t,e,n=""){let r=this.rules.inline.delLDelim.exec(t);if(r&&(!r[1]||!n||this.rules.inline.punctuation.exec(n))){let a=[...r[0]].length-1,c,i,u=a,p=this.rules.inline.delRDelim;for(p.lastIndex=0,e=e.slice(-1*t.length+a);(r=p.exec(e))!=null;){if(c=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!c||(i=[...c].length,i!==a))continue;if(r[3]||r[4]){u+=i;continue}if(u-=i,u>0)continue;i=Math.min(i,i+u);let f=[...r[0]][0].length,h=t.slice(0,a+r.index+f+i),y=h.slice(a,-a);return{type:"del",raw:h,text:y,tokens:this.lexer.inlineTokens(y)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let n,r;return e[2]==="@"?(n=e[1],r="mailto:"+n):(n=e[1],r=n),{type:"link",raw:e[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let n,r;if(e[2]==="@")n=e[0],r="mailto:"+n;else{let a;do a=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(a!==e[0]);n=e[0],e[1]==="www."?r="http://"+e[0]:r=e[0]}return{type:"link",raw:e[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let n=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:n}}}},Vt=class Ya{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Dn,this.options.tokenizer=this.options.tokenizer||new fa,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:zt,block:ca.normal,inline:Wn.normal};this.options.pedantic?(n.block=ca.pedantic,n.inline=Wn.pedantic):this.options.gfm&&(n.block=ca.gfm,this.options.breaks?n.inline=Wn.breaks:n.inline=Wn.gfm),this.tokenizer.rules=n}static get rules(){return{block:ca,inline:Wn}}static lex(e,n){return new Ya(n).lex(e)}static lexInline(e,n){return new Ya(n).inlineTokens(e)}lex(e){e=e.replace(zt.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let n=0;n(a=i.call({lexer:this},e,n))?(e=e.substring(a.raw.length),n.push(a),!0):!1))continue;if(a=this.tokenizer.space(e)){e=e.substring(a.raw.length);let i=n.at(-1);a.raw.length===1&&i!==void 0?i.raw+=` -`:n.push(a);continue}if(a=this.tokenizer.code(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.at(-1).src=i.text):n.push(a);continue}if(a=this.tokenizer.fences(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.heading(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.hr(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.blockquote(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.list(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.html(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.def(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[a.tag]||(this.tokens.links[a.tag]={href:a.href,title:a.title},n.push(a));continue}if(a=this.tokenizer.table(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.lheading(e)){e=e.substring(a.raw.length),n.push(a);continue}let c=e;if(this.options.extensions?.startBlock){let i=1/0,u=e.slice(1),p;this.options.extensions.startBlock.forEach(f=>{p=f.call({lexer:this},u),typeof p=="number"&&p>=0&&(i=Math.min(i,p))}),i<1/0&&i>=0&&(c=e.substring(0,i+1))}if(this.state.top&&(a=this.tokenizer.paragraph(c))){let i=n.at(-1);r&&i?.type==="paragraph"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):n.push(a),r=c.length!==e.length,e=e.substring(a.raw.length);continue}if(a=this.tokenizer.text(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):n.push(a);continue}if(e){let i="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(i);break}else throw new Error(i)}}return this.state.top=!0,n}inline(e,n=[]){return this.inlineQueue.push({src:e,tokens:n}),n}inlineTokens(e,n=[]){let r=e,a=null;if(this.tokens.links){let p=Object.keys(this.tokens.links);if(p.length>0)for(;(a=this.tokenizer.rules.inline.reflinkSearch.exec(r))!=null;)p.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(a=this.tokenizer.rules.inline.anyPunctuation.exec(r))!=null;)r=r.slice(0,a.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let c;for(;(a=this.tokenizer.rules.inline.blockSkip.exec(r))!=null;)c=a[2]?a[2].length:0,r=r.slice(0,a.index+c)+"["+"a".repeat(a[0].length-c-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);r=this.options.hooks?.emStrongMask?.call({lexer:this},r)??r;let i=!1,u="";for(;e;){i||(u=""),i=!1;let p;if(this.options.extensions?.inline?.some(h=>(p=h.call({lexer:this},e,n))?(e=e.substring(p.raw.length),n.push(p),!0):!1))continue;if(p=this.tokenizer.escape(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.tag(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.link(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(p.raw.length);let h=n.at(-1);p.type==="text"&&h?.type==="text"?(h.raw+=p.raw,h.text+=p.text):n.push(p);continue}if(p=this.tokenizer.emStrong(e,r,u)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.codespan(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.br(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.del(e,r,u)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.autolink(e)){e=e.substring(p.raw.length),n.push(p);continue}if(!this.state.inLink&&(p=this.tokenizer.url(e))){e=e.substring(p.raw.length),n.push(p);continue}let f=e;if(this.options.extensions?.startInline){let h=1/0,y=e.slice(1),_;this.options.extensions.startInline.forEach(C=>{_=C.call({lexer:this},y),typeof _=="number"&&_>=0&&(h=Math.min(h,_))}),h<1/0&&h>=0&&(f=e.substring(0,h+1))}if(p=this.tokenizer.inlineText(f)){e=e.substring(p.raw.length),p.raw.slice(-1)!=="_"&&(u=p.raw.slice(-1)),i=!0;let h=n.at(-1);h?.type==="text"?(h.raw+=p.raw,h.text+=p.text):n.push(p);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return n}},ba=class{options;parser;constructor(t){this.options=t||Dn}space(t){return""}code({text:t,lang:e,escaped:n}){let r=(e||"").match(zt.notSpaceStart)?.[0],a=t.replace(zt.endingNewline,"")+` -`;return r?'
    '+(n?a:ln(a,!0))+`
    -`:"
    "+(n?a:ln(a,!0))+`
    -`}blockquote({tokens:t}){return`
    -${this.parser.parse(t)}
    -`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} -`}hr(t){return`
    -`}list(t){let e=t.ordered,n=t.start,r="";for(let i=0;i -`+r+" -`}listitem(t){return`
  • ${this.parser.parse(t.tokens)}
  • -`}checkbox({checked:t}){return" '}paragraph({tokens:t}){return`

    ${this.parser.parseInline(t)}

    -`}table(t){let e="",n="";for(let a=0;a${r}`),` - -`+e+` -`+r+`
    -`}tablerow({text:t}){return` -${t} -`}tablecell(t){let e=this.parser.parseInline(t.tokens),n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+` -`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${ln(t,!0)}`}br(t){return"
    "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:n}){let r=this.parser.parseInline(n),a=zs(t);if(a===null)return r;t=a;let c='
    ",c}image({href:t,title:e,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let a=zs(t);if(a===null)return ln(n);t=a;let c=`${ln(n)}{let i=a[c].flat(1/0);n=n.concat(this.walkTokens(i,e))}):a.tokens&&(n=n.concat(this.walkTokens(a.tokens,e)))}}return n}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(a=>{if(!a.name)throw new Error("extension name required");if("renderer"in a){let c=e.renderers[a.name];c?e.renderers[a.name]=function(...i){let u=a.renderer.apply(this,i);return u===!1&&(u=c.apply(this,i)),u}:e.renderers[a.name]=a.renderer}if("tokenizer"in a){if(!a.level||a.level!=="block"&&a.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let c=e[a.level];c?c.unshift(a.tokenizer):e[a.level]=[a.tokenizer],a.start&&(a.level==="block"?e.startBlock?e.startBlock.push(a.start):e.startBlock=[a.start]:a.level==="inline"&&(e.startInline?e.startInline.push(a.start):e.startInline=[a.start]))}"childTokens"in a&&a.childTokens&&(e.childTokens[a.name]=a.childTokens)}),r.extensions=e),n.renderer){let a=this.defaults.renderer||new ba(this.defaults);for(let c in n.renderer){if(!(c in a))throw new Error(`renderer '${c}' does not exist`);if(["options","parser"].includes(c))continue;let i=c,u=n.renderer[i],p=a[i];a[i]=(...f)=>{let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h||""}}r.renderer=a}if(n.tokenizer){let a=this.defaults.tokenizer||new fa(this.defaults);for(let c in n.tokenizer){if(!(c in a))throw new Error(`tokenizer '${c}' does not exist`);if(["options","rules","lexer"].includes(c))continue;let i=c,u=n.tokenizer[i],p=a[i];a[i]=(...f)=>{let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h}}r.tokenizer=a}if(n.hooks){let a=this.defaults.hooks||new Yn;for(let c in n.hooks){if(!(c in a))throw new Error(`hook '${c}' does not exist`);if(["options","block"].includes(c))continue;let i=c,u=n.hooks[i],p=a[i];Yn.passThroughHooks.has(c)?a[i]=f=>{if(this.defaults.async&&Yn.passThroughHooksRespectAsync.has(c))return(async()=>{let y=await u.call(a,f);return p.call(a,y)})();let h=u.call(a,f);return p.call(a,h)}:a[i]=(...f)=>{if(this.defaults.async)return(async()=>{let y=await u.apply(a,f);return y===!1&&(y=await p.apply(a,f)),y})();let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h}}r.hooks=a}if(n.walkTokens){let a=this.defaults.walkTokens,c=n.walkTokens;r.walkTokens=function(i){let u=[];return u.push(c.call(this,i)),a&&(u=u.concat(a.call(this,i))),u}}this.defaults={...this.defaults,...r}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return Vt.lex(t,e??this.defaults)}parser(t,e){return Yt.parse(t,e??this.defaults)}parseMarkdown(t){return(e,n)=>{let r={...n},a={...this.defaults,...r},c=this.onError(!!a.silent,!!a.async);if(this.defaults.async===!0&&r.async===!1)return c(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return c(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return c(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(a.hooks&&(a.hooks.options=a,a.hooks.block=t),a.async)return(async()=>{let i=a.hooks?await a.hooks.preprocess(e):e,u=await(a.hooks?await a.hooks.provideLexer():t?Vt.lex:Vt.lexInline)(i,a),p=a.hooks?await a.hooks.processAllTokens(u):u;a.walkTokens&&await Promise.all(this.walkTokens(p,a.walkTokens));let f=await(a.hooks?await a.hooks.provideParser():t?Yt.parse:Yt.parseInline)(p,a);return a.hooks?await a.hooks.postprocess(f):f})().catch(c);try{a.hooks&&(e=a.hooks.preprocess(e));let i=(a.hooks?a.hooks.provideLexer():t?Vt.lex:Vt.lexInline)(e,a);a.hooks&&(i=a.hooks.processAllTokens(i)),a.walkTokens&&this.walkTokens(i,a.walkTokens);let u=(a.hooks?a.hooks.provideParser():t?Yt.parse:Yt.parseInline)(i,a);return a.hooks&&(u=a.hooks.postprocess(u)),u}catch(i){return c(i)}}}onError(t,e){return n=>{if(n.message+=` -Please report this to https://github.com/markedjs/marked.`,t){let r="

    An error occurred:

    "+ln(n.message+"",!0)+"
    ";return e?Promise.resolve(r):r}if(e)return Promise.reject(n);throw n}}},Pn=new vc;function Ke(t,e){return Pn.parse(t,e)}Ke.options=Ke.setOptions=function(t){return Pn.setOptions(t),Ke.defaults=Pn.defaults,sr(Ke.defaults),Ke};Ke.getDefaults=rs;Ke.defaults=Dn;Ke.use=function(...t){return Pn.use(...t),Ke.defaults=Pn.defaults,sr(Ke.defaults),Ke};Ke.walkTokens=function(t,e){return Pn.walkTokens(t,e)};Ke.parseInline=Pn.parseInline;Ke.Parser=Yt;Ke.parser=Yt.parse;Ke.Renderer=ba;Ke.TextRenderer=gs;Ke.Lexer=Vt;Ke.lexer=Vt.lex;Ke.Tokenizer=fa;Ke.Hooks=Yn;Ke.parse=Ke;Ke.options;Ke.setOptions;Ke.use;Ke.walkTokens;Ke.parseInline;Yt.parse;Vt.lex;function hc(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Pa,Os;function fc(){if(Os)return Pa;Os=1;function t(l){return l instanceof Map?l.clear=l.delete=l.set=function(){throw new Error("map is read-only")}:l instanceof Set&&(l.add=l.clear=l.delete=function(){throw new Error("set is read-only")}),Object.freeze(l),Object.getOwnPropertyNames(l).forEach(v=>{const N=l[v],ce=typeof N;(ce==="object"||ce==="function")&&!Object.isFrozen(N)&&t(N)}),l}class e{constructor(v){v.data===void 0&&(v.data={}),this.data=v.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function n(l){return l.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(l,...v){const N=Object.create(null);for(const ce in l)N[ce]=l[ce];return v.forEach(function(ce){for(const He in ce)N[He]=ce[He]}),N}const a="",c=l=>!!l.scope,i=(l,{prefix:v})=>{if(l.startsWith("language:"))return l.replace("language:","language-");if(l.includes(".")){const N=l.split(".");return[`${v}${N.shift()}`,...N.map((ce,He)=>`${ce}${"_".repeat(He+1)}`)].join(" ")}return`${v}${l}`};class u{constructor(v,N){this.buffer="",this.classPrefix=N.classPrefix,v.walk(this)}addText(v){this.buffer+=n(v)}openNode(v){if(!c(v))return;const N=i(v.scope,{prefix:this.classPrefix});this.span(N)}closeNode(v){c(v)&&(this.buffer+=a)}value(){return this.buffer}span(v){this.buffer+=``}}const p=(l={})=>{const v={children:[]};return Object.assign(v,l),v};class f{constructor(){this.rootNode=p(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(v){this.top.children.push(v)}openNode(v){const N=p({scope:v});this.add(N),this.stack.push(N)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(v){return this.constructor._walk(v,this.rootNode)}static _walk(v,N){return typeof N=="string"?v.addText(N):N.children&&(v.openNode(N),N.children.forEach(ce=>this._walk(v,ce)),v.closeNode(N)),v}static _collapse(v){typeof v!="string"&&v.children&&(v.children.every(N=>typeof N=="string")?v.children=[v.children.join("")]:v.children.forEach(N=>{f._collapse(N)}))}}class h extends f{constructor(v){super(),this.options=v}addText(v){v!==""&&this.add(v)}startScope(v){this.openNode(v)}endScope(){this.closeNode()}__addSublanguage(v,N){const ce=v.root;N&&(ce.scope=`language:${N}`),this.add(ce)}toHTML(){return new u(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function y(l){return l?typeof l=="string"?l:l.source:null}function _(l){return I("(?=",l,")")}function C(l){return I("(?:",l,")*")}function T(l){return I("(?:",l,")?")}function I(...l){return l.map(N=>y(N)).join("")}function B(l){const v=l[l.length-1];return typeof v=="object"&&v.constructor===Object?(l.splice(l.length-1,1),v):{}}function te(...l){return"("+(B(l).capture?"":"?:")+l.map(ce=>y(ce)).join("|")+")"}function de(l){return new RegExp(l.toString()+"|").exec("").length-1}function $(l,v){const N=l&&l.exec(v);return N&&N.index===0}const k=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function E(l,{joinWith:v}){let N=0;return l.map(ce=>{N+=1;const He=N;let We=y(ce),P="";for(;We.length>0;){const L=k.exec(We);if(!L){P+=We;break}P+=We.substring(0,L.index),We=We.substring(L.index+L[0].length),L[0][0]==="\\"&&L[1]?P+="\\"+String(Number(L[1])+He):(P+=L[0],L[0]==="("&&N++)}return P}).map(ce=>`(${ce})`).join(v)}const O=/\b\B/,G="[a-zA-Z]\\w*",oe="[a-zA-Z_]\\w*",ne="\\b\\d+(\\.\\d+)?",Re="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",et="\\b(0b[01]+)",qe="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",Ne=(l={})=>{const v=/^#![ ]*\//;return l.binary&&(l.begin=I(v,/.*\b/,l.binary,/\b.*/)),r({scope:"meta",begin:v,end:/$/,relevance:0,"on:begin":(N,ce)=>{N.index!==0&&ce.ignoreMatch()}},l)},se={begin:"\\\\[\\s\\S]",relevance:0},$e={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[se]},Ce={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[se]},tt={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},J=function(l,v,N={}){const ce=r({scope:"comment",begin:l,end:v,contains:[]},N);ce.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const He=te("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return ce.contains.push({begin:I(/[ ]+/,"(",He,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),ce},Pe=J("//","$"),Oe=J("/\\*","\\*/"),Le=J("#","$"),Ze={scope:"number",begin:ne,relevance:0},rt={scope:"number",begin:Re,relevance:0},at={scope:"number",begin:et,relevance:0},Xe={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[se,{begin:/\[/,end:/\]/,relevance:0,contains:[se]}]},ut={scope:"title",begin:G,relevance:0},pt={scope:"title",begin:oe,relevance:0},ft={begin:"\\.\\s*"+oe,relevance:0};var z=Object.freeze({__proto__:null,APOS_STRING_MODE:$e,BACKSLASH_ESCAPE:se,BINARY_NUMBER_MODE:at,BINARY_NUMBER_RE:et,COMMENT:J,C_BLOCK_COMMENT_MODE:Oe,C_LINE_COMMENT_MODE:Pe,C_NUMBER_MODE:rt,C_NUMBER_RE:Re,END_SAME_AS_BEGIN:function(l){return Object.assign(l,{"on:begin":(v,N)=>{N.data._beginMatch=v[1]},"on:end":(v,N)=>{N.data._beginMatch!==v[1]&&N.ignoreMatch()}})},HASH_COMMENT_MODE:Le,IDENT_RE:G,MATCH_NOTHING_RE:O,METHOD_GUARD:ft,NUMBER_MODE:Ze,NUMBER_RE:ne,PHRASAL_WORDS_MODE:tt,QUOTE_STRING_MODE:Ce,REGEXP_MODE:Xe,RE_STARTERS_RE:qe,SHEBANG:Ne,TITLE_MODE:ut,UNDERSCORE_IDENT_RE:oe,UNDERSCORE_TITLE_MODE:pt});function q(l,v){l.input[l.index-1]==="."&&v.ignoreMatch()}function j(l,v){l.className!==void 0&&(l.scope=l.className,delete l.className)}function Z(l,v){v&&l.beginKeywords&&(l.begin="\\b("+l.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",l.__beforeBegin=q,l.keywords=l.keywords||l.beginKeywords,delete l.beginKeywords,l.relevance===void 0&&(l.relevance=0))}function ee(l,v){Array.isArray(l.illegal)&&(l.illegal=te(...l.illegal))}function ue(l,v){if(l.match){if(l.begin||l.end)throw new Error("begin & end are not supported with match");l.begin=l.match,delete l.match}}function be(l,v){l.relevance===void 0&&(l.relevance=1)}const Ee=(l,v)=>{if(!l.beforeMatch)return;if(l.starts)throw new Error("beforeMatch cannot be used with starts");const N=Object.assign({},l);Object.keys(l).forEach(ce=>{delete l[ce]}),l.keywords=N.keywords,l.begin=I(N.beforeMatch,_(N.begin)),l.starts={relevance:0,contains:[Object.assign(N,{endsParent:!0})]},l.relevance=0,delete N.beforeMatch},_e=["of","and","for","in","not","or","if","then","parent","list","value"],we="keyword";function R(l,v,N=we){const ce=Object.create(null);return typeof l=="string"?He(N,l.split(" ")):Array.isArray(l)?He(N,l):Object.keys(l).forEach(function(We){Object.assign(ce,R(l[We],v,We))}),ce;function He(We,P){v&&(P=P.map(L=>L.toLowerCase())),P.forEach(function(L){const ae=L.split("|");ce[ae[0]]=[We,W(ae[0],ae[1])]})}}function W(l,v){return v?Number(v):U(l)?0:1}function U(l){return _e.includes(l.toLowerCase())}const ye={},he=l=>{console.error(l)},me=(l,...v)=>{console.log(`WARN: ${l}`,...v)},ze=(l,v)=>{ye[`${l}/${v}`]||(console.log(`Deprecated as of ${l}. ${v}`),ye[`${l}/${v}`]=!0)},Ie=new Error;function Te(l,v,{key:N}){let ce=0;const He=l[N],We={},P={};for(let L=1;L<=v.length;L++)P[L+ce]=He[L],We[L+ce]=!0,ce+=de(v[L-1]);l[N]=P,l[N]._emit=We,l[N]._multi=!0}function bt(l){if(Array.isArray(l.begin)){if(l.skip||l.excludeBegin||l.returnBegin)throw he("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),Ie;if(typeof l.beginScope!="object"||l.beginScope===null)throw he("beginScope must be object"),Ie;Te(l,l.begin,{key:"beginScope"}),l.begin=E(l.begin,{joinWith:""})}}function Ot(l){if(Array.isArray(l.end)){if(l.skip||l.excludeEnd||l.returnEnd)throw he("skip, excludeEnd, returnEnd not compatible with endScope: {}"),Ie;if(typeof l.endScope!="object"||l.endScope===null)throw he("endScope must be object"),Ie;Te(l,l.end,{key:"endScope"}),l.end=E(l.end,{joinWith:""})}}function dn(l){l.scope&&typeof l.scope=="object"&&l.scope!==null&&(l.beginScope=l.scope,delete l.scope)}function It(l){dn(l),typeof l.beginScope=="string"&&(l.beginScope={_wrap:l.beginScope}),typeof l.endScope=="string"&&(l.endScope={_wrap:l.endScope}),bt(l),Ot(l)}function yt(l){function v(P,L){return new RegExp(y(P),"m"+(l.case_insensitive?"i":"")+(l.unicodeRegex?"u":"")+(L?"g":""))}class N{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(L,ae){ae.position=this.position++,this.matchIndexes[this.matchAt]=ae,this.regexes.push([ae,L]),this.matchAt+=de(L)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const L=this.regexes.map(ae=>ae[1]);this.matcherRe=v(E(L,{joinWith:"|"}),!0),this.lastIndex=0}exec(L){this.matcherRe.lastIndex=this.lastIndex;const ae=this.matcherRe.exec(L);if(!ae)return null;const lt=ae.findIndex((Qt,Jt)=>Jt>0&&Qt!==void 0),st=this.matchIndexes[lt];return ae.splice(0,lt),Object.assign(ae,st)}}class ce{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(L){if(this.multiRegexes[L])return this.multiRegexes[L];const ae=new N;return this.rules.slice(L).forEach(([lt,st])=>ae.addRule(lt,st)),ae.compile(),this.multiRegexes[L]=ae,ae}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(L,ae){this.rules.push([L,ae]),ae.type==="begin"&&this.count++}exec(L){const ae=this.getMatcher(this.regexIndex);ae.lastIndex=this.lastIndex;let lt=ae.exec(L);if(this.resumingScanAtSamePosition()&&!(lt&<.index===this.lastIndex)){const st=this.getMatcher(0);st.lastIndex=this.lastIndex+1,lt=st.exec(L)}return lt&&(this.regexIndex+=lt.position+1,this.regexIndex===this.count&&this.considerAll()),lt}}function He(P){const L=new ce;return P.contains.forEach(ae=>L.addRule(ae.begin,{rule:ae,type:"begin"})),P.terminatorEnd&&L.addRule(P.terminatorEnd,{type:"end"}),P.illegal&&L.addRule(P.illegal,{type:"illegal"}),L}function We(P,L){const ae=P;if(P.isCompiled)return ae;[j,ue,It,Ee].forEach(st=>st(P,L)),l.compilerExtensions.forEach(st=>st(P,L)),P.__beforeBegin=null,[Z,ee,be].forEach(st=>st(P,L)),P.isCompiled=!0;let lt=null;return typeof P.keywords=="object"&&P.keywords.$pattern&&(P.keywords=Object.assign({},P.keywords),lt=P.keywords.$pattern,delete P.keywords.$pattern),lt=lt||/\w+/,P.keywords&&(P.keywords=R(P.keywords,l.case_insensitive)),ae.keywordPatternRe=v(lt,!0),L&&(P.begin||(P.begin=/\B|\b/),ae.beginRe=v(ae.begin),!P.end&&!P.endsWithParent&&(P.end=/\B|\b/),P.end&&(ae.endRe=v(ae.end)),ae.terminatorEnd=y(ae.end)||"",P.endsWithParent&&L.terminatorEnd&&(ae.terminatorEnd+=(P.end?"|":"")+L.terminatorEnd)),P.illegal&&(ae.illegalRe=v(P.illegal)),P.contains||(P.contains=[]),P.contains=[].concat(...P.contains.map(function(st){return Pt(st==="self"?P:st)})),P.contains.forEach(function(st){We(st,ae)}),P.starts&&We(P.starts,L),ae.matcher=He(ae),ae}if(l.compilerExtensions||(l.compilerExtensions=[]),l.contains&&l.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return l.classNameAliases=r(l.classNameAliases||{}),We(l)}function Xt(l){return l?l.endsWithParent||Xt(l.starts):!1}function Pt(l){return l.variants&&!l.cachedVariants&&(l.cachedVariants=l.variants.map(function(v){return r(l,{variants:null},v)})),l.cachedVariants?l.cachedVariants:Xt(l)?r(l,{starts:l.starts?r(l.starts):null}):Object.isFrozen(l)?r(l):l}var yn="11.11.1";class vt extends Error{constructor(v,N){super(v),this.name="HTMLInjectionError",this.html=N}}const Nt=n,Ft=r,A=Symbol("nomatch"),K=7,M=function(l){const v=Object.create(null),N=Object.create(null),ce=[];let He=!0;const We="Could not find the language '{}', did you forget to load/include a language module?",P={disableAutodetect:!0,name:"Plain text",contains:[]};let L={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:h};function ae(S){return L.noHighlightRe.test(S)}function lt(S){let re=S.className+" ";re+=S.parentNode?S.parentNode.className:"";const Me=L.languageDetectRe.exec(re);if(Me){const V=tn(Me[1]);return V||(me(We.replace("{}",Me[1])),me("Falling back to no-highlight mode for this block.",S)),V?Me[1]:"no-highlight"}return re.split(/\s+/).find(V=>ae(V)||tn(V))}function st(S,re,Me){let V="",Se="";typeof re=="object"?(V=S,Me=re.ignoreIllegals,Se=re.language):(ze("10.7.0","highlight(lang, code, ...args) has been deprecated."),ze("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),Se=S,V=re),Me===void 0&&(Me=!0);const Be={code:V,language:Se};pn("before:highlight",Be);const ke=Be.result?Be.result:Qt(Be.language,Be.code,Me);return ke.code=Be.code,pn("after:highlight",ke),ke}function Qt(S,re,Me,V){const Se=Object.create(null);function Be(x,D){return x.keywords[D]}function ke(){if(!pe.keywords){je.addText(Y);return}let x=0;pe.keywordPatternRe.lastIndex=0;let D=pe.keywordPatternRe.exec(Y),ie="";for(;D;){ie+=Y.substring(x,D.index);const X=kt.case_insensitive?D[0].toLowerCase():D[0],Ve=Be(pe,X);if(Ve){const[mt,$n]=Ve;if(je.addText(ie),ie="",Se[X]=(Se[X]||0)+1,Se[X]<=K&&(Fe+=$n),mt.startsWith("_"))ie+=D[0];else{const rn=kt.classNameAliases[mt]||mt;Qe(D[0],rn)}}else ie+=D[0];x=pe.keywordPatternRe.lastIndex,D=pe.keywordPatternRe.exec(Y)}ie+=Y.substring(x),je.addText(ie)}function xe(){if(Y==="")return;let x=null;if(typeof pe.subLanguage=="string"){if(!v[pe.subLanguage]){je.addText(Y);return}x=Qt(pe.subLanguage,Y,!0,sn[pe.subLanguage]),sn[pe.subLanguage]=x._top}else x=En(Y,pe.subLanguage.length?pe.subLanguage:null);pe.relevance>0&&(Fe+=x.relevance),je.__addSublanguage(x._emitter,x.language)}function Ge(){pe.subLanguage!=null?xe():ke(),Y=""}function Qe(x,D){x!==""&&(je.startScope(D),je.addText(x),je.endScope())}function Rt(x,D){let ie=1;const X=D.length-1;for(;ie<=X;){if(!x._emit[ie]){ie++;continue}const Ve=kt.classNameAliases[x[ie]]||x[ie],mt=D[ie];Ve?Qe(mt,Ve):(Y=mt,ke(),Y=""),ie++}}function nn(x,D){return x.scope&&typeof x.scope=="string"&&je.openNode(kt.classNameAliases[x.scope]||x.scope),x.beginScope&&(x.beginScope._wrap?(Qe(Y,kt.classNameAliases[x.beginScope._wrap]||x.beginScope._wrap),Y=""):x.beginScope._multi&&(Rt(x.beginScope,D),Y="")),pe=Object.create(x,{parent:{value:pe}}),pe}function gn(x,D,ie){let X=$(x.endRe,ie);if(X){if(x["on:end"]){const Ve=new e(x);x["on:end"](D,Ve),Ve.isMatchIgnored&&(X=!1)}if(X){for(;x.endsParent&&x.parent;)x=x.parent;return x}}if(x.endsWithParent)return gn(x.parent,D,ie)}function vn(x){return pe.matcher.regexIndex===0?(Y+=x[0],1):(ht=!0,0)}function Bt(x){const D=x[0],ie=x.rule,X=new e(ie),Ve=[ie.__beforeBegin,ie["on:begin"]];for(const mt of Ve)if(mt&&(mt(x,X),X.isMatchIgnored))return vn(D);return ie.skip?Y+=D:(ie.excludeBegin&&(Y+=D),Ge(),!ie.returnBegin&&!ie.excludeBegin&&(Y=D)),nn(ie,x),ie.returnBegin?0:D.length}function hn(x){const D=x[0],ie=re.substring(x.index),X=gn(pe,x,ie);if(!X)return A;const Ve=pe;pe.endScope&&pe.endScope._wrap?(Ge(),Qe(D,pe.endScope._wrap)):pe.endScope&&pe.endScope._multi?(Ge(),Rt(pe.endScope,x)):Ve.skip?Y+=D:(Ve.returnEnd||Ve.excludeEnd||(Y+=D),Ge(),Ve.excludeEnd&&(Y=D));do pe.scope&&je.closeNode(),!pe.skip&&!pe.subLanguage&&(Fe+=pe.relevance),pe=pe.parent;while(pe!==X.parent);return X.starts&&nn(X.starts,x),Ve.returnEnd?0:D.length}function Kt(){const x=[];for(let D=pe;D!==kt;D=D.parent)D.scope&&x.unshift(D.scope);x.forEach(D=>je.openNode(D))}let jt={};function an(x,D){const ie=D&&D[0];if(Y+=x,ie==null)return Ge(),0;if(jt.type==="begin"&&D.type==="end"&&jt.index===D.index&&ie===""){if(Y+=re.slice(D.index,D.index+1),!He){const X=new Error(`0 width match regex (${S})`);throw X.languageName=S,X.badRule=jt.rule,X}return 1}if(jt=D,D.type==="begin")return Bt(D);if(D.type==="illegal"&&!Me){const X=new Error('Illegal lexeme "'+ie+'" for mode "'+(pe.scope||"")+'"');throw X.mode=pe,X}else if(D.type==="end"){const X=hn(D);if(X!==A)return X}if(D.type==="illegal"&&ie==="")return Y+=` -`,1;if(nt>1e5&&nt>D.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Y+=ie,ie.length}const kt=tn(S);if(!kt)throw he(We.replace("{}",S)),new Error('Unknown language: "'+S+'"');const Ut=yt(kt);let qt="",pe=V||Ut;const sn={},je=new L.__emitter(L);Kt();let Y="",Fe=0,Ae=0,nt=0,ht=!1;try{if(kt.__emitTokens)kt.__emitTokens(re,je);else{for(pe.matcher.considerAll();;){nt++,ht?ht=!1:pe.matcher.considerAll(),pe.matcher.lastIndex=Ae;const x=pe.matcher.exec(re);if(!x)break;const D=re.substring(Ae,x.index),ie=an(D,x);Ae=x.index+ie}an(re.substring(Ae))}return je.finalize(),qt=je.toHTML(),{language:S,value:qt,relevance:Fe,illegal:!1,_emitter:je,_top:pe}}catch(x){if(x.message&&x.message.includes("Illegal"))return{language:S,value:Nt(re),illegal:!0,relevance:0,_illegalBy:{message:x.message,index:Ae,context:re.slice(Ae-100,Ae+100),mode:x.mode,resultSoFar:qt},_emitter:je};if(He)return{language:S,value:Nt(re),illegal:!1,relevance:0,errorRaised:x,_emitter:je,_top:pe};throw x}}function Jt(S){const re={value:Nt(S),illegal:!1,relevance:0,_top:P,_emitter:new L.__emitter(L)};return re._emitter.addText(S),re}function En(S,re){re=re||L.languages||Object.keys(v);const Me=Jt(S),V=re.filter(tn).filter(Dt).map(Ge=>Qt(Ge,S,!1));V.unshift(Me);const Se=V.sort((Ge,Qe)=>{if(Ge.relevance!==Qe.relevance)return Qe.relevance-Ge.relevance;if(Ge.language&&Qe.language){if(tn(Ge.language).supersetOf===Qe.language)return 1;if(tn(Qe.language).supersetOf===Ge.language)return-1}return 0}),[Be,ke]=Se,xe=Be;return xe.secondBest=ke,xe}function Sn(S,re,Me){const V=re&&N[re]||Me;S.classList.add("hljs"),S.classList.add(`language-${V}`)}function An(S){let re=null;const Me=lt(S);if(ae(Me))return;if(pn("before:highlightElement",{el:S,language:Me}),S.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",S);return}if(S.children.length>0&&(L.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(S)),L.throwUnescapedHTML))throw new vt("One of your code blocks includes unescaped HTML.",S.innerHTML);re=S;const V=re.textContent,Se=Me?st(V,{language:Me,ignoreIllegals:!0}):En(V);S.innerHTML=Se.value,S.dataset.highlighted="yes",Sn(S,Me,Se.language),S.result={language:Se.language,re:Se.relevance,relevance:Se.relevance},Se.secondBest&&(S.secondBest={language:Se.secondBest.language,relevance:Se.secondBest.relevance}),pn("after:highlightElement",{el:S,result:Se,text:V})}function Tn(S){L=Ft(L,S)}const Bn=()=>{en(),ze("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function Gt(){en(),ze("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let Lt=!1;function en(){function S(){en()}if(document.readyState==="loading"){Lt||window.addEventListener("DOMContentLoaded",S,!1),Lt=!0;return}document.querySelectorAll(L.cssSelector).forEach(An)}function un(S,re){let Me=null;try{Me=re(l)}catch(V){if(he("Language definition for '{}' could not be registered.".replace("{}",S)),He)he(V);else throw V;Me=P}Me.name||(Me.name=S),v[S]=Me,Me.rawDefinition=re.bind(null,l),Me.aliases&&Nn(Me.aliases,{languageName:S})}function wa(S){delete v[S];for(const re of Object.keys(N))N[re]===S&&delete N[re]}function xa(){return Object.keys(v)}function tn(S){return S=(S||"").toLowerCase(),v[S]||v[N[S]]}function Nn(S,{languageName:re}){typeof S=="string"&&(S=[S]),S.forEach(Me=>{N[Me.toLowerCase()]=re})}function Dt(S){const re=tn(S);return re&&!re.disableAutodetect}function na(S){S["before:highlightBlock"]&&!S["before:highlightElement"]&&(S["before:highlightElement"]=re=>{S["before:highlightBlock"](Object.assign({block:re.el},re))}),S["after:highlightBlock"]&&!S["after:highlightElement"]&&(S["after:highlightElement"]=re=>{S["after:highlightBlock"](Object.assign({block:re.el},re))})}function Rn(S){na(S),ce.push(S)}function Ea(S){const re=ce.indexOf(S);re!==-1&&ce.splice(re,1)}function pn(S,re){const Me=S;ce.forEach(function(V){V[Me]&&V[Me](re)})}function Sa(S){return ze("10.7.0","highlightBlock will be removed entirely in v12.0"),ze("10.7.0","Please use highlightElement now."),An(S)}Object.assign(l,{highlight:st,highlightAuto:En,highlightAll:en,highlightElement:An,highlightBlock:Sa,configure:Tn,initHighlighting:Bn,initHighlightingOnLoad:Gt,registerLanguage:un,unregisterLanguage:wa,listLanguages:xa,getLanguage:tn,registerAliases:Nn,autoDetection:Dt,inherit:Ft,addPlugin:Rn,removePlugin:Ea}),l.debugMode=function(){He=!1},l.safeMode=function(){He=!0},l.versionString=yn,l.regex={concat:I,lookahead:_,either:te,optional:T,anyNumberOfTimes:C};for(const S in z)typeof z[S]=="object"&&t(z[S]);return Object.assign(l,z),l},H=M({});return H.newInstance=()=>M({}),Pa=H,H.HighlightJS=H,H.default=H,Pa}var bc=fc();const dt=hc(bc),Is="[A-Za-z$_][0-9A-Za-z$_]*",mc=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],_c=["true","false","null","undefined","NaN","Infinity"],fr=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],br=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],mr=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],yc=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],kc=[].concat(mr,fr,br);function Ps(t){const e=t.regex,n=(J,{after:Pe})=>{const Oe="",end:""},c=/<[A-Za-z0-9\\._:-]+\s*\/>/,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(J,Pe)=>{const Oe=J[0].length+J.index,Le=J.input[Oe];if(Le==="<"||Le===","){Pe.ignoreMatch();return}Le===">"&&(n(J,{after:Oe})||Pe.ignoreMatch());let Ze;const rt=J.input.substring(Oe);if(Ze=rt.match(/^\s*=/)){Pe.ignoreMatch();return}if((Ze=rt.match(/^\s+extends\s+/))&&Ze.index===0){Pe.ignoreMatch();return}}},u={$pattern:Is,keyword:mc,literal:_c,built_in:kc,"variable.language":yc},p="[0-9](_?[0-9])*",f=`\\.(${p})`,h="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",y={className:"number",variants:[{begin:`(\\b(${h})((${f})|\\.)?|(${f}))[eE][+-]?(${p})\\b`},{begin:`\\b(${h})\\b((${f})\\b|\\.)?|(${f})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},_={className:"subst",begin:"\\$\\{",end:"\\}",keywords:u,contains:[]},C={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"xml"}},T={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"css"}},I={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"graphql"}},B={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,_]},de={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},$=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,C,T,I,B,{match:/\$\d+/},y];_.contains=$.concat({begin:/\{/,end:/\}/,keywords:u,contains:["self"].concat($)});const k=[].concat(de,_.contains),E=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:u,contains:["self"].concat(k)}]),O={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E},G={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},oe={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...fr,...br]}},ne={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},Re={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},et={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function qe(J){return e.concat("(?!",J.join("|"),")")}const Ne={match:e.concat(/\b/,qe([...mr,"super","import"].map(J=>`${J}\\s*\\(`)),r,e.lookahead(/\s*\(/)),className:"title.function",relevance:0},se={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},$e={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},Ce="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",tt={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(Ce)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:u,exports:{PARAMS_CONTAINS:E,CLASS_REFERENCE:oe},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),ne,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,C,T,I,B,de,{match:/\$\d+/},y,oe,{scope:"attr",match:r+e.lookahead(":"),relevance:0},tt,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[de,t.REGEXP_MODE,{className:"function",begin:Ce,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:c},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},Re,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},se,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},Ne,et,G,$e,{match:/\$[(.]/}]}}const ma="[A-Za-z$_][0-9A-Za-z$_]*",_r=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],yr=["true","false","null","undefined","NaN","Infinity"],kr=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],wr=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],xr=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Er=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],Sr=[].concat(xr,kr,wr);function wc(t){const e=t.regex,n=(J,{after:Pe})=>{const Oe="",end:""},c=/<[A-Za-z0-9\\._:-]+\s*\/>/,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(J,Pe)=>{const Oe=J[0].length+J.index,Le=J.input[Oe];if(Le==="<"||Le===","){Pe.ignoreMatch();return}Le===">"&&(n(J,{after:Oe})||Pe.ignoreMatch());let Ze;const rt=J.input.substring(Oe);if(Ze=rt.match(/^\s*=/)){Pe.ignoreMatch();return}if((Ze=rt.match(/^\s+extends\s+/))&&Ze.index===0){Pe.ignoreMatch();return}}},u={$pattern:ma,keyword:_r,literal:yr,built_in:Sr,"variable.language":Er},p="[0-9](_?[0-9])*",f=`\\.(${p})`,h="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",y={className:"number",variants:[{begin:`(\\b(${h})((${f})|\\.)?|(${f}))[eE][+-]?(${p})\\b`},{begin:`\\b(${h})\\b((${f})\\b|\\.)?|(${f})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},_={className:"subst",begin:"\\$\\{",end:"\\}",keywords:u,contains:[]},C={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"xml"}},T={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"css"}},I={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"graphql"}},B={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,_]},de={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},$=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,C,T,I,B,{match:/\$\d+/},y];_.contains=$.concat({begin:/\{/,end:/\}/,keywords:u,contains:["self"].concat($)});const k=[].concat(de,_.contains),E=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:u,contains:["self"].concat(k)}]),O={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E},G={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},oe={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...kr,...wr]}},ne={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},Re={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},et={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function qe(J){return e.concat("(?!",J.join("|"),")")}const Ne={match:e.concat(/\b/,qe([...xr,"super","import"].map(J=>`${J}\\s*\\(`)),r,e.lookahead(/\s*\(/)),className:"title.function",relevance:0},se={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},$e={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},Ce="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",tt={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(Ce)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:u,exports:{PARAMS_CONTAINS:E,CLASS_REFERENCE:oe},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),ne,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,C,T,I,B,de,{match:/\$\d+/},y,oe,{scope:"attr",match:r+e.lookahead(":"),relevance:0},tt,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[de,t.REGEXP_MODE,{className:"function",begin:Ce,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:c},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},Re,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},se,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},Ne,et,G,$e,{match:/\$[(.]/}]}}function Ls(t){const e=t.regex,n=wc(t),r=ma,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],c={begin:[/namespace/,/\s+/,t.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},i={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a},contains:[n.exports.CLASS_REFERENCE]},u={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},p=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],f={$pattern:ma,keyword:_r.concat(p),literal:yr,built_in:Sr.concat(a),"variable.language":Er},h={className:"meta",begin:"@"+r},y=(I,B,te)=>{const de=I.contains.findIndex($=>$.label===B);if(de===-1)throw new Error("can not find mode to replace");I.contains.splice(de,1,te)};Object.assign(n.keywords,f),n.exports.PARAMS_CONTAINS.push(h);const _=n.contains.find(I=>I.scope==="attr"),C=Object.assign({},_,{match:e.concat(r,e.lookahead(/\s*\?:/))});n.exports.PARAMS_CONTAINS.push([n.exports.CLASS_REFERENCE,_,C]),n.contains=n.contains.concat([h,c,i,C]),y(n,"shebang",t.SHEBANG()),y(n,"use_strict",u);const T=n.contains.find(I=>I.label==="func.def");return T.relevance=0,Object.assign(n,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n}function Ds(t){const e=t.regex,n=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],u={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},p={className:"meta",begin:/^(>>>|\.\.\.) /},f={className:"subst",begin:/\{/,end:/\}/,keywords:u,illegal:/#/},h={begin:/\{\{/,relevance:0},y={className:"string",contains:[t.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,p],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,p],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,p,h,f]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,p,h,f]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[t.BACKSLASH_ESCAPE,h,f]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,h,f]},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},_="[0-9](_?[0-9])*",C=`(\\b(${_}))?\\.(${_})|\\b(${_})\\.`,T=`\\b|${r.join("|")}`,I={className:"number",relevance:0,variants:[{begin:`(\\b(${_})|(${C}))[eE][+-]?(${_})[jJ]?(?=${T})`},{begin:`(${C})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${T})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${T})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${T})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${T})`},{begin:`\\b(${_})[jJ](?=${T})`}]},B={className:"comment",begin:e.lookahead(/# type:/),end:/$/,keywords:u,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},te={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:["self",p,I,y,t.HASH_COMMENT_MODE]}]};return f.contains=[y,I,p],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:u,illegal:/(<\/|\?)|=>/,contains:[p,I,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},y,B,t.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[te]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[I,te,y]}]}}function xc(t){const e={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},n={match:/[{}[\],:]/,className:"punctuation",relevance:0},r=["true","false","null"],a={scope:"literal",beginKeywords:r.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:r},contains:[e,n,t.QUOTE_STRING_MODE,a,t.C_NUMBER_MODE,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}function La(t){const e=t.regex,n={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{begin:e.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[t.BACKSLASH_ESCAPE]},c=t.inherit(t.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[t.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},u={className:"string",begin:/"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,n,a]};a.contains.push(u);const p={match:/\\"/},f={className:"string",begin:/'/,end:/'/},h={match:/\\'/},y={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},t.NUMBER_MODE,n]},_=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],C=t.SHEBANG({binary:`(${_.join("|")})`,relevance:10}),T={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[t.inherit(t.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},I=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],B=["true","false"],te={match:/(\/[a-z._-]+)+/},de=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],$=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],k=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],E=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:I,literal:B,built_in:[...de,...$,"set","shopt",...k,...E]},contains:[C,t.SHEBANG(),T,y,c,i,te,u,p,f,h,n]}}function Bs(t){const e="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},a={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},c={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},i={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[t.BACKSLASH_ESCAPE,a]},u=t.inherit(i,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),_={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},C={end:",",endsWithParent:!0,excludeEnd:!0,keywords:e,relevance:0},T={begin:/\{/,end:/\}/,contains:[C],illegal:"\\n",relevance:0},I={begin:"\\[",end:"\\]",contains:[C],illegal:"\\n",relevance:0},B=[r,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+t.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+t.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},t.HASH_COMMENT_MODE,{beginKeywords:e,keywords:{literal:e}},_,{className:"number",begin:t.C_NUMBER_RE+"\\b",relevance:0},T,I,c,i],te=[...B];return te.pop(),te.push(u),C.contains=te,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:B}}function js(t){const e=t.regex,n=e.concat(/[\p{L}_]/u,e.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,a={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},c={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},i=t.inherit(c,{begin:/\(/,end:/\)/}),u=t.inherit(t.APOS_STRING_MODE,{className:"string"}),p=t.inherit(t.QUOTE_STRING_MODE,{className:"string"}),f={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[c,p,u,i,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[c,i,p,u]}]}]},t.COMMENT(//,{relevance:10}),{begin://,relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[p]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[f],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[f],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:e.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:f}]},{className:"tag",begin:e.concat(/<\//,e.lookahead(e.concat(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}const Ec=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),Sc=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Ac=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],Tc=[...Sc,...Ac],Nc=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),Rc=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),$c=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),zc=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function Mc(t){const e=t.regex,n=Ec(t),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},a="and or not only",c=/@-?\w[\w]*(-\w+)*/,i="[a-zA-Z-][a-zA-Z0-9_-]*",u=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[n.BLOCK_COMMENT,r,n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+i,relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+Rc.join("|")+")"},{begin:":(:)?("+$c.join("|")+")"}]},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+zc.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[n.BLOCK_COMMENT,n.HEXCOLOR,n.IMPORTANT,n.CSS_NUMBER_MODE,...u,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...u,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},n.FUNCTION_DISPATCH]},{begin:e.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:c},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:a,attribute:Nc.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...u,n.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+Tc.join("|")+")\\b"}]}}function Cc(t){const e=t.regex,n=t.COMMENT("--","$"),r={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},a={begin:/"/,end:/"/,contains:[{match:/""/}]},c=["true","false","unknown"],i=["double precision","large object","with timezone","without timezone"],u=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],p=["add","asc","collation","desc","final","first","last","view"],f=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],h=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],y=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],_=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],C=h,T=[...f,...p].filter(E=>!h.includes(E)),I={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},B={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},te={match:e.concat(/\b/,e.either(...C),/\s*\(/),relevance:0,keywords:{built_in:C}};function de(E){return e.concat(/\b/,e.either(...E.map(O=>O.replace(/\s+/,"\\s+"))),/\b/)}const $={scope:"keyword",match:de(_),relevance:0};function k(E,{exceptions:O,when:G}={}){const oe=G;return O=O||[],E.map(ne=>ne.match(/\|\d+$/)||O.includes(ne)?ne:oe(ne)?`${ne}|0`:ne)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:k(T,{when:E=>E.length<3}),literal:c,type:u,built_in:y},contains:[{scope:"type",match:de(i)},$,te,I,r,a,t.C_NUMBER_MODE,t.C_BLOCK_COMMENT_MODE,n,B]}}function Us(t){const e=t.regex,n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},r={begin:"^[-\\*]{3,}",end:"$"},a={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},c={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},u=/[A-Za-z][A-Za-z0-9+.-]*/,p={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.concat(/\[.+?\]\(/,u,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},f={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},h={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},y=t.inherit(f,{contains:[]}),_=t.inherit(h,{contains:[]});f.contains.push(_),h.contains.push(y);let C=[n,p];return[f,h,y,_].forEach(te=>{te.contains=te.contains.concat(C)}),C=C.concat(f,h),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:C},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:C}]}]},n,c,f,h,{className:"quote",begin:"^>\\s+",contains:C,end:"$"},a,r,p,i,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}const mn=Ln([]),bn=Ln(!1);let Ar=0;function da(t){const e=`msg_${++Ar}`;return mn.update(n=>[...n,{id:e,role:"user",content:t,timestamp:new Date().toISOString()}]),e}function Hn(){const t=`msg_${++Ar}`;return mn.update(e=>[...e,{id:t,role:"assistant",content:"",timestamp:new Date().toISOString(),streaming:!0,toolCalls:[]}]),bn.set(!0),t}function Oc(t,e){mn.update(n=>n.map(r=>r.id===t?{...r,content:r.content+e}:r))}function Da(t,e){mn.update(n=>n.map(r=>r.id===t?{...r,content:e,streaming:!1}:r)),bn.set(!1)}function Ic(t,e){mn.update(n=>n.map(r=>r.id===t?{...r,toolCalls:[...r.toolCalls||[],e]}:r))}function Hs(){mn.set([]),bn.set(!1)}var Pc=w('
    '),Lc=w(' '),Dc=w('
    '),Bc=w(''),jc=w(" ",1),Uc=w('
    '),Hc=w('
    '),Fc=w('
    result
    '),Gc=w('
    '),Kc=w('
    '),qc=w('
    '),Zc=w('
    '),Wc=w('

    '),Vc=w('
    '),Yc=w('
    '),Xc=w('

    '),Qc=w(''),Jc=w('
    '),ed=w('
    Plan
    '),td=w(''),nd=w('
    '),ad=w(''),sd=w('
    '),rd=w(""),id=w('
    '),ld=w('
    '),od=w('
    '),cd=w('
    '),dd=w('');function ud(t,e){on(e,!0);const n=()=>ct(mn,"$chatMessages",u),r=()=>ct(Zs,"$settingsData",u),a=()=>ct(bn,"$chatStreaming",u),c=()=>ct(kn,"$currentProjectStore",u),i=()=>ct(Kn,"$architectSidebarOpen",u),[u,p]=_n();let f=ve(null);dt.registerLanguage("javascript",Ps),dt.registerLanguage("js",Ps),dt.registerLanguage("typescript",Ls),dt.registerLanguage("ts",Ls),dt.registerLanguage("python",Ds),dt.registerLanguage("py",Ds),dt.registerLanguage("json",xc),dt.registerLanguage("bash",La),dt.registerLanguage("sh",La),dt.registerLanguage("shell",La),dt.registerLanguage("yaml",Bs),dt.registerLanguage("yml",Bs),dt.registerLanguage("xml",js),dt.registerLanguage("html",js),dt.registerLanguage("css",Mc),dt.registerLanguage("sql",Cc),dt.registerLanguage("markdown",Us),dt.registerLanguage("md",Us);const h=new Ke.Renderer;h.code=({text:A,lang:K})=>{const M=K&&dt.getLanguage(K)?K:"";let H;try{H=M?dt.highlight(A,{language:M}).value:dt.highlightAuto(A).value}catch{H=A.replace(//g,">")}return`
    ${K||"code"}
    ${H}
    `},Ke.setOptions({renderer:h});const y=[{value:"auto",label:"Auto-detect"},{value:"requirements",label:"Requirements Doc"},{value:"api_spec",label:"API Spec / OpenAPI"},{value:"data_sample",label:"Data Sample"},{value:"diagram",label:"Architecture Diagram"},{value:"config",label:"Config / Settings"},{value:"code",label:"Source Code"},{value:"documentation",label:"Documentation"},{value:"test_cases",label:"Test Cases"},{value:"schema",label:"Schema / Model"}],_={"image/png":"image","image/jpeg":"image","image/gif":"image","image/webp":"image","image/svg+xml":"image","image/bmp":"image","application/pdf":"pdf","application/msword":"document","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"document","application/vnd.oasis.opendocument.text":"document","application/rtf":"document","application/vnd.ms-excel":"spreadsheet","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"spreadsheet","application/vnd.oasis.opendocument.spreadsheet":"spreadsheet","text/csv":"spreadsheet","application/vnd.ms-powerpoint":"presentation","application/vnd.openxmlformats-officedocument.presentationml.presentation":"presentation","application/vnd.oasis.opendocument.presentation":"presentation","text/plain":"text","text/markdown":"text","application/json":"text","text/html":"text","text/css":"text","application/javascript":"text","application/x-yaml":"text","text/yaml":"text","application/xml":"text","text/xml":"text"},C={".py":"text",".js":"text",".ts":"text",".jsx":"text",".tsx":"text",".json":"text",".md":"text",".txt":"text",".csv":"spreadsheet",".yaml":"text",".yml":"text",".xml":"text",".html":"text",".css":"text",".sql":"text",".sh":"text",".bash":"text",".r":"text",".rb":"text",".go":"text",".rs":"text",".java":"text",".kt":"text",".swift":"text",".pdf":"pdf",".doc":"document",".docx":"document",".odt":"document",".rtf":"document",".xls":"spreadsheet",".xlsx":"spreadsheet",".ods":"spreadsheet",".ppt":"presentation",".pptx":"presentation",".odp":"presentation",".png":"image",".jpg":"image",".jpeg":"image",".gif":"image",".webp":"image",".svg":"image",".bmp":"image"},T=Object.keys(_).join(",")+",.py,.js,.ts,.jsx,.tsx,.sql,.sh,.r,.rb,.go,.rs,.java,.kt,.swift";function I(A){if(A.type&&_[A.type])return _[A.type];const K="."+A.name.split(".").pop()?.toLowerCase();return K&&C[K]?C[K]:"other"}let B=ve(On([])),te=ve(void 0),de=ve(!1);async function $(A){const K=Array.from(A);for(const M of K){if(M.size>20*1024*1024)continue;const H=I(M),l=await k(M),v={id:`file-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,name:M.name,type:M.type||"application/octet-stream",size:M.size,category:H,data:l,docType:"auto"};H==="image"&&(v.preview=`data:${M.type};base64,${l}`),b(B,[...s(B),v],!0)}}function k(A){return new Promise((K,M)=>{const H=new FileReader;H.onload=()=>{const l=H.result,v=l.includes(",")?l.split(",")[1]:l;K(v)},H.onerror=M,H.readAsDataURL(A)})}function E(A){b(B,s(B).filter(K=>K.id!==A),!0)}let O=ve(null);function G(A,K){b(B,s(B).map(M=>M.id===A?{...M,docType:K}:M),!0),b(O,null)}function oe(A){return!A||A==="auto"?"Auto-detect":y.find(K=>K.value===A)?.label??A}function ne(A){const K=A.target;K.files&&K.files.length>0&&($(K.files),K.value="")}function Re(A){const K=A.clipboardData?.items;if(!K)return;const M=[];for(const H of Array.from(K))if(H.kind==="file"){const l=H.getAsFile();l&&M.push(l)}M.length>0&&(A.preventDefault(),$(M))}const et=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],qe=["Drafting the blueprint...","Consulting the Oracle...","Aligning the nodes...","Designing the inevitable...","Architecting a masterpiece...","Tracing the path of causality...","Reshaping the construct...","Balancing the equation...","Loading the next iteration...","Surveying the pipeline...","Engineering the solution...","Selecting the right components...","Orchestrating the agents...","Running the simulation...","Weaving the connections...","Compiling the grand design...","Evaluating all possible paths...","Constructing the framework...","Visualizing the architecture...","Reticulating splines..."];let Ne=ve(On(et[0])),se=ve(On(qe[0])),$e=null,Ce=null,tt=0,J=0;const Pe=_t(()=>n().some(A=>A.streaming&&!A.content));In(()=>{s(Pe)?(tt=0,J=Math.floor(Math.random()*qe.length),b(se,qe[J],!0),$e=setInterval(()=>{tt=(tt+1)%et.length,b(Ne,et[tt],!0)},80),Ce=setInterval(()=>{J=(J+1)%qe.length,b(se,qe[J],!0)},2500)):($e&&(clearInterval($e),$e=null),Ce&&(clearInterval(Ce),Ce=null))});const Oe=_t(()=>r()?.user_profile?.assistant_name||"The Architect");let Le=On({});function Ze(A){Le[A]=!Le[A]}function rt(A){const K={};for(const M of A)K[M.tool]=(K[M.tool]||0)+1;return Object.entries(K).map(([M,H])=>H>1?`${M} x${H}`:M).join(", ")}function at(A){return A.replace(/)<[^<]*)*<\/script>/gi,"").replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,"")}function Xe(A){if(!A)return"";const K=Ke(A,{async:!1});return at(K)}let ut=ve(""),pt=ve(void 0),ft=ve(void 0),De=ve(null),z=ve(""),q=ve(""),j=null,Z=ve(0),ee=!1;const ue=5;let be=ve(380),Ee=ve(!1),_e=ve(0),we=ve(0);const R=280,W=.5;function U(A){A.preventDefault(),b(Ee,!0),b(_e,A.clientX,!0),b(we,s(be),!0),document.addEventListener("mousemove",ye),document.addEventListener("mouseup",he)}function ye(A){if(!s(Ee))return;const K=Math.floor(window.innerWidth*W),M=A.clientX-s(_e);b(be,Math.max(R,Math.min(K,s(we)+M)),!0)}function he(){b(Ee,!1),document.removeEventListener("mousemove",ye),document.removeEventListener("mouseup",he)}function me(A){Gn.update(K=>{const M=new Map;for(const l of K)M.set(l.id,l);for(const l of A.nodes){const v=M.get(l.id);v&&(v.data={...v.data,label:l.label||v.data.label,...l.config},l.position&&(v.position=l.position))}const H=A.nodes.filter(l=>!M.has(l.id)).map(l=>({id:l.id,type:l.type,position:l.position??{x:250,y:200},data:{label:l.label||l.id,...l.config}}));return[...K,...H]}),qa.update(K=>{const M=new Set;for(const l of K)M.add(l.id);const H=A.edges.filter(l=>!M.has(l.id)).map(l=>({id:l.id,source:l.source,target:l.target,sourceHandle:l.source_handle??void 0,targetHandle:l.target_handle??void 0}));return[...K,...H]}),A.nodes.length===0&&(Gn.set([]),qa.set([])),Oi()}function ze(){const A=window.location.protocol==="https:"?"wss:":"ws:",K=Ct(kn),M=K?`?project=${encodeURIComponent(K.name)}`:"";return`${A}//${window.location.host}/ws/assistant${M}`}function Ie(){if(s(De)&&s(De).readyState===WebSocket.OPEN)return;b(q,""),ee=!1;let A;try{A=new WebSocket(ze())}catch{b(q,"AI Assistant requires a configured LLM provider. Check Settings.");return}A.onopen=()=>{b(q,""),b(Z,0);const K=Ct(Es);if(K){Es.set(null),da(K.text),b(z,Hn(),!0);const M={action:"chat",message:K.text};K.attachments&&K.attachments.length>0&&(M.attachments=K.attachments);try{A.send(JSON.stringify(M))}catch{b(q,"Failed to send initial message."),bn.set(!1),b(z,"")}yt()}},A.onmessage=K=>{let M;try{M=JSON.parse(K.data)}catch{return}if(M.type==="token")s(z)||b(z,Hn(),!0),Oc(s(z),M.content),yt();else if(M.type==="response_complete"){s(z)&&Da(s(z),M.full_text),b(z,""),yt();const H=Ct(kn);if(H){const l=Ct(mn);Ht.assistant.saveHistory(H.name,l.map(v=>({role:v.role,content:v.content,timestamp:v.timestamp??new Date().toISOString(),toolCalls:v.toolCalls??[]}))).catch(()=>{})}}else if(M.type==="plan"){s(z)||b(z,Hn(),!0);let H=[],l=[];try{H=JSON.parse(M.steps)}catch{H=[]}try{l=JSON.parse(M.options)}catch{l=[]}b(f,{summary:M.summary||"",steps:H,options:l,question:M.question||"",msgId:s(z)},!0),yt()}else if(M.type==="tool_call"){if(s(z)||b(z,Hn(),!0),M.tool==="present_plan"){yt();return}let H=M.args;if(typeof H=="string")try{H=JSON.parse(H)}catch{H={raw:H}}(!H||typeof H!="object"||Array.isArray(H))&&(H={}),Ic(s(z),{tool:M.tool,args:H,result:M.result}),yt()}else if(M.type==="canvas_sync"){const H=M.canvas;H&&(me(H),Mi(H.nodes,H.edges),Ci())}else M.type==="error"&&(b(q,M.message,!0),ee=!0,s(z)?Da(s(z),""):bn.set(!1),b(z,""))},A.onclose=()=>{if(s(z)?(Da(s(z),"[Connection lost]"),b(z,"")):bn.set(!1),b(De,null),ee){ee=!1,b(Z,ue);return}Ba(Z),s(Z){},b(De,A,!0)}function Te(){b(Z,0),Ie()}function bt(){j&&(clearTimeout(j),j=null),s(De)?.close(),b(De,null)}function Ot(){const A=s(ut).trim();if(!A&&s(B).length===0||a()||!s(De))return;const K=A||`[${s(B).length} file${s(B).length>1?"s":""} attached]`;da(K),b(z,Hn(),!0);const M={action:"chat",message:A||"Please analyze the attached files."};s(B).length>0&&(M.attachments=s(B).map(H=>({name:H.name,type:H.type,category:H.category,size:H.size,data:H.data,docType:H.docType}))),b(ut,""),b(B,[],!0);try{s(De).send(JSON.stringify(M))}catch{b(q,"Failed to send message. Connection may be lost."),bn.set(!1),b(z,"");return}yt()}function dn(A){A.key==="Enter"&&!A.shiftKey&&(A.preventDefault(),Ot())}function It(){if(Hs(),s(De)&&s(De).readyState===WebSocket.OPEN)try{s(De).send(JSON.stringify({action:"clear_history"}))}catch{}b(q,"")}function yt(){requestAnimationFrame(()=>{s(pt)&&(s(pt).scrollTop=s(pt).scrollHeight)})}function Xt(A){return new Date(A).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})}function Pt(A){if(!(!s(f)||!s(De))){da(A),b(z,Hn(),!0);try{s(De).send(JSON.stringify({action:"chat",message:A}))}catch{b(q,"Failed to send plan selection."),bn.set(!1),b(z,"")}b(f,null),yt()}}function yn(){Kn.set(!1)}In(()=>{const A=c();ys(()=>{A&&s(De)&&(s(De).close(),b(De,null),Ie())})}),In(()=>{const A=c();A&&ys(()=>{Ht.assistant.getHistory(A.name).then(K=>{if(K&&K.length>0){Hs();for(const M of K)M.role==="user"?da(M.content):M.role==="assistant"&&mn.update(H=>[...H,{id:`msg_hist_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,role:"assistant",content:M.content,timestamp:M.timestamp||new Date().toISOString(),streaming:!1,toolCalls:M.toolCalls??[]}])}}).catch(()=>{})})}),Ja(()=>{Ie(),s(ft)?.focus()}),Yr(()=>{bt(),$e&&clearInterval($e),Ce&&clearInterval(Ce),document.removeEventListener("mousemove",ye),document.removeEventListener("mouseup",he)});var vt=Ye(),Nt=fe(vt);{var Ft=A=>{var K=dd();let M,H;var l=d(K),v=d(l),N=d(v),ce=d(N);pa(ce,{size:16}),o(N);var He=g(N,2),We=d(He,!0);o(He),o(v);var P=g(v,2),L=d(P);xo(L,{size:14}),o(P),o(l);var ae=g(l,2),lt=d(ae);{var st=V=>{var Se=Pc(),Be=d(Se),ke=d(Be);pa(ke,{size:48}),o(Be);var xe=g(Be,2),Ge=d(xe,!0);o(xe);var Qe=g(xe,2),Rt=d(Qe,!0);o(Qe),o(Se),le(()=>{ge(Ge,s(Oe)),ge(Rt,s(Oe)==="The Architect"?"I am The Architect. I designed the canvas upon which your agent pipelines take form. Describe what you wish to construct, and I shall design it.":`Ask ${s(Oe)} to help build your agent pipeline.`)}),m(V,Se)},Qt=V=>{var Se=Ye(),Be=fe(Se);gt(Be,1,n,ke=>ke.id,(ke,xe)=>{var Ge=Zc();let Qe;var Rt=d(Ge),nn=d(Rt);{var gn=Ae=>{Wl(Ae,{size:18})},vn=Ae=>{pa(Ae,{size:18})};Q(nn,Ae=>{s(xe).role==="user"?Ae(gn):Ae(vn,!1)})}o(Rt);var Bt=g(Rt,2),hn=d(Bt),Kt=d(hn),jt=d(Kt,!0);o(Kt);var an=g(Kt,2),kt=d(an,!0);o(an),o(hn);var Ut=g(hn,2);let qt;var pe=d(Ut);{var sn=Ae=>{var nt=Ye(),ht=fe(nt);{var x=ie=>{var X=Dc(),Ve=d(X),mt=d(Ve,!0);o(Ve);var $n=g(Ve,2);Ui($n,()=>s(se),rn=>{var zn=Lc(),Aa=d(zn,!0);o(zn),le(()=>ge(Aa,s(se))),m(rn,zn)}),o(X),le(()=>ge(mt,s(Ne))),m(ie,X)},D=ie=>{var X=jc(),Ve=fe(X);Ai(Ve,()=>Xe(s(xe).content));var mt=g(Ve,2);{var $n=rn=>{var zn=Bc();m(rn,zn)};Q(mt,rn=>{s(xe).streaming&&rn($n)})}m(ie,X)};Q(ht,ie=>{s(xe).streaming&&!s(xe).content?ie(x):ie(D,!1)})}m(Ae,nt)},je=Ae=>{var nt=Jn();le(()=>ge(nt,s(xe).content)),m(Ae,nt)};Q(pe,Ae=>{s(xe).role==="assistant"?Ae(sn):Ae(je,!1)})}o(Ut);var Y=g(Ut,2);{var Fe=Ae=>{var nt=qc(),ht=d(nt),x=d(ht),D=d(x);let ie;var X=d(D);Si(X,{size:12}),o(D);var Ve=g(D,2);Ha(Ve,{size:12});var mt=g(Ve,2),$n=d(mt);o(mt),o(x);var rn=g(x,2),zn=d(rn,!0);o(rn),o(ht);var Aa=g(ht,2);{var Tr=qn=>{var Ta=Kc();gt(Ta,21,()=>s(xe).toolCalls,xt,(Nr,fn,Rr)=>{var Na=Gc(),Ra=d(Na),vs=d(Ra);vs.textContent=Rr+1;var $a=g(vs,2),$r=d($a,!0);o($a);var zr=g($a,2);{var Mr=Zt=>{Ti(Zt,{size:11,class:"tool-call-ok"})};Q(zr,Zt=>{s(fn).result&&Zt(Mr)})}o(Ra);var hs=g(Ra,2);{var Cr=Zt=>{var Mn=Hc();gt(Mn,21,()=>Object.entries(s(fn).args),xt,(aa,za)=>{var sa=_t(()=>Xr(s(za),2));let Lr=()=>s(sa)[0],Zn=()=>s(sa)[1];var Ma=Uc(),Ca=d(Ma),Dr=d(Ca);o(Ca);var fs=g(Ca,2),Br=d(fs,!0);o(fs),o(Ma),le(jr=>{ge(Dr,`${Lr()??""}:`),ge(Br,jr)},[()=>typeof Zn()=="string"?Zn().length>120?Zn().slice(0,117)+"...":Zn():JSON.stringify(Zn())]),m(aa,Ma)}),o(Mn),m(Zt,Mn)},Or=_t(()=>s(fn).args&&Object.keys(s(fn).args).length>0);Q(hs,Zt=>{s(Or)&&Zt(Cr)})}var Ir=g(hs,2);{var Pr=Zt=>{var Mn=Fc(),aa=g(d(Mn),2),za=d(aa,!0);o(aa),o(Mn),le(sa=>ge(za,sa),[()=>s(fn).result.length>200?s(fn).result.slice(0,197)+"...":s(fn).result]),m(Zt,Mn)};Q(Ir,Zt=>{s(fn).result&&Zt(Pr)})}o(Na),le(()=>ge($r,s(fn).tool)),m(Nr,Na)}),o(Ta),m(qn,Ta)};Q(Aa,qn=>{Le[s(xe).id]&&qn(Tr)})}o(nt),le(qn=>{ie=it(D,1,"tool-chevron svelte-mwxll1",null,ie,{expanded:Le[s(xe).id]}),ge($n,`${s(xe).toolCalls.length??""} tool - call${s(xe).toolCalls.length!==1?"s":""}`),ge(zn,qn)},[()=>rt(s(xe).toolCalls)]),F("click",ht,()=>Ze(s(xe).id)),m(Ae,nt)};Q(Y,Ae=>{s(xe).toolCalls&&s(xe).toolCalls.length>0&&Ae(Fe)})}o(Bt),o(Ge),le(Ae=>{Qe=it(Ge,1,"message svelte-mwxll1",null,Qe,{user:s(xe).role==="user",assistant:s(xe).role==="assistant"}),ge(jt,s(xe).role==="user"?"You":s(Oe)),ge(kt,Ae),qt=it(Ut,1,"message-content svelte-mwxll1",null,qt,{markdown:s(xe).role==="assistant"})},[()=>Xt(s(xe).timestamp)]),m(ke,Ge)}),m(V,Se)};Q(lt,V=>{n().length===0?V(st):V(Qt,!1)})}o(ae),ga(ae,V=>b(pt,V),()=>s(pt));var Jt=g(ae,2);{var En=V=>{var Se=ed(),Be=d(Se),ke=d(Be),xe=d(ke),Ge=d(xe);Ha(Ge,{size:11}),o(xe),Je(2),o(ke);var Qe=g(ke,2),Rt=d(Qe);Ka(Rt,{size:12}),o(Qe),o(Be);var nn=g(Be,2),gn=d(nn);{var vn=Y=>{var Fe=Wc(),Ae=d(Fe,!0);o(Fe),le(()=>ge(Ae,s(f).summary)),m(Y,Fe)};Q(gn,Y=>{s(f).summary&&Y(vn)})}var Bt=g(gn,2);{var hn=Y=>{var Fe=Yc();gt(Fe,21,()=>s(f).steps,xt,(Ae,nt,ht)=>{var x=Vc(),D=d(x);D.textContent=ht+1;var ie=g(D,2),X=d(ie,!0);o(ie),o(x),le(()=>ge(X,s(nt))),m(Ae,x)}),o(Fe),m(Y,Fe)};Q(Bt,Y=>{s(f).steps.length>0&&Y(hn)})}var Kt=g(Bt,2);{var jt=Y=>{var Fe=Xc(),Ae=d(Fe,!0);o(Fe),le(()=>ge(Ae,s(f).question)),m(Y,Fe)};Q(Kt,Y=>{s(f).question&&Y(jt)})}o(nn);var an=g(nn,2),kt=d(an);{var Ut=Y=>{var Fe=Jc();gt(Fe,21,()=>s(f).options,xt,(Ae,nt,ht)=>{var x=Qc(),D=d(x),ie=d(D,!0);o(D);var X=g(D,2),Ve=d(X,!0);o(X),o(x),le(mt=>{ge(ie,mt),ge(Ve,s(nt))},[()=>String.fromCharCode(65+ht)]),F("click",x,()=>Pt(s(nt))),m(Ae,x)}),o(Fe),m(Y,Fe)};Q(kt,Y=>{s(f).options.length>0&&Y(Ut)})}var qt=g(kt,2),pe=d(qt);ot(pe,"rows",2);var sn=g(pe,2),je=d(sn);As(je,{size:12}),o(sn),o(qt),o(an),o(Se),le(()=>ot(pe,"placeholder",s(f).options.length>0?"Or type your own response...":"Type your response...")),F("click",Qe,()=>b(f,null)),F("keydown",pe,Y=>{if(Y.key==="Enter"&&!Y.shiftKey){Y.preventDefault();const Fe=Y.currentTarget;Fe.value.trim()&&Pt(Fe.value.trim())}}),F("click",sn,Y=>{const Fe=Y.currentTarget.previousElementSibling;Fe?.value.trim()&&Pt(Fe.value.trim())}),m(V,Se)};Q(Jt,V=>{s(f)&&V(En)})}var Sn=g(Jt,2);{var An=V=>{var Se=nd(),Be=d(Se),ke=d(Be,!0);o(Be);var xe=g(Be,2);{var Ge=Qe=>{var Rt=td();F("click",Rt,Te),m(Qe,Rt)};Q(xe,Qe=>{s(Z)>=ue&&Qe(Ge)})}o(Se),le(()=>ge(ke,s(q))),m(V,Se)};Q(Sn,V=>{s(q)&&V(An)})}var Tn=g(Sn,2),Bn=d(Tn);{var Gt=V=>{var Se=od();gt(Se,21,()=>s(B),Be=>Be.id,(Be,ke)=>{var xe=ld(),Ge=d(xe);let Qe;var Rt=d(Ge);{var nn=je=>{var Y=ad();le(()=>{ot(Y,"src",s(ke).preview),ot(Y,"alt",s(ke).name)}),m(je,Y)},gn=je=>{var Y=sd(),Fe=d(Y);{var Ae=X=>{xs(X,{size:14})},nt=X=>{wo(X,{size:14})},ht=X=>{So(X,{size:14})},x=X=>{xs(X,{size:14})},D=X=>{Bi(X,{size:14})},ie=X=>{Ni(X,{size:14})};Q(Fe,X=>{s(ke).category==="pdf"?X(Ae):s(ke).category==="spreadsheet"?X(nt,1):s(ke).category==="presentation"?X(ht,2):s(ke).category==="document"?X(x,3):s(ke).category==="image"?X(D,4):X(ie,!1)})}o(Y),m(je,Y)};Q(Rt,je=>{s(ke).category==="image"&&s(ke).preview?je(nn):je(gn,!1)})}var vn=g(Rt,2),Bt=d(vn),hn=d(Bt,!0);o(Bt);var Kt=g(Bt,2),jt=d(Kt),an=d(jt,!0);o(jt);var kt=g(jt,2);Ks(kt,{size:9}),o(Kt),o(vn);var Ut=g(vn,2),qt=d(Ut);Ka(qt,{size:12}),o(Ut),o(Ge);var pe=g(Ge,2);{var sn=je=>{var Y=id();gt(Y,21,()=>y,xt,(Fe,Ae)=>{var nt=rd();let ht;var x=d(nt,!0);o(nt),le(()=>{ht=it(nt,1,"type-option svelte-mwxll1",null,ht,{selected:s(ke).docType===s(Ae).value}),ge(x,s(Ae).label)}),F("click",nt,()=>G(s(ke).id,s(Ae).value)),m(Fe,nt)}),o(Y),m(je,Y)};Q(pe,je=>{s(O)===s(ke).id&&je(sn)})}o(xe),le((je,Y)=>{Qe=it(Ge,1,"attachment-badge svelte-mwxll1",null,Qe,{"has-preview":s(ke).category==="image"&&s(ke).preview}),ot(Bt,"title",s(ke).name),ge(hn,je),ge(an,Y)},[()=>s(ke).name.length>20?s(ke).name.slice(0,17)+"...":s(ke).name,()=>oe(s(ke).docType)]),F("click",Kt,()=>b(O,s(O)===s(ke).id?null:s(ke).id,!0)),F("click",Ut,()=>E(s(ke).id)),m(Be,xe)}),o(Se),m(V,Se)};Q(Bn,V=>{s(B).length>0&&V(Gt)})}var Lt=g(Bn,2),en=d(Lt),un=d(en),wa=d(un);Ys(wa,{size:16}),o(un);var xa=g(un,2);{var tn=V=>{var Se=cd(),Be=d(Se),ke=d(Be);Eo(ke,{size:14}),Je(2),o(Be);var xe=g(Be,2),Ge=d(xe);ko(Ge,{size:14}),Je(2),o(xe),o(Se),F("click",Be,()=>{s(te)?.click(),b(de,!1)}),F("click",xe,()=>{console.log("Screenshot not yet implemented"),b(de,!1)}),m(V,Se)};Q(xa,V=>{s(de)&&V(tn)})}o(en);var Nn=g(en,2);ga(Nn,V=>b(te,V),()=>s(te));var Dt=g(Nn,2);_a(Dt),ot(Dt,"rows",1),ga(Dt,V=>b(ft,V),()=>s(ft));var na=g(Dt,2),Rn=d(na),Ea=d(Rn);qs(Ea,{size:14}),o(Rn);var pn=g(Rn,2),Sa=d(pn);{var S=V=>{as(V,{size:14,class:"spin-icon"})},re=V=>{As(V,{size:14})};Q(Sa,V=>{a()?V(S):V(re,!1)})}o(pn),o(na),o(Lt),o(Tn);var Me=g(Tn,2);o(K),le(V=>{M=it(K,1,"architect-sidebar svelte-mwxll1",null,M,{dragging:s(Ee)}),H=Qs(K,"",H,{width:`${s(be)??""}px`}),ge(We,s(Oe)),un.disabled=a(),ot(Nn,"accept",T),ot(Dt,"placeholder",`Ask ${s(Oe)??""}...`),Dt.disabled=a(),Rn.disabled=n().length===0,pn.disabled=V},[()=>!s(ut).trim()&&s(B).length===0||a()||!s(De)]),F("click",P,yn),F("click",un,()=>b(de,!s(de))),F("change",Nn,ne),F("keydown",Dt,dn),Qa("paste",Dt,Re),$t(Dt,()=>s(ut),V=>b(ut,V)),F("click",Rn,It),F("click",pn,Ot),F("mousedown",Me,U),m(A,K)};Q(Nt,A=>{i()&&A(Ft)})}m(t,vt),cn(),p()}xn(["click","keydown","change","mousedown"]);var pd=w('
    '),gd=w('
    '),vd=w('
    Made with by Firefly Software Solutions
    ',1);function hd(t,e){on(e,!0);const n=()=>ct(qi,"$page",r),[r,a]=_n(),c=_t(()=>n().url.pathname==="/"||n().url.pathname==="/index.html");Ja(()=>{Xi();function $(k){k.preventDefault();const E=k.reason instanceof Error?k.reason.message:String(k.reason);wt(`Unhandled error: ${E}`,"error"),console.error("[AppShell] Unhandled rejection:",k.reason)}return window.addEventListener("unhandledrejection",$),()=>{Qi(),window.removeEventListener("unhandledrejection",$)}});function i(){const $=document.activeElement;if(!$)return!1;const k=$.tagName.toLowerCase();return!!(k==="input"||k==="textarea"||$.isContentEditable)}function u($){if(s(c))return;const k=$.metaKey||$.ctrlKey;if($.key==="s"&&k){$.preventDefault();const E=Ct(kn);E&&Ht.projects.savePipeline(E.name,"main",wn()).then(()=>wt("Pipeline saved","success")).catch(()=>wt("Failed to save pipeline","error"));return}if($.key===","&&k){$.preventDefault(),ea.set(!0);return}if($.key==="k"&&k){$.preventDefault(),Za.update(E=>!E);return}if($.key==="Enter"&&k){$.preventDefault(),ns(wn());return}if($.key==="D"&&k&&$.shiftKey){$.preventDefault(),ts(wn());return}if($.key==="/"&&k){$.preventDefault(),Kn.update(E=>!E);return}if($.key==="d"&&k&&!$.shiftKey){if(i())return;$.preventDefault();const E=Ct(ra);if(!E)return;const G=Ct(Gn).find(Re=>Re.id===E);if(!G)return;const oe=`${G.type}-dup-${Date.now()}`,ne=40;Gn.update(Re=>[...Re,{...G,id:oe,position:{x:G.position.x+ne,y:G.position.y+ne},data:{...G.data}}]),ra.set(oe);return}if(($.key==="Delete"||$.key==="Backspace")&&!k&&!$.shiftKey&&!$.altKey){if(i())return;const E=Ct(ra);if(!E)return;$.preventDefault(),Gn.update(O=>O.filter(G=>G.id!==E)),qa.update(O=>O.filter(G=>G.source!==E&&G.target!==E)),ra.set(null);return}if($.key==="?"&&!k&&!$.altKey){if(i())return;$.preventDefault(),Wa.update(E=>!E);return}}var p=vd();Qa("keydown",Qr,u);var f=fe(p),h=d(f);kl(h,{get isHomePage(){return s(c)}});var y=g(h,2);{var _=$=>{var k=pd(),E=d(k);Fa(E,()=>e.children),o(k),m($,k)},C=$=>{var k=gd(),E=d(k);ud(E,{});var O=g(E,2),G=d(O);Fa(G,()=>e.children),o(O),o(k),m($,k)};Q(y,$=>{s(c)?$(_):$(C,!1)})}Je(2),o(f);var T=g(f,2);zl(T,{});var I=g(T,2);Dl(I,{});var B=g(I,2);ql(B,{});var te=g(B,2);bo(te,{});var de=g(te,2);yo(de,{}),m(t,p),cn(),a()}var fd=w('');function Nd(t,e){on(e,!0),Ja(async()=>{await Ga();try{const n=await Ht.settings.status();(n.first_start||!n.setup_complete)&&va.set(!0),await Vs()}catch{}}),Hi("12qhfyh",n=>{var r=fd();le(()=>ot(r,"href",ss)),m(n,r)}),hd(t,{children:(n,r)=>{var a=Ye(),c=fe(a);Fa(c,()=>e.children),m(n,a)},$$slots:{default:!0}}),cn()}export{Nd as component,Td as universal}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/0.E-H85vrL.js b/studio-desktop/frontend-dist/_app/immutable/nodes/0.E-H85vrL.js deleted file mode 100644 index a5e9e8a7..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/0.E-H85vrL.js +++ /dev/null @@ -1,65 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{h as ua,a as Ur,bk as Hr,b as Fs,U as Fr,bl as Gr,bm as Kr,av as qr,aJ as bs,d as ms,c as _s,e as Zr,au as Wr,g as Ye,i as fe,j as m,w as Ln,b9 as Vr,G as xn,p as on,l as In,f as cn,B as d,M as Je,C as o,D as g,t as s,z as le,F as ge,K as F,A as w,I as ve,O as _t,L as b,N as _a,a4 as Ct,bj as Qa,J as On,P as Jn,ai as Ba,m as ys,o as Ja,bn as Yr,b8 as Xr,bo as Qr}from"../chunks/hL-aZVJ4.js";import{L as Gs,a as wt,C as Fn,b as ks,S as es,c as Ks,P as ja,d as ts,r as ns,i as Jr,e as ei,T as qs,F as ti,G as ni,R as ai,A as si,f as ri,g as ii,D as li,B as pa,W as oi,h as ci,j as di,k as ui,l as pi,m as gi,n as vi,o as hi,p as fi,M as Zs,Z as Ua,q as bi,t as mi,I as _i,s as yi,u as ki,v as wi,w as xi,x as Ei,y as Si,z as Ai,E as Ti,H as Ni,J as Ha}from"../chunks/DWKiSLzw.js";import{I as Et,s as St,c as Ht,a as it,L as as,v as kn,i as ot,b as $t,w as wn,x as Gn,p as Oa,e as gt,u as xt,n as Mt,P as Ws,y as Fa,j as ws,h as Ri,B as $i,D as zi,z as Wt,g as Vs,A as Ga,o as Ys,C as Xs,X as Ka,q as Qs,E as Mi,r as Ci,G as qa,H as Oi,F as xs,J as ra}from"../chunks/BWWgRDE1.js";import{B as Ii,l as At,s as Tt,p as Js,i as Q,a as _n,c as ct,b as ga}from"../chunks/B_6VzoXV.js";import{s as Pi,a as Li,g as jn}from"../chunks/DEAaRqcq.js";import{s as ea,c as Kn,d as Za,a as ia,r as Di,b as Ia,e as Wa,f as va,p as Es}from"../chunks/yhLnWQwL.js";import{i as er}from"../chunks/D7CioVkw.js";import{c as tr}from"../chunks/CFyDcTgg.js";import{S as Ss,a as As,I as Bi}from"../chunks/DWbf9ulZ.js";const ji=Symbol("NaN");function Ui(t,e,n){ua&&Ur();var r=new Ii(t),a=!Hr();Fs(()=>{var c=e();c!==c&&(c=ji),a&&c!==null&&typeof c=="object"&&(c={}),r.ensure(c,n)})}function Hi(t,e){let n=null,r=ua;var a;if(ua){n=Zr;for(var c=Wr(document.head);c!==null&&(c.nodeType!==qr||c.data!==t);)c=bs(c);if(c===null)ms(!1);else{var i=bs(c);c.remove(),_s(i)}}ua||(a=document.head.appendChild(Fr()));try{Fs(()=>e(a),Gr|Kr)}finally{r&&(ms(!0),_s(n))}}const Fi=!1,Gi=!1,Td=Object.freeze(Object.defineProperty({__proto__:null,prerender:Gi,ssr:Fi},Symbol.toStringTag,{value:"Module"})),ss="data:image/svg+xml,%3csvg%20width='200'%20height='200'%20viewBox='0%200%20200%20200'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3ccircle%20cx='100'%20cy='100'%20r='100'%20fill='url(%23paint0_linear_76_8)'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M100%2027C96.9983%2027.0001%2094.0805%2027.9929%2091.6991%2029.8243C89.3177%2031.6558%2087.6058%2034.2235%2086.8289%2037.1294C86.052%2040.0353%2086.2535%2043.1169%2087.4021%2045.8963C88.5507%2048.6758%2090.5823%2050.9977%2093.1818%2052.502V61.1667H72.7273C50.9091%2061.1667%2045.4545%2079.3912%2045.4545%2088.5V136.333C45.4545%20140.891%2048.1818%20150%2059.0909%20150H65.9091V122.667C65.9091%20120.854%2066.6274%20119.116%2067.9061%20117.835C69.1847%20116.553%2070.919%20115.833%2072.7273%20115.833H127.273C129.081%20115.833%20130.815%20116.553%20132.094%20117.835C133.373%20119.116%20134.091%20120.854%20134.091%20122.667V150H140.909C151.818%20150%20154.545%20140.891%20154.545%20136.333V88.5C154.545%2066.6333%20136.361%2061.1667%20127.273%2061.1667H106.818V52.502C109.418%2050.9977%20111.449%2048.6758%20112.598%2045.8963C113.747%2043.1169%20113.948%2040.0353%20113.171%2037.1294C112.394%2034.2235%20110.682%2031.6558%20108.301%2029.8243C105.92%2027.9929%20103.002%2027.0001%20100%2027ZM120.455%20150V129.5H106.818V150H120.455ZM93.1818%20150V129.5H79.5455V150H93.1818ZM161.364%20129.5V95.3333C165.911%2095.3333%20175%2098.0667%20175%20109V115.833C175%20120.391%20172.273%20129.5%20161.364%20129.5ZM38.6364%2095.3333V129.5C27.7273%20129.5%2025%20120.391%2025%20115.833V109C25%2098.0667%2034.0886%2095.3333%2038.6364%2095.3333ZM79.5455%2088.5C77.7372%2088.5%2076.0029%2089.2199%2074.7243%2090.5014C73.4456%2091.7829%2072.7273%2093.521%2072.7273%2095.3333C72.7273%2097.1456%2073.4456%2098.8837%2074.7243%20100.165C76.0029%20101.447%2077.7372%20102.167%2079.5455%20102.167H79.5523C81.3606%20102.167%2083.0948%20101.447%2084.3735%20100.165C85.6521%2098.8837%2086.3705%2097.1456%2086.3705%2095.3333C86.3705%2093.521%2085.6521%2091.7829%2084.3735%2090.5014C83.0948%2089.2199%2081.3606%2088.5%2079.5523%2088.5H79.5455ZM113.636%2095.3333C113.636%2093.521%20114.355%2091.7829%20115.633%2090.5014C116.912%2089.2199%20118.646%2088.5%20120.455%2088.5H120.461C122.27%2088.5%20124.004%2089.2199%20125.283%2090.5014C126.561%2091.7829%20127.28%2093.521%20127.28%2095.3333C127.28%2097.1456%20126.561%2098.8837%20125.283%20100.165C124.004%20101.447%20122.27%20102.167%20120.461%20102.167H120.455C118.646%20102.167%20116.912%20101.447%20115.633%20100.165C114.355%2098.8837%20113.636%2097.1456%20113.636%2095.3333Z'%20fill='white'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_76_8'%20x1='200'%20y1='100'%20x2='0'%20y2='100'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F68000'/%3e%3cstop%20offset='1'%20stop-color='%23FFF9C1'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e",Ki=()=>{const t=Pi;return{page:{subscribe:t.page.subscribe},navigating:{subscribe:t.navigating.subscribe},updated:t.updated}},qi={subscribe(t){return Ki().page.subscribe(t)}};function nr(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M12 20v-9"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z"}],["path",{d:"M14.12 3.88 16 2"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97"}],["path",{d:"M22 13h-4"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97"}],["path",{d:"M6 13H2"}],["path",{d:"m8 2 1.88 1.88"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13"}]];Et(t,Tt({name:"bug"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Zi(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M9 3v18"}]];Et(t,Tt({name:"panel-left"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Wi(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7"}]];Et(t,Tt({name:"save"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Vi(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M12 2v10"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04"}]];Et(t,Tt({name:"power"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}const la=Ln(null),oa=Ln(!1),Un=Ln("stopped"),Xn=Ln("checking"),ar=Ln(""),Yi={subscribe:Xn.subscribe};ar.subscribe;Vr(Xn,t=>t==="connected");let Qn=null;async function Ts(){try{const t=await fetch("/api/health",{signal:AbortSignal.timeout(3e3)});if(t.ok){const e=await t.json();Xn.set("connected"),ar.set(e.version??"")}else Xn.set("disconnected")}catch{Xn.set("disconnected")}}function Xi(t=1e4){Qn||(Ts(),Qn=setInterval(Ts,t))}function Qi(){Qn&&(clearInterval(Qn),Qn=null)}function Ji(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"}],["path",{d:"M2 12h20"}]];Et(t,Tt({name:"globe"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}var el=w(' ',1),tl=w(" ",1),nl=w('

    Send a POST request with a JSON body to run your pipeline remotely.

    '),al=w('
    ',1),sl=w('');function rl(t,e){on(e,!0);const n=()=>ct(la,"$tunnelUrl",c),r=()=>ct(oa,"$tunnelActive",c),a=()=>ct(kn,"$currentProject",c),[c,i]=_n();let u=Js(e,"open",3,!1),p=ve(!1),f=ve(!1),h=_t(n),y=_t(r),_=_t(()=>a()?.name??""),C=_t(()=>s(h)?`${s(h)}/api/projects/${s(_)}/run`:null);In(()=>{u()&&T()});async function T(){try{const G=await Ht.tunnel.status();oa.set(G.active),la.set(G.url)}catch{}}async function I(){b(p,!0);try{const G=await Ht.tunnel.start();oa.set(!0),la.set(G.url),wt("Tunnel started","success")}catch{wt("Failed to start tunnel","error")}finally{b(p,!1)}}async function B(){b(p,!0);try{await Ht.tunnel.stop(),oa.set(!1),la.set(null),wt("Tunnel stopped","success")}catch{wt("Failed to stop tunnel","error")}finally{b(p,!1)}}async function te(G){try{await navigator.clipboard.writeText(G),b(f,!0),setTimeout(()=>{b(f,!1)},2e3)}catch{wt("Failed to copy","error")}}function de(G){G.target===G.currentTarget&&e.onclose()}function $(G){G.key==="Escape"&&(G.preventDefault(),e.onclose())}var k=Ye(),E=fe(k);{var O=G=>{var oe=sl(),ne=d(oe),Re=d(ne),et=d(Re),qe=d(et);Gs(qe,{size:18}),Je(2),o(et),Je(2),o(Re);var Ne=g(Re,2),se=d(Ne),$e=d(se),Ce=d($e),tt=d(Ce);let J;var Pe=g(tt,2),Oe=d(Pe,!0);o(Pe),o(Ce);var Le=g(Ce,2);let Ze;var rt=d(Le);{var at=z=>{var q=el(),j=fe(q),Z=d(j);as(Z,{size:13}),o(j);var ee=g(j,2),ue=d(ee,!0);o(ee),le(()=>ge(ue,s(y)?"Stopping...":"Starting...")),m(z,q)},Xe=z=>{var q=tl(),j=fe(q);Ji(j,{size:13});var Z=g(j,2),ee=d(Z,!0);o(Z),le(()=>ge(ee,s(y)?"Stop Tunnel":"Start Tunnel")),m(z,q)};Q(rt,z=>{s(p)?z(at):z(Xe,!1)})}o(Le),o($e),Je(2),o(se);var ut=g(se,2);{var pt=z=>{var q=al(),j=fe(q),Z=g(d(j),2),ee=d(Z),ue=d(ee,!0);o(ee);var be=g(ee,2),Ee=d(be);{var _e=U=>{Fn(U,{size:13})},we=U=>{ks(U,{size:13})};Q(Ee,U=>{s(f)?U(_e):U(we,!1)})}o(be),o(Z),o(j);var R=g(j,2);{var W=U=>{var ye=nl(),he=g(d(ye),2),me=d(he),ze=d(me,!0);o(me);var Ie=g(me,2),Te=d(Ie);ks(Te,{size:13}),o(Ie),o(he),Je(2),o(ye),le(()=>ge(ze,s(C))),F("click",Ie,()=>te(s(C))),m(U,ye)};Q(R,U=>{s(C)&&U(W)})}le(()=>ge(ue,s(h))),F("click",be,()=>te(s(h))),m(z,q)};Q(ut,z=>{s(y)&&s(h)&&z(pt)})}o(Ne);var ft=g(Ne,2),De=d(ft);o(ft),o(ne),o(oe),le(()=>{J=it(tt,1,"tunnel-dot svelte-1vh905b",null,J,{"tunnel-dot-active":s(y)}),ge(Oe,s(y)?"Tunnel Active":"Tunnel Inactive"),Ze=it(Le,1,"tunnel-toggle-btn svelte-1vh905b",null,Ze,{"tunnel-stop":s(y)}),Le.disabled=s(p)}),F("click",oe,de),F("keydown",oe,$),F("click",Le,function(...z){(s(y)?B:I)?.apply(this,z)}),F("click",De,function(...z){e.onclose?.apply(this,z)}),m(G,oe)};Q(E,G=>{u()&&G(O)})}m(t,k),cn(),i()}xn(["click","keydown"]);var il=w(''),ll=w('active'),ol=w(''),cl=w('
    '),dl=w(' ',1),ul=w('
    ',1),pl=w(' /
    ',1),gl=w(' Running... ',1),vl=w(' Run',1),hl=w(''),fl=w('
    ',1),bl=w(''),ml=w(''),_l=w('

    Run Pipeline

    Provide input for your pipeline (or leave blank to run without input)

    '),yl=w('
    ',1);function kl(t,e){on(e,!0);const n=()=>ct(Jr,"$isRunning",f),r=()=>ct(ei,"$isDebugging",f),a=()=>ct(Yi,"$connectionState",f),c=()=>ct(Un,"$runtimeStatus",f),i=()=>ct(kn,"$currentProject",f),u=()=>ct(Oa,"$projects",f),p=()=>ct(Kn,"$architectSidebarOpen",f),[f,h]=_n();let y=Js(e,"isHomePage",3,!1),_=_t(n),C=_t(r),T=_t(()=>s(_)||s(C)),I=_t(a),B=ve(!1),te=ve(""),de=ve(!1),$=ve(null),k=ve(!1),E=ve(!1),O=ve("");Li(()=>{b(B,!1),b(E,!1),b(k,!1),b($,null)});function G(){b(B,!s(B)),b(te,"")}async function oe(){const R=s(te).trim();if(!(!R||s(de))){b(de,!0);try{await Ht.projects.create(R),await Fa();const U=Ct(Oa).find(ye=>ye.name===R);U&&ws(U),b(te,""),b(B,!1)}catch{wt("Failed to create project","error")}finally{b(de,!1)}}}async function ne(R){R&&(ws(R),b(B,!1))}function Re(R){if(Ct(Oa).length<=1){wt("Cannot delete the only project","error");return}b($,R,!0)}async function et(){if(!s($))return;const R=s($);b($,null);try{await Ht.projects.delete(R),await Fa(),wt(`Project "${R}" deleted`,"success")}catch{wt("Failed to delete project","error")}}function qe(){b($,null)}async function Ne(){const R=Ct(kn);if(R)try{const W=wn();await Ht.projects.savePipeline(R.name,"main",W),wt("Pipeline saved","success")}catch{wt("Failed to save pipeline","error")}}function se(){Ct(Gn).length!==0&&(b(E,!0),b(O,""))}function $e(){b(E,!1),ns(wn(),s(O)||void 0)}function Ce(){ts(wn())}function tt(){Kn.update(R=>!R)}let J=_t(c),Pe=ve(!1);async function Oe(){const R=Ct(kn);if(!(!R||s(Pe))){b(Pe,!0);try{s(J)==="running"?(Un.set("stopped"),await Ht.runtime.stop(R.name),Un.set("stopped"),wt("Runtime stopped","success")):(Un.set("starting"),await Ht.runtime.start(R.name),Un.set("running"),wt("Runtime started","success"))}catch{Un.set("error"),wt("Runtime toggle failed","error")}finally{b(Pe,!1)}}}var Le=yl(),Ze=fe(Le),rt=d(Ze),at=d(rt),Xe=d(at);Je(2),o(at);var ut=g(at,2);{var pt=R=>{var W=pl(),U=fe(W);let ye;var he=g(U,4),me=d(he),ze=g(d(me),2),Ie=d(ze,!0);o(ze);var Te=g(ze,2);Ks(Te,{size:10,class:"project-chevron"}),o(me);var bt=g(me,2);{var Ot=yt=>{var Xt=ul(),Pt=fe(Xt),yn=g(Pt,2),vt=d(yn),Nt=g(d(vt),2),Ft=d(Nt,!0);o(Nt),o(vt);var A=g(vt,2);{var K=H=>{var l=il(),v=d(l),N=g(d(v)),ce=d(N,!0);o(N),Je(),o(v);var He=g(v,4),We=d(He),P=g(We,2);o(He),o(l),le(()=>ge(ce,s($))),F("click",We,qe),F("click",P,et),m(H,l)},M=H=>{var l=dl(),v=fe(l);gt(v,5,u,xt,(P,L)=>{var ae=cl();let lt;var st=d(ae);let Qt;var Jt=g(st,2),En=d(Jt,!0);o(Jt);var Sn=g(Jt,2);{var An=Gt=>{var Lt=ll();m(Gt,Lt)};Q(Sn,Gt=>{i()?.name===s(L).name&&Gt(An)})}var Tn=g(Sn,2);{var Bn=Gt=>{var Lt=ol(),en=d(Lt);qs(en,{size:12}),o(Lt),F("click",Lt,un=>{un.stopPropagation(),Re(s(L).name)}),m(Gt,Lt)};Q(Tn,Gt=>{u().length>1&&Gt(Bn)})}o(ae),le(()=>{lt=it(ae,1,"dropdown-item svelte-11yu8dz",null,lt,{active:i()?.name===s(L).name}),Qt=it(st,1,"dropdown-item-dot svelte-11yu8dz",null,Qt,{"dot-active":i()?.name===s(L).name}),ge(En,s(L).name)}),F("click",ae,()=>ne(s(L))),m(P,ae)}),o(v);var N=g(v,2),ce=d(N);Mt(ce);var He=g(ce,2),We=d(He);Ws(We,{size:14}),o(He),o(N),le(P=>He.disabled=P,[()=>!s(te).trim()||s(de)]),F("keydown",ce,P=>P.key==="Enter"&&oe()),$t(ce,()=>s(te),P=>b(te,P)),F("click",He,oe),m(H,l)};Q(A,H=>{s($)?H(K):H(M,!1)})}o(yn),le(()=>ge(Ft,u().length)),F("click",Pt,()=>{b(B,!1),b($,null)}),F("keydown",Pt,()=>{}),m(yt,Xt)};Q(bt,yt=>{s(B)&&yt(Ot)})}o(he);var dn=g(he,2),It=d(dn);Wi(It,{size:14}),o(dn),le(()=>{ye=it(U,1,"conn-dot svelte-11yu8dz",null,ye,{"conn-ok":s(I)==="connected","conn-fail":s(I)==="disconnected","conn-check":s(I)==="checking"}),ot(U,"title",s(I)==="connected"?"Backend connected":s(I)==="disconnected"?"Backend disconnected":"Checking connection..."),ge(Ie,i()?.name??"No project")}),F("click",me,G),F("click",dn,Ne),m(R,W)};Q(ut,R=>{y()||R(pt)})}o(rt);var ft=g(rt,4),De=d(ft);{var z=R=>{var W=fl(),U=fe(W);let ye;var he=d(U);{var me=vt=>{var Nt=gl(),Ft=fe(Nt),A=d(Ft);as(A,{size:14}),o(Ft),Je(4),m(vt,Nt)},ze=vt=>{var Nt=vl(),Ft=fe(Nt);ja(Ft,{size:14}),Je(2),m(vt,Nt)};Q(he,vt=>{s(_)?vt(me):vt(ze,!1)})}o(U);var Ie=g(U,2);let Te;var bt=d(Ie);nr(bt,{size:16});var Ot=g(bt,2);{var dn=vt=>{var Nt=hl();m(vt,Nt)};Q(Ot,vt=>{s(C)&&vt(dn)})}o(Ie);var It=g(Ie,2);let yt;var Xt=d(It);let Pt;var yn=g(Xt,2);Vi(yn,{size:13}),o(It),Je(2),le(()=>{ye=it(U,1,"btn-run svelte-11yu8dz",null,ye,{"btn-run-active":s(_)}),U.disabled=s(T),Te=it(Ie,1,"btn-icon svelte-11yu8dz",null,Te,{"btn-debug-active":s(C)}),Ie.disabled=s(T),yt=it(It,1,"btn-runtime svelte-11yu8dz",null,yt,{"runtime-running":s(J)==="running","runtime-error":s(J)==="error","runtime-starting":s(J)==="starting"}),It.disabled=s(Pe),ot(It,"title",s(J)==="running"?"Stop runtime":"Start runtime"),Pt=it(Xt,1,"runtime-dot svelte-11yu8dz",null,Pt,{"rt-running":s(J)==="running","rt-stopped":s(J)==="stopped","rt-error":s(J)==="error","rt-starting":s(J)==="starting"})}),F("click",U,se),F("click",Ie,Ce),F("click",It,Oe),m(R,W)};Q(De,R=>{y()||R(z)})}var q=g(De,2);{var j=R=>{var W=bl(),U=d(W);Gs(U,{size:16}),o(W),F("click",W,()=>b(k,!0)),m(R,W)};Q(q,R=>{y()||R(j)})}var Z=g(q,2),ee=d(Z);es(ee,{size:16}),o(Z);var ue=g(Z,2);{var be=R=>{var W=ml();let U;var ye=d(W);Zi(ye,{size:16}),o(W),le(()=>U=it(W,1,"btn-icon svelte-11yu8dz",null,U,{"architect-active":p()})),F("click",W,tt),m(R,W)};Q(ue,R=>{y()||R(be)})}o(ft),o(Ze);var Ee=g(Ze,2);rl(Ee,{get open(){return s(k)},onclose:()=>b(k,!1)});var _e=g(Ee,2);{var we=R=>{var W=_l(),U=d(W),ye=g(d(U),4);_a(ye),ot(ye,"rows",4);var he=g(ye,2),me=d(he),ze=g(me,2),Ie=d(ze);ja(Ie,{size:14}),Je(),o(ze),o(he),o(U),o(W),F("click",W,()=>b(E,!1)),F("keydown",W,Te=>Te.key==="Escape"&&b(E,!1)),F("click",U,Te=>Te.stopPropagation()),F("keydown",U,()=>{}),F("keydown",ye,Te=>{Te.key==="Enter"&&(Te.metaKey||Te.ctrlKey)&&$e()}),$t(ye,()=>s(O),Te=>b(O,Te)),F("click",me,()=>b(E,!1)),F("click",ze,$e),m(R,W)};Q(_e,R=>{s(E)&&R(we)})}le(()=>ot(Xe,"src",ss)),F("click",Z,()=>ea.set(!0)),m(t,Le),cn(),h()}xn(["click","keydown"]);function wl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M3 15h18"}]];Et(t,Tt({name:"panel-bottom"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function xl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M15 3v18"}]];Et(t,Tt({name:"panel-right"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function El(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m18 16 4-4-4-4"}],["path",{d:"m6 8-4 4 4 4"}],["path",{d:"m14.5 4-5 16"}]];Et(t,Tt({name:"code-xml"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Sl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"}]];Et(t,Tt({name:"message-square"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}var Al=w('
    No matching commands
    '),Tl=w(' '),Nl=w(''),Rl=w('
    ',1),$l=w('
    ');function zl(t,e){on(e,!0);const n=()=>ct(Za,"$commandPaletteOpen",r),[r,a]=_n(),c=[{id:"nav-construct",label:"Go to Construct",category:"Navigation",icon:Ri,action:()=>jn("/construct")},{id:"nav-evaluate",label:"Go to Evaluate",category:"Navigation",icon:ti,action:()=>jn("/evaluate")},{id:"nav-experiments",label:"Go to Experiments",category:"Navigation",icon:ni,action:()=>jn("/experiments")},{id:"nav-deploy",label:"Go to Deploy",category:"Navigation",icon:ai,action:()=>jn("/deploy")},{id:"nav-monitor",label:"Go to Monitor",category:"Navigation",icon:si,action:()=>jn("/monitor")},{id:"nav-files",label:"Go to Files",category:"Navigation",icon:ri,action:()=>jn("/files")},{id:"node-input",label:"Add Input Node",category:"Add Node",icon:ii,action:()=>Wt("input","Input")},{id:"node-output",label:"Add Output Node",category:"Add Node",icon:li,action:()=>Wt("output","Output")},{id:"node-agent",label:"Add Agent Node",category:"Add Node",icon:pa,action:()=>Wt("agent","Agent")},{id:"node-tool",label:"Add Tool Node",category:"Add Node",icon:oi,action:()=>Wt("tool","Tool")},{id:"node-reasoning",label:"Add Reasoning Node",category:"Add Node",icon:$i,action:()=>Wt("reasoning","Reasoning")},{id:"node-condition",label:"Add Condition Node",category:"Add Node",icon:ci,action:()=>Wt("condition","Condition")},{id:"node-memory",label:"Add Memory Node",category:"Add Node",icon:zi,action:()=>Wt("memory","Memory")},{id:"node-validator",label:"Add Validator Node",category:"Add Node",icon:di,action:()=>Wt("validator","Validator")},{id:"node-code",label:"Add Code Node",category:"Add Node",icon:ui,action:()=>Wt("custom_code","Code")},{id:"node-fanout",label:"Add Fan Out Node",category:"Add Node",icon:pi,action:()=>Wt("fan_out","Fan Out")},{id:"node-fanin",label:"Add Fan In Node",category:"Add Node",icon:gi,action:()=>Wt("fan_in","Fan In")},{id:"open-settings",label:"Open Settings",category:"Settings",icon:es,action:()=>ea.set(!0),shortcut:"⌘,"},{id:"pipeline-run",label:"Run Pipeline",category:"Pipeline Actions",icon:ja,action:()=>ns(wn())},{id:"pipeline-debug",label:"Debug Pipeline",category:"Pipeline Actions",icon:nr,action:()=>ts(wn())},{id:"view-bottom-panel",label:"Toggle Bottom Panel",category:"View",icon:wl,action:()=>ia.update(k=>!k)},{id:"view-right-panel",label:"Toggle Right Panel",category:"View",icon:xl,action:()=>Di.update(k=>!k)},{id:"view-tab-console",label:"Switch to Console Tab",category:"View",icon:vi,action:()=>{ia.set(!0),Ia.set("console")}},{id:"view-tab-code",label:"Switch to Code Tab",category:"View",icon:El,action:()=>{ia.set(!0),Ia.set("code")}},{id:"view-tab-timeline",label:"Switch to Timeline Tab",category:"View",icon:hi,action:()=>{ia.set(!0),Ia.set("timeline")}},{id:"view-tab-chat",label:"Toggle AI Assistant Sidebar",category:"View",icon:Sl,action:()=>{Kn.update(k=>!k)}}];let i=ve(""),u=ve(0),p=ve(null);function f(k,E){let O=0,G=0,oe=-1;for(let ne=0;ne=0&&(G+=ne-oe-1),oe=ne,O++);return O===E.length?G:-1}let h=_t(()=>{if(!s(i).trim())return c;const k=s(i).toLowerCase(),E=c.map(O=>{const G=f(O.label.toLowerCase(),k),oe=f(O.category.toLowerCase(),k),ne=G>=0&&oe>=0?Math.min(G,oe):Math.max(G,oe);return{cmd:O,score:ne}}).filter(O=>O.score>=0);return E.sort((O,G)=>O.score-G.score),E.map(O=>O.cmd)}),y=_t(()=>{const k=[];let E=0;const O=new Map,G=[];for(const oe of s(h))O.has(oe.category)||(O.set(oe.category,[]),G.push(oe.category)),O.get(oe.category).push({...oe,globalIndex:E}),E++;for(const oe of G)k.push({category:oe,items:O.get(oe)});return k});In(()=>{s(u)>=s(h).length&&b(u,Math.max(0,s(h).length-1),!0)}),In(()=>{n()&&(b(i,""),b(u,0),queueMicrotask(()=>s(p)?.focus()))});function _(){Za.set(!1)}function C(k){_(),queueMicrotask(()=>k.action())}function T(k){if(k.key==="Escape"){k.preventDefault(),_();return}if(k.key==="ArrowDown"){k.preventDefault(),b(u,(s(u)+1)%s(h).length),I();return}if(k.key==="ArrowUp"){k.preventDefault(),b(u,(s(u)-1+s(h).length)%s(h).length),I();return}if(k.key==="Enter"){k.preventDefault();const E=s(h)[s(u)];E&&C(E);return}}function I(){queueMicrotask(()=>{const k=s(h)[s(u)];k&&document.getElementById(`cmd-item-${k.id}`)?.scrollIntoView({block:"nearest"})})}function B(k){k.target===k.currentTarget&&_()}var te=Ye(),de=fe(te);{var $=k=>{var E=$l(),O=d(E),G=d(O),oe=d(G);fi(oe,{size:16});var ne=g(oe,2);Mt(ne),ga(ne,se=>b(p,se),()=>s(p)),Je(2),o(G);var Re=g(G,2),et=d(Re);{var qe=se=>{var $e=Al();m(se,$e)},Ne=se=>{var $e=Ye(),Ce=fe($e);gt(Ce,17,()=>s(y),xt,(tt,J)=>{var Pe=Rl(),Oe=fe(Pe),Le=d(Oe,!0);o(Oe);var Ze=g(Oe,2);gt(Ze,17,()=>s(J).items,xt,(rt,at)=>{var Xe=Nl();let ut;var pt=d(Xe),ft=d(pt);tr(ft,()=>s(at).icon,(Z,ee)=>{ee(Z,{size:16})}),o(pt);var De=g(pt,2),z=d(De,!0);o(De);var q=g(De,2);{var j=Z=>{var ee=Tl(),ue=d(ee,!0);o(ee),le(()=>ge(ue,s(at).shortcut)),m(Z,ee)};Q(q,Z=>{s(at).shortcut&&Z(j)})}o(Xe),le(()=>{ot(Xe,"id",`cmd-item-${s(at).id??""}`),ut=it(Xe,1,"command-palette-item svelte-1g6akjj",null,ut,{selected:s(at).globalIndex===s(u)}),ot(Xe,"aria-selected",s(at).globalIndex===s(u)),ge(z,s(at).label)}),F("click",Xe,()=>C(s(at))),Qa("mouseenter",Xe,()=>{b(u,s(at).globalIndex,!0)}),m(rt,Xe)}),le(()=>ge(Le,s(J).category)),m(tt,Pe)}),m(se,$e)};Q(et,se=>{s(h).length===0?se(qe):se(Ne,!1)})}o(Re),Je(2),o(O),o(E),le(()=>ot(ne,"aria-activedescendant",s(h).length>0?`cmd-item-${s(h)[s(u)]?.id}`:void 0)),F("click",E,B),F("keydown",ne,T),$t(ne,()=>s(i),se=>b(i,se)),m(k,E)};Q(de,k=>{n()&&k($)})}m(t,te),cn(),a()}xn(["click","keydown"]);function Ml(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M10 8h.01"}],["path",{d:"M12 12h.01"}],["path",{d:"M14 8h.01"}],["path",{d:"M16 12h.01"}],["path",{d:"M18 8h.01"}],["path",{d:"M6 8h.01"}],["path",{d:"M7 16h10"}],["path",{d:"M8 12h.01"}],["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2"}]];Et(t,Tt({name:"keyboard"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}var Cl=w('+'),Ol=w(' ',1),Il=w('
    '),Pl=w('
    '),Ll=w('
    ');function Dl(t,e){on(e,!1);const n=()=>ct(Wa,"$shortcutsModalOpen",r),[r,a]=_n(),i=typeof navigator<"u"&&/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"⌘":"Ctrl",u=[{category:"General",shortcuts:[{keys:`${i} + K`,description:"Open command palette"},{keys:`${i} + ,`,description:"Open settings"},{keys:`${i} + /`,description:"Toggle AI assistant"},{keys:"?",description:"Show keyboard shortcuts"},{keys:"Esc",description:"Close modal / palette"}]},{category:"Pipeline",shortcuts:[{keys:`${i} + Enter`,description:"Run pipeline"},{keys:`${i} + Shift + D`,description:"Toggle debug mode"}]},{category:"Canvas",shortcuts:[{keys:"Delete / Backspace",description:"Remove selected node"},{keys:`${i} + D`,description:"Duplicate selected node"},{keys:"Space (hold)",description:"Pan canvas"},{keys:`${i} + +`,description:"Zoom in"},{keys:`${i} + -`,description:"Zoom out"}]}];function p(){Wa.set(!1)}function f(T){T.target===T.currentTarget&&p()}function h(T){T.key==="Escape"&&(T.preventDefault(),p())}er();var y=Ye(),_=fe(y);{var C=T=>{var I=Ll(),B=d(I),te=d(B),de=d(te),$=d(de);Ml($,{size:18}),Je(2),o(de),Je(2),o(te);var k=g(te,2);gt(k,5,()=>u,xt,(E,O)=>{var G=Pl(),oe=d(G),ne=d(oe,!0);o(oe);var Re=g(oe,2);gt(Re,1,()=>s(O).shortcuts,xt,(et,qe)=>{var Ne=Il(),se=d(Ne),$e=d(se,!0);o(se);var Ce=g(se,2);gt(Ce,5,()=>s(qe).keys.split(" + "),xt,(tt,J,Pe)=>{var Oe=Ol(),Le=fe(Oe);{var Ze=Xe=>{var ut=Cl();m(Xe,ut)};Q(Le,Xe=>{Pe>0&&Xe(Ze)})}var rt=g(Le,2),at=d(rt,!0);o(rt),le(Xe=>ge(at,Xe),[()=>s(J).trim()]),m(tt,Oe)}),o(Ce),o(Ne),le(()=>ge($e,s(qe).description)),m(et,Ne)}),o(G),le(()=>ge(ne,s(O).category)),m(E,G)}),o(k),o(B),o(I),F("click",I,f),F("keydown",I,h),m(T,I)};Q(_,T=>{n()&&T(C)})}m(t,y),cn(),a()}xn(["click","keydown"]);var Bl=w(' Configured'),jl=w('
    '),Ul=w('
    '),Hl=w('
    '),Fl=w('
    '),Gl=w('

    Your Information

    The assistant will use this to personalise interactions.

    Assistant Personality

    '),Kl=w('
    ');function ql(t,e){on(e,!0);const n=()=>ct(ea,"$settingsModalOpen",a),r=()=>ct(Vs,"$settingsData",a),[a,c]=_n(),i=[{id:"openai",label:"OpenAI",fields:[{key:"openai_api_key",label:"API Key",placeholder:"sk-..."}]},{id:"anthropic",label:"Anthropic",fields:[{key:"anthropic_api_key",label:"API Key",placeholder:"sk-ant-..."}]},{id:"google",label:"Google Gemini",fields:[{key:"google_api_key",label:"API Key",placeholder:"AIza..."}]},{id:"groq",label:"Groq",fields:[{key:"groq_api_key",label:"API Key",placeholder:"gsk_..."}]},{id:"mistral",label:"Mistral",fields:[{key:"mistral_api_key",label:"API Key",placeholder:"API key"}]},{id:"deepseek",label:"DeepSeek",fields:[{key:"deepseek_api_key",label:"API Key",placeholder:"API key"}]},{id:"cohere",label:"Cohere",fields:[{key:"cohere_api_key",label:"API Key",placeholder:"API key"}]},{id:"azure",label:"Azure OpenAI",fields:[{key:"azure_openai_api_key",label:"API Key",placeholder:"API key"},{key:"azure_openai_endpoint",label:"Endpoint URL",placeholder:"https://your-resource.openai.azure.com/"}]},{id:"bedrock",label:"Amazon Bedrock",fields:[{key:"aws_access_key_id",label:"Access Key ID",placeholder:"AKIA..."},{key:"aws_secret_access_key",label:"Secret Access Key",placeholder:"Secret key"},{key:"aws_default_region",label:"Region",placeholder:"us-east-1"}]},{id:"ollama",label:"Ollama",fields:[{key:"ollama_base_url",label:"Base URL",placeholder:"http://localhost:11434"}]}];let u=ve("credentials"),p=ve(!1),f=ve(On({})),h=ve("openai:gpt-4o"),y=ve(.7),_=ve(3),C=ve(""),T=ve(""),I=ve(""),B=ve("The Architect");In(()=>{n()&&r()&&(b(f,{},!0),b(h,r().model_defaults.default_model,!0),b(y,r().model_defaults.temperature,!0),b(_,r().model_defaults.retries,!0),r().user_profile&&(b(C,r().user_profile.name||"",!0),b(T,r().user_profile.role||"",!0),b(I,r().user_profile.context||"",!0),b(B,r().user_profile.assistant_name||"The Architect",!0)),b(u,"credentials"))});function te(ne){if(!r())return!1;const Re=r().credentials[ne];return Re!=null}function de(){ea.set(!1)}async function $(){b(p,!0);try{const ne={};for(const[et,qe]of Object.entries(s(f)))qe.trim()&&(ne[et]=qe.trim());const Re={name:s(C).trim(),role:s(T).trim(),context:s(I).trim(),assistant_name:s(B).trim()||"The Architect"};await Ga(Object.keys(ne).length>0?ne:null,{default_model:s(h),temperature:s(y),retries:s(_)},!0,Re),de()}catch{}finally{b(p,!1)}}function k(ne){ne.target===ne.currentTarget&&de()}function E(ne){ne.key==="Escape"&&(ne.preventDefault(),de())}var O=Ye(),G=fe(O);{var oe=ne=>{var Re=Kl(),et=d(Re),qe=d(et),Ne=d(qe),se=d(Ne);es(se,{size:18}),Je(2),o(Ne),Je(2),o(qe);var $e=g(qe,2),Ce=d($e);let tt;var J=g(Ce,2);let Pe;var Oe=g(J,2);let Le;o($e);var Ze=g($e,2),rt=d(Ze);{var at=q=>{var j=Hl();gt(j,21,()=>i,xt,(Z,ee)=>{var ue=Ul();let be;var Ee=d(ue),_e=d(Ee),we=d(_e,!0);o(_e);var R=g(_e,2);{var W=he=>{var me=Bl(),ze=d(me);Fn(ze,{size:10}),Je(),o(me),m(he,me)},U=_t(()=>s(ee).fields.every(he=>te(he.key)));Q(R,he=>{s(U)&&he(W)})}o(Ee);var ye=g(Ee,2);gt(ye,17,()=>s(ee).fields,xt,(he,me)=>{var ze=jl(),Ie=d(ze),Te=d(Ie,!0);o(Ie);var bt=g(Ie,2);Mt(bt),o(ze),le(Ot=>{ot(Ie,"for",`settings-${s(me).key??""}`),ge(Te,s(me).label),ot(bt,"id",`settings-${s(me).key??""}`),ot(bt,"placeholder",Ot),Ys(bt,s(f)[s(me).key]??"")},[()=>te(s(me).key)?"••••••••":s(me).placeholder]),F("input",bt,Ot=>{s(f)[s(me).key]=Ot.target.value}),m(he,ze)}),o(ue),le(he=>{be=it(ue,1,"provider-section svelte-1hvu725",null,be,he),ge(we,s(ee).label)},[()=>({configured:s(ee).fields.every(he=>te(he.key))})]),m(Z,ue)}),o(j),m(q,j)},Xe=q=>{var j=Fl(),Z=d(j),ee=g(d(Z),2);Zs(ee,{placeholder:"Select or type a model...",get value(){return s(h)},set value(W){b(h,W,!0)}}),o(Z);var ue=g(Z,2),be=d(ue),Ee=d(be);o(be);var _e=g(be,2);Mt(_e),o(ue);var we=g(ue,2),R=g(d(we),2);Mt(R),o(we),o(j),le(W=>ge(Ee,`Temperature: ${W??""}`),[()=>s(y).toFixed(2)]),$t(_e,()=>s(y),W=>b(y,W)),$t(R,()=>s(_),W=>b(_,W)),m(q,j)},ut=q=>{var j=Gl(),Z=d(j),ee=g(d(Z),4),ue=d(ee),be=g(d(ue),2);Mt(be),o(ue);var Ee=g(ue,2),_e=g(d(Ee),2);Mt(_e),o(Ee),o(ee);var we=g(ee,2),R=g(d(we),2);_a(R),o(we),o(Z);var W=g(Z,2),U=g(d(W),2),ye=d(U);{var he=Te=>{var bt=Jn("The Architect speaks with measured authority and philosophical precision.");m(Te,bt)},me=Te=>{var bt=Jn("Uses a friendly, helpful personality.");m(Te,bt)};Q(ye,Te=>{s(B)==="The Architect"?Te(he):Te(me,!1)})}o(U);var ze=g(U,2),Ie=g(d(ze),2);Mt(Ie),o(ze),o(W),o(j),$t(be,()=>s(C),Te=>b(C,Te)),$t(_e,()=>s(T),Te=>b(T,Te)),$t(R,()=>s(I),Te=>b(I,Te)),$t(Ie,()=>s(B),Te=>b(B,Te)),m(q,j)};Q(rt,q=>{s(u)==="credentials"?q(at):s(u)==="model"?q(Xe,1):q(ut,!1)})}o(Ze);var pt=g(Ze,2),ft=d(pt),De=g(ft,2),z=d(De,!0);o(De),o(pt),o(et),o(Re),le(()=>{tt=it(Ce,1,"settings-tab svelte-1hvu725",null,tt,{active:s(u)==="credentials"}),Pe=it(J,1,"settings-tab svelte-1hvu725",null,Pe,{active:s(u)==="model"}),Le=it(Oe,1,"settings-tab svelte-1hvu725",null,Le,{active:s(u)==="profile"}),De.disabled=s(p),ge(z,s(p)?"Saving...":"Save Settings")}),F("click",Re,k),F("keydown",Re,E),F("click",Ce,()=>b(u,"credentials")),F("click",J,()=>b(u,"model")),F("click",Oe,()=>b(u,"profile")),F("click",ft,de),F("click",De,$),m(ne,Re)};Q(G,ne=>{n()&&ne(oe)})}m(t,O),cn(),c()}xn(["click","keydown","input"]);function Zl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4"}],["path",{d:"m21 2-9.6 9.6"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5"}]];Et(t,Tt({name:"key"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Wl(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"}],["circle",{cx:"12",cy:"7",r:"4"}]];Et(t,Tt({name:"user"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}var Vl=w(''),Yl=w("
    "),Xl=w('
    '),Ql=w(`

    Welcome to Firefly Agentic Studio

    Build, test, and deploy AI agent pipelines visually. - We'll help you configure your AI providers in just a few steps.

    Visual pipeline builder
    Multi-provider AI support
    Local credential storage
    `),Jl=w(''),eo=w(''),to=w('

    Select at least one provider to continue

    '),no=w('

    Choose your AI providers

    Select the providers you have API keys for. You can add more later in Settings.

    ',1),ao=w('
    '),so=w('
    '),ro=w('

    Enter your API keys

    Credentials are stored locally at ~/.firefly-studio/settings.json and never sent to our servers.

    ',1),io=w('This will be used for all new agent nodes'),lo=w('

    Configure defaults

    Choose the default model for new agent nodes. You can override per-node later.

    ',1),oo=w('

    Personalise your experience

    Tell us about yourself so the AI assistant can address you properly and provide contextual help.

    ',1),co=w(`

    as default. The Architect and The Oracle are ready. - The Architect will build your pipelines, and The Oracle will guide your decisions.

    You can change these anytime from the Settings menu.

    `),uo=w(' ',1),po=w('
    ',1),go=w(''),vo=w(''),ho=w(' ',1),fo=w('
    ');function bo(t,e){on(e,!0);const n=()=>ct(va,"$firstStartWizardOpen",r),[r,a]=_n(),c=[{id:"openai",label:"OpenAI",description:"GPT-4.1, o3, o4-mini",fields:[{key:"openai_api_key",label:"API Key",placeholder:"sk-..."}]},{id:"anthropic",label:"Anthropic",description:"Claude Sonnet, Opus, Haiku",fields:[{key:"anthropic_api_key",label:"API Key",placeholder:"sk-ant-..."}]},{id:"google",label:"Google Gemini",description:"Gemini 2.5 Pro & Flash",fields:[{key:"google_api_key",label:"API Key",placeholder:"AIza..."}]},{id:"groq",label:"Groq",description:"Fast Llama & Mixtral",fields:[{key:"groq_api_key",label:"API Key",placeholder:"gsk_..."}]},{id:"mistral",label:"Mistral",description:"Mistral Large & Codestral",fields:[{key:"mistral_api_key",label:"API Key",placeholder:"API key"}]},{id:"deepseek",label:"DeepSeek",description:"DeepSeek Chat & Reasoner",fields:[{key:"deepseek_api_key",label:"API Key",placeholder:"API key"}]},{id:"cohere",label:"Cohere",description:"Command R & R+",fields:[{key:"cohere_api_key",label:"API Key",placeholder:"API key"}]},{id:"azure",label:"Azure OpenAI",description:"Azure-hosted OpenAI models",fields:[{key:"azure_openai_api_key",label:"API Key",placeholder:"API key"},{key:"azure_openai_endpoint",label:"Endpoint URL",placeholder:"https://your-resource.openai.azure.com/"}]},{id:"bedrock",label:"Amazon Bedrock",description:"AWS-hosted foundation models",fields:[{key:"aws_access_key_id",label:"Access Key ID",placeholder:"AKIA..."},{key:"aws_secret_access_key",label:"Secret Access Key",placeholder:"Secret key"},{key:"aws_default_region",label:"Region",placeholder:"us-east-1"}]},{id:"ollama",label:"Ollama",description:"Local open-source models",fields:[{key:"ollama_base_url",label:"Base URL",placeholder:"http://localhost:11434"}]}],i=[{label:"Welcome"},{label:"Providers"},{label:"API Keys"},{label:"Defaults"},{label:"Profile"},{label:"Ready"}];let u=ve(0),p=ve(On(new Set)),f=On({}),h=ve(""),y=ve(.7),_=ve(3),C=ve(!1),T=ve(""),I=ve(""),B=ve("");const te=i.length;function de(){if(s(h))return;const Ne=["anthropic","openai","google","groq","mistral","deepseek","cohere","azure","bedrock","ollama"];for(const se of Ne)if(s(p).has(se)){const $e=bi(se);if($e){b(h,$e.id,!0);return}}}function $(Ne){const se=new Set(s(p));se.has(Ne)?se.delete(Ne):se.add(Ne),b(p,se,!0)}function k(){return c.filter(Ne=>s(p).has(Ne.id))}function E(){s(u)===1&&s(p).size===0||s(u)0&&Ba(u,-1)}async function G(){b(C,!0);try{const Ne={};for(const[$e,Ce]of Object.entries(f))Ce.trim()&&(Ne[$e]=Ce.trim());const se={};s(T).trim()&&(se.name=s(T).trim()),s(I).trim()&&(se.role=s(I).trim()),s(B).trim()&&(se.context=s(B).trim()),se.assistant_name="The Architect",await Ga(Object.keys(Ne).length>0?Ne:null,{default_model:s(h),temperature:s(y),retries:s(_)},!0,Object.keys(se).length>0?se:null),b(u,te-1)}catch{}finally{b(C,!1)}}async function oe(){try{await Ga(null,null,!0)}catch{}va.set(!1)}async function ne(){await Xs(),va.set(!1)}var Re=Ye(),et=fe(Re);{var qe=Ne=>{var se=fo(),$e=d(se),Ce=d($e);gt(Ce,21,()=>i,xt,(z,q,j)=>{var Z=Xl();let ee;var ue=d(Z),be=d(ue);{var Ee=W=>{Fn(W,{size:10})},_e=W=>{var U=Vl();U.textContent=j+1,m(W,U)};Q(be,W=>{j{var U=Yl();let ye;le(()=>ye=it(U,1,"wizard-step-line svelte-tj3wu",null,ye,{filled:j{jee=it(Z,1,"wizard-step-indicator svelte-tj3wu",null,ee,{active:j===s(u),completed:j{var q=Ql(),j=d(q),Z=g(j,6),ee=d(Z),ue=d(ee);Ua(ue,{size:16}),Je(2),o(ee);var be=g(ee,2),Ee=d(be);Ss(Ee,{size:16}),Je(2),o(be);var _e=g(be,2),we=d(_e);Zl(we,{size:16}),Je(2),o(_e),o(Z),o(q),le(()=>ot(j,"src",ss)),m(z,q)},Oe=z=>{var q=no(),j=g(fe(q),4);gt(j,21,()=>c,xt,(ue,be)=>{var Ee=eo();let _e;var we=d(Ee);{var R=ze=>{var Ie=Jl(),Te=d(Ie);Fn(Te,{size:10}),o(Ie),m(ze,Ie)},W=_t(()=>s(p).has(s(be).id));Q(we,ze=>{s(W)&&ze(R)})}var U=g(we,2),ye=d(U,!0);o(U);var he=g(U,2),me=d(he,!0);o(he),o(Ee),le(ze=>{_e=it(Ee,1,"wizard-provider-card svelte-tj3wu",null,_e,ze),ge(ye,s(be).label),ge(me,s(be).description)},[()=>({selected:s(p).has(s(be).id)})]),F("click",Ee,()=>$(s(be).id)),m(ue,Ee)}),o(j);var Z=g(j,2);{var ee=ue=>{var be=to();m(ue,be)};Q(Z,ue=>{s(p).size===0&&ue(ee)})}m(z,q)},Le=z=>{var q=ro(),j=g(fe(q),4);gt(j,21,k,xt,(Z,ee)=>{var ue=so(),be=d(ue),Ee=d(be,!0);o(be);var _e=g(be,2);gt(_e,17,()=>s(ee).fields,xt,(we,R)=>{var W=ao(),U=d(W),ye=d(U,!0);o(U);var he=g(U,2);Mt(he),o(W),le(()=>{ot(U,"for",`wizard-${s(R).key??""}`),ge(ye,s(R).label),ot(he,"id",`wizard-${s(R).key??""}`),ot(he,"placeholder",s(R).placeholder),Ys(he,f[s(R).key]??"")}),F("input",he,me=>{f[s(R).key]=me.target.value}),m(we,W)}),o(ue),le(()=>ge(Ee,s(ee).label)),m(Z,ue)}),o(j),m(z,q)},Ze=z=>{var q=lo(),j=g(fe(q),4),Z=d(j),ee=g(d(Z),2);Zs(ee,{placeholder:"Select or type a model...",get value(){return s(h)},set value(me){b(h,me,!0)}});var ue=g(ee,2);{var be=me=>{var ze=io();m(me,ze)};Q(ue,me=>{s(h)&&me(be)})}o(Z);var Ee=g(Z,2),_e=d(Ee),we=g(d(_e),2),R=d(we);Mt(R);var W=g(R,2),U=d(W,!0);o(W),o(we),o(_e);var ye=g(_e,2),he=g(d(ye),2);Mt(he),o(ye),o(Ee),o(j),le(me=>ge(U,me),[()=>s(y).toFixed(2)]),$t(R,()=>s(y),me=>b(y,me)),$t(he,()=>s(_),me=>b(_,me)),m(z,q)},rt=z=>{var q=oo(),j=g(fe(q),4),Z=d(j),ee=d(Z),ue=g(d(ee),2);Mt(ue),o(ee);var be=g(ee,2),Ee=g(d(be),2);Mt(Ee),o(be),o(Z);var _e=g(Z,2),we=g(d(_e),2);_a(we),o(_e),o(j),$t(ue,()=>s(T),R=>b(T,R)),$t(Ee,()=>s(I),R=>b(I,R)),$t(we,()=>s(B),R=>b(B,R)),m(z,q)},at=z=>{var q=co(),j=d(q),Z=d(j);Fn(Z,{size:32}),o(j);var ee=g(j,2),ue=d(ee);{var be=U=>{var ye=Jn();le(()=>ge(ye,`Welcome, ${s(T)??""}!`)),m(U,ye)},Ee=U=>{var ye=Jn("You're all set!");m(U,ye)};Q(ue,U=>{s(T)?U(be):U(Ee,!1)})}o(ee);var _e=g(ee,2),we=d(_e),R=g(we),W=d(R,!0);o(R),Je(5),o(_e),Je(2),o(q),le(U=>{ge(we,`Your ${s(p).size??""} provider${s(p).size!==1?"s are":" is"} configured - with `),ge(W,U)},[()=>s(h)?s(h).split(":")[1]:"default model"]),m(z,q)};Q(J,z=>{s(u)===0?z(Pe):s(u)===1?z(Oe,1):s(u)===2?z(Le,2):s(u)===3?z(Ze,3):s(u)===4?z(rt,4):z(at,!1)})}o(tt);var Xe=g(tt,2),ut=d(Xe);{var pt=z=>{var q=uo(),j=fe(q),Z=g(j,2);F("click",j,oe),F("click",Z,E),m(z,q)},ft=z=>{var q=po(),j=g(fe(q),2),Z=d(j);Ss(Z,{size:14}),Je(),o(j),F("click",j,ne),m(z,q)},De=z=>{var q=ho(),j=fe(q),Z=d(j),ee=g(Z,2);o(j);var ue=g(j,2);{var be=_e=>{var we=go(),R=d(we,!0);o(we),le(()=>{we.disabled=s(C)||!s(h),ge(R,s(C)?"Saving...":"Finish Setup")}),F("click",we,G),m(_e,we)},Ee=_e=>{var we=vo();le(()=>we.disabled=s(u)===1&&s(p).size===0),F("click",we,E),m(_e,we)};Q(ue,_e=>{s(u)===4?_e(be):_e(Ee,!1)})}F("click",Z,oe),F("click",ee,O),m(z,q)};Q(ut,z=>{s(u)===0?z(pt):s(u)===te-1?z(ft,1):z(De,!1)})}o(Xe),o($e),o(se),m(Ne,se)};Q(et,Ne=>{n()&&Ne(qe)})}m(t,Re),cn(),a()}xn(["click","input"]);var mo=w(''),_o=w('
    ');function yo(t,e){on(e,!1);const n=()=>ct(mi,"$toasts",r),[r,a]=_n(),c={success:Fn,error:ki,warning:yi,info:_i},i={success:"var(--color-success)",error:"var(--color-error)",warning:"var(--color-warning)",info:"var(--color-info)"};er();var u=Ye(),p=fe(u);{var f=h=>{var y=_o();gt(y,5,n,_=>_.id,(_,C)=>{var T=mo();let I;var B=d(T),te=d(B);tr(te,()=>c[s(C).type],(O,G)=>{G(O,{size:16})}),o(B);var de=g(B,2),$=d(de,!0);o(de);var k=g(de,2),E=d(k);Ka(E,{size:14}),o(k),o(T),le(()=>{I=Qs(T,"",I,{"--toast-color":i[s(C).type]}),ge($,s(C).message)}),F("click",k,()=>wi(s(C).id)),xi(3,T,()=>Ei,()=>({y:16,duration:200})),m(_,T)}),o(y),m(h,y)};Q(p,h=>{n().length>0&&h(f)})}m(t,u),cn(),a()}xn(["click"]);function ko(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"}],["circle",{cx:"12",cy:"13",r:"3"}]];Et(t,Tt({name:"camera"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function wo(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5"}],["path",{d:"M8 13h2"}],["path",{d:"M14 13h2"}],["path",{d:"M8 17h2"}],["path",{d:"M14 17h2"}]];Et(t,Tt({name:"file-spreadsheet"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function xo(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"}],["path",{d:"M9 3v18"}],["path",{d:"m16 15-3-3 3-3"}]];Et(t,Tt({name:"panel-left-close"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function Eo(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551"}]];Et(t,Tt({name:"paperclip"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function So(t,e){const n=At(e,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M2 3h20"}],["path",{d:"M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3"}],["path",{d:"m7 21 5-5 5 5"}]];Et(t,Tt({name:"presentation"},()=>n,{get iconNode(){return r},children:(a,c)=>{var i=Ye(),u=fe(i);St(u,e,"default",{}),m(a,i)},$$slots:{default:!0}}))}function rs(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Dn=rs();function sr(t){Dn=t}var Cn={exec:()=>null};function Ue(t,e=""){let n=typeof t=="string"?t:t.source,r={replace:(a,c)=>{let i=typeof c=="string"?c:c.source;return i=i.replace(zt.caret,"$1"),n=n.replace(a,i),r},getRegex:()=>new RegExp(n,e)};return r}var Ao=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}>`)},To=/^(?:[ \t]*(?:\n|$))+/,No=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Ro=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ta=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,$o=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,is=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,rr=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ir=Ue(rr).replace(/bull/g,is).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),zo=Ue(rr).replace(/bull/g,is).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),ls=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Mo=/^[^\n]+/,os=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Co=Ue(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",os).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Oo=Ue(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,is).getRegex(),ya="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",cs=/|$))/,Io=Ue("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",cs).replace("tag",ya).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),lr=Ue(ls).replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",ya).getRegex(),Po=Ue(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",lr).getRegex(),ds={blockquote:Po,code:No,def:Co,fences:Ro,heading:$o,hr:ta,html:Io,lheading:ir,list:Oo,newline:To,paragraph:lr,table:Cn,text:Mo},Ns=Ue("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",ya).getRegex(),Lo={...ds,lheading:zo,table:Ns,paragraph:Ue(ls).replace("hr",ta).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Ns).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",ya).getRegex()},Do={...ds,html:Ue(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",cs).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Cn,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Ue(ls).replace("hr",ta).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",ir).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Bo=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,jo=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,or=/^( {2,}|\\)\n(?!\s*$)/,Uo=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Ao?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),pr=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Wo=Ue(pr,"u").replace(/punct/g,ka).getRegex(),Vo=Ue(pr,"u").replace(/punct/g,dr).getRegex(),gr="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Yo=Ue(gr,"gu").replace(/notPunctSpace/g,cr).replace(/punctSpace/g,us).replace(/punct/g,ka).getRegex(),Xo=Ue(gr,"gu").replace(/notPunctSpace/g,Go).replace(/punctSpace/g,Fo).replace(/punct/g,dr).getRegex(),Qo=Ue("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,cr).replace(/punctSpace/g,us).replace(/punct/g,ka).getRegex(),Jo=Ue(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,ur).getRegex(),ec="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",tc=Ue(ec,"gu").replace(/notPunctSpace/g,qo).replace(/punctSpace/g,Ko).replace(/punct/g,ur).getRegex(),nc=Ue(/\\(punct)/,"gu").replace(/punct/g,ka).getRegex(),ac=Ue(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),sc=Ue(cs).replace("(?:-->|$)","-->").getRegex(),rc=Ue("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",sc).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ha=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,ic=Ue(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",ha).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),vr=Ue(/^!?\[(label)\]\[(ref)\]/).replace("label",ha).replace("ref",os).getRegex(),hr=Ue(/^!?\[(ref)\](?:\[\])?/).replace("ref",os).getRegex(),lc=Ue("reflink|nolink(?!\\()","g").replace("reflink",vr).replace("nolink",hr).getRegex(),Rs=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,ps={_backpedal:Cn,anyPunctuation:nc,autolink:ac,blockSkip:Zo,br:or,code:jo,del:Cn,delLDelim:Cn,delRDelim:Cn,emStrongLDelim:Wo,emStrongRDelimAst:Yo,emStrongRDelimUnd:Qo,escape:Bo,link:ic,nolink:hr,punctuation:Ho,reflink:vr,reflinkSearch:lc,tag:rc,text:Uo,url:Cn},oc={...ps,link:Ue(/^!?\[(label)\]\((.*?)\)/).replace("label",ha).getRegex(),reflink:Ue(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",ha).getRegex()},Va={...ps,emStrongRDelimAst:Xo,emStrongLDelim:Vo,delLDelim:Jo,delRDelim:tc,url:Ue(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Rs).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Ue(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},$s=t=>dc[t];function ln(t,e){if(e){if(zt.escapeTest.test(t))return t.replace(zt.escapeReplace,$s)}else if(zt.escapeTestNoEncode.test(t))return t.replace(zt.escapeReplaceNoEncode,$s);return t}function zs(t){try{t=encodeURI(t).replace(zt.percentDecode,"%")}catch{return null}return t}function Ms(t,e){let n=t.replace(zt.findPipe,(c,i,u)=>{let p=!1,f=i;for(;--f>=0&&u[f]==="\\";)p=!p;return p?"|":" |"}),r=n.split(zt.splitPipe),a=0;if(r[0].trim()||r.shift(),r.length>0&&!r.at(-1)?.trim()&&r.pop(),e)if(r.length>e)r.splice(e);else for(;r.length0?-2:-1}function pc(t,e=0){let n=e,r="";for(let a of t)if(a===" "){let c=4-n%4;r+=" ".repeat(c),n+=c}else r+=a,n++;return r}function Cs(t,e,n,r,a){let c=e.href,i=e.title||null,u=t[1].replace(a.other.outputLinkReplace,"$1");r.state.inLink=!0;let p={type:t[0].charAt(0)==="!"?"image":"link",raw:n,href:c,title:i,text:u,tokens:r.inlineTokens(u)};return r.state.inLink=!1,p}function gc(t,e,n){let r=t.match(n.other.indentCodeCompensation);if(r===null)return e;let a=r[1];return e.split(` -`).map(c=>{let i=c.match(n.other.beginningSpace);if(i===null)return c;let[u]=i;return u.length>=a.length?c.slice(a.length):c}).join(` -`)}var fa=class{options;rules;lexer;constructor(t){this.options=t||Dn}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let n=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Vn(n,` -`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let n=e[0],r=gc(n,e[3]||"",this.rules);return{type:"code",raw:n,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:r}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let n=e[2].trim();if(this.rules.other.endingHash.test(n)){let r=Vn(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:Vn(e[0],` -`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let n=Vn(e[0],` -`).split(` -`),r="",a="",c=[];for(;n.length>0;){let i=!1,u=[],p;for(p=0;p1,a={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");let c=this.rules.other.listItemRegex(n),i=!1;for(;t;){let p=!1,f="",h="";if(!(e=c.exec(t))||this.rules.block.hr.test(t))break;f=e[0],t=t.substring(f.length);let y=pc(e[2].split(` -`,1)[0],e[1].length),_=t.split(` -`,1)[0],C=!y.trim(),T=0;if(this.options.pedantic?(T=2,h=y.trimStart()):C?T=e[1].length+1:(T=y.search(this.rules.other.nonSpaceChar),T=T>4?1:T,h=y.slice(T),T+=e[1].length),C&&this.rules.other.blankLine.test(_)&&(f+=_+` -`,t=t.substring(_.length+1),p=!0),!p){let I=this.rules.other.nextBulletRegex(T),B=this.rules.other.hrRegex(T),te=this.rules.other.fencesBeginRegex(T),de=this.rules.other.headingBeginRegex(T),$=this.rules.other.htmlBeginRegex(T),k=this.rules.other.blockquoteBeginRegex(T);for(;t;){let E=t.split(` -`,1)[0],O;if(_=E,this.options.pedantic?(_=_.replace(this.rules.other.listReplaceNesting," "),O=_):O=_.replace(this.rules.other.tabCharGlobal," "),te.test(_)||de.test(_)||$.test(_)||k.test(_)||I.test(_)||B.test(_))break;if(O.search(this.rules.other.nonSpaceChar)>=T||!_.trim())h+=` -`+O.slice(T);else{if(C||y.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||te.test(y)||de.test(y)||B.test(y))break;h+=` -`+_}C=!_.trim(),f+=E+` -`,t=t.substring(E.length+1),y=O.slice(T)}}a.loose||(i?a.loose=!0:this.rules.other.doubleBlankLine.test(f)&&(i=!0)),a.items.push({type:"list_item",raw:f,task:!!this.options.gfm&&this.rules.other.listIsTask.test(h),loose:!1,text:h,tokens:[]}),a.raw+=f}let u=a.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;a.raw=a.raw.trimEnd();for(let p of a.items){if(this.lexer.state.top=!1,p.tokens=this.lexer.blockTokens(p.text,[]),p.task){if(p.text=p.text.replace(this.rules.other.listReplaceTask,""),p.tokens[0]?.type==="text"||p.tokens[0]?.type==="paragraph"){p.tokens[0].raw=p.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),p.tokens[0].text=p.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}}let f=this.rules.other.listTaskCheckbox.exec(p.raw);if(f){let h={type:"checkbox",raw:f[0]+" ",checked:f[0]!=="[ ]"};p.checked=h.checked,a.loose?p.tokens[0]&&["paragraph","text"].includes(p.tokens[0].type)&&"tokens"in p.tokens[0]&&p.tokens[0].tokens?(p.tokens[0].raw=h.raw+p.tokens[0].raw,p.tokens[0].text=h.raw+p.tokens[0].text,p.tokens[0].tokens.unshift(h)):p.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):p.tokens.unshift(h)}}if(!a.loose){let f=p.tokens.filter(y=>y.type==="space"),h=f.length>0&&f.some(y=>this.rules.other.anyLine.test(y.raw));a.loose=h}}if(a.loose)for(let p of a.items){p.loose=!0;for(let f of p.tokens)f.type==="text"&&(f.type="paragraph")}return a}}html(t){let e=this.rules.block.html.exec(t);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(t){let e=this.rules.block.def.exec(t);if(e){let n=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",a=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:n,raw:e[0],href:r,title:a}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let n=Ms(e[1]),r=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),a=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` -`):[],c={type:"table",raw:e[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let i of r)this.rules.other.tableAlignRight.test(i)?c.align.push("right"):this.rules.other.tableAlignCenter.test(i)?c.align.push("center"):this.rules.other.tableAlignLeft.test(i)?c.align.push("left"):c.align.push(null);for(let i=0;i({text:u,tokens:this.lexer.inline(u),header:!1,align:c.align[p]})));return c}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let n=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:n,tokens:this.lexer.inline(n)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let n=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let c=Vn(n.slice(0,-1),"\\");if((n.length-c.length)%2===0)return}else{let c=uc(e[2],"()");if(c===-2)return;if(c>-1){let i=(e[0].indexOf("!")===0?5:4)+e[1].length+c;e[2]=e[2].substring(0,c),e[0]=e[0].substring(0,i).trim(),e[3]=""}}let r=e[2],a="";if(this.options.pedantic){let c=this.rules.other.pedanticHrefTitle.exec(r);c&&(r=c[1],a=c[3])}else a=e[3]?e[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),Cs(e,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:a&&a.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let n;if((n=this.rules.inline.reflink.exec(t))||(n=this.rules.inline.nolink.exec(t))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),a=e[r.toLowerCase()];if(!a){let c=n[0].charAt(0);return{type:"text",raw:c,text:c}}return Cs(n,a,n[0],this.lexer,this.rules)}}emStrong(t,e,n=""){let r=this.rules.inline.emStrongLDelim.exec(t);if(!(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(r[1]||r[2])||!n||this.rules.inline.punctuation.exec(n))){let a=[...r[0]].length-1,c,i,u=a,p=0,f=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(f.lastIndex=0,e=e.slice(-1*t.length+a);(r=f.exec(e))!=null;){if(c=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!c)continue;if(i=[...c].length,r[3]||r[4]){u+=i;continue}else if((r[5]||r[6])&&a%3&&!((a+i)%3)){p+=i;continue}if(u-=i,u>0)continue;i=Math.min(i,i+u+p);let h=[...r[0]][0].length,y=t.slice(0,a+r.index+h+i);if(Math.min(a,i)%2){let C=y.slice(1,-1);return{type:"em",raw:y,text:C,tokens:this.lexer.inlineTokens(C)}}let _=y.slice(2,-2);return{type:"strong",raw:y,text:_,tokens:this.lexer.inlineTokens(_)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let n=e[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(n),a=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&a&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:e[0],text:n}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t,e,n=""){let r=this.rules.inline.delLDelim.exec(t);if(r&&(!r[1]||!n||this.rules.inline.punctuation.exec(n))){let a=[...r[0]].length-1,c,i,u=a,p=this.rules.inline.delRDelim;for(p.lastIndex=0,e=e.slice(-1*t.length+a);(r=p.exec(e))!=null;){if(c=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!c||(i=[...c].length,i!==a))continue;if(r[3]||r[4]){u+=i;continue}if(u-=i,u>0)continue;i=Math.min(i,i+u);let f=[...r[0]][0].length,h=t.slice(0,a+r.index+f+i),y=h.slice(a,-a);return{type:"del",raw:h,text:y,tokens:this.lexer.inlineTokens(y)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let n,r;return e[2]==="@"?(n=e[1],r="mailto:"+n):(n=e[1],r=n),{type:"link",raw:e[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let n,r;if(e[2]==="@")n=e[0],r="mailto:"+n;else{let a;do a=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(a!==e[0]);n=e[0],e[1]==="www."?r="http://"+e[0]:r=e[0]}return{type:"link",raw:e[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let n=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:n}}}},Vt=class Ya{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Dn,this.options.tokenizer=this.options.tokenizer||new fa,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:zt,block:ca.normal,inline:Wn.normal};this.options.pedantic?(n.block=ca.pedantic,n.inline=Wn.pedantic):this.options.gfm&&(n.block=ca.gfm,this.options.breaks?n.inline=Wn.breaks:n.inline=Wn.gfm),this.tokenizer.rules=n}static get rules(){return{block:ca,inline:Wn}}static lex(e,n){return new Ya(n).lex(e)}static lexInline(e,n){return new Ya(n).inlineTokens(e)}lex(e){e=e.replace(zt.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let n=0;n(a=i.call({lexer:this},e,n))?(e=e.substring(a.raw.length),n.push(a),!0):!1))continue;if(a=this.tokenizer.space(e)){e=e.substring(a.raw.length);let i=n.at(-1);a.raw.length===1&&i!==void 0?i.raw+=` -`:n.push(a);continue}if(a=this.tokenizer.code(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.at(-1).src=i.text):n.push(a);continue}if(a=this.tokenizer.fences(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.heading(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.hr(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.blockquote(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.list(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.html(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.def(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[a.tag]||(this.tokens.links[a.tag]={href:a.href,title:a.title},n.push(a));continue}if(a=this.tokenizer.table(e)){e=e.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.lheading(e)){e=e.substring(a.raw.length),n.push(a);continue}let c=e;if(this.options.extensions?.startBlock){let i=1/0,u=e.slice(1),p;this.options.extensions.startBlock.forEach(f=>{p=f.call({lexer:this},u),typeof p=="number"&&p>=0&&(i=Math.min(i,p))}),i<1/0&&i>=0&&(c=e.substring(0,i+1))}if(this.state.top&&(a=this.tokenizer.paragraph(c))){let i=n.at(-1);r&&i?.type==="paragraph"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):n.push(a),r=c.length!==e.length,e=e.substring(a.raw.length);continue}if(a=this.tokenizer.text(e)){e=e.substring(a.raw.length);let i=n.at(-1);i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+a.raw,i.text+=` -`+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):n.push(a);continue}if(e){let i="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(i);break}else throw new Error(i)}}return this.state.top=!0,n}inline(e,n=[]){return this.inlineQueue.push({src:e,tokens:n}),n}inlineTokens(e,n=[]){let r=e,a=null;if(this.tokens.links){let p=Object.keys(this.tokens.links);if(p.length>0)for(;(a=this.tokenizer.rules.inline.reflinkSearch.exec(r))!=null;)p.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(a=this.tokenizer.rules.inline.anyPunctuation.exec(r))!=null;)r=r.slice(0,a.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let c;for(;(a=this.tokenizer.rules.inline.blockSkip.exec(r))!=null;)c=a[2]?a[2].length:0,r=r.slice(0,a.index+c)+"["+"a".repeat(a[0].length-c-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);r=this.options.hooks?.emStrongMask?.call({lexer:this},r)??r;let i=!1,u="";for(;e;){i||(u=""),i=!1;let p;if(this.options.extensions?.inline?.some(h=>(p=h.call({lexer:this},e,n))?(e=e.substring(p.raw.length),n.push(p),!0):!1))continue;if(p=this.tokenizer.escape(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.tag(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.link(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(p.raw.length);let h=n.at(-1);p.type==="text"&&h?.type==="text"?(h.raw+=p.raw,h.text+=p.text):n.push(p);continue}if(p=this.tokenizer.emStrong(e,r,u)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.codespan(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.br(e)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.del(e,r,u)){e=e.substring(p.raw.length),n.push(p);continue}if(p=this.tokenizer.autolink(e)){e=e.substring(p.raw.length),n.push(p);continue}if(!this.state.inLink&&(p=this.tokenizer.url(e))){e=e.substring(p.raw.length),n.push(p);continue}let f=e;if(this.options.extensions?.startInline){let h=1/0,y=e.slice(1),_;this.options.extensions.startInline.forEach(C=>{_=C.call({lexer:this},y),typeof _=="number"&&_>=0&&(h=Math.min(h,_))}),h<1/0&&h>=0&&(f=e.substring(0,h+1))}if(p=this.tokenizer.inlineText(f)){e=e.substring(p.raw.length),p.raw.slice(-1)!=="_"&&(u=p.raw.slice(-1)),i=!0;let h=n.at(-1);h?.type==="text"?(h.raw+=p.raw,h.text+=p.text):n.push(p);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return n}},ba=class{options;parser;constructor(t){this.options=t||Dn}space(t){return""}code({text:t,lang:e,escaped:n}){let r=(e||"").match(zt.notSpaceStart)?.[0],a=t.replace(zt.endingNewline,"")+` -`;return r?'
    '+(n?a:ln(a,!0))+`
    -`:"
    "+(n?a:ln(a,!0))+`
    -`}blockquote({tokens:t}){return`
    -${this.parser.parse(t)}
    -`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} -`}hr(t){return`
    -`}list(t){let e=t.ordered,n=t.start,r="";for(let i=0;i -`+r+" -`}listitem(t){return`
  • ${this.parser.parse(t.tokens)}
  • -`}checkbox({checked:t}){return" '}paragraph({tokens:t}){return`

    ${this.parser.parseInline(t)}

    -`}table(t){let e="",n="";for(let a=0;a${r}`),` - -`+e+` -`+r+`
    -`}tablerow({text:t}){return` -${t} -`}tablecell(t){let e=this.parser.parseInline(t.tokens),n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+` -`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${ln(t,!0)}`}br(t){return"
    "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:n}){let r=this.parser.parseInline(n),a=zs(t);if(a===null)return r;t=a;let c='
    ",c}image({href:t,title:e,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let a=zs(t);if(a===null)return ln(n);t=a;let c=`${ln(n)}{let i=a[c].flat(1/0);n=n.concat(this.walkTokens(i,e))}):a.tokens&&(n=n.concat(this.walkTokens(a.tokens,e)))}}return n}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(a=>{if(!a.name)throw new Error("extension name required");if("renderer"in a){let c=e.renderers[a.name];c?e.renderers[a.name]=function(...i){let u=a.renderer.apply(this,i);return u===!1&&(u=c.apply(this,i)),u}:e.renderers[a.name]=a.renderer}if("tokenizer"in a){if(!a.level||a.level!=="block"&&a.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let c=e[a.level];c?c.unshift(a.tokenizer):e[a.level]=[a.tokenizer],a.start&&(a.level==="block"?e.startBlock?e.startBlock.push(a.start):e.startBlock=[a.start]:a.level==="inline"&&(e.startInline?e.startInline.push(a.start):e.startInline=[a.start]))}"childTokens"in a&&a.childTokens&&(e.childTokens[a.name]=a.childTokens)}),r.extensions=e),n.renderer){let a=this.defaults.renderer||new ba(this.defaults);for(let c in n.renderer){if(!(c in a))throw new Error(`renderer '${c}' does not exist`);if(["options","parser"].includes(c))continue;let i=c,u=n.renderer[i],p=a[i];a[i]=(...f)=>{let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h||""}}r.renderer=a}if(n.tokenizer){let a=this.defaults.tokenizer||new fa(this.defaults);for(let c in n.tokenizer){if(!(c in a))throw new Error(`tokenizer '${c}' does not exist`);if(["options","rules","lexer"].includes(c))continue;let i=c,u=n.tokenizer[i],p=a[i];a[i]=(...f)=>{let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h}}r.tokenizer=a}if(n.hooks){let a=this.defaults.hooks||new Yn;for(let c in n.hooks){if(!(c in a))throw new Error(`hook '${c}' does not exist`);if(["options","block"].includes(c))continue;let i=c,u=n.hooks[i],p=a[i];Yn.passThroughHooks.has(c)?a[i]=f=>{if(this.defaults.async&&Yn.passThroughHooksRespectAsync.has(c))return(async()=>{let y=await u.call(a,f);return p.call(a,y)})();let h=u.call(a,f);return p.call(a,h)}:a[i]=(...f)=>{if(this.defaults.async)return(async()=>{let y=await u.apply(a,f);return y===!1&&(y=await p.apply(a,f)),y})();let h=u.apply(a,f);return h===!1&&(h=p.apply(a,f)),h}}r.hooks=a}if(n.walkTokens){let a=this.defaults.walkTokens,c=n.walkTokens;r.walkTokens=function(i){let u=[];return u.push(c.call(this,i)),a&&(u=u.concat(a.call(this,i))),u}}this.defaults={...this.defaults,...r}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return Vt.lex(t,e??this.defaults)}parser(t,e){return Yt.parse(t,e??this.defaults)}parseMarkdown(t){return(e,n)=>{let r={...n},a={...this.defaults,...r},c=this.onError(!!a.silent,!!a.async);if(this.defaults.async===!0&&r.async===!1)return c(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return c(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return c(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(a.hooks&&(a.hooks.options=a,a.hooks.block=t),a.async)return(async()=>{let i=a.hooks?await a.hooks.preprocess(e):e,u=await(a.hooks?await a.hooks.provideLexer():t?Vt.lex:Vt.lexInline)(i,a),p=a.hooks?await a.hooks.processAllTokens(u):u;a.walkTokens&&await Promise.all(this.walkTokens(p,a.walkTokens));let f=await(a.hooks?await a.hooks.provideParser():t?Yt.parse:Yt.parseInline)(p,a);return a.hooks?await a.hooks.postprocess(f):f})().catch(c);try{a.hooks&&(e=a.hooks.preprocess(e));let i=(a.hooks?a.hooks.provideLexer():t?Vt.lex:Vt.lexInline)(e,a);a.hooks&&(i=a.hooks.processAllTokens(i)),a.walkTokens&&this.walkTokens(i,a.walkTokens);let u=(a.hooks?a.hooks.provideParser():t?Yt.parse:Yt.parseInline)(i,a);return a.hooks&&(u=a.hooks.postprocess(u)),u}catch(i){return c(i)}}}onError(t,e){return n=>{if(n.message+=` -Please report this to https://github.com/markedjs/marked.`,t){let r="

    An error occurred:

    "+ln(n.message+"",!0)+"
    ";return e?Promise.resolve(r):r}if(e)return Promise.reject(n);throw n}}},Pn=new vc;function Ke(t,e){return Pn.parse(t,e)}Ke.options=Ke.setOptions=function(t){return Pn.setOptions(t),Ke.defaults=Pn.defaults,sr(Ke.defaults),Ke};Ke.getDefaults=rs;Ke.defaults=Dn;Ke.use=function(...t){return Pn.use(...t),Ke.defaults=Pn.defaults,sr(Ke.defaults),Ke};Ke.walkTokens=function(t,e){return Pn.walkTokens(t,e)};Ke.parseInline=Pn.parseInline;Ke.Parser=Yt;Ke.parser=Yt.parse;Ke.Renderer=ba;Ke.TextRenderer=gs;Ke.Lexer=Vt;Ke.lexer=Vt.lex;Ke.Tokenizer=fa;Ke.Hooks=Yn;Ke.parse=Ke;Ke.options;Ke.setOptions;Ke.use;Ke.walkTokens;Ke.parseInline;Yt.parse;Vt.lex;function hc(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var Pa,Os;function fc(){if(Os)return Pa;Os=1;function t(l){return l instanceof Map?l.clear=l.delete=l.set=function(){throw new Error("map is read-only")}:l instanceof Set&&(l.add=l.clear=l.delete=function(){throw new Error("set is read-only")}),Object.freeze(l),Object.getOwnPropertyNames(l).forEach(v=>{const N=l[v],ce=typeof N;(ce==="object"||ce==="function")&&!Object.isFrozen(N)&&t(N)}),l}class e{constructor(v){v.data===void 0&&(v.data={}),this.data=v.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function n(l){return l.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(l,...v){const N=Object.create(null);for(const ce in l)N[ce]=l[ce];return v.forEach(function(ce){for(const He in ce)N[He]=ce[He]}),N}const a="",c=l=>!!l.scope,i=(l,{prefix:v})=>{if(l.startsWith("language:"))return l.replace("language:","language-");if(l.includes(".")){const N=l.split(".");return[`${v}${N.shift()}`,...N.map((ce,He)=>`${ce}${"_".repeat(He+1)}`)].join(" ")}return`${v}${l}`};class u{constructor(v,N){this.buffer="",this.classPrefix=N.classPrefix,v.walk(this)}addText(v){this.buffer+=n(v)}openNode(v){if(!c(v))return;const N=i(v.scope,{prefix:this.classPrefix});this.span(N)}closeNode(v){c(v)&&(this.buffer+=a)}value(){return this.buffer}span(v){this.buffer+=``}}const p=(l={})=>{const v={children:[]};return Object.assign(v,l),v};class f{constructor(){this.rootNode=p(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(v){this.top.children.push(v)}openNode(v){const N=p({scope:v});this.add(N),this.stack.push(N)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(v){return this.constructor._walk(v,this.rootNode)}static _walk(v,N){return typeof N=="string"?v.addText(N):N.children&&(v.openNode(N),N.children.forEach(ce=>this._walk(v,ce)),v.closeNode(N)),v}static _collapse(v){typeof v!="string"&&v.children&&(v.children.every(N=>typeof N=="string")?v.children=[v.children.join("")]:v.children.forEach(N=>{f._collapse(N)}))}}class h extends f{constructor(v){super(),this.options=v}addText(v){v!==""&&this.add(v)}startScope(v){this.openNode(v)}endScope(){this.closeNode()}__addSublanguage(v,N){const ce=v.root;N&&(ce.scope=`language:${N}`),this.add(ce)}toHTML(){return new u(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function y(l){return l?typeof l=="string"?l:l.source:null}function _(l){return I("(?=",l,")")}function C(l){return I("(?:",l,")*")}function T(l){return I("(?:",l,")?")}function I(...l){return l.map(N=>y(N)).join("")}function B(l){const v=l[l.length-1];return typeof v=="object"&&v.constructor===Object?(l.splice(l.length-1,1),v):{}}function te(...l){return"("+(B(l).capture?"":"?:")+l.map(ce=>y(ce)).join("|")+")"}function de(l){return new RegExp(l.toString()+"|").exec("").length-1}function $(l,v){const N=l&&l.exec(v);return N&&N.index===0}const k=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function E(l,{joinWith:v}){let N=0;return l.map(ce=>{N+=1;const He=N;let We=y(ce),P="";for(;We.length>0;){const L=k.exec(We);if(!L){P+=We;break}P+=We.substring(0,L.index),We=We.substring(L.index+L[0].length),L[0][0]==="\\"&&L[1]?P+="\\"+String(Number(L[1])+He):(P+=L[0],L[0]==="("&&N++)}return P}).map(ce=>`(${ce})`).join(v)}const O=/\b\B/,G="[a-zA-Z]\\w*",oe="[a-zA-Z_]\\w*",ne="\\b\\d+(\\.\\d+)?",Re="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",et="\\b(0b[01]+)",qe="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",Ne=(l={})=>{const v=/^#![ ]*\//;return l.binary&&(l.begin=I(v,/.*\b/,l.binary,/\b.*/)),r({scope:"meta",begin:v,end:/$/,relevance:0,"on:begin":(N,ce)=>{N.index!==0&&ce.ignoreMatch()}},l)},se={begin:"\\\\[\\s\\S]",relevance:0},$e={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[se]},Ce={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[se]},tt={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},J=function(l,v,N={}){const ce=r({scope:"comment",begin:l,end:v,contains:[]},N);ce.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const He=te("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return ce.contains.push({begin:I(/[ ]+/,"(",He,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),ce},Pe=J("//","$"),Oe=J("/\\*","\\*/"),Le=J("#","$"),Ze={scope:"number",begin:ne,relevance:0},rt={scope:"number",begin:Re,relevance:0},at={scope:"number",begin:et,relevance:0},Xe={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[se,{begin:/\[/,end:/\]/,relevance:0,contains:[se]}]},ut={scope:"title",begin:G,relevance:0},pt={scope:"title",begin:oe,relevance:0},ft={begin:"\\.\\s*"+oe,relevance:0};var z=Object.freeze({__proto__:null,APOS_STRING_MODE:$e,BACKSLASH_ESCAPE:se,BINARY_NUMBER_MODE:at,BINARY_NUMBER_RE:et,COMMENT:J,C_BLOCK_COMMENT_MODE:Oe,C_LINE_COMMENT_MODE:Pe,C_NUMBER_MODE:rt,C_NUMBER_RE:Re,END_SAME_AS_BEGIN:function(l){return Object.assign(l,{"on:begin":(v,N)=>{N.data._beginMatch=v[1]},"on:end":(v,N)=>{N.data._beginMatch!==v[1]&&N.ignoreMatch()}})},HASH_COMMENT_MODE:Le,IDENT_RE:G,MATCH_NOTHING_RE:O,METHOD_GUARD:ft,NUMBER_MODE:Ze,NUMBER_RE:ne,PHRASAL_WORDS_MODE:tt,QUOTE_STRING_MODE:Ce,REGEXP_MODE:Xe,RE_STARTERS_RE:qe,SHEBANG:Ne,TITLE_MODE:ut,UNDERSCORE_IDENT_RE:oe,UNDERSCORE_TITLE_MODE:pt});function q(l,v){l.input[l.index-1]==="."&&v.ignoreMatch()}function j(l,v){l.className!==void 0&&(l.scope=l.className,delete l.className)}function Z(l,v){v&&l.beginKeywords&&(l.begin="\\b("+l.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",l.__beforeBegin=q,l.keywords=l.keywords||l.beginKeywords,delete l.beginKeywords,l.relevance===void 0&&(l.relevance=0))}function ee(l,v){Array.isArray(l.illegal)&&(l.illegal=te(...l.illegal))}function ue(l,v){if(l.match){if(l.begin||l.end)throw new Error("begin & end are not supported with match");l.begin=l.match,delete l.match}}function be(l,v){l.relevance===void 0&&(l.relevance=1)}const Ee=(l,v)=>{if(!l.beforeMatch)return;if(l.starts)throw new Error("beforeMatch cannot be used with starts");const N=Object.assign({},l);Object.keys(l).forEach(ce=>{delete l[ce]}),l.keywords=N.keywords,l.begin=I(N.beforeMatch,_(N.begin)),l.starts={relevance:0,contains:[Object.assign(N,{endsParent:!0})]},l.relevance=0,delete N.beforeMatch},_e=["of","and","for","in","not","or","if","then","parent","list","value"],we="keyword";function R(l,v,N=we){const ce=Object.create(null);return typeof l=="string"?He(N,l.split(" ")):Array.isArray(l)?He(N,l):Object.keys(l).forEach(function(We){Object.assign(ce,R(l[We],v,We))}),ce;function He(We,P){v&&(P=P.map(L=>L.toLowerCase())),P.forEach(function(L){const ae=L.split("|");ce[ae[0]]=[We,W(ae[0],ae[1])]})}}function W(l,v){return v?Number(v):U(l)?0:1}function U(l){return _e.includes(l.toLowerCase())}const ye={},he=l=>{console.error(l)},me=(l,...v)=>{console.log(`WARN: ${l}`,...v)},ze=(l,v)=>{ye[`${l}/${v}`]||(console.log(`Deprecated as of ${l}. ${v}`),ye[`${l}/${v}`]=!0)},Ie=new Error;function Te(l,v,{key:N}){let ce=0;const He=l[N],We={},P={};for(let L=1;L<=v.length;L++)P[L+ce]=He[L],We[L+ce]=!0,ce+=de(v[L-1]);l[N]=P,l[N]._emit=We,l[N]._multi=!0}function bt(l){if(Array.isArray(l.begin)){if(l.skip||l.excludeBegin||l.returnBegin)throw he("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),Ie;if(typeof l.beginScope!="object"||l.beginScope===null)throw he("beginScope must be object"),Ie;Te(l,l.begin,{key:"beginScope"}),l.begin=E(l.begin,{joinWith:""})}}function Ot(l){if(Array.isArray(l.end)){if(l.skip||l.excludeEnd||l.returnEnd)throw he("skip, excludeEnd, returnEnd not compatible with endScope: {}"),Ie;if(typeof l.endScope!="object"||l.endScope===null)throw he("endScope must be object"),Ie;Te(l,l.end,{key:"endScope"}),l.end=E(l.end,{joinWith:""})}}function dn(l){l.scope&&typeof l.scope=="object"&&l.scope!==null&&(l.beginScope=l.scope,delete l.scope)}function It(l){dn(l),typeof l.beginScope=="string"&&(l.beginScope={_wrap:l.beginScope}),typeof l.endScope=="string"&&(l.endScope={_wrap:l.endScope}),bt(l),Ot(l)}function yt(l){function v(P,L){return new RegExp(y(P),"m"+(l.case_insensitive?"i":"")+(l.unicodeRegex?"u":"")+(L?"g":""))}class N{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(L,ae){ae.position=this.position++,this.matchIndexes[this.matchAt]=ae,this.regexes.push([ae,L]),this.matchAt+=de(L)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const L=this.regexes.map(ae=>ae[1]);this.matcherRe=v(E(L,{joinWith:"|"}),!0),this.lastIndex=0}exec(L){this.matcherRe.lastIndex=this.lastIndex;const ae=this.matcherRe.exec(L);if(!ae)return null;const lt=ae.findIndex((Qt,Jt)=>Jt>0&&Qt!==void 0),st=this.matchIndexes[lt];return ae.splice(0,lt),Object.assign(ae,st)}}class ce{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(L){if(this.multiRegexes[L])return this.multiRegexes[L];const ae=new N;return this.rules.slice(L).forEach(([lt,st])=>ae.addRule(lt,st)),ae.compile(),this.multiRegexes[L]=ae,ae}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(L,ae){this.rules.push([L,ae]),ae.type==="begin"&&this.count++}exec(L){const ae=this.getMatcher(this.regexIndex);ae.lastIndex=this.lastIndex;let lt=ae.exec(L);if(this.resumingScanAtSamePosition()&&!(lt&<.index===this.lastIndex)){const st=this.getMatcher(0);st.lastIndex=this.lastIndex+1,lt=st.exec(L)}return lt&&(this.regexIndex+=lt.position+1,this.regexIndex===this.count&&this.considerAll()),lt}}function He(P){const L=new ce;return P.contains.forEach(ae=>L.addRule(ae.begin,{rule:ae,type:"begin"})),P.terminatorEnd&&L.addRule(P.terminatorEnd,{type:"end"}),P.illegal&&L.addRule(P.illegal,{type:"illegal"}),L}function We(P,L){const ae=P;if(P.isCompiled)return ae;[j,ue,It,Ee].forEach(st=>st(P,L)),l.compilerExtensions.forEach(st=>st(P,L)),P.__beforeBegin=null,[Z,ee,be].forEach(st=>st(P,L)),P.isCompiled=!0;let lt=null;return typeof P.keywords=="object"&&P.keywords.$pattern&&(P.keywords=Object.assign({},P.keywords),lt=P.keywords.$pattern,delete P.keywords.$pattern),lt=lt||/\w+/,P.keywords&&(P.keywords=R(P.keywords,l.case_insensitive)),ae.keywordPatternRe=v(lt,!0),L&&(P.begin||(P.begin=/\B|\b/),ae.beginRe=v(ae.begin),!P.end&&!P.endsWithParent&&(P.end=/\B|\b/),P.end&&(ae.endRe=v(ae.end)),ae.terminatorEnd=y(ae.end)||"",P.endsWithParent&&L.terminatorEnd&&(ae.terminatorEnd+=(P.end?"|":"")+L.terminatorEnd)),P.illegal&&(ae.illegalRe=v(P.illegal)),P.contains||(P.contains=[]),P.contains=[].concat(...P.contains.map(function(st){return Pt(st==="self"?P:st)})),P.contains.forEach(function(st){We(st,ae)}),P.starts&&We(P.starts,L),ae.matcher=He(ae),ae}if(l.compilerExtensions||(l.compilerExtensions=[]),l.contains&&l.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return l.classNameAliases=r(l.classNameAliases||{}),We(l)}function Xt(l){return l?l.endsWithParent||Xt(l.starts):!1}function Pt(l){return l.variants&&!l.cachedVariants&&(l.cachedVariants=l.variants.map(function(v){return r(l,{variants:null},v)})),l.cachedVariants?l.cachedVariants:Xt(l)?r(l,{starts:l.starts?r(l.starts):null}):Object.isFrozen(l)?r(l):l}var yn="11.11.1";class vt extends Error{constructor(v,N){super(v),this.name="HTMLInjectionError",this.html=N}}const Nt=n,Ft=r,A=Symbol("nomatch"),K=7,M=function(l){const v=Object.create(null),N=Object.create(null),ce=[];let He=!0;const We="Could not find the language '{}', did you forget to load/include a language module?",P={disableAutodetect:!0,name:"Plain text",contains:[]};let L={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:h};function ae(S){return L.noHighlightRe.test(S)}function lt(S){let re=S.className+" ";re+=S.parentNode?S.parentNode.className:"";const Me=L.languageDetectRe.exec(re);if(Me){const V=tn(Me[1]);return V||(me(We.replace("{}",Me[1])),me("Falling back to no-highlight mode for this block.",S)),V?Me[1]:"no-highlight"}return re.split(/\s+/).find(V=>ae(V)||tn(V))}function st(S,re,Me){let V="",Se="";typeof re=="object"?(V=S,Me=re.ignoreIllegals,Se=re.language):(ze("10.7.0","highlight(lang, code, ...args) has been deprecated."),ze("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),Se=S,V=re),Me===void 0&&(Me=!0);const Be={code:V,language:Se};pn("before:highlight",Be);const ke=Be.result?Be.result:Qt(Be.language,Be.code,Me);return ke.code=Be.code,pn("after:highlight",ke),ke}function Qt(S,re,Me,V){const Se=Object.create(null);function Be(x,D){return x.keywords[D]}function ke(){if(!pe.keywords){je.addText(Y);return}let x=0;pe.keywordPatternRe.lastIndex=0;let D=pe.keywordPatternRe.exec(Y),ie="";for(;D;){ie+=Y.substring(x,D.index);const X=kt.case_insensitive?D[0].toLowerCase():D[0],Ve=Be(pe,X);if(Ve){const[mt,$n]=Ve;if(je.addText(ie),ie="",Se[X]=(Se[X]||0)+1,Se[X]<=K&&(Fe+=$n),mt.startsWith("_"))ie+=D[0];else{const rn=kt.classNameAliases[mt]||mt;Qe(D[0],rn)}}else ie+=D[0];x=pe.keywordPatternRe.lastIndex,D=pe.keywordPatternRe.exec(Y)}ie+=Y.substring(x),je.addText(ie)}function xe(){if(Y==="")return;let x=null;if(typeof pe.subLanguage=="string"){if(!v[pe.subLanguage]){je.addText(Y);return}x=Qt(pe.subLanguage,Y,!0,sn[pe.subLanguage]),sn[pe.subLanguage]=x._top}else x=En(Y,pe.subLanguage.length?pe.subLanguage:null);pe.relevance>0&&(Fe+=x.relevance),je.__addSublanguage(x._emitter,x.language)}function Ge(){pe.subLanguage!=null?xe():ke(),Y=""}function Qe(x,D){x!==""&&(je.startScope(D),je.addText(x),je.endScope())}function Rt(x,D){let ie=1;const X=D.length-1;for(;ie<=X;){if(!x._emit[ie]){ie++;continue}const Ve=kt.classNameAliases[x[ie]]||x[ie],mt=D[ie];Ve?Qe(mt,Ve):(Y=mt,ke(),Y=""),ie++}}function nn(x,D){return x.scope&&typeof x.scope=="string"&&je.openNode(kt.classNameAliases[x.scope]||x.scope),x.beginScope&&(x.beginScope._wrap?(Qe(Y,kt.classNameAliases[x.beginScope._wrap]||x.beginScope._wrap),Y=""):x.beginScope._multi&&(Rt(x.beginScope,D),Y="")),pe=Object.create(x,{parent:{value:pe}}),pe}function gn(x,D,ie){let X=$(x.endRe,ie);if(X){if(x["on:end"]){const Ve=new e(x);x["on:end"](D,Ve),Ve.isMatchIgnored&&(X=!1)}if(X){for(;x.endsParent&&x.parent;)x=x.parent;return x}}if(x.endsWithParent)return gn(x.parent,D,ie)}function vn(x){return pe.matcher.regexIndex===0?(Y+=x[0],1):(ht=!0,0)}function Bt(x){const D=x[0],ie=x.rule,X=new e(ie),Ve=[ie.__beforeBegin,ie["on:begin"]];for(const mt of Ve)if(mt&&(mt(x,X),X.isMatchIgnored))return vn(D);return ie.skip?Y+=D:(ie.excludeBegin&&(Y+=D),Ge(),!ie.returnBegin&&!ie.excludeBegin&&(Y=D)),nn(ie,x),ie.returnBegin?0:D.length}function hn(x){const D=x[0],ie=re.substring(x.index),X=gn(pe,x,ie);if(!X)return A;const Ve=pe;pe.endScope&&pe.endScope._wrap?(Ge(),Qe(D,pe.endScope._wrap)):pe.endScope&&pe.endScope._multi?(Ge(),Rt(pe.endScope,x)):Ve.skip?Y+=D:(Ve.returnEnd||Ve.excludeEnd||(Y+=D),Ge(),Ve.excludeEnd&&(Y=D));do pe.scope&&je.closeNode(),!pe.skip&&!pe.subLanguage&&(Fe+=pe.relevance),pe=pe.parent;while(pe!==X.parent);return X.starts&&nn(X.starts,x),Ve.returnEnd?0:D.length}function Kt(){const x=[];for(let D=pe;D!==kt;D=D.parent)D.scope&&x.unshift(D.scope);x.forEach(D=>je.openNode(D))}let jt={};function an(x,D){const ie=D&&D[0];if(Y+=x,ie==null)return Ge(),0;if(jt.type==="begin"&&D.type==="end"&&jt.index===D.index&&ie===""){if(Y+=re.slice(D.index,D.index+1),!He){const X=new Error(`0 width match regex (${S})`);throw X.languageName=S,X.badRule=jt.rule,X}return 1}if(jt=D,D.type==="begin")return Bt(D);if(D.type==="illegal"&&!Me){const X=new Error('Illegal lexeme "'+ie+'" for mode "'+(pe.scope||"")+'"');throw X.mode=pe,X}else if(D.type==="end"){const X=hn(D);if(X!==A)return X}if(D.type==="illegal"&&ie==="")return Y+=` -`,1;if(nt>1e5&&nt>D.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Y+=ie,ie.length}const kt=tn(S);if(!kt)throw he(We.replace("{}",S)),new Error('Unknown language: "'+S+'"');const Ut=yt(kt);let qt="",pe=V||Ut;const sn={},je=new L.__emitter(L);Kt();let Y="",Fe=0,Ae=0,nt=0,ht=!1;try{if(kt.__emitTokens)kt.__emitTokens(re,je);else{for(pe.matcher.considerAll();;){nt++,ht?ht=!1:pe.matcher.considerAll(),pe.matcher.lastIndex=Ae;const x=pe.matcher.exec(re);if(!x)break;const D=re.substring(Ae,x.index),ie=an(D,x);Ae=x.index+ie}an(re.substring(Ae))}return je.finalize(),qt=je.toHTML(),{language:S,value:qt,relevance:Fe,illegal:!1,_emitter:je,_top:pe}}catch(x){if(x.message&&x.message.includes("Illegal"))return{language:S,value:Nt(re),illegal:!0,relevance:0,_illegalBy:{message:x.message,index:Ae,context:re.slice(Ae-100,Ae+100),mode:x.mode,resultSoFar:qt},_emitter:je};if(He)return{language:S,value:Nt(re),illegal:!1,relevance:0,errorRaised:x,_emitter:je,_top:pe};throw x}}function Jt(S){const re={value:Nt(S),illegal:!1,relevance:0,_top:P,_emitter:new L.__emitter(L)};return re._emitter.addText(S),re}function En(S,re){re=re||L.languages||Object.keys(v);const Me=Jt(S),V=re.filter(tn).filter(Dt).map(Ge=>Qt(Ge,S,!1));V.unshift(Me);const Se=V.sort((Ge,Qe)=>{if(Ge.relevance!==Qe.relevance)return Qe.relevance-Ge.relevance;if(Ge.language&&Qe.language){if(tn(Ge.language).supersetOf===Qe.language)return 1;if(tn(Qe.language).supersetOf===Ge.language)return-1}return 0}),[Be,ke]=Se,xe=Be;return xe.secondBest=ke,xe}function Sn(S,re,Me){const V=re&&N[re]||Me;S.classList.add("hljs"),S.classList.add(`language-${V}`)}function An(S){let re=null;const Me=lt(S);if(ae(Me))return;if(pn("before:highlightElement",{el:S,language:Me}),S.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",S);return}if(S.children.length>0&&(L.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(S)),L.throwUnescapedHTML))throw new vt("One of your code blocks includes unescaped HTML.",S.innerHTML);re=S;const V=re.textContent,Se=Me?st(V,{language:Me,ignoreIllegals:!0}):En(V);S.innerHTML=Se.value,S.dataset.highlighted="yes",Sn(S,Me,Se.language),S.result={language:Se.language,re:Se.relevance,relevance:Se.relevance},Se.secondBest&&(S.secondBest={language:Se.secondBest.language,relevance:Se.secondBest.relevance}),pn("after:highlightElement",{el:S,result:Se,text:V})}function Tn(S){L=Ft(L,S)}const Bn=()=>{en(),ze("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function Gt(){en(),ze("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let Lt=!1;function en(){function S(){en()}if(document.readyState==="loading"){Lt||window.addEventListener("DOMContentLoaded",S,!1),Lt=!0;return}document.querySelectorAll(L.cssSelector).forEach(An)}function un(S,re){let Me=null;try{Me=re(l)}catch(V){if(he("Language definition for '{}' could not be registered.".replace("{}",S)),He)he(V);else throw V;Me=P}Me.name||(Me.name=S),v[S]=Me,Me.rawDefinition=re.bind(null,l),Me.aliases&&Nn(Me.aliases,{languageName:S})}function wa(S){delete v[S];for(const re of Object.keys(N))N[re]===S&&delete N[re]}function xa(){return Object.keys(v)}function tn(S){return S=(S||"").toLowerCase(),v[S]||v[N[S]]}function Nn(S,{languageName:re}){typeof S=="string"&&(S=[S]),S.forEach(Me=>{N[Me.toLowerCase()]=re})}function Dt(S){const re=tn(S);return re&&!re.disableAutodetect}function na(S){S["before:highlightBlock"]&&!S["before:highlightElement"]&&(S["before:highlightElement"]=re=>{S["before:highlightBlock"](Object.assign({block:re.el},re))}),S["after:highlightBlock"]&&!S["after:highlightElement"]&&(S["after:highlightElement"]=re=>{S["after:highlightBlock"](Object.assign({block:re.el},re))})}function Rn(S){na(S),ce.push(S)}function Ea(S){const re=ce.indexOf(S);re!==-1&&ce.splice(re,1)}function pn(S,re){const Me=S;ce.forEach(function(V){V[Me]&&V[Me](re)})}function Sa(S){return ze("10.7.0","highlightBlock will be removed entirely in v12.0"),ze("10.7.0","Please use highlightElement now."),An(S)}Object.assign(l,{highlight:st,highlightAuto:En,highlightAll:en,highlightElement:An,highlightBlock:Sa,configure:Tn,initHighlighting:Bn,initHighlightingOnLoad:Gt,registerLanguage:un,unregisterLanguage:wa,listLanguages:xa,getLanguage:tn,registerAliases:Nn,autoDetection:Dt,inherit:Ft,addPlugin:Rn,removePlugin:Ea}),l.debugMode=function(){He=!1},l.safeMode=function(){He=!0},l.versionString=yn,l.regex={concat:I,lookahead:_,either:te,optional:T,anyNumberOfTimes:C};for(const S in z)typeof z[S]=="object"&&t(z[S]);return Object.assign(l,z),l},H=M({});return H.newInstance=()=>M({}),Pa=H,H.HighlightJS=H,H.default=H,Pa}var bc=fc();const dt=hc(bc),Is="[A-Za-z$_][0-9A-Za-z$_]*",mc=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],_c=["true","false","null","undefined","NaN","Infinity"],fr=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],br=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],mr=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],yc=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],kc=[].concat(mr,fr,br);function Ps(t){const e=t.regex,n=(J,{after:Pe})=>{const Oe="",end:""},c=/<[A-Za-z0-9\\._:-]+\s*\/>/,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(J,Pe)=>{const Oe=J[0].length+J.index,Le=J.input[Oe];if(Le==="<"||Le===","){Pe.ignoreMatch();return}Le===">"&&(n(J,{after:Oe})||Pe.ignoreMatch());let Ze;const rt=J.input.substring(Oe);if(Ze=rt.match(/^\s*=/)){Pe.ignoreMatch();return}if((Ze=rt.match(/^\s+extends\s+/))&&Ze.index===0){Pe.ignoreMatch();return}}},u={$pattern:Is,keyword:mc,literal:_c,built_in:kc,"variable.language":yc},p="[0-9](_?[0-9])*",f=`\\.(${p})`,h="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",y={className:"number",variants:[{begin:`(\\b(${h})((${f})|\\.)?|(${f}))[eE][+-]?(${p})\\b`},{begin:`\\b(${h})\\b((${f})\\b|\\.)?|(${f})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},_={className:"subst",begin:"\\$\\{",end:"\\}",keywords:u,contains:[]},C={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"xml"}},T={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"css"}},I={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"graphql"}},B={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,_]},de={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},$=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,C,T,I,B,{match:/\$\d+/},y];_.contains=$.concat({begin:/\{/,end:/\}/,keywords:u,contains:["self"].concat($)});const k=[].concat(de,_.contains),E=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:u,contains:["self"].concat(k)}]),O={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E},G={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},oe={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...fr,...br]}},ne={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},Re={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},et={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function qe(J){return e.concat("(?!",J.join("|"),")")}const Ne={match:e.concat(/\b/,qe([...mr,"super","import"].map(J=>`${J}\\s*\\(`)),r,e.lookahead(/\s*\(/)),className:"title.function",relevance:0},se={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},$e={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},Ce="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",tt={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(Ce)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:u,exports:{PARAMS_CONTAINS:E,CLASS_REFERENCE:oe},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),ne,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,C,T,I,B,de,{match:/\$\d+/},y,oe,{scope:"attr",match:r+e.lookahead(":"),relevance:0},tt,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[de,t.REGEXP_MODE,{className:"function",begin:Ce,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:c},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},Re,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},se,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},Ne,et,G,$e,{match:/\$[(.]/}]}}const ma="[A-Za-z$_][0-9A-Za-z$_]*",_r=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],yr=["true","false","null","undefined","NaN","Infinity"],kr=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],wr=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],xr=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Er=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],Sr=[].concat(xr,kr,wr);function wc(t){const e=t.regex,n=(J,{after:Pe})=>{const Oe="",end:""},c=/<[A-Za-z0-9\\._:-]+\s*\/>/,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(J,Pe)=>{const Oe=J[0].length+J.index,Le=J.input[Oe];if(Le==="<"||Le===","){Pe.ignoreMatch();return}Le===">"&&(n(J,{after:Oe})||Pe.ignoreMatch());let Ze;const rt=J.input.substring(Oe);if(Ze=rt.match(/^\s*=/)){Pe.ignoreMatch();return}if((Ze=rt.match(/^\s+extends\s+/))&&Ze.index===0){Pe.ignoreMatch();return}}},u={$pattern:ma,keyword:_r,literal:yr,built_in:Sr,"variable.language":Er},p="[0-9](_?[0-9])*",f=`\\.(${p})`,h="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",y={className:"number",variants:[{begin:`(\\b(${h})((${f})|\\.)?|(${f}))[eE][+-]?(${p})\\b`},{begin:`\\b(${h})\\b((${f})\\b|\\.)?|(${f})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},_={className:"subst",begin:"\\$\\{",end:"\\}",keywords:u,contains:[]},C={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"xml"}},T={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"css"}},I={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,_],subLanguage:"graphql"}},B={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,_]},de={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},$=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,C,T,I,B,{match:/\$\d+/},y];_.contains=$.concat({begin:/\{/,end:/\}/,keywords:u,contains:["self"].concat($)});const k=[].concat(de,_.contains),E=k.concat([{begin:/(\s*)\(/,end:/\)/,keywords:u,contains:["self"].concat(k)}]),O={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E},G={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},oe={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...kr,...wr]}},ne={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},Re={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},et={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function qe(J){return e.concat("(?!",J.join("|"),")")}const Ne={match:e.concat(/\b/,qe([...xr,"super","import"].map(J=>`${J}\\s*\\(`)),r,e.lookahead(/\s*\(/)),className:"title.function",relevance:0},se={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},$e={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},Ce="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",tt={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(Ce)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:u,exports:{PARAMS_CONTAINS:E,CLASS_REFERENCE:oe},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),ne,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,C,T,I,B,de,{match:/\$\d+/},y,oe,{scope:"attr",match:r+e.lookahead(":"),relevance:0},tt,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[de,t.REGEXP_MODE,{className:"function",begin:Ce,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:E}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:a.begin,end:a.end},{match:c},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},Re,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},se,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},Ne,et,G,$e,{match:/\$[(.]/}]}}function Ls(t){const e=t.regex,n=wc(t),r=ma,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],c={begin:[/namespace/,/\s+/,t.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},i={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a},contains:[n.exports.CLASS_REFERENCE]},u={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},p=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],f={$pattern:ma,keyword:_r.concat(p),literal:yr,built_in:Sr.concat(a),"variable.language":Er},h={className:"meta",begin:"@"+r},y=(I,B,te)=>{const de=I.contains.findIndex($=>$.label===B);if(de===-1)throw new Error("can not find mode to replace");I.contains.splice(de,1,te)};Object.assign(n.keywords,f),n.exports.PARAMS_CONTAINS.push(h);const _=n.contains.find(I=>I.scope==="attr"),C=Object.assign({},_,{match:e.concat(r,e.lookahead(/\s*\?:/))});n.exports.PARAMS_CONTAINS.push([n.exports.CLASS_REFERENCE,_,C]),n.contains=n.contains.concat([h,c,i,C]),y(n,"shebang",t.SHEBANG()),y(n,"use_strict",u);const T=n.contains.find(I=>I.label==="func.def");return T.relevance=0,Object.assign(n,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n}function Ds(t){const e=t.regex,n=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],u={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},p={className:"meta",begin:/^(>>>|\.\.\.) /},f={className:"subst",begin:/\{/,end:/\}/,keywords:u,illegal:/#/},h={begin:/\{\{/,relevance:0},y={className:"string",contains:[t.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,p],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,p],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,p,h,f]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,p,h,f]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[t.BACKSLASH_ESCAPE,h,f]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,h,f]},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},_="[0-9](_?[0-9])*",C=`(\\b(${_}))?\\.(${_})|\\b(${_})\\.`,T=`\\b|${r.join("|")}`,I={className:"number",relevance:0,variants:[{begin:`(\\b(${_})|(${C}))[eE][+-]?(${_})[jJ]?(?=${T})`},{begin:`(${C})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${T})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${T})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${T})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${T})`},{begin:`\\b(${_})[jJ](?=${T})`}]},B={className:"comment",begin:e.lookahead(/# type:/),end:/$/,keywords:u,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},te={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,contains:["self",p,I,y,t.HASH_COMMENT_MODE]}]};return f.contains=[y,I,p],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:u,illegal:/(<\/|\?)|=>/,contains:[p,I,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},y,B,t.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[te]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[I,te,y]}]}}function xc(t){const e={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},n={match:/[{}[\],:]/,className:"punctuation",relevance:0},r=["true","false","null"],a={scope:"literal",beginKeywords:r.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:r},contains:[e,n,t.QUOTE_STRING_MODE,a,t.C_NUMBER_MODE,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}function La(t){const e=t.regex,n={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{begin:e.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[t.BACKSLASH_ESCAPE]},c=t.inherit(t.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[t.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},u={className:"string",begin:/"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,n,a]};a.contains.push(u);const p={match:/\\"/},f={className:"string",begin:/'/,end:/'/},h={match:/\\'/},y={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},t.NUMBER_MODE,n]},_=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],C=t.SHEBANG({binary:`(${_.join("|")})`,relevance:10}),T={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[t.inherit(t.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},I=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],B=["true","false"],te={match:/(\/[a-z._-]+)+/},de=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],$=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],k=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],E=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:I,literal:B,built_in:[...de,...$,"set","shopt",...k,...E]},contains:[C,t.SHEBANG(),T,y,c,i,te,u,p,f,h,n]}}function Bs(t){const e="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},a={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},c={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},i={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[t.BACKSLASH_ESCAPE,a]},u=t.inherit(i,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),_={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},C={end:",",endsWithParent:!0,excludeEnd:!0,keywords:e,relevance:0},T={begin:/\{/,end:/\}/,contains:[C],illegal:"\\n",relevance:0},I={begin:"\\[",end:"\\]",contains:[C],illegal:"\\n",relevance:0},B=[r,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+t.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+t.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},t.HASH_COMMENT_MODE,{beginKeywords:e,keywords:{literal:e}},_,{className:"number",begin:t.C_NUMBER_RE+"\\b",relevance:0},T,I,c,i],te=[...B];return te.pop(),te.push(u),C.contains=te,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:B}}function js(t){const e=t.regex,n=e.concat(/[\p{L}_]/u,e.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,a={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},c={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},i=t.inherit(c,{begin:/\(/,end:/\)/}),u=t.inherit(t.APOS_STRING_MODE,{className:"string"}),p=t.inherit(t.QUOTE_STRING_MODE,{className:"string"}),f={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[c,p,u,i,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[c,i,p,u]}]}]},t.COMMENT(//,{relevance:10}),{begin://,relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[p]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[f],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[f],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:e.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:f}]},{className:"tag",begin:e.concat(/<\//,e.lookahead(e.concat(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}const Ec=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),Sc=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Ac=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],Tc=[...Sc,...Ac],Nc=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),Rc=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),$c=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),zc=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function Mc(t){const e=t.regex,n=Ec(t),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},a="and or not only",c=/@-?\w[\w]*(-\w+)*/,i="[a-zA-Z-][a-zA-Z0-9_-]*",u=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[n.BLOCK_COMMENT,r,n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+i,relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+Rc.join("|")+")"},{begin:":(:)?("+$c.join("|")+")"}]},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+zc.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[n.BLOCK_COMMENT,n.HEXCOLOR,n.IMPORTANT,n.CSS_NUMBER_MODE,...u,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...u,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},n.FUNCTION_DISPATCH]},{begin:e.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:c},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:a,attribute:Nc.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...u,n.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+Tc.join("|")+")\\b"}]}}function Cc(t){const e=t.regex,n=t.COMMENT("--","$"),r={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},a={begin:/"/,end:/"/,contains:[{match:/""/}]},c=["true","false","unknown"],i=["double precision","large object","with timezone","without timezone"],u=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],p=["add","asc","collation","desc","final","first","last","view"],f=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],h=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],y=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],_=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],C=h,T=[...f,...p].filter(E=>!h.includes(E)),I={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},B={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},te={match:e.concat(/\b/,e.either(...C),/\s*\(/),relevance:0,keywords:{built_in:C}};function de(E){return e.concat(/\b/,e.either(...E.map(O=>O.replace(/\s+/,"\\s+"))),/\b/)}const $={scope:"keyword",match:de(_),relevance:0};function k(E,{exceptions:O,when:G}={}){const oe=G;return O=O||[],E.map(ne=>ne.match(/\|\d+$/)||O.includes(ne)?ne:oe(ne)?`${ne}|0`:ne)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:k(T,{when:E=>E.length<3}),literal:c,type:u,built_in:y},contains:[{scope:"type",match:de(i)},$,te,I,r,a,t.C_NUMBER_MODE,t.C_BLOCK_COMMENT_MODE,n,B]}}function Us(t){const e=t.regex,n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},r={begin:"^[-\\*]{3,}",end:"$"},a={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},c={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},u=/[A-Za-z][A-Za-z0-9+.-]*/,p={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.concat(/\[.+?\]\(/,u,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},f={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},h={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},y=t.inherit(f,{contains:[]}),_=t.inherit(h,{contains:[]});f.contains.push(_),h.contains.push(y);let C=[n,p];return[f,h,y,_].forEach(te=>{te.contains=te.contains.concat(C)}),C=C.concat(f,h),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:C},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:C}]}]},n,c,f,h,{className:"quote",begin:"^>\\s+",contains:C,end:"$"},a,r,p,i,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}const mn=Ln([]),bn=Ln(!1);let Ar=0;function da(t){const e=`msg_${++Ar}`;return mn.update(n=>[...n,{id:e,role:"user",content:t,timestamp:new Date().toISOString()}]),e}function Hn(){const t=`msg_${++Ar}`;return mn.update(e=>[...e,{id:t,role:"assistant",content:"",timestamp:new Date().toISOString(),streaming:!0,toolCalls:[]}]),bn.set(!0),t}function Oc(t,e){mn.update(n=>n.map(r=>r.id===t?{...r,content:r.content+e}:r))}function Da(t,e){mn.update(n=>n.map(r=>r.id===t?{...r,content:e,streaming:!1}:r)),bn.set(!1)}function Ic(t,e){mn.update(n=>n.map(r=>r.id===t?{...r,toolCalls:[...r.toolCalls||[],e]}:r))}function Hs(){mn.set([]),bn.set(!1)}var Pc=w('
    '),Lc=w(' '),Dc=w('
    '),Bc=w(''),jc=w(" ",1),Uc=w('
    '),Hc=w('
    '),Fc=w('
    result
    '),Gc=w('
    '),Kc=w('
    '),qc=w('
    '),Zc=w('
    '),Wc=w('

    '),Vc=w('
    '),Yc=w('
    '),Xc=w('

    '),Qc=w(''),Jc=w('
    '),ed=w('
    Plan
    '),td=w(''),nd=w('
    '),ad=w(''),sd=w('
    '),rd=w(""),id=w('
    '),ld=w('
    '),od=w('
    '),cd=w('
    '),dd=w('');function ud(t,e){on(e,!0);const n=()=>ct(mn,"$chatMessages",u),r=()=>ct(Vs,"$settingsData",u),a=()=>ct(bn,"$chatStreaming",u),c=()=>ct(kn,"$currentProjectStore",u),i=()=>ct(Kn,"$architectSidebarOpen",u),[u,p]=_n();let f=ve(null);dt.registerLanguage("javascript",Ps),dt.registerLanguage("js",Ps),dt.registerLanguage("typescript",Ls),dt.registerLanguage("ts",Ls),dt.registerLanguage("python",Ds),dt.registerLanguage("py",Ds),dt.registerLanguage("json",xc),dt.registerLanguage("bash",La),dt.registerLanguage("sh",La),dt.registerLanguage("shell",La),dt.registerLanguage("yaml",Bs),dt.registerLanguage("yml",Bs),dt.registerLanguage("xml",js),dt.registerLanguage("html",js),dt.registerLanguage("css",Mc),dt.registerLanguage("sql",Cc),dt.registerLanguage("markdown",Us),dt.registerLanguage("md",Us);const h=new Ke.Renderer;h.code=({text:A,lang:K})=>{const M=K&&dt.getLanguage(K)?K:"";let H;try{H=M?dt.highlight(A,{language:M}).value:dt.highlightAuto(A).value}catch{H=A.replace(//g,">")}return`
    ${K||"code"}
    ${H}
    `},Ke.setOptions({renderer:h});const y=[{value:"auto",label:"Auto-detect"},{value:"requirements",label:"Requirements Doc"},{value:"api_spec",label:"API Spec / OpenAPI"},{value:"data_sample",label:"Data Sample"},{value:"diagram",label:"Architecture Diagram"},{value:"config",label:"Config / Settings"},{value:"code",label:"Source Code"},{value:"documentation",label:"Documentation"},{value:"test_cases",label:"Test Cases"},{value:"schema",label:"Schema / Model"}],_={"image/png":"image","image/jpeg":"image","image/gif":"image","image/webp":"image","image/svg+xml":"image","image/bmp":"image","application/pdf":"pdf","application/msword":"document","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"document","application/vnd.oasis.opendocument.text":"document","application/rtf":"document","application/vnd.ms-excel":"spreadsheet","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"spreadsheet","application/vnd.oasis.opendocument.spreadsheet":"spreadsheet","text/csv":"spreadsheet","application/vnd.ms-powerpoint":"presentation","application/vnd.openxmlformats-officedocument.presentationml.presentation":"presentation","application/vnd.oasis.opendocument.presentation":"presentation","text/plain":"text","text/markdown":"text","application/json":"text","text/html":"text","text/css":"text","application/javascript":"text","application/x-yaml":"text","text/yaml":"text","application/xml":"text","text/xml":"text"},C={".py":"text",".js":"text",".ts":"text",".jsx":"text",".tsx":"text",".json":"text",".md":"text",".txt":"text",".csv":"spreadsheet",".yaml":"text",".yml":"text",".xml":"text",".html":"text",".css":"text",".sql":"text",".sh":"text",".bash":"text",".r":"text",".rb":"text",".go":"text",".rs":"text",".java":"text",".kt":"text",".swift":"text",".pdf":"pdf",".doc":"document",".docx":"document",".odt":"document",".rtf":"document",".xls":"spreadsheet",".xlsx":"spreadsheet",".ods":"spreadsheet",".ppt":"presentation",".pptx":"presentation",".odp":"presentation",".png":"image",".jpg":"image",".jpeg":"image",".gif":"image",".webp":"image",".svg":"image",".bmp":"image"},T=Object.keys(_).join(",")+",.py,.js,.ts,.jsx,.tsx,.sql,.sh,.r,.rb,.go,.rs,.java,.kt,.swift";function I(A){if(A.type&&_[A.type])return _[A.type];const K="."+A.name.split(".").pop()?.toLowerCase();return K&&C[K]?C[K]:"other"}let B=ve(On([])),te=ve(void 0),de=ve(!1);async function $(A){const K=Array.from(A);for(const M of K){if(M.size>20*1024*1024)continue;const H=I(M),l=await k(M),v={id:`file-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,name:M.name,type:M.type||"application/octet-stream",size:M.size,category:H,data:l,docType:"auto"};H==="image"&&(v.preview=`data:${M.type};base64,${l}`),b(B,[...s(B),v],!0)}}function k(A){return new Promise((K,M)=>{const H=new FileReader;H.onload=()=>{const l=H.result,v=l.includes(",")?l.split(",")[1]:l;K(v)},H.onerror=M,H.readAsDataURL(A)})}function E(A){b(B,s(B).filter(K=>K.id!==A),!0)}let O=ve(null);function G(A,K){b(B,s(B).map(M=>M.id===A?{...M,docType:K}:M),!0),b(O,null)}function oe(A){return!A||A==="auto"?"Auto-detect":y.find(K=>K.value===A)?.label??A}function ne(A){const K=A.target;K.files&&K.files.length>0&&($(K.files),K.value="")}function Re(A){const K=A.clipboardData?.items;if(!K)return;const M=[];for(const H of Array.from(K))if(H.kind==="file"){const l=H.getAsFile();l&&M.push(l)}M.length>0&&(A.preventDefault(),$(M))}const et=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],qe=["Drafting the blueprint...","Consulting the Oracle...","Aligning the nodes...","Designing the inevitable...","Architecting a masterpiece...","Tracing the path of causality...","Reshaping the construct...","Balancing the equation...","Loading the next iteration...","Surveying the pipeline...","Engineering the solution...","Selecting the right components...","Orchestrating the agents...","Running the simulation...","Weaving the connections...","Compiling the grand design...","Evaluating all possible paths...","Constructing the framework...","Visualizing the architecture...","Reticulating splines..."];let Ne=ve(On(et[0])),se=ve(On(qe[0])),$e=null,Ce=null,tt=0,J=0;const Pe=_t(()=>n().some(A=>A.streaming&&!A.content));In(()=>{s(Pe)?(tt=0,J=Math.floor(Math.random()*qe.length),b(se,qe[J],!0),$e=setInterval(()=>{tt=(tt+1)%et.length,b(Ne,et[tt],!0)},80),Ce=setInterval(()=>{J=(J+1)%qe.length,b(se,qe[J],!0)},2500)):($e&&(clearInterval($e),$e=null),Ce&&(clearInterval(Ce),Ce=null))});const Oe=_t(()=>r()?.user_profile?.assistant_name||"The Architect");let Le=On({});function Ze(A){Le[A]=!Le[A]}function rt(A){const K={};for(const M of A)K[M.tool]=(K[M.tool]||0)+1;return Object.entries(K).map(([M,H])=>H>1?`${M} x${H}`:M).join(", ")}function at(A){return A.replace(/)<[^<]*)*<\/script>/gi,"").replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,"")}function Xe(A){if(!A)return"";const K=Ke(A,{async:!1});return at(K)}let ut=ve(""),pt=ve(void 0),ft=ve(void 0),De=ve(null),z=ve(""),q=ve(""),j=null,Z=ve(0),ee=!1;const ue=5;let be=ve(380),Ee=ve(!1),_e=ve(0),we=ve(0);const R=280,W=.5;function U(A){A.preventDefault(),b(Ee,!0),b(_e,A.clientX,!0),b(we,s(be),!0),document.addEventListener("mousemove",ye),document.addEventListener("mouseup",he)}function ye(A){if(!s(Ee))return;const K=Math.floor(window.innerWidth*W),M=A.clientX-s(_e);b(be,Math.max(R,Math.min(K,s(we)+M)),!0)}function he(){b(Ee,!1),document.removeEventListener("mousemove",ye),document.removeEventListener("mouseup",he)}function me(A){Gn.update(K=>{const M=new Map;for(const l of K)M.set(l.id,l);for(const l of A.nodes){const v=M.get(l.id);v&&(v.data={...v.data,label:l.label||v.data.label,...l.config},l.position&&(v.position=l.position))}const H=A.nodes.filter(l=>!M.has(l.id)).map(l=>({id:l.id,type:l.type,position:l.position??{x:250,y:200},data:{label:l.label||l.id,...l.config}}));return[...K,...H]}),qa.update(K=>{const M=new Set;for(const l of K)M.add(l.id);const H=A.edges.filter(l=>!M.has(l.id)).map(l=>({id:l.id,source:l.source,target:l.target,sourceHandle:l.source_handle??void 0,targetHandle:l.target_handle??void 0}));return[...K,...H]}),A.nodes.length===0&&(Gn.set([]),qa.set([])),Oi()}function ze(){const A=window.location.protocol==="https:"?"wss:":"ws:",K=Ct(kn),M=K?`?project=${encodeURIComponent(K.name)}`:"";return`${A}//${window.location.host}/ws/assistant${M}`}function Ie(){if(s(De)&&s(De).readyState===WebSocket.OPEN)return;b(q,""),ee=!1;let A;try{A=new WebSocket(ze())}catch{b(q,"AI Assistant requires a configured LLM provider. Check Settings.");return}A.onopen=()=>{b(q,""),b(Z,0);const K=Ct(Es);if(K){Es.set(null),da(K.text),b(z,Hn(),!0);const M={action:"chat",message:K.text};K.attachments&&K.attachments.length>0&&(M.attachments=K.attachments);try{A.send(JSON.stringify(M))}catch{b(q,"Failed to send initial message."),bn.set(!1),b(z,"")}yt()}},A.onmessage=K=>{let M;try{M=JSON.parse(K.data)}catch{return}if(M.type==="token")s(z)||b(z,Hn(),!0),Oc(s(z),M.content),yt();else if(M.type==="response_complete"){s(z)&&Da(s(z),M.full_text),b(z,""),yt();const H=Ct(kn);if(H){const l=Ct(mn);Ht.assistant.saveHistory(H.name,l.map(v=>({role:v.role,content:v.content,timestamp:v.timestamp??new Date().toISOString(),toolCalls:v.toolCalls??[]}))).catch(()=>{})}}else if(M.type==="plan"){s(z)||b(z,Hn(),!0);let H=[],l=[];try{H=JSON.parse(M.steps)}catch{H=[]}try{l=JSON.parse(M.options)}catch{l=[]}b(f,{summary:M.summary||"",steps:H,options:l,question:M.question||"",msgId:s(z)},!0),yt()}else if(M.type==="tool_call"){if(s(z)||b(z,Hn(),!0),M.tool==="present_plan"){yt();return}let H=M.args;if(typeof H=="string")try{H=JSON.parse(H)}catch{H={raw:H}}(!H||typeof H!="object"||Array.isArray(H))&&(H={}),Ic(s(z),{tool:M.tool,args:H,result:M.result}),yt()}else if(M.type==="canvas_sync"){const H=M.canvas;H&&(me(H),Mi(H.nodes,H.edges),Ci())}else M.type==="error"&&(b(q,M.message,!0),ee=!0,s(z)?Da(s(z),""):bn.set(!1),b(z,""))},A.onclose=()=>{if(s(z)?(Da(s(z),"[Connection lost]"),b(z,"")):bn.set(!1),b(De,null),ee){ee=!1,b(Z,ue);return}Ba(Z),s(Z){},b(De,A,!0)}function Te(){b(Z,0),Ie()}function bt(){j&&(clearTimeout(j),j=null),s(De)?.close(),b(De,null)}function Ot(){const A=s(ut).trim();if(!A&&s(B).length===0||a()||!s(De))return;const K=A||`[${s(B).length} file${s(B).length>1?"s":""} attached]`;da(K),b(z,Hn(),!0);const M={action:"chat",message:A||"Please analyze the attached files."};s(B).length>0&&(M.attachments=s(B).map(H=>({name:H.name,type:H.type,category:H.category,size:H.size,data:H.data,docType:H.docType}))),b(ut,""),b(B,[],!0);try{s(De).send(JSON.stringify(M))}catch{b(q,"Failed to send message. Connection may be lost."),bn.set(!1),b(z,"");return}yt()}function dn(A){A.key==="Enter"&&!A.shiftKey&&(A.preventDefault(),Ot())}function It(){if(Hs(),s(De)&&s(De).readyState===WebSocket.OPEN)try{s(De).send(JSON.stringify({action:"clear_history"}))}catch{}b(q,"")}function yt(){requestAnimationFrame(()=>{s(pt)&&(s(pt).scrollTop=s(pt).scrollHeight)})}function Xt(A){return new Date(A).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})}function Pt(A){if(!(!s(f)||!s(De))){da(A),b(z,Hn(),!0);try{s(De).send(JSON.stringify({action:"chat",message:A}))}catch{b(q,"Failed to send plan selection."),bn.set(!1),b(z,"")}b(f,null),yt()}}function yn(){Kn.set(!1)}In(()=>{const A=c();ys(()=>{A&&s(De)&&(s(De).close(),b(De,null),Ie())})}),In(()=>{const A=c();A&&ys(()=>{Ht.assistant.getHistory(A.name).then(K=>{if(K&&K.length>0){Hs();for(const M of K)M.role==="user"?da(M.content):M.role==="assistant"&&mn.update(H=>[...H,{id:`msg_hist_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,role:"assistant",content:M.content,timestamp:M.timestamp||new Date().toISOString(),streaming:!1,toolCalls:M.toolCalls??[]}])}}).catch(()=>{})})}),Ja(()=>{Ie(),s(ft)?.focus()}),Yr(()=>{bt(),$e&&clearInterval($e),Ce&&clearInterval(Ce),document.removeEventListener("mousemove",ye),document.removeEventListener("mouseup",he)});var vt=Ye(),Nt=fe(vt);{var Ft=A=>{var K=dd();let M,H;var l=d(K),v=d(l),N=d(v),ce=d(N);pa(ce,{size:16}),o(N);var He=g(N,2),We=d(He,!0);o(He),o(v);var P=g(v,2),L=d(P);xo(L,{size:14}),o(P),o(l);var ae=g(l,2),lt=d(ae);{var st=V=>{var Se=Pc(),Be=d(Se),ke=d(Be);pa(ke,{size:48}),o(Be);var xe=g(Be,2),Ge=d(xe,!0);o(xe);var Qe=g(xe,2),Rt=d(Qe,!0);o(Qe),o(Se),le(()=>{ge(Ge,s(Oe)),ge(Rt,s(Oe)==="The Architect"?"I am The Architect. I designed the canvas upon which your agent pipelines take form. Describe what you wish to construct, and I shall design it.":`Ask ${s(Oe)} to help build your agent pipeline.`)}),m(V,Se)},Qt=V=>{var Se=Ye(),Be=fe(Se);gt(Be,1,n,ke=>ke.id,(ke,xe)=>{var Ge=Zc();let Qe;var Rt=d(Ge),nn=d(Rt);{var gn=Ae=>{Wl(Ae,{size:18})},vn=Ae=>{pa(Ae,{size:18})};Q(nn,Ae=>{s(xe).role==="user"?Ae(gn):Ae(vn,!1)})}o(Rt);var Bt=g(Rt,2),hn=d(Bt),Kt=d(hn),jt=d(Kt,!0);o(Kt);var an=g(Kt,2),kt=d(an,!0);o(an),o(hn);var Ut=g(hn,2);let qt;var pe=d(Ut);{var sn=Ae=>{var nt=Ye(),ht=fe(nt);{var x=ie=>{var X=Dc(),Ve=d(X),mt=d(Ve,!0);o(Ve);var $n=g(Ve,2);Ui($n,()=>s(se),rn=>{var zn=Lc(),Aa=d(zn,!0);o(zn),le(()=>ge(Aa,s(se))),m(rn,zn)}),o(X),le(()=>ge(mt,s(Ne))),m(ie,X)},D=ie=>{var X=jc(),Ve=fe(X);Ai(Ve,()=>Xe(s(xe).content));var mt=g(Ve,2);{var $n=rn=>{var zn=Bc();m(rn,zn)};Q(mt,rn=>{s(xe).streaming&&rn($n)})}m(ie,X)};Q(ht,ie=>{s(xe).streaming&&!s(xe).content?ie(x):ie(D,!1)})}m(Ae,nt)},je=Ae=>{var nt=Jn();le(()=>ge(nt,s(xe).content)),m(Ae,nt)};Q(pe,Ae=>{s(xe).role==="assistant"?Ae(sn):Ae(je,!1)})}o(Ut);var Y=g(Ut,2);{var Fe=Ae=>{var nt=qc(),ht=d(nt),x=d(ht),D=d(x);let ie;var X=d(D);Si(X,{size:12}),o(D);var Ve=g(D,2);Ua(Ve,{size:12});var mt=g(Ve,2),$n=d(mt);o(mt),o(x);var rn=g(x,2),zn=d(rn,!0);o(rn),o(ht);var Aa=g(ht,2);{var Tr=qn=>{var Ta=Kc();gt(Ta,21,()=>s(xe).toolCalls,xt,(Nr,fn,Rr)=>{var Na=Gc(),Ra=d(Na),vs=d(Ra);vs.textContent=Rr+1;var $a=g(vs,2),$r=d($a,!0);o($a);var zr=g($a,2);{var Mr=Zt=>{Ti(Zt,{size:11,class:"tool-call-ok"})};Q(zr,Zt=>{s(fn).result&&Zt(Mr)})}o(Ra);var hs=g(Ra,2);{var Cr=Zt=>{var Mn=Hc();gt(Mn,21,()=>Object.entries(s(fn).args),xt,(aa,za)=>{var sa=_t(()=>Xr(s(za),2));let Lr=()=>s(sa)[0],Zn=()=>s(sa)[1];var Ma=Uc(),Ca=d(Ma),Dr=d(Ca);o(Ca);var fs=g(Ca,2),Br=d(fs,!0);o(fs),o(Ma),le(jr=>{ge(Dr,`${Lr()??""}:`),ge(Br,jr)},[()=>typeof Zn()=="string"?Zn().length>120?Zn().slice(0,117)+"...":Zn():JSON.stringify(Zn())]),m(aa,Ma)}),o(Mn),m(Zt,Mn)},Or=_t(()=>s(fn).args&&Object.keys(s(fn).args).length>0);Q(hs,Zt=>{s(Or)&&Zt(Cr)})}var Ir=g(hs,2);{var Pr=Zt=>{var Mn=Fc(),aa=g(d(Mn),2),za=d(aa,!0);o(aa),o(Mn),le(sa=>ge(za,sa),[()=>s(fn).result.length>200?s(fn).result.slice(0,197)+"...":s(fn).result]),m(Zt,Mn)};Q(Ir,Zt=>{s(fn).result&&Zt(Pr)})}o(Na),le(()=>ge($r,s(fn).tool)),m(Nr,Na)}),o(Ta),m(qn,Ta)};Q(Aa,qn=>{Le[s(xe).id]&&qn(Tr)})}o(nt),le(qn=>{ie=it(D,1,"tool-chevron svelte-mwxll1",null,ie,{expanded:Le[s(xe).id]}),ge($n,`${s(xe).toolCalls.length??""} tool - call${s(xe).toolCalls.length!==1?"s":""}`),ge(zn,qn)},[()=>rt(s(xe).toolCalls)]),F("click",ht,()=>Ze(s(xe).id)),m(Ae,nt)};Q(Y,Ae=>{s(xe).toolCalls&&s(xe).toolCalls.length>0&&Ae(Fe)})}o(Bt),o(Ge),le(Ae=>{Qe=it(Ge,1,"message svelte-mwxll1",null,Qe,{user:s(xe).role==="user",assistant:s(xe).role==="assistant"}),ge(jt,s(xe).role==="user"?"You":s(Oe)),ge(kt,Ae),qt=it(Ut,1,"message-content svelte-mwxll1",null,qt,{markdown:s(xe).role==="assistant"})},[()=>Xt(s(xe).timestamp)]),m(ke,Ge)}),m(V,Se)};Q(lt,V=>{n().length===0?V(st):V(Qt,!1)})}o(ae),ga(ae,V=>b(pt,V),()=>s(pt));var Jt=g(ae,2);{var En=V=>{var Se=ed(),Be=d(Se),ke=d(Be),xe=d(ke),Ge=d(xe);Ua(Ge,{size:11}),o(xe),Je(2),o(ke);var Qe=g(ke,2),Rt=d(Qe);Ka(Rt,{size:12}),o(Qe),o(Be);var nn=g(Be,2),gn=d(nn);{var vn=Y=>{var Fe=Wc(),Ae=d(Fe,!0);o(Fe),le(()=>ge(Ae,s(f).summary)),m(Y,Fe)};Q(gn,Y=>{s(f).summary&&Y(vn)})}var Bt=g(gn,2);{var hn=Y=>{var Fe=Yc();gt(Fe,21,()=>s(f).steps,xt,(Ae,nt,ht)=>{var x=Vc(),D=d(x);D.textContent=ht+1;var ie=g(D,2),X=d(ie,!0);o(ie),o(x),le(()=>ge(X,s(nt))),m(Ae,x)}),o(Fe),m(Y,Fe)};Q(Bt,Y=>{s(f).steps.length>0&&Y(hn)})}var Kt=g(Bt,2);{var jt=Y=>{var Fe=Xc(),Ae=d(Fe,!0);o(Fe),le(()=>ge(Ae,s(f).question)),m(Y,Fe)};Q(Kt,Y=>{s(f).question&&Y(jt)})}o(nn);var an=g(nn,2),kt=d(an);{var Ut=Y=>{var Fe=Jc();gt(Fe,21,()=>s(f).options,xt,(Ae,nt,ht)=>{var x=Qc(),D=d(x),ie=d(D,!0);o(D);var X=g(D,2),Ve=d(X,!0);o(X),o(x),le(mt=>{ge(ie,mt),ge(Ve,s(nt))},[()=>String.fromCharCode(65+ht)]),F("click",x,()=>Pt(s(nt))),m(Ae,x)}),o(Fe),m(Y,Fe)};Q(kt,Y=>{s(f).options.length>0&&Y(Ut)})}var qt=g(kt,2),pe=d(qt);ot(pe,"rows",2);var sn=g(pe,2),je=d(sn);As(je,{size:12}),o(sn),o(qt),o(an),o(Se),le(()=>ot(pe,"placeholder",s(f).options.length>0?"Or type your own response...":"Type your response...")),F("click",Qe,()=>b(f,null)),F("keydown",pe,Y=>{if(Y.key==="Enter"&&!Y.shiftKey){Y.preventDefault();const Fe=Y.currentTarget;Fe.value.trim()&&Pt(Fe.value.trim())}}),F("click",sn,Y=>{const Fe=Y.currentTarget.previousElementSibling;Fe?.value.trim()&&Pt(Fe.value.trim())}),m(V,Se)};Q(Jt,V=>{s(f)&&V(En)})}var Sn=g(Jt,2);{var An=V=>{var Se=nd(),Be=d(Se),ke=d(Be,!0);o(Be);var xe=g(Be,2);{var Ge=Qe=>{var Rt=td();F("click",Rt,Te),m(Qe,Rt)};Q(xe,Qe=>{s(Z)>=ue&&Qe(Ge)})}o(Se),le(()=>ge(ke,s(q))),m(V,Se)};Q(Sn,V=>{s(q)&&V(An)})}var Tn=g(Sn,2),Bn=d(Tn);{var Gt=V=>{var Se=od();gt(Se,21,()=>s(B),Be=>Be.id,(Be,ke)=>{var xe=ld(),Ge=d(xe);let Qe;var Rt=d(Ge);{var nn=je=>{var Y=ad();le(()=>{ot(Y,"src",s(ke).preview),ot(Y,"alt",s(ke).name)}),m(je,Y)},gn=je=>{var Y=sd(),Fe=d(Y);{var Ae=X=>{xs(X,{size:14})},nt=X=>{wo(X,{size:14})},ht=X=>{So(X,{size:14})},x=X=>{xs(X,{size:14})},D=X=>{Bi(X,{size:14})},ie=X=>{Ni(X,{size:14})};Q(Fe,X=>{s(ke).category==="pdf"?X(Ae):s(ke).category==="spreadsheet"?X(nt,1):s(ke).category==="presentation"?X(ht,2):s(ke).category==="document"?X(x,3):s(ke).category==="image"?X(D,4):X(ie,!1)})}o(Y),m(je,Y)};Q(Rt,je=>{s(ke).category==="image"&&s(ke).preview?je(nn):je(gn,!1)})}var vn=g(Rt,2),Bt=d(vn),hn=d(Bt,!0);o(Bt);var Kt=g(Bt,2),jt=d(Kt),an=d(jt,!0);o(jt);var kt=g(jt,2);Ks(kt,{size:9}),o(Kt),o(vn);var Ut=g(vn,2),qt=d(Ut);Ka(qt,{size:12}),o(Ut),o(Ge);var pe=g(Ge,2);{var sn=je=>{var Y=id();gt(Y,21,()=>y,xt,(Fe,Ae)=>{var nt=rd();let ht;var x=d(nt,!0);o(nt),le(()=>{ht=it(nt,1,"type-option svelte-mwxll1",null,ht,{selected:s(ke).docType===s(Ae).value}),ge(x,s(Ae).label)}),F("click",nt,()=>G(s(ke).id,s(Ae).value)),m(Fe,nt)}),o(Y),m(je,Y)};Q(pe,je=>{s(O)===s(ke).id&&je(sn)})}o(xe),le((je,Y)=>{Qe=it(Ge,1,"attachment-badge svelte-mwxll1",null,Qe,{"has-preview":s(ke).category==="image"&&s(ke).preview}),ot(Bt,"title",s(ke).name),ge(hn,je),ge(an,Y)},[()=>s(ke).name.length>20?s(ke).name.slice(0,17)+"...":s(ke).name,()=>oe(s(ke).docType)]),F("click",Kt,()=>b(O,s(O)===s(ke).id?null:s(ke).id,!0)),F("click",Ut,()=>E(s(ke).id)),m(Be,xe)}),o(Se),m(V,Se)};Q(Bn,V=>{s(B).length>0&&V(Gt)})}var Lt=g(Bn,2),en=d(Lt),un=d(en),wa=d(un);Ws(wa,{size:16}),o(un);var xa=g(un,2);{var tn=V=>{var Se=cd(),Be=d(Se),ke=d(Be);Eo(ke,{size:14}),Je(2),o(Be);var xe=g(Be,2),Ge=d(xe);ko(Ge,{size:14}),Je(2),o(xe),o(Se),F("click",Be,()=>{s(te)?.click(),b(de,!1)}),F("click",xe,()=>{console.log("Screenshot not yet implemented"),b(de,!1)}),m(V,Se)};Q(xa,V=>{s(de)&&V(tn)})}o(en);var Nn=g(en,2);ga(Nn,V=>b(te,V),()=>s(te));var Dt=g(Nn,2);_a(Dt),ot(Dt,"rows",1),ga(Dt,V=>b(ft,V),()=>s(ft));var na=g(Dt,2),Rn=d(na),Ea=d(Rn);qs(Ea,{size:14}),o(Rn);var pn=g(Rn,2),Sa=d(pn);{var S=V=>{as(V,{size:14,class:"spin-icon"})},re=V=>{As(V,{size:14})};Q(Sa,V=>{a()?V(S):V(re,!1)})}o(pn),o(na),o(Lt),o(Tn);var Me=g(Tn,2);o(K),le(V=>{M=it(K,1,"architect-sidebar svelte-mwxll1",null,M,{dragging:s(Ee)}),H=Qs(K,"",H,{width:`${s(be)??""}px`}),ge(We,s(Oe)),un.disabled=a(),ot(Nn,"accept",T),ot(Dt,"placeholder",`Ask ${s(Oe)??""}...`),Dt.disabled=a(),Rn.disabled=n().length===0,pn.disabled=V},[()=>!s(ut).trim()&&s(B).length===0||a()||!s(De)]),F("click",P,yn),F("click",un,()=>b(de,!s(de))),F("change",Nn,ne),F("keydown",Dt,dn),Qa("paste",Dt,Re),$t(Dt,()=>s(ut),V=>b(ut,V)),F("click",Rn,It),F("click",pn,Ot),F("mousedown",Me,U),m(A,K)};Q(Nt,A=>{i()&&A(Ft)})}m(t,vt),cn(),p()}xn(["click","keydown","change","mousedown"]);var pd=w('
    '),gd=w('
    '),vd=w('
    Made with by Firefly Software Solutions
    ',1);function hd(t,e){on(e,!0);const n=()=>ct(qi,"$page",r),[r,a]=_n(),c=_t(()=>n().url.pathname==="/"||n().url.pathname==="/index.html");Ja(()=>{Xi();function $(k){k.preventDefault();const E=k.reason instanceof Error?k.reason.message:String(k.reason);wt(`Unhandled error: ${E}`,"error"),console.error("[AppShell] Unhandled rejection:",k.reason)}return window.addEventListener("unhandledrejection",$),()=>{Qi(),window.removeEventListener("unhandledrejection",$)}});function i(){const $=document.activeElement;if(!$)return!1;const k=$.tagName.toLowerCase();return!!(k==="input"||k==="textarea"||$.isContentEditable)}function u($){if(s(c))return;const k=$.metaKey||$.ctrlKey;if($.key==="s"&&k){$.preventDefault();const E=Ct(kn);E&&Ht.projects.savePipeline(E.name,"main",wn()).then(()=>wt("Pipeline saved","success")).catch(()=>wt("Failed to save pipeline","error"));return}if($.key===","&&k){$.preventDefault(),ea.set(!0);return}if($.key==="k"&&k){$.preventDefault(),Za.update(E=>!E);return}if($.key==="Enter"&&k){$.preventDefault(),ns(wn());return}if($.key==="D"&&k&&$.shiftKey){$.preventDefault(),ts(wn());return}if($.key==="/"&&k){$.preventDefault(),Kn.update(E=>!E);return}if($.key==="d"&&k&&!$.shiftKey){if(i())return;$.preventDefault();const E=Ct(ra);if(!E)return;const G=Ct(Gn).find(Re=>Re.id===E);if(!G)return;const oe=`${G.type}-dup-${Date.now()}`,ne=40;Gn.update(Re=>[...Re,{...G,id:oe,position:{x:G.position.x+ne,y:G.position.y+ne},data:{...G.data}}]),ra.set(oe);return}if(($.key==="Delete"||$.key==="Backspace")&&!k&&!$.shiftKey&&!$.altKey){if(i())return;const E=Ct(ra);if(!E)return;$.preventDefault(),Gn.update(O=>O.filter(G=>G.id!==E)),qa.update(O=>O.filter(G=>G.source!==E&&G.target!==E)),ra.set(null);return}if($.key==="?"&&!k&&!$.altKey){if(i())return;$.preventDefault(),Wa.update(E=>!E);return}}var p=vd();Qa("keydown",Qr,u);var f=fe(p),h=d(f);kl(h,{get isHomePage(){return s(c)}});var y=g(h,2);{var _=$=>{var k=pd(),E=d(k);Ha(E,()=>e.children),o(k),m($,k)},C=$=>{var k=gd(),E=d(k);ud(E,{});var O=g(E,2),G=d(O);Ha(G,()=>e.children),o(O),o(k),m($,k)};Q(y,$=>{s(c)?$(_):$(C,!1)})}Je(2),o(f);var T=g(f,2);zl(T,{});var I=g(T,2);Dl(I,{});var B=g(I,2);ql(B,{});var te=g(B,2);bo(te,{});var de=g(te,2);yo(de,{}),m(t,p),cn(),a()}var fd=w('');function Nd(t,e){on(e,!0),Ja(async()=>{await Fa();try{const n=await Ht.settings.status();(n.first_start||!n.setup_complete)&&va.set(!0),await Xs()}catch{}}),Hi("12qhfyh",n=>{var r=fd();le(()=>ot(r,"href",ss)),m(n,r)}),hd(t,{children:(n,r)=>{var a=Ye(),c=fe(a);Ha(c,()=>e.children),m(n,a)},$$slots:{default:!0}}),cn()}export{Nd as component,Td as universal}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/1.BL8ytnJA.js b/studio-desktop/frontend-dist/_app/immutable/nodes/1.BL8ytnJA.js deleted file mode 100644 index cd76013e..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/1.BL8ytnJA.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as u}from"../chunks/FsCUQR17.js";import{p as h,f as g,C as l,a as v,b as d,D as _,F as e,G as s,I as x,J as o}from"../chunks/BNectIeB.js";import{s as $,p}from"../chunks/DaZstLas.js";const b={get error(){return p.error},get status(){return p.status}};$.updated.check;const i=b;var k=_("

    ",1);function G(m,n){h(n,!1),u();var r=k(),t=g(r),c=e(t,!0);s(t);var a=x(t,2),f=e(a,!0);s(a),l(()=>{o(c,i.status),o(f,i.error?.message)}),v(m,r),d()}export{G as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/1.CM9fyoZO.js b/studio-desktop/frontend-dist/_app/immutable/nodes/1.CM9fyoZO.js deleted file mode 100644 index b8ee8561..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/1.CM9fyoZO.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as u}from"../chunks/CiPkpaXo.js";import{p as h,f as g,z as l,a as v,j as d,A as _,B as e,C as s,D as x,F as o}from"../chunks/BESIXtBI.js";import{s as $,p}from"../chunks/gvU2Nsg7.js";const k={get error(){return p.error},get status(){return p.status}};$.updated.check;const i=k;var b=_("

    ",1);function C(m,n){h(n,!1),u();var r=b(),t=g(r),c=e(t,!0);s(t);var a=x(t,2),f=e(a,!0);s(a),l(()=>{o(c,i.status),o(f,i.error?.message)}),v(m,r),d()}export{C as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/1.CgtKuGLP.js b/studio-desktop/frontend-dist/_app/immutable/nodes/1.CgtKuGLP.js deleted file mode 100644 index 62e86517..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/1.CgtKuGLP.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as u}from"../chunks/D7CioVkw.js";import{p as h,i as g,z as l,j as v,f as d,A as _,B as s,C as a,D as x,F as o}from"../chunks/hL-aZVJ4.js";import{s as $,p}from"../chunks/DEAaRqcq.js";const k={get error(){return p.error},get status(){return p.status}};$.updated.check;const i=k;var b=_("

    ",1);function C(m,n){h(n,!1),u();var r=b(),t=g(r),c=s(t,!0);a(t);var e=x(t,2),f=s(e,!0);a(e),l(()=>{o(c,i.status),o(f,i.error?.message)}),v(m,r),d()}export{C as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/1.Czl_Q6cB.js b/studio-desktop/frontend-dist/_app/immutable/nodes/1.Czl_Q6cB.js deleted file mode 100644 index 9e5d0a27..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/1.Czl_Q6cB.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as u}from"../chunks/l8YpzWR9.js";import{p as g,g as h,z as l,i as v,j as d,A as _,B as s,C as a,D as x,F as o}from"../chunks/DCyBifBO.js";import{s as $,p}from"../chunks/DhiGuJwU.js";const k={get error(){return p.error},get status(){return p.status}};$.updated.check;const i=k;var b=_("

    ",1);function C(m,n){g(n,!1),u();var r=b(),t=h(r),c=s(t,!0);a(t);var e=x(t,2),f=s(e,!0);a(e),l(()=>{o(c,i.status),o(f,i.error?.message)}),v(m,r),d()}export{C as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/2.B2KpwBSe.js b/studio-desktop/frontend-dist/_app/immutable/nodes/2.B2KpwBSe.js deleted file mode 100644 index 62c0e5e9..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/2.B2KpwBSe.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{c as ne,f as re,a as d,T as Ja,p as et,Q as D,U as at,z as E,V as h,t as a,j as tt,B as n,A as _,D as c,G as l,C as s,W as te,X as st,S as se,R as na,F as $,Y as ra,Z as la}from"../chunks/BESIXtBI.js";import{l as Re,s as Ue,i as x,b as nt,a as rt,c as ia}from"../chunks/CJh9TUc0.js";import{I as qe,s as We,P as ge,S as he,e as Te,b as me,a as lt,c as it,d as Ee,f as ot,g as ct,B as fe,D as Ie,h as Le,p as vt,X as oa,i as ut,F as dt,L as pt,j as gt,l as ht,k as mt,m as ft,n as _t,r as Ne,T as bt,o as yt,u as xt,q as Pt}from"../chunks/0zSFSexy.js";import{g as _e}from"../chunks/gvU2Nsg7.js";import{p as Me,c as Be}from"../chunks/8I91iWf8.js";import{U as be,A as ca,F as wt}from"../chunks/Biw60Ycb.js";import{I as kt}from"../chunks/p0Zj8fW7.js";import"../chunks/CiPkpaXo.js";function zt(R,A){const U=Re(A,["children","$$slots","$$events","$$legacy"]);const q=[["circle",{cx:"12",cy:"12",r:"1"}],["circle",{cx:"12",cy:"5",r:"1"}],["circle",{cx:"12",cy:"19",r:"1"}]];qe(R,Ue({name:"ellipsis-vertical"},()=>U,{get iconNode(){return q},children:(L,le)=>{var k=ne(),P=re(k);We(P,A,"default",{}),d(L,k)},$$slots:{default:!0}}))}function Dt(R,A){const U=Re(A,["children","$$slots","$$events","$$legacy"]);const q=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}],["path",{d:"m15 5 4 4"}]];qe(R,Ue({name:"pencil"},()=>U,{get iconNode(){return q},children:(L,le)=>{var k=ne(),P=re(k);We(P,A,"default",{}),d(L,k)},$$slots:{default:!0}}))}function jt(R,A){const U=Re(A,["children","$$slots","$$events","$$legacy"]);const q=[["path",{d:"M12 4v16"}],["path",{d:"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2"}],["path",{d:"M9 20h6"}]];qe(R,Ue({name:"type"},()=>U,{get iconNode(){return q},children:(L,le)=>{var k=ne(),P=re(k);We(P,A,"default",{}),d(L,k)},$$slots:{default:!0}}))}var $t=_('
    '),At=_('
    '),Ft=_('

    Creating your project...

    '),St=_(''),Ct=_('
    '),Tt=_(''),Et=_(''),It=_(''),Lt=_('
    '),Nt=_(''),Mt=_(' '),Bt=_(''),Rt=_(' '),Ut=_(' '),qt=_('
    '),Wt=_('
    '),Vt=_('

    '),Kt=_('
    '),Ot=_(''),Qt=_('

    Describe your AI agent pipeline and The Architect will design it for you

    ');function ss(R,A){et(A,!0);const U=()=>ia(ct,"$settingsData",L),q=()=>ia(vt,"$projects",L),[L,le]=rt();let k=D(""),P=D(!1),W=D(""),ye=D(void 0);const Ve=se(()=>U()?.user_profile?.name||"");let V=D(at([])),F=D(null),S=D(null),ie=D(""),I=D(null),oe=D(""),N=D(null),Y=D(!1);function va(){l(F,null),l(S,null),l(I,null),l(N,null),l(Y,!1)}function ua(e,t){t.stopPropagation(),l(F,null),l(S,e,!0),l(ie,e,!0)}let xe=!1;async function Ke(e,t){if(t?.stopPropagation(),xe||a(S)===null)return;const i=a(ie).trim();if(!i||i===e){l(S,null);return}xe=!0;try{await yt(e,i)}catch(p){console.error("[home] Rename failed:",p)}l(S,null),xe=!1}function da(e,t,i){i.stopPropagation(),l(F,null),l(I,e,!0),l(oe,t||"",!0)}let Pe=!1;async function Oe(e,t){if(t?.stopPropagation(),!Pe&&a(I)!==null){Pe=!0;try{await xt(e,a(oe).trim())}catch(i){console.error("[home] Update description failed:",i)}l(I,null),Pe=!1}}function pa(e,t){t.stopPropagation(),l(F,null),l(N,e,!0)}async function ga(e,t){t?.stopPropagation();try{await mt(e)}catch(i){console.error("[home] Delete failed:",i)}l(N,null)}async function ha(){try{await Pt()}catch(e){console.error("[home] Delete all failed:",e)}l(Y,!1)}function ma(e,t){t.stopPropagation(),l(F,a(F)===e?null:e,!0),l(S,null),l(I,null),l(N,null)}function fa(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function _a(e){if(e.type.startsWith("image/"))return"image";if(e.type.includes("pdf")||e.type.includes("word")||e.type.includes("document"))return"document";if(e.type.startsWith("text/")||e.type.includes("json")||e.type.includes("javascript")||e.type.includes("yaml")||e.type.includes("xml"))return"text";const t=e.name.split(".").pop()?.toLowerCase()??"";return["py","js","ts","jsx","tsx","json","md","txt","csv","yaml","yml","xml","html","css","sql","sh","go","rs","java","rb","r"].includes(t)?"text":["png","jpg","jpeg","gif","webp","svg","bmp"].includes(t)?"image":["pdf","doc","docx","odt","rtf"].includes(t)?"document":"other"}function ba(e){const t=e.target;if(t.files&&t.files.length>0){for(const i of Array.from(t.files))i.size>20*1024*1024||l(V,[...a(V),{id:`att-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,name:i.name,size:i.size,category:_a(i),file:i}],!0);t.value=""}}function ya(e){return new Promise((t,i)=>{const p=new FileReader;p.onload=()=>{const j=p.result,C=j.includes(",")?j.split(",")[1]:j;t(C)},p.onerror=i,p.readAsDataURL(e)})}function xa(e){l(V,a(V).filter(t=>t.id!==e),!0)}function Pa(){a(ye)?.click()}const X=se(()=>(q()??[]).slice().sort((e,t)=>new Date(t.created_at).getTime()-new Date(e.created_at).getTime())),Qe=se(()=>(()=>{const e=a(W).trim().toLowerCase();return e?a(X).filter(t=>t.name.toLowerCase().includes(e)||t.description&&t.description.toLowerCase().includes(e)):a(X)})()),wa=se(()=>a(X).length>0);function ka(e){try{return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}catch{return""}}function za(e){switch(e){case"blank":return ge;case"simple-qa":return fe;case"reasoning-pipeline":return Le;case"multi-agent":return be;case"rag-pipeline":return Ie;case"content-pipeline":return he;case"data-processing":return fe;case"parallel-analysis":return be;default:return he}}const Da=se(()=>ot.map(e=>({id:e.id,name:e.name,description:e.description,icon:za(e.id),architectPrompt:e.architectPrompt})));async function Xe(){const e=a(k).trim();if(!(!e||a(P))){l(P,!0);try{const t=await Promise.all(a(V).map(async p=>({name:p.file.name,size:p.file.size,category:p.category,type:p.file.type||"application/octet-stream",data:await ya(p.file),docType:"auto"})));Me.set({text:e,attachments:t.length>0?t:void 0});const{name:i}=await it.assistant.inferProjectName(e);await Ee(i),Be.set(!0),_e("/construct")}catch(t){console.error("[home] Failed to create project from prompt:",t),Me.set({text:e});const i=`project-${Date.now()}`;await Ee(i),Be.set(!0),_e("/construct")}finally{l(P,!1)}}}function ja(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Xe())}async function $a(e){const t=e.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");await Ee(t||"untitled"),e.architectPrompt?(Me.set({text:e.architectPrompt}),Be.set(!0)):ht(e.id),_e("/construct")}async function Aa(e,t){if(a(S)||a(I)||a(F)||a(N)){t.stopPropagation();return}ft(e),_e("/construct")}var we=Qt(),Ye=c(n(we),2),ke=n(Ye),Ge=n(ke),Fa=n(Ge);{var Sa=e=>{var t=na();E(()=>$(t,`What do you want to build, ${a(Ve)??""}?`)),d(e,t)},Ca=e=>{var t=na("What do you want to build?");d(e,t)};x(Fa,e=>{a(Ve)?e(Sa):e(Ca,!1)})}s(Ge),te(2),s(ke);var ze=c(ke,2),ce=n(ze);let Ze;var G=n(ce);st(G);var He=c(G,2);{var Ta=e=>{var t=At();Te(t,21,()=>a(V),i=>i.id,(i,p)=>{var j=$t(),C=n(j),H=n(C);{var K=f=>{kt(f,{size:12})},J=f=>{dt(f,{size:12})};x(H,f=>{a(p).category==="image"?f(K):f(J,!1)})}s(C);var M=c(C,2),b=n(M,!0);s(M);var r=c(M,2),w=n(r,!0);s(r);var z=c(r,2),T=n(z);oa(T,{size:10}),s(z),s(j),E(f=>{ut(M,"title",a(p).name),$(b,a(p).name),$(w,f)},[()=>fa(a(p).size)]),h("click",z,()=>xa(a(p).id)),d(i,j)}),s(t),d(e,t)};x(He,e=>{a(V).length>0&&e(Ta)})}var Je=c(He,2),De=n(Je),Z=n(De),Ea=n(Z);ge(Ea,{size:16}),s(Z);var ea=c(Z,2);nt(ea,e=>l(ye,e),()=>a(ye)),s(De);var aa=c(De,2),ve=n(aa),Ia=n(ve);{var La=e=>{pt(e,{size:16,class:"spinner-icon"})},Na=e=>{gt(e,{size:16})};x(Ia,e=>{a(P)?e(La):e(Na,!1)})}s(ve),s(aa),s(Je),s(ce);var Ma=c(ce,2);{var Ba=e=>{var t=Ft();d(e,t)};x(Ma,e=>{a(P)&&e(Ba)})}s(ze);var je=c(ze,2),$e=n(je),Ra=n($e);he(Ra,{size:13}),te(2),s($e);var ta=c($e,2);Te(ta,21,()=>a(Da),e=>e.id,(e,t)=>{var i=St(),p=n(i),j=n(p);{var C=u=>{ge(u,{size:18})},H=u=>{fe(u,{size:18})},K=u=>{Le(u,{size:18})},J=u=>{be(u,{size:18})},M=u=>{Ie(u,{size:18})},b=u=>{he(u,{size:18})};x(j,u=>{a(t).icon===ge?u(C):a(t).icon===fe?u(H,1):a(t).icon===Le?u(K,2):a(t).icon===be?u(J,3):a(t).icon===Ie?u(M,4):u(b,!1)})}s(p);var r=c(p,2),w=n(r),z=n(w,!0);s(w);var T=c(w,2),f=n(T,!0);s(T),s(r);var m=c(r,2),y=n(m);ca(y,{size:14}),s(m),s(i),E(()=>{$(z,a(t).name),$(f,a(t).description)}),h("click",i,()=>$a(a(t))),d(e,i)}),s(ta),s(je);var sa=c(je,2);{var Ua=e=>{var t=Kt(),i=n(t),p=c(n(i),2);{var j=b=>{var r=ne(),w=re(r);{var z=f=>{var m=Ct(),y=n(m),u=n(y);s(y);var B=c(y,2),O=c(B,2);s(m),E(()=>$(u,`Delete all ${a(X).length??""} projects?`)),h("click",B,()=>ha()),h("click",O,()=>l(Y,!1)),d(f,m)},T=f=>{var m=Tt();h("click",m,()=>{l(Y,!0),l(F,null)}),d(f,m)};x(w,f=>{a(Y)?f(z):f(T,!1)})}d(b,r)};x(p,b=>{a(X).length>1&&b(j)})}s(i);var C=c(i,2);{var H=b=>{var r=It(),w=n(r);_t(w,{size:14});var z=c(w,2);Ne(z);var T=c(z,2);{var f=m=>{var y=Et(),u=n(y);oa(u,{size:12}),s(y),h("click",y,()=>l(W,"")),d(m,y)};x(T,m=>{a(W)&&m(f)})}s(r),me(z,()=>a(W),m=>l(W,m)),d(b,r)};x(C,b=>{a(X).length>3&&b(H)})}var K=c(C,2);Te(K,21,()=>a(Qe),b=>b.name,(b,r)=>{var w=ne(),z=re(w);{var T=m=>{var y=Lt(),u=n(y),B=n(u),O=n(B);s(B);var ee=c(B,2),ue=n(ee),Ae=c(ue,2);s(ee),s(u),s(y),E(()=>$(O,`Delete "${a(r).name??""}"?`)),h("click",ue,ae=>ga(a(r).name,ae)),h("click",Ae,ae=>{ae.stopPropagation(),l(N,null)}),d(m,y)},f=m=>{var y=Wt(),u=n(y),B=n(u);wt(B,{size:18}),s(u);var O=c(u,2),ee=n(O);{var ue=g=>{var v=Nt();Ne(v),ra(v,!0),h("click",v,o=>o.stopPropagation()),h("keydown",v,o=>{o.stopPropagation(),o.key==="Enter"&&(o.preventDefault(),Ke(a(r).name,o)),o.key==="Escape"&&l(S,null)}),la("blur",v,o=>Ke(a(r).name,o)),me(v,()=>a(ie),o=>l(ie,o)),d(g,v)},Ae=g=>{var v=Mt(),o=n(v,!0);s(v),E(()=>$(o,a(r).name)),d(g,v)};x(ee,g=>{a(S)===a(r).name?g(ue):g(Ae,!1)})}var ae=c(ee,2);{var Va=g=>{var v=Bt();Ne(v),ra(v,!0),h("click",v,o=>o.stopPropagation()),h("keydown",v,o=>{o.stopPropagation(),o.key==="Enter"&&(o.preventDefault(),Oe(a(r).name,o)),o.key==="Escape"&&l(I,null)}),la("blur",v,o=>Oe(a(r).name,o)),me(v,()=>a(oe),o=>l(oe,o)),d(g,v)},Ka=g=>{var v=Rt(),o=n(v,!0);s(v),E(()=>$(o,a(r).description)),d(g,v)},Oa=g=>{var v=Ut(),o=n(v,!0);s(v),E(Se=>$(o,Se),[()=>ka(a(r).created_at)]),d(g,v)};x(ae,g=>{a(I)===a(r).name?g(Va):a(r).description?g(Ka,1):g(Oa,!1)})}s(O);var Fe=c(O,2),Qa=n(Fe);ca(Qa,{size:14}),s(Fe);var de=c(Fe,2),Xa=n(de);zt(Xa,{size:14}),s(de);var Ya=c(de,2);{var Ga=g=>{var v=qt(),o=n(v),Se=n(o);Dt(Se,{size:12}),te(2),s(o);var pe=c(o,2),Za=n(pe);jt(Za,{size:12}),te(2),s(pe);var Ce=c(pe,4),Ha=n(Ce);bt(Ha,{size:12}),te(2),s(Ce),s(v),h("click",v,Q=>Q.stopPropagation()),h("click",o,Q=>ua(a(r).name,Q)),h("click",pe,Q=>da(a(r).name,a(r).description,Q)),h("click",Ce,Q=>pa(a(r).name,Q)),d(g,v)};x(Ya,g=>{a(F)===a(r).name&&g(Ga)})}s(y),h("click",y,g=>Aa(a(r),g)),h("click",de,g=>ma(a(r).name,g)),d(m,y)};x(z,m=>{a(N)===a(r).name?m(T):m(f,!1)})}d(b,w)}),s(K);var J=c(K,2);{var M=b=>{var r=Vt(),w=n(r);s(r),E(()=>$(w,`No projects matching "${a(W)??""}"`)),d(b,r)};x(J,b=>{a(W)&&a(Qe).length===0&&b(M)})}s(t),d(e,t)};x(sa,e=>{a(wa)&&e(Ua)})}var qa=c(sa,2);{var Wa=e=>{var t=Ot();h("click",t,va),d(e,t)};x(qa,e=>{(a(F)||a(I)||a(S)||a(N))&&e(Wa)})}s(Ye),s(we),E(e=>{Ze=lt(ce,1,"prompt-box svelte-1uha8ag",null,Ze,{disabled:a(P)}),G.disabled=a(P),Z.disabled=a(P),ve.disabled=e},[()=>a(P)||!a(k).trim()]),h("keydown",G,ja),me(G,()=>a(k),e=>l(k,e)),h("click",Z,Pa),h("change",ea,ba),h("click",ve,Xe),d(R,we),tt(),le()}Ja(["keydown","click","change"]);export{ss as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/2.BuNaGOOw.js b/studio-desktop/frontend-dist/_app/immutable/nodes/2.BuNaGOOw.js deleted file mode 100644 index c1ea1caa..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/2.BuNaGOOw.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{f as be,g as ye,i as m,G as Qe,p as Ve,I as R,J as Ye,z as q,K as z,t as a,j as Ze,D as o,B as i,A as j,L as P,C as s,M as ue,N as et,O as ee,F as A}from"../chunks/DCyBifBO.js";import{l as xe,s as we,b as tt,i as D,a as at,c as st}from"../chunks/v7tHB-Lt.js";import{I as ze,s as je,P as K,e as te,b as it,a as nt,c as rt,d as O,f as ge,D as U,B as ae,g as se,p as ot,X as ct,h as lt,F as vt,L as dt,l as pt,i as ut}from"../chunks/BAxs8Xtu.js";import{g as W}from"../chunks/DhiGuJwU.js";import{p as me,c as he}from"../chunks/BCCFcAOv.js";import"../chunks/l8YpzWR9.js";import{S as ie,I as gt,a as mt}from"../chunks/CdQ27ih8.js";import{A as fe}from"../chunks/DQfFYHAU.js";function _e(S,f){const F=xe(f,["children","$$slots","$$events","$$legacy"]);const I=[["path",{d:"M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4"}]];ze(S,we({name:"flame"},()=>F,{get iconNode(){return I},children:(C,$)=>{var l=be(),_=ye(l);je(_,f,"default",{}),m(C,l)},$$slots:{default:!0}}))}function G(S,f){const F=xe(f,["children","$$slots","$$events","$$legacy"]);const I=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87"}],["circle",{cx:"9",cy:"7",r:"4"}]];ze(S,we({name:"users"},()=>F,{get iconNode(){return I},children:(C,$)=>{var l=be(),_=ye(l);je(_,f,"default",{}),m(C,l)},$$slots:{default:!0}}))}var ht=j('
    '),ft=j('
    '),_t=j('

    Creating your project...

    '),bt=j(''),yt=j(''),xt=j('
    '),wt=j('

    What do you want to build?

    Design, test, and deploy AI agent pipelines visually

    ');function It(S,f){Ve(f,!0);const F=()=>st(ot,"$projects",I),[I,C]=at();let $=R(""),l=R(!1),_=R(void 0),b=R(Ye([]));function $e(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function ke(e){if(e.type.startsWith("image/"))return"image";if(e.type.includes("pdf")||e.type.includes("word")||e.type.includes("document"))return"document";if(e.type.startsWith("text/")||e.type.includes("json")||e.type.includes("javascript")||e.type.includes("yaml")||e.type.includes("xml"))return"text";const t=e.name.split(".").pop()?.toLowerCase()??"";return["py","js","ts","jsx","tsx","json","md","txt","csv","yaml","yml","xml","html","css","sql","sh","go","rs","java","rb","r"].includes(t)?"text":["png","jpg","jpeg","gif","webp","svg","bmp"].includes(t)?"image":["pdf","doc","docx","odt","rtf"].includes(t)?"document":"other"}function Pe(e){const t=e.target;if(t.files&&t.files.length>0){for(const r of Array.from(t.files))r.size>20*1024*1024||P(b,[...a(b),{id:`att-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,name:r.name,size:r.size,category:ke(r),file:r}],!0);t.value=""}}function Ae(e){return new Promise((t,r)=>{const n=new FileReader;n.onload=()=>{const v=n.result,d=v.includes(",")?v.split(",")[1]:v;t(d)},n.onerror=r,n.readAsDataURL(e)})}function De(e){P(b,a(b).filter(t=>t.id!==e),!0)}function Se(){a(_)?.click()}const ne=ee(()=>(F()??[]).slice().sort((e,t)=>new Date(t.created_at).getTime()-new Date(e.created_at).getTime()).slice(0,10)),Fe=ee(()=>a(ne).length>0);function Ie(e){try{return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}catch{return""}}function Ce(e){switch(e){case"blank":return K;case"simple-qa":return se;case"reasoning-pipeline":return ae;case"multi-agent":return G;case"rag-pipeline":return U;default:return ie}}const Le=ee(()=>[...ge.map(e=>({id:e.id,name:e.name,description:e.description,icon:Ce(e.id),exists:!0})),...["multi-agent","rag-pipeline"].filter(e=>!ge.find(t=>t.id===e)).map(e=>({id:e,name:e==="multi-agent"?"Multi-Agent Team":"RAG Pipeline",description:e==="multi-agent"?"Coordinate multiple agents with different roles":"Retrieval-augmented generation with vector search",icon:e==="multi-agent"?G:U,exists:!1}))]);async function re(){const e=a($).trim();if(!(!e||a(l))){P(l,!0);try{const t=await Promise.all(a(b).map(async n=>({name:n.file.name,size:n.file.size,category:n.category,type:n.file.type||"application/octet-stream",data:await Ae(n.file),docType:"auto"})));me.set({text:e,attachments:t.length>0?t:void 0});const{name:r}=await rt.assistant.inferProjectName(e);await O(r),he.set(!0),W("/construct")}catch(t){console.error("[home] Failed to create project from prompt:",t),me.set({text:e});const r=`project-${Date.now()}`;await O(r),he.set(!0),W("/construct")}finally{P(l,!1)}}}function Me(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),re())}async function Ne(e){if(e.exists){const t=e.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");await O(t||"untitled"),pt(e.id)}else{const t=e.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");await O(t||"untitled")}W("/construct")}async function Te(e){ut(e),W("/construct")}var H=wt(),oe=o(i(H),2),J=i(oe),ce=i(J),Be=o(i(ce),2);_e(Be,{size:28}),s(ce),ue(4),s(J);var X=o(J,2),T=i(X);let le;var L=i(T),Ee=i(L);K(Ee,{size:18}),s(L);var Q=o(L,2);tt(Q,e=>P(_,e),()=>a(_));var V=o(Q,2),ve=i(V);{var Re=e=>{var t=ft();te(t,21,()=>a(b),r=>r.id,(r,n)=>{var v=ht(),d=i(v),y=i(d);{var M=p=>{gt(p,{size:11})},x=p=>{vt(p,{size:11})};D(y,p=>{a(n).category==="image"?p(M):p(x,!1)})}s(d);var u=o(d,2),N=i(u,!0);s(u);var g=o(u,2),w=i(g,!0);s(g);var h=o(g,2),k=i(h);ct(k,{size:10}),s(h),s(v),q(p=>{lt(u,"title",a(n).name),A(N,a(n).name),A(w,p)},[()=>$e(a(n).size)]),z("click",h,()=>De(a(n).id)),m(r,v)}),s(t),m(e,t)};D(ve,e=>{a(b).length>0&&e(Re)})}var B=o(ve,2);et(B),s(V);var E=o(V,2),qe=i(E);{var Ke=e=>{dt(e,{size:18,class:"spinner-icon"})},Oe=e=>{mt(e,{size:18})};D(qe,e=>{a(l)?e(Ke):e(Oe,!1)})}s(E),s(T);var Ue=o(T,2);{var We=e=>{var t=_t();m(e,t)};D(Ue,e=>{a(l)&&e(We)})}s(X);var Y=o(X,2),Z=i(Y),Ge=i(Z);ie(Ge,{size:13}),ue(2),s(Z);var de=o(Z,2);te(de,21,()=>a(Le),e=>e.id,(e,t)=>{var r=bt(),n=i(r),v=i(n);{var d=c=>{K(c,{size:20})},y=c=>{se(c,{size:20})},M=c=>{ae(c,{size:20})},x=c=>{G(c,{size:20})},u=c=>{U(c,{size:20})},N=c=>{ie(c,{size:20})};D(v,c=>{a(t).icon===K?c(d):a(t).icon===se?c(y,1):a(t).icon===ae?c(M,2):a(t).icon===G?c(x,3):a(t).icon===U?c(u,4):c(N,!1)})}s(n);var g=o(n,2),w=i(g),h=i(w,!0);s(w);var k=o(w,2),p=i(k,!0);s(k),s(g);var pe=o(g,2),Xe=i(pe);fe(Xe,{size:14}),s(pe),s(r),q(()=>{A(h,a(t).name),A(p,a(t).description)}),z("click",r,()=>Ne(a(t))),m(e,r)}),s(de),s(Y);var He=o(Y,2);{var Je=e=>{var t=xt(),r=o(i(t),2);te(r,21,()=>a(ne),n=>n.name,(n,v)=>{var d=yt(),y=i(d),M=i(y);_e(M,{size:16}),s(y);var x=o(y,2),u=i(x),N=i(u,!0);s(u);var g=o(u,2),w=i(g,!0);s(g),s(x);var h=o(x,2),k=i(h);fe(k,{size:14}),s(h),s(d),q(p=>{A(N,a(v).name),A(w,p)},[()=>Ie(a(v).created_at)]),z("click",d,()=>Te(a(v))),m(n,d)}),s(r),s(t),m(e,t)};D(He,e=>{a(Fe)&&e(Je)})}s(oe),s(H),q(e=>{le=nt(T,1,"prompt-box svelte-1uha8ag",null,le,{disabled:a(l)}),L.disabled=a(l),B.disabled=a(l),E.disabled=e},[()=>a(l)||!a($).trim()]),z("click",L,Se),z("change",Q,Pe),z("keydown",B,Me),it(B,()=>a($),e=>P($,e)),z("click",E,re),m(S,H),Ze(),C()}Qe(["click","change","keydown"]);export{It as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/2.DdY508-2.js b/studio-desktop/frontend-dist/_app/immutable/nodes/2.DdY508-2.js deleted file mode 100644 index f4d1214f..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/2.DdY508-2.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{g as Ve,i as Ye,j as m,G as Ze,p as et,I as N,J as tt,z as $,K as w,t as a,f as at,B as i,A as k,D as o,L as D,C as s,M as fe,N as st,O as B,P as _e,F as z}from"../chunks/hL-aZVJ4.js";import{l as it,s as nt,i as j,b as rt,a as ot,c as be}from"../chunks/B_6VzoXV.js";import{I as lt,s as ct,P as E,e as ee,b as vt,a as dt,c as ut,d as R,f as ye,D as K,g as pt,B as te,h as ae,p as gt,X as mt,i as ht,F as ft,L as _t,l as bt,j as yt}from"../chunks/BWWgRDE1.js";import{g as W}from"../chunks/DEAaRqcq.js";import{p as xe,c as we}from"../chunks/yhLnWQwL.js";import{S as se,I as xt,a as wt}from"../chunks/DWbf9ulZ.js";import"../chunks/D7CioVkw.js";import{A as ze,F as zt}from"../chunks/DaNA2RYx.js";function q(O,I){const U=it(I,["children","$$slots","$$events","$$legacy"]);const G=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87"}],["circle",{cx:"9",cy:"7",r:"4"}]];lt(O,nt({name:"users"},()=>U,{get iconNode(){return G},children:(C,ie)=>{var f=Ve(),u=Ye(f);ct(u,I,"default",{}),m(C,f)},$$slots:{default:!0}}))}var jt=k('
    '),kt=k('
    '),At=k('

    Creating your project...

    '),Dt=k(''),Pt=k(''),Ft=k('
    '),St=k('

    Describe your AI agent pipeline and The Architect will design it for you

    ');function Rt(O,I){et(I,!0);const U=()=>be(pt,"$settingsData",C),G=()=>be(gt,"$projects",C),[C,ie]=ot();let f=N(""),u=N(!1),H=N(void 0);const ne=B(()=>U()?.user_profile?.name||"");let _=N(tt([]));function je(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function ke(e){if(e.type.startsWith("image/"))return"image";if(e.type.includes("pdf")||e.type.includes("word")||e.type.includes("document"))return"document";if(e.type.startsWith("text/")||e.type.includes("json")||e.type.includes("javascript")||e.type.includes("yaml")||e.type.includes("xml"))return"text";const t=e.name.split(".").pop()?.toLowerCase()??"";return["py","js","ts","jsx","tsx","json","md","txt","csv","yaml","yml","xml","html","css","sql","sh","go","rs","java","rb","r"].includes(t)?"text":["png","jpg","jpeg","gif","webp","svg","bmp"].includes(t)?"image":["pdf","doc","docx","odt","rtf"].includes(t)?"document":"other"}function Ae(e){const t=e.target;if(t.files&&t.files.length>0){for(const r of Array.from(t.files))r.size>20*1024*1024||D(_,[...a(_),{id:`att-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,name:r.name,size:r.size,category:ke(r),file:r}],!0);t.value=""}}function De(e){return new Promise((t,r)=>{const n=new FileReader;n.onload=()=>{const c=n.result,v=c.includes(",")?c.split(",")[1]:c;t(v)},n.onerror=r,n.readAsDataURL(e)})}function Pe(e){D(_,a(_).filter(t=>t.id!==e),!0)}function Fe(){a(H)?.click()}const re=B(()=>(G()??[]).slice().sort((e,t)=>new Date(t.created_at).getTime()-new Date(e.created_at).getTime()).slice(0,10)),Se=B(()=>a(re).length>0);function Te(e){try{return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}catch{return""}}function $e(e){switch(e){case"blank":return E;case"simple-qa":return ae;case"reasoning-pipeline":return te;case"multi-agent":return q;case"rag-pipeline":return K;default:return se}}const Ie=B(()=>[...ye.map(e=>({id:e.id,name:e.name,description:e.description,icon:$e(e.id),exists:!0})),...["multi-agent","rag-pipeline"].filter(e=>!ye.find(t=>t.id===e)).map(e=>({id:e,name:e==="multi-agent"?"Multi-Agent Team":"RAG Pipeline",description:e==="multi-agent"?"Coordinate multiple agents with different roles":"Retrieval-augmented generation with vector search",icon:e==="multi-agent"?q:K,exists:!1}))]);async function oe(){const e=a(f).trim();if(!(!e||a(u))){D(u,!0);try{const t=await Promise.all(a(_).map(async n=>({name:n.file.name,size:n.file.size,category:n.category,type:n.file.type||"application/octet-stream",data:await De(n.file),docType:"auto"})));xe.set({text:e,attachments:t.length>0?t:void 0});const{name:r}=await ut.assistant.inferProjectName(e);await R(r),we.set(!0),W("/construct")}catch(t){console.error("[home] Failed to create project from prompt:",t),xe.set({text:e});const r=`project-${Date.now()}`;await R(r),we.set(!0),W("/construct")}finally{D(u,!1)}}}function Ce(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),oe())}async function Le(e){if(e.exists){const t=e.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");await R(t||"untitled"),bt(e.id)}else{const t=e.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");await R(t||"untitled")}W("/construct")}async function Me(e){yt(e),W("/construct")}var J=St(),le=o(i(J),2),X=i(le),ce=i(X),Ne=i(ce);{var Be=e=>{var t=_e();$(()=>z(t,`What do you want to build, ${a(ne)??""}?`)),m(e,t)},Ee=e=>{var t=_e("What do you want to build?");m(e,t)};j(Ne,e=>{a(ne)?e(Be):e(Ee,!1)})}s(ce),fe(2),s(X);var Q=o(X,2),L=i(Q);let ve;var P=i(L);st(P);var de=o(P,2);{var Re=e=>{var t=kt();ee(t,21,()=>a(_),r=>r.id,(r,n)=>{var c=jt(),v=i(c),b=i(v);{var S=d=>{xt(d,{size:12})},y=d=>{ft(d,{size:12})};j(b,d=>{a(n).category==="image"?d(S):d(y,!1)})}s(v);var p=o(v,2),T=i(p,!0);s(p);var g=o(p,2),x=i(g,!0);s(g);var h=o(g,2),A=i(h);mt(A,{size:10}),s(h),s(c),$(d=>{ht(p,"title",a(n).name),z(T,a(n).name),z(x,d)},[()=>je(a(n).size)]),w("click",h,()=>Pe(a(n).id)),m(r,c)}),s(t),m(e,t)};j(de,e=>{a(_).length>0&&e(Re)})}var ue=o(de,2),V=i(ue),F=i(V),Ke=i(F);E(Ke,{size:16}),s(F);var pe=o(F,2);rt(pe,e=>D(H,e),()=>a(H)),s(V);var ge=o(V,2),M=i(ge),We=i(M);{var qe=e=>{_t(e,{size:16,class:"spinner-icon"})},Oe=e=>{wt(e,{size:16})};j(We,e=>{a(u)?e(qe):e(Oe,!1)})}s(M),s(ge),s(ue),s(L);var Ue=o(L,2);{var Ge=e=>{var t=At();m(e,t)};j(Ue,e=>{a(u)&&e(Ge)})}s(Q);var Y=o(Q,2),Z=i(Y),He=i(Z);se(He,{size:13}),fe(2),s(Z);var me=o(Z,2);ee(me,21,()=>a(Ie),e=>e.id,(e,t)=>{var r=Dt(),n=i(r),c=i(n);{var v=l=>{E(l,{size:18})},b=l=>{ae(l,{size:18})},S=l=>{te(l,{size:18})},y=l=>{q(l,{size:18})},p=l=>{K(l,{size:18})},T=l=>{se(l,{size:18})};j(c,l=>{a(t).icon===E?l(v):a(t).icon===ae?l(b,1):a(t).icon===te?l(S,2):a(t).icon===q?l(y,3):a(t).icon===K?l(p,4):l(T,!1)})}s(n);var g=o(n,2),x=i(g),h=i(x,!0);s(x);var A=o(x,2),d=i(A,!0);s(A),s(g);var he=o(g,2),Qe=i(he);ze(Qe,{size:14}),s(he),s(r),$(()=>{z(h,a(t).name),z(d,a(t).description)}),w("click",r,()=>Le(a(t))),m(e,r)}),s(me),s(Y);var Je=o(Y,2);{var Xe=e=>{var t=Ft(),r=o(i(t),2);ee(r,21,()=>a(re),n=>n.name,(n,c)=>{var v=Pt(),b=i(v),S=i(b);zt(S,{size:15}),s(b);var y=o(b,2),p=i(y),T=i(p,!0);s(p);var g=o(p,2),x=i(g,!0);s(g),s(y);var h=o(y,2),A=i(h);ze(A,{size:14}),s(h),s(v),$(d=>{z(T,a(c).name),z(x,d)},[()=>Te(a(c).created_at)]),w("click",v,()=>Me(a(c))),m(n,v)}),s(r),s(t),m(e,t)};j(Je,e=>{a(Se)&&e(Xe)})}s(le),s(J),$(e=>{ve=dt(L,1,"prompt-box svelte-1uha8ag",null,ve,{disabled:a(u)}),P.disabled=a(u),F.disabled=a(u),M.disabled=e},[()=>a(u)||!a(f).trim()]),w("keydown",P,Ce),vt(P,()=>a(f),e=>D(f,e)),w("click",F,Fe),w("change",pe,Ae),w("click",M,oe),m(O,J),at(),ie()}Ze(["keydown","click","change"]);export{Rt as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/2.aUmnlf6d.js b/studio-desktop/frontend-dist/_app/immutable/nodes/2.aUmnlf6d.js deleted file mode 100644 index a6034f3b..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/2.aUmnlf6d.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{c as ue,f as ge,a as d,K as Ee,p as qe,C as Q,L as T,y as t,b as Be,I as r,F as i,D as k,M as re,N as W,G as s,O as oe,P as Fe,Q as V,J as C}from"../chunks/BNectIeB.js";import{l as me,s as he,i as I,a as Ke,b as Oe}from"../chunks/BB2KRr3j.js";import{I as fe,s as _e,P as L,e as le,b as Re,a as Ge,c as Ue,d as M,f as ce,D as E,B as X,g as Y,p as He,L as Je,l as Qe,h as We}from"../chunks/K2hNZgUo.js";import{g as q}from"../chunks/DaZstLas.js";import{c as ve}from"../chunks/CKy8R5Mg.js";import"../chunks/FsCUQR17.js";import{S as Z,a as Ve}from"../chunks/CCyXRANn.js";import{A as de}from"../chunks/N_rdQ7t6.js";function pe(h,c){const f=me(c,["children","$$slots","$$events","$$legacy"]);const _=[["path",{d:"M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4"}]];fe(h,he({name:"flame"},()=>f,{get iconNode(){return _},children:(b,p)=>{var o=ue(),u=ge(o);_e(u,c,"default",{}),d(b,o)},$$slots:{default:!0}}))}function B(h,c){const f=me(c,["children","$$slots","$$events","$$legacy"]);const _=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87"}],["circle",{cx:"9",cy:"7",r:"4"}]];fe(h,he({name:"users"},()=>f,{get iconNode(){return _},children:(b,p)=>{var o=ue(),u=ge(o);_e(u,c,"default",{}),d(b,o)},$$slots:{default:!0}}))}var Xe=k('

    Creating your project...

    '),Ye=k(''),Ze=k(''),ea=k('
    '),aa=k('

    What do you want to build?

    Design, test, and deploy AI agent pipelines visually

    ');function da(h,c){qe(c,!0);const f=()=>Oe(He,"$projects",_),[_,b]=Ke();let p=re(""),o=re(!1);const u=V(()=>(f()??[]).slice().sort((e,a)=>new Date(a.created_at).getTime()-new Date(e.created_at).getTime()).slice(0,10)),be=V(()=>t(u).length>0);function we(e){try{return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}catch{return""}}function ye(e){switch(e){case"blank":return L;case"simple-qa":return Y;case"reasoning-pipeline":return X;case"multi-agent":return B;case"rag-pipeline":return E;default:return Z}}const ze=V(()=>[...ce.map(e=>({id:e.id,name:e.name,description:e.description,icon:ye(e.id),exists:!0})),...["multi-agent","rag-pipeline"].filter(e=>!ce.find(a=>a.id===e)).map(e=>({id:e,name:e==="multi-agent"?"Multi-Agent Team":"RAG Pipeline",description:e==="multi-agent"?"Coordinate multiple agents with different roles":"Retrieval-augmented generation with vector search",icon:e==="multi-agent"?B:E,exists:!1}))]);async function ee(){const e=t(p).trim();if(!(!e||t(o))){W(o,!0);try{const{name:a}=await Ue.assistant.inferProjectName(e);await M(a),ve.set(!0),q("/construct")}catch(a){console.error("[home] Failed to create project from prompt:",a);const l=`project-${Date.now()}`;await M(l),ve.set(!0),q("/construct")}finally{W(o,!1)}}}function xe(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),ee())}async function $e(e){if(e.exists){const a=e.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");await M(a||"untitled"),Qe(e.id)}else{const a=e.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"");await M(a||"untitled")}q("/construct")}async function Pe(e){We(e),q("/construct")}var F=aa(),ae=r(i(F),2),K=i(ae),te=i(K),ke=r(i(te),2);pe(ke,{size:28}),s(te),oe(4),s(K);var O=r(K,2),j=i(O);let se;var D=i(j),je=i(D);L(je,{size:18}),s(D);var w=r(D,2);Fe(w);var N=r(w,2),De=i(N);{var Ne=e=>{Je(e,{size:18,class:"spinner-icon"})},Se=e=>{Ve(e,{size:18})};I(De,e=>{t(o)?e(Ne):e(Se,!1)})}s(N),s(j);var Ae=r(j,2);{var Te=e=>{var a=Xe();d(e,a)};I(Ae,e=>{t(o)&&e(Te)})}s(O);var R=r(O,2),G=i(R),Ce=i(G);Z(Ce,{size:13}),oe(2),s(G);var ie=r(G,2);le(ie,21,()=>t(ze),e=>e.id,(e,a)=>{var l=Ye(),v=i(l),y=i(v);{var g=n=>{L(n,{size:20})},z=n=>{Y(n,{size:20})},U=n=>{X(n,{size:20})},x=n=>{B(n,{size:20})},$=n=>{E(n,{size:20})},H=n=>{Z(n,{size:20})};I(y,n=>{t(a).icon===L?n(g):t(a).icon===Y?n(z,1):t(a).icon===X?n(U,2):t(a).icon===B?n(x,3):t(a).icon===E?n($,4):n(H,!1)})}s(v);var m=r(v,2),P=i(m),S=i(P,!0);s(P);var A=r(P,2),J=i(A,!0);s(A),s(m);var ne=r(m,2),Me=i(ne);de(Me,{size:14}),s(ne),s(l),Q(()=>{C(S,t(a).name),C(J,t(a).description)}),T("click",l,()=>$e(t(a))),d(e,l)}),s(ie),s(R);var Ie=r(R,2);{var Le=e=>{var a=ea(),l=r(i(a),2);le(l,21,()=>t(u),v=>v.name,(v,y)=>{var g=Ze(),z=i(g),U=i(z);pe(U,{size:16}),s(z);var x=r(z,2),$=i(x),H=i($,!0);s($);var m=r($,2),P=i(m,!0);s(m),s(x);var S=r(x,2),A=i(S);de(A,{size:14}),s(S),s(g),Q(J=>{C(H,t(y).name),C(P,J)},[()=>we(t(y).created_at)]),T("click",g,()=>Pe(t(y))),d(v,g)}),s(l),s(a),d(e,a)};I(Ie,e=>{t(be)&&e(Le)})}s(ae),s(F),Q(e=>{se=Ge(j,1,"prompt-box svelte-1uha8ag",null,se,{disabled:t(o)}),D.disabled=t(o),w.disabled=t(o),N.disabled=e},[()=>t(o)||!t(p).trim()]),T("keydown",w,xe),Re(w,()=>t(p),e=>W(p,e)),T("click",N,ee),d(h,F),Be(),b()}Ee(["keydown","click"]);export{da as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/3.7-a9x_uM.js b/studio-desktop/frontend-dist/_app/immutable/nodes/3.7-a9x_uM.js deleted file mode 100644 index c830373b..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/3.7-a9x_uM.js +++ /dev/null @@ -1,9 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as nc}from"../chunks/CiPkpaXo.js";import{aC as ac,b4 as oc,bp as rc,h as sc,e as ic,aw as lc,a8 as vi,a7 as fi,m as un,v as cc,bq as dc,c as Te,f as oe,a as g,br as uc,bs as Or,bt as pi,p as Ee,u as vc,j as Ne,B as d,C as c,A as x,t as a,ab as ha,S as k,b9 as zn,z as U,D as h,F as Y,W as he,bu as hi,l as xe,Q as G,G as y,b8 as Mt,R as fc,bv as pc,bw as mr,V as fe,Z as bo,T as Tt,bn as ga,bx as Ft,bo as Gt,by as hc,U as pn,X as Rr,w as Fa,ad as na,ba as gc,o as gi}from"../chunks/BESIXtBI.js";import{l as ht,s as $e,p as ue,r as Pn,i as W,b as mn,a as Xt,d as _s,m as ys,c as dt}from"../chunks/CJh9TUc0.js";import{I as gt,s as mt,Z as Mn,_ as Lr,$ as Ro,i as ze,a as Oe,a0 as Gn,t as pt,e as Qe,h as xo,D as Vr,W as Nn,U as Fn,G as qn,b as Lt,r as Nt,x as Vt,a1 as za,a2 as nr,a3 as mc,X as Lo,T as Bn,a4 as ar,a5 as or,B as _c,M as bs,L as mi,c as kt,E as ma,m as yc,P as wo,J as _i,F as xs,a6 as bc,A as xc,a7 as wc,j as kc,a8 as yi,a9 as zc,aa as Sc,ab as Cc,ac as Ec,S as Nc,ad as Pc,ae as Mc}from"../chunks/0zSFSexy.js";import{U as Jt,S as Hr,B as Pa,E as ko,O as an,z as on,x as Qt,V as rn,W as Kn,j as Ma,n as Fr,o as qa,q as qr,r as Br,l as bi,D as Vo,m as xi,u as Tc,L as Ic,I as wi,t as Ac,g as ws,X as _r,N as Dc,h as la,K as Ta,C as Ia,e as ki,P as zi,d as Rn,s as Kr,a as Je,Z as yr,G as ks,M as Oc,F as Si,R as br,A as Ci,k as Ei,Q as Rc,T as Lc,J as Vc,f as Hc}from"../chunks/BI8CVrNj.js";import{c as hn}from"../chunks/DaAgYj3T.js";import{A as zs,U as Fc,F as qc}from"../chunks/Biw60Ycb.js";import{b as xr,a as rr}from"../chunks/8I91iWf8.js";const Bc=[];function Ni(t,e=!1,n=!1){return co(t,new Map,"",Bc,null,n)}function co(t,e,n,o,r=null,i=!1){if(typeof t=="object"&&t!==null){var s=e.get(t);if(s!==void 0)return s;if(t instanceof Map)return new Map(t);if(t instanceof Set)return new Set(t);if(ac(t)){var l=Array(t.length);e.set(t,l),r!==null&&e.set(r,l);for(var u=0;u{var n=e();for(var o in n){var r=n[o];r?t.style.setProperty(o,r):t.style.removeProperty(o)}})}function qt(t,e,n){fi(()=>{var o=un(()=>e(t,n?.())||{});if(n&&o?.update){var r=!1,i={};vi(()=>{var s=n();cc(s),r&&dc(i,s)&&(i=s,o.update(s))}),r=!0}if(o?.destroy)return()=>o.destroy()})}class jr{#e=new WeakMap;#t;#n;static entries=new WeakMap;constructor(e){this.#n=e}observe(e,n){var o=this.#e.get(e)||new Set;return o.add(n),this.#e.set(e,o),this.#a().observe(e,this.#n),()=>{var r=this.#e.get(e);r.delete(n),r.size===0&&(this.#e.delete(e),this.#t.unobserve(e))}}#a(){return this.#t??(this.#t=new ResizeObserver(e=>{for(var n of e){jr.entries.set(n.target,n);for(var o of this.#e.get(n.target)||[])o(n)}}))}}var jc=new jr({box:"border-box"});function Ss(t,e,n){var o=jc.observe(t,()=>n(t[e]));fi(()=>(un(()=>n(t[e])),o))}function Wc(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m12 19-7-7 7-7"}],["path",{d:"M19 12H5"}]];gt(t,$e({name:"arrow-left"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Zc(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z"}],["path",{d:"m7 16.5-4.74-2.85"}],["path",{d:"m7 16.5 5-3"}],["path",{d:"M7 16.5v5.17"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z"}],["path",{d:"m17 16.5-5-3"}],["path",{d:"m17 16.5 4.74-2.85"}],["path",{d:"M17 16.5v5.17"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z"}],["path",{d:"M12 8 7.26 5.15"}],["path",{d:"m12 8 4.74-2.85"}],["path",{d:"M12 13.5V8"}]];gt(t,$e({name:"boxes"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Yc(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z"}],["path",{d:"M17 21v-2"}],["path",{d:"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10"}],["path",{d:"M21 21v-2"}],["path",{d:"M3 5V3"}],["path",{d:"M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z"}],["path",{d:"M7 5V3"}]];gt(t,$e({name:"cable"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Pi(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m18 15-6-6-6 6"}]];gt(t,$e({name:"chevron-up"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Xc(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335"}],["path",{d:"m9 11 3 3L22 4"}]];gt(t,$e({name:"circle-check-big"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Gc(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];gt(t,$e({name:"circle-x"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Uc(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["line",{x1:"12",x2:"12",y1:"2",y2:"22"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"}]];gt(t,$e({name:"dollar-sign"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Cs(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"12",cy:"12",r:"3"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12"}]];gt(t,$e({name:"git-commit-horizontal"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Jc(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M13 6h3a2 2 0 0 1 2 2v7"}],["path",{d:"M11 18H8a2 2 0 0 1-2-2V9"}]];gt(t,$e({name:"git-compare"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Qc(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M13 6h3a2 2 0 0 1 2 2v7"}],["line",{x1:"6",x2:"6",y1:"9",y2:"21"}]];gt(t,$e({name:"git-pull-request"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Mi(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["line",{x1:"4",x2:"20",y1:"9",y2:"9"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21"}]];gt(t,$e({name:"hash"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function $c(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}],["path",{d:"M12 7v5l4 2"}]];gt(t,$e({name:"history"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function ed(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["path",{d:"M9 18h6"}],["path",{d:"M10 22h4"}]];gt(t,$e({name:"lightbulb"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Ti(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M13 5h8"}],["path",{d:"M13 12h8"}],["path",{d:"M13 19h8"}],["path",{d:"m3 17 2 2 4-4"}],["path",{d:"m3 7 2 2 4-4"}]];gt(t,$e({name:"list-checks"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function td(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m10 17 5-5-5-5"}],["path",{d:"M15 12H3"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"}]];gt(t,$e({name:"log-in"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function nd(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m16 17 5-5-5-5"}],["path",{d:"M21 12H9"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}]];gt(t,$e({name:"log-out"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function ad(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7"}],["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2"}]];gt(t,$e({name:"mail"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function od(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719"}]];gt(t,$e({name:"message-circle"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function uo(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 22v-5"}],["path",{d:"M15 8V2"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z"}],["path",{d:"M9 8V2"}]];gt(t,$e({name:"plug"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Pt(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];gt(t,$e({name:"refresh-cw"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function rd(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];gt(t,$e({name:"rotate-ccw"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function sd(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2"}]];gt(t,$e({name:"scan"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function Ii(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"}],["path",{d:"m21.854 2.147-10.94 10.939"}]];gt(t,$e({name:"send"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function id(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"}],["path",{d:"M12 8v4"}],["path",{d:"M12 16h.01"}]];gt(t,$e({name:"shield-alert"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function ld(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z"}],["path",{d:"M3 20V4"}]];gt(t,$e({name:"skip-back"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function cd(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"}]];gt(t,$e({name:"star"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function dd(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M14.5 2v17.5c0 1.4-1.1 2.5-2.5 2.5c-1.4 0-2.5-1.1-2.5-2.5V2"}],["path",{d:"M8.5 2h7"}],["path",{d:"M14.5 16h-5"}]];gt(t,$e({name:"test-tube"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function ud(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["path",{d:"M12 3v12"}],["path",{d:"m17 8-5-5-5 5"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}]];gt(t,$e({name:"upload"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}function vd(t,e){const n=ht(e,["children","$$slots","$$events","$$legacy"]);const o=[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2"}]];gt(t,$e({name:"workflow"},()=>n,{get iconNode(){return o},children:(r,i)=>{var s=Te(),l=oe(s);mt(l,e,"default",{}),g(r,s)},$$slots:{default:!0}}))}var fd={value:()=>{}};function Ho(){for(var t=0,e=arguments.length,n={},o;t=0&&(o=n.slice(r+1),n=n.slice(0,r)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:o}})}vo.prototype=Ho.prototype={constructor:vo,on:function(t,e){var n=this._,o=pd(t+"",n),r,i=-1,s=o.length;if(arguments.length<2){for(;++i0)for(var n=new Array(r),o=0,r,i;o=0&&(e=t.slice(0,n))!=="xmlns"&&(t=t.slice(n+1)),Ns.hasOwnProperty(e)?{space:Ns[e],local:t}:t}function gd(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===wr&&e.documentElement.namespaceURI===wr?e.createElement(t):e.createElementNS(n,t)}}function md(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Ai(t){var e=Fo(t);return(e.local?md:gd)(e)}function _d(){}function Wr(t){return t==null?_d:function(){return this.querySelector(t)}}function yd(t){typeof t!="function"&&(t=Wr(t));for(var e=this._groups,n=e.length,o=new Array(n),r=0;r=V&&(V=A+1);!(O=P[V])&&++V=0;)(s=o[r])&&(i&&s.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(s,i),i=s);return this}function jd(t){t||(t=Wd);function e(m,f){return m&&f?t(m.__data__,f.__data__):!m-!f}for(var n=this._groups,o=n.length,r=new Array(o),i=0;ie?1:t>=e?0:NaN}function Zd(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function Yd(){return Array.from(this)}function Xd(){for(var t=this._groups,e=0,n=t.length;e1?this.each((e==null?ru:typeof e=="function"?iu:su)(t,e,n??"")):ca(this.node(),t)}function ca(t,e){return t.style.getPropertyValue(e)||Vi(t).getComputedStyle(t,null).getPropertyValue(e)}function cu(t){return function(){delete this[t]}}function du(t,e){return function(){this[t]=e}}function uu(t,e){return function(){var n=e.apply(this,arguments);n==null?delete this[t]:this[t]=n}}function vu(t,e){return arguments.length>1?this.each((e==null?cu:typeof e=="function"?uu:du)(t,e)):this.node()[t]}function Hi(t){return t.trim().split(/^|\s+/)}function Zr(t){return t.classList||new Fi(t)}function Fi(t){this._node=t,this._names=Hi(t.getAttribute("class")||"")}Fi.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function qi(t,e){for(var n=Zr(t),o=-1,r=e.length;++o=0&&(n=e.slice(o+1),e=e.slice(0,o)),{type:e,name:n}})}function Fu(t){return function(){var e=this.__on;if(e){for(var n=0,o=-1,r=e.length,i;n()=>t;function kr(t,{sourceEvent:e,subject:n,target:o,identifier:r,active:i,x:s,y:l,dx:u,dy:v,dispatch:p}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},identifier:{value:r,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:u,enumerable:!0,configurable:!0},dy:{value:v,enumerable:!0,configurable:!0},_:{value:p}})}kr.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function Uu(t){return!t.ctrlKey&&!t.button}function Ju(){return this.parentNode}function Qu(t,e){return e??{x:t.x,y:t.y}}function $u(){return navigator.maxTouchPoints||"ontouchstart"in this}function ev(){var t=Uu,e=Ju,n=Qu,o=$u,r={},i=Ho("start","drag","end"),s=0,l,u,v,p,m=0;function f(M){M.on("mousedown.drag",w).filter(o).on("touchstart.drag",P).on("touchmove.drag",L,Gu).on("touchend.drag touchcancel.drag",A).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function w(M,O){if(!(p||!t.call(this,M,O))){var b=V(this,e.call(this,M,O),M,O,"mouse");b&&(Ut(M.view).on("mousemove.drag",S,Aa).on("mouseup.drag",z,Aa),Wi(M.view),sr(M),v=!1,l=M.clientX,u=M.clientY,b("start",M))}}function S(M){if(oa(M),!v){var O=M.clientX-l,b=M.clientY-u;v=O*O+b*b>m}r.mouse("drag",M)}function z(M){Ut(M.view).on("mousemove.drag mouseup.drag",null),Zi(M.view,v),oa(M),r.mouse("end",M)}function P(M,O){if(t.call(this,M,O)){var b=M.changedTouches,I=e.call(this,M,O),H=b.length,B,X;for(B=0;B>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?ao(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?ao(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=nv.exec(t))?new Kt(e[1],e[2],e[3],1):(e=av.exec(t))?new Kt(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=ov.exec(t))?ao(e[1],e[2],e[3],e[4]):(e=rv.exec(t))?ao(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=sv.exec(t))?Os(e[1],e[2]/100,e[3]/100,1):(e=iv.exec(t))?Os(e[1],e[2]/100,e[3]/100,e[4]):Ps.hasOwnProperty(t)?Is(Ps[t]):t==="transparent"?new Kt(NaN,NaN,NaN,0):null}function Is(t){return new Kt(t>>16&255,t>>8&255,t&255,1)}function ao(t,e,n,o){return o<=0&&(t=e=n=NaN),new Kt(t,e,n,o)}function dv(t){return t instanceof Ka||(t=jn(t)),t?(t=t.rgb(),new Kt(t.r,t.g,t.b,t.opacity)):new Kt}function zr(t,e,n,o){return arguments.length===1?dv(t):new Kt(t,e,n,o??1)}function Kt(t,e,n,o){this.r=+t,this.g=+e,this.b=+n,this.opacity=+o}Yr(Kt,zr,Yi(Ka,{brighter(t){return t=t==null?So:Math.pow(So,t),new Kt(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Da:Math.pow(Da,t),new Kt(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Kt(Hn(this.r),Hn(this.g),Hn(this.b),Co(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:As,formatHex:As,formatHex8:uv,formatRgb:Ds,toString:Ds}));function As(){return`#${Vn(this.r)}${Vn(this.g)}${Vn(this.b)}`}function uv(){return`#${Vn(this.r)}${Vn(this.g)}${Vn(this.b)}${Vn((isNaN(this.opacity)?1:this.opacity)*255)}`}function Ds(){const t=Co(this.opacity);return`${t===1?"rgb(":"rgba("}${Hn(this.r)}, ${Hn(this.g)}, ${Hn(this.b)}${t===1?")":`, ${t})`}`}function Co(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Hn(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Vn(t){return t=Hn(t),(t<16?"0":"")+t.toString(16)}function Os(t,e,n,o){return o<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new tn(t,e,n,o)}function Xi(t){if(t instanceof tn)return new tn(t.h,t.s,t.l,t.opacity);if(t instanceof Ka||(t=jn(t)),!t)return new tn;if(t instanceof tn)return t;t=t.rgb();var e=t.r/255,n=t.g/255,o=t.b/255,r=Math.min(e,n,o),i=Math.max(e,n,o),s=NaN,l=i-r,u=(i+r)/2;return l?(e===i?s=(n-o)/l+(n0&&u<1?0:s,new tn(s,l,u,t.opacity)}function vv(t,e,n,o){return arguments.length===1?Xi(t):new tn(t,e,n,o??1)}function tn(t,e,n,o){this.h=+t,this.s=+e,this.l=+n,this.opacity=+o}Yr(tn,vv,Yi(Ka,{brighter(t){return t=t==null?So:Math.pow(So,t),new tn(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?Da:Math.pow(Da,t),new tn(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,o=n+(n<.5?n:1-n)*e,r=2*n-o;return new Kt(ir(t>=240?t-240:t+120,r,o),ir(t,r,o),ir(t<120?t+240:t-120,r,o),this.opacity)},clamp(){return new tn(Rs(this.h),oo(this.s),oo(this.l),Co(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Co(this.opacity);return`${t===1?"hsl(":"hsla("}${Rs(this.h)}, ${oo(this.s)*100}%, ${oo(this.l)*100}%${t===1?")":`, ${t})`}`}}));function Rs(t){return t=(t||0)%360,t<0?t+360:t}function oo(t){return Math.max(0,Math.min(1,t||0))}function ir(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}const Xr=t=>()=>t;function fv(t,e){return function(n){return t+n*e}}function pv(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(o){return Math.pow(t+o*e,n)}}function hv(t){return(t=+t)==1?Gi:function(e,n){return n-e?pv(e,n,t):Xr(isNaN(e)?n:e)}}function Gi(t,e){var n=e-t;return n?fv(t,n):Xr(isNaN(t)?e:t)}const Eo=(function t(e){var n=hv(e);function o(r,i){var s=n((r=zr(r)).r,(i=zr(i)).r),l=n(r.g,i.g),u=n(r.b,i.b),v=Gi(r.opacity,i.opacity);return function(p){return r.r=s(p),r.g=l(p),r.b=u(p),r.opacity=v(p),r+""}}return o.gamma=t,o})(1);function gv(t,e){e||(e=[]);var n=t?Math.min(e.length,t.length):0,o=e.slice(),r;return function(i){for(r=0;rn&&(i=e.slice(n,i),l[s]?l[s]+=i:l[++s]=i),(o=o[0])===(r=r[0])?l[s]?l[s]+=r:l[++s]=r:(l[++s]=null,u.push({i:s,x:dn(o,r)})),n=lr.lastIndex;return n180?p+=360:p-v>180&&(v+=360),f.push({i:m.push(r(m)+"rotate(",null,o)-2,x:dn(v,p)})):p&&m.push(r(m)+"rotate("+p+o)}function l(v,p,m,f){v!==p?f.push({i:m.push(r(m)+"skewX(",null,o)-2,x:dn(v,p)}):p&&m.push(r(m)+"skewX("+p+o)}function u(v,p,m,f,w,S){if(v!==m||p!==f){var z=w.push(r(w)+"scale(",null,",",null,")");S.push({i:z-4,x:dn(v,m)},{i:z-2,x:dn(p,f)})}else(m!==1||f!==1)&&w.push(r(w)+"scale("+m+","+f+")")}return function(v,p){var m=[],f=[];return v=t(v),p=t(p),i(v.translateX,v.translateY,p.translateX,p.translateY,m,f),s(v.rotate,p.rotate,m,f),l(v.skewX,p.skewX,m,f),u(v.scaleX,v.scaleY,p.scaleX,p.scaleY,m,f),v=p=null,function(w){for(var S=-1,z=f.length,P;++S=0&&t._call.call(void 0,e),t=t._next;--da}function Hs(){Wn=(Po=Ra.now())+qo,da=Sa=0;try{Tv()}finally{da=0,Av(),Wn=0}}function Iv(){var t=Ra.now(),e=t-Po;e>$i&&(qo-=e,Po=t)}function Av(){for(var t,e=No,n,o=1/0;e;)e._call?(o>e._time&&(o=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:No=n);Ca=t,Er(o)}function Er(t){if(!da){Sa&&(Sa=clearTimeout(Sa));var e=t-Wn;e>24?(t<1/0&&(Sa=setTimeout(Hs,t-Ra.now()-qo)),wa&&(wa=clearInterval(wa))):(wa||(Po=Ra.now(),wa=setInterval(Iv,$i)),da=1,el(Hs))}}function Fs(t,e,n){var o=new Mo;return e=e==null?0:+e,o.restart(r=>{o.stop(),t(r+e)},e,n),o}var Dv=Ho("start","end","cancel","interrupt"),Ov=[],nl=0,qs=1,Nr=2,po=3,Bs=4,Pr=5,ho=6;function Bo(t,e,n,o,r,i){var s=t.__transition;if(!s)t.__transition={};else if(n in s)return;Rv(t,n,{name:e,index:o,group:r,on:Dv,tween:Ov,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:nl})}function Ur(t,e){var n=sn(t,e);if(n.state>nl)throw new Error("too late; already scheduled");return n}function _n(t,e){var n=sn(t,e);if(n.state>po)throw new Error("too late; already running");return n}function sn(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Rv(t,e,n){var o=t.__transition,r;o[e]=n,n.timer=tl(i,0,n.time);function i(v){n.state=qs,n.timer.restart(s,n.delay,n.time),n.delay<=v&&s(v-n.delay)}function s(v){var p,m,f,w;if(n.state!==qs)return u();for(p in o)if(w=o[p],w.name===n.name){if(w.state===po)return Fs(s);w.state===Bs?(w.state=ho,w.timer.stop(),w.on.call("interrupt",t,t.__data__,w.index,w.group),delete o[p]):+pNr&&o.state=0&&(e=e.slice(0,n)),!e||e==="start"})}function ff(t,e,n){var o,r,i=vf(e)?Ur:_n;return function(){var s=i(this,t),l=s.on;l!==o&&(r=(o=l).copy()).on(e,n),s.on=r}}function pf(t,e){var n=this._id;return arguments.length<2?sn(this.node(),n).on.on(t):this.each(ff(n,t,e))}function hf(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}function gf(){return this.on("end.remove",hf(this._id))}function mf(t){var e=this._name,n=this._id;typeof t!="function"&&(t=Wr(t));for(var o=this._groups,r=o.length,i=new Array(r),s=0;s()=>t;function Bf(t,{sourceEvent:e,target:n,transform:o,dispatch:r}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:o,enumerable:!0,configurable:!0},_:{value:r}})}function xn(t,e,n){this.k=t,this.x=e,this.y=n}xn.prototype={constructor:xn,scale:function(t){return t===1?this:new xn(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new xn(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Ko=new xn(1,0,0);sl.prototype=xn.prototype;function sl(t){for(;!t.__zoom;)if(!(t=t.parentNode))return Ko;return t.__zoom}function cr(t){t.stopImmediatePropagation()}function ka(t){t.preventDefault(),t.stopImmediatePropagation()}function Kf(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function jf(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function Ks(){return this.__zoom||Ko}function Wf(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function Zf(){return navigator.maxTouchPoints||"ontouchstart"in this}function Yf(t,e,n){var o=t.invertX(e[0][0])-n[0][0],r=t.invertX(e[1][0])-n[1][0],i=t.invertY(e[0][1])-n[0][1],s=t.invertY(e[1][1])-n[1][1];return t.translate(r>o?(o+r)/2:Math.min(0,o)||Math.max(0,r),s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s))}function il(){var t=Kf,e=jf,n=Yf,o=Wf,r=Zf,i=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],l=250,u=fo,v=Ho("start","zoom","end"),p,m,f,w=500,S=150,z=0,P=10;function L(_){_.property("__zoom",Ks).on("wheel.zoom",H,{passive:!1}).on("mousedown.zoom",B).on("dblclick.zoom",X).filter(r).on("touchstart.zoom",N).on("touchmove.zoom",E).on("touchend.zoom touchcancel.zoom",C).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}L.transform=function(_,T,D,R){var F=_.selection?_.selection():_;F.property("__zoom",Ks),_!==F?O(_,T,D,R):F.interrupt().each(function(){b(this,arguments).event(R).start().zoom(null,typeof T=="function"?T.apply(this,arguments):T).end()})},L.scaleBy=function(_,T,D,R){L.scaleTo(_,function(){var F=this.__zoom.k,q=typeof T=="function"?T.apply(this,arguments):T;return F*q},D,R)},L.scaleTo=function(_,T,D,R){L.transform(_,function(){var F=e.apply(this,arguments),q=this.__zoom,K=D==null?M(F):typeof D=="function"?D.apply(this,arguments):D,Z=q.invert(K),ee=typeof T=="function"?T.apply(this,arguments):T;return n(V(A(q,ee),K,Z),F,s)},D,R)},L.translateBy=function(_,T,D,R){L.transform(_,function(){return n(this.__zoom.translate(typeof T=="function"?T.apply(this,arguments):T,typeof D=="function"?D.apply(this,arguments):D),e.apply(this,arguments),s)},null,R)},L.translateTo=function(_,T,D,R,F){L.transform(_,function(){var q=e.apply(this,arguments),K=this.__zoom,Z=R==null?M(q):typeof R=="function"?R.apply(this,arguments):R;return n(Ko.translate(Z[0],Z[1]).scale(K.k).translate(typeof T=="function"?-T.apply(this,arguments):-T,typeof D=="function"?-D.apply(this,arguments):-D),q,s)},R,F)};function A(_,T){return T=Math.max(i[0],Math.min(i[1],T)),T===_.k?_:new xn(T,_.x,_.y)}function V(_,T,D){var R=T[0]-D[0]*_.k,F=T[1]-D[1]*_.k;return R===_.x&&F===_.y?_:new xn(_.k,R,F)}function M(_){return[(+_[0][0]+ +_[1][0])/2,(+_[0][1]+ +_[1][1])/2]}function O(_,T,D,R){_.on("start.zoom",function(){b(this,arguments).event(R).start()}).on("interrupt.zoom end.zoom",function(){b(this,arguments).event(R).end()}).tween("zoom",function(){var F=this,q=arguments,K=b(F,q).event(R),Z=e.apply(F,q),ee=D==null?M(Z):typeof D=="function"?D.apply(F,q):D,J=Math.max(Z[1][0]-Z[0][0],Z[1][1]-Z[0][1]),ne=F.__zoom,le=typeof T=="function"?T.apply(F,q):T,re=u(ne.invert(ee).concat(J/ne.k),le.invert(ee).concat(J/le.k));return function(Q){if(Q===1)Q=le;else{var j=re(Q),$=J/j[2];Q=new xn($,ee[0]-j[0]*$,ee[1]-j[1]*$)}K.zoom(null,Q)}})}function b(_,T,D){return!D&&_.__zooming||new I(_,T)}function I(_,T){this.that=_,this.args=T,this.active=0,this.sourceEvent=null,this.extent=e.apply(_,T),this.taps=0}I.prototype={event:function(_){return _&&(this.sourceEvent=_),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(_,T){return this.mouse&&_!=="mouse"&&(this.mouse[1]=T.invert(this.mouse[0])),this.touch0&&_!=="touch"&&(this.touch0[1]=T.invert(this.touch0[0])),this.touch1&&_!=="touch"&&(this.touch1[1]=T.invert(this.touch1[0])),this.that.__zoom=T,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(_){var T=Ut(this.that).datum();v.call(_,this.that,new Bf(_,{sourceEvent:this.sourceEvent,target:L,transform:this.that.__zoom,dispatch:v}),T)}};function H(_,...T){if(!t.apply(this,arguments))return;var D=b(this,T).event(_),R=this.__zoom,F=Math.max(i[0],Math.min(i[1],R.k*Math.pow(2,o.apply(this,arguments)))),q=en(_);if(D.wheel)(D.mouse[0][0]!==q[0]||D.mouse[0][1]!==q[1])&&(D.mouse[1]=R.invert(D.mouse[0]=q)),clearTimeout(D.wheel);else{if(R.k===F)return;D.mouse=[q,R.invert(q)],go(this),D.start()}ka(_),D.wheel=setTimeout(K,S),D.zoom("mouse",n(V(A(R,F),D.mouse[0],D.mouse[1]),D.extent,s));function K(){D.wheel=null,D.end()}}function B(_,...T){if(f||!t.apply(this,arguments))return;var D=_.currentTarget,R=b(this,T,!0).event(_),F=Ut(_.view).on("mousemove.zoom",ee,!0).on("mouseup.zoom",J,!0),q=en(_,D),K=_.clientX,Z=_.clientY;Wi(_.view),cr(_),R.mouse=[q,this.__zoom.invert(q)],go(this),R.start();function ee(ne){if(ka(ne),!R.moved){var le=ne.clientX-K,re=ne.clientY-Z;R.moved=le*le+re*re>z}R.event(ne).zoom("mouse",n(V(R.that.__zoom,R.mouse[0]=en(ne,D),R.mouse[1]),R.extent,s))}function J(ne){F.on("mousemove.zoom mouseup.zoom",null),Zi(ne.view,R.moved),ka(ne),R.event(ne).end()}}function X(_,...T){if(t.apply(this,arguments)){var D=this.__zoom,R=en(_.changedTouches?_.changedTouches[0]:_,this),F=D.invert(R),q=D.k*(_.shiftKey?.5:2),K=n(V(A(D,q),R,F),e.apply(this,T),s);ka(_),l>0?Ut(this).transition().duration(l).call(O,K,R,_):Ut(this).call(L.transform,K,R,_)}}function N(_,...T){if(t.apply(this,arguments)){var D=_.touches,R=D.length,F=b(this,T,_.changedTouches.length===R).event(_),q,K,Z,ee;for(cr(_),K=0;K"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:e,sourceHandle:n,targetHandle:o})=>`Couldn't create edge for ${t} handle id: "${t==="source"?n:o}", edge id: ${e}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},Mr=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],ll=["Enter"," ","Escape"],Xf={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:e,y:n})=>`Moved selected node ${t}. New position, x: ${e}, y: ${n}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var ua;(function(t){t.Strict="strict",t.Loose="loose"})(ua||(ua={}));var sa;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(sa||(sa={}));var To;(function(t){t.Partial="partial",t.Full="full"})(To||(To={}));const Tr={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var En;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(En||(En={}));var Io;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(Io||(Io={}));var Se;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(Se||(Se={}));const js={[Se.Left]:Se.Right,[Se.Right]:Se.Left,[Se.Top]:Se.Bottom,[Se.Bottom]:Se.Top};function Gf(t,e){if(!t&&!e)return!0;if(!t||!e||t.size!==e.size)return!1;if(!t.size&&!e.size)return!0;for(const n of t.keys())if(!e.has(n))return!1;return!0}function Ws(t,e,n){if(!n)return;const o=[];t.forEach((r,i)=>{e?.has(i)||o.push(r)}),o.length&&n(o)}function Uf(t){return t===null?null:t?"valid":"invalid"}const cl=t=>"id"in t&&"source"in t&&"target"in t,Jf=t=>"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),Qr=t=>"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),ja=(t,e=[0,0])=>{const{width:n,height:o}=Tn(t),r=t.origin??e,i=n*r[0],s=o*r[1];return{x:t.position.x-i,y:t.position.y-s}},Qf=(t,e={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};const n=t.reduce((o,r)=>{const i=typeof r=="string";let s=!e.nodeLookup&&!i?r:void 0;e.nodeLookup&&(s=i?e.nodeLookup.get(r):Qr(r)?r:e.nodeLookup.get(r.id));const l=s?Ao(s,e.nodeOrigin):{x:0,y:0,x2:0,y2:0};return jo(o,l)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return Wo(n)},Wa=(t,e={})=>{let n={x:1/0,y:1/0,x2:-1/0,y2:-1/0},o=!1;return t.forEach(r=>{(e.filter===void 0||e.filter(r))&&(n=jo(n,Ao(r)),o=!0)}),o?Wo(n):{x:0,y:0,width:0,height:0}},$r=(t,e,[n,o,r]=[0,0,1],i=!1,s=!1)=>{const l={...Ya(e,[n,o,r]),width:e.width/r,height:e.height/r},u=[];for(const v of t.values()){const{measured:p,selectable:m=!0,hidden:f=!1}=v;if(s&&!m||f)continue;const w=p.width??v.width??v.initialWidth??null,S=p.height??v.height??v.initialHeight??null,z=Va(l,fa(v)),P=(w??0)*(S??0),L=i&&z>0;(!v.internals.handleBounds||L||z>=P||v.dragging)&&u.push(v)}return u},$f=(t,e)=>{const n=new Set;return t.forEach(o=>{n.add(o.id)}),e.filter(o=>n.has(o.source)||n.has(o.target))};function ep(t,e){const n=new Map,o=e?.nodes?new Set(e.nodes.map(r=>r.id)):null;return t.forEach(r=>{r.measured.width&&r.measured.height&&(e?.includeHiddenNodes||!r.hidden)&&(!o||o.has(r.id))&&n.set(r.id,r)}),n}async function tp({nodes:t,width:e,height:n,panZoom:o,minZoom:r,maxZoom:i},s){if(t.size===0)return Promise.resolve(!0);const l=ep(t,s),u=Wa(l),v=es(u,e,n,s?.minZoom??r,s?.maxZoom??i,s?.padding??.1);return await o.setViewport(v,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)}function dl({nodeId:t,nextPosition:e,nodeLookup:n,nodeOrigin:o=[0,0],nodeExtent:r,onError:i}){const s=n.get(t),l=s.parentId?n.get(s.parentId):void 0,{x:u,y:v}=l?l.internals.positionAbsolute:{x:0,y:0},p=s.origin??o;let m=s.extent||r;if(s.extent==="parent"&&!s.expandParent)if(!l)i?.("005",La.error005());else{const w=l.measured.width,S=l.measured.height;w&&S&&(m=[[u,v],[u+w,v+S]])}else l&&pa(s.extent)&&(m=[[s.extent[0][0]+u,s.extent[0][1]+v],[s.extent[1][0]+u,s.extent[1][1]+v]]);const f=pa(m)?Zn(e,m,s.measured):e;return(s.measured.width===void 0||s.measured.height===void 0)&&i?.("015",La.error015()),{position:{x:f.x-u+(s.measured.width??0)*p[0],y:f.y-v+(s.measured.height??0)*p[1]},positionAbsolute:f}}async function np({nodesToRemove:t=[],edgesToRemove:e=[],nodes:n,edges:o,onBeforeDelete:r}){const i=new Set(t.map(f=>f.id)),s=[];for(const f of n){if(f.deletable===!1)continue;const w=i.has(f.id),S=!w&&f.parentId&&s.find(z=>z.id===f.parentId);(w||S)&&s.push(f)}const l=new Set(e.map(f=>f.id)),u=o.filter(f=>f.deletable!==!1),p=$f(s,u);for(const f of u)l.has(f.id)&&!p.find(S=>S.id===f.id)&&p.push(f);if(!r)return{edges:p,nodes:s};const m=await r({nodes:s,edges:p});return typeof m=="boolean"?m?{edges:p,nodes:s}:{edges:[],nodes:[]}:m}const va=(t,e=0,n=1)=>Math.min(Math.max(t,e),n),Zn=(t={x:0,y:0},e,n)=>({x:va(t.x,e[0][0],e[1][0]-(n?.width??0)),y:va(t.y,e[0][1],e[1][1]-(n?.height??0))});function ul(t,e,n){const{width:o,height:r}=Tn(n),{x:i,y:s}=n.internals.positionAbsolute;return Zn(t,[[i,s],[i+o,s+r]],e)}const Zs=(t,e,n)=>tn?-va(Math.abs(t-n),1,e)/e:0,vl=(t,e,n=15,o=40)=>{const r=Zs(t.x,o,e.width-o)*n,i=Zs(t.y,o,e.height-o)*n;return[r,i]},jo=(t,e)=>({x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}),Ir=({x:t,y:e,width:n,height:o})=>({x:t,y:e,x2:t+n,y2:e+o}),Wo=({x:t,y:e,x2:n,y2:o})=>({x:t,y:e,width:n-t,height:o-e}),fa=(t,e=[0,0])=>{const{x:n,y:o}=Qr(t)?t.internals.positionAbsolute:ja(t,e);return{x:n,y:o,width:t.measured?.width??t.width??t.initialWidth??0,height:t.measured?.height??t.height??t.initialHeight??0}},Ao=(t,e=[0,0])=>{const{x:n,y:o}=Qr(t)?t.internals.positionAbsolute:ja(t,e);return{x:n,y:o,x2:n+(t.measured?.width??t.width??t.initialWidth??0),y2:o+(t.measured?.height??t.height??t.initialHeight??0)}},fl=(t,e)=>Wo(jo(Ir(t),Ir(e))),Va=(t,e)=>{const n=Math.max(0,Math.min(t.x+t.width,e.x+e.width)-Math.max(t.x,e.x)),o=Math.max(0,Math.min(t.y+t.height,e.y+e.height)-Math.max(t.y,e.y));return Math.ceil(n*o)},Ys=t=>wn(t.width)&&wn(t.height)&&wn(t.x)&&wn(t.y),wn=t=>!isNaN(t)&&isFinite(t),ap=(t,e)=>{},Za=(t,e=[1,1])=>({x:e[0]*Math.round(t.x/e[0]),y:e[1]*Math.round(t.y/e[1])}),Ya=({x:t,y:e},[n,o,r],i=!1,s=[1,1])=>{const l={x:(t-n)/r,y:(e-o)/r};return i?Za(l,s):l},Do=({x:t,y:e},[n,o,r])=>({x:t*r+n,y:e*r+o});function ta(t,e){if(typeof t=="number")return Math.floor((e-e/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const n=parseFloat(t);if(!Number.isNaN(n))return Math.floor(n)}if(typeof t=="string"&&t.endsWith("%")){const n=parseFloat(t);if(!Number.isNaN(n))return Math.floor(e*n*.01)}return console.error(`[React Flow] The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function op(t,e,n){if(typeof t=="string"||typeof t=="number"){const o=ta(t,n),r=ta(t,e);return{top:o,right:r,bottom:o,left:r,x:r*2,y:o*2}}if(typeof t=="object"){const o=ta(t.top??t.y??0,n),r=ta(t.bottom??t.y??0,n),i=ta(t.left??t.x??0,e),s=ta(t.right??t.x??0,e);return{top:o,right:s,bottom:r,left:i,x:i+s,y:o+r}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function rp(t,e,n,o,r,i){const{x:s,y:l}=Do(t,[e,n,o]),{x:u,y:v}=Do({x:t.x+t.width,y:t.y+t.height},[e,n,o]),p=r-u,m=i-v;return{left:Math.floor(s),top:Math.floor(l),right:Math.floor(p),bottom:Math.floor(m)}}const es=(t,e,n,o,r,i)=>{const s=op(i,e,n),l=(e-s.x)/t.width,u=(n-s.y)/t.height,v=Math.min(l,u),p=va(v,o,r),m=t.x+t.width/2,f=t.y+t.height/2,w=e/2-m*p,S=n/2-f*p,z=rp(t,w,S,p,e,n),P={left:Math.min(z.left-s.left,0),top:Math.min(z.top-s.top,0),right:Math.min(z.right-s.right,0),bottom:Math.min(z.bottom-s.bottom,0)};return{x:w-P.left+P.right,y:S-P.top+P.bottom,zoom:p}},Ha=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function pa(t){return t!=null&&t!=="parent"}function Tn(t){return{width:t.measured?.width??t.width??t.initialWidth??0,height:t.measured?.height??t.height??t.initialHeight??0}}function pl(t){return(t.measured?.width??t.width??t.initialWidth)!==void 0&&(t.measured?.height??t.height??t.initialHeight)!==void 0}function sp(t,e={width:0,height:0},n,o,r){const i={...t},s=o.get(n);if(s){const l=s.origin||r;i.x+=s.internals.positionAbsolute.x-(e.width??0)*l[0],i.y+=s.internals.positionAbsolute.y-(e.height??0)*l[1]}return i}function ip(t){return{...Xf,...t||{}}}function dr(t,{snapGrid:e=[0,0],snapToGrid:n=!1,transform:o,containerBounds:r}){const{x:i,y:s}=nn(t),l=Ya({x:i-(r?.left??0),y:s-(r?.top??0)},o),{x:u,y:v}=n?Za(l,e):l;return{xSnapped:u,ySnapped:v,...l}}const hl=t=>({width:t.offsetWidth,height:t.offsetHeight}),gl=t=>t?.getRootNode?.()||window?.document,lp=["INPUT","SELECT","TEXTAREA"];function ml(t){const e=t.composedPath?.()?.[0]||t.target;return e?.nodeType!==1?!1:lp.includes(e.nodeName)||e.hasAttribute("contenteditable")||!!e.closest(".nokey")}const _l=t=>"clientX"in t,nn=(t,e)=>{const n=_l(t),o=n?t.clientX:t.touches?.[0].clientX,r=n?t.clientY:t.touches?.[0].clientY;return{x:o-(e?.left??0),y:r-(e?.top??0)}},Xs=(t,e,n,o,r)=>{const i=e.querySelectorAll(`.${t}`);return!i||!i.length?null:Array.from(i).map(s=>{const l=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:t,nodeId:r,position:s.getAttribute("data-handlepos"),x:(l.left-n.left)/o,y:(l.top-n.top)/o,...hl(s)}})};function cp({sourceX:t,sourceY:e,targetX:n,targetY:o,sourceControlX:r,sourceControlY:i,targetControlX:s,targetControlY:l}){const u=t*.125+r*.375+s*.375+n*.125,v=e*.125+i*.375+l*.375+o*.125,p=Math.abs(u-t),m=Math.abs(v-e);return[u,v,p,m]}function io(t,e){return t>=0?.5*t:e*25*Math.sqrt(-t)}function Gs({pos:t,x1:e,y1:n,x2:o,y2:r,c:i}){switch(t){case Se.Left:return[e-io(e-o,i),n];case Se.Right:return[e+io(o-e,i),n];case Se.Top:return[e,n-io(n-r,i)];case Se.Bottom:return[e,n+io(r-n,i)]}}function yl({sourceX:t,sourceY:e,sourcePosition:n=Se.Bottom,targetX:o,targetY:r,targetPosition:i=Se.Top,curvature:s=.25}){const[l,u]=Gs({pos:n,x1:t,y1:e,x2:o,y2:r,c:s}),[v,p]=Gs({pos:i,x1:o,y1:r,x2:t,y2:e,c:s}),[m,f,w,S]=cp({sourceX:t,sourceY:e,targetX:o,targetY:r,sourceControlX:l,sourceControlY:u,targetControlX:v,targetControlY:p});return[`M${t},${e} C${l},${u} ${v},${p} ${o},${r}`,m,f,w,S]}function bl({sourceX:t,sourceY:e,targetX:n,targetY:o}){const r=Math.abs(n-t)/2,i=n0}const vp=({source:t,sourceHandle:e,target:n,targetHandle:o})=>`xy-edge__${t}${e||""}-${n}${o||""}`,fp=(t,e)=>e.some(n=>n.source===t.source&&n.target===t.target&&(n.sourceHandle===t.sourceHandle||!n.sourceHandle&&!t.sourceHandle)&&(n.targetHandle===t.targetHandle||!n.targetHandle&&!t.targetHandle)),pp=(t,e,n={})=>{if(!t.source||!t.target)return e;const o=n.getEdgeId||vp;let r;return cl(t)?r={...t}:r={...t,id:o(t)},fp(r,e)?e:(r.sourceHandle===null&&delete r.sourceHandle,r.targetHandle===null&&delete r.targetHandle,e.concat(r))};function xl({sourceX:t,sourceY:e,targetX:n,targetY:o}){const[r,i,s,l]=bl({sourceX:t,sourceY:e,targetX:n,targetY:o});return[`M ${t},${e}L ${n},${o}`,r,i,s,l]}const Us={[Se.Left]:{x:-1,y:0},[Se.Right]:{x:1,y:0},[Se.Top]:{x:0,y:-1},[Se.Bottom]:{x:0,y:1}},hp=({source:t,sourcePosition:e=Se.Bottom,target:n})=>e===Se.Left||e===Se.Right?t.xMath.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function gp({source:t,sourcePosition:e=Se.Bottom,target:n,targetPosition:o=Se.Top,center:r,offset:i,stepPosition:s}){const l=Us[e],u=Us[o],v={x:t.x+l.x*i,y:t.y+l.y*i},p={x:n.x+u.x*i,y:n.y+u.y*i},m=hp({source:v,sourcePosition:e,target:p}),f=m.x!==0?"x":"y",w=m[f];let S=[],z,P;const L={x:0,y:0},A={x:0,y:0},[,,V,M]=bl({sourceX:t.x,sourceY:t.y,targetX:n.x,targetY:n.y});if(l[f]*u[f]===-1){f==="x"?(z=r.x??v.x+(p.x-v.x)*s,P=r.y??(v.y+p.y)/2):(z=r.x??(v.x+p.x)/2,P=r.y??v.y+(p.y-v.y)*s);const b=[{x:z,y:v.y},{x:z,y:p.y}],I=[{x:v.x,y:P},{x:p.x,y:P}];l[f]===w?S=f==="x"?b:I:S=f==="x"?I:b}else{const b=[{x:v.x,y:p.y}],I=[{x:p.x,y:v.y}];if(f==="x"?S=l.x===w?I:b:S=l.y===w?b:I,e===o){const E=Math.abs(t[f]-n[f]);if(E<=i){const C=Math.min(i-1,i-E);l[f]===w?L[f]=(v[f]>t[f]?-1:1)*C:A[f]=(p[f]>n[f]?-1:1)*C}}if(e!==o){const E=f==="x"?"y":"x",C=l[f]===u[E],_=v[E]>p[E],T=v[E]=N?(z=(H.x+B.x)/2,P=S[0].y):(z=S[0].x,P=(H.y+B.y)/2)}return[[t,{x:v.x+L.x,y:v.y+L.y},...S,{x:p.x+A.x,y:p.y+A.y},n],z,P,V,M]}function mp(t,e,n,o){const r=Math.min(Js(t,e)/2,Js(e,n)/2,o),{x:i,y:s}=e;if(t.x===i&&i===n.x||t.y===s&&s===n.y)return`L${i} ${s}`;if(t.y===s){const v=t.x{let M="";return V>0&&Vn.id===e):t[0])||null}function Ar(t,e){return t?typeof t=="string"?t:`${e?`${e}__`:""}${Object.keys(t).sort().map(o=>`${o}=${t[o]}`).join("&")}`:""}function yp(t,{id:e,defaultColor:n,defaultMarkerStart:o,defaultMarkerEnd:r}){const i=new Set;return t.reduce((s,l)=>([l.markerStart||o,l.markerEnd||r].forEach(u=>{if(u&&typeof u=="object"){const v=Ar(u,e);i.has(v)||(s.push({id:v,color:u.color||n,...u}),i.add(v))}}),s),[]).sort((s,l)=>s.id.localeCompare(l.id))}const wl=1e3,bp=10,ns={nodeOrigin:[0,0],nodeExtent:Mr,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},xp={...ns,checkEquality:!0};function as(t,e){const n={...t};for(const o in e)e[o]!==void 0&&(n[o]=e[o]);return n}function wp(t,e,n){const o=as(ns,n);for(const r of t.values())if(r.parentId)rs(r,t,e,o);else{const i=ja(r,o.nodeOrigin),s=pa(r.extent)?r.extent:o.nodeExtent,l=Zn(i,s,Tn(r));r.internals.positionAbsolute=l}}function kp(t,e){if(!t.handles)return t.measured?e?.internals.handleBounds:void 0;const n=[],o=[];for(const r of t.handles){const i={id:r.id,width:r.width??1,height:r.height??1,nodeId:t.id,x:r.x,y:r.y,position:r.position,type:r.type};r.type==="source"?n.push(i):r.type==="target"&&o.push(i)}return{source:n,target:o}}function os(t){return t==="manual"}function zp(t,e,n,o={}){const r=as(xp,o),i={i:0},s=new Map(e),l=r?.elevateNodesOnSelect&&!os(r.zIndexMode)?wl:0;let u=t.length>0;e.clear(),n.clear();for(const v of t){let p=s.get(v.id);if(r.checkEquality&&v===p?.internals.userNode)e.set(v.id,p);else{const m=ja(v,r.nodeOrigin),f=pa(v.extent)?v.extent:r.nodeExtent,w=Zn(m,f,Tn(v));p={...r.defaults,...v,measured:{width:v.measured?.width,height:v.measured?.height},internals:{positionAbsolute:w,handleBounds:kp(v,p),z:kl(v,l,r.zIndexMode),userNode:v}},e.set(v.id,p)}(p.measured===void 0||p.measured.width===void 0||p.measured.height===void 0)&&!p.hidden&&(u=!1),v.parentId&&rs(p,e,n,o,i)}return u}function Sp(t,e){if(!t.parentId)return;const n=e.get(t.parentId);n?n.set(t.id,t):e.set(t.parentId,new Map([[t.id,t]]))}function rs(t,e,n,o,r){const{elevateNodesOnSelect:i,nodeOrigin:s,nodeExtent:l,zIndexMode:u}=as(ns,o),v=t.parentId,p=e.get(v);if(!p){console.warn(`Parent node ${v} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Sp(t,n),r&&!p.parentId&&p.internals.rootParentIndex===void 0&&u==="auto"&&(p.internals.rootParentIndex=++r.i,p.internals.z=p.internals.z+r.i*bp),r&&p.internals.rootParentIndex!==void 0&&(r.i=p.internals.rootParentIndex);const m=i&&!os(u)?wl:0,{x:f,y:w,z:S}=Cp(t,p,s,l,m,u),{positionAbsolute:z}=t.internals,P=f!==z.x||w!==z.y;(P||S!==t.internals.z)&&e.set(t.id,{...t,internals:{...t.internals,positionAbsolute:P?{x:f,y:w}:z,z:S}})}function kl(t,e,n){const o=wn(t.zIndex)?t.zIndex:0;return os(n)?o:o+(t.selected?e:0)}function Cp(t,e,n,o,r,i){const{x:s,y:l}=e.internals.positionAbsolute,u=Tn(t),v=ja(t,n),p=pa(t.extent)?Zn(v,t.extent,u):v;let m=Zn({x:s+p.x,y:l+p.y},o,u);t.extent==="parent"&&(m=ul(m,u,e));const f=kl(t,r,i),w=e.internals.z??0;return{x:m.x,y:m.y,z:w>=f?w+1:f}}function Ep(t,e,n,o=[0,0]){const r=[],i=new Map;for(const s of t){const l=e.get(s.parentId);if(!l)continue;const u=i.get(s.parentId)?.expandedRect??fa(l),v=fl(u,s.rect);i.set(s.parentId,{expandedRect:v,parent:l})}return i.size>0&&i.forEach(({expandedRect:s,parent:l},u)=>{const v=l.internals.positionAbsolute,p=Tn(l),m=l.origin??o,f=s.x0||w>0||P||L)&&(r.push({id:u,type:"position",position:{x:l.position.x-f+P,y:l.position.y-w+L}}),n.get(u)?.forEach(A=>{t.some(V=>V.id===A.id)||r.push({id:A.id,type:"position",position:{x:A.position.x+f,y:A.position.y+w}})})),(p.width0){const w=Ep(f,e,n,r);v.push(...w)}return{changes:v,updatedInternals:u}}async function Pp({delta:t,panZoom:e,transform:n,translateExtent:o,width:r,height:i}){if(!e||!t.x&&!t.y)return Promise.resolve(!1);const s=await e.setViewportConstrained({x:n[0]+t.x,y:n[1]+t.y,zoom:n[2]},[[0,0],[r,i]],o),l=!!s&&(s.x!==n[0]||s.y!==n[1]||s.k!==n[2]);return Promise.resolve(l)}function ti(t,e,n,o,r,i){let s=r;const l=o.get(s)||new Map;o.set(s,l.set(n,e)),s=`${r}-${t}`;const u=o.get(s)||new Map;if(o.set(s,u.set(n,e)),i){s=`${r}-${t}-${i}`;const v=o.get(s)||new Map;o.set(s,v.set(n,e))}}function Mp(t,e,n){t.clear(),e.clear();for(const o of n){const{source:r,target:i,sourceHandle:s=null,targetHandle:l=null}=o,u={edgeId:o.id,source:r,target:i,sourceHandle:s,targetHandle:l},v=`${r}-${s}--${i}-${l}`,p=`${i}-${l}--${r}-${s}`;ti("source",u,p,t,r,s),ti("target",u,v,t,i,l),e.set(o.id,o)}}function zl(t,e){if(!t.parentId)return!1;const n=e.get(t.parentId);return n?n.selected?!0:zl(n,e):!1}function ni(t,e,n){let o=t;do{if(o?.matches?.(e))return!0;if(o===n)return!1;o=o?.parentElement}while(o);return!1}function Tp(t,e,n,o){const r=new Map;for(const[i,s]of t)if((s.selected||s.id===o)&&(!s.parentId||!zl(s,t))&&(s.draggable||e&&typeof s.draggable>"u")){const l=t.get(i);l&&r.set(i,{id:i,position:l.position||{x:0,y:0},distance:{x:n.x-l.internals.positionAbsolute.x,y:n.y-l.internals.positionAbsolute.y},extent:l.extent,parentId:l.parentId,origin:l.origin,expandParent:l.expandParent,internals:{positionAbsolute:l.internals.positionAbsolute||{x:0,y:0}},measured:{width:l.measured.width??0,height:l.measured.height??0}})}return r}function ur({nodeId:t,dragItems:e,nodeLookup:n,dragging:o=!0}){const r=[];for(const[s,l]of e){const u=n.get(s)?.internals.userNode;u&&r.push({...u,position:l.position,dragging:o})}if(!t)return[r[0],r];const i=n.get(t)?.internals.userNode;return[i?{...i,position:e.get(t)?.position||i.position,dragging:o}:r[0],r]}function Ip({dragItems:t,snapGrid:e,x:n,y:o}){const r=t.values().next().value;if(!r)return null;const i={x:n-r.distance.x,y:o-r.distance.y},s=Za(i,e);return{x:s.x-i.x,y:s.y-i.y}}function Ap({onNodeMouseDown:t,getStoreItems:e,onDragStart:n,onDrag:o,onDragStop:r}){let i={x:null,y:null},s=0,l=new Map,u=!1,v={x:0,y:0},p=null,m=!1,f=null,w=!1,S=!1,z=null;function P({noDragClassName:A,handleSelector:V,domNode:M,isSelectable:O,nodeId:b,nodeClickDistance:I=0}){f=Ut(M);function H({x:E,y:C}){const{nodeLookup:_,nodeExtent:T,snapGrid:D,snapToGrid:R,nodeOrigin:F,onNodeDrag:q,onSelectionDrag:K,onError:Z,updateNodePositions:ee}=e();i={x:E,y:C};let J=!1;const ne=l.size>1,le=ne&&T?Ir(Wa(l)):null,re=ne&&R?Ip({dragItems:l,snapGrid:D,x:E,y:C}):null;for(const[Q,j]of l){if(!_.has(Q))continue;let $={x:E-j.distance.x,y:C-j.distance.y};R&&($=re?{x:Math.round($.x+re.x),y:Math.round($.y+re.y)}:Za($,D));let de=null;if(ne&&T&&!j.extent&&le){const{positionAbsolute:ae}=j.internals,be=ae.x-le.x+T[0][0],se=ae.x+j.measured.width-le.x2+T[1][0],ge=ae.y-le.y+T[0][1],_e=ae.y+j.measured.height-le.y2+T[1][1];de=[[be,ge],[se,_e]]}const{position:ce,positionAbsolute:te}=dl({nodeId:Q,nextPosition:$,nodeLookup:_,nodeExtent:de||T,nodeOrigin:F,onError:Z});J=J||j.position.x!==ce.x||j.position.y!==ce.y,j.position=ce,j.internals.positionAbsolute=te}if(S=S||J,!!J&&(ee(l,!0),z&&(o||q||!b&&K))){const[Q,j]=ur({nodeId:b,dragItems:l,nodeLookup:_});o?.(z,l,Q,j),q?.(z,Q,j),b||K?.(z,j)}}async function B(){if(!p)return;const{transform:E,panBy:C,autoPanSpeed:_,autoPanOnNodeDrag:T}=e();if(!T){u=!1,cancelAnimationFrame(s);return}const[D,R]=vl(v,p,_);(D!==0||R!==0)&&(i.x=(i.x??0)-D/E[2],i.y=(i.y??0)-R/E[2],await C({x:D,y:R})&&H(i)),s=requestAnimationFrame(B)}function X(E){const{nodeLookup:C,multiSelectionActive:_,nodesDraggable:T,transform:D,snapGrid:R,snapToGrid:F,selectNodesOnDrag:q,onNodeDragStart:K,onSelectionDragStart:Z,unselectNodesAndEdges:ee}=e();m=!0,(!q||!O)&&!_&&b&&(C.get(b)?.selected||ee()),O&&q&&b&&t?.(b);const J=dr(E.sourceEvent,{transform:D,snapGrid:R,snapToGrid:F,containerBounds:p});if(i=J,l=Tp(C,T,J,b),l.size>0&&(n||K||!b&&Z)){const[ne,le]=ur({nodeId:b,dragItems:l,nodeLookup:C});n?.(E.sourceEvent,l,ne,le),K?.(E.sourceEvent,ne,le),b||Z?.(E.sourceEvent,le)}}const N=ev().clickDistance(I).on("start",E=>{const{domNode:C,nodeDragThreshold:_,transform:T,snapGrid:D,snapToGrid:R}=e();p=C?.getBoundingClientRect()||null,w=!1,S=!1,z=E.sourceEvent,_===0&&X(E),i=dr(E.sourceEvent,{transform:T,snapGrid:D,snapToGrid:R,containerBounds:p}),v=nn(E.sourceEvent,p)}).on("drag",E=>{const{autoPanOnNodeDrag:C,transform:_,snapGrid:T,snapToGrid:D,nodeDragThreshold:R,nodeLookup:F}=e(),q=dr(E.sourceEvent,{transform:_,snapGrid:T,snapToGrid:D,containerBounds:p});if(z=E.sourceEvent,(E.sourceEvent.type==="touchmove"&&E.sourceEvent.touches.length>1||b&&!F.has(b))&&(w=!0),!w){if(!u&&C&&m&&(u=!0,B()),!m){const K=nn(E.sourceEvent,p),Z=K.x-v.x,ee=K.y-v.y;Math.sqrt(Z*Z+ee*ee)>R&&X(E)}(i.x!==q.xSnapped||i.y!==q.ySnapped)&&l&&m&&(v=nn(E.sourceEvent,p),H(q))}}).on("end",E=>{if(!(!m||w)&&(u=!1,m=!1,cancelAnimationFrame(s),l.size>0)){const{nodeLookup:C,updateNodePositions:_,onNodeDragStop:T,onSelectionDragStop:D}=e();if(S&&(_(l,!1),S=!1),r||T||!b&&D){const[R,F]=ur({nodeId:b,dragItems:l,nodeLookup:C,dragging:!1});r?.(E.sourceEvent,l,R,F),T?.(E.sourceEvent,R,F),b||D?.(E.sourceEvent,F)}}}).filter(E=>{const C=E.target;return!E.button&&(!A||!ni(C,`.${A}`,M))&&(!V||ni(C,V,M))});f.call(N)}function L(){f?.on(".drag",null)}return{update:P,destroy:L}}function Dp(t,e,n){const o=[],r={x:t.x-n,y:t.y-n,width:n*2,height:n*2};for(const i of e.values())Va(r,fa(i))>0&&o.push(i);return o}const Op=250;function Rp(t,e,n,o){let r=[],i=1/0;const s=Dp(t,n,e+Op);for(const l of s){const u=[...l.internals.handleBounds?.source??[],...l.internals.handleBounds?.target??[]];for(const v of u){if(o.nodeId===v.nodeId&&o.type===v.type&&o.id===v.id)continue;const{x:p,y:m}=Yn(l,v,v.position,!0),f=Math.sqrt(Math.pow(p-t.x,2)+Math.pow(m-t.y,2));f>e||(f1){const l=o.type==="source"?"target":"source";return r.find(u=>u.type===l)??r[0]}return r[0]}function Sl(t,e,n,o,r,i=!1){const s=o.get(t);if(!s)return null;const l=r==="strict"?s.internals.handleBounds?.[e]:[...s.internals.handleBounds?.source??[],...s.internals.handleBounds?.target??[]],u=(n?l?.find(v=>v.id===n):l?.[0])??null;return u&&i?{...u,...Yn(s,u,u.position,!0)}:u}function Cl(t,e){return t||(e?.classList.contains("target")?"target":e?.classList.contains("source")?"source":null)}function Lp(t,e){let n=null;return e?n=!0:t&&!e&&(n=!1),n}const El=()=>!0;function Vp(t,{connectionMode:e,connectionRadius:n,handleId:o,nodeId:r,edgeUpdaterType:i,isTarget:s,domNode:l,nodeLookup:u,lib:v,autoPanOnConnect:p,flowId:m,panBy:f,cancelConnection:w,onConnectStart:S,onConnect:z,onConnectEnd:P,isValidConnection:L=El,onReconnectEnd:A,updateConnection:V,getTransform:M,getFromHandle:O,autoPanSpeed:b,dragThreshold:I=1,handleDomNode:H}){const B=gl(t.target);let X=0,N;const{x:E,y:C}=nn(t),_=Cl(i,H),T=l?.getBoundingClientRect();let D=!1;if(!T||!_)return;const R=Sl(r,_,o,u,e);if(!R)return;let F=nn(t,T),q=!1,K=null,Z=!1,ee=null;function J(){if(!p||!T)return;const[ce,te]=vl(F,T,b);f({x:ce,y:te}),X=requestAnimationFrame(J)}const ne={...R,nodeId:r,type:_,position:R.position},le=u.get(r);let Q={inProgress:!0,isValid:null,from:Yn(le,ne,Se.Left,!0),fromHandle:ne,fromPosition:ne.position,fromNode:le,to:F,toHandle:null,toPosition:js[ne.position],toNode:null,pointer:F};function j(){D=!0,V(Q),S?.(t,{nodeId:r,handleId:o,handleType:_})}I===0&&j();function $(ce){if(!D){const{x:_e,y:pe}=nn(ce),ye=_e-E,me=pe-C;if(!(ye*ye+me*me>I*I))return;j()}if(!O()||!ne){de(ce);return}const te=M();F=nn(ce,T),N=Rp(Ya(F,te,!1,[1,1]),n,u,ne),q||(J(),q=!0);const ae=Nl(ce,{handle:N,connectionMode:e,fromNodeId:r,fromHandleId:o,fromType:s?"target":"source",isValidConnection:L,doc:B,lib:v,flowId:m,nodeLookup:u});ee=ae.handleDomNode,K=ae.connection,Z=Lp(!!N,ae.isValid);const be=u.get(r),se=be?Yn(be,ne,Se.Left,!0):Q.from,ge={...Q,from:se,isValid:Z,to:ae.toHandle&&Z?Do({x:ae.toHandle.x,y:ae.toHandle.y},te):F,toHandle:ae.toHandle,toPosition:Z&&ae.toHandle?ae.toHandle.position:js[ne.position],toNode:ae.toHandle?u.get(ae.toHandle.nodeId):null,pointer:F};V(ge),Q=ge}function de(ce){if(!("touches"in ce&&ce.touches.length>0)){if(D){(N||ee)&&K&&Z&&z?.(K);const{inProgress:te,...ae}=Q,be={...ae,toPosition:Q.toHandle?Q.toPosition:null};P?.(ce,be),i&&A?.(ce,be)}w(),cancelAnimationFrame(X),q=!1,Z=!1,K=null,ee=null,B.removeEventListener("mousemove",$),B.removeEventListener("mouseup",de),B.removeEventListener("touchmove",$),B.removeEventListener("touchend",de)}}B.addEventListener("mousemove",$),B.addEventListener("mouseup",de),B.addEventListener("touchmove",$),B.addEventListener("touchend",de)}function Nl(t,{handle:e,connectionMode:n,fromNodeId:o,fromHandleId:r,fromType:i,doc:s,lib:l,flowId:u,isValidConnection:v=El,nodeLookup:p}){const m=i==="target",f=e?s.querySelector(`.${l}-flow__handle[data-id="${u}-${e?.nodeId}-${e?.id}-${e?.type}"]`):null,{x:w,y:S}=nn(t),z=s.elementFromPoint(w,S),P=z?.classList.contains(`${l}-flow__handle`)?z:f,L={handleDomNode:P,isValid:!1,connection:null,toHandle:null};if(P){const A=Cl(void 0,P),V=P.getAttribute("data-nodeid"),M=P.getAttribute("data-handleid"),O=P.classList.contains("connectable"),b=P.classList.contains("connectableend");if(!V||!A)return L;const I={source:m?V:o,sourceHandle:m?M:r,target:m?o:V,targetHandle:m?r:M};L.connection=I;const B=O&&b&&(n===ua.Strict?m&&A==="source"||!m&&A==="target":V!==o||M!==r);L.isValid=B&&v(I),L.toHandle=Sl(V,A,M,p,n,!0)}return L}const ai={onPointerDown:Vp,isValid:Nl};function Hp({domNode:t,panZoom:e,getTransform:n,getViewScale:o}){const r=Ut(t);function i({translateExtent:l,width:u,height:v,zoomStep:p=1,pannable:m=!0,zoomable:f=!0,inversePan:w=!1}){const S=V=>{if(V.sourceEvent.type!=="wheel"||!e)return;const M=n(),O=V.sourceEvent.ctrlKey&&Ha()?10:1,b=-V.sourceEvent.deltaY*(V.sourceEvent.deltaMode===1?.05:V.sourceEvent.deltaMode?1:.002)*p,I=M[2]*Math.pow(2,b*O);e.scaleTo(I)};let z=[0,0];const P=V=>{(V.sourceEvent.type==="mousedown"||V.sourceEvent.type==="touchstart")&&(z=[V.sourceEvent.clientX??V.sourceEvent.touches[0].clientX,V.sourceEvent.clientY??V.sourceEvent.touches[0].clientY])},L=V=>{const M=n();if(V.sourceEvent.type!=="mousemove"&&V.sourceEvent.type!=="touchmove"||!e)return;const O=[V.sourceEvent.clientX??V.sourceEvent.touches[0].clientX,V.sourceEvent.clientY??V.sourceEvent.touches[0].clientY],b=[O[0]-z[0],O[1]-z[1]];z=O;const I=o()*Math.max(M[2],Math.log(M[2]))*(w?-1:1),H={x:M[0]-b[0]*I,y:M[1]-b[1]*I},B=[[0,0],[u,v]];e.setViewportConstrained({x:H.x,y:H.y,zoom:M[2]},B,l)},A=il().on("start",P).on("zoom",m?L:null).on("zoom.wheel",f?S:null);r.call(A,{})}function s(){r.on("zoom",null)}return{update:i,destroy:s,pointer:en}}const Zo=t=>({x:t.x,y:t.y,zoom:t.k}),vr=({x:t,y:e,zoom:n})=>Ko.translate(t,e).scale(n),aa=(t,e)=>t.target.closest(`.${e}`),Pl=(t,e)=>e===2&&Array.isArray(t)&&t.includes(2),Fp=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,fr=(t,e=0,n=Fp,o=()=>{})=>{const r=typeof e=="number"&&e>0;return r||o(),r?t.transition().duration(e).ease(n).on("end",o):t},Ml=t=>{const e=t.ctrlKey&&Ha()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*e};function qp({zoomPanValues:t,noWheelClassName:e,d3Selection:n,d3Zoom:o,panOnScrollMode:r,panOnScrollSpeed:i,zoomOnPinch:s,onPanZoomStart:l,onPanZoom:u,onPanZoomEnd:v}){return p=>{if(aa(p,e))return p.ctrlKey&&p.preventDefault(),!1;p.preventDefault(),p.stopImmediatePropagation();const m=n.property("__zoom").k||1;if(p.ctrlKey&&s){const P=en(p),L=Ml(p),A=m*Math.pow(2,L);o.scaleTo(n,A,P,p);return}const f=p.deltaMode===1?20:1;let w=r===sa.Vertical?0:p.deltaX*f,S=r===sa.Horizontal?0:p.deltaY*f;!Ha()&&p.shiftKey&&r!==sa.Vertical&&(w=p.deltaY*f,S=0),o.translateBy(n,-(w/m)*i,-(S/m)*i,{internal:!0});const z=Zo(n.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?(u?.(p,z),t.panScrollTimeout=setTimeout(()=>{v?.(p,z),t.isPanScrolling=!1},150)):(t.isPanScrolling=!0,l?.(p,z))}}function Bp({noWheelClassName:t,preventScrolling:e,d3ZoomHandler:n}){return function(o,r){const i=o.type==="wheel",s=!e&&i&&!o.ctrlKey,l=aa(o,t);if(o.ctrlKey&&i&&l&&o.preventDefault(),s||l)return null;o.preventDefault(),n.call(this,o,r)}}function Kp({zoomPanValues:t,onDraggingChange:e,onPanZoomStart:n}){return o=>{if(o.sourceEvent?.internal)return;const r=Zo(o.transform);t.mouseButton=o.sourceEvent?.button||0,t.isZoomingOrPanning=!0,t.prevViewport=r,o.sourceEvent?.type==="mousedown"&&e(!0),n&&n?.(o.sourceEvent,r)}}function jp({zoomPanValues:t,panOnDrag:e,onPaneContextMenu:n,onTransformChange:o,onPanZoom:r}){return i=>{t.usedRightMouseButton=!!(n&&Pl(e,t.mouseButton??0)),i.sourceEvent?.sync||o([i.transform.x,i.transform.y,i.transform.k]),r&&!i.sourceEvent?.internal&&r?.(i.sourceEvent,Zo(i.transform))}}function Wp({zoomPanValues:t,panOnDrag:e,panOnScroll:n,onDraggingChange:o,onPanZoomEnd:r,onPaneContextMenu:i}){return s=>{if(!s.sourceEvent?.internal&&(t.isZoomingOrPanning=!1,i&&Pl(e,t.mouseButton??0)&&!t.usedRightMouseButton&&s.sourceEvent&&i(s.sourceEvent),t.usedRightMouseButton=!1,o(!1),r)){const l=Zo(s.transform);t.prevViewport=l,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{r?.(s.sourceEvent,l)},n?150:0)}}}function Zp({zoomActivationKeyPressed:t,zoomOnScroll:e,zoomOnPinch:n,panOnDrag:o,panOnScroll:r,zoomOnDoubleClick:i,userSelectionActive:s,noWheelClassName:l,noPanClassName:u,lib:v,connectionInProgress:p}){return m=>{const f=t||e,w=n&&m.ctrlKey,S=m.type==="wheel";if(m.button===1&&m.type==="mousedown"&&(aa(m,`${v}-flow__node`)||aa(m,`${v}-flow__edge`)))return!0;if(!o&&!f&&!r&&!i&&!n||s||p&&!S||aa(m,l)&&S||aa(m,u)&&(!S||r&&S&&!t)||!n&&m.ctrlKey&&S)return!1;if(!n&&m.type==="touchstart"&&m.touches?.length>1)return m.preventDefault(),!1;if(!f&&!r&&!w&&S||!o&&(m.type==="mousedown"||m.type==="touchstart")||Array.isArray(o)&&!o.includes(m.button)&&m.type==="mousedown")return!1;const z=Array.isArray(o)&&o.includes(m.button)||!m.button||m.button<=1;return(!m.ctrlKey||S)&&z}}function Yp({domNode:t,minZoom:e,maxZoom:n,translateExtent:o,viewport:r,onPanZoom:i,onPanZoomStart:s,onPanZoomEnd:l,onDraggingChange:u}){const v={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},p=t.getBoundingClientRect(),m=il().scaleExtent([e,n]).translateExtent(o),f=Ut(t).call(m);A({x:r.x,y:r.y,zoom:va(r.zoom,e,n)},[[0,0],[p.width,p.height]],o);const w=f.on("wheel.zoom"),S=f.on("dblclick.zoom");m.wheelDelta(Ml);function z(N,E){return f?new Promise(C=>{m?.interpolate(E?.interpolate==="linear"?Ea:fo).transform(fr(f,E?.duration,E?.ease,()=>C(!0)),N)}):Promise.resolve(!1)}function P({noWheelClassName:N,noPanClassName:E,onPaneContextMenu:C,userSelectionActive:_,panOnScroll:T,panOnDrag:D,panOnScrollMode:R,panOnScrollSpeed:F,preventScrolling:q,zoomOnPinch:K,zoomOnScroll:Z,zoomOnDoubleClick:ee,zoomActivationKeyPressed:J,lib:ne,onTransformChange:le,connectionInProgress:re,paneClickDistance:Q,selectionOnDrag:j}){_&&!v.isZoomingOrPanning&&L();const $=T&&!J&&!_;m.clickDistance(j?1/0:!wn(Q)||Q<0?0:Q);const de=$?qp({zoomPanValues:v,noWheelClassName:N,d3Selection:f,d3Zoom:m,panOnScrollMode:R,panOnScrollSpeed:F,zoomOnPinch:K,onPanZoomStart:s,onPanZoom:i,onPanZoomEnd:l}):Bp({noWheelClassName:N,preventScrolling:q,d3ZoomHandler:w});if(f.on("wheel.zoom",de,{passive:!1}),!_){const te=Kp({zoomPanValues:v,onDraggingChange:u,onPanZoomStart:s});m.on("start",te);const ae=jp({zoomPanValues:v,panOnDrag:D,onPaneContextMenu:!!C,onPanZoom:i,onTransformChange:le});m.on("zoom",ae);const be=Wp({zoomPanValues:v,panOnDrag:D,panOnScroll:T,onPaneContextMenu:C,onPanZoomEnd:l,onDraggingChange:u});m.on("end",be)}const ce=Zp({zoomActivationKeyPressed:J,panOnDrag:D,zoomOnScroll:Z,panOnScroll:T,zoomOnDoubleClick:ee,zoomOnPinch:K,userSelectionActive:_,noPanClassName:E,noWheelClassName:N,lib:ne,connectionInProgress:re});m.filter(ce),ee?f.on("dblclick.zoom",S):f.on("dblclick.zoom",null)}function L(){m.on("zoom",null)}async function A(N,E,C){const _=vr(N),T=m?.constrain()(_,E,C);return T&&await z(T),new Promise(D=>D(T))}async function V(N,E){const C=vr(N);return await z(C,E),new Promise(_=>_(C))}function M(N){if(f){const E=vr(N),C=f.property("__zoom");(C.k!==N.zoom||C.x!==N.x||C.y!==N.y)&&m?.transform(f,E,null,{sync:!0})}}function O(){const N=f?sl(f.node()):{x:0,y:0,k:1};return{x:N.x,y:N.y,zoom:N.k}}function b(N,E){return f?new Promise(C=>{m?.interpolate(E?.interpolate==="linear"?Ea:fo).scaleTo(fr(f,E?.duration,E?.ease,()=>C(!0)),N)}):Promise.resolve(!1)}function I(N,E){return f?new Promise(C=>{m?.interpolate(E?.interpolate==="linear"?Ea:fo).scaleBy(fr(f,E?.duration,E?.ease,()=>C(!0)),N)}):Promise.resolve(!1)}function H(N){m?.scaleExtent(N)}function B(N){m?.translateExtent(N)}function X(N){const E=!wn(N)||N<0?0:N;m?.clickDistance(E)}return{update:P,destroy:L,setViewport:V,setViewportConstrained:A,getViewport:O,scaleTo:b,scaleBy:I,setScaleExtent:H,setTranslateExtent:B,syncViewport:M,setClickDistance:X}}var oi;(function(t){t.Line="line",t.Handle="handle"})(oi||(oi={}));function ss(){const t={};return[e=>{if(e&&!uc(t))throw new Error(e);return Or(t)},e=>pi(t,e)]}const[Xp,Gp]=ss(),[Up,Jp]=ss(),[Qp,$p]=ss();var eh=x("
    ");function bt(t,e){Ee(e,!0);let n=ue(e,"id",3,null),o=ue(e,"type",3,"source"),r=ue(e,"position",19,()=>Se.Top),i=ue(e,"isConnectableStart",3,!0),s=ue(e,"isConnectableEnd",3,!0),l=Pn(e,["$$slots","$$events","$$legacy","id","type","position","style","class","isConnectable","isConnectableStart","isConnectableEnd","isValidConnection","onconnect","ondisconnect","children"]);const u=Xp("Handle must be used within a Custom Node component"),v=Up("Handle must be used within a Custom Node component");let p=k(()=>o()==="target"),m=k(()=>e.isConnectable!==void 0?e.isConnectable:v.value),f=Cn(),w=k(()=>f.ariaLabelConfig),S=null;vc(()=>{if(e.onconnect||e.ondisconnect){f.edges;let E=f.connectionLookup.get(`${u}-${o()}${n()?`-${n()}`:""}`);if(S&&!Gf(E,S)){const C=E??new Map;Ws(S,C,e.ondisconnect),Ws(C,S,e.onconnect)}S=new Map(E)}});let z=k(()=>{if(!f.connection.inProgress)return[!1,!1,!1,!1,null];const{fromHandle:E,toHandle:C,isValid:_}=f.connection,T=E&&E.nodeId===u&&E.type===o()&&E.id===n(),D=C&&C.nodeId===u&&C.type===o()&&C.id===n(),R=f.connectionMode===ua.Strict?E?.type!==o():u!==E?.nodeId||n()!==E?.id;return[!0,T,D,R,D&&_]}),P=k(()=>zn(a(z),5)),L=k(()=>a(P)[0]),A=k(()=>a(P)[1]),V=k(()=>a(P)[2]),M=k(()=>a(P)[3]),O=k(()=>a(P)[4]);function b(E){const C=f.onbeforeconnect?f.onbeforeconnect(E):E;C&&(f.addEdge(C),f.onconnect?.(E))}function I(E){const C=_l(E);E.currentTarget&&(C&&E.button===0||!C)&&ai.onPointerDown(E,{handleId:n(),nodeId:u,isTarget:a(p),connectionRadius:f.connectionRadius,domNode:f.domNode,nodeLookup:f.nodeLookup,connectionMode:f.connectionMode,lib:"svelte",autoPanOnConnect:f.autoPanOnConnect,autoPanSpeed:f.autoPanSpeed,flowId:f.flowId,isValidConnection:e.isValidConnection||((..._)=>f.isValidConnection?.(..._)??!0),updateConnection:f.updateConnection,cancelConnection:f.cancelConnection,panBy:f.panBy,onConnect:b,onConnectStart:f.onconnectstart,onConnectEnd:(..._)=>f.onconnectend?.(..._),getTransform:()=>[f.viewport.x,f.viewport.y,f.viewport.zoom],getFromHandle:()=>f.connection.fromHandle,dragThreshold:f.connectionDragThreshold,handleDomNode:E.currentTarget})}function H(E){if(!u||!f.clickConnectStartHandle&&!i())return;if(!f.clickConnectStartHandle){f.onclickconnectstart?.(E,{nodeId:u,handleId:n(),handleType:o()}),f.clickConnectStartHandle={nodeId:u,type:o(),id:n()};return}const C=gl(E.target),_=e.isValidConnection??f.isValidConnection,{connectionMode:T,clickConnectStartHandle:D,flowId:R,nodeLookup:F}=f,{connection:q,isValid:K}=ai.isValid(E,{handle:{nodeId:u,id:n(),type:o()},connectionMode:T,fromNodeId:D.nodeId,fromHandleId:D.id??null,fromType:D.type,isValidConnection:_,flowId:R,doc:C,lib:"svelte",nodeLookup:F});K&&q&&b(q);const Z=structuredClone(Ni(f.connection));delete Z.inProgress,Z.toPosition=Z.toHandle?Z.toHandle.position:null,f.onclickconnectend?.(E,Z),f.clickConnectStartHandle=null}var B=eh(),X=()=>{};Mn(B,()=>({"data-handleid":n(),"data-nodeid":u,"data-handlepos":r(),"data-id":`${f.flowId??""}-${u??""}-${n()??"null"??""}-${o()??""}`,class:["svelte-flow__handle",`svelte-flow__handle-${r()}`,f.noDragClass,f.noPanClass,r(),e.class],onmousedown:I,ontouchstart:I,onclick:f.clickConnect?H:void 0,onkeypress:X,style:e.style,role:"button","aria-label":a(w)["handle.ariaLabel"],tabindex:"-1",...l,[Lr]:{valid:a(O),connectingto:a(V),connectingfrom:a(A),source:!a(p),target:a(p),connectablestart:i(),connectableend:s(),connectable:a(m),connectionindicator:a(m)&&(!a(L)||a(M))&&(a(L)||f.clickConnectStartHandle?s():i())}}));var N=d(B);Jt(N,()=>e.children??ha),c(B),g(t,B),Ne()}var th=x(" ",1);function Tl(t,e){Ee(e,!0);let n=ue(e,"targetPosition",19,()=>Se.Top),o=ue(e,"sourcePosition",19,()=>Se.Bottom);var r=th(),i=oe(r);bt(i,{type:"target",get position(){return n()}});var s=h(i),l=h(s);bt(l,{type:"source",get position(){return o()}}),U(()=>Y(s,` ${e.data?.label??""} `)),g(t,r),Ne()}var nh=x(" ",1);function ah(t,e){Ee(e,!0);let n=ue(e,"data",19,()=>({label:"Node"})),o=ue(e,"sourcePosition",19,()=>Se.Bottom);he();var r=nh(),i=oe(r),s=h(i);bt(s,{type:"source",get position(){return o()}}),U(()=>Y(i,`${n()?.label??""} `)),g(t,r),Ne()}var oh=x(" ",1);function rh(t,e){Ee(e,!0);let n=ue(e,"data",19,()=>({label:"Node"})),o=ue(e,"targetPosition",19,()=>Se.Top);he();var r=oh(),i=oe(r),s=h(i);bt(s,{type:"target",get position(){return o()}}),U(()=>Y(i,`${n()?.label??""} `)),g(t,r),Ne()}function sh(t,e){}function pr(t,e,n){if(!n||!e)return;const o=n==="root"?e:e.querySelector(`.svelte-flow__${n}`);o&&o.appendChild(t)}function ih(t,e){const n=k(Cn),o=k(()=>a(n).domNode);let r;return a(o)?pr(t,a(o),e):r=hi(()=>{xe(()=>{pr(t,a(o),e),r?.()})}),{async update(i){pr(t,a(o),i)},destroy(){t.parentNode&&t.parentNode.removeChild(t),r?.()}}}function lh(){let t=G(typeof window>"u");if(a(t)){const e=hi(()=>{xe(()=>{y(t,!1),e?.()})})}return{get value(){return a(t)}}}const ri=t=>Jf(t),ch=t=>cl(t);function gn(t){return t===void 0?void 0:`${t}px`}const Oo={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}};var dh=x("
    ");function uh(t,e){Ee(e,!0);let n=ue(e,"x",3,0),o=ue(e,"y",3,0),r=ue(e,"selectEdgeOnClick",3,!1),i=ue(e,"transparent",3,!1),s=Pn(e,["$$slots","$$events","$$legacy","x","y","width","height","selectEdgeOnClick","transparent","class","children"]);const l=Cn(),u=Qp("EdgeLabel must be used within a Custom Edge component");let v=k(()=>l.visible.edges.get(u)?.zIndex);var p=dh(),m=()=>{r()&&u&&l.handleEdgeSelection(u)};Mn(p,w=>({class:["svelte-flow__edge-label",{transparent:i()},e.class],tabindex:"-1",onclick:m,...s,[Ro]:w}),[()=>({display:lh().value?"none":void 0,cursor:r()?"pointer":void 0,transform:`translate(-50%, -50%) translate(${n()??""}px,${o()??""}px)`,"pointer-events":"all",width:gn(e.width),height:gn(e.height),"z-index":a(v)})],void 0,void 0,"svelte-1wg91mu");var f=d(p);Jt(f,()=>e.children??ha),c(p),qt(p,(w,S)=>ih?.(w,S),()=>"edge-labels"),g(t,p),Ne()}var vh=Mt(""),fh=Mt('',1);function Yo(t,e){let n=ue(e,"interactionWidth",3,20),o=Pn(e,["$$slots","$$events","$$legacy","id","path","label","labelX","labelY","labelStyle","markerStart","markerEnd","style","interactionWidth","class"]);var r=fh(),i=oe(r),s=h(i);{var l=p=>{var m=vh();Mn(m,()=>({d:e.path,"stroke-opacity":0,"stroke-width":n(),fill:"none",class:"svelte-flow__edge-interaction",...o})),g(p,m)};W(s,p=>{n()>0&&p(l)})}var u=h(s);{var v=p=>{uh(p,{get x(){return e.labelX},get y(){return e.labelY},get style(){return e.labelStyle},selectEdgeOnClick:!0,children:(m,f)=>{he();var w=fc();U(()=>Y(w,e.label)),g(m,w)},$$slots:{default:!0}})};W(u,p=>{e.label&&p(v)})}U(()=>{ze(i,"id",e.id),ze(i,"d",e.path),Oe(i,0,Gn(["svelte-flow__edge-path",e.class])),ze(i,"marker-start",e.markerStart),ze(i,"marker-end",e.markerEnd),pt(i,e.style)}),g(t,r)}function Il(t,e){Ee(e,!0);let n=k(()=>yl({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition,curvature:e.pathOptions?.curvature})),o=k(()=>zn(a(n),3)),r=k(()=>a(o)[0]),i=k(()=>a(o)[1]),s=k(()=>a(o)[2]);Yo(t,{get id(){return e.id},get path(){return a(r)},get labelX(){return a(i)},get labelY(){return a(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ne()}function ph(t,e){Ee(e,!0);let n=k(()=>ts({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition})),o=k(()=>zn(a(n),3)),r=k(()=>a(o)[0]),i=k(()=>a(o)[1]),s=k(()=>a(o)[2]);Yo(t,{get path(){return a(r)},get labelX(){return a(i)},get labelY(){return a(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ne()}function hh(t,e){Ee(e,!0);let n=k(()=>xl({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY})),o=k(()=>zn(a(n),3)),r=k(()=>a(o)[0]),i=k(()=>a(o)[1]),s=k(()=>a(o)[2]);Yo(t,{get path(){return a(r)},get labelX(){return a(i)},get labelY(){return a(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ne()}function gh(t,e){Ee(e,!0);let n=k(()=>ts({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition,borderRadius:0})),o=k(()=>zn(a(n),3)),r=k(()=>a(o)[0]),i=k(()=>a(o)[1]),s=k(()=>a(o)[2]);Yo(t,{get path(){return a(r)},get labelX(){return a(i)},get labelY(){return a(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ne()}class mh{#e;#t;constructor(e,n){this.#e=e,this.#t=pc(n)}get current(){return this.#t(),this.#e()}}const _h=/\(.+\)/,yh=new Set(["all","print","screen","and","or","not","only"]);class bh extends mh{constructor(e,n){let o=_h.test(e)||e.split(/[\s,]+/).some(i=>yh.has(i.trim()))?e:`(${e})`;const r=window.matchMedia(o);super(()=>r.matches,i=>mr(r,"change",i))}}function xh(t,e,n,o){const r=new Map;return $r(t,{x:0,y:0,width:n,height:o},e,!0).forEach(i=>{r.set(i.id,i)}),r}function si(t){const{edges:e,defaultEdgeOptions:n,nodeLookup:o,previousEdges:r,connectionMode:i,onerror:s,onlyRenderVisible:l,elevateEdgesOnSelect:u,zIndexMode:v}=t,p=new Map;for(const m of e){const f=o.get(m.source),w=o.get(m.target);if(!f||!w)continue;if(l){const{visibleNodes:P,transform:L,width:A,height:V}=t;if(up({sourceNode:f,targetNode:w,width:A,height:V,transform:L}))P.set(f.id,f),P.set(w.id,w);else continue}const S=r.get(m.id);if(S&&m===S.edge&&f==S.sourceNode&&w==S.targetNode){p.set(m.id,S);continue}const z=_p({id:m.id,sourceNode:f,targetNode:w,sourceHandle:m.sourceHandle||null,targetHandle:m.targetHandle||null,connectionMode:i,onError:s});z&&p.set(m.id,{...n,...m,...z,zIndex:dp({selected:m.selected,zIndex:m.zIndex??n.zIndex,sourceNode:f,targetNode:w,elevateOnSelect:u,zIndexMode:v}),sourceNode:f,targetNode:w,edge:m})}return p}const Al={input:ah,output:rh,default:Tl,group:sh},Dl={straight:hh,smoothstep:ph,default:Il,step:gh};function wh(t,e,n,o,r,i){if(e&&!n&&o&&r){const s=Wa(i,{filter:l=>!!((l.width||l.initialWidth)&&(l.height||l.initialHeight))});return es(s,o,r,.5,2,.1)}else return n??{x:0,y:0,zoom:1}}function kh(t){class e{#e=k(()=>t.props.id??"1");get flowId(){return a(this.#e)}set flowId(o){y(this.#e,o)}#t=G(null);get domNode(){return a(this.#t)}set domNode(o){y(this.#t,o)}#n=G(null);get panZoom(){return a(this.#n)}set panZoom(o){y(this.#n,o)}#a=G(t.width??0);get width(){return a(this.#a)}set width(o){y(this.#a,o)}#o=G(t.height??0);get height(){return a(this.#o)}set height(o){y(this.#o,o)}#r=G(t.props.zIndexMode??"basic");get zIndexMode(){return a(this.#r)}set zIndexMode(o){y(this.#r,o)}#s=k(()=>{const o=zp(t.nodes,this.nodeLookup,this.parentLookup,{nodeExtent:this.nodeExtent,nodeOrigin:this.nodeOrigin,elevateNodesOnSelect:t.props.elevateNodesOnSelect??!0,checkEquality:!0,zIndexMode:this.zIndexMode});return this.fitViewQueued&&o&&(this.fitViewOptions?.duration?this.resolveFitView():queueMicrotask(()=>{this.resolveFitView()})),o});get nodesInitialized(){return a(this.#s)}set nodesInitialized(o){y(this.#s,o)}#i=k(()=>this.panZoom!==null);get viewportInitialized(){return a(this.#i)}set viewportInitialized(o){y(this.#i,o)}#l=k(()=>(Mp(this.connectionLookup,this.edgeLookup,t.edges),t.edges));get _edges(){return a(this.#l)}set _edges(o){y(this.#l,o)}get nodes(){return this.nodesInitialized,t.nodes}set nodes(o){t.nodes=o}get edges(){return this._edges}set edges(o){t.edges=o}_prevSelectedNodes=[];_prevSelectedNodeIds=new Set;#c=k(()=>{const o=this._prevSelectedNodeIds.size,r=new Set,i=this.nodes.filter(s=>(s.selected&&(r.add(s.id),this._prevSelectedNodeIds.delete(s.id)),s.selected));return(o!==r.size||this._prevSelectedNodeIds.size>0)&&(this._prevSelectedNodes=i),this._prevSelectedNodeIds=r,this._prevSelectedNodes});get selectedNodes(){return a(this.#c)}set selectedNodes(o){y(this.#c,o)}_prevSelectedEdges=[];_prevSelectedEdgeIds=new Set;#d=k(()=>{const o=this._prevSelectedEdgeIds.size,r=new Set,i=this.edges.filter(s=>(s.selected&&(r.add(s.id),this._prevSelectedEdgeIds.delete(s.id)),s.selected));return(o!==r.size||this._prevSelectedEdgeIds.size>0)&&(this._prevSelectedEdges=i),this._prevSelectedEdgeIds=r,this._prevSelectedEdges});get selectedEdges(){return a(this.#d)}set selectedEdges(o){y(this.#d,o)}selectionChangeHandlers=new Map;nodeLookup=new Map;parentLookup=new Map;connectionLookup=new Map;edgeLookup=new Map;_prevVisibleEdges=new Map;#u=k(()=>{const{nodes:o,_edges:r,_prevVisibleEdges:i,nodeLookup:s,connectionMode:l,onerror:u,onlyRenderVisibleElements:v,defaultEdgeOptions:p,zIndexMode:m}=this;let f,w;const S={edges:r,defaultEdgeOptions:p,previousEdges:i,nodeLookup:s,connectionMode:l,elevateEdgesOnSelect:t.props.elevateEdgesOnSelect??!0,zIndexMode:m,onerror:u};if(v){const{viewport:z,width:P,height:L}=this,A=[z.x,z.y,z.zoom];f=xh(s,A,P,L),w=si({...S,onlyRenderVisible:!0,visibleNodes:f,transform:A,width:P,height:L})}else f=this.nodeLookup,w=si(S);return{nodes:f,edges:w}});get visible(){return a(this.#u)}set visible(o){y(this.#u,o)}#v=k(()=>t.props.nodesDraggable??!0);get nodesDraggable(){return a(this.#v)}set nodesDraggable(o){y(this.#v,o)}#f=k(()=>t.props.nodesConnectable??!0);get nodesConnectable(){return a(this.#f)}set nodesConnectable(o){y(this.#f,o)}#p=k(()=>t.props.elementsSelectable??!0);get elementsSelectable(){return a(this.#p)}set elementsSelectable(o){y(this.#p,o)}#h=k(()=>t.props.nodesFocusable??!0);get nodesFocusable(){return a(this.#h)}set nodesFocusable(o){y(this.#h,o)}#g=k(()=>t.props.edgesFocusable??!0);get edgesFocusable(){return a(this.#g)}set edgesFocusable(o){y(this.#g,o)}#m=k(()=>t.props.disableKeyboardA11y??!1);get disableKeyboardA11y(){return a(this.#m)}set disableKeyboardA11y(o){y(this.#m,o)}#_=k(()=>t.props.minZoom??.5);get minZoom(){return a(this.#_)}set minZoom(o){y(this.#_,o)}#y=k(()=>t.props.maxZoom??2);get maxZoom(){return a(this.#y)}set maxZoom(o){y(this.#y,o)}#b=k(()=>t.props.nodeOrigin??[0,0]);get nodeOrigin(){return a(this.#b)}set nodeOrigin(o){y(this.#b,o)}#x=k(()=>t.props.nodeExtent??Mr);get nodeExtent(){return a(this.#x)}set nodeExtent(o){y(this.#x,o)}#w=k(()=>t.props.translateExtent??Mr);get translateExtent(){return a(this.#w)}set translateExtent(o){y(this.#w,o)}#k=k(()=>t.props.defaultEdgeOptions??{});get defaultEdgeOptions(){return a(this.#k)}set defaultEdgeOptions(o){y(this.#k,o)}#z=k(()=>t.props.nodeDragThreshold??1);get nodeDragThreshold(){return a(this.#z)}set nodeDragThreshold(o){y(this.#z,o)}#S=k(()=>t.props.autoPanOnNodeDrag??!0);get autoPanOnNodeDrag(){return a(this.#S)}set autoPanOnNodeDrag(o){y(this.#S,o)}#C=k(()=>t.props.autoPanOnConnect??!0);get autoPanOnConnect(){return a(this.#C)}set autoPanOnConnect(o){y(this.#C,o)}#E=k(()=>t.props.autoPanOnNodeFocus??!0);get autoPanOnNodeFocus(){return a(this.#E)}set autoPanOnNodeFocus(o){y(this.#E,o)}#N=k(()=>t.props.autoPanSpeed??15);get autoPanSpeed(){return a(this.#N)}set autoPanSpeed(o){y(this.#N,o)}#P=k(()=>t.props.connectionDragThreshold??1);get connectionDragThreshold(){return a(this.#P)}set connectionDragThreshold(o){y(this.#P,o)}fitViewQueued=t.props.fitView??!1;fitViewOptions=t.props.fitViewOptions;fitViewResolver=null;#M=k(()=>t.props.snapGrid??null);get snapGrid(){return a(this.#M)}set snapGrid(o){y(this.#M,o)}#T=G(!1);get dragging(){return a(this.#T)}set dragging(o){y(this.#T,o)}#I=G(null);get selectionRect(){return a(this.#I)}set selectionRect(o){y(this.#I,o)}#A=G(!1);get selectionKeyPressed(){return a(this.#A)}set selectionKeyPressed(o){y(this.#A,o)}#D=G(!1);get multiselectionKeyPressed(){return a(this.#D)}set multiselectionKeyPressed(o){y(this.#D,o)}#O=G(!1);get deleteKeyPressed(){return a(this.#O)}set deleteKeyPressed(o){y(this.#O,o)}#R=G(!1);get panActivationKeyPressed(){return a(this.#R)}set panActivationKeyPressed(o){y(this.#R,o)}#L=G(!1);get zoomActivationKeyPressed(){return a(this.#L)}set zoomActivationKeyPressed(o){y(this.#L,o)}#V=G(null);get selectionRectMode(){return a(this.#V)}set selectionRectMode(o){y(this.#V,o)}#H=G("");get ariaLiveMessage(){return a(this.#H)}set ariaLiveMessage(o){y(this.#H,o)}#F=k(()=>t.props.selectionMode??To.Partial);get selectionMode(){return a(this.#F)}set selectionMode(o){y(this.#F,o)}#q=k(()=>({...Al,...t.props.nodeTypes}));get nodeTypes(){return a(this.#q)}set nodeTypes(o){y(this.#q,o)}#B=k(()=>({...Dl,...t.props.edgeTypes}));get edgeTypes(){return a(this.#B)}set edgeTypes(o){y(this.#B,o)}#K=k(()=>t.props.noPanClass??"nopan");get noPanClass(){return a(this.#K)}set noPanClass(o){y(this.#K,o)}#j=k(()=>t.props.noDragClass??"nodrag");get noDragClass(){return a(this.#j)}set noDragClass(o){y(this.#j,o)}#W=k(()=>t.props.noWheelClass??"nowheel");get noWheelClass(){return a(this.#W)}set noWheelClass(o){y(this.#W,o)}#Z=k(()=>ip(t.props.ariaLabelConfig));get ariaLabelConfig(){return a(this.#Z)}set ariaLabelConfig(o){y(this.#Z,o)}#Y=G(wh(this.nodesInitialized,t.props.fitView,t.props.initialViewport,this.width,this.height,this.nodeLookup));get _viewport(){return a(this.#Y)}set _viewport(o){y(this.#Y,o)}get viewport(){return t.viewport??this._viewport}set viewport(o){t.viewport&&(t.viewport=o),this._viewport=o}#X=G(Tr);get _connection(){return a(this.#X)}set _connection(o){y(this.#X,o)}#G=k(()=>this._connection.inProgress?{...this._connection,to:Ya(this._connection.to,[this.viewport.x,this.viewport.y,this.viewport.zoom])}:this._connection);get connection(){return a(this.#G)}set connection(o){y(this.#G,o)}#U=k(()=>t.props.connectionMode??ua.Strict);get connectionMode(){return a(this.#U)}set connectionMode(o){y(this.#U,o)}#J=k(()=>t.props.connectionRadius??20);get connectionRadius(){return a(this.#J)}set connectionRadius(o){y(this.#J,o)}#Q=k(()=>t.props.isValidConnection??(()=>!0));get isValidConnection(){return a(this.#Q)}set isValidConnection(o){y(this.#Q,o)}#$=k(()=>t.props.selectNodesOnDrag??!0);get selectNodesOnDrag(){return a(this.#$)}set selectNodesOnDrag(o){y(this.#$,o)}#ee=k(()=>t.props.defaultMarkerColor===void 0?"#b1b1b7":t.props.defaultMarkerColor);get defaultMarkerColor(){return a(this.#ee)}set defaultMarkerColor(o){y(this.#ee,o)}#te=k(()=>yp(t.edges,{defaultColor:this.defaultMarkerColor,id:this.flowId,defaultMarkerStart:this.defaultEdgeOptions.markerStart,defaultMarkerEnd:this.defaultEdgeOptions.markerEnd}));get markers(){return a(this.#te)}set markers(o){y(this.#te,o)}#ne=k(()=>t.props.onlyRenderVisibleElements??!1);get onlyRenderVisibleElements(){return a(this.#ne)}set onlyRenderVisibleElements(o){y(this.#ne,o)}#ae=k(()=>t.props.onflowerror??ap);get onerror(){return a(this.#ae)}set onerror(o){y(this.#ae,o)}#oe=k(()=>t.props.ondelete);get ondelete(){return a(this.#oe)}set ondelete(o){y(this.#oe,o)}#re=k(()=>t.props.onbeforedelete);get onbeforedelete(){return a(this.#re)}set onbeforedelete(o){y(this.#re,o)}#se=k(()=>t.props.onbeforeconnect);get onbeforeconnect(){return a(this.#se)}set onbeforeconnect(o){y(this.#se,o)}#ie=k(()=>t.props.onconnect);get onconnect(){return a(this.#ie)}set onconnect(o){y(this.#ie,o)}#le=k(()=>t.props.onconnectstart);get onconnectstart(){return a(this.#le)}set onconnectstart(o){y(this.#le,o)}#ce=k(()=>t.props.onconnectend);get onconnectend(){return a(this.#ce)}set onconnectend(o){y(this.#ce,o)}#de=k(()=>t.props.onbeforereconnect);get onbeforereconnect(){return a(this.#de)}set onbeforereconnect(o){y(this.#de,o)}#ue=k(()=>t.props.onreconnect);get onreconnect(){return a(this.#ue)}set onreconnect(o){y(this.#ue,o)}#ve=k(()=>t.props.onreconnectstart);get onreconnectstart(){return a(this.#ve)}set onreconnectstart(o){y(this.#ve,o)}#fe=k(()=>t.props.onreconnectend);get onreconnectend(){return a(this.#fe)}set onreconnectend(o){y(this.#fe,o)}#pe=k(()=>t.props.clickConnect??!0);get clickConnect(){return a(this.#pe)}set clickConnect(o){y(this.#pe,o)}#he=k(()=>t.props.onclickconnectstart);get onclickconnectstart(){return a(this.#he)}set onclickconnectstart(o){y(this.#he,o)}#ge=k(()=>t.props.onclickconnectend);get onclickconnectend(){return a(this.#ge)}set onclickconnectend(o){y(this.#ge,o)}#me=G(null);get clickConnectStartHandle(){return a(this.#me)}set clickConnectStartHandle(o){y(this.#me,o)}#_e=k(()=>t.props.onselectiondrag);get onselectiondrag(){return a(this.#_e)}set onselectiondrag(o){y(this.#_e,o)}#ye=k(()=>t.props.onselectiondragstart);get onselectiondragstart(){return a(this.#ye)}set onselectiondragstart(o){y(this.#ye,o)}#be=k(()=>t.props.onselectiondragstop);get onselectiondragstop(){return a(this.#be)}set onselectiondragstop(o){y(this.#be,o)}resolveFitView=async()=>{this.panZoom&&(await tp({nodes:this.nodeLookup,width:this.width,height:this.height,panZoom:this.panZoom,minZoom:this.minZoom,maxZoom:this.maxZoom},this.fitViewOptions),this.fitViewResolver?.resolve(!0),this.fitViewQueued=!1,this.fitViewOptions=void 0,this.fitViewResolver=null)};_prefersDark=new bh("(prefers-color-scheme: dark)",t.props.colorModeSSR==="dark");#xe=k(()=>t.props.colorMode==="system"?this._prefersDark.current?"dark":"light":t.props.colorMode??"light");get colorMode(){return a(this.#xe)}set colorMode(o){y(this.#xe,o)}constructor(){}resetStoreValues(){this.dragging=!1,this.selectionRect=null,this.selectionRectMode=null,this.selectionKeyPressed=!1,this.multiselectionKeyPressed=!1,this.deleteKeyPressed=!1,this.panActivationKeyPressed=!1,this.zoomActivationKeyPressed=!1,this._connection=Tr,this.clickConnectStartHandle=null,this.viewport=t.props.initialViewport??{x:0,y:0,zoom:1},this.ariaLiveMessage=""}}return new e}function Cn(){const t=Or(Dr);if(!t)throw new Error("To call useStore outside of you need to wrap your component in a ");return t.getStore()}const Dr=Symbol();function zh(t){const e=kh(t);function n(N){e.nodeTypes={...Al,...N}}function o(N){e.edgeTypes={...Dl,...N}}function r(N){e.edges=pp(N,e.edges)}const i=(N,E=!1)=>{e.nodes=e.nodes.map(C=>{if(e.connection.inProgress&&e.connection.fromNode.id===C.id){const T=e.nodeLookup.get(C.id);T&&(e.connection={...e.connection,from:Yn(T,e.connection.fromHandle,Se.Left,!0)})}const _=N.get(C.id);return _?{...C,position:_.position,dragging:E}:C})};function s(N){const{changes:E,updatedInternals:C}=Np(N,e.nodeLookup,e.parentLookup,e.domNode,e.nodeOrigin,e.nodeExtent,e.zIndexMode);if(!C)return;wp(e.nodeLookup,e.parentLookup,{nodeOrigin:e.nodeOrigin,nodeExtent:e.nodeExtent,zIndexMode:e.zIndexMode}),e.fitViewQueued&&e.resolveFitView();const _=new Map;for(const T of E){const D=e.nodeLookup.get(T.id)?.internals.userNode;if(!D)continue;const R={...D};switch(T.type){case"dimensions":{const F={...R.measured,...T.dimensions};T.setAttributes&&(R.width=T.dimensions?.width??R.width,R.height=T.dimensions?.height??R.height),R.measured=F;break}case"position":R.position=T.position??R.position;break}_.set(T.id,R)}e.nodes=e.nodes.map(T=>_.get(T.id)??T)}function l(N){const E=e.fitViewResolver??Promise.withResolvers();return e.fitViewQueued=!0,e.fitViewOptions=N,e.fitViewResolver=E,e.nodes=[...e.nodes],E.promise}async function u(N,E,C){const _=typeof C?.zoom<"u"?C.zoom:e.maxZoom,T=e.panZoom;return T?(await T.setViewport({x:e.width/2-N*_,y:e.height/2-E*_,zoom:_},{duration:C?.duration,ease:C?.ease,interpolate:C?.interpolate}),Promise.resolve(!0)):Promise.resolve(!1)}function v(N,E){const C=e.panZoom;return C?C.scaleBy(N,E):Promise.resolve(!1)}function p(N){return v(1.2,N)}function m(N){return v(1/1.2,N)}function f(N){const E=e.panZoom;E&&(E.setScaleExtent([N,e.maxZoom]),e.minZoom=N)}function w(N){const E=e.panZoom;E&&(E.setScaleExtent([e.minZoom,N]),e.maxZoom=N)}function S(N){const E=e.panZoom;E&&(E.setTranslateExtent(N),e.translateExtent=N)}function z(N,E=null){let C=!1;const _=N.map(T=>(E?E.has(T.id):!0)&&T.selected?(C=!0,{...T,selected:!1}):T);return[C,_]}function P(N){const E=N?.nodes?new Set(N.nodes.map(F=>F.id)):null,[C,_]=z(e.nodes,E);C&&(e.nodes=_);const T=N?.edges?new Set(N.edges.map(F=>F.id)):null,[D,R]=z(e.edges,T);D&&(e.edges=R)}function L(N){const E=e.multiselectionKeyPressed;e.nodes=e.nodes.map(C=>{const _=N.includes(C.id),T=E&&C.selected||_;return!!C.selected!==T?{...C,selected:T}:C}),E||P({nodes:[]})}function A(N){const E=e.multiselectionKeyPressed;e.edges=e.edges.map(C=>{const _=N.includes(C.id),T=E&&C.selected||_;return!!C.selected!==T?{...C,selected:T}:C}),E||P({edges:[]})}function V(N,E,C){const _=e.nodeLookup.get(N);if(!_){console.warn("012",La.error012(N));return}e.selectionRect=null,e.selectionRectMode=null,_.selected?(E||_.selected&&e.multiselectionKeyPressed)&&(P({nodes:[_],edges:[]}),requestAnimationFrame(()=>C?.blur())):L([N])}function M(N){const E=e.edgeLookup.get(N);if(!E){console.warn("012",La.error012(N));return}(E.selectable||e.elementsSelectable&&typeof E.selectable>"u")&&(e.selectionRect=null,e.selectionRectMode=null,E.selected?E.selected&&e.multiselectionKeyPressed&&P({nodes:[],edges:[E]}):A([N]))}function O(N,E){const{nodeExtent:C,snapGrid:_,nodeOrigin:T,nodeLookup:D,nodesDraggable:R,onerror:F}=e,q=new Map,K=_?.[0]??5,Z=_?.[1]??5,ee=N.x*K*E,J=N.y*Z*E;for(const ne of D.values()){if(!(ne.selected&&(ne.draggable||R&&typeof ne.draggable>"u")))continue;let re={x:ne.internals.positionAbsolute.x+ee,y:ne.internals.positionAbsolute.y+J};_&&(re=Za(re,_));const{position:Q,positionAbsolute:j}=dl({nodeId:ne.id,nextPosition:re,nodeLookup:D,nodeExtent:C,nodeOrigin:T,onError:F});ne.position=Q,ne.internals.positionAbsolute=j,q.set(ne.id,ne)}i(q)}function b(N){return Pp({delta:N,panZoom:e.panZoom,transform:[e.viewport.x,e.viewport.y,e.viewport.zoom],translateExtent:e.translateExtent,width:e.width,height:e.height})}const I=N=>{e._connection={...N}};function H(){e._connection=Tr}function B(){e.resetStoreValues(),P()}return Object.assign(e,{setNodeTypes:n,setEdgeTypes:o,addEdge:r,updateNodePositions:i,updateNodeInternals:s,zoomIn:p,zoomOut:m,fitView:l,setCenter:u,setMinZoom:f,setMaxZoom:w,setTranslateExtent:S,unselectNodesAndEdges:P,addSelectedNodes:L,addSelectedEdges:A,handleNodeSelection:V,handleEdgeSelection:M,moveSelectedNodes:O,panBy:b,updateConnection:I,cancelConnection:H,reset:B})}function Sh(t,e){const{minZoom:n,maxZoom:o,initialViewport:r,onPanZoomStart:i,onPanZoom:s,onPanZoomEnd:l,translateExtent:u,setPanZoomInstance:v,onDraggingChange:p,onTransformChange:m}=e,f=Yp({domNode:t,minZoom:n,maxZoom:o,translateExtent:u,viewport:r,onPanZoom:s,onPanZoomStart:i,onPanZoomEnd:l,onDraggingChange:p}),w=f.getViewport();return(r.x!==w.x||r.y!==w.y||r.zoom!==w.zoom)&&m([w.x,w.y,w.zoom]),v(f),f.update(e),{update(S){f.update(S)}}}var Ch=x('
    ');function Eh(t,e){Ee(e,!0);let n=ue(e,"store",15),o=k(()=>n().panActivationKeyPressed||e.panOnDrag),r=k(()=>n().panActivationKeyPressed||e.panOnScroll);const{viewport:i}=n();let s=!1;xe(()=>{!s&&n().viewportInitialized&&(e.oninit?.(),s=!0)});var l=Ch(),u=d(l);Jt(u,()=>e.children),c(l),qt(l,(v,p)=>Sh?.(v,p),()=>({viewport:n().viewport,minZoom:n().minZoom,maxZoom:n().maxZoom,initialViewport:i,onDraggingChange:v=>{n(n().dragging=v,!0)},setPanZoomInstance:v=>{n(n().panZoom=v,!0)},onPanZoomStart:e.onmovestart,onPanZoom:e.onmove,onPanZoomEnd:e.onmoveend,zoomOnScroll:e.zoomOnScroll,zoomOnDoubleClick:e.zoomOnDoubleClick,zoomOnPinch:e.zoomOnPinch,panOnScroll:a(r),panOnDrag:a(o),panOnScrollSpeed:e.panOnScrollSpeed,panOnScrollMode:e.panOnScrollMode,zoomActivationKeyPressed:n().zoomActivationKeyPressed,preventScrolling:typeof e.preventScrolling=="boolean"?e.preventScrolling:!0,noPanClassName:n().noPanClass,noWheelClassName:n().noWheelClass,userSelectionActive:!!n().selectionRect,translateExtent:n().translateExtent,lib:"svelte",paneClickDistance:e.paneClickDistance,selectionOnDrag:e.selectionOnDrag,onTransformChange:v=>{n(n().viewport={x:v[0],y:v[1],zoom:v[2]},!0)},connectionInProgress:n().connection.inProgress})),g(t,l),Ne()}function ii(t,e){return n=>{n.target===e&&t?.(n)}}function li(t){return e=>{const n=t.has(e.id);return!!e.selected!==n?{...e,selected:n}:e}}function ci(t,e){if(t.size!==e.size)return!1;for(const n of t)if(!e.has(n))return!1;return!0}var Nh=x("
    ");function Ph(t,e){Ee(e,!0);let n=ue(e,"store",15),o=ue(e,"panOnDrag",3,!0),r=ue(e,"paneClickDistance",3,1),i,s=null,l=new Set,u=new Set,v=k(()=>n().panActivationKeyPressed||o()),p=k(()=>n().selectionKeyPressed||!!n().selectionRect||e.selectionOnDrag&&a(v)!==!0),m=k(()=>n().elementsSelectable&&(a(p)||n().selectionRectMode==="user")),f=!1;function w(H){if(s=i?.getBoundingClientRect(),!s)return;const B=H.target===i,X=!B&&!!H.target.closest(".nokey"),N=e.selectionOnDrag&&B||n().selectionKeyPressed;if(X||!a(p)||!N||H.button!==0||!H.isPrimary)return;H.target?.setPointerCapture?.(H.pointerId),f=!1;const{x:E,y:C}=nn(H,s);n(n().selectionRect={width:0,height:0,startX:E,startY:C,x:E,y:C},!0),B||(H.stopPropagation(),H.preventDefault())}function S(H){if(!a(p)||!s||!n().selectionRect)return;const B=nn(H,s),{startX:X=0,startY:N=0}=n().selectionRect;if(!f){const D=n().selectionKeyPressed?0:r();if(Math.hypot(B.x-X,B.y-N)<=D)return;n().unselectNodesAndEdges(),e.onselectionstart?.(H)}f=!0;const E={...n().selectionRect,x:B.xD.id));const T=n().defaultEdgeOptions.selectable??!0;u=new Set;for(const D of l){const R=n().connectionLookup.get(D);if(R)for(const{edgeId:F}of R.values()){const q=n().edgeLookup.get(F);q&&(q.selectable??T)&&u.add(F)}}ci(C,l)||n(n().nodes=n().nodes.map(li(l)),!0),ci(_,u)||n(n().edges=n().edges.map(li(u)),!0),n(n().selectionRectMode="user",!0),n(n().selectionRect=E,!0)}function z(H){H.button===0&&(H.target?.releasePointerCapture?.(H.pointerId),!f&&H.target===i&&A?.(H),n(n().selectionRect=null,!0),f&&n(n().selectionRectMode=l.size>0?"nodes":null,!0),f&&e.onselectionend?.(H))}const P=H=>{if(Array.isArray(a(v))&&a(v).includes(2)){H.preventDefault();return}e.onpanecontextmenu?.({event:H})},L=H=>{f&&(H.stopPropagation(),f=!1)};function A(H){if(f||n().connection.inProgress){f=!1;return}e.onpaneclick?.({event:H}),n().unselectNodesAndEdges(),n(n().selectionRectMode=null,!0),n(n().selectionRect=null,!0)}var V=Nh();let M;var O=k(()=>a(m)?void 0:ii(A,i)),b=k(()=>ii(P,i)),I=d(V);Jt(I,()=>e.children),c(V),mn(V,H=>i=H,()=>i),U(H=>M=Oe(V,1,"svelte-flow__pane svelte-flow__container",null,M,H),[()=>({draggable:o()===!0||Array.isArray(o())&&o().includes(0),dragging:n().dragging,selection:a(p)})]),fe("click",V,function(...H){a(O)?.apply(this,H)}),bo("pointerdown",V,function(...H){(a(m)?w:void 0)?.apply(this,H)},!0),fe("pointermove",V,function(...H){(a(m)?S:void 0)?.apply(this,H)}),fe("pointerup",V,function(...H){(a(m)?z:void 0)?.apply(this,H)}),fe("contextmenu",V,function(...H){a(b)?.apply(this,H)}),bo("click",V,function(...H){(a(m)?L:void 0)?.apply(this,H)},!0),g(t,V),Ne()}Tt(["click","pointermove","pointerup","contextmenu"]);var Mh=x('
    ');function Th(t,e){Ee(e,!0);var n=Mh();let o;var r=d(n);Jt(r,()=>e.children),c(n),U(()=>o=pt(n,"",o,{transform:`translate(${e.store.viewport.x??""}px, ${e.store.viewport.y??""}px) scale(${e.store.viewport.zoom??""})`})),g(t,n),Ne()}function Ol(t,e){const{store:n,onDrag:o,onDragStart:r,onDragStop:i,onNodeMouseDown:s}=e,l=Ap({onDrag:o,onDragStart:r,onDragStop:i,onNodeMouseDown:s,getStoreItems:()=>{const{snapGrid:v,viewport:p}=n;return{nodes:n.nodes,nodeLookup:n.nodeLookup,edges:n.edges,nodeExtent:n.nodeExtent,snapGrid:v||[0,0],snapToGrid:!!v,nodeOrigin:n.nodeOrigin,multiSelectionActive:n.multiselectionKeyPressed,domNode:n.domNode,transform:[p.x,p.y,p.zoom],autoPanOnNodeDrag:n.autoPanOnNodeDrag,nodesDraggable:n.nodesDraggable,selectNodesOnDrag:n.selectNodesOnDrag,nodeDragThreshold:n.nodeDragThreshold,unselectNodesAndEdges:n.unselectNodesAndEdges,updateNodePositions:n.updateNodePositions,onSelectionDrag:n.onselectiondrag,onSelectionDragStart:n.onselectiondragstart,onSelectionDragStop:n.onselectiondragstop,panBy:n.panBy}}});function u(v,p){if(p.disabled){l.destroy();return}l.update({domNode:v,noDragClassName:p.noDragClass,handleSelector:p.handleSelector,nodeId:p.nodeId,isSelectable:p.isSelectable,nodeClickDistance:p.nodeClickDistance})}return u(t,e),{update(v){u(t,v)},destroy(){l.destroy()}}}var Ih=x('
    '),Ah=x('
    ',1);function Dh(t,e){Ee(e,!0);var n=Ah(),o=oe(n),r=d(o,!0);c(o);var i=h(o,2),s=d(i,!0);c(i);var l=h(i,2);{var u=v=>{var p=Ih(),m=d(p,!0);c(p),U(()=>{ze(p,"id",`${Oh}-${e.store.flowId}`),Y(m,e.store.ariaLiveMessage)}),g(v,p)};W(l,v=>{e.store.disableKeyboardA11y||v(u)})}U(()=>{ze(o,"id",`${Rl}-${e.store.flowId}`),Y(r,e.store.disableKeyboardA11y?e.store.ariaLabelConfig["node.a11yDescription.default"]:e.store.ariaLabelConfig["node.a11yDescription.keyboardDisabled"]),ze(i,"id",`${Ll}-${e.store.flowId}`),Y(s,e.store.ariaLabelConfig["edge.a11yDescription.default"])}),g(t,n),Ne()}const Rl="svelte-flow__node-desc",Ll="svelte-flow__edge-desc",Oh="svelte-flow__aria-live";var Rh=x("
    ");function Lh(t,e){Ee(e,!0);let n=ue(e,"store",15),o=k(()=>Ft(e.node.data,()=>({}),!0)),r=k(()=>Ft(e.node.selected,!1)),i=k(()=>e.node.draggable),s=k(()=>e.node.selectable),l=k(()=>Ft(e.node.deletable,!0)),u=k(()=>e.node.connectable),v=k(()=>e.node.focusable),p=k(()=>Ft(e.node.hidden,!1)),m=k(()=>Ft(e.node.dragging,!1)),f=k(()=>Ft(e.node.style,"")),w=k(()=>e.node.class),S=k(()=>Ft(e.node.type,"default")),z=k(()=>e.node.parentId),P=k(()=>e.node.sourcePosition),L=k(()=>e.node.targetPosition),A=k(()=>Ft(e.node.measured,()=>({width:0,height:0}),!0).width),V=k(()=>Ft(e.node.measured,()=>({width:0,height:0}),!0).height),M=k(()=>e.node.initialWidth),O=k(()=>e.node.initialHeight),b=k(()=>e.node.width),I=k(()=>e.node.height),H=k(()=>e.node.dragHandle),B=k(()=>Ft(e.node.internals.z,0)),X=k(()=>e.node.internals.positionAbsolute.x),N=k(()=>e.node.internals.positionAbsolute.y),E=k(()=>e.node.internals.userNode),{id:C}=e.node,_=k(()=>a(i)??n().nodesDraggable),T=k(()=>a(s)??n().elementsSelectable),D=k(()=>a(u)??n().nodesConnectable),R=k(()=>pl(e.node)),F=k(()=>!!e.node.internals.handleBounds),q=k(()=>a(R)&&a(F)),K=k(()=>a(v)??n().nodesFocusable);function Z(pe){return n().parentLookup.has(pe)}let ee=k(()=>Z(C)),J=G(null),ne=null,le=a(S),re=a(P),Q=a(L),j=k(()=>n().nodeTypes[a(S)]??Tl),$=k(()=>n().ariaLabelConfig),de={get value(){return a(D)}};Gp(C),Jp(de);let ce=k(()=>{const pe=a(A)===void 0?a(b)??a(M):a(b),ye=a(V)===void 0?a(I)??a(O):a(I);if(!(pe===void 0&&ye===void 0&&a(f)===void 0))return`${a(f)};${pe?`width:${gn(pe)};`:""}${ye?`height:${gn(ye)};`:""}`});xe(()=>{(a(S)!==le||a(P)!==re||a(L)!==Q)&&a(J)!==null&&requestAnimationFrame(()=>{a(J)!==null&&n().updateNodeInternals(new Map([[C,{id:C,nodeElement:a(J),force:!0}]]))}),le=a(S),re=a(P),Q=a(L)}),xe(()=>{e.resizeObserver&&(!a(q)||a(J)!==ne)&&(ne&&e.resizeObserver.unobserve(ne),a(J)&&e.resizeObserver.observe(a(J)),ne=a(J))}),ga(()=>{ne&&e.resizeObserver?.unobserve(ne)});function te(pe){a(T)&&(!n().selectNodesOnDrag||!a(_)||n().nodeDragThreshold>0)&&n().handleNodeSelection(C),e.onnodeclick?.({node:a(E),event:pe})}function ae(pe){if(!(ml(pe)||n().disableKeyboardA11y))if(ll.includes(pe.key)&&a(T)){const ye=pe.key==="Escape";n().handleNodeSelection(C,ye,a(J))}else a(_)&&e.node.selected&&Object.prototype.hasOwnProperty.call(Oo,pe.key)&&(pe.preventDefault(),n(n().ariaLiveMessage=a($)["node.a11yDescription.ariaLiveMessage"]({direction:pe.key.replace("Arrow","").toLowerCase(),x:~~e.node.internals.positionAbsolute.x,y:~~e.node.internals.positionAbsolute.y}),!0),n().moveSelectedNodes(Oo[pe.key],pe.shiftKey?4:1))}const be=()=>{if(n().disableKeyboardA11y||!n().autoPanOnNodeFocus||!a(J)?.matches(":focus-visible"))return;const{width:pe,height:ye,viewport:me}=n();$r(new Map([[C,e.node]]),{x:0,y:0,width:pe,height:ye},[me.x,me.y,me.zoom],!0).length>0||n().setCenter(e.node.position.x+(e.node.measured.width??0)/2,e.node.position.y+(e.node.measured.height??0)/2,{zoom:me.zoom})};var se=Te(),ge=oe(se);{var _e=pe=>{var ye=Rh();Mn(ye,()=>({"data-id":C,class:["svelte-flow__node",`svelte-flow__node-${a(S)}`,a(w)],style:a(ce),onclick:te,onpointerenter:e.onnodepointerenter?ve=>e.onnodepointerenter({node:a(E),event:ve}):void 0,onpointerleave:e.onnodepointerleave?ve=>e.onnodepointerleave({node:a(E),event:ve}):void 0,onpointermove:e.onnodepointermove?ve=>e.onnodepointermove({node:a(E),event:ve}):void 0,oncontextmenu:e.onnodecontextmenu?ve=>e.onnodecontextmenu({node:a(E),event:ve}):void 0,onkeydown:a(K)?ae:void 0,onfocus:a(K)?be:void 0,tabIndex:a(K)?0:void 0,role:e.node.ariaRole??(a(K)?"group":void 0),"aria-roledescription":"node","aria-describedby":n().disableKeyboardA11y?void 0:`${Rl}-${n().flowId}`,...e.node.domAttributes,[Lr]:{dragging:a(m),selected:a(r),draggable:a(_),connectable:a(D),selectable:a(T),nopan:a(_),parent:a(ee)},[Ro]:{"z-index":a(B),transform:`translate(${a(X)??""}px, ${a(N)??""}px)`,visibility:a(R)?"visible":"hidden"}}));var me=d(ye);hn(me,()=>a(j),(ve,ke)=>{ke(ve,{get data(){return a(o)},get id(){return C},get selected(){return a(r)},get selectable(){return a(T)},get deletable(){return a(l)},get sourcePosition(){return a(P)},get targetPosition(){return a(L)},get zIndex(){return a(B)},get dragging(){return a(m)},get draggable(){return a(_)},get dragHandle(){return a(H)},get parentId(){return a(z)},get type(){return a(S)},get isConnectable(){return a(D)},get positionAbsoluteX(){return a(X)},get positionAbsoluteY(){return a(N)},get width(){return a(b)},get height(){return a(I)}})}),c(ye),qt(ye,(ve,ke)=>Ol?.(ve,ke),()=>({nodeId:C,isSelectable:a(T),disabled:!a(_),handleSelector:a(H),noDragClass:n().noDragClass,nodeClickDistance:e.nodeClickDistance,onNodeMouseDown:n().handleNodeSelection,onDrag:(ve,ke,Ve,Re)=>{e.onnodedrag?.({event:ve,targetNode:Ve,nodes:Re})},onDragStart:(ve,ke,Ve,Re)=>{e.onnodedragstart?.({event:ve,targetNode:Ve,nodes:Re})},onDragStop:(ve,ke,Ve,Re)=>{e.onnodedragstop?.({event:ve,targetNode:Ve,nodes:Re})},store:n()})),mn(ye,ve=>y(J,ve),()=>a(J)),g(pe,ye)};W(ge,pe=>{a(p)||pe(_e)})}g(t,se),Ne()}var Vh=x('
    ');function Hh(t,e){Ee(e,!0);let n=ue(e,"store",15);const o=typeof ResizeObserver>"u"?null:new ResizeObserver(i=>{const s=new Map;i.forEach(l=>{const u=l.target.getAttribute("data-id");s.set(u,{id:u,nodeElement:l.target,force:!0})}),n().updateNodeInternals(s)});ga(()=>{o?.disconnect()});var r=Vh();Qe(r,21,()=>n().visible.nodes.values(),i=>i.id,(i,s)=>{Lh(i,{get node(){return a(s)},get resizeObserver(){return o},get nodeClickDistance(){return e.nodeClickDistance},get onnodeclick(){return e.onnodeclick},get onnodepointerenter(){return e.onnodepointerenter},get onnodepointermove(){return e.onnodepointermove},get onnodepointerleave(){return e.onnodepointerleave},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get onnodecontextmenu(){return e.onnodecontextmenu},get store(){return n()},set store(l){n(l)}})}),c(r),g(t,r),Ne()}var Fh=Mt('');function qh(t,e){Ee(e,!0);let n=k(()=>e.edge.id),o=k(()=>e.edge.source),r=k(()=>e.edge.target),i=k(()=>e.edge.sourceX),s=k(()=>e.edge.sourceY),l=k(()=>e.edge.targetX),u=k(()=>e.edge.targetY),v=k(()=>e.edge.sourcePosition),p=k(()=>e.edge.targetPosition),m=k(()=>Ft(e.edge.animated,!1)),f=k(()=>Ft(e.edge.selected,!1)),w=k(()=>e.edge.label),S=k(()=>e.edge.labelStyle),z=k(()=>Ft(e.edge.data,()=>({}),!0)),P=k(()=>e.edge.style),L=k(()=>e.edge.interactionWidth),A=k(()=>Ft(e.edge.type,"default")),V=k(()=>e.edge.sourceHandle),M=k(()=>e.edge.targetHandle),O=k(()=>e.edge.markerStart),b=k(()=>e.edge.markerEnd),I=k(()=>e.edge.selectable),H=k(()=>e.edge.focusable),B=k(()=>Ft(e.edge.deletable,!0)),X=k(()=>e.edge.hidden),N=k(()=>e.edge.zIndex),E=k(()=>e.edge.class),C=k(()=>e.edge.ariaLabel);$p(a(n));let _=null,T=k(()=>a(I)??e.store.elementsSelectable),D=k(()=>a(H)??e.store.edgesFocusable),R=k(()=>e.store.edgeTypes[a(A)]??Il),F=k(()=>a(O)?`url('#${Ar(a(O),e.store.flowId)}')`:void 0),q=k(()=>a(b)?`url('#${Ar(a(b),e.store.flowId)}')`:void 0);function K(re){const Q=e.store.edgeLookup.get(a(n));Q&&(a(T)&&e.store.handleEdgeSelection(a(n)),e.onedgeclick?.({event:re,edge:Q}))}function Z(re,Q){const j=e.store.edgeLookup.get(a(n));j&&Q({event:re,edge:j})}function ee(re){if(!e.store.disableKeyboardA11y&&ll.includes(re.key)&&a(T)){const{unselectNodesAndEdges:Q,addSelectedEdges:j}=e.store;re.key==="Escape"?(_?.blur(),Q({edges:[e.edge]})):j([a(n)])}}var J=Te(),ne=oe(J);{var le=re=>{var Q=Fh();let j;var $=d(Q);Mn($,()=>({class:["svelte-flow__edge",a(E)],"data-id":a(n),onclick:K,oncontextmenu:e.onedgecontextmenu?ce=>{Z(ce,e.onedgecontextmenu)}:void 0,onpointerenter:e.onedgepointerenter?ce=>{Z(ce,e.onedgepointerenter)}:void 0,onpointerleave:e.onedgepointerleave?ce=>{Z(ce,e.onedgepointerleave)}:void 0,"aria-label":a(C)===null?void 0:a(C)?a(C):`Edge from ${a(o)} to ${a(r)}`,"aria-describedby":a(D)?`${Ll}-${e.store.flowId}`:void 0,role:e.edge.ariaRole??(a(D)?"group":"img"),"aria-roledescription":"edge",onkeydown:a(D)?ee:void 0,tabindex:a(D)?0:void 0,...e.edge.domAttributes,[Lr]:{animated:a(m),selected:a(f),selectable:a(T)}}));var de=d($);hn(de,()=>a(R),(ce,te)=>{te(ce,{get id(){return a(n)},get source(){return a(o)},get target(){return a(r)},get sourceX(){return a(i)},get sourceY(){return a(s)},get targetX(){return a(l)},get targetY(){return a(u)},get sourcePosition(){return a(v)},get targetPosition(){return a(p)},get animated(){return a(m)},get selected(){return a(f)},get label(){return a(w)},get labelStyle(){return a(S)},get data(){return a(z)},get style(){return a(P)},get interactionWidth(){return a(L)},get selectable(){return a(T)},get deletable(){return a(B)},get type(){return a(A)},get sourceHandleId(){return a(V)},get targetHandleId(){return a(M)},get markerStart(){return a(F)},get markerEnd(){return a(q)}})}),c($),mn($,ce=>_=ce,()=>_),c(Q),U(()=>j=pt(Q,"",j,{"z-index":a(N)})),g(re,Q)};W(ne,re=>{a(X)||re(le)})}g(t,J),Ne()}var Bh=Mt("");function Kh(t,e){Ee(e,!1);const n=Cn();nc();var o=Bh();Qe(o,5,()=>n.markers,r=>r.id,(r,i)=>{Yh(r,$e(()=>a(i)))}),c(o),g(t,o),Ne()}var jh=Mt(''),Wh=Mt(''),Zh=Mt('');function Yh(t,e){Ee(e,!0);let n=ue(e,"width",3,12.5),o=ue(e,"height",3,12.5),r=ue(e,"markerUnits",3,"strokeWidth"),i=ue(e,"orient",3,"auto-start-reverse"),s=ue(e,"color",3,"none");var l=Zh(),u=d(l);{var v=m=>{var f=jh();let w;U(()=>{ze(f,"stroke-width",e.strokeWidth),w=pt(f,"",w,{stroke:s()})}),g(m,f)},p=m=>{var f=Wh();let w;U(()=>{ze(f,"stroke-width",e.strokeWidth),w=pt(f,"",w,{stroke:s(),fill:s()})}),g(m,f)};W(u,m=>{e.type===Io.Arrow?m(v):e.type===Io.ArrowClosed&&m(p,1)})}c(l),U(()=>{ze(l,"id",e.id),ze(l,"markerWidth",`${n()}`),ze(l,"markerHeight",`${o()}`),ze(l,"markerUnits",r()),ze(l,"orient",i())}),g(t,l),Ne()}var Xh=x('
    ');function Gh(t,e){Ee(e,!0);let n=ue(e,"store",15);var o=Xh(),r=d(o),i=d(r);Kh(i,{}),c(r);var s=h(r,2);Qe(s,17,()=>n().visible.edges.values(),l=>l.id,(l,u)=>{qh(l,{get edge(){return a(u)},get onedgeclick(){return e.onedgeclick},get onedgecontextmenu(){return e.onedgecontextmenu},get onedgepointerenter(){return e.onedgepointerenter},get onedgepointerleave(){return e.onedgepointerleave},get store(){return n()},set store(v){n(v)}})}),c(o),g(t,o),Ne()}var Uh=x('
    ');function Vl(t,e){Ee(e,!0);let n=ue(e,"x",3,0),o=ue(e,"y",3,0),r=ue(e,"width",3,0),i=ue(e,"height",3,0),s=ue(e,"isVisible",3,!0);var l=Te(),u=oe(l);{var v=p=>{var m=Uh();let f;U(w=>f=pt(m,"",f,w),[()=>({width:typeof r()=="string"?r():gn(r()),height:typeof i()=="string"?i():gn(i()),transform:`translate(${n()}px, ${o()}px)`})]),g(p,m)};W(u,p=>{s()&&p(v)})}g(t,l),Ne()}var Jh=x("
    ");function Qh(t,e){Ee(e,!0);let n=G(void 0);xe(()=>{e.store.disableKeyboardA11y||a(n)?.focus({preventScroll:!0})});let o=k(()=>{if(e.store.selectionRectMode==="nodes"){e.store.nodes;const m=Wa(e.store.nodeLookup,{filter:f=>!!f.selected});if(m.width>0&&m.height>0)return m}return null});function r(m){const f=e.store.nodes.filter(w=>w.selected);e.onselectioncontextmenu?.({nodes:f,event:m})}function i(m){const f=e.store.nodes.filter(w=>w.selected);e.onselectionclick?.({nodes:f,event:m})}function s(m){Object.prototype.hasOwnProperty.call(Oo,m.key)&&(m.preventDefault(),e.store.moveSelectedNodes(Oo[m.key],m.shiftKey?4:1))}var l=Te(),u=oe(l);{var v=m=>{var f=Jh();let w;var S=d(f);Vl(S,{width:"100%",height:"100%",x:0,y:0}),c(f),qt(f,(z,P)=>Ol?.(z,P),()=>({disabled:!1,store:e.store,onDrag:(z,P,L,A)=>{e.onnodedrag?.({event:z,targetNode:null,nodes:A})},onDragStart:(z,P,L,A)=>{e.onnodedragstart?.({event:z,targetNode:null,nodes:A})},onDragStop:(z,P,L,A)=>{e.onnodedragstop?.({event:z,targetNode:null,nodes:A})}})),mn(f,z=>y(n,z),()=>a(n)),U(z=>{Oe(f,1,Gn(["svelte-flow__selection-wrapper",e.store.noPanClass]),"svelte-sf2y5e"),ze(f,"role",e.store.disableKeyboardA11y?void 0:"button"),ze(f,"tabindex",e.store.disableKeyboardA11y?void 0:-1),w=pt(f,"",w,z)},[()=>({width:gn(a(o).width),height:gn(a(o).height),transform:`translate(${a(o).x??""}px, ${a(o).y??""}px)`})]),fe("contextmenu",f,r),fe("click",f,i),fe("keydown",f,function(...z){(e.store.disableKeyboardA11y?void 0:s)?.apply(this,z)}),g(m,f)},p=k(()=>e.store.selectionRectMode==="nodes"&&a(o)&&wn(a(o).x)&&wn(a(o).y));W(u,m=>{a(p)&&m(v)})}g(t,l),Ne()}Tt(["contextmenu","click","keydown"]);function $h(t){switch(t){case"ctrl":return 8;case"shift":return 4;case"alt":return 2;case"meta":return 1}}function cn(t,e){let{enabled:n=!0,trigger:o,type:r="keydown"}=e;function i(l){const u=Array.isArray(o)?o:[o],v=[l.metaKey,l.altKey,l.shiftKey,l.ctrlKey].reduce((p,m,f)=>m?p|1<0){const A=Array.isArray(f)?f:[f];let V=!1;for(const M of A)if((Array.isArray(M)?M:[M]).reduce((b,I)=>b|$h(I),0)===v){V=!0;break}if(!V)continue}z&&l.preventDefault();const L={node:t,trigger:m,originalEvent:l};t.dispatchEvent(new CustomEvent("shortcut",{detail:L})),S?.(L)}}}let s;return n&&(s=mr(t,r,i)),{update:l=>{const{enabled:u=!0,type:v="keydown"}=l;n&&(!u||r!==v)?s?.():!n&&u&&(s=mr(t,v,i)),n=u,r=v,o=l.trigger},destroy:()=>{s?.()}}}function eg(){const t=k(Cn),e=i=>{const s=ri(i)?i:a(t).nodeLookup.get(i.id),l=s.parentId?sp(s.position,s.measured,s.parentId,a(t).nodeLookup,a(t).nodeOrigin):s.position,u={...s,position:l,width:s.measured?.width??s.width,height:s.measured?.height??s.height};return fa(u)};function n(i,s,l={replace:!1}){a(t).nodes=un(()=>a(t).nodes).map(u=>{if(u.id===i){const v=typeof s=="function"?s(u):s;return l?.replace&&ri(v)?v:{...u,...v}}return u})}function o(i,s,l={replace:!1}){a(t).edges=un(()=>a(t).edges).map(u=>{if(u.id===i){const v=typeof s=="function"?s(u):s;return l.replace&&ch(v)?v:{...u,...v}}return u})}const r=i=>a(t).nodeLookup.get(i);return{zoomIn:a(t).zoomIn,zoomOut:a(t).zoomOut,getInternalNode:r,getNode:i=>r(i)?.internals.userNode,getNodes:i=>i===void 0?a(t).nodes:di(a(t).nodeLookup,i),getEdge:i=>a(t).edgeLookup.get(i),getEdges:i=>i===void 0?a(t).edges:di(a(t).edgeLookup,i),setZoom:(i,s)=>{const l=a(t).panZoom;return l?l.scaleTo(i,{duration:s?.duration}):Promise.resolve(!1)},getZoom:()=>a(t).viewport.zoom,setViewport:async(i,s)=>{const l=a(t).viewport;return a(t).panZoom?(await a(t).panZoom.setViewport({x:i.x??l.x,y:i.y??l.y,zoom:i.zoom??l.zoom},s),Promise.resolve(!0)):Promise.resolve(!1)},getViewport:()=>Ni(a(t).viewport),setCenter:async(i,s,l)=>a(t).setCenter(i,s,l),fitView:i=>a(t).fitView(i),fitBounds:async(i,s)=>{if(!a(t).panZoom)return Promise.resolve(!1);const l=es(i,a(t).width,a(t).height,a(t).minZoom,a(t).maxZoom,s?.padding??.1);return await a(t).panZoom.setViewport(l,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)},getIntersectingNodes:(i,s=!0,l)=>{const u=Ys(i),v=u?i:e(i);return v?(l||a(t).nodes).filter(p=>{const m=a(t).nodeLookup.get(p.id);if(!m||!u&&p.id===i.id)return!1;const f=fa(m),w=Va(f,v);return s&&w>0||w>=f.width*f.height||w>=v.width*v.height}):[]},isNodeIntersecting:(i,s,l=!0)=>{const v=Ys(i)?i:e(i);if(!v)return!1;const p=Va(v,s);return l&&p>0||p>=s.width*s.height||p>=v.width*v.height},deleteElements:async({nodes:i=[],edges:s=[]})=>{const{nodes:l,edges:u}=await np({nodesToRemove:i,edgesToRemove:s,nodes:a(t).nodes,edges:a(t).edges,onBeforeDelete:a(t).onbeforedelete});return l&&(a(t).nodes=un(()=>a(t).nodes).filter(v=>!l.some(({id:p})=>p===v.id))),u&&(a(t).edges=un(()=>a(t).edges).filter(v=>!u.some(({id:p})=>p===v.id))),(l.length>0||u.length>0)&&a(t).ondelete?.({nodes:l,edges:u}),{deletedNodes:l,deletedEdges:u}},screenToFlowPosition:(i,s={snapToGrid:!0})=>{if(!a(t).domNode)return i;const l=s.snapToGrid?a(t).snapGrid:!1,{x:u,y:v,zoom:p}=a(t).viewport,{x:m,y:f}=a(t).domNode.getBoundingClientRect(),w={x:i.x-m,y:i.y-f};return Ya(w,[u,v,p],l!==null,l||[1,1])},flowToScreenPosition:i=>{if(!a(t).domNode)return i;const{x:s,y:l,zoom:u}=a(t).viewport,{x:v,y:p}=a(t).domNode.getBoundingClientRect(),m=Do(i,[s,l,u]);return{x:m.x+v,y:m.y+p}},toObject:()=>structuredClone({nodes:[...a(t).nodes],edges:[...a(t).edges],viewport:{...a(t).viewport}}),updateNode:n,updateNodeData:(i,s,l)=>{const u=a(t).nodeLookup.get(i)?.internals.userNode;if(!u)return;const v=typeof s=="function"?s(u):s;n(i,p=>({...p,data:l?.replace?v:{...p.data,...v}}))},updateEdge:o,getNodesBounds:i=>Qf(i,{nodeLookup:a(t).nodeLookup,nodeOrigin:a(t).nodeOrigin}),getHandleConnections:({type:i,id:s,nodeId:l})=>Array.from(a(t).connectionLookup.get(`${l}-${i}-${s??null}`)?.values()??[])}}function di(t,e){const n=[];for(const o of e){const r=t.get(o);if(r){const i="internals"in r?r.internals?.userNode:r;n.push(i)}}return n}function tg(t,e){Ee(e,!0);let n=ue(e,"store",15),o=ue(e,"selectionKey",3,"Shift"),r=ue(e,"multiSelectionKey",19,()=>Ha()?"Meta":"Control"),i=ue(e,"deleteKey",3,"Backspace"),s=ue(e,"panActivationKey",3," "),l=ue(e,"zoomActivationKey",19,()=>Ha()?"Meta":"Control"),{deleteElements:u}=eg();function v(z){return z!==null&&typeof z=="object"}function p(z){return v(z)?z.modifier||[]:[]}function m(z){return z==null?"":v(z)?z.key:z}function f(z,P){return(Array.isArray(z)?z:[z]).map(A=>{const V=m(A);return{key:V,modifier:p(A),enabled:V!==null,callback:P}})}function w(){n(n().selectionRect=null,!0),n(n().selectionKeyPressed=!1,!0),n(n().multiselectionKeyPressed=!1,!0),n(n().deleteKeyPressed=!1,!0),n(n().panActivationKeyPressed=!1,!0),n(n().zoomActivationKeyPressed=!1,!0)}function S(){const z=n().nodes.filter(L=>L.selected),P=n().edges.filter(L=>L.selected);u({nodes:z,edges:P})}bo("blur",Gt,w),bo("contextmenu",Gt,w),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(o(),()=>n(n().selectionKeyPressed=!0,!0)),type:"keydown"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(o(),()=>n(n().selectionKeyPressed=!1,!0)),type:"keyup"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(r(),()=>{n(n().multiselectionKeyPressed=!0,!0)}),type:"keydown"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(r(),()=>n(n().multiselectionKeyPressed=!1,!0)),type:"keyup"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(i(),z=>{!(z.originalEvent.ctrlKey||z.originalEvent.metaKey||z.originalEvent.shiftKey)&&!ml(z.originalEvent)&&(n(n().deleteKeyPressed=!0,!0),S())}),type:"keydown"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(i(),()=>n(n().deleteKeyPressed=!1,!0)),type:"keyup"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(s(),()=>n(n().panActivationKeyPressed=!0,!0)),type:"keydown"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(s(),()=>n(n().panActivationKeyPressed=!1,!0)),type:"keyup"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(l(),()=>n(n().zoomActivationKeyPressed=!0,!0)),type:"keydown"})),qt(Gt,(z,P)=>cn?.(z,P),()=>({trigger:f(l(),()=>n(n().zoomActivationKeyPressed=!1,!0)),type:"keyup"})),Ne()}var ng=Mt(''),ag=Mt('');function og(t,e){Ee(e,!0);let n=k(()=>{if(!e.store.connection.inProgress)return"";const s={sourceX:e.store.connection.from.x,sourceY:e.store.connection.from.y,sourcePosition:e.store.connection.fromPosition,targetX:e.store.connection.to.x,targetY:e.store.connection.to.y,targetPosition:e.store.connection.toPosition};switch(e.type){case En.Bezier:{const[l]=yl(s);return l}case En.Straight:{const[l]=xl(s);return l}case En.Step:case En.SmoothStep:{const[l]=ts({...s,borderRadius:e.type===En.Step?0:void 0});return l}}});var o=Te(),r=oe(o);{var i=s=>{var l=ag(),u=d(l),v=d(u);{var p=f=>{var w=Te(),S=oe(w);hn(S,()=>e.LineComponent,(z,P)=>{P(z,{})}),g(f,w)},m=f=>{var w=ng();U(()=>{ze(w,"d",a(n)),pt(w,e.style)}),g(f,w)};W(v,f=>{e.LineComponent?f(p):f(m,!1)})}c(u),c(l),U(f=>{ze(l,"width",e.store.width),ze(l,"height",e.store.height),pt(l,e.containerStyle),Oe(u,0,f)},[()=>Gn(["svelte-flow__connection",Uf(e.store.connection.isValid)])]),g(s,l)};W(r,s=>{e.store.connection.inProgress&&s(i)})}g(t,o),Ne()}var rg=x("
    ");function is(t,e){Ee(e,!0);let n=ue(e,"position",3,"top-right"),o=Pn(e,["$$slots","$$events","$$legacy","position","style","class","children"]),r=k(()=>`${n()}`.split("-"));var i=rg();Mn(i,l=>({class:l,style:e.style,...o}),[()=>["svelte-flow__panel",e.class,...a(r)]]);var s=d(i);Jt(s,()=>e.children??ha),c(i),g(t,i),Ne()}var sg=x('
    Svelte Flow');function ig(t,e){Ee(e,!0);let n=ue(e,"position",3,"bottom-right");var o=Te(),r=oe(o);{var i=s=>{is(s,{get position(){return n()},class:"svelte-flow__attribution","data-message":"Feel free to remove the attribution or check out how you could support us: https://svelteflow.dev/support-us",children:(l,u)=>{var v=sg();g(l,v)},$$slots:{default:!0}})};W(r,s=>{e.proOptions?.hideAttribution||s(i)})}g(t,o),Ne()}var lg=x("
    ");function cg(t,e){Ee(e,!0);let n=ue(e,"domNode",15),o=ue(e,"clientWidth",15),r=ue(e,"clientHeight",15),i=k(()=>e.rest.class),s=k(()=>hc(e.rest,["id","class","nodeTypes","edgeTypes","colorMode","isValidConnection","onmove","onmovestart","onmoveend","onflowerror","ondelete","onbeforedelete","onbeforeconnect","onconnect","onconnectstart","onconnectend","onbeforereconnect","onreconnect","onreconnectstart","onreconnectend","onclickconnectstart","onclickconnectend","oninit","onselectionchange","onselectiondragstart","onselectiondrag","onselectiondragstop","onselectionstart","onselectionend","clickConnect","fitView","fitViewOptions","nodeOrigin","nodeDragThreshold","connectionDragThreshold","minZoom","maxZoom","initialViewport","connectionRadius","connectionMode","selectionMode","selectNodesOnDrag","snapGrid","defaultMarkerColor","translateExtent","nodeExtent","onlyRenderVisibleElements","autoPanOnConnect","autoPanOnNodeDrag","colorModeSSR","defaultEdgeOptions","elevateNodesOnSelect","elevateEdgesOnSelect","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","elementsSelectable","nodesFocusable","edgesFocusable","disableKeyboardA11y","noDragClass","noPanClass","noWheelClass","ariaLabelConfig","autoPanSpeed","panOnScrollSpeed","zIndexMode"]));function l(p){p.currentTarget.scrollTo({top:0,left:0,behavior:"auto"}),e.rest.onscroll&&e.rest.onscroll(p)}var u=lg();Mn(u,p=>({class:["svelte-flow","svelte-flow__container",a(i),e.colorMode],"data-testid":"svelte-flow__wrapper",role:"application",onscroll:l,...a(s),[Ro]:p}),[()=>({width:gn(e.width),height:gn(e.height)})],void 0,void 0,"svelte-mkap6j");var v=d(u);Jt(v,()=>e.children??ha),c(u),mn(u,p=>n(p),()=>n()),Ss(u,"clientHeight",r),Ss(u,"clientWidth",o),g(t,u),Ne()}var dg=x('
    ',1),ug=x(" ",1),vg=x(" ",1);function fg(t,e){Ee(e,!0);let n=ue(e,"paneClickDistance",3,1),o=ue(e,"nodeClickDistance",3,1),r=ue(e,"panOnScrollMode",19,()=>sa.Free),i=ue(e,"preventScrolling",3,!0),s=ue(e,"zoomOnScroll",3,!0),l=ue(e,"zoomOnDoubleClick",3,!0),u=ue(e,"zoomOnPinch",3,!0),v=ue(e,"panOnScroll",3,!1),p=ue(e,"panOnScrollSpeed",3,.5),m=ue(e,"panOnDrag",3,!0),f=ue(e,"selectionOnDrag",3,!1),w=ue(e,"connectionLineType",19,()=>En.Bezier),S=ue(e,"nodes",31,()=>pn([])),z=ue(e,"edges",31,()=>pn([])),P=ue(e,"viewport",15,void 0),L=Pn(e,["$$slots","$$events","$$legacy","width","height","proOptions","selectionKey","deleteKey","panActivationKey","multiSelectionKey","zoomActivationKey","paneClickDistance","nodeClickDistance","onmovestart","onmoveend","onmove","oninit","onnodeclick","onnodecontextmenu","onnodedrag","onnodedragstart","onnodedragstop","onnodepointerenter","onnodepointermove","onnodepointerleave","onselectionclick","onselectioncontextmenu","onselectionstart","onselectionend","onedgeclick","onedgecontextmenu","onedgepointerenter","onedgepointerleave","onpaneclick","onpanecontextmenu","panOnScrollMode","preventScrolling","zoomOnScroll","zoomOnDoubleClick","zoomOnPinch","panOnScroll","panOnScrollSpeed","panOnDrag","selectionOnDrag","connectionLineComponent","connectionLineStyle","connectionLineContainerStyle","connectionLineType","attributionPosition","children","nodes","edges","viewport"]),A=zh({props:L,width:e.width,height:e.height,get nodes(){return S()},set nodes(M){S(M)},get edges(){return z()},set edges(M){z(M)},get viewport(){return P()},set viewport(M){P(M)}});const V=Or(Dr);V&&V.setStore&&V.setStore(A),pi(Dr,{provider:!1,getStore(){return A}}),xe(()=>{const M={nodes:A.selectedNodes,edges:A.selectedEdges};un(()=>e.onselectionchange)?.(M);for(const O of A.selectionChangeHandlers.values())O(M)}),ga(()=>{A.reset()}),cg(t,{get colorMode(){return A.colorMode},get width(){return e.width},get height(){return e.height},get rest(){return L},get domNode(){return A.domNode},set domNode(M){A.domNode=M},get clientWidth(){return A.width},set clientWidth(M){A.width=M},get clientHeight(){return A.height},set clientHeight(M){A.height=M},children:(M,O)=>{var b=vg(),I=oe(b);tg(I,{get selectionKey(){return e.selectionKey},get deleteKey(){return e.deleteKey},get panActivationKey(){return e.panActivationKey},get multiSelectionKey(){return e.multiSelectionKey},get zoomActivationKey(){return e.zoomActivationKey},get store(){return A},set store(E){A=E}});var H=h(I,2);Eh(H,{get panOnScrollMode(){return r()},get preventScrolling(){return i()},get zoomOnScroll(){return s()},get zoomOnDoubleClick(){return l()},get zoomOnPinch(){return u()},get panOnScroll(){return v()},get panOnScrollSpeed(){return p()},get panOnDrag(){return m()},get paneClickDistance(){return n()},get selectionOnDrag(){return f()},get onmovestart(){return e.onmovestart},get onmove(){return e.onmove},get onmoveend(){return e.onmoveend},get oninit(){return e.oninit},get store(){return A},set store(E){A=E},children:(E,C)=>{Ph(E,{get onpaneclick(){return e.onpaneclick},get onpanecontextmenu(){return e.onpanecontextmenu},get onselectionstart(){return e.onselectionstart},get onselectionend(){return e.onselectionend},get panOnDrag(){return m()},get paneClickDistance(){return n()},get selectionOnDrag(){return f()},get store(){return A},set store(_){A=_},children:(_,T)=>{var D=ug(),R=oe(D);Th(R,{get store(){return A},set store(q){A=q},children:(q,K)=>{var Z=dg(),ee=h(oe(Z),2);Gh(ee,{get onedgeclick(){return e.onedgeclick},get onedgecontextmenu(){return e.onedgecontextmenu},get onedgepointerenter(){return e.onedgepointerenter},get onedgepointerleave(){return e.onedgepointerleave},get store(){return A},set store(re){A=re}});var J=h(ee,4);og(J,{get type(){return w()},get LineComponent(){return e.connectionLineComponent},get containerStyle(){return e.connectionLineContainerStyle},get style(){return e.connectionLineStyle},get store(){return A},set store(re){A=re}});var ne=h(J,2);Hh(ne,{get nodeClickDistance(){return o()},get onnodeclick(){return e.onnodeclick},get onnodecontextmenu(){return e.onnodecontextmenu},get onnodepointerenter(){return e.onnodepointerenter},get onnodepointermove(){return e.onnodepointermove},get onnodepointerleave(){return e.onnodepointerleave},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get store(){return A},set store(re){A=re}});var le=h(ne,2);Qh(le,{get onselectionclick(){return e.onselectionclick},get onselectioncontextmenu(){return e.onselectioncontextmenu},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get store(){return A},set store(re){A=re}}),he(2),g(q,Z)},$$slots:{default:!0}});var F=h(R,2);{let q=k(()=>!!(A.selectionRect&&A.selectionRectMode==="user")),K=k(()=>A.selectionRect?.width),Z=k(()=>A.selectionRect?.height),ee=k(()=>A.selectionRect?.x),J=k(()=>A.selectionRect?.y);Vl(F,{get isVisible(){return a(q)},get width(){return a(K)},get height(){return a(Z)},get x(){return a(ee)},get y(){return a(J)}})}g(_,D)},$$slots:{default:!0}})},$$slots:{default:!0}});var B=h(H,2);ig(B,{get proOptions(){return e.proOptions},get position(){return e.attributionPosition}});var X=h(B,2);Dh(X,{get store(){return A}});var N=h(X,2);Jt(N,()=>e.children??ha),g(M,b)},$$slots:{default:!0}}),Ne()}var pg=x("");function lo(t,e){let n=Pn(e,["$$slots","$$events","$$legacy","class","bgColor","bgColorHover","color","colorHover","borderColor","onclick","children"]);var o=pg();Mn(o,()=>({type:"button",onclick:e.onclick,class:["svelte-flow__controls-button",e.class],...n,[Ro]:{"--xy-controls-button-background-color-props":e.bgColor,"--xy-controls-button-background-color-hover-props":e.bgColorHover,"--xy-controls-button-color-props":e.color,"--xy-controls-button-color-hover-props":e.colorHover,"--xy-controls-button-border-color-props":e.borderColor}}));var r=d(o);Jt(r,()=>e.children??ha),c(o),g(t,o)}var hg=Mt('');function gg(t){var e=hg();g(t,e)}var mg=Mt('');function _g(t){var e=mg();g(t,e)}var yg=Mt('');function bg(t){var e=yg();g(t,e)}var xg=Mt('');function wg(t){var e=xg();g(t,e)}var kg=Mt('');function zg(t){var e=kg();g(t,e)}var Sg=x(" ",1),Cg=x(" ",1);function Eg(t,e){Ee(e,!0);let n=ue(e,"position",3,"bottom-left"),o=ue(e,"orientation",3,"vertical"),r=ue(e,"showZoom",3,!0),i=ue(e,"showFitView",3,!0),s=ue(e,"showLock",3,!0),l=Pn(e,["$$slots","$$events","$$legacy","position","orientation","showZoom","showFitView","showLock","style","class","buttonBgColor","buttonBgColorHover","buttonColor","buttonColorHover","buttonBorderColor","fitViewOptions","children","before","after"]),u=k(Cn);const v={bgColor:e.buttonBgColor,bgColorHover:e.buttonBgColorHover,color:e.buttonColor,colorHover:e.buttonColorHover,borderColor:e.buttonBorderColor};let p=k(()=>a(u).nodesDraggable||a(u).nodesConnectable||a(u).elementsSelectable),m=k(()=>a(u).viewport.zoom<=a(u).minZoom),f=k(()=>a(u).viewport.zoom>=a(u).maxZoom),w=k(()=>a(u).ariaLabelConfig),S=k(()=>o()==="horizontal"?"horizontal":"vertical");const z=()=>{a(u).zoomIn()},P=()=>{a(u).zoomOut()},L=()=>{a(u).fitView(e.fitViewOptions)},A=()=>{let V=!a(p);a(u).nodesDraggable=V,a(u).nodesConnectable=V,a(u).elementsSelectable=V};{let V=k(()=>["svelte-flow__controls",a(S),e.class]);is(t,$e({get class(){return a(V)},get position(){return n()},"data-testid":"svelte-flow__controls",get"aria-label"(){return a(w)["controls.ariaLabel"]},get style(){return e.style}},()=>l,{children:(M,O)=>{var b=Cg(),I=oe(b);{var H=q=>{var K=Te(),Z=oe(K);Jt(Z,()=>e.before),g(q,K)};W(I,q=>{e.before&&q(H)})}var B=h(I,2);{var X=q=>{var K=Sg(),Z=oe(K);lo(Z,$e({onclick:z,class:"svelte-flow__controls-zoomin",get title(){return a(w)["controls.zoomIn.ariaLabel"]},get"aria-label"(){return a(w)["controls.zoomIn.ariaLabel"]},get disabled(){return a(f)}},()=>v,{children:(J,ne)=>{gg(J)},$$slots:{default:!0}}));var ee=h(Z,2);lo(ee,$e({onclick:P,class:"svelte-flow__controls-zoomout",get title(){return a(w)["controls.zoomOut.ariaLabel"]},get"aria-label"(){return a(w)["controls.zoomOut.ariaLabel"]},get disabled(){return a(m)}},()=>v,{children:(J,ne)=>{_g(J)},$$slots:{default:!0}})),g(q,K)};W(B,q=>{r()&&q(X)})}var N=h(B,2);{var E=q=>{lo(q,$e({class:"svelte-flow__controls-fitview",onclick:L,get title(){return a(w)["controls.fitView.ariaLabel"]},get"aria-label"(){return a(w)["controls.fitView.ariaLabel"]}},()=>v,{children:(K,Z)=>{bg(K)},$$slots:{default:!0}}))};W(N,q=>{i()&&q(E)})}var C=h(N,2);{var _=q=>{lo(q,$e({class:"svelte-flow__controls-interactive",onclick:A,get title(){return a(w)["controls.interactive.ariaLabel"]},get"aria-label"(){return a(w)["controls.interactive.ariaLabel"]}},()=>v,{children:(K,Z)=>{var ee=Te(),J=oe(ee);{var ne=re=>{zg(re)},le=re=>{wg(re)};W(J,re=>{a(p)?re(ne):re(le,!1)})}g(K,ee)},$$slots:{default:!0}}))};W(C,q=>{s()&&q(_)})}var T=h(C,2);{var D=q=>{var K=Te(),Z=oe(K);Jt(Z,()=>e.children),g(q,K)};W(T,q=>{e.children&&q(D)})}var R=h(T,2);{var F=q=>{var K=Te(),Z=oe(K);Jt(Z,()=>e.after),g(q,K)};W(R,q=>{e.after&&q(F)})}g(M,b)},$$slots:{default:!0}}))}Ne()}var kn;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(kn||(kn={}));var Ng=Mt("");function Pg(t,e){var n=Ng();U(()=>{ze(n,"cx",e.radius),ze(n,"cy",e.radius),ze(n,"r",e.radius),Oe(n,0,Gn(["svelte-flow__background-pattern","dots",e.class]))}),g(t,n)}var Mg=Mt("");function Tg(t,e){Ee(e,!0);var n=Mg();U(()=>{ze(n,"stroke-width",e.lineWidth),ze(n,"d",`M${e.dimensions[0]/2} 0 V${e.dimensions[1]} M0 ${e.dimensions[1]/2} H${e.dimensions[0]}`),Oe(n,0,Gn(["svelte-flow__background-pattern",e.variant,e.class]))}),g(t,n),Ne()}const Ig={[kn.Dots]:1,[kn.Lines]:1,[kn.Cross]:6};var Ag=Mt('');function Dg(t,e){Ee(e,!0);let n=ue(e,"variant",19,()=>kn.Dots),o=ue(e,"gap",3,20),r=ue(e,"lineWidth",3,1),i=k(Cn),s=k(()=>n()===kn.Dots),l=k(()=>n()===kn.Cross),u=k(()=>Array.isArray(o())?o():[o(),o()]),v=k(()=>`background-pattern-${a(i).flowId}-${e.id??""}`),p=k(()=>[a(u)[0]*a(i).viewport.zoom||1,a(u)[1]*a(i).viewport.zoom||1]),m=k(()=>(e.size??Ig[n()])*a(i).viewport.zoom),f=k(()=>a(l)?[a(m),a(m)]:a(p)),w=k(()=>a(s)?[a(m)/2,a(m)/2]:[a(f)[0]/2,a(f)[1]/2]);var S=Ag();let z;var P=d(S),L=d(P);{var A=O=>{{let b=k(()=>a(m)/2);Pg(O,{get radius(){return a(b)},get class(){return e.patternClass}})}},V=O=>{Tg(O,{get dimensions(){return a(f)},get variant(){return n()},get lineWidth(){return r()},get class(){return e.patternClass}})};W(L,O=>{a(s)?O(A):O(V,!1)})}c(P);var M=h(P);c(S),U(()=>{Oe(S,0,Gn(["svelte-flow__background","svelte-flow__container",e.class])),z=pt(S,"",z,{"--xy-background-color-props":e.bgColor,"--xy-background-pattern-color-props":e.patternColor}),ze(P,"id",a(v)),ze(P,"x",a(i).viewport.x%a(p)[0]),ze(P,"y",a(i).viewport.y%a(p)[1]),ze(P,"width",a(p)[0]),ze(P,"height",a(p)[1]),ze(P,"patternTransform",`translate(-${a(w)[0]},-${a(w)[1]})`),ze(M,"fill",`url(#${a(v)})`)}),g(t,S),Ne()}function Og(t){const e=k(Cn),n=k(()=>a(e).nodeLookup),o=k(()=>a(e).nodes),r=k(()=>(a(o),a(n).get(t)));return{get current(){return a(r)}}}var Rg=Mt("");function Lg(t,e){Ee(e,!0);let n=ue(e,"borderRadius",3,5),o=ue(e,"strokeWidth",3,2),r=k(()=>Og(e.id)),i=k(()=>{if(!a(r).current)return{width:0,height:0,x:0,y:0};const{width:S,height:z}=Tn(a(r).current);return{width:e.width??S,height:e.height??z,x:e.x??a(r).current.internals.positionAbsolute.x,y:e.y??a(r).current.internals.positionAbsolute.y}}),s=k(()=>a(i).width),l=k(()=>a(i).height),u=k(()=>a(i).x),v=k(()=>a(i).y);var p=Te(),m=oe(p);{var f=S=>{const z=k(()=>e.nodeComponent);var P=Te(),L=oe(P);hn(L,()=>a(z),(A,V)=>{V(A,{get id(){return e.id},get x(){return a(u)},get y(){return a(v)},get width(){return a(s)},get height(){return a(l)},get borderRadius(){return n()},get class(){return e.class},get color(){return e.color},get shapeRendering(){return e.shapeRendering},get strokeColor(){return e.strokeColor},get strokeWidth(){return o()},get selected(){return e.selected}})}),g(S,P)},w=S=>{var z=Rg();let P,L;U(()=>{P=Oe(z,0,Gn(["svelte-flow__minimap-node",e.class]),null,P,{selected:e.selected}),ze(z,"x",a(u)),ze(z,"y",a(v)),ze(z,"rx",n()),ze(z,"ry",n()),ze(z,"width",a(s)),ze(z,"height",a(l)),ze(z,"shape-rendering",e.shapeRendering),L=pt(z,"",L,{fill:e.color,stroke:e.strokeColor,"stroke-width":o()})}),g(S,z)};W(m,S=>{e.nodeComponent?S(f):S(w,!1)})}g(t,p),Ne()}function Vg(t,e){const n=Hp({domNode:t,panZoom:e.panZoom,getTransform:()=>{const{viewport:r}=e.store;return[r.x,r.y,r.zoom]},getViewScale:e.getViewScale});n.update({translateExtent:e.translateExtent,width:e.width,height:e.height,inversePan:e.inversePan,zoomStep:e.zoomStep,pannable:e.pannable,zoomable:e.zoomable});function o(r){n.update({translateExtent:r.translateExtent,width:r.width,height:r.height,inversePan:r.inversePan,zoomStep:r.zoomStep,pannable:r.pannable,zoomable:r.zoomable})}return{update:o,destroy(){n.destroy()}}}const hr=t=>t instanceof Function?t:()=>t;var Hg=Mt(" "),Fg=Mt(''),qg=x('',1);function Bg(t,e){Ee(e,!0);let n=ue(e,"position",3,"bottom-right"),o=ue(e,"nodeStrokeColor",3,"transparent"),r=ue(e,"nodeClass",3,""),i=ue(e,"nodeBorderRadius",3,5),s=ue(e,"nodeStrokeWidth",3,2),l=ue(e,"width",3,200),u=ue(e,"height",3,150),v=ue(e,"pannable",3,!0),p=ue(e,"zoomable",3,!0),m=Pn(e,["$$slots","$$events","$$legacy","position","ariaLabel","nodeStrokeColor","nodeColor","nodeClass","nodeBorderRadius","nodeStrokeWidth","nodeComponent","bgColor","maskColor","maskStrokeColor","maskStrokeWidth","width","height","pannable","zoomable","inversePan","zoomStep","class"]),f=k(Cn),w=k(()=>a(f).ariaLabelConfig);const S=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";let z=k(()=>`svelte-flow__minimap-desc-${a(f).flowId}`),P=k(()=>({x:-a(f).viewport.x/a(f).viewport.zoom,y:-a(f).viewport.y/a(f).viewport.zoom,width:a(f).width/a(f).viewport.zoom,height:a(f).height/a(f).viewport.zoom})),L=k(()=>fl(Wa(a(f).nodeLookup,{filter:T=>!T.hidden}),a(P))),A=k(()=>a(L).width/l()),V=k(()=>a(L).height/u()),M=k(()=>Math.max(a(A),a(V))),O=k(()=>a(M)*l()),b=k(()=>a(M)*u()),I=k(()=>5*a(M)),H=k(()=>a(L).x-(a(O)-a(L).width)/2-a(I)),B=k(()=>a(L).y-(a(b)-a(L).height)/2-a(I)),X=k(()=>a(O)+a(I)*2),N=k(()=>a(b)+a(I)*2);const E=()=>a(M);var C=qg(),_=oe(C);{let T=k(()=>["svelte-flow__minimap",e.class]);Kc(_,()=>({"--xy-minimap-background-color-props":e.bgColor})),is(_.lastChild,$e({get position(){return n()},get class(){return a(T)},"data-testid":"svelte-flow__minimap"},()=>m,{children:(D,R)=>{var F=Te(),q=oe(F);{var K=Z=>{var ee=Fg();let J;var ne=d(ee);{var le=j=>{var $=Hg(),de=d($,!0);c($),U(()=>{ze($,"id",a(z)),Y(de,e.ariaLabel??a(w)["minimap.ariaLabel"])}),g(j,$)};W(ne,j=>{(e.ariaLabel??a(w)["minimap.ariaLabel"])&&j(le)})}var re=h(ne);Qe(re,17,()=>a(f).nodes,j=>j.id,(j,$)=>{const de=k(()=>a(f).nodeLookup.get(a($).id));var ce=Te(),te=oe(ce);{var ae=se=>{{let ge=k(()=>e.nodeColor===void 0?void 0:hr(e.nodeColor)(a($))),_e=k(()=>hr(o())(a($))),pe=k(()=>hr(r())(a($)));Lg(se,{get id(){return a(de).id},get selected(){return a(de).selected},get nodeComponent(){return e.nodeComponent},get color(){return a(ge)},get borderRadius(){return i()},get strokeColor(){return a(_e)},get strokeWidth(){return s()},get shapeRendering(){return S},get class(){return a(pe)}})}},be=k(()=>a(de)&&pl(a(de))&&!a(de).hidden);W(te,se=>{a(be)&&se(ae)})}g(j,ce)});var Q=h(re);c(ee),qt(ee,(j,$)=>Vg?.(j,$),()=>({store:a(f),panZoom:a(f).panZoom,getViewScale:E,translateExtent:a(f).translateExtent,width:a(f).width,height:a(f).height,inversePan:e.inversePan,zoomStep:e.zoomStep,pannable:v(),zoomable:p()})),U(()=>{ze(ee,"width",l()),ze(ee,"height",u()),ze(ee,"viewBox",`${a(H)??""} ${a(B)??""} ${a(X)??""} ${a(N)??""}`),ze(ee,"aria-labelledby",a(z)),J=pt(ee,"",J,{"--xy-minimap-mask-background-color-props":e.maskColor,"--xy-minimap-mask-stroke-color-props":e.maskStrokeColor,"--xy-minimap-mask-stroke-width-props":e.maskStrokeWidth?e.maskStrokeWidth*a(M):void 0}),ze(Q,"d",`M${a(H)-a(I)},${a(B)-a(I)}h${a(X)+a(I)*2}v${a(N)+a(I)*2}h${-a(X)-a(I)*2}z - M${a(P).x??""},${a(P).y??""}h${a(P).width??""}v${a(P).height??""}h${-a(P).width}z`)}),g(Z,ee)};W(q,Z=>{a(f).panZoom&&Z(K)})}g(D,F)},$$slots:{default:!0}})),c(_)}g(t,C),Ne()}var Kg=x(' '),jg=x(''),Wg=x(''),Zg=x(''),Yg=x('
    '),Xg=x('

    '),Gg=x('
    Exec In
    Exec Out
    ');function Ug(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=k(()=>!!e.data.multimodal?.vision_enabled),r=G(!1);xe(()=>{if(a(n)==="complete"){y(r,!0);const R=setTimeout(()=>{y(r,!1)},3e3);return()=>clearTimeout(R)}else y(r,!1)});var i=Gg();let s;var l=d(i),u=d(l),v=d(u),p=d(v);{var m=R=>{var F=Kg(),q=d(F,!0);c(F),U(()=>Y(q,e.data.model)),g(R,F)};W(p,R=>{e.data.model&&R(m)})}var f=h(p,2);{var w=R=>{var F=jg(),q=d(F);ko(q,{size:10}),c(F),g(R,F)};W(f,R=>{a(o)&&R(w)})}c(v);var S=h(v,2),z=d(S);Hr(z,{size:11}),c(S),c(u);var P=h(u,2),L=d(P);let A;var V=h(L,2);Pa(V,{size:14});var M=h(V,2),O=d(M,!0);c(M);var b=h(M,2);{var I=R=>{var F=Wg(),q=d(F);an(q,{size:13}),c(F),on(3,F,()=>rn,()=>({duration:200,start:.6})),g(R,F)};W(b,R=>{a(r)&&R(I)})}var H=h(b,2);{var B=R=>{var F=Zg(),q=d(F);Qt(q,{size:13}),c(F),g(R,F)};W(H,R=>{a(n)==="error"&&R(B)})}c(P),c(l);var X=h(l,2),N=h(d(X),2);{var E=R=>{var F=Yg(),q=d(F);c(F),U((K,Z)=>Y(q,`${K??""}${Z??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),g(R,F)};W(N,R=>{e.data.description&&R(E)})}var C=h(N,2);{var _=R=>{var F=Xg(),q=h(d(F),2),K=d(q,!0);c(q),c(F),U(()=>Y(K,e.data.instructions)),g(R,F)};W(C,R=>{e.data.instructions&&R(_)})}c(X);var T=h(X,2);bt(T,{type:"target",get position(){return Se.Left}});var D=h(T,2);bt(D,{type:"source",get position(){return Se.Right}}),c(i),U(()=>{s=Oe(i,1,"agent-node svelte-uofr5c",null,s,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),A=Oe(L,1,"status-dot svelte-uofr5c",null,A,{"dot-idle":a(n)==="idle","dot-running":a(n)==="running","dot-error":a(n)==="error","dot-complete":a(n)==="complete"||a(r)}),Y(O,e.data.label||"Agent")}),g(t,i),Ne()}var Jg=x(''),Qg=x(''),$g=x('
    tool
    '),em=x('
    '),tm=x('
    timeout
    '),nm=x('
    Exec In
    Exec Out
    ');function am(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=G(!1);xe(()=>{if(a(n)==="complete"){y(o,!0);const N=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(N)}else y(o,!1)});var r=nm();let i;var s=d(r),l=d(s),u=d(l);let v;var p=h(u,2),m=d(p);Kn(m,{size:13}),c(p);var f=h(p,2),w=d(f,!0);c(f);var S=h(f,2);{var z=N=>{var E=Jg(),C=d(E);an(C,{size:12}),c(E),on(3,E,()=>rn,()=>({duration:200,start:.6})),g(N,E)};W(S,N=>{a(o)&&N(z)})}var P=h(S,2);{var L=N=>{var E=Qg(),C=d(E);Qt(C,{size:12}),c(E),g(N,E)};W(P,N=>{a(n)==="error"&&N(L)})}c(l),c(s);var A=h(s,2),V=h(d(A),2);{var M=N=>{var E=$g(),C=h(d(E)),_=d(C,!0);c(C),c(E),U(()=>Y(_,e.data.tool_name)),g(N,E)};W(V,N=>{e.data.tool_name&&N(M)})}var O=h(V,2);{var b=N=>{var E=em(),C=d(E);c(E),U((_,T)=>Y(C,`${_??""}${T??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),g(N,E)};W(O,N=>{e.data.description&&N(b)})}var I=h(O,2);{var H=N=>{var E=tm(),C=h(d(E)),_=d(C);c(C),c(E),U(()=>Y(_,`${e.data.timeout??""}s`)),g(N,E)};W(I,N=>{e.data.timeout&&N(H)})}c(A);var B=h(A,2);bt(B,{type:"target",get position(){return Se.Left}});var X=h(B,2);bt(X,{type:"source",get position(){return Se.Right}}),c(r),U(()=>{i=Oe(r,1,"tool-node svelte-107d6w1",null,i,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),v=Oe(u,1,"status-dot svelte-107d6w1",null,v,{"dot-idle":a(n)==="idle","dot-running":a(n)==="running","dot-error":a(n)==="error","dot-complete":a(n)==="complete"||a(o)}),Y(w,e.data.label||"Tool")}),g(t,r),Ne()}var om=x(''),rm=x(''),sm=x('
    '),im=x('
    '),lm=x('
    Max Steps
    '),cm=x('
    Exec In
    Exec Out
    ');function dm(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=G(!1);xe(()=>{if(a(n)==="complete"){y(o,!0);const N=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(N)}else y(o,!1)});var r=cm();let i;var s=d(r),l=d(s),u=d(l);let v;var p=h(u,2),m=d(p);xo(m,{size:14}),c(p);var f=h(p,2),w=d(f,!0);c(f);var S=h(f,2);{var z=N=>{var E=om(),C=d(E);an(C,{size:12}),c(E),on(3,E,()=>rn,()=>({duration:200,start:.6})),g(N,E)};W(S,N=>{a(o)&&N(z)})}var P=h(S,2);{var L=N=>{var E=rm(),C=d(E);Qt(C,{size:12}),c(E),g(N,E)};W(P,N=>{a(n)==="error"&&N(L)})}c(l);var A=h(l,2);{var V=N=>{var E=sm(),C=d(E,!0);c(E),U(()=>Y(C,e.data.pattern)),g(N,E)};W(A,N=>{e.data.pattern&&N(V)})}c(s);var M=h(s,2),O=h(d(M),2);{var b=N=>{var E=im(),C=d(E);c(E),U((_,T)=>Y(C,`${_??""}${T??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),g(N,E)};W(O,N=>{e.data.description&&N(b)})}var I=h(O,2);{var H=N=>{var E=lm(),C=h(d(E),2),_=d(C,!0);c(C),c(E),U(()=>Y(_,e.data.maxSteps)),g(N,E)};W(I,N=>{e.data.maxSteps&&N(H)})}c(M);var B=h(M,2);bt(B,{type:"target",get position(){return Se.Left}});var X=h(B,2);bt(X,{type:"source",get position(){return Se.Right}}),c(r),U(()=>{i=Oe(r,1,"reason-node svelte-15a1m3",null,i,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),v=Oe(u,1,"status-dot svelte-15a1m3",null,v,{"dot-idle":a(n)==="idle","dot-running":a(n)==="running","dot-error":a(n)==="error","dot-complete":a(n)==="complete"||a(o)}),Y(w,e.data.label||"Reasoning")}),g(t,r),Ne()}var um=x(''),vm=x(''),fm=x('
    '),pm=x('
    '),hm=x('
    In
    True
    False
    ');function gm(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=G(!1);xe(()=>{if(a(n)==="complete"){y(o,!0);const B=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(B)}else y(o,!1)});var r=hm();let i;var s=d(r),l=h(d(s),2),u=d(l);let v;var p=h(u,2);Ma(p,{size:13});var m=h(p,2),f=d(m,!0);c(m);var w=h(m,2);{var S=B=>{var X=um(),N=d(X);an(N,{size:12}),c(X),on(3,X,()=>rn,()=>({duration:200,start:.6})),g(B,X)};W(w,B=>{a(o)&&B(S)})}var z=h(w,2);{var P=B=>{var X=vm(),N=d(X);Qt(N,{size:12}),c(X),g(B,X)};W(z,B=>{a(n)==="error"&&B(P)})}c(l),c(s);var L=h(s,2),A=d(L);{var V=B=>{var X=fm(),N=d(X),E=d(N,!0);c(N),c(X),U(()=>Y(E,e.data.condition)),g(B,X)};W(A,B=>{e.data.condition&&B(V)})}var M=h(A,2);{var O=B=>{var X=pm(),N=d(X);c(X),U((E,C)=>Y(N,`${E??""}${C??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),g(B,X)};W(M,B=>{e.data.description&&B(O)})}he(2),c(L);var b=h(L,2);bt(b,{type:"target",get position(){return Se.Left}});var I=h(b,2);bt(I,{type:"source",get position(){return Se.Right},id:"true",style:"top: 35%;"});var H=h(I,2);bt(H,{type:"source",get position(){return Se.Right},id:"false",style:"top: 65%;"}),c(r),U(()=>{i=Oe(r,1,"cond-node svelte-9dvt8o",null,i,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),v=Oe(u,1,"status-dot svelte-9dvt8o",null,v,{"dot-idle":a(n)==="idle","dot-running":a(n)==="running","dot-error":a(n)==="error","dot-complete":a(n)==="complete"||a(o)}),Y(f,e.data.label||"Condition")}),g(t,r),Ne()}var mm=x(''),_m=x(''),ym=x('
    action
    '),bm=x('
    namespace
    '),xm=x('
    Exec In
    Exec Out
    ');function wm(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=G(!1);xe(()=>{if(a(n)==="complete"){y(o,!0);const O=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(O)}else y(o,!1)});var r=xm();let i;var s=d(r),l=d(s);Vr(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=O=>{var b=mm(),I=d(b);an(I,{size:12}),c(b),on(3,b,()=>rn,()=>({duration:200,start:.6})),g(O,b)};W(p,O=>{a(o)&&O(m)})}var f=h(p,2);{var w=O=>{var b=_m(),I=d(b);Qt(I,{size:12}),c(b),g(O,b)};W(f,O=>{a(n)==="error"&&O(w)})}c(s);var S=h(s,2),z=h(d(S),2);{var P=O=>{var b=ym(),I=h(d(b)),H=d(I,!0);c(I),c(b),U(()=>Y(H,e.data.memory_action)),g(O,b)};W(z,O=>{e.data.memory_action&&O(P)})}var L=h(z,2);{var A=O=>{var b=bm(),I=h(d(b)),H=d(I,!0);c(I),c(b),U(()=>Y(H,e.data.namespace)),g(O,b)};W(L,O=>{e.data.namespace&&O(A)})}c(S);var V=h(S,2);bt(V,{type:"target",get position(){return Se.Left}});var M=h(V,2);bt(M,{type:"source",get position(){return Se.Right}}),c(r),U(()=>{i=Oe(r,1,"bp-node svelte-mcwl9o",null,i,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),Y(v,e.data.label||"Memory")}),g(t,r),Ne()}var km=x(''),zm=x(''),Sm=x('
    rule
    '),Cm=x('
    on_fail
    '),Em=x('
    Exec In
    Exec Out
    ');function Nm(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=G(!1);xe(()=>{if(a(n)==="complete"){y(o,!0);const O=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(O)}else y(o,!1)});var r=Em();let i;var s=d(r),l=d(s);Fr(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=O=>{var b=km(),I=d(b);an(I,{size:12}),c(b),on(3,b,()=>rn,()=>({duration:200,start:.6})),g(O,b)};W(p,O=>{a(o)&&O(m)})}var f=h(p,2);{var w=O=>{var b=zm(),I=d(b);Qt(I,{size:12}),c(b),g(O,b)};W(f,O=>{a(n)==="error"&&O(w)})}c(s);var S=h(s,2),z=h(d(S),2);{var P=O=>{var b=Sm(),I=h(d(b)),H=d(I,!0);c(I),c(b),U(()=>Y(H,e.data.validation_rule)),g(O,b)};W(z,O=>{e.data.validation_rule&&O(P)})}var L=h(z,2);{var A=O=>{var b=Cm(),I=h(d(b)),H=d(I,!0);c(I),c(b),U(()=>Y(H,e.data.fail_action)),g(O,b)};W(L,O=>{e.data.fail_action&&O(A)})}c(S);var V=h(S,2);bt(V,{type:"target",get position(){return Se.Left}});var M=h(V,2);bt(M,{type:"source",get position(){return Se.Right}}),c(r),U(()=>{i=Oe(r,1,"bp-node svelte-1y5xb8x",null,i,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),Y(v,e.data.label||"Validator")}),g(t,r),Ne()}var Pm=x(''),Mm=x(''),Tm=x('
    desc
    '),Im=x('
    code
    '),Am=x('
    In
    Out
    ');function Dm(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=G(!1);xe(()=>{if(a(n)==="complete"){y(o,!0);const O=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(O)}else y(o,!1)});var r=Am();let i;var s=d(r),l=d(s);qa(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=O=>{var b=Pm(),I=d(b);an(I,{size:12}),c(b),on(3,b,()=>rn,()=>({duration:200,start:.6})),g(O,b)};W(p,O=>{a(o)&&O(m)})}var f=h(p,2);{var w=O=>{var b=Mm(),I=d(b);Qt(I,{size:12}),c(b),g(O,b)};W(f,O=>{a(n)==="error"&&O(w)})}c(s);var S=h(s,2),z=h(d(S),2);{var P=O=>{var b=Tm(),I=h(d(b)),H=d(I,!0);c(I),c(b),U(()=>Y(H,e.data.description)),g(O,b)};W(z,O=>{e.data.description&&O(P)})}var L=h(z,2);{var A=O=>{var b=Im(),I=h(d(b)),H=d(I);c(I),c(b),U((B,X)=>Y(H,`${B??""}${X??""}`),[()=>String(e.data.code).split(` -`)[0].slice(0,30),()=>String(e.data.code).length>30?"...":""]),g(O,b)};W(L,O=>{e.data.code&&O(A)})}c(S);var V=h(S,2);bt(V,{type:"target",get position(){return Se.Left}});var M=h(V,2);bt(M,{type:"source",get position(){return Se.Right}}),c(r),U(()=>{i=Oe(r,1,"bp-node svelte-1ebq9zd",null,i,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),Y(v,e.data.label||"Code")}),g(t,r),Ne()}var Om=x(''),Rm=x(''),Lm=x('
    split
    '),Vm=x('
    max
    '),Hm=x('
    In
    Out 1
    Out 2
    ');function Fm(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=G(!1);xe(()=>{if(a(n)==="complete"){y(o,!0);const b=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(b)}else y(o,!1)});var r=Hm();let i;var s=d(r),l=d(s);qr(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=b=>{var I=Om(),H=d(I);an(H,{size:12}),c(I),on(3,I,()=>rn,()=>({duration:200,start:.6})),g(b,I)};W(p,b=>{a(o)&&b(m)})}var f=h(p,2);{var w=b=>{var I=Rm(),H=d(I);Qt(H,{size:12}),c(I),g(b,I)};W(f,b=>{a(n)==="error"&&b(w)})}c(s);var S=h(s,2),z=h(d(S),2);{var P=b=>{var I=Lm(),H=h(d(I)),B=d(H,!0);c(H),c(I),U(()=>Y(B,e.data.split_expression)),g(b,I)};W(z,b=>{e.data.split_expression&&b(P)})}var L=h(z,2);{var A=b=>{var I=Vm(),H=h(d(I)),B=d(H,!0);c(H),c(I),U(()=>Y(B,e.data.max_concurrent)),g(b,I)};W(L,b=>{e.data.max_concurrent&&b(A)})}c(S);var V=h(S,2);bt(V,{type:"target",get position(){return Se.Left}});var M=h(V,2);bt(M,{type:"source",get position(){return Se.Right},id:"out-1",style:"top: 33%;"});var O=h(M,2);bt(O,{type:"source",get position(){return Se.Right},id:"out-2",style:"top: 66%;"}),c(r),U(()=>{i=Oe(r,1,"bp-node svelte-5h9d64",null,i,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),Y(v,e.data.label||"Fan Out")}),g(t,r),Ne()}var qm=x(''),Bm=x(''),Km=x('
    merge
    '),jm=x('
    timeout
    '),Wm=x('
    In 1
    In 2
    Out
    ');function Zm(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=G(!1);xe(()=>{if(a(n)==="complete"){y(o,!0);const b=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(b)}else y(o,!1)});var r=Wm();let i;var s=d(r),l=d(s);Br(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=b=>{var I=qm(),H=d(I);an(H,{size:12}),c(I),on(3,I,()=>rn,()=>({duration:200,start:.6})),g(b,I)};W(p,b=>{a(o)&&b(m)})}var f=h(p,2);{var w=b=>{var I=Bm(),H=d(I);Qt(H,{size:12}),c(I),g(b,I)};W(f,b=>{a(n)==="error"&&b(w)})}c(s);var S=h(s,2),z=h(d(S),2);{var P=b=>{var I=Km(),H=h(d(I)),B=d(H,!0);c(H),c(I),U(()=>Y(B,e.data.merge_expression)),g(b,I)};W(z,b=>{e.data.merge_expression&&b(P)})}var L=h(z,2);{var A=b=>{var I=jm(),H=h(d(I)),B=d(H);c(H),c(I),U(()=>Y(B,`${e.data.merge_timeout??""}s`)),g(b,I)};W(L,b=>{e.data.merge_timeout&&b(A)})}c(S);var V=h(S,2);bt(V,{type:"target",get position(){return Se.Left},id:"in-1",style:"top: 33%;"});var M=h(V,2);bt(M,{type:"target",get position(){return Se.Left},id:"in-2",style:"top: 66%;"});var O=h(M,2);bt(O,{type:"source",get position(){return Se.Right}}),c(r),U(()=>{i=Oe(r,1,"bp-node svelte-k2gv2h",null,i,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),Y(v,e.data.label||"Fan In")}),g(t,r),Ne()}var Ym=x(''),Xm=x(''),Gm=x('
    '),Um=x('
    Exec Out

    ');function Jm(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=k(()=>e.data.trigger_type??"Manual"),r=G(!1),i=k(()=>()=>{switch(a(o).toLowerCase()){case"http":return e.data.endpoint?`${e.data.method??"POST"} ${e.data.endpoint}`:"HTTP endpoint";case"queue":return e.data.queue_name?`Queue: ${e.data.queue_name}`:"Message queue";case"schedule":return e.data.cron?`Cron: ${e.data.cron}`:"Scheduled trigger";case"file":return e.data.watch_path?`Watch: ${e.data.watch_path}`:"File watcher";default:return"Manual execution"}});xe(()=>{if(a(n)==="complete"){y(r,!0);const R=setTimeout(()=>{y(r,!1)},3e3);return()=>clearTimeout(R)}else y(r,!1)});var s=Um();let l;var u=d(s),v=d(u),p=d(v),m=d(p),f=d(m,!0);c(m),c(p);var w=h(p,2),S=d(w);Hr(S,{size:11}),c(w),c(v);var z=h(v,2),P=d(z);let L;var A=h(P,2),V=d(A);bi(V,{size:14}),c(A);var M=h(A,2),O=d(M,!0);c(M);var b=h(M,2);{var I=R=>{var F=Ym(),q=d(F);an(q,{size:13}),c(F),on(3,F,()=>rn,()=>({duration:200,start:.6})),g(R,F)};W(b,R=>{a(r)&&R(I)})}var H=h(b,2);{var B=R=>{var F=Xm(),q=d(F);Qt(q,{size:13}),c(F),g(R,F)};W(H,R=>{a(n)==="error"&&R(B)})}c(z),c(u);var X=h(u,2),N=h(d(X),2);{var E=R=>{var F=Gm(),q=d(F);c(F),U((K,Z)=>Y(q,`${K??""}${Z??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),g(R,F)};W(N,R=>{e.data.description&&R(E)})}var C=h(N,2),_=h(d(C),2),T=d(_,!0);c(_),c(C),c(X);var D=h(X,2);bt(D,{type:"source",get position(){return Se.Right}}),c(s),U(R=>{l=Oe(s,1,"input-node svelte-170rmgf",null,l,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),Y(f,a(o)),L=Oe(P,1,"status-dot svelte-170rmgf",null,L,{"dot-idle":a(n)==="idle","dot-running":a(n)==="running","dot-error":a(n)==="error","dot-complete":a(n)==="complete"||a(r)}),Y(O,e.data.label||"Input"),Y(T,R)},[()=>a(i)()]),g(t,s),Ne()}var Qm=x(''),$m=x(''),e1=x('
    '),t1=x('
    Exec In

    ');function n1(t,e){Ee(e,!0);let n=k(()=>e.data._executionState??"idle"),o=k(()=>e.data.destination_type??"Response"),r=G(!1),i=k(()=>()=>{switch(a(o).toLowerCase()){case"response":return e.data.format?`Format: ${e.data.format}`:"Direct response";case"queue":return e.data.queue_name?`Queue: ${e.data.queue_name}`:"Message queue";case"webhook":return e.data.webhook_url?`URL: ${e.data.webhook_url}`:"Webhook delivery";case"store":return e.data.store_path?`Path: ${e.data.store_path}`:"Persistent store";default:return"Output destination"}});xe(()=>{if(a(n)==="complete"){y(r,!0);const R=setTimeout(()=>{y(r,!1)},3e3);return()=>clearTimeout(R)}else y(r,!1)});var s=t1();let l;var u=d(s),v=d(u),p=d(v),m=d(p),f=d(m,!0);c(m),c(p);var w=h(p,2),S=d(w);Hr(S,{size:11}),c(w),c(v);var z=h(v,2),P=d(z);let L;var A=h(P,2),V=d(A);Vo(V,{size:14}),c(A);var M=h(A,2),O=d(M,!0);c(M);var b=h(M,2);{var I=R=>{var F=Qm(),q=d(F);an(q,{size:13}),c(F),on(3,F,()=>rn,()=>({duration:200,start:.6})),g(R,F)};W(b,R=>{a(r)&&R(I)})}var H=h(b,2);{var B=R=>{var F=$m(),q=d(F);Qt(q,{size:13}),c(F),g(R,F)};W(H,R=>{a(n)==="error"&&R(B)})}c(z),c(u);var X=h(u,2),N=h(d(X),2);{var E=R=>{var F=e1(),q=d(F);c(F),U((K,Z)=>Y(q,`${K??""}${Z??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),g(R,F)};W(N,R=>{e.data.description&&R(E)})}var C=h(N,2),_=h(d(C),2),T=d(_,!0);c(_),c(C),c(X);var D=h(X,2);bt(D,{type:"target",get position(){return Se.Left}}),c(s),U(R=>{l=Oe(s,1,"output-node svelte-198t6xy",null,l,{"exec-running":a(n)==="running","exec-complete":a(n)==="complete","exec-error":a(n)==="error"}),Y(f,a(o)),L=Oe(P,1,"status-dot svelte-198t6xy",null,L,{"dot-idle":a(n)==="idle","dot-running":a(n)==="running","dot-error":a(n)==="error","dot-complete":a(n)==="complete"||a(r)}),Y(O,e.data.label||"Output"),Y(T,R)},[()=>a(i)()]),g(t,s),Ne()}var a1=x(" ",1),o1=x('
    Nodes
    Agents
    Tools
    Links
    '),r1=x('

    Start building your pipeline

    Click components in the left panel to add them, or press Cmd+K to search

    '),s1=x('
    ');function i1(t,e){Ee(e,!0);const n=()=>dt(qn,"$nodes",r),o=()=>dt(Fn,"$edges",r),[r,i]=Xt(),s={input:Jm,output:n1,agent:Ug,tool:am,reasoning:dm,condition:gm,memory:wm,validator:Nm,custom_code:Dm,fan_out:Fm,fan_in:Zm};let l=k(()=>n().length===0),u=k(()=>n().length),v=k(()=>n().filter(A=>A.type==="agent").length),p=k(()=>n().filter(A=>A.type==="tool").length),m=k(()=>o().length);var f=s1(),w=d(f);fg(w,{get nodeTypes(){return s},fitView:!0,colorMode:"dark",defaultEdgeOptions:{type:"smoothstep",animated:!0,style:"stroke: #cbd5e1; stroke-width: 2.5px;"},onnodeclick:({node:A})=>Nn.set(A.id),onpaneclick:()=>Nn.set(null),get nodes(){return ys(),n()},set nodes(A){_s(qn,A)},get edges(){return ys(),o()},set edges(A){_s(Fn,A)},children:(A,V)=>{var M=a1(),O=oe(M);Eg(O,{position:"bottom-left"});var b=h(O,2);Bg(b,{position:"bottom-right"});var I=h(b,2);Dg(I,{get variant(){return kn.Dots},gap:24,size:1,color:"#2a2a3a"}),g(A,M)},$$slots:{default:!0}});var S=h(w,2);{var z=A=>{var V=o1(),M=d(V),O=d(M);Zc(O,{size:12});var b=h(O,4),I=d(b,!0);c(b),c(M);var H=h(M,4),B=d(H);Pa(B,{size:12});var X=h(B,4),N=d(X,!0);c(X),c(H);var E=h(H,4),C=d(E);Kn(C,{size:12});var _=h(C,4),T=d(_,!0);c(_),c(E);var D=h(E,4),R=d(D);Yc(R,{size:12});var F=h(R,4),q=d(F,!0);c(F),c(D),c(V),U(()=>{Y(I,a(u)),Y(N,a(v)),Y(T,a(p)),Y(q,a(m))}),g(A,V)};W(S,A=>{a(l)||A(z)})}var P=h(S,2);{var L=A=>{var V=r1(),M=d(V),O=d(M);vd(O,{size:40}),he(4),c(M),c(V),g(A,V)};W(P,A=>{a(l)&&A(L)})}c(f),g(t,f),Ne(),i()}var l1=x(''),c1=x(''),d1=x(''),u1=x(''),v1=x(""),f1=x(' ',1),p1=x(''),h1=x('
    ');function Ae(t,e){Ee(e,!0);let n=ue(e,"type",3,"text"),o=ue(e,"value",15,""),r=ue(e,"placeholder",3,""),i=ue(e,"options",19,()=>[]);const s=Math.random().toString(36).slice(2,8);let l=k(()=>`field-${(e.label??"input").replace(/\s+/g,"-").toLowerCase()}-${s}`),u=k(()=>`dl-${(e.label??"input").replace(/\s+/g,"-").toLowerCase()}-${s}`);function v(V){const M=V.target;M.style.height="auto",M.style.height=M.scrollHeight+"px"}var p=h1(),m=d(p),f=d(m,!0);c(m);var w=h(m,2);{var S=V=>{var M=l1();Rr(M),U(()=>{ze(M,"id",a(l)),ze(M,"placeholder",r())}),fe("input",M,v),Lt(M,o),g(V,M)},z=V=>{var M=c1();Nt(M),U(()=>{ze(M,"id",a(l)),ze(M,"placeholder",r())}),Lt(M,o),g(V,M)},P=V=>{var M=u1();Qe(M,21,i,Vt,(O,b)=>{var I=d1(),H=d(I,!0);c(I);var B={};U(()=>{Y(H,a(b)),B!==(B=a(b))&&(I.value=(I.__value=a(b))??"")}),g(O,I)}),c(M),U(()=>ze(M,"id",a(l))),za(M,o),g(V,M)},L=V=>{var M=f1(),O=oe(M);Nt(O);var b=h(O,2);Qe(b,21,i,Vt,(I,H)=>{var B=v1(),X={};U(()=>{X!==(X=a(H))&&(B.value=(B.__value=a(H))??"")}),g(I,B)}),c(b),U(()=>{ze(O,"id",a(l)),ze(O,"placeholder",r()),ze(O,"list",a(u)),ze(b,"id",a(u))}),Lt(O,o),g(V,M)},A=V=>{var M=p1();Nt(M),U(()=>{ze(M,"id",a(l)),ze(M,"placeholder",r())}),Lt(M,o),g(V,M)};W(w,V=>{n()==="textarea"?V(S):n()==="number"?V(z,1):n()==="select"?V(P,2):n()==="datalist"?V(L,3):V(A,!1)})}c(p),U(()=>{ze(m,"for",a(l)),Y(f,e.label)}),g(t,p),Ne()}Tt(["input"]);const Hl=[{id:"calculator",name:"Calculator",description:"Safe mathematical expression evaluator. Supports arithmetic, functions (sqrt, sin, cos, log, etc.), and constants (pi, e).",category:"Utility",tags:["math","calculator","utility"],parameters:[{name:"expression",type:"string",description:"Math expression to evaluate",required:!0}]},{id:"datetime",name:"Date & Time",description:"Current date/time information with timezone support.",category:"Utility",tags:["datetime","utility"],parameters:[{name:"action",type:"select",description:"What to retrieve",required:!0,options:["now","date","time","timestamp","timezones"]},{name:"timezone",type:"string",description:"IANA timezone (e.g. America/New_York)",required:!1,default:"UTC"},{name:"format",type:"string",description:"strftime format string",required:!1}]},{id:"filesystem",name:"File System",description:"Read, write, and list files. Sandboxed to a base directory with path-traversal protection.",category:"I/O",tags:["filesystem","io"],parameters:[{name:"action",type:"select",description:"File operation",required:!0,options:["read","write","list"]},{name:"path",type:"string",description:"File or directory path",required:!0},{name:"content",type:"string",description:"Content to write (for write action)",required:!1}]},{id:"http",name:"HTTP Client",description:"Make HTTP requests with connection pooling. Supports GET, POST, PUT, DELETE.",category:"Web",tags:["http","web"],parameters:[{name:"url",type:"string",description:"Target URL",required:!0},{name:"method",type:"select",description:"HTTP method",required:!1,default:"GET",options:["GET","POST","PUT","DELETE","PATCH"]},{name:"body",type:"string",description:"Request body (JSON)",required:!1},{name:"headers",type:"string",description:"Request headers (JSON)",required:!1}]},{id:"json",name:"JSON",description:"Parse, validate, extract, and format JSON data. Supports dot-path extraction.",category:"Utility",tags:["json","utility"],parameters:[{name:"action",type:"select",description:"JSON operation",required:!0,options:["parse","validate","extract","format","keys"]},{name:"data",type:"string",description:"JSON data to process",required:!0},{name:"path",type:"string",description:"Dot-path for extraction (e.g. address.city)",required:!1}]},{id:"text",name:"Text Processing",description:"Count, extract, truncate, replace, and split text using regex patterns.",category:"Utility",tags:["text","utility"],parameters:[{name:"action",type:"select",description:"Text operation",required:!0,options:["count","extract","truncate","replace","split"]},{name:"text",type:"string",description:"Input text",required:!0},{name:"pattern",type:"string",description:"Regex pattern (for extract/replace/split)",required:!1},{name:"replacement",type:"string",description:"Replacement string (for replace)",required:!1}]},{id:"shell",name:"Shell",description:"Execute shell commands from an explicit allowlist. Sandboxed for safety.",category:"System",tags:["shell","system"],parameters:[{name:"command",type:"string",description:"Command to execute (must be in allowlist)",required:!0}]},{id:"search",name:"Search",description:"Web search tool (abstract -- requires implementation of _search method).",category:"Web",tags:["search","web"],parameters:[{name:"query",type:"string",description:"Search query",required:!0}]},{id:"database",name:"Database",description:"Execute SQL queries (abstract -- requires implementation). Read-only by default with SQL injection detection.",category:"I/O",tags:["database","sql"],parameters:[{name:"query",type:"string",description:"SQL query (SELECT/WITH only in read-only mode)",required:!0},{name:"params",type:"string",description:"Query parameters (JSON)",required:!1}]}];function g1(t){return Hl.find(e=>e.id===t)}const Fl=[{id:"react",name:"ReAct",description:"Reason-Act-Observe loop. The agent thinks, takes an action (tool call), observes the result, and repeats until done.",defaultMaxSteps:10,bestFor:"Tasks requiring tool interaction and iterative problem-solving",configKeys:["max_steps"]},{id:"chain_of_thought",name:"Chain of Thought",description:"Step-by-step reasoning without actions. The agent breaks down the problem into logical steps and thinks through each one.",defaultMaxSteps:10,bestFor:"Pure logic, analysis, and reasoning tasks without tool needs",configKeys:["max_steps"]},{id:"plan_and_execute",name:"Plan & Execute",description:"Generates a multi-step plan first, then executes each step sequentially. Can replan on failure.",defaultMaxSteps:15,bestFor:"Complex multi-step tasks that benefit from upfront planning",configKeys:["max_steps","allow_replan"]},{id:"reflexion",name:"Reflexion",description:"Execute-Critique-Retry loop. Generates output, critiques it for quality, and retries with feedback if unsatisfactory.",defaultMaxSteps:5,bestFor:"Quality-sensitive outputs that benefit from self-review",configKeys:["max_steps"]},{id:"tree_of_thoughts",name:"Tree of Thoughts",description:"Generates multiple solution branches, evaluates each with a score, and selects the best. Explores the solution space broadly.",defaultMaxSteps:3,bestFor:"Creative and exploratory problems with multiple valid approaches",configKeys:["branching_factor","max_depth"]},{id:"goal_decomposition",name:"Goal Decomposition",description:"Breaks a large goal into phases and tasks, then executes each task. Can delegate sub-tasks to other patterns.",defaultMaxSteps:20,bestFor:"Large ambiguous goals that need structured decomposition",configKeys:["max_steps","task_pattern"]}];function m1(t){return Fl.find(e=>e.id===t)}var _1=x('

    Exposes an HTTP endpoint that triggers this pipeline when called.

    ',1),y1=x(" ",1),b1=x('

    Runs the pipeline on a schedule using standard cron syntax.

    ',1),x1=x(" ",1),w1=x('

    Manual trigger. Run the pipeline via the Run button or API call.

    '),k1=x(" ",1),z1=x(" ",1),S1=x(" ",1),C1=x('

    Returns the pipeline output as an API response.

    '),E1=x(" ",1),N1=x('
    Accepted file types
    Max file size
    Image detail
    '),P1=x('
    ',1),M1=x('
    '),T1=x('
    '),I1=x('

    '),A1=x('

    Custom tool. Define the tool name as registered in the framework tool registry.

    '),D1=x(" ",1),O1=x('

    '),R1=x(" ",1),L1=x('

    Routes flow based on a key in the pipeline context. Connect the True and False handles to different downstream nodes. Use configure_node to set branches as a JSON dict mapping values to paths.

    ',1),V1=x('

    Saves the current pipeline state/output to memory for later retrieval.

    '),H1=x('

    Loads previously saved state from memory and injects it into the pipeline context.

    '),F1=x('

    Wipes all stored memory. Use with caution.

    '),q1=x('

    Select an action: store saves data, retrieve loads it, clear wipes memory.

    '),B1=x('
    ',1),K1=x('

    Ensures the output is not empty, null, or blank.

    '),j1=x('

    Validates that the output is a string type.

    '),W1=x('

    Validates that the output is a list/array.

    '),Z1=x('

    Validates that the output is a dictionary/object.

    '),Y1=x('

    Custom validation rule. Define the rule key as registered in the framework.

    '),X1=x('

    Select a validation rule to apply to the pipeline output before passing downstream.

    '),G1=x('
    ',1),U1=x('

    Must define: async def execute(context, inputs) -> Any

    ',1),J1=x('

    Splits a single input into multiple items for parallel processing across downstream branches.

    ',1),Q1=x('

    Concatenates all branch results into a single string.

    '),$1=x('

    Collects all branch results into a list.

    '),e_=x('

    Merges results from parallel branches back into a single output.

    '),t_=x('
    ',1),n_=x(''),a_=x('
    Inputs
    '),o_=x(''),r_=x('
    Outputs
    '),s_=x('
    Connections
    '),i_=x('');function l_(t,e){Ee(e,!0);const n=()=>dt(mc,"$selectedNode",s),o=()=>dt(Fn,"$edges",s),r=()=>dt(qn,"$nodes",s),i=()=>dt(Nn,"$selectedNodeId",s),[s,l]=Xt(),u=[],v={input:bi,output:Vo,agent:Pa,tool:Kn,reasoning:xo,condition:xi,memory:Vr,validator:Fr,custom_code:qa,fan_out:qr,fan_in:Br},p={input:"#10b981",output:"#3b82f6",agent:"#6366f1",tool:"#8b5cf6",reasoning:"#ec4899",condition:"#06b6d4",memory:"#06b6d4",validator:"#f59e0b",custom_code:"#3b82f6",fan_out:"#8888a0",fan_in:"#8888a0"},m={input:"Input",output:"Output",agent:"Agent",tool:"Tool",reasoning:"Reasoning",condition:"Condition",memory:"Memory",validator:"Validator",custom_code:"Custom Code",fan_out:"Fan Out",fan_in:"Fan In"},f=Fl.map(ie=>ie.id),w=["custom",...Hl.map(ie=>ie.id)];let S=k(()=>m1(a(O))),z=k(()=>g1(a(Z))),P=G(""),L=G(""),A=G(""),V=G(""),M=G(""),O=G(""),b=G(""),I=G(""),H=G(""),B=G(""),X=G(""),N=G(""),E=G(""),C=G(""),_=G(""),T=G(""),D=G(""),R=G(""),F=G(""),q=G(""),K=G(""),Z=G(""),ee=G(""),J=G(""),ne=G(""),le=G(""),re=G("manual"),Q=G("response"),j=G("kafka"),$=G(""),de=G(""),ce=G(""),te=G("UTC"),ae=G("POST"),be=G(!1),se=G("*/*"),ge=G("50"),_e=G(""),pe=G("file"),ye=G(""),me=G(""),ve=G(!1),ke=G(!0),Ve=G(!1),Re=G(!1),Ye=G(10),Le=G("auto"),at=G(null),wt=!1,st=k(()=>n()?o().filter(ie=>ie.target===n().id):[]),ot=k(()=>n()?o().filter(ie=>ie.source===n().id):[]);function ut(ie){const Me=r().find(it=>it.id===ie);return Me?.data?.label||Me?.id||ie}xe(()=>{const ie=n();ie&&ie.id!==a(at)&&(wt=!0,y(at,ie.id,!0),un(()=>{y(P,ie.data.label??"",!0),y(L,ie.data.model??"",!0),y(A,ie.data.instructions??"",!0),y(V,ie.data.description??"",!0),y(M,ie.data.timeout!=null?String(ie.data.timeout):"",!0),y(O,ie.data.pattern??"",!0),y(b,ie.data.maxSteps!=null?String(ie.data.maxSteps):"",!0),y(I,ie.data.condition??"",!0),y(H,ie.data.backend??"",!0),y(B,ie.data.connection_string??"",!0),y(X,ie.data.namespace??"",!0),y(N,ie.data.schema_type??"",!0),y(E,ie.data.validation_rules??"",!0),y(C,ie.data.fail_action??"",!0),y(_,ie.data.code??"",!0),y(T,ie.data.strategy??"",!0),y(D,ie.data.max_concurrent!=null?String(ie.data.max_concurrent):"",!0),y(R,ie.data.merge_strategy??"",!0),y(F,ie.data.merge_timeout!=null?String(ie.data.merge_timeout):"",!0),y(q,ie.data.temperature!=null?String(ie.data.temperature):"",!0),y(K,ie.data.max_tokens!=null?String(ie.data.max_tokens):"",!0),y(Z,ie.data.tool_name??"",!0),y(ee,ie.data.memory_action??"",!0),y(J,ie.data.validation_rule??"",!0),y(ne,ie.data.split_expression??"",!0),y(le,ie.data.merge_expression??"",!0),y(re,ie.data.trigger_type??"manual",!0),y(Q,ie.data.destination_type??"response",!0),y(j,ie.data.queue_broker??"kafka",!0),y($,ie.data.queue_topic??"",!0),y(de,ie.data.queue_group_id??"",!0),y(ce,ie.data.cron_expression??"",!0),y(te,ie.data.cron_timezone??"UTC",!0),y(ae,ie.data.http_method??"POST",!0),y(be,ie.data.http_auth_required??!1,!0),y(se,ie.data.file_types??"*/*",!0),y(ge,ie.data.file_max_size_mb!=null?String(ie.data.file_max_size_mb):"50",!0),y(_e,ie.data.webhook_url??"",!0),y(pe,ie.data.store_type??"file",!0),y(ye,ie.data.store_path??"",!0),y(me,ie.data.schema_json??"",!0);const Me=ie.data.multimodal;y(ve,Me?.vision_enabled??!1,!0);const it=Me?.supported_file_types??["image/png","image/jpeg"];y(ke,it.some(Xe=>Xe.startsWith("image/")),!0),y(Ve,it.includes("application/pdf"),!0),y(Re,it.some(Xe=>Xe.includes("document")||Xe.includes("msword")),!0),y(Ye,Me?.max_file_size_mb??10,!0),y(Le,Me?.image_detail??"auto",!0)}),wt=!1),ie||y(at,null)});function Pe(ie,Me){wt||un(()=>{const it=i();if(!it)return;["timeout","maxSteps","max_concurrent","merge_timeout","temperature","max_tokens"].includes(ie)?nr(it,ie,Me===""?void 0:Number(Me)):nr(it,ie,Me)})}xe(()=>{Pe("label",a(P))}),xe(()=>{Pe("model",a(L))}),xe(()=>{Pe("instructions",a(A))}),xe(()=>{Pe("description",a(V))}),xe(()=>{Pe("timeout",a(M))}),xe(()=>{Pe("pattern",a(O))}),xe(()=>{Pe("maxSteps",a(b))}),xe(()=>{Pe("condition",a(I))}),xe(()=>{Pe("backend",a(H))}),xe(()=>{Pe("connection_string",a(B))}),xe(()=>{Pe("namespace",a(X))}),xe(()=>{Pe("schema_type",a(N))}),xe(()=>{Pe("validation_rules",a(E))}),xe(()=>{Pe("fail_action",a(C))}),xe(()=>{Pe("code",a(_))}),xe(()=>{Pe("strategy",a(T))}),xe(()=>{Pe("max_concurrent",a(D))}),xe(()=>{Pe("merge_strategy",a(R))}),xe(()=>{Pe("merge_timeout",a(F))}),xe(()=>{Pe("temperature",a(q))}),xe(()=>{Pe("max_tokens",a(K))}),xe(()=>{Pe("tool_name",a(Z))}),xe(()=>{Pe("memory_action",a(ee))}),xe(()=>{Pe("validation_rule",a(J))}),xe(()=>{Pe("split_expression",a(ne))}),xe(()=>{Pe("merge_expression",a(le))}),xe(()=>{Pe("trigger_type",a(re))}),xe(()=>{Pe("destination_type",a(Q))}),xe(()=>{Pe("queue_broker",a(j))}),xe(()=>{Pe("queue_topic",a($))}),xe(()=>{Pe("queue_group_id",a(de))}),xe(()=>{Pe("cron_expression",a(ce))}),xe(()=>{Pe("cron_timezone",a(te))}),xe(()=>{Pe("http_method",a(ae))}),xe(()=>{Pe("file_types",a(se))}),xe(()=>{Pe("file_max_size_mb",a(ge))}),xe(()=>{Pe("webhook_url",a(_e))}),xe(()=>{Pe("store_type",a(pe))}),xe(()=>{Pe("store_path",a(ye))}),xe(()=>{Pe("schema_json",a(me))}),xe(()=>{const ie=a(ve),Me=a(ke),it=a(Ve),Xe=a(Re),zt=a(Ye),Fe=a(Le);wt||un(()=>{const tt=i();if(!tt)return;const ct=r().find(Be=>Be.id===tt);if(!ct||ct.type!=="agent")return;const Et=[];Me&&Et.push("image/png","image/jpeg"),it&&Et.push("application/pdf"),Xe&&Et.push("application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document"),nr(tt,"multimodal",{vision_enabled:ie,supported_file_types:Et,max_file_size_mb:zt,image_detail:Fe})})});function Rt(){Nn.set(null)}function Ht(){const ie=n();if(!ie)return;const Me=ie.id;qn.update(it=>it.filter(Xe=>Xe.id!==Me)),Fn.update(it=>it.filter(Xe=>Xe.source!==Me&&Xe.target!==Me)),Nn.set(null)}function et(ie){Nn.set(ie)}var xt=Te(),He=oe(xt);{var vt=ie=>{const Me=k(n),it=k(()=>v[a(Me).type??""]??Pa),Xe=k(()=>p[a(Me).type??""]??"#ff6b35");var zt=i_(),Fe=d(zt),tt=d(Fe),ct=d(tt);let Et;var Be=d(ct);hn(Be,()=>a(it),(qe,Ke)=>{Ke(qe,{size:14})}),c(ct);var We=h(ct,2),yt=d(We),St=d(yt);c(yt);var Ct=h(yt,2),ft=d(Ct,!0);c(Ct),c(We),c(tt);var It=h(tt,2),jt=d(It);Lo(jt,{size:14}),c(It),c(Fe);var _a=h(Fe,2),In=d(_a),An=d(In);let Un;var ya=d(An,!0);c(An),c(In);var Jn=h(In,2),Xa=h(d(Jn),2),Xo=d(Xa);{var Wt=qe=>{var Ke=k1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Input node name",get value(){return a(P)},set value(we){y(P,we,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Trigger Type",type:"select",options:["manual","http","queue","schedule","file_upload"],get value(){return a(re)},set value(we){y(re,we,!0)}});var nt=h(rt,2);{var lt=we=>{var je=_1(),Ie=oe(je);Ae(Ie,{label:"HTTP Method",type:"select",options:["GET","POST","PUT","PATCH"],get value(){return a(ae)},set value(De){y(ae,De,!0)}}),he(2),g(we,je)},At=we=>{var je=y1(),Ie=oe(je);Ae(Ie,{label:"Broker",type:"select",options:["kafka","rabbitmq","redis"],get value(){return a(j)},set value(Ot){y(j,Ot,!0)}});var De=h(Ie,2);Ae(De,{label:"Topic / Queue",type:"text",placeholder:"pipeline-input",get value(){return a($)},set value(Ot){y($,Ot,!0)}});var Ge=h(De,2);Ae(Ge,{label:"Group ID",type:"text",placeholder:"studio-group",get value(){return a(de)},set value(Ot){y(de,Ot,!0)}}),g(we,je)},Dt=we=>{var je=b1(),Ie=oe(je);Ae(Ie,{label:"Cron Expression",type:"text",placeholder:"0 */6 * * *",get value(){return a(ce)},set value(Ge){y(ce,Ge,!0)}});var De=h(Ie,2);Ae(De,{label:"Timezone",type:"text",placeholder:"UTC",get value(){return a(te)},set value(Ge){y(te,Ge,!0)}}),he(2),g(we,je)},_t=we=>{var je=x1(),Ie=oe(je);Ae(Ie,{label:"Accepted Types",type:"text",placeholder:"application/pdf, text/csv",get value(){return a(se)},set value(Ge){y(se,Ge,!0)}});var De=h(Ie,2);Ae(De,{label:"Max Size (MB)",type:"number",placeholder:"50",get value(){return a(ge)},set value(Ge){y(ge,Ge,!0)}}),g(we,je)},Ze=we=>{var je=w1();g(we,je)};W(nt,we=>{a(re)==="http"?we(lt):a(re)==="queue"?we(At,1):a(re)==="schedule"?we(Dt,2):a(re)==="file_upload"?we(_t,3):we(Ze,!1)})}var Ce=h(nt,2);Ae(Ce,{label:"Input Schema (JSON)",type:"textarea",placeholder:'{"type": "object", "properties": {…}}',get value(){return a(me)},set value(we){y(me,we,!0)}}),g(qe,Ke)},ba=qe=>{var Ke=E1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Output node name",get value(){return a(P)},set value(Ce){y(P,Ce,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Destination",type:"select",options:["response","queue","webhook","store"],get value(){return a(Q)},set value(Ce){y(Q,Ce,!0)}});var nt=h(rt,2);{var lt=Ce=>{var we=z1(),je=oe(we);Ae(je,{label:"Broker",type:"select",options:["kafka","rabbitmq","redis"],get value(){return a(j)},set value(De){y(j,De,!0)}});var Ie=h(je,2);Ae(Ie,{label:"Topic / Queue",type:"text",placeholder:"pipeline-output",get value(){return a($)},set value(De){y($,De,!0)}}),g(Ce,we)},At=Ce=>{Ae(Ce,{label:"Webhook URL",type:"text",placeholder:"https://example.com/callback",get value(){return a(_e)},set value(we){y(_e,we,!0)}})},Dt=Ce=>{var we=S1(),je=oe(we);Ae(je,{label:"Storage Type",type:"select",options:["file","database"],get value(){return a(pe)},set value(De){y(pe,De,!0)}});var Ie=h(je,2);Ae(Ie,{label:"Path / Table",type:"text",placeholder:"/tmp/results.json",get value(){return a(ye)},set value(De){y(ye,De,!0)}}),g(Ce,we)},_t=Ce=>{var we=C1();g(Ce,we)};W(nt,Ce=>{a(Q)==="queue"?Ce(lt):a(Q)==="webhook"?Ce(At,1):a(Q)==="store"?Ce(Dt,2):Ce(_t,!1)})}var Ze=h(nt,2);Ae(Ze,{label:"Response Schema (JSON)",type:"textarea",placeholder:'{"type": "object", "properties": {…}}',get value(){return a(me)},set value(Ce){y(me,Ce,!0)}}),g(qe,Ke)},xa=qe=>{var Ke=P1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Agent name",get value(){return a(P)},set value(Ge){y(P,Ge,!0)}});var rt=h(Ue,2),nt=h(d(rt),2);Tc(nt,{placeholder:"Select model...",get value(){return a(L)},set value(Ge){y(L,Ge,!0)}}),c(rt);var lt=h(rt,2);Ae(lt,{label:"Instructions",type:"textarea",placeholder:"System instructions for this agent...",get value(){return a(A)},set value(Ge){y(A,Ge,!0)}});var At=h(lt,2);Ae(At,{label:"Description",type:"text",placeholder:"Agent description",get value(){return a(V)},set value(Ge){y(V,Ge,!0)}});var Dt=h(At,2);Ae(Dt,{label:"Temperature",type:"number",placeholder:"0.7",get value(){return a(q)},set value(Ge){y(q,Ge,!0)}});var _t=h(Dt,2);Ae(_t,{label:"Max Tokens",type:"number",placeholder:"4096",get value(){return a(K)},set value(Ge){y(K,Ge,!0)}});var Ze=h(_t,2),Ce=d(Ze),we=h(d(Ce),2);let je;c(Ce);var Ie=h(Ce,2);{var De=Ge=>{var Ot=N1(),$t=d(Ot),yn=h(d($t),2),ln=d(yn);Nt(ln),he(),c(yn);var Dn=h(yn,2),Ua=d(Dn);Nt(Ua),he(),c(Dn);var Qn=h(Dn,2),$n=d(Qn);Nt($n),he(),c(Qn),c($t);var On=h($t,2),Ja=h(d(On),2),ea=d(Ja);Nt(ea);var Qa=h(ea,2),tc=d(Qa);c(Qa),c(Ja),c(On);var hs=h(On,2),gs=h(d(hs),2),er=d(gs),$a=d(er);Nt($a),$a.value=$a.__value="auto",he(),c(er);var tr=h(er,2),eo=d(tr);Nt(eo),eo.value=eo.__value="low",he(),c(tr);var ms=h(tr,2),to=d(ms);Nt(to),to.value=to.__value="high",he(),c(ms),c(gs),c(hs),c(Ot),U(()=>Y(tc,`${a(Ye)??""} MB`)),ar(ln,()=>a(ke),Zt=>y(ke,Zt)),ar(Ua,()=>a(Ve),Zt=>y(Ve,Zt)),ar($n,()=>a(Re),Zt=>y(Re,Zt)),Lt(ea,()=>a(Ye),Zt=>y(Ye,Zt)),or(u,[],$a,()=>a(Le),Zt=>y(Le,Zt)),or(u,[],eo,()=>a(Le),Zt=>y(Le,Zt)),or(u,[],to,()=>a(Le),Zt=>y(Le,Zt)),g(Ge,Ot)};W(Ie,Ge=>{a(ve)&&Ge(De)})}c(Ze),U(()=>je=Oe(we,1,"mm-toggle-switch svelte-16rdffs",null,je,{"mm-on":a(ve)})),fe("click",Ce,()=>y(ve,!a(ve))),g(qe,Ke)},Go=qe=>{var Ke=D1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Tool label on canvas",get value(){return a(P)},set value(Ze){y(P,Ze,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Tool Type",type:"select",get options(){return w},get value(){return a(Z)},set value(Ze){y(Z,Ze,!0)}});var nt=h(rt,2);{var lt=Ze=>{var Ce=I1(),we=d(Ce),je=d(we);wi(je,{size:11});var Ie=h(je,2),De=d(Ie,!0);c(Ie),c(we);var Ge=h(we,2),Ot=d(Ge,!0);c(Ge);var $t=h(Ge,2);{var yn=ln=>{var Dn=T1();Qe(Dn,21,()=>a(z).parameters,Vt,(Ua,Qn)=>{var $n=M1(),On=d($n),Ja=d(On,!0);c(On);var ea=h(On,2),Qa=d(ea);c(ea),c($n),U(()=>{Y(Ja,a(Qn).name),Y(Qa,`${a(Qn).type??""}${a(Qn).required?"":"?"}`)}),g(Ua,$n)}),c(Dn),g(ln,Dn)};W($t,ln=>{a(z).parameters.length>0&&ln(yn)})}c(Ce),U(()=>{Y(De,a(z).name),Y(Ot,a(z).description)}),g(Ze,Ce)},At=Ze=>{var Ce=A1();g(Ze,Ce)};W(nt,Ze=>{a(z)?Ze(lt):a(Z)==="custom"&&Ze(At,1)})}var Dt=h(nt,2);Ae(Dt,{label:"Description",type:"textarea",placeholder:"What this tool does",get value(){return a(V)},set value(Ze){y(V,Ze,!0)}});var _t=h(Dt,2);Ae(_t,{label:"Timeout (seconds)",type:"number",placeholder:"30",get value(){return a(M)},set value(Ze){y(M,Ze,!0)}}),g(qe,Ke)},Ga=qe=>{var Ke=R1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Reasoning name",get value(){return a(P)},set value(_t){y(P,_t,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Pattern",type:"select",get options(){return f},get value(){return a(O)},set value(_t){y(O,_t,!0)}});var nt=h(rt,2);{var lt=_t=>{var Ze=O1(),Ce=d(Ze),we=d(Ce);xo(we,{size:11});var je=h(we,2),Ie=d(je,!0);c(je),c(Ce);var De=h(Ce,2),Ge=d(De,!0);c(De);var Ot=h(De,2),$t=d(Ot);c(Ot),c(Ze),U(()=>{Y(Ie,a(S).name),Y(Ge,a(S).description),Y($t,`Best for: ${a(S).bestFor??""}`)}),g(_t,Ze)};W(nt,_t=>{a(S)&&_t(lt)})}var At=h(nt,2);{let _t=k(()=>a(S)?String(a(S).defaultMaxSteps):"10");Ae(At,{label:"Max Steps",type:"number",get placeholder(){return a(_t)},get value(){return a(b)},set value(Ze){y(b,Ze,!0)}})}var Dt=h(At,2);Ae(Dt,{label:"Description",type:"text",placeholder:"Reasoning strategy description",get value(){return a(V)},set value(_t){y(V,_t,!0)}}),g(qe,Ke)},Uo=qe=>{var Ke=L1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Condition name",get value(){return a(P)},set value(nt){y(P,nt,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Condition Key",type:"text",placeholder:"e.g. document_type, status",get value(){return a(I)},set value(nt){y(I,nt,!0)}}),he(2),g(qe,Ke)},Wl=qe=>{var Ke=B1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Memory name",get value(){return a(P)},set value(we){y(P,we,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Action",type:"select",options:["store","retrieve","clear"],get value(){return a(ee)},set value(we){y(ee,we,!0)}});var nt=h(rt,2),lt=d(nt);{var At=we=>{var je=V1();g(we,je)},Dt=we=>{var je=H1();g(we,je)},_t=we=>{var je=F1();g(we,je)},Ze=we=>{var je=q1();g(we,je)};W(lt,we=>{a(ee)==="store"?we(At):a(ee)==="retrieve"?we(Dt,1):a(ee)==="clear"?we(_t,2):we(Ze,!1)})}c(nt);var Ce=h(nt,2);Ae(Ce,{label:"Namespace",type:"text",placeholder:"default",get value(){return a(X)},set value(we){y(X,we,!0)}}),g(qe,Ke)},Zl=qe=>{var Ke=G1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Validator name",get value(){return a(P)},set value(Ie){y(P,Ie,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Validation Rule",type:"select",options:["not_empty","is_string","is_list","is_dict","custom"],get value(){return a(J)},set value(Ie){y(J,Ie,!0)}});var nt=h(rt,2),lt=d(nt);{var At=Ie=>{var De=K1();g(Ie,De)},Dt=Ie=>{var De=j1();g(Ie,De)},_t=Ie=>{var De=W1();g(Ie,De)},Ze=Ie=>{var De=Z1();g(Ie,De)},Ce=Ie=>{var De=Y1();g(Ie,De)},we=Ie=>{var De=X1();g(Ie,De)};W(lt,Ie=>{a(J)==="not_empty"?Ie(At):a(J)==="is_string"?Ie(Dt,1):a(J)==="is_list"?Ie(_t,2):a(J)==="is_dict"?Ie(Ze,3):a(J)==="custom"?Ie(Ce,4):Ie(we,!1)})}c(nt);var je=h(nt,2);Ae(je,{label:"On Failure",type:"select",options:["reject","retry","fallback","log"],get value(){return a(C)},set value(Ie){y(C,Ie,!0)}}),g(qe,Ke)},Yl=qe=>{var Ke=U1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Code block name",get value(){return a(P)},set value(lt){y(P,lt,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Description",type:"text",placeholder:"What this code does",get value(){return a(V)},set value(lt){y(V,lt,!0)}});var nt=h(rt,2);Ae(nt,{label:"Python Code",type:"textarea",placeholder:"async def execute(context, inputs): return inputs",get value(){return a(_)},set value(lt){y(_,lt,!0)}}),he(2),g(qe,Ke)},Xl=qe=>{var Ke=J1(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Fan Out name",get value(){return a(P)},set value(lt){y(P,lt,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Split Expression",type:"text",placeholder:"How to split input for parallel branches",get value(){return a(ne)},set value(lt){y(ne,lt,!0)}});var nt=h(rt,2);Ae(nt,{label:"Max Concurrent",type:"number",placeholder:"10",get value(){return a(D)},set value(lt){y(D,lt,!0)}}),he(2),g(qe,Ke)},Gl=qe=>{var Ke=t_(),Ue=oe(Ke);Ae(Ue,{label:"Name",type:"text",placeholder:"Fan In name",get value(){return a(P)},set value(Ce){y(P,Ce,!0)}});var rt=h(Ue,2);Ae(rt,{label:"Merge Expression",type:"select",options:["concat","collect"],get value(){return a(le)},set value(Ce){y(le,Ce,!0)}});var nt=h(rt,2);Ae(nt,{label:"Timeout (seconds)",type:"number",placeholder:"30",get value(){return a(F)},set value(Ce){y(F,Ce,!0)}});var lt=h(nt,2),At=d(lt);{var Dt=Ce=>{var we=Q1();g(Ce,we)},_t=Ce=>{var we=$1();g(Ce,we)},Ze=Ce=>{var we=e_();g(Ce,we)};W(At,Ce=>{a(le)==="concat"?Ce(Dt):a(le)==="collect"?Ce(_t,1):Ce(Ze,!1)})}c(lt),g(qe,Ke)},Ul=qe=>{Ae(qe,{label:"Name",type:"text",placeholder:"Node name",get value(){return a(P)},set value(Ke){y(P,Ke,!0)}})};W(Xo,qe=>{a(Me).type==="input"?qe(Wt):a(Me).type==="output"?qe(ba,1):a(Me).type==="agent"?qe(xa,2):a(Me).type==="tool"?qe(Go,3):a(Me).type==="reasoning"?qe(Ga,4):a(Me).type==="condition"?qe(Uo,5):a(Me).type==="memory"?qe(Wl,6):a(Me).type==="validator"?qe(Zl,7):a(Me).type==="custom_code"?qe(Yl,8):a(Me).type==="fan_out"?qe(Xl,9):a(Me).type==="fan_in"?qe(Gl,10):qe(Ul,!1)})}c(Xa),c(Jn);var us=h(Jn,2);{var Jl=qe=>{var Ke=s_(),Ue=d(Ke),rt=d(Ue);Ic(rt,{size:12}),he(),c(Ue);var nt=h(Ue,2),lt=d(nt);{var At=Ze=>{var Ce=a_(),we=h(d(Ce),2);Qe(we,17,()=>a(st),Vt,(je,Ie)=>{var De=n_(),Ge=d(De),Ot=d(Ge,!0);c(Ge);var $t=h(Ge,2);zs($t,{size:10}),he(2),c(De),U((yn,ln)=>{ze(De,"title",`Select ${yn??""}`),Y(Ot,ln)},[()=>ut(a(Ie).source),()=>ut(a(Ie).source)]),fe("click",De,()=>et(a(Ie).source)),g(je,De)}),c(Ce),g(Ze,Ce)};W(lt,Ze=>{a(st).length>0&&Ze(At)})}var Dt=h(lt,2);{var _t=Ze=>{var Ce=r_(),we=h(d(Ce),2);Qe(we,17,()=>a(ot),Vt,(je,Ie)=>{var De=o_(),Ge=h(d(De),2);zs(Ge,{size:10});var Ot=h(Ge,2),$t=d(Ot,!0);c(Ot),c(De),U((yn,ln)=>{ze(De,"title",`Select ${yn??""}`),Y($t,ln)},[()=>ut(a(Ie).target),()=>ut(a(Ie).target)]),fe("click",De,()=>et(a(Ie).target)),g(je,De)}),c(Ce),g(Ze,Ce)};W(Dt,Ze=>{a(ot).length>0&&Ze(_t)})}c(nt),c(Ke),g(qe,Ke)};W(us,qe=>{(a(st).length>0||a(ot).length>0)&&qe(Jl)})}var Jo=h(us,2),vs=h(d(Jo),2),Qo=d(vs),Ql=d(Qo);c(Qo);var fs=h(Qo,2),$l=d(fs);c(fs),c(vs),c(Jo);var ps=h(Jo,2),$o=d(ps),ec=d($o);Bn(ec,{size:13}),he(2),c($o),c(ps),c(_a),c(zt),U((qe,Ke)=>{Et=pt(ct,"",Et,{"--node-color":a(Xe)}),Y(St,`${m[a(Me).type??""]??"Node"??""} Properties`),Y(ft,a(Me).id),Un=pt(An,"",Un,{"--badge-color":a(Xe)}),Y(ya,m[a(Me).type??""]??a(Me).type),Y(Ql,`X: ${qe??""}`),Y($l,`Y: ${Ke??""}`)},[()=>Math.round(a(Me).position.x),()=>Math.round(a(Me).position.y)]),fe("click",It,Rt),fe("click",$o,Ht),g(ie,zt)};W(He,ie=>{n()&&ie(vt)})}g(t,xt),Ne(),l()}Tt(["click"]);var c_=x(""),d_=x(''),u_=x(''),v_=x('
    Pipeline I/O
    Processing
    '),f_=x('');function p_(t,e){Ee(e,!0);const n=()=>dt(Nn,"$selectedNodeId",o),[o,r]=Xt();let i=G(320),s=G(!1),l=G(0),u=G(0);function v(C){C.preventDefault(),y(s,!0),y(l,C.clientX,!0),y(u,a(i),!0),document.addEventListener("mousemove",p),document.addEventListener("mouseup",m)}function p(C){a(s)&&y(i,Math.max(240,Math.min(480,a(u)+(a(l)-C.clientX))),!0)}function m(){y(s,!1),document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",m)}ga(()=>{document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",m)});const f=[{type:"input",label:"Input",icon:td,color:"#22c55e",group:"io",description:"Pipeline entry point. Triggers: manual, HTTP, queue, schedule, file upload."},{type:"output",label:"Output",icon:nd,color:"#ef4444",group:"io",description:"Pipeline exit point. Destinations: response, queue, webhook, storage."},{type:"agent",label:"Agent",icon:Pa,color:"#6366f1",description:"An AI agent powered by an LLM. Configure model, instructions, and personality."},{type:"tool",label:"Tool",icon:Kn,color:"#8b5cf6",description:"A registered tool the agent can use: search, calculator, HTTP, database, etc."},{type:"reasoning",label:"Reasoning",icon:xo,color:"#ec4899",description:"A reasoning pattern: ReAct, Chain of Thought, Plan and Execute, Reflexion, etc."},{type:"condition",label:"Condition",icon:xi,color:"#f59e0b",description:"Routes the pipeline based on a condition. Define branches for different paths."},{type:"memory",label:"Memory",icon:Vr,color:"#06b6d4",description:"Store, retrieve, or clear data in the pipeline memory system."},{type:"validator",label:"Validator",icon:Fr,color:"#f59e0b",description:"Validates pipeline output: check for empty, type, or custom rules."},{type:"custom_code",label:"Code",icon:qa,color:"#3b82f6",description:"Run custom Python code. Define an async execute function."},{type:"fan_out",label:"Fan Out",icon:qr,color:"#64748b",description:"Split input into parallel branches for concurrent processing."},{type:"fan_in",label:"Fan In",icon:Br,color:"#64748b",description:"Merge results from parallel branches back into a single flow."}];function w(C){const _=parseInt(C.slice(1,3),16),T=parseInt(C.slice(3,5),16),D=parseInt(C.slice(5,7),16);return`rgba(${_}, ${T}, ${D}, 0.15)`}let S=k(()=>n()?"properties":"components");var z=f_();let P,L;var A=d(z),V=h(A,2),M=d(V);let O;var b=d(M);_c(b,{size:12}),he(2),c(M);var I=h(M,2);{var H=C=>{var _=c_();let T;var D=d(_);Ac(D,{size:12}),he(2),c(_),U(()=>T=Oe(_,1,"panel-tab-btn svelte-1ecj58j",null,T,{active:a(S)==="properties"})),fe("click",_,()=>{}),g(C,_)};W(I,C=>{n()&&C(H)})}c(V);var B=h(V,2),X=d(B);{var N=C=>{l_(C,{})},E=C=>{var _=v_(),T=h(d(_),2);Qe(T,17,()=>f.filter(R=>R.group==="io"),Vt,(R,F)=>{ws(R,{get text(){return a(F).label},get description(){return a(F).description},position:"left",delay:300,children:(q,K)=>{var Z=d_(),ee=d(Z);let J;var ne=d(ee);hn(ne,()=>a(F).icon,(Q,j)=>{j(Q,{size:14})}),c(ee);var le=h(ee,2),re=d(le,!0);c(le),c(Z),U(Q=>{J=pt(ee,"",J,Q),Y(re,a(F).label)},[()=>({background:w(a(F).color),color:a(F).color})]),fe("click",Z,()=>bs(a(F).type,a(F).label)),g(q,Z)},$$slots:{default:!0}})});var D=h(T,4);Qe(D,17,()=>f.filter(R=>!R.group),Vt,(R,F)=>{ws(R,{get text(){return a(F).label},get description(){return a(F).description},position:"left",delay:300,children:(q,K)=>{var Z=u_(),ee=d(Z);let J;var ne=d(ee);hn(ne,()=>a(F).icon,(Q,j)=>{j(Q,{size:14})}),c(ee);var le=h(ee,2),re=d(le,!0);c(le),c(Z),U(Q=>{J=pt(ee,"",J,Q),Y(re,a(F).label)},[()=>({background:w(a(F).color),color:a(F).color})]),fe("click",Z,()=>bs(a(F).type,a(F).label)),g(q,Z)},$$slots:{default:!0}})}),c(_),g(C,_)};W(X,C=>{a(S)==="properties"&&n()?C(N):C(E,!1)})}c(B),c(z),U(()=>{P=Oe(z,1,"component-panel svelte-1ecj58j",null,P,{dragging:a(s)}),L=pt(z,"",L,{width:`${a(i)??""}px`}),O=Oe(M,1,"panel-tab-btn svelte-1ecj58j",null,O,{active:a(S)==="components"})}),fe("mousedown",A,v),fe("click",M,()=>{n()&&Nn.set(null)}),g(t,z),Ne(),r()}Tt(["mousedown","click"]);var h_=x('
    No execution events yet. Run your pipeline to see logs here.
    '),g_=x(' '),m_=x(' '),__=x(' '),y_=x('
    '),b_=x('
    ');function x_(t,e){Ee(e,!0);const n=()=>dt(_r,"$executionEvents",o),[o,r]=Xt();let i=G(void 0),s=G(0);xe(()=>{const b=n();b.length>a(s)&&a(i)&&requestAnimationFrame(()=>{a(i)&&(a(i).scrollTop=a(i).scrollHeight)}),y(s,b.length,!0)});function l(){_r.set([])}function u(b){const I=new Date(b),H=String(I.getHours()).padStart(2,"0"),B=String(I.getMinutes()).padStart(2,"0"),X=String(I.getSeconds()).padStart(2,"0"),N=String(I.getMilliseconds()).padStart(3,"0");return`${H}:${B}:${X}.${N}`}function v(b){switch(b){case"node_start":return"badge-info";case"node_complete":case"pipeline_complete":case"pipeline_result":return"badge-success";case"node_error":return"badge-error";case"node_skip":return"badge-warning";default:return""}}function p(b){switch(b){case"node_start":return"START";case"node_complete":return"DONE";case"node_error":return"ERROR";case"node_skip":return"SKIP";case"pipeline_complete":return"COMPLETE";case"pipeline_result":return"RESULT";default:return b}}function m(b){return b.type==="node_complete"&&b.latency_ms!=null?`${b.latency_ms}ms`:b.type==="node_error"&&b.error?b.error:b.type==="pipeline_complete"&&b.duration_ms!=null?`Total: ${b.duration_ms}ms`:""}var f=b_(),w=d(f),S=d(w),z=d(S);c(S);var P=h(S,2),L=d(P);Bn(L,{size:13}),c(P),c(w);var A=h(w,2),V=d(A);{var M=b=>{var I=h_();g(b,I)},O=b=>{var I=Te(),H=oe(I);Qe(H,1,n,Vt,(B,X)=>{const N=k(()=>m(a(X)));var E=y_(),C=d(E),_=d(C,!0);c(C);var T=h(C,2),D=d(T,!0);c(T);var R=h(T,2);{var F=J=>{var ne=g_(),le=d(ne,!0);c(ne),U(()=>Y(le,a(X).node_id)),g(J,ne)};W(R,J=>{a(X).node_id&&J(F)})}var q=h(R,2);{var K=J=>{var ne=m_(),le=d(ne,!0);c(ne),U(()=>Y(le,a(X).pipeline_name)),g(J,ne)};W(q,J=>{a(X).pipeline_name&&J(K)})}var Z=h(q,2);{var ee=J=>{var ne=__(),le=d(ne,!0);c(ne),U(()=>Y(le,a(N))),g(J,ne)};W(Z,J=>{a(N)&&J(ee)})}c(E),U((J,ne,le)=>{Y(_,J),Oe(T,1,`log-badge ${ne??""}`,"svelte-dlnc6c"),Y(D,le)},[()=>u(a(X).timestamp??""),()=>v(a(X).type),()=>p(a(X).type)]),g(B,E)}),g(b,I)};W(V,b=>{n().length===0?b(M):b(O,!1)})}c(A),mn(A,b=>y(i,b),()=>a(i)),c(f),U(()=>Y(z,`${n().length??""} events`)),fe("click",P,l),g(t,f),Ne(),r()}Tt(["click"]);const Ln=Fa([]),Na=Fa(""),vn=Fa(!1),gr=Fa(!1),ls=Fa(null);let Bt=null,mo=null,_o=0;const w_=5;let cs=!1;function k_(){return`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws/smith`}function z_(){if(cs||_o>=w_)return;_o++;const t=Math.min(1e3*Math.pow(2,_o-1),1e4);mo=setTimeout(()=>{ql()},t)}function ql(){if(!(Bt&&(Bt.readyState===WebSocket.OPEN||Bt.readyState===WebSocket.CONNECTING))){cs=!1;try{Bt=new WebSocket(k_())}catch{return}Bt.onopen=()=>{_o=0,gr.set(!0),Bl(),N_()},Bt.onclose=()=>{gr.set(!1),vn.set(!1),ds(),Bt=null,z_()},Bt.onerror=()=>{gr.set(!1)},Bt.onmessage=t=>{try{const e=JSON.parse(t.data);S_(e)}catch{}}}}function S_(t){const e=t.type;if(e==="smith_token"){const n=t.content??t.token??"";Ln.update(o=>{const r=o[o.length-1];return r&&r.role==="assistant"&&!t.complete?[...o.slice(0,-1),{...r,content:r.content+n}]:[...o,{role:"assistant",content:n,timestamp:new Date().toISOString()}]})}else if(e==="smith_response_complete"){vn.set(!1),t.code&&Na.set(t.code);const n=t.full_text??t.content??"";n&&!t.code&&Ln.update(o=>{const r=o[o.length-1];return r&&r.role==="assistant"?[...o.slice(0,-1),{...r,content:n}]:[...o,{role:"assistant",content:n,timestamp:new Date().toISOString()}]})}else if(e==="code_generated")Na.set(t.code),vn.set(!1);else if(e==="approval_required")ls.set({commandId:t.command_id,command:t.command,level:t.level});else if(e==="execution_result"){const n=t.stdout||"",o=t.stderr||"",r=t.return_code??0;let i=n;o&&(i+=(i?` -`:"")+`[stderr] ${o}`),r!==0&&(i+=` -[exit code: ${r}]`),Ln.update(s=>[...s,{role:"assistant",content:i||"(no output)",timestamp:new Date().toISOString()}]),vn.set(!1)}else if(e==="tool_call"){const n={name:t.tool??t.name??"unknown",args:typeof t.args=="string"?t.args:JSON.stringify(t.args||{}),result:typeof t.result=="string"?t.result:JSON.stringify(t.result||"")};Ln.update(o=>{const r=o[o.length-1];if(r&&r.role==="assistant"){const i=[...r.toolCalls||[],n];return[...o.slice(0,-1),{...r,toolCalls:i}]}return[...o,{role:"assistant",content:"",timestamp:new Date().toISOString(),toolCalls:[n]}]})}else e==="canvas_synced"||e==="error"&&(vn.set(!1),Ln.update(n=>[...n,{role:"assistant",content:`Error: ${t.message}`,timestamp:new Date().toISOString()}]))}function Xn(t,e={}){!Bt||Bt.readyState!==WebSocket.OPEN||Bt.send(JSON.stringify({action:t,...e}))}function Bl(t){if(t){Xn("sync_canvas",t);return}const e=na(qn),n=na(Fn);Xn("sync_canvas",{nodes:e.map(o=>({id:o.id,type:o.type,data:o.data,position:o.position})),edges:n.map(o=>({id:o.id,source:o.source,target:o.target}))})}function C_(t){vn.set(!0),t?Xn("generate",{graph:t}):Xn("generate")}function E_(t){vn.set(!0),Xn("execute",{code:t})}let ia=null,yo=null;function N_(){ds(),yo=gc([qn,Fn],([e,n])=>({nodes:e,edges:n})).subscribe(({nodes:e,edges:n})=>{ia&&clearTimeout(ia),ia=setTimeout(()=>{Bl({nodes:e.map(o=>({id:o.id,type:o.type,data:o.data,position:o.position})),edges:n.map(o=>({id:o.id,source:o.source,target:o.target}))})},500)})}function ds(){yo&&(yo(),yo=null),ia&&(clearTimeout(ia),ia=null)}function P_(t){Ln.update(e=>[...e,{role:"user",content:t,timestamp:new Date().toISOString()}]),vn.set(!0),Xn("chat",{message:t})}function ui(t,e){Xn("approve_command",{command_id:t,approved:e}),ls.set(null),e&&vn.set(!0)}function M_(){cs=!0,ds(),mo&&(clearTimeout(mo),mo=null),Bt?.close(),Bt=null}var T_=x('
    ');function Kl(t,e){Ee(e,!0);let n=ue(e,"accentColor",3,"#6366f1"),o=ue(e,"messages",19,()=>["Thinking..."]),r=G(0);xe(()=>{const u=setInterval(()=>{y(r,(a(r)+1)%o().length)},3e3);return()=>clearInterval(u)});var i=T_(),s=h(d(i),2),l=d(s,!0);c(s),c(i),U(()=>{pt(i,`--accent: ${n()??""}`),Y(l,o()[a(r)])}),g(t,i),Ne()}var I_=x(' '),A_=x('You'),D_=x(' '),O_=x('
    ');function jl(t,e){let n=ue(e,"agentName",3,""),o=ue(e,"accentColor",3,"#6366f1"),r=ue(e,"timestamp",3,"");var i=O_(),s=d(i),l=d(s);{var u=S=>{var z=I_(),P=d(z,!0);c(z),U(()=>Y(P,n())),g(S,z)},v=S=>{var z=A_();g(S,z)};W(l,S=>{e.role==="assistant"&&n()?S(u):S(v,!1)})}var p=h(l,2);{var m=S=>{var z=D_(),P=d(z,!0);c(z),U(()=>Y(P,r())),g(S,z)};W(p,S=>{r()&&S(m)})}c(s);var f=h(s,2),w=d(f);Dc(w,()=>e.content),c(f),c(i),U(()=>{Oe(i,1,`message ${e.role??""}`,"svelte-1g5mx7p"),pt(i,`--accent: ${o()??""}`)}),g(t,i)}var R_=x('
    Args
     
    '),L_=x('
    Result
     
    '),V_=x('
    '),H_=x('
    ');function F_(t,e){let n=ue(e,"args",3,""),o=ue(e,"result",3,""),r=ue(e,"accentColor",3,"#6366f1"),i=G(!1);var s=H_(),l=d(s),u=d(l);Kn(u,{size:14,style:"color: var(--accent)"});var v=h(u,2),p=d(v,!0);c(v);var m=h(v,2);{var f=P=>{la(P,{size:14})},w=P=>{Ta(P,{size:14})};W(m,P=>{a(i)?P(f):P(w,!1)})}c(l);var S=h(l,2);{var z=P=>{var L=V_(),A=d(L);{var V=b=>{var I=R_(),H=h(d(I),2),B=d(H,!0);c(H),c(I),U(()=>Y(B,n())),g(b,I)};W(A,b=>{n()&&b(V)})}var M=h(A,2);{var O=b=>{var I=L_(),H=h(d(I),2),B=d(H,!0);c(H),c(I),U(()=>Y(B,o())),g(b,I)};W(M,b=>{o()&&b(O)})}c(L),g(P,L)};W(S,P=>{a(i)&&P(z)})}c(s),U(()=>{pt(s,`--accent: ${r()??""}`),Y(p,e.toolName)}),fe("click",l,()=>y(i,!a(i))),g(t,s)}Tt(["click"]);var q_=x('');function B_(t,e){var n=q_(),o=d(n),r=d(o),i=d(r);id(i,{size:20,color:"#f59e0b"}),he(2),c(r);var s=h(r,2),l=h(d(s)),u=d(l,!0);c(l),he(),c(s);var v=h(s,2),p=d(v,!0);c(v);var m=h(v,2),f=d(m),w=d(f);Lo(w,{size:16}),he(),c(f);var S=h(f,2),z=d(S);Ia(z,{size:16}),he(),c(S),c(m),c(o),c(n),U(()=>{Y(u,e.level),Y(p,e.command)}),fe("click",n,function(...P){e.onDeny?.apply(this,P)}),fe("click",o,P=>P.stopPropagation()),fe("click",f,function(...P){e.onDeny?.apply(this,P)}),fe("click",S,function(...P){e.onApprove?.apply(this,P)}),g(t,n)}Tt(["click"]);var K_=x('Copied!'),j_=x('
    Smith is generating code...
    '),W_=x('
     
    '),Z_=x('
    '),Y_=x(" ",1),X_=x('
    Smith
    ',1);function G_(t,e){Ee(e,!0);const n=()=>dt(Ln,"$smithMessages",s),o=()=>dt(vn,"$smithIsThinking",s),r=()=>dt(Na,"$smithCode",s),i=()=>dt(ls,"$pendingCommand",s),[s,l]=Xt();let u=G(""),v,p=G(!1);gi(()=>{ql()}),ga(()=>{M_()});function m(){const j=na(Na);j&&(navigator.clipboard.writeText(j),y(p,!0),setTimeout(()=>y(p,!1),2e3))}function f(){const j={nodes:na(qn).map($=>({id:$.id,type:$.type,data:$.data,position:$.position})),edges:na(Fn).map($=>({id:$.id,source:$.source,target:$.target}))};C_(j)}function w(){const j=na(Na);j&&E_(j)}function S(){const j=a(u).trim();j&&(y(u,""),P_(j))}function z(j){j.key==="Enter"&&!j.shiftKey&&(j.preventDefault(),S())}xe(()=>{n(),o(),v&&requestAnimationFrame(()=>{v.scrollTop=v.scrollHeight})});var P=X_(),L=oe(P),A=d(L),V=h(d(A),2),M=d(V),O=d(M);ki(O,{size:14});var b=h(O,2);{var I=j=>{var $=K_();g(j,$)};W(b,j=>{a(p)&&j(I)})}c(M);var H=h(M,2),B=d(H);zi(B,{size:14}),c(H);var X=h(H,2),N=d(X);Pt(N,{size:14}),c(X),c(V),c(A);var E=h(A,2),C=d(E);{var _=j=>{var $=j_(),de=d($);mi(de,{size:20,class:"smith-spinner"}),he(2),c($),g(j,$)},T=j=>{var $=W_(),de=d($),ce=d(de,!0);c(de),c($),U(()=>Y(ce,r())),g(j,$)},D=j=>{var $=Z_(),de=d($);de.textContent=`// Generate code from your pipeline... -// Click Refresh or ask Smith to generate.`,c($),g(j,$)};W(C,j=>{o()&&!r()?j(_):r()?j(T,1):j(D,!1)})}c(E);var R=h(E,2),F=d(R),q=d(F);Qe(q,1,n,Vt,(j,$)=>{var de=Y_(),ce=oe(de);jl(ce,{get role(){return a($).role},get content(){return a($).content},agentName:"Smith",accentColor:"#22c55e"});var te=h(ce,2);{var ae=be=>{var se=Te(),ge=oe(se);Qe(ge,17,()=>a($).toolCalls,Vt,(_e,pe)=>{F_(_e,{get toolName(){return a(pe).name},get args(){return a(pe).args},get result(){return a(pe).result},accentColor:"#22c55e"})}),g(be,se)};W(te,be=>{a($).toolCalls&&be(ae)})}g(j,de)});var K=h(q,2);{var Z=j=>{Kl(j,{accentColor:"#22c55e",messages:["Compiling...","It is... inevitable.","Analyzing the construct...","Making it real..."]})};W(K,j=>{o()&&j(Z)})}c(F),mn(F,j=>v=j,()=>v);var ee=h(F,2),J=d(ee);Nt(J);var ne=h(J,2),le=d(ne);Ii(le,{size:14}),c(ne),c(ee),c(R),c(L);var re=h(L,2);{var Q=j=>{const $=k(()=>i().commandId);B_(j,{get command(){return i().command},get level(){return i().level},onApprove:()=>ui(a($),!0),onDeny:()=>ui(a($),!1)})};W(re,j=>{i()&&j(Q)})}U(j=>ne.disabled=j,[()=>!a(u).trim()]),fe("click",M,m),fe("click",H,w),fe("click",X,f),fe("keydown",J,z),Lt(J,()=>a(u),j=>y(u,j)),fe("click",ne,S),g(t,P),Ne(),l()}Tt(["click","keydown"]);var U_=x('
    Run your pipeline to see the execution timeline
    '),J_=x(''),Q_=x(''),$_=x('Shift+click another checkpoint to compare'),e0=x('
    '),t0=x(' '),n0=x('
    Added
    '),a0=x(' '),o0=x('
    Removed
    '),r0=x(' '),s0=x('
    Changed
    '),i0=x('No differences'),l0=x('
    '),c0=x(' '),d0=x('
    '),u0=x('
    '),v0=x('empty'),f0=x('
    '),p0=x('
    '),h0=x('empty'),g0=x('
    '),m0=x('
    '),_0=x('
    Timeline
    ',1),y0=x('
    ');function b0(t,e){Ee(e,!0);const n=()=>dt(Rn,"$checkpoints",o),[o,r]=Xt();let i=G(null),s=G(null),l=G(null),u=G(void 0),v=G(0),p=G(!0),m=G(!1),f=k(()=>a(i)!==null?n().find(N=>N.index===a(i)):void 0);xe(()=>{const N=n();N.length>a(v)&&a(u)&&requestAnimationFrame(()=>{a(u)&&(a(u).scrollLeft=a(u).scrollWidth)}),y(v,N.length,!0)}),gi(async()=>{try{const N=await kt.checkpoints.list();Rn.set(N)}catch{}});function w(N,E){E.shiftKey&&a(i)!==null&&a(i)!==N.index?(y(s,N.index,!0),S()):(y(i,N.index,!0),y(s,null),y(l,null))}async function S(){if(!(a(i)===null||a(s)===null))try{y(l,await kt.checkpoints.diff(a(i),a(s)),!0)}catch{y(l,null)}}async function z(){try{await kt.checkpoints.clear(),Rn.set([]),y(i,null),y(s,null),y(l,null)}catch{Rn.set([]),y(i,null),y(s,null),y(l,null)}}async function P(){if(!(!a(f)||a(i)===null))try{await kt.checkpoints.rewind(a(i)),Rn.update(N=>N.filter(E=>E.index<=a(i))),y(s,null),y(l,null),Je(`Rewound to checkpoint #${a(i)}`,"info")}catch{Je("Failed to rewind checkpoint","error")}}async function L(){if(!(!a(f)||a(i)===null))try{const N=await kt.checkpoints.fork(a(i),a(f).state);Rn.update(E=>[...E,N]),y(i,N.index,!0)}catch{}}function A(N){if(!N)return"";const E=Date.now(),C=new Date(N).getTime(),_=E-C,T=Math.floor(_/1e3);if(T<5)return"just now";if(T<60)return`${T}s ago`;const D=Math.floor(T/60);if(D<60)return`${D}m ago`;const R=Math.floor(D/60);return R<24?`${R}h ago`:new Date(N).toLocaleDateString()}function V(N){if(!N)return"";const E=new Date(N),C=String(E.getHours()).padStart(2,"0"),_=String(E.getMinutes()).padStart(2,"0"),T=String(E.getSeconds()).padStart(2,"0");return`${C}:${_}:${T}`}function M(N){return N.includes("agent")?"var(--color-node-agent, #6366f1)":N.includes("tool")?"var(--color-node-tool, #8b5cf6)":N.includes("reason")?"var(--color-node-reasoning, #ec4899)":N.includes("pipeline")?"var(--color-node-pipeline, #06b6d4)":"var(--color-accent, #ff6b35)"}function O(N){return N.branch_id?"var(--color-info, #3b82f6)":"var(--color-accent, #ff6b35)"}function b(N){return typeof N=="string"?`"${N}"`:N===null?"null":N===void 0?"undefined":typeof N=="object"?JSON.stringify(N,null,2):String(N)}var I=y0(),H=d(I);{var B=N=>{var E=U_(),C=d(E),_=d(C);Kr(_,{size:32}),c(C),he(2),c(E),g(N,E)},X=N=>{var E=_0(),C=oe(E),_=d(C),T=h(d(_),2),D=d(T);c(T),c(_);var R=h(_,2),F=d(R);Bn(F,{size:13}),c(R),c(C);var q=h(C,2),K=d(q),Z=h(d(K),2);Qe(Z,1,n,j=>j.index,(j,$)=>{const de=k(()=>a(i)===a($).index),ce=k(()=>a(s)===a($).index);var te=J_();let ae;var be=d(te);let se;var ge=h(be,2),_e=d(ge,!0);c(ge),c(te),U((pe,ye)=>{ae=Oe(te,1,"checkpoint-dot-wrapper svelte-164d9ci",null,ae,{selected:a(de),compare:a(ce)}),ze(te,"title",`${a($).node_id??""} - ${pe??""}${a($).branch_id?` (branch: ${a($).branch_id})`:""}`),se=Oe(be,1,"checkpoint-dot svelte-164d9ci",null,se,{selected:a(de),compare:a(ce),forked:!!a($).branch_id}),pt(be,`--dot-color: ${ye??""}`),Y(_e,a($).index)},[()=>V(a($).timestamp),()=>O(a($))]),fe("click",te,pe=>w(a($),pe)),g(j,te)}),c(K),c(q),mn(q,j=>y(u,j),()=>a(u));var ee=h(q,2);{var J=j=>{var $=e0(),de=d($),ce=d(de);ld(ce,{size:13}),he(2),c(de);var te=h(de,2),ae=d(te);Ma(ae,{size:13}),he(2),c(te);var be=h(te,2);{var se=_e=>{var pe=Q_(),ye=d(pe);Jc(ye,{size:13});var me=h(ye,2),ve=d(me);c(me),c(pe),U(()=>Y(ve,`Compare #${a(i)??""} vs #${a(s)??""}`)),fe("click",pe,S),g(_e,pe)},ge=_e=>{var pe=$_();g(_e,pe)};W(be,_e=>{a(s)!==null?_e(se):_e(ge,!1)})}c($),fe("click",de,P),fe("click",te,L),g(j,$)};W(ee,j=>{a(f)&&j(J)})}var ne=h(ee,2);{var le=j=>{var $=l0(),de=d($),ce=d(de);c(de);var te=h(de,2),ae=d(te);{var be=ve=>{var ke=n0(),Ve=h(d(ke),2);Qe(Ve,17,()=>a(l).added,Vt,(Re,Ye)=>{var Le=t0(),at=d(Le,!0);c(Le),U(()=>Y(at,a(Ye))),g(Re,Le)}),c(ke),g(ve,ke)};W(ae,ve=>{a(l).added.length>0&&ve(be)})}var se=h(ae,2);{var ge=ve=>{var ke=o0(),Ve=h(d(ke),2);Qe(Ve,17,()=>a(l).removed,Vt,(Re,Ye)=>{var Le=a0(),at=d(Le,!0);c(Le),U(()=>Y(at,a(Ye))),g(Re,Le)}),c(ke),g(ve,ke)};W(se,ve=>{a(l).removed.length>0&&ve(ge)})}var _e=h(se,2);{var pe=ve=>{var ke=s0(),Ve=h(d(ke),2);Qe(Ve,17,()=>a(l).changed,Vt,(Re,Ye)=>{var Le=r0(),at=d(Le,!0);c(Le),U(()=>Y(at,a(Ye))),g(Re,Le)}),c(ke),g(ve,ke)};W(_e,ve=>{a(l).changed.length>0&&ve(pe)})}var ye=h(_e,2);{var me=ve=>{var ke=i0();g(ve,ke)};W(ye,ve=>{a(l).added.length===0&&a(l).removed.length===0&&a(l).changed.length===0&&ve(me)})}c(te),c($),U(()=>Y(ce,`Diff: #${a(i)??""} vs #${a(s)??""}`)),g(j,$)};W(ne,j=>{a(l)&&j(le)})}var re=h(ne,2);{var Q=j=>{var $=m0(),de=d($),ce=d(de),te=d(ce,!0);c(ce);var ae=h(ce,2),be=d(ae,!0);c(ae);var se=h(ae,2),ge=d(se,!0);c(se),c(de);var _e=h(de,2);{var pe=He=>{var vt=d0(),ie=d(vt);Ma(ie,{size:12});var Me=h(ie,2),it=d(Me);c(Me);var Xe=h(Me,2);{var zt=Fe=>{var tt=c0(),ct=d(tt);c(tt),U(()=>Y(ct,`from checkpoint #${a(f).parent_index??""}`)),g(Fe,tt)};W(Xe,Fe=>{a(f).parent_index!==null&&a(f).parent_index!==void 0&&Fe(zt)})}c(vt),U(()=>Y(it,`Branch: ${a(f).branch_id??""}`)),g(He,vt)};W(_e,He=>{a(f).branch_id&&He(pe)})}var ye=h(_e,2),me=d(ye),ve=d(me);{var ke=He=>{la(He,{size:12})},Ve=He=>{Ta(He,{size:12})};W(ve,He=>{a(p)?He(ke):He(Ve,!1)})}var Re=h(ve,4),Ye=d(Re);c(Re),c(me);var Le=h(me,2);{var at=He=>{var vt=f0(),ie=d(vt);Qe(ie,17,()=>Object.entries(a(f).state),Vt,(zt,Fe)=>{var tt=k(()=>zn(a(Fe),2));let ct=()=>a(tt)[0],Et=()=>a(tt)[1];var Be=u0(),We=d(Be),yt=d(We);c(We);var St=h(We,2),Ct=d(St,!0);c(St),c(Be),U(ft=>{Y(yt,`${ct()??""}:`),Y(Ct,ft)},[()=>b(Et())]),g(zt,Be)});var Me=h(ie,2);{var it=zt=>{var Fe=v0();g(zt,Fe)},Xe=k(()=>Object.keys(a(f).state).length===0);W(Me,zt=>{a(Xe)&&zt(it)})}c(vt),g(He,vt)};W(Le,He=>{a(p)&&He(at)})}c(ye);var wt=h(ye,2),st=d(wt),ot=d(st);{var ut=He=>{la(He,{size:12})},Pe=He=>{Ta(He,{size:12})};W(ot,He=>{a(m)?He(ut):He(Pe,!1)})}var Rt=h(ot,4),Ht=d(Rt);c(Rt),c(st);var et=h(st,2);{var xt=He=>{var vt=g0(),ie=d(vt);Qe(ie,17,()=>Object.entries(a(f).inputs),Vt,(zt,Fe)=>{var tt=k(()=>zn(a(Fe),2));let ct=()=>a(tt)[0],Et=()=>a(tt)[1];var Be=p0(),We=d(Be),yt=d(We);c(We);var St=h(We,2),Ct=d(St,!0);c(St),c(Be),U(ft=>{Y(yt,`${ct()??""}:`),Y(Ct,ft)},[()=>b(Et())]),g(zt,Be)});var Me=h(ie,2);{var it=zt=>{var Fe=h0();g(zt,Fe)},Xe=k(()=>Object.keys(a(f).inputs).length===0);W(Me,zt=>{a(Xe)&&zt(it)})}c(vt),g(He,vt)};W(et,He=>{a(m)&&He(xt)})}c(wt),c($),U((He,vt,ie,Me,it,Xe)=>{pt(ce,`background: ${He??""}20; color: ${vt??""}`),Y(te,a(f).node_id),Y(be,ie),Y(ge,Me),Y(Ye,`${it??""} keys`),Y(Ht,`${Xe??""} keys`)},[()=>M(a(f).node_id),()=>M(a(f).node_id),()=>A(a(f).timestamp),()=>V(a(f).timestamp),()=>Object.keys(a(f).state).length,()=>Object.keys(a(f).inputs).length]),fe("click",me,()=>y(p,!a(p))),fe("click",st,()=>y(m,!a(m))),g(j,$)};W(re,j=>{a(f)&&j(Q)})}U(()=>Y(D,`${n().length??""} checkpoint${n().length===1?"":"s"}`)),fe("click",R,z),g(N,E)};W(H,N=>{n().length===0?N(B):N(X,!1)})}c(I),g(t,I),Ne(),r()}Tt(["click"]);var x0=x('
    Loading history...
    '),w0=x('
    No version history yet
    '),k0=x('
    '),z0=x('
    '),S0=x('
    Version History
    ');function C0(t,e){Ee(e,!0);const n=()=>dt(ma,"$currentProject",o),[o,r]=Xt();let i=G(pn([])),s=G(!1),l=G(null);async function u(){const O=n();if(O){y(s,!0);try{y(i,await kt.projects.getHistory(O.name),!0)}catch{y(i,[],!0)}finally{y(s,!1)}}}async function v(O){const b=n();if(b)try{await kt.projects.bookmarkVersion(b.name,O,`bookmark-${O.slice(0,7)}`),await u(),Je("Version bookmarked","success")}catch{Je("Failed to bookmark","error")}}async function p(O){const b=n();if(b)try{await kt.projects.restoreVersion(b.name,O),y(l,null),await yc(b),await u(),Je("Restored to version "+O.slice(0,7),"success")}catch{Je("Failed to restore","error")}}function m(O){const b=Date.now(),I=new Date(O).getTime(),H=b-I,B=Math.floor(H/6e4);if(B<1)return"just now";if(B<60)return`${B}m ago`;const X=Math.floor(B/60);return X<24?`${X}h ago`:`${Math.floor(X/24)}d ago`}xe(()=>{n()&&u()});var f=S0(),w=d(f),S=h(d(w),2),z=d(S);Pt(z,{size:13}),c(S),c(w);var P=h(w,2),L=d(P);{var A=O=>{var b=x0(),I=d(b);Pt(I,{size:16,class:"spin"}),he(2),c(b),g(O,b)},V=O=>{var b=w0(),I=d(b);Cs(I,{size:16}),he(2),c(b),g(O,b)},M=O=>{var b=Te(),I=oe(b);Qe(I,17,()=>a(i),H=>H.sha,(H,B)=>{var X=z0();let N;var E=d(X),C=d(E);Cs(C,{size:14}),c(E);var _=h(E,2),T=d(_),D=d(T,!0);c(T);var R=h(T,2),F=d(R,!0);c(R);var q=h(R,2),K=d(q,!0);c(q),c(_);var Z=h(_,2),ee=d(Z);let J;var ne=d(ee);{let de=k(()=>a(B).bookmarked?"currentColor":"none");cd(ne,{size:13,get fill(){return a(de)}})}c(ee);var le=h(ee,2);let re;var Q=d(le);rd(Q,{size:13}),c(le),c(Z);var j=h(Z,2);{var $=de=>{var ce=k0(),te=d(ce),ae=d(te);c(te);var be=h(te,2),se=h(be,2);c(ce),U(ge=>Y(ae,`Restore to ${ge??""}?`),[()=>a(B).sha.slice(0,7)]),fe("click",be,()=>p(a(B).sha)),fe("click",se,()=>y(l,null)),g(de,ce)};W(j,de=>{a(l)===a(B).sha&&de($)})}c(X),U((de,ce)=>{N=Oe(X,1,"version-item svelte-1jltp3m",null,N,{confirming:a(l)===a(B).sha}),Y(D,de),Y(F,a(B).message),Y(K,ce),J=Oe(ee,1,"action-btn bookmark-btn svelte-1jltp3m",null,J,{bookmarked:a(B).bookmarked}),ze(ee,"title",a(B).bookmarked?"Bookmarked":"Bookmark this version"),re=Oe(le,1,"action-btn restore-btn svelte-1jltp3m",null,re,{visible:a(l)===a(B).sha})},[()=>a(B).sha.slice(0,7),()=>m(a(B).timestamp)]),fe("click",ee,()=>v(a(B).sha)),fe("click",le,()=>y(l,a(B).sha,!0)),g(H,X)}),g(O,b)};W(L,O=>{a(s)?O(A):a(i).length===0?O(V,1):O(M,!1)})}c(P),c(f),U(()=>S.disabled=a(s)),fe("click",S,u),g(t,f),Ne(),r()}Tt(["click"]);var E0=x(''),N0=x('
    Loading...
    '),P0=x('
    No connectors available
    '),M0=x(' Installed'),T0=x(" Hide Guide",1),I0=x(" Setup Guide",1),A0=x(''),D0=x(" Installing...",1),O0=x(" Install",1),R0=x(''),L0=x('

    '),V0=x('
    '),H0=x('

    '),F0=x('
    '),q0=x('
    '),B0=x('
    ',1),K0=x('
    ',1),j0=x('
    '),W0=x(" Saving...",1),Z0=x(" Create Tool",1),Y0=x('
    Create Custom Tool
    '),X0=x('
    No custom tools defined Create a custom API, webhook, or Python tool to extend your agents
    '),G0=x('
    '),U0=x('
    '),J0=x(" ",1),Q0=x('
    ');function $0(t,e){Ee(e,!0);const n={"message-square":Oc,send:Ii,hash:Mi,users:Fc,"git-pull-request":Qc,mail:ad,globe:ks,webhook:yr};let o=G("connectors"),r=G(!1),i=G(pn([])),s=G(null),l=G(null),u=G(pn([])),v=G(!1),p=G(""),m=G(""),f=G("api"),w=G(""),S=G(""),z=G("POST"),P=G("none"),L=G(""),A=G(""),V=G(""),M=G(!1);async function O(){y(r,!0);try{y(i,await kt.customTools.catalog(),!0)}catch{y(i,[],!0),Je("Failed to load connector catalog","error")}finally{y(r,!1)}}async function b(){y(r,!0);try{y(u,await kt.customTools.list(),!0)}catch{y(u,[],!0),Je("Failed to load custom tools","error")}finally{y(r,!1)}}async function I(te){y(s,te,!0);try{await kt.customTools.installConnector(te),Je("Connector installed","success"),await O()}catch{Je("Failed to install connector","error")}finally{y(s,null)}}async function H(te){try{await kt.customTools.delete(te),Je("Tool deleted","success"),await b()}catch{Je("Failed to delete tool","error")}}async function B(te){try{const ae=await kt.customTools.test(te);ae.status==="success"?Je(`Tool "${te}" test passed (${ae.response_time??0}ms)`,"success"):Je(`Tool test failed: ${ae.error??"Unknown error"}`,"error")}catch{Je("Failed to test tool","error")}}function X(){y(p,""),y(m,""),y(f,"api"),y(w,""),y(S,""),y(z,"POST"),y(P,"none"),y(L,""),y(A,""),y(V,"")}async function N(){if(!a(p).trim()){Je("Tool name is required","error");return}y(M,!0);try{const te={name:a(p).trim().toLowerCase().replace(/\s+/g,"_"),description:a(m).trim()||`Custom ${a(f)} tool`,tool_type:a(f),tags:["custom"]};a(f)==="api"?(te.api_base_url=a(w),te.api_path=a(S),te.api_method=a(z),te.api_auth_type=a(P),a(L)&&(te.api_auth_value=a(L))):a(f)==="webhook"?(te.webhook_url=a(A),te.webhook_method=a(z)):a(f)==="python"&&(te.python_code=a(V)),await kt.customTools.save(te),Je(`Tool "${a(p)}" created`,"success"),y(v,!1),X(),await b()}catch{Je("Failed to create tool","error")}finally{y(M,!1)}}function E(te){switch(te.toLowerCase()){case"messaging":return"#6366f1";case"developer":return"#22c55e";case"email":return"#f59e0b";case"integration":return"#8b5cf6";default:return"#64748b"}}xe(()=>{a(o)==="connectors"?O():b()});var C=Q0(),_=d(C),T=d(_),D=d(T);let R;var F=d(D);uo(F,{size:12}),he(),c(D);var q=h(D,2);let K;var Z=d(q);Kn(Z,{size:12}),he(),c(q),c(T);var ee=h(T,2),J=d(ee);{var ne=te=>{var ae=E0(),be=d(ae);wo(be,{size:12}),he(),c(ae),fe("click",ae,()=>{y(v,!a(v))}),g(te,ae)};W(J,te=>{a(o)==="tools"&&te(ne)})}var le=h(J,2),re=d(le);Pt(re,{size:13}),c(le),c(ee),c(_);var Q=h(_,2),j=d(Q);{var $=te=>{var ae=N0(),be=d(ae);Pt(be,{size:16,class:"spin"}),he(2),c(ae),g(te,ae)},de=te=>{var ae=Te(),be=oe(ae);{var se=_e=>{var pe=P0(),ye=d(pe);uo(ye,{size:16}),he(2),c(pe),g(_e,pe)},ge=_e=>{var pe=F0();Qe(pe,21,()=>a(i),ye=>ye.id,(ye,me)=>{const ve=k(()=>n[a(me).icon]);var ke=H0();let Ve;var Re=d(ke),Ye=d(Re);let Le;var at=d(Ye);{var wt=Be=>{var We=Te(),yt=oe(We);hn(yt,()=>a(ve),(St,Ct)=>{Ct(St,{size:18})}),g(Be,We)},st=Be=>{uo(Be,{size:18})};W(at,Be=>{a(ve)?Be(wt):Be(st,!1)})}c(Ye);var ot=h(Ye,2),ut=d(ot),Pe=d(ut),Rt=d(Pe,!0);c(Pe);var Ht=h(Pe,2);{var et=Be=>{var We=M0(),yt=d(We);Ia(yt,{size:9}),he(),c(We),g(Be,We)};W(Ht,Be=>{a(me).installed&&Be(et)})}c(ut);var xt=h(ut,2);let He;var vt=d(xt,!0);c(xt),c(ot),c(Re);var ie=h(Re,2),Me=d(ie,!0);c(ie);var it=h(ie,2),Xe=d(it);{var zt=Be=>{var We=A0(),yt=d(We);{var St=ft=>{var It=T0(),jt=oe(It);Pi(jt,{size:11}),he(),g(ft,It)},Ct=ft=>{var It=I0(),jt=oe(It);la(jt,{size:11}),he(),g(ft,It)};W(yt,ft=>{a(l)===a(me).id?ft(St):ft(Ct,!1)})}c(We),fe("click",We,()=>y(l,a(l)===a(me).id?null:a(me).id,!0)),g(Be,We)};W(Xe,Be=>{a(me).setup_guide&&Be(zt)})}var Fe=h(Xe,2);{var tt=Be=>{var We=R0(),yt=d(We);{var St=ft=>{var It=D0(),jt=oe(It);Pt(jt,{size:11,class:"spin"}),he(),g(ft,It)},Ct=ft=>{var It=O0(),jt=oe(It);Vo(jt,{size:11}),he(),g(ft,It)};W(yt,ft=>{a(s)===a(me).id?ft(St):ft(Ct,!1)})}c(We),U(()=>We.disabled=a(s)===a(me).id),fe("click",We,()=>I(a(me).id)),g(Be,We)};W(Fe,Be=>{a(me).installed||Be(tt)})}c(it);var ct=h(it,2);{var Et=Be=>{var We=V0();Qe(We,21,()=>a(me).setup_guide.split(` -`),Vt,(yt,St)=>{var Ct=L0(),ft=d(Ct,!0);c(Ct),U(()=>Y(ft,a(St))),g(yt,Ct)}),c(We),g(Be,We)};W(ct,Be=>{a(l)===a(me).id&&a(me).setup_guide&&Be(Et)})}c(ke),U((Be,We,yt)=>{Ve=Oe(ke,1,"connector-card svelte-1g6pzvd",null,Ve,{installed:a(me).installed}),Le=pt(Ye,"",Le,Be),Y(Rt,a(me).name),He=pt(xt,"",He,We),Y(vt,yt),Y(Me,a(me).description)},[()=>({"--cat-color":E(a(me).category)}),()=>({color:E(a(me).category)}),()=>a(me).category.toUpperCase()]),g(ye,ke)}),c(pe),g(_e,pe)};W(be,_e=>{a(i).length===0?_e(se):_e(ge,!1)})}g(te,ae)},ce=te=>{var ae=J0(),be=oe(ae);{var se=ye=>{var me=Y0(),ve=d(me),ke=h(d(ve),2),Ve=d(ke);Lo(Ve,{size:14}),c(ke),c(ve);var Re=h(ve,2),Ye=d(Re),Le=h(d(Ye),2);Nt(Le),c(Ye);var at=h(Ye,2),wt=h(d(at),2),st=d(wt);st.value=st.__value="api";var ot=h(st);ot.value=ot.__value="webhook";var ut=h(ot);ut.value=ut.__value="python",c(wt),c(at);var Pe=h(at,2),Rt=h(d(Pe),2);Nt(Rt),c(Pe);var Ht=h(Pe,2);{var et=Fe=>{var tt=B0(),ct=oe(tt),Et=h(d(ct),2);Nt(Et),c(ct);var Be=h(ct,2),We=h(d(Be),2);Nt(We),c(Be);var yt=h(Be,2),St=h(d(yt),2),Ct=d(St);Ct.value=Ct.__value="GET";var ft=h(Ct);ft.value=ft.__value="POST";var It=h(ft);It.value=It.__value="PUT";var jt=h(It);jt.value=jt.__value="PATCH";var _a=h(jt);_a.value=_a.__value="DELETE",c(St),c(yt);var In=h(yt,2),An=h(d(In),2),Un=d(An);Un.value=Un.__value="none";var ya=h(Un);ya.value=ya.__value="bearer";var Jn=h(ya);Jn.value=Jn.__value="api_key",c(An),c(In);var Xa=h(In,2);{var Xo=Wt=>{var ba=q0(),xa=d(ba),Go=d(xa,!0);c(xa);var Ga=h(xa,2);Nt(Ga),c(ba),U(()=>Y(Go,a(P)==="bearer"?"Bearer Token":"API Key")),Lt(Ga,()=>a(L),Uo=>y(L,Uo)),g(Wt,ba)};W(Xa,Wt=>{a(P)!=="none"&&Wt(Xo)})}Lt(Et,()=>a(w),Wt=>y(w,Wt)),Lt(We,()=>a(S),Wt=>y(S,Wt)),za(St,()=>a(z),Wt=>y(z,Wt)),za(An,()=>a(P),Wt=>y(P,Wt)),g(Fe,tt)},xt=Fe=>{var tt=K0(),ct=oe(tt),Et=h(d(ct),2);Nt(Et),c(ct);var Be=h(ct,2),We=h(d(Be),2),yt=d(We);yt.value=yt.__value="POST";var St=h(yt);St.value=St.__value="PUT";var Ct=h(St);Ct.value=Ct.__value="GET",c(We),c(Be),Lt(Et,()=>a(A),ft=>y(A,ft)),za(We,()=>a(z),ft=>y(z,ft)),g(Fe,tt)},He=Fe=>{var tt=j0(),ct=h(d(tt),2);Rr(ct),ze(ct,"placeholder","def run(input_data: dict) -> dict: # Your tool logic here return {result': 'hello'}"),c(tt),Lt(ct,()=>a(V),Et=>y(V,Et)),g(Fe,tt)};W(Ht,Fe=>{a(f)==="api"?Fe(et):a(f)==="webhook"?Fe(xt,1):a(f)==="python"&&Fe(He,2)})}c(Re);var vt=h(Re,2),ie=d(vt),Me=h(ie,2),it=d(Me);{var Xe=Fe=>{var tt=W0(),ct=oe(tt);Pt(ct,{size:12,class:"spin"}),he(),g(Fe,tt)},zt=Fe=>{var tt=Z0(),ct=oe(tt);Ia(ct,{size:12}),he(),g(Fe,tt)};W(it,Fe=>{a(M)?Fe(Xe):Fe(zt,!1)})}c(Me),c(vt),c(me),U(Fe=>Me.disabled=Fe,[()=>a(M)||!a(p).trim()]),fe("click",ke,()=>{y(v,!1),X()}),Lt(Le,()=>a(p),Fe=>y(p,Fe)),za(wt,()=>a(f),Fe=>y(f,Fe)),Lt(Rt,()=>a(m),Fe=>y(m,Fe)),fe("click",ie,()=>{y(v,!1),X()}),fe("click",Me,N),g(ye,me)};W(be,ye=>{a(v)&&ye(se)})}var ge=h(be,2);{var _e=ye=>{var me=X0(),ve=d(me);Kn(ve,{size:20});var ke=h(ve,4),Ve=d(ke);wo(Ve,{size:14}),he(),c(ke),c(me),fe("click",ke,()=>y(v,!0)),g(ye,me)},pe=ye=>{var me=U0();Qe(me,21,()=>a(u),ve=>ve.name,(ve,ke)=>{var Ve=G0(),Re=d(Ve),Ye=d(Re);{var Le=Xe=>{ks(Xe,{size:14})},at=Xe=>{yr(Xe,{size:14})},wt=Xe=>{qa(Xe,{size:14})};W(Ye,Xe=>{a(ke).tool_type==="api"?Xe(Le):a(ke).tool_type==="webhook"?Xe(at,1):Xe(wt,!1)})}c(Re);var st=h(Re,2),ot=d(st),ut=d(ot),Pe=d(ut,!0);c(ut);var Rt=h(ut,2),Ht=d(Rt,!0);c(Rt),c(ot);var et=h(ot,2),xt=d(et,!0);c(et),c(st);var He=h(st,2),vt=d(He),ie=d(vt);dd(ie,{size:13}),c(vt);var Me=h(vt,2),it=d(Me);Bn(it,{size:13}),c(Me),c(He),c(Ve),U(()=>{Y(Pe,a(ke).name),Y(Ht,a(ke).tool_type),Y(xt,a(ke).description)}),fe("click",vt,()=>B(a(ke).name)),fe("click",Me,()=>H(a(ke).name)),g(ve,Ve)}),c(me),g(ye,me)};W(ge,ye=>{a(u).length===0&&!a(v)?ye(_e):a(u).length>0&&ye(pe,1)})}g(te,ae)};W(j,te=>{a(r)?te($):a(o)==="connectors"?te(de,1):te(ce,!1)})}c(Q),c(C),U(()=>{R=Oe(D,1,"sub-tab svelte-1g6pzvd",null,R,{active:a(o)==="connectors"}),K=Oe(q,1,"sub-tab svelte-1g6pzvd",null,K,{active:a(o)==="tools"})}),fe("click",D,()=>y(o,"connectors")),fe("click",q,()=>y(o,"tools")),fe("click",le,()=>a(o)==="connectors"?O():b()),g(t,C),Ne()}Tt(["click"]);var ey=x('
    Loading...
    '),ty=x('
    No datasets. Upload a JSON or CSV file to get started.
    '),ny=x(''),ay=x('
    '),oy=x(' '),ry=x('
    '),sy=x('
    '),iy=x('
    Total
    Passed
    Failed
    Pass Rate
    '),ly=x('
    Evaluate
    ');function cy(t,e){Ee(e,!0);const n=()=>dt(ma,"$currentProject",o),[o,r]=Xt();let i=G(!1),s=G(pn([])),l=G(null),u=G(!1),v=G(null),p=G(void 0);async function m(){const q=n();if(q){y(i,!0);try{y(s,await kt.evaluate.listDatasets(q.name),!0)}catch{y(s,[],!0),Je("Failed to load datasets","error")}finally{y(i,!1)}}}async function f(){if(!n()){Je("Select a project first","error");return}a(p)?.click()}async function w(q){const K=n();if(!K)return;const Z=q.target,ee=Z.files?.[0];if(ee){try{const J=await kt.evaluate.uploadDataset(K.name,ee);Je(`Dataset uploaded: ${J.test_cases} test cases`,"success"),await m()}catch{Je("Failed to upload dataset","error")}Z.value=""}}async function S(){const q=n();if(!(!q||!a(l))){y(u,!0),y(v,null);try{const K=_i();y(v,await kt.evaluate.run(q.name,a(l),K),!0),Je(`Evaluation complete: ${a(v).pass_rate.toFixed(1)}% pass rate`,"success")}catch{Je("Evaluation failed","error")}finally{y(u,!1)}}}xe(()=>{n()&&m()});var z=ly(),P=d(z),L=h(d(P),2),A=d(L),V=d(A);ud(V,{size:12}),he(),c(A);var M=h(A,2),O=d(M);Pt(O,{size:13}),c(M),c(L);var b=h(L,2);mn(b,q=>y(p,q),()=>a(p)),c(P);var I=h(P,2),H=d(I),B=h(d(H),2);{var X=q=>{var K=ey(),Z=d(K);Pt(Z,{size:13}),he(2),c(K),g(q,K)},N=q=>{var K=ty(),Z=d(K);xs(Z,{size:13}),he(2),c(K),g(q,K)},E=q=>{var K=ay();Qe(K,21,()=>a(s),Z=>Z.filename,(Z,ee)=>{var J=ny();let ne;var le=d(J);xs(le,{size:12});var re=h(le,2),Q=d(re,!0);c(re);var j=h(re,2),$=d(j);c(j),c(J),U(()=>{ne=Oe(J,1,"dataset-item svelte-3xr44d",null,ne,{selected:a(l)===a(ee).filename}),Y(Q,a(ee).filename),Y($,`${a(ee).test_cases??""} cases`)}),fe("click",J,()=>y(l,a(ee).filename,!0)),g(Z,J)}),c(K),g(q,K)};W(B,q=>{a(i)?q(X):a(s).length===0?q(N,1):q(E,!1)})}c(H);var C=h(H,2),_=d(C),T=d(_);zi(T,{size:12});var D=h(T);c(_),c(C);var R=h(C,2);{var F=q=>{var K=iy(),Z=h(d(K),2),ee=d(Z),J=d(ee),ne=d(J,!0);c(J),he(2),c(ee);var le=h(ee,2),re=d(le),Q=d(re,!0);c(re),he(2),c(le);var j=h(le,2),$=d(j),de=d($,!0);c($),he(2),c(j);var ce=h(j,2),te=d(ce),ae=d(te);c(te),he(2),c(ce),c(Z);var be=h(Z,2);{var se=ge=>{var _e=sy();Qe(_e,21,()=>a(v).results,Vt,(pe,ye)=>{var me=ry();let ve;var ke=d(me),Ve=d(ke);{var Re=ot=>{Xc(ot,{size:12})},Ye=ot=>{Gc(ot,{size:12})};W(Ve,ot=>{a(ye).passed?ot(Re):ot(Ye,!1)})}c(ke);var Le=h(ke,2),at=d(Le,!0);c(Le);var wt=h(Le,2);{var st=ot=>{var ut=oy(),Pe=d(ut,!0);c(ut),U(()=>Y(Pe,a(ye).error)),g(ot,ut)};W(wt,ot=>{a(ye).error&&ot(st)})}c(me),U(()=>{ve=Oe(me,1,"result-row svelte-3xr44d",null,ve,{passed:a(ye).passed,failed:!a(ye).passed}),Y(at,a(ye).input)}),g(pe,me)}),c(_e),g(ge,_e)};W(be,ge=>{a(v).results.length>0&&ge(se)})}c(K),U(ge=>{Y(ne,a(v).total),Y(Q,a(v).passed),Y(de,a(v).failed),Y(ae,`${ge??""}%`)},[()=>a(v).pass_rate.toFixed(1)]),g(q,K)};W(R,q=>{a(v)&&q(F)})}c(I),c(z),U(()=>{_.disabled=!a(l)||a(u)||!n(),Y(D,` ${a(u)?"Running...":"Run Evaluation"}`)}),fe("click",A,f),fe("click",M,m),fe("change",b,w),fe("click",_,S),g(t,z),Ne(),r()}Tt(["click","change"]);var dy=x(''),uy=x('
    %
    '),vy=x('
    '),fy=x('
    Loading...
    '),py=x('
    No experiments yet. Create one to A/B test pipeline variants.
    '),hy=x('
    '),gy=x('
    '),my=x('
    '),_y=x('
    Experiments
    ');function yy(t,e){Ee(e,!0);const n=()=>dt(ma,"$currentProject",o),[o,r]=Xt();let i=G(!1),s=G(pn([])),l=G(!1),u=G(""),v=G(pn([{name:"Control",pipeline:"default",traffic:50},{name:"Variant A",pipeline:"default",traffic:50}]));async function p(){const _=n();if(_){y(i,!0);try{y(s,await kt.experiments.list(_.name),!0)}catch{y(s,[],!0),Je("Failed to load experiments","error")}finally{y(i,!1)}}}async function m(){const _=n();if(!(!_||!a(u).trim()))try{await kt.experiments.create(_.name,a(u).trim(),a(v)),Je("Experiment created","success"),y(u,""),y(l,!1),y(v,[{name:"Control",pipeline:"default",traffic:50},{name:"Variant A",pipeline:"default",traffic:50}],!0),await p()}catch{Je("Failed to create experiment","error")}}async function f(_){const T=n();if(T)try{await kt.experiments.delete(T.name,_),Je("Experiment deleted","success"),await p()}catch{Je("Failed to delete experiment","error")}}function w(){const _=a(v).length+1;y(v,[...a(v),{name:`Variant ${String.fromCharCode(64+_)}`,pipeline:"default",traffic:0}],!0)}function S(_){y(v,a(v).filter((T,D)=>D!==_),!0)}function z(_){switch(_){case"running":return"badge-running";case"completed":return"badge-completed";default:return"badge-draft"}}xe(()=>{n()&&p()});var P=_y(),L=d(P),A=h(d(L),2),V=d(A),M=d(V);wo(M,{size:12}),he(),c(V);var O=h(V,2),b=d(O);Pt(b,{size:13}),c(O),c(A),c(L);var I=h(L,2),H=d(I);{var B=_=>{var T=vy(),D=d(T),R=h(d(D),2);Nt(R),c(D);var F=h(D,2),q=h(d(F),2),K=d(q);Qe(K,17,()=>a(v),Vt,(re,Q,j)=>{var $=uy(),de=d($);Nt(de);var ce=h(de,2);Nt(ce);var te=h(ce,2),ae=d(te);Nt(ae),ze(ae,"min",0),ze(ae,"max",100),he(2),c(te);var be=h(te,2);{var se=ge=>{var _e=dy(),pe=d(_e);Bn(pe,{size:11}),c(_e),fe("click",_e,()=>S(j)),g(ge,_e)};W(be,ge=>{a(v).length>2&&ge(se)})}c($),Lt(de,()=>a(Q).name,ge=>a(Q).name=ge),Lt(ce,()=>a(Q).pipeline,ge=>a(Q).pipeline=ge),Lt(ae,()=>a(Q).traffic,ge=>a(Q).traffic=ge),g(re,$)});var Z=h(K,2),ee=d(Z);wo(ee,{size:11}),he(),c(Z),c(q),c(F);var J=h(F,2),ne=d(J),le=h(ne,2);c(J),c(T),U(re=>ne.disabled=re,[()=>!a(u).trim()]),Lt(R,()=>a(u),re=>y(u,re)),fe("click",Z,w),fe("click",ne,m),fe("click",le,()=>y(l,!1)),g(_,T)};W(H,_=>{a(l)&&_(B)})}var X=h(H,2);{var N=_=>{var T=fy(),D=d(T);Pt(D,{size:16}),he(2),c(T),g(_,T)},E=_=>{var T=py(),D=d(T);Si(D,{size:16}),he(2),c(T),g(_,T)},C=_=>{var T=my();Qe(T,21,()=>a(s),D=>D.id,(D,R)=>{var F=gy(),q=d(F),K=d(q);Ma(K,{size:13});var Z=h(K,2),ee=d(Z,!0);c(Z);var J=h(Z,2),ne=d(J,!0);c(J);var le=h(J,2),re=d(le,!0);c(le);var Q=h(le,2),j=d(Q);Bn(j,{size:12}),c(Q),c(q);var $=h(q,2);Qe($,21,()=>a(R).variants,de=>de.name,(de,ce)=>{var te=hy(),ae=d(te),be=d(ae,!0);c(ae);var se=h(ae,2),ge=d(se);let _e;c(se);var pe=h(se,2),ye=d(pe);c(pe),c(te),U(()=>{Y(be,a(ce).name),_e=pt(ge,"",_e,{width:`${a(ce).traffic??""}%`}),Y(ye,`${a(ce).traffic??""}%`)}),g(de,te)}),c($),c(F),U((de,ce)=>{Y(ee,a(R).name),Oe(J,1,`status-badge ${de??""}`,"svelte-oe5i1m"),Y(ne,a(R).status),Y(re,ce)},[()=>z(a(R).status),()=>new Date(a(R).created_at).toLocaleDateString()]),fe("click",Q,()=>f(a(R).id)),g(D,F)}),c(T),g(_,T)};W(X,_=>{a(i)?_(N):a(s).length===0&&!a(l)?_(E,1):_(C,!1)})}c(I),c(P),fe("click",V,()=>y(l,!a(l))),fe("click",O,p),g(t,P),Ne(),r()}Tt(["click"]);var by=x(" Copied",1),xy=x(" Copy",1),wy=x(' ',1),ky=x(" Generating...",1),zy=x(" Export as Python",1),Sy=x('
     
    '),Cy=x('
    Generating Python code...
    '),Ey=x('
    Click "Export as Python" to generate deployable code from your pipeline.
    '),Ny=x('
    Deploy / Export
    ');function Py(t,e){Ee(e,!0);let n=G(!1),o=G(""),r=G(!1);async function i(){y(n,!0),y(o,"");try{const b=_i(),I=await kt.codegen.smith(b);y(o,I.code,!0),Je("Code generated successfully","success")}catch{Je("Failed to generate code","error")}finally{y(n,!1)}}async function s(){if(a(o))try{await navigator.clipboard.writeText(a(o)),y(r,!0),Je("Copied to clipboard","info"),setTimeout(()=>y(r,!1),2e3)}catch{Je("Failed to copy","error")}}function l(){if(!a(o))return;const b=new Blob([a(o)],{type:"text/x-python"}),I=URL.createObjectURL(b),H=document.createElement("a");H.href=I,H.download="pipeline.py",H.click(),URL.revokeObjectURL(I),Je("Download started","info")}var u=Ny(),v=d(u),p=h(d(v),2),m=d(p);{var f=b=>{var I=wy(),H=oe(I),B=d(H);{var X=_=>{var T=by(),D=oe(T);Ia(D,{size:12}),he(),g(_,T)},N=_=>{var T=xy(),D=oe(T);ki(D,{size:12}),he(),g(_,T)};W(B,_=>{a(r)?_(X):_(N,!1)})}c(H);var E=h(H,2),C=d(E);Vo(C,{size:12}),he(),c(E),fe("click",H,s),fe("click",E,l),g(b,I)};W(m,b=>{a(o)&&b(f)})}var w=h(m,2),S=d(w);{var z=b=>{var I=ky(),H=oe(I);Pt(H,{size:12}),he(),g(b,I)},P=b=>{var I=zy(),H=oe(I);br(H,{size:12}),he(),g(b,I)};W(S,b=>{a(n)?b(z):b(P,!1)})}c(w),c(p),c(v);var L=h(v,2),A=d(L);{var V=b=>{var I=Sy(),H=d(I),B=d(H),X=d(B,!0);c(B),c(H),c(I),U(()=>Y(X,a(o))),g(b,I)},M=b=>{var I=Cy(),H=d(I);Pt(H,{size:16}),he(2),c(I),g(b,I)},O=b=>{var I=Ey(),H=d(I);br(H,{size:16}),he(2),c(I),g(b,I)};W(A,b=>{a(o)?b(V):a(n)?b(M,1):b(O,!1)})}c(L),c(u),U(()=>w.disabled=a(n)),fe("click",w,i),g(t,u),Ne()}Tt(["click"]);var My=x('
    Loading usage data...
    '),Ty=x('
    No usage data available. Run a pipeline to see metrics.
    '),Iy=x('
    '),Ay=x('
    By Model
    Model Requests Tokens Cost
    '),Dy=x('
    '),Oy=x('
    By Agent
    Agent Requests Tokens Cost
    '),Ry=x('
    Total Requests
    Total Tokens
    Total Cost
    Avg Latency
    ',1),Ly=x('
    Monitor
    ');function Vy(t,e){Ee(e,!0);let n=G(!1),o=G(null);async function r(){y(n,!0);try{y(o,await kt.monitoring.usage(),!0)}catch{y(o,null),Je("Failed to load usage data","error")}finally{y(n,!1)}}function i(L){return L>=1e6?`${(L/1e6).toFixed(1)}M`:L>=1e3?`${(L/1e3).toFixed(1)}K`:L.toString()}function s(L){return`$${L.toFixed(4)}`}function l(L,A){return A===0?"0ms":`${Math.round(L/A)}ms`}xe(()=>{r()});var u=Ly(),v=d(u),p=h(d(v),2),m=d(p);Pt(m,{size:13}),c(p),c(v);var f=h(v,2),w=d(f);{var S=L=>{var A=My(),V=d(A);Pt(V,{size:16}),he(2),c(A),g(L,A)},z=L=>{var A=Ty(),V=d(A);Ci(V,{size:16}),he(2),c(A),g(L,A)},P=L=>{var A=Ry(),V=oe(A),M=d(V),O=d(M),b=d(O);Mi(b,{size:14}),c(O);var I=h(O,2),H=d(I),B=d(H,!0);c(H),he(2),c(I),c(M);var X=h(M,2),N=d(X),E=d(N);yr(E,{size:14}),c(N);var C=h(N,2),_=d(C),T=d(_,!0);c(_),he(2),c(C),c(X);var D=h(X,2),R=d(D),F=d(R);Uc(F,{size:14}),c(R);var q=h(R,2),K=d(q),Z=d(K,!0);c(K),he(2),c(q),c(D);var ee=h(D,2),J=d(ee),ne=d(J);Kr(ne,{size:14}),c(J);var le=h(J,2),re=d(le),Q=d(re,!0);c(re),he(2),c(le),c(ee),c(V);var j=h(V,2),$=d(j);{var de=se=>{var ge=Ay(),_e=h(d(ge),2),pe=h(d(_e),2);Qe(pe,17,()=>Object.entries(a(o).by_model),([ye,me])=>ye,(ye,me)=>{var ve=k(()=>zn(a(me),2));let ke=()=>a(ve)[0],Ve=()=>a(ve)[1];var Re=Iy(),Ye=d(Re),Le=d(Ye,!0);c(Ye);var at=h(Ye,2),wt=d(at,!0);c(at);var st=h(at,2),ot=d(st,!0);c(st);var ut=h(st,2),Pe=d(ut,!0);c(ut),c(Re),U((Rt,Ht,et)=>{Y(Le,ke()),Y(wt,Rt),Y(ot,Ht),Y(Pe,et)},[()=>i(Ve().requests),()=>i(Ve().total_tokens),()=>s(Ve().cost_usd)]),g(ye,Re)}),c(_e),c(ge),g(se,ge)},ce=k(()=>Object.keys(a(o).by_model).length>0);W($,se=>{a(ce)&&se(de)})}var te=h($,2);{var ae=se=>{var ge=Oy(),_e=h(d(ge),2),pe=h(d(_e),2);Qe(pe,17,()=>Object.entries(a(o).by_agent),([ye,me])=>ye,(ye,me)=>{var ve=k(()=>zn(a(me),2));let ke=()=>a(ve)[0],Ve=()=>a(ve)[1];var Re=Dy(),Ye=d(Re),Le=d(Ye,!0);c(Ye);var at=h(Ye,2),wt=d(at,!0);c(at);var st=h(at,2),ot=d(st,!0);c(st);var ut=h(st,2),Pe=d(ut,!0);c(ut),c(Re),U((Rt,Ht,et)=>{Y(Le,ke()),Y(wt,Rt),Y(ot,Ht),Y(Pe,et)},[()=>i(Ve().requests),()=>i(Ve().total_tokens),()=>s(Ve().cost_usd)]),g(ye,Re)}),c(_e),c(ge),g(se,ge)},be=k(()=>Object.keys(a(o).by_agent).length>0);W(te,se=>{a(be)&&se(ae)})}c(j),U((se,ge,_e,pe)=>{Y(B,se),Y(T,ge),Y(Z,_e),Y(Q,pe)},[()=>i(a(o).total_requests),()=>i(a(o).total_tokens),()=>s(a(o).total_cost_usd),()=>l(a(o).total_latency_ms,a(o).total_requests)]),g(L,A)};W(w,L=>{a(n)&&!a(o)?L(S):a(o)?L(P,!1):L(z,1)})}c(f),c(u),U(()=>p.disabled=a(n)),fe("click",p,r),g(t,u),Ne()}Tt(["click"]);var Hy=x(' ',1),Fy=x('Files'),qy=x('
    Loading file...
    '),By=x('
     
    '),Ky=x('
    Loading files...
    '),jy=x('
    No files in this project.
    '),Wy=x('
    '),Zy=x(" "),Yy=x(''),Xy=x('
    '),Gy=x('
    ');function Uy(t,e){Ee(e,!0);const n=()=>dt(ma,"$currentProject",o),[o,r]=Xt();let i=G(!1),s=G(pn([])),l=G(null),u=G(""),v=G(!1);async function p(){const C=n();if(C){y(i,!0);try{y(s,await kt.files.list(C.name),!0)}catch{y(s,[],!0)}finally{y(i,!1)}}}async function m(C){const _=n();if(_){y(v,!0),y(l,C,!0);try{const T=await kt.files.read(_.name,C);y(u,T.content,!0)}catch{y(u,"// Failed to load file content")}finally{y(v,!1)}}}function f(){y(l,null),y(u,"")}function w(C){const _=C.split(".");return _.length>1?_[_.length-1]:""}function S(C){switch(w(C)){case"py":return"ext-python";case"ts":case"js":return"ext-js";case"json":return"ext-json";case"yaml":case"yml":return"ext-yaml";case"md":return"ext-md";default:return""}}function z(C){return C<1024?`${C} B`:C<1024*1024?`${(C/1024).toFixed(1)} KB`:`${(C/(1024*1024)).toFixed(1)} MB`}xe(()=>{n()&&(y(l,null),y(u,""),p())});var P=Gy(),L=d(P),A=d(L);{var V=C=>{var _=Hy(),T=oe(_),D=d(T);Wc(D,{size:13}),c(T);var R=h(T,2),F=d(R,!0);c(R),U(()=>Y(F,a(l))),fe("click",T,f),g(C,_)},M=C=>{var _=Fy();g(C,_)};W(A,C=>{a(l)?C(V):C(M,!1)})}var O=h(A,2),b=d(O);Pt(b,{size:13}),c(O),c(L);var I=h(L,2),H=d(I);{var B=C=>{var _=Te(),T=oe(_);{var D=F=>{var q=qy(),K=d(q);Pt(K,{size:16}),he(2),c(q),g(F,q)},R=F=>{var q=By(),K=d(q),Z=d(K),ee=d(Z,!0);c(Z),c(K),c(q),U(()=>Y(ee,a(u))),g(F,q)};W(T,F=>{a(v)?F(D):F(R,!1)})}g(C,_)},X=C=>{var _=Ky(),T=d(_);Pt(T,{size:16}),he(2),c(_),g(C,_)},N=C=>{var _=jy(),T=d(_);Ei(T,{size:16}),he(2),c(_),g(C,_)},E=C=>{var _=Xy();Qe(_,21,()=>a(s),T=>T.path,(T,D)=>{var R=Te(),F=oe(R);{var q=Z=>{var ee=Wy(),J=d(ee);qc(J,{size:13});var ne=h(J,2),le=d(ne,!0);c(ne),c(ee),U(()=>Y(le,a(D).name)),g(Z,ee)},K=Z=>{var ee=Yy(),J=d(ee);Rc(J,{size:13});var ne=h(J,2),le=d(ne,!0);c(ne);var re=h(ne,2);{var Q=te=>{var ae=Zy(),be=d(ae,!0);c(ae),U((se,ge)=>{Oe(ae,1,`file-ext ${se??""}`,"svelte-tctccr"),Y(be,ge)},[()=>S(a(D).name),()=>w(a(D).name)]),g(te,ae)},j=k(()=>w(a(D).name));W(re,te=>{a(j)&&te(Q)})}var $=h(re,2),de=d($,!0);c($);var ce=h($,2);Ta(ce,{size:11}),c(ee),U(te=>{Y(le,a(D).name),Y(de,te)},[()=>z(a(D).size)]),fe("click",ee,()=>m(a(D).path)),g(Z,ee)};W(F,Z=>{a(D).is_dir?Z(q):Z(K,!1)})}g(T,R)}),c(_),g(C,_)};W(H,C=>{a(l)?C(B):a(i)?C(X,1):a(s).length===0?C(N,2):C(E,!1)})}c(I),c(P),fe("click",O,p),g(t,P),Ne(),r()}Tt(["click"]);var Jy=x(' '),Qy=x(" Analyzing...",1),$y=x(" Analyze",1),eb=x(''),tb=x(''),nb=x(`

    No insights yet

    Click "Analyze" to review your pipeline, or insights will appear - automatically as you build.

    `),ab=x('

    '),ob=x('
    '),rb=x('
    Sent to Architect
    '),sb=x('
    Skipped
    '),ib=x('
    '),lb=x('
    '),cb=x(`

    Talk to The Oracle

    Ask about your pipeline, get advice on architecture decisions, or - discuss optimization strategies.

    `),db=x('
    ',1),ub=x('
    ');function vb(t,e){Ee(e,!0);const n=()=>dt(ma,"$currentProject",u),o=()=>dt(yi,"$oracleInsights",u),r=()=>dt(Cc,"$oracleChatStreaming",u),i=()=>dt(bc,"$oracleChatMessages",u),s=()=>dt(Sc,"$oracleConnected",u),l=()=>dt(zc,"$oracleAnalyzing",u),[u,v]=Xt();let p=G("insights");const m={info:{icon:wi,color:"#3b82f6",label:"Info"},warning:{icon:Lc,color:"#f59e0b",label:"Warning"},suggestion:{icon:ed,color:"#8b5cf6",label:"Suggestion"},critical:{icon:Qt,color:"#ef4444",label:"Critical"}};function f(Q){return m[Q]??m.info}function w(Q){if(!Q)return"";try{return new Date(Q).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}catch{return""}}let S=G(null);function z(Q){y(S,a(S)===Q?null:Q,!0)}async function P(Q){const j=n();if(!j)return;const $=await Pc(j.name,Q.id);$&&window.dispatchEvent(new CustomEvent("oracle-approved",{detail:{instruction:$}}))}async function L(Q){const j=n();j&&await Mc(j.name,Q.id)}let A=k(()=>o().filter(Q=>Q.status==="pending").length),V=G(""),M=G(void 0);function O(){const Q=a(V).trim();!Q||r()||(Ec(Q),y(V,""),I())}function b(Q){Q.key==="Enter"&&!Q.shiftKey&&(Q.preventDefault(),O())}function I(){requestAnimationFrame(()=>{a(M)&&(a(M).scrollTop=a(M).scrollHeight)})}function H(Q){return Q.replace(/)<[^<]*)*<\/script>/gi,"").replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,"")}function B(Q){if(!Q)return"";const j=Vc(Q,{async:!1});return H(j)}xe(()=>{i().length>0&&I()});var X=ub(),N=d(X),E=d(N),C=d(E);let _;var T=d(C);ko(T,{size:12});var D=h(T,4);{var R=Q=>{var j=Jy(),$=d(j,!0);c(j),U(()=>Y($,a(A))),g(Q,j)};W(D,Q=>{a(A)>0&&Q(R)})}c(C);var F=h(C,2);let q;var K=d(F);od(K,{size:12}),he(2),c(F),c(E);var Z=h(E,2);{var ee=Q=>{var j=eb(),$=d(j);{var de=te=>{var ae=Qy(),be=oe(ae);mi(be,{size:12,class:"oracle-spinner"}),he(2),g(te,ae)},ce=te=>{var ae=$y(),be=oe(ae);sd(be,{size:12}),he(2),g(te,ae)};W($,te=>{l()?te(de):te(ce,!1)})}c(j),U(()=>j.disabled=!s()||l()),fe("click",j,function(...te){xc?.apply(this,te)}),g(Q,j)},J=Q=>{var j=tb(),$=d(j);Bn($,{size:12}),c(j),fe("click",j,function(...de){wc?.apply(this,de)}),g(Q,j)};W(Z,Q=>{a(p)==="insights"?Q(ee):Q(J,!1)})}c(N);var ne=h(N,2);{var le=Q=>{var j=lb(),$=d(j);{var de=te=>{var ae=nb(),be=d(ae);ko(be,{size:24}),he(4),c(ae),g(te,ae)},ce=te=>{var ae=Te(),be=oe(ae);Qe(be,1,o,se=>se.id,(se,ge)=>{const _e=k(()=>f(a(ge).severity)),pe=k(()=>a(_e).icon);var ye=ib();let me;var ve=d(ye),ke=d(ve);let Ve;var Re=d(ke);hn(Re,()=>a(pe),(et,xt)=>{xt(et,{size:13})}),c(ke);var Ye=h(ke,2),Le=d(Ye,!0);c(Ye);var at=h(Ye,2),wt=d(at,!0);c(at),c(ve);var st=h(ve,2);{var ot=et=>{var xt=ab(),He=d(xt),vt=d(He,!0);c(He),c(xt),U(()=>Y(vt,a(ge).description)),g(et,xt)};W(st,et=>{a(S)===a(ge).id&&et(ot)})}var ut=h(st,2);{var Pe=et=>{var xt=ob(),He=d(xt),vt=d(He);Ia(vt,{size:11}),he(2),c(He);var ie=h(He,2),Me=d(ie);Lo(Me,{size:11}),he(2),c(ie),c(xt),fe("click",He,()=>P(a(ge))),fe("click",ie,()=>L(a(ge))),g(et,xt)},Rt=et=>{var xt=rb();g(et,xt)},Ht=et=>{var xt=sb();g(et,xt)};W(ut,et=>{a(ge).status==="pending"?et(Pe):a(ge).status==="approved"?et(Rt,1):et(Ht,!1)})}c(ye),U(et=>{me=Oe(ye,1,"insight-card svelte-b2w21g",null,me,{approved:a(ge).status==="approved",skipped:a(ge).status==="skipped"}),Ve=pt(ke,"",Ve,{color:a(_e).color}),Y(Le,a(ge).title),Y(wt,et)},[()=>w(a(ge).timestamp)]),fe("click",ve,()=>z(a(ge).id)),fe("keydown",ve,et=>et.key==="Enter"&&z(a(ge).id)),g(se,ye)}),g(te,ae)};W($,te=>{o().length===0?te(de):te(ce,!1)})}c(j),g(Q,j)},re=Q=>{var j=db(),$=oe(j),de=d($);{var ce=_e=>{var pe=cb(),ye=d(pe);Nc(ye,{size:20}),he(4),c(pe),g(_e,pe)},te=_e=>{var pe=Te(),ye=oe(pe);Qe(ye,1,i,me=>me.id,(me,ve)=>{var ke=Te(),Ve=oe(ke);{var Re=Le=>{Kl(Le,{accentColor:"#8b5cf6",messages:["Observing patterns...","Reading the tea leaves...","The cookies say...","Seeing what others cannot...","Contemplating the construct..."]})},Ye=Le=>{{let at=k(()=>a(ve).role==="oracle"?"assistant":"user"),wt=k(()=>B(a(ve).content)),st=k(()=>w(a(ve).timestamp));jl(Le,{get role(){return a(at)},get content(){return a(wt)},agentName:"Oracle",accentColor:"#8b5cf6",get timestamp(){return a(st)}})}};W(Ve,Le=>{a(ve).role==="oracle"&&a(ve).streaming&&!a(ve).content?Le(Re):Le(Ye,!1)})}g(me,ke)}),g(_e,pe)};W(de,_e=>{i().length===0?_e(ce):_e(te,!1)})}c($),mn($,_e=>y(M,_e),()=>a(M));var ae=h($,2),be=d(ae);Rr(be);var se=h(be,2),ge=d(se);kc(ge,{size:14}),c(se),c(ae),U(_e=>{be.disabled=!s()||r(),se.disabled=_e},[()=>!a(V).trim()||!s()||r()]),fe("keydown",be,b),Lt(be,()=>a(V),_e=>y(V,_e)),fe("click",se,O),g(Q,j)};W(ne,Q=>{a(p)==="insights"?Q(le):Q(re,!1)})}c(X),U(()=>{_=Oe(C,1,"oracle-tab svelte-b2w21g",null,_,{active:a(p)==="insights"}),q=Oe(F,1,"oracle-tab svelte-b2w21g",null,q,{active:a(p)==="chat"})}),fe("click",C,()=>y(p,"insights")),fe("click",F,()=>y(p,"chat")),g(t,X),Ne(),v()}Tt(["click","keydown"]);var fb=x('
    Loading executions...
    '),pb=x('
    No executions yet. Start the runtime and trigger a pipeline to see results.
    '),hb=x('
    ID
    Status
    Duration
    '),gb=x('
    '),mb=x('
    Status Execution ID Duration
    '),_b=x('
    Executions
    ');function yb(t,e){Ee(e,!0);const n=()=>dt(ma,"$currentProject",r),o=()=>dt(xr,"$bottomPanelTab",r),[r,i]=Xt();let s=G(!1),l=G(pn([])),u=G(null),v=k(()=>n()?.name??""),p=k(o);async function m(){if(a(v)){y(s,!0);try{const B=await kt.runtime.executions(a(v));y(l,B.executions??[],!0)}catch{y(l,[],!0),Je("Failed to load executions","error")}finally{y(s,!1)}}}function f(B){y(u,a(u)===B?null:B,!0)}function w(B){return B==null?"--":B<1e3?`${B}ms`:`${(B/1e3).toFixed(2)}s`}function S(B){return B.length<=12?B:B.slice(0,8)+"..."}function z(B){switch(B.toLowerCase()){case"completed":case"success":return"var(--color-success)";case"running":case"in_progress":return"#f59e0b";case"failed":case"error":return"var(--color-error)";default:return"var(--color-text-secondary)"}}xe(()=>{a(p)==="executions"&&a(v)&&m()}),xe(()=>{if(a(p)!=="executions"||!a(v))return;const B=setInterval(m,1e4);return()=>clearInterval(B)});var P=_b(),L=d(P),A=h(d(L),2),V=d(A);Pt(V,{size:13}),c(A),c(L);var M=h(L,2),O=d(M);{var b=B=>{var X=fb(),N=d(X);Pt(N,{size:16}),he(2),c(X),g(B,X)},I=B=>{var X=pb(),N=d(X);Ti(N,{size:16}),he(2),c(X),g(B,X)},H=B=>{var X=mb(),N=h(d(X),2);Qe(N,17,()=>a(l),E=>E.execution_id,(E,C)=>{var _=gb(),T=d(_),D=d(T),R=d(D);let F;c(D);var q=h(D,2),K=d(q),Z=d(K,!0);c(K),c(q);var ee=h(q,2),J=d(ee),ne=d(J,!0);c(J),c(ee);var le=h(ee,2),re=d(le);{var Q=ce=>{la(ce,{size:12})},j=ce=>{Ta(ce,{size:12})};W(re,ce=>{a(u)===a(C).execution_id?ce(Q):ce(j,!1)})}c(le),c(T);var $=h(T,2);{var de=ce=>{var te=hb(),ae=d(te),be=h(d(ae),2),se=d(be,!0);c(be),c(ae);var ge=h(ae,2),_e=h(d(ge),2);let pe;var ye=d(_e,!0);c(_e),c(ge);var me=h(ge,2),ve=h(d(me),2),ke=d(ve,!0);c(ve),c(me),c(te),U((Ve,Re)=>{Y(se,a(C).execution_id),pe=pt(_e,"",pe,Ve),Y(ye,a(C).status),Y(ke,Re)},[()=>({color:z(a(C).status)}),()=>w(a(C).duration_ms)]),g(ce,te)};W($,ce=>{a(u)===a(C).execution_id&&ce(de)})}c(_),U((ce,te,ae)=>{F=pt(R,"",F,ce),ze(q,"title",a(C).execution_id),Y(Z,te),Y(ne,ae)},[()=>({background:z(a(C).status)}),()=>S(a(C).execution_id),()=>w(a(C).duration_ms)]),fe("click",T,()=>f(a(C).execution_id)),g(E,_)}),c(X),g(B,X)};W(O,B=>{a(s)&&a(l).length===0?B(b):a(l).length===0?B(I,1):B(H,!1)})}c(M),c(P),U(()=>A.disabled=a(s)),fe("click",A,m),g(t,P),Ne(),i()}Tt(["click"]);var bb=x('
    '),xb=x(' '),wb=x(' '),kb=x(' '),zb=x(""),Sb=x('
    '),Cb=x('
    ');function Eb(t,e){Ee(e,!0);const n=()=>dt(_r,"$executionEvents",l),o=()=>dt(Rn,"$checkpoints",l),r=()=>dt(yi,"$oracleInsights",l),i=()=>dt(rr,"$bottomPanelOpen",l),s=()=>dt(xr,"$bottomPanelTab",l),[l,u]=Xt(),v=k(()=>n().filter(K=>K.type==="node_error").length),p=k(()=>o().length),m=k(()=>r().filter(K=>K.status==="pending").length),f=[{id:"console",label:"Console",icon:Hc},{id:"code",label:"Code",icon:qa},{id:"timeline",label:"Timeline",icon:Kr},{id:"integrations",label:"Integrate",icon:uo},{id:"evaluate",label:"Evaluate",icon:Si},{id:"experiments",label:"Experiments",icon:Ma},{id:"deploy",label:"Deploy",icon:br},{id:"monitor",label:"Monitor",icon:Ci},{id:"files",label:"Files",icon:Ei},{id:"history",label:"History",icon:$c},{id:"oracle",label:"Oracle",icon:ko},{id:"executions",label:"Executions",icon:Ti}];let w=G(320),S=G(!1),z=G(0),P=G(0);const L=120;function A(){rr.update(K=>!K)}function V(K){xr.set(K),i()||rr.set(!0)}function M(K){K.preventDefault(),y(S,!0),y(z,K.clientY,!0),y(P,a(w),!0),document.addEventListener("mousemove",O),document.addEventListener("mouseup",b)}function O(K){if(!a(S))return;const Z=Math.floor(window.innerHeight*.6),ee=a(z)-K.clientY,J=Math.max(L,Math.min(Z,a(P)+ee));y(w,J,!0)}function b(){y(S,!1),document.removeEventListener("mousemove",O),document.removeEventListener("mouseup",b)}ga(()=>{document.removeEventListener("mousemove",O),document.removeEventListener("mouseup",b)});var I=Cb();let H,B;var X=d(I);{var N=K=>{var Z=bb();fe("mousedown",Z,M),g(K,Z)};W(X,K=>{i()&&K(N)})}var E=h(X,2),C=d(E);Qe(C,21,()=>f,K=>K.id,(K,Z)=>{const ee=k(()=>a(Z).icon);var J=zb();let ne;var le=d(J);hn(le,()=>a(ee),(te,ae)=>{ae(te,{size:13})});var re=h(le,2),Q=d(re,!0);c(re);var j=h(re,2);{var $=te=>{var ae=xb(),be=d(ae,!0);c(ae),U(()=>Y(be,a(v)>99?"99+":a(v))),g(te,ae)},de=te=>{var ae=wb(),be=d(ae,!0);c(ae),U(()=>Y(be,a(p)>99?"99+":a(p))),g(te,ae)},ce=te=>{var ae=kb(),be=d(ae,!0);c(ae),U(()=>Y(be,a(m)>99?"99+":a(m))),g(te,ae)};W(j,te=>{a(Z).id==="console"&&a(v)>0?te($):a(Z).id==="timeline"&&a(p)>0?te(de,1):a(Z).id==="oracle"&&a(m)>0&&te(ce,2)})}c(J),U(()=>{ne=Oe(J,1,"tab-btn svelte-1m9rotx",null,ne,{active:s()===a(Z).id}),Y(Q,a(Z).label)}),fe("click",J,()=>V(a(Z).id)),g(K,J)}),c(C);var _=h(C,2),T=d(_);{var D=K=>{la(K,{size:14})},R=K=>{Pi(K,{size:14})};W(T,K=>{i()?K(D):K(R,!1)})}c(_),c(E);var F=h(E,2);{var q=K=>{var Z=Sb(),ee=d(Z);{var J=se=>{x_(se,{})},ne=se=>{G_(se,{})},le=se=>{b0(se,{})},re=se=>{$0(se,{})},Q=se=>{cy(se,{})},j=se=>{yy(se,{})},$=se=>{Py(se,{})},de=se=>{Vy(se,{})},ce=se=>{Uy(se,{})},te=se=>{C0(se,{})},ae=se=>{vb(se,{})},be=se=>{yb(se,{})};W(ee,se=>{s()==="console"?se(J):s()==="code"?se(ne,1):s()==="timeline"?se(le,2):s()==="integrations"?se(re,3):s()==="evaluate"?se(Q,4):s()==="experiments"?se(j,5):s()==="deploy"?se($,6):s()==="monitor"?se(de,7):s()==="files"?se(ce,8):s()==="history"?se(te,9):s()==="oracle"?se(ae,10):s()==="executions"&&se(be,11)})}c(Z),g(K,Z)};W(F,K=>{i()&&K(q)})}c(I),U(()=>{H=Oe(I,1,"bottom-panel svelte-1m9rotx",null,H,{dragging:a(S)}),B=pt(I,"",B,{height:i()?`${a(w)}px`:"36px"}),ze(_,"title",i()?"Collapse panel":"Expand panel")}),fe("click",_,A),g(t,I),Ne(),u()}Tt(["mousedown","click"]);var Nb=x('
    ');function Vb(t){var e=Nb(),n=d(e),o=d(n);i1(o,{});var r=h(o,2);p_(r,{}),c(n);var i=h(n,2);Eb(i,{}),c(e),g(t,e)}export{Vb as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/3.BOgUOg_l.js b/studio-desktop/frontend-dist/_app/immutable/nodes/3.BOgUOg_l.js deleted file mode 100644 index 72ebf472..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/3.BOgUOg_l.js +++ /dev/null @@ -1,4 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as Ls}from"../chunks/l8YpzWR9.js";import{aA as Ml,b3 as Pl,bp as Tl,h as Il,c as Al,au as Dl,Z as Hs,Y as Vs,m as Qt,v as Ol,bq as Rl,f as Me,g as de,i as _,br as Ll,bs as so,bt as Fs,p as ze,u as Hl,j as Ce,B as d,C as c,A as P,t as r,a0 as tr,O as k,b8 as dn,D as h,z as $,F as X,M as ye,bu as Bs,l as _e,I as Q,L as y,b7 as ut,as as qs,bv as Vl,bw as qa,K as be,bj as jr,G as _t,bn as On,bx as St,bo as It,by as Fl,J as $t,N as Bl,o as io,a3 as Bn}from"../chunks/DCyBifBO.js";import{l as et,s as Ze,p as pe,r as _n,i as Y,b as yn,a as Ot,d as Zo,m as Yo,c as at}from"../chunks/v7tHB-Lt.js";import{I as tt,s as nt,E as bn,G as lo,H as ia,h as xe,a as De,J as Rn,o as st,e as je,B as Zr,D as co,C as mn,z as Mn,v as an,b as on,m as Ct,q as wt,K as ql,M as Na,N as Kl,X as Ks,O as Ma,Q as Pa,g as jl,x as Xo,c as ot,t as nr,u as js,F as Wo,P as Go,r as Zl,R as Zs,T as Yl,U as Xl,L as Wl,V as Gl,W as Ul}from"../chunks/BAxs8Xtu.js";import{O as Dt,S as uo,B as cr,K as Kt,z as jt,x as Rt,Q as Zt,W as Xn,G as dr,j as vo,k as la,l as fo,m as po,g as Ys,D as ca,T as Wn,h as Xs,M as Ql,L as Jl,I as Ws,U as Ka,C as ho,b as Gs,J as $l,V as En,o as go,a as Ue,c as Yr,H as Xr,P as ec,F as Us,R as ja,A as Qs,Z as tc,f as Js,N as nc,w as rc,n as ac,X as oc,Y as sc}from"../chunks/91PP6ILK.js";import{c as un}from"../chunks/BX0kmcoN.js";import{A as Uo}from"../chunks/DQfFYHAU.js";import{b as Za,a as Ta}from"../chunks/BCCFcAOv.js";const ic=[];function $s(t,e=!1,n=!1){return Hr(t,new Map,"",ic,null,n)}function Hr(t,e,n,a,o=null,i=!1){if(typeof t=="object"&&t!==null){var s=e.get(t);if(s!==void 0)return s;if(t instanceof Map)return new Map(t);if(t instanceof Set)return new Set(t);if(Ml(t)){var l=Array(t.length);e.set(t,l),o!==null&&e.set(o,l);for(var u=0;u{var n=e();for(var a in n){var o=n[a];o?t.style.setProperty(a,o):t.style.removeProperty(a)}})}function zt(t,e,n){Vs(()=>{var a=Qt(()=>e(t,n?.())||{});if(n&&a?.update){var o=!1,i={};Hs(()=>{var s=n();Ol(s),o&&Rl(i,s)&&(i=s,a.update(s))}),o=!0}if(a?.destroy)return()=>a.destroy()})}class mo{#e=new WeakMap;#t;#n;static entries=new WeakMap;constructor(e){this.#n=e}observe(e,n){var a=this.#e.get(e)||new Set;return a.add(n),this.#e.set(e,a),this.#r().observe(e,this.#n),()=>{var o=this.#e.get(e);o.delete(n),o.size===0&&(this.#e.delete(e),this.#t.unobserve(e))}}#r(){return this.#t??(this.#t=new ResizeObserver(e=>{for(var n of e){mo.entries.set(n.target,n);for(var a of this.#e.get(n.target)||[])a(n)}}))}}var cc=new mo({box:"border-box"});function Qo(t,e,n){var a=cc.observe(t,()=>n(t[e]));Vs(()=>(Qt(()=>n(t[e])),a))}function dc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m12 19-7-7 7-7"}],["path",{d:"M19 12H5"}]];tt(t,Ze({name:"arrow-left"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function uc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z"}],["path",{d:"m7 16.5-4.74-2.85"}],["path",{d:"m7 16.5 5-3"}],["path",{d:"M7 16.5v5.17"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z"}],["path",{d:"m17 16.5-5-3"}],["path",{d:"m17 16.5 4.74-2.85"}],["path",{d:"M17 16.5v5.17"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z"}],["path",{d:"M12 8 7.26 5.15"}],["path",{d:"m12 8 4.74-2.85"}],["path",{d:"M12 13.5V8"}]];tt(t,Ze({name:"boxes"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function vc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z"}],["path",{d:"M17 21v-2"}],["path",{d:"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10"}],["path",{d:"M21 21v-2"}],["path",{d:"M3 5V3"}],["path",{d:"M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z"}],["path",{d:"M7 5V3"}]];tt(t,Ze({name:"cable"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function fc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m18 15-6-6-6 6"}]];tt(t,Ze({name:"chevron-up"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function pc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335"}],["path",{d:"m9 11 3 3L22 4"}]];tt(t,Ze({name:"circle-check-big"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function hc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];tt(t,Ze({name:"circle-x"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function gc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["line",{x1:"12",x2:"12",y1:"2",y2:"22"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"}]];tt(t,Ze({name:"dollar-sign"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Wr(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"}],["circle",{cx:"12",cy:"12",r:"3"}]];tt(t,Ze({name:"eye"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function mc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"}]];tt(t,Ze({name:"folder"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Jo(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"12",cy:"12",r:"3"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12"}]];tt(t,Ze({name:"git-commit-horizontal"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function _c(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M13 6h3a2 2 0 0 1 2 2v7"}],["path",{d:"M11 18H8a2 2 0 0 1-2-2V9"}]];tt(t,Ze({name:"git-compare"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function yc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["line",{x1:"4",x2:"20",y1:"9",y2:"9"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21"}]];tt(t,Ze({name:"hash"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function bc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}],["path",{d:"M12 7v5l4 2"}]];tt(t,Ze({name:"history"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function xc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["path",{d:"M9 18h6"}],["path",{d:"M10 22h4"}]];tt(t,Ze({name:"lightbulb"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function ei(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M13 5h8"}],["path",{d:"M13 12h8"}],["path",{d:"M13 19h8"}],["path",{d:"m3 17 2 2 4-4"}],["path",{d:"m3 7 2 2 4-4"}]];tt(t,Ze({name:"list-checks"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function wc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m10 17 5-5-5-5"}],["path",{d:"M15 12H3"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"}]];tt(t,Ze({name:"log-in"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function kc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m16 17 5-5-5-5"}],["path",{d:"M21 12H9"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}]];tt(t,Ze({name:"log-out"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Ya(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M12 22v-5"}],["path",{d:"M15 8V2"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z"}],["path",{d:"M9 8V2"}]];tt(t,Ze({name:"plug"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function mt(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];tt(t,Ze({name:"refresh-cw"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Sc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];tt(t,Ze({name:"rotate-ccw"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function zc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2"}]];tt(t,Ze({name:"scan"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Cc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z"}],["path",{d:"M3 20V4"}]];tt(t,Ze({name:"skip-back"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Ec(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M10 5H3"}],["path",{d:"M12 19H3"}],["path",{d:"M14 3v4"}],["path",{d:"M16 17v4"}],["path",{d:"M21 12h-9"}],["path",{d:"M21 19h-5"}],["path",{d:"M21 5h-7"}],["path",{d:"M8 10v4"}],["path",{d:"M8 12H3"}]];tt(t,Ze({name:"sliders-horizontal"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Nc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"}]];tt(t,Ze({name:"star"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Mc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M12 3v12"}],["path",{d:"m17 8-5-5-5 5"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}]];tt(t,Ze({name:"upload"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Pc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2"}]];tt(t,Ze({name:"workflow"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}var Tc={value:()=>{}};function da(){for(var t=0,e=arguments.length,n={},a;t=0&&(a=n.slice(o+1),n=n.slice(0,o)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:a}})}Vr.prototype=da.prototype={constructor:Vr,on:function(t,e){var n=this._,a=Ic(t+"",n),o,i=-1,s=a.length;if(arguments.length<2){for(;++i0)for(var n=new Array(o),a=0,o,i;a=0&&(e=t.slice(0,n))!=="xmlns"&&(t=t.slice(n+1)),es.hasOwnProperty(e)?{space:es[e],local:t}:t}function Dc(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===Xa&&e.documentElement.namespaceURI===Xa?e.createElement(t):e.createElementNS(n,t)}}function Oc(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function ti(t){var e=ua(t);return(e.local?Oc:Dc)(e)}function Rc(){}function _o(t){return t==null?Rc:function(){return this.querySelector(t)}}function Lc(t){typeof t!="function"&&(t=_o(t));for(var e=this._groups,n=e.length,a=new Array(n),o=0;o=F&&(F=O+1);!(R=I[F])&&++F=0;)(s=a[o])&&(i&&s.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(s,i),i=s);return this}function ld(t){t||(t=cd);function e(m,f){return m&&f?t(m.__data__,f.__data__):!m-!f}for(var n=this._groups,a=n.length,o=new Array(a),i=0;ie?1:t>=e?0:NaN}function dd(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function ud(){return Array.from(this)}function vd(){for(var t=this._groups,e=0,n=t.length;e1?this.each((e==null?kd:typeof e=="function"?zd:Sd)(t,e,n??"")):Gn(this.node(),t)}function Gn(t,e){return t.style.getPropertyValue(e)||si(t).getComputedStyle(t,null).getPropertyValue(e)}function Ed(t){return function(){delete this[t]}}function Nd(t,e){return function(){this[t]=e}}function Md(t,e){return function(){var n=e.apply(this,arguments);n==null?delete this[t]:this[t]=n}}function Pd(t,e){return arguments.length>1?this.each((e==null?Ed:typeof e=="function"?Md:Nd)(t,e)):this.node()[t]}function ii(t){return t.trim().split(/^|\s+/)}function yo(t){return t.classList||new li(t)}function li(t){this._node=t,this._names=ii(t.getAttribute("class")||"")}li.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function ci(t,e){for(var n=yo(t),a=-1,o=e.length;++a=0&&(n=e.slice(a+1),e=e.slice(0,a)),{type:e,name:n}})}function au(t){return function(){var e=this.__on;if(e){for(var n=0,a=-1,o=e.length,i;n()=>t;function Wa(t,{sourceEvent:e,subject:n,target:a,identifier:o,active:i,x:s,y:l,dx:u,dy:v,dispatch:p}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:a,enumerable:!0,configurable:!0},identifier:{value:o,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:u,enumerable:!0,configurable:!0},dy:{value:v,enumerable:!0,configurable:!0},_:{value:p}})}Wa.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function pu(t){return!t.ctrlKey&&!t.button}function hu(){return this.parentNode}function gu(t,e){return e??{x:t.x,y:t.y}}function mu(){return navigator.maxTouchPoints||"ontouchstart"in this}function _u(){var t=pu,e=hu,n=gu,a=mu,o={},i=da("start","drag","end"),s=0,l,u,v,p,m=0;function f(M){M.on("mousedown.drag",w).filter(a).on("touchstart.drag",I).on("touchmove.drag",H,fu).on("touchend.drag touchcancel.drag",O).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function w(M,R){if(!(p||!t.call(this,M,R))){var b=F(this,e.call(this,M,R),M,R,"mouse");b&&(At(M.view).on("mousemove.drag",N,ur).on("mouseup.drag",E,ur),fi(M.view),Ia(M),v=!1,l=M.clientX,u=M.clientY,b("start",M))}}function N(M){if(jn(M),!v){var R=M.clientX-l,b=M.clientY-u;v=R*R+b*b>m}o.mouse("drag",M)}function E(M){At(M.view).on("mousemove.drag mouseup.drag",null),pi(M.view,v),jn(M),o.mouse("end",M)}function I(M,R){if(t.call(this,M,R)){var b=M.changedTouches,A=e.call(this,M,R),B=b.length,K,Z;for(K=0;K>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?Ir(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?Ir(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=bu.exec(t))?new Et(e[1],e[2],e[3],1):(e=xu.exec(t))?new Et(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=wu.exec(t))?Ir(e[1],e[2],e[3],e[4]):(e=ku.exec(t))?Ir(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=Su.exec(t))?is(e[1],e[2]/100,e[3]/100,1):(e=zu.exec(t))?is(e[1],e[2]/100,e[3]/100,e[4]):ts.hasOwnProperty(t)?as(ts[t]):t==="transparent"?new Et(NaN,NaN,NaN,0):null}function as(t){return new Et(t>>16&255,t>>8&255,t&255,1)}function Ir(t,e,n,a){return a<=0&&(t=e=n=NaN),new Et(t,e,n,a)}function Nu(t){return t instanceof yr||(t=Tn(t)),t?(t=t.rgb(),new Et(t.r,t.g,t.b,t.opacity)):new Et}function Ga(t,e,n,a){return arguments.length===1?Nu(t):new Et(t,e,n,a??1)}function Et(t,e,n,a){this.r=+t,this.g=+e,this.b=+n,this.opacity=+a}bo(Et,Ga,hi(yr,{brighter(t){return t=t==null?Ur:Math.pow(Ur,t),new Et(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?vr:Math.pow(vr,t),new Et(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Et(Pn(this.r),Pn(this.g),Pn(this.b),Qr(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:os,formatHex:os,formatHex8:Mu,formatRgb:ss,toString:ss}));function os(){return`#${Nn(this.r)}${Nn(this.g)}${Nn(this.b)}`}function Mu(){return`#${Nn(this.r)}${Nn(this.g)}${Nn(this.b)}${Nn((isNaN(this.opacity)?1:this.opacity)*255)}`}function ss(){const t=Qr(this.opacity);return`${t===1?"rgb(":"rgba("}${Pn(this.r)}, ${Pn(this.g)}, ${Pn(this.b)}${t===1?")":`, ${t})`}`}function Qr(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Pn(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Nn(t){return t=Pn(t),(t<16?"0":"")+t.toString(16)}function is(t,e,n,a){return a<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Bt(t,e,n,a)}function gi(t){if(t instanceof Bt)return new Bt(t.h,t.s,t.l,t.opacity);if(t instanceof yr||(t=Tn(t)),!t)return new Bt;if(t instanceof Bt)return t;t=t.rgb();var e=t.r/255,n=t.g/255,a=t.b/255,o=Math.min(e,n,a),i=Math.max(e,n,a),s=NaN,l=i-o,u=(i+o)/2;return l?(e===i?s=(n-a)/l+(n0&&u<1?0:s,new Bt(s,l,u,t.opacity)}function Pu(t,e,n,a){return arguments.length===1?gi(t):new Bt(t,e,n,a??1)}function Bt(t,e,n,a){this.h=+t,this.s=+e,this.l=+n,this.opacity=+a}bo(Bt,Pu,hi(yr,{brighter(t){return t=t==null?Ur:Math.pow(Ur,t),new Bt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?vr:Math.pow(vr,t),new Bt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,a=n+(n<.5?n:1-n)*e,o=2*n-a;return new Et(Aa(t>=240?t-240:t+120,o,a),Aa(t,o,a),Aa(t<120?t+240:t-120,o,a),this.opacity)},clamp(){return new Bt(ls(this.h),Ar(this.s),Ar(this.l),Qr(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Qr(this.opacity);return`${t===1?"hsl(":"hsla("}${ls(this.h)}, ${Ar(this.s)*100}%, ${Ar(this.l)*100}%${t===1?")":`, ${t})`}`}}));function ls(t){return t=(t||0)%360,t<0?t+360:t}function Ar(t){return Math.max(0,Math.min(1,t||0))}function Aa(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}const xo=t=>()=>t;function Tu(t,e){return function(n){return t+n*e}}function Iu(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(a){return Math.pow(t+a*e,n)}}function Au(t){return(t=+t)==1?mi:function(e,n){return n-e?Iu(e,n,t):xo(isNaN(e)?n:e)}}function mi(t,e){var n=e-t;return n?Tu(t,n):xo(isNaN(t)?e:t)}const Jr=(function t(e){var n=Au(e);function a(o,i){var s=n((o=Ga(o)).r,(i=Ga(i)).r),l=n(o.g,i.g),u=n(o.b,i.b),v=mi(o.opacity,i.opacity);return function(p){return o.r=s(p),o.g=l(p),o.b=u(p),o.opacity=v(p),o+""}}return a.gamma=t,a})(1);function Du(t,e){e||(e=[]);var n=t?Math.min(e.length,t.length):0,a=e.slice(),o;return function(i){for(o=0;on&&(i=e.slice(n,i),l[s]?l[s]+=i:l[++s]=i),(a=a[0])===(o=o[0])?l[s]?l[s]+=o:l[++s]=o:(l[++s]=null,u.push({i:s,x:Ut(a,o)})),n=Da.lastIndex;return n180?p+=360:p-v>180&&(v+=360),f.push({i:m.push(o(m)+"rotate(",null,a)-2,x:Ut(v,p)})):p&&m.push(o(m)+"rotate("+p+a)}function l(v,p,m,f){v!==p?f.push({i:m.push(o(m)+"skewX(",null,a)-2,x:Ut(v,p)}):p&&m.push(o(m)+"skewX("+p+a)}function u(v,p,m,f,w,N){if(v!==m||p!==f){var E=w.push(o(w)+"scale(",null,",",null,")");N.push({i:E-4,x:Ut(v,m)},{i:E-2,x:Ut(p,f)})}else(m!==1||f!==1)&&w.push(o(w)+"scale("+m+","+f+")")}return function(v,p){var m=[],f=[];return v=t(v),p=t(p),i(v.translateX,v.translateY,p.translateX,p.translateY,m,f),s(v.rotate,p.rotate,m,f),l(v.skewX,p.skewX,m,f),u(v.scaleX,v.scaleY,p.scaleX,p.scaleY,m,f),v=p=null,function(w){for(var N=-1,E=f.length,I;++N=0&&t._call.call(void 0,e),t=t._next;--Un}function us(){In=(ea=pr.now())+va,Un=sr=0;try{Gu()}finally{Un=0,Qu(),In=0}}function Uu(){var t=pr.now(),e=t-ea;e>xi&&(va-=e,ea=t)}function Qu(){for(var t,e=$r,n,a=1/0;e;)e._call?(a>e._time&&(a=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:$r=n);ir=t,Ja(a)}function Ja(t){if(!Un){sr&&(sr=clearTimeout(sr));var e=t-In;e>24?(t<1/0&&(sr=setTimeout(us,t-pr.now()-va)),ar&&(ar=clearInterval(ar))):(ar||(ea=pr.now(),ar=setInterval(Uu,xi)),Un=1,wi(us))}}function vs(t,e,n){var a=new ta;return e=e==null?0:+e,a.restart(o=>{a.stop(),t(o+e)},e,n),a}var Ju=da("start","end","cancel","interrupt"),$u=[],Si=0,fs=1,$a=2,Br=3,ps=4,eo=5,qr=6;function fa(t,e,n,a,o,i){var s=t.__transition;if(!s)t.__transition={};else if(n in s)return;ev(t,n,{name:e,index:a,group:o,on:Ju,tween:$u,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Si})}function ko(t,e){var n=Yt(t,e);if(n.state>Si)throw new Error("too late; already scheduled");return n}function tn(t,e){var n=Yt(t,e);if(n.state>Br)throw new Error("too late; already running");return n}function Yt(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ev(t,e,n){var a=t.__transition,o;a[e]=n,n.timer=ki(i,0,n.time);function i(v){n.state=fs,n.timer.restart(s,n.delay,n.time),n.delay<=v&&s(v-n.delay)}function s(v){var p,m,f,w;if(n.state!==fs)return u();for(p in a)if(w=a[p],w.name===n.name){if(w.state===Br)return vs(s);w.state===ps?(w.state=qr,w.timer.stop(),w.on.call("interrupt",t,t.__data__,w.index,w.group),delete a[p]):+p$a&&a.state=0&&(e=e.slice(0,n)),!e||e==="start"})}function Pv(t,e,n){var a,o,i=Mv(e)?ko:tn;return function(){var s=i(this,t),l=s.on;l!==a&&(o=(a=l).copy()).on(e,n),s.on=o}}function Tv(t,e){var n=this._id;return arguments.length<2?Yt(this.node(),n).on.on(t):this.each(Pv(n,t,e))}function Iv(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}function Av(){return this.on("end.remove",Iv(this._id))}function Dv(t){var e=this._name,n=this._id;typeof t!="function"&&(t=_o(t));for(var a=this._groups,o=a.length,i=new Array(o),s=0;s()=>t;function of(t,{sourceEvent:e,target:n,transform:a,dispatch:o}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:a,enumerable:!0,configurable:!0},_:{value:o}})}function sn(t,e,n){this.k=t,this.x=e,this.y=n}sn.prototype={constructor:sn,scale:function(t){return t===1?this:new sn(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new sn(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var pa=new sn(1,0,0);Ni.prototype=sn.prototype;function Ni(t){for(;!t.__zoom;)if(!(t=t.parentNode))return pa;return t.__zoom}function Oa(t){t.stopImmediatePropagation()}function or(t){t.preventDefault(),t.stopImmediatePropagation()}function sf(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function lf(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function hs(){return this.__zoom||pa}function cf(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function df(){return navigator.maxTouchPoints||"ontouchstart"in this}function uf(t,e,n){var a=t.invertX(e[0][0])-n[0][0],o=t.invertX(e[1][0])-n[1][0],i=t.invertY(e[0][1])-n[0][1],s=t.invertY(e[1][1])-n[1][1];return t.translate(o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o),s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s))}function Mi(){var t=sf,e=lf,n=uf,a=cf,o=df,i=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],l=250,u=Fr,v=da("start","zoom","end"),p,m,f,w=500,N=150,E=0,I=10;function H(g){g.property("__zoom",hs).on("wheel.zoom",B,{passive:!1}).on("mousedown.zoom",K).on("dblclick.zoom",Z).filter(o).on("touchstart.zoom",x).on("touchmove.zoom",S).on("touchend.zoom touchcancel.zoom",z).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}H.transform=function(g,C,T,D){var V=g.selection?g.selection():g;V.property("__zoom",hs),g!==V?R(g,C,T,D):V.interrupt().each(function(){b(this,arguments).event(D).start().zoom(null,typeof C=="function"?C.apply(this,arguments):C).end()})},H.scaleBy=function(g,C,T,D){H.scaleTo(g,function(){var V=this.__zoom.k,L=typeof C=="function"?C.apply(this,arguments):C;return V*L},T,D)},H.scaleTo=function(g,C,T,D){H.transform(g,function(){var V=e.apply(this,arguments),L=this.__zoom,q=T==null?M(V):typeof T=="function"?T.apply(this,arguments):T,j=L.invert(q),U=typeof C=="function"?C.apply(this,arguments):C;return n(F(O(L,U),q,j),V,s)},T,D)},H.translateBy=function(g,C,T,D){H.transform(g,function(){return n(this.__zoom.translate(typeof C=="function"?C.apply(this,arguments):C,typeof T=="function"?T.apply(this,arguments):T),e.apply(this,arguments),s)},null,D)},H.translateTo=function(g,C,T,D,V){H.transform(g,function(){var L=e.apply(this,arguments),q=this.__zoom,j=D==null?M(L):typeof D=="function"?D.apply(this,arguments):D;return n(pa.translate(j[0],j[1]).scale(q.k).translate(typeof C=="function"?-C.apply(this,arguments):-C,typeof T=="function"?-T.apply(this,arguments):-T),L,s)},D,V)};function O(g,C){return C=Math.max(i[0],Math.min(i[1],C)),C===g.k?g:new sn(C,g.x,g.y)}function F(g,C,T){var D=C[0]-T[0]*g.k,V=C[1]-T[1]*g.k;return D===g.x&&V===g.y?g:new sn(g.k,D,V)}function M(g){return[(+g[0][0]+ +g[1][0])/2,(+g[0][1]+ +g[1][1])/2]}function R(g,C,T,D){g.on("start.zoom",function(){b(this,arguments).event(D).start()}).on("interrupt.zoom end.zoom",function(){b(this,arguments).event(D).end()}).tween("zoom",function(){var V=this,L=arguments,q=b(V,L).event(D),j=e.apply(V,L),U=T==null?M(j):typeof T=="function"?T.apply(V,L):T,W=Math.max(j[1][0]-j[0][0],j[1][1]-j[0][1]),J=V.__zoom,ae=typeof C=="function"?C.apply(V,L):C,re=u(J.invert(U).concat(W/J.k),ae.invert(U).concat(W/ae.k));return function(ie){if(ie===1)ie=ae;else{var ne=re(ie),G=W/ne[2];ie=new sn(G,U[0]-ne[0]*G,U[1]-ne[1]*G)}q.zoom(null,ie)}})}function b(g,C,T){return!T&&g.__zooming||new A(g,C)}function A(g,C){this.that=g,this.args=C,this.active=0,this.sourceEvent=null,this.extent=e.apply(g,C),this.taps=0}A.prototype={event:function(g){return g&&(this.sourceEvent=g),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(g,C){return this.mouse&&g!=="mouse"&&(this.mouse[1]=C.invert(this.mouse[0])),this.touch0&&g!=="touch"&&(this.touch0[1]=C.invert(this.touch0[0])),this.touch1&&g!=="touch"&&(this.touch1[1]=C.invert(this.touch1[0])),this.that.__zoom=C,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(g){var C=At(this.that).datum();v.call(g,this.that,new of(g,{sourceEvent:this.sourceEvent,target:H,transform:this.that.__zoom,dispatch:v}),C)}};function B(g,...C){if(!t.apply(this,arguments))return;var T=b(this,C).event(g),D=this.__zoom,V=Math.max(i[0],Math.min(i[1],D.k*Math.pow(2,a.apply(this,arguments)))),L=Ft(g);if(T.wheel)(T.mouse[0][0]!==L[0]||T.mouse[0][1]!==L[1])&&(T.mouse[1]=D.invert(T.mouse[0]=L)),clearTimeout(T.wheel);else{if(D.k===V)return;T.mouse=[L,D.invert(L)],Kr(this),T.start()}or(g),T.wheel=setTimeout(q,N),T.zoom("mouse",n(F(O(D,V),T.mouse[0],T.mouse[1]),T.extent,s));function q(){T.wheel=null,T.end()}}function K(g,...C){if(f||!t.apply(this,arguments))return;var T=g.currentTarget,D=b(this,C,!0).event(g),V=At(g.view).on("mousemove.zoom",U,!0).on("mouseup.zoom",W,!0),L=Ft(g,T),q=g.clientX,j=g.clientY;fi(g.view),Oa(g),D.mouse=[L,this.__zoom.invert(L)],Kr(this),D.start();function U(J){if(or(J),!D.moved){var ae=J.clientX-q,re=J.clientY-j;D.moved=ae*ae+re*re>E}D.event(J).zoom("mouse",n(F(D.that.__zoom,D.mouse[0]=Ft(J,T),D.mouse[1]),D.extent,s))}function W(J){V.on("mousemove.zoom mouseup.zoom",null),pi(J.view,D.moved),or(J),D.event(J).end()}}function Z(g,...C){if(t.apply(this,arguments)){var T=this.__zoom,D=Ft(g.changedTouches?g.changedTouches[0]:g,this),V=T.invert(D),L=T.k*(g.shiftKey?.5:2),q=n(F(O(T,L),D,V),e.apply(this,C),s);or(g),l>0?At(this).transition().duration(l).call(R,q,D,g):At(this).call(H.transform,q,D,g)}}function x(g,...C){if(t.apply(this,arguments)){var T=g.touches,D=T.length,V=b(this,C,g.changedTouches.length===D).event(g),L,q,j,U;for(Oa(g),q=0;q"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:e,sourceHandle:n,targetHandle:a})=>`Couldn't create edge for ${t} handle id: "${t==="source"?n:a}", edge id: ${e}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},to=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Pi=["Enter"," ","Escape"],vf={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:e,y:n})=>`Moved selected node ${t}. New position, x: ${e}, y: ${n}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var Qn;(function(t){t.Strict="strict",t.Loose="loose"})(Qn||(Qn={}));var Yn;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(Yn||(Yn={}));var na;(function(t){t.Partial="partial",t.Full="full"})(na||(na={}));const no={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var gn;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(gn||(gn={}));var ra;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(ra||(ra={}));var we;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(we||(we={}));const gs={[we.Left]:we.Right,[we.Right]:we.Left,[we.Top]:we.Bottom,[we.Bottom]:we.Top};function ff(t,e){if(!t&&!e)return!0;if(!t||!e||t.size!==e.size)return!1;if(!t.size&&!e.size)return!0;for(const n of t.keys())if(!e.has(n))return!1;return!0}function ms(t,e,n){if(!n)return;const a=[];t.forEach((o,i)=>{e?.has(i)||a.push(o)}),a.length&&n(a)}function pf(t){return t===null?null:t?"valid":"invalid"}const Ti=t=>"id"in t&&"source"in t&&"target"in t,hf=t=>"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),zo=t=>"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),br=(t,e=[0,0])=>{const{width:n,height:a}=xn(t),o=t.origin??e,i=n*o[0],s=a*o[1];return{x:t.position.x-i,y:t.position.y-s}},gf=(t,e={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};const n=t.reduce((a,o)=>{const i=typeof o=="string";let s=!e.nodeLookup&&!i?o:void 0;e.nodeLookup&&(s=i?e.nodeLookup.get(o):zo(o)?o:e.nodeLookup.get(o.id));const l=s?aa(s,e.nodeOrigin):{x:0,y:0,x2:0,y2:0};return ha(a,l)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return ga(n)},xr=(t,e={})=>{let n={x:1/0,y:1/0,x2:-1/0,y2:-1/0},a=!1;return t.forEach(o=>{(e.filter===void 0||e.filter(o))&&(n=ha(n,aa(o)),a=!0)}),a?ga(n):{x:0,y:0,width:0,height:0}},Co=(t,e,[n,a,o]=[0,0,1],i=!1,s=!1)=>{const l={...kr(e,[n,a,o]),width:e.width/o,height:e.height/o},u=[];for(const v of t.values()){const{measured:p,selectable:m=!0,hidden:f=!1}=v;if(s&&!m||f)continue;const w=p.width??v.width??v.initialWidth??null,N=p.height??v.height??v.initialHeight??null,E=gr(l,$n(v)),I=(w??0)*(N??0),H=i&&E>0;(!v.internals.handleBounds||H||E>=I||v.dragging)&&u.push(v)}return u},mf=(t,e)=>{const n=new Set;return t.forEach(a=>{n.add(a.id)}),e.filter(a=>n.has(a.source)||n.has(a.target))};function _f(t,e){const n=new Map,a=e?.nodes?new Set(e.nodes.map(o=>o.id)):null;return t.forEach(o=>{o.measured.width&&o.measured.height&&(e?.includeHiddenNodes||!o.hidden)&&(!a||a.has(o.id))&&n.set(o.id,o)}),n}async function yf({nodes:t,width:e,height:n,panZoom:a,minZoom:o,maxZoom:i},s){if(t.size===0)return Promise.resolve(!0);const l=_f(t,s),u=xr(l),v=Eo(u,e,n,s?.minZoom??o,s?.maxZoom??i,s?.padding??.1);return await a.setViewport(v,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)}function Ii({nodeId:t,nextPosition:e,nodeLookup:n,nodeOrigin:a=[0,0],nodeExtent:o,onError:i}){const s=n.get(t),l=s.parentId?n.get(s.parentId):void 0,{x:u,y:v}=l?l.internals.positionAbsolute:{x:0,y:0},p=s.origin??a;let m=s.extent||o;if(s.extent==="parent"&&!s.expandParent)if(!l)i?.("005",hr.error005());else{const w=l.measured.width,N=l.measured.height;w&&N&&(m=[[u,v],[u+w,v+N]])}else l&&er(s.extent)&&(m=[[s.extent[0][0]+u,s.extent[0][1]+v],[s.extent[1][0]+u,s.extent[1][1]+v]]);const f=er(m)?An(e,m,s.measured):e;return(s.measured.width===void 0||s.measured.height===void 0)&&i?.("015",hr.error015()),{position:{x:f.x-u+(s.measured.width??0)*p[0],y:f.y-v+(s.measured.height??0)*p[1]},positionAbsolute:f}}async function bf({nodesToRemove:t=[],edgesToRemove:e=[],nodes:n,edges:a,onBeforeDelete:o}){const i=new Set(t.map(f=>f.id)),s=[];for(const f of n){if(f.deletable===!1)continue;const w=i.has(f.id),N=!w&&f.parentId&&s.find(E=>E.id===f.parentId);(w||N)&&s.push(f)}const l=new Set(e.map(f=>f.id)),u=a.filter(f=>f.deletable!==!1),p=mf(s,u);for(const f of u)l.has(f.id)&&!p.find(N=>N.id===f.id)&&p.push(f);if(!o)return{edges:p,nodes:s};const m=await o({nodes:s,edges:p});return typeof m=="boolean"?m?{edges:p,nodes:s}:{edges:[],nodes:[]}:m}const Jn=(t,e=0,n=1)=>Math.min(Math.max(t,e),n),An=(t={x:0,y:0},e,n)=>({x:Jn(t.x,e[0][0],e[1][0]-(n?.width??0)),y:Jn(t.y,e[0][1],e[1][1]-(n?.height??0))});function Ai(t,e,n){const{width:a,height:o}=xn(n),{x:i,y:s}=n.internals.positionAbsolute;return An(t,[[i,s],[i+a,s+o]],e)}const _s=(t,e,n)=>tn?-Jn(Math.abs(t-n),1,e)/e:0,Di=(t,e,n=15,a=40)=>{const o=_s(t.x,a,e.width-a)*n,i=_s(t.y,a,e.height-a)*n;return[o,i]},ha=(t,e)=>({x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}),ro=({x:t,y:e,width:n,height:a})=>({x:t,y:e,x2:t+n,y2:e+a}),ga=({x:t,y:e,x2:n,y2:a})=>({x:t,y:e,width:n-t,height:a-e}),$n=(t,e=[0,0])=>{const{x:n,y:a}=zo(t)?t.internals.positionAbsolute:br(t,e);return{x:n,y:a,width:t.measured?.width??t.width??t.initialWidth??0,height:t.measured?.height??t.height??t.initialHeight??0}},aa=(t,e=[0,0])=>{const{x:n,y:a}=zo(t)?t.internals.positionAbsolute:br(t,e);return{x:n,y:a,x2:n+(t.measured?.width??t.width??t.initialWidth??0),y2:a+(t.measured?.height??t.height??t.initialHeight??0)}},Oi=(t,e)=>ga(ha(ro(t),ro(e))),gr=(t,e)=>{const n=Math.max(0,Math.min(t.x+t.width,e.x+e.width)-Math.max(t.x,e.x)),a=Math.max(0,Math.min(t.y+t.height,e.y+e.height)-Math.max(t.y,e.y));return Math.ceil(n*a)},ys=t=>ln(t.width)&&ln(t.height)&&ln(t.x)&&ln(t.y),ln=t=>!isNaN(t)&&isFinite(t),xf=(t,e)=>{},wr=(t,e=[1,1])=>({x:e[0]*Math.round(t.x/e[0]),y:e[1]*Math.round(t.y/e[1])}),kr=({x:t,y:e},[n,a,o],i=!1,s=[1,1])=>{const l={x:(t-n)/o,y:(e-a)/o};return i?wr(l,s):l},oa=({x:t,y:e},[n,a,o])=>({x:t*o+n,y:e*o+a});function qn(t,e){if(typeof t=="number")return Math.floor((e-e/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const n=parseFloat(t);if(!Number.isNaN(n))return Math.floor(n)}if(typeof t=="string"&&t.endsWith("%")){const n=parseFloat(t);if(!Number.isNaN(n))return Math.floor(e*n*.01)}return console.error(`[React Flow] The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function wf(t,e,n){if(typeof t=="string"||typeof t=="number"){const a=qn(t,n),o=qn(t,e);return{top:a,right:o,bottom:a,left:o,x:o*2,y:a*2}}if(typeof t=="object"){const a=qn(t.top??t.y??0,n),o=qn(t.bottom??t.y??0,n),i=qn(t.left??t.x??0,e),s=qn(t.right??t.x??0,e);return{top:a,right:s,bottom:o,left:i,x:i+s,y:a+o}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function kf(t,e,n,a,o,i){const{x:s,y:l}=oa(t,[e,n,a]),{x:u,y:v}=oa({x:t.x+t.width,y:t.y+t.height},[e,n,a]),p=o-u,m=i-v;return{left:Math.floor(s),top:Math.floor(l),right:Math.floor(p),bottom:Math.floor(m)}}const Eo=(t,e,n,a,o,i)=>{const s=wf(i,e,n),l=(e-s.x)/t.width,u=(n-s.y)/t.height,v=Math.min(l,u),p=Jn(v,a,o),m=t.x+t.width/2,f=t.y+t.height/2,w=e/2-m*p,N=n/2-f*p,E=kf(t,w,N,p,e,n),I={left:Math.min(E.left-s.left,0),top:Math.min(E.top-s.top,0),right:Math.min(E.right-s.right,0),bottom:Math.min(E.bottom-s.bottom,0)};return{x:w-I.left+I.right,y:N-I.top+I.bottom,zoom:p}},mr=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function er(t){return t!=null&&t!=="parent"}function xn(t){return{width:t.measured?.width??t.width??t.initialWidth??0,height:t.measured?.height??t.height??t.initialHeight??0}}function Ri(t){return(t.measured?.width??t.width??t.initialWidth)!==void 0&&(t.measured?.height??t.height??t.initialHeight)!==void 0}function Sf(t,e={width:0,height:0},n,a,o){const i={...t},s=a.get(n);if(s){const l=s.origin||o;i.x+=s.internals.positionAbsolute.x-(e.width??0)*l[0],i.y+=s.internals.positionAbsolute.y-(e.height??0)*l[1]}return i}function zf(t){return{...vf,...t||{}}}function Ra(t,{snapGrid:e=[0,0],snapToGrid:n=!1,transform:a,containerBounds:o}){const{x:i,y:s}=qt(t),l=kr({x:i-(o?.left??0),y:s-(o?.top??0)},a),{x:u,y:v}=n?wr(l,e):l;return{xSnapped:u,ySnapped:v,...l}}const Li=t=>({width:t.offsetWidth,height:t.offsetHeight}),Hi=t=>t?.getRootNode?.()||window?.document,Cf=["INPUT","SELECT","TEXTAREA"];function Vi(t){const e=t.composedPath?.()?.[0]||t.target;return e?.nodeType!==1?!1:Cf.includes(e.nodeName)||e.hasAttribute("contenteditable")||!!e.closest(".nokey")}const Fi=t=>"clientX"in t,qt=(t,e)=>{const n=Fi(t),a=n?t.clientX:t.touches?.[0].clientX,o=n?t.clientY:t.touches?.[0].clientY;return{x:a-(e?.left??0),y:o-(e?.top??0)}},bs=(t,e,n,a,o)=>{const i=e.querySelectorAll(`.${t}`);return!i||!i.length?null:Array.from(i).map(s=>{const l=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:t,nodeId:o,position:s.getAttribute("data-handlepos"),x:(l.left-n.left)/a,y:(l.top-n.top)/a,...Li(s)}})};function Ef({sourceX:t,sourceY:e,targetX:n,targetY:a,sourceControlX:o,sourceControlY:i,targetControlX:s,targetControlY:l}){const u=t*.125+o*.375+s*.375+n*.125,v=e*.125+i*.375+l*.375+a*.125,p=Math.abs(u-t),m=Math.abs(v-e);return[u,v,p,m]}function Rr(t,e){return t>=0?.5*t:e*25*Math.sqrt(-t)}function xs({pos:t,x1:e,y1:n,x2:a,y2:o,c:i}){switch(t){case we.Left:return[e-Rr(e-a,i),n];case we.Right:return[e+Rr(a-e,i),n];case we.Top:return[e,n-Rr(n-o,i)];case we.Bottom:return[e,n+Rr(o-n,i)]}}function Bi({sourceX:t,sourceY:e,sourcePosition:n=we.Bottom,targetX:a,targetY:o,targetPosition:i=we.Top,curvature:s=.25}){const[l,u]=xs({pos:n,x1:t,y1:e,x2:a,y2:o,c:s}),[v,p]=xs({pos:i,x1:a,y1:o,x2:t,y2:e,c:s}),[m,f,w,N]=Ef({sourceX:t,sourceY:e,targetX:a,targetY:o,sourceControlX:l,sourceControlY:u,targetControlX:v,targetControlY:p});return[`M${t},${e} C${l},${u} ${v},${p} ${a},${o}`,m,f,w,N]}function qi({sourceX:t,sourceY:e,targetX:n,targetY:a}){const o=Math.abs(n-t)/2,i=n0}const Pf=({source:t,sourceHandle:e,target:n,targetHandle:a})=>`xy-edge__${t}${e||""}-${n}${a||""}`,Tf=(t,e)=>e.some(n=>n.source===t.source&&n.target===t.target&&(n.sourceHandle===t.sourceHandle||!n.sourceHandle&&!t.sourceHandle)&&(n.targetHandle===t.targetHandle||!n.targetHandle&&!t.targetHandle)),If=(t,e,n={})=>{if(!t.source||!t.target)return e;const a=n.getEdgeId||Pf;let o;return Ti(t)?o={...t}:o={...t,id:a(t)},Tf(o,e)?e:(o.sourceHandle===null&&delete o.sourceHandle,o.targetHandle===null&&delete o.targetHandle,e.concat(o))};function Ki({sourceX:t,sourceY:e,targetX:n,targetY:a}){const[o,i,s,l]=qi({sourceX:t,sourceY:e,targetX:n,targetY:a});return[`M ${t},${e}L ${n},${a}`,o,i,s,l]}const ws={[we.Left]:{x:-1,y:0},[we.Right]:{x:1,y:0},[we.Top]:{x:0,y:-1},[we.Bottom]:{x:0,y:1}},Af=({source:t,sourcePosition:e=we.Bottom,target:n})=>e===we.Left||e===we.Right?t.xMath.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function Df({source:t,sourcePosition:e=we.Bottom,target:n,targetPosition:a=we.Top,center:o,offset:i,stepPosition:s}){const l=ws[e],u=ws[a],v={x:t.x+l.x*i,y:t.y+l.y*i},p={x:n.x+u.x*i,y:n.y+u.y*i},m=Af({source:v,sourcePosition:e,target:p}),f=m.x!==0?"x":"y",w=m[f];let N=[],E,I;const H={x:0,y:0},O={x:0,y:0},[,,F,M]=qi({sourceX:t.x,sourceY:t.y,targetX:n.x,targetY:n.y});if(l[f]*u[f]===-1){f==="x"?(E=o.x??v.x+(p.x-v.x)*s,I=o.y??(v.y+p.y)/2):(E=o.x??(v.x+p.x)/2,I=o.y??v.y+(p.y-v.y)*s);const b=[{x:E,y:v.y},{x:E,y:p.y}],A=[{x:v.x,y:I},{x:p.x,y:I}];l[f]===w?N=f==="x"?b:A:N=f==="x"?A:b}else{const b=[{x:v.x,y:p.y}],A=[{x:p.x,y:v.y}];if(f==="x"?N=l.x===w?A:b:N=l.y===w?b:A,e===a){const S=Math.abs(t[f]-n[f]);if(S<=i){const z=Math.min(i-1,i-S);l[f]===w?H[f]=(v[f]>t[f]?-1:1)*z:O[f]=(p[f]>n[f]?-1:1)*z}}if(e!==a){const S=f==="x"?"y":"x",z=l[f]===u[S],g=v[S]>p[S],C=v[S]=x?(E=(B.x+K.x)/2,I=N[0].y):(E=N[0].x,I=(B.y+K.y)/2)}return[[t,{x:v.x+H.x,y:v.y+H.y},...N,{x:p.x+O.x,y:p.y+O.y},n],E,I,F,M]}function Of(t,e,n,a){const o=Math.min(ks(t,e)/2,ks(e,n)/2,a),{x:i,y:s}=e;if(t.x===i&&i===n.x||t.y===s&&s===n.y)return`L${i} ${s}`;if(t.y===s){const v=t.x{let M="";return F>0&&Fn.id===e):t[0])||null}function ao(t,e){return t?typeof t=="string"?t:`${e?`${e}__`:""}${Object.keys(t).sort().map(a=>`${a}=${t[a]}`).join("&")}`:""}function Lf(t,{id:e,defaultColor:n,defaultMarkerStart:a,defaultMarkerEnd:o}){const i=new Set;return t.reduce((s,l)=>([l.markerStart||a,l.markerEnd||o].forEach(u=>{if(u&&typeof u=="object"){const v=ao(u,e);i.has(v)||(s.push({id:v,color:u.color||n,...u}),i.add(v))}}),s),[]).sort((s,l)=>s.id.localeCompare(l.id))}const ji=1e3,Hf=10,Mo={nodeOrigin:[0,0],nodeExtent:to,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},Vf={...Mo,checkEquality:!0};function Po(t,e){const n={...t};for(const a in e)e[a]!==void 0&&(n[a]=e[a]);return n}function Ff(t,e,n){const a=Po(Mo,n);for(const o of t.values())if(o.parentId)Io(o,t,e,a);else{const i=br(o,a.nodeOrigin),s=er(o.extent)?o.extent:a.nodeExtent,l=An(i,s,xn(o));o.internals.positionAbsolute=l}}function Bf(t,e){if(!t.handles)return t.measured?e?.internals.handleBounds:void 0;const n=[],a=[];for(const o of t.handles){const i={id:o.id,width:o.width??1,height:o.height??1,nodeId:t.id,x:o.x,y:o.y,position:o.position,type:o.type};o.type==="source"?n.push(i):o.type==="target"&&a.push(i)}return{source:n,target:a}}function To(t){return t==="manual"}function qf(t,e,n,a={}){const o=Po(Vf,a),i={i:0},s=new Map(e),l=o?.elevateNodesOnSelect&&!To(o.zIndexMode)?ji:0;let u=t.length>0;e.clear(),n.clear();for(const v of t){let p=s.get(v.id);if(o.checkEquality&&v===p?.internals.userNode)e.set(v.id,p);else{const m=br(v,o.nodeOrigin),f=er(v.extent)?v.extent:o.nodeExtent,w=An(m,f,xn(v));p={...o.defaults,...v,measured:{width:v.measured?.width,height:v.measured?.height},internals:{positionAbsolute:w,handleBounds:Bf(v,p),z:Zi(v,l,o.zIndexMode),userNode:v}},e.set(v.id,p)}(p.measured===void 0||p.measured.width===void 0||p.measured.height===void 0)&&!p.hidden&&(u=!1),v.parentId&&Io(p,e,n,a,i)}return u}function Kf(t,e){if(!t.parentId)return;const n=e.get(t.parentId);n?n.set(t.id,t):e.set(t.parentId,new Map([[t.id,t]]))}function Io(t,e,n,a,o){const{elevateNodesOnSelect:i,nodeOrigin:s,nodeExtent:l,zIndexMode:u}=Po(Mo,a),v=t.parentId,p=e.get(v);if(!p){console.warn(`Parent node ${v} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Kf(t,n),o&&!p.parentId&&p.internals.rootParentIndex===void 0&&u==="auto"&&(p.internals.rootParentIndex=++o.i,p.internals.z=p.internals.z+o.i*Hf),o&&p.internals.rootParentIndex!==void 0&&(o.i=p.internals.rootParentIndex);const m=i&&!To(u)?ji:0,{x:f,y:w,z:N}=jf(t,p,s,l,m,u),{positionAbsolute:E}=t.internals,I=f!==E.x||w!==E.y;(I||N!==t.internals.z)&&e.set(t.id,{...t,internals:{...t.internals,positionAbsolute:I?{x:f,y:w}:E,z:N}})}function Zi(t,e,n){const a=ln(t.zIndex)?t.zIndex:0;return To(n)?a:a+(t.selected?e:0)}function jf(t,e,n,a,o,i){const{x:s,y:l}=e.internals.positionAbsolute,u=xn(t),v=br(t,n),p=er(t.extent)?An(v,t.extent,u):v;let m=An({x:s+p.x,y:l+p.y},a,u);t.extent==="parent"&&(m=Ai(m,u,e));const f=Zi(t,o,i),w=e.internals.z??0;return{x:m.x,y:m.y,z:w>=f?w+1:f}}function Zf(t,e,n,a=[0,0]){const o=[],i=new Map;for(const s of t){const l=e.get(s.parentId);if(!l)continue;const u=i.get(s.parentId)?.expandedRect??$n(l),v=Oi(u,s.rect);i.set(s.parentId,{expandedRect:v,parent:l})}return i.size>0&&i.forEach(({expandedRect:s,parent:l},u)=>{const v=l.internals.positionAbsolute,p=xn(l),m=l.origin??a,f=s.x0||w>0||I||H)&&(o.push({id:u,type:"position",position:{x:l.position.x-f+I,y:l.position.y-w+H}}),n.get(u)?.forEach(O=>{t.some(F=>F.id===O.id)||o.push({id:O.id,type:"position",position:{x:O.position.x+f,y:O.position.y+w}})})),(p.width0){const w=Zf(f,e,n,o);v.push(...w)}return{changes:v,updatedInternals:u}}async function Xf({delta:t,panZoom:e,transform:n,translateExtent:a,width:o,height:i}){if(!e||!t.x&&!t.y)return Promise.resolve(!1);const s=await e.setViewportConstrained({x:n[0]+t.x,y:n[1]+t.y,zoom:n[2]},[[0,0],[o,i]],a),l=!!s&&(s.x!==n[0]||s.y!==n[1]||s.k!==n[2]);return Promise.resolve(l)}function Es(t,e,n,a,o,i){let s=o;const l=a.get(s)||new Map;a.set(s,l.set(n,e)),s=`${o}-${t}`;const u=a.get(s)||new Map;if(a.set(s,u.set(n,e)),i){s=`${o}-${t}-${i}`;const v=a.get(s)||new Map;a.set(s,v.set(n,e))}}function Wf(t,e,n){t.clear(),e.clear();for(const a of n){const{source:o,target:i,sourceHandle:s=null,targetHandle:l=null}=a,u={edgeId:a.id,source:o,target:i,sourceHandle:s,targetHandle:l},v=`${o}-${s}--${i}-${l}`,p=`${i}-${l}--${o}-${s}`;Es("source",u,p,t,o,s),Es("target",u,v,t,i,l),e.set(a.id,a)}}function Yi(t,e){if(!t.parentId)return!1;const n=e.get(t.parentId);return n?n.selected?!0:Yi(n,e):!1}function Ns(t,e,n){let a=t;do{if(a?.matches?.(e))return!0;if(a===n)return!1;a=a?.parentElement}while(a);return!1}function Gf(t,e,n,a){const o=new Map;for(const[i,s]of t)if((s.selected||s.id===a)&&(!s.parentId||!Yi(s,t))&&(s.draggable||e&&typeof s.draggable>"u")){const l=t.get(i);l&&o.set(i,{id:i,position:l.position||{x:0,y:0},distance:{x:n.x-l.internals.positionAbsolute.x,y:n.y-l.internals.positionAbsolute.y},extent:l.extent,parentId:l.parentId,origin:l.origin,expandParent:l.expandParent,internals:{positionAbsolute:l.internals.positionAbsolute||{x:0,y:0}},measured:{width:l.measured.width??0,height:l.measured.height??0}})}return o}function La({nodeId:t,dragItems:e,nodeLookup:n,dragging:a=!0}){const o=[];for(const[s,l]of e){const u=n.get(s)?.internals.userNode;u&&o.push({...u,position:l.position,dragging:a})}if(!t)return[o[0],o];const i=n.get(t)?.internals.userNode;return[i?{...i,position:e.get(t)?.position||i.position,dragging:a}:o[0],o]}function Uf({dragItems:t,snapGrid:e,x:n,y:a}){const o=t.values().next().value;if(!o)return null;const i={x:n-o.distance.x,y:a-o.distance.y},s=wr(i,e);return{x:s.x-i.x,y:s.y-i.y}}function Qf({onNodeMouseDown:t,getStoreItems:e,onDragStart:n,onDrag:a,onDragStop:o}){let i={x:null,y:null},s=0,l=new Map,u=!1,v={x:0,y:0},p=null,m=!1,f=null,w=!1,N=!1,E=null;function I({noDragClassName:O,handleSelector:F,domNode:M,isSelectable:R,nodeId:b,nodeClickDistance:A=0}){f=At(M);function B({x:S,y:z}){const{nodeLookup:g,nodeExtent:C,snapGrid:T,snapToGrid:D,nodeOrigin:V,onNodeDrag:L,onSelectionDrag:q,onError:j,updateNodePositions:U}=e();i={x:S,y:z};let W=!1;const J=l.size>1,ae=J&&C?ro(xr(l)):null,re=J&&D?Uf({dragItems:l,snapGrid:T,x:S,y:z}):null;for(const[ie,ne]of l){if(!g.has(ie))continue;let G={x:S-ne.distance.x,y:z-ne.distance.y};D&&(G=re?{x:Math.round(G.x+re.x),y:Math.round(G.y+re.y)}:wr(G,T));let oe=null;if(J&&C&&!ne.extent&&ae){const{positionAbsolute:te}=ne.internals,ue=te.x-ae.x+C[0][0],le=te.x+ne.measured.width-ae.x2+C[1][0],he=te.y-ae.y+C[0][1],ve=te.y+ne.measured.height-ae.y2+C[1][1];oe=[[ue,he],[le,ve]]}const{position:ee,positionAbsolute:se}=Ii({nodeId:ie,nextPosition:G,nodeLookup:g,nodeExtent:oe||C,nodeOrigin:V,onError:j});W=W||ne.position.x!==ee.x||ne.position.y!==ee.y,ne.position=ee,ne.internals.positionAbsolute=se}if(N=N||W,!!W&&(U(l,!0),E&&(a||L||!b&&q))){const[ie,ne]=La({nodeId:b,dragItems:l,nodeLookup:g});a?.(E,l,ie,ne),L?.(E,ie,ne),b||q?.(E,ne)}}async function K(){if(!p)return;const{transform:S,panBy:z,autoPanSpeed:g,autoPanOnNodeDrag:C}=e();if(!C){u=!1,cancelAnimationFrame(s);return}const[T,D]=Di(v,p,g);(T!==0||D!==0)&&(i.x=(i.x??0)-T/S[2],i.y=(i.y??0)-D/S[2],await z({x:T,y:D})&&B(i)),s=requestAnimationFrame(K)}function Z(S){const{nodeLookup:z,multiSelectionActive:g,nodesDraggable:C,transform:T,snapGrid:D,snapToGrid:V,selectNodesOnDrag:L,onNodeDragStart:q,onSelectionDragStart:j,unselectNodesAndEdges:U}=e();m=!0,(!L||!R)&&!g&&b&&(z.get(b)?.selected||U()),R&&L&&b&&t?.(b);const W=Ra(S.sourceEvent,{transform:T,snapGrid:D,snapToGrid:V,containerBounds:p});if(i=W,l=Gf(z,C,W,b),l.size>0&&(n||q||!b&&j)){const[J,ae]=La({nodeId:b,dragItems:l,nodeLookup:z});n?.(S.sourceEvent,l,J,ae),q?.(S.sourceEvent,J,ae),b||j?.(S.sourceEvent,ae)}}const x=_u().clickDistance(A).on("start",S=>{const{domNode:z,nodeDragThreshold:g,transform:C,snapGrid:T,snapToGrid:D}=e();p=z?.getBoundingClientRect()||null,w=!1,N=!1,E=S.sourceEvent,g===0&&Z(S),i=Ra(S.sourceEvent,{transform:C,snapGrid:T,snapToGrid:D,containerBounds:p}),v=qt(S.sourceEvent,p)}).on("drag",S=>{const{autoPanOnNodeDrag:z,transform:g,snapGrid:C,snapToGrid:T,nodeDragThreshold:D,nodeLookup:V}=e(),L=Ra(S.sourceEvent,{transform:g,snapGrid:C,snapToGrid:T,containerBounds:p});if(E=S.sourceEvent,(S.sourceEvent.type==="touchmove"&&S.sourceEvent.touches.length>1||b&&!V.has(b))&&(w=!0),!w){if(!u&&z&&m&&(u=!0,K()),!m){const q=qt(S.sourceEvent,p),j=q.x-v.x,U=q.y-v.y;Math.sqrt(j*j+U*U)>D&&Z(S)}(i.x!==L.xSnapped||i.y!==L.ySnapped)&&l&&m&&(v=qt(S.sourceEvent,p),B(L))}}).on("end",S=>{if(!(!m||w)&&(u=!1,m=!1,cancelAnimationFrame(s),l.size>0)){const{nodeLookup:z,updateNodePositions:g,onNodeDragStop:C,onSelectionDragStop:T}=e();if(N&&(g(l,!1),N=!1),o||C||!b&&T){const[D,V]=La({nodeId:b,dragItems:l,nodeLookup:z,dragging:!1});o?.(S.sourceEvent,l,D,V),C?.(S.sourceEvent,D,V),b||T?.(S.sourceEvent,V)}}}).filter(S=>{const z=S.target;return!S.button&&(!O||!Ns(z,`.${O}`,M))&&(!F||Ns(z,F,M))});f.call(x)}function H(){f?.on(".drag",null)}return{update:I,destroy:H}}function Jf(t,e,n){const a=[],o={x:t.x-n,y:t.y-n,width:n*2,height:n*2};for(const i of e.values())gr(o,$n(i))>0&&a.push(i);return a}const $f=250;function ep(t,e,n,a){let o=[],i=1/0;const s=Jf(t,n,e+$f);for(const l of s){const u=[...l.internals.handleBounds?.source??[],...l.internals.handleBounds?.target??[]];for(const v of u){if(a.nodeId===v.nodeId&&a.type===v.type&&a.id===v.id)continue;const{x:p,y:m}=Dn(l,v,v.position,!0),f=Math.sqrt(Math.pow(p-t.x,2)+Math.pow(m-t.y,2));f>e||(f1){const l=a.type==="source"?"target":"source";return o.find(u=>u.type===l)??o[0]}return o[0]}function Xi(t,e,n,a,o,i=!1){const s=a.get(t);if(!s)return null;const l=o==="strict"?s.internals.handleBounds?.[e]:[...s.internals.handleBounds?.source??[],...s.internals.handleBounds?.target??[]],u=(n?l?.find(v=>v.id===n):l?.[0])??null;return u&&i?{...u,...Dn(s,u,u.position,!0)}:u}function Wi(t,e){return t||(e?.classList.contains("target")?"target":e?.classList.contains("source")?"source":null)}function tp(t,e){let n=null;return e?n=!0:t&&!e&&(n=!1),n}const Gi=()=>!0;function np(t,{connectionMode:e,connectionRadius:n,handleId:a,nodeId:o,edgeUpdaterType:i,isTarget:s,domNode:l,nodeLookup:u,lib:v,autoPanOnConnect:p,flowId:m,panBy:f,cancelConnection:w,onConnectStart:N,onConnect:E,onConnectEnd:I,isValidConnection:H=Gi,onReconnectEnd:O,updateConnection:F,getTransform:M,getFromHandle:R,autoPanSpeed:b,dragThreshold:A=1,handleDomNode:B}){const K=Hi(t.target);let Z=0,x;const{x:S,y:z}=qt(t),g=Wi(i,B),C=l?.getBoundingClientRect();let T=!1;if(!C||!g)return;const D=Xi(o,g,a,u,e);if(!D)return;let V=qt(t,C),L=!1,q=null,j=!1,U=null;function W(){if(!p||!C)return;const[ee,se]=Di(V,C,b);f({x:ee,y:se}),Z=requestAnimationFrame(W)}const J={...D,nodeId:o,type:g,position:D.position},ae=u.get(o);let ie={inProgress:!0,isValid:null,from:Dn(ae,J,we.Left,!0),fromHandle:J,fromPosition:J.position,fromNode:ae,to:V,toHandle:null,toPosition:gs[J.position],toNode:null,pointer:V};function ne(){T=!0,F(ie),N?.(t,{nodeId:o,handleId:a,handleType:g})}A===0&&ne();function G(ee){if(!T){const{x:ve,y:fe}=qt(ee),ke=ve-S,Ae=fe-z;if(!(ke*ke+Ae*Ae>A*A))return;ne()}if(!R()||!J){oe(ee);return}const se=M();V=qt(ee,C),x=ep(kr(V,se,!1,[1,1]),n,u,J),L||(W(),L=!0);const te=Ui(ee,{handle:x,connectionMode:e,fromNodeId:o,fromHandleId:a,fromType:s?"target":"source",isValidConnection:H,doc:K,lib:v,flowId:m,nodeLookup:u});U=te.handleDomNode,q=te.connection,j=tp(!!x,te.isValid);const ue=u.get(o),le=ue?Dn(ue,J,we.Left,!0):ie.from,he={...ie,from:le,isValid:j,to:te.toHandle&&j?oa({x:te.toHandle.x,y:te.toHandle.y},se):V,toHandle:te.toHandle,toPosition:j&&te.toHandle?te.toHandle.position:gs[J.position],toNode:te.toHandle?u.get(te.toHandle.nodeId):null,pointer:V};F(he),ie=he}function oe(ee){if(!("touches"in ee&&ee.touches.length>0)){if(T){(x||U)&&q&&j&&E?.(q);const{inProgress:se,...te}=ie,ue={...te,toPosition:ie.toHandle?ie.toPosition:null};I?.(ee,ue),i&&O?.(ee,ue)}w(),cancelAnimationFrame(Z),L=!1,j=!1,q=null,U=null,K.removeEventListener("mousemove",G),K.removeEventListener("mouseup",oe),K.removeEventListener("touchmove",G),K.removeEventListener("touchend",oe)}}K.addEventListener("mousemove",G),K.addEventListener("mouseup",oe),K.addEventListener("touchmove",G),K.addEventListener("touchend",oe)}function Ui(t,{handle:e,connectionMode:n,fromNodeId:a,fromHandleId:o,fromType:i,doc:s,lib:l,flowId:u,isValidConnection:v=Gi,nodeLookup:p}){const m=i==="target",f=e?s.querySelector(`.${l}-flow__handle[data-id="${u}-${e?.nodeId}-${e?.id}-${e?.type}"]`):null,{x:w,y:N}=qt(t),E=s.elementFromPoint(w,N),I=E?.classList.contains(`${l}-flow__handle`)?E:f,H={handleDomNode:I,isValid:!1,connection:null,toHandle:null};if(I){const O=Wi(void 0,I),F=I.getAttribute("data-nodeid"),M=I.getAttribute("data-handleid"),R=I.classList.contains("connectable"),b=I.classList.contains("connectableend");if(!F||!O)return H;const A={source:m?F:a,sourceHandle:m?M:o,target:m?a:F,targetHandle:m?o:M};H.connection=A;const K=R&&b&&(n===Qn.Strict?m&&O==="source"||!m&&O==="target":F!==a||M!==o);H.isValid=K&&v(A),H.toHandle=Xi(F,O,M,p,n,!0)}return H}const Ms={onPointerDown:np,isValid:Ui};function rp({domNode:t,panZoom:e,getTransform:n,getViewScale:a}){const o=At(t);function i({translateExtent:l,width:u,height:v,zoomStep:p=1,pannable:m=!0,zoomable:f=!0,inversePan:w=!1}){const N=F=>{if(F.sourceEvent.type!=="wheel"||!e)return;const M=n(),R=F.sourceEvent.ctrlKey&&mr()?10:1,b=-F.sourceEvent.deltaY*(F.sourceEvent.deltaMode===1?.05:F.sourceEvent.deltaMode?1:.002)*p,A=M[2]*Math.pow(2,b*R);e.scaleTo(A)};let E=[0,0];const I=F=>{(F.sourceEvent.type==="mousedown"||F.sourceEvent.type==="touchstart")&&(E=[F.sourceEvent.clientX??F.sourceEvent.touches[0].clientX,F.sourceEvent.clientY??F.sourceEvent.touches[0].clientY])},H=F=>{const M=n();if(F.sourceEvent.type!=="mousemove"&&F.sourceEvent.type!=="touchmove"||!e)return;const R=[F.sourceEvent.clientX??F.sourceEvent.touches[0].clientX,F.sourceEvent.clientY??F.sourceEvent.touches[0].clientY],b=[R[0]-E[0],R[1]-E[1]];E=R;const A=a()*Math.max(M[2],Math.log(M[2]))*(w?-1:1),B={x:M[0]-b[0]*A,y:M[1]-b[1]*A},K=[[0,0],[u,v]];e.setViewportConstrained({x:B.x,y:B.y,zoom:M[2]},K,l)},O=Mi().on("start",I).on("zoom",m?H:null).on("zoom.wheel",f?N:null);o.call(O,{})}function s(){o.on("zoom",null)}return{update:i,destroy:s,pointer:Ft}}const ma=t=>({x:t.x,y:t.y,zoom:t.k}),Ha=({x:t,y:e,zoom:n})=>pa.translate(t,e).scale(n),Kn=(t,e)=>t.target.closest(`.${e}`),Qi=(t,e)=>e===2&&Array.isArray(t)&&t.includes(2),ap=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,Va=(t,e=0,n=ap,a=()=>{})=>{const o=typeof e=="number"&&e>0;return o||a(),o?t.transition().duration(e).ease(n).on("end",a):t},Ji=t=>{const e=t.ctrlKey&&mr()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*e};function op({zoomPanValues:t,noWheelClassName:e,d3Selection:n,d3Zoom:a,panOnScrollMode:o,panOnScrollSpeed:i,zoomOnPinch:s,onPanZoomStart:l,onPanZoom:u,onPanZoomEnd:v}){return p=>{if(Kn(p,e))return p.ctrlKey&&p.preventDefault(),!1;p.preventDefault(),p.stopImmediatePropagation();const m=n.property("__zoom").k||1;if(p.ctrlKey&&s){const I=Ft(p),H=Ji(p),O=m*Math.pow(2,H);a.scaleTo(n,O,I,p);return}const f=p.deltaMode===1?20:1;let w=o===Yn.Vertical?0:p.deltaX*f,N=o===Yn.Horizontal?0:p.deltaY*f;!mr()&&p.shiftKey&&o!==Yn.Vertical&&(w=p.deltaY*f,N=0),a.translateBy(n,-(w/m)*i,-(N/m)*i,{internal:!0});const E=ma(n.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?(u?.(p,E),t.panScrollTimeout=setTimeout(()=>{v?.(p,E),t.isPanScrolling=!1},150)):(t.isPanScrolling=!0,l?.(p,E))}}function sp({noWheelClassName:t,preventScrolling:e,d3ZoomHandler:n}){return function(a,o){const i=a.type==="wheel",s=!e&&i&&!a.ctrlKey,l=Kn(a,t);if(a.ctrlKey&&i&&l&&a.preventDefault(),s||l)return null;a.preventDefault(),n.call(this,a,o)}}function ip({zoomPanValues:t,onDraggingChange:e,onPanZoomStart:n}){return a=>{if(a.sourceEvent?.internal)return;const o=ma(a.transform);t.mouseButton=a.sourceEvent?.button||0,t.isZoomingOrPanning=!0,t.prevViewport=o,a.sourceEvent?.type==="mousedown"&&e(!0),n&&n?.(a.sourceEvent,o)}}function lp({zoomPanValues:t,panOnDrag:e,onPaneContextMenu:n,onTransformChange:a,onPanZoom:o}){return i=>{t.usedRightMouseButton=!!(n&&Qi(e,t.mouseButton??0)),i.sourceEvent?.sync||a([i.transform.x,i.transform.y,i.transform.k]),o&&!i.sourceEvent?.internal&&o?.(i.sourceEvent,ma(i.transform))}}function cp({zoomPanValues:t,panOnDrag:e,panOnScroll:n,onDraggingChange:a,onPanZoomEnd:o,onPaneContextMenu:i}){return s=>{if(!s.sourceEvent?.internal&&(t.isZoomingOrPanning=!1,i&&Qi(e,t.mouseButton??0)&&!t.usedRightMouseButton&&s.sourceEvent&&i(s.sourceEvent),t.usedRightMouseButton=!1,a(!1),o)){const l=ma(s.transform);t.prevViewport=l,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{o?.(s.sourceEvent,l)},n?150:0)}}}function dp({zoomActivationKeyPressed:t,zoomOnScroll:e,zoomOnPinch:n,panOnDrag:a,panOnScroll:o,zoomOnDoubleClick:i,userSelectionActive:s,noWheelClassName:l,noPanClassName:u,lib:v,connectionInProgress:p}){return m=>{const f=t||e,w=n&&m.ctrlKey,N=m.type==="wheel";if(m.button===1&&m.type==="mousedown"&&(Kn(m,`${v}-flow__node`)||Kn(m,`${v}-flow__edge`)))return!0;if(!a&&!f&&!o&&!i&&!n||s||p&&!N||Kn(m,l)&&N||Kn(m,u)&&(!N||o&&N&&!t)||!n&&m.ctrlKey&&N)return!1;if(!n&&m.type==="touchstart"&&m.touches?.length>1)return m.preventDefault(),!1;if(!f&&!o&&!w&&N||!a&&(m.type==="mousedown"||m.type==="touchstart")||Array.isArray(a)&&!a.includes(m.button)&&m.type==="mousedown")return!1;const E=Array.isArray(a)&&a.includes(m.button)||!m.button||m.button<=1;return(!m.ctrlKey||N)&&E}}function up({domNode:t,minZoom:e,maxZoom:n,translateExtent:a,viewport:o,onPanZoom:i,onPanZoomStart:s,onPanZoomEnd:l,onDraggingChange:u}){const v={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},p=t.getBoundingClientRect(),m=Mi().scaleExtent([e,n]).translateExtent(a),f=At(t).call(m);O({x:o.x,y:o.y,zoom:Jn(o.zoom,e,n)},[[0,0],[p.width,p.height]],a);const w=f.on("wheel.zoom"),N=f.on("dblclick.zoom");m.wheelDelta(Ji);function E(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).transform(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function I({noWheelClassName:x,noPanClassName:S,onPaneContextMenu:z,userSelectionActive:g,panOnScroll:C,panOnDrag:T,panOnScrollMode:D,panOnScrollSpeed:V,preventScrolling:L,zoomOnPinch:q,zoomOnScroll:j,zoomOnDoubleClick:U,zoomActivationKeyPressed:W,lib:J,onTransformChange:ae,connectionInProgress:re,paneClickDistance:ie,selectionOnDrag:ne}){g&&!v.isZoomingOrPanning&&H();const G=C&&!W&&!g;m.clickDistance(ne?1/0:!ln(ie)||ie<0?0:ie);const oe=G?op({zoomPanValues:v,noWheelClassName:x,d3Selection:f,d3Zoom:m,panOnScrollMode:D,panOnScrollSpeed:V,zoomOnPinch:q,onPanZoomStart:s,onPanZoom:i,onPanZoomEnd:l}):sp({noWheelClassName:x,preventScrolling:L,d3ZoomHandler:w});if(f.on("wheel.zoom",oe,{passive:!1}),!g){const se=ip({zoomPanValues:v,onDraggingChange:u,onPanZoomStart:s});m.on("start",se);const te=lp({zoomPanValues:v,panOnDrag:T,onPaneContextMenu:!!z,onPanZoom:i,onTransformChange:ae});m.on("zoom",te);const ue=cp({zoomPanValues:v,panOnDrag:T,panOnScroll:C,onPaneContextMenu:z,onPanZoomEnd:l,onDraggingChange:u});m.on("end",ue)}const ee=dp({zoomActivationKeyPressed:W,panOnDrag:T,zoomOnScroll:j,panOnScroll:C,zoomOnDoubleClick:U,zoomOnPinch:q,userSelectionActive:g,noPanClassName:S,noWheelClassName:x,lib:J,connectionInProgress:re});m.filter(ee),U?f.on("dblclick.zoom",N):f.on("dblclick.zoom",null)}function H(){m.on("zoom",null)}async function O(x,S,z){const g=Ha(x),C=m?.constrain()(g,S,z);return C&&await E(C),new Promise(T=>T(C))}async function F(x,S){const z=Ha(x);return await E(z,S),new Promise(g=>g(z))}function M(x){if(f){const S=Ha(x),z=f.property("__zoom");(z.k!==x.zoom||z.x!==x.x||z.y!==x.y)&&m?.transform(f,S,null,{sync:!0})}}function R(){const x=f?Ni(f.node()):{x:0,y:0,k:1};return{x:x.x,y:x.y,zoom:x.k}}function b(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).scaleTo(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function A(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).scaleBy(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function B(x){m?.scaleExtent(x)}function K(x){m?.translateExtent(x)}function Z(x){const S=!ln(x)||x<0?0:x;m?.clickDistance(S)}return{update:I,destroy:H,setViewport:F,setViewportConstrained:O,getViewport:R,scaleTo:b,scaleBy:A,setScaleExtent:B,setTranslateExtent:K,syncViewport:M,setClickDistance:Z}}var Ps;(function(t){t.Line="line",t.Handle="handle"})(Ps||(Ps={}));function Ao(){const t={};return[e=>{if(e&&!Ll(t))throw new Error(e);return so(t)},e=>Fs(t,e)]}const[vp,fp]=Ao(),[pp,hp]=Ao(),[gp,mp]=Ao();var _p=P("
    ");function $e(t,e){ze(e,!0);let n=pe(e,"id",3,null),a=pe(e,"type",3,"source"),o=pe(e,"position",19,()=>we.Top),i=pe(e,"isConnectableStart",3,!0),s=pe(e,"isConnectableEnd",3,!0),l=_n(e,["$$slots","$$events","$$legacy","id","type","position","style","class","isConnectable","isConnectableStart","isConnectableEnd","isValidConnection","onconnect","ondisconnect","children"]);const u=vp("Handle must be used within a Custom Node component"),v=pp("Handle must be used within a Custom Node component");let p=k(()=>a()==="target"),m=k(()=>e.isConnectable!==void 0?e.isConnectable:v.value),f=fn(),w=k(()=>f.ariaLabelConfig),N=null;Hl(()=>{if(e.onconnect||e.ondisconnect){f.edges;let S=f.connectionLookup.get(`${u}-${a()}${n()?`-${n()}`:""}`);if(N&&!ff(S,N)){const z=S??new Map;ms(N,z,e.ondisconnect),ms(z,N,e.onconnect)}N=new Map(S)}});let E=k(()=>{if(!f.connection.inProgress)return[!1,!1,!1,!1,null];const{fromHandle:S,toHandle:z,isValid:g}=f.connection,C=S&&S.nodeId===u&&S.type===a()&&S.id===n(),T=z&&z.nodeId===u&&z.type===a()&&z.id===n(),D=f.connectionMode===Qn.Strict?S?.type!==a():u!==S?.nodeId||n()!==S?.id;return[!0,C,T,D,T&&g]}),I=k(()=>dn(r(E),5)),H=k(()=>r(I)[0]),O=k(()=>r(I)[1]),F=k(()=>r(I)[2]),M=k(()=>r(I)[3]),R=k(()=>r(I)[4]);function b(S){const z=f.onbeforeconnect?f.onbeforeconnect(S):S;z&&(f.addEdge(z),f.onconnect?.(S))}function A(S){const z=Fi(S);S.currentTarget&&(z&&S.button===0||!z)&&Ms.onPointerDown(S,{handleId:n(),nodeId:u,isTarget:r(p),connectionRadius:f.connectionRadius,domNode:f.domNode,nodeLookup:f.nodeLookup,connectionMode:f.connectionMode,lib:"svelte",autoPanOnConnect:f.autoPanOnConnect,autoPanSpeed:f.autoPanSpeed,flowId:f.flowId,isValidConnection:e.isValidConnection||((...g)=>f.isValidConnection?.(...g)??!0),updateConnection:f.updateConnection,cancelConnection:f.cancelConnection,panBy:f.panBy,onConnect:b,onConnectStart:f.onconnectstart,onConnectEnd:(...g)=>f.onconnectend?.(...g),getTransform:()=>[f.viewport.x,f.viewport.y,f.viewport.zoom],getFromHandle:()=>f.connection.fromHandle,dragThreshold:f.connectionDragThreshold,handleDomNode:S.currentTarget})}function B(S){if(!u||!f.clickConnectStartHandle&&!i())return;if(!f.clickConnectStartHandle){f.onclickconnectstart?.(S,{nodeId:u,handleId:n(),handleType:a()}),f.clickConnectStartHandle={nodeId:u,type:a(),id:n()};return}const z=Hi(S.target),g=e.isValidConnection??f.isValidConnection,{connectionMode:C,clickConnectStartHandle:T,flowId:D,nodeLookup:V}=f,{connection:L,isValid:q}=Ms.isValid(S,{handle:{nodeId:u,id:n(),type:a()},connectionMode:C,fromNodeId:T.nodeId,fromHandleId:T.id??null,fromType:T.type,isValidConnection:g,flowId:D,doc:z,lib:"svelte",nodeLookup:V});q&&L&&b(L);const j=structuredClone($s(f.connection));delete j.inProgress,j.toPosition=j.toHandle?j.toHandle.position:null,f.onclickconnectend?.(S,j),f.clickConnectStartHandle=null}var K=_p(),Z=()=>{};bn(K,()=>({"data-handleid":n(),"data-nodeid":u,"data-handlepos":o(),"data-id":`${f.flowId??""}-${u??""}-${n()??"null"??""}-${a()??""}`,class:["svelte-flow__handle",`svelte-flow__handle-${o()}`,f.noDragClass,f.noPanClass,o(),e.class],onmousedown:A,ontouchstart:A,onclick:f.clickConnect?B:void 0,onkeypress:Z,style:e.style,role:"button","aria-label":r(w)["handle.ariaLabel"],tabindex:"-1",...l,[lo]:{valid:r(R),connectingto:r(F),connectingfrom:r(O),source:!r(p),target:r(p),connectablestart:i(),connectableend:s(),connectable:r(m),connectionindicator:r(m)&&(!r(H)||r(M))&&(r(H)||f.clickConnectStartHandle?s():i())}}));var x=d(K);Dt(x,()=>e.children??tr),c(K),_(t,K),Ce()}var yp=P(" ",1);function $i(t,e){ze(e,!0);let n=pe(e,"targetPosition",19,()=>we.Top),a=pe(e,"sourcePosition",19,()=>we.Bottom);var o=yp(),i=de(o);$e(i,{type:"target",get position(){return n()}});var s=h(i),l=h(s);$e(l,{type:"source",get position(){return a()}}),$(()=>X(s,` ${e.data?.label??""} `)),_(t,o),Ce()}var bp=P(" ",1);function xp(t,e){ze(e,!0);let n=pe(e,"data",19,()=>({label:"Node"})),a=pe(e,"sourcePosition",19,()=>we.Bottom);ye();var o=bp(),i=de(o),s=h(i);$e(s,{type:"source",get position(){return a()}}),$(()=>X(i,`${n()?.label??""} `)),_(t,o),Ce()}var wp=P(" ",1);function kp(t,e){ze(e,!0);let n=pe(e,"data",19,()=>({label:"Node"})),a=pe(e,"targetPosition",19,()=>we.Top);ye();var o=wp(),i=de(o),s=h(i);$e(s,{type:"target",get position(){return a()}}),$(()=>X(i,`${n()?.label??""} `)),_(t,o),Ce()}function Sp(t,e){}function Fa(t,e,n){if(!n||!e)return;const a=n==="root"?e:e.querySelector(`.svelte-flow__${n}`);a&&a.appendChild(t)}function zp(t,e){const n=k(fn),a=k(()=>r(n).domNode);let o;return r(a)?Fa(t,r(a),e):o=Bs(()=>{_e(()=>{Fa(t,r(a),e),o?.()})}),{async update(i){Fa(t,r(a),i)},destroy(){t.parentNode&&t.parentNode.removeChild(t),o?.()}}}function Cp(){let t=Q(typeof window>"u");if(r(t)){const e=Bs(()=>{_e(()=>{y(t,!1),e?.()})})}return{get value(){return r(t)}}}const Ts=t=>hf(t),Ep=t=>Ti(t);function en(t){return t===void 0?void 0:`${t}px`}const sa={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}};var Np=P("
    ");function Mp(t,e){ze(e,!0);let n=pe(e,"x",3,0),a=pe(e,"y",3,0),o=pe(e,"selectEdgeOnClick",3,!1),i=pe(e,"transparent",3,!1),s=_n(e,["$$slots","$$events","$$legacy","x","y","width","height","selectEdgeOnClick","transparent","class","children"]);const l=fn(),u=gp("EdgeLabel must be used within a Custom Edge component");let v=k(()=>l.visible.edges.get(u)?.zIndex);var p=Np(),m=()=>{o()&&u&&l.handleEdgeSelection(u)};bn(p,w=>({class:["svelte-flow__edge-label",{transparent:i()},e.class],tabindex:"-1",onclick:m,...s,[ia]:w}),[()=>({display:Cp().value?"none":void 0,cursor:o()?"pointer":void 0,transform:`translate(-50%, -50%) translate(${n()??""}px,${a()??""}px)`,"pointer-events":"all",width:en(e.width),height:en(e.height),"z-index":r(v)})],void 0,void 0,"svelte-1wg91mu");var f=d(p);Dt(f,()=>e.children??tr),c(p),zt(p,(w,N)=>zp?.(w,N),()=>"edge-labels"),_(t,p),Ce()}var Pp=ut(""),Tp=ut('',1);function _a(t,e){let n=pe(e,"interactionWidth",3,20),a=_n(e,["$$slots","$$events","$$legacy","id","path","label","labelX","labelY","labelStyle","markerStart","markerEnd","style","interactionWidth","class"]);var o=Tp(),i=de(o),s=h(i);{var l=p=>{var m=Pp();bn(m,()=>({d:e.path,"stroke-opacity":0,"stroke-width":n(),fill:"none",class:"svelte-flow__edge-interaction",...a})),_(p,m)};Y(s,p=>{n()>0&&p(l)})}var u=h(s);{var v=p=>{Mp(p,{get x(){return e.labelX},get y(){return e.labelY},get style(){return e.labelStyle},selectEdgeOnClick:!0,children:(m,f)=>{ye();var w=qs();$(()=>X(w,e.label)),_(m,w)},$$slots:{default:!0}})};Y(u,p=>{e.label&&p(v)})}$(()=>{xe(i,"id",e.id),xe(i,"d",e.path),De(i,0,Rn(["svelte-flow__edge-path",e.class])),xe(i,"marker-start",e.markerStart),xe(i,"marker-end",e.markerEnd),st(i,e.style)}),_(t,o)}function el(t,e){ze(e,!0);let n=k(()=>Bi({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition,curvature:e.pathOptions?.curvature})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get id(){return e.id},get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Ip(t,e){ze(e,!0);let n=k(()=>No({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Ap(t,e){ze(e,!0);let n=k(()=>Ki({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Dp(t,e){ze(e,!0);let n=k(()=>No({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition,borderRadius:0})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}class Op{#e;#t;constructor(e,n){this.#e=e,this.#t=Vl(n)}get current(){return this.#t(),this.#e()}}const Rp=/\(.+\)/,Lp=new Set(["all","print","screen","and","or","not","only"]);class Hp extends Op{constructor(e,n){let a=Rp.test(e)||e.split(/[\s,]+/).some(i=>Lp.has(i.trim()))?e:`(${e})`;const o=window.matchMedia(a);super(()=>o.matches,i=>qa(o,"change",i))}}function Vp(t,e,n,a){const o=new Map;return Co(t,{x:0,y:0,width:n,height:a},e,!0).forEach(i=>{o.set(i.id,i)}),o}function Is(t){const{edges:e,defaultEdgeOptions:n,nodeLookup:a,previousEdges:o,connectionMode:i,onerror:s,onlyRenderVisible:l,elevateEdgesOnSelect:u,zIndexMode:v}=t,p=new Map;for(const m of e){const f=a.get(m.source),w=a.get(m.target);if(!f||!w)continue;if(l){const{visibleNodes:I,transform:H,width:O,height:F}=t;if(Mf({sourceNode:f,targetNode:w,width:O,height:F,transform:H}))I.set(f.id,f),I.set(w.id,w);else continue}const N=o.get(m.id);if(N&&m===N.edge&&f==N.sourceNode&&w==N.targetNode){p.set(m.id,N);continue}const E=Rf({id:m.id,sourceNode:f,targetNode:w,sourceHandle:m.sourceHandle||null,targetHandle:m.targetHandle||null,connectionMode:i,onError:s});E&&p.set(m.id,{...n,...m,...E,zIndex:Nf({selected:m.selected,zIndex:m.zIndex??n.zIndex,sourceNode:f,targetNode:w,elevateOnSelect:u,zIndexMode:v}),sourceNode:f,targetNode:w,edge:m})}return p}const tl={input:xp,output:kp,default:$i,group:Sp},nl={straight:Ap,smoothstep:Ip,default:el,step:Dp};function Fp(t,e,n,a,o,i){if(e&&!n&&a&&o){const s=xr(i,{filter:l=>!!((l.width||l.initialWidth)&&(l.height||l.initialHeight))});return Eo(s,a,o,.5,2,.1)}else return n??{x:0,y:0,zoom:1}}function Bp(t){class e{#e=k(()=>t.props.id??"1");get flowId(){return r(this.#e)}set flowId(a){y(this.#e,a)}#t=Q(null);get domNode(){return r(this.#t)}set domNode(a){y(this.#t,a)}#n=Q(null);get panZoom(){return r(this.#n)}set panZoom(a){y(this.#n,a)}#r=Q(t.width??0);get width(){return r(this.#r)}set width(a){y(this.#r,a)}#a=Q(t.height??0);get height(){return r(this.#a)}set height(a){y(this.#a,a)}#o=Q(t.props.zIndexMode??"basic");get zIndexMode(){return r(this.#o)}set zIndexMode(a){y(this.#o,a)}#s=k(()=>{const a=qf(t.nodes,this.nodeLookup,this.parentLookup,{nodeExtent:this.nodeExtent,nodeOrigin:this.nodeOrigin,elevateNodesOnSelect:t.props.elevateNodesOnSelect??!0,checkEquality:!0,zIndexMode:this.zIndexMode});return this.fitViewQueued&&a&&(this.fitViewOptions?.duration?this.resolveFitView():queueMicrotask(()=>{this.resolveFitView()})),a});get nodesInitialized(){return r(this.#s)}set nodesInitialized(a){y(this.#s,a)}#i=k(()=>this.panZoom!==null);get viewportInitialized(){return r(this.#i)}set viewportInitialized(a){y(this.#i,a)}#l=k(()=>(Wf(this.connectionLookup,this.edgeLookup,t.edges),t.edges));get _edges(){return r(this.#l)}set _edges(a){y(this.#l,a)}get nodes(){return this.nodesInitialized,t.nodes}set nodes(a){t.nodes=a}get edges(){return this._edges}set edges(a){t.edges=a}_prevSelectedNodes=[];_prevSelectedNodeIds=new Set;#c=k(()=>{const a=this._prevSelectedNodeIds.size,o=new Set,i=this.nodes.filter(s=>(s.selected&&(o.add(s.id),this._prevSelectedNodeIds.delete(s.id)),s.selected));return(a!==o.size||this._prevSelectedNodeIds.size>0)&&(this._prevSelectedNodes=i),this._prevSelectedNodeIds=o,this._prevSelectedNodes});get selectedNodes(){return r(this.#c)}set selectedNodes(a){y(this.#c,a)}_prevSelectedEdges=[];_prevSelectedEdgeIds=new Set;#d=k(()=>{const a=this._prevSelectedEdgeIds.size,o=new Set,i=this.edges.filter(s=>(s.selected&&(o.add(s.id),this._prevSelectedEdgeIds.delete(s.id)),s.selected));return(a!==o.size||this._prevSelectedEdgeIds.size>0)&&(this._prevSelectedEdges=i),this._prevSelectedEdgeIds=o,this._prevSelectedEdges});get selectedEdges(){return r(this.#d)}set selectedEdges(a){y(this.#d,a)}selectionChangeHandlers=new Map;nodeLookup=new Map;parentLookup=new Map;connectionLookup=new Map;edgeLookup=new Map;_prevVisibleEdges=new Map;#u=k(()=>{const{nodes:a,_edges:o,_prevVisibleEdges:i,nodeLookup:s,connectionMode:l,onerror:u,onlyRenderVisibleElements:v,defaultEdgeOptions:p,zIndexMode:m}=this;let f,w;const N={edges:o,defaultEdgeOptions:p,previousEdges:i,nodeLookup:s,connectionMode:l,elevateEdgesOnSelect:t.props.elevateEdgesOnSelect??!0,zIndexMode:m,onerror:u};if(v){const{viewport:E,width:I,height:H}=this,O=[E.x,E.y,E.zoom];f=Vp(s,O,I,H),w=Is({...N,onlyRenderVisible:!0,visibleNodes:f,transform:O,width:I,height:H})}else f=this.nodeLookup,w=Is(N);return{nodes:f,edges:w}});get visible(){return r(this.#u)}set visible(a){y(this.#u,a)}#v=k(()=>t.props.nodesDraggable??!0);get nodesDraggable(){return r(this.#v)}set nodesDraggable(a){y(this.#v,a)}#f=k(()=>t.props.nodesConnectable??!0);get nodesConnectable(){return r(this.#f)}set nodesConnectable(a){y(this.#f,a)}#p=k(()=>t.props.elementsSelectable??!0);get elementsSelectable(){return r(this.#p)}set elementsSelectable(a){y(this.#p,a)}#h=k(()=>t.props.nodesFocusable??!0);get nodesFocusable(){return r(this.#h)}set nodesFocusable(a){y(this.#h,a)}#g=k(()=>t.props.edgesFocusable??!0);get edgesFocusable(){return r(this.#g)}set edgesFocusable(a){y(this.#g,a)}#m=k(()=>t.props.disableKeyboardA11y??!1);get disableKeyboardA11y(){return r(this.#m)}set disableKeyboardA11y(a){y(this.#m,a)}#_=k(()=>t.props.minZoom??.5);get minZoom(){return r(this.#_)}set minZoom(a){y(this.#_,a)}#y=k(()=>t.props.maxZoom??2);get maxZoom(){return r(this.#y)}set maxZoom(a){y(this.#y,a)}#b=k(()=>t.props.nodeOrigin??[0,0]);get nodeOrigin(){return r(this.#b)}set nodeOrigin(a){y(this.#b,a)}#x=k(()=>t.props.nodeExtent??to);get nodeExtent(){return r(this.#x)}set nodeExtent(a){y(this.#x,a)}#w=k(()=>t.props.translateExtent??to);get translateExtent(){return r(this.#w)}set translateExtent(a){y(this.#w,a)}#k=k(()=>t.props.defaultEdgeOptions??{});get defaultEdgeOptions(){return r(this.#k)}set defaultEdgeOptions(a){y(this.#k,a)}#S=k(()=>t.props.nodeDragThreshold??1);get nodeDragThreshold(){return r(this.#S)}set nodeDragThreshold(a){y(this.#S,a)}#z=k(()=>t.props.autoPanOnNodeDrag??!0);get autoPanOnNodeDrag(){return r(this.#z)}set autoPanOnNodeDrag(a){y(this.#z,a)}#C=k(()=>t.props.autoPanOnConnect??!0);get autoPanOnConnect(){return r(this.#C)}set autoPanOnConnect(a){y(this.#C,a)}#E=k(()=>t.props.autoPanOnNodeFocus??!0);get autoPanOnNodeFocus(){return r(this.#E)}set autoPanOnNodeFocus(a){y(this.#E,a)}#N=k(()=>t.props.autoPanSpeed??15);get autoPanSpeed(){return r(this.#N)}set autoPanSpeed(a){y(this.#N,a)}#M=k(()=>t.props.connectionDragThreshold??1);get connectionDragThreshold(){return r(this.#M)}set connectionDragThreshold(a){y(this.#M,a)}fitViewQueued=t.props.fitView??!1;fitViewOptions=t.props.fitViewOptions;fitViewResolver=null;#P=k(()=>t.props.snapGrid??null);get snapGrid(){return r(this.#P)}set snapGrid(a){y(this.#P,a)}#T=Q(!1);get dragging(){return r(this.#T)}set dragging(a){y(this.#T,a)}#I=Q(null);get selectionRect(){return r(this.#I)}set selectionRect(a){y(this.#I,a)}#A=Q(!1);get selectionKeyPressed(){return r(this.#A)}set selectionKeyPressed(a){y(this.#A,a)}#D=Q(!1);get multiselectionKeyPressed(){return r(this.#D)}set multiselectionKeyPressed(a){y(this.#D,a)}#O=Q(!1);get deleteKeyPressed(){return r(this.#O)}set deleteKeyPressed(a){y(this.#O,a)}#R=Q(!1);get panActivationKeyPressed(){return r(this.#R)}set panActivationKeyPressed(a){y(this.#R,a)}#L=Q(!1);get zoomActivationKeyPressed(){return r(this.#L)}set zoomActivationKeyPressed(a){y(this.#L,a)}#H=Q(null);get selectionRectMode(){return r(this.#H)}set selectionRectMode(a){y(this.#H,a)}#V=Q("");get ariaLiveMessage(){return r(this.#V)}set ariaLiveMessage(a){y(this.#V,a)}#F=k(()=>t.props.selectionMode??na.Partial);get selectionMode(){return r(this.#F)}set selectionMode(a){y(this.#F,a)}#B=k(()=>({...tl,...t.props.nodeTypes}));get nodeTypes(){return r(this.#B)}set nodeTypes(a){y(this.#B,a)}#q=k(()=>({...nl,...t.props.edgeTypes}));get edgeTypes(){return r(this.#q)}set edgeTypes(a){y(this.#q,a)}#K=k(()=>t.props.noPanClass??"nopan");get noPanClass(){return r(this.#K)}set noPanClass(a){y(this.#K,a)}#j=k(()=>t.props.noDragClass??"nodrag");get noDragClass(){return r(this.#j)}set noDragClass(a){y(this.#j,a)}#Z=k(()=>t.props.noWheelClass??"nowheel");get noWheelClass(){return r(this.#Z)}set noWheelClass(a){y(this.#Z,a)}#Y=k(()=>zf(t.props.ariaLabelConfig));get ariaLabelConfig(){return r(this.#Y)}set ariaLabelConfig(a){y(this.#Y,a)}#X=Q(Fp(this.nodesInitialized,t.props.fitView,t.props.initialViewport,this.width,this.height,this.nodeLookup));get _viewport(){return r(this.#X)}set _viewport(a){y(this.#X,a)}get viewport(){return t.viewport??this._viewport}set viewport(a){t.viewport&&(t.viewport=a),this._viewport=a}#W=Q(no);get _connection(){return r(this.#W)}set _connection(a){y(this.#W,a)}#G=k(()=>this._connection.inProgress?{...this._connection,to:kr(this._connection.to,[this.viewport.x,this.viewport.y,this.viewport.zoom])}:this._connection);get connection(){return r(this.#G)}set connection(a){y(this.#G,a)}#U=k(()=>t.props.connectionMode??Qn.Strict);get connectionMode(){return r(this.#U)}set connectionMode(a){y(this.#U,a)}#Q=k(()=>t.props.connectionRadius??20);get connectionRadius(){return r(this.#Q)}set connectionRadius(a){y(this.#Q,a)}#J=k(()=>t.props.isValidConnection??(()=>!0));get isValidConnection(){return r(this.#J)}set isValidConnection(a){y(this.#J,a)}#$=k(()=>t.props.selectNodesOnDrag??!0);get selectNodesOnDrag(){return r(this.#$)}set selectNodesOnDrag(a){y(this.#$,a)}#ee=k(()=>t.props.defaultMarkerColor===void 0?"#b1b1b7":t.props.defaultMarkerColor);get defaultMarkerColor(){return r(this.#ee)}set defaultMarkerColor(a){y(this.#ee,a)}#te=k(()=>Lf(t.edges,{defaultColor:this.defaultMarkerColor,id:this.flowId,defaultMarkerStart:this.defaultEdgeOptions.markerStart,defaultMarkerEnd:this.defaultEdgeOptions.markerEnd}));get markers(){return r(this.#te)}set markers(a){y(this.#te,a)}#ne=k(()=>t.props.onlyRenderVisibleElements??!1);get onlyRenderVisibleElements(){return r(this.#ne)}set onlyRenderVisibleElements(a){y(this.#ne,a)}#re=k(()=>t.props.onflowerror??xf);get onerror(){return r(this.#re)}set onerror(a){y(this.#re,a)}#ae=k(()=>t.props.ondelete);get ondelete(){return r(this.#ae)}set ondelete(a){y(this.#ae,a)}#oe=k(()=>t.props.onbeforedelete);get onbeforedelete(){return r(this.#oe)}set onbeforedelete(a){y(this.#oe,a)}#se=k(()=>t.props.onbeforeconnect);get onbeforeconnect(){return r(this.#se)}set onbeforeconnect(a){y(this.#se,a)}#ie=k(()=>t.props.onconnect);get onconnect(){return r(this.#ie)}set onconnect(a){y(this.#ie,a)}#le=k(()=>t.props.onconnectstart);get onconnectstart(){return r(this.#le)}set onconnectstart(a){y(this.#le,a)}#ce=k(()=>t.props.onconnectend);get onconnectend(){return r(this.#ce)}set onconnectend(a){y(this.#ce,a)}#de=k(()=>t.props.onbeforereconnect);get onbeforereconnect(){return r(this.#de)}set onbeforereconnect(a){y(this.#de,a)}#ue=k(()=>t.props.onreconnect);get onreconnect(){return r(this.#ue)}set onreconnect(a){y(this.#ue,a)}#ve=k(()=>t.props.onreconnectstart);get onreconnectstart(){return r(this.#ve)}set onreconnectstart(a){y(this.#ve,a)}#fe=k(()=>t.props.onreconnectend);get onreconnectend(){return r(this.#fe)}set onreconnectend(a){y(this.#fe,a)}#pe=k(()=>t.props.clickConnect??!0);get clickConnect(){return r(this.#pe)}set clickConnect(a){y(this.#pe,a)}#he=k(()=>t.props.onclickconnectstart);get onclickconnectstart(){return r(this.#he)}set onclickconnectstart(a){y(this.#he,a)}#ge=k(()=>t.props.onclickconnectend);get onclickconnectend(){return r(this.#ge)}set onclickconnectend(a){y(this.#ge,a)}#me=Q(null);get clickConnectStartHandle(){return r(this.#me)}set clickConnectStartHandle(a){y(this.#me,a)}#_e=k(()=>t.props.onselectiondrag);get onselectiondrag(){return r(this.#_e)}set onselectiondrag(a){y(this.#_e,a)}#ye=k(()=>t.props.onselectiondragstart);get onselectiondragstart(){return r(this.#ye)}set onselectiondragstart(a){y(this.#ye,a)}#be=k(()=>t.props.onselectiondragstop);get onselectiondragstop(){return r(this.#be)}set onselectiondragstop(a){y(this.#be,a)}resolveFitView=async()=>{this.panZoom&&(await yf({nodes:this.nodeLookup,width:this.width,height:this.height,panZoom:this.panZoom,minZoom:this.minZoom,maxZoom:this.maxZoom},this.fitViewOptions),this.fitViewResolver?.resolve(!0),this.fitViewQueued=!1,this.fitViewOptions=void 0,this.fitViewResolver=null)};_prefersDark=new Hp("(prefers-color-scheme: dark)",t.props.colorModeSSR==="dark");#xe=k(()=>t.props.colorMode==="system"?this._prefersDark.current?"dark":"light":t.props.colorMode??"light");get colorMode(){return r(this.#xe)}set colorMode(a){y(this.#xe,a)}constructor(){}resetStoreValues(){this.dragging=!1,this.selectionRect=null,this.selectionRectMode=null,this.selectionKeyPressed=!1,this.multiselectionKeyPressed=!1,this.deleteKeyPressed=!1,this.panActivationKeyPressed=!1,this.zoomActivationKeyPressed=!1,this._connection=no,this.clickConnectStartHandle=null,this.viewport=t.props.initialViewport??{x:0,y:0,zoom:1},this.ariaLiveMessage=""}}return new e}function fn(){const t=so(oo);if(!t)throw new Error("To call useStore outside of you need to wrap your component in a ");return t.getStore()}const oo=Symbol();function qp(t){const e=Bp(t);function n(x){e.nodeTypes={...tl,...x}}function a(x){e.edgeTypes={...nl,...x}}function o(x){e.edges=If(x,e.edges)}const i=(x,S=!1)=>{e.nodes=e.nodes.map(z=>{if(e.connection.inProgress&&e.connection.fromNode.id===z.id){const C=e.nodeLookup.get(z.id);C&&(e.connection={...e.connection,from:Dn(C,e.connection.fromHandle,we.Left,!0)})}const g=x.get(z.id);return g?{...z,position:g.position,dragging:S}:z})};function s(x){const{changes:S,updatedInternals:z}=Yf(x,e.nodeLookup,e.parentLookup,e.domNode,e.nodeOrigin,e.nodeExtent,e.zIndexMode);if(!z)return;Ff(e.nodeLookup,e.parentLookup,{nodeOrigin:e.nodeOrigin,nodeExtent:e.nodeExtent,zIndexMode:e.zIndexMode}),e.fitViewQueued&&e.resolveFitView();const g=new Map;for(const C of S){const T=e.nodeLookup.get(C.id)?.internals.userNode;if(!T)continue;const D={...T};switch(C.type){case"dimensions":{const V={...D.measured,...C.dimensions};C.setAttributes&&(D.width=C.dimensions?.width??D.width,D.height=C.dimensions?.height??D.height),D.measured=V;break}case"position":D.position=C.position??D.position;break}g.set(C.id,D)}e.nodes=e.nodes.map(C=>g.get(C.id)??C)}function l(x){const S=e.fitViewResolver??Promise.withResolvers();return e.fitViewQueued=!0,e.fitViewOptions=x,e.fitViewResolver=S,e.nodes=[...e.nodes],S.promise}async function u(x,S,z){const g=typeof z?.zoom<"u"?z.zoom:e.maxZoom,C=e.panZoom;return C?(await C.setViewport({x:e.width/2-x*g,y:e.height/2-S*g,zoom:g},{duration:z?.duration,ease:z?.ease,interpolate:z?.interpolate}),Promise.resolve(!0)):Promise.resolve(!1)}function v(x,S){const z=e.panZoom;return z?z.scaleBy(x,S):Promise.resolve(!1)}function p(x){return v(1.2,x)}function m(x){return v(1/1.2,x)}function f(x){const S=e.panZoom;S&&(S.setScaleExtent([x,e.maxZoom]),e.minZoom=x)}function w(x){const S=e.panZoom;S&&(S.setScaleExtent([e.minZoom,x]),e.maxZoom=x)}function N(x){const S=e.panZoom;S&&(S.setTranslateExtent(x),e.translateExtent=x)}function E(x,S=null){let z=!1;const g=x.map(C=>(S?S.has(C.id):!0)&&C.selected?(z=!0,{...C,selected:!1}):C);return[z,g]}function I(x){const S=x?.nodes?new Set(x.nodes.map(V=>V.id)):null,[z,g]=E(e.nodes,S);z&&(e.nodes=g);const C=x?.edges?new Set(x.edges.map(V=>V.id)):null,[T,D]=E(e.edges,C);T&&(e.edges=D)}function H(x){const S=e.multiselectionKeyPressed;e.nodes=e.nodes.map(z=>{const g=x.includes(z.id),C=S&&z.selected||g;return!!z.selected!==C?{...z,selected:C}:z}),S||I({nodes:[]})}function O(x){const S=e.multiselectionKeyPressed;e.edges=e.edges.map(z=>{const g=x.includes(z.id),C=S&&z.selected||g;return!!z.selected!==C?{...z,selected:C}:z}),S||I({edges:[]})}function F(x,S,z){const g=e.nodeLookup.get(x);if(!g){console.warn("012",hr.error012(x));return}e.selectionRect=null,e.selectionRectMode=null,g.selected?(S||g.selected&&e.multiselectionKeyPressed)&&(I({nodes:[g],edges:[]}),requestAnimationFrame(()=>z?.blur())):H([x])}function M(x){const S=e.edgeLookup.get(x);if(!S){console.warn("012",hr.error012(x));return}(S.selectable||e.elementsSelectable&&typeof S.selectable>"u")&&(e.selectionRect=null,e.selectionRectMode=null,S.selected?S.selected&&e.multiselectionKeyPressed&&I({nodes:[],edges:[S]}):O([x]))}function R(x,S){const{nodeExtent:z,snapGrid:g,nodeOrigin:C,nodeLookup:T,nodesDraggable:D,onerror:V}=e,L=new Map,q=g?.[0]??5,j=g?.[1]??5,U=x.x*q*S,W=x.y*j*S;for(const J of T.values()){if(!(J.selected&&(J.draggable||D&&typeof J.draggable>"u")))continue;let re={x:J.internals.positionAbsolute.x+U,y:J.internals.positionAbsolute.y+W};g&&(re=wr(re,g));const{position:ie,positionAbsolute:ne}=Ii({nodeId:J.id,nextPosition:re,nodeLookup:T,nodeExtent:z,nodeOrigin:C,onError:V});J.position=ie,J.internals.positionAbsolute=ne,L.set(J.id,J)}i(L)}function b(x){return Xf({delta:x,panZoom:e.panZoom,transform:[e.viewport.x,e.viewport.y,e.viewport.zoom],translateExtent:e.translateExtent,width:e.width,height:e.height})}const A=x=>{e._connection={...x}};function B(){e._connection=no}function K(){e.resetStoreValues(),I()}return Object.assign(e,{setNodeTypes:n,setEdgeTypes:a,addEdge:o,updateNodePositions:i,updateNodeInternals:s,zoomIn:p,zoomOut:m,fitView:l,setCenter:u,setMinZoom:f,setMaxZoom:w,setTranslateExtent:N,unselectNodesAndEdges:I,addSelectedNodes:H,addSelectedEdges:O,handleNodeSelection:F,handleEdgeSelection:M,moveSelectedNodes:R,panBy:b,updateConnection:A,cancelConnection:B,reset:K})}function Kp(t,e){const{minZoom:n,maxZoom:a,initialViewport:o,onPanZoomStart:i,onPanZoom:s,onPanZoomEnd:l,translateExtent:u,setPanZoomInstance:v,onDraggingChange:p,onTransformChange:m}=e,f=up({domNode:t,minZoom:n,maxZoom:a,translateExtent:u,viewport:o,onPanZoom:s,onPanZoomStart:i,onPanZoomEnd:l,onDraggingChange:p}),w=f.getViewport();return(o.x!==w.x||o.y!==w.y||o.zoom!==w.zoom)&&m([w.x,w.y,w.zoom]),v(f),f.update(e),{update(N){f.update(N)}}}var jp=P('
    ');function Zp(t,e){ze(e,!0);let n=pe(e,"store",15),a=k(()=>n().panActivationKeyPressed||e.panOnDrag),o=k(()=>n().panActivationKeyPressed||e.panOnScroll);const{viewport:i}=n();let s=!1;_e(()=>{!s&&n().viewportInitialized&&(e.oninit?.(),s=!0)});var l=jp(),u=d(l);Dt(u,()=>e.children),c(l),zt(l,(v,p)=>Kp?.(v,p),()=>({viewport:n().viewport,minZoom:n().minZoom,maxZoom:n().maxZoom,initialViewport:i,onDraggingChange:v=>{n(n().dragging=v,!0)},setPanZoomInstance:v=>{n(n().panZoom=v,!0)},onPanZoomStart:e.onmovestart,onPanZoom:e.onmove,onPanZoomEnd:e.onmoveend,zoomOnScroll:e.zoomOnScroll,zoomOnDoubleClick:e.zoomOnDoubleClick,zoomOnPinch:e.zoomOnPinch,panOnScroll:r(o),panOnDrag:r(a),panOnScrollSpeed:e.panOnScrollSpeed,panOnScrollMode:e.panOnScrollMode,zoomActivationKeyPressed:n().zoomActivationKeyPressed,preventScrolling:typeof e.preventScrolling=="boolean"?e.preventScrolling:!0,noPanClassName:n().noPanClass,noWheelClassName:n().noWheelClass,userSelectionActive:!!n().selectionRect,translateExtent:n().translateExtent,lib:"svelte",paneClickDistance:e.paneClickDistance,selectionOnDrag:e.selectionOnDrag,onTransformChange:v=>{n(n().viewport={x:v[0],y:v[1],zoom:v[2]},!0)},connectionInProgress:n().connection.inProgress})),_(t,l),Ce()}function As(t,e){return n=>{n.target===e&&t?.(n)}}function Ds(t){return e=>{const n=t.has(e.id);return!!e.selected!==n?{...e,selected:n}:e}}function Os(t,e){if(t.size!==e.size)return!1;for(const n of t)if(!e.has(n))return!1;return!0}var Yp=P("
    ");function Xp(t,e){ze(e,!0);let n=pe(e,"store",15),a=pe(e,"panOnDrag",3,!0),o=pe(e,"paneClickDistance",3,1),i,s=null,l=new Set,u=new Set,v=k(()=>n().panActivationKeyPressed||a()),p=k(()=>n().selectionKeyPressed||!!n().selectionRect||e.selectionOnDrag&&r(v)!==!0),m=k(()=>n().elementsSelectable&&(r(p)||n().selectionRectMode==="user")),f=!1;function w(B){if(s=i?.getBoundingClientRect(),!s)return;const K=B.target===i,Z=!K&&!!B.target.closest(".nokey"),x=e.selectionOnDrag&&K||n().selectionKeyPressed;if(Z||!r(p)||!x||B.button!==0||!B.isPrimary)return;B.target?.setPointerCapture?.(B.pointerId),f=!1;const{x:S,y:z}=qt(B,s);n(n().selectionRect={width:0,height:0,startX:S,startY:z,x:S,y:z},!0),K||(B.stopPropagation(),B.preventDefault())}function N(B){if(!r(p)||!s||!n().selectionRect)return;const K=qt(B,s),{startX:Z=0,startY:x=0}=n().selectionRect;if(!f){const T=n().selectionKeyPressed?0:o();if(Math.hypot(K.x-Z,K.y-x)<=T)return;n().unselectNodesAndEdges(),e.onselectionstart?.(B)}f=!0;const S={...n().selectionRect,x:K.xT.id));const C=n().defaultEdgeOptions.selectable??!0;u=new Set;for(const T of l){const D=n().connectionLookup.get(T);if(D)for(const{edgeId:V}of D.values()){const L=n().edgeLookup.get(V);L&&(L.selectable??C)&&u.add(V)}}Os(z,l)||n(n().nodes=n().nodes.map(Ds(l)),!0),Os(g,u)||n(n().edges=n().edges.map(Ds(u)),!0),n(n().selectionRectMode="user",!0),n(n().selectionRect=S,!0)}function E(B){B.button===0&&(B.target?.releasePointerCapture?.(B.pointerId),!f&&B.target===i&&O?.(B),n(n().selectionRect=null,!0),f&&n(n().selectionRectMode=l.size>0?"nodes":null,!0),f&&e.onselectionend?.(B))}const I=B=>{if(Array.isArray(r(v))&&r(v).includes(2)){B.preventDefault();return}e.onpanecontextmenu?.({event:B})},H=B=>{f&&(B.stopPropagation(),f=!1)};function O(B){if(f||n().connection.inProgress){f=!1;return}e.onpaneclick?.({event:B}),n().unselectNodesAndEdges(),n(n().selectionRectMode=null,!0),n(n().selectionRect=null,!0)}var F=Yp();let M;var R=k(()=>r(m)?void 0:As(O,i)),b=k(()=>As(I,i)),A=d(F);Dt(A,()=>e.children),c(F),yn(F,B=>i=B,()=>i),$(B=>M=De(F,1,"svelte-flow__pane svelte-flow__container",null,M,B),[()=>({draggable:a()===!0||Array.isArray(a())&&a().includes(0),dragging:n().dragging,selection:r(p)})]),be("click",F,function(...B){r(R)?.apply(this,B)}),jr("pointerdown",F,function(...B){(r(m)?w:void 0)?.apply(this,B)},!0),be("pointermove",F,function(...B){(r(m)?N:void 0)?.apply(this,B)}),be("pointerup",F,function(...B){(r(m)?E:void 0)?.apply(this,B)}),be("contextmenu",F,function(...B){r(b)?.apply(this,B)}),jr("click",F,function(...B){(r(m)?H:void 0)?.apply(this,B)},!0),_(t,F),Ce()}_t(["click","pointermove","pointerup","contextmenu"]);var Wp=P('
    ');function Gp(t,e){ze(e,!0);var n=Wp();let a;var o=d(n);Dt(o,()=>e.children),c(n),$(()=>a=st(n,"",a,{transform:`translate(${e.store.viewport.x??""}px, ${e.store.viewport.y??""}px) scale(${e.store.viewport.zoom??""})`})),_(t,n),Ce()}function rl(t,e){const{store:n,onDrag:a,onDragStart:o,onDragStop:i,onNodeMouseDown:s}=e,l=Qf({onDrag:a,onDragStart:o,onDragStop:i,onNodeMouseDown:s,getStoreItems:()=>{const{snapGrid:v,viewport:p}=n;return{nodes:n.nodes,nodeLookup:n.nodeLookup,edges:n.edges,nodeExtent:n.nodeExtent,snapGrid:v||[0,0],snapToGrid:!!v,nodeOrigin:n.nodeOrigin,multiSelectionActive:n.multiselectionKeyPressed,domNode:n.domNode,transform:[p.x,p.y,p.zoom],autoPanOnNodeDrag:n.autoPanOnNodeDrag,nodesDraggable:n.nodesDraggable,selectNodesOnDrag:n.selectNodesOnDrag,nodeDragThreshold:n.nodeDragThreshold,unselectNodesAndEdges:n.unselectNodesAndEdges,updateNodePositions:n.updateNodePositions,onSelectionDrag:n.onselectiondrag,onSelectionDragStart:n.onselectiondragstart,onSelectionDragStop:n.onselectiondragstop,panBy:n.panBy}}});function u(v,p){if(p.disabled){l.destroy();return}l.update({domNode:v,noDragClassName:p.noDragClass,handleSelector:p.handleSelector,nodeId:p.nodeId,isSelectable:p.isSelectable,nodeClickDistance:p.nodeClickDistance})}return u(t,e),{update(v){u(t,v)},destroy(){l.destroy()}}}var Up=P('
    '),Qp=P('
    ',1);function Jp(t,e){ze(e,!0);var n=Qp(),a=de(n),o=d(a,!0);c(a);var i=h(a,2),s=d(i,!0);c(i);var l=h(i,2);{var u=v=>{var p=Up(),m=d(p,!0);c(p),$(()=>{xe(p,"id",`${$p}-${e.store.flowId}`),X(m,e.store.ariaLiveMessage)}),_(v,p)};Y(l,v=>{e.store.disableKeyboardA11y||v(u)})}$(()=>{xe(a,"id",`${al}-${e.store.flowId}`),X(o,e.store.disableKeyboardA11y?e.store.ariaLabelConfig["node.a11yDescription.default"]:e.store.ariaLabelConfig["node.a11yDescription.keyboardDisabled"]),xe(i,"id",`${ol}-${e.store.flowId}`),X(s,e.store.ariaLabelConfig["edge.a11yDescription.default"])}),_(t,n),Ce()}const al="svelte-flow__node-desc",ol="svelte-flow__edge-desc",$p="svelte-flow__aria-live";var eh=P("
    ");function th(t,e){ze(e,!0);let n=pe(e,"store",15),a=k(()=>St(e.node.data,()=>({}),!0)),o=k(()=>St(e.node.selected,!1)),i=k(()=>e.node.draggable),s=k(()=>e.node.selectable),l=k(()=>St(e.node.deletable,!0)),u=k(()=>e.node.connectable),v=k(()=>e.node.focusable),p=k(()=>St(e.node.hidden,!1)),m=k(()=>St(e.node.dragging,!1)),f=k(()=>St(e.node.style,"")),w=k(()=>e.node.class),N=k(()=>St(e.node.type,"default")),E=k(()=>e.node.parentId),I=k(()=>e.node.sourcePosition),H=k(()=>e.node.targetPosition),O=k(()=>St(e.node.measured,()=>({width:0,height:0}),!0).width),F=k(()=>St(e.node.measured,()=>({width:0,height:0}),!0).height),M=k(()=>e.node.initialWidth),R=k(()=>e.node.initialHeight),b=k(()=>e.node.width),A=k(()=>e.node.height),B=k(()=>e.node.dragHandle),K=k(()=>St(e.node.internals.z,0)),Z=k(()=>e.node.internals.positionAbsolute.x),x=k(()=>e.node.internals.positionAbsolute.y),S=k(()=>e.node.internals.userNode),{id:z}=e.node,g=k(()=>r(i)??n().nodesDraggable),C=k(()=>r(s)??n().elementsSelectable),T=k(()=>r(u)??n().nodesConnectable),D=k(()=>Ri(e.node)),V=k(()=>!!e.node.internals.handleBounds),L=k(()=>r(D)&&r(V)),q=k(()=>r(v)??n().nodesFocusable);function j(fe){return n().parentLookup.has(fe)}let U=k(()=>j(z)),W=Q(null),J=null,ae=r(N),re=r(I),ie=r(H),ne=k(()=>n().nodeTypes[r(N)]??$i),G=k(()=>n().ariaLabelConfig),oe={get value(){return r(T)}};fp(z),hp(oe);let ee=k(()=>{const fe=r(O)===void 0?r(b)??r(M):r(b),ke=r(F)===void 0?r(A)??r(R):r(A);if(!(fe===void 0&&ke===void 0&&r(f)===void 0))return`${r(f)};${fe?`width:${en(fe)};`:""}${ke?`height:${en(ke)};`:""}`});_e(()=>{(r(N)!==ae||r(I)!==re||r(H)!==ie)&&r(W)!==null&&requestAnimationFrame(()=>{r(W)!==null&&n().updateNodeInternals(new Map([[z,{id:z,nodeElement:r(W),force:!0}]]))}),ae=r(N),re=r(I),ie=r(H)}),_e(()=>{e.resizeObserver&&(!r(L)||r(W)!==J)&&(J&&e.resizeObserver.unobserve(J),r(W)&&e.resizeObserver.observe(r(W)),J=r(W))}),On(()=>{J&&e.resizeObserver?.unobserve(J)});function se(fe){r(C)&&(!n().selectNodesOnDrag||!r(g)||n().nodeDragThreshold>0)&&n().handleNodeSelection(z),e.onnodeclick?.({node:r(S),event:fe})}function te(fe){if(!(Vi(fe)||n().disableKeyboardA11y))if(Pi.includes(fe.key)&&r(C)){const ke=fe.key==="Escape";n().handleNodeSelection(z,ke,r(W))}else r(g)&&e.node.selected&&Object.prototype.hasOwnProperty.call(sa,fe.key)&&(fe.preventDefault(),n(n().ariaLiveMessage=r(G)["node.a11yDescription.ariaLiveMessage"]({direction:fe.key.replace("Arrow","").toLowerCase(),x:~~e.node.internals.positionAbsolute.x,y:~~e.node.internals.positionAbsolute.y}),!0),n().moveSelectedNodes(sa[fe.key],fe.shiftKey?4:1))}const ue=()=>{if(n().disableKeyboardA11y||!n().autoPanOnNodeFocus||!r(W)?.matches(":focus-visible"))return;const{width:fe,height:ke,viewport:Ae}=n();Co(new Map([[z,e.node]]),{x:0,y:0,width:fe,height:ke},[Ae.x,Ae.y,Ae.zoom],!0).length>0||n().setCenter(e.node.position.x+(e.node.measured.width??0)/2,e.node.position.y+(e.node.measured.height??0)/2,{zoom:Ae.zoom})};var le=Me(),he=de(le);{var ve=fe=>{var ke=eh();bn(ke,()=>({"data-id":z,class:["svelte-flow__node",`svelte-flow__node-${r(N)}`,r(w)],style:r(ee),onclick:se,onpointerenter:e.onnodepointerenter?ge=>e.onnodepointerenter({node:r(S),event:ge}):void 0,onpointerleave:e.onnodepointerleave?ge=>e.onnodepointerleave({node:r(S),event:ge}):void 0,onpointermove:e.onnodepointermove?ge=>e.onnodepointermove({node:r(S),event:ge}):void 0,oncontextmenu:e.onnodecontextmenu?ge=>e.onnodecontextmenu({node:r(S),event:ge}):void 0,onkeydown:r(q)?te:void 0,onfocus:r(q)?ue:void 0,tabIndex:r(q)?0:void 0,role:e.node.ariaRole??(r(q)?"group":void 0),"aria-roledescription":"node","aria-describedby":n().disableKeyboardA11y?void 0:`${al}-${n().flowId}`,...e.node.domAttributes,[lo]:{dragging:r(m),selected:r(o),draggable:r(g),connectable:r(T),selectable:r(C),nopan:r(g),parent:r(U)},[ia]:{"z-index":r(K),transform:`translate(${r(Z)??""}px, ${r(x)??""}px)`,visibility:r(D)?"visible":"hidden"}}));var Ae=d(ke);un(Ae,()=>r(ne),(ge,Oe)=>{Oe(ge,{get data(){return r(a)},get id(){return z},get selected(){return r(o)},get selectable(){return r(C)},get deletable(){return r(l)},get sourcePosition(){return r(I)},get targetPosition(){return r(H)},get zIndex(){return r(K)},get dragging(){return r(m)},get draggable(){return r(g)},get dragHandle(){return r(B)},get parentId(){return r(E)},get type(){return r(N)},get isConnectable(){return r(T)},get positionAbsoluteX(){return r(Z)},get positionAbsoluteY(){return r(x)},get width(){return r(b)},get height(){return r(A)}})}),c(ke),zt(ke,(ge,Oe)=>rl?.(ge,Oe),()=>({nodeId:z,isSelectable:r(C),disabled:!r(g),handleSelector:r(B),noDragClass:n().noDragClass,nodeClickDistance:e.nodeClickDistance,onNodeMouseDown:n().handleNodeSelection,onDrag:(ge,Oe,Ye,We)=>{e.onnodedrag?.({event:ge,targetNode:Ye,nodes:We})},onDragStart:(ge,Oe,Ye,We)=>{e.onnodedragstart?.({event:ge,targetNode:Ye,nodes:We})},onDragStop:(ge,Oe,Ye,We)=>{e.onnodedragstop?.({event:ge,targetNode:Ye,nodes:We})},store:n()})),yn(ke,ge=>y(W,ge),()=>r(W)),_(fe,ke)};Y(he,fe=>{r(p)||fe(ve)})}_(t,le),Ce()}var nh=P('
    ');function rh(t,e){ze(e,!0);let n=pe(e,"store",15);const a=typeof ResizeObserver>"u"?null:new ResizeObserver(i=>{const s=new Map;i.forEach(l=>{const u=l.target.getAttribute("data-id");s.set(u,{id:u,nodeElement:l.target,force:!0})}),n().updateNodeInternals(s)});On(()=>{a?.disconnect()});var o=nh();je(o,21,()=>n().visible.nodes.values(),i=>i.id,(i,s)=>{th(i,{get node(){return r(s)},get resizeObserver(){return a},get nodeClickDistance(){return e.nodeClickDistance},get onnodeclick(){return e.onnodeclick},get onnodepointerenter(){return e.onnodepointerenter},get onnodepointermove(){return e.onnodepointermove},get onnodepointerleave(){return e.onnodepointerleave},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get onnodecontextmenu(){return e.onnodecontextmenu},get store(){return n()},set store(l){n(l)}})}),c(o),_(t,o),Ce()}var ah=ut('');function oh(t,e){ze(e,!0);let n=k(()=>e.edge.id),a=k(()=>e.edge.source),o=k(()=>e.edge.target),i=k(()=>e.edge.sourceX),s=k(()=>e.edge.sourceY),l=k(()=>e.edge.targetX),u=k(()=>e.edge.targetY),v=k(()=>e.edge.sourcePosition),p=k(()=>e.edge.targetPosition),m=k(()=>St(e.edge.animated,!1)),f=k(()=>St(e.edge.selected,!1)),w=k(()=>e.edge.label),N=k(()=>e.edge.labelStyle),E=k(()=>St(e.edge.data,()=>({}),!0)),I=k(()=>e.edge.style),H=k(()=>e.edge.interactionWidth),O=k(()=>St(e.edge.type,"default")),F=k(()=>e.edge.sourceHandle),M=k(()=>e.edge.targetHandle),R=k(()=>e.edge.markerStart),b=k(()=>e.edge.markerEnd),A=k(()=>e.edge.selectable),B=k(()=>e.edge.focusable),K=k(()=>St(e.edge.deletable,!0)),Z=k(()=>e.edge.hidden),x=k(()=>e.edge.zIndex),S=k(()=>e.edge.class),z=k(()=>e.edge.ariaLabel);mp(r(n));let g=null,C=k(()=>r(A)??e.store.elementsSelectable),T=k(()=>r(B)??e.store.edgesFocusable),D=k(()=>e.store.edgeTypes[r(O)]??el),V=k(()=>r(R)?`url('#${ao(r(R),e.store.flowId)}')`:void 0),L=k(()=>r(b)?`url('#${ao(r(b),e.store.flowId)}')`:void 0);function q(re){const ie=e.store.edgeLookup.get(r(n));ie&&(r(C)&&e.store.handleEdgeSelection(r(n)),e.onedgeclick?.({event:re,edge:ie}))}function j(re,ie){const ne=e.store.edgeLookup.get(r(n));ne&&ie({event:re,edge:ne})}function U(re){if(!e.store.disableKeyboardA11y&&Pi.includes(re.key)&&r(C)){const{unselectNodesAndEdges:ie,addSelectedEdges:ne}=e.store;re.key==="Escape"?(g?.blur(),ie({edges:[e.edge]})):ne([r(n)])}}var W=Me(),J=de(W);{var ae=re=>{var ie=ah();let ne;var G=d(ie);bn(G,()=>({class:["svelte-flow__edge",r(S)],"data-id":r(n),onclick:q,oncontextmenu:e.onedgecontextmenu?ee=>{j(ee,e.onedgecontextmenu)}:void 0,onpointerenter:e.onedgepointerenter?ee=>{j(ee,e.onedgepointerenter)}:void 0,onpointerleave:e.onedgepointerleave?ee=>{j(ee,e.onedgepointerleave)}:void 0,"aria-label":r(z)===null?void 0:r(z)?r(z):`Edge from ${r(a)} to ${r(o)}`,"aria-describedby":r(T)?`${ol}-${e.store.flowId}`:void 0,role:e.edge.ariaRole??(r(T)?"group":"img"),"aria-roledescription":"edge",onkeydown:r(T)?U:void 0,tabindex:r(T)?0:void 0,...e.edge.domAttributes,[lo]:{animated:r(m),selected:r(f),selectable:r(C)}}));var oe=d(G);un(oe,()=>r(D),(ee,se)=>{se(ee,{get id(){return r(n)},get source(){return r(a)},get target(){return r(o)},get sourceX(){return r(i)},get sourceY(){return r(s)},get targetX(){return r(l)},get targetY(){return r(u)},get sourcePosition(){return r(v)},get targetPosition(){return r(p)},get animated(){return r(m)},get selected(){return r(f)},get label(){return r(w)},get labelStyle(){return r(N)},get data(){return r(E)},get style(){return r(I)},get interactionWidth(){return r(H)},get selectable(){return r(C)},get deletable(){return r(K)},get type(){return r(O)},get sourceHandleId(){return r(F)},get targetHandleId(){return r(M)},get markerStart(){return r(V)},get markerEnd(){return r(L)}})}),c(G),yn(G,ee=>g=ee,()=>g),c(ie),$(()=>ne=st(ie,"",ne,{"z-index":r(x)})),_(re,ie)};Y(J,re=>{r(Z)||re(ae)})}_(t,W),Ce()}var sh=ut("");function ih(t,e){ze(e,!1);const n=fn();Ls();var a=sh();je(a,5,()=>n.markers,o=>o.id,(o,i)=>{uh(o,Ze(()=>r(i)))}),c(a),_(t,a),Ce()}var lh=ut(''),ch=ut(''),dh=ut('');function uh(t,e){ze(e,!0);let n=pe(e,"width",3,12.5),a=pe(e,"height",3,12.5),o=pe(e,"markerUnits",3,"strokeWidth"),i=pe(e,"orient",3,"auto-start-reverse"),s=pe(e,"color",3,"none");var l=dh(),u=d(l);{var v=m=>{var f=lh();let w;$(()=>{xe(f,"stroke-width",e.strokeWidth),w=st(f,"",w,{stroke:s()})}),_(m,f)},p=m=>{var f=ch();let w;$(()=>{xe(f,"stroke-width",e.strokeWidth),w=st(f,"",w,{stroke:s(),fill:s()})}),_(m,f)};Y(u,m=>{e.type===ra.Arrow?m(v):e.type===ra.ArrowClosed&&m(p,1)})}c(l),$(()=>{xe(l,"id",e.id),xe(l,"markerWidth",`${n()}`),xe(l,"markerHeight",`${a()}`),xe(l,"markerUnits",o()),xe(l,"orient",i())}),_(t,l),Ce()}var vh=P('
    ');function fh(t,e){ze(e,!0);let n=pe(e,"store",15);var a=vh(),o=d(a),i=d(o);ih(i,{}),c(o);var s=h(o,2);je(s,17,()=>n().visible.edges.values(),l=>l.id,(l,u)=>{oh(l,{get edge(){return r(u)},get onedgeclick(){return e.onedgeclick},get onedgecontextmenu(){return e.onedgecontextmenu},get onedgepointerenter(){return e.onedgepointerenter},get onedgepointerleave(){return e.onedgepointerleave},get store(){return n()},set store(v){n(v)}})}),c(a),_(t,a),Ce()}var ph=P('
    ');function sl(t,e){ze(e,!0);let n=pe(e,"x",3,0),a=pe(e,"y",3,0),o=pe(e,"width",3,0),i=pe(e,"height",3,0),s=pe(e,"isVisible",3,!0);var l=Me(),u=de(l);{var v=p=>{var m=ph();let f;$(w=>f=st(m,"",f,w),[()=>({width:typeof o()=="string"?o():en(o()),height:typeof i()=="string"?i():en(i()),transform:`translate(${n()}px, ${a()}px)`})]),_(p,m)};Y(u,p=>{s()&&p(v)})}_(t,l),Ce()}var hh=P("
    ");function gh(t,e){ze(e,!0);let n=Q(void 0);_e(()=>{e.store.disableKeyboardA11y||r(n)?.focus({preventScroll:!0})});let a=k(()=>{if(e.store.selectionRectMode==="nodes"){e.store.nodes;const m=xr(e.store.nodeLookup,{filter:f=>!!f.selected});if(m.width>0&&m.height>0)return m}return null});function o(m){const f=e.store.nodes.filter(w=>w.selected);e.onselectioncontextmenu?.({nodes:f,event:m})}function i(m){const f=e.store.nodes.filter(w=>w.selected);e.onselectionclick?.({nodes:f,event:m})}function s(m){Object.prototype.hasOwnProperty.call(sa,m.key)&&(m.preventDefault(),e.store.moveSelectedNodes(sa[m.key],m.shiftKey?4:1))}var l=Me(),u=de(l);{var v=m=>{var f=hh();let w;var N=d(f);sl(N,{width:"100%",height:"100%",x:0,y:0}),c(f),zt(f,(E,I)=>rl?.(E,I),()=>({disabled:!1,store:e.store,onDrag:(E,I,H,O)=>{e.onnodedrag?.({event:E,targetNode:null,nodes:O})},onDragStart:(E,I,H,O)=>{e.onnodedragstart?.({event:E,targetNode:null,nodes:O})},onDragStop:(E,I,H,O)=>{e.onnodedragstop?.({event:E,targetNode:null,nodes:O})}})),yn(f,E=>y(n,E),()=>r(n)),$(E=>{De(f,1,Rn(["svelte-flow__selection-wrapper",e.store.noPanClass]),"svelte-sf2y5e"),xe(f,"role",e.store.disableKeyboardA11y?void 0:"button"),xe(f,"tabindex",e.store.disableKeyboardA11y?void 0:-1),w=st(f,"",w,E)},[()=>({width:en(r(a).width),height:en(r(a).height),transform:`translate(${r(a).x??""}px, ${r(a).y??""}px)`})]),be("contextmenu",f,o),be("click",f,i),be("keydown",f,function(...E){(e.store.disableKeyboardA11y?void 0:s)?.apply(this,E)}),_(m,f)},p=k(()=>e.store.selectionRectMode==="nodes"&&r(a)&&ln(r(a).x)&&ln(r(a).y));Y(u,m=>{r(p)&&m(v)})}_(t,l),Ce()}_t(["contextmenu","click","keydown"]);function mh(t){switch(t){case"ctrl":return 8;case"shift":return 4;case"alt":return 2;case"meta":return 1}}function Gt(t,e){let{enabled:n=!0,trigger:a,type:o="keydown"}=e;function i(l){const u=Array.isArray(a)?a:[a],v=[l.metaKey,l.altKey,l.shiftKey,l.ctrlKey].reduce((p,m,f)=>m?p|1<0){const O=Array.isArray(f)?f:[f];let F=!1;for(const M of O)if((Array.isArray(M)?M:[M]).reduce((b,A)=>b|mh(A),0)===v){F=!0;break}if(!F)continue}E&&l.preventDefault();const H={node:t,trigger:m,originalEvent:l};t.dispatchEvent(new CustomEvent("shortcut",{detail:H})),N?.(H)}}}let s;return n&&(s=qa(t,o,i)),{update:l=>{const{enabled:u=!0,type:v="keydown"}=l;n&&(!u||o!==v)?s?.():!n&&u&&(s=qa(t,v,i)),n=u,o=v,a=l.trigger},destroy:()=>{s?.()}}}function _h(){const t=k(fn),e=i=>{const s=Ts(i)?i:r(t).nodeLookup.get(i.id),l=s.parentId?Sf(s.position,s.measured,s.parentId,r(t).nodeLookup,r(t).nodeOrigin):s.position,u={...s,position:l,width:s.measured?.width??s.width,height:s.measured?.height??s.height};return $n(u)};function n(i,s,l={replace:!1}){r(t).nodes=Qt(()=>r(t).nodes).map(u=>{if(u.id===i){const v=typeof s=="function"?s(u):s;return l?.replace&&Ts(v)?v:{...u,...v}}return u})}function a(i,s,l={replace:!1}){r(t).edges=Qt(()=>r(t).edges).map(u=>{if(u.id===i){const v=typeof s=="function"?s(u):s;return l.replace&&Ep(v)?v:{...u,...v}}return u})}const o=i=>r(t).nodeLookup.get(i);return{zoomIn:r(t).zoomIn,zoomOut:r(t).zoomOut,getInternalNode:o,getNode:i=>o(i)?.internals.userNode,getNodes:i=>i===void 0?r(t).nodes:Rs(r(t).nodeLookup,i),getEdge:i=>r(t).edgeLookup.get(i),getEdges:i=>i===void 0?r(t).edges:Rs(r(t).edgeLookup,i),setZoom:(i,s)=>{const l=r(t).panZoom;return l?l.scaleTo(i,{duration:s?.duration}):Promise.resolve(!1)},getZoom:()=>r(t).viewport.zoom,setViewport:async(i,s)=>{const l=r(t).viewport;return r(t).panZoom?(await r(t).panZoom.setViewport({x:i.x??l.x,y:i.y??l.y,zoom:i.zoom??l.zoom},s),Promise.resolve(!0)):Promise.resolve(!1)},getViewport:()=>$s(r(t).viewport),setCenter:async(i,s,l)=>r(t).setCenter(i,s,l),fitView:i=>r(t).fitView(i),fitBounds:async(i,s)=>{if(!r(t).panZoom)return Promise.resolve(!1);const l=Eo(i,r(t).width,r(t).height,r(t).minZoom,r(t).maxZoom,s?.padding??.1);return await r(t).panZoom.setViewport(l,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)},getIntersectingNodes:(i,s=!0,l)=>{const u=ys(i),v=u?i:e(i);return v?(l||r(t).nodes).filter(p=>{const m=r(t).nodeLookup.get(p.id);if(!m||!u&&p.id===i.id)return!1;const f=$n(m),w=gr(f,v);return s&&w>0||w>=f.width*f.height||w>=v.width*v.height}):[]},isNodeIntersecting:(i,s,l=!0)=>{const v=ys(i)?i:e(i);if(!v)return!1;const p=gr(v,s);return l&&p>0||p>=s.width*s.height||p>=v.width*v.height},deleteElements:async({nodes:i=[],edges:s=[]})=>{const{nodes:l,edges:u}=await bf({nodesToRemove:i,edgesToRemove:s,nodes:r(t).nodes,edges:r(t).edges,onBeforeDelete:r(t).onbeforedelete});return l&&(r(t).nodes=Qt(()=>r(t).nodes).filter(v=>!l.some(({id:p})=>p===v.id))),u&&(r(t).edges=Qt(()=>r(t).edges).filter(v=>!u.some(({id:p})=>p===v.id))),(l.length>0||u.length>0)&&r(t).ondelete?.({nodes:l,edges:u}),{deletedNodes:l,deletedEdges:u}},screenToFlowPosition:(i,s={snapToGrid:!0})=>{if(!r(t).domNode)return i;const l=s.snapToGrid?r(t).snapGrid:!1,{x:u,y:v,zoom:p}=r(t).viewport,{x:m,y:f}=r(t).domNode.getBoundingClientRect(),w={x:i.x-m,y:i.y-f};return kr(w,[u,v,p],l!==null,l||[1,1])},flowToScreenPosition:i=>{if(!r(t).domNode)return i;const{x:s,y:l,zoom:u}=r(t).viewport,{x:v,y:p}=r(t).domNode.getBoundingClientRect(),m=oa(i,[s,l,u]);return{x:m.x+v,y:m.y+p}},toObject:()=>structuredClone({nodes:[...r(t).nodes],edges:[...r(t).edges],viewport:{...r(t).viewport}}),updateNode:n,updateNodeData:(i,s,l)=>{const u=r(t).nodeLookup.get(i)?.internals.userNode;if(!u)return;const v=typeof s=="function"?s(u):s;n(i,p=>({...p,data:l?.replace?v:{...p.data,...v}}))},updateEdge:a,getNodesBounds:i=>gf(i,{nodeLookup:r(t).nodeLookup,nodeOrigin:r(t).nodeOrigin}),getHandleConnections:({type:i,id:s,nodeId:l})=>Array.from(r(t).connectionLookup.get(`${l}-${i}-${s??null}`)?.values()??[])}}function Rs(t,e){const n=[];for(const a of e){const o=t.get(a);if(o){const i="internals"in o?o.internals?.userNode:o;n.push(i)}}return n}function yh(t,e){ze(e,!0);let n=pe(e,"store",15),a=pe(e,"selectionKey",3,"Shift"),o=pe(e,"multiSelectionKey",19,()=>mr()?"Meta":"Control"),i=pe(e,"deleteKey",3,"Backspace"),s=pe(e,"panActivationKey",3," "),l=pe(e,"zoomActivationKey",19,()=>mr()?"Meta":"Control"),{deleteElements:u}=_h();function v(E){return E!==null&&typeof E=="object"}function p(E){return v(E)?E.modifier||[]:[]}function m(E){return E==null?"":v(E)?E.key:E}function f(E,I){return(Array.isArray(E)?E:[E]).map(O=>{const F=m(O);return{key:F,modifier:p(O),enabled:F!==null,callback:I}})}function w(){n(n().selectionRect=null,!0),n(n().selectionKeyPressed=!1,!0),n(n().multiselectionKeyPressed=!1,!0),n(n().deleteKeyPressed=!1,!0),n(n().panActivationKeyPressed=!1,!0),n(n().zoomActivationKeyPressed=!1,!0)}function N(){const E=n().nodes.filter(H=>H.selected),I=n().edges.filter(H=>H.selected);u({nodes:E,edges:I})}jr("blur",It,w),jr("contextmenu",It,w),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(a(),()=>n(n().selectionKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(a(),()=>n(n().selectionKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(o(),()=>{n(n().multiselectionKeyPressed=!0,!0)}),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(o(),()=>n(n().multiselectionKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(i(),E=>{!(E.originalEvent.ctrlKey||E.originalEvent.metaKey||E.originalEvent.shiftKey)&&!Vi(E.originalEvent)&&(n(n().deleteKeyPressed=!0,!0),N())}),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(i(),()=>n(n().deleteKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(s(),()=>n(n().panActivationKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(s(),()=>n(n().panActivationKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(l(),()=>n(n().zoomActivationKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(l(),()=>n(n().zoomActivationKeyPressed=!1,!0)),type:"keyup"})),Ce()}var bh=ut(''),xh=ut('');function wh(t,e){ze(e,!0);let n=k(()=>{if(!e.store.connection.inProgress)return"";const s={sourceX:e.store.connection.from.x,sourceY:e.store.connection.from.y,sourcePosition:e.store.connection.fromPosition,targetX:e.store.connection.to.x,targetY:e.store.connection.to.y,targetPosition:e.store.connection.toPosition};switch(e.type){case gn.Bezier:{const[l]=Bi(s);return l}case gn.Straight:{const[l]=Ki(s);return l}case gn.Step:case gn.SmoothStep:{const[l]=No({...s,borderRadius:e.type===gn.Step?0:void 0});return l}}});var a=Me(),o=de(a);{var i=s=>{var l=xh(),u=d(l),v=d(u);{var p=f=>{var w=Me(),N=de(w);un(N,()=>e.LineComponent,(E,I)=>{I(E,{})}),_(f,w)},m=f=>{var w=bh();$(()=>{xe(w,"d",r(n)),st(w,e.style)}),_(f,w)};Y(v,f=>{e.LineComponent?f(p):f(m,!1)})}c(u),c(l),$(f=>{xe(l,"width",e.store.width),xe(l,"height",e.store.height),st(l,e.containerStyle),De(u,0,f)},[()=>Rn(["svelte-flow__connection",pf(e.store.connection.isValid)])]),_(s,l)};Y(o,s=>{e.store.connection.inProgress&&s(i)})}_(t,a),Ce()}var kh=P("
    ");function Do(t,e){ze(e,!0);let n=pe(e,"position",3,"top-right"),a=_n(e,["$$slots","$$events","$$legacy","position","style","class","children"]),o=k(()=>`${n()}`.split("-"));var i=kh();bn(i,l=>({class:l,style:e.style,...a}),[()=>["svelte-flow__panel",e.class,...r(o)]]);var s=d(i);Dt(s,()=>e.children??tr),c(i),_(t,i),Ce()}var Sh=P('Svelte Flow');function zh(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-right");var a=Me(),o=de(a);{var i=s=>{Do(s,{get position(){return n()},class:"svelte-flow__attribution","data-message":"Feel free to remove the attribution or check out how you could support us: https://svelteflow.dev/support-us",children:(l,u)=>{var v=Sh();_(l,v)},$$slots:{default:!0}})};Y(o,s=>{e.proOptions?.hideAttribution||s(i)})}_(t,a),Ce()}var Ch=P("
    ");function Eh(t,e){ze(e,!0);let n=pe(e,"domNode",15),a=pe(e,"clientWidth",15),o=pe(e,"clientHeight",15),i=k(()=>e.rest.class),s=k(()=>Fl(e.rest,["id","class","nodeTypes","edgeTypes","colorMode","isValidConnection","onmove","onmovestart","onmoveend","onflowerror","ondelete","onbeforedelete","onbeforeconnect","onconnect","onconnectstart","onconnectend","onbeforereconnect","onreconnect","onreconnectstart","onreconnectend","onclickconnectstart","onclickconnectend","oninit","onselectionchange","onselectiondragstart","onselectiondrag","onselectiondragstop","onselectionstart","onselectionend","clickConnect","fitView","fitViewOptions","nodeOrigin","nodeDragThreshold","connectionDragThreshold","minZoom","maxZoom","initialViewport","connectionRadius","connectionMode","selectionMode","selectNodesOnDrag","snapGrid","defaultMarkerColor","translateExtent","nodeExtent","onlyRenderVisibleElements","autoPanOnConnect","autoPanOnNodeDrag","colorModeSSR","defaultEdgeOptions","elevateNodesOnSelect","elevateEdgesOnSelect","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","elementsSelectable","nodesFocusable","edgesFocusable","disableKeyboardA11y","noDragClass","noPanClass","noWheelClass","ariaLabelConfig","autoPanSpeed","panOnScrollSpeed","zIndexMode"]));function l(p){p.currentTarget.scrollTo({top:0,left:0,behavior:"auto"}),e.rest.onscroll&&e.rest.onscroll(p)}var u=Ch();bn(u,p=>({class:["svelte-flow","svelte-flow__container",r(i),e.colorMode],"data-testid":"svelte-flow__wrapper",role:"application",onscroll:l,...r(s),[ia]:p}),[()=>({width:en(e.width),height:en(e.height)})],void 0,void 0,"svelte-mkap6j");var v=d(u);Dt(v,()=>e.children??tr),c(u),yn(u,p=>n(p),()=>n()),Qo(u,"clientHeight",o),Qo(u,"clientWidth",a),_(t,u),Ce()}var Nh=P('
    ',1),Mh=P(" ",1),Ph=P(" ",1);function Th(t,e){ze(e,!0);let n=pe(e,"paneClickDistance",3,1),a=pe(e,"nodeClickDistance",3,1),o=pe(e,"panOnScrollMode",19,()=>Yn.Free),i=pe(e,"preventScrolling",3,!0),s=pe(e,"zoomOnScroll",3,!0),l=pe(e,"zoomOnDoubleClick",3,!0),u=pe(e,"zoomOnPinch",3,!0),v=pe(e,"panOnScroll",3,!1),p=pe(e,"panOnScrollSpeed",3,.5),m=pe(e,"panOnDrag",3,!0),f=pe(e,"selectionOnDrag",3,!1),w=pe(e,"connectionLineType",19,()=>gn.Bezier),N=pe(e,"nodes",31,()=>$t([])),E=pe(e,"edges",31,()=>$t([])),I=pe(e,"viewport",15,void 0),H=_n(e,["$$slots","$$events","$$legacy","width","height","proOptions","selectionKey","deleteKey","panActivationKey","multiSelectionKey","zoomActivationKey","paneClickDistance","nodeClickDistance","onmovestart","onmoveend","onmove","oninit","onnodeclick","onnodecontextmenu","onnodedrag","onnodedragstart","onnodedragstop","onnodepointerenter","onnodepointermove","onnodepointerleave","onselectionclick","onselectioncontextmenu","onselectionstart","onselectionend","onedgeclick","onedgecontextmenu","onedgepointerenter","onedgepointerleave","onpaneclick","onpanecontextmenu","panOnScrollMode","preventScrolling","zoomOnScroll","zoomOnDoubleClick","zoomOnPinch","panOnScroll","panOnScrollSpeed","panOnDrag","selectionOnDrag","connectionLineComponent","connectionLineStyle","connectionLineContainerStyle","connectionLineType","attributionPosition","children","nodes","edges","viewport"]),O=qp({props:H,width:e.width,height:e.height,get nodes(){return N()},set nodes(M){N(M)},get edges(){return E()},set edges(M){E(M)},get viewport(){return I()},set viewport(M){I(M)}});const F=so(oo);F&&F.setStore&&F.setStore(O),Fs(oo,{provider:!1,getStore(){return O}}),_e(()=>{const M={nodes:O.selectedNodes,edges:O.selectedEdges};Qt(()=>e.onselectionchange)?.(M);for(const R of O.selectionChangeHandlers.values())R(M)}),On(()=>{O.reset()}),Eh(t,{get colorMode(){return O.colorMode},get width(){return e.width},get height(){return e.height},get rest(){return H},get domNode(){return O.domNode},set domNode(M){O.domNode=M},get clientWidth(){return O.width},set clientWidth(M){O.width=M},get clientHeight(){return O.height},set clientHeight(M){O.height=M},children:(M,R)=>{var b=Ph(),A=de(b);yh(A,{get selectionKey(){return e.selectionKey},get deleteKey(){return e.deleteKey},get panActivationKey(){return e.panActivationKey},get multiSelectionKey(){return e.multiSelectionKey},get zoomActivationKey(){return e.zoomActivationKey},get store(){return O},set store(S){O=S}});var B=h(A,2);Zp(B,{get panOnScrollMode(){return o()},get preventScrolling(){return i()},get zoomOnScroll(){return s()},get zoomOnDoubleClick(){return l()},get zoomOnPinch(){return u()},get panOnScroll(){return v()},get panOnScrollSpeed(){return p()},get panOnDrag(){return m()},get paneClickDistance(){return n()},get selectionOnDrag(){return f()},get onmovestart(){return e.onmovestart},get onmove(){return e.onmove},get onmoveend(){return e.onmoveend},get oninit(){return e.oninit},get store(){return O},set store(S){O=S},children:(S,z)=>{Xp(S,{get onpaneclick(){return e.onpaneclick},get onpanecontextmenu(){return e.onpanecontextmenu},get onselectionstart(){return e.onselectionstart},get onselectionend(){return e.onselectionend},get panOnDrag(){return m()},get paneClickDistance(){return n()},get selectionOnDrag(){return f()},get store(){return O},set store(g){O=g},children:(g,C)=>{var T=Mh(),D=de(T);Gp(D,{get store(){return O},set store(L){O=L},children:(L,q)=>{var j=Nh(),U=h(de(j),2);fh(U,{get onedgeclick(){return e.onedgeclick},get onedgecontextmenu(){return e.onedgecontextmenu},get onedgepointerenter(){return e.onedgepointerenter},get onedgepointerleave(){return e.onedgepointerleave},get store(){return O},set store(re){O=re}});var W=h(U,4);wh(W,{get type(){return w()},get LineComponent(){return e.connectionLineComponent},get containerStyle(){return e.connectionLineContainerStyle},get style(){return e.connectionLineStyle},get store(){return O},set store(re){O=re}});var J=h(W,2);rh(J,{get nodeClickDistance(){return a()},get onnodeclick(){return e.onnodeclick},get onnodecontextmenu(){return e.onnodecontextmenu},get onnodepointerenter(){return e.onnodepointerenter},get onnodepointermove(){return e.onnodepointermove},get onnodepointerleave(){return e.onnodepointerleave},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get store(){return O},set store(re){O=re}});var ae=h(J,2);gh(ae,{get onselectionclick(){return e.onselectionclick},get onselectioncontextmenu(){return e.onselectioncontextmenu},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get store(){return O},set store(re){O=re}}),ye(2),_(L,j)},$$slots:{default:!0}});var V=h(D,2);{let L=k(()=>!!(O.selectionRect&&O.selectionRectMode==="user")),q=k(()=>O.selectionRect?.width),j=k(()=>O.selectionRect?.height),U=k(()=>O.selectionRect?.x),W=k(()=>O.selectionRect?.y);sl(V,{get isVisible(){return r(L)},get width(){return r(q)},get height(){return r(j)},get x(){return r(U)},get y(){return r(W)}})}_(g,T)},$$slots:{default:!0}})},$$slots:{default:!0}});var K=h(B,2);zh(K,{get proOptions(){return e.proOptions},get position(){return e.attributionPosition}});var Z=h(K,2);Jp(Z,{get store(){return O}});var x=h(Z,2);Dt(x,()=>e.children??tr),_(M,b)},$$slots:{default:!0}}),Ce()}var Ih=P("");function Lr(t,e){let n=_n(e,["$$slots","$$events","$$legacy","class","bgColor","bgColorHover","color","colorHover","borderColor","onclick","children"]);var a=Ih();bn(a,()=>({type:"button",onclick:e.onclick,class:["svelte-flow__controls-button",e.class],...n,[ia]:{"--xy-controls-button-background-color-props":e.bgColor,"--xy-controls-button-background-color-hover-props":e.bgColorHover,"--xy-controls-button-color-props":e.color,"--xy-controls-button-color-hover-props":e.colorHover,"--xy-controls-button-border-color-props":e.borderColor}}));var o=d(a);Dt(o,()=>e.children??tr),c(a),_(t,a)}var Ah=ut('');function Dh(t){var e=Ah();_(t,e)}var Oh=ut('');function Rh(t){var e=Oh();_(t,e)}var Lh=ut('');function Hh(t){var e=Lh();_(t,e)}var Vh=ut('');function Fh(t){var e=Vh();_(t,e)}var Bh=ut('');function qh(t){var e=Bh();_(t,e)}var Kh=P(" ",1),jh=P(" ",1);function Zh(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-left"),a=pe(e,"orientation",3,"vertical"),o=pe(e,"showZoom",3,!0),i=pe(e,"showFitView",3,!0),s=pe(e,"showLock",3,!0),l=_n(e,["$$slots","$$events","$$legacy","position","orientation","showZoom","showFitView","showLock","style","class","buttonBgColor","buttonBgColorHover","buttonColor","buttonColorHover","buttonBorderColor","fitViewOptions","children","before","after"]),u=k(fn);const v={bgColor:e.buttonBgColor,bgColorHover:e.buttonBgColorHover,color:e.buttonColor,colorHover:e.buttonColorHover,borderColor:e.buttonBorderColor};let p=k(()=>r(u).nodesDraggable||r(u).nodesConnectable||r(u).elementsSelectable),m=k(()=>r(u).viewport.zoom<=r(u).minZoom),f=k(()=>r(u).viewport.zoom>=r(u).maxZoom),w=k(()=>r(u).ariaLabelConfig),N=k(()=>a()==="horizontal"?"horizontal":"vertical");const E=()=>{r(u).zoomIn()},I=()=>{r(u).zoomOut()},H=()=>{r(u).fitView(e.fitViewOptions)},O=()=>{let F=!r(p);r(u).nodesDraggable=F,r(u).nodesConnectable=F,r(u).elementsSelectable=F};{let F=k(()=>["svelte-flow__controls",r(N),e.class]);Do(t,Ze({get class(){return r(F)},get position(){return n()},"data-testid":"svelte-flow__controls",get"aria-label"(){return r(w)["controls.ariaLabel"]},get style(){return e.style}},()=>l,{children:(M,R)=>{var b=jh(),A=de(b);{var B=L=>{var q=Me(),j=de(q);Dt(j,()=>e.before),_(L,q)};Y(A,L=>{e.before&&L(B)})}var K=h(A,2);{var Z=L=>{var q=Kh(),j=de(q);Lr(j,Ze({onclick:E,class:"svelte-flow__controls-zoomin",get title(){return r(w)["controls.zoomIn.ariaLabel"]},get"aria-label"(){return r(w)["controls.zoomIn.ariaLabel"]},get disabled(){return r(f)}},()=>v,{children:(W,J)=>{Dh(W)},$$slots:{default:!0}}));var U=h(j,2);Lr(U,Ze({onclick:I,class:"svelte-flow__controls-zoomout",get title(){return r(w)["controls.zoomOut.ariaLabel"]},get"aria-label"(){return r(w)["controls.zoomOut.ariaLabel"]},get disabled(){return r(m)}},()=>v,{children:(W,J)=>{Rh(W)},$$slots:{default:!0}})),_(L,q)};Y(K,L=>{o()&&L(Z)})}var x=h(K,2);{var S=L=>{Lr(L,Ze({class:"svelte-flow__controls-fitview",onclick:H,get title(){return r(w)["controls.fitView.ariaLabel"]},get"aria-label"(){return r(w)["controls.fitView.ariaLabel"]}},()=>v,{children:(q,j)=>{Hh(q)},$$slots:{default:!0}}))};Y(x,L=>{i()&&L(S)})}var z=h(x,2);{var g=L=>{Lr(L,Ze({class:"svelte-flow__controls-interactive",onclick:O,get title(){return r(w)["controls.interactive.ariaLabel"]},get"aria-label"(){return r(w)["controls.interactive.ariaLabel"]}},()=>v,{children:(q,j)=>{var U=Me(),W=de(U);{var J=re=>{qh(re)},ae=re=>{Fh(re)};Y(W,re=>{r(p)?re(J):re(ae,!1)})}_(q,U)},$$slots:{default:!0}}))};Y(z,L=>{s()&&L(g)})}var C=h(z,2);{var T=L=>{var q=Me(),j=de(q);Dt(j,()=>e.children),_(L,q)};Y(C,L=>{e.children&&L(T)})}var D=h(C,2);{var V=L=>{var q=Me(),j=de(q);Dt(j,()=>e.after),_(L,q)};Y(D,L=>{e.after&&L(V)})}_(M,b)},$$slots:{default:!0}}))}Ce()}var cn;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(cn||(cn={}));var Yh=ut("");function Xh(t,e){var n=Yh();$(()=>{xe(n,"cx",e.radius),xe(n,"cy",e.radius),xe(n,"r",e.radius),De(n,0,Rn(["svelte-flow__background-pattern","dots",e.class]))}),_(t,n)}var Wh=ut("");function Gh(t,e){ze(e,!0);var n=Wh();$(()=>{xe(n,"stroke-width",e.lineWidth),xe(n,"d",`M${e.dimensions[0]/2} 0 V${e.dimensions[1]} M0 ${e.dimensions[1]/2} H${e.dimensions[0]}`),De(n,0,Rn(["svelte-flow__background-pattern",e.variant,e.class]))}),_(t,n),Ce()}const Uh={[cn.Dots]:1,[cn.Lines]:1,[cn.Cross]:6};var Qh=ut('');function Jh(t,e){ze(e,!0);let n=pe(e,"variant",19,()=>cn.Dots),a=pe(e,"gap",3,20),o=pe(e,"lineWidth",3,1),i=k(fn),s=k(()=>n()===cn.Dots),l=k(()=>n()===cn.Cross),u=k(()=>Array.isArray(a())?a():[a(),a()]),v=k(()=>`background-pattern-${r(i).flowId}-${e.id??""}`),p=k(()=>[r(u)[0]*r(i).viewport.zoom||1,r(u)[1]*r(i).viewport.zoom||1]),m=k(()=>(e.size??Uh[n()])*r(i).viewport.zoom),f=k(()=>r(l)?[r(m),r(m)]:r(p)),w=k(()=>r(s)?[r(m)/2,r(m)/2]:[r(f)[0]/2,r(f)[1]/2]);var N=Qh();let E;var I=d(N),H=d(I);{var O=R=>{{let b=k(()=>r(m)/2);Xh(R,{get radius(){return r(b)},get class(){return e.patternClass}})}},F=R=>{Gh(R,{get dimensions(){return r(f)},get variant(){return n()},get lineWidth(){return o()},get class(){return e.patternClass}})};Y(H,R=>{r(s)?R(O):R(F,!1)})}c(I);var M=h(I);c(N),$(()=>{De(N,0,Rn(["svelte-flow__background","svelte-flow__container",e.class])),E=st(N,"",E,{"--xy-background-color-props":e.bgColor,"--xy-background-pattern-color-props":e.patternColor}),xe(I,"id",r(v)),xe(I,"x",r(i).viewport.x%r(p)[0]),xe(I,"y",r(i).viewport.y%r(p)[1]),xe(I,"width",r(p)[0]),xe(I,"height",r(p)[1]),xe(I,"patternTransform",`translate(-${r(w)[0]},-${r(w)[1]})`),xe(M,"fill",`url(#${r(v)})`)}),_(t,N),Ce()}function $h(t){const e=k(fn),n=k(()=>r(e).nodeLookup),a=k(()=>r(e).nodes),o=k(()=>(r(a),r(n).get(t)));return{get current(){return r(o)}}}var eg=ut("");function tg(t,e){ze(e,!0);let n=pe(e,"borderRadius",3,5),a=pe(e,"strokeWidth",3,2),o=k(()=>$h(e.id)),i=k(()=>{if(!r(o).current)return{width:0,height:0,x:0,y:0};const{width:N,height:E}=xn(r(o).current);return{width:e.width??N,height:e.height??E,x:e.x??r(o).current.internals.positionAbsolute.x,y:e.y??r(o).current.internals.positionAbsolute.y}}),s=k(()=>r(i).width),l=k(()=>r(i).height),u=k(()=>r(i).x),v=k(()=>r(i).y);var p=Me(),m=de(p);{var f=N=>{const E=k(()=>e.nodeComponent);var I=Me(),H=de(I);un(H,()=>r(E),(O,F)=>{F(O,{get id(){return e.id},get x(){return r(u)},get y(){return r(v)},get width(){return r(s)},get height(){return r(l)},get borderRadius(){return n()},get class(){return e.class},get color(){return e.color},get shapeRendering(){return e.shapeRendering},get strokeColor(){return e.strokeColor},get strokeWidth(){return a()},get selected(){return e.selected}})}),_(N,I)},w=N=>{var E=eg();let I,H;$(()=>{I=De(E,0,Rn(["svelte-flow__minimap-node",e.class]),null,I,{selected:e.selected}),xe(E,"x",r(u)),xe(E,"y",r(v)),xe(E,"rx",n()),xe(E,"ry",n()),xe(E,"width",r(s)),xe(E,"height",r(l)),xe(E,"shape-rendering",e.shapeRendering),H=st(E,"",H,{fill:e.color,stroke:e.strokeColor,"stroke-width":a()})}),_(N,E)};Y(m,N=>{e.nodeComponent?N(f):N(w,!1)})}_(t,p),Ce()}function ng(t,e){const n=rp({domNode:t,panZoom:e.panZoom,getTransform:()=>{const{viewport:o}=e.store;return[o.x,o.y,o.zoom]},getViewScale:e.getViewScale});n.update({translateExtent:e.translateExtent,width:e.width,height:e.height,inversePan:e.inversePan,zoomStep:e.zoomStep,pannable:e.pannable,zoomable:e.zoomable});function a(o){n.update({translateExtent:o.translateExtent,width:o.width,height:o.height,inversePan:o.inversePan,zoomStep:o.zoomStep,pannable:o.pannable,zoomable:o.zoomable})}return{update:a,destroy(){n.destroy()}}}const Ba=t=>t instanceof Function?t:()=>t;var rg=ut(" "),ag=ut(''),og=P('',1);function sg(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-right"),a=pe(e,"nodeStrokeColor",3,"transparent"),o=pe(e,"nodeClass",3,""),i=pe(e,"nodeBorderRadius",3,5),s=pe(e,"nodeStrokeWidth",3,2),l=pe(e,"width",3,200),u=pe(e,"height",3,150),v=pe(e,"pannable",3,!0),p=pe(e,"zoomable",3,!0),m=_n(e,["$$slots","$$events","$$legacy","position","ariaLabel","nodeStrokeColor","nodeColor","nodeClass","nodeBorderRadius","nodeStrokeWidth","nodeComponent","bgColor","maskColor","maskStrokeColor","maskStrokeWidth","width","height","pannable","zoomable","inversePan","zoomStep","class"]),f=k(fn),w=k(()=>r(f).ariaLabelConfig);const N=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";let E=k(()=>`svelte-flow__minimap-desc-${r(f).flowId}`),I=k(()=>({x:-r(f).viewport.x/r(f).viewport.zoom,y:-r(f).viewport.y/r(f).viewport.zoom,width:r(f).width/r(f).viewport.zoom,height:r(f).height/r(f).viewport.zoom})),H=k(()=>Oi(xr(r(f).nodeLookup,{filter:C=>!C.hidden}),r(I))),O=k(()=>r(H).width/l()),F=k(()=>r(H).height/u()),M=k(()=>Math.max(r(O),r(F))),R=k(()=>r(M)*l()),b=k(()=>r(M)*u()),A=k(()=>5*r(M)),B=k(()=>r(H).x-(r(R)-r(H).width)/2-r(A)),K=k(()=>r(H).y-(r(b)-r(H).height)/2-r(A)),Z=k(()=>r(R)+r(A)*2),x=k(()=>r(b)+r(A)*2);const S=()=>r(M);var z=og(),g=de(z);{let C=k(()=>["svelte-flow__minimap",e.class]);lc(g,()=>({"--xy-minimap-background-color-props":e.bgColor})),Do(g.lastChild,Ze({get position(){return n()},get class(){return r(C)},"data-testid":"svelte-flow__minimap"},()=>m,{children:(T,D)=>{var V=Me(),L=de(V);{var q=j=>{var U=ag();let W;var J=d(U);{var ae=ne=>{var G=rg(),oe=d(G,!0);c(G),$(()=>{xe(G,"id",r(E)),X(oe,e.ariaLabel??r(w)["minimap.ariaLabel"])}),_(ne,G)};Y(J,ne=>{(e.ariaLabel??r(w)["minimap.ariaLabel"])&&ne(ae)})}var re=h(J);je(re,17,()=>r(f).nodes,ne=>ne.id,(ne,G)=>{const oe=k(()=>r(f).nodeLookup.get(r(G).id));var ee=Me(),se=de(ee);{var te=le=>{{let he=k(()=>e.nodeColor===void 0?void 0:Ba(e.nodeColor)(r(G))),ve=k(()=>Ba(a())(r(G))),fe=k(()=>Ba(o())(r(G)));tg(le,{get id(){return r(oe).id},get selected(){return r(oe).selected},get nodeComponent(){return e.nodeComponent},get color(){return r(he)},get borderRadius(){return i()},get strokeColor(){return r(ve)},get strokeWidth(){return s()},get shapeRendering(){return N},get class(){return r(fe)}})}},ue=k(()=>r(oe)&&Ri(r(oe))&&!r(oe).hidden);Y(se,le=>{r(ue)&&le(te)})}_(ne,ee)});var ie=h(re);c(U),zt(U,(ne,G)=>ng?.(ne,G),()=>({store:r(f),panZoom:r(f).panZoom,getViewScale:S,translateExtent:r(f).translateExtent,width:r(f).width,height:r(f).height,inversePan:e.inversePan,zoomStep:e.zoomStep,pannable:v(),zoomable:p()})),$(()=>{xe(U,"width",l()),xe(U,"height",u()),xe(U,"viewBox",`${r(B)??""} ${r(K)??""} ${r(Z)??""} ${r(x)??""}`),xe(U,"aria-labelledby",r(E)),W=st(U,"",W,{"--xy-minimap-mask-background-color-props":e.maskColor,"--xy-minimap-mask-stroke-color-props":e.maskStrokeColor,"--xy-minimap-mask-stroke-width-props":e.maskStrokeWidth?e.maskStrokeWidth*r(M):void 0}),xe(ie,"d",`M${r(B)-r(A)},${r(K)-r(A)}h${r(Z)+r(A)*2}v${r(x)+r(A)*2}h${-r(Z)-r(A)*2}z - M${r(I).x??""},${r(I).y??""}h${r(I).width??""}v${r(I).height??""}h${-r(I).width}z`)}),_(j,U)};Y(L,j=>{r(f).panZoom&&j(q)})}_(T,V)},$$slots:{default:!0}})),c(g)}_(t,z),Ce()}var ig=P(' '),lg=P(''),cg=P(''),dg=P(''),ug=P('
    '),vg=P('

    '),fg=P('
    Exec In
    Exec Out
    ');function pg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>!!e.data.multimodal?.vision_enabled),o=Q(!1);_e(()=>{if(r(n)==="complete"){y(o,!0);const D=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(D)}else y(o,!1)});var i=fg();let s;var l=d(i),u=d(l),v=d(u),p=d(v);{var m=D=>{var V=ig(),L=d(V,!0);c(V),$(()=>X(L,e.data.model)),_(D,V)};Y(p,D=>{e.data.model&&D(m)})}var f=h(p,2);{var w=D=>{var V=lg(),L=d(V);Wr(L,{size:10}),c(V),_(D,V)};Y(f,D=>{r(a)&&D(w)})}c(v);var N=h(v,2),E=d(N);uo(E,{size:11}),c(N),c(u);var I=h(u,2),H=d(I);let O;var F=h(H,2);cr(F,{size:14});var M=h(F,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=cg(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),_(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=dg(),L=d(V);Rt(L,{size:13}),c(V),_(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(I),c(l);var Z=h(l,2),x=h(d(Z),2);{var S=D=>{var V=ug(),L=d(V);c(V),$((q,j)=>X(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),_(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2);{var g=D=>{var V=vg(),L=h(d(V),2),q=d(L,!0);c(L),c(V),$(()=>X(q,e.data.instructions)),_(D,V)};Y(z,D=>{e.data.instructions&&D(g)})}c(Z);var C=h(Z,2);$e(C,{type:"target",get position(){return we.Left}});var T=h(C,2);$e(T,{type:"source",get position(){return we.Right}}),c(i),$(()=>{s=De(i,1,"agent-node svelte-uofr5c",null,s,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),O=De(H,1,"status-dot svelte-uofr5c",null,O,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),X(R,e.data.label||"Agent")}),_(t,i),Ce()}var hg=P(''),gg=P(''),mg=P('
    tool
    '),_g=P('
    '),yg=P('
    timeout
    '),bg=P('
    Exec In
    Exec Out
    ');function xg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const x=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(x)}else y(a,!1)});var o=bg();let i;var s=d(o),l=d(s),u=d(l);let v;var p=h(u,2),m=d(p);Xn(m,{size:13}),c(p);var f=h(p,2),w=d(f,!0);c(f);var N=h(f,2);{var E=x=>{var S=hg(),z=d(S);Kt(z,{size:12}),c(S),jt(3,S,()=>Zt,()=>({duration:200,start:.6})),_(x,S)};Y(N,x=>{r(a)&&x(E)})}var I=h(N,2);{var H=x=>{var S=gg(),z=d(S);Rt(z,{size:12}),c(S),_(x,S)};Y(I,x=>{r(n)==="error"&&x(H)})}c(l),c(s);var O=h(s,2),F=h(d(O),2);{var M=x=>{var S=mg(),z=h(d(S)),g=d(z,!0);c(z),c(S),$(()=>X(g,e.data.tool_name)),_(x,S)};Y(F,x=>{e.data.tool_name&&x(M)})}var R=h(F,2);{var b=x=>{var S=_g(),z=d(S);c(S),$((g,C)=>X(z,`${g??""}${C??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),_(x,S)};Y(R,x=>{e.data.description&&x(b)})}var A=h(R,2);{var B=x=>{var S=yg(),z=h(d(S)),g=d(z);c(z),c(S),$(()=>X(g,`${e.data.timeout??""}s`)),_(x,S)};Y(A,x=>{e.data.timeout&&x(B)})}c(O);var K=h(O,2);$e(K,{type:"target",get position(){return we.Left}});var Z=h(K,2);$e(Z,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"tool-node svelte-107d6w1",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-107d6w1",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),X(w,e.data.label||"Tool")}),_(t,o),Ce()}var wg=P(''),kg=P(''),Sg=P('
    '),zg=P('
    '),Cg=P('
    Max Steps
    '),Eg=P('
    Exec In
    Exec Out
    ');function Ng(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const x=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(x)}else y(a,!1)});var o=Eg();let i;var s=d(o),l=d(s),u=d(l);let v;var p=h(u,2),m=d(p);Zr(m,{size:14}),c(p);var f=h(p,2),w=d(f,!0);c(f);var N=h(f,2);{var E=x=>{var S=wg(),z=d(S);Kt(z,{size:12}),c(S),jt(3,S,()=>Zt,()=>({duration:200,start:.6})),_(x,S)};Y(N,x=>{r(a)&&x(E)})}var I=h(N,2);{var H=x=>{var S=kg(),z=d(S);Rt(z,{size:12}),c(S),_(x,S)};Y(I,x=>{r(n)==="error"&&x(H)})}c(l);var O=h(l,2);{var F=x=>{var S=Sg(),z=d(S,!0);c(S),$(()=>X(z,e.data.pattern)),_(x,S)};Y(O,x=>{e.data.pattern&&x(F)})}c(s);var M=h(s,2),R=h(d(M),2);{var b=x=>{var S=zg(),z=d(S);c(S),$((g,C)=>X(z,`${g??""}${C??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),_(x,S)};Y(R,x=>{e.data.description&&x(b)})}var A=h(R,2);{var B=x=>{var S=Cg(),z=h(d(S),2),g=d(z,!0);c(z),c(S),$(()=>X(g,e.data.maxSteps)),_(x,S)};Y(A,x=>{e.data.maxSteps&&x(B)})}c(M);var K=h(M,2);$e(K,{type:"target",get position(){return we.Left}});var Z=h(K,2);$e(Z,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"reason-node svelte-15a1m3",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-15a1m3",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),X(w,e.data.label||"Reasoning")}),_(t,o),Ce()}var Mg=P(''),Pg=P(''),Tg=P('
    '),Ig=P('
    '),Ag=P('
    In
    True
    False
    ');function Dg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const K=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(K)}else y(a,!1)});var o=Ag();let i;var s=d(o),l=h(d(s),2),u=d(l);let v;var p=h(u,2);dr(p,{size:13});var m=h(p,2),f=d(m,!0);c(m);var w=h(m,2);{var N=K=>{var Z=Mg(),x=d(Z);Kt(x,{size:12}),c(Z),jt(3,Z,()=>Zt,()=>({duration:200,start:.6})),_(K,Z)};Y(w,K=>{r(a)&&K(N)})}var E=h(w,2);{var I=K=>{var Z=Pg(),x=d(Z);Rt(x,{size:12}),c(Z),_(K,Z)};Y(E,K=>{r(n)==="error"&&K(I)})}c(l),c(s);var H=h(s,2),O=d(H);{var F=K=>{var Z=Tg(),x=d(Z),S=d(x,!0);c(x),c(Z),$(()=>X(S,e.data.condition)),_(K,Z)};Y(O,K=>{e.data.condition&&K(F)})}var M=h(O,2);{var R=K=>{var Z=Ig(),x=d(Z);c(Z),$((S,z)=>X(x,`${S??""}${z??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),_(K,Z)};Y(M,K=>{e.data.description&&K(R)})}ye(2),c(H);var b=h(H,2);$e(b,{type:"target",get position(){return we.Left}});var A=h(b,2);$e(A,{type:"source",get position(){return we.Right},id:"true",style:"top: 35%;"});var B=h(A,2);$e(B,{type:"source",get position(){return we.Right},id:"false",style:"top: 65%;"}),c(o),$(()=>{i=De(o,1,"cond-node svelte-9dvt8o",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-9dvt8o",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),X(f,e.data.label||"Condition")}),_(t,o),Ce()}var Og=P(''),Rg=P(''),Lg=P('
    action
    '),Hg=P('
    namespace
    '),Vg=P('
    Exec In
    Exec Out
    ');function Fg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const R=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(R)}else y(a,!1)});var o=Vg();let i;var s=d(o),l=d(s);co(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Og(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),_(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=Rg(),A=d(b);Rt(A,{size:12}),c(b),_(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Lg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.memory_action)),_(R,b)};Y(E,R=>{e.data.memory_action&&R(I)})}var H=h(E,2);{var O=R=>{var b=Hg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.namespace)),_(R,b)};Y(H,R=>{e.data.namespace&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-mcwl9o",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Memory")}),_(t,o),Ce()}var Bg=P(''),qg=P(''),Kg=P('
    rule
    '),jg=P('
    on_fail
    '),Zg=P('
    Exec In
    Exec Out
    ');function Yg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const R=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(R)}else y(a,!1)});var o=Zg();let i;var s=d(o),l=d(s);vo(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Bg(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),_(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=qg(),A=d(b);Rt(A,{size:12}),c(b),_(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Kg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.validation_rule)),_(R,b)};Y(E,R=>{e.data.validation_rule&&R(I)})}var H=h(E,2);{var O=R=>{var b=jg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.fail_action)),_(R,b)};Y(H,R=>{e.data.fail_action&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-1y5xb8x",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Validator")}),_(t,o),Ce()}var Xg=P(''),Wg=P(''),Gg=P('
    desc
    '),Ug=P('
    code
    '),Qg=P('
    In
    Out
    ');function Jg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const R=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(R)}else y(a,!1)});var o=Qg();let i;var s=d(o),l=d(s);la(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Xg(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),_(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=Wg(),A=d(b);Rt(A,{size:12}),c(b),_(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Gg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.description)),_(R,b)};Y(E,R=>{e.data.description&&R(I)})}var H=h(E,2);{var O=R=>{var b=Ug(),A=h(d(b)),B=d(A);c(A),c(b),$((K,Z)=>X(B,`${K??""}${Z??""}`),[()=>String(e.data.code).split(` -`)[0].slice(0,30),()=>String(e.data.code).length>30?"...":""]),_(R,b)};Y(H,R=>{e.data.code&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-1ebq9zd",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Code")}),_(t,o),Ce()}var $g=P(''),em=P(''),tm=P('
    split
    '),nm=P('
    max
    '),rm=P('
    In
    Out 1
    Out 2
    ');function am(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const b=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(b)}else y(a,!1)});var o=rm();let i;var s=d(o),l=d(s);fo(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=b=>{var A=$g(),B=d(A);Kt(B,{size:12}),c(A),jt(3,A,()=>Zt,()=>({duration:200,start:.6})),_(b,A)};Y(p,b=>{r(a)&&b(m)})}var f=h(p,2);{var w=b=>{var A=em(),B=d(A);Rt(B,{size:12}),c(A),_(b,A)};Y(f,b=>{r(n)==="error"&&b(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=b=>{var A=tm(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>X(K,e.data.split_expression)),_(b,A)};Y(E,b=>{e.data.split_expression&&b(I)})}var H=h(E,2);{var O=b=>{var A=nm(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>X(K,e.data.max_concurrent)),_(b,A)};Y(H,b=>{e.data.max_concurrent&&b(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right},id:"out-1",style:"top: 33%;"});var R=h(M,2);$e(R,{type:"source",get position(){return we.Right},id:"out-2",style:"top: 66%;"}),c(o),$(()=>{i=De(o,1,"bp-node svelte-5h9d64",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Fan Out")}),_(t,o),Ce()}var om=P(''),sm=P(''),im=P('
    merge
    '),lm=P('
    timeout
    '),cm=P('
    In 1
    In 2
    Out
    ');function dm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const b=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(b)}else y(a,!1)});var o=cm();let i;var s=d(o),l=d(s);po(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=b=>{var A=om(),B=d(A);Kt(B,{size:12}),c(A),jt(3,A,()=>Zt,()=>({duration:200,start:.6})),_(b,A)};Y(p,b=>{r(a)&&b(m)})}var f=h(p,2);{var w=b=>{var A=sm(),B=d(A);Rt(B,{size:12}),c(A),_(b,A)};Y(f,b=>{r(n)==="error"&&b(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=b=>{var A=im(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>X(K,e.data.merge_expression)),_(b,A)};Y(E,b=>{e.data.merge_expression&&b(I)})}var H=h(E,2);{var O=b=>{var A=lm(),B=h(d(A)),K=d(B);c(B),c(A),$(()=>X(K,`${e.data.merge_timeout??""}s`)),_(b,A)};Y(H,b=>{e.data.merge_timeout&&b(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left},id:"in-1",style:"top: 33%;"});var M=h(F,2);$e(M,{type:"target",get position(){return we.Left},id:"in-2",style:"top: 66%;"});var R=h(M,2);$e(R,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-k2gv2h",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Fan In")}),_(t,o),Ce()}var um=P(''),vm=P(''),fm=P('
    '),pm=P('
    Exec Out

    ');function hm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>e.data.trigger_type??"Manual"),o=Q(!1),i=k(()=>()=>{switch(r(a).toLowerCase()){case"http":return e.data.endpoint?`${e.data.method??"POST"} ${e.data.endpoint}`:"HTTP endpoint";case"queue":return e.data.queue_name?`Queue: ${e.data.queue_name}`:"Message queue";case"schedule":return e.data.cron?`Cron: ${e.data.cron}`:"Scheduled trigger";case"file":return e.data.watch_path?`Watch: ${e.data.watch_path}`:"File watcher";default:return"Manual execution"}});_e(()=>{if(r(n)==="complete"){y(o,!0);const D=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(D)}else y(o,!1)});var s=pm();let l;var u=d(s),v=d(u),p=d(v),m=d(p),f=d(m,!0);c(m),c(p);var w=h(p,2),N=d(w);uo(N,{size:11}),c(w),c(v);var E=h(v,2),I=d(E);let H;var O=h(I,2),F=d(O);Ys(F,{size:14}),c(O);var M=h(O,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=um(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),_(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=vm(),L=d(V);Rt(L,{size:13}),c(V),_(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(E),c(u);var Z=h(u,2),x=h(d(Z),2);{var S=D=>{var V=fm(),L=d(V);c(V),$((q,j)=>X(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),_(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2),g=h(d(z),2),C=d(g,!0);c(g),c(z),c(Z);var T=h(Z,2);$e(T,{type:"source",get position(){return we.Right}}),c(s),$(D=>{l=De(s,1,"input-node svelte-170rmgf",null,l,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(f,r(a)),H=De(I,1,"status-dot svelte-170rmgf",null,H,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),X(R,e.data.label||"Input"),X(C,D)},[()=>r(i)()]),_(t,s),Ce()}var gm=P(''),mm=P(''),_m=P('
    '),ym=P('
    Exec In

    ');function bm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>e.data.destination_type??"Response"),o=Q(!1),i=k(()=>()=>{switch(r(a).toLowerCase()){case"response":return e.data.format?`Format: ${e.data.format}`:"Direct response";case"queue":return e.data.queue_name?`Queue: ${e.data.queue_name}`:"Message queue";case"webhook":return e.data.webhook_url?`URL: ${e.data.webhook_url}`:"Webhook delivery";case"store":return e.data.store_path?`Path: ${e.data.store_path}`:"Persistent store";default:return"Output destination"}});_e(()=>{if(r(n)==="complete"){y(o,!0);const D=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(D)}else y(o,!1)});var s=ym();let l;var u=d(s),v=d(u),p=d(v),m=d(p),f=d(m,!0);c(m),c(p);var w=h(p,2),N=d(w);uo(N,{size:11}),c(w),c(v);var E=h(v,2),I=d(E);let H;var O=h(I,2),F=d(O);ca(F,{size:14}),c(O);var M=h(O,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=gm(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),_(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=mm(),L=d(V);Rt(L,{size:13}),c(V),_(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(E),c(u);var Z=h(u,2),x=h(d(Z),2);{var S=D=>{var V=_m(),L=d(V);c(V),$((q,j)=>X(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),_(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2),g=h(d(z),2),C=d(g,!0);c(g),c(z),c(Z);var T=h(Z,2);$e(T,{type:"target",get position(){return we.Left}}),c(s),$(D=>{l=De(s,1,"output-node svelte-198t6xy",null,l,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(f,r(a)),H=De(I,1,"status-dot svelte-198t6xy",null,H,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),X(R,e.data.label||"Output"),X(C,D)},[()=>r(i)()]),_(t,s),Ce()}var xm=P(" ",1),wm=P('
    Nodes
    Agents
    Tools
    Links
    '),km=P('

    Start building your pipeline

    Click components in the left panel to add them, or press Cmd+K to search

    '),Sm=P('
    ');function zm(t,e){ze(e,!0);const n=()=>at(an,"$nodes",o),a=()=>at(Mn,"$edges",o),[o,i]=Ot(),s={input:hm,output:bm,agent:pg,tool:xg,reasoning:Ng,condition:Dg,memory:Fg,validator:Yg,custom_code:Jg,fan_out:am,fan_in:dm};let l=k(()=>n().length===0),u=k(()=>n().length),v=k(()=>n().filter(O=>O.type==="agent").length),p=k(()=>n().filter(O=>O.type==="tool").length),m=k(()=>a().length);var f=Sm(),w=d(f);Th(w,{get nodeTypes(){return s},fitView:!0,colorMode:"dark",defaultEdgeOptions:{type:"smoothstep",animated:!0,style:"stroke: #cbd5e1; stroke-width: 2.5px;"},onnodeclick:({node:O})=>mn.set(O.id),onpaneclick:()=>mn.set(null),get nodes(){return Yo(),n()},set nodes(O){Zo(an,O)},get edges(){return Yo(),a()},set edges(O){Zo(Mn,O)},children:(O,F)=>{var M=xm(),R=de(M);Zh(R,{position:"bottom-left"});var b=h(R,2);sg(b,{position:"bottom-right"});var A=h(b,2);Jh(A,{get variant(){return cn.Dots},gap:24,size:1,color:"#2a2a3a"}),_(O,M)},$$slots:{default:!0}});var N=h(w,2);{var E=O=>{var F=wm(),M=d(F),R=d(M);uc(R,{size:12});var b=h(R,4),A=d(b,!0);c(b),c(M);var B=h(M,4),K=d(B);cr(K,{size:12});var Z=h(K,4),x=d(Z,!0);c(Z),c(B);var S=h(B,4),z=d(S);Xn(z,{size:12});var g=h(z,4),C=d(g,!0);c(g),c(S);var T=h(S,4),D=d(T);vc(D,{size:12});var V=h(D,4),L=d(V,!0);c(V),c(T),c(F),$(()=>{X(A,r(u)),X(x,r(v)),X(C,r(p)),X(L,r(m))}),_(O,F)};Y(N,O=>{r(l)||O(E)})}var I=h(N,2);{var H=O=>{var F=km(),M=d(F),R=d(M);Pc(R,{size:40}),ye(4),c(M),c(F),_(O,F)};Y(I,O=>{r(l)&&O(H)})}c(f),_(t,f),Ce(),i()}var Cm=P(''),Em=P(''),Nm=P(''),Mm=P(''),Pm=P(""),Tm=P(' ',1),Im=P(''),Am=P('
    ');function Ne(t,e){ze(e,!0);let n=pe(e,"type",3,"text"),a=pe(e,"value",15,""),o=pe(e,"placeholder",3,""),i=pe(e,"options",19,()=>[]);const s=Math.random().toString(36).slice(2,8);let l=k(()=>`field-${(e.label??"input").replace(/\s+/g,"-").toLowerCase()}-${s}`),u=k(()=>`dl-${(e.label??"input").replace(/\s+/g,"-").toLowerCase()}-${s}`);function v(F){const M=F.target;M.style.height="auto",M.style.height=M.scrollHeight+"px"}var p=Am(),m=d(p),f=d(m,!0);c(m);var w=h(m,2);{var N=F=>{var M=Cm();Bl(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),be("input",M,v),on(M,a),_(F,M)},E=F=>{var M=Em();Ct(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),on(M,a),_(F,M)},I=F=>{var M=Mm();je(M,21,i,wt,(R,b)=>{var A=Nm(),B=d(A,!0);c(A);var K={};$(()=>{X(B,r(b)),K!==(K=r(b))&&(A.value=(A.__value=r(b))??"")}),_(R,A)}),c(M),$(()=>xe(M,"id",r(l))),ql(M,a),_(F,M)},H=F=>{var M=Tm(),R=de(M);Ct(R);var b=h(R,2);je(b,21,i,wt,(A,B)=>{var K=Pm(),Z={};$(()=>{Z!==(Z=r(B))&&(K.value=(K.__value=r(B))??"")}),_(A,K)}),c(b),$(()=>{xe(R,"id",r(l)),xe(R,"placeholder",o()),xe(R,"list",r(u)),xe(b,"id",r(u))}),on(R,a),_(F,M)},O=F=>{var M=Im();Ct(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),on(M,a),_(F,M)};Y(w,F=>{n()==="textarea"?F(N):n()==="number"?F(E,1):n()==="select"?F(I,2):n()==="datalist"?F(H,3):F(O,!1)})}c(p),$(()=>{xe(m,"for",r(l)),X(f,e.label)}),_(t,p),Ce()}_t(["input"]);const il=[{id:"calculator",name:"Calculator",description:"Safe mathematical expression evaluator. Supports arithmetic, functions (sqrt, sin, cos, log, etc.), and constants (pi, e).",category:"Utility",tags:["math","calculator","utility"],parameters:[{name:"expression",type:"string",description:"Math expression to evaluate",required:!0}]},{id:"datetime",name:"Date & Time",description:"Current date/time information with timezone support.",category:"Utility",tags:["datetime","utility"],parameters:[{name:"action",type:"select",description:"What to retrieve",required:!0,options:["now","date","time","timestamp","timezones"]},{name:"timezone",type:"string",description:"IANA timezone (e.g. America/New_York)",required:!1,default:"UTC"},{name:"format",type:"string",description:"strftime format string",required:!1}]},{id:"filesystem",name:"File System",description:"Read, write, and list files. Sandboxed to a base directory with path-traversal protection.",category:"I/O",tags:["filesystem","io"],parameters:[{name:"action",type:"select",description:"File operation",required:!0,options:["read","write","list"]},{name:"path",type:"string",description:"File or directory path",required:!0},{name:"content",type:"string",description:"Content to write (for write action)",required:!1}]},{id:"http",name:"HTTP Client",description:"Make HTTP requests with connection pooling. Supports GET, POST, PUT, DELETE.",category:"Web",tags:["http","web"],parameters:[{name:"url",type:"string",description:"Target URL",required:!0},{name:"method",type:"select",description:"HTTP method",required:!1,default:"GET",options:["GET","POST","PUT","DELETE","PATCH"]},{name:"body",type:"string",description:"Request body (JSON)",required:!1},{name:"headers",type:"string",description:"Request headers (JSON)",required:!1}]},{id:"json",name:"JSON",description:"Parse, validate, extract, and format JSON data. Supports dot-path extraction.",category:"Utility",tags:["json","utility"],parameters:[{name:"action",type:"select",description:"JSON operation",required:!0,options:["parse","validate","extract","format","keys"]},{name:"data",type:"string",description:"JSON data to process",required:!0},{name:"path",type:"string",description:"Dot-path for extraction (e.g. address.city)",required:!1}]},{id:"text",name:"Text Processing",description:"Count, extract, truncate, replace, and split text using regex patterns.",category:"Utility",tags:["text","utility"],parameters:[{name:"action",type:"select",description:"Text operation",required:!0,options:["count","extract","truncate","replace","split"]},{name:"text",type:"string",description:"Input text",required:!0},{name:"pattern",type:"string",description:"Regex pattern (for extract/replace/split)",required:!1},{name:"replacement",type:"string",description:"Replacement string (for replace)",required:!1}]},{id:"shell",name:"Shell",description:"Execute shell commands from an explicit allowlist. Sandboxed for safety.",category:"System",tags:["shell","system"],parameters:[{name:"command",type:"string",description:"Command to execute (must be in allowlist)",required:!0}]},{id:"search",name:"Search",description:"Web search tool (abstract -- requires implementation of _search method).",category:"Web",tags:["search","web"],parameters:[{name:"query",type:"string",description:"Search query",required:!0}]},{id:"database",name:"Database",description:"Execute SQL queries (abstract -- requires implementation). Read-only by default with SQL injection detection.",category:"I/O",tags:["database","sql"],parameters:[{name:"query",type:"string",description:"SQL query (SELECT/WITH only in read-only mode)",required:!0},{name:"params",type:"string",description:"Query parameters (JSON)",required:!1}]}];function Dm(t){return il.find(e=>e.id===t)}const ll=[{id:"react",name:"ReAct",description:"Reason-Act-Observe loop. The agent thinks, takes an action (tool call), observes the result, and repeats until done.",defaultMaxSteps:10,bestFor:"Tasks requiring tool interaction and iterative problem-solving",configKeys:["max_steps"]},{id:"chain_of_thought",name:"Chain of Thought",description:"Step-by-step reasoning without actions. The agent breaks down the problem into logical steps and thinks through each one.",defaultMaxSteps:10,bestFor:"Pure logic, analysis, and reasoning tasks without tool needs",configKeys:["max_steps"]},{id:"plan_and_execute",name:"Plan & Execute",description:"Generates a multi-step plan first, then executes each step sequentially. Can replan on failure.",defaultMaxSteps:15,bestFor:"Complex multi-step tasks that benefit from upfront planning",configKeys:["max_steps","allow_replan"]},{id:"reflexion",name:"Reflexion",description:"Execute-Critique-Retry loop. Generates output, critiques it for quality, and retries with feedback if unsatisfactory.",defaultMaxSteps:5,bestFor:"Quality-sensitive outputs that benefit from self-review",configKeys:["max_steps"]},{id:"tree_of_thoughts",name:"Tree of Thoughts",description:"Generates multiple solution branches, evaluates each with a score, and selects the best. Explores the solution space broadly.",defaultMaxSteps:3,bestFor:"Creative and exploratory problems with multiple valid approaches",configKeys:["branching_factor","max_depth"]},{id:"goal_decomposition",name:"Goal Decomposition",description:"Breaks a large goal into phases and tasks, then executes each task. Can delegate sub-tasks to other patterns.",defaultMaxSteps:20,bestFor:"Large ambiguous goals that need structured decomposition",configKeys:["max_steps","task_pattern"]}];function Om(t){return ll.find(e=>e.id===t)}var Rm=P('

    Exposes an HTTP endpoint that triggers this pipeline when called.

    ',1),Lm=P(" ",1),Hm=P('

    Runs the pipeline on a schedule using standard cron syntax.

    ',1),Vm=P(" ",1),Fm=P('

    Manual trigger. Run the pipeline via the Run button or API call.

    '),Bm=P(" ",1),qm=P(" ",1),Km=P(" ",1),jm=P('

    Returns the pipeline output as an API response.

    '),Zm=P(" ",1),Ym=P('
    Accepted file types
    Max file size
    Image detail
    '),Xm=P('
    ',1),Wm=P('
    '),Gm=P('
    '),Um=P('

    '),Qm=P('

    Custom tool. Define the tool name as registered in the framework tool registry.

    '),Jm=P(" ",1),$m=P('

    '),e1=P(" ",1),t1=P('

    Routes flow based on a key in the pipeline context. Connect the True and False handles to different downstream nodes. Use configure_node to set branches as a JSON dict mapping values to paths.

    ',1),n1=P('

    Saves the current pipeline state/output to memory for later retrieval.

    '),r1=P('

    Loads previously saved state from memory and injects it into the pipeline context.

    '),a1=P('

    Wipes all stored memory. Use with caution.

    '),o1=P('

    Select an action: store saves data, retrieve loads it, clear wipes memory.

    '),s1=P('
    ',1),i1=P('

    Ensures the output is not empty, null, or blank.

    '),l1=P('

    Validates that the output is a string type.

    '),c1=P('

    Validates that the output is a list/array.

    '),d1=P('

    Validates that the output is a dictionary/object.

    '),u1=P('

    Custom validation rule. Define the rule key as registered in the framework.

    '),v1=P('

    Select a validation rule to apply to the pipeline output before passing downstream.

    '),f1=P('
    ',1),p1=P('

    Must define: async def execute(context, inputs) -> Any

    ',1),h1=P('

    Splits a single input into multiple items for parallel processing across downstream branches.

    ',1),g1=P('

    Concatenates all branch results into a single string.

    '),m1=P('

    Collects all branch results into a list.

    '),_1=P('

    Merges results from parallel branches back into a single output.

    '),y1=P('
    ',1),b1=P(''),x1=P('
    Inputs
    '),w1=P(''),k1=P('
    Outputs
    '),S1=P('
    Connections
    '),z1=P('');function C1(t,e){ze(e,!0);const n=()=>at(Kl,"$selectedNode",s),a=()=>at(Mn,"$edges",s),o=()=>at(an,"$nodes",s),i=()=>at(mn,"$selectedNodeId",s),[s,l]=Ot(),u=[],v={input:Ys,output:ca,agent:cr,tool:Xn,reasoning:Zr,condition:Xs,memory:co,validator:vo,custom_code:la,fan_out:fo,fan_in:po},p={input:"#10b981",output:"#3b82f6",agent:"#6366f1",tool:"#8b5cf6",reasoning:"#ec4899",condition:"#06b6d4",memory:"#06b6d4",validator:"#f59e0b",custom_code:"#3b82f6",fan_out:"#8888a0",fan_in:"#8888a0"},m={input:"Input",output:"Output",agent:"Agent",tool:"Tool",reasoning:"Reasoning",condition:"Condition",memory:"Memory",validator:"Validator",custom_code:"Custom Code",fan_out:"Fan Out",fan_in:"Fan In"},f=ll.map(ce=>ce.id),w=["custom",...il.map(ce=>ce.id)];let N=k(()=>Om(r(R))),E=k(()=>Dm(r(j))),I=Q(""),H=Q(""),O=Q(""),F=Q(""),M=Q(""),R=Q(""),b=Q(""),A=Q(""),B=Q(""),K=Q(""),Z=Q(""),x=Q(""),S=Q(""),z=Q(""),g=Q(""),C=Q(""),T=Q(""),D=Q(""),V=Q(""),L=Q(""),q=Q(""),j=Q(""),U=Q(""),W=Q(""),J=Q(""),ae=Q(""),re=Q("manual"),ie=Q("response"),ne=Q("kafka"),G=Q(""),oe=Q(""),ee=Q(""),se=Q("UTC"),te=Q("POST"),ue=Q(!1),le=Q("*/*"),he=Q("50"),ve=Q(""),fe=Q("file"),ke=Q(""),Ae=Q(""),ge=Q(!1),Oe=Q(!0),Ye=Q(!1),We=Q(!1),it=Q(10),Ge=Q("auto"),ct=Q(null),Nt=!1,gt=k(()=>n()?a().filter(ce=>ce.target===n().id):[]),dt=k(()=>n()?a().filter(ce=>ce.source===n().id):[]);function xt(ce){const Ie=o().find(rt=>rt.id===ce);return Ie?.data?.label||Ie?.id||ce}_e(()=>{const ce=n();ce&&ce.id!==r(ct)&&(Nt=!0,y(ct,ce.id,!0),Qt(()=>{y(I,ce.data.label??"",!0),y(H,ce.data.model??"",!0),y(O,ce.data.instructions??"",!0),y(F,ce.data.description??"",!0),y(M,ce.data.timeout!=null?String(ce.data.timeout):"",!0),y(R,ce.data.pattern??"",!0),y(b,ce.data.maxSteps!=null?String(ce.data.maxSteps):"",!0),y(A,ce.data.condition??"",!0),y(B,ce.data.backend??"",!0),y(K,ce.data.connection_string??"",!0),y(Z,ce.data.namespace??"",!0),y(x,ce.data.schema_type??"",!0),y(S,ce.data.validation_rules??"",!0),y(z,ce.data.fail_action??"",!0),y(g,ce.data.code??"",!0),y(C,ce.data.strategy??"",!0),y(T,ce.data.max_concurrent!=null?String(ce.data.max_concurrent):"",!0),y(D,ce.data.merge_strategy??"",!0),y(V,ce.data.merge_timeout!=null?String(ce.data.merge_timeout):"",!0),y(L,ce.data.temperature!=null?String(ce.data.temperature):"",!0),y(q,ce.data.max_tokens!=null?String(ce.data.max_tokens):"",!0),y(j,ce.data.tool_name??"",!0),y(U,ce.data.memory_action??"",!0),y(W,ce.data.validation_rule??"",!0),y(J,ce.data.split_expression??"",!0),y(ae,ce.data.merge_expression??"",!0),y(re,ce.data.trigger_type??"manual",!0),y(ie,ce.data.destination_type??"response",!0),y(ne,ce.data.queue_broker??"kafka",!0),y(G,ce.data.queue_topic??"",!0),y(oe,ce.data.queue_group_id??"",!0),y(ee,ce.data.cron_expression??"",!0),y(se,ce.data.cron_timezone??"UTC",!0),y(te,ce.data.http_method??"POST",!0),y(ue,ce.data.http_auth_required??!1,!0),y(le,ce.data.file_types??"*/*",!0),y(he,ce.data.file_max_size_mb!=null?String(ce.data.file_max_size_mb):"50",!0),y(ve,ce.data.webhook_url??"",!0),y(fe,ce.data.store_type??"file",!0),y(ke,ce.data.store_path??"",!0),y(Ae,ce.data.schema_json??"",!0);const Ie=ce.data.multimodal;y(ge,Ie?.vision_enabled??!1,!0);const rt=Ie?.supported_file_types??["image/png","image/jpeg"];y(Oe,rt.some(lt=>lt.startsWith("image/")),!0),y(Ye,rt.includes("application/pdf"),!0),y(We,rt.some(lt=>lt.includes("document")||lt.includes("msword")),!0),y(it,Ie?.max_file_size_mb??10,!0),y(Ge,Ie?.image_detail??"auto",!0)}),Nt=!1),ce||y(ct,null)});function Pe(ce,Ie){Nt||Qt(()=>{const rt=i();if(!rt)return;["timeout","maxSteps","max_concurrent","merge_timeout","temperature","max_tokens"].includes(ce)?Na(rt,ce,Ie===""?void 0:Number(Ie)):Na(rt,ce,Ie)})}_e(()=>{Pe("label",r(I))}),_e(()=>{Pe("model",r(H))}),_e(()=>{Pe("instructions",r(O))}),_e(()=>{Pe("description",r(F))}),_e(()=>{Pe("timeout",r(M))}),_e(()=>{Pe("pattern",r(R))}),_e(()=>{Pe("maxSteps",r(b))}),_e(()=>{Pe("condition",r(A))}),_e(()=>{Pe("backend",r(B))}),_e(()=>{Pe("connection_string",r(K))}),_e(()=>{Pe("namespace",r(Z))}),_e(()=>{Pe("schema_type",r(x))}),_e(()=>{Pe("validation_rules",r(S))}),_e(()=>{Pe("fail_action",r(z))}),_e(()=>{Pe("code",r(g))}),_e(()=>{Pe("strategy",r(C))}),_e(()=>{Pe("max_concurrent",r(T))}),_e(()=>{Pe("merge_strategy",r(D))}),_e(()=>{Pe("merge_timeout",r(V))}),_e(()=>{Pe("temperature",r(L))}),_e(()=>{Pe("max_tokens",r(q))}),_e(()=>{Pe("tool_name",r(j))}),_e(()=>{Pe("memory_action",r(U))}),_e(()=>{Pe("validation_rule",r(W))}),_e(()=>{Pe("split_expression",r(J))}),_e(()=>{Pe("merge_expression",r(ae))}),_e(()=>{Pe("trigger_type",r(re))}),_e(()=>{Pe("destination_type",r(ie))}),_e(()=>{Pe("queue_broker",r(ne))}),_e(()=>{Pe("queue_topic",r(G))}),_e(()=>{Pe("queue_group_id",r(oe))}),_e(()=>{Pe("cron_expression",r(ee))}),_e(()=>{Pe("cron_timezone",r(se))}),_e(()=>{Pe("http_method",r(te))}),_e(()=>{Pe("file_types",r(le))}),_e(()=>{Pe("file_max_size_mb",r(he))}),_e(()=>{Pe("webhook_url",r(ve))}),_e(()=>{Pe("store_type",r(fe))}),_e(()=>{Pe("store_path",r(ke))}),_e(()=>{Pe("schema_json",r(Ae))}),_e(()=>{const ce=r(ge),Ie=r(Oe),rt=r(Ye),lt=r(We),vt=r(it),yt=r(Ge);Nt||Qt(()=>{const bt=i();if(!bt)return;const Mt=o().find(Ht=>Ht.id===bt);if(!Mt||Mt.type!=="agent")return;const Lt=[];Ie&&Lt.push("image/png","image/jpeg"),rt&&Lt.push("application/pdf"),lt&&Lt.push("application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document"),Na(bt,"multimodal",{vision_enabled:ce,supported_file_types:Lt,max_file_size_mb:vt,image_detail:yt})})});function pn(){mn.set(null)}function wn(){const ce=n();if(!ce)return;const Ie=ce.id;an.update(rt=>rt.filter(lt=>lt.id!==Ie)),Mn.update(rt=>rt.filter(lt=>lt.source!==Ie&<.target!==Ie)),mn.set(null)}function hn(ce){mn.set(ce)}var Sr=Me(),Qe=de(Sr);{var kt=ce=>{const Ie=k(n),rt=k(()=>v[r(Ie).type??""]??cr),lt=k(()=>p[r(Ie).type??""]??"#ff6b35");var vt=z1(),yt=d(vt),bt=d(yt),Mt=d(bt);let Lt;var Ht=d(Mt);un(Ht,()=>r(rt),(Re,Le)=>{Le(Re,{size:14})}),c(Mt);var Xt=h(Mt,2),kn=d(Xt),Sn=d(kn);c(kn);var Ln=h(kn,2),rr=d(Ln,!0);c(Ln),c(Xt),c(bt);var ya=h(bt,2),cl=d(ya);Ks(cl,{size:14}),c(ya),c(yt);var Oo=h(yt,2),ba=d(Oo),xa=d(ba);let Ro;var dl=d(xa,!0);c(xa),c(ba);var wa=h(ba,2),Lo=h(d(wa),2),ul=d(Lo);{var vl=Re=>{var Le=Bm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Input node name",get value(){return r(I)},set value(me){y(I,me,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Trigger Type",type:"select",options:["manual","http","queue","schedule","file_upload"],get value(){return r(re)},set value(me){y(re,me,!0)}});var qe=h(Ke,2);{var Xe=me=>{var He=Rm(),Ee=de(He);Ne(Ee,{label:"HTTP Method",type:"select",options:["GET","POST","PUT","PATCH"],get value(){return r(te)},set value(Te){y(te,Te,!0)}}),ye(2),_(me,He)},ft=me=>{var He=Lm(),Ee=de(He);Ne(Ee,{label:"Broker",type:"select",options:["kafka","rabbitmq","redis"],get value(){return r(ne)},set value(ht){y(ne,ht,!0)}});var Te=h(Ee,2);Ne(Te,{label:"Topic / Queue",type:"text",placeholder:"pipeline-input",get value(){return r(G)},set value(ht){y(G,ht,!0)}});var Fe=h(Te,2);Ne(Fe,{label:"Group ID",type:"text",placeholder:"studio-group",get value(){return r(oe)},set value(ht){y(oe,ht,!0)}}),_(me,He)},pt=me=>{var He=Hm(),Ee=de(He);Ne(Ee,{label:"Cron Expression",type:"text",placeholder:"0 */6 * * *",get value(){return r(ee)},set value(Fe){y(ee,Fe,!0)}});var Te=h(Ee,2);Ne(Te,{label:"Timezone",type:"text",placeholder:"UTC",get value(){return r(se)},set value(Fe){y(se,Fe,!0)}}),ye(2),_(me,He)},Je=me=>{var He=Vm(),Ee=de(He);Ne(Ee,{label:"Accepted Types",type:"text",placeholder:"application/pdf, text/csv",get value(){return r(le)},set value(Fe){y(le,Fe,!0)}});var Te=h(Ee,2);Ne(Te,{label:"Max Size (MB)",type:"number",placeholder:"50",get value(){return r(he)},set value(Fe){y(he,Fe,!0)}}),_(me,He)},Ve=me=>{var He=Fm();_(me,He)};Y(qe,me=>{r(re)==="http"?me(Xe):r(re)==="queue"?me(ft,1):r(re)==="schedule"?me(pt,2):r(re)==="file_upload"?me(Je,3):me(Ve,!1)})}var Se=h(qe,2);Ne(Se,{label:"Input Schema (JSON)",type:"textarea",placeholder:'{"type": "object", "properties": {…}}',get value(){return r(Ae)},set value(me){y(Ae,me,!0)}}),_(Re,Le)},fl=Re=>{var Le=Zm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Output node name",get value(){return r(I)},set value(Se){y(I,Se,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Destination",type:"select",options:["response","queue","webhook","store"],get value(){return r(ie)},set value(Se){y(ie,Se,!0)}});var qe=h(Ke,2);{var Xe=Se=>{var me=qm(),He=de(me);Ne(He,{label:"Broker",type:"select",options:["kafka","rabbitmq","redis"],get value(){return r(ne)},set value(Te){y(ne,Te,!0)}});var Ee=h(He,2);Ne(Ee,{label:"Topic / Queue",type:"text",placeholder:"pipeline-output",get value(){return r(G)},set value(Te){y(G,Te,!0)}}),_(Se,me)},ft=Se=>{Ne(Se,{label:"Webhook URL",type:"text",placeholder:"https://example.com/callback",get value(){return r(ve)},set value(me){y(ve,me,!0)}})},pt=Se=>{var me=Km(),He=de(me);Ne(He,{label:"Storage Type",type:"select",options:["file","database"],get value(){return r(fe)},set value(Te){y(fe,Te,!0)}});var Ee=h(He,2);Ne(Ee,{label:"Path / Table",type:"text",placeholder:"/tmp/results.json",get value(){return r(ke)},set value(Te){y(ke,Te,!0)}}),_(Se,me)},Je=Se=>{var me=jm();_(Se,me)};Y(qe,Se=>{r(ie)==="queue"?Se(Xe):r(ie)==="webhook"?Se(ft,1):r(ie)==="store"?Se(pt,2):Se(Je,!1)})}var Ve=h(qe,2);Ne(Ve,{label:"Response Schema (JSON)",type:"textarea",placeholder:'{"type": "object", "properties": {…}}',get value(){return r(Ae)},set value(Se){y(Ae,Se,!0)}}),_(Re,Le)},pl=Re=>{var Le=Xm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Agent name",get value(){return r(I)},set value(Fe){y(I,Fe,!0)}});var Ke=h(Be,2),qe=h(d(Ke),2);Ql(qe,{placeholder:"Select model...",get value(){return r(H)},set value(Fe){y(H,Fe,!0)}}),c(Ke);var Xe=h(Ke,2);Ne(Xe,{label:"Instructions",type:"textarea",placeholder:"System instructions for this agent...",get value(){return r(O)},set value(Fe){y(O,Fe,!0)}});var ft=h(Xe,2);Ne(ft,{label:"Description",type:"text",placeholder:"Agent description",get value(){return r(F)},set value(Fe){y(F,Fe,!0)}});var pt=h(ft,2);Ne(pt,{label:"Temperature",type:"number",placeholder:"0.7",get value(){return r(L)},set value(Fe){y(L,Fe,!0)}});var Je=h(pt,2);Ne(Je,{label:"Max Tokens",type:"number",placeholder:"4096",get value(){return r(q)},set value(Fe){y(q,Fe,!0)}});var Ve=h(Je,2),Se=d(Ve),me=h(d(Se),2);let He;c(Se);var Ee=h(Se,2);{var Te=Fe=>{var ht=Ym(),Vt=d(ht),nn=h(d(Vt),2),Wt=d(nn);Ct(Wt),ye(),c(nn);var zn=h(nn,2),zr=d(zn);Ct(zr),ye(),c(zn);var Hn=h(zn,2),Vn=d(Hn);Ct(Vn),ye(),c(Hn),c(Vt);var Cn=h(Vt,2),Cr=h(d(Cn),2),Fn=d(Cr);Ct(Fn);var Er=h(Fn,2),Nl=d(Er);c(Er),c(Cr),c(Cn);var qo=h(Cn,2),Ko=h(d(qo),2),Ca=d(Ko),Nr=d(Ca);Ct(Nr),Nr.value=Nr.__value="auto",ye(),c(Ca);var Ea=h(Ca,2),Mr=d(Ea);Ct(Mr),Mr.value=Mr.__value="low",ye(),c(Ea);var jo=h(Ea,2),Pr=d(jo);Ct(Pr),Pr.value=Pr.__value="high",ye(),c(jo),c(Ko),c(qo),c(ht),$(()=>X(Nl,`${r(it)??""} MB`)),Ma(Wt,()=>r(Oe),Pt=>y(Oe,Pt)),Ma(zr,()=>r(Ye),Pt=>y(Ye,Pt)),Ma(Vn,()=>r(We),Pt=>y(We,Pt)),on(Fn,()=>r(it),Pt=>y(it,Pt)),Pa(u,[],Nr,()=>r(Ge),Pt=>y(Ge,Pt)),Pa(u,[],Mr,()=>r(Ge),Pt=>y(Ge,Pt)),Pa(u,[],Pr,()=>r(Ge),Pt=>y(Ge,Pt)),_(Fe,ht)};Y(Ee,Fe=>{r(ge)&&Fe(Te)})}c(Ve),$(()=>He=De(me,1,"mm-toggle-switch svelte-16rdffs",null,He,{"mm-on":r(ge)})),be("click",Se,()=>y(ge,!r(ge))),_(Re,Le)},hl=Re=>{var Le=Jm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Tool label on canvas",get value(){return r(I)},set value(Ve){y(I,Ve,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Tool Type",type:"select",get options(){return w},get value(){return r(j)},set value(Ve){y(j,Ve,!0)}});var qe=h(Ke,2);{var Xe=Ve=>{var Se=Um(),me=d(Se),He=d(me);Ws(He,{size:11});var Ee=h(He,2),Te=d(Ee,!0);c(Ee),c(me);var Fe=h(me,2),ht=d(Fe,!0);c(Fe);var Vt=h(Fe,2);{var nn=Wt=>{var zn=Gm();je(zn,21,()=>r(E).parameters,wt,(zr,Hn)=>{var Vn=Wm(),Cn=d(Vn),Cr=d(Cn,!0);c(Cn);var Fn=h(Cn,2),Er=d(Fn);c(Fn),c(Vn),$(()=>{X(Cr,r(Hn).name),X(Er,`${r(Hn).type??""}${r(Hn).required?"":"?"}`)}),_(zr,Vn)}),c(zn),_(Wt,zn)};Y(Vt,Wt=>{r(E).parameters.length>0&&Wt(nn)})}c(Se),$(()=>{X(Te,r(E).name),X(ht,r(E).description)}),_(Ve,Se)},ft=Ve=>{var Se=Qm();_(Ve,Se)};Y(qe,Ve=>{r(E)?Ve(Xe):r(j)==="custom"&&Ve(ft,1)})}var pt=h(qe,2);Ne(pt,{label:"Description",type:"textarea",placeholder:"What this tool does",get value(){return r(F)},set value(Ve){y(F,Ve,!0)}});var Je=h(pt,2);Ne(Je,{label:"Timeout (seconds)",type:"number",placeholder:"30",get value(){return r(M)},set value(Ve){y(M,Ve,!0)}}),_(Re,Le)},gl=Re=>{var Le=e1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Reasoning name",get value(){return r(I)},set value(Je){y(I,Je,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Pattern",type:"select",get options(){return f},get value(){return r(R)},set value(Je){y(R,Je,!0)}});var qe=h(Ke,2);{var Xe=Je=>{var Ve=$m(),Se=d(Ve),me=d(Se);Zr(me,{size:11});var He=h(me,2),Ee=d(He,!0);c(He),c(Se);var Te=h(Se,2),Fe=d(Te,!0);c(Te);var ht=h(Te,2),Vt=d(ht);c(ht),c(Ve),$(()=>{X(Ee,r(N).name),X(Fe,r(N).description),X(Vt,`Best for: ${r(N).bestFor??""}`)}),_(Je,Ve)};Y(qe,Je=>{r(N)&&Je(Xe)})}var ft=h(qe,2);{let Je=k(()=>r(N)?String(r(N).defaultMaxSteps):"10");Ne(ft,{label:"Max Steps",type:"number",get placeholder(){return r(Je)},get value(){return r(b)},set value(Ve){y(b,Ve,!0)}})}var pt=h(ft,2);Ne(pt,{label:"Description",type:"text",placeholder:"Reasoning strategy description",get value(){return r(F)},set value(Je){y(F,Je,!0)}}),_(Re,Le)},ml=Re=>{var Le=t1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Condition name",get value(){return r(I)},set value(qe){y(I,qe,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Condition Key",type:"text",placeholder:"e.g. document_type, status",get value(){return r(A)},set value(qe){y(A,qe,!0)}}),ye(2),_(Re,Le)},_l=Re=>{var Le=s1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Memory name",get value(){return r(I)},set value(me){y(I,me,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Action",type:"select",options:["store","retrieve","clear"],get value(){return r(U)},set value(me){y(U,me,!0)}});var qe=h(Ke,2),Xe=d(qe);{var ft=me=>{var He=n1();_(me,He)},pt=me=>{var He=r1();_(me,He)},Je=me=>{var He=a1();_(me,He)},Ve=me=>{var He=o1();_(me,He)};Y(Xe,me=>{r(U)==="store"?me(ft):r(U)==="retrieve"?me(pt,1):r(U)==="clear"?me(Je,2):me(Ve,!1)})}c(qe);var Se=h(qe,2);Ne(Se,{label:"Namespace",type:"text",placeholder:"default",get value(){return r(Z)},set value(me){y(Z,me,!0)}}),_(Re,Le)},yl=Re=>{var Le=f1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Validator name",get value(){return r(I)},set value(Ee){y(I,Ee,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Validation Rule",type:"select",options:["not_empty","is_string","is_list","is_dict","custom"],get value(){return r(W)},set value(Ee){y(W,Ee,!0)}});var qe=h(Ke,2),Xe=d(qe);{var ft=Ee=>{var Te=i1();_(Ee,Te)},pt=Ee=>{var Te=l1();_(Ee,Te)},Je=Ee=>{var Te=c1();_(Ee,Te)},Ve=Ee=>{var Te=d1();_(Ee,Te)},Se=Ee=>{var Te=u1();_(Ee,Te)},me=Ee=>{var Te=v1();_(Ee,Te)};Y(Xe,Ee=>{r(W)==="not_empty"?Ee(ft):r(W)==="is_string"?Ee(pt,1):r(W)==="is_list"?Ee(Je,2):r(W)==="is_dict"?Ee(Ve,3):r(W)==="custom"?Ee(Se,4):Ee(me,!1)})}c(qe);var He=h(qe,2);Ne(He,{label:"On Failure",type:"select",options:["reject","retry","fallback","log"],get value(){return r(z)},set value(Ee){y(z,Ee,!0)}}),_(Re,Le)},bl=Re=>{var Le=p1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Code block name",get value(){return r(I)},set value(Xe){y(I,Xe,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Description",type:"text",placeholder:"What this code does",get value(){return r(F)},set value(Xe){y(F,Xe,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Python Code",type:"textarea",placeholder:"async def execute(context, inputs): return inputs",get value(){return r(g)},set value(Xe){y(g,Xe,!0)}}),ye(2),_(Re,Le)},xl=Re=>{var Le=h1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Fan Out name",get value(){return r(I)},set value(Xe){y(I,Xe,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Split Expression",type:"text",placeholder:"How to split input for parallel branches",get value(){return r(J)},set value(Xe){y(J,Xe,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Max Concurrent",type:"number",placeholder:"10",get value(){return r(T)},set value(Xe){y(T,Xe,!0)}}),ye(2),_(Re,Le)},wl=Re=>{var Le=y1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Fan In name",get value(){return r(I)},set value(Se){y(I,Se,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Merge Expression",type:"select",options:["concat","collect"],get value(){return r(ae)},set value(Se){y(ae,Se,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Timeout (seconds)",type:"number",placeholder:"30",get value(){return r(V)},set value(Se){y(V,Se,!0)}});var Xe=h(qe,2),ft=d(Xe);{var pt=Se=>{var me=g1();_(Se,me)},Je=Se=>{var me=m1();_(Se,me)},Ve=Se=>{var me=_1();_(Se,me)};Y(ft,Se=>{r(ae)==="concat"?Se(pt):r(ae)==="collect"?Se(Je,1):Se(Ve,!1)})}c(Xe),_(Re,Le)},kl=Re=>{Ne(Re,{label:"Name",type:"text",placeholder:"Node name",get value(){return r(I)},set value(Le){y(I,Le,!0)}})};Y(ul,Re=>{r(Ie).type==="input"?Re(vl):r(Ie).type==="output"?Re(fl,1):r(Ie).type==="agent"?Re(pl,2):r(Ie).type==="tool"?Re(hl,3):r(Ie).type==="reasoning"?Re(gl,4):r(Ie).type==="condition"?Re(ml,5):r(Ie).type==="memory"?Re(_l,6):r(Ie).type==="validator"?Re(yl,7):r(Ie).type==="custom_code"?Re(bl,8):r(Ie).type==="fan_out"?Re(xl,9):r(Ie).type==="fan_in"?Re(wl,10):Re(kl,!1)})}c(Lo),c(wa);var Ho=h(wa,2);{var Sl=Re=>{var Le=S1(),Be=d(Le),Ke=d(Be);Jl(Ke,{size:12}),ye(),c(Be);var qe=h(Be,2),Xe=d(qe);{var ft=Ve=>{var Se=x1(),me=h(d(Se),2);je(me,17,()=>r(gt),wt,(He,Ee)=>{var Te=b1(),Fe=d(Te),ht=d(Fe,!0);c(Fe);var Vt=h(Fe,2);Uo(Vt,{size:10}),ye(2),c(Te),$((nn,Wt)=>{xe(Te,"title",`Select ${nn??""}`),X(ht,Wt)},[()=>xt(r(Ee).source),()=>xt(r(Ee).source)]),be("click",Te,()=>hn(r(Ee).source)),_(He,Te)}),c(Se),_(Ve,Se)};Y(Xe,Ve=>{r(gt).length>0&&Ve(ft)})}var pt=h(Xe,2);{var Je=Ve=>{var Se=k1(),me=h(d(Se),2);je(me,17,()=>r(dt),wt,(He,Ee)=>{var Te=w1(),Fe=h(d(Te),2);Uo(Fe,{size:10});var ht=h(Fe,2),Vt=d(ht,!0);c(ht),c(Te),$((nn,Wt)=>{xe(Te,"title",`Select ${nn??""}`),X(Vt,Wt)},[()=>xt(r(Ee).target),()=>xt(r(Ee).target)]),be("click",Te,()=>hn(r(Ee).target)),_(He,Te)}),c(Se),_(Ve,Se)};Y(pt,Ve=>{r(dt).length>0&&Ve(Je)})}c(qe),c(Le),_(Re,Le)};Y(Ho,Re=>{(r(gt).length>0||r(dt).length>0)&&Re(Sl)})}var ka=h(Ho,2),Vo=h(d(ka),2),Sa=d(Vo),zl=d(Sa);c(Sa);var Fo=h(Sa,2),Cl=d(Fo);c(Fo),c(Vo),c(ka);var Bo=h(ka,2),za=d(Bo),El=d(za);Wn(El,{size:13}),ye(2),c(za),c(Bo),c(Oo),c(vt),$((Re,Le)=>{Lt=st(Mt,"",Lt,{"--node-color":r(lt)}),X(Sn,`${m[r(Ie).type??""]??"Node"??""} Properties`),X(rr,r(Ie).id),Ro=st(xa,"",Ro,{"--badge-color":r(lt)}),X(dl,m[r(Ie).type??""]??r(Ie).type),X(zl,`X: ${Re??""}`),X(Cl,`Y: ${Le??""}`)},[()=>Math.round(r(Ie).position.x),()=>Math.round(r(Ie).position.y)]),be("click",ya,pn),be("click",za,wn),_(ce,vt)};Y(Qe,ce=>{n()&&ce(kt)})}_(t,Sr),Ce(),l()}_t(["click"]);var E1=P(""),N1=P(''),M1=P(''),P1=P('
    Pipeline I/O
    Processing
    '),T1=P('');function I1(t,e){ze(e,!0);const n=()=>at(mn,"$selectedNodeId",a),[a,o]=Ot();let i=Q(320),s=Q(!1),l=Q(0),u=Q(0);function v(z){z.preventDefault(),y(s,!0),y(l,z.clientX,!0),y(u,r(i),!0),document.addEventListener("mousemove",p),document.addEventListener("mouseup",m)}function p(z){r(s)&&y(i,Math.max(240,Math.min(480,r(u)+(r(l)-z.clientX))),!0)}function m(){y(s,!1),document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",m)}On(()=>{document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",m)});const f=[{type:"input",label:"Input",icon:wc,color:"#22c55e",group:"io"},{type:"output",label:"Output",icon:kc,color:"#ef4444",group:"io"},{type:"agent",label:"Agent",icon:cr,color:"#6366f1"},{type:"tool",label:"Tool",icon:Xn,color:"#8b5cf6"},{type:"reasoning",label:"Reasoning",icon:Zr,color:"#ec4899"},{type:"condition",label:"Condition",icon:Xs,color:"#f59e0b"},{type:"memory",label:"Memory",icon:co,color:"#06b6d4"},{type:"validator",label:"Validator",icon:vo,color:"#f59e0b"},{type:"custom_code",label:"Code",icon:la,color:"#3b82f6"},{type:"fan_out",label:"Fan Out",icon:fo,color:"#64748b"},{type:"fan_in",label:"Fan In",icon:po,color:"#64748b"}];function w(z){const g=parseInt(z.slice(1,3),16),C=parseInt(z.slice(3,5),16),T=parseInt(z.slice(5,7),16);return`rgba(${g}, ${C}, ${T}, 0.15)`}let N=k(()=>n()?"properties":"components");var E=T1();let I,H;var O=d(E),F=h(O,2),M=d(F);let R;var b=d(M);jl(b,{size:12}),ye(2),c(M);var A=h(M,2);{var B=z=>{var g=E1();let C;var T=d(g);Ec(T,{size:12}),ye(2),c(g),$(()=>C=De(g,1,"panel-tab-btn svelte-1ecj58j",null,C,{active:r(N)==="properties"})),be("click",g,()=>{}),_(z,g)};Y(A,z=>{n()&&z(B)})}c(F);var K=h(F,2),Z=d(K);{var x=z=>{C1(z,{})},S=z=>{var g=P1(),C=h(d(g),2);je(C,17,()=>f.filter(D=>D.group==="io"),wt,(D,V)=>{var L=N1(),q=d(L);let j;var U=d(q);un(U,()=>r(V).icon,(ae,re)=>{re(ae,{size:14})}),c(q);var W=h(q,2),J=d(W,!0);c(W),c(L),$(ae=>{xe(L,"title",`Add ${r(V).label} node`),j=st(q,"",j,ae),X(J,r(V).label)},[()=>({background:w(r(V).color),color:r(V).color})]),be("click",L,()=>Xo(r(V).type,r(V).label)),_(D,L)});var T=h(C,4);je(T,17,()=>f.filter(D=>!D.group),wt,(D,V)=>{var L=M1(),q=d(L);let j;var U=d(q);un(U,()=>r(V).icon,(ae,re)=>{re(ae,{size:14})}),c(q);var W=h(q,2),J=d(W,!0);c(W),c(L),$(ae=>{xe(L,"title",`Add ${r(V).label} node`),j=st(q,"",j,ae),X(J,r(V).label)},[()=>({background:w(r(V).color),color:r(V).color})]),be("click",L,()=>Xo(r(V).type,r(V).label)),_(D,L)}),c(g),_(z,g)};Y(Z,z=>{r(N)==="properties"&&n()?z(x):z(S,!1)})}c(K),c(E),$(()=>{I=De(E,1,"component-panel svelte-1ecj58j",null,I,{dragging:r(s)}),H=st(E,"",H,{width:`${r(i)??""}px`}),R=De(M,1,"panel-tab-btn svelte-1ecj58j",null,R,{active:r(N)==="components"})}),be("mousedown",O,v),be("click",M,()=>{n()&&mn.set(null)}),_(t,E),Ce(),o()}_t(["mousedown","click"]);var A1=P('
    No execution events yet. Run your pipeline to see logs here.
    '),D1=P(' '),O1=P(' '),R1=P(' '),L1=P('
    '),H1=P('
    ');function V1(t,e){ze(e,!0);const n=()=>at(Ka,"$executionEvents",a),[a,o]=Ot();let i=Q(void 0),s=Q(0);_e(()=>{const b=n();b.length>r(s)&&r(i)&&requestAnimationFrame(()=>{r(i)&&(r(i).scrollTop=r(i).scrollHeight)}),y(s,b.length,!0)});function l(){Ka.set([])}function u(b){const A=new Date(b),B=String(A.getHours()).padStart(2,"0"),K=String(A.getMinutes()).padStart(2,"0"),Z=String(A.getSeconds()).padStart(2,"0"),x=String(A.getMilliseconds()).padStart(3,"0");return`${B}:${K}:${Z}.${x}`}function v(b){switch(b){case"node_start":return"badge-info";case"node_complete":case"pipeline_complete":return"badge-success";case"node_error":return"badge-error";case"node_skip":return"badge-warning";default:return""}}function p(b){switch(b){case"node_start":return"START";case"node_complete":return"DONE";case"node_error":return"ERROR";case"node_skip":return"SKIP";case"pipeline_complete":return"COMPLETE";default:return b}}function m(b){return b.type==="node_complete"&&b.latency_ms!=null?`${b.latency_ms}ms`:b.type==="node_error"&&b.error?b.error:b.type==="pipeline_complete"&&b.duration_ms!=null?`Total: ${b.duration_ms}ms`:""}var f=H1(),w=d(f),N=d(w),E=d(N);c(N);var I=h(N,2),H=d(I);Wn(H,{size:13}),c(I),c(w);var O=h(w,2),F=d(O);{var M=b=>{var A=A1();_(b,A)},R=b=>{var A=Me(),B=de(A);je(B,1,n,wt,(K,Z)=>{const x=k(()=>m(r(Z)));var S=L1(),z=d(S),g=d(z,!0);c(z);var C=h(z,2),T=d(C,!0);c(C);var D=h(C,2);{var V=W=>{var J=D1(),ae=d(J,!0);c(J),$(()=>X(ae,r(Z).node_id)),_(W,J)};Y(D,W=>{r(Z).node_id&&W(V)})}var L=h(D,2);{var q=W=>{var J=O1(),ae=d(J,!0);c(J),$(()=>X(ae,r(Z).pipeline_name)),_(W,J)};Y(L,W=>{r(Z).pipeline_name&&W(q)})}var j=h(L,2);{var U=W=>{var J=R1(),ae=d(J,!0);c(J),$(()=>X(ae,r(x))),_(W,J)};Y(j,W=>{r(x)&&W(U)})}c(S),$((W,J,ae)=>{X(g,W),De(C,1,`log-badge ${J??""}`,"svelte-dlnc6c"),X(T,ae)},[()=>u(r(Z).timestamp??""),()=>v(r(Z).type),()=>p(r(Z).type)]),_(K,S)}),_(b,A)};Y(F,b=>{n().length===0?b(M):b(R,!1)})}c(O),yn(O,b=>y(i,b),()=>r(i)),c(f),$(()=>X(E,`${n().length??""} events`)),be("click",I,l),_(t,f),Ce(),o()}_t(["click"]);var F1=P('Auto-syncing...'),B1=P('
    Generating code...
    '),q1=P('
    '),K1=P(''),j1=P('
    '),Z1=P('
    Add nodes to your pipeline to generate code.
    '),Y1=P('
    Generated Python
    ');function X1(t,e){ze(e,!0);let n=Q(""),a=Q(!1),o=Q(""),i=Q(!1),s=Q(!0),l=Q(!1),u=null,v=null,p=Q("");function m(){const G=Bn(an),oe=Bn(Mn),ee=G.map(te=>({id:te.id,type:te.type,label:te.data?.label??"",model:te.data?.model??"",instructions:te.data?.instructions??""})),se=oe.map(te=>({id:te.id,source:te.source,target:te.target}));return JSON.stringify({nodes:ee,edges:se})}function f(){const G=Bn(an),oe=Bn(Mn),ee=G.map(te=>({id:te.id,type:te.type,label:te.data?.label??"",position:te.position,data:te.data})),se=oe.map(te=>({id:te.id,source:te.source,target:te.target}));return{nodes:ee,edges:se}}async function w(){y(a,!0),y(o,""),y(l,!1);try{const G=f(),oe=await ot.codegen.toCode(G);y(n,oe.code,!0)}catch(G){y(o,G instanceof Error?G.message:"Code generation failed",!0),y(n,"")}finally{y(a,!1)}}async function N(){if(r(n))try{await navigator.clipboard.writeText(r(n)),y(i,!0),u&&clearTimeout(u),u=setTimeout(()=>{y(i,!1),u=null},2e3)}catch{}}function E(){y(s,!r(s)),r(s)||I()}function I(){v&&(clearTimeout(v),v=null),y(l,!1)}function H(G){return G.replace(/&/g,"&").replace(//g,">")}function O(G){const oe=H(G),ee=[];let se=0;const te=new RegExp(['("""[\\s\\S]*?""")',"('''[\\s\\S]*?''')","(#[^\\n]*)",'("(?:[^"\\\\\\n]|\\\\.)*")',"('(?:[^'\\\\\\n]|\\\\.)*')","\\b(def)(\\s+)(\\w+)","\\b(class)(\\s+)(\\w+)","(@\\w+(?:\\.\\w+)*)","\\b(from|import|return|if|else|elif|for|while|try|except|finally|with|as|async|await|yield|raise|pass|break|continue|and|or|not|in|is|None|True|False)\\b","\\b(print|len|range|type|str|int|float|list|dict|set|tuple|isinstance|super)(?=\\s*\\()","\\b(\\d+\\.?\\d*(?:e[+-]?\\d+)?)\\b"].join("|"),"g");let ue;for(te.lastIndex=0;(ue=te.exec(oe))!==null;)ue.index>se&&ee.push(oe.slice(se,ue.index)),ue[1]!==void 0?ee.push(`${ue[1]}`):ue[2]!==void 0?ee.push(`${ue[2]}`):ue[3]!==void 0?ee.push(`${ue[3]}`):ue[4]!==void 0?ee.push(`${ue[4]}`):ue[5]!==void 0?ee.push(`${ue[5]}`):ue[6]!==void 0?ee.push(`${ue[6]}${ue[7]}${ue[8]}`):ue[9]!==void 0?ee.push(`${ue[9]}${ue[10]}${ue[11]}`):ue[12]!==void 0?ee.push(`${ue[12]}`):ue[13]!==void 0?ee.push(`${ue[13]}`):ue[14]!==void 0?ee.push(`${ue[14]}`):ue[15]!==void 0?ee.push(`${ue[15]}`):ee.push(ue[0]),se=ue.index+ue[0].length;return ser(n)?O(r(n)):""),M=k(()=>r(F)?r(F).split(` -`):[]),R=null,b=null;function A(){if(!r(s))return;const G=m();G===r(p)||(y(p,G,!0),Bn(an).length===0)||r(a)||(I(),y(l,!0),v=setTimeout(()=>{y(l,!1),v=null,w()},800))}io(()=>{y(p,m(),!0),Bn(an).length>0&&w(),R=an.subscribe(()=>{A()}),b=Mn.subscribe(()=>{A()})}),On(()=>{u&&clearTimeout(u),I(),R&&R(),b&&b()});var B=Y1(),K=d(B),Z=d(K),x=h(d(Z));{var S=G=>{var oe=F1();_(G,oe)};Y(x,G=>{r(l)&&G(S)})}c(Z);var z=h(Z,2),g=d(z);let C;var T=h(g,2),D=d(T);{var V=G=>{ho(G,{size:13})},L=G=>{Gs(G,{size:13})};Y(D,G=>{r(i)?G(V):G(L,!1)})}c(T);var q=h(T,2);let j;var U=d(q);mt(U,{size:13}),c(q),c(z),c(K);var W=h(K,2),J=d(W);{var ae=G=>{var oe=B1();_(G,oe)},re=G=>{var oe=q1(),ee=d(oe),se=d(ee,!0);c(ee),c(oe),$(()=>X(se,r(o))),_(G,oe)},ie=G=>{var oe=j1(),ee=d(oe),se=d(ee);je(se,21,()=>r(M),wt,(te,ue,le)=>{var he=K1(),ve=d(he);ve.textContent=le+1;var fe=h(ve),ke=d(fe);$l(ke,()=>r(ue)),c(fe),c(he),_(te,he)}),c(se),c(ee),c(oe),_(G,oe)},ne=G=>{var oe=Z1();_(G,oe)};Y(J,G=>{r(a)?G(ae):r(o)?G(re,1):r(n)?G(ie,2):G(ne,!1)})}c(W),c(B),$(()=>{C=De(g,1,"auto-toggle svelte-a1zyks",null,C,{active:r(s)}),xe(g,"title",r(s)?"Disable auto-sync":"Enable auto-sync"),T.disabled=!r(n),j=De(q,1,"toolbar-btn svelte-a1zyks",null,j,{spinning:r(a)}),q.disabled=r(a)}),be("click",g,E),be("click",T,N),be("click",q,w),_(t,B),Ce()}_t(["click"]);var W1=P('
    Run your pipeline to see the execution timeline
    '),G1=P(''),U1=P(''),Q1=P('Shift+click another checkpoint to compare'),J1=P('
    '),$1=P(' '),e_=P('
    Added
    '),t_=P(' '),n_=P('
    Removed
    '),r_=P(' '),a_=P('
    Changed
    '),o_=P('No differences'),s_=P('
    '),i_=P(' '),l_=P('
    '),c_=P('
    '),d_=P('empty'),u_=P('
    '),v_=P('
    '),f_=P('empty'),p_=P('
    '),h_=P('
    '),g_=P('
    Timeline
    ',1),m_=P('
    ');function __(t,e){ze(e,!0);const n=()=>at(En,"$checkpoints",a),[a,o]=Ot();let i=Q(null),s=Q(null),l=Q(null),u=Q(void 0),v=Q(0),p=Q(!0),m=Q(!1),f=k(()=>r(i)!==null?n().find(x=>x.index===r(i)):void 0);_e(()=>{const x=n();x.length>r(v)&&r(u)&&requestAnimationFrame(()=>{r(u)&&(r(u).scrollLeft=r(u).scrollWidth)}),y(v,x.length,!0)}),io(async()=>{try{const x=await ot.checkpoints.list();En.set(x)}catch{}});function w(x,S){S.shiftKey&&r(i)!==null&&r(i)!==x.index?(y(s,x.index,!0),N()):(y(i,x.index,!0),y(s,null),y(l,null))}async function N(){if(!(r(i)===null||r(s)===null))try{y(l,await ot.checkpoints.diff(r(i),r(s)),!0)}catch{y(l,null)}}async function E(){try{await ot.checkpoints.clear(),En.set([]),y(i,null),y(s,null),y(l,null)}catch{En.set([]),y(i,null),y(s,null),y(l,null)}}async function I(){if(!(!r(f)||r(i)===null))try{await ot.checkpoints.rewind(r(i)),En.update(x=>x.filter(S=>S.index<=r(i))),y(s,null),y(l,null),Ue(`Rewound to checkpoint #${r(i)}`,"info")}catch{Ue("Failed to rewind checkpoint","error")}}async function H(){if(!(!r(f)||r(i)===null))try{const x=await ot.checkpoints.fork(r(i),r(f).state);En.update(S=>[...S,x]),y(i,x.index,!0)}catch{}}function O(x){if(!x)return"";const S=Date.now(),z=new Date(x).getTime(),g=S-z,C=Math.floor(g/1e3);if(C<5)return"just now";if(C<60)return`${C}s ago`;const T=Math.floor(C/60);if(T<60)return`${T}m ago`;const D=Math.floor(T/60);return D<24?`${D}h ago`:new Date(x).toLocaleDateString()}function F(x){if(!x)return"";const S=new Date(x),z=String(S.getHours()).padStart(2,"0"),g=String(S.getMinutes()).padStart(2,"0"),C=String(S.getSeconds()).padStart(2,"0");return`${z}:${g}:${C}`}function M(x){return x.includes("agent")?"var(--color-node-agent, #6366f1)":x.includes("tool")?"var(--color-node-tool, #8b5cf6)":x.includes("reason")?"var(--color-node-reasoning, #ec4899)":x.includes("pipeline")?"var(--color-node-pipeline, #06b6d4)":"var(--color-accent, #ff6b35)"}function R(x){return x.branch_id?"var(--color-info, #3b82f6)":"var(--color-accent, #ff6b35)"}function b(x){return typeof x=="string"?`"${x}"`:x===null?"null":x===void 0?"undefined":typeof x=="object"?JSON.stringify(x,null,2):String(x)}var A=m_(),B=d(A);{var K=x=>{var S=W1(),z=d(S),g=d(z);go(g,{size:32}),c(z),ye(2),c(S),_(x,S)},Z=x=>{var S=g_(),z=de(S),g=d(z),C=h(d(g),2),T=d(C);c(C),c(g);var D=h(g,2),V=d(D);Wn(V,{size:13}),c(D),c(z);var L=h(z,2),q=d(L),j=h(d(q),2);je(j,1,n,ne=>ne.index,(ne,G)=>{const oe=k(()=>r(i)===r(G).index),ee=k(()=>r(s)===r(G).index);var se=G1();let te;var ue=d(se);let le;var he=h(ue,2),ve=d(he,!0);c(he),c(se),$((fe,ke)=>{te=De(se,1,"checkpoint-dot-wrapper svelte-164d9ci",null,te,{selected:r(oe),compare:r(ee)}),xe(se,"title",`${r(G).node_id??""} - ${fe??""}${r(G).branch_id?` (branch: ${r(G).branch_id})`:""}`),le=De(ue,1,"checkpoint-dot svelte-164d9ci",null,le,{selected:r(oe),compare:r(ee),forked:!!r(G).branch_id}),st(ue,`--dot-color: ${ke??""}`),X(ve,r(G).index)},[()=>F(r(G).timestamp),()=>R(r(G))]),be("click",se,fe=>w(r(G),fe)),_(ne,se)}),c(q),c(L),yn(L,ne=>y(u,ne),()=>r(u));var U=h(L,2);{var W=ne=>{var G=J1(),oe=d(G),ee=d(oe);Cc(ee,{size:13}),ye(2),c(oe);var se=h(oe,2),te=d(se);dr(te,{size:13}),ye(2),c(se);var ue=h(se,2);{var le=ve=>{var fe=U1(),ke=d(fe);_c(ke,{size:13});var Ae=h(ke,2),ge=d(Ae);c(Ae),c(fe),$(()=>X(ge,`Compare #${r(i)??""} vs #${r(s)??""}`)),be("click",fe,N),_(ve,fe)},he=ve=>{var fe=Q1();_(ve,fe)};Y(ue,ve=>{r(s)!==null?ve(le):ve(he,!1)})}c(G),be("click",oe,I),be("click",se,H),_(ne,G)};Y(U,ne=>{r(f)&&ne(W)})}var J=h(U,2);{var ae=ne=>{var G=s_(),oe=d(G),ee=d(oe);c(oe);var se=h(oe,2),te=d(se);{var ue=ge=>{var Oe=e_(),Ye=h(d(Oe),2);je(Ye,17,()=>r(l).added,wt,(We,it)=>{var Ge=$1(),ct=d(Ge,!0);c(Ge),$(()=>X(ct,r(it))),_(We,Ge)}),c(Oe),_(ge,Oe)};Y(te,ge=>{r(l).added.length>0&&ge(ue)})}var le=h(te,2);{var he=ge=>{var Oe=n_(),Ye=h(d(Oe),2);je(Ye,17,()=>r(l).removed,wt,(We,it)=>{var Ge=t_(),ct=d(Ge,!0);c(Ge),$(()=>X(ct,r(it))),_(We,Ge)}),c(Oe),_(ge,Oe)};Y(le,ge=>{r(l).removed.length>0&&ge(he)})}var ve=h(le,2);{var fe=ge=>{var Oe=a_(),Ye=h(d(Oe),2);je(Ye,17,()=>r(l).changed,wt,(We,it)=>{var Ge=r_(),ct=d(Ge,!0);c(Ge),$(()=>X(ct,r(it))),_(We,Ge)}),c(Oe),_(ge,Oe)};Y(ve,ge=>{r(l).changed.length>0&&ge(fe)})}var ke=h(ve,2);{var Ae=ge=>{var Oe=o_();_(ge,Oe)};Y(ke,ge=>{r(l).added.length===0&&r(l).removed.length===0&&r(l).changed.length===0&&ge(Ae)})}c(se),c(G),$(()=>X(ee,`Diff: #${r(i)??""} vs #${r(s)??""}`)),_(ne,G)};Y(J,ne=>{r(l)&&ne(ae)})}var re=h(J,2);{var ie=ne=>{var G=h_(),oe=d(G),ee=d(oe),se=d(ee,!0);c(ee);var te=h(ee,2),ue=d(te,!0);c(te);var le=h(te,2),he=d(le,!0);c(le),c(oe);var ve=h(oe,2);{var fe=Qe=>{var kt=l_(),ce=d(kt);dr(ce,{size:12});var Ie=h(ce,2),rt=d(Ie);c(Ie);var lt=h(Ie,2);{var vt=yt=>{var bt=i_(),Mt=d(bt);c(bt),$(()=>X(Mt,`from checkpoint #${r(f).parent_index??""}`)),_(yt,bt)};Y(lt,yt=>{r(f).parent_index!==null&&r(f).parent_index!==void 0&&yt(vt)})}c(kt),$(()=>X(rt,`Branch: ${r(f).branch_id??""}`)),_(Qe,kt)};Y(ve,Qe=>{r(f).branch_id&&Qe(fe)})}var ke=h(ve,2),Ae=d(ke),ge=d(Ae);{var Oe=Qe=>{Yr(Qe,{size:12})},Ye=Qe=>{Xr(Qe,{size:12})};Y(ge,Qe=>{r(p)?Qe(Oe):Qe(Ye,!1)})}var We=h(ge,4),it=d(We);c(We),c(Ae);var Ge=h(Ae,2);{var ct=Qe=>{var kt=u_(),ce=d(kt);je(ce,17,()=>Object.entries(r(f).state),wt,(vt,yt)=>{var bt=k(()=>dn(r(yt),2));let Mt=()=>r(bt)[0],Lt=()=>r(bt)[1];var Ht=c_(),Xt=d(Ht),kn=d(Xt);c(Xt);var Sn=h(Xt,2),Ln=d(Sn,!0);c(Sn),c(Ht),$(rr=>{X(kn,`${Mt()??""}:`),X(Ln,rr)},[()=>b(Lt())]),_(vt,Ht)});var Ie=h(ce,2);{var rt=vt=>{var yt=d_();_(vt,yt)},lt=k(()=>Object.keys(r(f).state).length===0);Y(Ie,vt=>{r(lt)&&vt(rt)})}c(kt),_(Qe,kt)};Y(Ge,Qe=>{r(p)&&Qe(ct)})}c(ke);var Nt=h(ke,2),gt=d(Nt),dt=d(gt);{var xt=Qe=>{Yr(Qe,{size:12})},Pe=Qe=>{Xr(Qe,{size:12})};Y(dt,Qe=>{r(m)?Qe(xt):Qe(Pe,!1)})}var pn=h(dt,4),wn=d(pn);c(pn),c(gt);var hn=h(gt,2);{var Sr=Qe=>{var kt=p_(),ce=d(kt);je(ce,17,()=>Object.entries(r(f).inputs),wt,(vt,yt)=>{var bt=k(()=>dn(r(yt),2));let Mt=()=>r(bt)[0],Lt=()=>r(bt)[1];var Ht=v_(),Xt=d(Ht),kn=d(Xt);c(Xt);var Sn=h(Xt,2),Ln=d(Sn,!0);c(Sn),c(Ht),$(rr=>{X(kn,`${Mt()??""}:`),X(Ln,rr)},[()=>b(Lt())]),_(vt,Ht)});var Ie=h(ce,2);{var rt=vt=>{var yt=f_();_(vt,yt)},lt=k(()=>Object.keys(r(f).inputs).length===0);Y(Ie,vt=>{r(lt)&&vt(rt)})}c(kt),_(Qe,kt)};Y(hn,Qe=>{r(m)&&Qe(Sr)})}c(Nt),c(G),$((Qe,kt,ce,Ie,rt,lt)=>{st(ee,`background: ${Qe??""}20; color: ${kt??""}`),X(se,r(f).node_id),X(ue,ce),X(he,Ie),X(it,`${rt??""} keys`),X(wn,`${lt??""} keys`)},[()=>M(r(f).node_id),()=>M(r(f).node_id),()=>O(r(f).timestamp),()=>F(r(f).timestamp),()=>Object.keys(r(f).state).length,()=>Object.keys(r(f).inputs).length]),be("click",Ae,()=>y(p,!r(p))),be("click",gt,()=>y(m,!r(m))),_(ne,G)};Y(re,ne=>{r(f)&&ne(ie)})}$(()=>X(T,`${n().length??""} checkpoint${n().length===1?"":"s"}`)),be("click",D,E),_(x,S)};Y(B,x=>{n().length===0?x(K):x(Z,!1)})}c(A),_(t,A),Ce(),o()}_t(["click"]);var y_=P('
    Loading history...
    '),b_=P('
    No version history yet
    '),x_=P('
    '),w_=P('
    '),k_=P('
    Version History
    ');function S_(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q($t([])),s=Q(!1),l=Q(null);async function u(){const R=n();if(R){y(s,!0);try{y(i,await ot.projects.getHistory(R.name),!0)}catch{y(i,[],!0)}finally{y(s,!1)}}}async function v(R){const b=n();if(b)try{await ot.projects.bookmarkVersion(b.name,R,`bookmark-${R.slice(0,7)}`),await u(),Ue("Version bookmarked","success")}catch{Ue("Failed to bookmark","error")}}async function p(R){const b=n();if(b)try{await ot.projects.restoreVersion(b.name,R),y(l,null),await u(),Ue("Restored to version "+R.slice(0,7),"success")}catch{Ue("Failed to restore","error")}}function m(R){const b=Date.now(),A=new Date(R).getTime(),B=b-A,K=Math.floor(B/6e4);if(K<1)return"just now";if(K<60)return`${K}m ago`;const Z=Math.floor(K/60);return Z<24?`${Z}h ago`:`${Math.floor(Z/24)}d ago`}_e(()=>{n()&&u()});var f=k_(),w=d(f),N=h(d(w),2),E=d(N);mt(E,{size:13}),c(N),c(w);var I=h(w,2),H=d(I);{var O=R=>{var b=y_(),A=d(b);mt(A,{size:16,class:"spin"}),ye(2),c(b),_(R,b)},F=R=>{var b=b_(),A=d(b);Jo(A,{size:16}),ye(2),c(b),_(R,b)},M=R=>{var b=Me(),A=de(b);je(A,17,()=>r(i),B=>B.sha,(B,K)=>{var Z=w_();let x;var S=d(Z),z=d(S);Jo(z,{size:14}),c(S);var g=h(S,2),C=d(g),T=d(C,!0);c(C);var D=h(C,2),V=d(D,!0);c(D);var L=h(D,2),q=d(L,!0);c(L),c(g);var j=h(g,2),U=d(j);let W;var J=d(U);{let oe=k(()=>r(K).bookmarked?"currentColor":"none");Nc(J,{size:13,get fill(){return r(oe)}})}c(U);var ae=h(U,2);let re;var ie=d(ae);Sc(ie,{size:13}),c(ae),c(j);var ne=h(j,2);{var G=oe=>{var ee=x_(),se=d(ee),te=d(se);c(se);var ue=h(se,2),le=h(ue,2);c(ee),$(he=>X(te,`Restore to ${he??""}?`),[()=>r(K).sha.slice(0,7)]),be("click",ue,()=>p(r(K).sha)),be("click",le,()=>y(l,null)),_(oe,ee)};Y(ne,oe=>{r(l)===r(K).sha&&oe(G)})}c(Z),$((oe,ee)=>{x=De(Z,1,"version-item svelte-1jltp3m",null,x,{confirming:r(l)===r(K).sha}),X(T,oe),X(V,r(K).message),X(q,ee),W=De(U,1,"action-btn bookmark-btn svelte-1jltp3m",null,W,{bookmarked:r(K).bookmarked}),xe(U,"title",r(K).bookmarked?"Bookmarked":"Bookmark this version"),re=De(ae,1,"action-btn restore-btn svelte-1jltp3m",null,re,{visible:r(l)===r(K).sha})},[()=>r(K).sha.slice(0,7),()=>m(r(K).timestamp)]),be("click",U,()=>v(r(K).sha)),be("click",ae,()=>y(l,r(K).sha,!0)),_(B,Z)}),_(R,b)};Y(H,R=>{r(s)?R(O):r(i).length===0?R(F,1):R(M,!1)})}c(I),c(f),$(()=>N.disabled=r(s)),be("click",N,u),_(t,f),Ce(),o()}_t(["click"]);var z_=P('
    Loading...
    '),C_=P('
    No connectors available
    '),E_=P('Installed'),N_=P(" Install",1),M_=P(''),P_=P('
    '),T_=P('
    '),I_=P('
    No custom tools defined. Create one to get started.
    '),A_=P('
    '),D_=P('
    '),O_=P('
    ');function R_(t,e){ze(e,!0);let n=Q("connectors"),a=Q(!1),o=Q($t([])),i=Q(null),s=Q($t([]));async function l(){y(a,!0);try{y(o,await ot.customTools.catalog(),!0)}catch{y(o,[],!0),Ue("Failed to load connector catalog","error")}finally{y(a,!1)}}async function u(){y(a,!0);try{y(s,await ot.customTools.list(),!0)}catch{y(s,[],!0),Ue("Failed to load custom tools","error")}finally{y(a,!1)}}async function v(x){y(i,x,!0);try{await ot.customTools.installConnector(x),Ue("Connector installed","success"),await l()}catch{Ue("Failed to install connector","error")}finally{y(i,null)}}async function p(x){try{await ot.customTools.delete(x),Ue("Tool deleted","success"),await u()}catch{Ue("Failed to delete tool","error")}}_e(()=>{r(n)==="connectors"?l():u()});var m=O_(),f=d(m),w=d(f),N=d(w);let E;var I=d(N);Ya(I,{size:12}),ye(),c(N);var H=h(N,2);let O;var F=d(H);Xn(F,{size:12}),ye(),c(H),c(w);var M=h(w,2),R=d(M);mt(R,{size:13}),c(M),c(f);var b=h(f,2),A=d(b);{var B=x=>{var S=z_(),z=d(S);mt(z,{size:16}),ye(2),c(S),_(x,S)},K=x=>{var S=Me(),z=de(S);{var g=T=>{var D=C_(),V=d(D);Ya(V,{size:16}),ye(2),c(D),_(T,D)},C=T=>{var D=T_();je(D,21,()=>r(o),V=>V.id,(V,L)=>{var q=P_(),j=d(q),U=d(j,!0);c(j);var W=h(j,2),J=d(W),ae=d(J),re=d(ae,!0);c(ae);var ie=h(ae,2);{var ne=he=>{var ve=E_();_(he,ve)};Y(ie,he=>{r(L).installed&&he(ne)})}c(J);var G=h(J,2),oe=d(G,!0);c(G);var ee=h(G,2),se=d(ee,!0);c(ee),c(W);var te=h(W,2),ue=d(te);{var le=he=>{var ve=M_(),fe=d(ve);{var ke=ge=>{var Oe=qs("Installing...");_(ge,Oe)},Ae=ge=>{var Oe=N_(),Ye=de(Oe);ca(Ye,{size:11}),ye(),_(ge,Oe)};Y(fe,ge=>{r(i)===r(L).id?ge(ke):ge(Ae,!1)})}c(ve),$(()=>ve.disabled=r(i)===r(L).id),be("click",ve,()=>v(r(L).id)),_(he,ve)};Y(ue,he=>{r(L).installed||he(le)})}c(te),c(q),$(()=>{X(U,r(L).icon),X(re,r(L).name),X(oe,r(L).description),X(se,r(L).category)}),_(V,q)}),c(D),_(T,D)};Y(z,T=>{r(o).length===0?T(g):T(C,!1)})}_(x,S)},Z=x=>{var S=Me(),z=de(S);{var g=T=>{var D=I_(),V=d(D);Xn(V,{size:16}),ye(2),c(D),_(T,D)},C=T=>{var D=D_();je(D,21,()=>r(s),V=>V.name,(V,L)=>{var q=A_(),j=d(q),U=d(j),W=d(U,!0);c(U);var J=h(U,2),ae=d(J,!0);c(J);var re=h(J,2),ie=d(re,!0);c(re),c(j);var ne=h(j,2),G=d(ne),oe=d(G);Wn(oe,{size:13}),c(G),c(ne),c(q),$(()=>{X(W,r(L).name),X(ae,r(L).tool_type),X(ie,r(L).description)}),be("click",G,()=>p(r(L).name)),_(V,q)}),c(D),_(T,D)};Y(z,T=>{r(s).length===0?T(g):T(C,!1)})}_(x,S)};Y(A,x=>{r(a)?x(B):r(n)==="connectors"?x(K,1):x(Z,!1)})}c(b),c(m),$(()=>{E=De(N,1,"sub-tab svelte-1g6pzvd",null,E,{active:r(n)==="connectors"}),O=De(H,1,"sub-tab svelte-1g6pzvd",null,O,{active:r(n)==="tools"})}),be("click",N,()=>y(n,"connectors")),be("click",H,()=>y(n,"tools")),be("click",M,()=>r(n)==="connectors"?l():u()),_(t,m),Ce()}_t(["click"]);var L_=P('
    Loading...
    '),H_=P('
    No datasets. Upload a JSON or CSV file to get started.
    '),V_=P(''),F_=P('
    '),B_=P(' '),q_=P('
    '),K_=P('
    '),j_=P('
    Total
    Passed
    Failed
    Pass Rate
    '),Z_=P('
    Evaluate
    ');function Y_(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(null),u=Q(!1),v=Q(null),p=Q(void 0);async function m(){const L=n();if(L){y(i,!0);try{y(s,await ot.evaluate.listDatasets(L.name),!0)}catch{y(s,[],!0),Ue("Failed to load datasets","error")}finally{y(i,!1)}}}async function f(){if(!n()){Ue("Select a project first","error");return}r(p)?.click()}async function w(L){const q=n();if(!q)return;const j=L.target,U=j.files?.[0];if(U){try{const W=await ot.evaluate.uploadDataset(q.name,U);Ue(`Dataset uploaded: ${W.test_cases} test cases`,"success"),await m()}catch{Ue("Failed to upload dataset","error")}j.value=""}}async function N(){const L=n();if(!(!L||!r(l))){y(u,!0),y(v,null);try{const q=js();y(v,await ot.evaluate.run(L.name,r(l),q),!0),Ue(`Evaluation complete: ${r(v).pass_rate.toFixed(1)}% pass rate`,"success")}catch{Ue("Evaluation failed","error")}finally{y(u,!1)}}}_e(()=>{n()&&m()});var E=Z_(),I=d(E),H=h(d(I),2),O=d(H),F=d(O);Mc(F,{size:12}),ye(),c(O);var M=h(O,2),R=d(M);mt(R,{size:13}),c(M),c(H);var b=h(H,2);yn(b,L=>y(p,L),()=>r(p)),c(I);var A=h(I,2),B=d(A),K=h(d(B),2);{var Z=L=>{var q=L_(),j=d(q);mt(j,{size:13}),ye(2),c(q),_(L,q)},x=L=>{var q=H_(),j=d(q);Wo(j,{size:13}),ye(2),c(q),_(L,q)},S=L=>{var q=F_();je(q,21,()=>r(s),j=>j.filename,(j,U)=>{var W=V_();let J;var ae=d(W);Wo(ae,{size:12});var re=h(ae,2),ie=d(re,!0);c(re);var ne=h(re,2),G=d(ne);c(ne),c(W),$(()=>{J=De(W,1,"dataset-item svelte-3xr44d",null,J,{selected:r(l)===r(U).filename}),X(ie,r(U).filename),X(G,`${r(U).test_cases??""} cases`)}),be("click",W,()=>y(l,r(U).filename,!0)),_(j,W)}),c(q),_(L,q)};Y(K,L=>{r(i)?L(Z):r(s).length===0?L(x,1):L(S,!1)})}c(B);var z=h(B,2),g=d(z),C=d(g);ec(C,{size:12});var T=h(C);c(g),c(z);var D=h(z,2);{var V=L=>{var q=j_(),j=h(d(q),2),U=d(j),W=d(U),J=d(W,!0);c(W),ye(2),c(U);var ae=h(U,2),re=d(ae),ie=d(re,!0);c(re),ye(2),c(ae);var ne=h(ae,2),G=d(ne),oe=d(G,!0);c(G),ye(2),c(ne);var ee=h(ne,2),se=d(ee),te=d(se);c(se),ye(2),c(ee),c(j);var ue=h(j,2);{var le=he=>{var ve=K_();je(ve,21,()=>r(v).results,wt,(fe,ke)=>{var Ae=q_();let ge;var Oe=d(Ae),Ye=d(Oe);{var We=dt=>{pc(dt,{size:12})},it=dt=>{hc(dt,{size:12})};Y(Ye,dt=>{r(ke).passed?dt(We):dt(it,!1)})}c(Oe);var Ge=h(Oe,2),ct=d(Ge,!0);c(Ge);var Nt=h(Ge,2);{var gt=dt=>{var xt=B_(),Pe=d(xt,!0);c(xt),$(()=>X(Pe,r(ke).error)),_(dt,xt)};Y(Nt,dt=>{r(ke).error&&dt(gt)})}c(Ae),$(()=>{ge=De(Ae,1,"result-row svelte-3xr44d",null,ge,{passed:r(ke).passed,failed:!r(ke).passed}),X(ct,r(ke).input)}),_(fe,Ae)}),c(ve),_(he,ve)};Y(ue,he=>{r(v).results.length>0&&he(le)})}c(q),$(he=>{X(J,r(v).total),X(ie,r(v).passed),X(oe,r(v).failed),X(te,`${he??""}%`)},[()=>r(v).pass_rate.toFixed(1)]),_(L,q)};Y(D,L=>{r(v)&&L(V)})}c(A),c(E),$(()=>{g.disabled=!r(l)||r(u)||!n(),X(T,` ${r(u)?"Running...":"Run Evaluation"}`)}),be("click",O,f),be("click",M,m),be("change",b,w),be("click",g,N),_(t,E),Ce(),o()}_t(["click","change"]);var X_=P(''),W_=P('
    %
    '),G_=P('
    '),U_=P('
    Loading...
    '),Q_=P('
    No experiments yet. Create one to A/B test pipeline variants.
    '),J_=P('
    '),$_=P('
    '),e0=P('
    '),t0=P('
    Experiments
    ');function n0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(!1),u=Q(""),v=Q($t([{name:"Control",pipeline:"default",traffic:50},{name:"Variant A",pipeline:"default",traffic:50}]));async function p(){const g=n();if(g){y(i,!0);try{y(s,await ot.experiments.list(g.name),!0)}catch{y(s,[],!0),Ue("Failed to load experiments","error")}finally{y(i,!1)}}}async function m(){const g=n();if(!(!g||!r(u).trim()))try{await ot.experiments.create(g.name,r(u).trim(),r(v)),Ue("Experiment created","success"),y(u,""),y(l,!1),y(v,[{name:"Control",pipeline:"default",traffic:50},{name:"Variant A",pipeline:"default",traffic:50}],!0),await p()}catch{Ue("Failed to create experiment","error")}}async function f(g){const C=n();if(C)try{await ot.experiments.delete(C.name,g),Ue("Experiment deleted","success"),await p()}catch{Ue("Failed to delete experiment","error")}}function w(){const g=r(v).length+1;y(v,[...r(v),{name:`Variant ${String.fromCharCode(64+g)}`,pipeline:"default",traffic:0}],!0)}function N(g){y(v,r(v).filter((C,T)=>T!==g),!0)}function E(g){switch(g){case"running":return"badge-running";case"completed":return"badge-completed";default:return"badge-draft"}}_e(()=>{n()&&p()});var I=t0(),H=d(I),O=h(d(H),2),F=d(O),M=d(F);Go(M,{size:12}),ye(),c(F);var R=h(F,2),b=d(R);mt(b,{size:13}),c(R),c(O),c(H);var A=h(H,2),B=d(A);{var K=g=>{var C=G_(),T=d(C),D=h(d(T),2);Ct(D),c(T);var V=h(T,2),L=h(d(V),2),q=d(L);je(q,17,()=>r(v),wt,(re,ie,ne)=>{var G=W_(),oe=d(G);Ct(oe);var ee=h(oe,2);Ct(ee);var se=h(ee,2),te=d(se);Ct(te),xe(te,"min",0),xe(te,"max",100),ye(2),c(se);var ue=h(se,2);{var le=he=>{var ve=X_(),fe=d(ve);Wn(fe,{size:11}),c(ve),be("click",ve,()=>N(ne)),_(he,ve)};Y(ue,he=>{r(v).length>2&&he(le)})}c(G),on(oe,()=>r(ie).name,he=>r(ie).name=he),on(ee,()=>r(ie).pipeline,he=>r(ie).pipeline=he),on(te,()=>r(ie).traffic,he=>r(ie).traffic=he),_(re,G)});var j=h(q,2),U=d(j);Go(U,{size:11}),ye(),c(j),c(L),c(V);var W=h(V,2),J=d(W),ae=h(J,2);c(W),c(C),$(re=>J.disabled=re,[()=>!r(u).trim()]),on(D,()=>r(u),re=>y(u,re)),be("click",j,w),be("click",J,m),be("click",ae,()=>y(l,!1)),_(g,C)};Y(B,g=>{r(l)&&g(K)})}var Z=h(B,2);{var x=g=>{var C=U_(),T=d(C);mt(T,{size:16}),ye(2),c(C),_(g,C)},S=g=>{var C=Q_(),T=d(C);Us(T,{size:16}),ye(2),c(C),_(g,C)},z=g=>{var C=e0();je(C,21,()=>r(s),T=>T.id,(T,D)=>{var V=$_(),L=d(V),q=d(L);dr(q,{size:13});var j=h(q,2),U=d(j,!0);c(j);var W=h(j,2),J=d(W,!0);c(W);var ae=h(W,2),re=d(ae,!0);c(ae);var ie=h(ae,2),ne=d(ie);Wn(ne,{size:12}),c(ie),c(L);var G=h(L,2);je(G,21,()=>r(D).variants,oe=>oe.name,(oe,ee)=>{var se=J_(),te=d(se),ue=d(te,!0);c(te);var le=h(te,2),he=d(le);let ve;c(le);var fe=h(le,2),ke=d(fe);c(fe),c(se),$(()=>{X(ue,r(ee).name),ve=st(he,"",ve,{width:`${r(ee).traffic??""}%`}),X(ke,`${r(ee).traffic??""}%`)}),_(oe,se)}),c(G),c(V),$((oe,ee)=>{X(U,r(D).name),De(W,1,`status-badge ${oe??""}`,"svelte-oe5i1m"),X(J,r(D).status),X(re,ee)},[()=>E(r(D).status),()=>new Date(r(D).created_at).toLocaleDateString()]),be("click",ie,()=>f(r(D).id)),_(T,V)}),c(C),_(g,C)};Y(Z,g=>{r(i)?g(x):r(s).length===0&&!r(l)?g(S,1):g(z,!1)})}c(A),c(I),be("click",F,()=>y(l,!r(l))),be("click",R,p),_(t,I),Ce(),o()}_t(["click"]);var r0=P(" Copied",1),a0=P(" Copy",1),o0=P(' ',1),s0=P(" Generating...",1),i0=P(" Export as Python",1),l0=P('
     
    '),c0=P('
    Generating Python code...
    '),d0=P('
    Click "Export as Python" to generate deployable code from your pipeline.
    '),u0=P('
    Deploy / Export
    ');function v0(t,e){ze(e,!0);let n=Q(!1),a=Q(""),o=Q(!1);async function i(){y(n,!0),y(a,"");try{const b=js(),A=await ot.codegen.toCode(b);y(a,A.code,!0),Ue("Code generated successfully","success")}catch{Ue("Failed to generate code","error")}finally{y(n,!1)}}async function s(){if(r(a))try{await navigator.clipboard.writeText(r(a)),y(o,!0),Ue("Copied to clipboard","info"),setTimeout(()=>y(o,!1),2e3)}catch{Ue("Failed to copy","error")}}function l(){if(!r(a))return;const b=new Blob([r(a)],{type:"text/x-python"}),A=URL.createObjectURL(b),B=document.createElement("a");B.href=A,B.download="pipeline.py",B.click(),URL.revokeObjectURL(A),Ue("Download started","info")}var u=u0(),v=d(u),p=h(d(v),2),m=d(p);{var f=b=>{var A=o0(),B=de(A),K=d(B);{var Z=g=>{var C=r0(),T=de(C);ho(T,{size:12}),ye(),_(g,C)},x=g=>{var C=a0(),T=de(C);Gs(T,{size:12}),ye(),_(g,C)};Y(K,g=>{r(o)?g(Z):g(x,!1)})}c(B);var S=h(B,2),z=d(S);ca(z,{size:12}),ye(),c(S),be("click",B,s),be("click",S,l),_(b,A)};Y(m,b=>{r(a)&&b(f)})}var w=h(m,2),N=d(w);{var E=b=>{var A=s0(),B=de(A);mt(B,{size:12}),ye(),_(b,A)},I=b=>{var A=i0(),B=de(A);ja(B,{size:12}),ye(),_(b,A)};Y(N,b=>{r(n)?b(E):b(I,!1)})}c(w),c(p),c(v);var H=h(v,2),O=d(H);{var F=b=>{var A=l0(),B=d(A),K=d(B),Z=d(K,!0);c(K),c(B),c(A),$(()=>X(Z,r(a))),_(b,A)},M=b=>{var A=c0(),B=d(A);mt(B,{size:16}),ye(2),c(A),_(b,A)},R=b=>{var A=d0(),B=d(A);ja(B,{size:16}),ye(2),c(A),_(b,A)};Y(O,b=>{r(a)?b(F):r(n)?b(M,1):b(R,!1)})}c(H),c(u),$(()=>w.disabled=r(n)),be("click",w,i),_(t,u),Ce()}_t(["click"]);var f0=P('
    Loading usage data...
    '),p0=P('
    No usage data available. Run a pipeline to see metrics.
    '),h0=P('
    '),g0=P('
    By Model
    Model Requests Tokens Cost
    '),m0=P('
    '),_0=P('
    By Agent
    Agent Requests Tokens Cost
    '),y0=P('
    Total Requests
    Total Tokens
    Total Cost
    Avg Latency
    ',1),b0=P('
    Monitor
    ');function x0(t,e){ze(e,!0);let n=Q(!1),a=Q(null);async function o(){y(n,!0);try{y(a,await ot.monitoring.usage(),!0)}catch{y(a,null),Ue("Failed to load usage data","error")}finally{y(n,!1)}}function i(H){return H>=1e6?`${(H/1e6).toFixed(1)}M`:H>=1e3?`${(H/1e3).toFixed(1)}K`:H.toString()}function s(H){return`$${H.toFixed(4)}`}function l(H,O){return O===0?"0ms":`${Math.round(H/O)}ms`}_e(()=>{o()});var u=b0(),v=d(u),p=h(d(v),2),m=d(p);mt(m,{size:13}),c(p),c(v);var f=h(v,2),w=d(f);{var N=H=>{var O=f0(),F=d(O);mt(F,{size:16}),ye(2),c(O),_(H,O)},E=H=>{var O=p0(),F=d(O);Qs(F,{size:16}),ye(2),c(O),_(H,O)},I=H=>{var O=y0(),F=de(O),M=d(F),R=d(M),b=d(R);yc(b,{size:14}),c(R);var A=h(R,2),B=d(A),K=d(B,!0);c(B),ye(2),c(A),c(M);var Z=h(M,2),x=d(Z),S=d(x);tc(S,{size:14}),c(x);var z=h(x,2),g=d(z),C=d(g,!0);c(g),ye(2),c(z),c(Z);var T=h(Z,2),D=d(T),V=d(D);gc(V,{size:14}),c(D);var L=h(D,2),q=d(L),j=d(q,!0);c(q),ye(2),c(L),c(T);var U=h(T,2),W=d(U),J=d(W);go(J,{size:14}),c(W);var ae=h(W,2),re=d(ae),ie=d(re,!0);c(re),ye(2),c(ae),c(U),c(F);var ne=h(F,2),G=d(ne);{var oe=le=>{var he=g0(),ve=h(d(he),2),fe=h(d(ve),2);je(fe,17,()=>Object.entries(r(a).by_model),([ke,Ae])=>ke,(ke,Ae)=>{var ge=k(()=>dn(r(Ae),2));let Oe=()=>r(ge)[0],Ye=()=>r(ge)[1];var We=h0(),it=d(We),Ge=d(it,!0);c(it);var ct=h(it,2),Nt=d(ct,!0);c(ct);var gt=h(ct,2),dt=d(gt,!0);c(gt);var xt=h(gt,2),Pe=d(xt,!0);c(xt),c(We),$((pn,wn,hn)=>{X(Ge,Oe()),X(Nt,pn),X(dt,wn),X(Pe,hn)},[()=>i(Ye().requests),()=>i(Ye().total_tokens),()=>s(Ye().cost_usd)]),_(ke,We)}),c(ve),c(he),_(le,he)},ee=k(()=>Object.keys(r(a).by_model).length>0);Y(G,le=>{r(ee)&&le(oe)})}var se=h(G,2);{var te=le=>{var he=_0(),ve=h(d(he),2),fe=h(d(ve),2);je(fe,17,()=>Object.entries(r(a).by_agent),([ke,Ae])=>ke,(ke,Ae)=>{var ge=k(()=>dn(r(Ae),2));let Oe=()=>r(ge)[0],Ye=()=>r(ge)[1];var We=m0(),it=d(We),Ge=d(it,!0);c(it);var ct=h(it,2),Nt=d(ct,!0);c(ct);var gt=h(ct,2),dt=d(gt,!0);c(gt);var xt=h(gt,2),Pe=d(xt,!0);c(xt),c(We),$((pn,wn,hn)=>{X(Ge,Oe()),X(Nt,pn),X(dt,wn),X(Pe,hn)},[()=>i(Ye().requests),()=>i(Ye().total_tokens),()=>s(Ye().cost_usd)]),_(ke,We)}),c(ve),c(he),_(le,he)},ue=k(()=>Object.keys(r(a).by_agent).length>0);Y(se,le=>{r(ue)&&le(te)})}c(ne),$((le,he,ve,fe)=>{X(K,le),X(C,he),X(j,ve),X(ie,fe)},[()=>i(r(a).total_requests),()=>i(r(a).total_tokens),()=>s(r(a).total_cost_usd),()=>l(r(a).total_latency_ms,r(a).total_requests)]),_(H,O)};Y(w,H=>{r(n)&&!r(a)?H(N):r(a)?H(I,!1):H(E,1)})}c(f),c(u),$(()=>p.disabled=r(n)),be("click",p,o),_(t,u),Ce()}_t(["click"]);var w0=P(' ',1),k0=P('Files'),S0=P('
    Loading file...
    '),z0=P('
     
    '),C0=P('
    Loading files...
    '),E0=P('
    No files in this project.
    '),N0=P('
    '),M0=P(" "),P0=P(''),T0=P('
    '),I0=P('
    ');function A0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(null),u=Q(""),v=Q(!1);async function p(){const z=n();if(z){y(i,!0);try{y(s,await ot.files.list(z.name),!0)}catch{y(s,[],!0)}finally{y(i,!1)}}}async function m(z){const g=n();if(g){y(v,!0),y(l,z,!0);try{const C=await ot.files.read(g.name,z);y(u,C.content,!0)}catch{y(u,"// Failed to load file content")}finally{y(v,!1)}}}function f(){y(l,null),y(u,"")}function w(z){const g=z.split(".");return g.length>1?g[g.length-1]:""}function N(z){switch(w(z)){case"py":return"ext-python";case"ts":case"js":return"ext-js";case"json":return"ext-json";case"yaml":case"yml":return"ext-yaml";case"md":return"ext-md";default:return""}}function E(z){return z<1024?`${z} B`:z<1024*1024?`${(z/1024).toFixed(1)} KB`:`${(z/(1024*1024)).toFixed(1)} MB`}_e(()=>{n()&&(y(l,null),y(u,""),p())});var I=I0(),H=d(I),O=d(H);{var F=z=>{var g=w0(),C=de(g),T=d(C);dc(T,{size:13}),c(C);var D=h(C,2),V=d(D,!0);c(D),$(()=>X(V,r(l))),be("click",C,f),_(z,g)},M=z=>{var g=k0();_(z,g)};Y(O,z=>{r(l)?z(F):z(M,!1)})}var R=h(O,2),b=d(R);mt(b,{size:13}),c(R),c(H);var A=h(H,2),B=d(A);{var K=z=>{var g=Me(),C=de(g);{var T=V=>{var L=S0(),q=d(L);mt(q,{size:16}),ye(2),c(L),_(V,L)},D=V=>{var L=z0(),q=d(L),j=d(q),U=d(j,!0);c(j),c(q),c(L),$(()=>X(U,r(u))),_(V,L)};Y(C,V=>{r(v)?V(T):V(D,!1)})}_(z,g)},Z=z=>{var g=C0(),C=d(g);mt(C,{size:16}),ye(2),c(g),_(z,g)},x=z=>{var g=E0(),C=d(g);Js(C,{size:16}),ye(2),c(g),_(z,g)},S=z=>{var g=T0();je(g,21,()=>r(s),C=>C.path,(C,T)=>{var D=Me(),V=de(D);{var L=j=>{var U=N0(),W=d(U);mc(W,{size:13});var J=h(W,2),ae=d(J,!0);c(J),c(U),$(()=>X(ae,r(T).name)),_(j,U)},q=j=>{var U=P0(),W=d(U);nc(W,{size:13});var J=h(W,2),ae=d(J,!0);c(J);var re=h(J,2);{var ie=se=>{var te=M0(),ue=d(te,!0);c(te),$((le,he)=>{De(te,1,`file-ext ${le??""}`,"svelte-tctccr"),X(ue,he)},[()=>N(r(T).name),()=>w(r(T).name)]),_(se,te)},ne=k(()=>w(r(T).name));Y(re,se=>{r(ne)&&se(ie)})}var G=h(re,2),oe=d(G,!0);c(G);var ee=h(G,2);Xr(ee,{size:11}),c(U),$(se=>{X(ae,r(T).name),X(oe,se)},[()=>E(r(T).size)]),be("click",U,()=>m(r(T).path)),_(j,U)};Y(V,j=>{r(T).is_dir?j(L):j(q,!1)})}_(C,D)}),c(g),_(z,g)};Y(B,z=>{r(l)?z(K):r(i)?z(Z,1):r(s).length===0?z(x,2):z(S,!1)})}c(A),c(I),be("click",R,p),_(t,I),Ce(),o()}_t(["click"]);var D0=P(' '),O0=P(" Analyzing...",1),R0=P(" Analyze",1),L0=P('

    No insights yet

    Click "Analyze" to review your pipeline, or insights will appear automatically as you build.

    '),H0=P('

    '),V0=P('
    '),F0=P('
    Sent to Architect
    '),B0=P('
    Skipped
    '),q0=P('
    '),K0=P(`
    Oracle's Insights
    `);function j0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",s),a=()=>at(Zs,"$oracleInsights",s),o=()=>at(Yl,"$oracleConnected",s),i=()=>at(Xl,"$oracleAnalyzing",s),[s,l]=Ot(),u={info:{icon:Ws,color:"#3b82f6",label:"Info"},warning:{icon:rc,color:"#f59e0b",label:"Warning"},suggestion:{icon:xc,color:"#8b5cf6",label:"Suggestion"},critical:{icon:Rt,color:"#ef4444",label:"Critical"}};function v(g){return u[g]??u.info}function p(g){if(!g)return"";try{return new Date(g).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}catch{return""}}let m=Q(null);function f(g){y(m,r(m)===g?null:g,!0)}async function w(g){const C=n();if(!C)return;const T=await Gl(C.name,g.id);T&&window.dispatchEvent(new CustomEvent("oracle-approved",{detail:{instruction:T}}))}async function N(g){const C=n();C&&await Ul(C.name,g.id)}let E=k(()=>a().filter(g=>g.status==="pending").length);var I=K0(),H=d(I),O=d(H),F=d(O);Wr(F,{size:14});var M=h(F,4);{var R=g=>{var C=D0(),T=d(C,!0);c(C),$(()=>X(T,r(E))),_(g,C)};Y(M,g=>{r(E)>0&&g(R)})}c(O);var b=h(O,2),A=d(b);{var B=g=>{var C=O0(),T=de(C);Wl(T,{size:12,class:"oracle-spinner"}),ye(2),_(g,C)},K=g=>{var C=R0(),T=de(C);zc(T,{size:12}),ye(2),_(g,C)};Y(A,g=>{i()?g(B):g(K,!1)})}c(b),c(H);var Z=h(H,2),x=d(Z);{var S=g=>{var C=L0(),T=d(C);Wr(T,{size:24}),ye(4),c(C),_(g,C)},z=g=>{var C=Me(),T=de(C);je(T,1,a,D=>D.id,(D,V)=>{const L=k(()=>v(r(V).severity)),q=k(()=>r(L).icon);var j=q0();let U;var W=d(j),J=d(W);let ae;var re=d(J);un(re,()=>r(q),(ve,fe)=>{fe(ve,{size:13})}),c(J);var ie=h(J,2),ne=d(ie,!0);c(ie);var G=h(ie,2),oe=d(G,!0);c(G),c(W);var ee=h(W,2);{var se=ve=>{var fe=H0(),ke=d(fe),Ae=d(ke,!0);c(ke),c(fe),$(()=>X(Ae,r(V).description)),_(ve,fe)};Y(ee,ve=>{r(m)===r(V).id&&ve(se)})}var te=h(ee,2);{var ue=ve=>{var fe=V0(),ke=d(fe),Ae=d(ke);ho(Ae,{size:11}),ye(2),c(ke);var ge=h(ke,2),Oe=d(ge);Ks(Oe,{size:11}),ye(2),c(ge),c(fe),be("click",ke,()=>w(r(V))),be("click",ge,()=>N(r(V))),_(ve,fe)},le=ve=>{var fe=F0();_(ve,fe)},he=ve=>{var fe=B0();_(ve,fe)};Y(te,ve=>{r(V).status==="pending"?ve(ue):r(V).status==="approved"?ve(le,1):ve(he,!1)})}c(j),$(ve=>{U=De(j,1,"insight-card svelte-b2w21g",null,U,{approved:r(V).status==="approved",skipped:r(V).status==="skipped"}),ae=st(J,"",ae,{color:r(L).color}),X(ne,r(V).title),X(oe,ve)},[()=>p(r(V).timestamp)]),be("click",W,()=>f(r(V).id)),be("keydown",W,ve=>ve.key==="Enter"&&f(r(V).id)),_(D,j)}),_(g,C)};Y(x,g=>{a().length===0?g(S):g(z,!1)})}c(Z),c(I),$(()=>b.disabled=!o()||i()),be("click",b,function(...g){Zl?.apply(this,g)}),_(t,I),Ce(),l()}_t(["click","keydown"]);var Z0=P('
    Loading executions...
    '),Y0=P('
    No executions yet. Start the runtime and trigger a pipeline to see results.
    '),X0=P('
    ID
    Status
    Duration
    '),W0=P('
    '),G0=P('
    Status Execution ID Duration
    '),U0=P('
    Executions
    ');function Q0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",o),a=()=>at(Za,"$bottomPanelTab",o),[o,i]=Ot();let s=Q(!1),l=Q($t([])),u=Q(null),v=k(()=>n()?.name??""),p=k(a);async function m(){if(r(v)){y(s,!0);try{const K=await ot.runtime.executions(r(v));y(l,K.executions??[],!0)}catch{y(l,[],!0),Ue("Failed to load executions","error")}finally{y(s,!1)}}}function f(K){y(u,r(u)===K?null:K,!0)}function w(K){return K==null?"--":K<1e3?`${K}ms`:`${(K/1e3).toFixed(2)}s`}function N(K){return K.length<=12?K:K.slice(0,8)+"..."}function E(K){switch(K.toLowerCase()){case"completed":case"success":return"var(--color-success)";case"running":case"in_progress":return"#f59e0b";case"failed":case"error":return"var(--color-error)";default:return"var(--color-text-secondary)"}}_e(()=>{r(p)==="executions"&&r(v)&&m()}),_e(()=>{if(r(p)!=="executions"||!r(v))return;const K=setInterval(m,1e4);return()=>clearInterval(K)});var I=U0(),H=d(I),O=h(d(H),2),F=d(O);mt(F,{size:13}),c(O),c(H);var M=h(H,2),R=d(M);{var b=K=>{var Z=Z0(),x=d(Z);mt(x,{size:16}),ye(2),c(Z),_(K,Z)},A=K=>{var Z=Y0(),x=d(Z);ei(x,{size:16}),ye(2),c(Z),_(K,Z)},B=K=>{var Z=G0(),x=h(d(Z),2);je(x,17,()=>r(l),S=>S.execution_id,(S,z)=>{var g=W0(),C=d(g),T=d(C),D=d(T);let V;c(T);var L=h(T,2),q=d(L),j=d(q,!0);c(q),c(L);var U=h(L,2),W=d(U),J=d(W,!0);c(W),c(U);var ae=h(U,2),re=d(ae);{var ie=ee=>{Yr(ee,{size:12})},ne=ee=>{Xr(ee,{size:12})};Y(re,ee=>{r(u)===r(z).execution_id?ee(ie):ee(ne,!1)})}c(ae),c(C);var G=h(C,2);{var oe=ee=>{var se=X0(),te=d(se),ue=h(d(te),2),le=d(ue,!0);c(ue),c(te);var he=h(te,2),ve=h(d(he),2);let fe;var ke=d(ve,!0);c(ve),c(he);var Ae=h(he,2),ge=h(d(Ae),2),Oe=d(ge,!0);c(ge),c(Ae),c(se),$((Ye,We)=>{X(le,r(z).execution_id),fe=st(ve,"",fe,Ye),X(ke,r(z).status),X(Oe,We)},[()=>({color:E(r(z).status)}),()=>w(r(z).duration_ms)]),_(ee,se)};Y(G,ee=>{r(u)===r(z).execution_id&&ee(oe)})}c(g),$((ee,se,te)=>{V=st(D,"",V,ee),xe(L,"title",r(z).execution_id),X(j,se),X(J,te)},[()=>({background:E(r(z).status)}),()=>N(r(z).execution_id),()=>w(r(z).duration_ms)]),be("click",C,()=>f(r(z).execution_id)),_(S,g)}),c(Z),_(K,Z)};Y(R,K=>{r(s)&&r(l).length===0?K(b):r(l).length===0?K(A,1):K(B,!1)})}c(M),c(I),$(()=>O.disabled=r(s)),be("click",O,m),_(t,I),Ce(),i()}_t(["click"]);var J0=P('
    '),$0=P(' '),ey=P(' '),ty=P(' '),ny=P(""),ry=P('
    '),ay=P('
    ');function oy(t,e){ze(e,!0);const n=()=>at(Ka,"$executionEvents",l),a=()=>at(En,"$checkpoints",l),o=()=>at(Zs,"$oracleInsights",l),i=()=>at(Ta,"$bottomPanelOpen",l),s=()=>at(Za,"$bottomPanelTab",l),[l,u]=Ot(),v=k(()=>n().filter(q=>q.type==="node_error").length),p=k(()=>a().length),m=k(()=>o().filter(q=>q.status==="pending").length),f=[{id:"console",label:"Console",icon:ac},{id:"code",label:"Code",icon:la},{id:"timeline",label:"Timeline",icon:go},{id:"integrations",label:"Integrate",icon:Ya},{id:"evaluate",label:"Evaluate",icon:Us},{id:"experiments",label:"Experiments",icon:dr},{id:"deploy",label:"Deploy",icon:ja},{id:"monitor",label:"Monitor",icon:Qs},{id:"files",label:"Files",icon:Js},{id:"history",label:"History",icon:bc},{id:"oracle",label:"Oracle",icon:Wr},{id:"executions",label:"Executions",icon:ei}];let w=Q(320),N=Q(!1),E=Q(0),I=Q(0);const H=120;function O(){Ta.update(q=>!q)}function F(q){Za.set(q),i()||Ta.set(!0)}function M(q){q.preventDefault(),y(N,!0),y(E,q.clientY,!0),y(I,r(w),!0),document.addEventListener("mousemove",R),document.addEventListener("mouseup",b)}function R(q){if(!r(N))return;const j=Math.floor(window.innerHeight*.6),U=r(E)-q.clientY,W=Math.max(H,Math.min(j,r(I)+U));y(w,W,!0)}function b(){y(N,!1),document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",b)}On(()=>{document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",b)});var A=ay();let B,K;var Z=d(A);{var x=q=>{var j=J0();be("mousedown",j,M),_(q,j)};Y(Z,q=>{i()&&q(x)})}var S=h(Z,2),z=d(S);je(z,21,()=>f,q=>q.id,(q,j)=>{const U=k(()=>r(j).icon);var W=ny();let J;var ae=d(W);un(ae,()=>r(U),(se,te)=>{te(se,{size:13})});var re=h(ae,2),ie=d(re,!0);c(re);var ne=h(re,2);{var G=se=>{var te=$0(),ue=d(te,!0);c(te),$(()=>X(ue,r(v)>99?"99+":r(v))),_(se,te)},oe=se=>{var te=ey(),ue=d(te,!0);c(te),$(()=>X(ue,r(p)>99?"99+":r(p))),_(se,te)},ee=se=>{var te=ty(),ue=d(te,!0);c(te),$(()=>X(ue,r(m)>99?"99+":r(m))),_(se,te)};Y(ne,se=>{r(j).id==="console"&&r(v)>0?se(G):r(j).id==="timeline"&&r(p)>0?se(oe,1):r(j).id==="oracle"&&r(m)>0&&se(ee,2)})}c(W),$(()=>{J=De(W,1,"tab-btn svelte-1m9rotx",null,J,{active:s()===r(j).id}),X(ie,r(j).label)}),be("click",W,()=>F(r(j).id)),_(q,W)}),c(z);var g=h(z,2),C=d(g);{var T=q=>{Yr(q,{size:14})},D=q=>{fc(q,{size:14})};Y(C,q=>{i()?q(T):q(D,!1)})}c(g),c(S);var V=h(S,2);{var L=q=>{var j=ry(),U=d(j);{var W=le=>{V1(le,{})},J=le=>{X1(le,{})},ae=le=>{__(le,{})},re=le=>{R_(le,{})},ie=le=>{Y_(le,{})},ne=le=>{n0(le,{})},G=le=>{v0(le,{})},oe=le=>{x0(le,{})},ee=le=>{A0(le,{})},se=le=>{S_(le,{})},te=le=>{j0(le,{})},ue=le=>{Q0(le,{})};Y(U,le=>{s()==="console"?le(W):s()==="code"?le(J,1):s()==="timeline"?le(ae,2):s()==="integrations"?le(re,3):s()==="evaluate"?le(ie,4):s()==="experiments"?le(ne,5):s()==="deploy"?le(G,6):s()==="monitor"?le(oe,7):s()==="files"?le(ee,8):s()==="history"?le(se,9):s()==="oracle"?le(te,10):s()==="executions"&&le(ue,11)})}c(j),_(q,j)};Y(V,q=>{i()&&q(L)})}c(A),$(()=>{B=De(A,1,"bottom-panel svelte-1m9rotx",null,B,{dragging:r(N)}),K=st(A,"",K,{height:i()?`${r(w)}px`:"36px"}),xe(g,"title",i()?"Collapse panel":"Expand panel")}),be("click",g,O),_(t,A),Ce(),u()}_t(["mousedown","click"]);var sy=P('
    ');function gy(t,e){ze(e,!1),io(()=>oc()),On(()=>sc()),Ls();var n=sy(),a=d(n),o=d(a);zm(o,{});var i=h(o,2);I1(i,{}),c(a);var s=h(a,2);oy(s,{}),c(n),_(t,n),Ce()}export{gy as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/3.Cp-v9HuY.js b/studio-desktop/frontend-dist/_app/immutable/nodes/3.Cp-v9HuY.js deleted file mode 100644 index fbc9a30e..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/3.Cp-v9HuY.js +++ /dev/null @@ -1,4 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as Ls}from"../chunks/D7CioVkw.js";import{aA as Ml,b3 as Pl,bp as Tl,h as Il,c as Al,au as Dl,_ as Hs,Z as Vs,m as Qt,v as Ol,bq as Rl,g as Te,i as de,j as y,br as Ll,bs as so,bt as Fs,p as ze,u as Hl,f as Ce,B as d,C as c,A as P,t as r,a1 as tr,O as k,b8 as dn,z as $,D as h,F as W,M as ye,bu as Bs,l as _e,I as Q,L as _,b7 as ut,P as qs,bv as Vl,bw as qa,K as be,bj as jr,G as _t,bn as On,bx as St,bo as It,by as Fl,J as $t,N as Bl,o as io,a4 as Bn}from"../chunks/hL-aZVJ4.js";import{l as tt,s as We,p as pe,r as _n,i as Y,b as yn,a as Ot,d as Zo,m as Yo,c as at}from"../chunks/B_6VzoXV.js";import{I as nt,s as rt,K as bn,M as lo,N as ia,i as xe,a as De,O as Rn,q as st,e as je,B as Zr,D as co,J as mn,G as Mn,x as an,b as on,n as Ct,u as wt,Q as ql,R as Na,T as Kl,X as Ks,U as Ma,V as Pa,h as jl,z as Wo,c as ot,v as nr,w as js,F as Xo,P as Go,r as Zl,W as Zs,Y as Yl,Z as Wl,L as Xl,_ as Gl,$ as Ul}from"../chunks/BWWgRDE1.js";import{J as Dt,S as uo,B as cr,E as Kt,w as jt,u as Rt,K as Zt,W as Wn,G as dr,j as vo,k as la,l as fo,m as po,g as Ys,D as ca,T as Xn,h as Ws,M as Ql,L as Jl,I as Xs,N as Ka,C as ho,b as Gs,z as $l,O as En,o as go,a as Ue,c as Yr,y as Wr,P as ec,F as Us,R as ja,A as Qs,Z as tc,f as Js,H as nc,s as rc,n as ac,Q as oc,U as sc}from"../chunks/DWKiSLzw.js";import{c as un}from"../chunks/CFyDcTgg.js";import{A as Uo,F as ic}from"../chunks/DaNA2RYx.js";import{b as Za,a as Ta}from"../chunks/yhLnWQwL.js";const lc=[];function $s(t,e=!1,n=!1){return Hr(t,new Map,"",lc,null,n)}function Hr(t,e,n,a,o=null,i=!1){if(typeof t=="object"&&t!==null){var s=e.get(t);if(s!==void 0)return s;if(t instanceof Map)return new Map(t);if(t instanceof Set)return new Set(t);if(Ml(t)){var l=Array(t.length);e.set(t,l),o!==null&&e.set(o,l);for(var u=0;u{var n=e();for(var a in n){var o=n[a];o?t.style.setProperty(a,o):t.style.removeProperty(a)}})}function zt(t,e,n){Vs(()=>{var a=Qt(()=>e(t,n?.())||{});if(n&&a?.update){var o=!1,i={};Hs(()=>{var s=n();Ol(s),o&&Rl(i,s)&&(i=s,a.update(s))}),o=!0}if(a?.destroy)return()=>a.destroy()})}class mo{#e=new WeakMap;#t;#n;static entries=new WeakMap;constructor(e){this.#n=e}observe(e,n){var a=this.#e.get(e)||new Set;return a.add(n),this.#e.set(e,a),this.#r().observe(e,this.#n),()=>{var o=this.#e.get(e);o.delete(n),o.size===0&&(this.#e.delete(e),this.#t.unobserve(e))}}#r(){return this.#t??(this.#t=new ResizeObserver(e=>{for(var n of e){mo.entries.set(n.target,n);for(var a of this.#e.get(n.target)||[])a(n)}}))}}var dc=new mo({box:"border-box"});function Qo(t,e,n){var a=dc.observe(t,()=>n(t[e]));Vs(()=>(Qt(()=>n(t[e])),a))}function uc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m12 19-7-7 7-7"}],["path",{d:"M19 12H5"}]];nt(t,We({name:"arrow-left"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function vc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z"}],["path",{d:"m7 16.5-4.74-2.85"}],["path",{d:"m7 16.5 5-3"}],["path",{d:"M7 16.5v5.17"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z"}],["path",{d:"m17 16.5-5-3"}],["path",{d:"m17 16.5 4.74-2.85"}],["path",{d:"M17 16.5v5.17"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z"}],["path",{d:"M12 8 7.26 5.15"}],["path",{d:"m12 8 4.74-2.85"}],["path",{d:"M12 13.5V8"}]];nt(t,We({name:"boxes"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function fc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z"}],["path",{d:"M17 21v-2"}],["path",{d:"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10"}],["path",{d:"M21 21v-2"}],["path",{d:"M3 5V3"}],["path",{d:"M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z"}],["path",{d:"M7 5V3"}]];nt(t,We({name:"cable"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function pc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m18 15-6-6-6 6"}]];nt(t,We({name:"chevron-up"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function hc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335"}],["path",{d:"m9 11 3 3L22 4"}]];nt(t,We({name:"circle-check-big"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function gc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];nt(t,We({name:"circle-x"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function mc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["line",{x1:"12",x2:"12",y1:"2",y2:"22"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"}]];nt(t,We({name:"dollar-sign"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Xr(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"}],["circle",{cx:"12",cy:"12",r:"3"}]];nt(t,We({name:"eye"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Jo(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"12",cy:"12",r:"3"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12"}]];nt(t,We({name:"git-commit-horizontal"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function _c(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M13 6h3a2 2 0 0 1 2 2v7"}],["path",{d:"M11 18H8a2 2 0 0 1-2-2V9"}]];nt(t,We({name:"git-compare"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function yc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["line",{x1:"4",x2:"20",y1:"9",y2:"9"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21"}]];nt(t,We({name:"hash"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function bc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}],["path",{d:"M12 7v5l4 2"}]];nt(t,We({name:"history"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function xc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["path",{d:"M9 18h6"}],["path",{d:"M10 22h4"}]];nt(t,We({name:"lightbulb"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function ei(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M13 5h8"}],["path",{d:"M13 12h8"}],["path",{d:"M13 19h8"}],["path",{d:"m3 17 2 2 4-4"}],["path",{d:"m3 7 2 2 4-4"}]];nt(t,We({name:"list-checks"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function wc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m10 17 5-5-5-5"}],["path",{d:"M15 12H3"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"}]];nt(t,We({name:"log-in"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function kc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m16 17 5-5-5-5"}],["path",{d:"M21 12H9"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}]];nt(t,We({name:"log-out"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Ya(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M12 22v-5"}],["path",{d:"M15 8V2"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z"}],["path",{d:"M9 8V2"}]];nt(t,We({name:"plug"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function mt(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];nt(t,We({name:"refresh-cw"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Sc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];nt(t,We({name:"rotate-ccw"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function zc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2"}]];nt(t,We({name:"scan"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Cc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z"}],["path",{d:"M3 20V4"}]];nt(t,We({name:"skip-back"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Ec(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M10 5H3"}],["path",{d:"M12 19H3"}],["path",{d:"M14 3v4"}],["path",{d:"M16 17v4"}],["path",{d:"M21 12h-9"}],["path",{d:"M21 19h-5"}],["path",{d:"M21 5h-7"}],["path",{d:"M8 10v4"}],["path",{d:"M8 12H3"}]];nt(t,We({name:"sliders-horizontal"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Nc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"}]];nt(t,We({name:"star"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Mc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M12 3v12"}],["path",{d:"m17 8-5-5-5 5"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}]];nt(t,We({name:"upload"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}function Pc(t,e){const n=tt(e,["children","$$slots","$$events","$$legacy"]);const a=[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2"}]];nt(t,We({name:"workflow"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Te(),l=de(s);rt(l,e,"default",{}),y(o,s)},$$slots:{default:!0}}))}var Tc={value:()=>{}};function da(){for(var t=0,e=arguments.length,n={},a;t=0&&(a=n.slice(o+1),n=n.slice(0,o)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:a}})}Vr.prototype=da.prototype={constructor:Vr,on:function(t,e){var n=this._,a=Ic(t+"",n),o,i=-1,s=a.length;if(arguments.length<2){for(;++i0)for(var n=new Array(o),a=0,o,i;a=0&&(e=t.slice(0,n))!=="xmlns"&&(t=t.slice(n+1)),es.hasOwnProperty(e)?{space:es[e],local:t}:t}function Dc(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===Wa&&e.documentElement.namespaceURI===Wa?e.createElement(t):e.createElementNS(n,t)}}function Oc(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function ti(t){var e=ua(t);return(e.local?Oc:Dc)(e)}function Rc(){}function _o(t){return t==null?Rc:function(){return this.querySelector(t)}}function Lc(t){typeof t!="function"&&(t=_o(t));for(var e=this._groups,n=e.length,a=new Array(n),o=0;o=F&&(F=O+1);!(R=I[F])&&++F=0;)(s=a[o])&&(i&&s.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(s,i),i=s);return this}function ld(t){t||(t=cd);function e(m,f){return m&&f?t(m.__data__,f.__data__):!m-!f}for(var n=this._groups,a=n.length,o=new Array(a),i=0;ie?1:t>=e?0:NaN}function dd(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function ud(){return Array.from(this)}function vd(){for(var t=this._groups,e=0,n=t.length;e1?this.each((e==null?kd:typeof e=="function"?zd:Sd)(t,e,n??"")):Gn(this.node(),t)}function Gn(t,e){return t.style.getPropertyValue(e)||si(t).getComputedStyle(t,null).getPropertyValue(e)}function Ed(t){return function(){delete this[t]}}function Nd(t,e){return function(){this[t]=e}}function Md(t,e){return function(){var n=e.apply(this,arguments);n==null?delete this[t]:this[t]=n}}function Pd(t,e){return arguments.length>1?this.each((e==null?Ed:typeof e=="function"?Md:Nd)(t,e)):this.node()[t]}function ii(t){return t.trim().split(/^|\s+/)}function yo(t){return t.classList||new li(t)}function li(t){this._node=t,this._names=ii(t.getAttribute("class")||"")}li.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function ci(t,e){for(var n=yo(t),a=-1,o=e.length;++a=0&&(n=e.slice(a+1),e=e.slice(0,a)),{type:e,name:n}})}function au(t){return function(){var e=this.__on;if(e){for(var n=0,a=-1,o=e.length,i;n()=>t;function Xa(t,{sourceEvent:e,subject:n,target:a,identifier:o,active:i,x:s,y:l,dx:u,dy:v,dispatch:p}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:a,enumerable:!0,configurable:!0},identifier:{value:o,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:u,enumerable:!0,configurable:!0},dy:{value:v,enumerable:!0,configurable:!0},_:{value:p}})}Xa.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function pu(t){return!t.ctrlKey&&!t.button}function hu(){return this.parentNode}function gu(t,e){return e??{x:t.x,y:t.y}}function mu(){return navigator.maxTouchPoints||"ontouchstart"in this}function _u(){var t=pu,e=hu,n=gu,a=mu,o={},i=da("start","drag","end"),s=0,l,u,v,p,m=0;function f(M){M.on("mousedown.drag",w).filter(a).on("touchstart.drag",I).on("touchmove.drag",H,fu).on("touchend.drag touchcancel.drag",O).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function w(M,R){if(!(p||!t.call(this,M,R))){var b=F(this,e.call(this,M,R),M,R,"mouse");b&&(At(M.view).on("mousemove.drag",N,ur).on("mouseup.drag",E,ur),fi(M.view),Ia(M),v=!1,l=M.clientX,u=M.clientY,b("start",M))}}function N(M){if(jn(M),!v){var R=M.clientX-l,b=M.clientY-u;v=R*R+b*b>m}o.mouse("drag",M)}function E(M){At(M.view).on("mousemove.drag mouseup.drag",null),pi(M.view,v),jn(M),o.mouse("end",M)}function I(M,R){if(t.call(this,M,R)){var b=M.changedTouches,A=e.call(this,M,R),B=b.length,K,Z;for(K=0;K>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?Ir(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?Ir(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=bu.exec(t))?new Et(e[1],e[2],e[3],1):(e=xu.exec(t))?new Et(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=wu.exec(t))?Ir(e[1],e[2],e[3],e[4]):(e=ku.exec(t))?Ir(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=Su.exec(t))?is(e[1],e[2]/100,e[3]/100,1):(e=zu.exec(t))?is(e[1],e[2]/100,e[3]/100,e[4]):ts.hasOwnProperty(t)?as(ts[t]):t==="transparent"?new Et(NaN,NaN,NaN,0):null}function as(t){return new Et(t>>16&255,t>>8&255,t&255,1)}function Ir(t,e,n,a){return a<=0&&(t=e=n=NaN),new Et(t,e,n,a)}function Nu(t){return t instanceof yr||(t=Tn(t)),t?(t=t.rgb(),new Et(t.r,t.g,t.b,t.opacity)):new Et}function Ga(t,e,n,a){return arguments.length===1?Nu(t):new Et(t,e,n,a??1)}function Et(t,e,n,a){this.r=+t,this.g=+e,this.b=+n,this.opacity=+a}bo(Et,Ga,hi(yr,{brighter(t){return t=t==null?Ur:Math.pow(Ur,t),new Et(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?vr:Math.pow(vr,t),new Et(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Et(Pn(this.r),Pn(this.g),Pn(this.b),Qr(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:os,formatHex:os,formatHex8:Mu,formatRgb:ss,toString:ss}));function os(){return`#${Nn(this.r)}${Nn(this.g)}${Nn(this.b)}`}function Mu(){return`#${Nn(this.r)}${Nn(this.g)}${Nn(this.b)}${Nn((isNaN(this.opacity)?1:this.opacity)*255)}`}function ss(){const t=Qr(this.opacity);return`${t===1?"rgb(":"rgba("}${Pn(this.r)}, ${Pn(this.g)}, ${Pn(this.b)}${t===1?")":`, ${t})`}`}function Qr(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Pn(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Nn(t){return t=Pn(t),(t<16?"0":"")+t.toString(16)}function is(t,e,n,a){return a<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Bt(t,e,n,a)}function gi(t){if(t instanceof Bt)return new Bt(t.h,t.s,t.l,t.opacity);if(t instanceof yr||(t=Tn(t)),!t)return new Bt;if(t instanceof Bt)return t;t=t.rgb();var e=t.r/255,n=t.g/255,a=t.b/255,o=Math.min(e,n,a),i=Math.max(e,n,a),s=NaN,l=i-o,u=(i+o)/2;return l?(e===i?s=(n-a)/l+(n0&&u<1?0:s,new Bt(s,l,u,t.opacity)}function Pu(t,e,n,a){return arguments.length===1?gi(t):new Bt(t,e,n,a??1)}function Bt(t,e,n,a){this.h=+t,this.s=+e,this.l=+n,this.opacity=+a}bo(Bt,Pu,hi(yr,{brighter(t){return t=t==null?Ur:Math.pow(Ur,t),new Bt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?vr:Math.pow(vr,t),new Bt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,a=n+(n<.5?n:1-n)*e,o=2*n-a;return new Et(Aa(t>=240?t-240:t+120,o,a),Aa(t,o,a),Aa(t<120?t+240:t-120,o,a),this.opacity)},clamp(){return new Bt(ls(this.h),Ar(this.s),Ar(this.l),Qr(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Qr(this.opacity);return`${t===1?"hsl(":"hsla("}${ls(this.h)}, ${Ar(this.s)*100}%, ${Ar(this.l)*100}%${t===1?")":`, ${t})`}`}}));function ls(t){return t=(t||0)%360,t<0?t+360:t}function Ar(t){return Math.max(0,Math.min(1,t||0))}function Aa(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}const xo=t=>()=>t;function Tu(t,e){return function(n){return t+n*e}}function Iu(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(a){return Math.pow(t+a*e,n)}}function Au(t){return(t=+t)==1?mi:function(e,n){return n-e?Iu(e,n,t):xo(isNaN(e)?n:e)}}function mi(t,e){var n=e-t;return n?Tu(t,n):xo(isNaN(t)?e:t)}const Jr=(function t(e){var n=Au(e);function a(o,i){var s=n((o=Ga(o)).r,(i=Ga(i)).r),l=n(o.g,i.g),u=n(o.b,i.b),v=mi(o.opacity,i.opacity);return function(p){return o.r=s(p),o.g=l(p),o.b=u(p),o.opacity=v(p),o+""}}return a.gamma=t,a})(1);function Du(t,e){e||(e=[]);var n=t?Math.min(e.length,t.length):0,a=e.slice(),o;return function(i){for(o=0;on&&(i=e.slice(n,i),l[s]?l[s]+=i:l[++s]=i),(a=a[0])===(o=o[0])?l[s]?l[s]+=o:l[++s]=o:(l[++s]=null,u.push({i:s,x:Ut(a,o)})),n=Da.lastIndex;return n180?p+=360:p-v>180&&(v+=360),f.push({i:m.push(o(m)+"rotate(",null,a)-2,x:Ut(v,p)})):p&&m.push(o(m)+"rotate("+p+a)}function l(v,p,m,f){v!==p?f.push({i:m.push(o(m)+"skewX(",null,a)-2,x:Ut(v,p)}):p&&m.push(o(m)+"skewX("+p+a)}function u(v,p,m,f,w,N){if(v!==m||p!==f){var E=w.push(o(w)+"scale(",null,",",null,")");N.push({i:E-4,x:Ut(v,m)},{i:E-2,x:Ut(p,f)})}else(m!==1||f!==1)&&w.push(o(w)+"scale("+m+","+f+")")}return function(v,p){var m=[],f=[];return v=t(v),p=t(p),i(v.translateX,v.translateY,p.translateX,p.translateY,m,f),s(v.rotate,p.rotate,m,f),l(v.skewX,p.skewX,m,f),u(v.scaleX,v.scaleY,p.scaleX,p.scaleY,m,f),v=p=null,function(w){for(var N=-1,E=f.length,I;++N=0&&t._call.call(void 0,e),t=t._next;--Un}function us(){In=(ea=pr.now())+va,Un=sr=0;try{Gu()}finally{Un=0,Qu(),In=0}}function Uu(){var t=pr.now(),e=t-ea;e>xi&&(va-=e,ea=t)}function Qu(){for(var t,e=$r,n,a=1/0;e;)e._call?(a>e._time&&(a=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:$r=n);ir=t,Ja(a)}function Ja(t){if(!Un){sr&&(sr=clearTimeout(sr));var e=t-In;e>24?(t<1/0&&(sr=setTimeout(us,t-pr.now()-va)),ar&&(ar=clearInterval(ar))):(ar||(ea=pr.now(),ar=setInterval(Uu,xi)),Un=1,wi(us))}}function vs(t,e,n){var a=new ta;return e=e==null?0:+e,a.restart(o=>{a.stop(),t(o+e)},e,n),a}var Ju=da("start","end","cancel","interrupt"),$u=[],Si=0,fs=1,$a=2,Br=3,ps=4,eo=5,qr=6;function fa(t,e,n,a,o,i){var s=t.__transition;if(!s)t.__transition={};else if(n in s)return;ev(t,n,{name:e,index:a,group:o,on:Ju,tween:$u,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Si})}function ko(t,e){var n=Yt(t,e);if(n.state>Si)throw new Error("too late; already scheduled");return n}function tn(t,e){var n=Yt(t,e);if(n.state>Br)throw new Error("too late; already running");return n}function Yt(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ev(t,e,n){var a=t.__transition,o;a[e]=n,n.timer=ki(i,0,n.time);function i(v){n.state=fs,n.timer.restart(s,n.delay,n.time),n.delay<=v&&s(v-n.delay)}function s(v){var p,m,f,w;if(n.state!==fs)return u();for(p in a)if(w=a[p],w.name===n.name){if(w.state===Br)return vs(s);w.state===ps?(w.state=qr,w.timer.stop(),w.on.call("interrupt",t,t.__data__,w.index,w.group),delete a[p]):+p$a&&a.state=0&&(e=e.slice(0,n)),!e||e==="start"})}function Pv(t,e,n){var a,o,i=Mv(e)?ko:tn;return function(){var s=i(this,t),l=s.on;l!==a&&(o=(a=l).copy()).on(e,n),s.on=o}}function Tv(t,e){var n=this._id;return arguments.length<2?Yt(this.node(),n).on.on(t):this.each(Pv(n,t,e))}function Iv(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}function Av(){return this.on("end.remove",Iv(this._id))}function Dv(t){var e=this._name,n=this._id;typeof t!="function"&&(t=_o(t));for(var a=this._groups,o=a.length,i=new Array(o),s=0;s()=>t;function of(t,{sourceEvent:e,target:n,transform:a,dispatch:o}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:a,enumerable:!0,configurable:!0},_:{value:o}})}function sn(t,e,n){this.k=t,this.x=e,this.y=n}sn.prototype={constructor:sn,scale:function(t){return t===1?this:new sn(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new sn(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var pa=new sn(1,0,0);Ni.prototype=sn.prototype;function Ni(t){for(;!t.__zoom;)if(!(t=t.parentNode))return pa;return t.__zoom}function Oa(t){t.stopImmediatePropagation()}function or(t){t.preventDefault(),t.stopImmediatePropagation()}function sf(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function lf(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function hs(){return this.__zoom||pa}function cf(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function df(){return navigator.maxTouchPoints||"ontouchstart"in this}function uf(t,e,n){var a=t.invertX(e[0][0])-n[0][0],o=t.invertX(e[1][0])-n[1][0],i=t.invertY(e[0][1])-n[0][1],s=t.invertY(e[1][1])-n[1][1];return t.translate(o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o),s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s))}function Mi(){var t=sf,e=lf,n=uf,a=cf,o=df,i=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],l=250,u=Fr,v=da("start","zoom","end"),p,m,f,w=500,N=150,E=0,I=10;function H(g){g.property("__zoom",hs).on("wheel.zoom",B,{passive:!1}).on("mousedown.zoom",K).on("dblclick.zoom",Z).filter(o).on("touchstart.zoom",x).on("touchmove.zoom",S).on("touchend.zoom touchcancel.zoom",z).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}H.transform=function(g,C,T,D){var V=g.selection?g.selection():g;V.property("__zoom",hs),g!==V?R(g,C,T,D):V.interrupt().each(function(){b(this,arguments).event(D).start().zoom(null,typeof C=="function"?C.apply(this,arguments):C).end()})},H.scaleBy=function(g,C,T,D){H.scaleTo(g,function(){var V=this.__zoom.k,L=typeof C=="function"?C.apply(this,arguments):C;return V*L},T,D)},H.scaleTo=function(g,C,T,D){H.transform(g,function(){var V=e.apply(this,arguments),L=this.__zoom,q=T==null?M(V):typeof T=="function"?T.apply(this,arguments):T,j=L.invert(q),U=typeof C=="function"?C.apply(this,arguments):C;return n(F(O(L,U),q,j),V,s)},T,D)},H.translateBy=function(g,C,T,D){H.transform(g,function(){return n(this.__zoom.translate(typeof C=="function"?C.apply(this,arguments):C,typeof T=="function"?T.apply(this,arguments):T),e.apply(this,arguments),s)},null,D)},H.translateTo=function(g,C,T,D,V){H.transform(g,function(){var L=e.apply(this,arguments),q=this.__zoom,j=D==null?M(L):typeof D=="function"?D.apply(this,arguments):D;return n(pa.translate(j[0],j[1]).scale(q.k).translate(typeof C=="function"?-C.apply(this,arguments):-C,typeof T=="function"?-T.apply(this,arguments):-T),L,s)},D,V)};function O(g,C){return C=Math.max(i[0],Math.min(i[1],C)),C===g.k?g:new sn(C,g.x,g.y)}function F(g,C,T){var D=C[0]-T[0]*g.k,V=C[1]-T[1]*g.k;return D===g.x&&V===g.y?g:new sn(g.k,D,V)}function M(g){return[(+g[0][0]+ +g[1][0])/2,(+g[0][1]+ +g[1][1])/2]}function R(g,C,T,D){g.on("start.zoom",function(){b(this,arguments).event(D).start()}).on("interrupt.zoom end.zoom",function(){b(this,arguments).event(D).end()}).tween("zoom",function(){var V=this,L=arguments,q=b(V,L).event(D),j=e.apply(V,L),U=T==null?M(j):typeof T=="function"?T.apply(V,L):T,X=Math.max(j[1][0]-j[0][0],j[1][1]-j[0][1]),J=V.__zoom,ae=typeof C=="function"?C.apply(V,L):C,re=u(J.invert(U).concat(X/J.k),ae.invert(U).concat(X/ae.k));return function(ie){if(ie===1)ie=ae;else{var ne=re(ie),G=X/ne[2];ie=new sn(G,U[0]-ne[0]*G,U[1]-ne[1]*G)}q.zoom(null,ie)}})}function b(g,C,T){return!T&&g.__zooming||new A(g,C)}function A(g,C){this.that=g,this.args=C,this.active=0,this.sourceEvent=null,this.extent=e.apply(g,C),this.taps=0}A.prototype={event:function(g){return g&&(this.sourceEvent=g),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(g,C){return this.mouse&&g!=="mouse"&&(this.mouse[1]=C.invert(this.mouse[0])),this.touch0&&g!=="touch"&&(this.touch0[1]=C.invert(this.touch0[0])),this.touch1&&g!=="touch"&&(this.touch1[1]=C.invert(this.touch1[0])),this.that.__zoom=C,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(g){var C=At(this.that).datum();v.call(g,this.that,new of(g,{sourceEvent:this.sourceEvent,target:H,transform:this.that.__zoom,dispatch:v}),C)}};function B(g,...C){if(!t.apply(this,arguments))return;var T=b(this,C).event(g),D=this.__zoom,V=Math.max(i[0],Math.min(i[1],D.k*Math.pow(2,a.apply(this,arguments)))),L=Ft(g);if(T.wheel)(T.mouse[0][0]!==L[0]||T.mouse[0][1]!==L[1])&&(T.mouse[1]=D.invert(T.mouse[0]=L)),clearTimeout(T.wheel);else{if(D.k===V)return;T.mouse=[L,D.invert(L)],Kr(this),T.start()}or(g),T.wheel=setTimeout(q,N),T.zoom("mouse",n(F(O(D,V),T.mouse[0],T.mouse[1]),T.extent,s));function q(){T.wheel=null,T.end()}}function K(g,...C){if(f||!t.apply(this,arguments))return;var T=g.currentTarget,D=b(this,C,!0).event(g),V=At(g.view).on("mousemove.zoom",U,!0).on("mouseup.zoom",X,!0),L=Ft(g,T),q=g.clientX,j=g.clientY;fi(g.view),Oa(g),D.mouse=[L,this.__zoom.invert(L)],Kr(this),D.start();function U(J){if(or(J),!D.moved){var ae=J.clientX-q,re=J.clientY-j;D.moved=ae*ae+re*re>E}D.event(J).zoom("mouse",n(F(D.that.__zoom,D.mouse[0]=Ft(J,T),D.mouse[1]),D.extent,s))}function X(J){V.on("mousemove.zoom mouseup.zoom",null),pi(J.view,D.moved),or(J),D.event(J).end()}}function Z(g,...C){if(t.apply(this,arguments)){var T=this.__zoom,D=Ft(g.changedTouches?g.changedTouches[0]:g,this),V=T.invert(D),L=T.k*(g.shiftKey?.5:2),q=n(F(O(T,L),D,V),e.apply(this,C),s);or(g),l>0?At(this).transition().duration(l).call(R,q,D,g):At(this).call(H.transform,q,D,g)}}function x(g,...C){if(t.apply(this,arguments)){var T=g.touches,D=T.length,V=b(this,C,g.changedTouches.length===D).event(g),L,q,j,U;for(Oa(g),q=0;q"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:e,sourceHandle:n,targetHandle:a})=>`Couldn't create edge for ${t} handle id: "${t==="source"?n:a}", edge id: ${e}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},to=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Pi=["Enter"," ","Escape"],vf={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:e,y:n})=>`Moved selected node ${t}. New position, x: ${e}, y: ${n}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var Qn;(function(t){t.Strict="strict",t.Loose="loose"})(Qn||(Qn={}));var Yn;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(Yn||(Yn={}));var na;(function(t){t.Partial="partial",t.Full="full"})(na||(na={}));const no={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var gn;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(gn||(gn={}));var ra;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(ra||(ra={}));var we;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(we||(we={}));const gs={[we.Left]:we.Right,[we.Right]:we.Left,[we.Top]:we.Bottom,[we.Bottom]:we.Top};function ff(t,e){if(!t&&!e)return!0;if(!t||!e||t.size!==e.size)return!1;if(!t.size&&!e.size)return!0;for(const n of t.keys())if(!e.has(n))return!1;return!0}function ms(t,e,n){if(!n)return;const a=[];t.forEach((o,i)=>{e?.has(i)||a.push(o)}),a.length&&n(a)}function pf(t){return t===null?null:t?"valid":"invalid"}const Ti=t=>"id"in t&&"source"in t&&"target"in t,hf=t=>"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),zo=t=>"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),br=(t,e=[0,0])=>{const{width:n,height:a}=xn(t),o=t.origin??e,i=n*o[0],s=a*o[1];return{x:t.position.x-i,y:t.position.y-s}},gf=(t,e={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};const n=t.reduce((a,o)=>{const i=typeof o=="string";let s=!e.nodeLookup&&!i?o:void 0;e.nodeLookup&&(s=i?e.nodeLookup.get(o):zo(o)?o:e.nodeLookup.get(o.id));const l=s?aa(s,e.nodeOrigin):{x:0,y:0,x2:0,y2:0};return ha(a,l)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return ga(n)},xr=(t,e={})=>{let n={x:1/0,y:1/0,x2:-1/0,y2:-1/0},a=!1;return t.forEach(o=>{(e.filter===void 0||e.filter(o))&&(n=ha(n,aa(o)),a=!0)}),a?ga(n):{x:0,y:0,width:0,height:0}},Co=(t,e,[n,a,o]=[0,0,1],i=!1,s=!1)=>{const l={...kr(e,[n,a,o]),width:e.width/o,height:e.height/o},u=[];for(const v of t.values()){const{measured:p,selectable:m=!0,hidden:f=!1}=v;if(s&&!m||f)continue;const w=p.width??v.width??v.initialWidth??null,N=p.height??v.height??v.initialHeight??null,E=gr(l,$n(v)),I=(w??0)*(N??0),H=i&&E>0;(!v.internals.handleBounds||H||E>=I||v.dragging)&&u.push(v)}return u},mf=(t,e)=>{const n=new Set;return t.forEach(a=>{n.add(a.id)}),e.filter(a=>n.has(a.source)||n.has(a.target))};function _f(t,e){const n=new Map,a=e?.nodes?new Set(e.nodes.map(o=>o.id)):null;return t.forEach(o=>{o.measured.width&&o.measured.height&&(e?.includeHiddenNodes||!o.hidden)&&(!a||a.has(o.id))&&n.set(o.id,o)}),n}async function yf({nodes:t,width:e,height:n,panZoom:a,minZoom:o,maxZoom:i},s){if(t.size===0)return Promise.resolve(!0);const l=_f(t,s),u=xr(l),v=Eo(u,e,n,s?.minZoom??o,s?.maxZoom??i,s?.padding??.1);return await a.setViewport(v,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)}function Ii({nodeId:t,nextPosition:e,nodeLookup:n,nodeOrigin:a=[0,0],nodeExtent:o,onError:i}){const s=n.get(t),l=s.parentId?n.get(s.parentId):void 0,{x:u,y:v}=l?l.internals.positionAbsolute:{x:0,y:0},p=s.origin??a;let m=s.extent||o;if(s.extent==="parent"&&!s.expandParent)if(!l)i?.("005",hr.error005());else{const w=l.measured.width,N=l.measured.height;w&&N&&(m=[[u,v],[u+w,v+N]])}else l&&er(s.extent)&&(m=[[s.extent[0][0]+u,s.extent[0][1]+v],[s.extent[1][0]+u,s.extent[1][1]+v]]);const f=er(m)?An(e,m,s.measured):e;return(s.measured.width===void 0||s.measured.height===void 0)&&i?.("015",hr.error015()),{position:{x:f.x-u+(s.measured.width??0)*p[0],y:f.y-v+(s.measured.height??0)*p[1]},positionAbsolute:f}}async function bf({nodesToRemove:t=[],edgesToRemove:e=[],nodes:n,edges:a,onBeforeDelete:o}){const i=new Set(t.map(f=>f.id)),s=[];for(const f of n){if(f.deletable===!1)continue;const w=i.has(f.id),N=!w&&f.parentId&&s.find(E=>E.id===f.parentId);(w||N)&&s.push(f)}const l=new Set(e.map(f=>f.id)),u=a.filter(f=>f.deletable!==!1),p=mf(s,u);for(const f of u)l.has(f.id)&&!p.find(N=>N.id===f.id)&&p.push(f);if(!o)return{edges:p,nodes:s};const m=await o({nodes:s,edges:p});return typeof m=="boolean"?m?{edges:p,nodes:s}:{edges:[],nodes:[]}:m}const Jn=(t,e=0,n=1)=>Math.min(Math.max(t,e),n),An=(t={x:0,y:0},e,n)=>({x:Jn(t.x,e[0][0],e[1][0]-(n?.width??0)),y:Jn(t.y,e[0][1],e[1][1]-(n?.height??0))});function Ai(t,e,n){const{width:a,height:o}=xn(n),{x:i,y:s}=n.internals.positionAbsolute;return An(t,[[i,s],[i+a,s+o]],e)}const _s=(t,e,n)=>tn?-Jn(Math.abs(t-n),1,e)/e:0,Di=(t,e,n=15,a=40)=>{const o=_s(t.x,a,e.width-a)*n,i=_s(t.y,a,e.height-a)*n;return[o,i]},ha=(t,e)=>({x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}),ro=({x:t,y:e,width:n,height:a})=>({x:t,y:e,x2:t+n,y2:e+a}),ga=({x:t,y:e,x2:n,y2:a})=>({x:t,y:e,width:n-t,height:a-e}),$n=(t,e=[0,0])=>{const{x:n,y:a}=zo(t)?t.internals.positionAbsolute:br(t,e);return{x:n,y:a,width:t.measured?.width??t.width??t.initialWidth??0,height:t.measured?.height??t.height??t.initialHeight??0}},aa=(t,e=[0,0])=>{const{x:n,y:a}=zo(t)?t.internals.positionAbsolute:br(t,e);return{x:n,y:a,x2:n+(t.measured?.width??t.width??t.initialWidth??0),y2:a+(t.measured?.height??t.height??t.initialHeight??0)}},Oi=(t,e)=>ga(ha(ro(t),ro(e))),gr=(t,e)=>{const n=Math.max(0,Math.min(t.x+t.width,e.x+e.width)-Math.max(t.x,e.x)),a=Math.max(0,Math.min(t.y+t.height,e.y+e.height)-Math.max(t.y,e.y));return Math.ceil(n*a)},ys=t=>ln(t.width)&&ln(t.height)&&ln(t.x)&&ln(t.y),ln=t=>!isNaN(t)&&isFinite(t),xf=(t,e)=>{},wr=(t,e=[1,1])=>({x:e[0]*Math.round(t.x/e[0]),y:e[1]*Math.round(t.y/e[1])}),kr=({x:t,y:e},[n,a,o],i=!1,s=[1,1])=>{const l={x:(t-n)/o,y:(e-a)/o};return i?wr(l,s):l},oa=({x:t,y:e},[n,a,o])=>({x:t*o+n,y:e*o+a});function qn(t,e){if(typeof t=="number")return Math.floor((e-e/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const n=parseFloat(t);if(!Number.isNaN(n))return Math.floor(n)}if(typeof t=="string"&&t.endsWith("%")){const n=parseFloat(t);if(!Number.isNaN(n))return Math.floor(e*n*.01)}return console.error(`[React Flow] The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function wf(t,e,n){if(typeof t=="string"||typeof t=="number"){const a=qn(t,n),o=qn(t,e);return{top:a,right:o,bottom:a,left:o,x:o*2,y:a*2}}if(typeof t=="object"){const a=qn(t.top??t.y??0,n),o=qn(t.bottom??t.y??0,n),i=qn(t.left??t.x??0,e),s=qn(t.right??t.x??0,e);return{top:a,right:s,bottom:o,left:i,x:i+s,y:a+o}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function kf(t,e,n,a,o,i){const{x:s,y:l}=oa(t,[e,n,a]),{x:u,y:v}=oa({x:t.x+t.width,y:t.y+t.height},[e,n,a]),p=o-u,m=i-v;return{left:Math.floor(s),top:Math.floor(l),right:Math.floor(p),bottom:Math.floor(m)}}const Eo=(t,e,n,a,o,i)=>{const s=wf(i,e,n),l=(e-s.x)/t.width,u=(n-s.y)/t.height,v=Math.min(l,u),p=Jn(v,a,o),m=t.x+t.width/2,f=t.y+t.height/2,w=e/2-m*p,N=n/2-f*p,E=kf(t,w,N,p,e,n),I={left:Math.min(E.left-s.left,0),top:Math.min(E.top-s.top,0),right:Math.min(E.right-s.right,0),bottom:Math.min(E.bottom-s.bottom,0)};return{x:w-I.left+I.right,y:N-I.top+I.bottom,zoom:p}},mr=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function er(t){return t!=null&&t!=="parent"}function xn(t){return{width:t.measured?.width??t.width??t.initialWidth??0,height:t.measured?.height??t.height??t.initialHeight??0}}function Ri(t){return(t.measured?.width??t.width??t.initialWidth)!==void 0&&(t.measured?.height??t.height??t.initialHeight)!==void 0}function Sf(t,e={width:0,height:0},n,a,o){const i={...t},s=a.get(n);if(s){const l=s.origin||o;i.x+=s.internals.positionAbsolute.x-(e.width??0)*l[0],i.y+=s.internals.positionAbsolute.y-(e.height??0)*l[1]}return i}function zf(t){return{...vf,...t||{}}}function Ra(t,{snapGrid:e=[0,0],snapToGrid:n=!1,transform:a,containerBounds:o}){const{x:i,y:s}=qt(t),l=kr({x:i-(o?.left??0),y:s-(o?.top??0)},a),{x:u,y:v}=n?wr(l,e):l;return{xSnapped:u,ySnapped:v,...l}}const Li=t=>({width:t.offsetWidth,height:t.offsetHeight}),Hi=t=>t?.getRootNode?.()||window?.document,Cf=["INPUT","SELECT","TEXTAREA"];function Vi(t){const e=t.composedPath?.()?.[0]||t.target;return e?.nodeType!==1?!1:Cf.includes(e.nodeName)||e.hasAttribute("contenteditable")||!!e.closest(".nokey")}const Fi=t=>"clientX"in t,qt=(t,e)=>{const n=Fi(t),a=n?t.clientX:t.touches?.[0].clientX,o=n?t.clientY:t.touches?.[0].clientY;return{x:a-(e?.left??0),y:o-(e?.top??0)}},bs=(t,e,n,a,o)=>{const i=e.querySelectorAll(`.${t}`);return!i||!i.length?null:Array.from(i).map(s=>{const l=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:t,nodeId:o,position:s.getAttribute("data-handlepos"),x:(l.left-n.left)/a,y:(l.top-n.top)/a,...Li(s)}})};function Ef({sourceX:t,sourceY:e,targetX:n,targetY:a,sourceControlX:o,sourceControlY:i,targetControlX:s,targetControlY:l}){const u=t*.125+o*.375+s*.375+n*.125,v=e*.125+i*.375+l*.375+a*.125,p=Math.abs(u-t),m=Math.abs(v-e);return[u,v,p,m]}function Rr(t,e){return t>=0?.5*t:e*25*Math.sqrt(-t)}function xs({pos:t,x1:e,y1:n,x2:a,y2:o,c:i}){switch(t){case we.Left:return[e-Rr(e-a,i),n];case we.Right:return[e+Rr(a-e,i),n];case we.Top:return[e,n-Rr(n-o,i)];case we.Bottom:return[e,n+Rr(o-n,i)]}}function Bi({sourceX:t,sourceY:e,sourcePosition:n=we.Bottom,targetX:a,targetY:o,targetPosition:i=we.Top,curvature:s=.25}){const[l,u]=xs({pos:n,x1:t,y1:e,x2:a,y2:o,c:s}),[v,p]=xs({pos:i,x1:a,y1:o,x2:t,y2:e,c:s}),[m,f,w,N]=Ef({sourceX:t,sourceY:e,targetX:a,targetY:o,sourceControlX:l,sourceControlY:u,targetControlX:v,targetControlY:p});return[`M${t},${e} C${l},${u} ${v},${p} ${a},${o}`,m,f,w,N]}function qi({sourceX:t,sourceY:e,targetX:n,targetY:a}){const o=Math.abs(n-t)/2,i=n0}const Pf=({source:t,sourceHandle:e,target:n,targetHandle:a})=>`xy-edge__${t}${e||""}-${n}${a||""}`,Tf=(t,e)=>e.some(n=>n.source===t.source&&n.target===t.target&&(n.sourceHandle===t.sourceHandle||!n.sourceHandle&&!t.sourceHandle)&&(n.targetHandle===t.targetHandle||!n.targetHandle&&!t.targetHandle)),If=(t,e,n={})=>{if(!t.source||!t.target)return e;const a=n.getEdgeId||Pf;let o;return Ti(t)?o={...t}:o={...t,id:a(t)},Tf(o,e)?e:(o.sourceHandle===null&&delete o.sourceHandle,o.targetHandle===null&&delete o.targetHandle,e.concat(o))};function Ki({sourceX:t,sourceY:e,targetX:n,targetY:a}){const[o,i,s,l]=qi({sourceX:t,sourceY:e,targetX:n,targetY:a});return[`M ${t},${e}L ${n},${a}`,o,i,s,l]}const ws={[we.Left]:{x:-1,y:0},[we.Right]:{x:1,y:0},[we.Top]:{x:0,y:-1},[we.Bottom]:{x:0,y:1}},Af=({source:t,sourcePosition:e=we.Bottom,target:n})=>e===we.Left||e===we.Right?t.xMath.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function Df({source:t,sourcePosition:e=we.Bottom,target:n,targetPosition:a=we.Top,center:o,offset:i,stepPosition:s}){const l=ws[e],u=ws[a],v={x:t.x+l.x*i,y:t.y+l.y*i},p={x:n.x+u.x*i,y:n.y+u.y*i},m=Af({source:v,sourcePosition:e,target:p}),f=m.x!==0?"x":"y",w=m[f];let N=[],E,I;const H={x:0,y:0},O={x:0,y:0},[,,F,M]=qi({sourceX:t.x,sourceY:t.y,targetX:n.x,targetY:n.y});if(l[f]*u[f]===-1){f==="x"?(E=o.x??v.x+(p.x-v.x)*s,I=o.y??(v.y+p.y)/2):(E=o.x??(v.x+p.x)/2,I=o.y??v.y+(p.y-v.y)*s);const b=[{x:E,y:v.y},{x:E,y:p.y}],A=[{x:v.x,y:I},{x:p.x,y:I}];l[f]===w?N=f==="x"?b:A:N=f==="x"?A:b}else{const b=[{x:v.x,y:p.y}],A=[{x:p.x,y:v.y}];if(f==="x"?N=l.x===w?A:b:N=l.y===w?b:A,e===a){const S=Math.abs(t[f]-n[f]);if(S<=i){const z=Math.min(i-1,i-S);l[f]===w?H[f]=(v[f]>t[f]?-1:1)*z:O[f]=(p[f]>n[f]?-1:1)*z}}if(e!==a){const S=f==="x"?"y":"x",z=l[f]===u[S],g=v[S]>p[S],C=v[S]=x?(E=(B.x+K.x)/2,I=N[0].y):(E=N[0].x,I=(B.y+K.y)/2)}return[[t,{x:v.x+H.x,y:v.y+H.y},...N,{x:p.x+O.x,y:p.y+O.y},n],E,I,F,M]}function Of(t,e,n,a){const o=Math.min(ks(t,e)/2,ks(e,n)/2,a),{x:i,y:s}=e;if(t.x===i&&i===n.x||t.y===s&&s===n.y)return`L${i} ${s}`;if(t.y===s){const v=t.x{let M="";return F>0&&Fn.id===e):t[0])||null}function ao(t,e){return t?typeof t=="string"?t:`${e?`${e}__`:""}${Object.keys(t).sort().map(a=>`${a}=${t[a]}`).join("&")}`:""}function Lf(t,{id:e,defaultColor:n,defaultMarkerStart:a,defaultMarkerEnd:o}){const i=new Set;return t.reduce((s,l)=>([l.markerStart||a,l.markerEnd||o].forEach(u=>{if(u&&typeof u=="object"){const v=ao(u,e);i.has(v)||(s.push({id:v,color:u.color||n,...u}),i.add(v))}}),s),[]).sort((s,l)=>s.id.localeCompare(l.id))}const ji=1e3,Hf=10,Mo={nodeOrigin:[0,0],nodeExtent:to,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},Vf={...Mo,checkEquality:!0};function Po(t,e){const n={...t};for(const a in e)e[a]!==void 0&&(n[a]=e[a]);return n}function Ff(t,e,n){const a=Po(Mo,n);for(const o of t.values())if(o.parentId)Io(o,t,e,a);else{const i=br(o,a.nodeOrigin),s=er(o.extent)?o.extent:a.nodeExtent,l=An(i,s,xn(o));o.internals.positionAbsolute=l}}function Bf(t,e){if(!t.handles)return t.measured?e?.internals.handleBounds:void 0;const n=[],a=[];for(const o of t.handles){const i={id:o.id,width:o.width??1,height:o.height??1,nodeId:t.id,x:o.x,y:o.y,position:o.position,type:o.type};o.type==="source"?n.push(i):o.type==="target"&&a.push(i)}return{source:n,target:a}}function To(t){return t==="manual"}function qf(t,e,n,a={}){const o=Po(Vf,a),i={i:0},s=new Map(e),l=o?.elevateNodesOnSelect&&!To(o.zIndexMode)?ji:0;let u=t.length>0;e.clear(),n.clear();for(const v of t){let p=s.get(v.id);if(o.checkEquality&&v===p?.internals.userNode)e.set(v.id,p);else{const m=br(v,o.nodeOrigin),f=er(v.extent)?v.extent:o.nodeExtent,w=An(m,f,xn(v));p={...o.defaults,...v,measured:{width:v.measured?.width,height:v.measured?.height},internals:{positionAbsolute:w,handleBounds:Bf(v,p),z:Zi(v,l,o.zIndexMode),userNode:v}},e.set(v.id,p)}(p.measured===void 0||p.measured.width===void 0||p.measured.height===void 0)&&!p.hidden&&(u=!1),v.parentId&&Io(p,e,n,a,i)}return u}function Kf(t,e){if(!t.parentId)return;const n=e.get(t.parentId);n?n.set(t.id,t):e.set(t.parentId,new Map([[t.id,t]]))}function Io(t,e,n,a,o){const{elevateNodesOnSelect:i,nodeOrigin:s,nodeExtent:l,zIndexMode:u}=Po(Mo,a),v=t.parentId,p=e.get(v);if(!p){console.warn(`Parent node ${v} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Kf(t,n),o&&!p.parentId&&p.internals.rootParentIndex===void 0&&u==="auto"&&(p.internals.rootParentIndex=++o.i,p.internals.z=p.internals.z+o.i*Hf),o&&p.internals.rootParentIndex!==void 0&&(o.i=p.internals.rootParentIndex);const m=i&&!To(u)?ji:0,{x:f,y:w,z:N}=jf(t,p,s,l,m,u),{positionAbsolute:E}=t.internals,I=f!==E.x||w!==E.y;(I||N!==t.internals.z)&&e.set(t.id,{...t,internals:{...t.internals,positionAbsolute:I?{x:f,y:w}:E,z:N}})}function Zi(t,e,n){const a=ln(t.zIndex)?t.zIndex:0;return To(n)?a:a+(t.selected?e:0)}function jf(t,e,n,a,o,i){const{x:s,y:l}=e.internals.positionAbsolute,u=xn(t),v=br(t,n),p=er(t.extent)?An(v,t.extent,u):v;let m=An({x:s+p.x,y:l+p.y},a,u);t.extent==="parent"&&(m=Ai(m,u,e));const f=Zi(t,o,i),w=e.internals.z??0;return{x:m.x,y:m.y,z:w>=f?w+1:f}}function Zf(t,e,n,a=[0,0]){const o=[],i=new Map;for(const s of t){const l=e.get(s.parentId);if(!l)continue;const u=i.get(s.parentId)?.expandedRect??$n(l),v=Oi(u,s.rect);i.set(s.parentId,{expandedRect:v,parent:l})}return i.size>0&&i.forEach(({expandedRect:s,parent:l},u)=>{const v=l.internals.positionAbsolute,p=xn(l),m=l.origin??a,f=s.x0||w>0||I||H)&&(o.push({id:u,type:"position",position:{x:l.position.x-f+I,y:l.position.y-w+H}}),n.get(u)?.forEach(O=>{t.some(F=>F.id===O.id)||o.push({id:O.id,type:"position",position:{x:O.position.x+f,y:O.position.y+w}})})),(p.width0){const w=Zf(f,e,n,o);v.push(...w)}return{changes:v,updatedInternals:u}}async function Wf({delta:t,panZoom:e,transform:n,translateExtent:a,width:o,height:i}){if(!e||!t.x&&!t.y)return Promise.resolve(!1);const s=await e.setViewportConstrained({x:n[0]+t.x,y:n[1]+t.y,zoom:n[2]},[[0,0],[o,i]],a),l=!!s&&(s.x!==n[0]||s.y!==n[1]||s.k!==n[2]);return Promise.resolve(l)}function Es(t,e,n,a,o,i){let s=o;const l=a.get(s)||new Map;a.set(s,l.set(n,e)),s=`${o}-${t}`;const u=a.get(s)||new Map;if(a.set(s,u.set(n,e)),i){s=`${o}-${t}-${i}`;const v=a.get(s)||new Map;a.set(s,v.set(n,e))}}function Xf(t,e,n){t.clear(),e.clear();for(const a of n){const{source:o,target:i,sourceHandle:s=null,targetHandle:l=null}=a,u={edgeId:a.id,source:o,target:i,sourceHandle:s,targetHandle:l},v=`${o}-${s}--${i}-${l}`,p=`${i}-${l}--${o}-${s}`;Es("source",u,p,t,o,s),Es("target",u,v,t,i,l),e.set(a.id,a)}}function Yi(t,e){if(!t.parentId)return!1;const n=e.get(t.parentId);return n?n.selected?!0:Yi(n,e):!1}function Ns(t,e,n){let a=t;do{if(a?.matches?.(e))return!0;if(a===n)return!1;a=a?.parentElement}while(a);return!1}function Gf(t,e,n,a){const o=new Map;for(const[i,s]of t)if((s.selected||s.id===a)&&(!s.parentId||!Yi(s,t))&&(s.draggable||e&&typeof s.draggable>"u")){const l=t.get(i);l&&o.set(i,{id:i,position:l.position||{x:0,y:0},distance:{x:n.x-l.internals.positionAbsolute.x,y:n.y-l.internals.positionAbsolute.y},extent:l.extent,parentId:l.parentId,origin:l.origin,expandParent:l.expandParent,internals:{positionAbsolute:l.internals.positionAbsolute||{x:0,y:0}},measured:{width:l.measured.width??0,height:l.measured.height??0}})}return o}function La({nodeId:t,dragItems:e,nodeLookup:n,dragging:a=!0}){const o=[];for(const[s,l]of e){const u=n.get(s)?.internals.userNode;u&&o.push({...u,position:l.position,dragging:a})}if(!t)return[o[0],o];const i=n.get(t)?.internals.userNode;return[i?{...i,position:e.get(t)?.position||i.position,dragging:a}:o[0],o]}function Uf({dragItems:t,snapGrid:e,x:n,y:a}){const o=t.values().next().value;if(!o)return null;const i={x:n-o.distance.x,y:a-o.distance.y},s=wr(i,e);return{x:s.x-i.x,y:s.y-i.y}}function Qf({onNodeMouseDown:t,getStoreItems:e,onDragStart:n,onDrag:a,onDragStop:o}){let i={x:null,y:null},s=0,l=new Map,u=!1,v={x:0,y:0},p=null,m=!1,f=null,w=!1,N=!1,E=null;function I({noDragClassName:O,handleSelector:F,domNode:M,isSelectable:R,nodeId:b,nodeClickDistance:A=0}){f=At(M);function B({x:S,y:z}){const{nodeLookup:g,nodeExtent:C,snapGrid:T,snapToGrid:D,nodeOrigin:V,onNodeDrag:L,onSelectionDrag:q,onError:j,updateNodePositions:U}=e();i={x:S,y:z};let X=!1;const J=l.size>1,ae=J&&C?ro(xr(l)):null,re=J&&D?Uf({dragItems:l,snapGrid:T,x:S,y:z}):null;for(const[ie,ne]of l){if(!g.has(ie))continue;let G={x:S-ne.distance.x,y:z-ne.distance.y};D&&(G=re?{x:Math.round(G.x+re.x),y:Math.round(G.y+re.y)}:wr(G,T));let oe=null;if(J&&C&&!ne.extent&&ae){const{positionAbsolute:te}=ne.internals,ue=te.x-ae.x+C[0][0],le=te.x+ne.measured.width-ae.x2+C[1][0],he=te.y-ae.y+C[0][1],ve=te.y+ne.measured.height-ae.y2+C[1][1];oe=[[ue,he],[le,ve]]}const{position:ee,positionAbsolute:se}=Ii({nodeId:ie,nextPosition:G,nodeLookup:g,nodeExtent:oe||C,nodeOrigin:V,onError:j});X=X||ne.position.x!==ee.x||ne.position.y!==ee.y,ne.position=ee,ne.internals.positionAbsolute=se}if(N=N||X,!!X&&(U(l,!0),E&&(a||L||!b&&q))){const[ie,ne]=La({nodeId:b,dragItems:l,nodeLookup:g});a?.(E,l,ie,ne),L?.(E,ie,ne),b||q?.(E,ne)}}async function K(){if(!p)return;const{transform:S,panBy:z,autoPanSpeed:g,autoPanOnNodeDrag:C}=e();if(!C){u=!1,cancelAnimationFrame(s);return}const[T,D]=Di(v,p,g);(T!==0||D!==0)&&(i.x=(i.x??0)-T/S[2],i.y=(i.y??0)-D/S[2],await z({x:T,y:D})&&B(i)),s=requestAnimationFrame(K)}function Z(S){const{nodeLookup:z,multiSelectionActive:g,nodesDraggable:C,transform:T,snapGrid:D,snapToGrid:V,selectNodesOnDrag:L,onNodeDragStart:q,onSelectionDragStart:j,unselectNodesAndEdges:U}=e();m=!0,(!L||!R)&&!g&&b&&(z.get(b)?.selected||U()),R&&L&&b&&t?.(b);const X=Ra(S.sourceEvent,{transform:T,snapGrid:D,snapToGrid:V,containerBounds:p});if(i=X,l=Gf(z,C,X,b),l.size>0&&(n||q||!b&&j)){const[J,ae]=La({nodeId:b,dragItems:l,nodeLookup:z});n?.(S.sourceEvent,l,J,ae),q?.(S.sourceEvent,J,ae),b||j?.(S.sourceEvent,ae)}}const x=_u().clickDistance(A).on("start",S=>{const{domNode:z,nodeDragThreshold:g,transform:C,snapGrid:T,snapToGrid:D}=e();p=z?.getBoundingClientRect()||null,w=!1,N=!1,E=S.sourceEvent,g===0&&Z(S),i=Ra(S.sourceEvent,{transform:C,snapGrid:T,snapToGrid:D,containerBounds:p}),v=qt(S.sourceEvent,p)}).on("drag",S=>{const{autoPanOnNodeDrag:z,transform:g,snapGrid:C,snapToGrid:T,nodeDragThreshold:D,nodeLookup:V}=e(),L=Ra(S.sourceEvent,{transform:g,snapGrid:C,snapToGrid:T,containerBounds:p});if(E=S.sourceEvent,(S.sourceEvent.type==="touchmove"&&S.sourceEvent.touches.length>1||b&&!V.has(b))&&(w=!0),!w){if(!u&&z&&m&&(u=!0,K()),!m){const q=qt(S.sourceEvent,p),j=q.x-v.x,U=q.y-v.y;Math.sqrt(j*j+U*U)>D&&Z(S)}(i.x!==L.xSnapped||i.y!==L.ySnapped)&&l&&m&&(v=qt(S.sourceEvent,p),B(L))}}).on("end",S=>{if(!(!m||w)&&(u=!1,m=!1,cancelAnimationFrame(s),l.size>0)){const{nodeLookup:z,updateNodePositions:g,onNodeDragStop:C,onSelectionDragStop:T}=e();if(N&&(g(l,!1),N=!1),o||C||!b&&T){const[D,V]=La({nodeId:b,dragItems:l,nodeLookup:z,dragging:!1});o?.(S.sourceEvent,l,D,V),C?.(S.sourceEvent,D,V),b||T?.(S.sourceEvent,V)}}}).filter(S=>{const z=S.target;return!S.button&&(!O||!Ns(z,`.${O}`,M))&&(!F||Ns(z,F,M))});f.call(x)}function H(){f?.on(".drag",null)}return{update:I,destroy:H}}function Jf(t,e,n){const a=[],o={x:t.x-n,y:t.y-n,width:n*2,height:n*2};for(const i of e.values())gr(o,$n(i))>0&&a.push(i);return a}const $f=250;function ep(t,e,n,a){let o=[],i=1/0;const s=Jf(t,n,e+$f);for(const l of s){const u=[...l.internals.handleBounds?.source??[],...l.internals.handleBounds?.target??[]];for(const v of u){if(a.nodeId===v.nodeId&&a.type===v.type&&a.id===v.id)continue;const{x:p,y:m}=Dn(l,v,v.position,!0),f=Math.sqrt(Math.pow(p-t.x,2)+Math.pow(m-t.y,2));f>e||(f1){const l=a.type==="source"?"target":"source";return o.find(u=>u.type===l)??o[0]}return o[0]}function Wi(t,e,n,a,o,i=!1){const s=a.get(t);if(!s)return null;const l=o==="strict"?s.internals.handleBounds?.[e]:[...s.internals.handleBounds?.source??[],...s.internals.handleBounds?.target??[]],u=(n?l?.find(v=>v.id===n):l?.[0])??null;return u&&i?{...u,...Dn(s,u,u.position,!0)}:u}function Xi(t,e){return t||(e?.classList.contains("target")?"target":e?.classList.contains("source")?"source":null)}function tp(t,e){let n=null;return e?n=!0:t&&!e&&(n=!1),n}const Gi=()=>!0;function np(t,{connectionMode:e,connectionRadius:n,handleId:a,nodeId:o,edgeUpdaterType:i,isTarget:s,domNode:l,nodeLookup:u,lib:v,autoPanOnConnect:p,flowId:m,panBy:f,cancelConnection:w,onConnectStart:N,onConnect:E,onConnectEnd:I,isValidConnection:H=Gi,onReconnectEnd:O,updateConnection:F,getTransform:M,getFromHandle:R,autoPanSpeed:b,dragThreshold:A=1,handleDomNode:B}){const K=Hi(t.target);let Z=0,x;const{x:S,y:z}=qt(t),g=Xi(i,B),C=l?.getBoundingClientRect();let T=!1;if(!C||!g)return;const D=Wi(o,g,a,u,e);if(!D)return;let V=qt(t,C),L=!1,q=null,j=!1,U=null;function X(){if(!p||!C)return;const[ee,se]=Di(V,C,b);f({x:ee,y:se}),Z=requestAnimationFrame(X)}const J={...D,nodeId:o,type:g,position:D.position},ae=u.get(o);let ie={inProgress:!0,isValid:null,from:Dn(ae,J,we.Left,!0),fromHandle:J,fromPosition:J.position,fromNode:ae,to:V,toHandle:null,toPosition:gs[J.position],toNode:null,pointer:V};function ne(){T=!0,F(ie),N?.(t,{nodeId:o,handleId:a,handleType:g})}A===0&&ne();function G(ee){if(!T){const{x:ve,y:fe}=qt(ee),ke=ve-S,Ae=fe-z;if(!(ke*ke+Ae*Ae>A*A))return;ne()}if(!R()||!J){oe(ee);return}const se=M();V=qt(ee,C),x=ep(kr(V,se,!1,[1,1]),n,u,J),L||(X(),L=!0);const te=Ui(ee,{handle:x,connectionMode:e,fromNodeId:o,fromHandleId:a,fromType:s?"target":"source",isValidConnection:H,doc:K,lib:v,flowId:m,nodeLookup:u});U=te.handleDomNode,q=te.connection,j=tp(!!x,te.isValid);const ue=u.get(o),le=ue?Dn(ue,J,we.Left,!0):ie.from,he={...ie,from:le,isValid:j,to:te.toHandle&&j?oa({x:te.toHandle.x,y:te.toHandle.y},se):V,toHandle:te.toHandle,toPosition:j&&te.toHandle?te.toHandle.position:gs[J.position],toNode:te.toHandle?u.get(te.toHandle.nodeId):null,pointer:V};F(he),ie=he}function oe(ee){if(!("touches"in ee&&ee.touches.length>0)){if(T){(x||U)&&q&&j&&E?.(q);const{inProgress:se,...te}=ie,ue={...te,toPosition:ie.toHandle?ie.toPosition:null};I?.(ee,ue),i&&O?.(ee,ue)}w(),cancelAnimationFrame(Z),L=!1,j=!1,q=null,U=null,K.removeEventListener("mousemove",G),K.removeEventListener("mouseup",oe),K.removeEventListener("touchmove",G),K.removeEventListener("touchend",oe)}}K.addEventListener("mousemove",G),K.addEventListener("mouseup",oe),K.addEventListener("touchmove",G),K.addEventListener("touchend",oe)}function Ui(t,{handle:e,connectionMode:n,fromNodeId:a,fromHandleId:o,fromType:i,doc:s,lib:l,flowId:u,isValidConnection:v=Gi,nodeLookup:p}){const m=i==="target",f=e?s.querySelector(`.${l}-flow__handle[data-id="${u}-${e?.nodeId}-${e?.id}-${e?.type}"]`):null,{x:w,y:N}=qt(t),E=s.elementFromPoint(w,N),I=E?.classList.contains(`${l}-flow__handle`)?E:f,H={handleDomNode:I,isValid:!1,connection:null,toHandle:null};if(I){const O=Xi(void 0,I),F=I.getAttribute("data-nodeid"),M=I.getAttribute("data-handleid"),R=I.classList.contains("connectable"),b=I.classList.contains("connectableend");if(!F||!O)return H;const A={source:m?F:a,sourceHandle:m?M:o,target:m?a:F,targetHandle:m?o:M};H.connection=A;const K=R&&b&&(n===Qn.Strict?m&&O==="source"||!m&&O==="target":F!==a||M!==o);H.isValid=K&&v(A),H.toHandle=Wi(F,O,M,p,n,!0)}return H}const Ms={onPointerDown:np,isValid:Ui};function rp({domNode:t,panZoom:e,getTransform:n,getViewScale:a}){const o=At(t);function i({translateExtent:l,width:u,height:v,zoomStep:p=1,pannable:m=!0,zoomable:f=!0,inversePan:w=!1}){const N=F=>{if(F.sourceEvent.type!=="wheel"||!e)return;const M=n(),R=F.sourceEvent.ctrlKey&&mr()?10:1,b=-F.sourceEvent.deltaY*(F.sourceEvent.deltaMode===1?.05:F.sourceEvent.deltaMode?1:.002)*p,A=M[2]*Math.pow(2,b*R);e.scaleTo(A)};let E=[0,0];const I=F=>{(F.sourceEvent.type==="mousedown"||F.sourceEvent.type==="touchstart")&&(E=[F.sourceEvent.clientX??F.sourceEvent.touches[0].clientX,F.sourceEvent.clientY??F.sourceEvent.touches[0].clientY])},H=F=>{const M=n();if(F.sourceEvent.type!=="mousemove"&&F.sourceEvent.type!=="touchmove"||!e)return;const R=[F.sourceEvent.clientX??F.sourceEvent.touches[0].clientX,F.sourceEvent.clientY??F.sourceEvent.touches[0].clientY],b=[R[0]-E[0],R[1]-E[1]];E=R;const A=a()*Math.max(M[2],Math.log(M[2]))*(w?-1:1),B={x:M[0]-b[0]*A,y:M[1]-b[1]*A},K=[[0,0],[u,v]];e.setViewportConstrained({x:B.x,y:B.y,zoom:M[2]},K,l)},O=Mi().on("start",I).on("zoom",m?H:null).on("zoom.wheel",f?N:null);o.call(O,{})}function s(){o.on("zoom",null)}return{update:i,destroy:s,pointer:Ft}}const ma=t=>({x:t.x,y:t.y,zoom:t.k}),Ha=({x:t,y:e,zoom:n})=>pa.translate(t,e).scale(n),Kn=(t,e)=>t.target.closest(`.${e}`),Qi=(t,e)=>e===2&&Array.isArray(t)&&t.includes(2),ap=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,Va=(t,e=0,n=ap,a=()=>{})=>{const o=typeof e=="number"&&e>0;return o||a(),o?t.transition().duration(e).ease(n).on("end",a):t},Ji=t=>{const e=t.ctrlKey&&mr()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*e};function op({zoomPanValues:t,noWheelClassName:e,d3Selection:n,d3Zoom:a,panOnScrollMode:o,panOnScrollSpeed:i,zoomOnPinch:s,onPanZoomStart:l,onPanZoom:u,onPanZoomEnd:v}){return p=>{if(Kn(p,e))return p.ctrlKey&&p.preventDefault(),!1;p.preventDefault(),p.stopImmediatePropagation();const m=n.property("__zoom").k||1;if(p.ctrlKey&&s){const I=Ft(p),H=Ji(p),O=m*Math.pow(2,H);a.scaleTo(n,O,I,p);return}const f=p.deltaMode===1?20:1;let w=o===Yn.Vertical?0:p.deltaX*f,N=o===Yn.Horizontal?0:p.deltaY*f;!mr()&&p.shiftKey&&o!==Yn.Vertical&&(w=p.deltaY*f,N=0),a.translateBy(n,-(w/m)*i,-(N/m)*i,{internal:!0});const E=ma(n.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?(u?.(p,E),t.panScrollTimeout=setTimeout(()=>{v?.(p,E),t.isPanScrolling=!1},150)):(t.isPanScrolling=!0,l?.(p,E))}}function sp({noWheelClassName:t,preventScrolling:e,d3ZoomHandler:n}){return function(a,o){const i=a.type==="wheel",s=!e&&i&&!a.ctrlKey,l=Kn(a,t);if(a.ctrlKey&&i&&l&&a.preventDefault(),s||l)return null;a.preventDefault(),n.call(this,a,o)}}function ip({zoomPanValues:t,onDraggingChange:e,onPanZoomStart:n}){return a=>{if(a.sourceEvent?.internal)return;const o=ma(a.transform);t.mouseButton=a.sourceEvent?.button||0,t.isZoomingOrPanning=!0,t.prevViewport=o,a.sourceEvent?.type==="mousedown"&&e(!0),n&&n?.(a.sourceEvent,o)}}function lp({zoomPanValues:t,panOnDrag:e,onPaneContextMenu:n,onTransformChange:a,onPanZoom:o}){return i=>{t.usedRightMouseButton=!!(n&&Qi(e,t.mouseButton??0)),i.sourceEvent?.sync||a([i.transform.x,i.transform.y,i.transform.k]),o&&!i.sourceEvent?.internal&&o?.(i.sourceEvent,ma(i.transform))}}function cp({zoomPanValues:t,panOnDrag:e,panOnScroll:n,onDraggingChange:a,onPanZoomEnd:o,onPaneContextMenu:i}){return s=>{if(!s.sourceEvent?.internal&&(t.isZoomingOrPanning=!1,i&&Qi(e,t.mouseButton??0)&&!t.usedRightMouseButton&&s.sourceEvent&&i(s.sourceEvent),t.usedRightMouseButton=!1,a(!1),o)){const l=ma(s.transform);t.prevViewport=l,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{o?.(s.sourceEvent,l)},n?150:0)}}}function dp({zoomActivationKeyPressed:t,zoomOnScroll:e,zoomOnPinch:n,panOnDrag:a,panOnScroll:o,zoomOnDoubleClick:i,userSelectionActive:s,noWheelClassName:l,noPanClassName:u,lib:v,connectionInProgress:p}){return m=>{const f=t||e,w=n&&m.ctrlKey,N=m.type==="wheel";if(m.button===1&&m.type==="mousedown"&&(Kn(m,`${v}-flow__node`)||Kn(m,`${v}-flow__edge`)))return!0;if(!a&&!f&&!o&&!i&&!n||s||p&&!N||Kn(m,l)&&N||Kn(m,u)&&(!N||o&&N&&!t)||!n&&m.ctrlKey&&N)return!1;if(!n&&m.type==="touchstart"&&m.touches?.length>1)return m.preventDefault(),!1;if(!f&&!o&&!w&&N||!a&&(m.type==="mousedown"||m.type==="touchstart")||Array.isArray(a)&&!a.includes(m.button)&&m.type==="mousedown")return!1;const E=Array.isArray(a)&&a.includes(m.button)||!m.button||m.button<=1;return(!m.ctrlKey||N)&&E}}function up({domNode:t,minZoom:e,maxZoom:n,translateExtent:a,viewport:o,onPanZoom:i,onPanZoomStart:s,onPanZoomEnd:l,onDraggingChange:u}){const v={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},p=t.getBoundingClientRect(),m=Mi().scaleExtent([e,n]).translateExtent(a),f=At(t).call(m);O({x:o.x,y:o.y,zoom:Jn(o.zoom,e,n)},[[0,0],[p.width,p.height]],a);const w=f.on("wheel.zoom"),N=f.on("dblclick.zoom");m.wheelDelta(Ji);function E(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).transform(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function I({noWheelClassName:x,noPanClassName:S,onPaneContextMenu:z,userSelectionActive:g,panOnScroll:C,panOnDrag:T,panOnScrollMode:D,panOnScrollSpeed:V,preventScrolling:L,zoomOnPinch:q,zoomOnScroll:j,zoomOnDoubleClick:U,zoomActivationKeyPressed:X,lib:J,onTransformChange:ae,connectionInProgress:re,paneClickDistance:ie,selectionOnDrag:ne}){g&&!v.isZoomingOrPanning&&H();const G=C&&!X&&!g;m.clickDistance(ne?1/0:!ln(ie)||ie<0?0:ie);const oe=G?op({zoomPanValues:v,noWheelClassName:x,d3Selection:f,d3Zoom:m,panOnScrollMode:D,panOnScrollSpeed:V,zoomOnPinch:q,onPanZoomStart:s,onPanZoom:i,onPanZoomEnd:l}):sp({noWheelClassName:x,preventScrolling:L,d3ZoomHandler:w});if(f.on("wheel.zoom",oe,{passive:!1}),!g){const se=ip({zoomPanValues:v,onDraggingChange:u,onPanZoomStart:s});m.on("start",se);const te=lp({zoomPanValues:v,panOnDrag:T,onPaneContextMenu:!!z,onPanZoom:i,onTransformChange:ae});m.on("zoom",te);const ue=cp({zoomPanValues:v,panOnDrag:T,panOnScroll:C,onPaneContextMenu:z,onPanZoomEnd:l,onDraggingChange:u});m.on("end",ue)}const ee=dp({zoomActivationKeyPressed:X,panOnDrag:T,zoomOnScroll:j,panOnScroll:C,zoomOnDoubleClick:U,zoomOnPinch:q,userSelectionActive:g,noPanClassName:S,noWheelClassName:x,lib:J,connectionInProgress:re});m.filter(ee),U?f.on("dblclick.zoom",N):f.on("dblclick.zoom",null)}function H(){m.on("zoom",null)}async function O(x,S,z){const g=Ha(x),C=m?.constrain()(g,S,z);return C&&await E(C),new Promise(T=>T(C))}async function F(x,S){const z=Ha(x);return await E(z,S),new Promise(g=>g(z))}function M(x){if(f){const S=Ha(x),z=f.property("__zoom");(z.k!==x.zoom||z.x!==x.x||z.y!==x.y)&&m?.transform(f,S,null,{sync:!0})}}function R(){const x=f?Ni(f.node()):{x:0,y:0,k:1};return{x:x.x,y:x.y,zoom:x.k}}function b(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).scaleTo(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function A(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).scaleBy(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function B(x){m?.scaleExtent(x)}function K(x){m?.translateExtent(x)}function Z(x){const S=!ln(x)||x<0?0:x;m?.clickDistance(S)}return{update:I,destroy:H,setViewport:F,setViewportConstrained:O,getViewport:R,scaleTo:b,scaleBy:A,setScaleExtent:B,setTranslateExtent:K,syncViewport:M,setClickDistance:Z}}var Ps;(function(t){t.Line="line",t.Handle="handle"})(Ps||(Ps={}));function Ao(){const t={};return[e=>{if(e&&!Ll(t))throw new Error(e);return so(t)},e=>Fs(t,e)]}const[vp,fp]=Ao(),[pp,hp]=Ao(),[gp,mp]=Ao();var _p=P("
    ");function $e(t,e){ze(e,!0);let n=pe(e,"id",3,null),a=pe(e,"type",3,"source"),o=pe(e,"position",19,()=>we.Top),i=pe(e,"isConnectableStart",3,!0),s=pe(e,"isConnectableEnd",3,!0),l=_n(e,["$$slots","$$events","$$legacy","id","type","position","style","class","isConnectable","isConnectableStart","isConnectableEnd","isValidConnection","onconnect","ondisconnect","children"]);const u=vp("Handle must be used within a Custom Node component"),v=pp("Handle must be used within a Custom Node component");let p=k(()=>a()==="target"),m=k(()=>e.isConnectable!==void 0?e.isConnectable:v.value),f=fn(),w=k(()=>f.ariaLabelConfig),N=null;Hl(()=>{if(e.onconnect||e.ondisconnect){f.edges;let S=f.connectionLookup.get(`${u}-${a()}${n()?`-${n()}`:""}`);if(N&&!ff(S,N)){const z=S??new Map;ms(N,z,e.ondisconnect),ms(z,N,e.onconnect)}N=new Map(S)}});let E=k(()=>{if(!f.connection.inProgress)return[!1,!1,!1,!1,null];const{fromHandle:S,toHandle:z,isValid:g}=f.connection,C=S&&S.nodeId===u&&S.type===a()&&S.id===n(),T=z&&z.nodeId===u&&z.type===a()&&z.id===n(),D=f.connectionMode===Qn.Strict?S?.type!==a():u!==S?.nodeId||n()!==S?.id;return[!0,C,T,D,T&&g]}),I=k(()=>dn(r(E),5)),H=k(()=>r(I)[0]),O=k(()=>r(I)[1]),F=k(()=>r(I)[2]),M=k(()=>r(I)[3]),R=k(()=>r(I)[4]);function b(S){const z=f.onbeforeconnect?f.onbeforeconnect(S):S;z&&(f.addEdge(z),f.onconnect?.(S))}function A(S){const z=Fi(S);S.currentTarget&&(z&&S.button===0||!z)&&Ms.onPointerDown(S,{handleId:n(),nodeId:u,isTarget:r(p),connectionRadius:f.connectionRadius,domNode:f.domNode,nodeLookup:f.nodeLookup,connectionMode:f.connectionMode,lib:"svelte",autoPanOnConnect:f.autoPanOnConnect,autoPanSpeed:f.autoPanSpeed,flowId:f.flowId,isValidConnection:e.isValidConnection||((...g)=>f.isValidConnection?.(...g)??!0),updateConnection:f.updateConnection,cancelConnection:f.cancelConnection,panBy:f.panBy,onConnect:b,onConnectStart:f.onconnectstart,onConnectEnd:(...g)=>f.onconnectend?.(...g),getTransform:()=>[f.viewport.x,f.viewport.y,f.viewport.zoom],getFromHandle:()=>f.connection.fromHandle,dragThreshold:f.connectionDragThreshold,handleDomNode:S.currentTarget})}function B(S){if(!u||!f.clickConnectStartHandle&&!i())return;if(!f.clickConnectStartHandle){f.onclickconnectstart?.(S,{nodeId:u,handleId:n(),handleType:a()}),f.clickConnectStartHandle={nodeId:u,type:a(),id:n()};return}const z=Hi(S.target),g=e.isValidConnection??f.isValidConnection,{connectionMode:C,clickConnectStartHandle:T,flowId:D,nodeLookup:V}=f,{connection:L,isValid:q}=Ms.isValid(S,{handle:{nodeId:u,id:n(),type:a()},connectionMode:C,fromNodeId:T.nodeId,fromHandleId:T.id??null,fromType:T.type,isValidConnection:g,flowId:D,doc:z,lib:"svelte",nodeLookup:V});q&&L&&b(L);const j=structuredClone($s(f.connection));delete j.inProgress,j.toPosition=j.toHandle?j.toHandle.position:null,f.onclickconnectend?.(S,j),f.clickConnectStartHandle=null}var K=_p(),Z=()=>{};bn(K,()=>({"data-handleid":n(),"data-nodeid":u,"data-handlepos":o(),"data-id":`${f.flowId??""}-${u??""}-${n()??"null"??""}-${a()??""}`,class:["svelte-flow__handle",`svelte-flow__handle-${o()}`,f.noDragClass,f.noPanClass,o(),e.class],onmousedown:A,ontouchstart:A,onclick:f.clickConnect?B:void 0,onkeypress:Z,style:e.style,role:"button","aria-label":r(w)["handle.ariaLabel"],tabindex:"-1",...l,[lo]:{valid:r(R),connectingto:r(F),connectingfrom:r(O),source:!r(p),target:r(p),connectablestart:i(),connectableend:s(),connectable:r(m),connectionindicator:r(m)&&(!r(H)||r(M))&&(r(H)||f.clickConnectStartHandle?s():i())}}));var x=d(K);Dt(x,()=>e.children??tr),c(K),y(t,K),Ce()}var yp=P(" ",1);function $i(t,e){ze(e,!0);let n=pe(e,"targetPosition",19,()=>we.Top),a=pe(e,"sourcePosition",19,()=>we.Bottom);var o=yp(),i=de(o);$e(i,{type:"target",get position(){return n()}});var s=h(i),l=h(s);$e(l,{type:"source",get position(){return a()}}),$(()=>W(s,` ${e.data?.label??""} `)),y(t,o),Ce()}var bp=P(" ",1);function xp(t,e){ze(e,!0);let n=pe(e,"data",19,()=>({label:"Node"})),a=pe(e,"sourcePosition",19,()=>we.Bottom);ye();var o=bp(),i=de(o),s=h(i);$e(s,{type:"source",get position(){return a()}}),$(()=>W(i,`${n()?.label??""} `)),y(t,o),Ce()}var wp=P(" ",1);function kp(t,e){ze(e,!0);let n=pe(e,"data",19,()=>({label:"Node"})),a=pe(e,"targetPosition",19,()=>we.Top);ye();var o=wp(),i=de(o),s=h(i);$e(s,{type:"target",get position(){return a()}}),$(()=>W(i,`${n()?.label??""} `)),y(t,o),Ce()}function Sp(t,e){}function Fa(t,e,n){if(!n||!e)return;const a=n==="root"?e:e.querySelector(`.svelte-flow__${n}`);a&&a.appendChild(t)}function zp(t,e){const n=k(fn),a=k(()=>r(n).domNode);let o;return r(a)?Fa(t,r(a),e):o=Bs(()=>{_e(()=>{Fa(t,r(a),e),o?.()})}),{async update(i){Fa(t,r(a),i)},destroy(){t.parentNode&&t.parentNode.removeChild(t),o?.()}}}function Cp(){let t=Q(typeof window>"u");if(r(t)){const e=Bs(()=>{_e(()=>{_(t,!1),e?.()})})}return{get value(){return r(t)}}}const Ts=t=>hf(t),Ep=t=>Ti(t);function en(t){return t===void 0?void 0:`${t}px`}const sa={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}};var Np=P("
    ");function Mp(t,e){ze(e,!0);let n=pe(e,"x",3,0),a=pe(e,"y",3,0),o=pe(e,"selectEdgeOnClick",3,!1),i=pe(e,"transparent",3,!1),s=_n(e,["$$slots","$$events","$$legacy","x","y","width","height","selectEdgeOnClick","transparent","class","children"]);const l=fn(),u=gp("EdgeLabel must be used within a Custom Edge component");let v=k(()=>l.visible.edges.get(u)?.zIndex);var p=Np(),m=()=>{o()&&u&&l.handleEdgeSelection(u)};bn(p,w=>({class:["svelte-flow__edge-label",{transparent:i()},e.class],tabindex:"-1",onclick:m,...s,[ia]:w}),[()=>({display:Cp().value?"none":void 0,cursor:o()?"pointer":void 0,transform:`translate(-50%, -50%) translate(${n()??""}px,${a()??""}px)`,"pointer-events":"all",width:en(e.width),height:en(e.height),"z-index":r(v)})],void 0,void 0,"svelte-1wg91mu");var f=d(p);Dt(f,()=>e.children??tr),c(p),zt(p,(w,N)=>zp?.(w,N),()=>"edge-labels"),y(t,p),Ce()}var Pp=ut(""),Tp=ut('',1);function _a(t,e){let n=pe(e,"interactionWidth",3,20),a=_n(e,["$$slots","$$events","$$legacy","id","path","label","labelX","labelY","labelStyle","markerStart","markerEnd","style","interactionWidth","class"]);var o=Tp(),i=de(o),s=h(i);{var l=p=>{var m=Pp();bn(m,()=>({d:e.path,"stroke-opacity":0,"stroke-width":n(),fill:"none",class:"svelte-flow__edge-interaction",...a})),y(p,m)};Y(s,p=>{n()>0&&p(l)})}var u=h(s);{var v=p=>{Mp(p,{get x(){return e.labelX},get y(){return e.labelY},get style(){return e.labelStyle},selectEdgeOnClick:!0,children:(m,f)=>{ye();var w=qs();$(()=>W(w,e.label)),y(m,w)},$$slots:{default:!0}})};Y(u,p=>{e.label&&p(v)})}$(()=>{xe(i,"id",e.id),xe(i,"d",e.path),De(i,0,Rn(["svelte-flow__edge-path",e.class])),xe(i,"marker-start",e.markerStart),xe(i,"marker-end",e.markerEnd),st(i,e.style)}),y(t,o)}function el(t,e){ze(e,!0);let n=k(()=>Bi({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition,curvature:e.pathOptions?.curvature})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get id(){return e.id},get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Ip(t,e){ze(e,!0);let n=k(()=>No({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Ap(t,e){ze(e,!0);let n=k(()=>Ki({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Dp(t,e){ze(e,!0);let n=k(()=>No({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition,borderRadius:0})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}class Op{#e;#t;constructor(e,n){this.#e=e,this.#t=Vl(n)}get current(){return this.#t(),this.#e()}}const Rp=/\(.+\)/,Lp=new Set(["all","print","screen","and","or","not","only"]);class Hp extends Op{constructor(e,n){let a=Rp.test(e)||e.split(/[\s,]+/).some(i=>Lp.has(i.trim()))?e:`(${e})`;const o=window.matchMedia(a);super(()=>o.matches,i=>qa(o,"change",i))}}function Vp(t,e,n,a){const o=new Map;return Co(t,{x:0,y:0,width:n,height:a},e,!0).forEach(i=>{o.set(i.id,i)}),o}function Is(t){const{edges:e,defaultEdgeOptions:n,nodeLookup:a,previousEdges:o,connectionMode:i,onerror:s,onlyRenderVisible:l,elevateEdgesOnSelect:u,zIndexMode:v}=t,p=new Map;for(const m of e){const f=a.get(m.source),w=a.get(m.target);if(!f||!w)continue;if(l){const{visibleNodes:I,transform:H,width:O,height:F}=t;if(Mf({sourceNode:f,targetNode:w,width:O,height:F,transform:H}))I.set(f.id,f),I.set(w.id,w);else continue}const N=o.get(m.id);if(N&&m===N.edge&&f==N.sourceNode&&w==N.targetNode){p.set(m.id,N);continue}const E=Rf({id:m.id,sourceNode:f,targetNode:w,sourceHandle:m.sourceHandle||null,targetHandle:m.targetHandle||null,connectionMode:i,onError:s});E&&p.set(m.id,{...n,...m,...E,zIndex:Nf({selected:m.selected,zIndex:m.zIndex??n.zIndex,sourceNode:f,targetNode:w,elevateOnSelect:u,zIndexMode:v}),sourceNode:f,targetNode:w,edge:m})}return p}const tl={input:xp,output:kp,default:$i,group:Sp},nl={straight:Ap,smoothstep:Ip,default:el,step:Dp};function Fp(t,e,n,a,o,i){if(e&&!n&&a&&o){const s=xr(i,{filter:l=>!!((l.width||l.initialWidth)&&(l.height||l.initialHeight))});return Eo(s,a,o,.5,2,.1)}else return n??{x:0,y:0,zoom:1}}function Bp(t){class e{#e=k(()=>t.props.id??"1");get flowId(){return r(this.#e)}set flowId(a){_(this.#e,a)}#t=Q(null);get domNode(){return r(this.#t)}set domNode(a){_(this.#t,a)}#n=Q(null);get panZoom(){return r(this.#n)}set panZoom(a){_(this.#n,a)}#r=Q(t.width??0);get width(){return r(this.#r)}set width(a){_(this.#r,a)}#a=Q(t.height??0);get height(){return r(this.#a)}set height(a){_(this.#a,a)}#o=Q(t.props.zIndexMode??"basic");get zIndexMode(){return r(this.#o)}set zIndexMode(a){_(this.#o,a)}#s=k(()=>{const a=qf(t.nodes,this.nodeLookup,this.parentLookup,{nodeExtent:this.nodeExtent,nodeOrigin:this.nodeOrigin,elevateNodesOnSelect:t.props.elevateNodesOnSelect??!0,checkEquality:!0,zIndexMode:this.zIndexMode});return this.fitViewQueued&&a&&(this.fitViewOptions?.duration?this.resolveFitView():queueMicrotask(()=>{this.resolveFitView()})),a});get nodesInitialized(){return r(this.#s)}set nodesInitialized(a){_(this.#s,a)}#i=k(()=>this.panZoom!==null);get viewportInitialized(){return r(this.#i)}set viewportInitialized(a){_(this.#i,a)}#l=k(()=>(Xf(this.connectionLookup,this.edgeLookup,t.edges),t.edges));get _edges(){return r(this.#l)}set _edges(a){_(this.#l,a)}get nodes(){return this.nodesInitialized,t.nodes}set nodes(a){t.nodes=a}get edges(){return this._edges}set edges(a){t.edges=a}_prevSelectedNodes=[];_prevSelectedNodeIds=new Set;#c=k(()=>{const a=this._prevSelectedNodeIds.size,o=new Set,i=this.nodes.filter(s=>(s.selected&&(o.add(s.id),this._prevSelectedNodeIds.delete(s.id)),s.selected));return(a!==o.size||this._prevSelectedNodeIds.size>0)&&(this._prevSelectedNodes=i),this._prevSelectedNodeIds=o,this._prevSelectedNodes});get selectedNodes(){return r(this.#c)}set selectedNodes(a){_(this.#c,a)}_prevSelectedEdges=[];_prevSelectedEdgeIds=new Set;#d=k(()=>{const a=this._prevSelectedEdgeIds.size,o=new Set,i=this.edges.filter(s=>(s.selected&&(o.add(s.id),this._prevSelectedEdgeIds.delete(s.id)),s.selected));return(a!==o.size||this._prevSelectedEdgeIds.size>0)&&(this._prevSelectedEdges=i),this._prevSelectedEdgeIds=o,this._prevSelectedEdges});get selectedEdges(){return r(this.#d)}set selectedEdges(a){_(this.#d,a)}selectionChangeHandlers=new Map;nodeLookup=new Map;parentLookup=new Map;connectionLookup=new Map;edgeLookup=new Map;_prevVisibleEdges=new Map;#u=k(()=>{const{nodes:a,_edges:o,_prevVisibleEdges:i,nodeLookup:s,connectionMode:l,onerror:u,onlyRenderVisibleElements:v,defaultEdgeOptions:p,zIndexMode:m}=this;let f,w;const N={edges:o,defaultEdgeOptions:p,previousEdges:i,nodeLookup:s,connectionMode:l,elevateEdgesOnSelect:t.props.elevateEdgesOnSelect??!0,zIndexMode:m,onerror:u};if(v){const{viewport:E,width:I,height:H}=this,O=[E.x,E.y,E.zoom];f=Vp(s,O,I,H),w=Is({...N,onlyRenderVisible:!0,visibleNodes:f,transform:O,width:I,height:H})}else f=this.nodeLookup,w=Is(N);return{nodes:f,edges:w}});get visible(){return r(this.#u)}set visible(a){_(this.#u,a)}#v=k(()=>t.props.nodesDraggable??!0);get nodesDraggable(){return r(this.#v)}set nodesDraggable(a){_(this.#v,a)}#f=k(()=>t.props.nodesConnectable??!0);get nodesConnectable(){return r(this.#f)}set nodesConnectable(a){_(this.#f,a)}#p=k(()=>t.props.elementsSelectable??!0);get elementsSelectable(){return r(this.#p)}set elementsSelectable(a){_(this.#p,a)}#h=k(()=>t.props.nodesFocusable??!0);get nodesFocusable(){return r(this.#h)}set nodesFocusable(a){_(this.#h,a)}#g=k(()=>t.props.edgesFocusable??!0);get edgesFocusable(){return r(this.#g)}set edgesFocusable(a){_(this.#g,a)}#m=k(()=>t.props.disableKeyboardA11y??!1);get disableKeyboardA11y(){return r(this.#m)}set disableKeyboardA11y(a){_(this.#m,a)}#_=k(()=>t.props.minZoom??.5);get minZoom(){return r(this.#_)}set minZoom(a){_(this.#_,a)}#y=k(()=>t.props.maxZoom??2);get maxZoom(){return r(this.#y)}set maxZoom(a){_(this.#y,a)}#b=k(()=>t.props.nodeOrigin??[0,0]);get nodeOrigin(){return r(this.#b)}set nodeOrigin(a){_(this.#b,a)}#x=k(()=>t.props.nodeExtent??to);get nodeExtent(){return r(this.#x)}set nodeExtent(a){_(this.#x,a)}#w=k(()=>t.props.translateExtent??to);get translateExtent(){return r(this.#w)}set translateExtent(a){_(this.#w,a)}#k=k(()=>t.props.defaultEdgeOptions??{});get defaultEdgeOptions(){return r(this.#k)}set defaultEdgeOptions(a){_(this.#k,a)}#S=k(()=>t.props.nodeDragThreshold??1);get nodeDragThreshold(){return r(this.#S)}set nodeDragThreshold(a){_(this.#S,a)}#z=k(()=>t.props.autoPanOnNodeDrag??!0);get autoPanOnNodeDrag(){return r(this.#z)}set autoPanOnNodeDrag(a){_(this.#z,a)}#C=k(()=>t.props.autoPanOnConnect??!0);get autoPanOnConnect(){return r(this.#C)}set autoPanOnConnect(a){_(this.#C,a)}#E=k(()=>t.props.autoPanOnNodeFocus??!0);get autoPanOnNodeFocus(){return r(this.#E)}set autoPanOnNodeFocus(a){_(this.#E,a)}#N=k(()=>t.props.autoPanSpeed??15);get autoPanSpeed(){return r(this.#N)}set autoPanSpeed(a){_(this.#N,a)}#M=k(()=>t.props.connectionDragThreshold??1);get connectionDragThreshold(){return r(this.#M)}set connectionDragThreshold(a){_(this.#M,a)}fitViewQueued=t.props.fitView??!1;fitViewOptions=t.props.fitViewOptions;fitViewResolver=null;#P=k(()=>t.props.snapGrid??null);get snapGrid(){return r(this.#P)}set snapGrid(a){_(this.#P,a)}#T=Q(!1);get dragging(){return r(this.#T)}set dragging(a){_(this.#T,a)}#I=Q(null);get selectionRect(){return r(this.#I)}set selectionRect(a){_(this.#I,a)}#A=Q(!1);get selectionKeyPressed(){return r(this.#A)}set selectionKeyPressed(a){_(this.#A,a)}#D=Q(!1);get multiselectionKeyPressed(){return r(this.#D)}set multiselectionKeyPressed(a){_(this.#D,a)}#O=Q(!1);get deleteKeyPressed(){return r(this.#O)}set deleteKeyPressed(a){_(this.#O,a)}#R=Q(!1);get panActivationKeyPressed(){return r(this.#R)}set panActivationKeyPressed(a){_(this.#R,a)}#L=Q(!1);get zoomActivationKeyPressed(){return r(this.#L)}set zoomActivationKeyPressed(a){_(this.#L,a)}#H=Q(null);get selectionRectMode(){return r(this.#H)}set selectionRectMode(a){_(this.#H,a)}#V=Q("");get ariaLiveMessage(){return r(this.#V)}set ariaLiveMessage(a){_(this.#V,a)}#F=k(()=>t.props.selectionMode??na.Partial);get selectionMode(){return r(this.#F)}set selectionMode(a){_(this.#F,a)}#B=k(()=>({...tl,...t.props.nodeTypes}));get nodeTypes(){return r(this.#B)}set nodeTypes(a){_(this.#B,a)}#q=k(()=>({...nl,...t.props.edgeTypes}));get edgeTypes(){return r(this.#q)}set edgeTypes(a){_(this.#q,a)}#K=k(()=>t.props.noPanClass??"nopan");get noPanClass(){return r(this.#K)}set noPanClass(a){_(this.#K,a)}#j=k(()=>t.props.noDragClass??"nodrag");get noDragClass(){return r(this.#j)}set noDragClass(a){_(this.#j,a)}#Z=k(()=>t.props.noWheelClass??"nowheel");get noWheelClass(){return r(this.#Z)}set noWheelClass(a){_(this.#Z,a)}#Y=k(()=>zf(t.props.ariaLabelConfig));get ariaLabelConfig(){return r(this.#Y)}set ariaLabelConfig(a){_(this.#Y,a)}#W=Q(Fp(this.nodesInitialized,t.props.fitView,t.props.initialViewport,this.width,this.height,this.nodeLookup));get _viewport(){return r(this.#W)}set _viewport(a){_(this.#W,a)}get viewport(){return t.viewport??this._viewport}set viewport(a){t.viewport&&(t.viewport=a),this._viewport=a}#X=Q(no);get _connection(){return r(this.#X)}set _connection(a){_(this.#X,a)}#G=k(()=>this._connection.inProgress?{...this._connection,to:kr(this._connection.to,[this.viewport.x,this.viewport.y,this.viewport.zoom])}:this._connection);get connection(){return r(this.#G)}set connection(a){_(this.#G,a)}#U=k(()=>t.props.connectionMode??Qn.Strict);get connectionMode(){return r(this.#U)}set connectionMode(a){_(this.#U,a)}#Q=k(()=>t.props.connectionRadius??20);get connectionRadius(){return r(this.#Q)}set connectionRadius(a){_(this.#Q,a)}#J=k(()=>t.props.isValidConnection??(()=>!0));get isValidConnection(){return r(this.#J)}set isValidConnection(a){_(this.#J,a)}#$=k(()=>t.props.selectNodesOnDrag??!0);get selectNodesOnDrag(){return r(this.#$)}set selectNodesOnDrag(a){_(this.#$,a)}#ee=k(()=>t.props.defaultMarkerColor===void 0?"#b1b1b7":t.props.defaultMarkerColor);get defaultMarkerColor(){return r(this.#ee)}set defaultMarkerColor(a){_(this.#ee,a)}#te=k(()=>Lf(t.edges,{defaultColor:this.defaultMarkerColor,id:this.flowId,defaultMarkerStart:this.defaultEdgeOptions.markerStart,defaultMarkerEnd:this.defaultEdgeOptions.markerEnd}));get markers(){return r(this.#te)}set markers(a){_(this.#te,a)}#ne=k(()=>t.props.onlyRenderVisibleElements??!1);get onlyRenderVisibleElements(){return r(this.#ne)}set onlyRenderVisibleElements(a){_(this.#ne,a)}#re=k(()=>t.props.onflowerror??xf);get onerror(){return r(this.#re)}set onerror(a){_(this.#re,a)}#ae=k(()=>t.props.ondelete);get ondelete(){return r(this.#ae)}set ondelete(a){_(this.#ae,a)}#oe=k(()=>t.props.onbeforedelete);get onbeforedelete(){return r(this.#oe)}set onbeforedelete(a){_(this.#oe,a)}#se=k(()=>t.props.onbeforeconnect);get onbeforeconnect(){return r(this.#se)}set onbeforeconnect(a){_(this.#se,a)}#ie=k(()=>t.props.onconnect);get onconnect(){return r(this.#ie)}set onconnect(a){_(this.#ie,a)}#le=k(()=>t.props.onconnectstart);get onconnectstart(){return r(this.#le)}set onconnectstart(a){_(this.#le,a)}#ce=k(()=>t.props.onconnectend);get onconnectend(){return r(this.#ce)}set onconnectend(a){_(this.#ce,a)}#de=k(()=>t.props.onbeforereconnect);get onbeforereconnect(){return r(this.#de)}set onbeforereconnect(a){_(this.#de,a)}#ue=k(()=>t.props.onreconnect);get onreconnect(){return r(this.#ue)}set onreconnect(a){_(this.#ue,a)}#ve=k(()=>t.props.onreconnectstart);get onreconnectstart(){return r(this.#ve)}set onreconnectstart(a){_(this.#ve,a)}#fe=k(()=>t.props.onreconnectend);get onreconnectend(){return r(this.#fe)}set onreconnectend(a){_(this.#fe,a)}#pe=k(()=>t.props.clickConnect??!0);get clickConnect(){return r(this.#pe)}set clickConnect(a){_(this.#pe,a)}#he=k(()=>t.props.onclickconnectstart);get onclickconnectstart(){return r(this.#he)}set onclickconnectstart(a){_(this.#he,a)}#ge=k(()=>t.props.onclickconnectend);get onclickconnectend(){return r(this.#ge)}set onclickconnectend(a){_(this.#ge,a)}#me=Q(null);get clickConnectStartHandle(){return r(this.#me)}set clickConnectStartHandle(a){_(this.#me,a)}#_e=k(()=>t.props.onselectiondrag);get onselectiondrag(){return r(this.#_e)}set onselectiondrag(a){_(this.#_e,a)}#ye=k(()=>t.props.onselectiondragstart);get onselectiondragstart(){return r(this.#ye)}set onselectiondragstart(a){_(this.#ye,a)}#be=k(()=>t.props.onselectiondragstop);get onselectiondragstop(){return r(this.#be)}set onselectiondragstop(a){_(this.#be,a)}resolveFitView=async()=>{this.panZoom&&(await yf({nodes:this.nodeLookup,width:this.width,height:this.height,panZoom:this.panZoom,minZoom:this.minZoom,maxZoom:this.maxZoom},this.fitViewOptions),this.fitViewResolver?.resolve(!0),this.fitViewQueued=!1,this.fitViewOptions=void 0,this.fitViewResolver=null)};_prefersDark=new Hp("(prefers-color-scheme: dark)",t.props.colorModeSSR==="dark");#xe=k(()=>t.props.colorMode==="system"?this._prefersDark.current?"dark":"light":t.props.colorMode??"light");get colorMode(){return r(this.#xe)}set colorMode(a){_(this.#xe,a)}constructor(){}resetStoreValues(){this.dragging=!1,this.selectionRect=null,this.selectionRectMode=null,this.selectionKeyPressed=!1,this.multiselectionKeyPressed=!1,this.deleteKeyPressed=!1,this.panActivationKeyPressed=!1,this.zoomActivationKeyPressed=!1,this._connection=no,this.clickConnectStartHandle=null,this.viewport=t.props.initialViewport??{x:0,y:0,zoom:1},this.ariaLiveMessage=""}}return new e}function fn(){const t=so(oo);if(!t)throw new Error("To call useStore outside of you need to wrap your component in a ");return t.getStore()}const oo=Symbol();function qp(t){const e=Bp(t);function n(x){e.nodeTypes={...tl,...x}}function a(x){e.edgeTypes={...nl,...x}}function o(x){e.edges=If(x,e.edges)}const i=(x,S=!1)=>{e.nodes=e.nodes.map(z=>{if(e.connection.inProgress&&e.connection.fromNode.id===z.id){const C=e.nodeLookup.get(z.id);C&&(e.connection={...e.connection,from:Dn(C,e.connection.fromHandle,we.Left,!0)})}const g=x.get(z.id);return g?{...z,position:g.position,dragging:S}:z})};function s(x){const{changes:S,updatedInternals:z}=Yf(x,e.nodeLookup,e.parentLookup,e.domNode,e.nodeOrigin,e.nodeExtent,e.zIndexMode);if(!z)return;Ff(e.nodeLookup,e.parentLookup,{nodeOrigin:e.nodeOrigin,nodeExtent:e.nodeExtent,zIndexMode:e.zIndexMode}),e.fitViewQueued&&e.resolveFitView();const g=new Map;for(const C of S){const T=e.nodeLookup.get(C.id)?.internals.userNode;if(!T)continue;const D={...T};switch(C.type){case"dimensions":{const V={...D.measured,...C.dimensions};C.setAttributes&&(D.width=C.dimensions?.width??D.width,D.height=C.dimensions?.height??D.height),D.measured=V;break}case"position":D.position=C.position??D.position;break}g.set(C.id,D)}e.nodes=e.nodes.map(C=>g.get(C.id)??C)}function l(x){const S=e.fitViewResolver??Promise.withResolvers();return e.fitViewQueued=!0,e.fitViewOptions=x,e.fitViewResolver=S,e.nodes=[...e.nodes],S.promise}async function u(x,S,z){const g=typeof z?.zoom<"u"?z.zoom:e.maxZoom,C=e.panZoom;return C?(await C.setViewport({x:e.width/2-x*g,y:e.height/2-S*g,zoom:g},{duration:z?.duration,ease:z?.ease,interpolate:z?.interpolate}),Promise.resolve(!0)):Promise.resolve(!1)}function v(x,S){const z=e.panZoom;return z?z.scaleBy(x,S):Promise.resolve(!1)}function p(x){return v(1.2,x)}function m(x){return v(1/1.2,x)}function f(x){const S=e.panZoom;S&&(S.setScaleExtent([x,e.maxZoom]),e.minZoom=x)}function w(x){const S=e.panZoom;S&&(S.setScaleExtent([e.minZoom,x]),e.maxZoom=x)}function N(x){const S=e.panZoom;S&&(S.setTranslateExtent(x),e.translateExtent=x)}function E(x,S=null){let z=!1;const g=x.map(C=>(S?S.has(C.id):!0)&&C.selected?(z=!0,{...C,selected:!1}):C);return[z,g]}function I(x){const S=x?.nodes?new Set(x.nodes.map(V=>V.id)):null,[z,g]=E(e.nodes,S);z&&(e.nodes=g);const C=x?.edges?new Set(x.edges.map(V=>V.id)):null,[T,D]=E(e.edges,C);T&&(e.edges=D)}function H(x){const S=e.multiselectionKeyPressed;e.nodes=e.nodes.map(z=>{const g=x.includes(z.id),C=S&&z.selected||g;return!!z.selected!==C?{...z,selected:C}:z}),S||I({nodes:[]})}function O(x){const S=e.multiselectionKeyPressed;e.edges=e.edges.map(z=>{const g=x.includes(z.id),C=S&&z.selected||g;return!!z.selected!==C?{...z,selected:C}:z}),S||I({edges:[]})}function F(x,S,z){const g=e.nodeLookup.get(x);if(!g){console.warn("012",hr.error012(x));return}e.selectionRect=null,e.selectionRectMode=null,g.selected?(S||g.selected&&e.multiselectionKeyPressed)&&(I({nodes:[g],edges:[]}),requestAnimationFrame(()=>z?.blur())):H([x])}function M(x){const S=e.edgeLookup.get(x);if(!S){console.warn("012",hr.error012(x));return}(S.selectable||e.elementsSelectable&&typeof S.selectable>"u")&&(e.selectionRect=null,e.selectionRectMode=null,S.selected?S.selected&&e.multiselectionKeyPressed&&I({nodes:[],edges:[S]}):O([x]))}function R(x,S){const{nodeExtent:z,snapGrid:g,nodeOrigin:C,nodeLookup:T,nodesDraggable:D,onerror:V}=e,L=new Map,q=g?.[0]??5,j=g?.[1]??5,U=x.x*q*S,X=x.y*j*S;for(const J of T.values()){if(!(J.selected&&(J.draggable||D&&typeof J.draggable>"u")))continue;let re={x:J.internals.positionAbsolute.x+U,y:J.internals.positionAbsolute.y+X};g&&(re=wr(re,g));const{position:ie,positionAbsolute:ne}=Ii({nodeId:J.id,nextPosition:re,nodeLookup:T,nodeExtent:z,nodeOrigin:C,onError:V});J.position=ie,J.internals.positionAbsolute=ne,L.set(J.id,J)}i(L)}function b(x){return Wf({delta:x,panZoom:e.panZoom,transform:[e.viewport.x,e.viewport.y,e.viewport.zoom],translateExtent:e.translateExtent,width:e.width,height:e.height})}const A=x=>{e._connection={...x}};function B(){e._connection=no}function K(){e.resetStoreValues(),I()}return Object.assign(e,{setNodeTypes:n,setEdgeTypes:a,addEdge:o,updateNodePositions:i,updateNodeInternals:s,zoomIn:p,zoomOut:m,fitView:l,setCenter:u,setMinZoom:f,setMaxZoom:w,setTranslateExtent:N,unselectNodesAndEdges:I,addSelectedNodes:H,addSelectedEdges:O,handleNodeSelection:F,handleEdgeSelection:M,moveSelectedNodes:R,panBy:b,updateConnection:A,cancelConnection:B,reset:K})}function Kp(t,e){const{minZoom:n,maxZoom:a,initialViewport:o,onPanZoomStart:i,onPanZoom:s,onPanZoomEnd:l,translateExtent:u,setPanZoomInstance:v,onDraggingChange:p,onTransformChange:m}=e,f=up({domNode:t,minZoom:n,maxZoom:a,translateExtent:u,viewport:o,onPanZoom:s,onPanZoomStart:i,onPanZoomEnd:l,onDraggingChange:p}),w=f.getViewport();return(o.x!==w.x||o.y!==w.y||o.zoom!==w.zoom)&&m([w.x,w.y,w.zoom]),v(f),f.update(e),{update(N){f.update(N)}}}var jp=P('
    ');function Zp(t,e){ze(e,!0);let n=pe(e,"store",15),a=k(()=>n().panActivationKeyPressed||e.panOnDrag),o=k(()=>n().panActivationKeyPressed||e.panOnScroll);const{viewport:i}=n();let s=!1;_e(()=>{!s&&n().viewportInitialized&&(e.oninit?.(),s=!0)});var l=jp(),u=d(l);Dt(u,()=>e.children),c(l),zt(l,(v,p)=>Kp?.(v,p),()=>({viewport:n().viewport,minZoom:n().minZoom,maxZoom:n().maxZoom,initialViewport:i,onDraggingChange:v=>{n(n().dragging=v,!0)},setPanZoomInstance:v=>{n(n().panZoom=v,!0)},onPanZoomStart:e.onmovestart,onPanZoom:e.onmove,onPanZoomEnd:e.onmoveend,zoomOnScroll:e.zoomOnScroll,zoomOnDoubleClick:e.zoomOnDoubleClick,zoomOnPinch:e.zoomOnPinch,panOnScroll:r(o),panOnDrag:r(a),panOnScrollSpeed:e.panOnScrollSpeed,panOnScrollMode:e.panOnScrollMode,zoomActivationKeyPressed:n().zoomActivationKeyPressed,preventScrolling:typeof e.preventScrolling=="boolean"?e.preventScrolling:!0,noPanClassName:n().noPanClass,noWheelClassName:n().noWheelClass,userSelectionActive:!!n().selectionRect,translateExtent:n().translateExtent,lib:"svelte",paneClickDistance:e.paneClickDistance,selectionOnDrag:e.selectionOnDrag,onTransformChange:v=>{n(n().viewport={x:v[0],y:v[1],zoom:v[2]},!0)},connectionInProgress:n().connection.inProgress})),y(t,l),Ce()}function As(t,e){return n=>{n.target===e&&t?.(n)}}function Ds(t){return e=>{const n=t.has(e.id);return!!e.selected!==n?{...e,selected:n}:e}}function Os(t,e){if(t.size!==e.size)return!1;for(const n of t)if(!e.has(n))return!1;return!0}var Yp=P("
    ");function Wp(t,e){ze(e,!0);let n=pe(e,"store",15),a=pe(e,"panOnDrag",3,!0),o=pe(e,"paneClickDistance",3,1),i,s=null,l=new Set,u=new Set,v=k(()=>n().panActivationKeyPressed||a()),p=k(()=>n().selectionKeyPressed||!!n().selectionRect||e.selectionOnDrag&&r(v)!==!0),m=k(()=>n().elementsSelectable&&(r(p)||n().selectionRectMode==="user")),f=!1;function w(B){if(s=i?.getBoundingClientRect(),!s)return;const K=B.target===i,Z=!K&&!!B.target.closest(".nokey"),x=e.selectionOnDrag&&K||n().selectionKeyPressed;if(Z||!r(p)||!x||B.button!==0||!B.isPrimary)return;B.target?.setPointerCapture?.(B.pointerId),f=!1;const{x:S,y:z}=qt(B,s);n(n().selectionRect={width:0,height:0,startX:S,startY:z,x:S,y:z},!0),K||(B.stopPropagation(),B.preventDefault())}function N(B){if(!r(p)||!s||!n().selectionRect)return;const K=qt(B,s),{startX:Z=0,startY:x=0}=n().selectionRect;if(!f){const T=n().selectionKeyPressed?0:o();if(Math.hypot(K.x-Z,K.y-x)<=T)return;n().unselectNodesAndEdges(),e.onselectionstart?.(B)}f=!0;const S={...n().selectionRect,x:K.xT.id));const C=n().defaultEdgeOptions.selectable??!0;u=new Set;for(const T of l){const D=n().connectionLookup.get(T);if(D)for(const{edgeId:V}of D.values()){const L=n().edgeLookup.get(V);L&&(L.selectable??C)&&u.add(V)}}Os(z,l)||n(n().nodes=n().nodes.map(Ds(l)),!0),Os(g,u)||n(n().edges=n().edges.map(Ds(u)),!0),n(n().selectionRectMode="user",!0),n(n().selectionRect=S,!0)}function E(B){B.button===0&&(B.target?.releasePointerCapture?.(B.pointerId),!f&&B.target===i&&O?.(B),n(n().selectionRect=null,!0),f&&n(n().selectionRectMode=l.size>0?"nodes":null,!0),f&&e.onselectionend?.(B))}const I=B=>{if(Array.isArray(r(v))&&r(v).includes(2)){B.preventDefault();return}e.onpanecontextmenu?.({event:B})},H=B=>{f&&(B.stopPropagation(),f=!1)};function O(B){if(f||n().connection.inProgress){f=!1;return}e.onpaneclick?.({event:B}),n().unselectNodesAndEdges(),n(n().selectionRectMode=null,!0),n(n().selectionRect=null,!0)}var F=Yp();let M;var R=k(()=>r(m)?void 0:As(O,i)),b=k(()=>As(I,i)),A=d(F);Dt(A,()=>e.children),c(F),yn(F,B=>i=B,()=>i),$(B=>M=De(F,1,"svelte-flow__pane svelte-flow__container",null,M,B),[()=>({draggable:a()===!0||Array.isArray(a())&&a().includes(0),dragging:n().dragging,selection:r(p)})]),be("click",F,function(...B){r(R)?.apply(this,B)}),jr("pointerdown",F,function(...B){(r(m)?w:void 0)?.apply(this,B)},!0),be("pointermove",F,function(...B){(r(m)?N:void 0)?.apply(this,B)}),be("pointerup",F,function(...B){(r(m)?E:void 0)?.apply(this,B)}),be("contextmenu",F,function(...B){r(b)?.apply(this,B)}),jr("click",F,function(...B){(r(m)?H:void 0)?.apply(this,B)},!0),y(t,F),Ce()}_t(["click","pointermove","pointerup","contextmenu"]);var Xp=P('
    ');function Gp(t,e){ze(e,!0);var n=Xp();let a;var o=d(n);Dt(o,()=>e.children),c(n),$(()=>a=st(n,"",a,{transform:`translate(${e.store.viewport.x??""}px, ${e.store.viewport.y??""}px) scale(${e.store.viewport.zoom??""})`})),y(t,n),Ce()}function rl(t,e){const{store:n,onDrag:a,onDragStart:o,onDragStop:i,onNodeMouseDown:s}=e,l=Qf({onDrag:a,onDragStart:o,onDragStop:i,onNodeMouseDown:s,getStoreItems:()=>{const{snapGrid:v,viewport:p}=n;return{nodes:n.nodes,nodeLookup:n.nodeLookup,edges:n.edges,nodeExtent:n.nodeExtent,snapGrid:v||[0,0],snapToGrid:!!v,nodeOrigin:n.nodeOrigin,multiSelectionActive:n.multiselectionKeyPressed,domNode:n.domNode,transform:[p.x,p.y,p.zoom],autoPanOnNodeDrag:n.autoPanOnNodeDrag,nodesDraggable:n.nodesDraggable,selectNodesOnDrag:n.selectNodesOnDrag,nodeDragThreshold:n.nodeDragThreshold,unselectNodesAndEdges:n.unselectNodesAndEdges,updateNodePositions:n.updateNodePositions,onSelectionDrag:n.onselectiondrag,onSelectionDragStart:n.onselectiondragstart,onSelectionDragStop:n.onselectiondragstop,panBy:n.panBy}}});function u(v,p){if(p.disabled){l.destroy();return}l.update({domNode:v,noDragClassName:p.noDragClass,handleSelector:p.handleSelector,nodeId:p.nodeId,isSelectable:p.isSelectable,nodeClickDistance:p.nodeClickDistance})}return u(t,e),{update(v){u(t,v)},destroy(){l.destroy()}}}var Up=P('
    '),Qp=P('
    ',1);function Jp(t,e){ze(e,!0);var n=Qp(),a=de(n),o=d(a,!0);c(a);var i=h(a,2),s=d(i,!0);c(i);var l=h(i,2);{var u=v=>{var p=Up(),m=d(p,!0);c(p),$(()=>{xe(p,"id",`${$p}-${e.store.flowId}`),W(m,e.store.ariaLiveMessage)}),y(v,p)};Y(l,v=>{e.store.disableKeyboardA11y||v(u)})}$(()=>{xe(a,"id",`${al}-${e.store.flowId}`),W(o,e.store.disableKeyboardA11y?e.store.ariaLabelConfig["node.a11yDescription.default"]:e.store.ariaLabelConfig["node.a11yDescription.keyboardDisabled"]),xe(i,"id",`${ol}-${e.store.flowId}`),W(s,e.store.ariaLabelConfig["edge.a11yDescription.default"])}),y(t,n),Ce()}const al="svelte-flow__node-desc",ol="svelte-flow__edge-desc",$p="svelte-flow__aria-live";var eh=P("
    ");function th(t,e){ze(e,!0);let n=pe(e,"store",15),a=k(()=>St(e.node.data,()=>({}),!0)),o=k(()=>St(e.node.selected,!1)),i=k(()=>e.node.draggable),s=k(()=>e.node.selectable),l=k(()=>St(e.node.deletable,!0)),u=k(()=>e.node.connectable),v=k(()=>e.node.focusable),p=k(()=>St(e.node.hidden,!1)),m=k(()=>St(e.node.dragging,!1)),f=k(()=>St(e.node.style,"")),w=k(()=>e.node.class),N=k(()=>St(e.node.type,"default")),E=k(()=>e.node.parentId),I=k(()=>e.node.sourcePosition),H=k(()=>e.node.targetPosition),O=k(()=>St(e.node.measured,()=>({width:0,height:0}),!0).width),F=k(()=>St(e.node.measured,()=>({width:0,height:0}),!0).height),M=k(()=>e.node.initialWidth),R=k(()=>e.node.initialHeight),b=k(()=>e.node.width),A=k(()=>e.node.height),B=k(()=>e.node.dragHandle),K=k(()=>St(e.node.internals.z,0)),Z=k(()=>e.node.internals.positionAbsolute.x),x=k(()=>e.node.internals.positionAbsolute.y),S=k(()=>e.node.internals.userNode),{id:z}=e.node,g=k(()=>r(i)??n().nodesDraggable),C=k(()=>r(s)??n().elementsSelectable),T=k(()=>r(u)??n().nodesConnectable),D=k(()=>Ri(e.node)),V=k(()=>!!e.node.internals.handleBounds),L=k(()=>r(D)&&r(V)),q=k(()=>r(v)??n().nodesFocusable);function j(fe){return n().parentLookup.has(fe)}let U=k(()=>j(z)),X=Q(null),J=null,ae=r(N),re=r(I),ie=r(H),ne=k(()=>n().nodeTypes[r(N)]??$i),G=k(()=>n().ariaLabelConfig),oe={get value(){return r(T)}};fp(z),hp(oe);let ee=k(()=>{const fe=r(O)===void 0?r(b)??r(M):r(b),ke=r(F)===void 0?r(A)??r(R):r(A);if(!(fe===void 0&&ke===void 0&&r(f)===void 0))return`${r(f)};${fe?`width:${en(fe)};`:""}${ke?`height:${en(ke)};`:""}`});_e(()=>{(r(N)!==ae||r(I)!==re||r(H)!==ie)&&r(X)!==null&&requestAnimationFrame(()=>{r(X)!==null&&n().updateNodeInternals(new Map([[z,{id:z,nodeElement:r(X),force:!0}]]))}),ae=r(N),re=r(I),ie=r(H)}),_e(()=>{e.resizeObserver&&(!r(L)||r(X)!==J)&&(J&&e.resizeObserver.unobserve(J),r(X)&&e.resizeObserver.observe(r(X)),J=r(X))}),On(()=>{J&&e.resizeObserver?.unobserve(J)});function se(fe){r(C)&&(!n().selectNodesOnDrag||!r(g)||n().nodeDragThreshold>0)&&n().handleNodeSelection(z),e.onnodeclick?.({node:r(S),event:fe})}function te(fe){if(!(Vi(fe)||n().disableKeyboardA11y))if(Pi.includes(fe.key)&&r(C)){const ke=fe.key==="Escape";n().handleNodeSelection(z,ke,r(X))}else r(g)&&e.node.selected&&Object.prototype.hasOwnProperty.call(sa,fe.key)&&(fe.preventDefault(),n(n().ariaLiveMessage=r(G)["node.a11yDescription.ariaLiveMessage"]({direction:fe.key.replace("Arrow","").toLowerCase(),x:~~e.node.internals.positionAbsolute.x,y:~~e.node.internals.positionAbsolute.y}),!0),n().moveSelectedNodes(sa[fe.key],fe.shiftKey?4:1))}const ue=()=>{if(n().disableKeyboardA11y||!n().autoPanOnNodeFocus||!r(X)?.matches(":focus-visible"))return;const{width:fe,height:ke,viewport:Ae}=n();Co(new Map([[z,e.node]]),{x:0,y:0,width:fe,height:ke},[Ae.x,Ae.y,Ae.zoom],!0).length>0||n().setCenter(e.node.position.x+(e.node.measured.width??0)/2,e.node.position.y+(e.node.measured.height??0)/2,{zoom:Ae.zoom})};var le=Te(),he=de(le);{var ve=fe=>{var ke=eh();bn(ke,()=>({"data-id":z,class:["svelte-flow__node",`svelte-flow__node-${r(N)}`,r(w)],style:r(ee),onclick:se,onpointerenter:e.onnodepointerenter?ge=>e.onnodepointerenter({node:r(S),event:ge}):void 0,onpointerleave:e.onnodepointerleave?ge=>e.onnodepointerleave({node:r(S),event:ge}):void 0,onpointermove:e.onnodepointermove?ge=>e.onnodepointermove({node:r(S),event:ge}):void 0,oncontextmenu:e.onnodecontextmenu?ge=>e.onnodecontextmenu({node:r(S),event:ge}):void 0,onkeydown:r(q)?te:void 0,onfocus:r(q)?ue:void 0,tabIndex:r(q)?0:void 0,role:e.node.ariaRole??(r(q)?"group":void 0),"aria-roledescription":"node","aria-describedby":n().disableKeyboardA11y?void 0:`${al}-${n().flowId}`,...e.node.domAttributes,[lo]:{dragging:r(m),selected:r(o),draggable:r(g),connectable:r(T),selectable:r(C),nopan:r(g),parent:r(U)},[ia]:{"z-index":r(K),transform:`translate(${r(Z)??""}px, ${r(x)??""}px)`,visibility:r(D)?"visible":"hidden"}}));var Ae=d(ke);un(Ae,()=>r(ne),(ge,Oe)=>{Oe(ge,{get data(){return r(a)},get id(){return z},get selected(){return r(o)},get selectable(){return r(C)},get deletable(){return r(l)},get sourcePosition(){return r(I)},get targetPosition(){return r(H)},get zIndex(){return r(K)},get dragging(){return r(m)},get draggable(){return r(g)},get dragHandle(){return r(B)},get parentId(){return r(E)},get type(){return r(N)},get isConnectable(){return r(T)},get positionAbsoluteX(){return r(Z)},get positionAbsoluteY(){return r(x)},get width(){return r(b)},get height(){return r(A)}})}),c(ke),zt(ke,(ge,Oe)=>rl?.(ge,Oe),()=>({nodeId:z,isSelectable:r(C),disabled:!r(g),handleSelector:r(B),noDragClass:n().noDragClass,nodeClickDistance:e.nodeClickDistance,onNodeMouseDown:n().handleNodeSelection,onDrag:(ge,Oe,Ze,Xe)=>{e.onnodedrag?.({event:ge,targetNode:Ze,nodes:Xe})},onDragStart:(ge,Oe,Ze,Xe)=>{e.onnodedragstart?.({event:ge,targetNode:Ze,nodes:Xe})},onDragStop:(ge,Oe,Ze,Xe)=>{e.onnodedragstop?.({event:ge,targetNode:Ze,nodes:Xe})},store:n()})),yn(ke,ge=>_(X,ge),()=>r(X)),y(fe,ke)};Y(he,fe=>{r(p)||fe(ve)})}y(t,le),Ce()}var nh=P('
    ');function rh(t,e){ze(e,!0);let n=pe(e,"store",15);const a=typeof ResizeObserver>"u"?null:new ResizeObserver(i=>{const s=new Map;i.forEach(l=>{const u=l.target.getAttribute("data-id");s.set(u,{id:u,nodeElement:l.target,force:!0})}),n().updateNodeInternals(s)});On(()=>{a?.disconnect()});var o=nh();je(o,21,()=>n().visible.nodes.values(),i=>i.id,(i,s)=>{th(i,{get node(){return r(s)},get resizeObserver(){return a},get nodeClickDistance(){return e.nodeClickDistance},get onnodeclick(){return e.onnodeclick},get onnodepointerenter(){return e.onnodepointerenter},get onnodepointermove(){return e.onnodepointermove},get onnodepointerleave(){return e.onnodepointerleave},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get onnodecontextmenu(){return e.onnodecontextmenu},get store(){return n()},set store(l){n(l)}})}),c(o),y(t,o),Ce()}var ah=ut('');function oh(t,e){ze(e,!0);let n=k(()=>e.edge.id),a=k(()=>e.edge.source),o=k(()=>e.edge.target),i=k(()=>e.edge.sourceX),s=k(()=>e.edge.sourceY),l=k(()=>e.edge.targetX),u=k(()=>e.edge.targetY),v=k(()=>e.edge.sourcePosition),p=k(()=>e.edge.targetPosition),m=k(()=>St(e.edge.animated,!1)),f=k(()=>St(e.edge.selected,!1)),w=k(()=>e.edge.label),N=k(()=>e.edge.labelStyle),E=k(()=>St(e.edge.data,()=>({}),!0)),I=k(()=>e.edge.style),H=k(()=>e.edge.interactionWidth),O=k(()=>St(e.edge.type,"default")),F=k(()=>e.edge.sourceHandle),M=k(()=>e.edge.targetHandle),R=k(()=>e.edge.markerStart),b=k(()=>e.edge.markerEnd),A=k(()=>e.edge.selectable),B=k(()=>e.edge.focusable),K=k(()=>St(e.edge.deletable,!0)),Z=k(()=>e.edge.hidden),x=k(()=>e.edge.zIndex),S=k(()=>e.edge.class),z=k(()=>e.edge.ariaLabel);mp(r(n));let g=null,C=k(()=>r(A)??e.store.elementsSelectable),T=k(()=>r(B)??e.store.edgesFocusable),D=k(()=>e.store.edgeTypes[r(O)]??el),V=k(()=>r(R)?`url('#${ao(r(R),e.store.flowId)}')`:void 0),L=k(()=>r(b)?`url('#${ao(r(b),e.store.flowId)}')`:void 0);function q(re){const ie=e.store.edgeLookup.get(r(n));ie&&(r(C)&&e.store.handleEdgeSelection(r(n)),e.onedgeclick?.({event:re,edge:ie}))}function j(re,ie){const ne=e.store.edgeLookup.get(r(n));ne&&ie({event:re,edge:ne})}function U(re){if(!e.store.disableKeyboardA11y&&Pi.includes(re.key)&&r(C)){const{unselectNodesAndEdges:ie,addSelectedEdges:ne}=e.store;re.key==="Escape"?(g?.blur(),ie({edges:[e.edge]})):ne([r(n)])}}var X=Te(),J=de(X);{var ae=re=>{var ie=ah();let ne;var G=d(ie);bn(G,()=>({class:["svelte-flow__edge",r(S)],"data-id":r(n),onclick:q,oncontextmenu:e.onedgecontextmenu?ee=>{j(ee,e.onedgecontextmenu)}:void 0,onpointerenter:e.onedgepointerenter?ee=>{j(ee,e.onedgepointerenter)}:void 0,onpointerleave:e.onedgepointerleave?ee=>{j(ee,e.onedgepointerleave)}:void 0,"aria-label":r(z)===null?void 0:r(z)?r(z):`Edge from ${r(a)} to ${r(o)}`,"aria-describedby":r(T)?`${ol}-${e.store.flowId}`:void 0,role:e.edge.ariaRole??(r(T)?"group":"img"),"aria-roledescription":"edge",onkeydown:r(T)?U:void 0,tabindex:r(T)?0:void 0,...e.edge.domAttributes,[lo]:{animated:r(m),selected:r(f),selectable:r(C)}}));var oe=d(G);un(oe,()=>r(D),(ee,se)=>{se(ee,{get id(){return r(n)},get source(){return r(a)},get target(){return r(o)},get sourceX(){return r(i)},get sourceY(){return r(s)},get targetX(){return r(l)},get targetY(){return r(u)},get sourcePosition(){return r(v)},get targetPosition(){return r(p)},get animated(){return r(m)},get selected(){return r(f)},get label(){return r(w)},get labelStyle(){return r(N)},get data(){return r(E)},get style(){return r(I)},get interactionWidth(){return r(H)},get selectable(){return r(C)},get deletable(){return r(K)},get type(){return r(O)},get sourceHandleId(){return r(F)},get targetHandleId(){return r(M)},get markerStart(){return r(V)},get markerEnd(){return r(L)}})}),c(G),yn(G,ee=>g=ee,()=>g),c(ie),$(()=>ne=st(ie,"",ne,{"z-index":r(x)})),y(re,ie)};Y(J,re=>{r(Z)||re(ae)})}y(t,X),Ce()}var sh=ut("");function ih(t,e){ze(e,!1);const n=fn();Ls();var a=sh();je(a,5,()=>n.markers,o=>o.id,(o,i)=>{uh(o,We(()=>r(i)))}),c(a),y(t,a),Ce()}var lh=ut(''),ch=ut(''),dh=ut('');function uh(t,e){ze(e,!0);let n=pe(e,"width",3,12.5),a=pe(e,"height",3,12.5),o=pe(e,"markerUnits",3,"strokeWidth"),i=pe(e,"orient",3,"auto-start-reverse"),s=pe(e,"color",3,"none");var l=dh(),u=d(l);{var v=m=>{var f=lh();let w;$(()=>{xe(f,"stroke-width",e.strokeWidth),w=st(f,"",w,{stroke:s()})}),y(m,f)},p=m=>{var f=ch();let w;$(()=>{xe(f,"stroke-width",e.strokeWidth),w=st(f,"",w,{stroke:s(),fill:s()})}),y(m,f)};Y(u,m=>{e.type===ra.Arrow?m(v):e.type===ra.ArrowClosed&&m(p,1)})}c(l),$(()=>{xe(l,"id",e.id),xe(l,"markerWidth",`${n()}`),xe(l,"markerHeight",`${a()}`),xe(l,"markerUnits",o()),xe(l,"orient",i())}),y(t,l),Ce()}var vh=P('
    ');function fh(t,e){ze(e,!0);let n=pe(e,"store",15);var a=vh(),o=d(a),i=d(o);ih(i,{}),c(o);var s=h(o,2);je(s,17,()=>n().visible.edges.values(),l=>l.id,(l,u)=>{oh(l,{get edge(){return r(u)},get onedgeclick(){return e.onedgeclick},get onedgecontextmenu(){return e.onedgecontextmenu},get onedgepointerenter(){return e.onedgepointerenter},get onedgepointerleave(){return e.onedgepointerleave},get store(){return n()},set store(v){n(v)}})}),c(a),y(t,a),Ce()}var ph=P('
    ');function sl(t,e){ze(e,!0);let n=pe(e,"x",3,0),a=pe(e,"y",3,0),o=pe(e,"width",3,0),i=pe(e,"height",3,0),s=pe(e,"isVisible",3,!0);var l=Te(),u=de(l);{var v=p=>{var m=ph();let f;$(w=>f=st(m,"",f,w),[()=>({width:typeof o()=="string"?o():en(o()),height:typeof i()=="string"?i():en(i()),transform:`translate(${n()}px, ${a()}px)`})]),y(p,m)};Y(u,p=>{s()&&p(v)})}y(t,l),Ce()}var hh=P("
    ");function gh(t,e){ze(e,!0);let n=Q(void 0);_e(()=>{e.store.disableKeyboardA11y||r(n)?.focus({preventScroll:!0})});let a=k(()=>{if(e.store.selectionRectMode==="nodes"){e.store.nodes;const m=xr(e.store.nodeLookup,{filter:f=>!!f.selected});if(m.width>0&&m.height>0)return m}return null});function o(m){const f=e.store.nodes.filter(w=>w.selected);e.onselectioncontextmenu?.({nodes:f,event:m})}function i(m){const f=e.store.nodes.filter(w=>w.selected);e.onselectionclick?.({nodes:f,event:m})}function s(m){Object.prototype.hasOwnProperty.call(sa,m.key)&&(m.preventDefault(),e.store.moveSelectedNodes(sa[m.key],m.shiftKey?4:1))}var l=Te(),u=de(l);{var v=m=>{var f=hh();let w;var N=d(f);sl(N,{width:"100%",height:"100%",x:0,y:0}),c(f),zt(f,(E,I)=>rl?.(E,I),()=>({disabled:!1,store:e.store,onDrag:(E,I,H,O)=>{e.onnodedrag?.({event:E,targetNode:null,nodes:O})},onDragStart:(E,I,H,O)=>{e.onnodedragstart?.({event:E,targetNode:null,nodes:O})},onDragStop:(E,I,H,O)=>{e.onnodedragstop?.({event:E,targetNode:null,nodes:O})}})),yn(f,E=>_(n,E),()=>r(n)),$(E=>{De(f,1,Rn(["svelte-flow__selection-wrapper",e.store.noPanClass]),"svelte-sf2y5e"),xe(f,"role",e.store.disableKeyboardA11y?void 0:"button"),xe(f,"tabindex",e.store.disableKeyboardA11y?void 0:-1),w=st(f,"",w,E)},[()=>({width:en(r(a).width),height:en(r(a).height),transform:`translate(${r(a).x??""}px, ${r(a).y??""}px)`})]),be("contextmenu",f,o),be("click",f,i),be("keydown",f,function(...E){(e.store.disableKeyboardA11y?void 0:s)?.apply(this,E)}),y(m,f)},p=k(()=>e.store.selectionRectMode==="nodes"&&r(a)&&ln(r(a).x)&&ln(r(a).y));Y(u,m=>{r(p)&&m(v)})}y(t,l),Ce()}_t(["contextmenu","click","keydown"]);function mh(t){switch(t){case"ctrl":return 8;case"shift":return 4;case"alt":return 2;case"meta":return 1}}function Gt(t,e){let{enabled:n=!0,trigger:a,type:o="keydown"}=e;function i(l){const u=Array.isArray(a)?a:[a],v=[l.metaKey,l.altKey,l.shiftKey,l.ctrlKey].reduce((p,m,f)=>m?p|1<0){const O=Array.isArray(f)?f:[f];let F=!1;for(const M of O)if((Array.isArray(M)?M:[M]).reduce((b,A)=>b|mh(A),0)===v){F=!0;break}if(!F)continue}E&&l.preventDefault();const H={node:t,trigger:m,originalEvent:l};t.dispatchEvent(new CustomEvent("shortcut",{detail:H})),N?.(H)}}}let s;return n&&(s=qa(t,o,i)),{update:l=>{const{enabled:u=!0,type:v="keydown"}=l;n&&(!u||o!==v)?s?.():!n&&u&&(s=qa(t,v,i)),n=u,o=v,a=l.trigger},destroy:()=>{s?.()}}}function _h(){const t=k(fn),e=i=>{const s=Ts(i)?i:r(t).nodeLookup.get(i.id),l=s.parentId?Sf(s.position,s.measured,s.parentId,r(t).nodeLookup,r(t).nodeOrigin):s.position,u={...s,position:l,width:s.measured?.width??s.width,height:s.measured?.height??s.height};return $n(u)};function n(i,s,l={replace:!1}){r(t).nodes=Qt(()=>r(t).nodes).map(u=>{if(u.id===i){const v=typeof s=="function"?s(u):s;return l?.replace&&Ts(v)?v:{...u,...v}}return u})}function a(i,s,l={replace:!1}){r(t).edges=Qt(()=>r(t).edges).map(u=>{if(u.id===i){const v=typeof s=="function"?s(u):s;return l.replace&&Ep(v)?v:{...u,...v}}return u})}const o=i=>r(t).nodeLookup.get(i);return{zoomIn:r(t).zoomIn,zoomOut:r(t).zoomOut,getInternalNode:o,getNode:i=>o(i)?.internals.userNode,getNodes:i=>i===void 0?r(t).nodes:Rs(r(t).nodeLookup,i),getEdge:i=>r(t).edgeLookup.get(i),getEdges:i=>i===void 0?r(t).edges:Rs(r(t).edgeLookup,i),setZoom:(i,s)=>{const l=r(t).panZoom;return l?l.scaleTo(i,{duration:s?.duration}):Promise.resolve(!1)},getZoom:()=>r(t).viewport.zoom,setViewport:async(i,s)=>{const l=r(t).viewport;return r(t).panZoom?(await r(t).panZoom.setViewport({x:i.x??l.x,y:i.y??l.y,zoom:i.zoom??l.zoom},s),Promise.resolve(!0)):Promise.resolve(!1)},getViewport:()=>$s(r(t).viewport),setCenter:async(i,s,l)=>r(t).setCenter(i,s,l),fitView:i=>r(t).fitView(i),fitBounds:async(i,s)=>{if(!r(t).panZoom)return Promise.resolve(!1);const l=Eo(i,r(t).width,r(t).height,r(t).minZoom,r(t).maxZoom,s?.padding??.1);return await r(t).panZoom.setViewport(l,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)},getIntersectingNodes:(i,s=!0,l)=>{const u=ys(i),v=u?i:e(i);return v?(l||r(t).nodes).filter(p=>{const m=r(t).nodeLookup.get(p.id);if(!m||!u&&p.id===i.id)return!1;const f=$n(m),w=gr(f,v);return s&&w>0||w>=f.width*f.height||w>=v.width*v.height}):[]},isNodeIntersecting:(i,s,l=!0)=>{const v=ys(i)?i:e(i);if(!v)return!1;const p=gr(v,s);return l&&p>0||p>=s.width*s.height||p>=v.width*v.height},deleteElements:async({nodes:i=[],edges:s=[]})=>{const{nodes:l,edges:u}=await bf({nodesToRemove:i,edgesToRemove:s,nodes:r(t).nodes,edges:r(t).edges,onBeforeDelete:r(t).onbeforedelete});return l&&(r(t).nodes=Qt(()=>r(t).nodes).filter(v=>!l.some(({id:p})=>p===v.id))),u&&(r(t).edges=Qt(()=>r(t).edges).filter(v=>!u.some(({id:p})=>p===v.id))),(l.length>0||u.length>0)&&r(t).ondelete?.({nodes:l,edges:u}),{deletedNodes:l,deletedEdges:u}},screenToFlowPosition:(i,s={snapToGrid:!0})=>{if(!r(t).domNode)return i;const l=s.snapToGrid?r(t).snapGrid:!1,{x:u,y:v,zoom:p}=r(t).viewport,{x:m,y:f}=r(t).domNode.getBoundingClientRect(),w={x:i.x-m,y:i.y-f};return kr(w,[u,v,p],l!==null,l||[1,1])},flowToScreenPosition:i=>{if(!r(t).domNode)return i;const{x:s,y:l,zoom:u}=r(t).viewport,{x:v,y:p}=r(t).domNode.getBoundingClientRect(),m=oa(i,[s,l,u]);return{x:m.x+v,y:m.y+p}},toObject:()=>structuredClone({nodes:[...r(t).nodes],edges:[...r(t).edges],viewport:{...r(t).viewport}}),updateNode:n,updateNodeData:(i,s,l)=>{const u=r(t).nodeLookup.get(i)?.internals.userNode;if(!u)return;const v=typeof s=="function"?s(u):s;n(i,p=>({...p,data:l?.replace?v:{...p.data,...v}}))},updateEdge:a,getNodesBounds:i=>gf(i,{nodeLookup:r(t).nodeLookup,nodeOrigin:r(t).nodeOrigin}),getHandleConnections:({type:i,id:s,nodeId:l})=>Array.from(r(t).connectionLookup.get(`${l}-${i}-${s??null}`)?.values()??[])}}function Rs(t,e){const n=[];for(const a of e){const o=t.get(a);if(o){const i="internals"in o?o.internals?.userNode:o;n.push(i)}}return n}function yh(t,e){ze(e,!0);let n=pe(e,"store",15),a=pe(e,"selectionKey",3,"Shift"),o=pe(e,"multiSelectionKey",19,()=>mr()?"Meta":"Control"),i=pe(e,"deleteKey",3,"Backspace"),s=pe(e,"panActivationKey",3," "),l=pe(e,"zoomActivationKey",19,()=>mr()?"Meta":"Control"),{deleteElements:u}=_h();function v(E){return E!==null&&typeof E=="object"}function p(E){return v(E)?E.modifier||[]:[]}function m(E){return E==null?"":v(E)?E.key:E}function f(E,I){return(Array.isArray(E)?E:[E]).map(O=>{const F=m(O);return{key:F,modifier:p(O),enabled:F!==null,callback:I}})}function w(){n(n().selectionRect=null,!0),n(n().selectionKeyPressed=!1,!0),n(n().multiselectionKeyPressed=!1,!0),n(n().deleteKeyPressed=!1,!0),n(n().panActivationKeyPressed=!1,!0),n(n().zoomActivationKeyPressed=!1,!0)}function N(){const E=n().nodes.filter(H=>H.selected),I=n().edges.filter(H=>H.selected);u({nodes:E,edges:I})}jr("blur",It,w),jr("contextmenu",It,w),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(a(),()=>n(n().selectionKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(a(),()=>n(n().selectionKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(o(),()=>{n(n().multiselectionKeyPressed=!0,!0)}),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(o(),()=>n(n().multiselectionKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(i(),E=>{!(E.originalEvent.ctrlKey||E.originalEvent.metaKey||E.originalEvent.shiftKey)&&!Vi(E.originalEvent)&&(n(n().deleteKeyPressed=!0,!0),N())}),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(i(),()=>n(n().deleteKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(s(),()=>n(n().panActivationKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(s(),()=>n(n().panActivationKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(l(),()=>n(n().zoomActivationKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(l(),()=>n(n().zoomActivationKeyPressed=!1,!0)),type:"keyup"})),Ce()}var bh=ut(''),xh=ut('');function wh(t,e){ze(e,!0);let n=k(()=>{if(!e.store.connection.inProgress)return"";const s={sourceX:e.store.connection.from.x,sourceY:e.store.connection.from.y,sourcePosition:e.store.connection.fromPosition,targetX:e.store.connection.to.x,targetY:e.store.connection.to.y,targetPosition:e.store.connection.toPosition};switch(e.type){case gn.Bezier:{const[l]=Bi(s);return l}case gn.Straight:{const[l]=Ki(s);return l}case gn.Step:case gn.SmoothStep:{const[l]=No({...s,borderRadius:e.type===gn.Step?0:void 0});return l}}});var a=Te(),o=de(a);{var i=s=>{var l=xh(),u=d(l),v=d(u);{var p=f=>{var w=Te(),N=de(w);un(N,()=>e.LineComponent,(E,I)=>{I(E,{})}),y(f,w)},m=f=>{var w=bh();$(()=>{xe(w,"d",r(n)),st(w,e.style)}),y(f,w)};Y(v,f=>{e.LineComponent?f(p):f(m,!1)})}c(u),c(l),$(f=>{xe(l,"width",e.store.width),xe(l,"height",e.store.height),st(l,e.containerStyle),De(u,0,f)},[()=>Rn(["svelte-flow__connection",pf(e.store.connection.isValid)])]),y(s,l)};Y(o,s=>{e.store.connection.inProgress&&s(i)})}y(t,a),Ce()}var kh=P("
    ");function Do(t,e){ze(e,!0);let n=pe(e,"position",3,"top-right"),a=_n(e,["$$slots","$$events","$$legacy","position","style","class","children"]),o=k(()=>`${n()}`.split("-"));var i=kh();bn(i,l=>({class:l,style:e.style,...a}),[()=>["svelte-flow__panel",e.class,...r(o)]]);var s=d(i);Dt(s,()=>e.children??tr),c(i),y(t,i),Ce()}var Sh=P('Svelte Flow');function zh(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-right");var a=Te(),o=de(a);{var i=s=>{Do(s,{get position(){return n()},class:"svelte-flow__attribution","data-message":"Feel free to remove the attribution or check out how you could support us: https://svelteflow.dev/support-us",children:(l,u)=>{var v=Sh();y(l,v)},$$slots:{default:!0}})};Y(o,s=>{e.proOptions?.hideAttribution||s(i)})}y(t,a),Ce()}var Ch=P("
    ");function Eh(t,e){ze(e,!0);let n=pe(e,"domNode",15),a=pe(e,"clientWidth",15),o=pe(e,"clientHeight",15),i=k(()=>e.rest.class),s=k(()=>Fl(e.rest,["id","class","nodeTypes","edgeTypes","colorMode","isValidConnection","onmove","onmovestart","onmoveend","onflowerror","ondelete","onbeforedelete","onbeforeconnect","onconnect","onconnectstart","onconnectend","onbeforereconnect","onreconnect","onreconnectstart","onreconnectend","onclickconnectstart","onclickconnectend","oninit","onselectionchange","onselectiondragstart","onselectiondrag","onselectiondragstop","onselectionstart","onselectionend","clickConnect","fitView","fitViewOptions","nodeOrigin","nodeDragThreshold","connectionDragThreshold","minZoom","maxZoom","initialViewport","connectionRadius","connectionMode","selectionMode","selectNodesOnDrag","snapGrid","defaultMarkerColor","translateExtent","nodeExtent","onlyRenderVisibleElements","autoPanOnConnect","autoPanOnNodeDrag","colorModeSSR","defaultEdgeOptions","elevateNodesOnSelect","elevateEdgesOnSelect","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","elementsSelectable","nodesFocusable","edgesFocusable","disableKeyboardA11y","noDragClass","noPanClass","noWheelClass","ariaLabelConfig","autoPanSpeed","panOnScrollSpeed","zIndexMode"]));function l(p){p.currentTarget.scrollTo({top:0,left:0,behavior:"auto"}),e.rest.onscroll&&e.rest.onscroll(p)}var u=Ch();bn(u,p=>({class:["svelte-flow","svelte-flow__container",r(i),e.colorMode],"data-testid":"svelte-flow__wrapper",role:"application",onscroll:l,...r(s),[ia]:p}),[()=>({width:en(e.width),height:en(e.height)})],void 0,void 0,"svelte-mkap6j");var v=d(u);Dt(v,()=>e.children??tr),c(u),yn(u,p=>n(p),()=>n()),Qo(u,"clientHeight",o),Qo(u,"clientWidth",a),y(t,u),Ce()}var Nh=P('
    ',1),Mh=P(" ",1),Ph=P(" ",1);function Th(t,e){ze(e,!0);let n=pe(e,"paneClickDistance",3,1),a=pe(e,"nodeClickDistance",3,1),o=pe(e,"panOnScrollMode",19,()=>Yn.Free),i=pe(e,"preventScrolling",3,!0),s=pe(e,"zoomOnScroll",3,!0),l=pe(e,"zoomOnDoubleClick",3,!0),u=pe(e,"zoomOnPinch",3,!0),v=pe(e,"panOnScroll",3,!1),p=pe(e,"panOnScrollSpeed",3,.5),m=pe(e,"panOnDrag",3,!0),f=pe(e,"selectionOnDrag",3,!1),w=pe(e,"connectionLineType",19,()=>gn.Bezier),N=pe(e,"nodes",31,()=>$t([])),E=pe(e,"edges",31,()=>$t([])),I=pe(e,"viewport",15,void 0),H=_n(e,["$$slots","$$events","$$legacy","width","height","proOptions","selectionKey","deleteKey","panActivationKey","multiSelectionKey","zoomActivationKey","paneClickDistance","nodeClickDistance","onmovestart","onmoveend","onmove","oninit","onnodeclick","onnodecontextmenu","onnodedrag","onnodedragstart","onnodedragstop","onnodepointerenter","onnodepointermove","onnodepointerleave","onselectionclick","onselectioncontextmenu","onselectionstart","onselectionend","onedgeclick","onedgecontextmenu","onedgepointerenter","onedgepointerleave","onpaneclick","onpanecontextmenu","panOnScrollMode","preventScrolling","zoomOnScroll","zoomOnDoubleClick","zoomOnPinch","panOnScroll","panOnScrollSpeed","panOnDrag","selectionOnDrag","connectionLineComponent","connectionLineStyle","connectionLineContainerStyle","connectionLineType","attributionPosition","children","nodes","edges","viewport"]),O=qp({props:H,width:e.width,height:e.height,get nodes(){return N()},set nodes(M){N(M)},get edges(){return E()},set edges(M){E(M)},get viewport(){return I()},set viewport(M){I(M)}});const F=so(oo);F&&F.setStore&&F.setStore(O),Fs(oo,{provider:!1,getStore(){return O}}),_e(()=>{const M={nodes:O.selectedNodes,edges:O.selectedEdges};Qt(()=>e.onselectionchange)?.(M);for(const R of O.selectionChangeHandlers.values())R(M)}),On(()=>{O.reset()}),Eh(t,{get colorMode(){return O.colorMode},get width(){return e.width},get height(){return e.height},get rest(){return H},get domNode(){return O.domNode},set domNode(M){O.domNode=M},get clientWidth(){return O.width},set clientWidth(M){O.width=M},get clientHeight(){return O.height},set clientHeight(M){O.height=M},children:(M,R)=>{var b=Ph(),A=de(b);yh(A,{get selectionKey(){return e.selectionKey},get deleteKey(){return e.deleteKey},get panActivationKey(){return e.panActivationKey},get multiSelectionKey(){return e.multiSelectionKey},get zoomActivationKey(){return e.zoomActivationKey},get store(){return O},set store(S){O=S}});var B=h(A,2);Zp(B,{get panOnScrollMode(){return o()},get preventScrolling(){return i()},get zoomOnScroll(){return s()},get zoomOnDoubleClick(){return l()},get zoomOnPinch(){return u()},get panOnScroll(){return v()},get panOnScrollSpeed(){return p()},get panOnDrag(){return m()},get paneClickDistance(){return n()},get selectionOnDrag(){return f()},get onmovestart(){return e.onmovestart},get onmove(){return e.onmove},get onmoveend(){return e.onmoveend},get oninit(){return e.oninit},get store(){return O},set store(S){O=S},children:(S,z)=>{Wp(S,{get onpaneclick(){return e.onpaneclick},get onpanecontextmenu(){return e.onpanecontextmenu},get onselectionstart(){return e.onselectionstart},get onselectionend(){return e.onselectionend},get panOnDrag(){return m()},get paneClickDistance(){return n()},get selectionOnDrag(){return f()},get store(){return O},set store(g){O=g},children:(g,C)=>{var T=Mh(),D=de(T);Gp(D,{get store(){return O},set store(L){O=L},children:(L,q)=>{var j=Nh(),U=h(de(j),2);fh(U,{get onedgeclick(){return e.onedgeclick},get onedgecontextmenu(){return e.onedgecontextmenu},get onedgepointerenter(){return e.onedgepointerenter},get onedgepointerleave(){return e.onedgepointerleave},get store(){return O},set store(re){O=re}});var X=h(U,4);wh(X,{get type(){return w()},get LineComponent(){return e.connectionLineComponent},get containerStyle(){return e.connectionLineContainerStyle},get style(){return e.connectionLineStyle},get store(){return O},set store(re){O=re}});var J=h(X,2);rh(J,{get nodeClickDistance(){return a()},get onnodeclick(){return e.onnodeclick},get onnodecontextmenu(){return e.onnodecontextmenu},get onnodepointerenter(){return e.onnodepointerenter},get onnodepointermove(){return e.onnodepointermove},get onnodepointerleave(){return e.onnodepointerleave},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get store(){return O},set store(re){O=re}});var ae=h(J,2);gh(ae,{get onselectionclick(){return e.onselectionclick},get onselectioncontextmenu(){return e.onselectioncontextmenu},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get store(){return O},set store(re){O=re}}),ye(2),y(L,j)},$$slots:{default:!0}});var V=h(D,2);{let L=k(()=>!!(O.selectionRect&&O.selectionRectMode==="user")),q=k(()=>O.selectionRect?.width),j=k(()=>O.selectionRect?.height),U=k(()=>O.selectionRect?.x),X=k(()=>O.selectionRect?.y);sl(V,{get isVisible(){return r(L)},get width(){return r(q)},get height(){return r(j)},get x(){return r(U)},get y(){return r(X)}})}y(g,T)},$$slots:{default:!0}})},$$slots:{default:!0}});var K=h(B,2);zh(K,{get proOptions(){return e.proOptions},get position(){return e.attributionPosition}});var Z=h(K,2);Jp(Z,{get store(){return O}});var x=h(Z,2);Dt(x,()=>e.children??tr),y(M,b)},$$slots:{default:!0}}),Ce()}var Ih=P("");function Lr(t,e){let n=_n(e,["$$slots","$$events","$$legacy","class","bgColor","bgColorHover","color","colorHover","borderColor","onclick","children"]);var a=Ih();bn(a,()=>({type:"button",onclick:e.onclick,class:["svelte-flow__controls-button",e.class],...n,[ia]:{"--xy-controls-button-background-color-props":e.bgColor,"--xy-controls-button-background-color-hover-props":e.bgColorHover,"--xy-controls-button-color-props":e.color,"--xy-controls-button-color-hover-props":e.colorHover,"--xy-controls-button-border-color-props":e.borderColor}}));var o=d(a);Dt(o,()=>e.children??tr),c(a),y(t,a)}var Ah=ut('');function Dh(t){var e=Ah();y(t,e)}var Oh=ut('');function Rh(t){var e=Oh();y(t,e)}var Lh=ut('');function Hh(t){var e=Lh();y(t,e)}var Vh=ut('');function Fh(t){var e=Vh();y(t,e)}var Bh=ut('');function qh(t){var e=Bh();y(t,e)}var Kh=P(" ",1),jh=P(" ",1);function Zh(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-left"),a=pe(e,"orientation",3,"vertical"),o=pe(e,"showZoom",3,!0),i=pe(e,"showFitView",3,!0),s=pe(e,"showLock",3,!0),l=_n(e,["$$slots","$$events","$$legacy","position","orientation","showZoom","showFitView","showLock","style","class","buttonBgColor","buttonBgColorHover","buttonColor","buttonColorHover","buttonBorderColor","fitViewOptions","children","before","after"]),u=k(fn);const v={bgColor:e.buttonBgColor,bgColorHover:e.buttonBgColorHover,color:e.buttonColor,colorHover:e.buttonColorHover,borderColor:e.buttonBorderColor};let p=k(()=>r(u).nodesDraggable||r(u).nodesConnectable||r(u).elementsSelectable),m=k(()=>r(u).viewport.zoom<=r(u).minZoom),f=k(()=>r(u).viewport.zoom>=r(u).maxZoom),w=k(()=>r(u).ariaLabelConfig),N=k(()=>a()==="horizontal"?"horizontal":"vertical");const E=()=>{r(u).zoomIn()},I=()=>{r(u).zoomOut()},H=()=>{r(u).fitView(e.fitViewOptions)},O=()=>{let F=!r(p);r(u).nodesDraggable=F,r(u).nodesConnectable=F,r(u).elementsSelectable=F};{let F=k(()=>["svelte-flow__controls",r(N),e.class]);Do(t,We({get class(){return r(F)},get position(){return n()},"data-testid":"svelte-flow__controls",get"aria-label"(){return r(w)["controls.ariaLabel"]},get style(){return e.style}},()=>l,{children:(M,R)=>{var b=jh(),A=de(b);{var B=L=>{var q=Te(),j=de(q);Dt(j,()=>e.before),y(L,q)};Y(A,L=>{e.before&&L(B)})}var K=h(A,2);{var Z=L=>{var q=Kh(),j=de(q);Lr(j,We({onclick:E,class:"svelte-flow__controls-zoomin",get title(){return r(w)["controls.zoomIn.ariaLabel"]},get"aria-label"(){return r(w)["controls.zoomIn.ariaLabel"]},get disabled(){return r(f)}},()=>v,{children:(X,J)=>{Dh(X)},$$slots:{default:!0}}));var U=h(j,2);Lr(U,We({onclick:I,class:"svelte-flow__controls-zoomout",get title(){return r(w)["controls.zoomOut.ariaLabel"]},get"aria-label"(){return r(w)["controls.zoomOut.ariaLabel"]},get disabled(){return r(m)}},()=>v,{children:(X,J)=>{Rh(X)},$$slots:{default:!0}})),y(L,q)};Y(K,L=>{o()&&L(Z)})}var x=h(K,2);{var S=L=>{Lr(L,We({class:"svelte-flow__controls-fitview",onclick:H,get title(){return r(w)["controls.fitView.ariaLabel"]},get"aria-label"(){return r(w)["controls.fitView.ariaLabel"]}},()=>v,{children:(q,j)=>{Hh(q)},$$slots:{default:!0}}))};Y(x,L=>{i()&&L(S)})}var z=h(x,2);{var g=L=>{Lr(L,We({class:"svelte-flow__controls-interactive",onclick:O,get title(){return r(w)["controls.interactive.ariaLabel"]},get"aria-label"(){return r(w)["controls.interactive.ariaLabel"]}},()=>v,{children:(q,j)=>{var U=Te(),X=de(U);{var J=re=>{qh(re)},ae=re=>{Fh(re)};Y(X,re=>{r(p)?re(J):re(ae,!1)})}y(q,U)},$$slots:{default:!0}}))};Y(z,L=>{s()&&L(g)})}var C=h(z,2);{var T=L=>{var q=Te(),j=de(q);Dt(j,()=>e.children),y(L,q)};Y(C,L=>{e.children&&L(T)})}var D=h(C,2);{var V=L=>{var q=Te(),j=de(q);Dt(j,()=>e.after),y(L,q)};Y(D,L=>{e.after&&L(V)})}y(M,b)},$$slots:{default:!0}}))}Ce()}var cn;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(cn||(cn={}));var Yh=ut("");function Wh(t,e){var n=Yh();$(()=>{xe(n,"cx",e.radius),xe(n,"cy",e.radius),xe(n,"r",e.radius),De(n,0,Rn(["svelte-flow__background-pattern","dots",e.class]))}),y(t,n)}var Xh=ut("");function Gh(t,e){ze(e,!0);var n=Xh();$(()=>{xe(n,"stroke-width",e.lineWidth),xe(n,"d",`M${e.dimensions[0]/2} 0 V${e.dimensions[1]} M0 ${e.dimensions[1]/2} H${e.dimensions[0]}`),De(n,0,Rn(["svelte-flow__background-pattern",e.variant,e.class]))}),y(t,n),Ce()}const Uh={[cn.Dots]:1,[cn.Lines]:1,[cn.Cross]:6};var Qh=ut('');function Jh(t,e){ze(e,!0);let n=pe(e,"variant",19,()=>cn.Dots),a=pe(e,"gap",3,20),o=pe(e,"lineWidth",3,1),i=k(fn),s=k(()=>n()===cn.Dots),l=k(()=>n()===cn.Cross),u=k(()=>Array.isArray(a())?a():[a(),a()]),v=k(()=>`background-pattern-${r(i).flowId}-${e.id??""}`),p=k(()=>[r(u)[0]*r(i).viewport.zoom||1,r(u)[1]*r(i).viewport.zoom||1]),m=k(()=>(e.size??Uh[n()])*r(i).viewport.zoom),f=k(()=>r(l)?[r(m),r(m)]:r(p)),w=k(()=>r(s)?[r(m)/2,r(m)/2]:[r(f)[0]/2,r(f)[1]/2]);var N=Qh();let E;var I=d(N),H=d(I);{var O=R=>{{let b=k(()=>r(m)/2);Wh(R,{get radius(){return r(b)},get class(){return e.patternClass}})}},F=R=>{Gh(R,{get dimensions(){return r(f)},get variant(){return n()},get lineWidth(){return o()},get class(){return e.patternClass}})};Y(H,R=>{r(s)?R(O):R(F,!1)})}c(I);var M=h(I);c(N),$(()=>{De(N,0,Rn(["svelte-flow__background","svelte-flow__container",e.class])),E=st(N,"",E,{"--xy-background-color-props":e.bgColor,"--xy-background-pattern-color-props":e.patternColor}),xe(I,"id",r(v)),xe(I,"x",r(i).viewport.x%r(p)[0]),xe(I,"y",r(i).viewport.y%r(p)[1]),xe(I,"width",r(p)[0]),xe(I,"height",r(p)[1]),xe(I,"patternTransform",`translate(-${r(w)[0]},-${r(w)[1]})`),xe(M,"fill",`url(#${r(v)})`)}),y(t,N),Ce()}function $h(t){const e=k(fn),n=k(()=>r(e).nodeLookup),a=k(()=>r(e).nodes),o=k(()=>(r(a),r(n).get(t)));return{get current(){return r(o)}}}var eg=ut("");function tg(t,e){ze(e,!0);let n=pe(e,"borderRadius",3,5),a=pe(e,"strokeWidth",3,2),o=k(()=>$h(e.id)),i=k(()=>{if(!r(o).current)return{width:0,height:0,x:0,y:0};const{width:N,height:E}=xn(r(o).current);return{width:e.width??N,height:e.height??E,x:e.x??r(o).current.internals.positionAbsolute.x,y:e.y??r(o).current.internals.positionAbsolute.y}}),s=k(()=>r(i).width),l=k(()=>r(i).height),u=k(()=>r(i).x),v=k(()=>r(i).y);var p=Te(),m=de(p);{var f=N=>{const E=k(()=>e.nodeComponent);var I=Te(),H=de(I);un(H,()=>r(E),(O,F)=>{F(O,{get id(){return e.id},get x(){return r(u)},get y(){return r(v)},get width(){return r(s)},get height(){return r(l)},get borderRadius(){return n()},get class(){return e.class},get color(){return e.color},get shapeRendering(){return e.shapeRendering},get strokeColor(){return e.strokeColor},get strokeWidth(){return a()},get selected(){return e.selected}})}),y(N,I)},w=N=>{var E=eg();let I,H;$(()=>{I=De(E,0,Rn(["svelte-flow__minimap-node",e.class]),null,I,{selected:e.selected}),xe(E,"x",r(u)),xe(E,"y",r(v)),xe(E,"rx",n()),xe(E,"ry",n()),xe(E,"width",r(s)),xe(E,"height",r(l)),xe(E,"shape-rendering",e.shapeRendering),H=st(E,"",H,{fill:e.color,stroke:e.strokeColor,"stroke-width":a()})}),y(N,E)};Y(m,N=>{e.nodeComponent?N(f):N(w,!1)})}y(t,p),Ce()}function ng(t,e){const n=rp({domNode:t,panZoom:e.panZoom,getTransform:()=>{const{viewport:o}=e.store;return[o.x,o.y,o.zoom]},getViewScale:e.getViewScale});n.update({translateExtent:e.translateExtent,width:e.width,height:e.height,inversePan:e.inversePan,zoomStep:e.zoomStep,pannable:e.pannable,zoomable:e.zoomable});function a(o){n.update({translateExtent:o.translateExtent,width:o.width,height:o.height,inversePan:o.inversePan,zoomStep:o.zoomStep,pannable:o.pannable,zoomable:o.zoomable})}return{update:a,destroy(){n.destroy()}}}const Ba=t=>t instanceof Function?t:()=>t;var rg=ut(" "),ag=ut(''),og=P('',1);function sg(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-right"),a=pe(e,"nodeStrokeColor",3,"transparent"),o=pe(e,"nodeClass",3,""),i=pe(e,"nodeBorderRadius",3,5),s=pe(e,"nodeStrokeWidth",3,2),l=pe(e,"width",3,200),u=pe(e,"height",3,150),v=pe(e,"pannable",3,!0),p=pe(e,"zoomable",3,!0),m=_n(e,["$$slots","$$events","$$legacy","position","ariaLabel","nodeStrokeColor","nodeColor","nodeClass","nodeBorderRadius","nodeStrokeWidth","nodeComponent","bgColor","maskColor","maskStrokeColor","maskStrokeWidth","width","height","pannable","zoomable","inversePan","zoomStep","class"]),f=k(fn),w=k(()=>r(f).ariaLabelConfig);const N=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";let E=k(()=>`svelte-flow__minimap-desc-${r(f).flowId}`),I=k(()=>({x:-r(f).viewport.x/r(f).viewport.zoom,y:-r(f).viewport.y/r(f).viewport.zoom,width:r(f).width/r(f).viewport.zoom,height:r(f).height/r(f).viewport.zoom})),H=k(()=>Oi(xr(r(f).nodeLookup,{filter:C=>!C.hidden}),r(I))),O=k(()=>r(H).width/l()),F=k(()=>r(H).height/u()),M=k(()=>Math.max(r(O),r(F))),R=k(()=>r(M)*l()),b=k(()=>r(M)*u()),A=k(()=>5*r(M)),B=k(()=>r(H).x-(r(R)-r(H).width)/2-r(A)),K=k(()=>r(H).y-(r(b)-r(H).height)/2-r(A)),Z=k(()=>r(R)+r(A)*2),x=k(()=>r(b)+r(A)*2);const S=()=>r(M);var z=og(),g=de(z);{let C=k(()=>["svelte-flow__minimap",e.class]);cc(g,()=>({"--xy-minimap-background-color-props":e.bgColor})),Do(g.lastChild,We({get position(){return n()},get class(){return r(C)},"data-testid":"svelte-flow__minimap"},()=>m,{children:(T,D)=>{var V=Te(),L=de(V);{var q=j=>{var U=ag();let X;var J=d(U);{var ae=ne=>{var G=rg(),oe=d(G,!0);c(G),$(()=>{xe(G,"id",r(E)),W(oe,e.ariaLabel??r(w)["minimap.ariaLabel"])}),y(ne,G)};Y(J,ne=>{(e.ariaLabel??r(w)["minimap.ariaLabel"])&&ne(ae)})}var re=h(J);je(re,17,()=>r(f).nodes,ne=>ne.id,(ne,G)=>{const oe=k(()=>r(f).nodeLookup.get(r(G).id));var ee=Te(),se=de(ee);{var te=le=>{{let he=k(()=>e.nodeColor===void 0?void 0:Ba(e.nodeColor)(r(G))),ve=k(()=>Ba(a())(r(G))),fe=k(()=>Ba(o())(r(G)));tg(le,{get id(){return r(oe).id},get selected(){return r(oe).selected},get nodeComponent(){return e.nodeComponent},get color(){return r(he)},get borderRadius(){return i()},get strokeColor(){return r(ve)},get strokeWidth(){return s()},get shapeRendering(){return N},get class(){return r(fe)}})}},ue=k(()=>r(oe)&&Ri(r(oe))&&!r(oe).hidden);Y(se,le=>{r(ue)&&le(te)})}y(ne,ee)});var ie=h(re);c(U),zt(U,(ne,G)=>ng?.(ne,G),()=>({store:r(f),panZoom:r(f).panZoom,getViewScale:S,translateExtent:r(f).translateExtent,width:r(f).width,height:r(f).height,inversePan:e.inversePan,zoomStep:e.zoomStep,pannable:v(),zoomable:p()})),$(()=>{xe(U,"width",l()),xe(U,"height",u()),xe(U,"viewBox",`${r(B)??""} ${r(K)??""} ${r(Z)??""} ${r(x)??""}`),xe(U,"aria-labelledby",r(E)),X=st(U,"",X,{"--xy-minimap-mask-background-color-props":e.maskColor,"--xy-minimap-mask-stroke-color-props":e.maskStrokeColor,"--xy-minimap-mask-stroke-width-props":e.maskStrokeWidth?e.maskStrokeWidth*r(M):void 0}),xe(ie,"d",`M${r(B)-r(A)},${r(K)-r(A)}h${r(Z)+r(A)*2}v${r(x)+r(A)*2}h${-r(Z)-r(A)*2}z - M${r(I).x??""},${r(I).y??""}h${r(I).width??""}v${r(I).height??""}h${-r(I).width}z`)}),y(j,U)};Y(L,j=>{r(f).panZoom&&j(q)})}y(T,V)},$$slots:{default:!0}})),c(g)}y(t,z),Ce()}var ig=P(' '),lg=P(''),cg=P(''),dg=P(''),ug=P('
    '),vg=P('

    '),fg=P('
    Exec In
    Exec Out
    ');function pg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>!!e.data.multimodal?.vision_enabled),o=Q(!1);_e(()=>{if(r(n)==="complete"){_(o,!0);const D=setTimeout(()=>{_(o,!1)},3e3);return()=>clearTimeout(D)}else _(o,!1)});var i=fg();let s;var l=d(i),u=d(l),v=d(u),p=d(v);{var m=D=>{var V=ig(),L=d(V,!0);c(V),$(()=>W(L,e.data.model)),y(D,V)};Y(p,D=>{e.data.model&&D(m)})}var f=h(p,2);{var w=D=>{var V=lg(),L=d(V);Xr(L,{size:10}),c(V),y(D,V)};Y(f,D=>{r(a)&&D(w)})}c(v);var N=h(v,2),E=d(N);uo(E,{size:11}),c(N),c(u);var I=h(u,2),H=d(I);let O;var F=h(H,2);cr(F,{size:14});var M=h(F,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=cg(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),y(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=dg(),L=d(V);Rt(L,{size:13}),c(V),y(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(I),c(l);var Z=h(l,2),x=h(d(Z),2);{var S=D=>{var V=ug(),L=d(V);c(V),$((q,j)=>W(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),y(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2);{var g=D=>{var V=vg(),L=h(d(V),2),q=d(L,!0);c(L),c(V),$(()=>W(q,e.data.instructions)),y(D,V)};Y(z,D=>{e.data.instructions&&D(g)})}c(Z);var C=h(Z,2);$e(C,{type:"target",get position(){return we.Left}});var T=h(C,2);$e(T,{type:"source",get position(){return we.Right}}),c(i),$(()=>{s=De(i,1,"agent-node svelte-uofr5c",null,s,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),O=De(H,1,"status-dot svelte-uofr5c",null,O,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),W(R,e.data.label||"Agent")}),y(t,i),Ce()}var hg=P(''),gg=P(''),mg=P('
    tool
    '),_g=P('
    '),yg=P('
    timeout
    '),bg=P('
    Exec In
    Exec Out
    ');function xg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){_(a,!0);const x=setTimeout(()=>{_(a,!1)},3e3);return()=>clearTimeout(x)}else _(a,!1)});var o=bg();let i;var s=d(o),l=d(s),u=d(l);let v;var p=h(u,2),m=d(p);Wn(m,{size:13}),c(p);var f=h(p,2),w=d(f,!0);c(f);var N=h(f,2);{var E=x=>{var S=hg(),z=d(S);Kt(z,{size:12}),c(S),jt(3,S,()=>Zt,()=>({duration:200,start:.6})),y(x,S)};Y(N,x=>{r(a)&&x(E)})}var I=h(N,2);{var H=x=>{var S=gg(),z=d(S);Rt(z,{size:12}),c(S),y(x,S)};Y(I,x=>{r(n)==="error"&&x(H)})}c(l),c(s);var O=h(s,2),F=h(d(O),2);{var M=x=>{var S=mg(),z=h(d(S)),g=d(z,!0);c(z),c(S),$(()=>W(g,e.data.tool_name)),y(x,S)};Y(F,x=>{e.data.tool_name&&x(M)})}var R=h(F,2);{var b=x=>{var S=_g(),z=d(S);c(S),$((g,C)=>W(z,`${g??""}${C??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),y(x,S)};Y(R,x=>{e.data.description&&x(b)})}var A=h(R,2);{var B=x=>{var S=yg(),z=h(d(S)),g=d(z);c(z),c(S),$(()=>W(g,`${e.data.timeout??""}s`)),y(x,S)};Y(A,x=>{e.data.timeout&&x(B)})}c(O);var K=h(O,2);$e(K,{type:"target",get position(){return we.Left}});var Z=h(K,2);$e(Z,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"tool-node svelte-107d6w1",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-107d6w1",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),W(w,e.data.label||"Tool")}),y(t,o),Ce()}var wg=P(''),kg=P(''),Sg=P('
    '),zg=P('
    '),Cg=P('
    Max Steps
    '),Eg=P('
    Exec In
    Exec Out
    ');function Ng(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){_(a,!0);const x=setTimeout(()=>{_(a,!1)},3e3);return()=>clearTimeout(x)}else _(a,!1)});var o=Eg();let i;var s=d(o),l=d(s),u=d(l);let v;var p=h(u,2),m=d(p);Zr(m,{size:14}),c(p);var f=h(p,2),w=d(f,!0);c(f);var N=h(f,2);{var E=x=>{var S=wg(),z=d(S);Kt(z,{size:12}),c(S),jt(3,S,()=>Zt,()=>({duration:200,start:.6})),y(x,S)};Y(N,x=>{r(a)&&x(E)})}var I=h(N,2);{var H=x=>{var S=kg(),z=d(S);Rt(z,{size:12}),c(S),y(x,S)};Y(I,x=>{r(n)==="error"&&x(H)})}c(l);var O=h(l,2);{var F=x=>{var S=Sg(),z=d(S,!0);c(S),$(()=>W(z,e.data.pattern)),y(x,S)};Y(O,x=>{e.data.pattern&&x(F)})}c(s);var M=h(s,2),R=h(d(M),2);{var b=x=>{var S=zg(),z=d(S);c(S),$((g,C)=>W(z,`${g??""}${C??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),y(x,S)};Y(R,x=>{e.data.description&&x(b)})}var A=h(R,2);{var B=x=>{var S=Cg(),z=h(d(S),2),g=d(z,!0);c(z),c(S),$(()=>W(g,e.data.maxSteps)),y(x,S)};Y(A,x=>{e.data.maxSteps&&x(B)})}c(M);var K=h(M,2);$e(K,{type:"target",get position(){return we.Left}});var Z=h(K,2);$e(Z,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"reason-node svelte-15a1m3",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-15a1m3",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),W(w,e.data.label||"Reasoning")}),y(t,o),Ce()}var Mg=P(''),Pg=P(''),Tg=P('
    '),Ig=P('
    '),Ag=P('
    In
    True
    False
    ');function Dg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){_(a,!0);const K=setTimeout(()=>{_(a,!1)},3e3);return()=>clearTimeout(K)}else _(a,!1)});var o=Ag();let i;var s=d(o),l=h(d(s),2),u=d(l);let v;var p=h(u,2);dr(p,{size:13});var m=h(p,2),f=d(m,!0);c(m);var w=h(m,2);{var N=K=>{var Z=Mg(),x=d(Z);Kt(x,{size:12}),c(Z),jt(3,Z,()=>Zt,()=>({duration:200,start:.6})),y(K,Z)};Y(w,K=>{r(a)&&K(N)})}var E=h(w,2);{var I=K=>{var Z=Pg(),x=d(Z);Rt(x,{size:12}),c(Z),y(K,Z)};Y(E,K=>{r(n)==="error"&&K(I)})}c(l),c(s);var H=h(s,2),O=d(H);{var F=K=>{var Z=Tg(),x=d(Z),S=d(x,!0);c(x),c(Z),$(()=>W(S,e.data.condition)),y(K,Z)};Y(O,K=>{e.data.condition&&K(F)})}var M=h(O,2);{var R=K=>{var Z=Ig(),x=d(Z);c(Z),$((S,z)=>W(x,`${S??""}${z??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),y(K,Z)};Y(M,K=>{e.data.description&&K(R)})}ye(2),c(H);var b=h(H,2);$e(b,{type:"target",get position(){return we.Left}});var A=h(b,2);$e(A,{type:"source",get position(){return we.Right},id:"true",style:"top: 35%;"});var B=h(A,2);$e(B,{type:"source",get position(){return we.Right},id:"false",style:"top: 65%;"}),c(o),$(()=>{i=De(o,1,"cond-node svelte-9dvt8o",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-9dvt8o",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),W(f,e.data.label||"Condition")}),y(t,o),Ce()}var Og=P(''),Rg=P(''),Lg=P('
    action
    '),Hg=P('
    namespace
    '),Vg=P('
    Exec In
    Exec Out
    ');function Fg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){_(a,!0);const R=setTimeout(()=>{_(a,!1)},3e3);return()=>clearTimeout(R)}else _(a,!1)});var o=Vg();let i;var s=d(o),l=d(s);co(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Og(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),y(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=Rg(),A=d(b);Rt(A,{size:12}),c(b),y(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Lg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>W(B,e.data.memory_action)),y(R,b)};Y(E,R=>{e.data.memory_action&&R(I)})}var H=h(E,2);{var O=R=>{var b=Hg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>W(B,e.data.namespace)),y(R,b)};Y(H,R=>{e.data.namespace&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-mcwl9o",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),W(v,e.data.label||"Memory")}),y(t,o),Ce()}var Bg=P(''),qg=P(''),Kg=P('
    rule
    '),jg=P('
    on_fail
    '),Zg=P('
    Exec In
    Exec Out
    ');function Yg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){_(a,!0);const R=setTimeout(()=>{_(a,!1)},3e3);return()=>clearTimeout(R)}else _(a,!1)});var o=Zg();let i;var s=d(o),l=d(s);vo(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Bg(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),y(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=qg(),A=d(b);Rt(A,{size:12}),c(b),y(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Kg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>W(B,e.data.validation_rule)),y(R,b)};Y(E,R=>{e.data.validation_rule&&R(I)})}var H=h(E,2);{var O=R=>{var b=jg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>W(B,e.data.fail_action)),y(R,b)};Y(H,R=>{e.data.fail_action&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-1y5xb8x",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),W(v,e.data.label||"Validator")}),y(t,o),Ce()}var Wg=P(''),Xg=P(''),Gg=P('
    desc
    '),Ug=P('
    code
    '),Qg=P('
    In
    Out
    ');function Jg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){_(a,!0);const R=setTimeout(()=>{_(a,!1)},3e3);return()=>clearTimeout(R)}else _(a,!1)});var o=Qg();let i;var s=d(o),l=d(s);la(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Wg(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),y(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=Xg(),A=d(b);Rt(A,{size:12}),c(b),y(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Gg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>W(B,e.data.description)),y(R,b)};Y(E,R=>{e.data.description&&R(I)})}var H=h(E,2);{var O=R=>{var b=Ug(),A=h(d(b)),B=d(A);c(A),c(b),$((K,Z)=>W(B,`${K??""}${Z??""}`),[()=>String(e.data.code).split(` -`)[0].slice(0,30),()=>String(e.data.code).length>30?"...":""]),y(R,b)};Y(H,R=>{e.data.code&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-1ebq9zd",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),W(v,e.data.label||"Code")}),y(t,o),Ce()}var $g=P(''),em=P(''),tm=P('
    split
    '),nm=P('
    max
    '),rm=P('
    In
    Out 1
    Out 2
    ');function am(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){_(a,!0);const b=setTimeout(()=>{_(a,!1)},3e3);return()=>clearTimeout(b)}else _(a,!1)});var o=rm();let i;var s=d(o),l=d(s);fo(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=b=>{var A=$g(),B=d(A);Kt(B,{size:12}),c(A),jt(3,A,()=>Zt,()=>({duration:200,start:.6})),y(b,A)};Y(p,b=>{r(a)&&b(m)})}var f=h(p,2);{var w=b=>{var A=em(),B=d(A);Rt(B,{size:12}),c(A),y(b,A)};Y(f,b=>{r(n)==="error"&&b(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=b=>{var A=tm(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>W(K,e.data.split_expression)),y(b,A)};Y(E,b=>{e.data.split_expression&&b(I)})}var H=h(E,2);{var O=b=>{var A=nm(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>W(K,e.data.max_concurrent)),y(b,A)};Y(H,b=>{e.data.max_concurrent&&b(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right},id:"out-1",style:"top: 33%;"});var R=h(M,2);$e(R,{type:"source",get position(){return we.Right},id:"out-2",style:"top: 66%;"}),c(o),$(()=>{i=De(o,1,"bp-node svelte-5h9d64",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),W(v,e.data.label||"Fan Out")}),y(t,o),Ce()}var om=P(''),sm=P(''),im=P('
    merge
    '),lm=P('
    timeout
    '),cm=P('
    In 1
    In 2
    Out
    ');function dm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){_(a,!0);const b=setTimeout(()=>{_(a,!1)},3e3);return()=>clearTimeout(b)}else _(a,!1)});var o=cm();let i;var s=d(o),l=d(s);po(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=b=>{var A=om(),B=d(A);Kt(B,{size:12}),c(A),jt(3,A,()=>Zt,()=>({duration:200,start:.6})),y(b,A)};Y(p,b=>{r(a)&&b(m)})}var f=h(p,2);{var w=b=>{var A=sm(),B=d(A);Rt(B,{size:12}),c(A),y(b,A)};Y(f,b=>{r(n)==="error"&&b(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=b=>{var A=im(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>W(K,e.data.merge_expression)),y(b,A)};Y(E,b=>{e.data.merge_expression&&b(I)})}var H=h(E,2);{var O=b=>{var A=lm(),B=h(d(A)),K=d(B);c(B),c(A),$(()=>W(K,`${e.data.merge_timeout??""}s`)),y(b,A)};Y(H,b=>{e.data.merge_timeout&&b(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left},id:"in-1",style:"top: 33%;"});var M=h(F,2);$e(M,{type:"target",get position(){return we.Left},id:"in-2",style:"top: 66%;"});var R=h(M,2);$e(R,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-k2gv2h",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),W(v,e.data.label||"Fan In")}),y(t,o),Ce()}var um=P(''),vm=P(''),fm=P('
    '),pm=P('
    Exec Out

    ');function hm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>e.data.trigger_type??"Manual"),o=Q(!1),i=k(()=>()=>{switch(r(a).toLowerCase()){case"http":return e.data.endpoint?`${e.data.method??"POST"} ${e.data.endpoint}`:"HTTP endpoint";case"queue":return e.data.queue_name?`Queue: ${e.data.queue_name}`:"Message queue";case"schedule":return e.data.cron?`Cron: ${e.data.cron}`:"Scheduled trigger";case"file":return e.data.watch_path?`Watch: ${e.data.watch_path}`:"File watcher";default:return"Manual execution"}});_e(()=>{if(r(n)==="complete"){_(o,!0);const D=setTimeout(()=>{_(o,!1)},3e3);return()=>clearTimeout(D)}else _(o,!1)});var s=pm();let l;var u=d(s),v=d(u),p=d(v),m=d(p),f=d(m,!0);c(m),c(p);var w=h(p,2),N=d(w);uo(N,{size:11}),c(w),c(v);var E=h(v,2),I=d(E);let H;var O=h(I,2),F=d(O);Ys(F,{size:14}),c(O);var M=h(O,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=um(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),y(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=vm(),L=d(V);Rt(L,{size:13}),c(V),y(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(E),c(u);var Z=h(u,2),x=h(d(Z),2);{var S=D=>{var V=fm(),L=d(V);c(V),$((q,j)=>W(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),y(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2),g=h(d(z),2),C=d(g,!0);c(g),c(z),c(Z);var T=h(Z,2);$e(T,{type:"source",get position(){return we.Right}}),c(s),$(D=>{l=De(s,1,"input-node svelte-170rmgf",null,l,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),W(f,r(a)),H=De(I,1,"status-dot svelte-170rmgf",null,H,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),W(R,e.data.label||"Input"),W(C,D)},[()=>r(i)()]),y(t,s),Ce()}var gm=P(''),mm=P(''),_m=P('
    '),ym=P('
    Exec In

    ');function bm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>e.data.destination_type??"Response"),o=Q(!1),i=k(()=>()=>{switch(r(a).toLowerCase()){case"response":return e.data.format?`Format: ${e.data.format}`:"Direct response";case"queue":return e.data.queue_name?`Queue: ${e.data.queue_name}`:"Message queue";case"webhook":return e.data.webhook_url?`URL: ${e.data.webhook_url}`:"Webhook delivery";case"store":return e.data.store_path?`Path: ${e.data.store_path}`:"Persistent store";default:return"Output destination"}});_e(()=>{if(r(n)==="complete"){_(o,!0);const D=setTimeout(()=>{_(o,!1)},3e3);return()=>clearTimeout(D)}else _(o,!1)});var s=ym();let l;var u=d(s),v=d(u),p=d(v),m=d(p),f=d(m,!0);c(m),c(p);var w=h(p,2),N=d(w);uo(N,{size:11}),c(w),c(v);var E=h(v,2),I=d(E);let H;var O=h(I,2),F=d(O);ca(F,{size:14}),c(O);var M=h(O,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=gm(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),y(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=mm(),L=d(V);Rt(L,{size:13}),c(V),y(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(E),c(u);var Z=h(u,2),x=h(d(Z),2);{var S=D=>{var V=_m(),L=d(V);c(V),$((q,j)=>W(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),y(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2),g=h(d(z),2),C=d(g,!0);c(g),c(z),c(Z);var T=h(Z,2);$e(T,{type:"target",get position(){return we.Left}}),c(s),$(D=>{l=De(s,1,"output-node svelte-198t6xy",null,l,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),W(f,r(a)),H=De(I,1,"status-dot svelte-198t6xy",null,H,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),W(R,e.data.label||"Output"),W(C,D)},[()=>r(i)()]),y(t,s),Ce()}var xm=P(" ",1),wm=P('
    Nodes
    Agents
    Tools
    Links
    '),km=P('

    Start building your pipeline

    Click components in the left panel to add them, or press Cmd+K to search

    '),Sm=P('
    ');function zm(t,e){ze(e,!0);const n=()=>at(an,"$nodes",o),a=()=>at(Mn,"$edges",o),[o,i]=Ot(),s={input:hm,output:bm,agent:pg,tool:xg,reasoning:Ng,condition:Dg,memory:Fg,validator:Yg,custom_code:Jg,fan_out:am,fan_in:dm};let l=k(()=>n().length===0),u=k(()=>n().length),v=k(()=>n().filter(O=>O.type==="agent").length),p=k(()=>n().filter(O=>O.type==="tool").length),m=k(()=>a().length);var f=Sm(),w=d(f);Th(w,{get nodeTypes(){return s},fitView:!0,colorMode:"dark",defaultEdgeOptions:{type:"smoothstep",animated:!0,style:"stroke: #cbd5e1; stroke-width: 2.5px;"},onnodeclick:({node:O})=>mn.set(O.id),onpaneclick:()=>mn.set(null),get nodes(){return Yo(),n()},set nodes(O){Zo(an,O)},get edges(){return Yo(),a()},set edges(O){Zo(Mn,O)},children:(O,F)=>{var M=xm(),R=de(M);Zh(R,{position:"bottom-left"});var b=h(R,2);sg(b,{position:"bottom-right"});var A=h(b,2);Jh(A,{get variant(){return cn.Dots},gap:24,size:1,color:"#2a2a3a"}),y(O,M)},$$slots:{default:!0}});var N=h(w,2);{var E=O=>{var F=wm(),M=d(F),R=d(M);vc(R,{size:12});var b=h(R,4),A=d(b,!0);c(b),c(M);var B=h(M,4),K=d(B);cr(K,{size:12});var Z=h(K,4),x=d(Z,!0);c(Z),c(B);var S=h(B,4),z=d(S);Wn(z,{size:12});var g=h(z,4),C=d(g,!0);c(g),c(S);var T=h(S,4),D=d(T);fc(D,{size:12});var V=h(D,4),L=d(V,!0);c(V),c(T),c(F),$(()=>{W(A,r(u)),W(x,r(v)),W(C,r(p)),W(L,r(m))}),y(O,F)};Y(N,O=>{r(l)||O(E)})}var I=h(N,2);{var H=O=>{var F=km(),M=d(F),R=d(M);Pc(R,{size:40}),ye(4),c(M),c(F),y(O,F)};Y(I,O=>{r(l)&&O(H)})}c(f),y(t,f),Ce(),i()}var Cm=P(''),Em=P(''),Nm=P(''),Mm=P(''),Pm=P(""),Tm=P(' ',1),Im=P(''),Am=P('
    ');function Ne(t,e){ze(e,!0);let n=pe(e,"type",3,"text"),a=pe(e,"value",15,""),o=pe(e,"placeholder",3,""),i=pe(e,"options",19,()=>[]);const s=Math.random().toString(36).slice(2,8);let l=k(()=>`field-${(e.label??"input").replace(/\s+/g,"-").toLowerCase()}-${s}`),u=k(()=>`dl-${(e.label??"input").replace(/\s+/g,"-").toLowerCase()}-${s}`);function v(F){const M=F.target;M.style.height="auto",M.style.height=M.scrollHeight+"px"}var p=Am(),m=d(p),f=d(m,!0);c(m);var w=h(m,2);{var N=F=>{var M=Cm();Bl(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),be("input",M,v),on(M,a),y(F,M)},E=F=>{var M=Em();Ct(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),on(M,a),y(F,M)},I=F=>{var M=Mm();je(M,21,i,wt,(R,b)=>{var A=Nm(),B=d(A,!0);c(A);var K={};$(()=>{W(B,r(b)),K!==(K=r(b))&&(A.value=(A.__value=r(b))??"")}),y(R,A)}),c(M),$(()=>xe(M,"id",r(l))),ql(M,a),y(F,M)},H=F=>{var M=Tm(),R=de(M);Ct(R);var b=h(R,2);je(b,21,i,wt,(A,B)=>{var K=Pm(),Z={};$(()=>{Z!==(Z=r(B))&&(K.value=(K.__value=r(B))??"")}),y(A,K)}),c(b),$(()=>{xe(R,"id",r(l)),xe(R,"placeholder",o()),xe(R,"list",r(u)),xe(b,"id",r(u))}),on(R,a),y(F,M)},O=F=>{var M=Im();Ct(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),on(M,a),y(F,M)};Y(w,F=>{n()==="textarea"?F(N):n()==="number"?F(E,1):n()==="select"?F(I,2):n()==="datalist"?F(H,3):F(O,!1)})}c(p),$(()=>{xe(m,"for",r(l)),W(f,e.label)}),y(t,p),Ce()}_t(["input"]);const il=[{id:"calculator",name:"Calculator",description:"Safe mathematical expression evaluator. Supports arithmetic, functions (sqrt, sin, cos, log, etc.), and constants (pi, e).",category:"Utility",tags:["math","calculator","utility"],parameters:[{name:"expression",type:"string",description:"Math expression to evaluate",required:!0}]},{id:"datetime",name:"Date & Time",description:"Current date/time information with timezone support.",category:"Utility",tags:["datetime","utility"],parameters:[{name:"action",type:"select",description:"What to retrieve",required:!0,options:["now","date","time","timestamp","timezones"]},{name:"timezone",type:"string",description:"IANA timezone (e.g. America/New_York)",required:!1,default:"UTC"},{name:"format",type:"string",description:"strftime format string",required:!1}]},{id:"filesystem",name:"File System",description:"Read, write, and list files. Sandboxed to a base directory with path-traversal protection.",category:"I/O",tags:["filesystem","io"],parameters:[{name:"action",type:"select",description:"File operation",required:!0,options:["read","write","list"]},{name:"path",type:"string",description:"File or directory path",required:!0},{name:"content",type:"string",description:"Content to write (for write action)",required:!1}]},{id:"http",name:"HTTP Client",description:"Make HTTP requests with connection pooling. Supports GET, POST, PUT, DELETE.",category:"Web",tags:["http","web"],parameters:[{name:"url",type:"string",description:"Target URL",required:!0},{name:"method",type:"select",description:"HTTP method",required:!1,default:"GET",options:["GET","POST","PUT","DELETE","PATCH"]},{name:"body",type:"string",description:"Request body (JSON)",required:!1},{name:"headers",type:"string",description:"Request headers (JSON)",required:!1}]},{id:"json",name:"JSON",description:"Parse, validate, extract, and format JSON data. Supports dot-path extraction.",category:"Utility",tags:["json","utility"],parameters:[{name:"action",type:"select",description:"JSON operation",required:!0,options:["parse","validate","extract","format","keys"]},{name:"data",type:"string",description:"JSON data to process",required:!0},{name:"path",type:"string",description:"Dot-path for extraction (e.g. address.city)",required:!1}]},{id:"text",name:"Text Processing",description:"Count, extract, truncate, replace, and split text using regex patterns.",category:"Utility",tags:["text","utility"],parameters:[{name:"action",type:"select",description:"Text operation",required:!0,options:["count","extract","truncate","replace","split"]},{name:"text",type:"string",description:"Input text",required:!0},{name:"pattern",type:"string",description:"Regex pattern (for extract/replace/split)",required:!1},{name:"replacement",type:"string",description:"Replacement string (for replace)",required:!1}]},{id:"shell",name:"Shell",description:"Execute shell commands from an explicit allowlist. Sandboxed for safety.",category:"System",tags:["shell","system"],parameters:[{name:"command",type:"string",description:"Command to execute (must be in allowlist)",required:!0}]},{id:"search",name:"Search",description:"Web search tool (abstract -- requires implementation of _search method).",category:"Web",tags:["search","web"],parameters:[{name:"query",type:"string",description:"Search query",required:!0}]},{id:"database",name:"Database",description:"Execute SQL queries (abstract -- requires implementation). Read-only by default with SQL injection detection.",category:"I/O",tags:["database","sql"],parameters:[{name:"query",type:"string",description:"SQL query (SELECT/WITH only in read-only mode)",required:!0},{name:"params",type:"string",description:"Query parameters (JSON)",required:!1}]}];function Dm(t){return il.find(e=>e.id===t)}const ll=[{id:"react",name:"ReAct",description:"Reason-Act-Observe loop. The agent thinks, takes an action (tool call), observes the result, and repeats until done.",defaultMaxSteps:10,bestFor:"Tasks requiring tool interaction and iterative problem-solving",configKeys:["max_steps"]},{id:"chain_of_thought",name:"Chain of Thought",description:"Step-by-step reasoning without actions. The agent breaks down the problem into logical steps and thinks through each one.",defaultMaxSteps:10,bestFor:"Pure logic, analysis, and reasoning tasks without tool needs",configKeys:["max_steps"]},{id:"plan_and_execute",name:"Plan & Execute",description:"Generates a multi-step plan first, then executes each step sequentially. Can replan on failure.",defaultMaxSteps:15,bestFor:"Complex multi-step tasks that benefit from upfront planning",configKeys:["max_steps","allow_replan"]},{id:"reflexion",name:"Reflexion",description:"Execute-Critique-Retry loop. Generates output, critiques it for quality, and retries with feedback if unsatisfactory.",defaultMaxSteps:5,bestFor:"Quality-sensitive outputs that benefit from self-review",configKeys:["max_steps"]},{id:"tree_of_thoughts",name:"Tree of Thoughts",description:"Generates multiple solution branches, evaluates each with a score, and selects the best. Explores the solution space broadly.",defaultMaxSteps:3,bestFor:"Creative and exploratory problems with multiple valid approaches",configKeys:["branching_factor","max_depth"]},{id:"goal_decomposition",name:"Goal Decomposition",description:"Breaks a large goal into phases and tasks, then executes each task. Can delegate sub-tasks to other patterns.",defaultMaxSteps:20,bestFor:"Large ambiguous goals that need structured decomposition",configKeys:["max_steps","task_pattern"]}];function Om(t){return ll.find(e=>e.id===t)}var Rm=P('

    Exposes an HTTP endpoint that triggers this pipeline when called.

    ',1),Lm=P(" ",1),Hm=P('

    Runs the pipeline on a schedule using standard cron syntax.

    ',1),Vm=P(" ",1),Fm=P('

    Manual trigger. Run the pipeline via the Run button or API call.

    '),Bm=P(" ",1),qm=P(" ",1),Km=P(" ",1),jm=P('

    Returns the pipeline output as an API response.

    '),Zm=P(" ",1),Ym=P('
    Accepted file types
    Max file size
    Image detail
    '),Wm=P('
    ',1),Xm=P('
    '),Gm=P('
    '),Um=P('

    '),Qm=P('

    Custom tool. Define the tool name as registered in the framework tool registry.

    '),Jm=P(" ",1),$m=P('

    '),e1=P(" ",1),t1=P('

    Routes flow based on a key in the pipeline context. Connect the True and False handles to different downstream nodes. Use configure_node to set branches as a JSON dict mapping values to paths.

    ',1),n1=P('

    Saves the current pipeline state/output to memory for later retrieval.

    '),r1=P('

    Loads previously saved state from memory and injects it into the pipeline context.

    '),a1=P('

    Wipes all stored memory. Use with caution.

    '),o1=P('

    Select an action: store saves data, retrieve loads it, clear wipes memory.

    '),s1=P('
    ',1),i1=P('

    Ensures the output is not empty, null, or blank.

    '),l1=P('

    Validates that the output is a string type.

    '),c1=P('

    Validates that the output is a list/array.

    '),d1=P('

    Validates that the output is a dictionary/object.

    '),u1=P('

    Custom validation rule. Define the rule key as registered in the framework.

    '),v1=P('

    Select a validation rule to apply to the pipeline output before passing downstream.

    '),f1=P('
    ',1),p1=P('

    Must define: async def execute(context, inputs) -> Any

    ',1),h1=P('

    Splits a single input into multiple items for parallel processing across downstream branches.

    ',1),g1=P('

    Concatenates all branch results into a single string.

    '),m1=P('

    Collects all branch results into a list.

    '),_1=P('

    Merges results from parallel branches back into a single output.

    '),y1=P('
    ',1),b1=P(''),x1=P('
    Inputs
    '),w1=P(''),k1=P('
    Outputs
    '),S1=P('
    Connections
    '),z1=P('');function C1(t,e){ze(e,!0);const n=()=>at(Kl,"$selectedNode",s),a=()=>at(Mn,"$edges",s),o=()=>at(an,"$nodes",s),i=()=>at(mn,"$selectedNodeId",s),[s,l]=Ot(),u=[],v={input:Ys,output:ca,agent:cr,tool:Wn,reasoning:Zr,condition:Ws,memory:co,validator:vo,custom_code:la,fan_out:fo,fan_in:po},p={input:"#10b981",output:"#3b82f6",agent:"#6366f1",tool:"#8b5cf6",reasoning:"#ec4899",condition:"#06b6d4",memory:"#06b6d4",validator:"#f59e0b",custom_code:"#3b82f6",fan_out:"#8888a0",fan_in:"#8888a0"},m={input:"Input",output:"Output",agent:"Agent",tool:"Tool",reasoning:"Reasoning",condition:"Condition",memory:"Memory",validator:"Validator",custom_code:"Custom Code",fan_out:"Fan Out",fan_in:"Fan In"},f=ll.map(ce=>ce.id),w=["custom",...il.map(ce=>ce.id)];let N=k(()=>Om(r(R))),E=k(()=>Dm(r(j))),I=Q(""),H=Q(""),O=Q(""),F=Q(""),M=Q(""),R=Q(""),b=Q(""),A=Q(""),B=Q(""),K=Q(""),Z=Q(""),x=Q(""),S=Q(""),z=Q(""),g=Q(""),C=Q(""),T=Q(""),D=Q(""),V=Q(""),L=Q(""),q=Q(""),j=Q(""),U=Q(""),X=Q(""),J=Q(""),ae=Q(""),re=Q("manual"),ie=Q("response"),ne=Q("kafka"),G=Q(""),oe=Q(""),ee=Q(""),se=Q("UTC"),te=Q("POST"),ue=Q(!1),le=Q("*/*"),he=Q("50"),ve=Q(""),fe=Q("file"),ke=Q(""),Ae=Q(""),ge=Q(!1),Oe=Q(!0),Ze=Q(!1),Xe=Q(!1),it=Q(10),Ge=Q("auto"),ct=Q(null),Nt=!1,gt=k(()=>n()?a().filter(ce=>ce.target===n().id):[]),dt=k(()=>n()?a().filter(ce=>ce.source===n().id):[]);function xt(ce){const Ie=o().find(et=>et.id===ce);return Ie?.data?.label||Ie?.id||ce}_e(()=>{const ce=n();ce&&ce.id!==r(ct)&&(Nt=!0,_(ct,ce.id,!0),Qt(()=>{_(I,ce.data.label??"",!0),_(H,ce.data.model??"",!0),_(O,ce.data.instructions??"",!0),_(F,ce.data.description??"",!0),_(M,ce.data.timeout!=null?String(ce.data.timeout):"",!0),_(R,ce.data.pattern??"",!0),_(b,ce.data.maxSteps!=null?String(ce.data.maxSteps):"",!0),_(A,ce.data.condition??"",!0),_(B,ce.data.backend??"",!0),_(K,ce.data.connection_string??"",!0),_(Z,ce.data.namespace??"",!0),_(x,ce.data.schema_type??"",!0),_(S,ce.data.validation_rules??"",!0),_(z,ce.data.fail_action??"",!0),_(g,ce.data.code??"",!0),_(C,ce.data.strategy??"",!0),_(T,ce.data.max_concurrent!=null?String(ce.data.max_concurrent):"",!0),_(D,ce.data.merge_strategy??"",!0),_(V,ce.data.merge_timeout!=null?String(ce.data.merge_timeout):"",!0),_(L,ce.data.temperature!=null?String(ce.data.temperature):"",!0),_(q,ce.data.max_tokens!=null?String(ce.data.max_tokens):"",!0),_(j,ce.data.tool_name??"",!0),_(U,ce.data.memory_action??"",!0),_(X,ce.data.validation_rule??"",!0),_(J,ce.data.split_expression??"",!0),_(ae,ce.data.merge_expression??"",!0),_(re,ce.data.trigger_type??"manual",!0),_(ie,ce.data.destination_type??"response",!0),_(ne,ce.data.queue_broker??"kafka",!0),_(G,ce.data.queue_topic??"",!0),_(oe,ce.data.queue_group_id??"",!0),_(ee,ce.data.cron_expression??"",!0),_(se,ce.data.cron_timezone??"UTC",!0),_(te,ce.data.http_method??"POST",!0),_(ue,ce.data.http_auth_required??!1,!0),_(le,ce.data.file_types??"*/*",!0),_(he,ce.data.file_max_size_mb!=null?String(ce.data.file_max_size_mb):"50",!0),_(ve,ce.data.webhook_url??"",!0),_(fe,ce.data.store_type??"file",!0),_(ke,ce.data.store_path??"",!0),_(Ae,ce.data.schema_json??"",!0);const Ie=ce.data.multimodal;_(ge,Ie?.vision_enabled??!1,!0);const et=Ie?.supported_file_types??["image/png","image/jpeg"];_(Oe,et.some(lt=>lt.startsWith("image/")),!0),_(Ze,et.includes("application/pdf"),!0),_(Xe,et.some(lt=>lt.includes("document")||lt.includes("msword")),!0),_(it,Ie?.max_file_size_mb??10,!0),_(Ge,Ie?.image_detail??"auto",!0)}),Nt=!1),ce||_(ct,null)});function Me(ce,Ie){Nt||Qt(()=>{const et=i();if(!et)return;["timeout","maxSteps","max_concurrent","merge_timeout","temperature","max_tokens"].includes(ce)?Na(et,ce,Ie===""?void 0:Number(Ie)):Na(et,ce,Ie)})}_e(()=>{Me("label",r(I))}),_e(()=>{Me("model",r(H))}),_e(()=>{Me("instructions",r(O))}),_e(()=>{Me("description",r(F))}),_e(()=>{Me("timeout",r(M))}),_e(()=>{Me("pattern",r(R))}),_e(()=>{Me("maxSteps",r(b))}),_e(()=>{Me("condition",r(A))}),_e(()=>{Me("backend",r(B))}),_e(()=>{Me("connection_string",r(K))}),_e(()=>{Me("namespace",r(Z))}),_e(()=>{Me("schema_type",r(x))}),_e(()=>{Me("validation_rules",r(S))}),_e(()=>{Me("fail_action",r(z))}),_e(()=>{Me("code",r(g))}),_e(()=>{Me("strategy",r(C))}),_e(()=>{Me("max_concurrent",r(T))}),_e(()=>{Me("merge_strategy",r(D))}),_e(()=>{Me("merge_timeout",r(V))}),_e(()=>{Me("temperature",r(L))}),_e(()=>{Me("max_tokens",r(q))}),_e(()=>{Me("tool_name",r(j))}),_e(()=>{Me("memory_action",r(U))}),_e(()=>{Me("validation_rule",r(X))}),_e(()=>{Me("split_expression",r(J))}),_e(()=>{Me("merge_expression",r(ae))}),_e(()=>{Me("trigger_type",r(re))}),_e(()=>{Me("destination_type",r(ie))}),_e(()=>{Me("queue_broker",r(ne))}),_e(()=>{Me("queue_topic",r(G))}),_e(()=>{Me("queue_group_id",r(oe))}),_e(()=>{Me("cron_expression",r(ee))}),_e(()=>{Me("cron_timezone",r(se))}),_e(()=>{Me("http_method",r(te))}),_e(()=>{Me("file_types",r(le))}),_e(()=>{Me("file_max_size_mb",r(he))}),_e(()=>{Me("webhook_url",r(ve))}),_e(()=>{Me("store_type",r(fe))}),_e(()=>{Me("store_path",r(ke))}),_e(()=>{Me("schema_json",r(Ae))}),_e(()=>{const ce=r(ge),Ie=r(Oe),et=r(Ze),lt=r(Xe),vt=r(it),yt=r(Ge);Nt||Qt(()=>{const bt=i();if(!bt)return;const Mt=o().find(Ht=>Ht.id===bt);if(!Mt||Mt.type!=="agent")return;const Lt=[];Ie&&Lt.push("image/png","image/jpeg"),et&&Lt.push("application/pdf"),lt&&Lt.push("application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document"),Na(bt,"multimodal",{vision_enabled:ce,supported_file_types:Lt,max_file_size_mb:vt,image_detail:yt})})});function pn(){mn.set(null)}function wn(){const ce=n();if(!ce)return;const Ie=ce.id;an.update(et=>et.filter(lt=>lt.id!==Ie)),Mn.update(et=>et.filter(lt=>lt.source!==Ie&<.target!==Ie)),mn.set(null)}function hn(ce){mn.set(ce)}var Sr=Te(),Qe=de(Sr);{var kt=ce=>{const Ie=k(n),et=k(()=>v[r(Ie).type??""]??cr),lt=k(()=>p[r(Ie).type??""]??"#ff6b35");var vt=z1(),yt=d(vt),bt=d(yt),Mt=d(bt);let Lt;var Ht=d(Mt);un(Ht,()=>r(et),(Re,Le)=>{Le(Re,{size:14})}),c(Mt);var Wt=h(Mt,2),kn=d(Wt),Sn=d(kn);c(kn);var Ln=h(kn,2),rr=d(Ln,!0);c(Ln),c(Wt),c(bt);var ya=h(bt,2),cl=d(ya);Ks(cl,{size:14}),c(ya),c(yt);var Oo=h(yt,2),ba=d(Oo),xa=d(ba);let Ro;var dl=d(xa,!0);c(xa),c(ba);var wa=h(ba,2),Lo=h(d(wa),2),ul=d(Lo);{var vl=Re=>{var Le=Bm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Input node name",get value(){return r(I)},set value(me){_(I,me,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Trigger Type",type:"select",options:["manual","http","queue","schedule","file_upload"],get value(){return r(re)},set value(me){_(re,me,!0)}});var qe=h(Ke,2);{var Ye=me=>{var He=Rm(),Ee=de(He);Ne(Ee,{label:"HTTP Method",type:"select",options:["GET","POST","PUT","PATCH"],get value(){return r(te)},set value(Pe){_(te,Pe,!0)}}),ye(2),y(me,He)},ft=me=>{var He=Lm(),Ee=de(He);Ne(Ee,{label:"Broker",type:"select",options:["kafka","rabbitmq","redis"],get value(){return r(ne)},set value(ht){_(ne,ht,!0)}});var Pe=h(Ee,2);Ne(Pe,{label:"Topic / Queue",type:"text",placeholder:"pipeline-input",get value(){return r(G)},set value(ht){_(G,ht,!0)}});var Fe=h(Pe,2);Ne(Fe,{label:"Group ID",type:"text",placeholder:"studio-group",get value(){return r(oe)},set value(ht){_(oe,ht,!0)}}),y(me,He)},pt=me=>{var He=Hm(),Ee=de(He);Ne(Ee,{label:"Cron Expression",type:"text",placeholder:"0 */6 * * *",get value(){return r(ee)},set value(Fe){_(ee,Fe,!0)}});var Pe=h(Ee,2);Ne(Pe,{label:"Timezone",type:"text",placeholder:"UTC",get value(){return r(se)},set value(Fe){_(se,Fe,!0)}}),ye(2),y(me,He)},Je=me=>{var He=Vm(),Ee=de(He);Ne(Ee,{label:"Accepted Types",type:"text",placeholder:"application/pdf, text/csv",get value(){return r(le)},set value(Fe){_(le,Fe,!0)}});var Pe=h(Ee,2);Ne(Pe,{label:"Max Size (MB)",type:"number",placeholder:"50",get value(){return r(he)},set value(Fe){_(he,Fe,!0)}}),y(me,He)},Ve=me=>{var He=Fm();y(me,He)};Y(qe,me=>{r(re)==="http"?me(Ye):r(re)==="queue"?me(ft,1):r(re)==="schedule"?me(pt,2):r(re)==="file_upload"?me(Je,3):me(Ve,!1)})}var Se=h(qe,2);Ne(Se,{label:"Input Schema (JSON)",type:"textarea",placeholder:'{"type": "object", "properties": {…}}',get value(){return r(Ae)},set value(me){_(Ae,me,!0)}}),y(Re,Le)},fl=Re=>{var Le=Zm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Output node name",get value(){return r(I)},set value(Se){_(I,Se,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Destination",type:"select",options:["response","queue","webhook","store"],get value(){return r(ie)},set value(Se){_(ie,Se,!0)}});var qe=h(Ke,2);{var Ye=Se=>{var me=qm(),He=de(me);Ne(He,{label:"Broker",type:"select",options:["kafka","rabbitmq","redis"],get value(){return r(ne)},set value(Pe){_(ne,Pe,!0)}});var Ee=h(He,2);Ne(Ee,{label:"Topic / Queue",type:"text",placeholder:"pipeline-output",get value(){return r(G)},set value(Pe){_(G,Pe,!0)}}),y(Se,me)},ft=Se=>{Ne(Se,{label:"Webhook URL",type:"text",placeholder:"https://example.com/callback",get value(){return r(ve)},set value(me){_(ve,me,!0)}})},pt=Se=>{var me=Km(),He=de(me);Ne(He,{label:"Storage Type",type:"select",options:["file","database"],get value(){return r(fe)},set value(Pe){_(fe,Pe,!0)}});var Ee=h(He,2);Ne(Ee,{label:"Path / Table",type:"text",placeholder:"/tmp/results.json",get value(){return r(ke)},set value(Pe){_(ke,Pe,!0)}}),y(Se,me)},Je=Se=>{var me=jm();y(Se,me)};Y(qe,Se=>{r(ie)==="queue"?Se(Ye):r(ie)==="webhook"?Se(ft,1):r(ie)==="store"?Se(pt,2):Se(Je,!1)})}var Ve=h(qe,2);Ne(Ve,{label:"Response Schema (JSON)",type:"textarea",placeholder:'{"type": "object", "properties": {…}}',get value(){return r(Ae)},set value(Se){_(Ae,Se,!0)}}),y(Re,Le)},pl=Re=>{var Le=Wm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Agent name",get value(){return r(I)},set value(Fe){_(I,Fe,!0)}});var Ke=h(Be,2),qe=h(d(Ke),2);Ql(qe,{placeholder:"Select model...",get value(){return r(H)},set value(Fe){_(H,Fe,!0)}}),c(Ke);var Ye=h(Ke,2);Ne(Ye,{label:"Instructions",type:"textarea",placeholder:"System instructions for this agent...",get value(){return r(O)},set value(Fe){_(O,Fe,!0)}});var ft=h(Ye,2);Ne(ft,{label:"Description",type:"text",placeholder:"Agent description",get value(){return r(F)},set value(Fe){_(F,Fe,!0)}});var pt=h(ft,2);Ne(pt,{label:"Temperature",type:"number",placeholder:"0.7",get value(){return r(L)},set value(Fe){_(L,Fe,!0)}});var Je=h(pt,2);Ne(Je,{label:"Max Tokens",type:"number",placeholder:"4096",get value(){return r(q)},set value(Fe){_(q,Fe,!0)}});var Ve=h(Je,2),Se=d(Ve),me=h(d(Se),2);let He;c(Se);var Ee=h(Se,2);{var Pe=Fe=>{var ht=Ym(),Vt=d(ht),nn=h(d(Vt),2),Xt=d(nn);Ct(Xt),ye(),c(nn);var zn=h(nn,2),zr=d(zn);Ct(zr),ye(),c(zn);var Hn=h(zn,2),Vn=d(Hn);Ct(Vn),ye(),c(Hn),c(Vt);var Cn=h(Vt,2),Cr=h(d(Cn),2),Fn=d(Cr);Ct(Fn);var Er=h(Fn,2),Nl=d(Er);c(Er),c(Cr),c(Cn);var qo=h(Cn,2),Ko=h(d(qo),2),Ca=d(Ko),Nr=d(Ca);Ct(Nr),Nr.value=Nr.__value="auto",ye(),c(Ca);var Ea=h(Ca,2),Mr=d(Ea);Ct(Mr),Mr.value=Mr.__value="low",ye(),c(Ea);var jo=h(Ea,2),Pr=d(jo);Ct(Pr),Pr.value=Pr.__value="high",ye(),c(jo),c(Ko),c(qo),c(ht),$(()=>W(Nl,`${r(it)??""} MB`)),Ma(Xt,()=>r(Oe),Pt=>_(Oe,Pt)),Ma(zr,()=>r(Ze),Pt=>_(Ze,Pt)),Ma(Vn,()=>r(Xe),Pt=>_(Xe,Pt)),on(Fn,()=>r(it),Pt=>_(it,Pt)),Pa(u,[],Nr,()=>r(Ge),Pt=>_(Ge,Pt)),Pa(u,[],Mr,()=>r(Ge),Pt=>_(Ge,Pt)),Pa(u,[],Pr,()=>r(Ge),Pt=>_(Ge,Pt)),y(Fe,ht)};Y(Ee,Fe=>{r(ge)&&Fe(Pe)})}c(Ve),$(()=>He=De(me,1,"mm-toggle-switch svelte-16rdffs",null,He,{"mm-on":r(ge)})),be("click",Se,()=>_(ge,!r(ge))),y(Re,Le)},hl=Re=>{var Le=Jm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Tool label on canvas",get value(){return r(I)},set value(Ve){_(I,Ve,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Tool Type",type:"select",get options(){return w},get value(){return r(j)},set value(Ve){_(j,Ve,!0)}});var qe=h(Ke,2);{var Ye=Ve=>{var Se=Um(),me=d(Se),He=d(me);Xs(He,{size:11});var Ee=h(He,2),Pe=d(Ee,!0);c(Ee),c(me);var Fe=h(me,2),ht=d(Fe,!0);c(Fe);var Vt=h(Fe,2);{var nn=Xt=>{var zn=Gm();je(zn,21,()=>r(E).parameters,wt,(zr,Hn)=>{var Vn=Xm(),Cn=d(Vn),Cr=d(Cn,!0);c(Cn);var Fn=h(Cn,2),Er=d(Fn);c(Fn),c(Vn),$(()=>{W(Cr,r(Hn).name),W(Er,`${r(Hn).type??""}${r(Hn).required?"":"?"}`)}),y(zr,Vn)}),c(zn),y(Xt,zn)};Y(Vt,Xt=>{r(E).parameters.length>0&&Xt(nn)})}c(Se),$(()=>{W(Pe,r(E).name),W(ht,r(E).description)}),y(Ve,Se)},ft=Ve=>{var Se=Qm();y(Ve,Se)};Y(qe,Ve=>{r(E)?Ve(Ye):r(j)==="custom"&&Ve(ft,1)})}var pt=h(qe,2);Ne(pt,{label:"Description",type:"textarea",placeholder:"What this tool does",get value(){return r(F)},set value(Ve){_(F,Ve,!0)}});var Je=h(pt,2);Ne(Je,{label:"Timeout (seconds)",type:"number",placeholder:"30",get value(){return r(M)},set value(Ve){_(M,Ve,!0)}}),y(Re,Le)},gl=Re=>{var Le=e1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Reasoning name",get value(){return r(I)},set value(Je){_(I,Je,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Pattern",type:"select",get options(){return f},get value(){return r(R)},set value(Je){_(R,Je,!0)}});var qe=h(Ke,2);{var Ye=Je=>{var Ve=$m(),Se=d(Ve),me=d(Se);Zr(me,{size:11});var He=h(me,2),Ee=d(He,!0);c(He),c(Se);var Pe=h(Se,2),Fe=d(Pe,!0);c(Pe);var ht=h(Pe,2),Vt=d(ht);c(ht),c(Ve),$(()=>{W(Ee,r(N).name),W(Fe,r(N).description),W(Vt,`Best for: ${r(N).bestFor??""}`)}),y(Je,Ve)};Y(qe,Je=>{r(N)&&Je(Ye)})}var ft=h(qe,2);{let Je=k(()=>r(N)?String(r(N).defaultMaxSteps):"10");Ne(ft,{label:"Max Steps",type:"number",get placeholder(){return r(Je)},get value(){return r(b)},set value(Ve){_(b,Ve,!0)}})}var pt=h(ft,2);Ne(pt,{label:"Description",type:"text",placeholder:"Reasoning strategy description",get value(){return r(F)},set value(Je){_(F,Je,!0)}}),y(Re,Le)},ml=Re=>{var Le=t1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Condition name",get value(){return r(I)},set value(qe){_(I,qe,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Condition Key",type:"text",placeholder:"e.g. document_type, status",get value(){return r(A)},set value(qe){_(A,qe,!0)}}),ye(2),y(Re,Le)},_l=Re=>{var Le=s1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Memory name",get value(){return r(I)},set value(me){_(I,me,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Action",type:"select",options:["store","retrieve","clear"],get value(){return r(U)},set value(me){_(U,me,!0)}});var qe=h(Ke,2),Ye=d(qe);{var ft=me=>{var He=n1();y(me,He)},pt=me=>{var He=r1();y(me,He)},Je=me=>{var He=a1();y(me,He)},Ve=me=>{var He=o1();y(me,He)};Y(Ye,me=>{r(U)==="store"?me(ft):r(U)==="retrieve"?me(pt,1):r(U)==="clear"?me(Je,2):me(Ve,!1)})}c(qe);var Se=h(qe,2);Ne(Se,{label:"Namespace",type:"text",placeholder:"default",get value(){return r(Z)},set value(me){_(Z,me,!0)}}),y(Re,Le)},yl=Re=>{var Le=f1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Validator name",get value(){return r(I)},set value(Ee){_(I,Ee,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Validation Rule",type:"select",options:["not_empty","is_string","is_list","is_dict","custom"],get value(){return r(X)},set value(Ee){_(X,Ee,!0)}});var qe=h(Ke,2),Ye=d(qe);{var ft=Ee=>{var Pe=i1();y(Ee,Pe)},pt=Ee=>{var Pe=l1();y(Ee,Pe)},Je=Ee=>{var Pe=c1();y(Ee,Pe)},Ve=Ee=>{var Pe=d1();y(Ee,Pe)},Se=Ee=>{var Pe=u1();y(Ee,Pe)},me=Ee=>{var Pe=v1();y(Ee,Pe)};Y(Ye,Ee=>{r(X)==="not_empty"?Ee(ft):r(X)==="is_string"?Ee(pt,1):r(X)==="is_list"?Ee(Je,2):r(X)==="is_dict"?Ee(Ve,3):r(X)==="custom"?Ee(Se,4):Ee(me,!1)})}c(qe);var He=h(qe,2);Ne(He,{label:"On Failure",type:"select",options:["reject","retry","fallback","log"],get value(){return r(z)},set value(Ee){_(z,Ee,!0)}}),y(Re,Le)},bl=Re=>{var Le=p1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Code block name",get value(){return r(I)},set value(Ye){_(I,Ye,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Description",type:"text",placeholder:"What this code does",get value(){return r(F)},set value(Ye){_(F,Ye,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Python Code",type:"textarea",placeholder:"async def execute(context, inputs): return inputs",get value(){return r(g)},set value(Ye){_(g,Ye,!0)}}),ye(2),y(Re,Le)},xl=Re=>{var Le=h1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Fan Out name",get value(){return r(I)},set value(Ye){_(I,Ye,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Split Expression",type:"text",placeholder:"How to split input for parallel branches",get value(){return r(J)},set value(Ye){_(J,Ye,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Max Concurrent",type:"number",placeholder:"10",get value(){return r(T)},set value(Ye){_(T,Ye,!0)}}),ye(2),y(Re,Le)},wl=Re=>{var Le=y1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Fan In name",get value(){return r(I)},set value(Se){_(I,Se,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Merge Expression",type:"select",options:["concat","collect"],get value(){return r(ae)},set value(Se){_(ae,Se,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Timeout (seconds)",type:"number",placeholder:"30",get value(){return r(V)},set value(Se){_(V,Se,!0)}});var Ye=h(qe,2),ft=d(Ye);{var pt=Se=>{var me=g1();y(Se,me)},Je=Se=>{var me=m1();y(Se,me)},Ve=Se=>{var me=_1();y(Se,me)};Y(ft,Se=>{r(ae)==="concat"?Se(pt):r(ae)==="collect"?Se(Je,1):Se(Ve,!1)})}c(Ye),y(Re,Le)},kl=Re=>{Ne(Re,{label:"Name",type:"text",placeholder:"Node name",get value(){return r(I)},set value(Le){_(I,Le,!0)}})};Y(ul,Re=>{r(Ie).type==="input"?Re(vl):r(Ie).type==="output"?Re(fl,1):r(Ie).type==="agent"?Re(pl,2):r(Ie).type==="tool"?Re(hl,3):r(Ie).type==="reasoning"?Re(gl,4):r(Ie).type==="condition"?Re(ml,5):r(Ie).type==="memory"?Re(_l,6):r(Ie).type==="validator"?Re(yl,7):r(Ie).type==="custom_code"?Re(bl,8):r(Ie).type==="fan_out"?Re(xl,9):r(Ie).type==="fan_in"?Re(wl,10):Re(kl,!1)})}c(Lo),c(wa);var Ho=h(wa,2);{var Sl=Re=>{var Le=S1(),Be=d(Le),Ke=d(Be);Jl(Ke,{size:12}),ye(),c(Be);var qe=h(Be,2),Ye=d(qe);{var ft=Ve=>{var Se=x1(),me=h(d(Se),2);je(me,17,()=>r(gt),wt,(He,Ee)=>{var Pe=b1(),Fe=d(Pe),ht=d(Fe,!0);c(Fe);var Vt=h(Fe,2);Uo(Vt,{size:10}),ye(2),c(Pe),$((nn,Xt)=>{xe(Pe,"title",`Select ${nn??""}`),W(ht,Xt)},[()=>xt(r(Ee).source),()=>xt(r(Ee).source)]),be("click",Pe,()=>hn(r(Ee).source)),y(He,Pe)}),c(Se),y(Ve,Se)};Y(Ye,Ve=>{r(gt).length>0&&Ve(ft)})}var pt=h(Ye,2);{var Je=Ve=>{var Se=k1(),me=h(d(Se),2);je(me,17,()=>r(dt),wt,(He,Ee)=>{var Pe=w1(),Fe=h(d(Pe),2);Uo(Fe,{size:10});var ht=h(Fe,2),Vt=d(ht,!0);c(ht),c(Pe),$((nn,Xt)=>{xe(Pe,"title",`Select ${nn??""}`),W(Vt,Xt)},[()=>xt(r(Ee).target),()=>xt(r(Ee).target)]),be("click",Pe,()=>hn(r(Ee).target)),y(He,Pe)}),c(Se),y(Ve,Se)};Y(pt,Ve=>{r(dt).length>0&&Ve(Je)})}c(qe),c(Le),y(Re,Le)};Y(Ho,Re=>{(r(gt).length>0||r(dt).length>0)&&Re(Sl)})}var ka=h(Ho,2),Vo=h(d(ka),2),Sa=d(Vo),zl=d(Sa);c(Sa);var Fo=h(Sa,2),Cl=d(Fo);c(Fo),c(Vo),c(ka);var Bo=h(ka,2),za=d(Bo),El=d(za);Xn(El,{size:13}),ye(2),c(za),c(Bo),c(Oo),c(vt),$((Re,Le)=>{Lt=st(Mt,"",Lt,{"--node-color":r(lt)}),W(Sn,`${m[r(Ie).type??""]??"Node"??""} Properties`),W(rr,r(Ie).id),Ro=st(xa,"",Ro,{"--badge-color":r(lt)}),W(dl,m[r(Ie).type??""]??r(Ie).type),W(zl,`X: ${Re??""}`),W(Cl,`Y: ${Le??""}`)},[()=>Math.round(r(Ie).position.x),()=>Math.round(r(Ie).position.y)]),be("click",ya,pn),be("click",za,wn),y(ce,vt)};Y(Qe,ce=>{n()&&ce(kt)})}y(t,Sr),Ce(),l()}_t(["click"]);var E1=P(""),N1=P(''),M1=P(''),P1=P('
    Pipeline I/O
    Processing
    '),T1=P('');function I1(t,e){ze(e,!0);const n=()=>at(mn,"$selectedNodeId",a),[a,o]=Ot();let i=Q(320),s=Q(!1),l=Q(0),u=Q(0);function v(z){z.preventDefault(),_(s,!0),_(l,z.clientX,!0),_(u,r(i),!0),document.addEventListener("mousemove",p),document.addEventListener("mouseup",m)}function p(z){r(s)&&_(i,Math.max(240,Math.min(480,r(u)+(r(l)-z.clientX))),!0)}function m(){_(s,!1),document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",m)}On(()=>{document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",m)});const f=[{type:"input",label:"Input",icon:wc,color:"#22c55e",group:"io"},{type:"output",label:"Output",icon:kc,color:"#ef4444",group:"io"},{type:"agent",label:"Agent",icon:cr,color:"#6366f1"},{type:"tool",label:"Tool",icon:Wn,color:"#8b5cf6"},{type:"reasoning",label:"Reasoning",icon:Zr,color:"#ec4899"},{type:"condition",label:"Condition",icon:Ws,color:"#f59e0b"},{type:"memory",label:"Memory",icon:co,color:"#06b6d4"},{type:"validator",label:"Validator",icon:vo,color:"#f59e0b"},{type:"custom_code",label:"Code",icon:la,color:"#3b82f6"},{type:"fan_out",label:"Fan Out",icon:fo,color:"#64748b"},{type:"fan_in",label:"Fan In",icon:po,color:"#64748b"}];function w(z){const g=parseInt(z.slice(1,3),16),C=parseInt(z.slice(3,5),16),T=parseInt(z.slice(5,7),16);return`rgba(${g}, ${C}, ${T}, 0.15)`}let N=k(()=>n()?"properties":"components");var E=T1();let I,H;var O=d(E),F=h(O,2),M=d(F);let R;var b=d(M);jl(b,{size:12}),ye(2),c(M);var A=h(M,2);{var B=z=>{var g=E1();let C;var T=d(g);Ec(T,{size:12}),ye(2),c(g),$(()=>C=De(g,1,"panel-tab-btn svelte-1ecj58j",null,C,{active:r(N)==="properties"})),be("click",g,()=>{}),y(z,g)};Y(A,z=>{n()&&z(B)})}c(F);var K=h(F,2),Z=d(K);{var x=z=>{C1(z,{})},S=z=>{var g=P1(),C=h(d(g),2);je(C,17,()=>f.filter(D=>D.group==="io"),wt,(D,V)=>{var L=N1(),q=d(L);let j;var U=d(q);un(U,()=>r(V).icon,(ae,re)=>{re(ae,{size:14})}),c(q);var X=h(q,2),J=d(X,!0);c(X),c(L),$(ae=>{xe(L,"title",`Add ${r(V).label} node`),j=st(q,"",j,ae),W(J,r(V).label)},[()=>({background:w(r(V).color),color:r(V).color})]),be("click",L,()=>Wo(r(V).type,r(V).label)),y(D,L)});var T=h(C,4);je(T,17,()=>f.filter(D=>!D.group),wt,(D,V)=>{var L=M1(),q=d(L);let j;var U=d(q);un(U,()=>r(V).icon,(ae,re)=>{re(ae,{size:14})}),c(q);var X=h(q,2),J=d(X,!0);c(X),c(L),$(ae=>{xe(L,"title",`Add ${r(V).label} node`),j=st(q,"",j,ae),W(J,r(V).label)},[()=>({background:w(r(V).color),color:r(V).color})]),be("click",L,()=>Wo(r(V).type,r(V).label)),y(D,L)}),c(g),y(z,g)};Y(Z,z=>{r(N)==="properties"&&n()?z(x):z(S,!1)})}c(K),c(E),$(()=>{I=De(E,1,"component-panel svelte-1ecj58j",null,I,{dragging:r(s)}),H=st(E,"",H,{width:`${r(i)??""}px`}),R=De(M,1,"panel-tab-btn svelte-1ecj58j",null,R,{active:r(N)==="components"})}),be("mousedown",O,v),be("click",M,()=>{n()&&mn.set(null)}),y(t,E),Ce(),o()}_t(["mousedown","click"]);var A1=P('
    No execution events yet. Run your pipeline to see logs here.
    '),D1=P(' '),O1=P(' '),R1=P(' '),L1=P('
    '),H1=P('
    ');function V1(t,e){ze(e,!0);const n=()=>at(Ka,"$executionEvents",a),[a,o]=Ot();let i=Q(void 0),s=Q(0);_e(()=>{const b=n();b.length>r(s)&&r(i)&&requestAnimationFrame(()=>{r(i)&&(r(i).scrollTop=r(i).scrollHeight)}),_(s,b.length,!0)});function l(){Ka.set([])}function u(b){const A=new Date(b),B=String(A.getHours()).padStart(2,"0"),K=String(A.getMinutes()).padStart(2,"0"),Z=String(A.getSeconds()).padStart(2,"0"),x=String(A.getMilliseconds()).padStart(3,"0");return`${B}:${K}:${Z}.${x}`}function v(b){switch(b){case"node_start":return"badge-info";case"node_complete":case"pipeline_complete":return"badge-success";case"node_error":return"badge-error";case"node_skip":return"badge-warning";default:return""}}function p(b){switch(b){case"node_start":return"START";case"node_complete":return"DONE";case"node_error":return"ERROR";case"node_skip":return"SKIP";case"pipeline_complete":return"COMPLETE";default:return b}}function m(b){return b.type==="node_complete"&&b.latency_ms!=null?`${b.latency_ms}ms`:b.type==="node_error"&&b.error?b.error:b.type==="pipeline_complete"&&b.duration_ms!=null?`Total: ${b.duration_ms}ms`:""}var f=H1(),w=d(f),N=d(w),E=d(N);c(N);var I=h(N,2),H=d(I);Xn(H,{size:13}),c(I),c(w);var O=h(w,2),F=d(O);{var M=b=>{var A=A1();y(b,A)},R=b=>{var A=Te(),B=de(A);je(B,1,n,wt,(K,Z)=>{const x=k(()=>m(r(Z)));var S=L1(),z=d(S),g=d(z,!0);c(z);var C=h(z,2),T=d(C,!0);c(C);var D=h(C,2);{var V=X=>{var J=D1(),ae=d(J,!0);c(J),$(()=>W(ae,r(Z).node_id)),y(X,J)};Y(D,X=>{r(Z).node_id&&X(V)})}var L=h(D,2);{var q=X=>{var J=O1(),ae=d(J,!0);c(J),$(()=>W(ae,r(Z).pipeline_name)),y(X,J)};Y(L,X=>{r(Z).pipeline_name&&X(q)})}var j=h(L,2);{var U=X=>{var J=R1(),ae=d(J,!0);c(J),$(()=>W(ae,r(x))),y(X,J)};Y(j,X=>{r(x)&&X(U)})}c(S),$((X,J,ae)=>{W(g,X),De(C,1,`log-badge ${J??""}`,"svelte-dlnc6c"),W(T,ae)},[()=>u(r(Z).timestamp??""),()=>v(r(Z).type),()=>p(r(Z).type)]),y(K,S)}),y(b,A)};Y(F,b=>{n().length===0?b(M):b(R,!1)})}c(O),yn(O,b=>_(i,b),()=>r(i)),c(f),$(()=>W(E,`${n().length??""} events`)),be("click",I,l),y(t,f),Ce(),o()}_t(["click"]);var F1=P('Auto-syncing...'),B1=P('
    Generating code...
    '),q1=P('
    '),K1=P(''),j1=P('
    '),Z1=P('
    Add nodes to your pipeline to generate code.
    '),Y1=P('
    Generated Python
    ');function W1(t,e){ze(e,!0);let n=Q(""),a=Q(!1),o=Q(""),i=Q(!1),s=Q(!0),l=Q(!1),u=null,v=null,p=Q("");function m(){const G=Bn(an),oe=Bn(Mn),ee=G.map(te=>({id:te.id,type:te.type,label:te.data?.label??"",model:te.data?.model??"",instructions:te.data?.instructions??""})),se=oe.map(te=>({id:te.id,source:te.source,target:te.target}));return JSON.stringify({nodes:ee,edges:se})}function f(){const G=Bn(an),oe=Bn(Mn),ee=G.map(te=>({id:te.id,type:te.type,label:te.data?.label??"",position:te.position,data:te.data})),se=oe.map(te=>({id:te.id,source:te.source,target:te.target}));return{nodes:ee,edges:se}}async function w(){_(a,!0),_(o,""),_(l,!1);try{const G=f(),oe=await ot.codegen.toCode(G);_(n,oe.code,!0)}catch(G){_(o,G instanceof Error?G.message:"Code generation failed",!0),_(n,"")}finally{_(a,!1)}}async function N(){if(r(n))try{await navigator.clipboard.writeText(r(n)),_(i,!0),u&&clearTimeout(u),u=setTimeout(()=>{_(i,!1),u=null},2e3)}catch{}}function E(){_(s,!r(s)),r(s)||I()}function I(){v&&(clearTimeout(v),v=null),_(l,!1)}function H(G){return G.replace(/&/g,"&").replace(//g,">")}function O(G){const oe=H(G),ee=[];let se=0;const te=new RegExp(['("""[\\s\\S]*?""")',"('''[\\s\\S]*?''')","(#[^\\n]*)",'("(?:[^"\\\\\\n]|\\\\.)*")',"('(?:[^'\\\\\\n]|\\\\.)*')","\\b(def)(\\s+)(\\w+)","\\b(class)(\\s+)(\\w+)","(@\\w+(?:\\.\\w+)*)","\\b(from|import|return|if|else|elif|for|while|try|except|finally|with|as|async|await|yield|raise|pass|break|continue|and|or|not|in|is|None|True|False)\\b","\\b(print|len|range|type|str|int|float|list|dict|set|tuple|isinstance|super)(?=\\s*\\()","\\b(\\d+\\.?\\d*(?:e[+-]?\\d+)?)\\b"].join("|"),"g");let ue;for(te.lastIndex=0;(ue=te.exec(oe))!==null;)ue.index>se&&ee.push(oe.slice(se,ue.index)),ue[1]!==void 0?ee.push(`${ue[1]}`):ue[2]!==void 0?ee.push(`${ue[2]}`):ue[3]!==void 0?ee.push(`${ue[3]}`):ue[4]!==void 0?ee.push(`${ue[4]}`):ue[5]!==void 0?ee.push(`${ue[5]}`):ue[6]!==void 0?ee.push(`${ue[6]}${ue[7]}${ue[8]}`):ue[9]!==void 0?ee.push(`${ue[9]}${ue[10]}${ue[11]}`):ue[12]!==void 0?ee.push(`${ue[12]}`):ue[13]!==void 0?ee.push(`${ue[13]}`):ue[14]!==void 0?ee.push(`${ue[14]}`):ue[15]!==void 0?ee.push(`${ue[15]}`):ee.push(ue[0]),se=ue.index+ue[0].length;return ser(n)?O(r(n)):""),M=k(()=>r(F)?r(F).split(` -`):[]),R=null,b=null;function A(){if(!r(s))return;const G=m();G===r(p)||(_(p,G,!0),Bn(an).length===0)||r(a)||(I(),_(l,!0),v=setTimeout(()=>{_(l,!1),v=null,w()},800))}io(()=>{_(p,m(),!0),Bn(an).length>0&&w(),R=an.subscribe(()=>{A()}),b=Mn.subscribe(()=>{A()})}),On(()=>{u&&clearTimeout(u),I(),R&&R(),b&&b()});var B=Y1(),K=d(B),Z=d(K),x=h(d(Z));{var S=G=>{var oe=F1();y(G,oe)};Y(x,G=>{r(l)&&G(S)})}c(Z);var z=h(Z,2),g=d(z);let C;var T=h(g,2),D=d(T);{var V=G=>{ho(G,{size:13})},L=G=>{Gs(G,{size:13})};Y(D,G=>{r(i)?G(V):G(L,!1)})}c(T);var q=h(T,2);let j;var U=d(q);mt(U,{size:13}),c(q),c(z),c(K);var X=h(K,2),J=d(X);{var ae=G=>{var oe=B1();y(G,oe)},re=G=>{var oe=q1(),ee=d(oe),se=d(ee,!0);c(ee),c(oe),$(()=>W(se,r(o))),y(G,oe)},ie=G=>{var oe=j1(),ee=d(oe),se=d(ee);je(se,21,()=>r(M),wt,(te,ue,le)=>{var he=K1(),ve=d(he);ve.textContent=le+1;var fe=h(ve),ke=d(fe);$l(ke,()=>r(ue)),c(fe),c(he),y(te,he)}),c(se),c(ee),c(oe),y(G,oe)},ne=G=>{var oe=Z1();y(G,oe)};Y(J,G=>{r(a)?G(ae):r(o)?G(re,1):r(n)?G(ie,2):G(ne,!1)})}c(X),c(B),$(()=>{C=De(g,1,"auto-toggle svelte-a1zyks",null,C,{active:r(s)}),xe(g,"title",r(s)?"Disable auto-sync":"Enable auto-sync"),T.disabled=!r(n),j=De(q,1,"toolbar-btn svelte-a1zyks",null,j,{spinning:r(a)}),q.disabled=r(a)}),be("click",g,E),be("click",T,N),be("click",q,w),y(t,B),Ce()}_t(["click"]);var X1=P('
    Run your pipeline to see the execution timeline
    '),G1=P(''),U1=P(''),Q1=P('Shift+click another checkpoint to compare'),J1=P('
    '),$1=P(' '),e_=P('
    Added
    '),t_=P(' '),n_=P('
    Removed
    '),r_=P(' '),a_=P('
    Changed
    '),o_=P('No differences'),s_=P('
    '),i_=P(' '),l_=P('
    '),c_=P('
    '),d_=P('empty'),u_=P('
    '),v_=P('
    '),f_=P('empty'),p_=P('
    '),h_=P('
    '),g_=P('
    Timeline
    ',1),m_=P('
    ');function __(t,e){ze(e,!0);const n=()=>at(En,"$checkpoints",a),[a,o]=Ot();let i=Q(null),s=Q(null),l=Q(null),u=Q(void 0),v=Q(0),p=Q(!0),m=Q(!1),f=k(()=>r(i)!==null?n().find(x=>x.index===r(i)):void 0);_e(()=>{const x=n();x.length>r(v)&&r(u)&&requestAnimationFrame(()=>{r(u)&&(r(u).scrollLeft=r(u).scrollWidth)}),_(v,x.length,!0)}),io(async()=>{try{const x=await ot.checkpoints.list();En.set(x)}catch{}});function w(x,S){S.shiftKey&&r(i)!==null&&r(i)!==x.index?(_(s,x.index,!0),N()):(_(i,x.index,!0),_(s,null),_(l,null))}async function N(){if(!(r(i)===null||r(s)===null))try{_(l,await ot.checkpoints.diff(r(i),r(s)),!0)}catch{_(l,null)}}async function E(){try{await ot.checkpoints.clear(),En.set([]),_(i,null),_(s,null),_(l,null)}catch{En.set([]),_(i,null),_(s,null),_(l,null)}}async function I(){if(!(!r(f)||r(i)===null))try{await ot.checkpoints.rewind(r(i)),En.update(x=>x.filter(S=>S.index<=r(i))),_(s,null),_(l,null),Ue(`Rewound to checkpoint #${r(i)}`,"info")}catch{Ue("Failed to rewind checkpoint","error")}}async function H(){if(!(!r(f)||r(i)===null))try{const x=await ot.checkpoints.fork(r(i),r(f).state);En.update(S=>[...S,x]),_(i,x.index,!0)}catch{}}function O(x){if(!x)return"";const S=Date.now(),z=new Date(x).getTime(),g=S-z,C=Math.floor(g/1e3);if(C<5)return"just now";if(C<60)return`${C}s ago`;const T=Math.floor(C/60);if(T<60)return`${T}m ago`;const D=Math.floor(T/60);return D<24?`${D}h ago`:new Date(x).toLocaleDateString()}function F(x){if(!x)return"";const S=new Date(x),z=String(S.getHours()).padStart(2,"0"),g=String(S.getMinutes()).padStart(2,"0"),C=String(S.getSeconds()).padStart(2,"0");return`${z}:${g}:${C}`}function M(x){return x.includes("agent")?"var(--color-node-agent, #6366f1)":x.includes("tool")?"var(--color-node-tool, #8b5cf6)":x.includes("reason")?"var(--color-node-reasoning, #ec4899)":x.includes("pipeline")?"var(--color-node-pipeline, #06b6d4)":"var(--color-accent, #ff6b35)"}function R(x){return x.branch_id?"var(--color-info, #3b82f6)":"var(--color-accent, #ff6b35)"}function b(x){return typeof x=="string"?`"${x}"`:x===null?"null":x===void 0?"undefined":typeof x=="object"?JSON.stringify(x,null,2):String(x)}var A=m_(),B=d(A);{var K=x=>{var S=X1(),z=d(S),g=d(z);go(g,{size:32}),c(z),ye(2),c(S),y(x,S)},Z=x=>{var S=g_(),z=de(S),g=d(z),C=h(d(g),2),T=d(C);c(C),c(g);var D=h(g,2),V=d(D);Xn(V,{size:13}),c(D),c(z);var L=h(z,2),q=d(L),j=h(d(q),2);je(j,1,n,ne=>ne.index,(ne,G)=>{const oe=k(()=>r(i)===r(G).index),ee=k(()=>r(s)===r(G).index);var se=G1();let te;var ue=d(se);let le;var he=h(ue,2),ve=d(he,!0);c(he),c(se),$((fe,ke)=>{te=De(se,1,"checkpoint-dot-wrapper svelte-164d9ci",null,te,{selected:r(oe),compare:r(ee)}),xe(se,"title",`${r(G).node_id??""} - ${fe??""}${r(G).branch_id?` (branch: ${r(G).branch_id})`:""}`),le=De(ue,1,"checkpoint-dot svelte-164d9ci",null,le,{selected:r(oe),compare:r(ee),forked:!!r(G).branch_id}),st(ue,`--dot-color: ${ke??""}`),W(ve,r(G).index)},[()=>F(r(G).timestamp),()=>R(r(G))]),be("click",se,fe=>w(r(G),fe)),y(ne,se)}),c(q),c(L),yn(L,ne=>_(u,ne),()=>r(u));var U=h(L,2);{var X=ne=>{var G=J1(),oe=d(G),ee=d(oe);Cc(ee,{size:13}),ye(2),c(oe);var se=h(oe,2),te=d(se);dr(te,{size:13}),ye(2),c(se);var ue=h(se,2);{var le=ve=>{var fe=U1(),ke=d(fe);_c(ke,{size:13});var Ae=h(ke,2),ge=d(Ae);c(Ae),c(fe),$(()=>W(ge,`Compare #${r(i)??""} vs #${r(s)??""}`)),be("click",fe,N),y(ve,fe)},he=ve=>{var fe=Q1();y(ve,fe)};Y(ue,ve=>{r(s)!==null?ve(le):ve(he,!1)})}c(G),be("click",oe,I),be("click",se,H),y(ne,G)};Y(U,ne=>{r(f)&&ne(X)})}var J=h(U,2);{var ae=ne=>{var G=s_(),oe=d(G),ee=d(oe);c(oe);var se=h(oe,2),te=d(se);{var ue=ge=>{var Oe=e_(),Ze=h(d(Oe),2);je(Ze,17,()=>r(l).added,wt,(Xe,it)=>{var Ge=$1(),ct=d(Ge,!0);c(Ge),$(()=>W(ct,r(it))),y(Xe,Ge)}),c(Oe),y(ge,Oe)};Y(te,ge=>{r(l).added.length>0&&ge(ue)})}var le=h(te,2);{var he=ge=>{var Oe=n_(),Ze=h(d(Oe),2);je(Ze,17,()=>r(l).removed,wt,(Xe,it)=>{var Ge=t_(),ct=d(Ge,!0);c(Ge),$(()=>W(ct,r(it))),y(Xe,Ge)}),c(Oe),y(ge,Oe)};Y(le,ge=>{r(l).removed.length>0&&ge(he)})}var ve=h(le,2);{var fe=ge=>{var Oe=a_(),Ze=h(d(Oe),2);je(Ze,17,()=>r(l).changed,wt,(Xe,it)=>{var Ge=r_(),ct=d(Ge,!0);c(Ge),$(()=>W(ct,r(it))),y(Xe,Ge)}),c(Oe),y(ge,Oe)};Y(ve,ge=>{r(l).changed.length>0&&ge(fe)})}var ke=h(ve,2);{var Ae=ge=>{var Oe=o_();y(ge,Oe)};Y(ke,ge=>{r(l).added.length===0&&r(l).removed.length===0&&r(l).changed.length===0&&ge(Ae)})}c(se),c(G),$(()=>W(ee,`Diff: #${r(i)??""} vs #${r(s)??""}`)),y(ne,G)};Y(J,ne=>{r(l)&&ne(ae)})}var re=h(J,2);{var ie=ne=>{var G=h_(),oe=d(G),ee=d(oe),se=d(ee,!0);c(ee);var te=h(ee,2),ue=d(te,!0);c(te);var le=h(te,2),he=d(le,!0);c(le),c(oe);var ve=h(oe,2);{var fe=Qe=>{var kt=l_(),ce=d(kt);dr(ce,{size:12});var Ie=h(ce,2),et=d(Ie);c(Ie);var lt=h(Ie,2);{var vt=yt=>{var bt=i_(),Mt=d(bt);c(bt),$(()=>W(Mt,`from checkpoint #${r(f).parent_index??""}`)),y(yt,bt)};Y(lt,yt=>{r(f).parent_index!==null&&r(f).parent_index!==void 0&&yt(vt)})}c(kt),$(()=>W(et,`Branch: ${r(f).branch_id??""}`)),y(Qe,kt)};Y(ve,Qe=>{r(f).branch_id&&Qe(fe)})}var ke=h(ve,2),Ae=d(ke),ge=d(Ae);{var Oe=Qe=>{Yr(Qe,{size:12})},Ze=Qe=>{Wr(Qe,{size:12})};Y(ge,Qe=>{r(p)?Qe(Oe):Qe(Ze,!1)})}var Xe=h(ge,4),it=d(Xe);c(Xe),c(Ae);var Ge=h(Ae,2);{var ct=Qe=>{var kt=u_(),ce=d(kt);je(ce,17,()=>Object.entries(r(f).state),wt,(vt,yt)=>{var bt=k(()=>dn(r(yt),2));let Mt=()=>r(bt)[0],Lt=()=>r(bt)[1];var Ht=c_(),Wt=d(Ht),kn=d(Wt);c(Wt);var Sn=h(Wt,2),Ln=d(Sn,!0);c(Sn),c(Ht),$(rr=>{W(kn,`${Mt()??""}:`),W(Ln,rr)},[()=>b(Lt())]),y(vt,Ht)});var Ie=h(ce,2);{var et=vt=>{var yt=d_();y(vt,yt)},lt=k(()=>Object.keys(r(f).state).length===0);Y(Ie,vt=>{r(lt)&&vt(et)})}c(kt),y(Qe,kt)};Y(Ge,Qe=>{r(p)&&Qe(ct)})}c(ke);var Nt=h(ke,2),gt=d(Nt),dt=d(gt);{var xt=Qe=>{Yr(Qe,{size:12})},Me=Qe=>{Wr(Qe,{size:12})};Y(dt,Qe=>{r(m)?Qe(xt):Qe(Me,!1)})}var pn=h(dt,4),wn=d(pn);c(pn),c(gt);var hn=h(gt,2);{var Sr=Qe=>{var kt=p_(),ce=d(kt);je(ce,17,()=>Object.entries(r(f).inputs),wt,(vt,yt)=>{var bt=k(()=>dn(r(yt),2));let Mt=()=>r(bt)[0],Lt=()=>r(bt)[1];var Ht=v_(),Wt=d(Ht),kn=d(Wt);c(Wt);var Sn=h(Wt,2),Ln=d(Sn,!0);c(Sn),c(Ht),$(rr=>{W(kn,`${Mt()??""}:`),W(Ln,rr)},[()=>b(Lt())]),y(vt,Ht)});var Ie=h(ce,2);{var et=vt=>{var yt=f_();y(vt,yt)},lt=k(()=>Object.keys(r(f).inputs).length===0);Y(Ie,vt=>{r(lt)&&vt(et)})}c(kt),y(Qe,kt)};Y(hn,Qe=>{r(m)&&Qe(Sr)})}c(Nt),c(G),$((Qe,kt,ce,Ie,et,lt)=>{st(ee,`background: ${Qe??""}20; color: ${kt??""}`),W(se,r(f).node_id),W(ue,ce),W(he,Ie),W(it,`${et??""} keys`),W(wn,`${lt??""} keys`)},[()=>M(r(f).node_id),()=>M(r(f).node_id),()=>O(r(f).timestamp),()=>F(r(f).timestamp),()=>Object.keys(r(f).state).length,()=>Object.keys(r(f).inputs).length]),be("click",Ae,()=>_(p,!r(p))),be("click",gt,()=>_(m,!r(m))),y(ne,G)};Y(re,ne=>{r(f)&&ne(ie)})}$(()=>W(T,`${n().length??""} checkpoint${n().length===1?"":"s"}`)),be("click",D,E),y(x,S)};Y(B,x=>{n().length===0?x(K):x(Z,!1)})}c(A),y(t,A),Ce(),o()}_t(["click"]);var y_=P('
    Loading history...
    '),b_=P('
    No version history yet
    '),x_=P('
    '),w_=P('
    '),k_=P('
    Version History
    ');function S_(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q($t([])),s=Q(!1),l=Q(null);async function u(){const R=n();if(R){_(s,!0);try{_(i,await ot.projects.getHistory(R.name),!0)}catch{_(i,[],!0)}finally{_(s,!1)}}}async function v(R){const b=n();if(b)try{await ot.projects.bookmarkVersion(b.name,R,`bookmark-${R.slice(0,7)}`),await u(),Ue("Version bookmarked","success")}catch{Ue("Failed to bookmark","error")}}async function p(R){const b=n();if(b)try{await ot.projects.restoreVersion(b.name,R),_(l,null),await u(),Ue("Restored to version "+R.slice(0,7),"success")}catch{Ue("Failed to restore","error")}}function m(R){const b=Date.now(),A=new Date(R).getTime(),B=b-A,K=Math.floor(B/6e4);if(K<1)return"just now";if(K<60)return`${K}m ago`;const Z=Math.floor(K/60);return Z<24?`${Z}h ago`:`${Math.floor(Z/24)}d ago`}_e(()=>{n()&&u()});var f=k_(),w=d(f),N=h(d(w),2),E=d(N);mt(E,{size:13}),c(N),c(w);var I=h(w,2),H=d(I);{var O=R=>{var b=y_(),A=d(b);mt(A,{size:16,class:"spin"}),ye(2),c(b),y(R,b)},F=R=>{var b=b_(),A=d(b);Jo(A,{size:16}),ye(2),c(b),y(R,b)},M=R=>{var b=Te(),A=de(b);je(A,17,()=>r(i),B=>B.sha,(B,K)=>{var Z=w_();let x;var S=d(Z),z=d(S);Jo(z,{size:14}),c(S);var g=h(S,2),C=d(g),T=d(C,!0);c(C);var D=h(C,2),V=d(D,!0);c(D);var L=h(D,2),q=d(L,!0);c(L),c(g);var j=h(g,2),U=d(j);let X;var J=d(U);{let oe=k(()=>r(K).bookmarked?"currentColor":"none");Nc(J,{size:13,get fill(){return r(oe)}})}c(U);var ae=h(U,2);let re;var ie=d(ae);Sc(ie,{size:13}),c(ae),c(j);var ne=h(j,2);{var G=oe=>{var ee=x_(),se=d(ee),te=d(se);c(se);var ue=h(se,2),le=h(ue,2);c(ee),$(he=>W(te,`Restore to ${he??""}?`),[()=>r(K).sha.slice(0,7)]),be("click",ue,()=>p(r(K).sha)),be("click",le,()=>_(l,null)),y(oe,ee)};Y(ne,oe=>{r(l)===r(K).sha&&oe(G)})}c(Z),$((oe,ee)=>{x=De(Z,1,"version-item svelte-1jltp3m",null,x,{confirming:r(l)===r(K).sha}),W(T,oe),W(V,r(K).message),W(q,ee),X=De(U,1,"action-btn bookmark-btn svelte-1jltp3m",null,X,{bookmarked:r(K).bookmarked}),xe(U,"title",r(K).bookmarked?"Bookmarked":"Bookmark this version"),re=De(ae,1,"action-btn restore-btn svelte-1jltp3m",null,re,{visible:r(l)===r(K).sha})},[()=>r(K).sha.slice(0,7),()=>m(r(K).timestamp)]),be("click",U,()=>v(r(K).sha)),be("click",ae,()=>_(l,r(K).sha,!0)),y(B,Z)}),y(R,b)};Y(H,R=>{r(s)?R(O):r(i).length===0?R(F,1):R(M,!1)})}c(I),c(f),$(()=>N.disabled=r(s)),be("click",N,u),y(t,f),Ce(),o()}_t(["click"]);var z_=P('
    Loading...
    '),C_=P('
    No connectors available
    '),E_=P('Installed'),N_=P(" Install",1),M_=P(''),P_=P('
    '),T_=P('
    '),I_=P('
    No custom tools defined. Create one to get started.
    '),A_=P('
    '),D_=P('
    '),O_=P('
    ');function R_(t,e){ze(e,!0);let n=Q("connectors"),a=Q(!1),o=Q($t([])),i=Q(null),s=Q($t([]));async function l(){_(a,!0);try{_(o,await ot.customTools.catalog(),!0)}catch{_(o,[],!0),Ue("Failed to load connector catalog","error")}finally{_(a,!1)}}async function u(){_(a,!0);try{_(s,await ot.customTools.list(),!0)}catch{_(s,[],!0),Ue("Failed to load custom tools","error")}finally{_(a,!1)}}async function v(x){_(i,x,!0);try{await ot.customTools.installConnector(x),Ue("Connector installed","success"),await l()}catch{Ue("Failed to install connector","error")}finally{_(i,null)}}async function p(x){try{await ot.customTools.delete(x),Ue("Tool deleted","success"),await u()}catch{Ue("Failed to delete tool","error")}}_e(()=>{r(n)==="connectors"?l():u()});var m=O_(),f=d(m),w=d(f),N=d(w);let E;var I=d(N);Ya(I,{size:12}),ye(),c(N);var H=h(N,2);let O;var F=d(H);Wn(F,{size:12}),ye(),c(H),c(w);var M=h(w,2),R=d(M);mt(R,{size:13}),c(M),c(f);var b=h(f,2),A=d(b);{var B=x=>{var S=z_(),z=d(S);mt(z,{size:16}),ye(2),c(S),y(x,S)},K=x=>{var S=Te(),z=de(S);{var g=T=>{var D=C_(),V=d(D);Ya(V,{size:16}),ye(2),c(D),y(T,D)},C=T=>{var D=T_();je(D,21,()=>r(o),V=>V.id,(V,L)=>{var q=P_(),j=d(q),U=d(j,!0);c(j);var X=h(j,2),J=d(X),ae=d(J),re=d(ae,!0);c(ae);var ie=h(ae,2);{var ne=he=>{var ve=E_();y(he,ve)};Y(ie,he=>{r(L).installed&&he(ne)})}c(J);var G=h(J,2),oe=d(G,!0);c(G);var ee=h(G,2),se=d(ee,!0);c(ee),c(X);var te=h(X,2),ue=d(te);{var le=he=>{var ve=M_(),fe=d(ve);{var ke=ge=>{var Oe=qs("Installing...");y(ge,Oe)},Ae=ge=>{var Oe=N_(),Ze=de(Oe);ca(Ze,{size:11}),ye(),y(ge,Oe)};Y(fe,ge=>{r(i)===r(L).id?ge(ke):ge(Ae,!1)})}c(ve),$(()=>ve.disabled=r(i)===r(L).id),be("click",ve,()=>v(r(L).id)),y(he,ve)};Y(ue,he=>{r(L).installed||he(le)})}c(te),c(q),$(()=>{W(U,r(L).icon),W(re,r(L).name),W(oe,r(L).description),W(se,r(L).category)}),y(V,q)}),c(D),y(T,D)};Y(z,T=>{r(o).length===0?T(g):T(C,!1)})}y(x,S)},Z=x=>{var S=Te(),z=de(S);{var g=T=>{var D=I_(),V=d(D);Wn(V,{size:16}),ye(2),c(D),y(T,D)},C=T=>{var D=D_();je(D,21,()=>r(s),V=>V.name,(V,L)=>{var q=A_(),j=d(q),U=d(j),X=d(U,!0);c(U);var J=h(U,2),ae=d(J,!0);c(J);var re=h(J,2),ie=d(re,!0);c(re),c(j);var ne=h(j,2),G=d(ne),oe=d(G);Xn(oe,{size:13}),c(G),c(ne),c(q),$(()=>{W(X,r(L).name),W(ae,r(L).tool_type),W(ie,r(L).description)}),be("click",G,()=>p(r(L).name)),y(V,q)}),c(D),y(T,D)};Y(z,T=>{r(s).length===0?T(g):T(C,!1)})}y(x,S)};Y(A,x=>{r(a)?x(B):r(n)==="connectors"?x(K,1):x(Z,!1)})}c(b),c(m),$(()=>{E=De(N,1,"sub-tab svelte-1g6pzvd",null,E,{active:r(n)==="connectors"}),O=De(H,1,"sub-tab svelte-1g6pzvd",null,O,{active:r(n)==="tools"})}),be("click",N,()=>_(n,"connectors")),be("click",H,()=>_(n,"tools")),be("click",M,()=>r(n)==="connectors"?l():u()),y(t,m),Ce()}_t(["click"]);var L_=P('
    Loading...
    '),H_=P('
    No datasets. Upload a JSON or CSV file to get started.
    '),V_=P(''),F_=P('
    '),B_=P(' '),q_=P('
    '),K_=P('
    '),j_=P('
    Total
    Passed
    Failed
    Pass Rate
    '),Z_=P('
    Evaluate
    ');function Y_(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(null),u=Q(!1),v=Q(null),p=Q(void 0);async function m(){const L=n();if(L){_(i,!0);try{_(s,await ot.evaluate.listDatasets(L.name),!0)}catch{_(s,[],!0),Ue("Failed to load datasets","error")}finally{_(i,!1)}}}async function f(){if(!n()){Ue("Select a project first","error");return}r(p)?.click()}async function w(L){const q=n();if(!q)return;const j=L.target,U=j.files?.[0];if(U){try{const X=await ot.evaluate.uploadDataset(q.name,U);Ue(`Dataset uploaded: ${X.test_cases} test cases`,"success"),await m()}catch{Ue("Failed to upload dataset","error")}j.value=""}}async function N(){const L=n();if(!(!L||!r(l))){_(u,!0),_(v,null);try{const q=js();_(v,await ot.evaluate.run(L.name,r(l),q),!0),Ue(`Evaluation complete: ${r(v).pass_rate.toFixed(1)}% pass rate`,"success")}catch{Ue("Evaluation failed","error")}finally{_(u,!1)}}}_e(()=>{n()&&m()});var E=Z_(),I=d(E),H=h(d(I),2),O=d(H),F=d(O);Mc(F,{size:12}),ye(),c(O);var M=h(O,2),R=d(M);mt(R,{size:13}),c(M),c(H);var b=h(H,2);yn(b,L=>_(p,L),()=>r(p)),c(I);var A=h(I,2),B=d(A),K=h(d(B),2);{var Z=L=>{var q=L_(),j=d(q);mt(j,{size:13}),ye(2),c(q),y(L,q)},x=L=>{var q=H_(),j=d(q);Xo(j,{size:13}),ye(2),c(q),y(L,q)},S=L=>{var q=F_();je(q,21,()=>r(s),j=>j.filename,(j,U)=>{var X=V_();let J;var ae=d(X);Xo(ae,{size:12});var re=h(ae,2),ie=d(re,!0);c(re);var ne=h(re,2),G=d(ne);c(ne),c(X),$(()=>{J=De(X,1,"dataset-item svelte-3xr44d",null,J,{selected:r(l)===r(U).filename}),W(ie,r(U).filename),W(G,`${r(U).test_cases??""} cases`)}),be("click",X,()=>_(l,r(U).filename,!0)),y(j,X)}),c(q),y(L,q)};Y(K,L=>{r(i)?L(Z):r(s).length===0?L(x,1):L(S,!1)})}c(B);var z=h(B,2),g=d(z),C=d(g);ec(C,{size:12});var T=h(C);c(g),c(z);var D=h(z,2);{var V=L=>{var q=j_(),j=h(d(q),2),U=d(j),X=d(U),J=d(X,!0);c(X),ye(2),c(U);var ae=h(U,2),re=d(ae),ie=d(re,!0);c(re),ye(2),c(ae);var ne=h(ae,2),G=d(ne),oe=d(G,!0);c(G),ye(2),c(ne);var ee=h(ne,2),se=d(ee),te=d(se);c(se),ye(2),c(ee),c(j);var ue=h(j,2);{var le=he=>{var ve=K_();je(ve,21,()=>r(v).results,wt,(fe,ke)=>{var Ae=q_();let ge;var Oe=d(Ae),Ze=d(Oe);{var Xe=dt=>{hc(dt,{size:12})},it=dt=>{gc(dt,{size:12})};Y(Ze,dt=>{r(ke).passed?dt(Xe):dt(it,!1)})}c(Oe);var Ge=h(Oe,2),ct=d(Ge,!0);c(Ge);var Nt=h(Ge,2);{var gt=dt=>{var xt=B_(),Me=d(xt,!0);c(xt),$(()=>W(Me,r(ke).error)),y(dt,xt)};Y(Nt,dt=>{r(ke).error&&dt(gt)})}c(Ae),$(()=>{ge=De(Ae,1,"result-row svelte-3xr44d",null,ge,{passed:r(ke).passed,failed:!r(ke).passed}),W(ct,r(ke).input)}),y(fe,Ae)}),c(ve),y(he,ve)};Y(ue,he=>{r(v).results.length>0&&he(le)})}c(q),$(he=>{W(J,r(v).total),W(ie,r(v).passed),W(oe,r(v).failed),W(te,`${he??""}%`)},[()=>r(v).pass_rate.toFixed(1)]),y(L,q)};Y(D,L=>{r(v)&&L(V)})}c(A),c(E),$(()=>{g.disabled=!r(l)||r(u)||!n(),W(T,` ${r(u)?"Running...":"Run Evaluation"}`)}),be("click",O,f),be("click",M,m),be("change",b,w),be("click",g,N),y(t,E),Ce(),o()}_t(["click","change"]);var W_=P(''),X_=P('
    %
    '),G_=P('
    '),U_=P('
    Loading...
    '),Q_=P('
    No experiments yet. Create one to A/B test pipeline variants.
    '),J_=P('
    '),$_=P('
    '),e0=P('
    '),t0=P('
    Experiments
    ');function n0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(!1),u=Q(""),v=Q($t([{name:"Control",pipeline:"default",traffic:50},{name:"Variant A",pipeline:"default",traffic:50}]));async function p(){const g=n();if(g){_(i,!0);try{_(s,await ot.experiments.list(g.name),!0)}catch{_(s,[],!0),Ue("Failed to load experiments","error")}finally{_(i,!1)}}}async function m(){const g=n();if(!(!g||!r(u).trim()))try{await ot.experiments.create(g.name,r(u).trim(),r(v)),Ue("Experiment created","success"),_(u,""),_(l,!1),_(v,[{name:"Control",pipeline:"default",traffic:50},{name:"Variant A",pipeline:"default",traffic:50}],!0),await p()}catch{Ue("Failed to create experiment","error")}}async function f(g){const C=n();if(C)try{await ot.experiments.delete(C.name,g),Ue("Experiment deleted","success"),await p()}catch{Ue("Failed to delete experiment","error")}}function w(){const g=r(v).length+1;_(v,[...r(v),{name:`Variant ${String.fromCharCode(64+g)}`,pipeline:"default",traffic:0}],!0)}function N(g){_(v,r(v).filter((C,T)=>T!==g),!0)}function E(g){switch(g){case"running":return"badge-running";case"completed":return"badge-completed";default:return"badge-draft"}}_e(()=>{n()&&p()});var I=t0(),H=d(I),O=h(d(H),2),F=d(O),M=d(F);Go(M,{size:12}),ye(),c(F);var R=h(F,2),b=d(R);mt(b,{size:13}),c(R),c(O),c(H);var A=h(H,2),B=d(A);{var K=g=>{var C=G_(),T=d(C),D=h(d(T),2);Ct(D),c(T);var V=h(T,2),L=h(d(V),2),q=d(L);je(q,17,()=>r(v),wt,(re,ie,ne)=>{var G=X_(),oe=d(G);Ct(oe);var ee=h(oe,2);Ct(ee);var se=h(ee,2),te=d(se);Ct(te),xe(te,"min",0),xe(te,"max",100),ye(2),c(se);var ue=h(se,2);{var le=he=>{var ve=W_(),fe=d(ve);Xn(fe,{size:11}),c(ve),be("click",ve,()=>N(ne)),y(he,ve)};Y(ue,he=>{r(v).length>2&&he(le)})}c(G),on(oe,()=>r(ie).name,he=>r(ie).name=he),on(ee,()=>r(ie).pipeline,he=>r(ie).pipeline=he),on(te,()=>r(ie).traffic,he=>r(ie).traffic=he),y(re,G)});var j=h(q,2),U=d(j);Go(U,{size:11}),ye(),c(j),c(L),c(V);var X=h(V,2),J=d(X),ae=h(J,2);c(X),c(C),$(re=>J.disabled=re,[()=>!r(u).trim()]),on(D,()=>r(u),re=>_(u,re)),be("click",j,w),be("click",J,m),be("click",ae,()=>_(l,!1)),y(g,C)};Y(B,g=>{r(l)&&g(K)})}var Z=h(B,2);{var x=g=>{var C=U_(),T=d(C);mt(T,{size:16}),ye(2),c(C),y(g,C)},S=g=>{var C=Q_(),T=d(C);Us(T,{size:16}),ye(2),c(C),y(g,C)},z=g=>{var C=e0();je(C,21,()=>r(s),T=>T.id,(T,D)=>{var V=$_(),L=d(V),q=d(L);dr(q,{size:13});var j=h(q,2),U=d(j,!0);c(j);var X=h(j,2),J=d(X,!0);c(X);var ae=h(X,2),re=d(ae,!0);c(ae);var ie=h(ae,2),ne=d(ie);Xn(ne,{size:12}),c(ie),c(L);var G=h(L,2);je(G,21,()=>r(D).variants,oe=>oe.name,(oe,ee)=>{var se=J_(),te=d(se),ue=d(te,!0);c(te);var le=h(te,2),he=d(le);let ve;c(le);var fe=h(le,2),ke=d(fe);c(fe),c(se),$(()=>{W(ue,r(ee).name),ve=st(he,"",ve,{width:`${r(ee).traffic??""}%`}),W(ke,`${r(ee).traffic??""}%`)}),y(oe,se)}),c(G),c(V),$((oe,ee)=>{W(U,r(D).name),De(X,1,`status-badge ${oe??""}`,"svelte-oe5i1m"),W(J,r(D).status),W(re,ee)},[()=>E(r(D).status),()=>new Date(r(D).created_at).toLocaleDateString()]),be("click",ie,()=>f(r(D).id)),y(T,V)}),c(C),y(g,C)};Y(Z,g=>{r(i)?g(x):r(s).length===0&&!r(l)?g(S,1):g(z,!1)})}c(A),c(I),be("click",F,()=>_(l,!r(l))),be("click",R,p),y(t,I),Ce(),o()}_t(["click"]);var r0=P(" Copied",1),a0=P(" Copy",1),o0=P(' ',1),s0=P(" Generating...",1),i0=P(" Export as Python",1),l0=P('
     
    '),c0=P('
    Generating Python code...
    '),d0=P('
    Click "Export as Python" to generate deployable code from your pipeline.
    '),u0=P('
    Deploy / Export
    ');function v0(t,e){ze(e,!0);let n=Q(!1),a=Q(""),o=Q(!1);async function i(){_(n,!0),_(a,"");try{const b=js(),A=await ot.codegen.toCode(b);_(a,A.code,!0),Ue("Code generated successfully","success")}catch{Ue("Failed to generate code","error")}finally{_(n,!1)}}async function s(){if(r(a))try{await navigator.clipboard.writeText(r(a)),_(o,!0),Ue("Copied to clipboard","info"),setTimeout(()=>_(o,!1),2e3)}catch{Ue("Failed to copy","error")}}function l(){if(!r(a))return;const b=new Blob([r(a)],{type:"text/x-python"}),A=URL.createObjectURL(b),B=document.createElement("a");B.href=A,B.download="pipeline.py",B.click(),URL.revokeObjectURL(A),Ue("Download started","info")}var u=u0(),v=d(u),p=h(d(v),2),m=d(p);{var f=b=>{var A=o0(),B=de(A),K=d(B);{var Z=g=>{var C=r0(),T=de(C);ho(T,{size:12}),ye(),y(g,C)},x=g=>{var C=a0(),T=de(C);Gs(T,{size:12}),ye(),y(g,C)};Y(K,g=>{r(o)?g(Z):g(x,!1)})}c(B);var S=h(B,2),z=d(S);ca(z,{size:12}),ye(),c(S),be("click",B,s),be("click",S,l),y(b,A)};Y(m,b=>{r(a)&&b(f)})}var w=h(m,2),N=d(w);{var E=b=>{var A=s0(),B=de(A);mt(B,{size:12}),ye(),y(b,A)},I=b=>{var A=i0(),B=de(A);ja(B,{size:12}),ye(),y(b,A)};Y(N,b=>{r(n)?b(E):b(I,!1)})}c(w),c(p),c(v);var H=h(v,2),O=d(H);{var F=b=>{var A=l0(),B=d(A),K=d(B),Z=d(K,!0);c(K),c(B),c(A),$(()=>W(Z,r(a))),y(b,A)},M=b=>{var A=c0(),B=d(A);mt(B,{size:16}),ye(2),c(A),y(b,A)},R=b=>{var A=d0(),B=d(A);ja(B,{size:16}),ye(2),c(A),y(b,A)};Y(O,b=>{r(a)?b(F):r(n)?b(M,1):b(R,!1)})}c(H),c(u),$(()=>w.disabled=r(n)),be("click",w,i),y(t,u),Ce()}_t(["click"]);var f0=P('
    Loading usage data...
    '),p0=P('
    No usage data available. Run a pipeline to see metrics.
    '),h0=P('
    '),g0=P('
    By Model
    Model Requests Tokens Cost
    '),m0=P('
    '),_0=P('
    By Agent
    Agent Requests Tokens Cost
    '),y0=P('
    Total Requests
    Total Tokens
    Total Cost
    Avg Latency
    ',1),b0=P('
    Monitor
    ');function x0(t,e){ze(e,!0);let n=Q(!1),a=Q(null);async function o(){_(n,!0);try{_(a,await ot.monitoring.usage(),!0)}catch{_(a,null),Ue("Failed to load usage data","error")}finally{_(n,!1)}}function i(H){return H>=1e6?`${(H/1e6).toFixed(1)}M`:H>=1e3?`${(H/1e3).toFixed(1)}K`:H.toString()}function s(H){return`$${H.toFixed(4)}`}function l(H,O){return O===0?"0ms":`${Math.round(H/O)}ms`}_e(()=>{o()});var u=b0(),v=d(u),p=h(d(v),2),m=d(p);mt(m,{size:13}),c(p),c(v);var f=h(v,2),w=d(f);{var N=H=>{var O=f0(),F=d(O);mt(F,{size:16}),ye(2),c(O),y(H,O)},E=H=>{var O=p0(),F=d(O);Qs(F,{size:16}),ye(2),c(O),y(H,O)},I=H=>{var O=y0(),F=de(O),M=d(F),R=d(M),b=d(R);yc(b,{size:14}),c(R);var A=h(R,2),B=d(A),K=d(B,!0);c(B),ye(2),c(A),c(M);var Z=h(M,2),x=d(Z),S=d(x);tc(S,{size:14}),c(x);var z=h(x,2),g=d(z),C=d(g,!0);c(g),ye(2),c(z),c(Z);var T=h(Z,2),D=d(T),V=d(D);mc(V,{size:14}),c(D);var L=h(D,2),q=d(L),j=d(q,!0);c(q),ye(2),c(L),c(T);var U=h(T,2),X=d(U),J=d(X);go(J,{size:14}),c(X);var ae=h(X,2),re=d(ae),ie=d(re,!0);c(re),ye(2),c(ae),c(U),c(F);var ne=h(F,2),G=d(ne);{var oe=le=>{var he=g0(),ve=h(d(he),2),fe=h(d(ve),2);je(fe,17,()=>Object.entries(r(a).by_model),([ke,Ae])=>ke,(ke,Ae)=>{var ge=k(()=>dn(r(Ae),2));let Oe=()=>r(ge)[0],Ze=()=>r(ge)[1];var Xe=h0(),it=d(Xe),Ge=d(it,!0);c(it);var ct=h(it,2),Nt=d(ct,!0);c(ct);var gt=h(ct,2),dt=d(gt,!0);c(gt);var xt=h(gt,2),Me=d(xt,!0);c(xt),c(Xe),$((pn,wn,hn)=>{W(Ge,Oe()),W(Nt,pn),W(dt,wn),W(Me,hn)},[()=>i(Ze().requests),()=>i(Ze().total_tokens),()=>s(Ze().cost_usd)]),y(ke,Xe)}),c(ve),c(he),y(le,he)},ee=k(()=>Object.keys(r(a).by_model).length>0);Y(G,le=>{r(ee)&&le(oe)})}var se=h(G,2);{var te=le=>{var he=_0(),ve=h(d(he),2),fe=h(d(ve),2);je(fe,17,()=>Object.entries(r(a).by_agent),([ke,Ae])=>ke,(ke,Ae)=>{var ge=k(()=>dn(r(Ae),2));let Oe=()=>r(ge)[0],Ze=()=>r(ge)[1];var Xe=m0(),it=d(Xe),Ge=d(it,!0);c(it);var ct=h(it,2),Nt=d(ct,!0);c(ct);var gt=h(ct,2),dt=d(gt,!0);c(gt);var xt=h(gt,2),Me=d(xt,!0);c(xt),c(Xe),$((pn,wn,hn)=>{W(Ge,Oe()),W(Nt,pn),W(dt,wn),W(Me,hn)},[()=>i(Ze().requests),()=>i(Ze().total_tokens),()=>s(Ze().cost_usd)]),y(ke,Xe)}),c(ve),c(he),y(le,he)},ue=k(()=>Object.keys(r(a).by_agent).length>0);Y(se,le=>{r(ue)&&le(te)})}c(ne),$((le,he,ve,fe)=>{W(K,le),W(C,he),W(j,ve),W(ie,fe)},[()=>i(r(a).total_requests),()=>i(r(a).total_tokens),()=>s(r(a).total_cost_usd),()=>l(r(a).total_latency_ms,r(a).total_requests)]),y(H,O)};Y(w,H=>{r(n)&&!r(a)?H(N):r(a)?H(I,!1):H(E,1)})}c(f),c(u),$(()=>p.disabled=r(n)),be("click",p,o),y(t,u),Ce()}_t(["click"]);var w0=P(' ',1),k0=P('Files'),S0=P('
    Loading file...
    '),z0=P('
     
    '),C0=P('
    Loading files...
    '),E0=P('
    No files in this project.
    '),N0=P('
    '),M0=P(" "),P0=P(''),T0=P('
    '),I0=P('
    ');function A0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(null),u=Q(""),v=Q(!1);async function p(){const z=n();if(z){_(i,!0);try{_(s,await ot.files.list(z.name),!0)}catch{_(s,[],!0)}finally{_(i,!1)}}}async function m(z){const g=n();if(g){_(v,!0),_(l,z,!0);try{const C=await ot.files.read(g.name,z);_(u,C.content,!0)}catch{_(u,"// Failed to load file content")}finally{_(v,!1)}}}function f(){_(l,null),_(u,"")}function w(z){const g=z.split(".");return g.length>1?g[g.length-1]:""}function N(z){switch(w(z)){case"py":return"ext-python";case"ts":case"js":return"ext-js";case"json":return"ext-json";case"yaml":case"yml":return"ext-yaml";case"md":return"ext-md";default:return""}}function E(z){return z<1024?`${z} B`:z<1024*1024?`${(z/1024).toFixed(1)} KB`:`${(z/(1024*1024)).toFixed(1)} MB`}_e(()=>{n()&&(_(l,null),_(u,""),p())});var I=I0(),H=d(I),O=d(H);{var F=z=>{var g=w0(),C=de(g),T=d(C);uc(T,{size:13}),c(C);var D=h(C,2),V=d(D,!0);c(D),$(()=>W(V,r(l))),be("click",C,f),y(z,g)},M=z=>{var g=k0();y(z,g)};Y(O,z=>{r(l)?z(F):z(M,!1)})}var R=h(O,2),b=d(R);mt(b,{size:13}),c(R),c(H);var A=h(H,2),B=d(A);{var K=z=>{var g=Te(),C=de(g);{var T=V=>{var L=S0(),q=d(L);mt(q,{size:16}),ye(2),c(L),y(V,L)},D=V=>{var L=z0(),q=d(L),j=d(q),U=d(j,!0);c(j),c(q),c(L),$(()=>W(U,r(u))),y(V,L)};Y(C,V=>{r(v)?V(T):V(D,!1)})}y(z,g)},Z=z=>{var g=C0(),C=d(g);mt(C,{size:16}),ye(2),c(g),y(z,g)},x=z=>{var g=E0(),C=d(g);Js(C,{size:16}),ye(2),c(g),y(z,g)},S=z=>{var g=T0();je(g,21,()=>r(s),C=>C.path,(C,T)=>{var D=Te(),V=de(D);{var L=j=>{var U=N0(),X=d(U);ic(X,{size:13});var J=h(X,2),ae=d(J,!0);c(J),c(U),$(()=>W(ae,r(T).name)),y(j,U)},q=j=>{var U=P0(),X=d(U);nc(X,{size:13});var J=h(X,2),ae=d(J,!0);c(J);var re=h(J,2);{var ie=se=>{var te=M0(),ue=d(te,!0);c(te),$((le,he)=>{De(te,1,`file-ext ${le??""}`,"svelte-tctccr"),W(ue,he)},[()=>N(r(T).name),()=>w(r(T).name)]),y(se,te)},ne=k(()=>w(r(T).name));Y(re,se=>{r(ne)&&se(ie)})}var G=h(re,2),oe=d(G,!0);c(G);var ee=h(G,2);Wr(ee,{size:11}),c(U),$(se=>{W(ae,r(T).name),W(oe,se)},[()=>E(r(T).size)]),be("click",U,()=>m(r(T).path)),y(j,U)};Y(V,j=>{r(T).is_dir?j(L):j(q,!1)})}y(C,D)}),c(g),y(z,g)};Y(B,z=>{r(l)?z(K):r(i)?z(Z,1):r(s).length===0?z(x,2):z(S,!1)})}c(A),c(I),be("click",R,p),y(t,I),Ce(),o()}_t(["click"]);var D0=P(' '),O0=P(" Analyzing...",1),R0=P(" Analyze",1),L0=P('

    No insights yet

    Click "Analyze" to review your pipeline, or insights will appear automatically as you build.

    '),H0=P('

    '),V0=P('
    '),F0=P('
    Sent to Architect
    '),B0=P('
    Skipped
    '),q0=P('
    '),K0=P(`
    Oracle's Insights
    `);function j0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",s),a=()=>at(Zs,"$oracleInsights",s),o=()=>at(Yl,"$oracleConnected",s),i=()=>at(Wl,"$oracleAnalyzing",s),[s,l]=Ot(),u={info:{icon:Xs,color:"#3b82f6",label:"Info"},warning:{icon:rc,color:"#f59e0b",label:"Warning"},suggestion:{icon:xc,color:"#8b5cf6",label:"Suggestion"},critical:{icon:Rt,color:"#ef4444",label:"Critical"}};function v(g){return u[g]??u.info}function p(g){if(!g)return"";try{return new Date(g).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}catch{return""}}let m=Q(null);function f(g){_(m,r(m)===g?null:g,!0)}async function w(g){const C=n();if(!C)return;const T=await Gl(C.name,g.id);T&&window.dispatchEvent(new CustomEvent("oracle-approved",{detail:{instruction:T}}))}async function N(g){const C=n();C&&await Ul(C.name,g.id)}let E=k(()=>a().filter(g=>g.status==="pending").length);var I=K0(),H=d(I),O=d(H),F=d(O);Xr(F,{size:14});var M=h(F,4);{var R=g=>{var C=D0(),T=d(C,!0);c(C),$(()=>W(T,r(E))),y(g,C)};Y(M,g=>{r(E)>0&&g(R)})}c(O);var b=h(O,2),A=d(b);{var B=g=>{var C=O0(),T=de(C);Xl(T,{size:12,class:"oracle-spinner"}),ye(2),y(g,C)},K=g=>{var C=R0(),T=de(C);zc(T,{size:12}),ye(2),y(g,C)};Y(A,g=>{i()?g(B):g(K,!1)})}c(b),c(H);var Z=h(H,2),x=d(Z);{var S=g=>{var C=L0(),T=d(C);Xr(T,{size:24}),ye(4),c(C),y(g,C)},z=g=>{var C=Te(),T=de(C);je(T,1,a,D=>D.id,(D,V)=>{const L=k(()=>v(r(V).severity)),q=k(()=>r(L).icon);var j=q0();let U;var X=d(j),J=d(X);let ae;var re=d(J);un(re,()=>r(q),(ve,fe)=>{fe(ve,{size:13})}),c(J);var ie=h(J,2),ne=d(ie,!0);c(ie);var G=h(ie,2),oe=d(G,!0);c(G),c(X);var ee=h(X,2);{var se=ve=>{var fe=H0(),ke=d(fe),Ae=d(ke,!0);c(ke),c(fe),$(()=>W(Ae,r(V).description)),y(ve,fe)};Y(ee,ve=>{r(m)===r(V).id&&ve(se)})}var te=h(ee,2);{var ue=ve=>{var fe=V0(),ke=d(fe),Ae=d(ke);ho(Ae,{size:11}),ye(2),c(ke);var ge=h(ke,2),Oe=d(ge);Ks(Oe,{size:11}),ye(2),c(ge),c(fe),be("click",ke,()=>w(r(V))),be("click",ge,()=>N(r(V))),y(ve,fe)},le=ve=>{var fe=F0();y(ve,fe)},he=ve=>{var fe=B0();y(ve,fe)};Y(te,ve=>{r(V).status==="pending"?ve(ue):r(V).status==="approved"?ve(le,1):ve(he,!1)})}c(j),$(ve=>{U=De(j,1,"insight-card svelte-b2w21g",null,U,{approved:r(V).status==="approved",skipped:r(V).status==="skipped"}),ae=st(J,"",ae,{color:r(L).color}),W(ne,r(V).title),W(oe,ve)},[()=>p(r(V).timestamp)]),be("click",X,()=>f(r(V).id)),be("keydown",X,ve=>ve.key==="Enter"&&f(r(V).id)),y(D,j)}),y(g,C)};Y(x,g=>{a().length===0?g(S):g(z,!1)})}c(Z),c(I),$(()=>b.disabled=!o()||i()),be("click",b,function(...g){Zl?.apply(this,g)}),y(t,I),Ce(),l()}_t(["click","keydown"]);var Z0=P('
    Loading executions...
    '),Y0=P('
    No executions yet. Start the runtime and trigger a pipeline to see results.
    '),W0=P('
    ID
    Status
    Duration
    '),X0=P('
    '),G0=P('
    Status Execution ID Duration
    '),U0=P('
    Executions
    ');function Q0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",o),a=()=>at(Za,"$bottomPanelTab",o),[o,i]=Ot();let s=Q(!1),l=Q($t([])),u=Q(null),v=k(()=>n()?.name??""),p=k(a);async function m(){if(r(v)){_(s,!0);try{const K=await ot.runtime.executions(r(v));_(l,K.executions??[],!0)}catch{_(l,[],!0),Ue("Failed to load executions","error")}finally{_(s,!1)}}}function f(K){_(u,r(u)===K?null:K,!0)}function w(K){return K==null?"--":K<1e3?`${K}ms`:`${(K/1e3).toFixed(2)}s`}function N(K){return K.length<=12?K:K.slice(0,8)+"..."}function E(K){switch(K.toLowerCase()){case"completed":case"success":return"var(--color-success)";case"running":case"in_progress":return"#f59e0b";case"failed":case"error":return"var(--color-error)";default:return"var(--color-text-secondary)"}}_e(()=>{r(p)==="executions"&&r(v)&&m()}),_e(()=>{if(r(p)!=="executions"||!r(v))return;const K=setInterval(m,1e4);return()=>clearInterval(K)});var I=U0(),H=d(I),O=h(d(H),2),F=d(O);mt(F,{size:13}),c(O),c(H);var M=h(H,2),R=d(M);{var b=K=>{var Z=Z0(),x=d(Z);mt(x,{size:16}),ye(2),c(Z),y(K,Z)},A=K=>{var Z=Y0(),x=d(Z);ei(x,{size:16}),ye(2),c(Z),y(K,Z)},B=K=>{var Z=G0(),x=h(d(Z),2);je(x,17,()=>r(l),S=>S.execution_id,(S,z)=>{var g=X0(),C=d(g),T=d(C),D=d(T);let V;c(T);var L=h(T,2),q=d(L),j=d(q,!0);c(q),c(L);var U=h(L,2),X=d(U),J=d(X,!0);c(X),c(U);var ae=h(U,2),re=d(ae);{var ie=ee=>{Yr(ee,{size:12})},ne=ee=>{Wr(ee,{size:12})};Y(re,ee=>{r(u)===r(z).execution_id?ee(ie):ee(ne,!1)})}c(ae),c(C);var G=h(C,2);{var oe=ee=>{var se=W0(),te=d(se),ue=h(d(te),2),le=d(ue,!0);c(ue),c(te);var he=h(te,2),ve=h(d(he),2);let fe;var ke=d(ve,!0);c(ve),c(he);var Ae=h(he,2),ge=h(d(Ae),2),Oe=d(ge,!0);c(ge),c(Ae),c(se),$((Ze,Xe)=>{W(le,r(z).execution_id),fe=st(ve,"",fe,Ze),W(ke,r(z).status),W(Oe,Xe)},[()=>({color:E(r(z).status)}),()=>w(r(z).duration_ms)]),y(ee,se)};Y(G,ee=>{r(u)===r(z).execution_id&&ee(oe)})}c(g),$((ee,se,te)=>{V=st(D,"",V,ee),xe(L,"title",r(z).execution_id),W(j,se),W(J,te)},[()=>({background:E(r(z).status)}),()=>N(r(z).execution_id),()=>w(r(z).duration_ms)]),be("click",C,()=>f(r(z).execution_id)),y(S,g)}),c(Z),y(K,Z)};Y(R,K=>{r(s)&&r(l).length===0?K(b):r(l).length===0?K(A,1):K(B,!1)})}c(M),c(I),$(()=>O.disabled=r(s)),be("click",O,m),y(t,I),Ce(),i()}_t(["click"]);var J0=P('
    '),$0=P(' '),ey=P(' '),ty=P(' '),ny=P(""),ry=P('
    '),ay=P('
    ');function oy(t,e){ze(e,!0);const n=()=>at(Ka,"$executionEvents",l),a=()=>at(En,"$checkpoints",l),o=()=>at(Zs,"$oracleInsights",l),i=()=>at(Ta,"$bottomPanelOpen",l),s=()=>at(Za,"$bottomPanelTab",l),[l,u]=Ot(),v=k(()=>n().filter(q=>q.type==="node_error").length),p=k(()=>a().length),m=k(()=>o().filter(q=>q.status==="pending").length),f=[{id:"console",label:"Console",icon:ac},{id:"code",label:"Code",icon:la},{id:"timeline",label:"Timeline",icon:go},{id:"integrations",label:"Integrate",icon:Ya},{id:"evaluate",label:"Evaluate",icon:Us},{id:"experiments",label:"Experiments",icon:dr},{id:"deploy",label:"Deploy",icon:ja},{id:"monitor",label:"Monitor",icon:Qs},{id:"files",label:"Files",icon:Js},{id:"history",label:"History",icon:bc},{id:"oracle",label:"Oracle",icon:Xr},{id:"executions",label:"Executions",icon:ei}];let w=Q(320),N=Q(!1),E=Q(0),I=Q(0);const H=120;function O(){Ta.update(q=>!q)}function F(q){Za.set(q),i()||Ta.set(!0)}function M(q){q.preventDefault(),_(N,!0),_(E,q.clientY,!0),_(I,r(w),!0),document.addEventListener("mousemove",R),document.addEventListener("mouseup",b)}function R(q){if(!r(N))return;const j=Math.floor(window.innerHeight*.6),U=r(E)-q.clientY,X=Math.max(H,Math.min(j,r(I)+U));_(w,X,!0)}function b(){_(N,!1),document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",b)}On(()=>{document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",b)});var A=ay();let B,K;var Z=d(A);{var x=q=>{var j=J0();be("mousedown",j,M),y(q,j)};Y(Z,q=>{i()&&q(x)})}var S=h(Z,2),z=d(S);je(z,21,()=>f,q=>q.id,(q,j)=>{const U=k(()=>r(j).icon);var X=ny();let J;var ae=d(X);un(ae,()=>r(U),(se,te)=>{te(se,{size:13})});var re=h(ae,2),ie=d(re,!0);c(re);var ne=h(re,2);{var G=se=>{var te=$0(),ue=d(te,!0);c(te),$(()=>W(ue,r(v)>99?"99+":r(v))),y(se,te)},oe=se=>{var te=ey(),ue=d(te,!0);c(te),$(()=>W(ue,r(p)>99?"99+":r(p))),y(se,te)},ee=se=>{var te=ty(),ue=d(te,!0);c(te),$(()=>W(ue,r(m)>99?"99+":r(m))),y(se,te)};Y(ne,se=>{r(j).id==="console"&&r(v)>0?se(G):r(j).id==="timeline"&&r(p)>0?se(oe,1):r(j).id==="oracle"&&r(m)>0&&se(ee,2)})}c(X),$(()=>{J=De(X,1,"tab-btn svelte-1m9rotx",null,J,{active:s()===r(j).id}),W(ie,r(j).label)}),be("click",X,()=>F(r(j).id)),y(q,X)}),c(z);var g=h(z,2),C=d(g);{var T=q=>{Yr(q,{size:14})},D=q=>{pc(q,{size:14})};Y(C,q=>{i()?q(T):q(D,!1)})}c(g),c(S);var V=h(S,2);{var L=q=>{var j=ry(),U=d(j);{var X=le=>{V1(le,{})},J=le=>{W1(le,{})},ae=le=>{__(le,{})},re=le=>{R_(le,{})},ie=le=>{Y_(le,{})},ne=le=>{n0(le,{})},G=le=>{v0(le,{})},oe=le=>{x0(le,{})},ee=le=>{A0(le,{})},se=le=>{S_(le,{})},te=le=>{j0(le,{})},ue=le=>{Q0(le,{})};Y(U,le=>{s()==="console"?le(X):s()==="code"?le(J,1):s()==="timeline"?le(ae,2):s()==="integrations"?le(re,3):s()==="evaluate"?le(ie,4):s()==="experiments"?le(ne,5):s()==="deploy"?le(G,6):s()==="monitor"?le(oe,7):s()==="files"?le(ee,8):s()==="history"?le(se,9):s()==="oracle"?le(te,10):s()==="executions"&&le(ue,11)})}c(j),y(q,j)};Y(V,q=>{i()&&q(L)})}c(A),$(()=>{B=De(A,1,"bottom-panel svelte-1m9rotx",null,B,{dragging:r(N)}),K=st(A,"",K,{height:i()?`${r(w)}px`:"36px"}),xe(g,"title",i()?"Collapse panel":"Expand panel")}),be("click",g,O),y(t,A),Ce(),u()}_t(["mousedown","click"]);var sy=P('
    ');function gy(t,e){ze(e,!1),io(()=>oc()),On(()=>sc()),Ls();var n=sy(),a=d(n),o=d(a);zm(o,{});var i=h(o,2);I1(i,{}),c(a);var s=h(a,2);oy(s,{}),c(n),y(t,n),Ce()}export{gy as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/3.DIXAYc9g.js b/studio-desktop/frontend-dist/_app/immutable/nodes/3.DIXAYc9g.js deleted file mode 100644 index 10af0f9a..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/3.DIXAYc9g.js +++ /dev/null @@ -1,4 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as Ls}from"../chunks/FsCUQR17.js";import{aA as Ml,b3 as Pl,bp as Tl,h as Il,g as Al,au as Dl,l as Hs,k as Vs,u as Qt,z as Ol,bq as Rl,c as Me,f as de,a as _,br as Ll,bs as so,bt as Fs,p as ze,n as Hl,b as Ce,F as d,G as c,D as P,y as r,$ as tr,Q as k,b8 as dn,I as h,C as $,J as X,O as ye,bu as Bs,t as _e,M as Q,N as y,b7 as ut,as as qs,bv as Vl,bw as qa,L as be,bj as jr,K as _t,bn as On,bx as St,bo as It,by as Fl,a8 as $t,P as Bl,o as io,a2 as Bn}from"../chunks/BNectIeB.js";import{l as et,s as Ze,p as pe,r as _n,i as Y,a as Ot,c as Zo,m as Yo,b as at}from"../chunks/BB2KRr3j.js";import{I as tt,s as nt,E as yn,F as lo,G as ia,m as xe,a as De,H as Rn,o as st,e as je,B as Zr,D as co,C as mn,z as Mn,v as an,b as on,k as Ct,q as wt,J as ql,K as Na,M as Kl,N as Ma,O as Pa,g as jl,x as Xo,c as ot,t as nr,u as Ks,P as Wo,r as Zl,Q as js,R as Yl,T as Xl,L as Wl,U as Gl,V as Ul}from"../chunks/K2hNZgUo.js";import{Q as Dt,S as uo,B as cr,K as Kt,z as jt,x as Rt,U as Zt,W as Xn,G as dr,j as vo,k as la,l as fo,m as po,g as Zs,D as ca,X as Ys,T as Wn,h as Xs,M as Ql,L as Jl,I as Ws,V as Ka,C as ho,b as Gs,J as $l,Y as En,o as go,a as Ue,c as Yr,H as Xr,P as ec,N as Go,F as Us,R as ja,A as Qs,Z as tc,f as Js,O as nc,w as rc,n as ac,_ as oc,$ as sc}from"../chunks/DiTIFvoL.js";import{b as bn,c as un}from"../chunks/DfPw5QXW.js";import{A as Uo}from"../chunks/N_rdQ7t6.js";import{b as Za,a as Ta}from"../chunks/CKy8R5Mg.js";const ic=[];function $s(t,e=!1,n=!1){return Hr(t,new Map,"",ic,null,n)}function Hr(t,e,n,a,o=null,i=!1){if(typeof t=="object"&&t!==null){var s=e.get(t);if(s!==void 0)return s;if(t instanceof Map)return new Map(t);if(t instanceof Set)return new Set(t);if(Ml(t)){var l=Array(t.length);e.set(t,l),o!==null&&e.set(o,l);for(var u=0;u{var n=e();for(var a in n){var o=n[a];o?t.style.setProperty(a,o):t.style.removeProperty(a)}})}function zt(t,e,n){Vs(()=>{var a=Qt(()=>e(t,n?.())||{});if(n&&a?.update){var o=!1,i={};Hs(()=>{var s=n();Ol(s),o&&Rl(i,s)&&(i=s,a.update(s))}),o=!0}if(a?.destroy)return()=>a.destroy()})}class mo{#e=new WeakMap;#t;#n;static entries=new WeakMap;constructor(e){this.#n=e}observe(e,n){var a=this.#e.get(e)||new Set;return a.add(n),this.#e.set(e,a),this.#r().observe(e,this.#n),()=>{var o=this.#e.get(e);o.delete(n),o.size===0&&(this.#e.delete(e),this.#t.unobserve(e))}}#r(){return this.#t??(this.#t=new ResizeObserver(e=>{for(var n of e){mo.entries.set(n.target,n);for(var a of this.#e.get(n.target)||[])a(n)}}))}}var cc=new mo({box:"border-box"});function Qo(t,e,n){var a=cc.observe(t,()=>n(t[e]));Vs(()=>(Qt(()=>n(t[e])),a))}function dc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m12 19-7-7 7-7"}],["path",{d:"M19 12H5"}]];tt(t,Ze({name:"arrow-left"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function uc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z"}],["path",{d:"m7 16.5-4.74-2.85"}],["path",{d:"m7 16.5 5-3"}],["path",{d:"M7 16.5v5.17"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z"}],["path",{d:"m17 16.5-5-3"}],["path",{d:"m17 16.5 4.74-2.85"}],["path",{d:"M17 16.5v5.17"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z"}],["path",{d:"M12 8 7.26 5.15"}],["path",{d:"m12 8 4.74-2.85"}],["path",{d:"M12 13.5V8"}]];tt(t,Ze({name:"boxes"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function vc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z"}],["path",{d:"M17 21v-2"}],["path",{d:"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10"}],["path",{d:"M21 21v-2"}],["path",{d:"M3 5V3"}],["path",{d:"M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z"}],["path",{d:"M7 5V3"}]];tt(t,Ze({name:"cable"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function fc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m18 15-6-6-6 6"}]];tt(t,Ze({name:"chevron-up"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function pc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335"}],["path",{d:"m9 11 3 3L22 4"}]];tt(t,Ze({name:"circle-check-big"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function hc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"m15 9-6 6"}],["path",{d:"m9 9 6 6"}]];tt(t,Ze({name:"circle-x"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function gc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["line",{x1:"12",x2:"12",y1:"2",y2:"22"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"}]];tt(t,Ze({name:"dollar-sign"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Wr(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"}],["circle",{cx:"12",cy:"12",r:"3"}]];tt(t,Ze({name:"eye"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function mc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"}]];tt(t,Ze({name:"folder"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Jo(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"12",cy:"12",r:"3"}],["line",{x1:"3",x2:"9",y1:"12",y2:"12"}],["line",{x1:"15",x2:"21",y1:"12",y2:"12"}]];tt(t,Ze({name:"git-commit-horizontal"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function _c(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["circle",{cx:"18",cy:"18",r:"3"}],["circle",{cx:"6",cy:"6",r:"3"}],["path",{d:"M13 6h3a2 2 0 0 1 2 2v7"}],["path",{d:"M11 18H8a2 2 0 0 1-2-2V9"}]];tt(t,Ze({name:"git-compare"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function yc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["line",{x1:"4",x2:"20",y1:"9",y2:"9"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21"}]];tt(t,Ze({name:"hash"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function bc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}],["path",{d:"M12 7v5l4 2"}]];tt(t,Ze({name:"history"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function xc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"}],["path",{d:"M9 18h6"}],["path",{d:"M10 22h4"}]];tt(t,Ze({name:"lightbulb"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function ei(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M13 5h8"}],["path",{d:"M13 12h8"}],["path",{d:"M13 19h8"}],["path",{d:"m3 17 2 2 4-4"}],["path",{d:"m3 7 2 2 4-4"}]];tt(t,Ze({name:"list-checks"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function wc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m10 17 5-5-5-5"}],["path",{d:"M15 12H3"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"}]];tt(t,Ze({name:"log-in"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function kc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"m16 17 5-5-5-5"}],["path",{d:"M21 12H9"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}]];tt(t,Ze({name:"log-out"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Ya(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M12 22v-5"}],["path",{d:"M15 8V2"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z"}],["path",{d:"M9 8V2"}]];tt(t,Ze({name:"plug"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function mt(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"}],["path",{d:"M21 3v5h-5"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"}],["path",{d:"M8 16H3v5"}]];tt(t,Ze({name:"refresh-cw"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Sc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];tt(t,Ze({name:"rotate-ccw"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function zc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M3 7V5a2 2 0 0 1 2-2h2"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2"}]];tt(t,Ze({name:"scan"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Cc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z"}],["path",{d:"M3 20V4"}]];tt(t,Ze({name:"skip-back"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Ec(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M10 5H3"}],["path",{d:"M12 19H3"}],["path",{d:"M14 3v4"}],["path",{d:"M16 17v4"}],["path",{d:"M21 12h-9"}],["path",{d:"M21 19h-5"}],["path",{d:"M21 5h-7"}],["path",{d:"M8 10v4"}],["path",{d:"M8 12H3"}]];tt(t,Ze({name:"sliders-horizontal"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Nc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"}]];tt(t,Ze({name:"star"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Mc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["path",{d:"M12 3v12"}],["path",{d:"m17 8-5-5-5 5"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}]];tt(t,Ze({name:"upload"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}function Pc(t,e){const n=et(e,["children","$$slots","$$events","$$legacy"]);const a=[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2"}]];tt(t,Ze({name:"workflow"},()=>n,{get iconNode(){return a},children:(o,i)=>{var s=Me(),l=de(s);nt(l,e,"default",{}),_(o,s)},$$slots:{default:!0}}))}var Tc={value:()=>{}};function da(){for(var t=0,e=arguments.length,n={},a;t=0&&(a=n.slice(o+1),n=n.slice(0,o)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:a}})}Vr.prototype=da.prototype={constructor:Vr,on:function(t,e){var n=this._,a=Ic(t+"",n),o,i=-1,s=a.length;if(arguments.length<2){for(;++i0)for(var n=new Array(o),a=0,o,i;a=0&&(e=t.slice(0,n))!=="xmlns"&&(t=t.slice(n+1)),es.hasOwnProperty(e)?{space:es[e],local:t}:t}function Dc(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===Xa&&e.documentElement.namespaceURI===Xa?e.createElement(t):e.createElementNS(n,t)}}function Oc(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function ti(t){var e=ua(t);return(e.local?Oc:Dc)(e)}function Rc(){}function _o(t){return t==null?Rc:function(){return this.querySelector(t)}}function Lc(t){typeof t!="function"&&(t=_o(t));for(var e=this._groups,n=e.length,a=new Array(n),o=0;o=F&&(F=O+1);!(R=I[F])&&++F=0;)(s=a[o])&&(i&&s.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(s,i),i=s);return this}function ld(t){t||(t=cd);function e(m,f){return m&&f?t(m.__data__,f.__data__):!m-!f}for(var n=this._groups,a=n.length,o=new Array(a),i=0;ie?1:t>=e?0:NaN}function dd(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function ud(){return Array.from(this)}function vd(){for(var t=this._groups,e=0,n=t.length;e1?this.each((e==null?kd:typeof e=="function"?zd:Sd)(t,e,n??"")):Gn(this.node(),t)}function Gn(t,e){return t.style.getPropertyValue(e)||si(t).getComputedStyle(t,null).getPropertyValue(e)}function Ed(t){return function(){delete this[t]}}function Nd(t,e){return function(){this[t]=e}}function Md(t,e){return function(){var n=e.apply(this,arguments);n==null?delete this[t]:this[t]=n}}function Pd(t,e){return arguments.length>1?this.each((e==null?Ed:typeof e=="function"?Md:Nd)(t,e)):this.node()[t]}function ii(t){return t.trim().split(/^|\s+/)}function yo(t){return t.classList||new li(t)}function li(t){this._node=t,this._names=ii(t.getAttribute("class")||"")}li.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function ci(t,e){for(var n=yo(t),a=-1,o=e.length;++a=0&&(n=e.slice(a+1),e=e.slice(0,a)),{type:e,name:n}})}function au(t){return function(){var e=this.__on;if(e){for(var n=0,a=-1,o=e.length,i;n()=>t;function Wa(t,{sourceEvent:e,subject:n,target:a,identifier:o,active:i,x:s,y:l,dx:u,dy:v,dispatch:p}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:a,enumerable:!0,configurable:!0},identifier:{value:o,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:u,enumerable:!0,configurable:!0},dy:{value:v,enumerable:!0,configurable:!0},_:{value:p}})}Wa.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function pu(t){return!t.ctrlKey&&!t.button}function hu(){return this.parentNode}function gu(t,e){return e??{x:t.x,y:t.y}}function mu(){return navigator.maxTouchPoints||"ontouchstart"in this}function _u(){var t=pu,e=hu,n=gu,a=mu,o={},i=da("start","drag","end"),s=0,l,u,v,p,m=0;function f(M){M.on("mousedown.drag",w).filter(a).on("touchstart.drag",I).on("touchmove.drag",H,fu).on("touchend.drag touchcancel.drag",O).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function w(M,R){if(!(p||!t.call(this,M,R))){var b=F(this,e.call(this,M,R),M,R,"mouse");b&&(At(M.view).on("mousemove.drag",N,ur).on("mouseup.drag",E,ur),fi(M.view),Ia(M),v=!1,l=M.clientX,u=M.clientY,b("start",M))}}function N(M){if(jn(M),!v){var R=M.clientX-l,b=M.clientY-u;v=R*R+b*b>m}o.mouse("drag",M)}function E(M){At(M.view).on("mousemove.drag mouseup.drag",null),pi(M.view,v),jn(M),o.mouse("end",M)}function I(M,R){if(t.call(this,M,R)){var b=M.changedTouches,A=e.call(this,M,R),B=b.length,K,Z;for(K=0;K>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?Ir(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?Ir(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=bu.exec(t))?new Et(e[1],e[2],e[3],1):(e=xu.exec(t))?new Et(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=wu.exec(t))?Ir(e[1],e[2],e[3],e[4]):(e=ku.exec(t))?Ir(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=Su.exec(t))?is(e[1],e[2]/100,e[3]/100,1):(e=zu.exec(t))?is(e[1],e[2]/100,e[3]/100,e[4]):ts.hasOwnProperty(t)?as(ts[t]):t==="transparent"?new Et(NaN,NaN,NaN,0):null}function as(t){return new Et(t>>16&255,t>>8&255,t&255,1)}function Ir(t,e,n,a){return a<=0&&(t=e=n=NaN),new Et(t,e,n,a)}function Nu(t){return t instanceof yr||(t=Tn(t)),t?(t=t.rgb(),new Et(t.r,t.g,t.b,t.opacity)):new Et}function Ga(t,e,n,a){return arguments.length===1?Nu(t):new Et(t,e,n,a??1)}function Et(t,e,n,a){this.r=+t,this.g=+e,this.b=+n,this.opacity=+a}bo(Et,Ga,hi(yr,{brighter(t){return t=t==null?Ur:Math.pow(Ur,t),new Et(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?vr:Math.pow(vr,t),new Et(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Et(Pn(this.r),Pn(this.g),Pn(this.b),Qr(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:os,formatHex:os,formatHex8:Mu,formatRgb:ss,toString:ss}));function os(){return`#${Nn(this.r)}${Nn(this.g)}${Nn(this.b)}`}function Mu(){return`#${Nn(this.r)}${Nn(this.g)}${Nn(this.b)}${Nn((isNaN(this.opacity)?1:this.opacity)*255)}`}function ss(){const t=Qr(this.opacity);return`${t===1?"rgb(":"rgba("}${Pn(this.r)}, ${Pn(this.g)}, ${Pn(this.b)}${t===1?")":`, ${t})`}`}function Qr(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Pn(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Nn(t){return t=Pn(t),(t<16?"0":"")+t.toString(16)}function is(t,e,n,a){return a<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Bt(t,e,n,a)}function gi(t){if(t instanceof Bt)return new Bt(t.h,t.s,t.l,t.opacity);if(t instanceof yr||(t=Tn(t)),!t)return new Bt;if(t instanceof Bt)return t;t=t.rgb();var e=t.r/255,n=t.g/255,a=t.b/255,o=Math.min(e,n,a),i=Math.max(e,n,a),s=NaN,l=i-o,u=(i+o)/2;return l?(e===i?s=(n-a)/l+(n0&&u<1?0:s,new Bt(s,l,u,t.opacity)}function Pu(t,e,n,a){return arguments.length===1?gi(t):new Bt(t,e,n,a??1)}function Bt(t,e,n,a){this.h=+t,this.s=+e,this.l=+n,this.opacity=+a}bo(Bt,Pu,hi(yr,{brighter(t){return t=t==null?Ur:Math.pow(Ur,t),new Bt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?vr:Math.pow(vr,t),new Bt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,a=n+(n<.5?n:1-n)*e,o=2*n-a;return new Et(Aa(t>=240?t-240:t+120,o,a),Aa(t,o,a),Aa(t<120?t+240:t-120,o,a),this.opacity)},clamp(){return new Bt(ls(this.h),Ar(this.s),Ar(this.l),Qr(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Qr(this.opacity);return`${t===1?"hsl(":"hsla("}${ls(this.h)}, ${Ar(this.s)*100}%, ${Ar(this.l)*100}%${t===1?")":`, ${t})`}`}}));function ls(t){return t=(t||0)%360,t<0?t+360:t}function Ar(t){return Math.max(0,Math.min(1,t||0))}function Aa(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}const xo=t=>()=>t;function Tu(t,e){return function(n){return t+n*e}}function Iu(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(a){return Math.pow(t+a*e,n)}}function Au(t){return(t=+t)==1?mi:function(e,n){return n-e?Iu(e,n,t):xo(isNaN(e)?n:e)}}function mi(t,e){var n=e-t;return n?Tu(t,n):xo(isNaN(t)?e:t)}const Jr=(function t(e){var n=Au(e);function a(o,i){var s=n((o=Ga(o)).r,(i=Ga(i)).r),l=n(o.g,i.g),u=n(o.b,i.b),v=mi(o.opacity,i.opacity);return function(p){return o.r=s(p),o.g=l(p),o.b=u(p),o.opacity=v(p),o+""}}return a.gamma=t,a})(1);function Du(t,e){e||(e=[]);var n=t?Math.min(e.length,t.length):0,a=e.slice(),o;return function(i){for(o=0;on&&(i=e.slice(n,i),l[s]?l[s]+=i:l[++s]=i),(a=a[0])===(o=o[0])?l[s]?l[s]+=o:l[++s]=o:(l[++s]=null,u.push({i:s,x:Ut(a,o)})),n=Da.lastIndex;return n180?p+=360:p-v>180&&(v+=360),f.push({i:m.push(o(m)+"rotate(",null,a)-2,x:Ut(v,p)})):p&&m.push(o(m)+"rotate("+p+a)}function l(v,p,m,f){v!==p?f.push({i:m.push(o(m)+"skewX(",null,a)-2,x:Ut(v,p)}):p&&m.push(o(m)+"skewX("+p+a)}function u(v,p,m,f,w,N){if(v!==m||p!==f){var E=w.push(o(w)+"scale(",null,",",null,")");N.push({i:E-4,x:Ut(v,m)},{i:E-2,x:Ut(p,f)})}else(m!==1||f!==1)&&w.push(o(w)+"scale("+m+","+f+")")}return function(v,p){var m=[],f=[];return v=t(v),p=t(p),i(v.translateX,v.translateY,p.translateX,p.translateY,m,f),s(v.rotate,p.rotate,m,f),l(v.skewX,p.skewX,m,f),u(v.scaleX,v.scaleY,p.scaleX,p.scaleY,m,f),v=p=null,function(w){for(var N=-1,E=f.length,I;++N=0&&t._call.call(void 0,e),t=t._next;--Un}function us(){In=(ea=pr.now())+va,Un=sr=0;try{Gu()}finally{Un=0,Qu(),In=0}}function Uu(){var t=pr.now(),e=t-ea;e>xi&&(va-=e,ea=t)}function Qu(){for(var t,e=$r,n,a=1/0;e;)e._call?(a>e._time&&(a=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:$r=n);ir=t,Ja(a)}function Ja(t){if(!Un){sr&&(sr=clearTimeout(sr));var e=t-In;e>24?(t<1/0&&(sr=setTimeout(us,t-pr.now()-va)),ar&&(ar=clearInterval(ar))):(ar||(ea=pr.now(),ar=setInterval(Uu,xi)),Un=1,wi(us))}}function vs(t,e,n){var a=new ta;return e=e==null?0:+e,a.restart(o=>{a.stop(),t(o+e)},e,n),a}var Ju=da("start","end","cancel","interrupt"),$u=[],Si=0,fs=1,$a=2,Br=3,ps=4,eo=5,qr=6;function fa(t,e,n,a,o,i){var s=t.__transition;if(!s)t.__transition={};else if(n in s)return;ev(t,n,{name:e,index:a,group:o,on:Ju,tween:$u,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Si})}function ko(t,e){var n=Yt(t,e);if(n.state>Si)throw new Error("too late; already scheduled");return n}function tn(t,e){var n=Yt(t,e);if(n.state>Br)throw new Error("too late; already running");return n}function Yt(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function ev(t,e,n){var a=t.__transition,o;a[e]=n,n.timer=ki(i,0,n.time);function i(v){n.state=fs,n.timer.restart(s,n.delay,n.time),n.delay<=v&&s(v-n.delay)}function s(v){var p,m,f,w;if(n.state!==fs)return u();for(p in a)if(w=a[p],w.name===n.name){if(w.state===Br)return vs(s);w.state===ps?(w.state=qr,w.timer.stop(),w.on.call("interrupt",t,t.__data__,w.index,w.group),delete a[p]):+p$a&&a.state=0&&(e=e.slice(0,n)),!e||e==="start"})}function Pv(t,e,n){var a,o,i=Mv(e)?ko:tn;return function(){var s=i(this,t),l=s.on;l!==a&&(o=(a=l).copy()).on(e,n),s.on=o}}function Tv(t,e){var n=this._id;return arguments.length<2?Yt(this.node(),n).on.on(t):this.each(Pv(n,t,e))}function Iv(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}function Av(){return this.on("end.remove",Iv(this._id))}function Dv(t){var e=this._name,n=this._id;typeof t!="function"&&(t=_o(t));for(var a=this._groups,o=a.length,i=new Array(o),s=0;s()=>t;function of(t,{sourceEvent:e,target:n,transform:a,dispatch:o}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:a,enumerable:!0,configurable:!0},_:{value:o}})}function sn(t,e,n){this.k=t,this.x=e,this.y=n}sn.prototype={constructor:sn,scale:function(t){return t===1?this:new sn(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new sn(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var pa=new sn(1,0,0);Ni.prototype=sn.prototype;function Ni(t){for(;!t.__zoom;)if(!(t=t.parentNode))return pa;return t.__zoom}function Oa(t){t.stopImmediatePropagation()}function or(t){t.preventDefault(),t.stopImmediatePropagation()}function sf(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function lf(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function hs(){return this.__zoom||pa}function cf(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function df(){return navigator.maxTouchPoints||"ontouchstart"in this}function uf(t,e,n){var a=t.invertX(e[0][0])-n[0][0],o=t.invertX(e[1][0])-n[1][0],i=t.invertY(e[0][1])-n[0][1],s=t.invertY(e[1][1])-n[1][1];return t.translate(o>a?(a+o)/2:Math.min(0,a)||Math.max(0,o),s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s))}function Mi(){var t=sf,e=lf,n=uf,a=cf,o=df,i=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],l=250,u=Fr,v=da("start","zoom","end"),p,m,f,w=500,N=150,E=0,I=10;function H(g){g.property("__zoom",hs).on("wheel.zoom",B,{passive:!1}).on("mousedown.zoom",K).on("dblclick.zoom",Z).filter(o).on("touchstart.zoom",x).on("touchmove.zoom",S).on("touchend.zoom touchcancel.zoom",z).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}H.transform=function(g,C,T,D){var V=g.selection?g.selection():g;V.property("__zoom",hs),g!==V?R(g,C,T,D):V.interrupt().each(function(){b(this,arguments).event(D).start().zoom(null,typeof C=="function"?C.apply(this,arguments):C).end()})},H.scaleBy=function(g,C,T,D){H.scaleTo(g,function(){var V=this.__zoom.k,L=typeof C=="function"?C.apply(this,arguments):C;return V*L},T,D)},H.scaleTo=function(g,C,T,D){H.transform(g,function(){var V=e.apply(this,arguments),L=this.__zoom,q=T==null?M(V):typeof T=="function"?T.apply(this,arguments):T,j=L.invert(q),U=typeof C=="function"?C.apply(this,arguments):C;return n(F(O(L,U),q,j),V,s)},T,D)},H.translateBy=function(g,C,T,D){H.transform(g,function(){return n(this.__zoom.translate(typeof C=="function"?C.apply(this,arguments):C,typeof T=="function"?T.apply(this,arguments):T),e.apply(this,arguments),s)},null,D)},H.translateTo=function(g,C,T,D,V){H.transform(g,function(){var L=e.apply(this,arguments),q=this.__zoom,j=D==null?M(L):typeof D=="function"?D.apply(this,arguments):D;return n(pa.translate(j[0],j[1]).scale(q.k).translate(typeof C=="function"?-C.apply(this,arguments):-C,typeof T=="function"?-T.apply(this,arguments):-T),L,s)},D,V)};function O(g,C){return C=Math.max(i[0],Math.min(i[1],C)),C===g.k?g:new sn(C,g.x,g.y)}function F(g,C,T){var D=C[0]-T[0]*g.k,V=C[1]-T[1]*g.k;return D===g.x&&V===g.y?g:new sn(g.k,D,V)}function M(g){return[(+g[0][0]+ +g[1][0])/2,(+g[0][1]+ +g[1][1])/2]}function R(g,C,T,D){g.on("start.zoom",function(){b(this,arguments).event(D).start()}).on("interrupt.zoom end.zoom",function(){b(this,arguments).event(D).end()}).tween("zoom",function(){var V=this,L=arguments,q=b(V,L).event(D),j=e.apply(V,L),U=T==null?M(j):typeof T=="function"?T.apply(V,L):T,W=Math.max(j[1][0]-j[0][0],j[1][1]-j[0][1]),J=V.__zoom,ae=typeof C=="function"?C.apply(V,L):C,re=u(J.invert(U).concat(W/J.k),ae.invert(U).concat(W/ae.k));return function(ie){if(ie===1)ie=ae;else{var ne=re(ie),G=W/ne[2];ie=new sn(G,U[0]-ne[0]*G,U[1]-ne[1]*G)}q.zoom(null,ie)}})}function b(g,C,T){return!T&&g.__zooming||new A(g,C)}function A(g,C){this.that=g,this.args=C,this.active=0,this.sourceEvent=null,this.extent=e.apply(g,C),this.taps=0}A.prototype={event:function(g){return g&&(this.sourceEvent=g),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(g,C){return this.mouse&&g!=="mouse"&&(this.mouse[1]=C.invert(this.mouse[0])),this.touch0&&g!=="touch"&&(this.touch0[1]=C.invert(this.touch0[0])),this.touch1&&g!=="touch"&&(this.touch1[1]=C.invert(this.touch1[0])),this.that.__zoom=C,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(g){var C=At(this.that).datum();v.call(g,this.that,new of(g,{sourceEvent:this.sourceEvent,target:H,transform:this.that.__zoom,dispatch:v}),C)}};function B(g,...C){if(!t.apply(this,arguments))return;var T=b(this,C).event(g),D=this.__zoom,V=Math.max(i[0],Math.min(i[1],D.k*Math.pow(2,a.apply(this,arguments)))),L=Ft(g);if(T.wheel)(T.mouse[0][0]!==L[0]||T.mouse[0][1]!==L[1])&&(T.mouse[1]=D.invert(T.mouse[0]=L)),clearTimeout(T.wheel);else{if(D.k===V)return;T.mouse=[L,D.invert(L)],Kr(this),T.start()}or(g),T.wheel=setTimeout(q,N),T.zoom("mouse",n(F(O(D,V),T.mouse[0],T.mouse[1]),T.extent,s));function q(){T.wheel=null,T.end()}}function K(g,...C){if(f||!t.apply(this,arguments))return;var T=g.currentTarget,D=b(this,C,!0).event(g),V=At(g.view).on("mousemove.zoom",U,!0).on("mouseup.zoom",W,!0),L=Ft(g,T),q=g.clientX,j=g.clientY;fi(g.view),Oa(g),D.mouse=[L,this.__zoom.invert(L)],Kr(this),D.start();function U(J){if(or(J),!D.moved){var ae=J.clientX-q,re=J.clientY-j;D.moved=ae*ae+re*re>E}D.event(J).zoom("mouse",n(F(D.that.__zoom,D.mouse[0]=Ft(J,T),D.mouse[1]),D.extent,s))}function W(J){V.on("mousemove.zoom mouseup.zoom",null),pi(J.view,D.moved),or(J),D.event(J).end()}}function Z(g,...C){if(t.apply(this,arguments)){var T=this.__zoom,D=Ft(g.changedTouches?g.changedTouches[0]:g,this),V=T.invert(D),L=T.k*(g.shiftKey?.5:2),q=n(F(O(T,L),D,V),e.apply(this,C),s);or(g),l>0?At(this).transition().duration(l).call(R,q,D,g):At(this).call(H.transform,q,D,g)}}function x(g,...C){if(t.apply(this,arguments)){var T=g.touches,D=T.length,V=b(this,C,g.changedTouches.length===D).event(g),L,q,j,U;for(Oa(g),q=0;q"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:e,sourceHandle:n,targetHandle:a})=>`Couldn't create edge for ${t} handle id: "${t==="source"?n:a}", edge id: ${e}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},to=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Pi=["Enter"," ","Escape"],vf={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:e,y:n})=>`Moved selected node ${t}. New position, x: ${e}, y: ${n}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var Qn;(function(t){t.Strict="strict",t.Loose="loose"})(Qn||(Qn={}));var Yn;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(Yn||(Yn={}));var na;(function(t){t.Partial="partial",t.Full="full"})(na||(na={}));const no={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var gn;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(gn||(gn={}));var ra;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(ra||(ra={}));var we;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(we||(we={}));const gs={[we.Left]:we.Right,[we.Right]:we.Left,[we.Top]:we.Bottom,[we.Bottom]:we.Top};function ff(t,e){if(!t&&!e)return!0;if(!t||!e||t.size!==e.size)return!1;if(!t.size&&!e.size)return!0;for(const n of t.keys())if(!e.has(n))return!1;return!0}function ms(t,e,n){if(!n)return;const a=[];t.forEach((o,i)=>{e?.has(i)||a.push(o)}),a.length&&n(a)}function pf(t){return t===null?null:t?"valid":"invalid"}const Ti=t=>"id"in t&&"source"in t&&"target"in t,hf=t=>"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),zo=t=>"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),br=(t,e=[0,0])=>{const{width:n,height:a}=xn(t),o=t.origin??e,i=n*o[0],s=a*o[1];return{x:t.position.x-i,y:t.position.y-s}},gf=(t,e={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};const n=t.reduce((a,o)=>{const i=typeof o=="string";let s=!e.nodeLookup&&!i?o:void 0;e.nodeLookup&&(s=i?e.nodeLookup.get(o):zo(o)?o:e.nodeLookup.get(o.id));const l=s?aa(s,e.nodeOrigin):{x:0,y:0,x2:0,y2:0};return ha(a,l)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return ga(n)},xr=(t,e={})=>{let n={x:1/0,y:1/0,x2:-1/0,y2:-1/0},a=!1;return t.forEach(o=>{(e.filter===void 0||e.filter(o))&&(n=ha(n,aa(o)),a=!0)}),a?ga(n):{x:0,y:0,width:0,height:0}},Co=(t,e,[n,a,o]=[0,0,1],i=!1,s=!1)=>{const l={...kr(e,[n,a,o]),width:e.width/o,height:e.height/o},u=[];for(const v of t.values()){const{measured:p,selectable:m=!0,hidden:f=!1}=v;if(s&&!m||f)continue;const w=p.width??v.width??v.initialWidth??null,N=p.height??v.height??v.initialHeight??null,E=gr(l,$n(v)),I=(w??0)*(N??0),H=i&&E>0;(!v.internals.handleBounds||H||E>=I||v.dragging)&&u.push(v)}return u},mf=(t,e)=>{const n=new Set;return t.forEach(a=>{n.add(a.id)}),e.filter(a=>n.has(a.source)||n.has(a.target))};function _f(t,e){const n=new Map,a=e?.nodes?new Set(e.nodes.map(o=>o.id)):null;return t.forEach(o=>{o.measured.width&&o.measured.height&&(e?.includeHiddenNodes||!o.hidden)&&(!a||a.has(o.id))&&n.set(o.id,o)}),n}async function yf({nodes:t,width:e,height:n,panZoom:a,minZoom:o,maxZoom:i},s){if(t.size===0)return Promise.resolve(!0);const l=_f(t,s),u=xr(l),v=Eo(u,e,n,s?.minZoom??o,s?.maxZoom??i,s?.padding??.1);return await a.setViewport(v,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)}function Ii({nodeId:t,nextPosition:e,nodeLookup:n,nodeOrigin:a=[0,0],nodeExtent:o,onError:i}){const s=n.get(t),l=s.parentId?n.get(s.parentId):void 0,{x:u,y:v}=l?l.internals.positionAbsolute:{x:0,y:0},p=s.origin??a;let m=s.extent||o;if(s.extent==="parent"&&!s.expandParent)if(!l)i?.("005",hr.error005());else{const w=l.measured.width,N=l.measured.height;w&&N&&(m=[[u,v],[u+w,v+N]])}else l&&er(s.extent)&&(m=[[s.extent[0][0]+u,s.extent[0][1]+v],[s.extent[1][0]+u,s.extent[1][1]+v]]);const f=er(m)?An(e,m,s.measured):e;return(s.measured.width===void 0||s.measured.height===void 0)&&i?.("015",hr.error015()),{position:{x:f.x-u+(s.measured.width??0)*p[0],y:f.y-v+(s.measured.height??0)*p[1]},positionAbsolute:f}}async function bf({nodesToRemove:t=[],edgesToRemove:e=[],nodes:n,edges:a,onBeforeDelete:o}){const i=new Set(t.map(f=>f.id)),s=[];for(const f of n){if(f.deletable===!1)continue;const w=i.has(f.id),N=!w&&f.parentId&&s.find(E=>E.id===f.parentId);(w||N)&&s.push(f)}const l=new Set(e.map(f=>f.id)),u=a.filter(f=>f.deletable!==!1),p=mf(s,u);for(const f of u)l.has(f.id)&&!p.find(N=>N.id===f.id)&&p.push(f);if(!o)return{edges:p,nodes:s};const m=await o({nodes:s,edges:p});return typeof m=="boolean"?m?{edges:p,nodes:s}:{edges:[],nodes:[]}:m}const Jn=(t,e=0,n=1)=>Math.min(Math.max(t,e),n),An=(t={x:0,y:0},e,n)=>({x:Jn(t.x,e[0][0],e[1][0]-(n?.width??0)),y:Jn(t.y,e[0][1],e[1][1]-(n?.height??0))});function Ai(t,e,n){const{width:a,height:o}=xn(n),{x:i,y:s}=n.internals.positionAbsolute;return An(t,[[i,s],[i+a,s+o]],e)}const _s=(t,e,n)=>tn?-Jn(Math.abs(t-n),1,e)/e:0,Di=(t,e,n=15,a=40)=>{const o=_s(t.x,a,e.width-a)*n,i=_s(t.y,a,e.height-a)*n;return[o,i]},ha=(t,e)=>({x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}),ro=({x:t,y:e,width:n,height:a})=>({x:t,y:e,x2:t+n,y2:e+a}),ga=({x:t,y:e,x2:n,y2:a})=>({x:t,y:e,width:n-t,height:a-e}),$n=(t,e=[0,0])=>{const{x:n,y:a}=zo(t)?t.internals.positionAbsolute:br(t,e);return{x:n,y:a,width:t.measured?.width??t.width??t.initialWidth??0,height:t.measured?.height??t.height??t.initialHeight??0}},aa=(t,e=[0,0])=>{const{x:n,y:a}=zo(t)?t.internals.positionAbsolute:br(t,e);return{x:n,y:a,x2:n+(t.measured?.width??t.width??t.initialWidth??0),y2:a+(t.measured?.height??t.height??t.initialHeight??0)}},Oi=(t,e)=>ga(ha(ro(t),ro(e))),gr=(t,e)=>{const n=Math.max(0,Math.min(t.x+t.width,e.x+e.width)-Math.max(t.x,e.x)),a=Math.max(0,Math.min(t.y+t.height,e.y+e.height)-Math.max(t.y,e.y));return Math.ceil(n*a)},ys=t=>ln(t.width)&&ln(t.height)&&ln(t.x)&&ln(t.y),ln=t=>!isNaN(t)&&isFinite(t),xf=(t,e)=>{},wr=(t,e=[1,1])=>({x:e[0]*Math.round(t.x/e[0]),y:e[1]*Math.round(t.y/e[1])}),kr=({x:t,y:e},[n,a,o],i=!1,s=[1,1])=>{const l={x:(t-n)/o,y:(e-a)/o};return i?wr(l,s):l},oa=({x:t,y:e},[n,a,o])=>({x:t*o+n,y:e*o+a});function qn(t,e){if(typeof t=="number")return Math.floor((e-e/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const n=parseFloat(t);if(!Number.isNaN(n))return Math.floor(n)}if(typeof t=="string"&&t.endsWith("%")){const n=parseFloat(t);if(!Number.isNaN(n))return Math.floor(e*n*.01)}return console.error(`[React Flow] The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function wf(t,e,n){if(typeof t=="string"||typeof t=="number"){const a=qn(t,n),o=qn(t,e);return{top:a,right:o,bottom:a,left:o,x:o*2,y:a*2}}if(typeof t=="object"){const a=qn(t.top??t.y??0,n),o=qn(t.bottom??t.y??0,n),i=qn(t.left??t.x??0,e),s=qn(t.right??t.x??0,e);return{top:a,right:s,bottom:o,left:i,x:i+s,y:a+o}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function kf(t,e,n,a,o,i){const{x:s,y:l}=oa(t,[e,n,a]),{x:u,y:v}=oa({x:t.x+t.width,y:t.y+t.height},[e,n,a]),p=o-u,m=i-v;return{left:Math.floor(s),top:Math.floor(l),right:Math.floor(p),bottom:Math.floor(m)}}const Eo=(t,e,n,a,o,i)=>{const s=wf(i,e,n),l=(e-s.x)/t.width,u=(n-s.y)/t.height,v=Math.min(l,u),p=Jn(v,a,o),m=t.x+t.width/2,f=t.y+t.height/2,w=e/2-m*p,N=n/2-f*p,E=kf(t,w,N,p,e,n),I={left:Math.min(E.left-s.left,0),top:Math.min(E.top-s.top,0),right:Math.min(E.right-s.right,0),bottom:Math.min(E.bottom-s.bottom,0)};return{x:w-I.left+I.right,y:N-I.top+I.bottom,zoom:p}},mr=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function er(t){return t!=null&&t!=="parent"}function xn(t){return{width:t.measured?.width??t.width??t.initialWidth??0,height:t.measured?.height??t.height??t.initialHeight??0}}function Ri(t){return(t.measured?.width??t.width??t.initialWidth)!==void 0&&(t.measured?.height??t.height??t.initialHeight)!==void 0}function Sf(t,e={width:0,height:0},n,a,o){const i={...t},s=a.get(n);if(s){const l=s.origin||o;i.x+=s.internals.positionAbsolute.x-(e.width??0)*l[0],i.y+=s.internals.positionAbsolute.y-(e.height??0)*l[1]}return i}function zf(t){return{...vf,...t||{}}}function Ra(t,{snapGrid:e=[0,0],snapToGrid:n=!1,transform:a,containerBounds:o}){const{x:i,y:s}=qt(t),l=kr({x:i-(o?.left??0),y:s-(o?.top??0)},a),{x:u,y:v}=n?wr(l,e):l;return{xSnapped:u,ySnapped:v,...l}}const Li=t=>({width:t.offsetWidth,height:t.offsetHeight}),Hi=t=>t?.getRootNode?.()||window?.document,Cf=["INPUT","SELECT","TEXTAREA"];function Vi(t){const e=t.composedPath?.()?.[0]||t.target;return e?.nodeType!==1?!1:Cf.includes(e.nodeName)||e.hasAttribute("contenteditable")||!!e.closest(".nokey")}const Fi=t=>"clientX"in t,qt=(t,e)=>{const n=Fi(t),a=n?t.clientX:t.touches?.[0].clientX,o=n?t.clientY:t.touches?.[0].clientY;return{x:a-(e?.left??0),y:o-(e?.top??0)}},bs=(t,e,n,a,o)=>{const i=e.querySelectorAll(`.${t}`);return!i||!i.length?null:Array.from(i).map(s=>{const l=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:t,nodeId:o,position:s.getAttribute("data-handlepos"),x:(l.left-n.left)/a,y:(l.top-n.top)/a,...Li(s)}})};function Ef({sourceX:t,sourceY:e,targetX:n,targetY:a,sourceControlX:o,sourceControlY:i,targetControlX:s,targetControlY:l}){const u=t*.125+o*.375+s*.375+n*.125,v=e*.125+i*.375+l*.375+a*.125,p=Math.abs(u-t),m=Math.abs(v-e);return[u,v,p,m]}function Rr(t,e){return t>=0?.5*t:e*25*Math.sqrt(-t)}function xs({pos:t,x1:e,y1:n,x2:a,y2:o,c:i}){switch(t){case we.Left:return[e-Rr(e-a,i),n];case we.Right:return[e+Rr(a-e,i),n];case we.Top:return[e,n-Rr(n-o,i)];case we.Bottom:return[e,n+Rr(o-n,i)]}}function Bi({sourceX:t,sourceY:e,sourcePosition:n=we.Bottom,targetX:a,targetY:o,targetPosition:i=we.Top,curvature:s=.25}){const[l,u]=xs({pos:n,x1:t,y1:e,x2:a,y2:o,c:s}),[v,p]=xs({pos:i,x1:a,y1:o,x2:t,y2:e,c:s}),[m,f,w,N]=Ef({sourceX:t,sourceY:e,targetX:a,targetY:o,sourceControlX:l,sourceControlY:u,targetControlX:v,targetControlY:p});return[`M${t},${e} C${l},${u} ${v},${p} ${a},${o}`,m,f,w,N]}function qi({sourceX:t,sourceY:e,targetX:n,targetY:a}){const o=Math.abs(n-t)/2,i=n0}const Pf=({source:t,sourceHandle:e,target:n,targetHandle:a})=>`xy-edge__${t}${e||""}-${n}${a||""}`,Tf=(t,e)=>e.some(n=>n.source===t.source&&n.target===t.target&&(n.sourceHandle===t.sourceHandle||!n.sourceHandle&&!t.sourceHandle)&&(n.targetHandle===t.targetHandle||!n.targetHandle&&!t.targetHandle)),If=(t,e,n={})=>{if(!t.source||!t.target)return e;const a=n.getEdgeId||Pf;let o;return Ti(t)?o={...t}:o={...t,id:a(t)},Tf(o,e)?e:(o.sourceHandle===null&&delete o.sourceHandle,o.targetHandle===null&&delete o.targetHandle,e.concat(o))};function Ki({sourceX:t,sourceY:e,targetX:n,targetY:a}){const[o,i,s,l]=qi({sourceX:t,sourceY:e,targetX:n,targetY:a});return[`M ${t},${e}L ${n},${a}`,o,i,s,l]}const ws={[we.Left]:{x:-1,y:0},[we.Right]:{x:1,y:0},[we.Top]:{x:0,y:-1},[we.Bottom]:{x:0,y:1}},Af=({source:t,sourcePosition:e=we.Bottom,target:n})=>e===we.Left||e===we.Right?t.xMath.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function Df({source:t,sourcePosition:e=we.Bottom,target:n,targetPosition:a=we.Top,center:o,offset:i,stepPosition:s}){const l=ws[e],u=ws[a],v={x:t.x+l.x*i,y:t.y+l.y*i},p={x:n.x+u.x*i,y:n.y+u.y*i},m=Af({source:v,sourcePosition:e,target:p}),f=m.x!==0?"x":"y",w=m[f];let N=[],E,I;const H={x:0,y:0},O={x:0,y:0},[,,F,M]=qi({sourceX:t.x,sourceY:t.y,targetX:n.x,targetY:n.y});if(l[f]*u[f]===-1){f==="x"?(E=o.x??v.x+(p.x-v.x)*s,I=o.y??(v.y+p.y)/2):(E=o.x??(v.x+p.x)/2,I=o.y??v.y+(p.y-v.y)*s);const b=[{x:E,y:v.y},{x:E,y:p.y}],A=[{x:v.x,y:I},{x:p.x,y:I}];l[f]===w?N=f==="x"?b:A:N=f==="x"?A:b}else{const b=[{x:v.x,y:p.y}],A=[{x:p.x,y:v.y}];if(f==="x"?N=l.x===w?A:b:N=l.y===w?b:A,e===a){const S=Math.abs(t[f]-n[f]);if(S<=i){const z=Math.min(i-1,i-S);l[f]===w?H[f]=(v[f]>t[f]?-1:1)*z:O[f]=(p[f]>n[f]?-1:1)*z}}if(e!==a){const S=f==="x"?"y":"x",z=l[f]===u[S],g=v[S]>p[S],C=v[S]=x?(E=(B.x+K.x)/2,I=N[0].y):(E=N[0].x,I=(B.y+K.y)/2)}return[[t,{x:v.x+H.x,y:v.y+H.y},...N,{x:p.x+O.x,y:p.y+O.y},n],E,I,F,M]}function Of(t,e,n,a){const o=Math.min(ks(t,e)/2,ks(e,n)/2,a),{x:i,y:s}=e;if(t.x===i&&i===n.x||t.y===s&&s===n.y)return`L${i} ${s}`;if(t.y===s){const v=t.x{let M="";return F>0&&Fn.id===e):t[0])||null}function ao(t,e){return t?typeof t=="string"?t:`${e?`${e}__`:""}${Object.keys(t).sort().map(a=>`${a}=${t[a]}`).join("&")}`:""}function Lf(t,{id:e,defaultColor:n,defaultMarkerStart:a,defaultMarkerEnd:o}){const i=new Set;return t.reduce((s,l)=>([l.markerStart||a,l.markerEnd||o].forEach(u=>{if(u&&typeof u=="object"){const v=ao(u,e);i.has(v)||(s.push({id:v,color:u.color||n,...u}),i.add(v))}}),s),[]).sort((s,l)=>s.id.localeCompare(l.id))}const ji=1e3,Hf=10,Mo={nodeOrigin:[0,0],nodeExtent:to,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},Vf={...Mo,checkEquality:!0};function Po(t,e){const n={...t};for(const a in e)e[a]!==void 0&&(n[a]=e[a]);return n}function Ff(t,e,n){const a=Po(Mo,n);for(const o of t.values())if(o.parentId)Io(o,t,e,a);else{const i=br(o,a.nodeOrigin),s=er(o.extent)?o.extent:a.nodeExtent,l=An(i,s,xn(o));o.internals.positionAbsolute=l}}function Bf(t,e){if(!t.handles)return t.measured?e?.internals.handleBounds:void 0;const n=[],a=[];for(const o of t.handles){const i={id:o.id,width:o.width??1,height:o.height??1,nodeId:t.id,x:o.x,y:o.y,position:o.position,type:o.type};o.type==="source"?n.push(i):o.type==="target"&&a.push(i)}return{source:n,target:a}}function To(t){return t==="manual"}function qf(t,e,n,a={}){const o=Po(Vf,a),i={i:0},s=new Map(e),l=o?.elevateNodesOnSelect&&!To(o.zIndexMode)?ji:0;let u=t.length>0;e.clear(),n.clear();for(const v of t){let p=s.get(v.id);if(o.checkEquality&&v===p?.internals.userNode)e.set(v.id,p);else{const m=br(v,o.nodeOrigin),f=er(v.extent)?v.extent:o.nodeExtent,w=An(m,f,xn(v));p={...o.defaults,...v,measured:{width:v.measured?.width,height:v.measured?.height},internals:{positionAbsolute:w,handleBounds:Bf(v,p),z:Zi(v,l,o.zIndexMode),userNode:v}},e.set(v.id,p)}(p.measured===void 0||p.measured.width===void 0||p.measured.height===void 0)&&!p.hidden&&(u=!1),v.parentId&&Io(p,e,n,a,i)}return u}function Kf(t,e){if(!t.parentId)return;const n=e.get(t.parentId);n?n.set(t.id,t):e.set(t.parentId,new Map([[t.id,t]]))}function Io(t,e,n,a,o){const{elevateNodesOnSelect:i,nodeOrigin:s,nodeExtent:l,zIndexMode:u}=Po(Mo,a),v=t.parentId,p=e.get(v);if(!p){console.warn(`Parent node ${v} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Kf(t,n),o&&!p.parentId&&p.internals.rootParentIndex===void 0&&u==="auto"&&(p.internals.rootParentIndex=++o.i,p.internals.z=p.internals.z+o.i*Hf),o&&p.internals.rootParentIndex!==void 0&&(o.i=p.internals.rootParentIndex);const m=i&&!To(u)?ji:0,{x:f,y:w,z:N}=jf(t,p,s,l,m,u),{positionAbsolute:E}=t.internals,I=f!==E.x||w!==E.y;(I||N!==t.internals.z)&&e.set(t.id,{...t,internals:{...t.internals,positionAbsolute:I?{x:f,y:w}:E,z:N}})}function Zi(t,e,n){const a=ln(t.zIndex)?t.zIndex:0;return To(n)?a:a+(t.selected?e:0)}function jf(t,e,n,a,o,i){const{x:s,y:l}=e.internals.positionAbsolute,u=xn(t),v=br(t,n),p=er(t.extent)?An(v,t.extent,u):v;let m=An({x:s+p.x,y:l+p.y},a,u);t.extent==="parent"&&(m=Ai(m,u,e));const f=Zi(t,o,i),w=e.internals.z??0;return{x:m.x,y:m.y,z:w>=f?w+1:f}}function Zf(t,e,n,a=[0,0]){const o=[],i=new Map;for(const s of t){const l=e.get(s.parentId);if(!l)continue;const u=i.get(s.parentId)?.expandedRect??$n(l),v=Oi(u,s.rect);i.set(s.parentId,{expandedRect:v,parent:l})}return i.size>0&&i.forEach(({expandedRect:s,parent:l},u)=>{const v=l.internals.positionAbsolute,p=xn(l),m=l.origin??a,f=s.x0||w>0||I||H)&&(o.push({id:u,type:"position",position:{x:l.position.x-f+I,y:l.position.y-w+H}}),n.get(u)?.forEach(O=>{t.some(F=>F.id===O.id)||o.push({id:O.id,type:"position",position:{x:O.position.x+f,y:O.position.y+w}})})),(p.width0){const w=Zf(f,e,n,o);v.push(...w)}return{changes:v,updatedInternals:u}}async function Xf({delta:t,panZoom:e,transform:n,translateExtent:a,width:o,height:i}){if(!e||!t.x&&!t.y)return Promise.resolve(!1);const s=await e.setViewportConstrained({x:n[0]+t.x,y:n[1]+t.y,zoom:n[2]},[[0,0],[o,i]],a),l=!!s&&(s.x!==n[0]||s.y!==n[1]||s.k!==n[2]);return Promise.resolve(l)}function Es(t,e,n,a,o,i){let s=o;const l=a.get(s)||new Map;a.set(s,l.set(n,e)),s=`${o}-${t}`;const u=a.get(s)||new Map;if(a.set(s,u.set(n,e)),i){s=`${o}-${t}-${i}`;const v=a.get(s)||new Map;a.set(s,v.set(n,e))}}function Wf(t,e,n){t.clear(),e.clear();for(const a of n){const{source:o,target:i,sourceHandle:s=null,targetHandle:l=null}=a,u={edgeId:a.id,source:o,target:i,sourceHandle:s,targetHandle:l},v=`${o}-${s}--${i}-${l}`,p=`${i}-${l}--${o}-${s}`;Es("source",u,p,t,o,s),Es("target",u,v,t,i,l),e.set(a.id,a)}}function Yi(t,e){if(!t.parentId)return!1;const n=e.get(t.parentId);return n?n.selected?!0:Yi(n,e):!1}function Ns(t,e,n){let a=t;do{if(a?.matches?.(e))return!0;if(a===n)return!1;a=a?.parentElement}while(a);return!1}function Gf(t,e,n,a){const o=new Map;for(const[i,s]of t)if((s.selected||s.id===a)&&(!s.parentId||!Yi(s,t))&&(s.draggable||e&&typeof s.draggable>"u")){const l=t.get(i);l&&o.set(i,{id:i,position:l.position||{x:0,y:0},distance:{x:n.x-l.internals.positionAbsolute.x,y:n.y-l.internals.positionAbsolute.y},extent:l.extent,parentId:l.parentId,origin:l.origin,expandParent:l.expandParent,internals:{positionAbsolute:l.internals.positionAbsolute||{x:0,y:0}},measured:{width:l.measured.width??0,height:l.measured.height??0}})}return o}function La({nodeId:t,dragItems:e,nodeLookup:n,dragging:a=!0}){const o=[];for(const[s,l]of e){const u=n.get(s)?.internals.userNode;u&&o.push({...u,position:l.position,dragging:a})}if(!t)return[o[0],o];const i=n.get(t)?.internals.userNode;return[i?{...i,position:e.get(t)?.position||i.position,dragging:a}:o[0],o]}function Uf({dragItems:t,snapGrid:e,x:n,y:a}){const o=t.values().next().value;if(!o)return null;const i={x:n-o.distance.x,y:a-o.distance.y},s=wr(i,e);return{x:s.x-i.x,y:s.y-i.y}}function Qf({onNodeMouseDown:t,getStoreItems:e,onDragStart:n,onDrag:a,onDragStop:o}){let i={x:null,y:null},s=0,l=new Map,u=!1,v={x:0,y:0},p=null,m=!1,f=null,w=!1,N=!1,E=null;function I({noDragClassName:O,handleSelector:F,domNode:M,isSelectable:R,nodeId:b,nodeClickDistance:A=0}){f=At(M);function B({x:S,y:z}){const{nodeLookup:g,nodeExtent:C,snapGrid:T,snapToGrid:D,nodeOrigin:V,onNodeDrag:L,onSelectionDrag:q,onError:j,updateNodePositions:U}=e();i={x:S,y:z};let W=!1;const J=l.size>1,ae=J&&C?ro(xr(l)):null,re=J&&D?Uf({dragItems:l,snapGrid:T,x:S,y:z}):null;for(const[ie,ne]of l){if(!g.has(ie))continue;let G={x:S-ne.distance.x,y:z-ne.distance.y};D&&(G=re?{x:Math.round(G.x+re.x),y:Math.round(G.y+re.y)}:wr(G,T));let oe=null;if(J&&C&&!ne.extent&&ae){const{positionAbsolute:te}=ne.internals,ue=te.x-ae.x+C[0][0],le=te.x+ne.measured.width-ae.x2+C[1][0],he=te.y-ae.y+C[0][1],ve=te.y+ne.measured.height-ae.y2+C[1][1];oe=[[ue,he],[le,ve]]}const{position:ee,positionAbsolute:se}=Ii({nodeId:ie,nextPosition:G,nodeLookup:g,nodeExtent:oe||C,nodeOrigin:V,onError:j});W=W||ne.position.x!==ee.x||ne.position.y!==ee.y,ne.position=ee,ne.internals.positionAbsolute=se}if(N=N||W,!!W&&(U(l,!0),E&&(a||L||!b&&q))){const[ie,ne]=La({nodeId:b,dragItems:l,nodeLookup:g});a?.(E,l,ie,ne),L?.(E,ie,ne),b||q?.(E,ne)}}async function K(){if(!p)return;const{transform:S,panBy:z,autoPanSpeed:g,autoPanOnNodeDrag:C}=e();if(!C){u=!1,cancelAnimationFrame(s);return}const[T,D]=Di(v,p,g);(T!==0||D!==0)&&(i.x=(i.x??0)-T/S[2],i.y=(i.y??0)-D/S[2],await z({x:T,y:D})&&B(i)),s=requestAnimationFrame(K)}function Z(S){const{nodeLookup:z,multiSelectionActive:g,nodesDraggable:C,transform:T,snapGrid:D,snapToGrid:V,selectNodesOnDrag:L,onNodeDragStart:q,onSelectionDragStart:j,unselectNodesAndEdges:U}=e();m=!0,(!L||!R)&&!g&&b&&(z.get(b)?.selected||U()),R&&L&&b&&t?.(b);const W=Ra(S.sourceEvent,{transform:T,snapGrid:D,snapToGrid:V,containerBounds:p});if(i=W,l=Gf(z,C,W,b),l.size>0&&(n||q||!b&&j)){const[J,ae]=La({nodeId:b,dragItems:l,nodeLookup:z});n?.(S.sourceEvent,l,J,ae),q?.(S.sourceEvent,J,ae),b||j?.(S.sourceEvent,ae)}}const x=_u().clickDistance(A).on("start",S=>{const{domNode:z,nodeDragThreshold:g,transform:C,snapGrid:T,snapToGrid:D}=e();p=z?.getBoundingClientRect()||null,w=!1,N=!1,E=S.sourceEvent,g===0&&Z(S),i=Ra(S.sourceEvent,{transform:C,snapGrid:T,snapToGrid:D,containerBounds:p}),v=qt(S.sourceEvent,p)}).on("drag",S=>{const{autoPanOnNodeDrag:z,transform:g,snapGrid:C,snapToGrid:T,nodeDragThreshold:D,nodeLookup:V}=e(),L=Ra(S.sourceEvent,{transform:g,snapGrid:C,snapToGrid:T,containerBounds:p});if(E=S.sourceEvent,(S.sourceEvent.type==="touchmove"&&S.sourceEvent.touches.length>1||b&&!V.has(b))&&(w=!0),!w){if(!u&&z&&m&&(u=!0,K()),!m){const q=qt(S.sourceEvent,p),j=q.x-v.x,U=q.y-v.y;Math.sqrt(j*j+U*U)>D&&Z(S)}(i.x!==L.xSnapped||i.y!==L.ySnapped)&&l&&m&&(v=qt(S.sourceEvent,p),B(L))}}).on("end",S=>{if(!(!m||w)&&(u=!1,m=!1,cancelAnimationFrame(s),l.size>0)){const{nodeLookup:z,updateNodePositions:g,onNodeDragStop:C,onSelectionDragStop:T}=e();if(N&&(g(l,!1),N=!1),o||C||!b&&T){const[D,V]=La({nodeId:b,dragItems:l,nodeLookup:z,dragging:!1});o?.(S.sourceEvent,l,D,V),C?.(S.sourceEvent,D,V),b||T?.(S.sourceEvent,V)}}}).filter(S=>{const z=S.target;return!S.button&&(!O||!Ns(z,`.${O}`,M))&&(!F||Ns(z,F,M))});f.call(x)}function H(){f?.on(".drag",null)}return{update:I,destroy:H}}function Jf(t,e,n){const a=[],o={x:t.x-n,y:t.y-n,width:n*2,height:n*2};for(const i of e.values())gr(o,$n(i))>0&&a.push(i);return a}const $f=250;function ep(t,e,n,a){let o=[],i=1/0;const s=Jf(t,n,e+$f);for(const l of s){const u=[...l.internals.handleBounds?.source??[],...l.internals.handleBounds?.target??[]];for(const v of u){if(a.nodeId===v.nodeId&&a.type===v.type&&a.id===v.id)continue;const{x:p,y:m}=Dn(l,v,v.position,!0),f=Math.sqrt(Math.pow(p-t.x,2)+Math.pow(m-t.y,2));f>e||(f1){const l=a.type==="source"?"target":"source";return o.find(u=>u.type===l)??o[0]}return o[0]}function Xi(t,e,n,a,o,i=!1){const s=a.get(t);if(!s)return null;const l=o==="strict"?s.internals.handleBounds?.[e]:[...s.internals.handleBounds?.source??[],...s.internals.handleBounds?.target??[]],u=(n?l?.find(v=>v.id===n):l?.[0])??null;return u&&i?{...u,...Dn(s,u,u.position,!0)}:u}function Wi(t,e){return t||(e?.classList.contains("target")?"target":e?.classList.contains("source")?"source":null)}function tp(t,e){let n=null;return e?n=!0:t&&!e&&(n=!1),n}const Gi=()=>!0;function np(t,{connectionMode:e,connectionRadius:n,handleId:a,nodeId:o,edgeUpdaterType:i,isTarget:s,domNode:l,nodeLookup:u,lib:v,autoPanOnConnect:p,flowId:m,panBy:f,cancelConnection:w,onConnectStart:N,onConnect:E,onConnectEnd:I,isValidConnection:H=Gi,onReconnectEnd:O,updateConnection:F,getTransform:M,getFromHandle:R,autoPanSpeed:b,dragThreshold:A=1,handleDomNode:B}){const K=Hi(t.target);let Z=0,x;const{x:S,y:z}=qt(t),g=Wi(i,B),C=l?.getBoundingClientRect();let T=!1;if(!C||!g)return;const D=Xi(o,g,a,u,e);if(!D)return;let V=qt(t,C),L=!1,q=null,j=!1,U=null;function W(){if(!p||!C)return;const[ee,se]=Di(V,C,b);f({x:ee,y:se}),Z=requestAnimationFrame(W)}const J={...D,nodeId:o,type:g,position:D.position},ae=u.get(o);let ie={inProgress:!0,isValid:null,from:Dn(ae,J,we.Left,!0),fromHandle:J,fromPosition:J.position,fromNode:ae,to:V,toHandle:null,toPosition:gs[J.position],toNode:null,pointer:V};function ne(){T=!0,F(ie),N?.(t,{nodeId:o,handleId:a,handleType:g})}A===0&&ne();function G(ee){if(!T){const{x:ve,y:fe}=qt(ee),ke=ve-S,Ae=fe-z;if(!(ke*ke+Ae*Ae>A*A))return;ne()}if(!R()||!J){oe(ee);return}const se=M();V=qt(ee,C),x=ep(kr(V,se,!1,[1,1]),n,u,J),L||(W(),L=!0);const te=Ui(ee,{handle:x,connectionMode:e,fromNodeId:o,fromHandleId:a,fromType:s?"target":"source",isValidConnection:H,doc:K,lib:v,flowId:m,nodeLookup:u});U=te.handleDomNode,q=te.connection,j=tp(!!x,te.isValid);const ue=u.get(o),le=ue?Dn(ue,J,we.Left,!0):ie.from,he={...ie,from:le,isValid:j,to:te.toHandle&&j?oa({x:te.toHandle.x,y:te.toHandle.y},se):V,toHandle:te.toHandle,toPosition:j&&te.toHandle?te.toHandle.position:gs[J.position],toNode:te.toHandle?u.get(te.toHandle.nodeId):null,pointer:V};F(he),ie=he}function oe(ee){if(!("touches"in ee&&ee.touches.length>0)){if(T){(x||U)&&q&&j&&E?.(q);const{inProgress:se,...te}=ie,ue={...te,toPosition:ie.toHandle?ie.toPosition:null};I?.(ee,ue),i&&O?.(ee,ue)}w(),cancelAnimationFrame(Z),L=!1,j=!1,q=null,U=null,K.removeEventListener("mousemove",G),K.removeEventListener("mouseup",oe),K.removeEventListener("touchmove",G),K.removeEventListener("touchend",oe)}}K.addEventListener("mousemove",G),K.addEventListener("mouseup",oe),K.addEventListener("touchmove",G),K.addEventListener("touchend",oe)}function Ui(t,{handle:e,connectionMode:n,fromNodeId:a,fromHandleId:o,fromType:i,doc:s,lib:l,flowId:u,isValidConnection:v=Gi,nodeLookup:p}){const m=i==="target",f=e?s.querySelector(`.${l}-flow__handle[data-id="${u}-${e?.nodeId}-${e?.id}-${e?.type}"]`):null,{x:w,y:N}=qt(t),E=s.elementFromPoint(w,N),I=E?.classList.contains(`${l}-flow__handle`)?E:f,H={handleDomNode:I,isValid:!1,connection:null,toHandle:null};if(I){const O=Wi(void 0,I),F=I.getAttribute("data-nodeid"),M=I.getAttribute("data-handleid"),R=I.classList.contains("connectable"),b=I.classList.contains("connectableend");if(!F||!O)return H;const A={source:m?F:a,sourceHandle:m?M:o,target:m?a:F,targetHandle:m?o:M};H.connection=A;const K=R&&b&&(n===Qn.Strict?m&&O==="source"||!m&&O==="target":F!==a||M!==o);H.isValid=K&&v(A),H.toHandle=Xi(F,O,M,p,n,!0)}return H}const Ms={onPointerDown:np,isValid:Ui};function rp({domNode:t,panZoom:e,getTransform:n,getViewScale:a}){const o=At(t);function i({translateExtent:l,width:u,height:v,zoomStep:p=1,pannable:m=!0,zoomable:f=!0,inversePan:w=!1}){const N=F=>{if(F.sourceEvent.type!=="wheel"||!e)return;const M=n(),R=F.sourceEvent.ctrlKey&&mr()?10:1,b=-F.sourceEvent.deltaY*(F.sourceEvent.deltaMode===1?.05:F.sourceEvent.deltaMode?1:.002)*p,A=M[2]*Math.pow(2,b*R);e.scaleTo(A)};let E=[0,0];const I=F=>{(F.sourceEvent.type==="mousedown"||F.sourceEvent.type==="touchstart")&&(E=[F.sourceEvent.clientX??F.sourceEvent.touches[0].clientX,F.sourceEvent.clientY??F.sourceEvent.touches[0].clientY])},H=F=>{const M=n();if(F.sourceEvent.type!=="mousemove"&&F.sourceEvent.type!=="touchmove"||!e)return;const R=[F.sourceEvent.clientX??F.sourceEvent.touches[0].clientX,F.sourceEvent.clientY??F.sourceEvent.touches[0].clientY],b=[R[0]-E[0],R[1]-E[1]];E=R;const A=a()*Math.max(M[2],Math.log(M[2]))*(w?-1:1),B={x:M[0]-b[0]*A,y:M[1]-b[1]*A},K=[[0,0],[u,v]];e.setViewportConstrained({x:B.x,y:B.y,zoom:M[2]},K,l)},O=Mi().on("start",I).on("zoom",m?H:null).on("zoom.wheel",f?N:null);o.call(O,{})}function s(){o.on("zoom",null)}return{update:i,destroy:s,pointer:Ft}}const ma=t=>({x:t.x,y:t.y,zoom:t.k}),Ha=({x:t,y:e,zoom:n})=>pa.translate(t,e).scale(n),Kn=(t,e)=>t.target.closest(`.${e}`),Qi=(t,e)=>e===2&&Array.isArray(t)&&t.includes(2),ap=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,Va=(t,e=0,n=ap,a=()=>{})=>{const o=typeof e=="number"&&e>0;return o||a(),o?t.transition().duration(e).ease(n).on("end",a):t},Ji=t=>{const e=t.ctrlKey&&mr()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*e};function op({zoomPanValues:t,noWheelClassName:e,d3Selection:n,d3Zoom:a,panOnScrollMode:o,panOnScrollSpeed:i,zoomOnPinch:s,onPanZoomStart:l,onPanZoom:u,onPanZoomEnd:v}){return p=>{if(Kn(p,e))return p.ctrlKey&&p.preventDefault(),!1;p.preventDefault(),p.stopImmediatePropagation();const m=n.property("__zoom").k||1;if(p.ctrlKey&&s){const I=Ft(p),H=Ji(p),O=m*Math.pow(2,H);a.scaleTo(n,O,I,p);return}const f=p.deltaMode===1?20:1;let w=o===Yn.Vertical?0:p.deltaX*f,N=o===Yn.Horizontal?0:p.deltaY*f;!mr()&&p.shiftKey&&o!==Yn.Vertical&&(w=p.deltaY*f,N=0),a.translateBy(n,-(w/m)*i,-(N/m)*i,{internal:!0});const E=ma(n.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?(u?.(p,E),t.panScrollTimeout=setTimeout(()=>{v?.(p,E),t.isPanScrolling=!1},150)):(t.isPanScrolling=!0,l?.(p,E))}}function sp({noWheelClassName:t,preventScrolling:e,d3ZoomHandler:n}){return function(a,o){const i=a.type==="wheel",s=!e&&i&&!a.ctrlKey,l=Kn(a,t);if(a.ctrlKey&&i&&l&&a.preventDefault(),s||l)return null;a.preventDefault(),n.call(this,a,o)}}function ip({zoomPanValues:t,onDraggingChange:e,onPanZoomStart:n}){return a=>{if(a.sourceEvent?.internal)return;const o=ma(a.transform);t.mouseButton=a.sourceEvent?.button||0,t.isZoomingOrPanning=!0,t.prevViewport=o,a.sourceEvent?.type==="mousedown"&&e(!0),n&&n?.(a.sourceEvent,o)}}function lp({zoomPanValues:t,panOnDrag:e,onPaneContextMenu:n,onTransformChange:a,onPanZoom:o}){return i=>{t.usedRightMouseButton=!!(n&&Qi(e,t.mouseButton??0)),i.sourceEvent?.sync||a([i.transform.x,i.transform.y,i.transform.k]),o&&!i.sourceEvent?.internal&&o?.(i.sourceEvent,ma(i.transform))}}function cp({zoomPanValues:t,panOnDrag:e,panOnScroll:n,onDraggingChange:a,onPanZoomEnd:o,onPaneContextMenu:i}){return s=>{if(!s.sourceEvent?.internal&&(t.isZoomingOrPanning=!1,i&&Qi(e,t.mouseButton??0)&&!t.usedRightMouseButton&&s.sourceEvent&&i(s.sourceEvent),t.usedRightMouseButton=!1,a(!1),o)){const l=ma(s.transform);t.prevViewport=l,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{o?.(s.sourceEvent,l)},n?150:0)}}}function dp({zoomActivationKeyPressed:t,zoomOnScroll:e,zoomOnPinch:n,panOnDrag:a,panOnScroll:o,zoomOnDoubleClick:i,userSelectionActive:s,noWheelClassName:l,noPanClassName:u,lib:v,connectionInProgress:p}){return m=>{const f=t||e,w=n&&m.ctrlKey,N=m.type==="wheel";if(m.button===1&&m.type==="mousedown"&&(Kn(m,`${v}-flow__node`)||Kn(m,`${v}-flow__edge`)))return!0;if(!a&&!f&&!o&&!i&&!n||s||p&&!N||Kn(m,l)&&N||Kn(m,u)&&(!N||o&&N&&!t)||!n&&m.ctrlKey&&N)return!1;if(!n&&m.type==="touchstart"&&m.touches?.length>1)return m.preventDefault(),!1;if(!f&&!o&&!w&&N||!a&&(m.type==="mousedown"||m.type==="touchstart")||Array.isArray(a)&&!a.includes(m.button)&&m.type==="mousedown")return!1;const E=Array.isArray(a)&&a.includes(m.button)||!m.button||m.button<=1;return(!m.ctrlKey||N)&&E}}function up({domNode:t,minZoom:e,maxZoom:n,translateExtent:a,viewport:o,onPanZoom:i,onPanZoomStart:s,onPanZoomEnd:l,onDraggingChange:u}){const v={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},p=t.getBoundingClientRect(),m=Mi().scaleExtent([e,n]).translateExtent(a),f=At(t).call(m);O({x:o.x,y:o.y,zoom:Jn(o.zoom,e,n)},[[0,0],[p.width,p.height]],a);const w=f.on("wheel.zoom"),N=f.on("dblclick.zoom");m.wheelDelta(Ji);function E(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).transform(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function I({noWheelClassName:x,noPanClassName:S,onPaneContextMenu:z,userSelectionActive:g,panOnScroll:C,panOnDrag:T,panOnScrollMode:D,panOnScrollSpeed:V,preventScrolling:L,zoomOnPinch:q,zoomOnScroll:j,zoomOnDoubleClick:U,zoomActivationKeyPressed:W,lib:J,onTransformChange:ae,connectionInProgress:re,paneClickDistance:ie,selectionOnDrag:ne}){g&&!v.isZoomingOrPanning&&H();const G=C&&!W&&!g;m.clickDistance(ne?1/0:!ln(ie)||ie<0?0:ie);const oe=G?op({zoomPanValues:v,noWheelClassName:x,d3Selection:f,d3Zoom:m,panOnScrollMode:D,panOnScrollSpeed:V,zoomOnPinch:q,onPanZoomStart:s,onPanZoom:i,onPanZoomEnd:l}):sp({noWheelClassName:x,preventScrolling:L,d3ZoomHandler:w});if(f.on("wheel.zoom",oe,{passive:!1}),!g){const se=ip({zoomPanValues:v,onDraggingChange:u,onPanZoomStart:s});m.on("start",se);const te=lp({zoomPanValues:v,panOnDrag:T,onPaneContextMenu:!!z,onPanZoom:i,onTransformChange:ae});m.on("zoom",te);const ue=cp({zoomPanValues:v,panOnDrag:T,panOnScroll:C,onPaneContextMenu:z,onPanZoomEnd:l,onDraggingChange:u});m.on("end",ue)}const ee=dp({zoomActivationKeyPressed:W,panOnDrag:T,zoomOnScroll:j,panOnScroll:C,zoomOnDoubleClick:U,zoomOnPinch:q,userSelectionActive:g,noPanClassName:S,noWheelClassName:x,lib:J,connectionInProgress:re});m.filter(ee),U?f.on("dblclick.zoom",N):f.on("dblclick.zoom",null)}function H(){m.on("zoom",null)}async function O(x,S,z){const g=Ha(x),C=m?.constrain()(g,S,z);return C&&await E(C),new Promise(T=>T(C))}async function F(x,S){const z=Ha(x);return await E(z,S),new Promise(g=>g(z))}function M(x){if(f){const S=Ha(x),z=f.property("__zoom");(z.k!==x.zoom||z.x!==x.x||z.y!==x.y)&&m?.transform(f,S,null,{sync:!0})}}function R(){const x=f?Ni(f.node()):{x:0,y:0,k:1};return{x:x.x,y:x.y,zoom:x.k}}function b(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).scaleTo(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function A(x,S){return f?new Promise(z=>{m?.interpolate(S?.interpolate==="linear"?lr:Fr).scaleBy(Va(f,S?.duration,S?.ease,()=>z(!0)),x)}):Promise.resolve(!1)}function B(x){m?.scaleExtent(x)}function K(x){m?.translateExtent(x)}function Z(x){const S=!ln(x)||x<0?0:x;m?.clickDistance(S)}return{update:I,destroy:H,setViewport:F,setViewportConstrained:O,getViewport:R,scaleTo:b,scaleBy:A,setScaleExtent:B,setTranslateExtent:K,syncViewport:M,setClickDistance:Z}}var Ps;(function(t){t.Line="line",t.Handle="handle"})(Ps||(Ps={}));function Ao(){const t={};return[e=>{if(e&&!Ll(t))throw new Error(e);return so(t)},e=>Fs(t,e)]}const[vp,fp]=Ao(),[pp,hp]=Ao(),[gp,mp]=Ao();var _p=P("
    ");function $e(t,e){ze(e,!0);let n=pe(e,"id",3,null),a=pe(e,"type",3,"source"),o=pe(e,"position",19,()=>we.Top),i=pe(e,"isConnectableStart",3,!0),s=pe(e,"isConnectableEnd",3,!0),l=_n(e,["$$slots","$$events","$$legacy","id","type","position","style","class","isConnectable","isConnectableStart","isConnectableEnd","isValidConnection","onconnect","ondisconnect","children"]);const u=vp("Handle must be used within a Custom Node component"),v=pp("Handle must be used within a Custom Node component");let p=k(()=>a()==="target"),m=k(()=>e.isConnectable!==void 0?e.isConnectable:v.value),f=fn(),w=k(()=>f.ariaLabelConfig),N=null;Hl(()=>{if(e.onconnect||e.ondisconnect){f.edges;let S=f.connectionLookup.get(`${u}-${a()}${n()?`-${n()}`:""}`);if(N&&!ff(S,N)){const z=S??new Map;ms(N,z,e.ondisconnect),ms(z,N,e.onconnect)}N=new Map(S)}});let E=k(()=>{if(!f.connection.inProgress)return[!1,!1,!1,!1,null];const{fromHandle:S,toHandle:z,isValid:g}=f.connection,C=S&&S.nodeId===u&&S.type===a()&&S.id===n(),T=z&&z.nodeId===u&&z.type===a()&&z.id===n(),D=f.connectionMode===Qn.Strict?S?.type!==a():u!==S?.nodeId||n()!==S?.id;return[!0,C,T,D,T&&g]}),I=k(()=>dn(r(E),5)),H=k(()=>r(I)[0]),O=k(()=>r(I)[1]),F=k(()=>r(I)[2]),M=k(()=>r(I)[3]),R=k(()=>r(I)[4]);function b(S){const z=f.onbeforeconnect?f.onbeforeconnect(S):S;z&&(f.addEdge(z),f.onconnect?.(S))}function A(S){const z=Fi(S);S.currentTarget&&(z&&S.button===0||!z)&&Ms.onPointerDown(S,{handleId:n(),nodeId:u,isTarget:r(p),connectionRadius:f.connectionRadius,domNode:f.domNode,nodeLookup:f.nodeLookup,connectionMode:f.connectionMode,lib:"svelte",autoPanOnConnect:f.autoPanOnConnect,autoPanSpeed:f.autoPanSpeed,flowId:f.flowId,isValidConnection:e.isValidConnection||((...g)=>f.isValidConnection?.(...g)??!0),updateConnection:f.updateConnection,cancelConnection:f.cancelConnection,panBy:f.panBy,onConnect:b,onConnectStart:f.onconnectstart,onConnectEnd:(...g)=>f.onconnectend?.(...g),getTransform:()=>[f.viewport.x,f.viewport.y,f.viewport.zoom],getFromHandle:()=>f.connection.fromHandle,dragThreshold:f.connectionDragThreshold,handleDomNode:S.currentTarget})}function B(S){if(!u||!f.clickConnectStartHandle&&!i())return;if(!f.clickConnectStartHandle){f.onclickconnectstart?.(S,{nodeId:u,handleId:n(),handleType:a()}),f.clickConnectStartHandle={nodeId:u,type:a(),id:n()};return}const z=Hi(S.target),g=e.isValidConnection??f.isValidConnection,{connectionMode:C,clickConnectStartHandle:T,flowId:D,nodeLookup:V}=f,{connection:L,isValid:q}=Ms.isValid(S,{handle:{nodeId:u,id:n(),type:a()},connectionMode:C,fromNodeId:T.nodeId,fromHandleId:T.id??null,fromType:T.type,isValidConnection:g,flowId:D,doc:z,lib:"svelte",nodeLookup:V});q&&L&&b(L);const j=structuredClone($s(f.connection));delete j.inProgress,j.toPosition=j.toHandle?j.toHandle.position:null,f.onclickconnectend?.(S,j),f.clickConnectStartHandle=null}var K=_p(),Z=()=>{};yn(K,()=>({"data-handleid":n(),"data-nodeid":u,"data-handlepos":o(),"data-id":`${f.flowId??""}-${u??""}-${n()??"null"??""}-${a()??""}`,class:["svelte-flow__handle",`svelte-flow__handle-${o()}`,f.noDragClass,f.noPanClass,o(),e.class],onmousedown:A,ontouchstart:A,onclick:f.clickConnect?B:void 0,onkeypress:Z,style:e.style,role:"button","aria-label":r(w)["handle.ariaLabel"],tabindex:"-1",...l,[lo]:{valid:r(R),connectingto:r(F),connectingfrom:r(O),source:!r(p),target:r(p),connectablestart:i(),connectableend:s(),connectable:r(m),connectionindicator:r(m)&&(!r(H)||r(M))&&(r(H)||f.clickConnectStartHandle?s():i())}}));var x=d(K);Dt(x,()=>e.children??tr),c(K),_(t,K),Ce()}var yp=P(" ",1);function $i(t,e){ze(e,!0);let n=pe(e,"targetPosition",19,()=>we.Top),a=pe(e,"sourcePosition",19,()=>we.Bottom);var o=yp(),i=de(o);$e(i,{type:"target",get position(){return n()}});var s=h(i),l=h(s);$e(l,{type:"source",get position(){return a()}}),$(()=>X(s,` ${e.data?.label??""} `)),_(t,o),Ce()}var bp=P(" ",1);function xp(t,e){ze(e,!0);let n=pe(e,"data",19,()=>({label:"Node"})),a=pe(e,"sourcePosition",19,()=>we.Bottom);ye();var o=bp(),i=de(o),s=h(i);$e(s,{type:"source",get position(){return a()}}),$(()=>X(i,`${n()?.label??""} `)),_(t,o),Ce()}var wp=P(" ",1);function kp(t,e){ze(e,!0);let n=pe(e,"data",19,()=>({label:"Node"})),a=pe(e,"targetPosition",19,()=>we.Top);ye();var o=wp(),i=de(o),s=h(i);$e(s,{type:"target",get position(){return a()}}),$(()=>X(i,`${n()?.label??""} `)),_(t,o),Ce()}function Sp(t,e){}function Fa(t,e,n){if(!n||!e)return;const a=n==="root"?e:e.querySelector(`.svelte-flow__${n}`);a&&a.appendChild(t)}function zp(t,e){const n=k(fn),a=k(()=>r(n).domNode);let o;return r(a)?Fa(t,r(a),e):o=Bs(()=>{_e(()=>{Fa(t,r(a),e),o?.()})}),{async update(i){Fa(t,r(a),i)},destroy(){t.parentNode&&t.parentNode.removeChild(t),o?.()}}}function Cp(){let t=Q(typeof window>"u");if(r(t)){const e=Bs(()=>{_e(()=>{y(t,!1),e?.()})})}return{get value(){return r(t)}}}const Ts=t=>hf(t),Ep=t=>Ti(t);function en(t){return t===void 0?void 0:`${t}px`}const sa={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}};var Np=P("
    ");function Mp(t,e){ze(e,!0);let n=pe(e,"x",3,0),a=pe(e,"y",3,0),o=pe(e,"selectEdgeOnClick",3,!1),i=pe(e,"transparent",3,!1),s=_n(e,["$$slots","$$events","$$legacy","x","y","width","height","selectEdgeOnClick","transparent","class","children"]);const l=fn(),u=gp("EdgeLabel must be used within a Custom Edge component");let v=k(()=>l.visible.edges.get(u)?.zIndex);var p=Np(),m=()=>{o()&&u&&l.handleEdgeSelection(u)};yn(p,w=>({class:["svelte-flow__edge-label",{transparent:i()},e.class],tabindex:"-1",onclick:m,...s,[ia]:w}),[()=>({display:Cp().value?"none":void 0,cursor:o()?"pointer":void 0,transform:`translate(-50%, -50%) translate(${n()??""}px,${a()??""}px)`,"pointer-events":"all",width:en(e.width),height:en(e.height),"z-index":r(v)})],void 0,void 0,"svelte-1wg91mu");var f=d(p);Dt(f,()=>e.children??tr),c(p),zt(p,(w,N)=>zp?.(w,N),()=>"edge-labels"),_(t,p),Ce()}var Pp=ut(""),Tp=ut('',1);function _a(t,e){let n=pe(e,"interactionWidth",3,20),a=_n(e,["$$slots","$$events","$$legacy","id","path","label","labelX","labelY","labelStyle","markerStart","markerEnd","style","interactionWidth","class"]);var o=Tp(),i=de(o),s=h(i);{var l=p=>{var m=Pp();yn(m,()=>({d:e.path,"stroke-opacity":0,"stroke-width":n(),fill:"none",class:"svelte-flow__edge-interaction",...a})),_(p,m)};Y(s,p=>{n()>0&&p(l)})}var u=h(s);{var v=p=>{Mp(p,{get x(){return e.labelX},get y(){return e.labelY},get style(){return e.labelStyle},selectEdgeOnClick:!0,children:(m,f)=>{ye();var w=qs();$(()=>X(w,e.label)),_(m,w)},$$slots:{default:!0}})};Y(u,p=>{e.label&&p(v)})}$(()=>{xe(i,"id",e.id),xe(i,"d",e.path),De(i,0,Rn(["svelte-flow__edge-path",e.class])),xe(i,"marker-start",e.markerStart),xe(i,"marker-end",e.markerEnd),st(i,e.style)}),_(t,o)}function el(t,e){ze(e,!0);let n=k(()=>Bi({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition,curvature:e.pathOptions?.curvature})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get id(){return e.id},get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Ip(t,e){ze(e,!0);let n=k(()=>No({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Ap(t,e){ze(e,!0);let n=k(()=>Ki({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}function Dp(t,e){ze(e,!0);let n=k(()=>No({sourceX:e.sourceX,sourceY:e.sourceY,targetX:e.targetX,targetY:e.targetY,sourcePosition:e.sourcePosition,targetPosition:e.targetPosition,borderRadius:0})),a=k(()=>dn(r(n),3)),o=k(()=>r(a)[0]),i=k(()=>r(a)[1]),s=k(()=>r(a)[2]);_a(t,{get path(){return r(o)},get labelX(){return r(i)},get labelY(){return r(s)},get label(){return e.label},get labelStyle(){return e.labelStyle},get markerStart(){return e.markerStart},get markerEnd(){return e.markerEnd},get interactionWidth(){return e.interactionWidth},get style(){return e.style}}),Ce()}class Op{#e;#t;constructor(e,n){this.#e=e,this.#t=Vl(n)}get current(){return this.#t(),this.#e()}}const Rp=/\(.+\)/,Lp=new Set(["all","print","screen","and","or","not","only"]);class Hp extends Op{constructor(e,n){let a=Rp.test(e)||e.split(/[\s,]+/).some(i=>Lp.has(i.trim()))?e:`(${e})`;const o=window.matchMedia(a);super(()=>o.matches,i=>qa(o,"change",i))}}function Vp(t,e,n,a){const o=new Map;return Co(t,{x:0,y:0,width:n,height:a},e,!0).forEach(i=>{o.set(i.id,i)}),o}function Is(t){const{edges:e,defaultEdgeOptions:n,nodeLookup:a,previousEdges:o,connectionMode:i,onerror:s,onlyRenderVisible:l,elevateEdgesOnSelect:u,zIndexMode:v}=t,p=new Map;for(const m of e){const f=a.get(m.source),w=a.get(m.target);if(!f||!w)continue;if(l){const{visibleNodes:I,transform:H,width:O,height:F}=t;if(Mf({sourceNode:f,targetNode:w,width:O,height:F,transform:H}))I.set(f.id,f),I.set(w.id,w);else continue}const N=o.get(m.id);if(N&&m===N.edge&&f==N.sourceNode&&w==N.targetNode){p.set(m.id,N);continue}const E=Rf({id:m.id,sourceNode:f,targetNode:w,sourceHandle:m.sourceHandle||null,targetHandle:m.targetHandle||null,connectionMode:i,onError:s});E&&p.set(m.id,{...n,...m,...E,zIndex:Nf({selected:m.selected,zIndex:m.zIndex??n.zIndex,sourceNode:f,targetNode:w,elevateOnSelect:u,zIndexMode:v}),sourceNode:f,targetNode:w,edge:m})}return p}const tl={input:xp,output:kp,default:$i,group:Sp},nl={straight:Ap,smoothstep:Ip,default:el,step:Dp};function Fp(t,e,n,a,o,i){if(e&&!n&&a&&o){const s=xr(i,{filter:l=>!!((l.width||l.initialWidth)&&(l.height||l.initialHeight))});return Eo(s,a,o,.5,2,.1)}else return n??{x:0,y:0,zoom:1}}function Bp(t){class e{#e=k(()=>t.props.id??"1");get flowId(){return r(this.#e)}set flowId(a){y(this.#e,a)}#t=Q(null);get domNode(){return r(this.#t)}set domNode(a){y(this.#t,a)}#n=Q(null);get panZoom(){return r(this.#n)}set panZoom(a){y(this.#n,a)}#r=Q(t.width??0);get width(){return r(this.#r)}set width(a){y(this.#r,a)}#a=Q(t.height??0);get height(){return r(this.#a)}set height(a){y(this.#a,a)}#o=Q(t.props.zIndexMode??"basic");get zIndexMode(){return r(this.#o)}set zIndexMode(a){y(this.#o,a)}#s=k(()=>{const a=qf(t.nodes,this.nodeLookup,this.parentLookup,{nodeExtent:this.nodeExtent,nodeOrigin:this.nodeOrigin,elevateNodesOnSelect:t.props.elevateNodesOnSelect??!0,checkEquality:!0,zIndexMode:this.zIndexMode});return this.fitViewQueued&&a&&(this.fitViewOptions?.duration?this.resolveFitView():queueMicrotask(()=>{this.resolveFitView()})),a});get nodesInitialized(){return r(this.#s)}set nodesInitialized(a){y(this.#s,a)}#i=k(()=>this.panZoom!==null);get viewportInitialized(){return r(this.#i)}set viewportInitialized(a){y(this.#i,a)}#l=k(()=>(Wf(this.connectionLookup,this.edgeLookup,t.edges),t.edges));get _edges(){return r(this.#l)}set _edges(a){y(this.#l,a)}get nodes(){return this.nodesInitialized,t.nodes}set nodes(a){t.nodes=a}get edges(){return this._edges}set edges(a){t.edges=a}_prevSelectedNodes=[];_prevSelectedNodeIds=new Set;#c=k(()=>{const a=this._prevSelectedNodeIds.size,o=new Set,i=this.nodes.filter(s=>(s.selected&&(o.add(s.id),this._prevSelectedNodeIds.delete(s.id)),s.selected));return(a!==o.size||this._prevSelectedNodeIds.size>0)&&(this._prevSelectedNodes=i),this._prevSelectedNodeIds=o,this._prevSelectedNodes});get selectedNodes(){return r(this.#c)}set selectedNodes(a){y(this.#c,a)}_prevSelectedEdges=[];_prevSelectedEdgeIds=new Set;#d=k(()=>{const a=this._prevSelectedEdgeIds.size,o=new Set,i=this.edges.filter(s=>(s.selected&&(o.add(s.id),this._prevSelectedEdgeIds.delete(s.id)),s.selected));return(a!==o.size||this._prevSelectedEdgeIds.size>0)&&(this._prevSelectedEdges=i),this._prevSelectedEdgeIds=o,this._prevSelectedEdges});get selectedEdges(){return r(this.#d)}set selectedEdges(a){y(this.#d,a)}selectionChangeHandlers=new Map;nodeLookup=new Map;parentLookup=new Map;connectionLookup=new Map;edgeLookup=new Map;_prevVisibleEdges=new Map;#u=k(()=>{const{nodes:a,_edges:o,_prevVisibleEdges:i,nodeLookup:s,connectionMode:l,onerror:u,onlyRenderVisibleElements:v,defaultEdgeOptions:p,zIndexMode:m}=this;let f,w;const N={edges:o,defaultEdgeOptions:p,previousEdges:i,nodeLookup:s,connectionMode:l,elevateEdgesOnSelect:t.props.elevateEdgesOnSelect??!0,zIndexMode:m,onerror:u};if(v){const{viewport:E,width:I,height:H}=this,O=[E.x,E.y,E.zoom];f=Vp(s,O,I,H),w=Is({...N,onlyRenderVisible:!0,visibleNodes:f,transform:O,width:I,height:H})}else f=this.nodeLookup,w=Is(N);return{nodes:f,edges:w}});get visible(){return r(this.#u)}set visible(a){y(this.#u,a)}#v=k(()=>t.props.nodesDraggable??!0);get nodesDraggable(){return r(this.#v)}set nodesDraggable(a){y(this.#v,a)}#f=k(()=>t.props.nodesConnectable??!0);get nodesConnectable(){return r(this.#f)}set nodesConnectable(a){y(this.#f,a)}#p=k(()=>t.props.elementsSelectable??!0);get elementsSelectable(){return r(this.#p)}set elementsSelectable(a){y(this.#p,a)}#h=k(()=>t.props.nodesFocusable??!0);get nodesFocusable(){return r(this.#h)}set nodesFocusable(a){y(this.#h,a)}#g=k(()=>t.props.edgesFocusable??!0);get edgesFocusable(){return r(this.#g)}set edgesFocusable(a){y(this.#g,a)}#m=k(()=>t.props.disableKeyboardA11y??!1);get disableKeyboardA11y(){return r(this.#m)}set disableKeyboardA11y(a){y(this.#m,a)}#_=k(()=>t.props.minZoom??.5);get minZoom(){return r(this.#_)}set minZoom(a){y(this.#_,a)}#y=k(()=>t.props.maxZoom??2);get maxZoom(){return r(this.#y)}set maxZoom(a){y(this.#y,a)}#b=k(()=>t.props.nodeOrigin??[0,0]);get nodeOrigin(){return r(this.#b)}set nodeOrigin(a){y(this.#b,a)}#x=k(()=>t.props.nodeExtent??to);get nodeExtent(){return r(this.#x)}set nodeExtent(a){y(this.#x,a)}#w=k(()=>t.props.translateExtent??to);get translateExtent(){return r(this.#w)}set translateExtent(a){y(this.#w,a)}#k=k(()=>t.props.defaultEdgeOptions??{});get defaultEdgeOptions(){return r(this.#k)}set defaultEdgeOptions(a){y(this.#k,a)}#S=k(()=>t.props.nodeDragThreshold??1);get nodeDragThreshold(){return r(this.#S)}set nodeDragThreshold(a){y(this.#S,a)}#z=k(()=>t.props.autoPanOnNodeDrag??!0);get autoPanOnNodeDrag(){return r(this.#z)}set autoPanOnNodeDrag(a){y(this.#z,a)}#C=k(()=>t.props.autoPanOnConnect??!0);get autoPanOnConnect(){return r(this.#C)}set autoPanOnConnect(a){y(this.#C,a)}#E=k(()=>t.props.autoPanOnNodeFocus??!0);get autoPanOnNodeFocus(){return r(this.#E)}set autoPanOnNodeFocus(a){y(this.#E,a)}#N=k(()=>t.props.autoPanSpeed??15);get autoPanSpeed(){return r(this.#N)}set autoPanSpeed(a){y(this.#N,a)}#M=k(()=>t.props.connectionDragThreshold??1);get connectionDragThreshold(){return r(this.#M)}set connectionDragThreshold(a){y(this.#M,a)}fitViewQueued=t.props.fitView??!1;fitViewOptions=t.props.fitViewOptions;fitViewResolver=null;#P=k(()=>t.props.snapGrid??null);get snapGrid(){return r(this.#P)}set snapGrid(a){y(this.#P,a)}#T=Q(!1);get dragging(){return r(this.#T)}set dragging(a){y(this.#T,a)}#I=Q(null);get selectionRect(){return r(this.#I)}set selectionRect(a){y(this.#I,a)}#A=Q(!1);get selectionKeyPressed(){return r(this.#A)}set selectionKeyPressed(a){y(this.#A,a)}#D=Q(!1);get multiselectionKeyPressed(){return r(this.#D)}set multiselectionKeyPressed(a){y(this.#D,a)}#O=Q(!1);get deleteKeyPressed(){return r(this.#O)}set deleteKeyPressed(a){y(this.#O,a)}#R=Q(!1);get panActivationKeyPressed(){return r(this.#R)}set panActivationKeyPressed(a){y(this.#R,a)}#L=Q(!1);get zoomActivationKeyPressed(){return r(this.#L)}set zoomActivationKeyPressed(a){y(this.#L,a)}#H=Q(null);get selectionRectMode(){return r(this.#H)}set selectionRectMode(a){y(this.#H,a)}#V=Q("");get ariaLiveMessage(){return r(this.#V)}set ariaLiveMessage(a){y(this.#V,a)}#F=k(()=>t.props.selectionMode??na.Partial);get selectionMode(){return r(this.#F)}set selectionMode(a){y(this.#F,a)}#B=k(()=>({...tl,...t.props.nodeTypes}));get nodeTypes(){return r(this.#B)}set nodeTypes(a){y(this.#B,a)}#q=k(()=>({...nl,...t.props.edgeTypes}));get edgeTypes(){return r(this.#q)}set edgeTypes(a){y(this.#q,a)}#K=k(()=>t.props.noPanClass??"nopan");get noPanClass(){return r(this.#K)}set noPanClass(a){y(this.#K,a)}#j=k(()=>t.props.noDragClass??"nodrag");get noDragClass(){return r(this.#j)}set noDragClass(a){y(this.#j,a)}#Z=k(()=>t.props.noWheelClass??"nowheel");get noWheelClass(){return r(this.#Z)}set noWheelClass(a){y(this.#Z,a)}#Y=k(()=>zf(t.props.ariaLabelConfig));get ariaLabelConfig(){return r(this.#Y)}set ariaLabelConfig(a){y(this.#Y,a)}#X=Q(Fp(this.nodesInitialized,t.props.fitView,t.props.initialViewport,this.width,this.height,this.nodeLookup));get _viewport(){return r(this.#X)}set _viewport(a){y(this.#X,a)}get viewport(){return t.viewport??this._viewport}set viewport(a){t.viewport&&(t.viewport=a),this._viewport=a}#W=Q(no);get _connection(){return r(this.#W)}set _connection(a){y(this.#W,a)}#G=k(()=>this._connection.inProgress?{...this._connection,to:kr(this._connection.to,[this.viewport.x,this.viewport.y,this.viewport.zoom])}:this._connection);get connection(){return r(this.#G)}set connection(a){y(this.#G,a)}#U=k(()=>t.props.connectionMode??Qn.Strict);get connectionMode(){return r(this.#U)}set connectionMode(a){y(this.#U,a)}#Q=k(()=>t.props.connectionRadius??20);get connectionRadius(){return r(this.#Q)}set connectionRadius(a){y(this.#Q,a)}#J=k(()=>t.props.isValidConnection??(()=>!0));get isValidConnection(){return r(this.#J)}set isValidConnection(a){y(this.#J,a)}#$=k(()=>t.props.selectNodesOnDrag??!0);get selectNodesOnDrag(){return r(this.#$)}set selectNodesOnDrag(a){y(this.#$,a)}#ee=k(()=>t.props.defaultMarkerColor===void 0?"#b1b1b7":t.props.defaultMarkerColor);get defaultMarkerColor(){return r(this.#ee)}set defaultMarkerColor(a){y(this.#ee,a)}#te=k(()=>Lf(t.edges,{defaultColor:this.defaultMarkerColor,id:this.flowId,defaultMarkerStart:this.defaultEdgeOptions.markerStart,defaultMarkerEnd:this.defaultEdgeOptions.markerEnd}));get markers(){return r(this.#te)}set markers(a){y(this.#te,a)}#ne=k(()=>t.props.onlyRenderVisibleElements??!1);get onlyRenderVisibleElements(){return r(this.#ne)}set onlyRenderVisibleElements(a){y(this.#ne,a)}#re=k(()=>t.props.onflowerror??xf);get onerror(){return r(this.#re)}set onerror(a){y(this.#re,a)}#ae=k(()=>t.props.ondelete);get ondelete(){return r(this.#ae)}set ondelete(a){y(this.#ae,a)}#oe=k(()=>t.props.onbeforedelete);get onbeforedelete(){return r(this.#oe)}set onbeforedelete(a){y(this.#oe,a)}#se=k(()=>t.props.onbeforeconnect);get onbeforeconnect(){return r(this.#se)}set onbeforeconnect(a){y(this.#se,a)}#ie=k(()=>t.props.onconnect);get onconnect(){return r(this.#ie)}set onconnect(a){y(this.#ie,a)}#le=k(()=>t.props.onconnectstart);get onconnectstart(){return r(this.#le)}set onconnectstart(a){y(this.#le,a)}#ce=k(()=>t.props.onconnectend);get onconnectend(){return r(this.#ce)}set onconnectend(a){y(this.#ce,a)}#de=k(()=>t.props.onbeforereconnect);get onbeforereconnect(){return r(this.#de)}set onbeforereconnect(a){y(this.#de,a)}#ue=k(()=>t.props.onreconnect);get onreconnect(){return r(this.#ue)}set onreconnect(a){y(this.#ue,a)}#ve=k(()=>t.props.onreconnectstart);get onreconnectstart(){return r(this.#ve)}set onreconnectstart(a){y(this.#ve,a)}#fe=k(()=>t.props.onreconnectend);get onreconnectend(){return r(this.#fe)}set onreconnectend(a){y(this.#fe,a)}#pe=k(()=>t.props.clickConnect??!0);get clickConnect(){return r(this.#pe)}set clickConnect(a){y(this.#pe,a)}#he=k(()=>t.props.onclickconnectstart);get onclickconnectstart(){return r(this.#he)}set onclickconnectstart(a){y(this.#he,a)}#ge=k(()=>t.props.onclickconnectend);get onclickconnectend(){return r(this.#ge)}set onclickconnectend(a){y(this.#ge,a)}#me=Q(null);get clickConnectStartHandle(){return r(this.#me)}set clickConnectStartHandle(a){y(this.#me,a)}#_e=k(()=>t.props.onselectiondrag);get onselectiondrag(){return r(this.#_e)}set onselectiondrag(a){y(this.#_e,a)}#ye=k(()=>t.props.onselectiondragstart);get onselectiondragstart(){return r(this.#ye)}set onselectiondragstart(a){y(this.#ye,a)}#be=k(()=>t.props.onselectiondragstop);get onselectiondragstop(){return r(this.#be)}set onselectiondragstop(a){y(this.#be,a)}resolveFitView=async()=>{this.panZoom&&(await yf({nodes:this.nodeLookup,width:this.width,height:this.height,panZoom:this.panZoom,minZoom:this.minZoom,maxZoom:this.maxZoom},this.fitViewOptions),this.fitViewResolver?.resolve(!0),this.fitViewQueued=!1,this.fitViewOptions=void 0,this.fitViewResolver=null)};_prefersDark=new Hp("(prefers-color-scheme: dark)",t.props.colorModeSSR==="dark");#xe=k(()=>t.props.colorMode==="system"?this._prefersDark.current?"dark":"light":t.props.colorMode??"light");get colorMode(){return r(this.#xe)}set colorMode(a){y(this.#xe,a)}constructor(){}resetStoreValues(){this.dragging=!1,this.selectionRect=null,this.selectionRectMode=null,this.selectionKeyPressed=!1,this.multiselectionKeyPressed=!1,this.deleteKeyPressed=!1,this.panActivationKeyPressed=!1,this.zoomActivationKeyPressed=!1,this._connection=no,this.clickConnectStartHandle=null,this.viewport=t.props.initialViewport??{x:0,y:0,zoom:1},this.ariaLiveMessage=""}}return new e}function fn(){const t=so(oo);if(!t)throw new Error("To call useStore outside of you need to wrap your component in a ");return t.getStore()}const oo=Symbol();function qp(t){const e=Bp(t);function n(x){e.nodeTypes={...tl,...x}}function a(x){e.edgeTypes={...nl,...x}}function o(x){e.edges=If(x,e.edges)}const i=(x,S=!1)=>{e.nodes=e.nodes.map(z=>{if(e.connection.inProgress&&e.connection.fromNode.id===z.id){const C=e.nodeLookup.get(z.id);C&&(e.connection={...e.connection,from:Dn(C,e.connection.fromHandle,we.Left,!0)})}const g=x.get(z.id);return g?{...z,position:g.position,dragging:S}:z})};function s(x){const{changes:S,updatedInternals:z}=Yf(x,e.nodeLookup,e.parentLookup,e.domNode,e.nodeOrigin,e.nodeExtent,e.zIndexMode);if(!z)return;Ff(e.nodeLookup,e.parentLookup,{nodeOrigin:e.nodeOrigin,nodeExtent:e.nodeExtent,zIndexMode:e.zIndexMode}),e.fitViewQueued&&e.resolveFitView();const g=new Map;for(const C of S){const T=e.nodeLookup.get(C.id)?.internals.userNode;if(!T)continue;const D={...T};switch(C.type){case"dimensions":{const V={...D.measured,...C.dimensions};C.setAttributes&&(D.width=C.dimensions?.width??D.width,D.height=C.dimensions?.height??D.height),D.measured=V;break}case"position":D.position=C.position??D.position;break}g.set(C.id,D)}e.nodes=e.nodes.map(C=>g.get(C.id)??C)}function l(x){const S=e.fitViewResolver??Promise.withResolvers();return e.fitViewQueued=!0,e.fitViewOptions=x,e.fitViewResolver=S,e.nodes=[...e.nodes],S.promise}async function u(x,S,z){const g=typeof z?.zoom<"u"?z.zoom:e.maxZoom,C=e.panZoom;return C?(await C.setViewport({x:e.width/2-x*g,y:e.height/2-S*g,zoom:g},{duration:z?.duration,ease:z?.ease,interpolate:z?.interpolate}),Promise.resolve(!0)):Promise.resolve(!1)}function v(x,S){const z=e.panZoom;return z?z.scaleBy(x,S):Promise.resolve(!1)}function p(x){return v(1.2,x)}function m(x){return v(1/1.2,x)}function f(x){const S=e.panZoom;S&&(S.setScaleExtent([x,e.maxZoom]),e.minZoom=x)}function w(x){const S=e.panZoom;S&&(S.setScaleExtent([e.minZoom,x]),e.maxZoom=x)}function N(x){const S=e.panZoom;S&&(S.setTranslateExtent(x),e.translateExtent=x)}function E(x,S=null){let z=!1;const g=x.map(C=>(S?S.has(C.id):!0)&&C.selected?(z=!0,{...C,selected:!1}):C);return[z,g]}function I(x){const S=x?.nodes?new Set(x.nodes.map(V=>V.id)):null,[z,g]=E(e.nodes,S);z&&(e.nodes=g);const C=x?.edges?new Set(x.edges.map(V=>V.id)):null,[T,D]=E(e.edges,C);T&&(e.edges=D)}function H(x){const S=e.multiselectionKeyPressed;e.nodes=e.nodes.map(z=>{const g=x.includes(z.id),C=S&&z.selected||g;return!!z.selected!==C?{...z,selected:C}:z}),S||I({nodes:[]})}function O(x){const S=e.multiselectionKeyPressed;e.edges=e.edges.map(z=>{const g=x.includes(z.id),C=S&&z.selected||g;return!!z.selected!==C?{...z,selected:C}:z}),S||I({edges:[]})}function F(x,S,z){const g=e.nodeLookup.get(x);if(!g){console.warn("012",hr.error012(x));return}e.selectionRect=null,e.selectionRectMode=null,g.selected?(S||g.selected&&e.multiselectionKeyPressed)&&(I({nodes:[g],edges:[]}),requestAnimationFrame(()=>z?.blur())):H([x])}function M(x){const S=e.edgeLookup.get(x);if(!S){console.warn("012",hr.error012(x));return}(S.selectable||e.elementsSelectable&&typeof S.selectable>"u")&&(e.selectionRect=null,e.selectionRectMode=null,S.selected?S.selected&&e.multiselectionKeyPressed&&I({nodes:[],edges:[S]}):O([x]))}function R(x,S){const{nodeExtent:z,snapGrid:g,nodeOrigin:C,nodeLookup:T,nodesDraggable:D,onerror:V}=e,L=new Map,q=g?.[0]??5,j=g?.[1]??5,U=x.x*q*S,W=x.y*j*S;for(const J of T.values()){if(!(J.selected&&(J.draggable||D&&typeof J.draggable>"u")))continue;let re={x:J.internals.positionAbsolute.x+U,y:J.internals.positionAbsolute.y+W};g&&(re=wr(re,g));const{position:ie,positionAbsolute:ne}=Ii({nodeId:J.id,nextPosition:re,nodeLookup:T,nodeExtent:z,nodeOrigin:C,onError:V});J.position=ie,J.internals.positionAbsolute=ne,L.set(J.id,J)}i(L)}function b(x){return Xf({delta:x,panZoom:e.panZoom,transform:[e.viewport.x,e.viewport.y,e.viewport.zoom],translateExtent:e.translateExtent,width:e.width,height:e.height})}const A=x=>{e._connection={...x}};function B(){e._connection=no}function K(){e.resetStoreValues(),I()}return Object.assign(e,{setNodeTypes:n,setEdgeTypes:a,addEdge:o,updateNodePositions:i,updateNodeInternals:s,zoomIn:p,zoomOut:m,fitView:l,setCenter:u,setMinZoom:f,setMaxZoom:w,setTranslateExtent:N,unselectNodesAndEdges:I,addSelectedNodes:H,addSelectedEdges:O,handleNodeSelection:F,handleEdgeSelection:M,moveSelectedNodes:R,panBy:b,updateConnection:A,cancelConnection:B,reset:K})}function Kp(t,e){const{minZoom:n,maxZoom:a,initialViewport:o,onPanZoomStart:i,onPanZoom:s,onPanZoomEnd:l,translateExtent:u,setPanZoomInstance:v,onDraggingChange:p,onTransformChange:m}=e,f=up({domNode:t,minZoom:n,maxZoom:a,translateExtent:u,viewport:o,onPanZoom:s,onPanZoomStart:i,onPanZoomEnd:l,onDraggingChange:p}),w=f.getViewport();return(o.x!==w.x||o.y!==w.y||o.zoom!==w.zoom)&&m([w.x,w.y,w.zoom]),v(f),f.update(e),{update(N){f.update(N)}}}var jp=P('
    ');function Zp(t,e){ze(e,!0);let n=pe(e,"store",15),a=k(()=>n().panActivationKeyPressed||e.panOnDrag),o=k(()=>n().panActivationKeyPressed||e.panOnScroll);const{viewport:i}=n();let s=!1;_e(()=>{!s&&n().viewportInitialized&&(e.oninit?.(),s=!0)});var l=jp(),u=d(l);Dt(u,()=>e.children),c(l),zt(l,(v,p)=>Kp?.(v,p),()=>({viewport:n().viewport,minZoom:n().minZoom,maxZoom:n().maxZoom,initialViewport:i,onDraggingChange:v=>{n(n().dragging=v,!0)},setPanZoomInstance:v=>{n(n().panZoom=v,!0)},onPanZoomStart:e.onmovestart,onPanZoom:e.onmove,onPanZoomEnd:e.onmoveend,zoomOnScroll:e.zoomOnScroll,zoomOnDoubleClick:e.zoomOnDoubleClick,zoomOnPinch:e.zoomOnPinch,panOnScroll:r(o),panOnDrag:r(a),panOnScrollSpeed:e.panOnScrollSpeed,panOnScrollMode:e.panOnScrollMode,zoomActivationKeyPressed:n().zoomActivationKeyPressed,preventScrolling:typeof e.preventScrolling=="boolean"?e.preventScrolling:!0,noPanClassName:n().noPanClass,noWheelClassName:n().noWheelClass,userSelectionActive:!!n().selectionRect,translateExtent:n().translateExtent,lib:"svelte",paneClickDistance:e.paneClickDistance,selectionOnDrag:e.selectionOnDrag,onTransformChange:v=>{n(n().viewport={x:v[0],y:v[1],zoom:v[2]},!0)},connectionInProgress:n().connection.inProgress})),_(t,l),Ce()}function As(t,e){return n=>{n.target===e&&t?.(n)}}function Ds(t){return e=>{const n=t.has(e.id);return!!e.selected!==n?{...e,selected:n}:e}}function Os(t,e){if(t.size!==e.size)return!1;for(const n of t)if(!e.has(n))return!1;return!0}var Yp=P("
    ");function Xp(t,e){ze(e,!0);let n=pe(e,"store",15),a=pe(e,"panOnDrag",3,!0),o=pe(e,"paneClickDistance",3,1),i,s=null,l=new Set,u=new Set,v=k(()=>n().panActivationKeyPressed||a()),p=k(()=>n().selectionKeyPressed||!!n().selectionRect||e.selectionOnDrag&&r(v)!==!0),m=k(()=>n().elementsSelectable&&(r(p)||n().selectionRectMode==="user")),f=!1;function w(B){if(s=i?.getBoundingClientRect(),!s)return;const K=B.target===i,Z=!K&&!!B.target.closest(".nokey"),x=e.selectionOnDrag&&K||n().selectionKeyPressed;if(Z||!r(p)||!x||B.button!==0||!B.isPrimary)return;B.target?.setPointerCapture?.(B.pointerId),f=!1;const{x:S,y:z}=qt(B,s);n(n().selectionRect={width:0,height:0,startX:S,startY:z,x:S,y:z},!0),K||(B.stopPropagation(),B.preventDefault())}function N(B){if(!r(p)||!s||!n().selectionRect)return;const K=qt(B,s),{startX:Z=0,startY:x=0}=n().selectionRect;if(!f){const T=n().selectionKeyPressed?0:o();if(Math.hypot(K.x-Z,K.y-x)<=T)return;n().unselectNodesAndEdges(),e.onselectionstart?.(B)}f=!0;const S={...n().selectionRect,x:K.xT.id));const C=n().defaultEdgeOptions.selectable??!0;u=new Set;for(const T of l){const D=n().connectionLookup.get(T);if(D)for(const{edgeId:V}of D.values()){const L=n().edgeLookup.get(V);L&&(L.selectable??C)&&u.add(V)}}Os(z,l)||n(n().nodes=n().nodes.map(Ds(l)),!0),Os(g,u)||n(n().edges=n().edges.map(Ds(u)),!0),n(n().selectionRectMode="user",!0),n(n().selectionRect=S,!0)}function E(B){B.button===0&&(B.target?.releasePointerCapture?.(B.pointerId),!f&&B.target===i&&O?.(B),n(n().selectionRect=null,!0),f&&n(n().selectionRectMode=l.size>0?"nodes":null,!0),f&&e.onselectionend?.(B))}const I=B=>{if(Array.isArray(r(v))&&r(v).includes(2)){B.preventDefault();return}e.onpanecontextmenu?.({event:B})},H=B=>{f&&(B.stopPropagation(),f=!1)};function O(B){if(f||n().connection.inProgress){f=!1;return}e.onpaneclick?.({event:B}),n().unselectNodesAndEdges(),n(n().selectionRectMode=null,!0),n(n().selectionRect=null,!0)}var F=Yp();let M;var R=k(()=>r(m)?void 0:As(O,i)),b=k(()=>As(I,i)),A=d(F);Dt(A,()=>e.children),c(F),bn(F,B=>i=B,()=>i),$(B=>M=De(F,1,"svelte-flow__pane svelte-flow__container",null,M,B),[()=>({draggable:a()===!0||Array.isArray(a())&&a().includes(0),dragging:n().dragging,selection:r(p)})]),be("click",F,function(...B){r(R)?.apply(this,B)}),jr("pointerdown",F,function(...B){(r(m)?w:void 0)?.apply(this,B)},!0),be("pointermove",F,function(...B){(r(m)?N:void 0)?.apply(this,B)}),be("pointerup",F,function(...B){(r(m)?E:void 0)?.apply(this,B)}),be("contextmenu",F,function(...B){r(b)?.apply(this,B)}),jr("click",F,function(...B){(r(m)?H:void 0)?.apply(this,B)},!0),_(t,F),Ce()}_t(["click","pointermove","pointerup","contextmenu"]);var Wp=P('
    ');function Gp(t,e){ze(e,!0);var n=Wp();let a;var o=d(n);Dt(o,()=>e.children),c(n),$(()=>a=st(n,"",a,{transform:`translate(${e.store.viewport.x??""}px, ${e.store.viewport.y??""}px) scale(${e.store.viewport.zoom??""})`})),_(t,n),Ce()}function rl(t,e){const{store:n,onDrag:a,onDragStart:o,onDragStop:i,onNodeMouseDown:s}=e,l=Qf({onDrag:a,onDragStart:o,onDragStop:i,onNodeMouseDown:s,getStoreItems:()=>{const{snapGrid:v,viewport:p}=n;return{nodes:n.nodes,nodeLookup:n.nodeLookup,edges:n.edges,nodeExtent:n.nodeExtent,snapGrid:v||[0,0],snapToGrid:!!v,nodeOrigin:n.nodeOrigin,multiSelectionActive:n.multiselectionKeyPressed,domNode:n.domNode,transform:[p.x,p.y,p.zoom],autoPanOnNodeDrag:n.autoPanOnNodeDrag,nodesDraggable:n.nodesDraggable,selectNodesOnDrag:n.selectNodesOnDrag,nodeDragThreshold:n.nodeDragThreshold,unselectNodesAndEdges:n.unselectNodesAndEdges,updateNodePositions:n.updateNodePositions,onSelectionDrag:n.onselectiondrag,onSelectionDragStart:n.onselectiondragstart,onSelectionDragStop:n.onselectiondragstop,panBy:n.panBy}}});function u(v,p){if(p.disabled){l.destroy();return}l.update({domNode:v,noDragClassName:p.noDragClass,handleSelector:p.handleSelector,nodeId:p.nodeId,isSelectable:p.isSelectable,nodeClickDistance:p.nodeClickDistance})}return u(t,e),{update(v){u(t,v)},destroy(){l.destroy()}}}var Up=P('
    '),Qp=P('
    ',1);function Jp(t,e){ze(e,!0);var n=Qp(),a=de(n),o=d(a,!0);c(a);var i=h(a,2),s=d(i,!0);c(i);var l=h(i,2);{var u=v=>{var p=Up(),m=d(p,!0);c(p),$(()=>{xe(p,"id",`${$p}-${e.store.flowId}`),X(m,e.store.ariaLiveMessage)}),_(v,p)};Y(l,v=>{e.store.disableKeyboardA11y||v(u)})}$(()=>{xe(a,"id",`${al}-${e.store.flowId}`),X(o,e.store.disableKeyboardA11y?e.store.ariaLabelConfig["node.a11yDescription.default"]:e.store.ariaLabelConfig["node.a11yDescription.keyboardDisabled"]),xe(i,"id",`${ol}-${e.store.flowId}`),X(s,e.store.ariaLabelConfig["edge.a11yDescription.default"])}),_(t,n),Ce()}const al="svelte-flow__node-desc",ol="svelte-flow__edge-desc",$p="svelte-flow__aria-live";var eh=P("
    ");function th(t,e){ze(e,!0);let n=pe(e,"store",15),a=k(()=>St(e.node.data,()=>({}),!0)),o=k(()=>St(e.node.selected,!1)),i=k(()=>e.node.draggable),s=k(()=>e.node.selectable),l=k(()=>St(e.node.deletable,!0)),u=k(()=>e.node.connectable),v=k(()=>e.node.focusable),p=k(()=>St(e.node.hidden,!1)),m=k(()=>St(e.node.dragging,!1)),f=k(()=>St(e.node.style,"")),w=k(()=>e.node.class),N=k(()=>St(e.node.type,"default")),E=k(()=>e.node.parentId),I=k(()=>e.node.sourcePosition),H=k(()=>e.node.targetPosition),O=k(()=>St(e.node.measured,()=>({width:0,height:0}),!0).width),F=k(()=>St(e.node.measured,()=>({width:0,height:0}),!0).height),M=k(()=>e.node.initialWidth),R=k(()=>e.node.initialHeight),b=k(()=>e.node.width),A=k(()=>e.node.height),B=k(()=>e.node.dragHandle),K=k(()=>St(e.node.internals.z,0)),Z=k(()=>e.node.internals.positionAbsolute.x),x=k(()=>e.node.internals.positionAbsolute.y),S=k(()=>e.node.internals.userNode),{id:z}=e.node,g=k(()=>r(i)??n().nodesDraggable),C=k(()=>r(s)??n().elementsSelectable),T=k(()=>r(u)??n().nodesConnectable),D=k(()=>Ri(e.node)),V=k(()=>!!e.node.internals.handleBounds),L=k(()=>r(D)&&r(V)),q=k(()=>r(v)??n().nodesFocusable);function j(fe){return n().parentLookup.has(fe)}let U=k(()=>j(z)),W=Q(null),J=null,ae=r(N),re=r(I),ie=r(H),ne=k(()=>n().nodeTypes[r(N)]??$i),G=k(()=>n().ariaLabelConfig),oe={get value(){return r(T)}};fp(z),hp(oe);let ee=k(()=>{const fe=r(O)===void 0?r(b)??r(M):r(b),ke=r(F)===void 0?r(A)??r(R):r(A);if(!(fe===void 0&&ke===void 0&&r(f)===void 0))return`${r(f)};${fe?`width:${en(fe)};`:""}${ke?`height:${en(ke)};`:""}`});_e(()=>{(r(N)!==ae||r(I)!==re||r(H)!==ie)&&r(W)!==null&&requestAnimationFrame(()=>{r(W)!==null&&n().updateNodeInternals(new Map([[z,{id:z,nodeElement:r(W),force:!0}]]))}),ae=r(N),re=r(I),ie=r(H)}),_e(()=>{e.resizeObserver&&(!r(L)||r(W)!==J)&&(J&&e.resizeObserver.unobserve(J),r(W)&&e.resizeObserver.observe(r(W)),J=r(W))}),On(()=>{J&&e.resizeObserver?.unobserve(J)});function se(fe){r(C)&&(!n().selectNodesOnDrag||!r(g)||n().nodeDragThreshold>0)&&n().handleNodeSelection(z),e.onnodeclick?.({node:r(S),event:fe})}function te(fe){if(!(Vi(fe)||n().disableKeyboardA11y))if(Pi.includes(fe.key)&&r(C)){const ke=fe.key==="Escape";n().handleNodeSelection(z,ke,r(W))}else r(g)&&e.node.selected&&Object.prototype.hasOwnProperty.call(sa,fe.key)&&(fe.preventDefault(),n(n().ariaLiveMessage=r(G)["node.a11yDescription.ariaLiveMessage"]({direction:fe.key.replace("Arrow","").toLowerCase(),x:~~e.node.internals.positionAbsolute.x,y:~~e.node.internals.positionAbsolute.y}),!0),n().moveSelectedNodes(sa[fe.key],fe.shiftKey?4:1))}const ue=()=>{if(n().disableKeyboardA11y||!n().autoPanOnNodeFocus||!r(W)?.matches(":focus-visible"))return;const{width:fe,height:ke,viewport:Ae}=n();Co(new Map([[z,e.node]]),{x:0,y:0,width:fe,height:ke},[Ae.x,Ae.y,Ae.zoom],!0).length>0||n().setCenter(e.node.position.x+(e.node.measured.width??0)/2,e.node.position.y+(e.node.measured.height??0)/2,{zoom:Ae.zoom})};var le=Me(),he=de(le);{var ve=fe=>{var ke=eh();yn(ke,()=>({"data-id":z,class:["svelte-flow__node",`svelte-flow__node-${r(N)}`,r(w)],style:r(ee),onclick:se,onpointerenter:e.onnodepointerenter?ge=>e.onnodepointerenter({node:r(S),event:ge}):void 0,onpointerleave:e.onnodepointerleave?ge=>e.onnodepointerleave({node:r(S),event:ge}):void 0,onpointermove:e.onnodepointermove?ge=>e.onnodepointermove({node:r(S),event:ge}):void 0,oncontextmenu:e.onnodecontextmenu?ge=>e.onnodecontextmenu({node:r(S),event:ge}):void 0,onkeydown:r(q)?te:void 0,onfocus:r(q)?ue:void 0,tabIndex:r(q)?0:void 0,role:e.node.ariaRole??(r(q)?"group":void 0),"aria-roledescription":"node","aria-describedby":n().disableKeyboardA11y?void 0:`${al}-${n().flowId}`,...e.node.domAttributes,[lo]:{dragging:r(m),selected:r(o),draggable:r(g),connectable:r(T),selectable:r(C),nopan:r(g),parent:r(U)},[ia]:{"z-index":r(K),transform:`translate(${r(Z)??""}px, ${r(x)??""}px)`,visibility:r(D)?"visible":"hidden"}}));var Ae=d(ke);un(Ae,()=>r(ne),(ge,Oe)=>{Oe(ge,{get data(){return r(a)},get id(){return z},get selected(){return r(o)},get selectable(){return r(C)},get deletable(){return r(l)},get sourcePosition(){return r(I)},get targetPosition(){return r(H)},get zIndex(){return r(K)},get dragging(){return r(m)},get draggable(){return r(g)},get dragHandle(){return r(B)},get parentId(){return r(E)},get type(){return r(N)},get isConnectable(){return r(T)},get positionAbsoluteX(){return r(Z)},get positionAbsoluteY(){return r(x)},get width(){return r(b)},get height(){return r(A)}})}),c(ke),zt(ke,(ge,Oe)=>rl?.(ge,Oe),()=>({nodeId:z,isSelectable:r(C),disabled:!r(g),handleSelector:r(B),noDragClass:n().noDragClass,nodeClickDistance:e.nodeClickDistance,onNodeMouseDown:n().handleNodeSelection,onDrag:(ge,Oe,Ye,We)=>{e.onnodedrag?.({event:ge,targetNode:Ye,nodes:We})},onDragStart:(ge,Oe,Ye,We)=>{e.onnodedragstart?.({event:ge,targetNode:Ye,nodes:We})},onDragStop:(ge,Oe,Ye,We)=>{e.onnodedragstop?.({event:ge,targetNode:Ye,nodes:We})},store:n()})),bn(ke,ge=>y(W,ge),()=>r(W)),_(fe,ke)};Y(he,fe=>{r(p)||fe(ve)})}_(t,le),Ce()}var nh=P('
    ');function rh(t,e){ze(e,!0);let n=pe(e,"store",15);const a=typeof ResizeObserver>"u"?null:new ResizeObserver(i=>{const s=new Map;i.forEach(l=>{const u=l.target.getAttribute("data-id");s.set(u,{id:u,nodeElement:l.target,force:!0})}),n().updateNodeInternals(s)});On(()=>{a?.disconnect()});var o=nh();je(o,21,()=>n().visible.nodes.values(),i=>i.id,(i,s)=>{th(i,{get node(){return r(s)},get resizeObserver(){return a},get nodeClickDistance(){return e.nodeClickDistance},get onnodeclick(){return e.onnodeclick},get onnodepointerenter(){return e.onnodepointerenter},get onnodepointermove(){return e.onnodepointermove},get onnodepointerleave(){return e.onnodepointerleave},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get onnodecontextmenu(){return e.onnodecontextmenu},get store(){return n()},set store(l){n(l)}})}),c(o),_(t,o),Ce()}var ah=ut('');function oh(t,e){ze(e,!0);let n=k(()=>e.edge.id),a=k(()=>e.edge.source),o=k(()=>e.edge.target),i=k(()=>e.edge.sourceX),s=k(()=>e.edge.sourceY),l=k(()=>e.edge.targetX),u=k(()=>e.edge.targetY),v=k(()=>e.edge.sourcePosition),p=k(()=>e.edge.targetPosition),m=k(()=>St(e.edge.animated,!1)),f=k(()=>St(e.edge.selected,!1)),w=k(()=>e.edge.label),N=k(()=>e.edge.labelStyle),E=k(()=>St(e.edge.data,()=>({}),!0)),I=k(()=>e.edge.style),H=k(()=>e.edge.interactionWidth),O=k(()=>St(e.edge.type,"default")),F=k(()=>e.edge.sourceHandle),M=k(()=>e.edge.targetHandle),R=k(()=>e.edge.markerStart),b=k(()=>e.edge.markerEnd),A=k(()=>e.edge.selectable),B=k(()=>e.edge.focusable),K=k(()=>St(e.edge.deletable,!0)),Z=k(()=>e.edge.hidden),x=k(()=>e.edge.zIndex),S=k(()=>e.edge.class),z=k(()=>e.edge.ariaLabel);mp(r(n));let g=null,C=k(()=>r(A)??e.store.elementsSelectable),T=k(()=>r(B)??e.store.edgesFocusable),D=k(()=>e.store.edgeTypes[r(O)]??el),V=k(()=>r(R)?`url('#${ao(r(R),e.store.flowId)}')`:void 0),L=k(()=>r(b)?`url('#${ao(r(b),e.store.flowId)}')`:void 0);function q(re){const ie=e.store.edgeLookup.get(r(n));ie&&(r(C)&&e.store.handleEdgeSelection(r(n)),e.onedgeclick?.({event:re,edge:ie}))}function j(re,ie){const ne=e.store.edgeLookup.get(r(n));ne&&ie({event:re,edge:ne})}function U(re){if(!e.store.disableKeyboardA11y&&Pi.includes(re.key)&&r(C)){const{unselectNodesAndEdges:ie,addSelectedEdges:ne}=e.store;re.key==="Escape"?(g?.blur(),ie({edges:[e.edge]})):ne([r(n)])}}var W=Me(),J=de(W);{var ae=re=>{var ie=ah();let ne;var G=d(ie);yn(G,()=>({class:["svelte-flow__edge",r(S)],"data-id":r(n),onclick:q,oncontextmenu:e.onedgecontextmenu?ee=>{j(ee,e.onedgecontextmenu)}:void 0,onpointerenter:e.onedgepointerenter?ee=>{j(ee,e.onedgepointerenter)}:void 0,onpointerleave:e.onedgepointerleave?ee=>{j(ee,e.onedgepointerleave)}:void 0,"aria-label":r(z)===null?void 0:r(z)?r(z):`Edge from ${r(a)} to ${r(o)}`,"aria-describedby":r(T)?`${ol}-${e.store.flowId}`:void 0,role:e.edge.ariaRole??(r(T)?"group":"img"),"aria-roledescription":"edge",onkeydown:r(T)?U:void 0,tabindex:r(T)?0:void 0,...e.edge.domAttributes,[lo]:{animated:r(m),selected:r(f),selectable:r(C)}}));var oe=d(G);un(oe,()=>r(D),(ee,se)=>{se(ee,{get id(){return r(n)},get source(){return r(a)},get target(){return r(o)},get sourceX(){return r(i)},get sourceY(){return r(s)},get targetX(){return r(l)},get targetY(){return r(u)},get sourcePosition(){return r(v)},get targetPosition(){return r(p)},get animated(){return r(m)},get selected(){return r(f)},get label(){return r(w)},get labelStyle(){return r(N)},get data(){return r(E)},get style(){return r(I)},get interactionWidth(){return r(H)},get selectable(){return r(C)},get deletable(){return r(K)},get type(){return r(O)},get sourceHandleId(){return r(F)},get targetHandleId(){return r(M)},get markerStart(){return r(V)},get markerEnd(){return r(L)}})}),c(G),bn(G,ee=>g=ee,()=>g),c(ie),$(()=>ne=st(ie,"",ne,{"z-index":r(x)})),_(re,ie)};Y(J,re=>{r(Z)||re(ae)})}_(t,W),Ce()}var sh=ut("");function ih(t,e){ze(e,!1);const n=fn();Ls();var a=sh();je(a,5,()=>n.markers,o=>o.id,(o,i)=>{uh(o,Ze(()=>r(i)))}),c(a),_(t,a),Ce()}var lh=ut(''),ch=ut(''),dh=ut('');function uh(t,e){ze(e,!0);let n=pe(e,"width",3,12.5),a=pe(e,"height",3,12.5),o=pe(e,"markerUnits",3,"strokeWidth"),i=pe(e,"orient",3,"auto-start-reverse"),s=pe(e,"color",3,"none");var l=dh(),u=d(l);{var v=m=>{var f=lh();let w;$(()=>{xe(f,"stroke-width",e.strokeWidth),w=st(f,"",w,{stroke:s()})}),_(m,f)},p=m=>{var f=ch();let w;$(()=>{xe(f,"stroke-width",e.strokeWidth),w=st(f,"",w,{stroke:s(),fill:s()})}),_(m,f)};Y(u,m=>{e.type===ra.Arrow?m(v):e.type===ra.ArrowClosed&&m(p,1)})}c(l),$(()=>{xe(l,"id",e.id),xe(l,"markerWidth",`${n()}`),xe(l,"markerHeight",`${a()}`),xe(l,"markerUnits",o()),xe(l,"orient",i())}),_(t,l),Ce()}var vh=P('
    ');function fh(t,e){ze(e,!0);let n=pe(e,"store",15);var a=vh(),o=d(a),i=d(o);ih(i,{}),c(o);var s=h(o,2);je(s,17,()=>n().visible.edges.values(),l=>l.id,(l,u)=>{oh(l,{get edge(){return r(u)},get onedgeclick(){return e.onedgeclick},get onedgecontextmenu(){return e.onedgecontextmenu},get onedgepointerenter(){return e.onedgepointerenter},get onedgepointerleave(){return e.onedgepointerleave},get store(){return n()},set store(v){n(v)}})}),c(a),_(t,a),Ce()}var ph=P('
    ');function sl(t,e){ze(e,!0);let n=pe(e,"x",3,0),a=pe(e,"y",3,0),o=pe(e,"width",3,0),i=pe(e,"height",3,0),s=pe(e,"isVisible",3,!0);var l=Me(),u=de(l);{var v=p=>{var m=ph();let f;$(w=>f=st(m,"",f,w),[()=>({width:typeof o()=="string"?o():en(o()),height:typeof i()=="string"?i():en(i()),transform:`translate(${n()}px, ${a()}px)`})]),_(p,m)};Y(u,p=>{s()&&p(v)})}_(t,l),Ce()}var hh=P("
    ");function gh(t,e){ze(e,!0);let n=Q(void 0);_e(()=>{e.store.disableKeyboardA11y||r(n)?.focus({preventScroll:!0})});let a=k(()=>{if(e.store.selectionRectMode==="nodes"){e.store.nodes;const m=xr(e.store.nodeLookup,{filter:f=>!!f.selected});if(m.width>0&&m.height>0)return m}return null});function o(m){const f=e.store.nodes.filter(w=>w.selected);e.onselectioncontextmenu?.({nodes:f,event:m})}function i(m){const f=e.store.nodes.filter(w=>w.selected);e.onselectionclick?.({nodes:f,event:m})}function s(m){Object.prototype.hasOwnProperty.call(sa,m.key)&&(m.preventDefault(),e.store.moveSelectedNodes(sa[m.key],m.shiftKey?4:1))}var l=Me(),u=de(l);{var v=m=>{var f=hh();let w;var N=d(f);sl(N,{width:"100%",height:"100%",x:0,y:0}),c(f),zt(f,(E,I)=>rl?.(E,I),()=>({disabled:!1,store:e.store,onDrag:(E,I,H,O)=>{e.onnodedrag?.({event:E,targetNode:null,nodes:O})},onDragStart:(E,I,H,O)=>{e.onnodedragstart?.({event:E,targetNode:null,nodes:O})},onDragStop:(E,I,H,O)=>{e.onnodedragstop?.({event:E,targetNode:null,nodes:O})}})),bn(f,E=>y(n,E),()=>r(n)),$(E=>{De(f,1,Rn(["svelte-flow__selection-wrapper",e.store.noPanClass]),"svelte-sf2y5e"),xe(f,"role",e.store.disableKeyboardA11y?void 0:"button"),xe(f,"tabindex",e.store.disableKeyboardA11y?void 0:-1),w=st(f,"",w,E)},[()=>({width:en(r(a).width),height:en(r(a).height),transform:`translate(${r(a).x??""}px, ${r(a).y??""}px)`})]),be("contextmenu",f,o),be("click",f,i),be("keydown",f,function(...E){(e.store.disableKeyboardA11y?void 0:s)?.apply(this,E)}),_(m,f)},p=k(()=>e.store.selectionRectMode==="nodes"&&r(a)&&ln(r(a).x)&&ln(r(a).y));Y(u,m=>{r(p)&&m(v)})}_(t,l),Ce()}_t(["contextmenu","click","keydown"]);function mh(t){switch(t){case"ctrl":return 8;case"shift":return 4;case"alt":return 2;case"meta":return 1}}function Gt(t,e){let{enabled:n=!0,trigger:a,type:o="keydown"}=e;function i(l){const u=Array.isArray(a)?a:[a],v=[l.metaKey,l.altKey,l.shiftKey,l.ctrlKey].reduce((p,m,f)=>m?p|1<0){const O=Array.isArray(f)?f:[f];let F=!1;for(const M of O)if((Array.isArray(M)?M:[M]).reduce((b,A)=>b|mh(A),0)===v){F=!0;break}if(!F)continue}E&&l.preventDefault();const H={node:t,trigger:m,originalEvent:l};t.dispatchEvent(new CustomEvent("shortcut",{detail:H})),N?.(H)}}}let s;return n&&(s=qa(t,o,i)),{update:l=>{const{enabled:u=!0,type:v="keydown"}=l;n&&(!u||o!==v)?s?.():!n&&u&&(s=qa(t,v,i)),n=u,o=v,a=l.trigger},destroy:()=>{s?.()}}}function _h(){const t=k(fn),e=i=>{const s=Ts(i)?i:r(t).nodeLookup.get(i.id),l=s.parentId?Sf(s.position,s.measured,s.parentId,r(t).nodeLookup,r(t).nodeOrigin):s.position,u={...s,position:l,width:s.measured?.width??s.width,height:s.measured?.height??s.height};return $n(u)};function n(i,s,l={replace:!1}){r(t).nodes=Qt(()=>r(t).nodes).map(u=>{if(u.id===i){const v=typeof s=="function"?s(u):s;return l?.replace&&Ts(v)?v:{...u,...v}}return u})}function a(i,s,l={replace:!1}){r(t).edges=Qt(()=>r(t).edges).map(u=>{if(u.id===i){const v=typeof s=="function"?s(u):s;return l.replace&&Ep(v)?v:{...u,...v}}return u})}const o=i=>r(t).nodeLookup.get(i);return{zoomIn:r(t).zoomIn,zoomOut:r(t).zoomOut,getInternalNode:o,getNode:i=>o(i)?.internals.userNode,getNodes:i=>i===void 0?r(t).nodes:Rs(r(t).nodeLookup,i),getEdge:i=>r(t).edgeLookup.get(i),getEdges:i=>i===void 0?r(t).edges:Rs(r(t).edgeLookup,i),setZoom:(i,s)=>{const l=r(t).panZoom;return l?l.scaleTo(i,{duration:s?.duration}):Promise.resolve(!1)},getZoom:()=>r(t).viewport.zoom,setViewport:async(i,s)=>{const l=r(t).viewport;return r(t).panZoom?(await r(t).panZoom.setViewport({x:i.x??l.x,y:i.y??l.y,zoom:i.zoom??l.zoom},s),Promise.resolve(!0)):Promise.resolve(!1)},getViewport:()=>$s(r(t).viewport),setCenter:async(i,s,l)=>r(t).setCenter(i,s,l),fitView:i=>r(t).fitView(i),fitBounds:async(i,s)=>{if(!r(t).panZoom)return Promise.resolve(!1);const l=Eo(i,r(t).width,r(t).height,r(t).minZoom,r(t).maxZoom,s?.padding??.1);return await r(t).panZoom.setViewport(l,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)},getIntersectingNodes:(i,s=!0,l)=>{const u=ys(i),v=u?i:e(i);return v?(l||r(t).nodes).filter(p=>{const m=r(t).nodeLookup.get(p.id);if(!m||!u&&p.id===i.id)return!1;const f=$n(m),w=gr(f,v);return s&&w>0||w>=f.width*f.height||w>=v.width*v.height}):[]},isNodeIntersecting:(i,s,l=!0)=>{const v=ys(i)?i:e(i);if(!v)return!1;const p=gr(v,s);return l&&p>0||p>=s.width*s.height||p>=v.width*v.height},deleteElements:async({nodes:i=[],edges:s=[]})=>{const{nodes:l,edges:u}=await bf({nodesToRemove:i,edgesToRemove:s,nodes:r(t).nodes,edges:r(t).edges,onBeforeDelete:r(t).onbeforedelete});return l&&(r(t).nodes=Qt(()=>r(t).nodes).filter(v=>!l.some(({id:p})=>p===v.id))),u&&(r(t).edges=Qt(()=>r(t).edges).filter(v=>!u.some(({id:p})=>p===v.id))),(l.length>0||u.length>0)&&r(t).ondelete?.({nodes:l,edges:u}),{deletedNodes:l,deletedEdges:u}},screenToFlowPosition:(i,s={snapToGrid:!0})=>{if(!r(t).domNode)return i;const l=s.snapToGrid?r(t).snapGrid:!1,{x:u,y:v,zoom:p}=r(t).viewport,{x:m,y:f}=r(t).domNode.getBoundingClientRect(),w={x:i.x-m,y:i.y-f};return kr(w,[u,v,p],l!==null,l||[1,1])},flowToScreenPosition:i=>{if(!r(t).domNode)return i;const{x:s,y:l,zoom:u}=r(t).viewport,{x:v,y:p}=r(t).domNode.getBoundingClientRect(),m=oa(i,[s,l,u]);return{x:m.x+v,y:m.y+p}},toObject:()=>structuredClone({nodes:[...r(t).nodes],edges:[...r(t).edges],viewport:{...r(t).viewport}}),updateNode:n,updateNodeData:(i,s,l)=>{const u=r(t).nodeLookup.get(i)?.internals.userNode;if(!u)return;const v=typeof s=="function"?s(u):s;n(i,p=>({...p,data:l?.replace?v:{...p.data,...v}}))},updateEdge:a,getNodesBounds:i=>gf(i,{nodeLookup:r(t).nodeLookup,nodeOrigin:r(t).nodeOrigin}),getHandleConnections:({type:i,id:s,nodeId:l})=>Array.from(r(t).connectionLookup.get(`${l}-${i}-${s??null}`)?.values()??[])}}function Rs(t,e){const n=[];for(const a of e){const o=t.get(a);if(o){const i="internals"in o?o.internals?.userNode:o;n.push(i)}}return n}function yh(t,e){ze(e,!0);let n=pe(e,"store",15),a=pe(e,"selectionKey",3,"Shift"),o=pe(e,"multiSelectionKey",19,()=>mr()?"Meta":"Control"),i=pe(e,"deleteKey",3,"Backspace"),s=pe(e,"panActivationKey",3," "),l=pe(e,"zoomActivationKey",19,()=>mr()?"Meta":"Control"),{deleteElements:u}=_h();function v(E){return E!==null&&typeof E=="object"}function p(E){return v(E)?E.modifier||[]:[]}function m(E){return E==null?"":v(E)?E.key:E}function f(E,I){return(Array.isArray(E)?E:[E]).map(O=>{const F=m(O);return{key:F,modifier:p(O),enabled:F!==null,callback:I}})}function w(){n(n().selectionRect=null,!0),n(n().selectionKeyPressed=!1,!0),n(n().multiselectionKeyPressed=!1,!0),n(n().deleteKeyPressed=!1,!0),n(n().panActivationKeyPressed=!1,!0),n(n().zoomActivationKeyPressed=!1,!0)}function N(){const E=n().nodes.filter(H=>H.selected),I=n().edges.filter(H=>H.selected);u({nodes:E,edges:I})}jr("blur",It,w),jr("contextmenu",It,w),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(a(),()=>n(n().selectionKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(a(),()=>n(n().selectionKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(o(),()=>{n(n().multiselectionKeyPressed=!0,!0)}),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(o(),()=>n(n().multiselectionKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(i(),E=>{!(E.originalEvent.ctrlKey||E.originalEvent.metaKey||E.originalEvent.shiftKey)&&!Vi(E.originalEvent)&&(n(n().deleteKeyPressed=!0,!0),N())}),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(i(),()=>n(n().deleteKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(s(),()=>n(n().panActivationKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(s(),()=>n(n().panActivationKeyPressed=!1,!0)),type:"keyup"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(l(),()=>n(n().zoomActivationKeyPressed=!0,!0)),type:"keydown"})),zt(It,(E,I)=>Gt?.(E,I),()=>({trigger:f(l(),()=>n(n().zoomActivationKeyPressed=!1,!0)),type:"keyup"})),Ce()}var bh=ut(''),xh=ut('');function wh(t,e){ze(e,!0);let n=k(()=>{if(!e.store.connection.inProgress)return"";const s={sourceX:e.store.connection.from.x,sourceY:e.store.connection.from.y,sourcePosition:e.store.connection.fromPosition,targetX:e.store.connection.to.x,targetY:e.store.connection.to.y,targetPosition:e.store.connection.toPosition};switch(e.type){case gn.Bezier:{const[l]=Bi(s);return l}case gn.Straight:{const[l]=Ki(s);return l}case gn.Step:case gn.SmoothStep:{const[l]=No({...s,borderRadius:e.type===gn.Step?0:void 0});return l}}});var a=Me(),o=de(a);{var i=s=>{var l=xh(),u=d(l),v=d(u);{var p=f=>{var w=Me(),N=de(w);un(N,()=>e.LineComponent,(E,I)=>{I(E,{})}),_(f,w)},m=f=>{var w=bh();$(()=>{xe(w,"d",r(n)),st(w,e.style)}),_(f,w)};Y(v,f=>{e.LineComponent?f(p):f(m,!1)})}c(u),c(l),$(f=>{xe(l,"width",e.store.width),xe(l,"height",e.store.height),st(l,e.containerStyle),De(u,0,f)},[()=>Rn(["svelte-flow__connection",pf(e.store.connection.isValid)])]),_(s,l)};Y(o,s=>{e.store.connection.inProgress&&s(i)})}_(t,a),Ce()}var kh=P("
    ");function Do(t,e){ze(e,!0);let n=pe(e,"position",3,"top-right"),a=_n(e,["$$slots","$$events","$$legacy","position","style","class","children"]),o=k(()=>`${n()}`.split("-"));var i=kh();yn(i,l=>({class:l,style:e.style,...a}),[()=>["svelte-flow__panel",e.class,...r(o)]]);var s=d(i);Dt(s,()=>e.children??tr),c(i),_(t,i),Ce()}var Sh=P('Svelte Flow');function zh(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-right");var a=Me(),o=de(a);{var i=s=>{Do(s,{get position(){return n()},class:"svelte-flow__attribution","data-message":"Feel free to remove the attribution or check out how you could support us: https://svelteflow.dev/support-us",children:(l,u)=>{var v=Sh();_(l,v)},$$slots:{default:!0}})};Y(o,s=>{e.proOptions?.hideAttribution||s(i)})}_(t,a),Ce()}var Ch=P("
    ");function Eh(t,e){ze(e,!0);let n=pe(e,"domNode",15),a=pe(e,"clientWidth",15),o=pe(e,"clientHeight",15),i=k(()=>e.rest.class),s=k(()=>Fl(e.rest,["id","class","nodeTypes","edgeTypes","colorMode","isValidConnection","onmove","onmovestart","onmoveend","onflowerror","ondelete","onbeforedelete","onbeforeconnect","onconnect","onconnectstart","onconnectend","onbeforereconnect","onreconnect","onreconnectstart","onreconnectend","onclickconnectstart","onclickconnectend","oninit","onselectionchange","onselectiondragstart","onselectiondrag","onselectiondragstop","onselectionstart","onselectionend","clickConnect","fitView","fitViewOptions","nodeOrigin","nodeDragThreshold","connectionDragThreshold","minZoom","maxZoom","initialViewport","connectionRadius","connectionMode","selectionMode","selectNodesOnDrag","snapGrid","defaultMarkerColor","translateExtent","nodeExtent","onlyRenderVisibleElements","autoPanOnConnect","autoPanOnNodeDrag","colorModeSSR","defaultEdgeOptions","elevateNodesOnSelect","elevateEdgesOnSelect","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","elementsSelectable","nodesFocusable","edgesFocusable","disableKeyboardA11y","noDragClass","noPanClass","noWheelClass","ariaLabelConfig","autoPanSpeed","panOnScrollSpeed","zIndexMode"]));function l(p){p.currentTarget.scrollTo({top:0,left:0,behavior:"auto"}),e.rest.onscroll&&e.rest.onscroll(p)}var u=Ch();yn(u,p=>({class:["svelte-flow","svelte-flow__container",r(i),e.colorMode],"data-testid":"svelte-flow__wrapper",role:"application",onscroll:l,...r(s),[ia]:p}),[()=>({width:en(e.width),height:en(e.height)})],void 0,void 0,"svelte-mkap6j");var v=d(u);Dt(v,()=>e.children??tr),c(u),bn(u,p=>n(p),()=>n()),Qo(u,"clientHeight",o),Qo(u,"clientWidth",a),_(t,u),Ce()}var Nh=P('
    ',1),Mh=P(" ",1),Ph=P(" ",1);function Th(t,e){ze(e,!0);let n=pe(e,"paneClickDistance",3,1),a=pe(e,"nodeClickDistance",3,1),o=pe(e,"panOnScrollMode",19,()=>Yn.Free),i=pe(e,"preventScrolling",3,!0),s=pe(e,"zoomOnScroll",3,!0),l=pe(e,"zoomOnDoubleClick",3,!0),u=pe(e,"zoomOnPinch",3,!0),v=pe(e,"panOnScroll",3,!1),p=pe(e,"panOnScrollSpeed",3,.5),m=pe(e,"panOnDrag",3,!0),f=pe(e,"selectionOnDrag",3,!1),w=pe(e,"connectionLineType",19,()=>gn.Bezier),N=pe(e,"nodes",31,()=>$t([])),E=pe(e,"edges",31,()=>$t([])),I=pe(e,"viewport",15,void 0),H=_n(e,["$$slots","$$events","$$legacy","width","height","proOptions","selectionKey","deleteKey","panActivationKey","multiSelectionKey","zoomActivationKey","paneClickDistance","nodeClickDistance","onmovestart","onmoveend","onmove","oninit","onnodeclick","onnodecontextmenu","onnodedrag","onnodedragstart","onnodedragstop","onnodepointerenter","onnodepointermove","onnodepointerleave","onselectionclick","onselectioncontextmenu","onselectionstart","onselectionend","onedgeclick","onedgecontextmenu","onedgepointerenter","onedgepointerleave","onpaneclick","onpanecontextmenu","panOnScrollMode","preventScrolling","zoomOnScroll","zoomOnDoubleClick","zoomOnPinch","panOnScroll","panOnScrollSpeed","panOnDrag","selectionOnDrag","connectionLineComponent","connectionLineStyle","connectionLineContainerStyle","connectionLineType","attributionPosition","children","nodes","edges","viewport"]),O=qp({props:H,width:e.width,height:e.height,get nodes(){return N()},set nodes(M){N(M)},get edges(){return E()},set edges(M){E(M)},get viewport(){return I()},set viewport(M){I(M)}});const F=so(oo);F&&F.setStore&&F.setStore(O),Fs(oo,{provider:!1,getStore(){return O}}),_e(()=>{const M={nodes:O.selectedNodes,edges:O.selectedEdges};Qt(()=>e.onselectionchange)?.(M);for(const R of O.selectionChangeHandlers.values())R(M)}),On(()=>{O.reset()}),Eh(t,{get colorMode(){return O.colorMode},get width(){return e.width},get height(){return e.height},get rest(){return H},get domNode(){return O.domNode},set domNode(M){O.domNode=M},get clientWidth(){return O.width},set clientWidth(M){O.width=M},get clientHeight(){return O.height},set clientHeight(M){O.height=M},children:(M,R)=>{var b=Ph(),A=de(b);yh(A,{get selectionKey(){return e.selectionKey},get deleteKey(){return e.deleteKey},get panActivationKey(){return e.panActivationKey},get multiSelectionKey(){return e.multiSelectionKey},get zoomActivationKey(){return e.zoomActivationKey},get store(){return O},set store(S){O=S}});var B=h(A,2);Zp(B,{get panOnScrollMode(){return o()},get preventScrolling(){return i()},get zoomOnScroll(){return s()},get zoomOnDoubleClick(){return l()},get zoomOnPinch(){return u()},get panOnScroll(){return v()},get panOnScrollSpeed(){return p()},get panOnDrag(){return m()},get paneClickDistance(){return n()},get selectionOnDrag(){return f()},get onmovestart(){return e.onmovestart},get onmove(){return e.onmove},get onmoveend(){return e.onmoveend},get oninit(){return e.oninit},get store(){return O},set store(S){O=S},children:(S,z)=>{Xp(S,{get onpaneclick(){return e.onpaneclick},get onpanecontextmenu(){return e.onpanecontextmenu},get onselectionstart(){return e.onselectionstart},get onselectionend(){return e.onselectionend},get panOnDrag(){return m()},get paneClickDistance(){return n()},get selectionOnDrag(){return f()},get store(){return O},set store(g){O=g},children:(g,C)=>{var T=Mh(),D=de(T);Gp(D,{get store(){return O},set store(L){O=L},children:(L,q)=>{var j=Nh(),U=h(de(j),2);fh(U,{get onedgeclick(){return e.onedgeclick},get onedgecontextmenu(){return e.onedgecontextmenu},get onedgepointerenter(){return e.onedgepointerenter},get onedgepointerleave(){return e.onedgepointerleave},get store(){return O},set store(re){O=re}});var W=h(U,4);wh(W,{get type(){return w()},get LineComponent(){return e.connectionLineComponent},get containerStyle(){return e.connectionLineContainerStyle},get style(){return e.connectionLineStyle},get store(){return O},set store(re){O=re}});var J=h(W,2);rh(J,{get nodeClickDistance(){return a()},get onnodeclick(){return e.onnodeclick},get onnodecontextmenu(){return e.onnodecontextmenu},get onnodepointerenter(){return e.onnodepointerenter},get onnodepointermove(){return e.onnodepointermove},get onnodepointerleave(){return e.onnodepointerleave},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get store(){return O},set store(re){O=re}});var ae=h(J,2);gh(ae,{get onselectionclick(){return e.onselectionclick},get onselectioncontextmenu(){return e.onselectioncontextmenu},get onnodedrag(){return e.onnodedrag},get onnodedragstart(){return e.onnodedragstart},get onnodedragstop(){return e.onnodedragstop},get store(){return O},set store(re){O=re}}),ye(2),_(L,j)},$$slots:{default:!0}});var V=h(D,2);{let L=k(()=>!!(O.selectionRect&&O.selectionRectMode==="user")),q=k(()=>O.selectionRect?.width),j=k(()=>O.selectionRect?.height),U=k(()=>O.selectionRect?.x),W=k(()=>O.selectionRect?.y);sl(V,{get isVisible(){return r(L)},get width(){return r(q)},get height(){return r(j)},get x(){return r(U)},get y(){return r(W)}})}_(g,T)},$$slots:{default:!0}})},$$slots:{default:!0}});var K=h(B,2);zh(K,{get proOptions(){return e.proOptions},get position(){return e.attributionPosition}});var Z=h(K,2);Jp(Z,{get store(){return O}});var x=h(Z,2);Dt(x,()=>e.children??tr),_(M,b)},$$slots:{default:!0}}),Ce()}var Ih=P("");function Lr(t,e){let n=_n(e,["$$slots","$$events","$$legacy","class","bgColor","bgColorHover","color","colorHover","borderColor","onclick","children"]);var a=Ih();yn(a,()=>({type:"button",onclick:e.onclick,class:["svelte-flow__controls-button",e.class],...n,[ia]:{"--xy-controls-button-background-color-props":e.bgColor,"--xy-controls-button-background-color-hover-props":e.bgColorHover,"--xy-controls-button-color-props":e.color,"--xy-controls-button-color-hover-props":e.colorHover,"--xy-controls-button-border-color-props":e.borderColor}}));var o=d(a);Dt(o,()=>e.children??tr),c(a),_(t,a)}var Ah=ut('');function Dh(t){var e=Ah();_(t,e)}var Oh=ut('');function Rh(t){var e=Oh();_(t,e)}var Lh=ut('');function Hh(t){var e=Lh();_(t,e)}var Vh=ut('');function Fh(t){var e=Vh();_(t,e)}var Bh=ut('');function qh(t){var e=Bh();_(t,e)}var Kh=P(" ",1),jh=P(" ",1);function Zh(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-left"),a=pe(e,"orientation",3,"vertical"),o=pe(e,"showZoom",3,!0),i=pe(e,"showFitView",3,!0),s=pe(e,"showLock",3,!0),l=_n(e,["$$slots","$$events","$$legacy","position","orientation","showZoom","showFitView","showLock","style","class","buttonBgColor","buttonBgColorHover","buttonColor","buttonColorHover","buttonBorderColor","fitViewOptions","children","before","after"]),u=k(fn);const v={bgColor:e.buttonBgColor,bgColorHover:e.buttonBgColorHover,color:e.buttonColor,colorHover:e.buttonColorHover,borderColor:e.buttonBorderColor};let p=k(()=>r(u).nodesDraggable||r(u).nodesConnectable||r(u).elementsSelectable),m=k(()=>r(u).viewport.zoom<=r(u).minZoom),f=k(()=>r(u).viewport.zoom>=r(u).maxZoom),w=k(()=>r(u).ariaLabelConfig),N=k(()=>a()==="horizontal"?"horizontal":"vertical");const E=()=>{r(u).zoomIn()},I=()=>{r(u).zoomOut()},H=()=>{r(u).fitView(e.fitViewOptions)},O=()=>{let F=!r(p);r(u).nodesDraggable=F,r(u).nodesConnectable=F,r(u).elementsSelectable=F};{let F=k(()=>["svelte-flow__controls",r(N),e.class]);Do(t,Ze({get class(){return r(F)},get position(){return n()},"data-testid":"svelte-flow__controls",get"aria-label"(){return r(w)["controls.ariaLabel"]},get style(){return e.style}},()=>l,{children:(M,R)=>{var b=jh(),A=de(b);{var B=L=>{var q=Me(),j=de(q);Dt(j,()=>e.before),_(L,q)};Y(A,L=>{e.before&&L(B)})}var K=h(A,2);{var Z=L=>{var q=Kh(),j=de(q);Lr(j,Ze({onclick:E,class:"svelte-flow__controls-zoomin",get title(){return r(w)["controls.zoomIn.ariaLabel"]},get"aria-label"(){return r(w)["controls.zoomIn.ariaLabel"]},get disabled(){return r(f)}},()=>v,{children:(W,J)=>{Dh(W)},$$slots:{default:!0}}));var U=h(j,2);Lr(U,Ze({onclick:I,class:"svelte-flow__controls-zoomout",get title(){return r(w)["controls.zoomOut.ariaLabel"]},get"aria-label"(){return r(w)["controls.zoomOut.ariaLabel"]},get disabled(){return r(m)}},()=>v,{children:(W,J)=>{Rh(W)},$$slots:{default:!0}})),_(L,q)};Y(K,L=>{o()&&L(Z)})}var x=h(K,2);{var S=L=>{Lr(L,Ze({class:"svelte-flow__controls-fitview",onclick:H,get title(){return r(w)["controls.fitView.ariaLabel"]},get"aria-label"(){return r(w)["controls.fitView.ariaLabel"]}},()=>v,{children:(q,j)=>{Hh(q)},$$slots:{default:!0}}))};Y(x,L=>{i()&&L(S)})}var z=h(x,2);{var g=L=>{Lr(L,Ze({class:"svelte-flow__controls-interactive",onclick:O,get title(){return r(w)["controls.interactive.ariaLabel"]},get"aria-label"(){return r(w)["controls.interactive.ariaLabel"]}},()=>v,{children:(q,j)=>{var U=Me(),W=de(U);{var J=re=>{qh(re)},ae=re=>{Fh(re)};Y(W,re=>{r(p)?re(J):re(ae,!1)})}_(q,U)},$$slots:{default:!0}}))};Y(z,L=>{s()&&L(g)})}var C=h(z,2);{var T=L=>{var q=Me(),j=de(q);Dt(j,()=>e.children),_(L,q)};Y(C,L=>{e.children&&L(T)})}var D=h(C,2);{var V=L=>{var q=Me(),j=de(q);Dt(j,()=>e.after),_(L,q)};Y(D,L=>{e.after&&L(V)})}_(M,b)},$$slots:{default:!0}}))}Ce()}var cn;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(cn||(cn={}));var Yh=ut("");function Xh(t,e){var n=Yh();$(()=>{xe(n,"cx",e.radius),xe(n,"cy",e.radius),xe(n,"r",e.radius),De(n,0,Rn(["svelte-flow__background-pattern","dots",e.class]))}),_(t,n)}var Wh=ut("");function Gh(t,e){ze(e,!0);var n=Wh();$(()=>{xe(n,"stroke-width",e.lineWidth),xe(n,"d",`M${e.dimensions[0]/2} 0 V${e.dimensions[1]} M0 ${e.dimensions[1]/2} H${e.dimensions[0]}`),De(n,0,Rn(["svelte-flow__background-pattern",e.variant,e.class]))}),_(t,n),Ce()}const Uh={[cn.Dots]:1,[cn.Lines]:1,[cn.Cross]:6};var Qh=ut('');function Jh(t,e){ze(e,!0);let n=pe(e,"variant",19,()=>cn.Dots),a=pe(e,"gap",3,20),o=pe(e,"lineWidth",3,1),i=k(fn),s=k(()=>n()===cn.Dots),l=k(()=>n()===cn.Cross),u=k(()=>Array.isArray(a())?a():[a(),a()]),v=k(()=>`background-pattern-${r(i).flowId}-${e.id??""}`),p=k(()=>[r(u)[0]*r(i).viewport.zoom||1,r(u)[1]*r(i).viewport.zoom||1]),m=k(()=>(e.size??Uh[n()])*r(i).viewport.zoom),f=k(()=>r(l)?[r(m),r(m)]:r(p)),w=k(()=>r(s)?[r(m)/2,r(m)/2]:[r(f)[0]/2,r(f)[1]/2]);var N=Qh();let E;var I=d(N),H=d(I);{var O=R=>{{let b=k(()=>r(m)/2);Xh(R,{get radius(){return r(b)},get class(){return e.patternClass}})}},F=R=>{Gh(R,{get dimensions(){return r(f)},get variant(){return n()},get lineWidth(){return o()},get class(){return e.patternClass}})};Y(H,R=>{r(s)?R(O):R(F,!1)})}c(I);var M=h(I);c(N),$(()=>{De(N,0,Rn(["svelte-flow__background","svelte-flow__container",e.class])),E=st(N,"",E,{"--xy-background-color-props":e.bgColor,"--xy-background-pattern-color-props":e.patternColor}),xe(I,"id",r(v)),xe(I,"x",r(i).viewport.x%r(p)[0]),xe(I,"y",r(i).viewport.y%r(p)[1]),xe(I,"width",r(p)[0]),xe(I,"height",r(p)[1]),xe(I,"patternTransform",`translate(-${r(w)[0]},-${r(w)[1]})`),xe(M,"fill",`url(#${r(v)})`)}),_(t,N),Ce()}function $h(t){const e=k(fn),n=k(()=>r(e).nodeLookup),a=k(()=>r(e).nodes),o=k(()=>(r(a),r(n).get(t)));return{get current(){return r(o)}}}var eg=ut("");function tg(t,e){ze(e,!0);let n=pe(e,"borderRadius",3,5),a=pe(e,"strokeWidth",3,2),o=k(()=>$h(e.id)),i=k(()=>{if(!r(o).current)return{width:0,height:0,x:0,y:0};const{width:N,height:E}=xn(r(o).current);return{width:e.width??N,height:e.height??E,x:e.x??r(o).current.internals.positionAbsolute.x,y:e.y??r(o).current.internals.positionAbsolute.y}}),s=k(()=>r(i).width),l=k(()=>r(i).height),u=k(()=>r(i).x),v=k(()=>r(i).y);var p=Me(),m=de(p);{var f=N=>{const E=k(()=>e.nodeComponent);var I=Me(),H=de(I);un(H,()=>r(E),(O,F)=>{F(O,{get id(){return e.id},get x(){return r(u)},get y(){return r(v)},get width(){return r(s)},get height(){return r(l)},get borderRadius(){return n()},get class(){return e.class},get color(){return e.color},get shapeRendering(){return e.shapeRendering},get strokeColor(){return e.strokeColor},get strokeWidth(){return a()},get selected(){return e.selected}})}),_(N,I)},w=N=>{var E=eg();let I,H;$(()=>{I=De(E,0,Rn(["svelte-flow__minimap-node",e.class]),null,I,{selected:e.selected}),xe(E,"x",r(u)),xe(E,"y",r(v)),xe(E,"rx",n()),xe(E,"ry",n()),xe(E,"width",r(s)),xe(E,"height",r(l)),xe(E,"shape-rendering",e.shapeRendering),H=st(E,"",H,{fill:e.color,stroke:e.strokeColor,"stroke-width":a()})}),_(N,E)};Y(m,N=>{e.nodeComponent?N(f):N(w,!1)})}_(t,p),Ce()}function ng(t,e){const n=rp({domNode:t,panZoom:e.panZoom,getTransform:()=>{const{viewport:o}=e.store;return[o.x,o.y,o.zoom]},getViewScale:e.getViewScale});n.update({translateExtent:e.translateExtent,width:e.width,height:e.height,inversePan:e.inversePan,zoomStep:e.zoomStep,pannable:e.pannable,zoomable:e.zoomable});function a(o){n.update({translateExtent:o.translateExtent,width:o.width,height:o.height,inversePan:o.inversePan,zoomStep:o.zoomStep,pannable:o.pannable,zoomable:o.zoomable})}return{update:a,destroy(){n.destroy()}}}const Ba=t=>t instanceof Function?t:()=>t;var rg=ut(" "),ag=ut(''),og=P('',1);function sg(t,e){ze(e,!0);let n=pe(e,"position",3,"bottom-right"),a=pe(e,"nodeStrokeColor",3,"transparent"),o=pe(e,"nodeClass",3,""),i=pe(e,"nodeBorderRadius",3,5),s=pe(e,"nodeStrokeWidth",3,2),l=pe(e,"width",3,200),u=pe(e,"height",3,150),v=pe(e,"pannable",3,!0),p=pe(e,"zoomable",3,!0),m=_n(e,["$$slots","$$events","$$legacy","position","ariaLabel","nodeStrokeColor","nodeColor","nodeClass","nodeBorderRadius","nodeStrokeWidth","nodeComponent","bgColor","maskColor","maskStrokeColor","maskStrokeWidth","width","height","pannable","zoomable","inversePan","zoomStep","class"]),f=k(fn),w=k(()=>r(f).ariaLabelConfig);const N=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";let E=k(()=>`svelte-flow__minimap-desc-${r(f).flowId}`),I=k(()=>({x:-r(f).viewport.x/r(f).viewport.zoom,y:-r(f).viewport.y/r(f).viewport.zoom,width:r(f).width/r(f).viewport.zoom,height:r(f).height/r(f).viewport.zoom})),H=k(()=>Oi(xr(r(f).nodeLookup,{filter:C=>!C.hidden}),r(I))),O=k(()=>r(H).width/l()),F=k(()=>r(H).height/u()),M=k(()=>Math.max(r(O),r(F))),R=k(()=>r(M)*l()),b=k(()=>r(M)*u()),A=k(()=>5*r(M)),B=k(()=>r(H).x-(r(R)-r(H).width)/2-r(A)),K=k(()=>r(H).y-(r(b)-r(H).height)/2-r(A)),Z=k(()=>r(R)+r(A)*2),x=k(()=>r(b)+r(A)*2);const S=()=>r(M);var z=og(),g=de(z);{let C=k(()=>["svelte-flow__minimap",e.class]);lc(g,()=>({"--xy-minimap-background-color-props":e.bgColor})),Do(g.lastChild,Ze({get position(){return n()},get class(){return r(C)},"data-testid":"svelte-flow__minimap"},()=>m,{children:(T,D)=>{var V=Me(),L=de(V);{var q=j=>{var U=ag();let W;var J=d(U);{var ae=ne=>{var G=rg(),oe=d(G,!0);c(G),$(()=>{xe(G,"id",r(E)),X(oe,e.ariaLabel??r(w)["minimap.ariaLabel"])}),_(ne,G)};Y(J,ne=>{(e.ariaLabel??r(w)["minimap.ariaLabel"])&&ne(ae)})}var re=h(J);je(re,17,()=>r(f).nodes,ne=>ne.id,(ne,G)=>{const oe=k(()=>r(f).nodeLookup.get(r(G).id));var ee=Me(),se=de(ee);{var te=le=>{{let he=k(()=>e.nodeColor===void 0?void 0:Ba(e.nodeColor)(r(G))),ve=k(()=>Ba(a())(r(G))),fe=k(()=>Ba(o())(r(G)));tg(le,{get id(){return r(oe).id},get selected(){return r(oe).selected},get nodeComponent(){return e.nodeComponent},get color(){return r(he)},get borderRadius(){return i()},get strokeColor(){return r(ve)},get strokeWidth(){return s()},get shapeRendering(){return N},get class(){return r(fe)}})}},ue=k(()=>r(oe)&&Ri(r(oe))&&!r(oe).hidden);Y(se,le=>{r(ue)&&le(te)})}_(ne,ee)});var ie=h(re);c(U),zt(U,(ne,G)=>ng?.(ne,G),()=>({store:r(f),panZoom:r(f).panZoom,getViewScale:S,translateExtent:r(f).translateExtent,width:r(f).width,height:r(f).height,inversePan:e.inversePan,zoomStep:e.zoomStep,pannable:v(),zoomable:p()})),$(()=>{xe(U,"width",l()),xe(U,"height",u()),xe(U,"viewBox",`${r(B)??""} ${r(K)??""} ${r(Z)??""} ${r(x)??""}`),xe(U,"aria-labelledby",r(E)),W=st(U,"",W,{"--xy-minimap-mask-background-color-props":e.maskColor,"--xy-minimap-mask-stroke-color-props":e.maskStrokeColor,"--xy-minimap-mask-stroke-width-props":e.maskStrokeWidth?e.maskStrokeWidth*r(M):void 0}),xe(ie,"d",`M${r(B)-r(A)},${r(K)-r(A)}h${r(Z)+r(A)*2}v${r(x)+r(A)*2}h${-r(Z)-r(A)*2}z - M${r(I).x??""},${r(I).y??""}h${r(I).width??""}v${r(I).height??""}h${-r(I).width}z`)}),_(j,U)};Y(L,j=>{r(f).panZoom&&j(q)})}_(T,V)},$$slots:{default:!0}})),c(g)}_(t,z),Ce()}var ig=P(' '),lg=P(''),cg=P(''),dg=P(''),ug=P('
    '),vg=P('

    '),fg=P('
    Exec In
    Exec Out
    ');function pg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>!!e.data.multimodal?.vision_enabled),o=Q(!1);_e(()=>{if(r(n)==="complete"){y(o,!0);const D=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(D)}else y(o,!1)});var i=fg();let s;var l=d(i),u=d(l),v=d(u),p=d(v);{var m=D=>{var V=ig(),L=d(V,!0);c(V),$(()=>X(L,e.data.model)),_(D,V)};Y(p,D=>{e.data.model&&D(m)})}var f=h(p,2);{var w=D=>{var V=lg(),L=d(V);Wr(L,{size:10}),c(V),_(D,V)};Y(f,D=>{r(a)&&D(w)})}c(v);var N=h(v,2),E=d(N);uo(E,{size:11}),c(N),c(u);var I=h(u,2),H=d(I);let O;var F=h(H,2);cr(F,{size:14});var M=h(F,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=cg(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),_(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=dg(),L=d(V);Rt(L,{size:13}),c(V),_(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(I),c(l);var Z=h(l,2),x=h(d(Z),2);{var S=D=>{var V=ug(),L=d(V);c(V),$((q,j)=>X(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),_(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2);{var g=D=>{var V=vg(),L=h(d(V),2),q=d(L,!0);c(L),c(V),$(()=>X(q,e.data.instructions)),_(D,V)};Y(z,D=>{e.data.instructions&&D(g)})}c(Z);var C=h(Z,2);$e(C,{type:"target",get position(){return we.Left}});var T=h(C,2);$e(T,{type:"source",get position(){return we.Right}}),c(i),$(()=>{s=De(i,1,"agent-node svelte-uofr5c",null,s,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),O=De(H,1,"status-dot svelte-uofr5c",null,O,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),X(R,e.data.label||"Agent")}),_(t,i),Ce()}var hg=P(''),gg=P(''),mg=P('
    tool
    '),_g=P('
    '),yg=P('
    timeout
    '),bg=P('
    Exec In
    Exec Out
    ');function xg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const x=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(x)}else y(a,!1)});var o=bg();let i;var s=d(o),l=d(s),u=d(l);let v;var p=h(u,2),m=d(p);Xn(m,{size:13}),c(p);var f=h(p,2),w=d(f,!0);c(f);var N=h(f,2);{var E=x=>{var S=hg(),z=d(S);Kt(z,{size:12}),c(S),jt(3,S,()=>Zt,()=>({duration:200,start:.6})),_(x,S)};Y(N,x=>{r(a)&&x(E)})}var I=h(N,2);{var H=x=>{var S=gg(),z=d(S);Rt(z,{size:12}),c(S),_(x,S)};Y(I,x=>{r(n)==="error"&&x(H)})}c(l),c(s);var O=h(s,2),F=h(d(O),2);{var M=x=>{var S=mg(),z=h(d(S)),g=d(z,!0);c(z),c(S),$(()=>X(g,e.data.tool_name)),_(x,S)};Y(F,x=>{e.data.tool_name&&x(M)})}var R=h(F,2);{var b=x=>{var S=_g(),z=d(S);c(S),$((g,C)=>X(z,`${g??""}${C??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),_(x,S)};Y(R,x=>{e.data.description&&x(b)})}var A=h(R,2);{var B=x=>{var S=yg(),z=h(d(S)),g=d(z);c(z),c(S),$(()=>X(g,`${e.data.timeout??""}s`)),_(x,S)};Y(A,x=>{e.data.timeout&&x(B)})}c(O);var K=h(O,2);$e(K,{type:"target",get position(){return we.Left}});var Z=h(K,2);$e(Z,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"tool-node svelte-107d6w1",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-107d6w1",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),X(w,e.data.label||"Tool")}),_(t,o),Ce()}var wg=P(''),kg=P(''),Sg=P('
    '),zg=P('
    '),Cg=P('
    Max Steps
    '),Eg=P('
    Exec In
    Exec Out
    ');function Ng(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const x=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(x)}else y(a,!1)});var o=Eg();let i;var s=d(o),l=d(s),u=d(l);let v;var p=h(u,2),m=d(p);Zr(m,{size:14}),c(p);var f=h(p,2),w=d(f,!0);c(f);var N=h(f,2);{var E=x=>{var S=wg(),z=d(S);Kt(z,{size:12}),c(S),jt(3,S,()=>Zt,()=>({duration:200,start:.6})),_(x,S)};Y(N,x=>{r(a)&&x(E)})}var I=h(N,2);{var H=x=>{var S=kg(),z=d(S);Rt(z,{size:12}),c(S),_(x,S)};Y(I,x=>{r(n)==="error"&&x(H)})}c(l);var O=h(l,2);{var F=x=>{var S=Sg(),z=d(S,!0);c(S),$(()=>X(z,e.data.pattern)),_(x,S)};Y(O,x=>{e.data.pattern&&x(F)})}c(s);var M=h(s,2),R=h(d(M),2);{var b=x=>{var S=zg(),z=d(S);c(S),$((g,C)=>X(z,`${g??""}${C??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),_(x,S)};Y(R,x=>{e.data.description&&x(b)})}var A=h(R,2);{var B=x=>{var S=Cg(),z=h(d(S),2),g=d(z,!0);c(z),c(S),$(()=>X(g,e.data.maxSteps)),_(x,S)};Y(A,x=>{e.data.maxSteps&&x(B)})}c(M);var K=h(M,2);$e(K,{type:"target",get position(){return we.Left}});var Z=h(K,2);$e(Z,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"reason-node svelte-15a1m3",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-15a1m3",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),X(w,e.data.label||"Reasoning")}),_(t,o),Ce()}var Mg=P(''),Pg=P(''),Tg=P('
    '),Ig=P('
    '),Ag=P('
    In
    True
    False
    ');function Dg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const K=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(K)}else y(a,!1)});var o=Ag();let i;var s=d(o),l=h(d(s),2),u=d(l);let v;var p=h(u,2);dr(p,{size:13});var m=h(p,2),f=d(m,!0);c(m);var w=h(m,2);{var N=K=>{var Z=Mg(),x=d(Z);Kt(x,{size:12}),c(Z),jt(3,Z,()=>Zt,()=>({duration:200,start:.6})),_(K,Z)};Y(w,K=>{r(a)&&K(N)})}var E=h(w,2);{var I=K=>{var Z=Pg(),x=d(Z);Rt(x,{size:12}),c(Z),_(K,Z)};Y(E,K=>{r(n)==="error"&&K(I)})}c(l),c(s);var H=h(s,2),O=d(H);{var F=K=>{var Z=Tg(),x=d(Z),S=d(x,!0);c(x),c(Z),$(()=>X(S,e.data.condition)),_(K,Z)};Y(O,K=>{e.data.condition&&K(F)})}var M=h(O,2);{var R=K=>{var Z=Ig(),x=d(Z);c(Z),$((S,z)=>X(x,`${S??""}${z??""}`),[()=>String(e.data.description).slice(0,60),()=>String(e.data.description).length>60?"…":""]),_(K,Z)};Y(M,K=>{e.data.description&&K(R)})}ye(2),c(H);var b=h(H,2);$e(b,{type:"target",get position(){return we.Left}});var A=h(b,2);$e(A,{type:"source",get position(){return we.Right},id:"true",style:"top: 35%;"});var B=h(A,2);$e(B,{type:"source",get position(){return we.Right},id:"false",style:"top: 65%;"}),c(o),$(()=>{i=De(o,1,"cond-node svelte-9dvt8o",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),v=De(u,1,"status-dot svelte-9dvt8o",null,v,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(a)}),X(f,e.data.label||"Condition")}),_(t,o),Ce()}var Og=P(''),Rg=P(''),Lg=P('
    action
    '),Hg=P('
    namespace
    '),Vg=P('
    Exec In
    Exec Out
    ');function Fg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const R=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(R)}else y(a,!1)});var o=Vg();let i;var s=d(o),l=d(s);co(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Og(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),_(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=Rg(),A=d(b);Rt(A,{size:12}),c(b),_(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Lg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.memory_action)),_(R,b)};Y(E,R=>{e.data.memory_action&&R(I)})}var H=h(E,2);{var O=R=>{var b=Hg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.namespace)),_(R,b)};Y(H,R=>{e.data.namespace&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-mcwl9o",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Memory")}),_(t,o),Ce()}var Bg=P(''),qg=P(''),Kg=P('
    rule
    '),jg=P('
    on_fail
    '),Zg=P('
    Exec In
    Exec Out
    ');function Yg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const R=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(R)}else y(a,!1)});var o=Zg();let i;var s=d(o),l=d(s);vo(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Bg(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),_(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=qg(),A=d(b);Rt(A,{size:12}),c(b),_(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Kg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.validation_rule)),_(R,b)};Y(E,R=>{e.data.validation_rule&&R(I)})}var H=h(E,2);{var O=R=>{var b=jg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.fail_action)),_(R,b)};Y(H,R=>{e.data.fail_action&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-1y5xb8x",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Validator")}),_(t,o),Ce()}var Xg=P(''),Wg=P(''),Gg=P('
    desc
    '),Ug=P('
    code
    '),Qg=P('
    In
    Out
    ');function Jg(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const R=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(R)}else y(a,!1)});var o=Qg();let i;var s=d(o),l=d(s);la(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=R=>{var b=Xg(),A=d(b);Kt(A,{size:12}),c(b),jt(3,b,()=>Zt,()=>({duration:200,start:.6})),_(R,b)};Y(p,R=>{r(a)&&R(m)})}var f=h(p,2);{var w=R=>{var b=Wg(),A=d(b);Rt(A,{size:12}),c(b),_(R,b)};Y(f,R=>{r(n)==="error"&&R(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=R=>{var b=Gg(),A=h(d(b)),B=d(A,!0);c(A),c(b),$(()=>X(B,e.data.description)),_(R,b)};Y(E,R=>{e.data.description&&R(I)})}var H=h(E,2);{var O=R=>{var b=Ug(),A=h(d(b)),B=d(A);c(A),c(b),$((K,Z)=>X(B,`${K??""}${Z??""}`),[()=>String(e.data.code).split(` -`)[0].slice(0,30),()=>String(e.data.code).length>30?"...":""]),_(R,b)};Y(H,R=>{e.data.code&&R(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-1ebq9zd",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Code")}),_(t,o),Ce()}var $g=P(''),em=P(''),tm=P('
    split
    '),nm=P('
    max
    '),rm=P('
    In
    Out 1
    Out 2
    ');function am(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const b=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(b)}else y(a,!1)});var o=rm();let i;var s=d(o),l=d(s);fo(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=b=>{var A=$g(),B=d(A);Kt(B,{size:12}),c(A),jt(3,A,()=>Zt,()=>({duration:200,start:.6})),_(b,A)};Y(p,b=>{r(a)&&b(m)})}var f=h(p,2);{var w=b=>{var A=em(),B=d(A);Rt(B,{size:12}),c(A),_(b,A)};Y(f,b=>{r(n)==="error"&&b(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=b=>{var A=tm(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>X(K,e.data.split_expression)),_(b,A)};Y(E,b=>{e.data.split_expression&&b(I)})}var H=h(E,2);{var O=b=>{var A=nm(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>X(K,e.data.max_concurrent)),_(b,A)};Y(H,b=>{e.data.max_concurrent&&b(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left}});var M=h(F,2);$e(M,{type:"source",get position(){return we.Right},id:"out-1",style:"top: 33%;"});var R=h(M,2);$e(R,{type:"source",get position(){return we.Right},id:"out-2",style:"top: 66%;"}),c(o),$(()=>{i=De(o,1,"bp-node svelte-5h9d64",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Fan Out")}),_(t,o),Ce()}var om=P(''),sm=P(''),im=P('
    merge
    '),lm=P('
    timeout
    '),cm=P('
    In 1
    In 2
    Out
    ');function dm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=Q(!1);_e(()=>{if(r(n)==="complete"){y(a,!0);const b=setTimeout(()=>{y(a,!1)},3e3);return()=>clearTimeout(b)}else y(a,!1)});var o=cm();let i;var s=d(o),l=d(s);po(l,{size:12});var u=h(l,2),v=d(u,!0);c(u);var p=h(u,2);{var m=b=>{var A=om(),B=d(A);Kt(B,{size:12}),c(A),jt(3,A,()=>Zt,()=>({duration:200,start:.6})),_(b,A)};Y(p,b=>{r(a)&&b(m)})}var f=h(p,2);{var w=b=>{var A=sm(),B=d(A);Rt(B,{size:12}),c(A),_(b,A)};Y(f,b=>{r(n)==="error"&&b(w)})}c(s);var N=h(s,2),E=h(d(N),2);{var I=b=>{var A=im(),B=h(d(A)),K=d(B,!0);c(B),c(A),$(()=>X(K,e.data.merge_expression)),_(b,A)};Y(E,b=>{e.data.merge_expression&&b(I)})}var H=h(E,2);{var O=b=>{var A=lm(),B=h(d(A)),K=d(B);c(B),c(A),$(()=>X(K,`${e.data.merge_timeout??""}s`)),_(b,A)};Y(H,b=>{e.data.merge_timeout&&b(O)})}c(N);var F=h(N,2);$e(F,{type:"target",get position(){return we.Left},id:"in-1",style:"top: 33%;"});var M=h(F,2);$e(M,{type:"target",get position(){return we.Left},id:"in-2",style:"top: 66%;"});var R=h(M,2);$e(R,{type:"source",get position(){return we.Right}}),c(o),$(()=>{i=De(o,1,"bp-node svelte-k2gv2h",null,i,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(v,e.data.label||"Fan In")}),_(t,o),Ce()}var um=P(''),vm=P(''),fm=P('
    '),pm=P('
    Exec Out

    ');function hm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>e.data.trigger_type??"Manual"),o=Q(!1),i=k(()=>()=>{switch(r(a).toLowerCase()){case"http":return e.data.endpoint?`${e.data.method??"POST"} ${e.data.endpoint}`:"HTTP endpoint";case"queue":return e.data.queue_name?`Queue: ${e.data.queue_name}`:"Message queue";case"schedule":return e.data.cron?`Cron: ${e.data.cron}`:"Scheduled trigger";case"file":return e.data.watch_path?`Watch: ${e.data.watch_path}`:"File watcher";default:return"Manual execution"}});_e(()=>{if(r(n)==="complete"){y(o,!0);const D=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(D)}else y(o,!1)});var s=pm();let l;var u=d(s),v=d(u),p=d(v),m=d(p),f=d(m,!0);c(m),c(p);var w=h(p,2),N=d(w);uo(N,{size:11}),c(w),c(v);var E=h(v,2),I=d(E);let H;var O=h(I,2),F=d(O);Zs(F,{size:14}),c(O);var M=h(O,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=um(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),_(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=vm(),L=d(V);Rt(L,{size:13}),c(V),_(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(E),c(u);var Z=h(u,2),x=h(d(Z),2);{var S=D=>{var V=fm(),L=d(V);c(V),$((q,j)=>X(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),_(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2),g=h(d(z),2),C=d(g,!0);c(g),c(z),c(Z);var T=h(Z,2);$e(T,{type:"source",get position(){return we.Right}}),c(s),$(D=>{l=De(s,1,"input-node svelte-170rmgf",null,l,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(f,r(a)),H=De(I,1,"status-dot svelte-170rmgf",null,H,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),X(R,e.data.label||"Input"),X(C,D)},[()=>r(i)()]),_(t,s),Ce()}var gm=P(''),mm=P(''),_m=P('
    '),ym=P('
    Exec In

    ');function bm(t,e){ze(e,!0);let n=k(()=>e.data._executionState??"idle"),a=k(()=>e.data.destination_type??"Response"),o=Q(!1),i=k(()=>()=>{switch(r(a).toLowerCase()){case"response":return e.data.format?`Format: ${e.data.format}`:"Direct response";case"queue":return e.data.queue_name?`Queue: ${e.data.queue_name}`:"Message queue";case"webhook":return e.data.webhook_url?`URL: ${e.data.webhook_url}`:"Webhook delivery";case"store":return e.data.store_path?`Path: ${e.data.store_path}`:"Persistent store";default:return"Output destination"}});_e(()=>{if(r(n)==="complete"){y(o,!0);const D=setTimeout(()=>{y(o,!1)},3e3);return()=>clearTimeout(D)}else y(o,!1)});var s=ym();let l;var u=d(s),v=d(u),p=d(v),m=d(p),f=d(m,!0);c(m),c(p);var w=h(p,2),N=d(w);uo(N,{size:11}),c(w),c(v);var E=h(v,2),I=d(E);let H;var O=h(I,2),F=d(O);ca(F,{size:14}),c(O);var M=h(O,2),R=d(M,!0);c(M);var b=h(M,2);{var A=D=>{var V=gm(),L=d(V);Kt(L,{size:13}),c(V),jt(3,V,()=>Zt,()=>({duration:200,start:.6})),_(D,V)};Y(b,D=>{r(o)&&D(A)})}var B=h(b,2);{var K=D=>{var V=mm(),L=d(V);Rt(L,{size:13}),c(V),_(D,V)};Y(B,D=>{r(n)==="error"&&D(K)})}c(E),c(u);var Z=h(u,2),x=h(d(Z),2);{var S=D=>{var V=_m(),L=d(V);c(V),$((q,j)=>X(L,`${q??""}${j??""}`),[()=>String(e.data.description).slice(0,80),()=>String(e.data.description).length>80?"…":""]),_(D,V)};Y(x,D=>{e.data.description&&D(S)})}var z=h(x,2),g=h(d(z),2),C=d(g,!0);c(g),c(z),c(Z);var T=h(Z,2);$e(T,{type:"target",get position(){return we.Left}}),c(s),$(D=>{l=De(s,1,"output-node svelte-198t6xy",null,l,{"exec-running":r(n)==="running","exec-complete":r(n)==="complete","exec-error":r(n)==="error"}),X(f,r(a)),H=De(I,1,"status-dot svelte-198t6xy",null,H,{"dot-idle":r(n)==="idle","dot-running":r(n)==="running","dot-error":r(n)==="error","dot-complete":r(n)==="complete"||r(o)}),X(R,e.data.label||"Output"),X(C,D)},[()=>r(i)()]),_(t,s),Ce()}var xm=P(" ",1),wm=P('
    Nodes
    Agents
    Tools
    Links
    '),km=P('

    Start building your pipeline

    Click components in the left panel to add them, or press Cmd+K to search

    '),Sm=P('
    ');function zm(t,e){ze(e,!0);const n=()=>at(an,"$nodes",o),a=()=>at(Mn,"$edges",o),[o,i]=Ot(),s={input:hm,output:bm,agent:pg,tool:xg,reasoning:Ng,condition:Dg,memory:Fg,validator:Yg,custom_code:Jg,fan_out:am,fan_in:dm};let l=k(()=>n().length===0),u=k(()=>n().length),v=k(()=>n().filter(O=>O.type==="agent").length),p=k(()=>n().filter(O=>O.type==="tool").length),m=k(()=>a().length);var f=Sm(),w=d(f);Th(w,{get nodeTypes(){return s},fitView:!0,colorMode:"dark",defaultEdgeOptions:{type:"smoothstep",animated:!0,style:"stroke: #cbd5e1; stroke-width: 2.5px;"},onnodeclick:({node:O})=>mn.set(O.id),onpaneclick:()=>mn.set(null),get nodes(){return Yo(),n()},set nodes(O){Zo(an,O)},get edges(){return Yo(),a()},set edges(O){Zo(Mn,O)},children:(O,F)=>{var M=xm(),R=de(M);Zh(R,{position:"bottom-left"});var b=h(R,2);sg(b,{position:"bottom-right"});var A=h(b,2);Jh(A,{get variant(){return cn.Dots},gap:24,size:1,color:"#2a2a3a"}),_(O,M)},$$slots:{default:!0}});var N=h(w,2);{var E=O=>{var F=wm(),M=d(F),R=d(M);uc(R,{size:12});var b=h(R,4),A=d(b,!0);c(b),c(M);var B=h(M,4),K=d(B);cr(K,{size:12});var Z=h(K,4),x=d(Z,!0);c(Z),c(B);var S=h(B,4),z=d(S);Xn(z,{size:12});var g=h(z,4),C=d(g,!0);c(g),c(S);var T=h(S,4),D=d(T);vc(D,{size:12});var V=h(D,4),L=d(V,!0);c(V),c(T),c(F),$(()=>{X(A,r(u)),X(x,r(v)),X(C,r(p)),X(L,r(m))}),_(O,F)};Y(N,O=>{r(l)||O(E)})}var I=h(N,2);{var H=O=>{var F=km(),M=d(F),R=d(M);Pc(R,{size:40}),ye(4),c(M),c(F),_(O,F)};Y(I,O=>{r(l)&&O(H)})}c(f),_(t,f),Ce(),i()}var Cm=P(''),Em=P(''),Nm=P(''),Mm=P(''),Pm=P(""),Tm=P(' ',1),Im=P(''),Am=P('
    ');function Ne(t,e){ze(e,!0);let n=pe(e,"type",3,"text"),a=pe(e,"value",15,""),o=pe(e,"placeholder",3,""),i=pe(e,"options",19,()=>[]);const s=Math.random().toString(36).slice(2,8);let l=k(()=>`field-${(e.label??"input").replace(/\s+/g,"-").toLowerCase()}-${s}`),u=k(()=>`dl-${(e.label??"input").replace(/\s+/g,"-").toLowerCase()}-${s}`);function v(F){const M=F.target;M.style.height="auto",M.style.height=M.scrollHeight+"px"}var p=Am(),m=d(p),f=d(m,!0);c(m);var w=h(m,2);{var N=F=>{var M=Cm();Bl(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),be("input",M,v),on(M,a),_(F,M)},E=F=>{var M=Em();Ct(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),on(M,a),_(F,M)},I=F=>{var M=Mm();je(M,21,i,wt,(R,b)=>{var A=Nm(),B=d(A,!0);c(A);var K={};$(()=>{X(B,r(b)),K!==(K=r(b))&&(A.value=(A.__value=r(b))??"")}),_(R,A)}),c(M),$(()=>xe(M,"id",r(l))),ql(M,a),_(F,M)},H=F=>{var M=Tm(),R=de(M);Ct(R);var b=h(R,2);je(b,21,i,wt,(A,B)=>{var K=Pm(),Z={};$(()=>{Z!==(Z=r(B))&&(K.value=(K.__value=r(B))??"")}),_(A,K)}),c(b),$(()=>{xe(R,"id",r(l)),xe(R,"placeholder",o()),xe(R,"list",r(u)),xe(b,"id",r(u))}),on(R,a),_(F,M)},O=F=>{var M=Im();Ct(M),$(()=>{xe(M,"id",r(l)),xe(M,"placeholder",o())}),on(M,a),_(F,M)};Y(w,F=>{n()==="textarea"?F(N):n()==="number"?F(E,1):n()==="select"?F(I,2):n()==="datalist"?F(H,3):F(O,!1)})}c(p),$(()=>{xe(m,"for",r(l)),X(f,e.label)}),_(t,p),Ce()}_t(["input"]);const il=[{id:"calculator",name:"Calculator",description:"Safe mathematical expression evaluator. Supports arithmetic, functions (sqrt, sin, cos, log, etc.), and constants (pi, e).",category:"Utility",tags:["math","calculator","utility"],parameters:[{name:"expression",type:"string",description:"Math expression to evaluate",required:!0}]},{id:"datetime",name:"Date & Time",description:"Current date/time information with timezone support.",category:"Utility",tags:["datetime","utility"],parameters:[{name:"action",type:"select",description:"What to retrieve",required:!0,options:["now","date","time","timestamp","timezones"]},{name:"timezone",type:"string",description:"IANA timezone (e.g. America/New_York)",required:!1,default:"UTC"},{name:"format",type:"string",description:"strftime format string",required:!1}]},{id:"filesystem",name:"File System",description:"Read, write, and list files. Sandboxed to a base directory with path-traversal protection.",category:"I/O",tags:["filesystem","io"],parameters:[{name:"action",type:"select",description:"File operation",required:!0,options:["read","write","list"]},{name:"path",type:"string",description:"File or directory path",required:!0},{name:"content",type:"string",description:"Content to write (for write action)",required:!1}]},{id:"http",name:"HTTP Client",description:"Make HTTP requests with connection pooling. Supports GET, POST, PUT, DELETE.",category:"Web",tags:["http","web"],parameters:[{name:"url",type:"string",description:"Target URL",required:!0},{name:"method",type:"select",description:"HTTP method",required:!1,default:"GET",options:["GET","POST","PUT","DELETE","PATCH"]},{name:"body",type:"string",description:"Request body (JSON)",required:!1},{name:"headers",type:"string",description:"Request headers (JSON)",required:!1}]},{id:"json",name:"JSON",description:"Parse, validate, extract, and format JSON data. Supports dot-path extraction.",category:"Utility",tags:["json","utility"],parameters:[{name:"action",type:"select",description:"JSON operation",required:!0,options:["parse","validate","extract","format","keys"]},{name:"data",type:"string",description:"JSON data to process",required:!0},{name:"path",type:"string",description:"Dot-path for extraction (e.g. address.city)",required:!1}]},{id:"text",name:"Text Processing",description:"Count, extract, truncate, replace, and split text using regex patterns.",category:"Utility",tags:["text","utility"],parameters:[{name:"action",type:"select",description:"Text operation",required:!0,options:["count","extract","truncate","replace","split"]},{name:"text",type:"string",description:"Input text",required:!0},{name:"pattern",type:"string",description:"Regex pattern (for extract/replace/split)",required:!1},{name:"replacement",type:"string",description:"Replacement string (for replace)",required:!1}]},{id:"shell",name:"Shell",description:"Execute shell commands from an explicit allowlist. Sandboxed for safety.",category:"System",tags:["shell","system"],parameters:[{name:"command",type:"string",description:"Command to execute (must be in allowlist)",required:!0}]},{id:"search",name:"Search",description:"Web search tool (abstract -- requires implementation of _search method).",category:"Web",tags:["search","web"],parameters:[{name:"query",type:"string",description:"Search query",required:!0}]},{id:"database",name:"Database",description:"Execute SQL queries (abstract -- requires implementation). Read-only by default with SQL injection detection.",category:"I/O",tags:["database","sql"],parameters:[{name:"query",type:"string",description:"SQL query (SELECT/WITH only in read-only mode)",required:!0},{name:"params",type:"string",description:"Query parameters (JSON)",required:!1}]}];function Dm(t){return il.find(e=>e.id===t)}const ll=[{id:"react",name:"ReAct",description:"Reason-Act-Observe loop. The agent thinks, takes an action (tool call), observes the result, and repeats until done.",defaultMaxSteps:10,bestFor:"Tasks requiring tool interaction and iterative problem-solving",configKeys:["max_steps"]},{id:"chain_of_thought",name:"Chain of Thought",description:"Step-by-step reasoning without actions. The agent breaks down the problem into logical steps and thinks through each one.",defaultMaxSteps:10,bestFor:"Pure logic, analysis, and reasoning tasks without tool needs",configKeys:["max_steps"]},{id:"plan_and_execute",name:"Plan & Execute",description:"Generates a multi-step plan first, then executes each step sequentially. Can replan on failure.",defaultMaxSteps:15,bestFor:"Complex multi-step tasks that benefit from upfront planning",configKeys:["max_steps","allow_replan"]},{id:"reflexion",name:"Reflexion",description:"Execute-Critique-Retry loop. Generates output, critiques it for quality, and retries with feedback if unsatisfactory.",defaultMaxSteps:5,bestFor:"Quality-sensitive outputs that benefit from self-review",configKeys:["max_steps"]},{id:"tree_of_thoughts",name:"Tree of Thoughts",description:"Generates multiple solution branches, evaluates each with a score, and selects the best. Explores the solution space broadly.",defaultMaxSteps:3,bestFor:"Creative and exploratory problems with multiple valid approaches",configKeys:["branching_factor","max_depth"]},{id:"goal_decomposition",name:"Goal Decomposition",description:"Breaks a large goal into phases and tasks, then executes each task. Can delegate sub-tasks to other patterns.",defaultMaxSteps:20,bestFor:"Large ambiguous goals that need structured decomposition",configKeys:["max_steps","task_pattern"]}];function Om(t){return ll.find(e=>e.id===t)}var Rm=P('

    Exposes an HTTP endpoint that triggers this pipeline when called.

    ',1),Lm=P(" ",1),Hm=P('

    Runs the pipeline on a schedule using standard cron syntax.

    ',1),Vm=P(" ",1),Fm=P('

    Manual trigger. Run the pipeline via the Run button or API call.

    '),Bm=P(" ",1),qm=P(" ",1),Km=P(" ",1),jm=P('

    Returns the pipeline output as an API response.

    '),Zm=P(" ",1),Ym=P('
    Accepted file types
    Max file size
    Image detail
    '),Xm=P('
    ',1),Wm=P('
    '),Gm=P('
    '),Um=P('

    '),Qm=P('

    Custom tool. Define the tool name as registered in the framework tool registry.

    '),Jm=P(" ",1),$m=P('

    '),e1=P(" ",1),t1=P('

    Routes flow based on a key in the pipeline context. Connect the True and False handles to different downstream nodes. Use configure_node to set branches as a JSON dict mapping values to paths.

    ',1),n1=P('

    Saves the current pipeline state/output to memory for later retrieval.

    '),r1=P('

    Loads previously saved state from memory and injects it into the pipeline context.

    '),a1=P('

    Wipes all stored memory. Use with caution.

    '),o1=P('

    Select an action: store saves data, retrieve loads it, clear wipes memory.

    '),s1=P('
    ',1),i1=P('

    Ensures the output is not empty, null, or blank.

    '),l1=P('

    Validates that the output is a string type.

    '),c1=P('

    Validates that the output is a list/array.

    '),d1=P('

    Validates that the output is a dictionary/object.

    '),u1=P('

    Custom validation rule. Define the rule key as registered in the framework.

    '),v1=P('

    Select a validation rule to apply to the pipeline output before passing downstream.

    '),f1=P('
    ',1),p1=P('

    Must define: async def execute(context, inputs) -> Any

    ',1),h1=P('

    Splits a single input into multiple items for parallel processing across downstream branches.

    ',1),g1=P('

    Concatenates all branch results into a single string.

    '),m1=P('

    Collects all branch results into a list.

    '),_1=P('

    Merges results from parallel branches back into a single output.

    '),y1=P('
    ',1),b1=P(''),x1=P('
    Inputs
    '),w1=P(''),k1=P('
    Outputs
    '),S1=P('
    Connections
    '),z1=P('');function C1(t,e){ze(e,!0);const n=()=>at(Kl,"$selectedNode",s),a=()=>at(Mn,"$edges",s),o=()=>at(an,"$nodes",s),i=()=>at(mn,"$selectedNodeId",s),[s,l]=Ot(),u=[],v={input:Zs,output:ca,agent:cr,tool:Xn,reasoning:Zr,condition:Xs,memory:co,validator:vo,custom_code:la,fan_out:fo,fan_in:po},p={input:"#10b981",output:"#3b82f6",agent:"#6366f1",tool:"#8b5cf6",reasoning:"#ec4899",condition:"#06b6d4",memory:"#06b6d4",validator:"#f59e0b",custom_code:"#3b82f6",fan_out:"#8888a0",fan_in:"#8888a0"},m={input:"Input",output:"Output",agent:"Agent",tool:"Tool",reasoning:"Reasoning",condition:"Condition",memory:"Memory",validator:"Validator",custom_code:"Custom Code",fan_out:"Fan Out",fan_in:"Fan In"},f=ll.map(ce=>ce.id),w=["custom",...il.map(ce=>ce.id)];let N=k(()=>Om(r(R))),E=k(()=>Dm(r(j))),I=Q(""),H=Q(""),O=Q(""),F=Q(""),M=Q(""),R=Q(""),b=Q(""),A=Q(""),B=Q(""),K=Q(""),Z=Q(""),x=Q(""),S=Q(""),z=Q(""),g=Q(""),C=Q(""),T=Q(""),D=Q(""),V=Q(""),L=Q(""),q=Q(""),j=Q(""),U=Q(""),W=Q(""),J=Q(""),ae=Q(""),re=Q("manual"),ie=Q("response"),ne=Q("kafka"),G=Q(""),oe=Q(""),ee=Q(""),se=Q("UTC"),te=Q("POST"),ue=Q(!1),le=Q("*/*"),he=Q("50"),ve=Q(""),fe=Q("file"),ke=Q(""),Ae=Q(""),ge=Q(!1),Oe=Q(!0),Ye=Q(!1),We=Q(!1),it=Q(10),Ge=Q("auto"),ct=Q(null),Nt=!1,gt=k(()=>n()?a().filter(ce=>ce.target===n().id):[]),dt=k(()=>n()?a().filter(ce=>ce.source===n().id):[]);function xt(ce){const Ie=o().find(rt=>rt.id===ce);return Ie?.data?.label||Ie?.id||ce}_e(()=>{const ce=n();ce&&ce.id!==r(ct)&&(Nt=!0,y(ct,ce.id,!0),Qt(()=>{y(I,ce.data.label??"",!0),y(H,ce.data.model??"",!0),y(O,ce.data.instructions??"",!0),y(F,ce.data.description??"",!0),y(M,ce.data.timeout!=null?String(ce.data.timeout):"",!0),y(R,ce.data.pattern??"",!0),y(b,ce.data.maxSteps!=null?String(ce.data.maxSteps):"",!0),y(A,ce.data.condition??"",!0),y(B,ce.data.backend??"",!0),y(K,ce.data.connection_string??"",!0),y(Z,ce.data.namespace??"",!0),y(x,ce.data.schema_type??"",!0),y(S,ce.data.validation_rules??"",!0),y(z,ce.data.fail_action??"",!0),y(g,ce.data.code??"",!0),y(C,ce.data.strategy??"",!0),y(T,ce.data.max_concurrent!=null?String(ce.data.max_concurrent):"",!0),y(D,ce.data.merge_strategy??"",!0),y(V,ce.data.merge_timeout!=null?String(ce.data.merge_timeout):"",!0),y(L,ce.data.temperature!=null?String(ce.data.temperature):"",!0),y(q,ce.data.max_tokens!=null?String(ce.data.max_tokens):"",!0),y(j,ce.data.tool_name??"",!0),y(U,ce.data.memory_action??"",!0),y(W,ce.data.validation_rule??"",!0),y(J,ce.data.split_expression??"",!0),y(ae,ce.data.merge_expression??"",!0),y(re,ce.data.trigger_type??"manual",!0),y(ie,ce.data.destination_type??"response",!0),y(ne,ce.data.queue_broker??"kafka",!0),y(G,ce.data.queue_topic??"",!0),y(oe,ce.data.queue_group_id??"",!0),y(ee,ce.data.cron_expression??"",!0),y(se,ce.data.cron_timezone??"UTC",!0),y(te,ce.data.http_method??"POST",!0),y(ue,ce.data.http_auth_required??!1,!0),y(le,ce.data.file_types??"*/*",!0),y(he,ce.data.file_max_size_mb!=null?String(ce.data.file_max_size_mb):"50",!0),y(ve,ce.data.webhook_url??"",!0),y(fe,ce.data.store_type??"file",!0),y(ke,ce.data.store_path??"",!0),y(Ae,ce.data.schema_json??"",!0);const Ie=ce.data.multimodal;y(ge,Ie?.vision_enabled??!1,!0);const rt=Ie?.supported_file_types??["image/png","image/jpeg"];y(Oe,rt.some(lt=>lt.startsWith("image/")),!0),y(Ye,rt.includes("application/pdf"),!0),y(We,rt.some(lt=>lt.includes("document")||lt.includes("msword")),!0),y(it,Ie?.max_file_size_mb??10,!0),y(Ge,Ie?.image_detail??"auto",!0)}),Nt=!1),ce||y(ct,null)});function Pe(ce,Ie){Nt||Qt(()=>{const rt=i();if(!rt)return;["timeout","maxSteps","max_concurrent","merge_timeout","temperature","max_tokens"].includes(ce)?Na(rt,ce,Ie===""?void 0:Number(Ie)):Na(rt,ce,Ie)})}_e(()=>{Pe("label",r(I))}),_e(()=>{Pe("model",r(H))}),_e(()=>{Pe("instructions",r(O))}),_e(()=>{Pe("description",r(F))}),_e(()=>{Pe("timeout",r(M))}),_e(()=>{Pe("pattern",r(R))}),_e(()=>{Pe("maxSteps",r(b))}),_e(()=>{Pe("condition",r(A))}),_e(()=>{Pe("backend",r(B))}),_e(()=>{Pe("connection_string",r(K))}),_e(()=>{Pe("namespace",r(Z))}),_e(()=>{Pe("schema_type",r(x))}),_e(()=>{Pe("validation_rules",r(S))}),_e(()=>{Pe("fail_action",r(z))}),_e(()=>{Pe("code",r(g))}),_e(()=>{Pe("strategy",r(C))}),_e(()=>{Pe("max_concurrent",r(T))}),_e(()=>{Pe("merge_strategy",r(D))}),_e(()=>{Pe("merge_timeout",r(V))}),_e(()=>{Pe("temperature",r(L))}),_e(()=>{Pe("max_tokens",r(q))}),_e(()=>{Pe("tool_name",r(j))}),_e(()=>{Pe("memory_action",r(U))}),_e(()=>{Pe("validation_rule",r(W))}),_e(()=>{Pe("split_expression",r(J))}),_e(()=>{Pe("merge_expression",r(ae))}),_e(()=>{Pe("trigger_type",r(re))}),_e(()=>{Pe("destination_type",r(ie))}),_e(()=>{Pe("queue_broker",r(ne))}),_e(()=>{Pe("queue_topic",r(G))}),_e(()=>{Pe("queue_group_id",r(oe))}),_e(()=>{Pe("cron_expression",r(ee))}),_e(()=>{Pe("cron_timezone",r(se))}),_e(()=>{Pe("http_method",r(te))}),_e(()=>{Pe("file_types",r(le))}),_e(()=>{Pe("file_max_size_mb",r(he))}),_e(()=>{Pe("webhook_url",r(ve))}),_e(()=>{Pe("store_type",r(fe))}),_e(()=>{Pe("store_path",r(ke))}),_e(()=>{Pe("schema_json",r(Ae))}),_e(()=>{const ce=r(ge),Ie=r(Oe),rt=r(Ye),lt=r(We),vt=r(it),yt=r(Ge);Nt||Qt(()=>{const bt=i();if(!bt)return;const Mt=o().find(Ht=>Ht.id===bt);if(!Mt||Mt.type!=="agent")return;const Lt=[];Ie&&Lt.push("image/png","image/jpeg"),rt&&Lt.push("application/pdf"),lt&&Lt.push("application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document"),Na(bt,"multimodal",{vision_enabled:ce,supported_file_types:Lt,max_file_size_mb:vt,image_detail:yt})})});function pn(){mn.set(null)}function wn(){const ce=n();if(!ce)return;const Ie=ce.id;an.update(rt=>rt.filter(lt=>lt.id!==Ie)),Mn.update(rt=>rt.filter(lt=>lt.source!==Ie&<.target!==Ie)),mn.set(null)}function hn(ce){mn.set(ce)}var Sr=Me(),Qe=de(Sr);{var kt=ce=>{const Ie=k(n),rt=k(()=>v[r(Ie).type??""]??cr),lt=k(()=>p[r(Ie).type??""]??"#ff6b35");var vt=z1(),yt=d(vt),bt=d(yt),Mt=d(bt);let Lt;var Ht=d(Mt);un(Ht,()=>r(rt),(Re,Le)=>{Le(Re,{size:14})}),c(Mt);var Xt=h(Mt,2),kn=d(Xt),Sn=d(kn);c(kn);var Ln=h(kn,2),rr=d(Ln,!0);c(Ln),c(Xt),c(bt);var ya=h(bt,2),cl=d(ya);Ys(cl,{size:14}),c(ya),c(yt);var Oo=h(yt,2),ba=d(Oo),xa=d(ba);let Ro;var dl=d(xa,!0);c(xa),c(ba);var wa=h(ba,2),Lo=h(d(wa),2),ul=d(Lo);{var vl=Re=>{var Le=Bm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Input node name",get value(){return r(I)},set value(me){y(I,me,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Trigger Type",type:"select",options:["manual","http","queue","schedule","file_upload"],get value(){return r(re)},set value(me){y(re,me,!0)}});var qe=h(Ke,2);{var Xe=me=>{var He=Rm(),Ee=de(He);Ne(Ee,{label:"HTTP Method",type:"select",options:["GET","POST","PUT","PATCH"],get value(){return r(te)},set value(Te){y(te,Te,!0)}}),ye(2),_(me,He)},ft=me=>{var He=Lm(),Ee=de(He);Ne(Ee,{label:"Broker",type:"select",options:["kafka","rabbitmq","redis"],get value(){return r(ne)},set value(ht){y(ne,ht,!0)}});var Te=h(Ee,2);Ne(Te,{label:"Topic / Queue",type:"text",placeholder:"pipeline-input",get value(){return r(G)},set value(ht){y(G,ht,!0)}});var Fe=h(Te,2);Ne(Fe,{label:"Group ID",type:"text",placeholder:"studio-group",get value(){return r(oe)},set value(ht){y(oe,ht,!0)}}),_(me,He)},pt=me=>{var He=Hm(),Ee=de(He);Ne(Ee,{label:"Cron Expression",type:"text",placeholder:"0 */6 * * *",get value(){return r(ee)},set value(Fe){y(ee,Fe,!0)}});var Te=h(Ee,2);Ne(Te,{label:"Timezone",type:"text",placeholder:"UTC",get value(){return r(se)},set value(Fe){y(se,Fe,!0)}}),ye(2),_(me,He)},Je=me=>{var He=Vm(),Ee=de(He);Ne(Ee,{label:"Accepted Types",type:"text",placeholder:"application/pdf, text/csv",get value(){return r(le)},set value(Fe){y(le,Fe,!0)}});var Te=h(Ee,2);Ne(Te,{label:"Max Size (MB)",type:"number",placeholder:"50",get value(){return r(he)},set value(Fe){y(he,Fe,!0)}}),_(me,He)},Ve=me=>{var He=Fm();_(me,He)};Y(qe,me=>{r(re)==="http"?me(Xe):r(re)==="queue"?me(ft,1):r(re)==="schedule"?me(pt,2):r(re)==="file_upload"?me(Je,3):me(Ve,!1)})}var Se=h(qe,2);Ne(Se,{label:"Input Schema (JSON)",type:"textarea",placeholder:'{"type": "object", "properties": {…}}',get value(){return r(Ae)},set value(me){y(Ae,me,!0)}}),_(Re,Le)},fl=Re=>{var Le=Zm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Output node name",get value(){return r(I)},set value(Se){y(I,Se,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Destination",type:"select",options:["response","queue","webhook","store"],get value(){return r(ie)},set value(Se){y(ie,Se,!0)}});var qe=h(Ke,2);{var Xe=Se=>{var me=qm(),He=de(me);Ne(He,{label:"Broker",type:"select",options:["kafka","rabbitmq","redis"],get value(){return r(ne)},set value(Te){y(ne,Te,!0)}});var Ee=h(He,2);Ne(Ee,{label:"Topic / Queue",type:"text",placeholder:"pipeline-output",get value(){return r(G)},set value(Te){y(G,Te,!0)}}),_(Se,me)},ft=Se=>{Ne(Se,{label:"Webhook URL",type:"text",placeholder:"https://example.com/callback",get value(){return r(ve)},set value(me){y(ve,me,!0)}})},pt=Se=>{var me=Km(),He=de(me);Ne(He,{label:"Storage Type",type:"select",options:["file","database"],get value(){return r(fe)},set value(Te){y(fe,Te,!0)}});var Ee=h(He,2);Ne(Ee,{label:"Path / Table",type:"text",placeholder:"/tmp/results.json",get value(){return r(ke)},set value(Te){y(ke,Te,!0)}}),_(Se,me)},Je=Se=>{var me=jm();_(Se,me)};Y(qe,Se=>{r(ie)==="queue"?Se(Xe):r(ie)==="webhook"?Se(ft,1):r(ie)==="store"?Se(pt,2):Se(Je,!1)})}var Ve=h(qe,2);Ne(Ve,{label:"Response Schema (JSON)",type:"textarea",placeholder:'{"type": "object", "properties": {…}}',get value(){return r(Ae)},set value(Se){y(Ae,Se,!0)}}),_(Re,Le)},pl=Re=>{var Le=Xm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Agent name",get value(){return r(I)},set value(Fe){y(I,Fe,!0)}});var Ke=h(Be,2),qe=h(d(Ke),2);Ql(qe,{placeholder:"Select model...",get value(){return r(H)},set value(Fe){y(H,Fe,!0)}}),c(Ke);var Xe=h(Ke,2);Ne(Xe,{label:"Instructions",type:"textarea",placeholder:"System instructions for this agent...",get value(){return r(O)},set value(Fe){y(O,Fe,!0)}});var ft=h(Xe,2);Ne(ft,{label:"Description",type:"text",placeholder:"Agent description",get value(){return r(F)},set value(Fe){y(F,Fe,!0)}});var pt=h(ft,2);Ne(pt,{label:"Temperature",type:"number",placeholder:"0.7",get value(){return r(L)},set value(Fe){y(L,Fe,!0)}});var Je=h(pt,2);Ne(Je,{label:"Max Tokens",type:"number",placeholder:"4096",get value(){return r(q)},set value(Fe){y(q,Fe,!0)}});var Ve=h(Je,2),Se=d(Ve),me=h(d(Se),2);let He;c(Se);var Ee=h(Se,2);{var Te=Fe=>{var ht=Ym(),Vt=d(ht),nn=h(d(Vt),2),Wt=d(nn);Ct(Wt),ye(),c(nn);var zn=h(nn,2),zr=d(zn);Ct(zr),ye(),c(zn);var Hn=h(zn,2),Vn=d(Hn);Ct(Vn),ye(),c(Hn),c(Vt);var Cn=h(Vt,2),Cr=h(d(Cn),2),Fn=d(Cr);Ct(Fn);var Er=h(Fn,2),Nl=d(Er);c(Er),c(Cr),c(Cn);var qo=h(Cn,2),Ko=h(d(qo),2),Ca=d(Ko),Nr=d(Ca);Ct(Nr),Nr.value=Nr.__value="auto",ye(),c(Ca);var Ea=h(Ca,2),Mr=d(Ea);Ct(Mr),Mr.value=Mr.__value="low",ye(),c(Ea);var jo=h(Ea,2),Pr=d(jo);Ct(Pr),Pr.value=Pr.__value="high",ye(),c(jo),c(Ko),c(qo),c(ht),$(()=>X(Nl,`${r(it)??""} MB`)),Ma(Wt,()=>r(Oe),Pt=>y(Oe,Pt)),Ma(zr,()=>r(Ye),Pt=>y(Ye,Pt)),Ma(Vn,()=>r(We),Pt=>y(We,Pt)),on(Fn,()=>r(it),Pt=>y(it,Pt)),Pa(u,[],Nr,()=>r(Ge),Pt=>y(Ge,Pt)),Pa(u,[],Mr,()=>r(Ge),Pt=>y(Ge,Pt)),Pa(u,[],Pr,()=>r(Ge),Pt=>y(Ge,Pt)),_(Fe,ht)};Y(Ee,Fe=>{r(ge)&&Fe(Te)})}c(Ve),$(()=>He=De(me,1,"mm-toggle-switch svelte-16rdffs",null,He,{"mm-on":r(ge)})),be("click",Se,()=>y(ge,!r(ge))),_(Re,Le)},hl=Re=>{var Le=Jm(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Tool label on canvas",get value(){return r(I)},set value(Ve){y(I,Ve,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Tool Type",type:"select",get options(){return w},get value(){return r(j)},set value(Ve){y(j,Ve,!0)}});var qe=h(Ke,2);{var Xe=Ve=>{var Se=Um(),me=d(Se),He=d(me);Ws(He,{size:11});var Ee=h(He,2),Te=d(Ee,!0);c(Ee),c(me);var Fe=h(me,2),ht=d(Fe,!0);c(Fe);var Vt=h(Fe,2);{var nn=Wt=>{var zn=Gm();je(zn,21,()=>r(E).parameters,wt,(zr,Hn)=>{var Vn=Wm(),Cn=d(Vn),Cr=d(Cn,!0);c(Cn);var Fn=h(Cn,2),Er=d(Fn);c(Fn),c(Vn),$(()=>{X(Cr,r(Hn).name),X(Er,`${r(Hn).type??""}${r(Hn).required?"":"?"}`)}),_(zr,Vn)}),c(zn),_(Wt,zn)};Y(Vt,Wt=>{r(E).parameters.length>0&&Wt(nn)})}c(Se),$(()=>{X(Te,r(E).name),X(ht,r(E).description)}),_(Ve,Se)},ft=Ve=>{var Se=Qm();_(Ve,Se)};Y(qe,Ve=>{r(E)?Ve(Xe):r(j)==="custom"&&Ve(ft,1)})}var pt=h(qe,2);Ne(pt,{label:"Description",type:"textarea",placeholder:"What this tool does",get value(){return r(F)},set value(Ve){y(F,Ve,!0)}});var Je=h(pt,2);Ne(Je,{label:"Timeout (seconds)",type:"number",placeholder:"30",get value(){return r(M)},set value(Ve){y(M,Ve,!0)}}),_(Re,Le)},gl=Re=>{var Le=e1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Reasoning name",get value(){return r(I)},set value(Je){y(I,Je,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Pattern",type:"select",get options(){return f},get value(){return r(R)},set value(Je){y(R,Je,!0)}});var qe=h(Ke,2);{var Xe=Je=>{var Ve=$m(),Se=d(Ve),me=d(Se);Zr(me,{size:11});var He=h(me,2),Ee=d(He,!0);c(He),c(Se);var Te=h(Se,2),Fe=d(Te,!0);c(Te);var ht=h(Te,2),Vt=d(ht);c(ht),c(Ve),$(()=>{X(Ee,r(N).name),X(Fe,r(N).description),X(Vt,`Best for: ${r(N).bestFor??""}`)}),_(Je,Ve)};Y(qe,Je=>{r(N)&&Je(Xe)})}var ft=h(qe,2);{let Je=k(()=>r(N)?String(r(N).defaultMaxSteps):"10");Ne(ft,{label:"Max Steps",type:"number",get placeholder(){return r(Je)},get value(){return r(b)},set value(Ve){y(b,Ve,!0)}})}var pt=h(ft,2);Ne(pt,{label:"Description",type:"text",placeholder:"Reasoning strategy description",get value(){return r(F)},set value(Je){y(F,Je,!0)}}),_(Re,Le)},ml=Re=>{var Le=t1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Condition name",get value(){return r(I)},set value(qe){y(I,qe,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Condition Key",type:"text",placeholder:"e.g. document_type, status",get value(){return r(A)},set value(qe){y(A,qe,!0)}}),ye(2),_(Re,Le)},_l=Re=>{var Le=s1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Memory name",get value(){return r(I)},set value(me){y(I,me,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Action",type:"select",options:["store","retrieve","clear"],get value(){return r(U)},set value(me){y(U,me,!0)}});var qe=h(Ke,2),Xe=d(qe);{var ft=me=>{var He=n1();_(me,He)},pt=me=>{var He=r1();_(me,He)},Je=me=>{var He=a1();_(me,He)},Ve=me=>{var He=o1();_(me,He)};Y(Xe,me=>{r(U)==="store"?me(ft):r(U)==="retrieve"?me(pt,1):r(U)==="clear"?me(Je,2):me(Ve,!1)})}c(qe);var Se=h(qe,2);Ne(Se,{label:"Namespace",type:"text",placeholder:"default",get value(){return r(Z)},set value(me){y(Z,me,!0)}}),_(Re,Le)},yl=Re=>{var Le=f1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Validator name",get value(){return r(I)},set value(Ee){y(I,Ee,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Validation Rule",type:"select",options:["not_empty","is_string","is_list","is_dict","custom"],get value(){return r(W)},set value(Ee){y(W,Ee,!0)}});var qe=h(Ke,2),Xe=d(qe);{var ft=Ee=>{var Te=i1();_(Ee,Te)},pt=Ee=>{var Te=l1();_(Ee,Te)},Je=Ee=>{var Te=c1();_(Ee,Te)},Ve=Ee=>{var Te=d1();_(Ee,Te)},Se=Ee=>{var Te=u1();_(Ee,Te)},me=Ee=>{var Te=v1();_(Ee,Te)};Y(Xe,Ee=>{r(W)==="not_empty"?Ee(ft):r(W)==="is_string"?Ee(pt,1):r(W)==="is_list"?Ee(Je,2):r(W)==="is_dict"?Ee(Ve,3):r(W)==="custom"?Ee(Se,4):Ee(me,!1)})}c(qe);var He=h(qe,2);Ne(He,{label:"On Failure",type:"select",options:["reject","retry","fallback","log"],get value(){return r(z)},set value(Ee){y(z,Ee,!0)}}),_(Re,Le)},bl=Re=>{var Le=p1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Code block name",get value(){return r(I)},set value(Xe){y(I,Xe,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Description",type:"text",placeholder:"What this code does",get value(){return r(F)},set value(Xe){y(F,Xe,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Python Code",type:"textarea",placeholder:"async def execute(context, inputs): return inputs",get value(){return r(g)},set value(Xe){y(g,Xe,!0)}}),ye(2),_(Re,Le)},xl=Re=>{var Le=h1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Fan Out name",get value(){return r(I)},set value(Xe){y(I,Xe,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Split Expression",type:"text",placeholder:"How to split input for parallel branches",get value(){return r(J)},set value(Xe){y(J,Xe,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Max Concurrent",type:"number",placeholder:"10",get value(){return r(T)},set value(Xe){y(T,Xe,!0)}}),ye(2),_(Re,Le)},wl=Re=>{var Le=y1(),Be=de(Le);Ne(Be,{label:"Name",type:"text",placeholder:"Fan In name",get value(){return r(I)},set value(Se){y(I,Se,!0)}});var Ke=h(Be,2);Ne(Ke,{label:"Merge Expression",type:"select",options:["concat","collect"],get value(){return r(ae)},set value(Se){y(ae,Se,!0)}});var qe=h(Ke,2);Ne(qe,{label:"Timeout (seconds)",type:"number",placeholder:"30",get value(){return r(V)},set value(Se){y(V,Se,!0)}});var Xe=h(qe,2),ft=d(Xe);{var pt=Se=>{var me=g1();_(Se,me)},Je=Se=>{var me=m1();_(Se,me)},Ve=Se=>{var me=_1();_(Se,me)};Y(ft,Se=>{r(ae)==="concat"?Se(pt):r(ae)==="collect"?Se(Je,1):Se(Ve,!1)})}c(Xe),_(Re,Le)},kl=Re=>{Ne(Re,{label:"Name",type:"text",placeholder:"Node name",get value(){return r(I)},set value(Le){y(I,Le,!0)}})};Y(ul,Re=>{r(Ie).type==="input"?Re(vl):r(Ie).type==="output"?Re(fl,1):r(Ie).type==="agent"?Re(pl,2):r(Ie).type==="tool"?Re(hl,3):r(Ie).type==="reasoning"?Re(gl,4):r(Ie).type==="condition"?Re(ml,5):r(Ie).type==="memory"?Re(_l,6):r(Ie).type==="validator"?Re(yl,7):r(Ie).type==="custom_code"?Re(bl,8):r(Ie).type==="fan_out"?Re(xl,9):r(Ie).type==="fan_in"?Re(wl,10):Re(kl,!1)})}c(Lo),c(wa);var Ho=h(wa,2);{var Sl=Re=>{var Le=S1(),Be=d(Le),Ke=d(Be);Jl(Ke,{size:12}),ye(),c(Be);var qe=h(Be,2),Xe=d(qe);{var ft=Ve=>{var Se=x1(),me=h(d(Se),2);je(me,17,()=>r(gt),wt,(He,Ee)=>{var Te=b1(),Fe=d(Te),ht=d(Fe,!0);c(Fe);var Vt=h(Fe,2);Uo(Vt,{size:10}),ye(2),c(Te),$((nn,Wt)=>{xe(Te,"title",`Select ${nn??""}`),X(ht,Wt)},[()=>xt(r(Ee).source),()=>xt(r(Ee).source)]),be("click",Te,()=>hn(r(Ee).source)),_(He,Te)}),c(Se),_(Ve,Se)};Y(Xe,Ve=>{r(gt).length>0&&Ve(ft)})}var pt=h(Xe,2);{var Je=Ve=>{var Se=k1(),me=h(d(Se),2);je(me,17,()=>r(dt),wt,(He,Ee)=>{var Te=w1(),Fe=h(d(Te),2);Uo(Fe,{size:10});var ht=h(Fe,2),Vt=d(ht,!0);c(ht),c(Te),$((nn,Wt)=>{xe(Te,"title",`Select ${nn??""}`),X(Vt,Wt)},[()=>xt(r(Ee).target),()=>xt(r(Ee).target)]),be("click",Te,()=>hn(r(Ee).target)),_(He,Te)}),c(Se),_(Ve,Se)};Y(pt,Ve=>{r(dt).length>0&&Ve(Je)})}c(qe),c(Le),_(Re,Le)};Y(Ho,Re=>{(r(gt).length>0||r(dt).length>0)&&Re(Sl)})}var ka=h(Ho,2),Vo=h(d(ka),2),Sa=d(Vo),zl=d(Sa);c(Sa);var Fo=h(Sa,2),Cl=d(Fo);c(Fo),c(Vo),c(ka);var Bo=h(ka,2),za=d(Bo),El=d(za);Wn(El,{size:13}),ye(2),c(za),c(Bo),c(Oo),c(vt),$((Re,Le)=>{Lt=st(Mt,"",Lt,{"--node-color":r(lt)}),X(Sn,`${m[r(Ie).type??""]??"Node"??""} Properties`),X(rr,r(Ie).id),Ro=st(xa,"",Ro,{"--badge-color":r(lt)}),X(dl,m[r(Ie).type??""]??r(Ie).type),X(zl,`X: ${Re??""}`),X(Cl,`Y: ${Le??""}`)},[()=>Math.round(r(Ie).position.x),()=>Math.round(r(Ie).position.y)]),be("click",ya,pn),be("click",za,wn),_(ce,vt)};Y(Qe,ce=>{n()&&ce(kt)})}_(t,Sr),Ce(),l()}_t(["click"]);var E1=P(""),N1=P(''),M1=P(''),P1=P('
    Pipeline I/O
    Processing
    '),T1=P('');function I1(t,e){ze(e,!0);const n=()=>at(mn,"$selectedNodeId",a),[a,o]=Ot();let i=Q(320),s=Q(!1),l=Q(0),u=Q(0);function v(z){z.preventDefault(),y(s,!0),y(l,z.clientX,!0),y(u,r(i),!0),document.addEventListener("mousemove",p),document.addEventListener("mouseup",m)}function p(z){r(s)&&y(i,Math.max(240,Math.min(480,r(u)+(r(l)-z.clientX))),!0)}function m(){y(s,!1),document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",m)}On(()=>{document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",m)});const f=[{type:"input",label:"Input",icon:wc,color:"#22c55e",group:"io"},{type:"output",label:"Output",icon:kc,color:"#ef4444",group:"io"},{type:"agent",label:"Agent",icon:cr,color:"#6366f1"},{type:"tool",label:"Tool",icon:Xn,color:"#8b5cf6"},{type:"reasoning",label:"Reasoning",icon:Zr,color:"#ec4899"},{type:"condition",label:"Condition",icon:Xs,color:"#f59e0b"},{type:"memory",label:"Memory",icon:co,color:"#06b6d4"},{type:"validator",label:"Validator",icon:vo,color:"#f59e0b"},{type:"custom_code",label:"Code",icon:la,color:"#3b82f6"},{type:"fan_out",label:"Fan Out",icon:fo,color:"#64748b"},{type:"fan_in",label:"Fan In",icon:po,color:"#64748b"}];function w(z){const g=parseInt(z.slice(1,3),16),C=parseInt(z.slice(3,5),16),T=parseInt(z.slice(5,7),16);return`rgba(${g}, ${C}, ${T}, 0.15)`}let N=k(()=>n()?"properties":"components");var E=T1();let I,H;var O=d(E),F=h(O,2),M=d(F);let R;var b=d(M);jl(b,{size:12}),ye(2),c(M);var A=h(M,2);{var B=z=>{var g=E1();let C;var T=d(g);Ec(T,{size:12}),ye(2),c(g),$(()=>C=De(g,1,"panel-tab-btn svelte-1ecj58j",null,C,{active:r(N)==="properties"})),be("click",g,()=>{}),_(z,g)};Y(A,z=>{n()&&z(B)})}c(F);var K=h(F,2),Z=d(K);{var x=z=>{C1(z,{})},S=z=>{var g=P1(),C=h(d(g),2);je(C,17,()=>f.filter(D=>D.group==="io"),wt,(D,V)=>{var L=N1(),q=d(L);let j;var U=d(q);un(U,()=>r(V).icon,(ae,re)=>{re(ae,{size:14})}),c(q);var W=h(q,2),J=d(W,!0);c(W),c(L),$(ae=>{xe(L,"title",`Add ${r(V).label} node`),j=st(q,"",j,ae),X(J,r(V).label)},[()=>({background:w(r(V).color),color:r(V).color})]),be("click",L,()=>Xo(r(V).type,r(V).label)),_(D,L)});var T=h(C,4);je(T,17,()=>f.filter(D=>!D.group),wt,(D,V)=>{var L=M1(),q=d(L);let j;var U=d(q);un(U,()=>r(V).icon,(ae,re)=>{re(ae,{size:14})}),c(q);var W=h(q,2),J=d(W,!0);c(W),c(L),$(ae=>{xe(L,"title",`Add ${r(V).label} node`),j=st(q,"",j,ae),X(J,r(V).label)},[()=>({background:w(r(V).color),color:r(V).color})]),be("click",L,()=>Xo(r(V).type,r(V).label)),_(D,L)}),c(g),_(z,g)};Y(Z,z=>{r(N)==="properties"&&n()?z(x):z(S,!1)})}c(K),c(E),$(()=>{I=De(E,1,"component-panel svelte-1ecj58j",null,I,{dragging:r(s)}),H=st(E,"",H,{width:`${r(i)??""}px`}),R=De(M,1,"panel-tab-btn svelte-1ecj58j",null,R,{active:r(N)==="components"})}),be("mousedown",O,v),be("click",M,()=>{n()&&mn.set(null)}),_(t,E),Ce(),o()}_t(["mousedown","click"]);var A1=P('
    No execution events yet. Run your pipeline to see logs here.
    '),D1=P(' '),O1=P(' '),R1=P(' '),L1=P('
    '),H1=P('
    ');function V1(t,e){ze(e,!0);const n=()=>at(Ka,"$executionEvents",a),[a,o]=Ot();let i=Q(void 0),s=Q(0);_e(()=>{const b=n();b.length>r(s)&&r(i)&&requestAnimationFrame(()=>{r(i)&&(r(i).scrollTop=r(i).scrollHeight)}),y(s,b.length,!0)});function l(){Ka.set([])}function u(b){const A=new Date(b),B=String(A.getHours()).padStart(2,"0"),K=String(A.getMinutes()).padStart(2,"0"),Z=String(A.getSeconds()).padStart(2,"0"),x=String(A.getMilliseconds()).padStart(3,"0");return`${B}:${K}:${Z}.${x}`}function v(b){switch(b){case"node_start":return"badge-info";case"node_complete":case"pipeline_complete":return"badge-success";case"node_error":return"badge-error";case"node_skip":return"badge-warning";default:return""}}function p(b){switch(b){case"node_start":return"START";case"node_complete":return"DONE";case"node_error":return"ERROR";case"node_skip":return"SKIP";case"pipeline_complete":return"COMPLETE";default:return b}}function m(b){return b.type==="node_complete"&&b.latency_ms!=null?`${b.latency_ms}ms`:b.type==="node_error"&&b.error?b.error:b.type==="pipeline_complete"&&b.duration_ms!=null?`Total: ${b.duration_ms}ms`:""}var f=H1(),w=d(f),N=d(w),E=d(N);c(N);var I=h(N,2),H=d(I);Wn(H,{size:13}),c(I),c(w);var O=h(w,2),F=d(O);{var M=b=>{var A=A1();_(b,A)},R=b=>{var A=Me(),B=de(A);je(B,1,n,wt,(K,Z)=>{const x=k(()=>m(r(Z)));var S=L1(),z=d(S),g=d(z,!0);c(z);var C=h(z,2),T=d(C,!0);c(C);var D=h(C,2);{var V=W=>{var J=D1(),ae=d(J,!0);c(J),$(()=>X(ae,r(Z).node_id)),_(W,J)};Y(D,W=>{r(Z).node_id&&W(V)})}var L=h(D,2);{var q=W=>{var J=O1(),ae=d(J,!0);c(J),$(()=>X(ae,r(Z).pipeline_name)),_(W,J)};Y(L,W=>{r(Z).pipeline_name&&W(q)})}var j=h(L,2);{var U=W=>{var J=R1(),ae=d(J,!0);c(J),$(()=>X(ae,r(x))),_(W,J)};Y(j,W=>{r(x)&&W(U)})}c(S),$((W,J,ae)=>{X(g,W),De(C,1,`log-badge ${J??""}`,"svelte-dlnc6c"),X(T,ae)},[()=>u(r(Z).timestamp??""),()=>v(r(Z).type),()=>p(r(Z).type)]),_(K,S)}),_(b,A)};Y(F,b=>{n().length===0?b(M):b(R,!1)})}c(O),bn(O,b=>y(i,b),()=>r(i)),c(f),$(()=>X(E,`${n().length??""} events`)),be("click",I,l),_(t,f),Ce(),o()}_t(["click"]);var F1=P('Auto-syncing...'),B1=P('
    Generating code...
    '),q1=P('
    '),K1=P(''),j1=P('
    '),Z1=P('
    Add nodes to your pipeline to generate code.
    '),Y1=P('
    Generated Python
    ');function X1(t,e){ze(e,!0);let n=Q(""),a=Q(!1),o=Q(""),i=Q(!1),s=Q(!0),l=Q(!1),u=null,v=null,p=Q("");function m(){const G=Bn(an),oe=Bn(Mn),ee=G.map(te=>({id:te.id,type:te.type,label:te.data?.label??"",model:te.data?.model??"",instructions:te.data?.instructions??""})),se=oe.map(te=>({id:te.id,source:te.source,target:te.target}));return JSON.stringify({nodes:ee,edges:se})}function f(){const G=Bn(an),oe=Bn(Mn),ee=G.map(te=>({id:te.id,type:te.type,label:te.data?.label??"",position:te.position,data:te.data})),se=oe.map(te=>({id:te.id,source:te.source,target:te.target}));return{nodes:ee,edges:se}}async function w(){y(a,!0),y(o,""),y(l,!1);try{const G=f(),oe=await ot.codegen.toCode(G);y(n,oe.code,!0)}catch(G){y(o,G instanceof Error?G.message:"Code generation failed",!0),y(n,"")}finally{y(a,!1)}}async function N(){if(r(n))try{await navigator.clipboard.writeText(r(n)),y(i,!0),u&&clearTimeout(u),u=setTimeout(()=>{y(i,!1),u=null},2e3)}catch{}}function E(){y(s,!r(s)),r(s)||I()}function I(){v&&(clearTimeout(v),v=null),y(l,!1)}function H(G){return G.replace(/&/g,"&").replace(//g,">")}function O(G){const oe=H(G),ee=[];let se=0;const te=new RegExp(['("""[\\s\\S]*?""")',"('''[\\s\\S]*?''')","(#[^\\n]*)",'("(?:[^"\\\\\\n]|\\\\.)*")',"('(?:[^'\\\\\\n]|\\\\.)*')","\\b(def)(\\s+)(\\w+)","\\b(class)(\\s+)(\\w+)","(@\\w+(?:\\.\\w+)*)","\\b(from|import|return|if|else|elif|for|while|try|except|finally|with|as|async|await|yield|raise|pass|break|continue|and|or|not|in|is|None|True|False)\\b","\\b(print|len|range|type|str|int|float|list|dict|set|tuple|isinstance|super)(?=\\s*\\()","\\b(\\d+\\.?\\d*(?:e[+-]?\\d+)?)\\b"].join("|"),"g");let ue;for(te.lastIndex=0;(ue=te.exec(oe))!==null;)ue.index>se&&ee.push(oe.slice(se,ue.index)),ue[1]!==void 0?ee.push(`${ue[1]}`):ue[2]!==void 0?ee.push(`${ue[2]}`):ue[3]!==void 0?ee.push(`${ue[3]}`):ue[4]!==void 0?ee.push(`${ue[4]}`):ue[5]!==void 0?ee.push(`${ue[5]}`):ue[6]!==void 0?ee.push(`${ue[6]}${ue[7]}${ue[8]}`):ue[9]!==void 0?ee.push(`${ue[9]}${ue[10]}${ue[11]}`):ue[12]!==void 0?ee.push(`${ue[12]}`):ue[13]!==void 0?ee.push(`${ue[13]}`):ue[14]!==void 0?ee.push(`${ue[14]}`):ue[15]!==void 0?ee.push(`${ue[15]}`):ee.push(ue[0]),se=ue.index+ue[0].length;return ser(n)?O(r(n)):""),M=k(()=>r(F)?r(F).split(` -`):[]),R=null,b=null;function A(){if(!r(s))return;const G=m();G===r(p)||(y(p,G,!0),Bn(an).length===0)||r(a)||(I(),y(l,!0),v=setTimeout(()=>{y(l,!1),v=null,w()},800))}io(()=>{y(p,m(),!0),Bn(an).length>0&&w(),R=an.subscribe(()=>{A()}),b=Mn.subscribe(()=>{A()})}),On(()=>{u&&clearTimeout(u),I(),R&&R(),b&&b()});var B=Y1(),K=d(B),Z=d(K),x=h(d(Z));{var S=G=>{var oe=F1();_(G,oe)};Y(x,G=>{r(l)&&G(S)})}c(Z);var z=h(Z,2),g=d(z);let C;var T=h(g,2),D=d(T);{var V=G=>{ho(G,{size:13})},L=G=>{Gs(G,{size:13})};Y(D,G=>{r(i)?G(V):G(L,!1)})}c(T);var q=h(T,2);let j;var U=d(q);mt(U,{size:13}),c(q),c(z),c(K);var W=h(K,2),J=d(W);{var ae=G=>{var oe=B1();_(G,oe)},re=G=>{var oe=q1(),ee=d(oe),se=d(ee,!0);c(ee),c(oe),$(()=>X(se,r(o))),_(G,oe)},ie=G=>{var oe=j1(),ee=d(oe),se=d(ee);je(se,21,()=>r(M),wt,(te,ue,le)=>{var he=K1(),ve=d(he);ve.textContent=le+1;var fe=h(ve),ke=d(fe);$l(ke,()=>r(ue)),c(fe),c(he),_(te,he)}),c(se),c(ee),c(oe),_(G,oe)},ne=G=>{var oe=Z1();_(G,oe)};Y(J,G=>{r(a)?G(ae):r(o)?G(re,1):r(n)?G(ie,2):G(ne,!1)})}c(W),c(B),$(()=>{C=De(g,1,"auto-toggle svelte-a1zyks",null,C,{active:r(s)}),xe(g,"title",r(s)?"Disable auto-sync":"Enable auto-sync"),T.disabled=!r(n),j=De(q,1,"toolbar-btn svelte-a1zyks",null,j,{spinning:r(a)}),q.disabled=r(a)}),be("click",g,E),be("click",T,N),be("click",q,w),_(t,B),Ce()}_t(["click"]);var W1=P('
    Run your pipeline to see the execution timeline
    '),G1=P(''),U1=P(''),Q1=P('Shift+click another checkpoint to compare'),J1=P('
    '),$1=P(' '),e_=P('
    Added
    '),t_=P(' '),n_=P('
    Removed
    '),r_=P(' '),a_=P('
    Changed
    '),o_=P('No differences'),s_=P('
    '),i_=P(' '),l_=P('
    '),c_=P('
    '),d_=P('empty'),u_=P('
    '),v_=P('
    '),f_=P('empty'),p_=P('
    '),h_=P('
    '),g_=P('
    Timeline
    ',1),m_=P('
    ');function __(t,e){ze(e,!0);const n=()=>at(En,"$checkpoints",a),[a,o]=Ot();let i=Q(null),s=Q(null),l=Q(null),u=Q(void 0),v=Q(0),p=Q(!0),m=Q(!1),f=k(()=>r(i)!==null?n().find(x=>x.index===r(i)):void 0);_e(()=>{const x=n();x.length>r(v)&&r(u)&&requestAnimationFrame(()=>{r(u)&&(r(u).scrollLeft=r(u).scrollWidth)}),y(v,x.length,!0)}),io(async()=>{try{const x=await ot.checkpoints.list();En.set(x)}catch{}});function w(x,S){S.shiftKey&&r(i)!==null&&r(i)!==x.index?(y(s,x.index,!0),N()):(y(i,x.index,!0),y(s,null),y(l,null))}async function N(){if(!(r(i)===null||r(s)===null))try{y(l,await ot.checkpoints.diff(r(i),r(s)),!0)}catch{y(l,null)}}async function E(){try{await ot.checkpoints.clear(),En.set([]),y(i,null),y(s,null),y(l,null)}catch{En.set([]),y(i,null),y(s,null),y(l,null)}}async function I(){if(!(!r(f)||r(i)===null))try{await ot.checkpoints.rewind(r(i)),En.update(x=>x.filter(S=>S.index<=r(i))),y(s,null),y(l,null),Ue(`Rewound to checkpoint #${r(i)}`,"info")}catch{Ue("Failed to rewind checkpoint","error")}}async function H(){if(!(!r(f)||r(i)===null))try{const x=await ot.checkpoints.fork(r(i),r(f).state);En.update(S=>[...S,x]),y(i,x.index,!0)}catch{}}function O(x){if(!x)return"";const S=Date.now(),z=new Date(x).getTime(),g=S-z,C=Math.floor(g/1e3);if(C<5)return"just now";if(C<60)return`${C}s ago`;const T=Math.floor(C/60);if(T<60)return`${T}m ago`;const D=Math.floor(T/60);return D<24?`${D}h ago`:new Date(x).toLocaleDateString()}function F(x){if(!x)return"";const S=new Date(x),z=String(S.getHours()).padStart(2,"0"),g=String(S.getMinutes()).padStart(2,"0"),C=String(S.getSeconds()).padStart(2,"0");return`${z}:${g}:${C}`}function M(x){return x.includes("agent")?"var(--color-node-agent, #6366f1)":x.includes("tool")?"var(--color-node-tool, #8b5cf6)":x.includes("reason")?"var(--color-node-reasoning, #ec4899)":x.includes("pipeline")?"var(--color-node-pipeline, #06b6d4)":"var(--color-accent, #ff6b35)"}function R(x){return x.branch_id?"var(--color-info, #3b82f6)":"var(--color-accent, #ff6b35)"}function b(x){return typeof x=="string"?`"${x}"`:x===null?"null":x===void 0?"undefined":typeof x=="object"?JSON.stringify(x,null,2):String(x)}var A=m_(),B=d(A);{var K=x=>{var S=W1(),z=d(S),g=d(z);go(g,{size:32}),c(z),ye(2),c(S),_(x,S)},Z=x=>{var S=g_(),z=de(S),g=d(z),C=h(d(g),2),T=d(C);c(C),c(g);var D=h(g,2),V=d(D);Wn(V,{size:13}),c(D),c(z);var L=h(z,2),q=d(L),j=h(d(q),2);je(j,1,n,ne=>ne.index,(ne,G)=>{const oe=k(()=>r(i)===r(G).index),ee=k(()=>r(s)===r(G).index);var se=G1();let te;var ue=d(se);let le;var he=h(ue,2),ve=d(he,!0);c(he),c(se),$((fe,ke)=>{te=De(se,1,"checkpoint-dot-wrapper svelte-164d9ci",null,te,{selected:r(oe),compare:r(ee)}),xe(se,"title",`${r(G).node_id??""} - ${fe??""}${r(G).branch_id?` (branch: ${r(G).branch_id})`:""}`),le=De(ue,1,"checkpoint-dot svelte-164d9ci",null,le,{selected:r(oe),compare:r(ee),forked:!!r(G).branch_id}),st(ue,`--dot-color: ${ke??""}`),X(ve,r(G).index)},[()=>F(r(G).timestamp),()=>R(r(G))]),be("click",se,fe=>w(r(G),fe)),_(ne,se)}),c(q),c(L),bn(L,ne=>y(u,ne),()=>r(u));var U=h(L,2);{var W=ne=>{var G=J1(),oe=d(G),ee=d(oe);Cc(ee,{size:13}),ye(2),c(oe);var se=h(oe,2),te=d(se);dr(te,{size:13}),ye(2),c(se);var ue=h(se,2);{var le=ve=>{var fe=U1(),ke=d(fe);_c(ke,{size:13});var Ae=h(ke,2),ge=d(Ae);c(Ae),c(fe),$(()=>X(ge,`Compare #${r(i)??""} vs #${r(s)??""}`)),be("click",fe,N),_(ve,fe)},he=ve=>{var fe=Q1();_(ve,fe)};Y(ue,ve=>{r(s)!==null?ve(le):ve(he,!1)})}c(G),be("click",oe,I),be("click",se,H),_(ne,G)};Y(U,ne=>{r(f)&&ne(W)})}var J=h(U,2);{var ae=ne=>{var G=s_(),oe=d(G),ee=d(oe);c(oe);var se=h(oe,2),te=d(se);{var ue=ge=>{var Oe=e_(),Ye=h(d(Oe),2);je(Ye,17,()=>r(l).added,wt,(We,it)=>{var Ge=$1(),ct=d(Ge,!0);c(Ge),$(()=>X(ct,r(it))),_(We,Ge)}),c(Oe),_(ge,Oe)};Y(te,ge=>{r(l).added.length>0&&ge(ue)})}var le=h(te,2);{var he=ge=>{var Oe=n_(),Ye=h(d(Oe),2);je(Ye,17,()=>r(l).removed,wt,(We,it)=>{var Ge=t_(),ct=d(Ge,!0);c(Ge),$(()=>X(ct,r(it))),_(We,Ge)}),c(Oe),_(ge,Oe)};Y(le,ge=>{r(l).removed.length>0&&ge(he)})}var ve=h(le,2);{var fe=ge=>{var Oe=a_(),Ye=h(d(Oe),2);je(Ye,17,()=>r(l).changed,wt,(We,it)=>{var Ge=r_(),ct=d(Ge,!0);c(Ge),$(()=>X(ct,r(it))),_(We,Ge)}),c(Oe),_(ge,Oe)};Y(ve,ge=>{r(l).changed.length>0&&ge(fe)})}var ke=h(ve,2);{var Ae=ge=>{var Oe=o_();_(ge,Oe)};Y(ke,ge=>{r(l).added.length===0&&r(l).removed.length===0&&r(l).changed.length===0&&ge(Ae)})}c(se),c(G),$(()=>X(ee,`Diff: #${r(i)??""} vs #${r(s)??""}`)),_(ne,G)};Y(J,ne=>{r(l)&&ne(ae)})}var re=h(J,2);{var ie=ne=>{var G=h_(),oe=d(G),ee=d(oe),se=d(ee,!0);c(ee);var te=h(ee,2),ue=d(te,!0);c(te);var le=h(te,2),he=d(le,!0);c(le),c(oe);var ve=h(oe,2);{var fe=Qe=>{var kt=l_(),ce=d(kt);dr(ce,{size:12});var Ie=h(ce,2),rt=d(Ie);c(Ie);var lt=h(Ie,2);{var vt=yt=>{var bt=i_(),Mt=d(bt);c(bt),$(()=>X(Mt,`from checkpoint #${r(f).parent_index??""}`)),_(yt,bt)};Y(lt,yt=>{r(f).parent_index!==null&&r(f).parent_index!==void 0&&yt(vt)})}c(kt),$(()=>X(rt,`Branch: ${r(f).branch_id??""}`)),_(Qe,kt)};Y(ve,Qe=>{r(f).branch_id&&Qe(fe)})}var ke=h(ve,2),Ae=d(ke),ge=d(Ae);{var Oe=Qe=>{Yr(Qe,{size:12})},Ye=Qe=>{Xr(Qe,{size:12})};Y(ge,Qe=>{r(p)?Qe(Oe):Qe(Ye,!1)})}var We=h(ge,4),it=d(We);c(We),c(Ae);var Ge=h(Ae,2);{var ct=Qe=>{var kt=u_(),ce=d(kt);je(ce,17,()=>Object.entries(r(f).state),wt,(vt,yt)=>{var bt=k(()=>dn(r(yt),2));let Mt=()=>r(bt)[0],Lt=()=>r(bt)[1];var Ht=c_(),Xt=d(Ht),kn=d(Xt);c(Xt);var Sn=h(Xt,2),Ln=d(Sn,!0);c(Sn),c(Ht),$(rr=>{X(kn,`${Mt()??""}:`),X(Ln,rr)},[()=>b(Lt())]),_(vt,Ht)});var Ie=h(ce,2);{var rt=vt=>{var yt=d_();_(vt,yt)},lt=k(()=>Object.keys(r(f).state).length===0);Y(Ie,vt=>{r(lt)&&vt(rt)})}c(kt),_(Qe,kt)};Y(Ge,Qe=>{r(p)&&Qe(ct)})}c(ke);var Nt=h(ke,2),gt=d(Nt),dt=d(gt);{var xt=Qe=>{Yr(Qe,{size:12})},Pe=Qe=>{Xr(Qe,{size:12})};Y(dt,Qe=>{r(m)?Qe(xt):Qe(Pe,!1)})}var pn=h(dt,4),wn=d(pn);c(pn),c(gt);var hn=h(gt,2);{var Sr=Qe=>{var kt=p_(),ce=d(kt);je(ce,17,()=>Object.entries(r(f).inputs),wt,(vt,yt)=>{var bt=k(()=>dn(r(yt),2));let Mt=()=>r(bt)[0],Lt=()=>r(bt)[1];var Ht=v_(),Xt=d(Ht),kn=d(Xt);c(Xt);var Sn=h(Xt,2),Ln=d(Sn,!0);c(Sn),c(Ht),$(rr=>{X(kn,`${Mt()??""}:`),X(Ln,rr)},[()=>b(Lt())]),_(vt,Ht)});var Ie=h(ce,2);{var rt=vt=>{var yt=f_();_(vt,yt)},lt=k(()=>Object.keys(r(f).inputs).length===0);Y(Ie,vt=>{r(lt)&&vt(rt)})}c(kt),_(Qe,kt)};Y(hn,Qe=>{r(m)&&Qe(Sr)})}c(Nt),c(G),$((Qe,kt,ce,Ie,rt,lt)=>{st(ee,`background: ${Qe??""}20; color: ${kt??""}`),X(se,r(f).node_id),X(ue,ce),X(he,Ie),X(it,`${rt??""} keys`),X(wn,`${lt??""} keys`)},[()=>M(r(f).node_id),()=>M(r(f).node_id),()=>O(r(f).timestamp),()=>F(r(f).timestamp),()=>Object.keys(r(f).state).length,()=>Object.keys(r(f).inputs).length]),be("click",Ae,()=>y(p,!r(p))),be("click",gt,()=>y(m,!r(m))),_(ne,G)};Y(re,ne=>{r(f)&&ne(ie)})}$(()=>X(T,`${n().length??""} checkpoint${n().length===1?"":"s"}`)),be("click",D,E),_(x,S)};Y(B,x=>{n().length===0?x(K):x(Z,!1)})}c(A),_(t,A),Ce(),o()}_t(["click"]);var y_=P('
    Loading history...
    '),b_=P('
    No version history yet
    '),x_=P('
    '),w_=P('
    '),k_=P('
    Version History
    ');function S_(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q($t([])),s=Q(!1),l=Q(null);async function u(){const R=n();if(R){y(s,!0);try{y(i,await ot.projects.getHistory(R.name),!0)}catch{y(i,[],!0)}finally{y(s,!1)}}}async function v(R){const b=n();if(b)try{await ot.projects.bookmarkVersion(b.name,R,`bookmark-${R.slice(0,7)}`),await u(),Ue("Version bookmarked","success")}catch{Ue("Failed to bookmark","error")}}async function p(R){const b=n();if(b)try{await ot.projects.restoreVersion(b.name,R),y(l,null),await u(),Ue("Restored to version "+R.slice(0,7),"success")}catch{Ue("Failed to restore","error")}}function m(R){const b=Date.now(),A=new Date(R).getTime(),B=b-A,K=Math.floor(B/6e4);if(K<1)return"just now";if(K<60)return`${K}m ago`;const Z=Math.floor(K/60);return Z<24?`${Z}h ago`:`${Math.floor(Z/24)}d ago`}_e(()=>{n()&&u()});var f=k_(),w=d(f),N=h(d(w),2),E=d(N);mt(E,{size:13}),c(N),c(w);var I=h(w,2),H=d(I);{var O=R=>{var b=y_(),A=d(b);mt(A,{size:16,class:"spin"}),ye(2),c(b),_(R,b)},F=R=>{var b=b_(),A=d(b);Jo(A,{size:16}),ye(2),c(b),_(R,b)},M=R=>{var b=Me(),A=de(b);je(A,17,()=>r(i),B=>B.sha,(B,K)=>{var Z=w_();let x;var S=d(Z),z=d(S);Jo(z,{size:14}),c(S);var g=h(S,2),C=d(g),T=d(C,!0);c(C);var D=h(C,2),V=d(D,!0);c(D);var L=h(D,2),q=d(L,!0);c(L),c(g);var j=h(g,2),U=d(j);let W;var J=d(U);{let oe=k(()=>r(K).bookmarked?"currentColor":"none");Nc(J,{size:13,get fill(){return r(oe)}})}c(U);var ae=h(U,2);let re;var ie=d(ae);Sc(ie,{size:13}),c(ae),c(j);var ne=h(j,2);{var G=oe=>{var ee=x_(),se=d(ee),te=d(se);c(se);var ue=h(se,2),le=h(ue,2);c(ee),$(he=>X(te,`Restore to ${he??""}?`),[()=>r(K).sha.slice(0,7)]),be("click",ue,()=>p(r(K).sha)),be("click",le,()=>y(l,null)),_(oe,ee)};Y(ne,oe=>{r(l)===r(K).sha&&oe(G)})}c(Z),$((oe,ee)=>{x=De(Z,1,"version-item svelte-1jltp3m",null,x,{confirming:r(l)===r(K).sha}),X(T,oe),X(V,r(K).message),X(q,ee),W=De(U,1,"action-btn bookmark-btn svelte-1jltp3m",null,W,{bookmarked:r(K).bookmarked}),xe(U,"title",r(K).bookmarked?"Bookmarked":"Bookmark this version"),re=De(ae,1,"action-btn restore-btn svelte-1jltp3m",null,re,{visible:r(l)===r(K).sha})},[()=>r(K).sha.slice(0,7),()=>m(r(K).timestamp)]),be("click",U,()=>v(r(K).sha)),be("click",ae,()=>y(l,r(K).sha,!0)),_(B,Z)}),_(R,b)};Y(H,R=>{r(s)?R(O):r(i).length===0?R(F,1):R(M,!1)})}c(I),c(f),$(()=>N.disabled=r(s)),be("click",N,u),_(t,f),Ce(),o()}_t(["click"]);var z_=P('
    Loading...
    '),C_=P('
    No connectors available
    '),E_=P('Installed'),N_=P(" Install",1),M_=P(''),P_=P('
    '),T_=P('
    '),I_=P('
    No custom tools defined. Create one to get started.
    '),A_=P('
    '),D_=P('
    '),O_=P('
    ');function R_(t,e){ze(e,!0);let n=Q("connectors"),a=Q(!1),o=Q($t([])),i=Q(null),s=Q($t([]));async function l(){y(a,!0);try{y(o,await ot.customTools.catalog(),!0)}catch{y(o,[],!0),Ue("Failed to load connector catalog","error")}finally{y(a,!1)}}async function u(){y(a,!0);try{y(s,await ot.customTools.list(),!0)}catch{y(s,[],!0),Ue("Failed to load custom tools","error")}finally{y(a,!1)}}async function v(x){y(i,x,!0);try{await ot.customTools.installConnector(x),Ue("Connector installed","success"),await l()}catch{Ue("Failed to install connector","error")}finally{y(i,null)}}async function p(x){try{await ot.customTools.delete(x),Ue("Tool deleted","success"),await u()}catch{Ue("Failed to delete tool","error")}}_e(()=>{r(n)==="connectors"?l():u()});var m=O_(),f=d(m),w=d(f),N=d(w);let E;var I=d(N);Ya(I,{size:12}),ye(),c(N);var H=h(N,2);let O;var F=d(H);Xn(F,{size:12}),ye(),c(H),c(w);var M=h(w,2),R=d(M);mt(R,{size:13}),c(M),c(f);var b=h(f,2),A=d(b);{var B=x=>{var S=z_(),z=d(S);mt(z,{size:16}),ye(2),c(S),_(x,S)},K=x=>{var S=Me(),z=de(S);{var g=T=>{var D=C_(),V=d(D);Ya(V,{size:16}),ye(2),c(D),_(T,D)},C=T=>{var D=T_();je(D,21,()=>r(o),V=>V.id,(V,L)=>{var q=P_(),j=d(q),U=d(j,!0);c(j);var W=h(j,2),J=d(W),ae=d(J),re=d(ae,!0);c(ae);var ie=h(ae,2);{var ne=he=>{var ve=E_();_(he,ve)};Y(ie,he=>{r(L).installed&&he(ne)})}c(J);var G=h(J,2),oe=d(G,!0);c(G);var ee=h(G,2),se=d(ee,!0);c(ee),c(W);var te=h(W,2),ue=d(te);{var le=he=>{var ve=M_(),fe=d(ve);{var ke=ge=>{var Oe=qs("Installing...");_(ge,Oe)},Ae=ge=>{var Oe=N_(),Ye=de(Oe);ca(Ye,{size:11}),ye(),_(ge,Oe)};Y(fe,ge=>{r(i)===r(L).id?ge(ke):ge(Ae,!1)})}c(ve),$(()=>ve.disabled=r(i)===r(L).id),be("click",ve,()=>v(r(L).id)),_(he,ve)};Y(ue,he=>{r(L).installed||he(le)})}c(te),c(q),$(()=>{X(U,r(L).icon),X(re,r(L).name),X(oe,r(L).description),X(se,r(L).category)}),_(V,q)}),c(D),_(T,D)};Y(z,T=>{r(o).length===0?T(g):T(C,!1)})}_(x,S)},Z=x=>{var S=Me(),z=de(S);{var g=T=>{var D=I_(),V=d(D);Xn(V,{size:16}),ye(2),c(D),_(T,D)},C=T=>{var D=D_();je(D,21,()=>r(s),V=>V.name,(V,L)=>{var q=A_(),j=d(q),U=d(j),W=d(U,!0);c(U);var J=h(U,2),ae=d(J,!0);c(J);var re=h(J,2),ie=d(re,!0);c(re),c(j);var ne=h(j,2),G=d(ne),oe=d(G);Wn(oe,{size:13}),c(G),c(ne),c(q),$(()=>{X(W,r(L).name),X(ae,r(L).tool_type),X(ie,r(L).description)}),be("click",G,()=>p(r(L).name)),_(V,q)}),c(D),_(T,D)};Y(z,T=>{r(s).length===0?T(g):T(C,!1)})}_(x,S)};Y(A,x=>{r(a)?x(B):r(n)==="connectors"?x(K,1):x(Z,!1)})}c(b),c(m),$(()=>{E=De(N,1,"sub-tab svelte-1g6pzvd",null,E,{active:r(n)==="connectors"}),O=De(H,1,"sub-tab svelte-1g6pzvd",null,O,{active:r(n)==="tools"})}),be("click",N,()=>y(n,"connectors")),be("click",H,()=>y(n,"tools")),be("click",M,()=>r(n)==="connectors"?l():u()),_(t,m),Ce()}_t(["click"]);var L_=P('
    Loading...
    '),H_=P('
    No datasets. Upload a JSON or CSV file to get started.
    '),V_=P(''),F_=P('
    '),B_=P(' '),q_=P('
    '),K_=P('
    '),j_=P('
    Total
    Passed
    Failed
    Pass Rate
    '),Z_=P('
    Evaluate
    ');function Y_(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(null),u=Q(!1),v=Q(null),p=Q(void 0);async function m(){const L=n();if(L){y(i,!0);try{y(s,await ot.evaluate.listDatasets(L.name),!0)}catch{y(s,[],!0),Ue("Failed to load datasets","error")}finally{y(i,!1)}}}async function f(){if(!n()){Ue("Select a project first","error");return}r(p)?.click()}async function w(L){const q=n();if(!q)return;const j=L.target,U=j.files?.[0];if(U){try{const W=await ot.evaluate.uploadDataset(q.name,U);Ue(`Dataset uploaded: ${W.test_cases} test cases`,"success"),await m()}catch{Ue("Failed to upload dataset","error")}j.value=""}}async function N(){const L=n();if(!(!L||!r(l))){y(u,!0),y(v,null);try{const q=Ks();y(v,await ot.evaluate.run(L.name,r(l),q),!0),Ue(`Evaluation complete: ${r(v).pass_rate.toFixed(1)}% pass rate`,"success")}catch{Ue("Evaluation failed","error")}finally{y(u,!1)}}}_e(()=>{n()&&m()});var E=Z_(),I=d(E),H=h(d(I),2),O=d(H),F=d(O);Mc(F,{size:12}),ye(),c(O);var M=h(O,2),R=d(M);mt(R,{size:13}),c(M),c(H);var b=h(H,2);bn(b,L=>y(p,L),()=>r(p)),c(I);var A=h(I,2),B=d(A),K=h(d(B),2);{var Z=L=>{var q=L_(),j=d(q);mt(j,{size:13}),ye(2),c(q),_(L,q)},x=L=>{var q=H_(),j=d(q);Go(j,{size:13}),ye(2),c(q),_(L,q)},S=L=>{var q=F_();je(q,21,()=>r(s),j=>j.filename,(j,U)=>{var W=V_();let J;var ae=d(W);Go(ae,{size:12});var re=h(ae,2),ie=d(re,!0);c(re);var ne=h(re,2),G=d(ne);c(ne),c(W),$(()=>{J=De(W,1,"dataset-item svelte-3xr44d",null,J,{selected:r(l)===r(U).filename}),X(ie,r(U).filename),X(G,`${r(U).test_cases??""} cases`)}),be("click",W,()=>y(l,r(U).filename,!0)),_(j,W)}),c(q),_(L,q)};Y(K,L=>{r(i)?L(Z):r(s).length===0?L(x,1):L(S,!1)})}c(B);var z=h(B,2),g=d(z),C=d(g);ec(C,{size:12});var T=h(C);c(g),c(z);var D=h(z,2);{var V=L=>{var q=j_(),j=h(d(q),2),U=d(j),W=d(U),J=d(W,!0);c(W),ye(2),c(U);var ae=h(U,2),re=d(ae),ie=d(re,!0);c(re),ye(2),c(ae);var ne=h(ae,2),G=d(ne),oe=d(G,!0);c(G),ye(2),c(ne);var ee=h(ne,2),se=d(ee),te=d(se);c(se),ye(2),c(ee),c(j);var ue=h(j,2);{var le=he=>{var ve=K_();je(ve,21,()=>r(v).results,wt,(fe,ke)=>{var Ae=q_();let ge;var Oe=d(Ae),Ye=d(Oe);{var We=dt=>{pc(dt,{size:12})},it=dt=>{hc(dt,{size:12})};Y(Ye,dt=>{r(ke).passed?dt(We):dt(it,!1)})}c(Oe);var Ge=h(Oe,2),ct=d(Ge,!0);c(Ge);var Nt=h(Ge,2);{var gt=dt=>{var xt=B_(),Pe=d(xt,!0);c(xt),$(()=>X(Pe,r(ke).error)),_(dt,xt)};Y(Nt,dt=>{r(ke).error&&dt(gt)})}c(Ae),$(()=>{ge=De(Ae,1,"result-row svelte-3xr44d",null,ge,{passed:r(ke).passed,failed:!r(ke).passed}),X(ct,r(ke).input)}),_(fe,Ae)}),c(ve),_(he,ve)};Y(ue,he=>{r(v).results.length>0&&he(le)})}c(q),$(he=>{X(J,r(v).total),X(ie,r(v).passed),X(oe,r(v).failed),X(te,`${he??""}%`)},[()=>r(v).pass_rate.toFixed(1)]),_(L,q)};Y(D,L=>{r(v)&&L(V)})}c(A),c(E),$(()=>{g.disabled=!r(l)||r(u)||!n(),X(T,` ${r(u)?"Running...":"Run Evaluation"}`)}),be("click",O,f),be("click",M,m),be("change",b,w),be("click",g,N),_(t,E),Ce(),o()}_t(["click","change"]);var X_=P(''),W_=P('
    %
    '),G_=P('
    '),U_=P('
    Loading...
    '),Q_=P('
    No experiments yet. Create one to A/B test pipeline variants.
    '),J_=P('
    '),$_=P('
    '),e0=P('
    '),t0=P('
    Experiments
    ');function n0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(!1),u=Q(""),v=Q($t([{name:"Control",pipeline:"default",traffic:50},{name:"Variant A",pipeline:"default",traffic:50}]));async function p(){const g=n();if(g){y(i,!0);try{y(s,await ot.experiments.list(g.name),!0)}catch{y(s,[],!0),Ue("Failed to load experiments","error")}finally{y(i,!1)}}}async function m(){const g=n();if(!(!g||!r(u).trim()))try{await ot.experiments.create(g.name,r(u).trim(),r(v)),Ue("Experiment created","success"),y(u,""),y(l,!1),y(v,[{name:"Control",pipeline:"default",traffic:50},{name:"Variant A",pipeline:"default",traffic:50}],!0),await p()}catch{Ue("Failed to create experiment","error")}}async function f(g){const C=n();if(C)try{await ot.experiments.delete(C.name,g),Ue("Experiment deleted","success"),await p()}catch{Ue("Failed to delete experiment","error")}}function w(){const g=r(v).length+1;y(v,[...r(v),{name:`Variant ${String.fromCharCode(64+g)}`,pipeline:"default",traffic:0}],!0)}function N(g){y(v,r(v).filter((C,T)=>T!==g),!0)}function E(g){switch(g){case"running":return"badge-running";case"completed":return"badge-completed";default:return"badge-draft"}}_e(()=>{n()&&p()});var I=t0(),H=d(I),O=h(d(H),2),F=d(O),M=d(F);Wo(M,{size:12}),ye(),c(F);var R=h(F,2),b=d(R);mt(b,{size:13}),c(R),c(O),c(H);var A=h(H,2),B=d(A);{var K=g=>{var C=G_(),T=d(C),D=h(d(T),2);Ct(D),c(T);var V=h(T,2),L=h(d(V),2),q=d(L);je(q,17,()=>r(v),wt,(re,ie,ne)=>{var G=W_(),oe=d(G);Ct(oe);var ee=h(oe,2);Ct(ee);var se=h(ee,2),te=d(se);Ct(te),xe(te,"min",0),xe(te,"max",100),ye(2),c(se);var ue=h(se,2);{var le=he=>{var ve=X_(),fe=d(ve);Wn(fe,{size:11}),c(ve),be("click",ve,()=>N(ne)),_(he,ve)};Y(ue,he=>{r(v).length>2&&he(le)})}c(G),on(oe,()=>r(ie).name,he=>r(ie).name=he),on(ee,()=>r(ie).pipeline,he=>r(ie).pipeline=he),on(te,()=>r(ie).traffic,he=>r(ie).traffic=he),_(re,G)});var j=h(q,2),U=d(j);Wo(U,{size:11}),ye(),c(j),c(L),c(V);var W=h(V,2),J=d(W),ae=h(J,2);c(W),c(C),$(re=>J.disabled=re,[()=>!r(u).trim()]),on(D,()=>r(u),re=>y(u,re)),be("click",j,w),be("click",J,m),be("click",ae,()=>y(l,!1)),_(g,C)};Y(B,g=>{r(l)&&g(K)})}var Z=h(B,2);{var x=g=>{var C=U_(),T=d(C);mt(T,{size:16}),ye(2),c(C),_(g,C)},S=g=>{var C=Q_(),T=d(C);Us(T,{size:16}),ye(2),c(C),_(g,C)},z=g=>{var C=e0();je(C,21,()=>r(s),T=>T.id,(T,D)=>{var V=$_(),L=d(V),q=d(L);dr(q,{size:13});var j=h(q,2),U=d(j,!0);c(j);var W=h(j,2),J=d(W,!0);c(W);var ae=h(W,2),re=d(ae,!0);c(ae);var ie=h(ae,2),ne=d(ie);Wn(ne,{size:12}),c(ie),c(L);var G=h(L,2);je(G,21,()=>r(D).variants,oe=>oe.name,(oe,ee)=>{var se=J_(),te=d(se),ue=d(te,!0);c(te);var le=h(te,2),he=d(le);let ve;c(le);var fe=h(le,2),ke=d(fe);c(fe),c(se),$(()=>{X(ue,r(ee).name),ve=st(he,"",ve,{width:`${r(ee).traffic??""}%`}),X(ke,`${r(ee).traffic??""}%`)}),_(oe,se)}),c(G),c(V),$((oe,ee)=>{X(U,r(D).name),De(W,1,`status-badge ${oe??""}`,"svelte-oe5i1m"),X(J,r(D).status),X(re,ee)},[()=>E(r(D).status),()=>new Date(r(D).created_at).toLocaleDateString()]),be("click",ie,()=>f(r(D).id)),_(T,V)}),c(C),_(g,C)};Y(Z,g=>{r(i)?g(x):r(s).length===0&&!r(l)?g(S,1):g(z,!1)})}c(A),c(I),be("click",F,()=>y(l,!r(l))),be("click",R,p),_(t,I),Ce(),o()}_t(["click"]);var r0=P(" Copied",1),a0=P(" Copy",1),o0=P(' ',1),s0=P(" Generating...",1),i0=P(" Export as Python",1),l0=P('
     
    '),c0=P('
    Generating Python code...
    '),d0=P('
    Click "Export as Python" to generate deployable code from your pipeline.
    '),u0=P('
    Deploy / Export
    ');function v0(t,e){ze(e,!0);let n=Q(!1),a=Q(""),o=Q(!1);async function i(){y(n,!0),y(a,"");try{const b=Ks(),A=await ot.codegen.toCode(b);y(a,A.code,!0),Ue("Code generated successfully","success")}catch{Ue("Failed to generate code","error")}finally{y(n,!1)}}async function s(){if(r(a))try{await navigator.clipboard.writeText(r(a)),y(o,!0),Ue("Copied to clipboard","info"),setTimeout(()=>y(o,!1),2e3)}catch{Ue("Failed to copy","error")}}function l(){if(!r(a))return;const b=new Blob([r(a)],{type:"text/x-python"}),A=URL.createObjectURL(b),B=document.createElement("a");B.href=A,B.download="pipeline.py",B.click(),URL.revokeObjectURL(A),Ue("Download started","info")}var u=u0(),v=d(u),p=h(d(v),2),m=d(p);{var f=b=>{var A=o0(),B=de(A),K=d(B);{var Z=g=>{var C=r0(),T=de(C);ho(T,{size:12}),ye(),_(g,C)},x=g=>{var C=a0(),T=de(C);Gs(T,{size:12}),ye(),_(g,C)};Y(K,g=>{r(o)?g(Z):g(x,!1)})}c(B);var S=h(B,2),z=d(S);ca(z,{size:12}),ye(),c(S),be("click",B,s),be("click",S,l),_(b,A)};Y(m,b=>{r(a)&&b(f)})}var w=h(m,2),N=d(w);{var E=b=>{var A=s0(),B=de(A);mt(B,{size:12}),ye(),_(b,A)},I=b=>{var A=i0(),B=de(A);ja(B,{size:12}),ye(),_(b,A)};Y(N,b=>{r(n)?b(E):b(I,!1)})}c(w),c(p),c(v);var H=h(v,2),O=d(H);{var F=b=>{var A=l0(),B=d(A),K=d(B),Z=d(K,!0);c(K),c(B),c(A),$(()=>X(Z,r(a))),_(b,A)},M=b=>{var A=c0(),B=d(A);mt(B,{size:16}),ye(2),c(A),_(b,A)},R=b=>{var A=d0(),B=d(A);ja(B,{size:16}),ye(2),c(A),_(b,A)};Y(O,b=>{r(a)?b(F):r(n)?b(M,1):b(R,!1)})}c(H),c(u),$(()=>w.disabled=r(n)),be("click",w,i),_(t,u),Ce()}_t(["click"]);var f0=P('
    Loading usage data...
    '),p0=P('
    No usage data available. Run a pipeline to see metrics.
    '),h0=P('
    '),g0=P('
    By Model
    Model Requests Tokens Cost
    '),m0=P('
    '),_0=P('
    By Agent
    Agent Requests Tokens Cost
    '),y0=P('
    Total Requests
    Total Tokens
    Total Cost
    Avg Latency
    ',1),b0=P('
    Monitor
    ');function x0(t,e){ze(e,!0);let n=Q(!1),a=Q(null);async function o(){y(n,!0);try{y(a,await ot.monitoring.usage(),!0)}catch{y(a,null),Ue("Failed to load usage data","error")}finally{y(n,!1)}}function i(H){return H>=1e6?`${(H/1e6).toFixed(1)}M`:H>=1e3?`${(H/1e3).toFixed(1)}K`:H.toString()}function s(H){return`$${H.toFixed(4)}`}function l(H,O){return O===0?"0ms":`${Math.round(H/O)}ms`}_e(()=>{o()});var u=b0(),v=d(u),p=h(d(v),2),m=d(p);mt(m,{size:13}),c(p),c(v);var f=h(v,2),w=d(f);{var N=H=>{var O=f0(),F=d(O);mt(F,{size:16}),ye(2),c(O),_(H,O)},E=H=>{var O=p0(),F=d(O);Qs(F,{size:16}),ye(2),c(O),_(H,O)},I=H=>{var O=y0(),F=de(O),M=d(F),R=d(M),b=d(R);yc(b,{size:14}),c(R);var A=h(R,2),B=d(A),K=d(B,!0);c(B),ye(2),c(A),c(M);var Z=h(M,2),x=d(Z),S=d(x);tc(S,{size:14}),c(x);var z=h(x,2),g=d(z),C=d(g,!0);c(g),ye(2),c(z),c(Z);var T=h(Z,2),D=d(T),V=d(D);gc(V,{size:14}),c(D);var L=h(D,2),q=d(L),j=d(q,!0);c(q),ye(2),c(L),c(T);var U=h(T,2),W=d(U),J=d(W);go(J,{size:14}),c(W);var ae=h(W,2),re=d(ae),ie=d(re,!0);c(re),ye(2),c(ae),c(U),c(F);var ne=h(F,2),G=d(ne);{var oe=le=>{var he=g0(),ve=h(d(he),2),fe=h(d(ve),2);je(fe,17,()=>Object.entries(r(a).by_model),([ke,Ae])=>ke,(ke,Ae)=>{var ge=k(()=>dn(r(Ae),2));let Oe=()=>r(ge)[0],Ye=()=>r(ge)[1];var We=h0(),it=d(We),Ge=d(it,!0);c(it);var ct=h(it,2),Nt=d(ct,!0);c(ct);var gt=h(ct,2),dt=d(gt,!0);c(gt);var xt=h(gt,2),Pe=d(xt,!0);c(xt),c(We),$((pn,wn,hn)=>{X(Ge,Oe()),X(Nt,pn),X(dt,wn),X(Pe,hn)},[()=>i(Ye().requests),()=>i(Ye().total_tokens),()=>s(Ye().cost_usd)]),_(ke,We)}),c(ve),c(he),_(le,he)},ee=k(()=>Object.keys(r(a).by_model).length>0);Y(G,le=>{r(ee)&&le(oe)})}var se=h(G,2);{var te=le=>{var he=_0(),ve=h(d(he),2),fe=h(d(ve),2);je(fe,17,()=>Object.entries(r(a).by_agent),([ke,Ae])=>ke,(ke,Ae)=>{var ge=k(()=>dn(r(Ae),2));let Oe=()=>r(ge)[0],Ye=()=>r(ge)[1];var We=m0(),it=d(We),Ge=d(it,!0);c(it);var ct=h(it,2),Nt=d(ct,!0);c(ct);var gt=h(ct,2),dt=d(gt,!0);c(gt);var xt=h(gt,2),Pe=d(xt,!0);c(xt),c(We),$((pn,wn,hn)=>{X(Ge,Oe()),X(Nt,pn),X(dt,wn),X(Pe,hn)},[()=>i(Ye().requests),()=>i(Ye().total_tokens),()=>s(Ye().cost_usd)]),_(ke,We)}),c(ve),c(he),_(le,he)},ue=k(()=>Object.keys(r(a).by_agent).length>0);Y(se,le=>{r(ue)&&le(te)})}c(ne),$((le,he,ve,fe)=>{X(K,le),X(C,he),X(j,ve),X(ie,fe)},[()=>i(r(a).total_requests),()=>i(r(a).total_tokens),()=>s(r(a).total_cost_usd),()=>l(r(a).total_latency_ms,r(a).total_requests)]),_(H,O)};Y(w,H=>{r(n)&&!r(a)?H(N):r(a)?H(I,!1):H(E,1)})}c(f),c(u),$(()=>p.disabled=r(n)),be("click",p,o),_(t,u),Ce()}_t(["click"]);var w0=P(' ',1),k0=P('Files'),S0=P('
    Loading file...
    '),z0=P('
     
    '),C0=P('
    Loading files...
    '),E0=P('
    No files in this project.
    '),N0=P('
    '),M0=P(" "),P0=P(''),T0=P('
    '),I0=P('
    ');function A0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",a),[a,o]=Ot();let i=Q(!1),s=Q($t([])),l=Q(null),u=Q(""),v=Q(!1);async function p(){const z=n();if(z){y(i,!0);try{y(s,await ot.files.list(z.name),!0)}catch{y(s,[],!0)}finally{y(i,!1)}}}async function m(z){const g=n();if(g){y(v,!0),y(l,z,!0);try{const C=await ot.files.read(g.name,z);y(u,C.content,!0)}catch{y(u,"// Failed to load file content")}finally{y(v,!1)}}}function f(){y(l,null),y(u,"")}function w(z){const g=z.split(".");return g.length>1?g[g.length-1]:""}function N(z){switch(w(z)){case"py":return"ext-python";case"ts":case"js":return"ext-js";case"json":return"ext-json";case"yaml":case"yml":return"ext-yaml";case"md":return"ext-md";default:return""}}function E(z){return z<1024?`${z} B`:z<1024*1024?`${(z/1024).toFixed(1)} KB`:`${(z/(1024*1024)).toFixed(1)} MB`}_e(()=>{n()&&(y(l,null),y(u,""),p())});var I=I0(),H=d(I),O=d(H);{var F=z=>{var g=w0(),C=de(g),T=d(C);dc(T,{size:13}),c(C);var D=h(C,2),V=d(D,!0);c(D),$(()=>X(V,r(l))),be("click",C,f),_(z,g)},M=z=>{var g=k0();_(z,g)};Y(O,z=>{r(l)?z(F):z(M,!1)})}var R=h(O,2),b=d(R);mt(b,{size:13}),c(R),c(H);var A=h(H,2),B=d(A);{var K=z=>{var g=Me(),C=de(g);{var T=V=>{var L=S0(),q=d(L);mt(q,{size:16}),ye(2),c(L),_(V,L)},D=V=>{var L=z0(),q=d(L),j=d(q),U=d(j,!0);c(j),c(q),c(L),$(()=>X(U,r(u))),_(V,L)};Y(C,V=>{r(v)?V(T):V(D,!1)})}_(z,g)},Z=z=>{var g=C0(),C=d(g);mt(C,{size:16}),ye(2),c(g),_(z,g)},x=z=>{var g=E0(),C=d(g);Js(C,{size:16}),ye(2),c(g),_(z,g)},S=z=>{var g=T0();je(g,21,()=>r(s),C=>C.path,(C,T)=>{var D=Me(),V=de(D);{var L=j=>{var U=N0(),W=d(U);mc(W,{size:13});var J=h(W,2),ae=d(J,!0);c(J),c(U),$(()=>X(ae,r(T).name)),_(j,U)},q=j=>{var U=P0(),W=d(U);nc(W,{size:13});var J=h(W,2),ae=d(J,!0);c(J);var re=h(J,2);{var ie=se=>{var te=M0(),ue=d(te,!0);c(te),$((le,he)=>{De(te,1,`file-ext ${le??""}`,"svelte-tctccr"),X(ue,he)},[()=>N(r(T).name),()=>w(r(T).name)]),_(se,te)},ne=k(()=>w(r(T).name));Y(re,se=>{r(ne)&&se(ie)})}var G=h(re,2),oe=d(G,!0);c(G);var ee=h(G,2);Xr(ee,{size:11}),c(U),$(se=>{X(ae,r(T).name),X(oe,se)},[()=>E(r(T).size)]),be("click",U,()=>m(r(T).path)),_(j,U)};Y(V,j=>{r(T).is_dir?j(L):j(q,!1)})}_(C,D)}),c(g),_(z,g)};Y(B,z=>{r(l)?z(K):r(i)?z(Z,1):r(s).length===0?z(x,2):z(S,!1)})}c(A),c(I),be("click",R,p),_(t,I),Ce(),o()}_t(["click"]);var D0=P(' '),O0=P(" Analyzing...",1),R0=P(" Analyze",1),L0=P('

    No insights yet

    Click "Analyze" to review your pipeline, or insights will appear automatically as you build.

    '),H0=P('

    '),V0=P('
    '),F0=P('
    Sent to Architect
    '),B0=P('
    Skipped
    '),q0=P('
    '),K0=P(`
    Oracle's Insights
    `);function j0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",s),a=()=>at(js,"$oracleInsights",s),o=()=>at(Yl,"$oracleConnected",s),i=()=>at(Xl,"$oracleAnalyzing",s),[s,l]=Ot(),u={info:{icon:Ws,color:"#3b82f6",label:"Info"},warning:{icon:rc,color:"#f59e0b",label:"Warning"},suggestion:{icon:xc,color:"#8b5cf6",label:"Suggestion"},critical:{icon:Rt,color:"#ef4444",label:"Critical"}};function v(g){return u[g]??u.info}function p(g){if(!g)return"";try{return new Date(g).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}catch{return""}}let m=Q(null);function f(g){y(m,r(m)===g?null:g,!0)}async function w(g){const C=n();if(!C)return;const T=await Gl(C.name,g.id);T&&window.dispatchEvent(new CustomEvent("oracle-approved",{detail:{instruction:T}}))}async function N(g){const C=n();C&&await Ul(C.name,g.id)}let E=k(()=>a().filter(g=>g.status==="pending").length);var I=K0(),H=d(I),O=d(H),F=d(O);Wr(F,{size:14});var M=h(F,4);{var R=g=>{var C=D0(),T=d(C,!0);c(C),$(()=>X(T,r(E))),_(g,C)};Y(M,g=>{r(E)>0&&g(R)})}c(O);var b=h(O,2),A=d(b);{var B=g=>{var C=O0(),T=de(C);Wl(T,{size:12,class:"oracle-spinner"}),ye(2),_(g,C)},K=g=>{var C=R0(),T=de(C);zc(T,{size:12}),ye(2),_(g,C)};Y(A,g=>{i()?g(B):g(K,!1)})}c(b),c(H);var Z=h(H,2),x=d(Z);{var S=g=>{var C=L0(),T=d(C);Wr(T,{size:24}),ye(4),c(C),_(g,C)},z=g=>{var C=Me(),T=de(C);je(T,1,a,D=>D.id,(D,V)=>{const L=k(()=>v(r(V).severity)),q=k(()=>r(L).icon);var j=q0();let U;var W=d(j),J=d(W);let ae;var re=d(J);un(re,()=>r(q),(ve,fe)=>{fe(ve,{size:13})}),c(J);var ie=h(J,2),ne=d(ie,!0);c(ie);var G=h(ie,2),oe=d(G,!0);c(G),c(W);var ee=h(W,2);{var se=ve=>{var fe=H0(),ke=d(fe),Ae=d(ke,!0);c(ke),c(fe),$(()=>X(Ae,r(V).description)),_(ve,fe)};Y(ee,ve=>{r(m)===r(V).id&&ve(se)})}var te=h(ee,2);{var ue=ve=>{var fe=V0(),ke=d(fe),Ae=d(ke);ho(Ae,{size:11}),ye(2),c(ke);var ge=h(ke,2),Oe=d(ge);Ys(Oe,{size:11}),ye(2),c(ge),c(fe),be("click",ke,()=>w(r(V))),be("click",ge,()=>N(r(V))),_(ve,fe)},le=ve=>{var fe=F0();_(ve,fe)},he=ve=>{var fe=B0();_(ve,fe)};Y(te,ve=>{r(V).status==="pending"?ve(ue):r(V).status==="approved"?ve(le,1):ve(he,!1)})}c(j),$(ve=>{U=De(j,1,"insight-card svelte-b2w21g",null,U,{approved:r(V).status==="approved",skipped:r(V).status==="skipped"}),ae=st(J,"",ae,{color:r(L).color}),X(ne,r(V).title),X(oe,ve)},[()=>p(r(V).timestamp)]),be("click",W,()=>f(r(V).id)),be("keydown",W,ve=>ve.key==="Enter"&&f(r(V).id)),_(D,j)}),_(g,C)};Y(x,g=>{a().length===0?g(S):g(z,!1)})}c(Z),c(I),$(()=>b.disabled=!o()||i()),be("click",b,function(...g){Zl?.apply(this,g)}),_(t,I),Ce(),l()}_t(["click","keydown"]);var Z0=P('
    Loading executions...
    '),Y0=P('
    No executions yet. Start the runtime and trigger a pipeline to see results.
    '),X0=P('
    ID
    Status
    Duration
    '),W0=P('
    '),G0=P('
    Status Execution ID Duration
    '),U0=P('
    Executions
    ');function Q0(t,e){ze(e,!0);const n=()=>at(nr,"$currentProject",o),a=()=>at(Za,"$bottomPanelTab",o),[o,i]=Ot();let s=Q(!1),l=Q($t([])),u=Q(null),v=k(()=>n()?.name??""),p=k(a);async function m(){if(r(v)){y(s,!0);try{const K=await ot.runtime.executions(r(v));y(l,K.executions??[],!0)}catch{y(l,[],!0),Ue("Failed to load executions","error")}finally{y(s,!1)}}}function f(K){y(u,r(u)===K?null:K,!0)}function w(K){return K==null?"--":K<1e3?`${K}ms`:`${(K/1e3).toFixed(2)}s`}function N(K){return K.length<=12?K:K.slice(0,8)+"..."}function E(K){switch(K.toLowerCase()){case"completed":case"success":return"var(--color-success)";case"running":case"in_progress":return"#f59e0b";case"failed":case"error":return"var(--color-error)";default:return"var(--color-text-secondary)"}}_e(()=>{r(p)==="executions"&&r(v)&&m()}),_e(()=>{if(r(p)!=="executions"||!r(v))return;const K=setInterval(m,1e4);return()=>clearInterval(K)});var I=U0(),H=d(I),O=h(d(H),2),F=d(O);mt(F,{size:13}),c(O),c(H);var M=h(H,2),R=d(M);{var b=K=>{var Z=Z0(),x=d(Z);mt(x,{size:16}),ye(2),c(Z),_(K,Z)},A=K=>{var Z=Y0(),x=d(Z);ei(x,{size:16}),ye(2),c(Z),_(K,Z)},B=K=>{var Z=G0(),x=h(d(Z),2);je(x,17,()=>r(l),S=>S.execution_id,(S,z)=>{var g=W0(),C=d(g),T=d(C),D=d(T);let V;c(T);var L=h(T,2),q=d(L),j=d(q,!0);c(q),c(L);var U=h(L,2),W=d(U),J=d(W,!0);c(W),c(U);var ae=h(U,2),re=d(ae);{var ie=ee=>{Yr(ee,{size:12})},ne=ee=>{Xr(ee,{size:12})};Y(re,ee=>{r(u)===r(z).execution_id?ee(ie):ee(ne,!1)})}c(ae),c(C);var G=h(C,2);{var oe=ee=>{var se=X0(),te=d(se),ue=h(d(te),2),le=d(ue,!0);c(ue),c(te);var he=h(te,2),ve=h(d(he),2);let fe;var ke=d(ve,!0);c(ve),c(he);var Ae=h(he,2),ge=h(d(Ae),2),Oe=d(ge,!0);c(ge),c(Ae),c(se),$((Ye,We)=>{X(le,r(z).execution_id),fe=st(ve,"",fe,Ye),X(ke,r(z).status),X(Oe,We)},[()=>({color:E(r(z).status)}),()=>w(r(z).duration_ms)]),_(ee,se)};Y(G,ee=>{r(u)===r(z).execution_id&&ee(oe)})}c(g),$((ee,se,te)=>{V=st(D,"",V,ee),xe(L,"title",r(z).execution_id),X(j,se),X(J,te)},[()=>({background:E(r(z).status)}),()=>N(r(z).execution_id),()=>w(r(z).duration_ms)]),be("click",C,()=>f(r(z).execution_id)),_(S,g)}),c(Z),_(K,Z)};Y(R,K=>{r(s)&&r(l).length===0?K(b):r(l).length===0?K(A,1):K(B,!1)})}c(M),c(I),$(()=>O.disabled=r(s)),be("click",O,m),_(t,I),Ce(),i()}_t(["click"]);var J0=P('
    '),$0=P(' '),ey=P(' '),ty=P(' '),ny=P(""),ry=P('
    '),ay=P('
    ');function oy(t,e){ze(e,!0);const n=()=>at(Ka,"$executionEvents",l),a=()=>at(En,"$checkpoints",l),o=()=>at(js,"$oracleInsights",l),i=()=>at(Ta,"$bottomPanelOpen",l),s=()=>at(Za,"$bottomPanelTab",l),[l,u]=Ot(),v=k(()=>n().filter(q=>q.type==="node_error").length),p=k(()=>a().length),m=k(()=>o().filter(q=>q.status==="pending").length),f=[{id:"console",label:"Console",icon:ac},{id:"code",label:"Code",icon:la},{id:"timeline",label:"Timeline",icon:go},{id:"integrations",label:"Integrate",icon:Ya},{id:"evaluate",label:"Evaluate",icon:Us},{id:"experiments",label:"Experiments",icon:dr},{id:"deploy",label:"Deploy",icon:ja},{id:"monitor",label:"Monitor",icon:Qs},{id:"files",label:"Files",icon:Js},{id:"history",label:"History",icon:bc},{id:"oracle",label:"Oracle",icon:Wr},{id:"executions",label:"Executions",icon:ei}];let w=Q(320),N=Q(!1),E=Q(0),I=Q(0);const H=120;function O(){Ta.update(q=>!q)}function F(q){Za.set(q),i()||Ta.set(!0)}function M(q){q.preventDefault(),y(N,!0),y(E,q.clientY,!0),y(I,r(w),!0),document.addEventListener("mousemove",R),document.addEventListener("mouseup",b)}function R(q){if(!r(N))return;const j=Math.floor(window.innerHeight*.6),U=r(E)-q.clientY,W=Math.max(H,Math.min(j,r(I)+U));y(w,W,!0)}function b(){y(N,!1),document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",b)}On(()=>{document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",b)});var A=ay();let B,K;var Z=d(A);{var x=q=>{var j=J0();be("mousedown",j,M),_(q,j)};Y(Z,q=>{i()&&q(x)})}var S=h(Z,2),z=d(S);je(z,21,()=>f,q=>q.id,(q,j)=>{const U=k(()=>r(j).icon);var W=ny();let J;var ae=d(W);un(ae,()=>r(U),(se,te)=>{te(se,{size:13})});var re=h(ae,2),ie=d(re,!0);c(re);var ne=h(re,2);{var G=se=>{var te=$0(),ue=d(te,!0);c(te),$(()=>X(ue,r(v)>99?"99+":r(v))),_(se,te)},oe=se=>{var te=ey(),ue=d(te,!0);c(te),$(()=>X(ue,r(p)>99?"99+":r(p))),_(se,te)},ee=se=>{var te=ty(),ue=d(te,!0);c(te),$(()=>X(ue,r(m)>99?"99+":r(m))),_(se,te)};Y(ne,se=>{r(j).id==="console"&&r(v)>0?se(G):r(j).id==="timeline"&&r(p)>0?se(oe,1):r(j).id==="oracle"&&r(m)>0&&se(ee,2)})}c(W),$(()=>{J=De(W,1,"tab-btn svelte-1m9rotx",null,J,{active:s()===r(j).id}),X(ie,r(j).label)}),be("click",W,()=>F(r(j).id)),_(q,W)}),c(z);var g=h(z,2),C=d(g);{var T=q=>{Yr(q,{size:14})},D=q=>{fc(q,{size:14})};Y(C,q=>{i()?q(T):q(D,!1)})}c(g),c(S);var V=h(S,2);{var L=q=>{var j=ry(),U=d(j);{var W=le=>{V1(le,{})},J=le=>{X1(le,{})},ae=le=>{__(le,{})},re=le=>{R_(le,{})},ie=le=>{Y_(le,{})},ne=le=>{n0(le,{})},G=le=>{v0(le,{})},oe=le=>{x0(le,{})},ee=le=>{A0(le,{})},se=le=>{S_(le,{})},te=le=>{j0(le,{})},ue=le=>{Q0(le,{})};Y(U,le=>{s()==="console"?le(W):s()==="code"?le(J,1):s()==="timeline"?le(ae,2):s()==="integrations"?le(re,3):s()==="evaluate"?le(ie,4):s()==="experiments"?le(ne,5):s()==="deploy"?le(G,6):s()==="monitor"?le(oe,7):s()==="files"?le(ee,8):s()==="history"?le(se,9):s()==="oracle"?le(te,10):s()==="executions"&&le(ue,11)})}c(j),_(q,j)};Y(V,q=>{i()&&q(L)})}c(A),$(()=>{B=De(A,1,"bottom-panel svelte-1m9rotx",null,B,{dragging:r(N)}),K=st(A,"",K,{height:i()?`${r(w)}px`:"36px"}),xe(g,"title",i()?"Collapse panel":"Expand panel")}),be("click",g,O),_(t,A),Ce(),u()}_t(["mousedown","click"]);var sy=P('
    ');function gy(t,e){ze(e,!1),io(()=>oc()),On(()=>sc()),Ls();var n=sy(),a=d(n),o=d(a);zm(o,{});var i=h(o,2);I1(i,{}),c(a);var s=h(a,2);oy(s,{}),c(n),_(t,n),Ce()}export{gy as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/4.BDkuuGZp.js b/studio-desktop/frontend-dist/_app/immutable/nodes/4.BDkuuGZp.js deleted file mode 100644 index 4b874e17..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/4.BDkuuGZp.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/l8YpzWR9.js";import{p as a,o as p,j as r}from"../chunks/DCyBifBO.js";import{g as s}from"../chunks/DhiGuJwU.js";import{b as m,a as n}from"../chunks/BCCFcAOv.js";function l(e,o){a(o,!1),p(()=>{m.set("deploy"),n.set(!0),s("/construct")}),t(),r()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/4.BooAkJEK.js b/studio-desktop/frontend-dist/_app/immutable/nodes/4.BooAkJEK.js deleted file mode 100644 index 17b7f6f0..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/4.BooAkJEK.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/FsCUQR17.js";import{p as a,o as p,b as r}from"../chunks/BNectIeB.js";import{g as s}from"../chunks/DaZstLas.js";import{b as m,a as n}from"../chunks/CKy8R5Mg.js";function l(e,o){a(o,!1),p(()=>{m.set("deploy"),n.set(!0),s("/construct")}),t(),r()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/4.C8sTrwDE.js b/studio-desktop/frontend-dist/_app/immutable/nodes/4.C8sTrwDE.js deleted file mode 100644 index 07b95101..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/4.C8sTrwDE.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/CiPkpaXo.js";import{p as a,o as p,j as r}from"../chunks/BESIXtBI.js";import{g as s}from"../chunks/gvU2Nsg7.js";import{b as m,a as n}from"../chunks/8I91iWf8.js";function l(e,o){a(o,!1),p(()=>{m.set("deploy"),n.set(!0),s("/construct")}),t(),r()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/4.oy6NDEc0.js b/studio-desktop/frontend-dist/_app/immutable/nodes/4.oy6NDEc0.js deleted file mode 100644 index 74323f76..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/4.oy6NDEc0.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/D7CioVkw.js";import{p as a,o as p,f as r}from"../chunks/hL-aZVJ4.js";import{g as s}from"../chunks/DEAaRqcq.js";import{b as m,a as n}from"../chunks/yhLnWQwL.js";function l(e,o){a(o,!1),p(()=>{m.set("deploy"),n.set(!0),s("/construct")}),t(),r()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/5.B_tkw_1h.js b/studio-desktop/frontend-dist/_app/immutable/nodes/5.B_tkw_1h.js deleted file mode 100644 index e6911775..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/5.B_tkw_1h.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/CiPkpaXo.js";import{p as a,o as p,j as r}from"../chunks/BESIXtBI.js";import{g as s}from"../chunks/gvU2Nsg7.js";import{b as e,a as m}from"../chunks/8I91iWf8.js";function l(n,o){a(o,!1),p(()=>{e.set("evaluate"),m.set(!0),s("/construct")}),t(),r()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/5.BzoQF27Z.js b/studio-desktop/frontend-dist/_app/immutable/nodes/5.BzoQF27Z.js deleted file mode 100644 index f8e6a0ad..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/5.BzoQF27Z.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/D7CioVkw.js";import{p as a,o as p,f as r}from"../chunks/hL-aZVJ4.js";import{g as s}from"../chunks/DEAaRqcq.js";import{b as e,a as m}from"../chunks/yhLnWQwL.js";function l(n,o){a(o,!1),p(()=>{e.set("evaluate"),m.set(!0),s("/construct")}),t(),r()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/5.CyZ3q-f3.js b/studio-desktop/frontend-dist/_app/immutable/nodes/5.CyZ3q-f3.js deleted file mode 100644 index 8cc26f4f..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/5.CyZ3q-f3.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/l8YpzWR9.js";import{p as a,o as p,j as r}from"../chunks/DCyBifBO.js";import{g as s}from"../chunks/DhiGuJwU.js";import{b as e,a as m}from"../chunks/BCCFcAOv.js";function l(n,o){a(o,!1),p(()=>{e.set("evaluate"),m.set(!0),s("/construct")}),t(),r()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/5.qrTlHzif.js b/studio-desktop/frontend-dist/_app/immutable/nodes/5.qrTlHzif.js deleted file mode 100644 index 97c4a5bb..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/5.qrTlHzif.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/FsCUQR17.js";import{p as a,o as p,b as r}from"../chunks/BNectIeB.js";import{g as s}from"../chunks/DaZstLas.js";import{b as e,a as m}from"../chunks/CKy8R5Mg.js";function l(n,o){a(o,!1),p(()=>{e.set("evaluate"),m.set(!0),s("/construct")}),t(),r()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/6.Bwo4e0-2.js b/studio-desktop/frontend-dist/_app/immutable/nodes/6.Bwo4e0-2.js deleted file mode 100644 index 14bd01a8..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/6.Bwo4e0-2.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/D7CioVkw.js";import{p as a,o as p,f as r}from"../chunks/hL-aZVJ4.js";import{g as s}from"../chunks/DEAaRqcq.js";import{b as e,a as m}from"../chunks/yhLnWQwL.js";function g(n,o){a(o,!1),p(()=>{e.set("experiments"),m.set(!0),s("/construct")}),t(),r()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/6.D3NTFto7.js b/studio-desktop/frontend-dist/_app/immutable/nodes/6.D3NTFto7.js deleted file mode 100644 index 4ff6f718..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/6.D3NTFto7.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/l8YpzWR9.js";import{p as a,o as p,j as r}from"../chunks/DCyBifBO.js";import{g as s}from"../chunks/DhiGuJwU.js";import{b as e,a as m}from"../chunks/BCCFcAOv.js";function g(n,o){a(o,!1),p(()=>{e.set("experiments"),m.set(!0),s("/construct")}),t(),r()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/6.DbPQnfrb.js b/studio-desktop/frontend-dist/_app/immutable/nodes/6.DbPQnfrb.js deleted file mode 100644 index 90ecf11f..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/6.DbPQnfrb.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/FsCUQR17.js";import{p as a,o as p,b as r}from"../chunks/BNectIeB.js";import{g as s}from"../chunks/DaZstLas.js";import{b as e,a as m}from"../chunks/CKy8R5Mg.js";function g(n,o){a(o,!1),p(()=>{e.set("experiments"),m.set(!0),s("/construct")}),t(),r()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/6.Dt6a6dFW.js b/studio-desktop/frontend-dist/_app/immutable/nodes/6.Dt6a6dFW.js deleted file mode 100644 index ebeb661e..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/6.Dt6a6dFW.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/CiPkpaXo.js";import{p as a,o as p,j as r}from"../chunks/BESIXtBI.js";import{g as s}from"../chunks/gvU2Nsg7.js";import{b as e,a as m}from"../chunks/8I91iWf8.js";function g(n,o){a(o,!1),p(()=>{e.set("experiments"),m.set(!0),s("/construct")}),t(),r()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/7.B1NCeFHv.js b/studio-desktop/frontend-dist/_app/immutable/nodes/7.B1NCeFHv.js deleted file mode 100644 index 5ae1406d..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/7.B1NCeFHv.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/D7CioVkw.js";import{p as a,o as s,f as p}from"../chunks/hL-aZVJ4.js";import{g as r}from"../chunks/DEAaRqcq.js";import{b as m,a as n}from"../chunks/yhLnWQwL.js";function l(e,o){a(o,!1),s(()=>{m.set("files"),n.set(!0),r("/construct")}),t(),p()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/7.C5dO2UUz.js b/studio-desktop/frontend-dist/_app/immutable/nodes/7.C5dO2UUz.js deleted file mode 100644 index 292ae99b..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/7.C5dO2UUz.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/l8YpzWR9.js";import{p as a,o as s,j as p}from"../chunks/DCyBifBO.js";import{g as r}from"../chunks/DhiGuJwU.js";import{b as m,a as n}from"../chunks/BCCFcAOv.js";function l(e,o){a(o,!1),s(()=>{m.set("files"),n.set(!0),r("/construct")}),t(),p()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/7.CMH5WMHy.js b/studio-desktop/frontend-dist/_app/immutable/nodes/7.CMH5WMHy.js deleted file mode 100644 index 10fd58a5..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/7.CMH5WMHy.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/FsCUQR17.js";import{p as a,o as s,b as p}from"../chunks/BNectIeB.js";import{g as r}from"../chunks/DaZstLas.js";import{b as m,a as n}from"../chunks/CKy8R5Mg.js";function l(e,o){a(o,!1),s(()=>{m.set("files"),n.set(!0),r("/construct")}),t(),p()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/7.wgNMEEjV.js b/studio-desktop/frontend-dist/_app/immutable/nodes/7.wgNMEEjV.js deleted file mode 100644 index 534e6c02..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/7.wgNMEEjV.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/CiPkpaXo.js";import{p as a,o as s,j as p}from"../chunks/BESIXtBI.js";import{g as r}from"../chunks/gvU2Nsg7.js";import{b as m,a as n}from"../chunks/8I91iWf8.js";function l(e,o){a(o,!1),s(()=>{m.set("files"),n.set(!0),r("/construct")}),t(),p()}export{l as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/8.B42jxsZB.js b/studio-desktop/frontend-dist/_app/immutable/nodes/8.B42jxsZB.js deleted file mode 100644 index aa7486ca..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/8.B42jxsZB.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/D7CioVkw.js";import{p as a,o as n,f as r}from"../chunks/hL-aZVJ4.js";import{g as s}from"../chunks/DEAaRqcq.js";import{b as p,a as m}from"../chunks/yhLnWQwL.js";function g(e,o){a(o,!1),n(()=>{p.set("integrations"),m.set(!0),s("/construct")}),t(),r()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/8.Bg5shqvn.js b/studio-desktop/frontend-dist/_app/immutable/nodes/8.Bg5shqvn.js deleted file mode 100644 index abcf48ad..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/8.Bg5shqvn.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/CiPkpaXo.js";import{p as a,o as n,j as r}from"../chunks/BESIXtBI.js";import{g as s}from"../chunks/gvU2Nsg7.js";import{b as p,a as m}from"../chunks/8I91iWf8.js";function g(e,o){a(o,!1),n(()=>{p.set("integrations"),m.set(!0),s("/construct")}),t(),r()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/8.DYjLyWgX.js b/studio-desktop/frontend-dist/_app/immutable/nodes/8.DYjLyWgX.js deleted file mode 100644 index dbd9a96a..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/8.DYjLyWgX.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/l8YpzWR9.js";import{p as a,o as n,j as r}from"../chunks/DCyBifBO.js";import{g as s}from"../chunks/DhiGuJwU.js";import{b as p,a as m}from"../chunks/BCCFcAOv.js";function g(e,o){a(o,!1),n(()=>{p.set("integrations"),m.set(!0),s("/construct")}),t(),r()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/8.h4_RvxHO.js b/studio-desktop/frontend-dist/_app/immutable/nodes/8.h4_RvxHO.js deleted file mode 100644 index 579c78ea..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/8.h4_RvxHO.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/FsCUQR17.js";import{p as a,o as n,b as r}from"../chunks/BNectIeB.js";import{g as s}from"../chunks/DaZstLas.js";import{b as p,a as m}from"../chunks/CKy8R5Mg.js";function g(e,o){a(o,!1),n(()=>{p.set("integrations"),m.set(!0),s("/construct")}),t(),r()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/9.B77zeVLD.js b/studio-desktop/frontend-dist/_app/immutable/nodes/9.B77zeVLD.js deleted file mode 100644 index aad17c07..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/9.B77zeVLD.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/FsCUQR17.js";import{p as a,o as r,b as m}from"../chunks/BNectIeB.js";import{g as n}from"../chunks/DaZstLas.js";import{b as p,a as s}from"../chunks/CKy8R5Mg.js";function g(e,o){a(o,!1),r(()=>{p.set("monitor"),s.set(!0),n("/construct")}),t(),m()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/9.C_pv2wQA.js b/studio-desktop/frontend-dist/_app/immutable/nodes/9.C_pv2wQA.js deleted file mode 100644 index fa758db3..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/9.C_pv2wQA.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/l8YpzWR9.js";import{p as a,o as r,j as m}from"../chunks/DCyBifBO.js";import{g as n}from"../chunks/DhiGuJwU.js";import{b as p,a as s}from"../chunks/BCCFcAOv.js";function g(e,o){a(o,!1),r(()=>{p.set("monitor"),s.set(!0),n("/construct")}),t(),m()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/9.D6xlIU6N.js b/studio-desktop/frontend-dist/_app/immutable/nodes/9.D6xlIU6N.js deleted file mode 100644 index cf2d6c46..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/9.D6xlIU6N.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/D7CioVkw.js";import{p as a,o as r,f as m}from"../chunks/hL-aZVJ4.js";import{g as n}from"../chunks/DEAaRqcq.js";import{b as p,a as s}from"../chunks/yhLnWQwL.js";function g(e,o){a(o,!1),r(()=>{p.set("monitor"),s.set(!0),n("/construct")}),t(),m()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/immutable/nodes/9.F5w3hcSN.js b/studio-desktop/frontend-dist/_app/immutable/nodes/9.F5w3hcSN.js deleted file mode 100644 index cb9c8a89..00000000 --- a/studio-desktop/frontend-dist/_app/immutable/nodes/9.F5w3hcSN.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/DsnmJJEf.js";import{i as t}from"../chunks/CiPkpaXo.js";import{p as a,o as r,j as m}from"../chunks/BESIXtBI.js";import{g as n}from"../chunks/gvU2Nsg7.js";import{b as p,a as s}from"../chunks/8I91iWf8.js";function g(e,o){a(o,!1),r(()=>{p.set("monitor"),s.set(!0),n("/construct")}),t(),m()}export{g as component}; diff --git a/studio-desktop/frontend-dist/_app/version.json b/studio-desktop/frontend-dist/_app/version.json deleted file mode 100644 index 48bc4056..00000000 --- a/studio-desktop/frontend-dist/_app/version.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"1771694660316"} \ No newline at end of file diff --git a/studio-desktop/frontend-dist/favicon.png b/studio-desktop/frontend-dist/favicon.png deleted file mode 100644 index 5e1a506972b937f1d478dbb50ce2e2556f0eee1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1276 zcmV^4balYBG*ZQOqgBYh9&*@ax zJsu2>9+3^FM@qq!X^H>%pwaW)-5BRtJSU>YfhnJx0w#Uqfai><>m0%)+CrN<|GFgs z+Ot3Gr-JX`Ios7Z0n)&fC}8~A#Z4V355!w!b9XWykCmVN(+1zG=s>7z0+>WG)y*VvE6Z z!A+vWSJG`+*eY$~w*cEj^=Op1bzMCtlF`fK{Y*Jh(~MLuq=dPZHudp)PGZisp(EF) z&V?!S!x;_Ri8_l!`FbFdf2l02`lpe~MWvIE*WJ}j*}9J)5H9pqMIvcGVIedZ#Hnn6 z;H=V#v+HB?u^TrQ&I`>JScP|fc-}3OkDFCf7+#g-7U;r)Z`fJCj600?=ZE;cr*dBP zyN_Z{?Lia&WF|tf!s>)Y77)#p97d`hhQJ-UiW7b4$Ype(D_1~o2ikuz-2vG=(Rl>c zzKc}WW~X8~ttYWZAXtMAU(5rv82j$6NH_W+c$r6-^7rw5bo z-}F7O%CQ!#13Q>Ue-^fKDFE6DteyxueGr_R%Rg`dzvtVM4kQ5-Yw=S#82+`NGWEa( z3zg#;L_Zn|WY#)yybGV;9^00+0DNx| z<}kwOBvBF_ItM2InNlk1v6sD!y>#nDEUN40touKv=UFB2Rvy5adV3Q{TUtW0rh9j>>K>+9eAA|=gT@G z>`M!|Y2M&B?PAd$T-xzumrkseZShNK=JM*tPLsQO#LPM<+yyFid zO-b?njX=+Bq`#(?|BSpwDn|f-)NJY%;Yr}?Z6NQlEO|V#v;Xg@!JK=6%zge>%l7YA zkstmqW`Q#XeW?7^tG{LE^4^T3Zp#hZNjwI;4O3>s%*|2cyo~q3hsa6CV;rVFaq8H0000 - - - - - - - - - - - - - - -
    - -
    - - diff --git a/studio-desktop/frontend-dist/robots.txt b/studio-desktop/frontend-dist/robots.txt deleted file mode 100644 index b6dd6670..00000000 --- a/studio-desktop/frontend-dist/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# allow crawling everything by default -User-agent: * -Disallow: diff --git a/studio-desktop/pyinstaller/entry_point.py b/studio-desktop/pyinstaller/entry_point.py deleted file mode 100644 index 55eb71ff..00000000 --- a/studio-desktop/pyinstaller/entry_point.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python3 -"""PyInstaller entry point for Firefly Studio desktop app. - -Thin wrapper that invokes the Studio CLI with arguments suitable -for desktop sidecar operation (host, port, no-browser). -""" - -import sys - - -def main() -> None: - """Launch Firefly Studio as a desktop sidecar process.""" - from fireflyframework_agentic.studio.cli import main as studio_main - - studio_main(sys.argv[1:]) - - -if __name__ == "__main__": - main() diff --git a/studio-desktop/pyinstaller/firefly_studio.spec b/studio-desktop/pyinstaller/firefly_studio.spec deleted file mode 100644 index 147c0bfa..00000000 --- a/studio-desktop/pyinstaller/firefly_studio.spec +++ /dev/null @@ -1,89 +0,0 @@ -# -*- mode: python ; coding: utf-8 -*- -"""PyInstaller spec file for Firefly Studio desktop sidecar. - -Builds a single-directory bundle containing the Studio server, -bundled frontend, and all Python dependencies. - -Usage:: - - cd studio-desktop - pyinstaller pyinstaller/firefly_studio.spec -""" - -import os -import sys -from pathlib import Path - -from PyInstaller.utils.hooks import copy_metadata - -# Resolve paths relative to the repository root -REPO_ROOT = Path(SPECPATH).resolve().parent.parent -SRC_DIR = REPO_ROOT / "src" -STATIC_DIR = SRC_DIR / "fireflyframework_agentic" / "studio" / "static" - -# Collect package metadata for packages that call importlib.metadata.version() -pkg_metadata = [] -for pkg in ["genai_prices", "pydantic_ai", "pydantic_ai_slim", "fireflyframework-agentic"]: - try: - pkg_metadata += copy_metadata(pkg) - except Exception: - pass # Package may not be installed - -block_cipher = None - -a = Analysis( - [str(REPO_ROOT / "studio-desktop" / "pyinstaller" / "entry_point.py")], - pathex=[str(SRC_DIR)], - binaries=[], - datas=[ - # Bundle the built frontend static files - (str(STATIC_DIR), os.path.join("fireflyframework_agentic", "studio", "static")), - ] - + pkg_metadata, - hiddenimports=[], - hookspath=[str(REPO_ROOT / "studio-desktop" / "pyinstaller")], - hooksconfig={}, - runtime_hooks=[str(REPO_ROOT / "studio-desktop" / "pyinstaller" / "rthook_disable_logfire.py")], - excludes=[ - "tkinter", - "matplotlib", - "PIL", - "scipy", - "numpy", - "pandas", - "logfire", - ], - noarchive=False, - optimize=0, - cipher=block_cipher, -) - -pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) - -exe = EXE( - pyz, - a.scripts, - [], - exclude_binaries=True, - name="firefly-studio", - debug=False, - bootloader_ignore_signals=False, - strip=False, - upx=True, - console=False, - disable_windowed_traceback=False, - argv_emulation=False, - target_arch=None, - codesign_identity=None, - entitlements_file=None, -) - -coll = COLLECT( - exe, - a.binaries, - a.datas, - strip=False, - upx=True, - upx_exclude=[], - name="firefly-studio", -) diff --git a/studio-desktop/pyinstaller/hook-fireflyframework_genai.py b/studio-desktop/pyinstaller/hook-fireflyframework_genai.py deleted file mode 100644 index a492cafc..00000000 --- a/studio-desktop/pyinstaller/hook-fireflyframework_genai.py +++ /dev/null @@ -1,66 +0,0 @@ -"""PyInstaller hidden-imports hook for fireflyframework-agentic. - -Ensures that all runtime-discovered sub-packages and optional -dependencies are bundled into the frozen executable. -""" - -hiddenimports = [ - # Studio server - "fireflyframework_agentic.studio", - "fireflyframework_agentic.studio.cli", - "fireflyframework_agentic.studio.server", - "fireflyframework_agentic.studio.config", - "fireflyframework_agentic.studio.projects", - "fireflyframework_agentic.studio.api.assistant", - "fireflyframework_agentic.studio.api.checkpoints", - "fireflyframework_agentic.studio.api.codegen", - "fireflyframework_agentic.studio.api.execution", - "fireflyframework_agentic.studio.api.files", - "fireflyframework_agentic.studio.api.monitoring", - "fireflyframework_agentic.studio.api.projects", - "fireflyframework_agentic.studio.api.registry", - "fireflyframework_agentic.studio.api.settings", - "fireflyframework_agentic.studio.api.evaluate", - "fireflyframework_agentic.studio.api.experiments", - "fireflyframework_agentic.studio.settings", - "fireflyframework_agentic.studio.evaluation", - "fireflyframework_agentic.studio.codegen.generator", - "fireflyframework_agentic.studio.codegen.models", - "fireflyframework_agentic.studio.execution.compiler", - "fireflyframework_agentic.studio.execution.runner", - "fireflyframework_agentic.studio.execution.checkpoint", - # Pipeline engine - "fireflyframework_agentic.pipeline.builder", - "fireflyframework_agentic.pipeline.context", - "fireflyframework_agentic.pipeline.dag", - "fireflyframework_agentic.pipeline.engine", - "fireflyframework_agentic.pipeline.steps", - # Agent framework - "fireflyframework_agentic.agents.base", - "fireflyframework_agentic.agents.registry", - "fireflyframework_agentic.agents.context", - "fireflyframework_agentic.agents.middleware", - # Tools & reasoning - "fireflyframework_agentic.tools.registry", - "fireflyframework_agentic.reasoning.registry", - # Config - "fireflyframework_agentic.config", - # Web server dependencies - "uvicorn", - "uvicorn.logging", - "uvicorn.loops", - "uvicorn.loops.auto", - "uvicorn.protocols", - "uvicorn.protocols.http", - "uvicorn.protocols.http.auto", - "uvicorn.protocols.websockets", - "uvicorn.protocols.websockets.auto", - "uvicorn.lifespan", - "uvicorn.lifespan.on", - "fastapi", - "starlette", - "starlette.staticfiles", - "pydantic", - "pydantic_settings", - "httpx", -] diff --git a/studio-desktop/pyinstaller/rthook_disable_logfire.py b/studio-desktop/pyinstaller/rthook_disable_logfire.py deleted file mode 100644 index aece077f..00000000 --- a/studio-desktop/pyinstaller/rthook_disable_logfire.py +++ /dev/null @@ -1,11 +0,0 @@ -"""PyInstaller runtime hook: disable logfire pydantic plugin. - -logfire uses inspect.getsource() which fails in frozen (PyInstaller) -apps because source code is not bundled. This hook prevents logfire -from loading as a pydantic plugin. -""" - -import os - -os.environ["LOGFIRE_SEND_TO_LOGFIRE"] = "false" -os.environ["PYDANTIC_DISABLE_PLUGINS"] = "1" diff --git a/studio-desktop/src-tauri/Cargo.lock b/studio-desktop/src-tauri/Cargo.lock deleted file mode 100644 index c8a52195..00000000 --- a/studio-desktop/src-tauri/Cargo.lock +++ /dev/null @@ -1,5349 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" - -[[package]] -name = "atk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" -dependencies = [ - "atk-sys", - "glib", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" -dependencies = [ - "serde_core", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] - -[[package]] -name = "brotli" -version = "8.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bumpalo" -version = "3.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" - -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -dependencies = [ - "serde", -] - -[[package]] -name = "cairo-rs" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" -dependencies = [ - "bitflags 2.11.0", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.69", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "camino" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" -dependencies = [ - "serde_core", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror 2.0.18", -] - -[[package]] -name = "cargo_toml" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" -dependencies = [ - "serde", - "toml 0.9.12+spec-1.1.0", -] - -[[package]] -name = "cc" -version = "1.2.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" -dependencies = [ - "find-msvc-tools", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfb" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "chrono" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link 0.2.1", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "time", - "version_check", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.1", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.1", - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "cssparser" -version = "0.29.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "matches", - "phf 0.10.1", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.117", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "deranged" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.117", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.11.0", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "dlopen2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -dependencies = [ - "serde", -] - -[[package]] -name = "dtoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "embed-resource" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 0.9.12+spec-1.1.0", - "vswhom", - "winreg", -] - -[[package]] -name = "embed_plist" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "erased-serde" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset", - "rustc_version", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "firefly-studio-desktop" -version = "0.1.0" -dependencies = [ - "reqwest 0.12.28", - "serde", - "serde_json", - "tauri", - "tauri-build", - "tauri-plugin-shell", - "tokio", -] - -[[package]] -name = "flate2" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gdk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" -dependencies = [ - "gdk", - "gdkx11-sys", - "gio", - "glib", - "libc", - "x11", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", - "wasip3", -] - -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.11.0", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gtk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "h2" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.13.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "html5ever" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" -dependencies = [ - "log", - "mac", - "markup5ever", - "match_token", -] - -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hyper" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.62.2", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ico" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" -dependencies = [ - "byteorder", - "png", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[package]] -name = "infer" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" -dependencies = [ - "cfb", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - -[[package]] -name = "itoa" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[package]] -name = "javascriptcore-rs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" -dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "js-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "json-patch" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" -dependencies = [ - "jsonptr", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "jsonptr" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.11.0", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "kuchikiki" -version = "0.8.8-speedreader" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" -dependencies = [ - "cssparser", - "html5ever", - "indexmap 2.13.0", - "selectors", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading", - "once_cell", -] - -[[package]] -name = "libc" -version = "0.2.182" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libredox" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" -dependencies = [ - "bitflags 2.11.0", - "libc", -] - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "markup5ever" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" -dependencies = [ - "log", - "phf 0.11.3", - "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", - "tendril", -] - -[[package]] -name = "match_token" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "muda" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "once_cell", - "png", - "serde", - "thiserror 2.0.18", - "windows-sys 0.60.2", -] - -[[package]] -name = "native-tls" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.11.0", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "num-conv" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_enum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" -dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "objc2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" -dependencies = [ - "objc2-encode", - "objc2-exception-helper", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.11.0", - "block2", - "libc", - "objc2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image", - "objc2-core-text", - "objc2-core-video", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-data" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.11.0", - "dispatch2", - "objc2", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.11.0", - "dispatch2", - "objc2", - "objc2-core-foundation", - "objc2-io-surface", -] - -[[package]] -name = "objc2-core-image" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-text" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", -] - -[[package]] -name = "objc2-core-video" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-io-surface", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-exception-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" -dependencies = [ - "cc", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.11.0", - "block2", - "libc", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-io-surface" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-javascript-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" -dependencies = [ - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-security" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.11.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", -] - -[[package]] -name = "objc2-web-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" -dependencies = [ - "bitflags 2.11.0", - "block2", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-javascript-core", - "objc2-security", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "open" -version = "5.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" -dependencies = [ - "dunce", - "is-wsl", - "libc", - "pathdiff", -] - -[[package]] -name = "openssl" -version = "0.10.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" -dependencies = [ - "bitflags 2.11.0", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "os_pipe" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_shared 0.8.0", -] - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_macros 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_macros 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand 0.8.5", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "phf_macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.2", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plist" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" -dependencies = [ - "base64 0.22.1", - "indexmap 2.13.0", - "quick-xml", - "serde", - "time", -] - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.117", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-xml" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.18", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "reqwest" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "sync_wrapper", - "tokio", - "tokio-util", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags 2.11.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" -dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "schemars" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" -dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", - "url", - "uuid", -] - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.117", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "selectors" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" -dependencies = [ - "bitflags 1.3.2", - "cssparser", - "derive_more", - "fxhash", - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc", - "smallvec", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-untagged" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" -dependencies = [ - "erased-serde", - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serialize-to-javascript" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" -dependencies = [ - "serde", - "serde_json", - "serialize-to-javascript-impl", -] - -[[package]] -name = "serialize-to-javascript-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "servo_arc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" -dependencies = [ - "nodrop", - "stable_deref_trait", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shared_child" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" -dependencies = [ - "libc", - "sigchld", - "windows-sys 0.60.2", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "sigchld" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" -dependencies = [ - "libc", - "os_pipe", - "signal-hook", -] - -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "siphasher" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "softbuffer" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" -dependencies = [ - "bytemuck", - "js-sys", - "ndk", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "objc2-quartz-core", - "raw-window-handle", - "redox_syscall", - "tracing", - "wasm-bindgen", - "web-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "soup3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" -dependencies = [ - "futures-channel", - "gio", - "glib", - "libc", - "soup3-sys", -] - -[[package]] -name = "soup3-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.11.3", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "swift-rs" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" -dependencies = [ - "base64 0.21.7", - "serde", - "serde_json", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml 0.8.2", - "version-compare", -] - -[[package]] -name = "tao" -version = "0.34.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" -dependencies = [ - "bitflags 2.11.0", - "block2", - "core-foundation 0.10.1", - "core-graphics", - "crossbeam-channel", - "dispatch", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni", - "lazy_static", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "once_cell", - "parking_lot", - "raw-window-handle", - "scopeguard", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "tao-macros" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tauri" -version = "2.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463ae8677aa6d0f063a900b9c41ecd4ac2b7ca82f0b058cc4491540e55b20129" -dependencies = [ - "anyhow", - "bytes", - "cookie", - "dirs", - "dunce", - "embed_plist", - "getrandom 0.3.4", - "glob", - "gtk", - "heck 0.5.0", - "http", - "jni", - "libc", - "log", - "mime", - "muda", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "percent-encoding", - "plist", - "raw-window-handle", - "reqwest 0.13.2", - "serde", - "serde_json", - "serde_repr", - "serialize-to-javascript", - "swift-rs", - "tauri-build", - "tauri-macros", - "tauri-runtime", - "tauri-runtime-wry", - "tauri-utils", - "thiserror 2.0.18", - "tokio", - "tray-icon", - "url", - "webkit2gtk", - "webview2-com", - "window-vibrancy", - "windows", -] - -[[package]] -name = "tauri-build" -version = "2.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca7bd893329425df750813e95bd2b643d5369d929438da96d5bbb7cc2c918f74" -dependencies = [ - "anyhow", - "cargo_toml", - "dirs", - "glob", - "heck 0.5.0", - "json-patch", - "schemars 0.8.22", - "semver", - "serde", - "serde_json", - "tauri-utils", - "tauri-winres", - "toml 0.9.12+spec-1.1.0", - "walkdir", -] - -[[package]] -name = "tauri-codegen" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3" -dependencies = [ - "base64 0.22.1", - "brotli", - "ico", - "json-patch", - "plist", - "png", - "proc-macro2", - "quote", - "semver", - "serde", - "serde_json", - "sha2", - "syn 2.0.117", - "tauri-utils", - "thiserror 2.0.18", - "time", - "url", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-macros" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6a1bd2861ff0c8766b1d38b32a6a410f6dc6532d4ef534c47cfb2236092f59" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", - "tauri-codegen", - "tauri-utils", -] - -[[package]] -name = "tauri-plugin" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692a77abd8b8773e107a42ec0e05b767b8d2b7ece76ab36c6c3947e34df9f53f" -dependencies = [ - "anyhow", - "glob", - "plist", - "schemars 0.8.22", - "serde", - "serde_json", - "tauri-utils", - "toml 0.9.12+spec-1.1.0", - "walkdir", -] - -[[package]] -name = "tauri-plugin-shell" -version = "2.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8457dbf9e2bab1edd8df22bb2c20857a59a9868e79cb3eac5ed639eec4d0c73b" -dependencies = [ - "encoding_rs", - "log", - "open", - "os_pipe", - "regex", - "schemars 0.8.22", - "serde", - "serde_json", - "shared_child", - "tauri", - "tauri-plugin", - "thiserror 2.0.18", - "tokio", -] - -[[package]] -name = "tauri-runtime" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b885ffeac82b00f1f6fd292b6e5aabfa7435d537cef57d11e38a489956535651" -dependencies = [ - "cookie", - "dpi", - "gtk", - "http", - "jni", - "objc2", - "objc2-ui-kit", - "objc2-web-kit", - "raw-window-handle", - "serde", - "serde_json", - "tauri-utils", - "thiserror 2.0.18", - "url", - "webkit2gtk", - "webview2-com", - "windows", -] - -[[package]] -name = "tauri-runtime-wry" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314" -dependencies = [ - "gtk", - "http", - "jni", - "log", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "once_cell", - "percent-encoding", - "raw-window-handle", - "softbuffer", - "tao", - "tauri-runtime", - "tauri-utils", - "url", - "webkit2gtk", - "webview2-com", - "windows", - "wry", -] - -[[package]] -name = "tauri-utils" -version = "2.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e" -dependencies = [ - "anyhow", - "brotli", - "cargo_metadata", - "ctor", - "dunce", - "glob", - "html5ever", - "http", - "infer", - "json-patch", - "kuchikiki", - "log", - "memchr", - "phf 0.11.3", - "proc-macro2", - "quote", - "regex", - "schemars 0.8.22", - "semver", - "serde", - "serde-untagged", - "serde_json", - "serde_with", - "swift-rs", - "thiserror 2.0.18", - "toml 0.9.12+spec-1.1.0", - "url", - "urlpattern", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-winres" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" -dependencies = [ - "dunce", - "embed-resource", - "toml 0.9.12+spec-1.1.0", -] - -[[package]] -name = "tempfile" -version = "3.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" -dependencies = [ - "fastrand", - "getrandom 0.4.1", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "time" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "toml_edit 0.20.2", -] - -[[package]] -name = "toml" -version = "0.9.12+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" -dependencies = [ - "indexmap 2.13.0", - "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 0.7.14", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap 2.13.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.23.10+spec-1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" -dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "winnow 0.7.14", -] - -[[package]] -name = "toml_parser" -version = "1.0.9+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" -dependencies = [ - "winnow 0.7.14", -] - -[[package]] -name = "toml_writer" -version = "1.0.6+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-http" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" -dependencies = [ - "bitflags 2.11.0", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tray-icon" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" -dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "once_cell", - "png", - "serde", - "thiserror 2.0.18", - "windows-sys 0.60.2", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-ucd-ident" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[package]] -name = "urlpattern" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" -dependencies = [ - "regex", - "serde", - "unic-ucd-ident", - "url", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" -dependencies = [ - "getrandom 0.4.1", - "js-sys", - "serde_core", - "wasm-bindgen", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version-compare" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" -dependencies = [ - "cfg-if", - "futures-util", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.117", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.13.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasm-streams" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.11.0", - "hashbrown 0.15.5", - "indexmap 2.13.0", - "semver", -] - -[[package]] -name = "web-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webkit2gtk" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", -] - -[[package]] -name = "webkit2gtk-sys" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", -] - -[[package]] -name = "webview2-com" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" -dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core 0.61.2", - "windows-implement", - "windows-interface", -] - -[[package]] -name = "webview2-com-macros" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "webview2-com-sys" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" -dependencies = [ - "thiserror 2.0.18", - "windows", - "windows-core 0.61.2", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "window-vibrancy" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" -dependencies = [ - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "raw-window-handle", - "windows-sys 0.59.0", - "windows-version", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-version" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck 0.5.0", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap 2.13.0", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.11.0", - "indexmap 2.13.0", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.13.0", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "wry" -version = "0.54.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb26159b420aa77684589a744ae9a9461a95395b848764ad12290a14d960a11a" -dependencies = [ - "base64 0.22.1", - "block2", - "cookie", - "crossbeam-channel", - "dirs", - "dpi", - "dunce", - "gdkx11", - "gtk", - "html5ever", - "http", - "javascriptcore-rs", - "jni", - "kuchikiki", - "libc", - "ndk", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.18", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/studio-desktop/src-tauri/Cargo.toml b/studio-desktop/src-tauri/Cargo.toml deleted file mode 100644 index 0de3be8a..00000000 --- a/studio-desktop/src-tauri/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "firefly-studio-desktop" -version = "0.1.0" -edition = "2021" -description = "Firefly Studio desktop application" -authors = ["Firefly Software Solutions Inc"] -license = "Apache-2.0" - -[build-dependencies] -tauri-build = { version = "2", features = [] } - -[dependencies] -tauri = { version = "2", features = [] } -tauri-plugin-shell = "2" -tokio = { version = "1", features = ["full"] } -reqwest = { version = "0.12", features = ["json"] } -serde = { version = "1", features = ["derive"] } -serde_json = "1" diff --git a/studio-desktop/src-tauri/build.rs b/studio-desktop/src-tauri/build.rs deleted file mode 100644 index d860e1e6..00000000 --- a/studio-desktop/src-tauri/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - tauri_build::build() -} diff --git a/studio-desktop/src-tauri/capabilities/default.json b/studio-desktop/src-tauri/capabilities/default.json deleted file mode 100644 index faf3325b..00000000 --- a/studio-desktop/src-tauri/capabilities/default.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "identifier": "default", - "description": "Default capabilities for Firefly Studio desktop app", - "windows": ["main"], - "permissions": [ - "core:default", - "shell:allow-open" - ] -} diff --git a/studio-desktop/src-tauri/icons/128x128.png b/studio-desktop/src-tauri/icons/128x128.png deleted file mode 100644 index d8f7e6f02d925c028b7cd7ee186c3f9ae0083531..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4792 zcmV;p5=ZTcP)-c+ZHS49>zL8UgfY&OF^&*J+y+`Bi%}FroJ42=0lOPy?*@AB>bm#5 z^GDP4LRZ&vw`!>09~5=#p6~nmp0`fjdzSAAPB2JF_@g^V`h9wwCP#|q2*4Z$vJlh- zAPYbp0+|8oJ|qF^29PbJZWiilkkvvSAoVVg6$<)m1F|`I#UIN>K(GHsI}xt~unIqZ zaIon&CQ)+|V4eqZ0;qF90?_}+6I=it-oGz~d1vs4Uu^QK4m=S6 z_xw6bH-#5M<91N{kGrrZivXwr>IgKR3Fc;%$lOnw+^!4dw!_Gd7pCcEV~RY55Gmy>9vJr3i%o7)Ha|@NbI8yW!CB$}n~=`kvPK7=SB(&eoi9HlkXHfpamvpLOr{9`tNHoSPqM_hdUC`t%a&y5-Sw|Rc!v}A zPbvg=g$qZ$&X-4ooG@>@0C-?YHv2Zc4ai)(ZJ)&aUAO_u_*`+W-G*&_3gG@%2huc_ zkvuoCJ7gE10>lsLcLpS{7!u3}L7=G`Jn|LvfzJUm?B!EH&#&Nyh|fPO=awA@?5Z={ z1i-!jGlDSx4C>;IhiPXW|@dk8dDWJ`i6Ts23+hF>pXWm&+ zVMo2$@)N+lOA4uUDS%=-?AeYl2;cZyp+;X5z48GdkOSXo^WmR(58w;B7hhtGfim8& zf4=Y(JB(Qt0IOfgr7}xFoN7lvwj&C@({6_3kBh%Z|Fhsf=f{Ag#8_E(j8;bA-NVm} z=xf!GB>|92GH3)|2XU^|K%7DqO@ZW}o^UxSJPT_0Oa~&e2La9uNy}0`S8S=NN?HJ9 ziQ+-L0`M{`0XT{ZKn6^k7AyxzgY!i z{bRkg>F)%AtD7F{b7@cKL=^x@q2N*b!}17fuy$MQ(++O|Xu1%PODO)N$B(0aQdc?$ zzQ;DB5S;3V`*c(*U0BTu5o$M1biHKhNs6 zHILE)$X!kbl*WBTn-6q*yz2orzc&U3w}M&{n)nDS6DE6@6bgZ44FN($kWe8I$OTjo z;tO^PpB?_~oO+@Cjrf8${U$1be=gL(sgRs8 zZeAQ`i8R98@*2#t{{|zCUbO%Kxi7OYJWLkgSoX5c_W+GGGXSw=x^Xf{?rHFi`u>Sk z`2Y~eg71u*5V-R9Py;=kVs=Wy0e`2Cq0RyjdbXTP3NC;Qx)M;mx7Rrql0684%l-qt z)2{U{29ZwAj|qTW6#{XU`ym06KM~S@k{7PsM||*~|F7^(xWOCu#2l93*i`5C79ebX z2Ljs{AI1zQYZ#<3YDd)xi+|#ephjNqh3mdypa0^vH|+w@aDNqq%76@xb9c$_5r?j0f@LR0LecO@W*&AKamM!!GFQsuDhkQf7ulPuyMs;0Pfy;`$CYu zXS(V#6;VT{Knf?g>QjJm4UeG+Xlns{YO<>l0Fdlc0ZC_x0|5WH>syQ*h4~| zbvC9fQt0k_8v!Sf5QXsSQ2?@C^&TAPs=MBR%6B)p3W2=l$1qF*l6dw6i%3Sk+b&Zc z$sXjoPi@58LbMzK8+HRCkn9oGl0x)E zq#iu98Pq1EZ!sjZzkRj??k~6&s*!#W!`%05Q`avI=$&tY2R;Sc#@59THFz4-;7eg& z7c-%^FNOKlV!&w4BS-*h*mU^MTwqTc8A&?Jixq||5CgpMYzMmXPvF7z=rl)5N1%89 zFZ7-d?DO;W+c3BM9xz+l50cOo%VGTAbGG?$9~LSI3cL;@DVh&})zMe(>RqLPwqe^o zvjyh1CDHxtTnX0hwC=|n3KRev@~F5E>nqXyq|Kw4&0xbf*8S90#8@Uquxg`aKORxw zhu!I3#1F|F284z}0tH}8HF)qnTV0$i1ZKVnDL5TGuo3#}QW)Ep1Ca(hU1a$I*p~<| zb0j3^96)8ZACn`tneRk)jFr#6Af%7=v3AKF4){YrBzh|#{T&+3QyGx#B1m=-)Trt3 zU3ediHIKpEveYgQK?R!xAUWqi@-FIJ`3@qX0g!%YMg3e2nQqVgLSGQR;;WhR%Q*Y~Kc4YV;iV z#$MY+Py#jVGWgGRKV71K;;ryam}ieI04)HL|Jte`B*&v=gem|v;%cDi60m+JAU;UW zNFZQ$ubM!Oy%uW3Oz7$|Kt~|?r$Vy48`B6(egt~^GO)4AikYx=0R)G8Kd~d&&z_`^ zvB=1UD!R~lKk<-}4K;Q)%)h>5#Y$KKuyk7~LH7qS(zN0mWjT3Eg932KS`?lPVx$2e zc?oBR?Mk(Rz|xOMdSuT#B)iC}i7EwJ6o5B_7-;|-<`GJ@f}q!SWT&xAg@Q(f*HNVL z28ymw0L#4&B#k$aDE9;YF9E}X6%B}c8-nvl8CbmmY_0}qc1ec7&dC#?TL%n}OJ+eF zpFE+%d5B`K?Yyq3ULcS@MNlIyhZ=Hmw9xIRl@ zC2h&D){PJ^tlbJ$ed>xYE128gfZp@5E57u;p73$Cif4nxyTt>;}ww3xUMz$Dw%z4#4_7&igo00khnS&|2%f zRRBgy@&cd+>pr&-Nc?_!4Nk{OjmQTN17`Ab9yQHRfTIGCKGXLA_$p~@;XUq%APoQ_ z@|Q=UD_16ML4dOC66^yyW(XmcTZ*f33wU^S>r+7*M_|J~w7hjA%)kBCnjN&)b^AcR zlI76+7fY7IyTJoXfs8>wXh`cwp&R!H03fP$&0!Dy05qC_mfD`}WaL7889nv`uyG&U z*i(S@d!cu)1#5Rfm%j(Ia&_y%6pIK^+V=l;0R)>@qdB7nM4lz<)U8hjO_l8z%?HIblkqbUx5*!=8jOFg|#&n?4E490}3*urnamV+a1(4-`7r z5`f551A^Z<9!76^rgsZ%VL&cUNO`Garf{IU9Yd7#j$;AIK-3ax|8P^c<9~=*kt2 z+85yy-5u{%0Frb0N&t@a?XqbX5a~UGJ5Ixz3h3RA4k540e4zQm?mmboTeUBzMM}03Dlw!Ny9k+MS6Lsf@Ay8K=Mf>$C1}jCxPk z<77Uea&-4l9^L@%T?UxVu}?nHXsLto;lnUDIsMcv_lZP*s_Su8r{v9iSJ%9=48Sbg z<2nlKw}Fk7knAx)b}=N7*Sfc#*9%VV#tefE`@#A>(3LA-R=f{{Yn=5dvN-d;x*o@k zV`dp(&6~xfDg$+fCmTm5v!$8`lS1R&TF=FeBkLH6oSyYi)9#+?H|Bh9$(y~Mz_YQ= zOOslVEQwY5KpX-909Dsi0${t1RIW6YN0r7a|J%{7&WJzdEm+BY17r@^V4l0dXtPSNIE=i<7LIMz( z6&C30U@@&s8b_$2$!p?m`rAl&Ri_kOT_(VMr0)k(2@3Fota}e7oEtZ(Wxdk>yMH3^ zbTVbrIDp9Gp}VTyN~UPi>$+9{vU>5FuWnKf34OZ-=Ndn@tP#`i}Zr^TcrHJL!9#S~FPE0)m zf~{6@;e7 zdM_C;w_c89UIpMayKSGuEDiR-6>|Ib7)zTI$C3PQGJbB08eDlDfL|irV`v2u{CV); z*VoARD;$|OXV=b(QHfOkcAA3u3aAIBX9OiQBd7|%4WWPfYMGPu<9LS0!0?;iS3Z1; zz(-E|I#Hm=r=&X1>B$Pe6yiUF(g6zAf|SFI`G89a@Gd~lgQl;S3xGnd(As=1bp2W@*_|CBB?Zt1H~w^}rpzPETR{%%Wdhg>@OKnr zQRp8&-r@DNj7CZepbf4n@f-axO~`9O&H;7b)D!>@gZd4Ei-QBWLZ+^EKJ$}BdW8Tw z!m^SKqeV}FY0d!j3?avPEPyi6W~o*z4Vw9Xk-2}cwvUU;^g01_g`eJiiYb^xjY*(+ zK8OjR&T~Wn&^6H92%77u@lnL*Ta!KeEn6mLctx)lKzB5Ka>s~(iPNFuS9sh(*n!sX%$ZsI0TvdPN543cZ$Iwrh>hL!S*ARx zIn`V&Xuk2jSGH*`8Fgqb$doi55)IIrJneatSmfgA9dzo>w&bV*4%k&EoysmI$|m9> z3h4eXTVYRHIy`W;kSE*FkAjP4vGVNXaT3RWFSr--WD*NXwbm+7K|1Zb3GM`u9|qZA z^`@AdZsribDX9!sX}+2Gc`4TTM-hn1;zM@UH9@h*E+WN-S%oeKtIq}AL=l~t-X~yOg?NRSRto1Q)3j%Vq^rWd~15YKRom zO7&vm%me&!tcw{PPNiiEDJ~3;ze-9g8y^0Sd-QJ7#qLcC|X3bI<35Sl1 zLKKN1Pqbfyw(rxalD6bdcWO_v3N!yU5IcJhWDquCs56U|IE68-Sw_t!hB z@*9Er?{6}Ct-I{>V{f_wMYJ$z-2`g62%<7`t2BOhy(o%SNkr`gzw>;9-R88nc-N`p zD|hUr2*e3Hn_hv4?eWlgO9=w25bK@INhC~Pprg-gX@TG)-oC_ zB|3m=dgLNA`_FdTt*UoG{nIf}xl%f6*VNGnG%oM9U(#+;vArYuFFuy(oLJb|drlKp zJ&sN@dLPFM0(9&^<2?;TLZ6z*8nJ%xRQ&UI6e=hmaCzz$a3!x}b&Bi!rzEWqnt1^9 z5Ln zttmOfU+(k(<4ctC$NftE&I4%lfw*e_BW2R^o%!yeqL#$@mk>r(;7E^{=9fv}zI223ZUM|uJ!<)75)e9VW5 zd(_=|H8`JSupG!+?$~o7e;?D?XJ_R!7|5eYdh)U1&iO&$*C<(SwJ2U;$zjDa@PXTR z&yRD&f2F>yKgQ5qk?!;8XR`im!nb z`V`%j`<&Nju;a0t0+U0BqQAJF`^%yQ@dOEh*eYCay*tK`F$on3Pk~~d`)X5T79KU= ztR5voY2_CoIeU-t$+xlCIaFl#AcX2In&uXr%JO*Hj4mrKKJ(l6?eqJabp6baFyYrw8hp!~#EmG;dX@UF|E2J+;2Of&=E1u!YCtOz6*7#kUD$+`8YXRaoo1WNN9x zXW(GmH!uaQ5$hq%ZNA7oL%Ybx?Le3m*f6bi`_2^kcq&<)8Zf@<6xJS5bAljDo`_P= zIx%P>08I!^UUIS)(Za1{^F7h<->r$+nI0ko6V^_NGAVj3y*otml0D?DgNzrQx}Kza zaB<4Q)=s*&+H%s>Cuk9Ur0}L?-XD@`-x8f?dmk;RBx39hD3mhWO{d5tiIk)c-qR&g zKkaxGsn=mGqYvEb5Z|k7cPt;#@8CnnhRAy8z3`VZ6TKd4$C7w919vVRq=21zao;{; z-;UQjfbq~Adq>@EDxc|H0D`yL|Yhqsi;NhY!D z`9zfO;XtRHsdlldPp4jXpGO-TiXOu%kFfkVCRIa@!zkoQD76`qE!_9iz_PQkv%y$& zJ!BSn(Krl`IF!)>Tt;NKxPHI?N8U}sO3v?JEFEl{XG1c>LrT=2dSqC;gKJT*&v98*uqtg!}u|&aH?kv);e`rLo9xeE5%pjqMex_s&aD@ur47 za}Rsn!H@JxYv`aWK*}bKg%|AzagDOe*j%Amg_{i-GTFFm%!4|qQ}w)$d3EPQ-HnBV zS!bJnbT>=6JVENP(-*Vn%bki5i}0rS?}}zOjYU!7y*4)+&@am1Oi42f%kMeD*0bPA zyj2_&o*&^=E~uOI5n;2^Ki=Z3_74t8p$M4 znUB%n$g8@W{mw~U)00C97^6acbk^N^>}t}LN4V_V9zZ1AyWIUkTOi`v2lsaqAq)b8 zqlG1zMH*_1UEmX9RrA6FEMya=|9={V!WyV=uVRY%6};rR0gmPk{*@K;S{?3gf(iA< z?*}z;kS8_hcgGmndrS`rVQE#Ij$}EHY`c`tC836n?B#PoBiCwoVOeAmrJu6T;>NilZ|lmSWTD3IrGCeyLVw*z13S$mna* z1bKE$eWECh)M;ew?3L}nWiYKg&=Y}~+CqN9n?D2};BD+Tp0l4NQ`@Xza|6vMC(6aw zfiiZ;U&S@puo@}rf_lEtQ7YuK!8FIkuZFl_gD@3b6F|E_QKzlN|J^te4$oKl3{!;a zjnsm_lXZ7HRxDB8N>X|go5`Zw{JSug%WLRisTL57k7vB~Y}!~F9Q7~;cja*;Q7y2& zDRoq^igU_G1=A0)H!!QXb487-9O>J3OolnaZlW>IA33M_Qvy1aFYg8XEY*=N*H%l2 zNdx443$dYXiwyfq){8|F=o>N+3a# zeL6EG5~Q!n?6l>sEH}=)SJ)i~F+_P* z_jtxqQpYfeXgK{u8fsC=1RH9YnNH{}woIbxSnKg<0>*3ZRp)ONZr1dr#pbm7S1=lda!>_%Dc_HnC()1vFg% z2KN^(X6B=NkYFpZt}3DeGi}jQn9W~QQ+bvaNIio}<4dm*y(}82_hRHLTkyot5OuzTOI}dJj}9`B}(OU3X6;MvDSJ)a7m2wdJcl zOFbZIsM@oAO+5P=k!)Fb*-`hWZeNoxC_qqAbt|1hD-!vT)@=k?#&+2;(_G0Uk7VibE z&GN0?n1{o5`z&1JUHx00@D>to`j@y!sA|!p$B7t&@-=$fcPzsi)ZsZFr;WCSIVe!l5OhhplR~#^3jdYX9O+UFZ8*1%dh^XB^L5-NgRvPMJ!Ygr7AT?F$fX zB~t?7fc7G#>_q<6w;y8`O9*@0XXy1{%xD_d+PntD!yv|E*8;#(#1+=h8V|SFp&vl^ z-pMYp>@FwVbr0M!ZKm5AAwf}zc)M7*Pd5Gm-x(E4$Drw`gXul zC3zg^khNc(l-MCQ_vBoJ4wf4GaJ~4A(!Lx6&^hwX9>W;7B8Cb}A)#_oKw0rTqn~^K z3fnQAg}U=%$jz?dIq`f z*o;|ZppOsscFmr8Oy0et<#wN4pCi7sc#fip!g{vAf~uwqYunL~1Qh_wXy-hh2w=x& zDO$v(^-M=|^OuipOzM}mLMIu!KG-KqZ8hT4-Gca+ysWAR$_ICt~KDzcodzJc9-n`t7OZ_m?oYX|A7T*VCkwme55I4!iGT6%6;U z_=Gb!#~je~XwET)Gq&v!dtKsZQ$C-|65c1@_>3%1OxzBtV0QIdh|!=ZZW&u^x-sq0 zBwc>^0e2{*`v?iKFnpqV+CNCMZ6Jt_49o*ALiudBf;lj@7X0(kBZuJ=cUj^paPA6) zXk$}+hU6Li5ahm8C9h%`J{=W$NrHTqPEr&{5Y(O6ud#@zd;`iB;{V1d@*f<7)3Ws> zOUA~t&9dDNuX;+d{WEABp9`q+e4yyssuEBcqz=Y(EfO_!*#R44u)l!@suJ&?F z1y)Oq1NCeanS#pn%65joCoruYAQ2{7Gy2a~0Nd~gIWmbQvI7yMva?_U*G)w@(`0WsH>lYY zD0+(P_w@qQIS;rERV0$qYMcU{h3;Yy`)QFJb`LNB&iKwzcK8koR?pJXAmPq{`WvYxr&H{N1Wj_VXf?g$r zB^1-*?nqia;wN~|bj`aMVed@<(~p4LV+h1_p!Pon3ZlO zA`6WF4|jz~3S-r^p8Wi^xiXS8LRyS9Dmv%>9a5PmRr$THcxbsV>06t=7h~gR4_^?n z#UU%vSA;^1FGgomzX-fvx&|*)2N)N$&GtMH#M8u|WU)JUQZpNnLJYZn`1C5CSW+n5 zAnM6mrxk{O-b~C=BG0cFKiwGIVqg4;7J2Njzx5MIuile|5ZG+vy!Oq^`iZz8{`Rsa z%=eToZy|cbT2_u`=lgDNZ}opioqV@X7n+6EbcP411>Zavb*f*TEc=qwTnts+M%+xfvDtVbcQ+EOlF4X28N zo;X#%=*GnPrK<6%_OsSKy)tYVK`;HuVGuzN+xxp5l1S-)&9zU%^5V2xcD0N76~(G- zob{ZtBfX{Rk9-&4tx;Us z^4!7keingoyFPL2?#G^mdSu+b`Ql1;KKb*c;Ao4u%Cc?K!GcGA_<;UWDPjFn;$dFZ@taaM5{L#MU100MH3i6>RD#&7KYs&x`9f{Whs z0s(|#I07MQ+X%7(xlfDuM97Y_d{O!jd;XpS)xXQ@u3+kp;h5@0<$1 zLuS0cQ7^%tF=p3($*`in)3m-y;{mH|*&NK{h zl>;Azc}ZzF2PrFgyYzb3vJ9Dzk=d^N$@w*5)tZB%4Xdkh>}CO-97StVMmUi+kZ+1)$khaex=2r5zt` zS_K9%e|VsQ=HcZ0Vj^-&*W8R2A*8J=IG_PDj@!SK@y?ss1ou%n{0`SeCYPClUcDpw zBYBsBzd=;vbyf4zllZ?wpKlY#zo%D4dY%y7AY&>=F)3W3mRe{k5+0{secl)HV{Q1)gmM#pOrUo0Rc1~v(dXh|i4)ozSy7L=5RUrDj>tf7wZ8#>|&zh!zCgl&l0GdNmPTaee-b1_2 z#k9-c(!orEUJ2}`P7WQJ-8kvZls`C_PJ?3)PSY2&kY`K>=k5(zFvRN%*XFwxSL{Vs zS zyCiJ+G?T8<)W=05`>i$bWl{M4HwdMlv0JuXve&$C#lhKM5zy97Tbun}>kUnUHS^!^ zH7C7Ua!n?D`3L8lZc$t)Go+$JdV~LCUgha)Ke^!VlACvZfZ!XYO zayh=vl{T+5rds!F?FObxTZThXa5nu?S83HL<;1t-hC4S!kW%ev_oP1*W@?`M>*xI6 z_5-XBL%PXLB)1KWy^~Kxz{>70bZ${t?I=o-oaYgYc%8K}H!{2`xT8rspGE|g8h)vggq`kn$TyVMPdD$^#vT~~ zgm8Qy`zfk3sgHhNq;2A3hr z`{i`M1*Rx%*5CtaM%Iw+-AfzFK3CU^Qg5>{4S|=+<1pY4oFwgm->ar*26n6h^j6^n6Vgn~_H zWWcgH(YdAQcLdcIkqA_{_)zHPkixdJooo zYCZJYrAuZw)x&zqu!V4!>~X~D(4r*yI>w{4rdnO4Bw8o9|+Lz4qT;Ai)X6Y};v)KBw1T9o}wP zv`Ng{g5nm)by;q61yj&F29ErL?wnG^7R!xfe?glYn4#~Hl$uB5Sl^8iGWk>G+R}UU z(AS2FwHJp{r&@qz=Q@Y>1LyqPm^F$(o>;=>2+6*Jy$A7*T?v2oYVOu8>x@e7#EGKT zuq&O8u^l(wx~$X~xC*QK;PiaTMK`yE&5`dN^HU|GFZWgmwcQ3FEG%HYJ@y%*7d+@F zG+i|S4`BYyHi_sE?t0_1VKRTG5RfpbpZT0b^uMX-NSI>3-k@6F;n;dOEhSKt(MoqM znL*+SK6e;!c^#;Kq41!F|15ZU?q$8@DQ;HJh~(zS*O%(4^+>wl8SbYMr zGj~2e=La-zcA7dri?ZWmc2F+p&8z+iO4k=9s1vqzSdu&2S>T13j-6ipS~~Qy{W?ZW z3G?lPV{xtzw;-y)EK)MMTHIDTK;C&?fqzuVoB8dp!S<_<3*0gckCSg_;1S-#D&7?m zC7+UNn2u$;mr8N2gt%R_24)2cIwu`|6K9mwTdcoLN)r-2n=?Mg&i*)s2^~29;kst0 z)N*x`p7Cku^{udw*k>xuYUU~j!&$4{YJPxK%Ucfd?ZETRyOnJwJL=t_F8K3O_AzL;sWiejxAKi?&om<~Egn z(*luvdcm4xF93`aRpjhhEyVnJw>j2Aj97Aj_4P+`Ui*A{QULkp%yiapJ{6mjbjo1T zeE-4a%oI9RpDWU{S)kP6Ot7QxHm{mMEo~BQI+2QM8cHYd3oDdsJz8(}eP@j_{PuxZ zHmyaeQ1jbNjk3fQ`|VXn1DG9=*~EindssXZ7l4N3ollLWs33eXL|$ecyql|fT;olr zDZ#i)EMKg+me0!j+(wYsYPI8x9*kJ_^7(|hU;+ zbQ$uh{6M;^!&bM({ETds2z|74cM5xAr|2RSZ=(QdfTGvrl-IX9lps@USiNhSdj9E; zlkN)dg24>8sEEdzgiy0)VSN>V!%Gci)GhxSe@Fm44F(Tn2Sj>|9f1VRZa(&)bZ+2{NKRe||)aDh;397Dr*GYcoGQXuRF zoyMI|WxF~|L{*f0KCHrOLugzvAAb%L$oo^f5n%ML{}n@l5$zw_0bXIgryeWk{UvK0W_(}aD9+{+E1^5*VZxVh|qrm~! z|F8h)Qn%3kZ+Q4I6Ld$lX;nm?Wlx9gfo0ibNjGXX0*xxjyRW^FZ+)Kai2H(}pqrLd z;>gr{fvNSz$isZrPbhpyEFIAb>~$9*{sdm=0x$JVPz zTg;|DDSCMUfHhiS;fydTfiY~+3FAe{U~)}h>yUs}&p$_bzD~RJrouZN<>=!U9W-B_ z(pvvJqidhrfY!otJ*jSWr>GOhkd~pZ`YiKAwY<%8#KsU*ik_&ne}fz3S`oNncAJjr ztBI=O4zFk2bX#H1gJ&=RX4!&UW9_lt3`Q58&^VsTXwirCTOPJw8W9y9!Xtx zL@`ss@>d3DKT7V+Ab3G}0MK74aIdS~{s9uYMv=gi%r0Pj!iyBGf20Be;^M7tlRMFM zM8|ZDrsC@aV*46!PK)|KMVvNa5hhmXF<7sgUU{7S%`x4c%0hQe{rdX_jMA;y0#DY; zQ8-oKP9IKEVsS^)3yQ6)8!a+)(9T7yLJHz@{oG(yPU$9mRJn?r0tSCu(LF()lz*JZ z47NRra&=PPLn7B)3Iv}o7Afi&*LLsL-TmSz`bWTTL>-fgnf_;H4@djlgSy%dpiWDDli{@rEwJ2J@>|ID^!T< zpM82?V)~nB(??DD)Qd_jJkRD{^?%XXnCgxb#jX$GdIU z)Nep-Ex!9>iiyg739XM&zsuSWV*Z8V$>3z*zbRhd#GN~F697fb4e|j z`=$bDAtQ}G^qFWgvF%&xtb?{3yp4I8k?p42Lw=*TI!a7Ak2(K^|8_vqrj?#TV(|>% zDa2*oR1Pyr5ZRiE$jqu#qxGt{@z zv|=eIc-18XS<8X-uLa}S&ZnWFf>d`G2BoP>K zGQ+Yo_GQx(8+*Q>}zx#(mB z?4D$k>H+A))Ly8H%NSF4f-8D)6;0d5qS}G>8;Q?G2#!?zHDRw5c>RfXE*k%#14QKr z_=_j>A{ya?sFG@5@^oJ`mIv$FV2vyHo_p7ctoJR>t`TUyP6B&AYPW{<+ND4)vsCmT z<%?+hx@riTtI$78)JU8Kspx>#=Y(R_!efkMvF)ke{;BXYTdV%y3i#$321MTpyHm)g z$q6bp>H8$aLjIIS=QE#m&fb63yuc?NA7eSI!gxgQ)TT$u-{}Qr6Gcwpav&&5)!}Vk z;z%f)a~@p=b53aXHA{AJExuoUt`O5q6YIVBu}OHZnAO05nk&Vs>u2XReCVU`o#+W| z^R;$Tmw=!D?e3YdM#;L0Z!4vtBlRVxnZ~7x=ji(;k$4Jq#joRXG#ID(xFRNzSPyue zt}4YDUtA2PeikLX8%x4Qv_eeU%2J#UvIfei3vmMJzyO_exc{vEQ{X9-vskh?t%1r< zcbq6^AznnUo8Nvs?E4Rx4!_^4balYBG*ZQOqgBYh9&*@ax zJsu2>9+3^FM@qq!X^H>%pwaW)-5BRtJSU>YfhnJx0w#Uqfai><>m0%)+CrN<|GFgs z+Ot3Gr-JX`Ios7Z0n)&fC}8~A#Z4V355!w!b9XWykCmVN(+1zG=s>7z0+>WG)y*VvE6Z z!A+vWSJG`+*eY$~w*cEj^=Op1bzMCtlF`fK{Y*Jh(~MLuq=dPZHudp)PGZisp(EF) z&V?!S!x;_Ri8_l!`FbFdf2l02`lpe~MWvIE*WJ}j*}9J)5H9pqMIvcGVIedZ#Hnn6 z;H=V#v+HB?u^TrQ&I`>JScP|fc-}3OkDFCf7+#g-7U;r)Z`fJCj600?=ZE;cr*dBP zyN_Z{?Lia&WF|tf!s>)Y77)#p97d`hhQJ-UiW7b4$Ype(D_1~o2ikuz-2vG=(Rl>c zzKc}WW~X8~ttYWZAXtMAU(5rv82j$6NH_W+c$r6-^7rw5bo z-}F7O%CQ!#13Q>Ue-^fKDFE6DteyxueGr_R%Rg`dzvtVM4kQ5-Yw=S#82+`NGWEa( z3zg#;L_Zn|WY#)yybGV;9^00+0DNx| z<}kwOBvBF_ItM2InNlk1v6sD!y>#nDEUN40touKv=UFB2Rvy5adV3Q{TUtW0rh9j>>K>+9eAA|=gT@G z>`M!|Y2M&B?PAd$T-xzumrkseZShNK=JM*tPLsQO#LPM<+yyFid zO-b?njX=+Bq`#(?|BSpwDn|f-)NJY%;Yr}?Z6NQlEO|V#v;Xg@!JK=6%zge>%l7YA zkstmqW`Q#XeW?7^tG{LE^4^T3Zp#hZNjwI;4O3>s%*|2cyo~q3hsa6CV;rVFaq8H0000@aLvrj%*+t8V`gS%X1b1?hQF{;Y4D2RlJ005xK%SoyK%f0vP|5;Q>&T9RTy6$iGDRF985_0SJKp zmxKPhR{-^Yw~7})|F80Yf--6n^#FjlATRYn(--u|z|RqTk>GuO+}|fbB@hD}{^u`s zkibefVhX*ELTcGGElMROVFCGk`seiYBDt6WF*W!JkiEtyD2fjSvxu{}v%Do3y%K8h zKJ2}PU_}({uuBBv^RxE4uAdqAIm;yH?jn97=MQIo=g*z@)-tMzNM!nkR-V_I))vAF z0y1*N`f|(prCq5dYSF>HO>re%2_=rw9i%%$C0ljZ?kY|*@haIK3`N7RZs(y^K1f$n z^CjcbyY!*|RbldK-d`IEcME|ZVa?d6gxuha?j1cPXv zhUinApl=8(v_AftJv|6EczLM)-HG4Z49e8QN2$&m_+tzzWuo$_){!e(BOqt5-jroU z=+pgcFWCNZ{&S-Rya9Og{Ux}haL%7SpSW{pu@^8~Z#j#6`muJM#BFI0!=eH6Ug=Y= zVDzret~80w7j>~gYeszFSN?RU=vU$d{3V>=?>JMU=*MMem`I(`g0Pu?_$nNN|0Yyh z*m(O9>GLtK(B85ck=#X54MU2KRFR`_@K3D5ybj9X!%F-oin>lNHj?agQE`STD-na_ z62&;Z{jF(icYh8GGug~}gpae%&#ZP~q_ndVoFCanzO0TsJgLBEyvYs6Psi_+{tmWe zPSiQi3~5{CF>TH4nzFHmpCc#`?x?w_qrjXSkGAA2L&*X|LkxBOB5DNWi8yj^)WpWa zQ(9u1(1{v(e`mZdml?OY&DrBVF~>BMQm%WGQ(0=Y8f4x z3f@d-QIU8&`R2!t1si5@9@uW#8YeY!@vtu1q<68+#KdS_Mwv1XtTlVVU|Ag5{DS|J zZ7RtAThp9;^I-k5J$vmt0$BB!G=vNyA&;EK%-wRV$u6WQjWn6KnpjSFst|&3yz)Gr zx_N_zEPlHB7oy>uLcC#>qLg2zDV6s?l+4EzkYg!a=9`X3^Y8;7+Vxp%Ec0N&a%uVK zOTwyL-Xn8pj^hg)!4L-6L%;v(clK;1HR~V%-#vP$wW|sK*V_T-Csai^3uW8ZC% z0w)MDH5f>XTzJqv={R-s#l%J3_X4=Gwmo`gzR^O;SU-u8tYf^bG<-jewgx?l(HsR! z@&urWb1Qf)vGf{A7rl^TN>lYvXFK|1Yth>3rD8d~@DW5UV*2DZ!KlDO_{)idx`EL8 z?hLUGqA0uoNU&%oEO|}k&~3Z^M@@CB+4K9)AybGaB+W8+C|i9QFamv7 zRn>?;3VDeJNnqKYQDK50=nPymOuwW?PN}QTy8K6(LW!N-6@z1L8pOV1vhDGIU$dDv z9R^#F#9r&fANS!Z>J;(;Qf!fn5+3O#FZxsYFdPLf&-M(5xD6g;}ngVWjP zqV{Xf9gF+vR1N$Sa26}pC^I40hYK4~9?Ajo*jwr7Dc*7F6)Cv{ znJF4_{K@;}dQw~U_;PBFBs@}&54t&{2pmp7BDDn)iP37w7k@MjV+31+2}zmM6}sD7 zqEhG;O`>hhi;nWd%V>mDdf?(ep=Dx=w9J9vmLg>ITBzO_pO(iPp~64AYX4CX49>!KnueA-S{y1;$+WP7C^Lh2 z#lmJ4p6CagBo{|nTu70{J!drgtDE|`aC-lm8jB%GxnZb5x|$)aeo`O1xnkt2KS=j0f(eCz)cnU6%96$fY;@yF=n? z-o_e}jIp*bu16}`4vt*IC9aOR&wr4_b^D}b{}aJXiA9koatecGMCfhe$nP*8%J*vB zJ6xw>pG|vo_q0oZj*XN;^j?}xoRG)w4gJxZ8R}GjdraFswwtQzGblcx;Jt_eEvER8 zi7rfe9Gl%uH5c0f`aBN#Vvn}S7kbT~OgS}5%5TbSS;3-7hYcTd6@XMw*@AMh&jd4)sXq+_ zn1vfddj@D1|KJfe^|C@U7v2fVb1=Gy7ted<3}VP+-P`x7L!gpECTGk)kYYE)A+2w( z8q#8kK@(uP{Eoc25%*G1F5*TaJ z@D8W^U}MtST{8oPGE9H|WWe&?Z;NoS;{FuvTp{?=`Rl}P2%D&tlJ73Iyvr6u^CMBl zHuyr4U4BU7qQlPpvoiMvyfJZI$xD$brSBzY!=>R{N+MdZS7I*6zT~FC>!C}C@Sv=M z>(u?d%tErA6#?8`T_4}22PlS^4QO;su4MjodO+OsBW9)RKZAj$UzR?+0h3R3Oy1P9 zpssUg?ijBGQxb%hfK?$yFK{8Dzo4e3zfi2x2l)zE_;n4i7^shYodpm-RQtMf#9st6 z?h+M*6j%T7tIWzN1FOD?S080YEkSgBEO6S-TPAYFF6fE|UlcGkpy|^hGS9JoBKt#e znVq6oK=lw^{eiaD?O>?AK{x}maAR$Q#Fzzjc)zv5Ob_60F1qV>AU(APeAsb`uvNTx z7=ihb12Us-BEISQ5t4u}KoVqkPSE?Hv$YZmyfp@V=u5HOV#RrHL_w$BY;ii1&89v7 zzxHUnzLAyml<7RGm_mFQ6O&oj<|B<|Pv1szmD} zqCXUGBaW}ff-p23LAKeKG^6WNS77oORjsA(x^L_q(6n{747br#-H!SD4mo-;_1GSf zMqoeLY<$oWKficl8e`h{cy!EwDsLq#4J)gLfP95~J#35?q3<5qSiE;=?#)HqRuju7 zAk@fco|Tmp?8{HWgSxZTi%RiIl&f;8_-++y8>)CDz#+~pw*Fj=SizBoB7o{*lZaCz zn$I^{kHR|Oh!7;o)^-6?i9)BCQQ+FKxw(I>Y&0J`^zQt2!kL|w@bnIv6Voy`#fDM% z59rEED@)Z%n0~UeVCMq>Jfi;($PM`?2KgV5yHC_?>|f=73*?6UKOpyiBLH%VFg^f) z8}xrd?o%U#Ozef+kh<1@)&Ntm3_j}~80R8Z>J__44de15{15%|<~|12qSj(f?Qzga zg@ZX}9Zz*Wg2UPrPc5coyY}?386_fREryJ0H-Ymn0A_#y<&TJ0Xa9cRE&No8v;_Ig1vI<3F}_u7l~nCn_)b!<7(3J%bp zMUPz=>>T4ag2ZNq3f^06$d?WBfH^D&sm0aT{=u!}YgU$D1v+bo-ORX-fXAUS}BPArm zI+68FG)X`tV?Mu`k6oM+fr7LI+h%!leyBs&3Bk(wQ8QC5enAZsB_t{C<(!FQgyPX1M@Ja!c#oj9$g*b4<*acrddM(0^;Qts$I7 zTGQ%2Kx7R1L1V(9Y`!BArCI>nSnZ$z1 z=aV8+pdi0R{E!)5I4HGvZ+(Nk@Baqy1IR4B0m5bLm@k+64j*B|QvgWwd#iqV#|Lw0FvFL@*W>n`xlot~&8<9NMB2HztZ zZmENqs@;3l?kbF6W%bM@YqHn)ln8>@=BfO7dBK9*D9}rhl_SkUKSps7+?kN5Bn71s z<~Z<>fB>G!YRpyCj_|)He@S&Y&TwOX7*O3>7?^keDYE$|@<~`8uZc-eE%}#Ji8k#U z{DWa$y6t^1nnHo%sDT6hwJKZckcGARrYK}AjqJS2$E(~h6+xq-lS6NLy>078#-nQ! zU60p6BX3X-FEE|>P9UxLiWSet+VPnI_Au{O0h`|pW(er!*NDs;NX5Y8#2ucciD~Ba z+Hp{H)Q300EKsH^t?|z^sG7FDZ8AyD-VA}bPk~DSym)1ei9zCcGIbV%C zOL>#%UPKtN>P7=?(9>JWDJbhNN50;kBDDBP)(w96cHz;V?&HKhca0`L*lPPs&fy;k zU$t31>ujW(k)JA;C9~E1q%~8S~ zlQPN}_5cOYbxM7s>j?wwY+lBKEi>N{8(ng(NS!&w%P;QkOm4)gRkL70kmfEul)6)! zp7}`LCe?+S{o+?&GAiqy23r5jm_PY?I{ikd-xKo~Zq!uK0Vy)tuW1cu>3v{3-6f3G zb*>4yTBQ2S}M=@26X?hkmpyKu$Le7#B_^*{0eKU*s{P#lJT)PcCMQ$^# zHbrRCMU>N|JF+a5*B1c&#EqSy$|g&tqWVy`NNZ8l02|(RLm$^5;;q(jon=Ec!3ULe zqC8j`P#s%!=UjU+v==>eE-fa|(GeTzPei-=h;5Kjzcd;()^w=CNG2Gb(JZ#Mzg7~* zK&Jx8T%8H@Gc6_mq7kdAAm)&Qp8kZeLPQVsjl8r|yw zvEtYA!gI?xZXtlbON>Zu&)-i^oPBTIkJp1Dg>C!4e~0gId~KO$$ga)+6&eKMwsbX-%6Q0|md3dcD6|9HBtmRuG- zQ_5fOyh-)6Cc!*&Bx0s3jcrcCk`hAQpN_;Yl77?j6|HP$Fw`3354QeP);B%ZD!=90 z8Gxek6_6=w1taT4Y!C$wq%(mn!Qh};*I=3bdjFxi3+(wQbjpm1@j4PUZ zAk+s!STw--6TTC^#d&){#7-7Rtr=M>4;%5W#4Z@>qj@v6;5NGD1=DlNgHD7+S(%Gt zT}?h)cd~+SuwO(2qw@~D#~qTaIyuBn^wQW8@GGo4ck0YS<3iwEGv)^zhqsL0N@5Bv z0awQ5W5d91yLhxV{E48)Nx}U#Gv5s}X4mzQZl%}f$M1salL9K3q;S9t=1Kk-tDB-b z>R>zS)KjR2`|iO9`L&^!@;9Vw5+5yj#E6Ivz4`9#+DSK{KKjYX^L6|-m>D}lC&{#3 z^jInlc55eevT!s2V%P|Ph&CQ*A6NC}m&D*n1moTH{q&`6$Z5>`l!Y0R-FrOVcQ&lmjm0|M#DPVZ-ohQ9C8_URJxE5jGwqOpxAV&Wrtd;U{;+%_ zkneK_jB5=@oj&>6|;a zY_LKr7ULAFW|gLe*`w;l1%_kyU+c>(YhEau7-)siP(H0b#OTSV7MDrl5xpRRs5e>^ zevA>IqFEzg;z6BrMZ=c83tg-HLYj3X*s=xcYyI)(G8bx9=*^iHyCT@Ob}cRF@xkUk zs(Zs8H5t`k!#KThuSrl$MybWk?k_R+Io?P3R%y#sW!^^ky31Xa3zt3qen|oZnmHPm z1+L5KMt^$RD}U@d8^rmAb3(tCD>-H62`}OnU+Onu+hVpVQXM%822#}?%wN}KoIHDu z6MKjhN)6`V6+6g0uw1z8S1kr+F^&QFqDQ7C3pn2JMk|fsz_NZK$pgcm5{;qJ z8Lq6SWe@FLX-l$h^`9wlQF>|x5)M63og8i(%0CQI6@U{ig>N&DC(h0+c5~IyeqCGI zV{JNOG$ z0c(3!8gYI*K+F2?Kticw9kXK|(4BGa6^6VcG5cikh5ikvfWtb25uA>;+SG~{yn||E z3=Yrt1Sh-Qt855=h%3|)?hwj1ls+j_aBMXlE}tvEntK>_FLTTb&Eq}~dwf#c=h~~_ zvI6^jni1;>mr~5;ebRHa$BJtYLBILCj*P2IeR<14(dmoXfWl?crcNQa zQiqfC&q-!QVShZV@M7|&H0lYou;JVo;lnZE$HMk}Ai~l#qSlqSMflU#%(%o3tZz9c z*eP>3%)v*DmWD0;w4WM^ux8T}^@8pcZhe*1*^P7gF4VuP0i<;jvZnenNP#I2b*vaw zhj2AK2QX*ers8NA^nzzzYMH(dJn^v%Q*f8+Zp`w#c8+tGEBo$LMJay4Q-q(|a7Xa8 zZQH4u4YfWIw}!Pf@>++5=$88d!}~7B<%xK@$HM|_1EdJw(Y7ps_k-vAtwFByYkIj? zxvB~fb9Nzo%U z-02wq)Fc)IQwBC|GaA;iuIoCXI_qh1Lw`HTO})LgR7_k)mA|>MBxF`aX&~9j)iei< zj*A&1YBPyW2l3AVnVi*SUiIB%A#vMrpBT%a-F4`SK|((ipB{)Jmq z&c1JArY^>+E!p~@+W)fen+dF-C`Vr0MchMj2+R3ai0hn;1h|0o~#y<{-pit9(os({GWN=yOo}p+IA=PyUAn*o$ zVQ;I_|9J8mU@Ez!0&U@w6IBM;g{Fvom7c;2fpHC{5N#MRUc_Q_n`#7jqqC=oxcS7t zLEHdO96U10x^Pk_5ZMgVAQUZh!OA--rVl=sW@11pY$pP0EDJ|EJpz!EPtw|SQsK2J@} z`ghv_n}q~K;zVS0W!DYC5rRGjHnV;F(IO5ctQa9oo;pK|l@hZ+fff0kuDy)G6dK?1 zXe}K()>m8sePrgRH_k7Rcwm!fpH0Ski1wk9geiLFN^fn%l3%D!O@WIxkl0AV7^Aa| zO7xEJC=UbB2XCVha;^9?)5YCc&JSsG?DfR!IzCRd{gYJ3Cuyzm%EAHKy}`5*!yIVH z_FqgE-LY>`v*wJO8`4zxgYN5UI;&Y6@>!VxOOA%P`PVyKzAU2CD3^`IpAE*-$vM+R zlNUG*OD1O)N7;D9tSns`{%@98DY{6*pTq9kHc4i#aP6awGAWkR6+CT4aCLaiu);5w z>aY#!VC%6dx=wYD@RXexazkSXXF93qbEPe#RGfm78sy?A!l0vax-dI`Xx;692Q#DW zqt0JF@jKEX>lmt~HPRq&RXNCkh(%-F zbh)f*cR6>kb<``!f~C_x)wu-=pVqxw9RC@8GEhqV{nuZhvJg(8xR0@TEI>W?ZgpU# zk1=4IrN2sqK88^Aksb|+JMvgRL@T=LpOb)={|EK{^0=Gb!KMh^EKRsp7ns5h4m!#S z;T?emiDO>BWiZS9xYFd6NjoNO02*X_f1b1Xrj(ij!`lq9Fz4boI!V|~MKZ0h=}}Lo zE^=KtuOHQb&&HBDF=IWGv(22#3za3h_1&cEhu1{*2=Ym^G?E=|A}>Sd^%C7Vt- z2*uAcK9ODUIa$@OVU>m!N8E(&x|h8Hld);*(sW7UZoVW>e+yV=@B4!dl#pAQ?wkT2 zQbMu_U>Uh_S-O|U3e$7%v-ivifgC>g(%`N@Y&o&skMuFH58I#BJ$Tv!Ic~V{{&{?{ zee>d}Oj~2F^`kith-r36=+D&H(UZGk%jg^v(BbI-IqdaQ);B{Ou1&?KQXFZ6BCROGsH|E|MtQJJg1lDioY=iHMF znI4bu7t}6EFGsA*S+x#TF%PY(+zMF>y+1oaXa=kc~CxcCPw zV5b3I?z*gSo%p}EDI2Q;;;RExBL*_}{R|Kl8NpoRB(4jFXyx)niwpU3g;WtUv~P-6 zT7}gT?-yyFBOc8Bvrza=DDmxoMFxgC6DWgB+l>V#ok80#7A;%3+n#$0D8z6O?B1kS z?`oIb#2;>}q7aR_AKEE8XlP5FNqLBBxAPab$Ju}At9Ozh^Af6aTs8 zCklQ`S=+i}`L$)g%wOM>;XER4eo0n#`F_g}o&V{;(_aLf@7a3x9jSqkthj?C@DvYL z$fIQC_xLX+7Kj>$=u_l<+C-a5@A%e4%euYdap{l~&fCBut4&!8}G-J-J4MoIObMsF9^%?H90Ig9Ua$c$H zFNg{`C~rcBMW*9|lFe_KvB*WkVmbIy6Pc4H_e6el&2lVsjbcE|r9QUz+iw|~{7d1A zSgW6=xD^)r5IZ4DKRqTl)K_X0a|sdvvPoA3LKoZ4b_N=^g(J;ui6-y2@x>ax$T{|0 zG{#)(V)3dP5_Q_Xl__40KCZk&8*OY;qnf8x{zpjvFKV2F3jlbg{@>L2e}N?+;D1o# zhVB*C|JD9CM5BQIQ7`{jG|GP?0D#RAq5QuYaQshdJP0m_XkhuCi|J5#(U9NA6?(1* z2AMjQTAWw{{&R2C#xztoz(59)fTy^K2!mnopmxC|N1#FfWGBxKl4zjF#0~2KLk|w( z+@D?J@QnTN3&fDD*a9+0w%|!c=ZtvfMqq z)E(op8P98*^V>txq>e-Xn@49!;TPN=3`w4g+z>BT;cAap2Zf`!aCj4uBhqA)q zZWPe`_3#*<=-U46+`|@m$gZER_yaK{fOdtk)|P36we^PfTmyw3$7bldB%M8$}5!?Ic-Y1p^mpcLtbwx#Fu<0x@<&;&O%M}si zUUopqIs$P87J55`w3o|GGUU78Xk0#`W@NQ{yPtbL70=*YFJtN&Wf5+swS!Rjy1}A;Z!r}(B7fVt>u7wX49(8#o z$=<9ottzt8&MDN-Jg(u`H*sKc_exT6vmEL~e5%d&-E23Vom8ER*3aU~1?4#&F#ozH zW{vl3beV-0-skoZypvXKhD#x_K2b|@F3)~h)bw}5u}lNin*r3y^4+-RyjvfP=HBK5 zug1o#dMZK^(N)3S7>2s6_itX$4q&7B2)3fHWXU)j%f49mvtb5q18go~cxqXfl)30q z1dz8D%bnD%j3ruj$vn{)QW=-czmXayL9*eDHfSI#;ABfG=v+mFxOgt3Xgvr;Y%|?{ z?QrlbD)dY+N_(c5QZZ^d2$o;IJ$5SmcQ)Uq%h*lhF3<7 zZeq|$yCz;HC!TLEdY6~!dlu`5zFme6W!v2?yHN|4A0sODjH&B1el?HsppzY1D;7!* z^>XSdG~jmrAY~b?9yJiRGDk|B0AeY9VBkB(k*&N~3|7YWQs4$3k7h@!@LiQ`IEquY zk$=i>$Gwj8L?EP9IrNgCLPPr!k{zsH%N#8KwtQK(LF1?R>i#eSJh#aI!4%Bo{5w5f zU5roN&h7u#;2pQ&_UvdKxRCyNKI#>WlKm{dj5E^uJ=Q*K#hUlu0LWM~MZ9IR*#Ezt z&s;#YGsP9gYWs4Q^GK=H(b~!b1YUj%i|2n9Kzx&!FCFx>kY@R)O?^DdSQRHnhgmjP z-Y4bCsB9SbILED+Cw+}w%z$7yoV?+3^~D@fpkGO!bdK#u`F20fq@u$dTI=r@$62|{ zak^sa(2z=Q`7R!n-eB0lbE4&VuKu=RDXpH6OJ8R`tw~z#-O$i#z4i>x}VosZcukP&&93g|jcT zB(y~XJ9KGfnIC-)_ z98qOTBpUo~PiTtW0y97MgQ?wrhgBm%lmER=;E)UnU-3d=RET3<(u8JFO|D_8E`Y40 z7bREuT4zS%hE{S9yik(NZsw0@_~%X!_x0`Om*uB3#hIjpc()(=$dhVx5eIX2i#n_S z3`Z@C7vOd}vfU290iVk-tf7+(*I8+-4~fR~c!!3-ZX$*7jo=G8^2T2BzF;PZEm>7H zGQojllypD%TAkzii+JznE!EI0vDSmdS^w(2L?Iz37)xWE;hmUku4nYim&GS>CL=yG^sU7A$l}>y4;zYx0v)#_bSYireeSyLk2h<~rztMj zNuWPt-7f{B$cMe<5;otWuD==shCRmvKB7_JPsq}1BO%6eb7m+3%x?9$3x|KeSwCdD zQazw8%oP^=r3S7B1}>gIOE@K%OHnEgqf#^5JUID(eL`keDsw7hX#;E{VnXXTZPZDX zCa7Wrreu7T1`==@gT&dqUfgaHPn3I+Xz^zb(}E$xlLpH)6^pG%QfLsi_Z^txpLowh zYDJfe{+0BPL2-c1NxZRr(6{|bgtiB5Ik-;??VxD3u4mm7(nng)^~KP2#!86-PZ)kB z>adPK&uxD?)dVp@c5C#YA+^+V8Sj_sgUeqanEQVi%F!zrp`hzY)^PCbk=! ztehL`#@%u}WqCJa*Cp$JDhf_^mhFs|mJ$mAd?aClcUcRY{mPRRp6$;I+3q|xzaCP$ z;<>k<6m(|;0+lGfg`==S<#evE&T>{CCn5+fWT)_00S~hQ_q@HAi>CE-3xv}j*So3e z^Km(ilm2jYmf_|u#Dg}O&R#M9-rE!sCZGgrsU!Yogc2%Bd@J7%86weOLYxo(Cvh$o z;c#LH5vMeRqEHjtRi%# z!L`HbGvPlmWx8DA-Oe40eu8S~95^<&?Z&-A^M1E>beMZoc;9Vek9c@q0WP%AUeJZE z-@u3!gC-T&as3Tth5a&tc}trj(+@+Y^D9uw&gdJ>sSktq!@3+_d>6ARQ?)!nF#T{+ zK0dGBiU!y3Mzo#sm!;RI+~g*=o29ld8d!6tP;K!pdwUiNFMTS?4l%2kuPHL0g0p3M zT|}(X#DWg5;6=XsesqZuq~S1gvXCe8U~cekkQp^o3yW+BMkR>LBk#0I{#@o6uVIy1 zhs>nvoH#bK=bx(KGJIew7&4%Rfc|>BVfL*e@#5(SE+k^kw2of?Gb^5l#sp0f-9c~p+HnZZ&(vIA!-S^u$55 zVhL@A8c7n^AHp)irF9zF>WMHD+`k`RY0Ko}J!UhCH9o!}`!PQl{khq}(LqFb-DQ6I zv>r38^M30-c!+pTUEwszyrNtvpYetF>EMc}3j(##XD>t|y(L*o@teD*x#v>*$;5l3 zbH{2u_Vd^u9Wapa9w(*boLd5J(rs@c(SIYsuYBoUKn!#(rDV>IcVrq^i(N zNhgGC4SJjMFR}-?)XdgIV-> zMX95|NQ%U!>%7$|mF+izuQTw_8kN}1_xm1DoU&qQ5Eq#$I}M~PyO+^XLjBDfDG>nU z?2%Ko1t&wH8`^cVCWu(vxGtzdM6$u|#1^>l3`4H^e3zz+rh5%P8%d^bem48Vu9yzX zp*nAd!AQO9?=D8XkI3(UF;|uQhKq6F!Ye6ZH}aAVTLsoc|5g9tY@{^dxlE||Rav^% zoN@ul6;WUL2?VxyKWTT$d@gPlsJVjkH3uF>>Anga>YDWq{>4*>Sot81{L;`9up+OY z%B&UBRS>Z$wg$j@M=cb<7Ib^{9R5$M7JNr=+K4@!7(BGNV z-;pP+G8?q%K=ub`E+{0_U28{AiM)D3q2}qj^_k6Ua5UXs`GYpmKI1i((@tm}QKXjB z*ku*BOy|=wuH(Taf2s!6oAW}&f$C5CG$mOSm~@mvd7#=1j>v4sZJncP8M$UtNedZ* zu^vq4xm5nif1bpyEaJ8JN517H8Y7Lur=%^~yT-e>W=kkkPVF_|B0(i5(s;WP)lyyl zl)Sq?7)#VGIAwtDa|`*Po)I7FTQia;VoF5?Xp`tolu(1%2Rl_ccWo*`j@ttZ_|IwP4$T#4F0gZO6Q@|hy2P~Bg_fJkJ zZ^yL8ug`kljQK z?M19om}=kyCFJm?+P{{Fy+?`PkPGnLw^^GGLEFk+!&aSPjE6LM`ftJD#4m^iw|tt% zITVKHzC>>$(m1XSf;!3u6|l^8!G$J`QZ*u0kwXQpnr|O()RITNlq6{Vh<3TEy-zl& z5`^FLl$t_uvS}@?WCBB6{LRt-GS_)2&`S>yKt1(FMeDd3LHIcpL(Y>X!!;|7q##Or z8gOmys-H92-4|sL9`(O=hyznTa=A8>VN!L@u5F!t{ zFf-W5lzm4A&T~Ww8auN;sQmGd2R53+w|~@8cK+^w6*R9E6Fr{2Vdx<}u2`Z&?{3^g z5YaH`R7WMHA%gTblC@P5|7CQEK=00kylsit){|vSKwO^C&tHC4?{!*H=`lc^thkrK zD)0jHk9A)PW`onz6=u9ZpyIkfO6O^M6GZ7AC=mA>bZa?pP#A9oJn|oPGJ7FhQG^uXH)}}Y@f+)j>ZP7r3h9D-ijbq5(y7IYy*m;jNcV9_NKndP%D;=eas_aMLUgeq?XHgGC2`#_mb!I!Iflsq*i{! zFIq48biH@Fii(4*+4ODc(ii%&)~o*~i$Y)!zGRMTCFf_|F^H#btTm(3tVts=&9@Ru zYvZVYCOY~?;d48A? z$NoMQ);yxEpuj#9f?mOW)vvep>;9+O{hdL~)8UFpsa9^W`t)<3VmR5q>6ulhE7NiH zd`(+#OkL(Cc{nv#K>qbXY)#5>TFM;STe6re0#c+(nc#j#4$13}e6(c#DnB@jmonIW zH`fp%Fe+O!%yfjCqc=qS#C4>mEW%^=5lkTb{Z&5Cx&znUs(j>ps?X!Y++Ih(W?T=p zS~ABF&bOxa>kSi$Kf$6X@dau_bpT43JW(Lf(1VYK^T&U$T^guE9vod9d9WoUsJ52G zZI`g*X%S9ikTIx0s{^;w$x3m;E|%boStoY%4fiy)ry_*oyMk7XB z0P*ghBH3SM=ogCs*(w?^6e^S40;)YrsBp=@-vn;^@2hBqb{%T`zTUjA#~a1rEmv1( zscf8-HyCx5P{6PhJINU%5H6p7%M>#~1HRw%OEjp3u@)V5Urg;g(p8*XgCX z7#>uV@7X;IC_7w*F*XX4-QakH+B|9QzGQO^M4AR}An=)sD(12e(F)a`m`FHgDRDz_ zd>Kw_L~te!WhH_zu>;Nm#!D|vZS*91(!sVx%gulgFgG(3kkBRwBb)@2$vH0Jg;f~` z9W6}DBo{juPUj_drK3O@Q&rq0IFNHVK_bds2K?%2YB{+urzHrQ2660WPuzJ zcbH%G7Bc$ufw4tMI~d|Kv4ntbw$v6(?2s$2hKgNFIduu3}q0>EGI58zE@DTG%vmY=M)H%twSq>{_2G8z}i*zD{xgOE(&dIiv*Cdq{`9 zD`-7KLSaZWYHlB-#F3FnV?3Pt7qf0R@s$S43I*aQ-I0OYQMLNt{@vm1LsQ_Db)iC5 z@=7|IWz;rx+YPQ`>AmJW)rV*#YWI=8RxF{|#bFte>aLr@MSq_lS{?AW5%K}N>xKgEZ~6nSL2XmaA* z+1I079s7|?6{e9xb~7L;2)fEhpGDa*--%@YymGM%uD~v;{0rQDVpIH3H(B$sx-!LQ zsRCtOc#eb!_M=>HJuu|RqUWYN#tvpaR|0^y-ASVTZT`zrlpVkDe6=p&o)2h8MHYvN z3(h{Wn5JWIY9@@eHA6go3#sZEu^@dFyWm0r_Um{*eD9u$Y2a-tP8#Bw{&~{m_9ckv ztHURb?C@J)DP3^u-%*^%A2rkFz)w9#iAO=TjIml$?t zcuv`#IWUBatNzo2ze1~>tjiH*&B)%Pekq?Oge%8XpOd!p_~Qv-F982 zXso2_I~)S&cO!Iz?WPIV{h)Y(Fedp7bhMM~&VCOm(BJuX^ksvbXJPb^@(u&J#UUQ! zl-5(R0}7_|nGNk2*|(DMcI^WMC2tdzf=pvZZ<~kQ3_$MunPlZ9%gyt2j+*EtUW!@< z)o_^6oJ2ori3T|*esD)w9KwYQWgD`mUqXLr{S+#`{PznOvUQvZX;W3`#?d_b6#?`m zAB6hECt(TFA_G*17@!YcHO9@si1r|DjXF6Go?m_g3ZgeWlleGFgPZvw5ffr*8t_XJ z1*HCf6jeVT$Sk%go+@@HjeHXoPV!-8pe@?v4dT1cxgBIM&F4UlOCaYseYW%+vCbhl zLyX9<7Hi`|l)zyh-K$O(=a@FuJTWLrM2;wNO1Yk)+=L`9`g|MeT-POfFf!)Y0=lj$ zABWqVf9ef(+rgNox5ICo%QF4G+PEK7Dk(>F&BL9ylKG8CyF+I1-|r|K1`LhpvD6BH ztPR^6p7-`ZPwtLN!89p<6_X)e!bAoSd+nUBW9*bnaxx>i$tZzgq50PlU0<F$8v$(@_Vv;Um+#s-sn7Z(7 zm=KCWhKfhmrim}z;j9%m;OF>(Ij0|c2Dlo5 zzxSkqa+|L!!p|rmHk0U==4)r9^3o%$P=i!j@t<_>gfE@O z6ejC9(<1?yw|~CsD3BUyGV&{4$ph4;<{sSXgb?Ef>f&E-%6=&0^rz|W)xAtHnXe=g zxIiRF1}Zrq_IQuY16Cfp2Ds@;eJoJst#yVrH9_Tun2cQ>FuVBOx1^HVgX|iIBw7FFKVIIo-ra9bEFwcCTFba7A5MP=~h4ATi~&f zZxr)8gJ!H8Big$4bO!UrFNu;s4o7wPQxCxi)CWDFox$QL4UOKQ5nH599JmAF3CNqU!tO z@0XRJaiP?Tr@}u*&&BgxNG2i~??idW&~*4hGtD&oo;g5yw7DhzM@l$uPSV(iImRdR zKE;*p-&-lm6dENK4t~imoes8nRF{BXptlAE-XTKnUqYj{A(7B(9QM@?EbP<001gwmdG=2g10gESvF3A2%7r2!a*p_kj%+urbL{Zv zU+BI>n)G<$;QR)=9iV4FNFoOP9a=Kz>W0$rjA+X3l1Zj=rZR&$8i_!A!59>p9=nY? z#$luB1$>{?nlm?CzV4#QRk29Z$Cm$HY!Dm6z-P%*8Eh_n5Ol5%G_geC9}V2BeK_43 zx|dZbX`GQwY2Mj#=R)svM(y-9jQe$of5!t66*6`8>9^sC*0Y!kPG1pBFl7&1R6P$n zU^om?=4#6&1w+*8_U9l87WMMsAwJP=M7QlX>~(DZP!uyn@So-=m%27h@p)fTkE4K9 zGabZJZ{b5S;dQn(XqCE5@XZSjgy;My^enbiqFV??LYHn68t*z7S=@1v#9Nf`4EiD! z9x*fpV_Jq7QaP3TZ#UItZh&ZiLrQJJtjOfjJ&j-3P&|nc-ZOd?o^EySN5uLO1%^!j zrvQYm?NbV<6?T^lu^l8x0)8-^OIIH<+D$z?wnGHO2fqI9PlrX`X1j4aRLcd24}rh! z`lNU|#jnvSbb2Jv@1xUWHe(QPH^A-^05GfLMl=49DA2|*B_)%HRXUVH>%M4)Q?-RP z{FYvmVnAUE2TJ-s*n8`!s=jt@c(G}fkdTt@?rxBjlx_q8>5!J#fMC$wp&;Ezr%HFX zfYPAErfctS;qRR1yw5n_d*1JlZ@hmohGP%!vG!gw?m6du-PfEK6AO^|2J+C{&R75% zb%GYgBt3+J@~pdo3qYHbO#Q_1REfC^7lQ#JGG;f1tdFO1lAsHwaZ=PM->3~sHD$fI z@h&{HDrI0LLZQ%GR@ysP?J0jZc30!jmvVOzmI4_mYK;(#QVa4)+G!+nhM4!JP`BF` z+)!0MDNN%6!l=b*q=avOOM$B>c8re(o&DsiVX$3@tARm>+mW-(_)G0K2HhpnzK`Go zChR_yd1_`A072rKVf;lAz7}ih%bB1O)!c9C;o|Jur8*wplpnR!r<|_H2+QZW|C{IN zzVkR|{EFEQOWe2bHAng51KzQ8sgkkA8{8KLeaV@EU9#i7Imz2Zw%>+el~@7}f#YH1 zP*n@Ry5}Csob}~lUZN0go()WXJTz#-al_|iS`oBU+CH!OXj+;8)d;k@pN>4bBOTrL zvl~zOQnW1<`Pq(G+!gs1#}wb_8JEFk-w7VwBaJgh8+s%894K8?C3)c{{Uk53ljr5! zF>M8Z`vX!+Nscpu2Y(_}<$EZRv%VU$b-!*AUFPmos=MgStq+nw>Hk%w?cXE598<_6 z@+vdpb98*wb@uG4vyqiIN(xKQ^N)vff?C%nyOoANni;L+sP|4C9y+OiH$AQzRV4+w zqX-H}0yH$O%HH*~)&%R)G(L1H^}d(x=Q~s7CW|gP%9YeAb%6~x)pr8Z{j8PM~GkHB6ojvz1Dh6zZdjf54!(( z)|wbNm1n6eo)Pi|d|j4eeP-MqoclBl80v&q7!G=G7HsMG93>fIl3(PjyEp|aRJ;p2 z^i?kSg7nT4^VM3P6xF^#TwK9v#X|CQ8@9w$M+wI(`jt^hZ{ip6yp)ON=BhPBuU%R* zKL}s}mOUT3_lLsm&*D1V_ZvtL)u-5JDq2LTD#G>AKaFH>h)C37xLsD9qfsSJ^8q~2 zLxZAs#io%Q4r*#q2H%%lZ%k`g_&yW=n&S3 z$N}NsFSD9)X&o(e3K^rw9{zX?5a1p20;PXgg}M`$&Ytjn<*U25yWUC?cA#R@)!>A? z_4>lD)W&;G*8gI$&g^*kDmNP`CXV~`%Ue7=4}T2Wl_3bG`ibr!as*It&e~3MV^V5$ zFlqZwUI33M;JLT4uxUxc&PH!~|8~mrKpy|NnLXau^cyzGDhX0AcANKv*>^mc`?QOY z{qe`bO3g_A<%#p_B>a7oxA@v;jCQ0r@UPc2rI#HnQ99B<$)gk0z=HEqd+uMHOQo$I z#0CrVd}46BIs#!dXcaT}(#f|6bYj$^u2VNDge&RX9F2|~RgW@qACZSUcczzcgjp2g zR)z!n#&VaR3Y4!{S9jpyoK^ z$)Pesg2lNG@;7oTt^WHNU{@XIh=BHr?R|FH#zIjl+Vb zc&gri`9vh3i>nqhyk@60t`cLFQ(>k`pRHBY|fzJfU+i|%L5{TO09I8&qwJRpmzLhpyKF-iU zS#w+|y?B~U!?Ed4O^HO953YdckCEg#YmKuID3vW}R3EXkH(u2yc;E79SSVZ+wsT2k zSkQ+7C|}mgsRg_X>24oLJ{-l$-FIajW5WXM#ohSPAPCDu&Cpw>46Xp!Bg`Cjb82fpJGVOUBFM(NT z9~sxsq1SS80m|(|wuc=LE@*Gbg(OT|%~7B?B4gR)ozzh0`yxYdE7lViqjw|Mu=m`O z+asI|I-P4{{xw6tsRN6_TULj9AGS3o0j}8E_BKnPYY9eCdAl^3aWx*VD9SW_o6L8&E`@>H5AdI}#FmUOt+(ZW37l>OM z^2EI2CSMM79tZO*0;!I3eLqaI?@_V2xe4SXz_f3~taeA8$01pSpC~q^Cc4*onf^7c z`m*PEve+i2PsURo!OQS0qRbbsUI28@yIVx3I^J7fjDI>jV&}JShuP+RGk!t^U%E-z z{Z?WTDWWoK=4`XWsU^ONmSZ)5Or=rdZ`($)iESRv4f-V&qqp_?4N{>&&!Z<^Ah6Ne zoCVA$G%|@1Izzwce35porLNO5M+*(M{8@#P;N521h1&&^+^hElx-Q`4QCLv6&Lly~ zZ#skbCi7NJ2HrV)moZp@RC%=2b=g9n{@i{i+gYl1(y!O5tv{j@zkQ-Z?$Cc5@ji^K zz&AT`)(`P!o-Goqjet_*o|6e``knr%EkzahW8utiJg);=wCY2X@}ujNnOCK}Q3`g*l0LdvtsMz|gv0-#++=s3s0zsho*3po~lp{S`i zkizm8^W8qJe#DVr1)z{_p&NISNRrk^w#gKrJU{n*Y+U94(6ua8e^=r8 zSRK>MSVHfa3?Vv+pLZ}iUE&BHox})Lp}&nK)?aY;yJSf^|1jj*`CFaJ8fuYeYn46w ztKU*>S?osM&o^QQ31F=v)N_sR;j{}Ov5A#O8ECm#ZA|4PanA3{-|om(@1{dM4w$>H zxuG9G4x1DE{DJw#>ct}`0e8N2r3rOQPLhuFU$F-^J?R0-YgHSY8awY$+U#nRb zB56W%9g}&9^v+>oau=z5)!gdieCt7yMY45jFAjFoI2KOtOMiT<2P2kZ&?-}JCxuU? zKHo6~S@S|-i2bM5*diwluP&hSquFwp)jKOAT0w$md;|~=Xa{|%<*KgWv3nPwD2+z$ z#VL=H!zgCBy?>~=fK-14?!kRXMva+#V4YQLI;_DC$TLS?sIMpOfpO}+Wt~X?!`0wQkfO_N<7$z}L{l3Bg&3)O->JI_srY)&_ zF+|Nh2NMFlCxO*!8ErcJdOFBdwe!!jxBx_9TG)qJnH)6Sj)Y~)m)GTftNTxWfLp+g z5;r`AT?wjo?+=`7js?3J7`iE-SX<&)*_iuBfWNq>XI+Y1-J)T zkc>yWq>@o4)!p$UTjJaR#81GjUnKu<)s@xLPFsyyBO1eD^1+|k>H9O~hsr)951<+; zSQn@0DJ16%POn=bQinPi-XXy5_wqI^(!eH|tn)czgRdR%2E$=1A(?p7W<^&OhoS$; z4UPmvWV4%DmB{Zhc&6AFbUNVB*@t5ZKXO=1a&JqWp<;pGLqf+e&vv^EIFc)&^oS|2 zQ1X8cyzz9HWj^~E6HBS5q9vzKy@HH#;E3o_B`Ukl#d#7-a}NGdEZf=Mcm&bWN6Ewc zLdw{o&;bnNX}_NZ^-U@@Y;J8lfDFFCuSugZg{CI9GHvTn=rZn#yUqkEYjN9X0r7)2 zUO;ALw0EMsQvza@{aRPWhp+;-5F2u>%mXmE)i^P+Lb&&*N*Wa_99w z45n=YfQ+WV&N2EJz7SSDw;-Y37Xk?3lbmE;_@Dfvd$}jn8p0?7&$AFI81t@)X&9 zk|9PneXlV3oie+BVudlv!Aij{*$hXCMEl9Y^mE`TsVtI~NG`>h@80~KNg8HdDzcrMT;GJTc+8}5 z&c@v*r6djayUo!f9{#@gaHp`F2CUL1^hs3fKpbC*vN+7AP)8I0nJw)m7kbB1}fq$$yGC?Mm|t(8Xb&Z zgmmu*p2w_^5)i$kkg|UMrYG|%kfAI7VwT2Ve^FJ^yf75ebCgL#GL1_1XD&n*umd0_J2BU_bFM?W>bE|-z%us0H?hC0hCEY zTPi;gw!nKh*6neCmCRl-`N2}aP02um=)oICpW0ob?H3Hx*}ZIH*tTm*&i(QE*+2AE z{&j4%^g?*jV22^Jzk|7bIn9Pg{BTO~mF>jbt9>HslQjt9UW`eKg#%T~z{S~1lh$Uc zJ(g?V>ItU6A5^30yRHhBvhHWT4%eR&cFWOYOlmK_88NuXHb3H>WK30WUYn@gil;sK zq9!gr#K_T*;_8{@pcp@-g|YKaKI<6#vjLa3X>mv`!BrkDsiq9-p9%GZcq>#T&-IUL zlxVvqq6XvgP}QwfdiLUpYtyLPrDQ@)cy=#~pHGNzh zj+c82oF8U=z50O{Q-Cdo`zji7@C`4kTGKD^us6^9l7_wm&{IN$jOAU|wxkRrpL{-y zC7|%E_3jH^C~=2A{>8u^y`4M<9yGgWlV7`yZekxGV4LT?5w987(XO4AC)s!8A8}R zNK@HXF`1P2f#6^Y5_=E2m|2341#ldrx`@2*}M2%JzD*IP$5@4Z0sT4ou z^N}Ko&BJatQuRRprk$Ppe)mMJfP1U)_zR-@Y454?O(Kd<9kpA~=G@{V1znvBzJ@qR zB7b}!1&MYrzIT2_1|{ZRr54+Cb`twj>mwYR4`F) zSH0bwte<&+q)6eKxA8n_HxH<}>UY(Np{R<8%@n7_iPKEInMWMlgz2|u-Nf5>n?!1v`bc{mk?T&Eu7M*3=~;yl1;`4@Bv4mX?Wj^$YHN9%1My`UWbEEBiny)_pe;K8s}P8-gD%^tF_X0_m&GKGT4O^nzOq2P}H!G zfb7_D5`H##XhpN!4TA|;L)hWy*+$JsWT$QK&(2wHQo*RNyWcuR1cCF7EJ;h^->F;O z9yPN*&OedK*Na1;JiwI9d@xR6tEH6K*9}C5a$Ncu5;EWG{5}c%x(IRqy-}A`m+GI;Ooa}dESOa&ws*i6bRT-#7 zWI|rS+DkG9r6n(0Y!`yIs2>kvNj!|SGUID#jr}<05aCIdGp8>{OUR}b$^WO`G&MQV z)E70D0L#^=cjWcEnhQnVWNz|TNAqMq6_*`6e@_s1=?!z~y z7iAAqQi2%uM})_{m)U;6btOH)*IIBxqSN%fKNq%0fYCz^c+-J1KIs|Sa0J#?b;ZP* zc$rOD+dKx@Q&Q6Tq)OU-9kSwC7Un>PON8^Bid(Ccdfcsu>c8Y%Ttatpt~)u`ot*1V z&UGi}x|4I=$+_<2Tz7J=J2}^#oa;``btmV#lXKn4x$fj#cXF;fIoF+>>rT#fC+E78 zbKS|g?&Mr|a;`f$*PWc}PR?~F=em<~-O0J`>rT#fC+GUVA?M-)0Ax++X9_Yw z06Kf@->#{=v)@4+XmvEc}$s44Jc z;t2eJ!N8Bhzh+E00usq~4Sx5U1xR?0K#2taw3fFBq-Ino06~ktzI|~lY6yVN8Z~ir zG!e-X1Ox%V1@sDf30#B#_YpVO*H>4Umlqf32q-{=Xd&@LyF1fBo-G z2>DmrZrh1IGuqqHSXKN9Y$$jO^2k3%DijLvAvSL9jaBerT09g0_HOOI>+70ZI~+K^ zwZ}#_*PAPD?ciJc5FU)cSWJ%(4?Wr2*bGIuRmX?F0WbLZjkuaaAo|V`-}1uWobKK1 zArMyx#03J;dw%;Iw0CC42D|4Fy{F-Cj&HxexI8gD{`K$okM=g!t`~QI%&mSsFNzNj z`==uRRP?qY0AllB6;F##1)Dpy@}CV!PX+xtHPX}3SXrF+x4lt;uWSs}Wca}L#wCaU zV+b&_LV*W$pFrFFdz-q901E{apsUOUZO`*_&0G5+&|Cr9p<&%$tyMuA53LEbr*47} znD81l3OrQsaaAb7)fjxzTv6SDIL<^MLiP~>GPm|cHv(~jKpY_u;Rm<&SvR6PB__+T?+iW2hAb$7?!lb4|N|HpNAkpJbnyW0`~ z;Qo1SC;&(S|6F(XI}?48PA(OZz2kGV*DTzzhnJM`@Zl>NO>URMg2$WWSy|hG1r{PF z$7&|x$SevX+{i5QlUiQ^#(VcL6merRo_k@YPo!PRy2rj7^Q)qNS=)e)C9qBMSJCs-e93fQH`OjMLO>n^aXw9<%RS79OIFOL$cQ((qCfSS%}W#Hjdzr z`o>!h)-HEDlNFn%FAkb8fC@${zQ>I$aBt*C@;|CpZ9^wl#C=2gSJ z7bXS9B%UI^3fZeeZ&_Y?0Xc>k{5IDd?CC4YXRpi;fDwzu5#9%9_n9esM+o*Pn@*Uc zKk(c8tuqSX0zuRGQoyKher1X#1h#`y*1Ktq9UF|jZg%|kV0%wP;z~T!wXn!%={Kf^ zmE%$#J*=?WP~@Q-2TNV9SH%4~M|zHp+RDyoj2r#*?f`MvI3Q))dES>y{$>pd-8=C2 zVT^4Ec>*5}>igK-r6j4F%upEwU%h@Ajtp*?H@o`LN4?D5d%NbZH7CttkK zhY<_En;#B)o%4fzEhOYl^)0IFA6O?uTb!RI9wZ$AQa*(@Y};>Rc#ZuiFWm9bF$6Ky zmnIe5YlMEr9p>;zNCPN4)KDOYLb)*B0AhD9(05AW?Yj)bgXlHh&$#N0W)y>r3=*4# zk?I;7j|ux-rXS7YrxcZVBpCAh@QOSX@QAM?Z?!aLO9Hj_l^q^}4rVX1!hMpU@WE{l zKi*#_$o1r}7&)j5U3<_VV<@=5lULHV@|eB5(}S#Q`B|*~2;sFpo5S~)wtg}sSS~5? zs@v}w-IwYaY0FJcP|TiEOsTPFVh9rv-i(U2J_fX-Lh{Isy^+o0G?BjYhnOO!eszX> zvEa>00VwC6NU5MwNtg#7S7X;XXAi7h9!r{@8N=hfMY0br9tyWvsfYYj_cDzZ;a2EP zq<{db>fc#63!q8K!ltCAj*UgSrNmaeg#>(`*LT{2UVBfk+O?4!!Ghp$*7ItlEE$cI zN~<`~7b@7VJw@3O$8A6T5M0??H_6^IEpOD16kvV5*W@WRaca20mb22udjrCxWD{Oxwi?I`Q`Nbr8_|n7Z<+IFL9;>B|+%-+BT6dZ?`hYF+S8-n)Sp`4% zuunFBtakG$RkduV@S!`>NI&T{d8Hezm0nBIy4)e8JMZ_VmXj71Al&fkvOa}e16p~4 zhlB#O@}-gNg}15k|3B!iAdUBGZGL!QQc@ICz! z!&Bqt{2RPXLzuNYjROmMCZ+G&Gu2|eC0u}b+DckhN&%V2z!aXchQQo5SyW%@`jt0O z*C5ghl~Tr}0u;A9zB)=gUT&~f`pVi8T(Q!g75Jw;;_2ld*Nh{iPrdj#c%j(W0`>#P z0m$u-2Tp2zz&2a*x+wFTsV+sRy&1xjJdWC~b2Mty9JK$qgq4^$VChJDb4rI7U7j*l z>wkoZRPv4Yv>oNt9H*_11B@WR1diIdmD1uMzn|8&T*xPvSfOo}00fc%t|B_@xzlV#?p5Teg}^y_fBWHN4x-h7{s#AP%M;YWY0_##db0B_e;K$Up7+&iPE zpCX#o@{QSV6OI}2qQRR>7djX;N1mgaDsDQ%s&~TT4l$B;Z84r2?_a-cntha}%~+>W zH0PHfR$Q8-_NJv1r`7V(Zb8?H;HazZO@IG-l|bZ;?^^7jtm8DT*N}nuKfQz;WPIzy z8^P{KRUIAYbvK>D0Xoj7Y#d3?{Jgm8*PgXBQ+0%nym%-D#FQTPwg|$e5h7gb$7d}X z1L+q+!(RK%xxQQGrCf8!Zi?moi%yv^#mtTXbLxKU!W$-k_PQv2$!{VVoRY3vb~R(~ zD-C|VwQbKMUk`KSH8ee*=(Thdpo+G5w5>pxuJ+<)bJE&Te&34~(7-NMy*d$U|8vkY zc-it*(AdLBBT5~2O9J%U56Y0i*HruP>zCA${yfWH5!PXcrNBG!oZFh@71^c0d{l}Y%5m<$vHLr(lFmPRshBw~^ha8l-am2rJDetFD-Ajf^OKc*etq zY~Nt%&OTV%(Yimd{=aji#sATf)evC4j^rxy+MFT(zHWewAf!BiD?pS3=DGJ&kB%zNoU#{PEC z8;yw;Wa4)^lbHF_qvI43r^esMB>(L?huf}en@!d*XcU{yuQH1ki}NWQ@?9$zF6k*6 znvYmgcK~vHJJL_D7$k55Tie@RJ_>Emzt4G`O*I+-LYVmxVsQAQ_o`+Uw6bWiMqbsg{bd$|4RBYZXCU0g0*P;@LJN%&sgGH+!ue1NKV{#Aj`#;b&Tj|12-FC-)+ zB}8E__S7;?fx*#5OckUxH}+zhnJF2!0?XswScM&w%OESbyJ|{=ngex#fYG2!Dm!11 znghu~1&gyh<2P#uM0fxdP{}6J(;{^G^^EO&USCpq;GFwgN$6&_u*UJZhQJ<=ZJ5?HNn) z*N_LMqm>(3m@jQ%O)7*&?JC9iM!HXLqlfBx_>t`XOD_;)n!ENg_RwhSa^NI<0k50( zF!6|Io?%XI_WZ(a*{$=-f4JEsp1FQo+p&u&Gv}EGt*O&v4EkvXqDD{ERJGz>k9g|F z-KT|vbCZdxX0k9va^D!eb}<_+$!q?W1SVn@zu_zpl+5uCwxFI6XYYpxZXi#h`y9q6 zk}7JUHyWaU_sm-EU=$`;cjtXxOUEhVJ-RLPNz;OHRvvX zPqt6<+&8R8$VgDDDdCMS*AEoAH@h`QW@5j;>UT z!C_OFdoUIG?}J4|Lh}!C_Q16i@UO8#2ixz8ESmuHh`?bfrvtV_96e{9&){6v1RX|7 zA9hK%fBE~D*hzc3`t|?eoAbIZZtggB#{<|7>pSEwILx6!#uLi>{Dg8!*DLmhAkN?$^F?&J{$N&q_h5AYSGv>4$eB-e=2h5kwstMp{p?^D*gXu+D7YNS+}&hY z?nBRy=EC;><$T_$86fqFap@ArjSyXpUtlk%Pp`#IRCrG^5Im}wpl7AR&=fael=xZMHrY=%m_~4B+u3f{lz-l2Ix{A z%(D(=#&2aTOYF4!!&jNSeV+U5t>htu52MoS$U+pQsBVF>A{&!7%B0Cn0ODFO_E@s3 zCu9Ax!*Y}WN2n?P;Z$J9_`N1yWRY0LpqMsMF4AoGXR;JU_*>{{*V`)pBkZJiqy))nYBWo!ZGtH1_Tz}(&gXs1<0)?z8FL=UOb$}g#C|8QU0EMq3X}KGGX(PgRGT z*^v6dz?6$B#scyhR#H2XP8zs!+UHDp0wXv>F0T&)tbuueKayeHfAcZTXM|jv#pQ>U z8G{ouZk+&ElpmakE?qcl;d?V-!uDY8r?G!tN)t-TxNRyF4xW?Zu8dH9CsdJVtc%e~ zXSbFKAo-|f+(imbpoG`cZK~g`@&gUE69mPg=2bM!yq5l?MI6yC=J%C6akbMfSj^|O z`KP7)zt)SBUMc?fmNu^9S8FXHc+&ZM#^wo*pPH7ew#qs;Z6p1V^m~zZn}Xp;Ql9P! zTYlzjQRhXg)eYpL)%J85L+`1sPD9TiMK5Ja@4`0{4xqkR5}Q=}9+E&=m;J8)@^h!vGM*`0i>V53zp+;t=J+Qs~U_ZMZw@<-)Lt9Y=&4pE|gWbM=Y zBk9+Ac*kabT*O#hDacW3GU$|E2TVy*Vk=*MQt62ivpSbm$Yr~yE|h8QT|TNKSwp^m zZSb5|TTt07yev-1!(yNzcom;Mnx*73KDd6!?x(a7+`ROD{7+_*n<7l{T(V@=oo0dP zA51%)1;IFaCDl+F7aikPv(}FIDtr})d4|s9G`HY_BX!!HVND@))dj!qGdf=jeB`y9 zam|YXF+mG@fWH!B&fSA*qxz?5KkU6T1^oI!Zm+`(H*(C!kDI&KS1>xnW}bQl&W-V} z(woobx7i}C=ezBKm=hgquPh^xRZ%e-HBv9?E)9$RDa9n5hTA}S58bxOr7 zL*2+X3u1TkwzM=0kp2zIym!zd`Ul74PdZ2_Q|Rb|>89zgw@XFl^9MrR^L(cu?&7Hz z`xc;Ewf*Eja{g!%Ae066dZ#U<3MPhdIft1``fIlw)^R(cQHsj}ynr}=hP2IEh?%cM z_ON{0eb=i!#SH2z2Ueb+p0YLjuzW)6FdkF0^;6)HXQV{EV@_@v-RbB72}fpi_vJww%2+Qx>(!IW;k8dY3)Mu2do9>_9|FuhxFB% zXlv!p&oikgzjS1mFVqcb{J2dfl{H0-zh034+ftyvoIuvq@@NMHKL44Dd@%449Y&1@ z;pT?JKWu=+9+F1k2TOaHh-=4Ayr@puS$Ob1Vj#n7@uY#JJ4p?af~2_FU|Vs76S&R~ zfAFI}FzTO30zk-VT`Y$2z0~|~R^mmcX-Msa!4CNH*!Bu*NA&vWdx7iI0yIfa2fC44 zSYd2^UloMI-MV&tiDf*QVS&O)+x8*rR>L@5mDNL^vgOP19iOaw*N8Aw#FK)VvXta# zL^Vk@o1Bwvgj2qm3U)Y-yLdcjq0dH2h9T8;lYn2~lL z^D{*yvudf$ZJ}5d3yqc=m8%+njHI@#)v$HM;$e|l!G@4Xdj62UWJzyk?`0P=VpZ_1 zsSuYef@R64heHR|$QK-KRN|JO#S?M-PHY1Lp8WV3XxDH2wiz6q;)+nt>I|N#{bd38 zR7loT$dBD^4r)NL@4)R1=e=mZ6Y(~MnaTn5yiUgkOfcGFK}y8cuU&uHzb%a=`Z>1x z<$*89;p4U$OV+q@NNR8QrUi@n-1PwK1W?Z>VKy>w79XcqAmY}mwPop z``hN0OE~!lxHVvE{Kxu}>84eNA(AFcSx|l=eu4Adxp|ZNb1-`&3Kw$BV%1pII^{+8 z?)BrFP}*7|x<#D^bO_iJ;NSaAI_NUXZwpwF1Qe<dW|2O2sk)s|U!k*s|sbj{K#R7{7xSm`B!pW015YHSO?PhS$XE=PEdut zJc-C3S}>LNcOa`~TbFD6M!PJgs(AQHH)A=5hb08SfJ#+kM!@81!x`G$R_5G>?q9|I zvGZ(^1!AC8Nzwj}?~R*R1^uK|TU&9?tmw>DRv_R{1~3oOq^~`{uJ3X#pF~a#7&(!n zkuiY9JbzK96N8hD(3Z?@4suTSQL<J= z%)m8}#yYCjtGWN$YYdAI>(y!*_)tv23kB#av%$pkTuU$NBmkxY6j5vtr z-57ADNM{ZdQ@qeU)sOU_?-mc#dRp#Ce5Kp?M4?tww*0u?-A=-D%^^)K;qR2Mb?;xN z_rG6n3C>=VWiSIVZPt@3w$06^(h&qshQbRpTbDIgA`IshPAC+5U>-XWL=ELIqQnSCjxW5rG zHK(m$AtRlM5SQ=;_95H@Upb=e6*%HYg{Pb7FSdMG@5#QZ_(lGtjodnV16;e~6rkUs zTKR9$%4a?HmYV5DnwL&7kfhLi^dv5azWY&^uiGYDip;X5L6E?mp(pq&Cy=Z$MmIsV z?B+8qygx6ah2H`>vdAJe@at8-Sgo0>v)>x=FVRrISC2n22a&6!T7b`TazWoV-_-|j zD=|0OED)Y9&KxkL`tt&geISny`l5)QtN%>VSj=ayZC}w5=h>PN1S)|2XgP)Uo;|1j z_wcKXk)h-ID&`cl+e(;Hciczqt5C~ozI15I#uF^AchyF!S9Lkbgwq}kucljGMCxyp z>u094u+$i&Gq=CiztGj{(YeQxyfA5D^l}_8UAZi5@xpGGInlyYl*E4GT#qBV5`=Q{ z1ua8yZJ{12Z4`}1v>@>jLIJah`6&}W_MRQ21;a@=YC;*N-m`1v{|hq=%XN8zyx>$_ zS?9lpBx6@M)f5#U(OQroGm8DYXAoTg5ETEKO>0qmTzLsnjsF3d9G|~w$urTaXc~@2 zS6CzKN~g@yE}k`f3Id9<^`f%A+GS&HVv5!X1jB*Ipuj<>64(WUxZXF%#5YboGuZlZ zsT5w7xgf9ez(~ReF3~m<7>WA}m0bYq)!$hy4DlmenM3B)no-MY9f7Cr`lX9T06C%1 z^?7GWlZ{t1Red3bFCXQD4wIrG$!t(|K-j z{88!~lH2JI1knVoXK|Ki2)(Yb443O23IpN)+$e98+l`mnN_tVi_vRx*b8Lp&w*n}i zFbCs`lZzbO;D|>y+R(0hgJoM$G9S%0>Z=V>-7?={EMH`C8s|j#_*QLN(5!?Z+x1ed1#p zY_g%G=17}1`^3!xxzEI2Y0q0IW?OmZ`z0ZaIZpkSGKjL7jn$OlCNgpF2U*CZZpZ39(Hi?|1}Q(rAF&RAHw21Ra*_g?T*Qf5h`AG)J!p0 zxk5m`iiLd?*mD~Vw(J+PUQ0cKh1Y_Cw8&9oX4>UsewHDfYg17}^C}lX(zTyU-?l+6NRx~qS9tYEH|(?kk~ z0L8k32D1yNX}O)SXp>vcLxP1CCHp=wakTv1z0=uCo*k13gD20GUYu=NA)w)6pVyFXVSnc!4yfNaQ3qt3b=5S8kG8qcL+*G9eCj(3~Nx7dcnJA&S?b@|!i4AeMH2 z?JUbJh=^bnYQN=`r#w0j-0%jXsGaLKak1F%8QY(19(%&F8?vrF^tMQXJH)PbnyhX- zQTw-*eY8_oKbFdags5umr^8#~az*ujB3%;B+6S%Wkpa}oj)!}qVaqqYK6dCvmbV0A z_tTlA=)nE&&n^oHb%rR5FLEE8o=*@oN5rE0YPuD4=%}>iM^#&cC}z$gYyjN70JGqP zrlFqRM0WP-lLTe%icl-qC)HK6MzL?!s+ll>+HEFD6>v{7lkyfd{~O&G0m+Lvu)a-J zbsUZ~!TtG{!s#LWggJ2Zrjke!{b376Y<(KMgdrRXr_6)Rl1HYwA7) zNg5TRNRYQ=K^^M(-;gwomXH2}y7+H^Bfql(!$+xEzA-5(7KALky_KIW!VX&k*CrK4 zo^4c3spq^>h`97ub|3n-N>u)kPC`=*%IY;lq{*0qG>WXh3jLf)V(Qdkznw6^@9Tw& z(f##Lno1++;7Ajn)TQh$5FlGckfkU3M}pfEMSH1kp865L<(DKXHjCi0nSD+#*7A*t zT+X~Mo_)3K|Js4NSunrOvs*XtBw=ctIhkxiZdFqtL|OXi&`oDxZY&WwGG}%})$r*p zoVFCyWt87b3H|-ojoruqg#;SSTG~&qimN;dLBGjc>dYi1SUHrj?aWN3A2IoQJus$t z^jZ@wuk(Rtkb_VQMLgqqpD`d~sJ|B{~pjn@Ggv)Al` zPZ?4`39A6^7Ix4`WOgg;=7+6_co_{)$fN5ALjY!m-&E;!h@~gxAxpqIwm+i}tLbRB z{JiD7kq6s}_{p+&)yJSyKA?n3BLqOWi2DC3)p0J-WS_7=0l2?&W}m}fgDBfKg1C!n z)D&{LhCnE?i8ZwT`7+j|??!h*e)A9;5;i}3PbEZ(4Jp92HmvJ6VA9 zzMgv_KOZuL5CtvoAb`hpdT*p6=0yX51SRpiIG0o3K2cdxR?C~3SG@d} zTMlj*2R~p-($0H-?ALde!f2Pe1W~aW-inI#JwjsMd>zM;DP~DXqe*cwhz_`2$%W@_ zBEr5yt>!MDN;$_r=~!4Lqzg-8==)rEPP6e_tsmd**dk=PE}07BJ!+ zMGu<8(|C#&XbBr!?-`obm_Ozv1bT;v$Z3?|5f$evSoF46`KLMU7WJEM6+EvmG|zr4 ztagbDRc}4Jhk1O|3P@&(SYG^OK5n&5=EVnkBPD;BTn1B~<)W%i1k+%A`2h7D+OM`W zv|_LIY|-IdBW4-)VL_au>SnfW@HvNu*Pr_OzES>)24XGG$aCa4b^xfnuJOmM$rxUSzn`e10q{rrd>hB(k7|O2abIE~nF1I_%t+jf zyy~Wjo{wKMQ&E|UH98#@JX?ABo#XU&Jlw2JwR9uUNg0q(akp@hxEmT|**_PMa94|o z4}Y8Z{V?Vi?P>w1ze$BhO92FEJS0L_{^_5Nj>#H+JTF+Ad^sUmpX@u4*7m?$_02T& zO`^cV6;YkF3#|gqogzW66BV!sgm2dIq=lrLX?h#Lbsthj4HaEt6+VsBPWp&~5+`Rq z$#`h#vp1gge&sa-aL_fGeBK=Vwj}-p9od-%0|TexQ(?!qXn70dAOc*W7jDn85+Rbi zZdHt6Z7vEb@SkNp(~H)`L}^lmE{g=0WkAhLq5imv3`oq&Jn-dkI7jL*|Ax*EG9YnL z5l7cHtzWN6hSH=U)$eyks%|$RkwWM3az&3GN&Q2GT1Fk$$$pZO2SBw>N`ZbzPLU;- zDEkHvSCI)RP~>Bj$5(ZKa*7dcM^$SG6sd*ggAS@*R{)&qBo zBWRoahoj{CGIb}lPkINKD8&!G;ho>_Yu(~OWT5enjl$6+qNgMh`vq0Z6NsCy5#EoT zVs$sSr+Nztt5l;8kf=KgdL-M=w}-YEq!|;zx$vu6c)VbrTWV1)^NsUEzn2j}z#rX% zxK(xCgpUBqGpQUiZ}{2xVui$V1C3}~as%Lsik6X4D7kKfq@^w{7FnoEE zh$thauKY6#5Ch&X*cYu4Nb4B$lM^EWH)Tl;FB$1Eo^V^x%X?>XLR7tZaXn7o;N~Md?j?=vV-eCLl#rK$IfAlc-dsBcfCR z0YN}SdX)}>^j-oIdhabH_n`0ZfA4+BHzspt_UtpW*V=1Os<1tc$%gk%mLR#!Fig2$ zQ_Y9pzjP`dSL2ucd#UgL(OEJ$Adr#*H?!S0@h8vXss$3$P8_nhg?KqDribtOJ(a#H zGxO2*XigqZPXhN{Xklcm|8zfQ{ed9p0_T|;_wM$7ZAe)!hSjdYAXNvtnN8|^A8&cG zoRI8-iJWz@mtK)HF}o=i=^x@Fj?8nf0Ndw3CA?wxAU{f+NgeDGk;=_{O4!{4j)p`6 zuCLIf@rGA3>&G_54ay9^2KkhL81tYPUpajrIS1!1_Acj zAxd_sH*hB>#kYNXY1x2|cHzshm@mnKNuZi`SqSRd{))#-X~;a)Aw$M>@|>q)W*SM9 z{}SN~hpSjk99Er>#jn4}1eYxeZ>8>v<{^0P%qhwO#hs#iH5G@eaRkb@%kVDjFbC@U zO3VFr&xTg=Z3fvJ>jW}|DN6Ac#lBSDEcK&=_n4G6VSsfR`GI@t_Q6*yyHlq|c zv0PfSsqvN|oE*rm&5UNm>dWY3Y_OVQ@O?PsCQc1M$sO>efhD-6zBS$td(Q}ziA=&2 zxN3_#i}izOYd&-U$nxlbu!n5#)U82RHq${kHAD~HK^RNp!`HN(e#*g3FFWtYQznl| zaB|@C5P|Qb&>(-c_qZJfYT>M}4p`^qy^hx}~9mC-d^BTf>cJza~}GwpOPn z&E+e!3MU0H<+m+w#p!A@^BfaEQ#m2f6vj zBR;ps&vcZHL^dV~KyclphDo= z3mX#g?rPRHP+&p{3$ffCKLriDs7JPX4($+tub(XaA2TAk>o}Q$w(8)oe zIzSwT>PGcLXz8NWI zY~HXE7e5uM^Yq2#z?TRC-00$^7q?|JU_5nCR)5HbdQHx65(8;TV5fJCDhCMQPp(QC4*k5Y|ygxIG7q zRwqMLC)lrE16PM$U|F$^TXT3ALF(n7x@C1tO0!e~ioOkbw=+8j7u^p^8jA=4-@2eo z5yMsjE;tg&J*)hJg24$(-=Hev^J_VO^mMWKod0C4$Q^fu0Lpnc6`AnI-ADgu#%Hh$ zKzi!nB(h{H<=C}Bop%##-{JuK8i^l!H}|J#@mwqDmjNz)v4UA?#z?vE20S~a@nJkw z_sWE#iv;2h0UUpHh1cA*`q?i?>kHmGp>g1*EG|v=Y@{DRY*s!Fr_P*DU6(Zc z@i!*{_Cf)k!|3t=CtOpAyRB(e76kA)$G71;{XafRe49b}_d#Hi@v3Np)$iJh>B!d` zUe|#bd10$N_i)cDUtmDH{G;MnQAeJxmogrK9Y|oSt+1zF&2P#78^&w+w%?1zgEI-X znmaSG;A`CAPIJ@OBrm<=<=IT>R9oVd4^??V}&1ou`Grs5AIyaLHSU@}oLgM>4>E)Ssbh9c>?^ z&+(sy5D2;(wtohjdmS0y91;TA9Ouv8qrZ{;XJSP?1Zjh##EK&cfEjzD6`x^ufbGb5 z_1{|e8AJcHe8Dr{sASXm!3)e9;fI=(FI4;gKDJtjlKMY!o$Wsip|!g0$SolcWzcbcoX4TbT=PNSM=OZHIsgX`Ax+gU1qAWsV=^JFI&eX zTw=Y{ZSwI0wA#Usj=zf6oWuvo-)~(N>enwCijlW+RQ!Ce`&q7y8fmfc%JCOk2mOXkWSosI+io=mDlUM7;W3r z04h@CsgF58QE?TWX~VxnV7aJjk>hI&#TfaIk0qUvmGvLXJ#2Qnh}-!L7u{DA)*QG3 z>;{+HyWYq#%rlM9{CMcSiAnooNE!e!3SO)jDH4|)Ir1gCoPte0BKgR9_hustr`V6T z_AX-KD2)_hj89H*O1fUQ?rG*hyy-jL44w#N1$IS!HORR9%Lb2;sOTY2CtGyP6pj-g zq`lPHYZnYX9e)aqOVn9s@)pv{R<<`9ETjNn=Wi%r<_nzbk7JRXVzn&&9cd|>x;C#F z<1uu~=?kTBf&g7+)Xx*1A^gc1bs=1Fy@fBR%8jkF$1AR3$2g9~Y3}kXzW7B&>`e&> z*U%GWA|W6opV?*cp5y1zMA(zc1g4N}Ep2e?M#k@ptM#^7%z~4z8xP#dAeak~k zfQy%j$B&g^=N;|lgIGwB@|!EE5sx19%;%r^Nr3u;ixf0F%fF%la2YHIioTfKZtr+C z0kULcalc$f7B6zh! zSgpYJ_cZ0UNT7Pm0V*pn(w0&%iohY%$jh&(hcy_mvn1zq;FGQDcKhAA3&>_v=YM~M?k?&NchUWc`JnQ9;6}LXjL>R&jiv*mw3SgEHR{Dn9-_`3qZ=WYNV( z?{k0S7@E~HFH4#e|5t@FQq1eMp}CTTYn_k;7iB-S$80xKxAlhR7=2th6@_jgJx8_} zZ(7gD$IHkaEV`8LuUj7Z)!-OcNH zXI1r~oNDxa!&l)hm7+nezG2Rl=~!dBRbIhD5uflsYE3;& zB)LZor(j5%h;>ck5gLgbIO>G+wX>P9Nr-Gu!h3SIBS5{iL)W2BKXY zqHAI6kEVtww?WG9yd=-LTMP!Q)xHd=X0F5LGId#A-so&WeRCn7X#=T=Bx%!!gW)bD z2!d4>UgvQ#P?J1W$Kn5En*@458zayDxoHD^1wV(MpMP()$7H-$Iq~PwgFY&yzG}6K z&IDFJZp^KIw&=AXG3i$mJ!4;ob3D8DTaOL@*ro2?XUpQaCQ@!H7F8n0Q^(3Cx*z-H z%;=qM#kjJ4f8Dv1U^U@n-fbWKsp+f#TWx zP*4+9$K=`#EZgTtV{$8>`7sO0wv)48b*KFItT-Zh{ap&bFK^+7(Ljx zqjy*tihCyUN!lWtMX+EvXHZP3bpp(IWUl`P!hDG1E3g{A8cM+gEMSWJ8N8#%OCOix zwm$(qMVNa&`0De(aYsyenL&Pzvh=FKACuP)1ghs>q{_9~-mSTuTsASJ`=OpG{TBAC z0eiut{YML}(%0I=jJ3!{s5nIH-rorSSZ^#@13Jjl!1Cai@eRAg=F%klJzUPi1)b(6 zf+^V26ADD}FyrKD4i)_J@9g8+FdeXfLHj&G%FE4`Kw=nBE(Isz-HZMm*y3W}F5RF+w+hEeZM z7D>@{O0q&LIhBESf1wkhU1ahp?_eS@@0{1eR@zCoCxoTtkB1O z)Fb*uRnzcL1Bur?NO#!TD!Xrsk$ZY~^M6GF=u4UxNu~pb6(*m%$;z+D&0R15o~XUZ zuoxO8N5@_>H+#Gm?D1o;Y@ymr8x5-JN-o~K6EWlVaaNY!dRtdV`h<-JmPfGUjToMW z1Vk#fsVN$ZbPn}5o)=c-j)d)Z2K7q}EX(;5p`O!jgOCWRcXzWdsM{7_I=;rZ z{y^;)^M>!d1dy4riF1BXtlxXLVGTCK9ca@(ShGpYdLb=IKxWkE*1bQC3iQf~$V=CS z%J#0|lQk`zvFgIh&Mc0wgF!7sw=$T_V$AM+;Y|+ZoP}d3&-hm5SFNU$#OrQ1(q+!M zxv7Endr?(AxP4OhhFZ}8*3x0=--Fjcf_1!o1Ta^v+F;kvx)NgFm%@hJjn1EZcFKGE zn;bm4o=^}1Ln1@;1e-XK+_Bqd1aGvzdJ}FQZhaQhuoBnH*jhFasK6IU^nPlG>{DHG zr6?pFz7KGcpffCSL|;r!ie{Oj4K5@#b?V4167LbMlPwmR{lkI0#3PMc=iGI*H#{3Q zK?G`5PzqfPex#pc#hJMG=JP3Ib_4e^1l$#PAtGAmA_|d=WD^DVLgFmBTxu0US8;?U zUI4;CO~h8!%`cetRR0#@`i;1j2etjh38aUJjCMHrwj4x6DW2e5R&hkky`4HqzN~J` z=U^aD8HoA*=^5F99MYGBGo$EC#K#HBiXsDtxN((paZBgC_r$v<8Fem9v&}nPM{0Nu z0cg;dLkgGR+w!e-3nB~2I2UKT-bf)i7*q^aTW8fILnw_M^L{Hu&-VuT)z5kjgyKUB zS}w#d=J-vsrf8j8njVFPBv!OsdJ6{J*`Wxu1U_|(cuYc(vUyOBBrG6jgq+n-Z=o6r z2=?t9FsY>`(9E*nTAFe{cR#HJW9>d#DE4$#DL?@6qlNV?PblJNyhm#38X55VC=TOJ zkp{BJmMeM~vnQ0EU}Stx6HzBC>II~2>W+UKb~lOnx|U)g0YZleuE3LCH;3{t(l1vs zHjhoN;U0oA(++7={i7KzoBKk$5rrmj?M%j@y&Kj&05ZqFY=6t87^$M11mIU0-|VPr z`7?t3Cp9+mFGQW1WPogr+trGrVTF!SN&r5HuRExl-BSi@Dadg96M31+oP7$YDM<0$ z8R{FQ_8u%gw=f=8^E9_EPbGVL>D9Y&+^K%BOf*ZGr%{ zT1A!N0OEG5u4^sS_y;W`*I+FQ?7vyjBPg)?9e}CAYK?m5q*T&q1y!UMU{N#GA^Alc zmQp}Qy^6XqDqm*XM7e4y zn-utV0EdWeQR5Dx&t&}`-{_~HwwDFd2TQT{-K~FZG+BGW;avG?%>~2&mS4qdO0!^t zGb0y2`H)E(L}9+Kfd=X0ZJB;E0`PK*e|G^KXj}DB1io%ql~s@iW=HYAxo>JgA39T0 zHy0egNY|+Azq}8HAu=3cwZkG@Vy_=*Oafjb+x@$HlFXxzp977>c%$ObX7Lv0HCsy}*9iwKZBe^76IeW|DZ>HTFn)X&eg>mniF*X99Y1m_c&JAnMqoDgaD zxdv;KaWbeL+W^fX02)L*yD|n8ZpGa}bdSq)ZvK=3&jXNYZob`N9zy(+R!)JUYQe9n zm+!E_6kXR~uy@5e(h| z-pK-9P5$^BG!5iA?giw4KNVF_qWG;P_J$Ks@B4Ys%NtbN#V|ohYZ=1%J{ zN}0R{jyK{~sXbl3#TCvF&-u@+-{RcfZ)cfOFJFev&{}Gfo3D~+$1yA&b^(Y10|T^y zJJQ~sm;VC3H-04v(>SB^sT5Rr7Goj9nSYV7OPF6s-x*0Nq8eIfqi()t>kPYe0hu{v zv~3_GbT{#gD(w38SFBga8;3R>5<&;j{cn#Dg)>r>3iH%`AoGASrrAz3oKhYU9Q-yY z3w7gj`(aX91>Rji?^42dhp*7*U|qQgpX;$dD+A|=Lf-!-_d@CCr#6yfLP6Q~_e1~> z^`g{o$rsG3LcqmM6#&dk9nsy)-72IyZX}@~`@l6ygaQDw&g=QP_O(7xf;Y*d!B;QX zhyia^D<;Y6L=3ygj@&NvMnJd!dnZRm@1c60m!TPyiLj$Iw0|m znZW@JfwniR3q^wqc#~K3t>2qCIZ29RDX%~Am`mXTM1bn%D3Zod2aGJ>ev8oBY+sTF za3i(z~HB>a*{}*4<(>l zLGW7eO0qcAo6MSw_)c8P)E&vHSWGwN73E^|cm7lF@6TPtir=;sKR9&h{2biKBD0_u zKUEb4(zNP>HDNr_G|}OAqrdi;s(^5{JlsQ!nV98MY%@6m_RjDU$tMEjB$zA%waHx% z-?}ijSHt-!=sTgE8%HrySjJs11w?`gA47q&xZE6-N9Knb#&8X-xQb(bOB4;+Q?q-H zI(DA1__1M3aYG0uu|`%jd2!KOp?kaX?F0uCZ%IPC-7r~)IZhJxyp)-V^?_}$h-ug9 zL6i!>c>{0>Qs~^Jok1eB;M(b!wzbZnKhf$2=2e|?I8JX(kdI6!2s!Hv+JBD`@+0!O z7Cnyuo{9Z<(w*aVZ>~OFbnVv-(PT+A!$&DOUM?9f40t?u@7VRMDO@qP^TCeq)m$N^ zCVqG}3b}u*)u88zb2Vc24~f30g?05;> zBs7C*V*!;$qdf;JmsoluWYdf~@h5|r;+pRVii?d`f__zjsg9y(}s#A8lLsF)~xd1!9G9f-psMp0ZT*~I%`>2bUesfe0vFRTZWQ5BJ3^pA~nA{wY zf&Xq&ziLG06%>sLNtPQpYT97jK4%&A$QF`>LP@y3sTX}xioRN2pbhkT@jN!1)l4R# zzuFPBtTmAs|`U=Gn}GozZ3)MU7kAc6V(AIW|(dHp40-1gP}w8eO-mlHF9^`TQ!P`%WsW> z&WCxt3fJyDdQx~yWtGptaQ#}FFnpf}m6Gw9T@N>Z8l*=lB4?!Ah;AJ9sqt1z!;dj6 z2tRCii^TWwKH+7XTHqtVo(1*)B*0jW0K=kclc8YOtYOLFP^?cOUil zbnLWy_naQ|t0wH`M?`PqLu+m|S^4o2hXMe z`#u<-eRFdx5R!hPw|PhN+gQThT_{S9WSbnYf>J{z01v2I89iOnOd|Qx$%cE2O!C8P z+>J7JU7bQtf-NT4)M7?>ckRndVMDxtY(=SKrWExu6a{TilBQwNtKDHf8tZ~%_$ra( zJl63N^Ca6)VI*Rbq7hp+8b#sW1gjqT8wq9DJlHE_GFii z(|nV+>O{AmgzmkyS!?x2He6!#{!V9lFJf#$wUOnjSa-1n`&4QRXM=zE(IXkl%uD7h zBp9Me`&yO3s!v1=;&WQr@qkCp2mHZMl$gs~W-+o=BQw}O2-u@VTB}sURh}N~>HlCmO zj`hMhYINmy^N>B7Nnz`WHz!j*Cz3G)A_i&mtlBP>H5#1K8 z&vyAZfust%>>&PiC?uBKc|qa;UvGz(XV}CEEI6NEvJ&^MB>TN@9KTA7G$ZCzadQ@c zrLb^`;Xm*srfEwqAyTmMad3(EnKJsgv+KEg?ULqf{15vKyl-XEazybL^_W**NOTxh=oy*G7D-xr)M^eth101E9_p zCa`|?x)HF-GHV*mU1V=tI)A|ZF>g``Drjv!Hf`l;V^2aHnPeGtMjA$V7MoOhMRzLJ z)p=p>gq?zwRvzkC9=RP^7to$^>s8Rvvt3Vl-|~^~dFWhW$n4}yN8jE}tLwfb2Fasg zmsYPLkrnIXtlz#A`+G^3{0W{CwT;N{KQeZ+o-WjZcWoT4I+aCvCi8G!+R!5?J`*@l z+(>;639_QF?*5X+71%VQc4s?|ge*~Y_(BLEU`-&;I`pgSoE_Ow?yf8yP&YiGL!^! z=*K`&d&pP2*@dO7Na

    CAjN0)&k&nl@qgW)k;-eEs!*vUD~dzvmDgdt9#Nr3+#qP zm48@lt6k9JlcMYEEZoZTie)mJ>b%--oDBE=MVX5m#f7!Un>=VWjs&Zr^ZWI0??(jt zbFNw$mNCCxxx#sAH-Pn5`Y25

    p7IA#O72$MEe)45i<*_RY554SWR~)eYaLU*pCY zomV~$;a9izY@T}$>%80PmjH|~!AGwrnf z(JhKsBVOJ?uSdtmavu(B(u3TAW>vG;0UBQVW9T4}P32rfDRsIv67}LyjuZ5H3yFk< zQfT@pdkck1-5DFTzrd_IZB0W`&Dbfy>-#R8pa9e4$_Tsm2GeenNI>r?eR0`Ng0wqo z>sWbt>kIhz^w)94&xc9RUm~3FCOb@S)KNka2nbm5o){STJ4m=_T=UaPp*SVfm{n^A z;{4}J)1_(2mfjdYzuLHN%Kl`qsvg8OXo}C2hE!=ozq;e;hkq+9q}7Gr+&F z;&ZM#Wob_&fwF>XjZRPdCgY0{zr#=>clI?p7uIZB}{T)tT)8s1{E|FY%`-reV86(v};|TDn2ny zjXETaEK5d!ub8${!@c{u&z-yso|g1V0C5CBx91v!t{HoeBXFOJ1#S;jxCTn=`td3} zpI}6cuHQU=;L`6>%^9o0;eq`In;kOxxN5v^n3jdtt1Sq%8}n(3F_1t4Ny;!#$d`C` z6G@j9eEHft|4kD}qj%dW+qi{Tt@C49(tn9+-%!M6n9QNBoozo|{jPEpfPn0Wocs>D zekA{9i`MX>5hnwzb~@@0i~9TArcr76P6)D*7ht~MZ~I%6>Ysdo99mn{GShyw`JJ#Y z%>!smC5)5EYwM3_#?!xPW0WrKwlT+O=OXQRVik<@cy9c<^V?4xgDR#tqKpe{Hhv{$ za_^+4n15V8uT8;{*xGz+KQ}xLv$)HsQW*LVtRgt+V8>EFZD!IwEIYi@b(-@7u+NEs zfW7=}6#Q@UI)jlUtd;oCrebxI4o&b)N0BgQ1KG`y1?v+b6AT_;Es8S4A;|Zn~-fyaV!I3^sfPuVJ%b7m2qs~)LfrQ zhobkHWdK{><9;6yl)t5A>NreRcy${{!+53IdN)tv#TAa1<-iV&Ny1bDq1T(uEeGP+ zdoXF;q67-iq?MmqOJJ|!w=Aqa`xxD5nX zh4$I%g+1D1&z%TkY>UAS4}9K79o;7W3n6sF{nx$BVg3!{M~2DbB*kUuEOV z(!L;){p)SxR~sdOXhEngQKK3Vv#~|s``?N)K$}LF{3QqwaNxW6_A=kUUdl;2W>Yv| z06TckLJ&)z-@n!WNwcFPblir*Grobyi@?nJo6d&cL<30+|C*JCJdI z?2UzH`oEqKoNKUST7)4mTk{n4l|U8$&kP9ARlE%qMnmlYYGD75eU{$8>2g|=bmaK~ zJi?IsN*6kvi%!6%>Q+!DUmW+;c(~=d=qc z^dRw-A*$l~678y37Mv$~lV?xG33!lW_dwj@r zQvYSPoL_xMJG8WH!mzB&;cY#wahM>f%>+pm?Mmn~g}mkN>N{fye&_F{-&V}>x?fL- zshabR>SYE|hR058ccVk?t)23Ozt^cWQhGY?=lr&u5>VeMo+1RyOuOW7J_dC*gjZq< z;@R?fKQ`_g@5-Q6f1LlG#T4t=gBmpO+N0!f{=q9OK+7+JOEj*$E_~M=yMH{}m0IXo zR{vo-5H<5W>V1L|1Fr$jU;-0&A6L2) zJ!~4LT>d3Nd17U$N(sB`h0s*#YS#wUJ(cr@y&6oRFZ%-JIUjA7pX4J7IT9|;z44kq zJ#^=+0DZ*(fb=Hfe3sm+Z|%hStZp+Bx4RyRZ+XWf^Prh8kfCEP8_hzHJZq_)jx95Z zYrr{lu^oG{!fRhEUQ;+8EF60&UWrH05JdfSVznD!Q20?3tcKxpaw zIO3tNX@{|wpUv~!i-M-Tn^A=u;hPzBE4-i>y`O$m03BBEgytw&i(hsw$04V@ z**a6bpLy_JPT)Zy8|E$vP92rb6 zxoObG>xf-qAKTpedF7L+rsnH({8KL=oi{E0NzF4!I(m+_Z#-FB)JZ4x=mz%n!1vIW zR?)Z6)5%t?K&Z*`4aqSJULB)XF(%lJLcAgAej6Wj6m9mLe$h;)(aOuQK1UT`IK_J600ra>r@Od#L?bJwrvG zmSj6#5a(-|LTY}6B=1X5kYjn9mUgwUgD6OJ3w&n)^7y!O#EyiNvGz~e532C9PsYzw<}}g=LAE_w{1UJYYs9F9pJg_ELLyoH==l+xMlej9 zxxs>SVv5kz&iQo@lcV81GKy}19IGNkl2S;F$vx3TC{V=IDw78mitK!E7(;OCz`%<~ zjl}9CbcF4iOgejUXVKF!;q@VMRgq{S zY)%naM??-e|A=n!CeT7;I6=Q7J+7^W45K1W)_OU+W|J@qTdOx}cOZ?{>G!(Y1rDE| zz(l0X8_R0a*sR>i!JxzqhDkgFrIC8#qt2V#-LrR<4r3F>07TeQeyMfq#Lqgtn9;DA z*s5f8-=O>bYJX4a7|Fdes=bBj_4Bj^NQ1tAOxqtKC263K^d*idcWiLM;puERv2XR8 zW!Aq(C<-xGj9v)-Ab#}NPxQwTAnb%JM*gIZgis;y(ktTDi*qB!8|r$-E$P-{ zN4I5H!~v7iXw80i=Et4E|%M{Joe{9HXP- zoXjdi@`bbSNdfR$+6KpHFM$%dvP6t-ZMZOR7NN{Ve4&Tb!v$e^7&dEo26=dfmAtrt zyrpa6fif?VzBfKmUd+(_9a8S3_*0Y6lE?5H9?4CT{FC`QPe4@LK@q5(@_qXX$>!kk z_`~ax;Qyk}hfr)1y89hoCD^=|>b|L-yrQ*FxpNP6tJ{@3Pq+I>-ei(PM~j-g;&1i zpu_N8_m@(6`8TbB$cTqwFw!5ZR^uhlOXE-2g!MeXue4MwkZgVTO<6C_Q&I#VSmJg~QtAuXvp(d{>+SWRg04<@u=H<(sx(&h1eQ*EsQaahAYwuX z5#{`c4)68FWztJq_xaqSi<+mT+s>Qi-L8RC@ZBc>tUyTqm? zkoHwUSnban6bb*rG()Zo-F;k^NgTd!!O%O&xzV_Iuhpl4R4gs*Qg-0i(XwFVHPLDh?>i}Mu> z3+>I>ec`qjfN`!0#Y_}*1jSituN4e0zZfZAV)>ciNzS-yGHPHl{6!w1{=;D4iuGcB z+5c=+D#}-Zb@dBsWtNEHOMNqInm!s@Z($v_NANSKc=I7JAPgo9f8D%(qs5zAj zWUOMA`$ri~GuWnWTaV=_;PGG33A)T3L`O((Pb4uA2P!62lWU-R|HY^P^neDu5#5%# z8duyc%?gB7wSO_6C|Pz5c=gikzc!%A7u#~eus70|qsj901^{QKR(ATqHAMUu7=k;B zJpm*=aNzCmA{5y)6kS>3FF~P7{C{J60?Q!_kf5-_n-t100Ac+m&v{fF^f~|D!SWXu zOkd$#a9#{Zkd_(rH-I4eVvYmGc52qf5F|ApgSIz1Ig+4{@c(B17HGJC z2z@cIZoH6c1Y}GfEc@&32)DPjQI`ELb!@nScbh>pR#inJQr{}kW6Y{1n*Sh)RJ3ewnt zG-LMGy2ko4(v&vlm^+nMB@cY3)oD8PG~Z=@-Gh}=^xTmyI}EBS5F!B)ktbv9u~XHH zbuScBc`#VBp9kDSd+CxcZ=DF|WWIV?FEj#{KW6blkRgk2++;C+pm*iK*tiJC6V)FfNf!Ibyr5X&=eMnjM+V%pOsUw_%Zrq;Mv9&rMNqc0@ z0(1-HvCv6hjenq7`*FOB(FP3qE=|KA)XQ*GlO(7vcFz`&q`f`cIfvcvwfU?AH)96i zI}rj+*AaBheX0x|yC5CEm?e18-jHurIq=Z|X-xS$pm^)>yo!U_FLOBZhXT+?N$O);z!qG0O48AJ z@ZhrE;}Jb_DbOKoNVcD7oWP*S`$}xo+OhJvY&}0f*}N$-`DRDKbz5WGw zAXOQ_D8mefZFlCB4L^%;c;S%zpl@pl*FGk+@eQ2_AmmpcUCLl1FfP`Sm0mkiADX0J z1@->>q7eKX`p{)74lT9vt8`-F$r%(`HHuG3tuM8RYIgE~x-t?2-mKr`crHL`KHco+ z*7H!2VoTzIa+;WXQ&Ms1r$#l*_T~U*3v;~-Pp|#^`ETa001=Yw?Hu{~BsLf34FhMs zZyrZy{^uHEz!=JYlDm@?EuP_ig^r`!dhPK63XJVovxV z)8x6um2Xk#)1zk3^63%qh0X1Wp?0kDD@ncU+ghG-UrRDL__E&nRzZ#l@F#4X zoUqi^2HYghVYHkW_&9tg%9)6MQm&CgN1b|G#;W=AeI|Y=MFi-&U7!x4%jzh2_ujf! z7*KrD5a8;N!L9sJo)!qx5SjBD>Jsq?F8*xm01gB=0Rmx3Sus5D`v{y zq{}bX;i&h1rLDPEpr{uQ(5Ds)UZU3xb>F%zP_bPHNU(-pNVfp62-daTtPA~hW+|kQ z1-4&|UqMAp-$0iDi0l3oT9UZ;H4p|zama@ydEcNcgKcni02C=SSm0yTZnJud%^EF4 z#m;kev|;sOI~0gCpv((Kc`hp`$>||END^2A(I=k$Af1KyL(=`AECh4)`piTj>W>xP z{A2<@p8C8Y3xZ7YnzH4B856H#;P1CQa>x#bsBokzZNi z#`m@4>Fum*7kjx58EyKeW@x{y0Hjlde0LNtq96Fx5D6X|s5BnVcA38J&(5EltVEVO zai5C}UMg|velAk*?SBU#sQQ+RoZWoQSBVN3*%m*)JO{JjEW4xUuhE>9 zU+#oifRC4?i<#v3^a1b3w@`e_)Y&QYbn}+piEw~#@s03mPm1zq5G1pP*lGSX@9@*~ zqoJ^zIteW4Lq(SDmM7ltTqfFSadv6QDSw%TVjN5d|K|Xs93u1T>N?qr{%tL<^H0f2 z2Ogy_hRZomAc44@g%q~+auItp_3Ssp%}N7&Zmbc{C57OYlwpPY7WiuGFwomUDENx`jDSs!ix*n|E;x0Z%Xnd)lTF6Ir|FiOFN+xw=ZHr{O5vaonV*uYcEY_aQuD?gvT+$CrROvoP2qu@KyN$@%87@kNSBT zHMJ<7Hwbu6I%BvCqc@eMY$K*=B)Yg;`NsKV-ne$P4oS;E-)TxhM{~uZb$nK4<#NP# z9=8AaUgM4#9%+AQ!e+`*v|O@!{57)f#5}(9%`I+b)SBkX zH<^Qi$tNfFeq$dk)lgSVKOHNSJnObE3`xUiCmSp$53ugI(T*g!17duVskvJ@E;AtCp4!ll+@ApDC(gZ$SU;Qs& zy{iv(aP(t5KWvbE_TZ^B;Go({7lkd{Z>hK@SEc_LhV-@$abEJB+Hc&yzxJ_`zE|k5r5RH zF&XfiFYm$A(${|jTyR)MJe;*G?UYm474aO)E(#=d@mDed-7IIq zJMU~N0!ngA zb@2sVAFZCs0HjF`PbOgu&l27e{1?{>sv&&6qMXvPz2Zyes}#twAb*wsu5EYd{f}s! zL?7{3uoUCMlmc+=-lI$5B+h;U-*4W`9AW|9Nd(Zl2o>V2bUQg5{xbsqWyr}%$)3!4 z=Hr`X*#@T+$gZ*X^1rh(-IYJte&nmbCfg<(=@Q zY9fH`Zxc}Z7mVDmYxPT!mo-iFpIFcjr$90zla7dd)xTjaYkpq*&eUIfNoXL24U3Zk za2PMUe0=7)u`NLc(bd(+(!4PI+*;|a({GTtRAhVTsD_k}kl?{UBt>vy-yfT0dI;)(tp#*8a z^_BGn56H({oI8B5mZ%W&C`P&?=fXco!79kzjMmzDr_A05xU7i2Sc!kuKOoW8t9Rb4 z;d3rp)fTLQSkL-lcOLD>%nm3!e#v*H#QeRskuydW;j7HzhwazPxqt0b(LPAxh9f#m z`Dj+OuBoux{5LGaG~{+|q-%$KWZD6Tp^xah8GwJ=rZ{VaY~_nG)9e2^Mzt=oNTE07 z{I}NDhOd^zX2vcH(5kiWvHot~wA-Y*n{*D`F~JR=C=FTr_EM0qxZ^=|{TPtiQd}wgjAMlDH&z?IU|*>4Vm8YwCZ-|ICF*Khq;c zD;uXY%~qw z*^54d6yi8GLOXvlf#U){w-5+lj+6kL)wMkn+%D}}4d_Fa_!e_qPy8;Q4_C(jd@Y;$ zczhYHu#2KM|2!N}1({tUc-uj^uhKYitCuqF-!qd`psv#itV)(|{UR^l$$VyUv_ORD zr>%)r7JTe-J$$lSlM40EAgAvd4-vlYigOl6$^*p&>ys47kD{kf8he`P><-s34F7vMH{Z(TsL8j3%4Wr^I%Edi9Ge6%3ZMY&YLNoal6HK;pV$N=i@$xog;p z-C27blN+Orrf30cNyOSh?|)M< zgJavrzK7P2WU>LR2q$2u_EgXJ7i=2J)Nzvoc_bAAzvxXC9_IX3*l$}+mih2WJZc(% zpRzWlD_8Z=*~~hf?Jvk*e)acGP8(Pe3)@Gx2T)yW;@!Uj zW8a5vdF=hJwwn#2RoVud7SWv5ZaB@I74y9?i1nhG`0q^%1??4(+Q zAr#2Kt$|(w6VhH2DpKFCa?W;-N&lKBCce@5vbR>RqStwk?Br2^#B;#L;Ch+@PM%Bg zpksDJOiKNqLpaclXxLBP0 zTh)7M5frEyxt3dTT8EJs>`=3s-q8uv{cD9*5%F(-xoZjC|0=T+HGX>wZ|h@_GT!|SV&81F?uIo9roTNQ zi2`HV3!m_Z@tl(!m$oO)9JTI#Hcor{4bqWBb{alwx2&SSWGngV^1pUGuPX`-`INOK9>hz9z>OK)2`t-|Eez&njpq4Fyzp3 zJJ2_*g-|v*>+-)zM3eN%`pQlprZ2y!c(*~xf`l6I{XfLLby!tVx9`6R1w=xSl2l^T zh)6d`Dcuc%NOwt>s7QCSL6GilknV1f+;nd`_g!1x_dV}9_uO;uU%#Kv!vpGmSZmEW z#+ctR=9=Sku2q_{Xn4r5?4SMD?V6~l8ht4B94J}G9+h@IOb0Pfs_r?qb#F~01xt67 zpgbxUcSH;{uw2Oa{C1w5;l1!K#Votwqu~OP%a+Vsd>$T6^^NW!7{=K0rPM_{t|8GA zvrlOP)~6{Rtcw!I4;dc=AC<3}x#)mrv`{zsF68h%Mgop7AZ%v{V=rdRgGukor|twd zU_S_}_4NiYeycTR_;!y2XShON+WjpU(MuYBWrJSs(O&2(4PX_mp_U?j8{ZPimTL_+ z!%x5ez8r_Wu!8)@bQD8c*G?lK)Rv}8H+M!hW~ns3SRzrfWB)0~H zw%%;czMH<|szG~JO$+>T9f8geqort#@6X}1P-h)>h04F{qM5iM=NItKhkqi}JFH>EeE??+*jf4N(-) zHJZCteIJl^cFmUjoHFR&^i%(P=Q7A`_y&1`uQt)`4}M3>knW6wUs_&2$NeQCLM9;J zq7(~8yYMn8k_ykw;yS$}Ap6(zD%^IWS(yHIe*Rl7mUk{w1`X8?Egi+oO>gTs#=#7( zLI;@sb4aS&-3T_qEFZ@Co=$X*&vz3par$+(G#nyZf$IC?Gl%C6CrTcssSZDCwJxMM zk|Y8y5KCLC^cK!}>IPqrB^M3E>wcIn70ubWl-F{E;zsO+Yv&qX|ArfJCyLLJ9f~4C z+q;Ie9IXSRikbhz^NM$@=rPugNW<>7~HQ@geC33 zh9r*)@L}BQowsD4`U1pnexE4NupHV?Z~eL7x6&fIT;(%CH*TlVUEzHWehHgy?xXV`OOsART>)83c&ebvr z%jT>J9(M(hE69C#;he`3uF`UFbN@a|(=rw~)&N8uIL5*n+OPhy%i+B@#wafPtQiO<>TuTTe=59nBd8fi}y$Z`R>?x+k8e7geuBW!fCp^Pvi4?n&;sLq+>u1jK zMcEBVJKUuw?kULif2uJyPiACIYojfL4{mL0_(T>~5q8H@QS3gzw;WR7*>W82#J#Mb zw~zh{vGk>LquLN*xzQ8C7h74!Fu6byW@ouYGjMXB^X?tCjIR$@=F0?)!fb#is23IS z%;0J`Z<|{cUc0#a-O4|ha7nWK8p&n8$@_vRj6mOx= zrZI?2kzO-Suk-EYhx@&rF4f-ZYkp@fAsPO!VWI8knKuK*uGgRM-+zeq5cnwTas^~! zCu?H;iRbd3^ttP6J5rk|J())WT$Q;LkZRV9O{grW~hQwim5gl8HE++ z7|w6W-8ZWp>DSr`_MeT;-sRWl*Au3c8%dy`2b`FFIxdoqHw9N>9HKvZpv2gcn5OK9T+)g^8GFwdmr1{ z=`d(og7KvTt~@tfB)ubz|JQmpZj65QwCQM^!4+>zKLfW?R`(Q*=i=PuPUDuy|uV)>soh~IbZwt6HF7XV{HU>TlRGn9p9RIu^m_yqmXEYZ!tU*<$ zN{w{x4IGU$jnjJ|clp748yNP)s{fycedFw<7qi>kR@N$gEjoTo(x;?U zrQsc$H$i(byN|~i?)Iw^o_f1je7(@TCp)?+cTY>_%R0Tpc=!DD_eFsFO>jjn%&4DKvsxb2VnfbrI64D*bFy$o5x$!G+}Pk$C54u-R)YenG# zlO7c`6Kg(kcs-E(IR=uQu;PlcNAR`z$8wvqbEHv?22P~H2Eo^TmC%se8BUn%PB{?b zu=l^`0lrgHhj`o&*^+9^|LSz!Iv!x5umph+O^8cjWbu(ecGrgh_n^>FCTyXJ7CBMO zIH~UnW5vl5e!A@KlJ9Z0T_*dwR=P5za=FS`EB46xF1Kp)gcw}91tboMYW}#=90XGX z=!!%>0ShS$tN~tbus_8C9(D^-S4o|CHqohZxp-8ug~_)QkBnvM3xqKc@)gEJ-ZpG* zB+jRG6+)>UtG$XX68o_rKzAL&<|axd;2u*dkhNAo227?N`v-k{nv$6)4biX!Ee&24 zm(KQC98xiDEth1e1#nFJ=vV=HHDT?`w~V307-fx>k(l!@+ZTgy)~&jCcBI1DBBfT` zpfAfV<-JLO@Ub^@%47BZ`p4Ke$z{G~lypV*6ha~OmGTl8iraP1c1__2*Tz#?#O?Q+ zhd!iD^FEimhrYaf|J)wQyhf5x`cD`ZTecrd(V5>*WNTYpYRf)+T8lE`s*)r`<<{*Z zOiP?}_M~2fkKLti!hJorB;|*6mh{#m175n@OeQ?8&w8{auqYv!2H4vjD;|~)vy-jb zo;;=MIrGkAMfY-Ui2`j288}UIjk+%Jto=ZND|Obp_J`x-@hn-d71TmD{!}3}Z*8-T zKe787nCagn!ibnxyoL>Iz6=({)s?o!=&2P)`1#z=w5jdJkVwJtTOX#wH)~Bkt5~vn z(+Y}6dkHV|T2+GGyu?PpLp_mCG03?m)m6JQ7{GyduJvEB+r!2dvgE?y zzdHwD-!^CIvN@{~(FWP9L`$;so>T&E&_$Q3ObXWfILjMzJZi7vrMwrXz#KN%z8`%B z&kW7Gt3zKK-#z?!$dc>@8*EXsAPW!&Q6fDa(w&dQrmQ@TzxN`AC~Tshbq8{3p#c52 z{X}2b31giPjC$C3vlGHalg`ZwYf*5^h^1u~&w9aV&R0mo_&KBNL%8D7`eic(U$?%~ zoP4KV`yN~DJKS!iZk zO@-^~+P7JR&*RE2{TH7v_MKy`jMxMB+ca=s<-Pv#q*mXMLdPhoZR2OaZbCi-rA&je zHo1nAK3APp!+P`**pb3ocF3H+3f{3*xJ*nxGZ+Du&3%v~t@Gi~PH?7N#yoW1$U$ItjEB3g;YZd6fX8zRRxB92o8o8NM z6IH+e(u7ahHybuN8BSsFBE0RS=e^N!>g}t&)XSN&ZTp$F)4z+D73eABm&{M-hm70P z@gb?F-BpEM{UX5h8>Z*9I3KCF>YuWm-uZ@)W30JF#txBPf3R>0Bntc7BKSNpy6RDi zKrh%U>RgqQD>ptS!OGAvMoKp4W?gKZ=nt`17N}Ei6&jmdF67uc zRt>81cD}*mKHQ=dC>Ivh^or-k} z^#_jErO)>m`-`JW0ofRgtPv&y&u&aI{vtD4FxYS6x?S!`<}#VM|CPzTkn8;`saK?R z&&Fx@^Vpql1zf-|WYW}|(@C^B61~2-l%Pn7RSY8q=vXbfNq`kzZNpyep{PE_6 z{lFTvSWkF3YJ(oLe4Pvb=652X?;MaxBB4&IBg1guoZ#Fm)A7W2g0g057Arg}^hK`% zrKV&`1EO{NgVfHTfE8H7zRg-wu%`<3e$C9#;Aj5t%wVb9?kuxA9wC1m5;Q%*EsueK z?qXGRlJ!~uqgsc>j@^#bmj!igY%T)+-oEYoV8}x@pdJSz^?mwMu?Fv?UUvZm!V;8u zBdQ8?L0Musx~ItT?aDV9ELGkGVo4f*2PbVS#K*W`aAu1x$}E?M5uy6Tp+E_ zhPKaJN&Q-dgPXxe6t50Odoc>ADH~ezVg@kgQ(CKr)E(#4QV1b0)pO+m#XibYIl%Xm zOB5kuOlA>+U$t&Vp!P@ivvof#-}j^Z8(NNdO*yhQ)|>X2O+IYoiJbm{22GvzPhS9; z;&WXyGBA~f-fK4EBDSB&h3~d#Ds%Mp+UQ6y6@Eph@Mn+l-MkN&?@m(*6+tM%Gvu1E zXdoP$XNHl`NtAHe#{d4=53`?9Gp+t__ZtXI=K~3W7&L3`n*IFGeg)=$@jF@NnMNl& zauv>XYIBXZ1#91j`sw1WYdq(!Z)2O29gll7j~LjS@o-L7dt2Wr0qXxL?U!>FROnpL zXjk>@np3_PWm864FIKs{|CPMM)BHghMQ4Pe?9k5JoGf?k;kjrTu9PxpKc6a@vX7iz z3{vncEcQOV#B*E5_I*Fezj1I;*xN3szz#vn>)e#GP$7E1qETok`xO}f@eDMem5{Rh zW$3(=!J*7`e}HoH>sMpFp~JRy3J%bnBN^87{D7<>mkc1B?tcx)BTBX;{sn!HH8o_d zcfT+}V+8wlWeQ|o8R;&C*@w0A7sJ^-VZcme03B)xv$f8%>zp~ljk0IRS_OFSpU>y*8qW7@|j5gwky_u)346yAhWO?Q2p4 zE7}){!vrZu%I4v=n$X@%EwI2s9GP(J&4^#i33XSY+{%dcYbI^_E&v zjG4_E+Qv0d>bi<=y0Rn1Ap=FYCt!7YO?_t|0S zQzLbjHCb)n*#Ez63I4yksOesE7A_q8Y>~DK-`g3pyA2clGy$+x!G~c7+8DV~Slk^$ z+#dSr_n^`KEy^ag?azts*_&(lg$qaZ z3!yNf+27C%V|&iA6~IFguF`fglUC=haodOE&xR%Zex6`8H&#c@k&No43Q)C5V1R8+ z%ZMz(GVV|q!gF@3In4J3Mp#ettMpXs@UFqm8=f{q`UQ$eMk^tU8OADpOj7uLr@h-G zKUtjzUYf_g<^QAi<=pHf!k12q#=iaCC7n|--nn$!D|VCqucq=>?3@?;yVz0H-`!r{ zb?AYwZe3Pc&fu_7DIx?qjAa)0p~=M!~R!nlKxnoSW{hkPKV z)VWtX%6bwVn>_guGZ~%gQ-Qd6uAKzFI>f4FPso*_DV%RQ28OjhY%Lu#@mDy#?=v?Y zScpp-WNQWoEW_qfr}e1m8buQAd_@uwRk`e05mtHR+pJ%MtCN-PsnVD;q`9Nt^m}th zz#q?P0P0SJNloyNM~0qayoI9$>N+l4?;b08!zwn&Q4VGtLRg+`KGywr?^-NQVQk24CO$?$ z%ws0DVEA)O(HxXsfqEAqq<;7D2|_lt-Pyb?H6Qy(g&5rBJ_|FxZm5itptpw@Eh7@@M|B5f^9qwxctSt>8wD+?opJ+ulJM_=)9~P zsTF~A6`_dhcj+UTKF-kZG5#*rp5-xz%cHSB!^ls)Mnvjon697oz^GS#EC$#TakRt*C3v~ zK0`!U85jZgF9wBEXYUMb{2~xkCx;A14s=ZjR0$KYLXZI|<#O650`EVMJ`KznqoI6 zrHNcVvfu%0v$*_fi`4z3O6RgNA<1ghjBP?36x4~#Z@W6XY-exmY9nBir%Jz0w*8fSB1_#?uq;pW zC)JnhmH77ZO|3w$eTXQ(4#A8*5mpfZ70iLTNt#igm5c|hbBjo35#w^F6qk92SHj6^ zkQ;v8bhdWSY``eqIGhNt#87C9AUKw#T{J7oZv;LX8(SxSa z&!XfmCZ(8hE;g{<^8ZMQoIG8EK5%7km=PyM_obLTR88EvyqC^uWCj63_E++h3oZ3tjReY5Hsx{Y;i76+EoFYeuvvPk18lnY;M`!bnoE z_Gr>M?-3tkJ(8lrOhZ6(sVkG0cZ>3+!+N20Ce!wb$1Q_inp&f;h!9{^(6!I%R1q>F z`tSp*COS=B_P zdbvUTW`6MCh{YYMh?=pY+sU-tB|eAo=QTk=7y>%NDZptTk#2;A5tEYvZH7QaEo}|Q zjdwfzyJ(|xH?N;}h*s`Vyjf!T^o+&qbXcHNx^oP(fdN0*xiVqbMau=-+-T<#1A=D- znm}_ea~$-nnwF!cyRDPmyFl>yPmn^k&x!d8MB%4F8J391O~O}m6>)eYRwY(Fgp2fI zOw6YQX!F7;P-gRCbE0WA;ZQD$91Un4^%zh|h7Z#--{I1Wi3rY)Bn$i8%eM$Yyi0@( z(CffO#V2pX2QnYHP~0g9upObs{<8Z1E?fj#a{Hi-xYuz@3ys=ow8Xn}`Gow-5jJR6 z&?MXkRRjX*-+!AkKg!}#7er`(cG}QwjkAVNel97I+3<4noKO%$B9|GS_KTTW%-;f-YrNltRLuA{)U*4E# z%6ycQ12F7C#1bpv;`W8L^x!}?c|_=xAg!oF6GG+M=>RKyWAYIP4cv~ZJ!(?zOz$#JwX&k zDL!@-M#%}4Um)h#!A=VB>k57~Jq1Ap!LuT_ z21wpPF(Kk?GSw(5G}QJmr`PW%2gm)ZmC;wCKrn|Qi&jQBF%n%yZJgYbMZIn_ajX?b zX%vQJ?L{+Al5Sp7`V6dxd#6U%i`T85!U22$-#ku$dRaxEy7`cAFd~2`YG6Fqh&qismT_gc$-Y0qm`y8`dzLa#MX#*?Bhz)D?)RJ$U9cNV zNR|1iv9)9$cljU|nSd1y!<5WQ2@%co6%EC4mhSxFMG-#u)-Zak192rcWONYUFd56o zZ@!INXLY?zafh?q(evRx?1%l}^Sj!c8<-5cv<$W-87)}fQJIxtP5a=3UXCt_3!l3b zWNq*(qnRrxT^pU#^p=$+dHL;yqu~)~*l1yxZB5I%QB~Rzj(+zS3J!EJGw--2qfZ`d&j)}HG)Ielk&<5$oaT26c#6>oGN%$qK?yF2?0A8 zJ3y5`o#Jh7v=*|(BOmukp|9Uk;E%(h96xatzy=fpU^=1A+)xF@4Kjj0yD7ps{Diy$ z=NN5H0QmTX%Q?Cl04(b=$NhW-Ds6S)ZF)!-e) zq&$FA=OrSz8{uyv1F41uWRdHBLNSO^Li)uSpbwv1?Fe>d#6uh;xcu>q%2y-~C65c*vX!|C(jth9C$T#Cp!;sI3DoL&{F~Xo1!!dN&1F|3$}0ZFB4%JCyDQefdfV|FM!KfaNDiY z3m=;~|82Hyvbd26upq0PUO;KRx5yo%Dy^Bgzq_$a0BAm-GrF8{3xylai6Vek)N}l| zGuU&UpR3rYVcxv8j@LB_*v{D@mVE%Wc0EO?F@M%9ULRqK%l9kEv972No+XlsI3y&hF^+j8w=i z)TOXg!JLqiP1a8D>~s+`S>NX&lFimVP__OGdH2>q294v$Uz*4)3~+j?Y)b_Eu#4o` zX7q+5ap6j%0W-5roFnVO0C(!Ldw(#baf~cr`vLd%o$x1F1#t#pcGVPAT_lao#`&tm zZ?9M^mOI|d5rh`t2e=G#npq{aJ#)yMj|kh**GkT3*T{Aa;jd1^BRbJ0o(G!LSIzng zSdhKA%QYGgDug3UG@%)_^Vq?pkAXBb9f5mx?o)edmkQqIziS^C#s%vKaH5e(e~6L> zA&KBgJrH`b)HAK2nZTdc*v89KMS@LwbL_z&&CXF*jCuAK_djL2( z*0+9L{~yR#fE->JC;z#z1EVXDgd%?^)`Io_c8a5-ixI=OjEdxFNICme#@d_ zG^kW-^{aVH7Ww)YYYuJw)A1f-Yc8sABSL`A0ASkhHvdq`U70|N*!gldXFM(YN8JP0 zjlZ~coplt$6mYkMfO-2(88F~Mb$EYk_FUNO)zUBc$1lf)pl^cdh&##3vq*qRDv%AO z4BA;#aAjVQ^4Q1hT3!Iq)X>3n+rB%CKYkT=nc*sHU_IX#YNU^OX7k6K#%D^TC{muP z$t}w2Agsv<;4uFIU`QTvzYHVbiuIVvl?jzoQ?p%nPy=||VaH4(o5Pj@5Z0~33vU|v zdWZOGKj175!t3>r!#`ftewsJM>GKHW#$Z?+5+GFPx3kb+M^jhR)c+VZzLBe=L*e#n z?8~6}XDs!Z$Iu-W%>MQN(?lBmUnjC08MIzaa+7*%lt=lg4GwGV)i|;E{DCPya5R_H%!d(5-DxNAd(FVSHp$R#aC7qM~CwI^81qW zljIR1rVa9`vYzF&xs?F|&D%$-qVM9bGPqr&Tl`2badC8J@T*c8SLQmwb-i{>*eGJ| zPF3X=tqe#jxBuDQy~WSIurzO>LQ>AcDnH+yDZW4q;j9Kz@{K7tU8FPfB><-;elx|t z>cLY%t9@Evv1sz-u=TngViTB*4s<y=`}J85 zwKMWvYxx>U97{D80H%eF7zt6%HLjn!YXk>m-YghbLPEkq{ICxP@+s$_fsq9aStO_f zOa2Q0fZ>p1e7YMcwS#)?XL9c(m+(&ztX(3@>pXcYlKB!wTS;)+M=N-+Hx;OqnXkK% z=ls_N^W~hT@Z0`N_O^n+O$e{ulCv<8=GdPs9(+Tmg}3Xx{_wexa()iW5_5bM(tu&pDc5njyZyrIOvaOKsH)=zS8+P_wOS z-H9M4D^ly*kfGB~(Gk_T$R*0>_c%vCuiJf>J1{#DD`y}MlO}hM&}b1beJOm)*%(7l z%;-6k28fbbj)BGpXT*@hV4n??2{gCk=-6k{Drj}uXun?7S=1<&!JDDo z--=r6qQ$B?y2XP4C*+S<$&ye1&kX3t@w0!ty6i6hPc-a02ilY)gZh6s4g?!hdJg-S zgq~4n4|o|cLK`&U3x0_UL>)RMolM^eD6E_T)uzbJs2X#T(%f;e-XQ($0u~hDb37l4 zqknx#!1t|_vNS{)pKqNj_9yJsrho556jL{oQ{{UVGBzAOyytAk{lwEjz0)z=neCE# z2AOlCq3R*{z{T@{i?2Nuq;rp`*3VhO}eFCwCwPg*j}r)mmNypB97q2Ya9mxGtMM8jn21;i=DlGU?Mg_Nd++g)b897tzfB@)^WQS)3vde+w@RKI^GGe-$j46I{Z)c@!G?8mGW0Sk7SbFB$tCx z?zd(?S%|Q=6C$|PPh&&kw>6H7iM=>V<}U0d%kn>ouu??y;qd%IYNBULTYf6bI{hO8 z5Efmc#ckPKe z0h)L|0hR=UCeG6Ff1ruGb?^|hu#NJmbsa0|zgvzLcU1QwEum50D-Fc>v_cLQHQZR_ z2tUynXh~GKH!ywn2Yf>nVT9}fE2tVye&(}$-fK&F277veQe5K)G&!6DafZ^Zdu@`v z_z9P2HoE@4Jgs$Rz^>+PkNTSp-l=}ilpAEgOVHx4`Yv+cOq4)a%wbb1ci{3F0!GqK zAS(&3j!;Qv`6%X1k|D3#`3!KN7>}uDxptFmA8pkbZh^2lStSG4#r>p^6Y7QR-hwyw z7OFW5*&L>SpOkZTJwMJ-S_AvFzfm%`IZGXviF3$r%~ayLHT-{Y)4NCKo}RwbFIa05 z2Y|>(zlA+NBq35T9AV1y1772wY>f&W53AIDUQ(;N*o~rfmzO7@r949`q)+a|Pk8p! zrnGSIQC)F1Qy!VEdNi;pAHlyi)_um&8~v6HvnB#n32SkLcqj1(qvUs5AtKnQV(n zBp^tr_zwoPaH*ROQXUg94eqK@L#+)J{T8h^ft5eb~qyET`3`#7`5Y8oJgW@K#c z-rm4y;G0y4PV~TN&HxR4tC3a_173;okK*9ePc`}doc{Trh>1+iCtakc`m=)U;h3z8M948 zbR%?vYgrS|OD|B>JJ7$O))hIkd+G2UmcS@VI}mILQNe=H}zM) zF6J4|9r1L{y*>wY*Q*+VHgEN^?Kl6(`NK&-fs8PZo#uctm;l`F5@smurP_F0&2IgW zQcwcu5iiJ@B5Dc^FmM+FPOGmp;hgw5!VZ6h{dfmd{r71`y8U+YRK{V|y(c)r#i>}o zTwKu&AExs!%#Y=JZVfzW-h&Is9CL+T1{?3b@H)Zoy?x~%KM~bnV08c{{0Q1Bk?oco zWrpS5V;ZPcIm_ioTl}e5=&D*t9TF2+^S{*{uzVjx`2;|&A@V+@f&Vcd{cqiRypm+s zlz?|MJm=;F{^}5NuvlpE{+%!|{#ibcopE3|X&(NEI159YcQuZp$IvC}J8^Er>)G#*Ur2EAC%q@VUS`I!=Fu)g%DWK5WI0YE^Q-)e-YV{JDW;B=NJ zweZXxG38uZ%3>uQ)0U?`gcjSrPo<))Y=sohR}U)wMkJGOmH2djU6KE%P@uUKL)zI$ zxC02Ef2JbewcPlJ9z+9jbHnOyH9+V9Nip}ku_cVpzI7*>U#;jO*#8jTpW?c3R?FBG zCy$(fB)wT{UUGutv(9<{_;;UA*x!`|giKCtXEcQGD(`i-9L+!V;+X|6FaVWg<~LY7 z{I@6VIri^z9tyiy(F`MGh3-d81ir3I-J&AeY#&8 z0P7T#_GK$ic{O>s#C1OzkTx0cdv}`^=*QE0-leG4i$E6tZ?Ih)a4xesrO6~wS=?3!mSoV@gMOg)j_2QoiB-(GN<@V@Cv8h zwqf)6Pk*3OHGoxEC>u>%r@ZRgy(PN~q^=^OSx~F}bN+|%);;d1(;&Oqds!GHRgM9S zS;kts?LqP;&SS42c#?b`fxSj-!F`=H1pfN0`R3(KcH>^W3e{_8X969CMCJ|W8xxpO z^60hPc1%s4oYd9(xk9Pp>pg_ldv>|5S!^(7lP5$Amrdc71%ib~K3wFWGIF(Jb9s1fA~ z>ci5|1@`&VZYV+?nGCtnoH4$|d}sHDJZXsHw0asHgvZr`i&Mc_c-s=|;4KigzC8B3P-XNV(lG*PXX*Dx>c zFdu8UDa}~JW8OeedT>Ch4-_b4os?@-V0yTYV!i%zwl9^gwC`k{lCHU&t)-q!rv}}y zz77+5^`u4A$7~3G6wR^GZ%dKP;3FV?rGBm%>NVFT=mRiRt%+~c>)uFJDTx=K_BmMy zxj?OwU%J`h5V-q^I8f4S6%Bd$G-}7KnY6z!AX+Cw9j-#5|?FIW`()u z_p^%c3qgejf9m31I>gV}%(-*HGsh7C*u}RZn}h<;L_#+_7Yp z{7p0Y$M6jxc1KD1w)?7Ne|=ay<9x8#Ks(&9c#e)Fg4V4ebUoPa`Mh}DJl>dZhB@ia z@zOW=%V)@GqhJSac}T;B3f{h1I4?kT5l7*xxW8TVj8vJvx!6;THhYLTcQp3K5Kykd z^4@Ms@j1QQuW!BsTZx(R20r)6f(+h+aw}K&*hiB1K={d{ec5**tt;Sm(0nLujiU_Z zLH6asCR|FOeq_m}*&ck8GCX)%Q^t^hICbZz|GX9RL2rqCTEn$fGX#%2zs6n_sYcH3 zEcKrHWN0nf_$pL$qgXRFp^>pdE199iL-R^qrCaS0WBmMtk&f9IUh>#CJB`)7Y9(i4?A-nLu6Vv5t`2y-@SCPblu{0~RhUM_^>BB6yKK36^J3 zI8>(P)0&3w6L&q6`9nbIfxhc=w!(TFj?-nm0orDS*}#N}P_3bMc)!{-;5=U!3?Jh8 z7Ux2VBob`b*UjdcaoS-!yD&zW_?hJI!OjuGGoDLft}#=#OjgI@soKRd!v?{McT zznq-s-QIAbZHP^W_^lw+9~c9);oiJ%Lp$-3!Af)JNCFQ=(2Ks+!^#ftGil(+gl7-9 z+qmqe%jz(ue!tc623J~?T$7hqtmdc(`1Hg6{uIjWwJIp! zY`Y1bf)3LN(K7CHXs?zCKjbw@k)TnHBwzKq8(Ubd#Y$H0h^l3H@L|-?4 z?iexp;rBo{jk*u3;Mp5DeSf_T8F_2!q?tDkMku{{mNEyQcp|pn?zCSMz!;(w5G8{! z)0uEZp|OutIE^a`n{mBc9fXpxd92*@({kG6YY;>TPG)zQj=y%cxEK8Qb@)$dv?lNg zEXqZ$NgLSinAjMm;$V4@DgY~%^3IkuvJ3-8Zll(m6zfuo40de##TLB$^$zJzp3XPQSoQ*mqw!wXPDc+p1Yk7Z z$IljCU2It;aT(tM0Mr+|L^)iR9JJmN2pVT!l~ag7?jS_;3rjD_{g<>?u!AaL<&R~Y z^69N9;8buq@8?_bSCTuZ9H1nbP?WfPCa%T>*UUKiI$egicmf=3zgcZq z4@xGNRTzg=Y1>CCZYJOx^5 z)usV-p)C^sR)L$HdXqbs2YuUb-Bc6TG72Suf~Z{8k7GpPa#`+wD!KsO`3F8qqJSQh zwmv!F|FU$~<7R=TV~i*ucDu}SH8|6P#dJozsh`kemVZMAtVybUCAM*RZX@z zJFNU8pkii?zVrjT7eE#qQ$N_<6U)LH=1LCG~eekw%s%6sTJ=J{au&KNM-|j0yiyy7=D&M|MXE zx|>XcWL;cXBp_KhdP;v9eK~IQflf#bD{qudDx^C~gF$b)-t}ugNwyA{;7~oc#6?IaAdpQ$NRwl|LV@jx zyn{ps7tN48$wi@(&AfZ@)Lxqp&}LV{L8rSSL=h#oVoQ^yVd<~VkXBJ;z`FP z)|9vc-in?aJE--~j>e*drq681X}?3rX=846u;f8P;NG8U>_P!i2t9lOO_&q_bN zNFTcGpCzZ0ixNnJIQZ&BVdw6&ZcGLpXadcVY#7PR5%8X$?vlQbR5F?wHf!1b%;LtU zj(^&0vgptBt50?L>w8;$ev*n-Cv-)$)7gb#Wuyi8)UE?!E`2u!A1gMN05LHa@^4}y z=8^!=64Uh4W9+bWE}w@a)zDWdSTKL+=2v;Wi^F^pt11i{D7y0esLeFJz{RLCveyt`Q?AHu#?od?zvO?H)qhNj0L6d<})erI`h4oAxV5>opx{&dBecU?YE-n|UM~ z0CaQ)S~Yu{+!hk}5b02_A)|tx7=W&zIPxnVZ->9(W}u_aDTv5rQo^vC%MM!4YbG}c zJAMSX(Jg!Rx*25*-UVKDJn1MTkKo@cN<|AI6s4jXVH3RWg(fyMk^OnI0R4E`98M(j+^0vP)`Owr z!R*kJBlYHl_!BSv&1ZXx?{?Bawuc%{xty<2kO@#9W*vFIvY$E_E{XV13qtZG@w~c} zP}pSaVf#cx#LRJvHab`wT;~CkfdLgxF`fA#^3!mEiZTP8d0%_nTrtDX1|iPJGqVkp zdOzi}-=Kp&)vn_c6~(1Bey(uj;Jn_lazH=&4OwxoPYTU*%?psMN=E?d~@Sw8{h7QRTaRhP}YA<1zrz#a~k()a31!S@MtkM`rxWR z4-afwQW_VxJ;R{cC?1gY868E%i*OoQo;V#|=e;p;=VPn@kQV~tm&v!bu%>&qx69M` ztR~-lYc2{rJa$?Pk1=duy?by*UTGM5b1Y}G~B&3*bhf)r*R&@T!PE?`sGuF?gp)AXlS8a_{6ZRi*fRt63wv&*;Bc|V zE+2XMnyLOX2EYW#Z1bTdaQDfG@0; z^N!^lvWqOpr+&75;%OEF^4?cJids`pkI4Y2tRm?KpYAWluFVV?Q9wR+%1s3%;kQ4R zOHf$V@gj_OnJ_u@U$_dS*duRwyJLL2qw9tl$Y#RxFhS5MNXr+>tKF-M*Ez?)DWP3z zs_v;t4R-M=T+j!zQjf9%|NEs0BBGRp>f)b_ponBvt=@1&A8PA}6*lx3+=NAWym%xs zJl1#cFIM=` zpJJf9uXhj;HD_o>?CCNBCUEydLRoRRuq9=$1hsJ&6{+q_{zuyzaMD{B(kl!Yu#vOJ z?(Z7x z;@+iENsBN+|2S9(6rtl|Ur6O{Z0oHsQoxKKL0a7JaN)dk=dAG|4GDBgfh1&_%5#5p zRr1b#7>^v()6Gf}3C&ApOaR`d1t8%L-2wlLu(ytj>ifb*&kQ3B-HJ2<5=xi!(4Yb$ zC5@lN(u-H0wU5W4T5yX5JPwO%zM!9@4ff_bwAF3ZuU8Q?REBE@vQZ5 zc*qT!q}pXjI8R(~luu6~@$+6Iyy0*Ki}AzC6XN*wSDE0pMd2)zozWb4fsU+#3{dPT zx<^%Zs0xcGf3Fnh#0;~ecqF&nXY*okCGSo#C@lXSA;s_`*LP$fWwSVSOtRzW+x#RP zpVwR0T_9gNkvs?a4#lLl4^H^J`r zwVolUx~?VO=lr2Q2osqAJAc;{brk6YP*s0u2asjaexZ+<-YHvxs%)%@aHx+SypJ#t z$Azt_JN%M@8(nwYk0(nW6~|p@U}7o&gu~fET^yz@4o)nGLR7WTHb4s5^)O<=Ok2zaA*nBA!vGOQSxRfz4vuo^PpW z;)p$bsn@V0*?~l|>XynhM7dlA7GWUIeAzwoyK!3T^c=@{&{S5C=H)(?+R!8OYvE6j zZinZH`~{0E*j0B!3ZgOR7N6VgV>H4fIkAUfaTdsd=d6zkZCp&!_1_HHAqxH3k> zD-XV13gBU#d5>}Wv7e*ndZ&WkS?B!z<-e2Ja71gHM=J>auM7{+aWDnql z-*;rk71`|FZ)hdbF(v}Jg!L-0@slB%&tF~le~sXRcl|!_N?%o0Dji?;2C3uCojKH$ za|fMioGIGrA!2wBDi(;dr?1D9X*vWTcSnlAgDzftaa%$K#!>rh^`~Tr$He?50g#r< z9JyS@GQ|x4Ne+#L?LN_~NEIM>dF+yXCoBkiD*q7Mb52iw|BUOE=Zvl}9OFx6<2LcG zFwJuz%Az(L!Z>0Nw`GA*X=Vs&2Km&fU~AC}3@g@gYj%&ri9CE$w=9l{D3^*s(6=7v zc4o)GqU%9%L*W&`yEY(GK(7Ul4UR;z&&aozW%m@LH*Cb|tAt1-;`;0Jng9G&{0t(S^d~M#DZjc1b zsv*dg>JfX-r(X^g)9=6sY1O=iZS+NwWoiD6f`Lu7DNwaJ?%jTB66Y(Pm*$mKLclHG z?+mFb$(P}`%Ltq(^kF+LA>BfF{CT|;GjNRO$1t zIUOG}H^BqOIj5WdY)$_mYY_i$CHt(XA?i0xMbB;O$FBnFUOG|gU(|4ybq1H6e!y<_ zcM)YrwUYM4fbEDcZRI-JHb95vKM8?Ns_$6O4K(%GUweCa1;}Q(c<~$)PdkwNd%r$?-(ch_H(!A_lua6sSl)psn|NB|1A&%2V z5_4CKnSu6VoXIagzp3?8V*CFV4nS0ph6KI?g*{zH({}WHk<0vv&UPpNYE8v{s{pP&hLgS6zHuYEUCtQsV6T<9njd4<( z(tjfI*G^|6lJ0*q=w)lUW^Ho+U?nl2IiX>eDTmU@=s|OpwQg9v7$|_>2OoBF6@io!q2zp zF)*CC^?Wp^{~M>rMG@M%yBJ#X|c)4CyGz&yU3&krj0x z%iOGXI|o6+dAJ$(azHiQ~rGHxrs@e(Wa-DBCg**hX z`tskpXYgSC_Ys@k5gY_~*m#L}+-T|fyuHnQ00R+HdUGW;{E2DzeBPOl2#7zpOhGd< z{3{v&x52!>@T=jyw)QvUV3ce$?zhwM;$_Y}CvV*MU+`MsTUKfzABcE8{R5)u-(7R# zZ52|?MeJ_(;gagi!mO)H9qxC;^&RVu*jyTL|D!qmZ|^zcpCgp{Ot=z)MJnv&}p)Tz{plpPw)yQz*rhRTSSV^noQr!;`cf9fS=8~-`|RIY24}QQN|R=V|5c$37jb%QsIDYoTgFAfP1#TFHr~zD zYPq92N)uN`PO4Qv!;&q;nbtl0@j7zn99=^F7q1`$J07VkKYq?}l`(kbf=-$H4+X?u zxMgDF`Kdh9ffldK@vYshv&y;ns5~jb7 zL~=HGtoz(c>!?2^Z%I8(Bz#B#r>3L(JgLB?yV(%m9x#W$yLG_>x(fb~G)}MxP6y_h zGt+H~E#Nj{e^ycl1HD}=qH|$uPE|#aT{q>=mn8SuyR^EDRo=9z#?C_~617<#p6F~| z9TPsUDP6JgBypq117S{t2)tDWPRB7~5R*Jv%i{ZNn-F?H6(i03xp4!112>DCpMP($ zM`y5CF+TUiw3l42w@RtJBZ1L}9doyjDSB;CNc_!s_vp8w9QV%smSep+o7CM$Oj#_q z1j>wrqKc(BY8jaX_hY}F>A$lsACs4vGV~;tkXu7!j*%e*9>Y8-nce1kHjc#QPFP+S zsWt`^Y-YbfCY5u6tiJPu0gdGC6Ki+QnLa-mm0J1Cjaf*xo|yTjHR-!&!4kQ|vd|mG zGPtNoAlzb`bE98Z-*n%G#%^UW?uE!FakFd&-u$7Q0U^1TaWLbNx&8+T^&*HbKUeWq zkqg2D`-~%Az}ve$bg(%t`{U44go(T9H!oBB9U=Z@TIpG`lAF47hJmI$Rr9Y>rCO~Y zR9{an9Us*CP)C=3_xzhKbN-Y4Ckrj&w_1e^)QE@4Sp;j}-wFFzXCPV)D#&yHvY^-T z^}7Tn;)MI%Y>q?u9VREdDd#08q==%4`-t0eNv9U4v>@TItG{>7!dBq(k|RN|Ps^>g zO$NOIB~8Z?Vu0J@?f{=sF&F%c#YLsxbm!aSbu{&b0vCd{16K2{XZAM~JmREiaasrIb~{_8kE}6L&mV05uP6Y0RrNB-bYQna z=k*|2{tbzV^YuUDHJ2F{J^ke9*jpyXPuGIneh!o_R2i$IK~!Dw<(GFNWY9Lo$nZyd z>*jDTzkdJn@Ht5XhNC_Kk$PVIEUKXa+F2lXg$vh3DkGJ`0kvA89K>~Qfz6IAyqgmB zp)NO1@wIHr_PPmxI$x!dNJW7bSg>JSIT!f_(p!@Jve2@SYB{}0o7gwvG_5*#tNzzk zabc87IsK7eDTRfui7x2ld5sBE&8cXX!aomEQS6bkJ4VNUkF&5-qlh}u6e})AOKy4K~Q`Z`C(Yy-C1$2`x!L zX4K`@zCVrf_s9zWlCA}n>{-JltC~5UEAuZqGT6fo2GkH;@?bLST6WJXPq4B43>-st z#=MG2JOtIDc@?UUNK6tcP?hrPLPH%$8xGg|K$U z*0L^7IWAwM=TjSGpZuybX#vsDBY>3D)x$@2Y}F360lZu@d=_j)wzqfeJ8Hjw5G2pf#?vC(FP~kmVyY# z#p7K_$_@*;woxQWm)3519rS;Z2V#DFdO>_3h4dz5%_uw*@N$4MqKN-`46KV=nioAM zp4G{y3x3LN&Y@Z&y$c9HiM}3OumszznozbMm_C?Dk#9)yK_LNl$t;}!+>pW%>CT;yaKefd#Rx3r!#VXJcysoj1e3m zh+pw;sU>T~K;Tgv#+5V;j3S$_Xk(0@k-3AG@k3Qat)!p_khZBc_I=3JFy`A@ikS%L zI)t9<(HxhX0H57tr; zWB13uWXiMl%Ah78MYCt9?_}zGu=w1LXuRPXk_Xbj_F8pfOwDFfmO7Y6!hPCH#r<^) z8mMO4P-jtIMN>-Sc(Bz<@(erBZ@1{Y)l7jiZ63Y_YnEaD!-yV6{pDL!gw^Qx%!(FTkRvtAg_iH_XL=j5-Cki+bW7M4w6eJiXILN?|JrrVo~4AGuoo-e|P+fWz7H z(wg!KfOBpIk4e@14c3fY+{9x#anK9%4g~7OkGCcIjPVZt*9+i4-J+M&Kd^pPQbrt@ z8NvNw*HD8#cBG(a%0GUUu2S1~eIIP0pJ5NH84_R<3Vfn60eB2=_wDY9(vLiS2{aVp z^ov58gkQbF^c%=+egEl25&%A_N}*wm%MnLi)h9guQWjPBwWH3a^+O~%z%hIA{ncQ< zL0Yns)gQU%d-PavxvpV|&5RM3-=1oS_uJ(^$Dk)YZ$;=>fSAxo`niZtG9O^gHA*Lr zm7Nc`2JAh-=F`2LP%BsRUH2wxC9_8KxOI@PYRa$nlGh0@Doh!faszi=DJilDKL38~ zd8w6d(CO9p?o$MJ1bv{)VK(hzebIYr_<-nzX`SWmrS7`tkCvrSzdqNj3k3gIn+FIG ztj}Ps0P;gqLZtEM>T|1%lL6(}dMHRjTQA_=nb9wEH|{>7YfPeJ^B34J9R)_3o9?xn z1QYzCl9C~}C#|`kKAUeoNdSlYh8{zs6 z@W1e&l?UU8gVYaxL*M?&+ltrlV-e{`DIKdegqJty!vN8FmS2cdVd&@FYM$Vu^%d-= zOI(rt%?1fbIIX9jXEKjRqc83bWj#rbYd#6!OHLk;D13K`x&8#i`+gqq@C4CzF?7)B z&59c-NxzbU*wfneQzmYK?;C!%#Fjb_q=g7}pa0DGJsTGth6Ys<-f>Ap97BMenJqxP!cm3a|kCc&C_nXyZlUr65>PAViHTxX(a zx@GMMyL#y|vr4F2L58U{aMu)=b?RJueLxcG!sYVQu%Z&|T|nbh%yplu!0TXLz7Ut|wm%~Q=ZHc+`Y!cK?$@VQ zkm`(Avh6)Sz(KJn_DA#;y&@lQ*{K4687m{Yn%GPxriv80!A8*qgdWm` z3`J2==$*2ouK;mMc!zThQC_cu$5ny%z@--N=fp_9q!K{h z#C_Q$Yo-Pg?;GnLzz}F#HQC;T_5V&+lAQsS(TCc|9hG zNEV2mM`Xcfn$&9$X&30m%%GAqcnSyNq=dJLVf~sQ`fi1}KIX_z_m`x6 zl0c#t8K78>7sz`fSs3a`Y)MRTKQ3kRzG!7Eri<)`d=dHw_o?TPmrg=O5v@h0hfW=z zgBlnl7PR9hE2F?Lt@1#1C`UA9bl8LFZ{0=;pu1WY<|af>!0;)yi39j?@T1UWKw6d;AWrq}&)l(IWN2cQipMhNF z?=gHn_+Gc7=MlgQp`XvXay%Z+)};%s{k|iZEUKjUBqhhgDZ_~thhy&n^kprqv#)GNh`*xq>)hDnDI#5rJeFWrVj59d zs|E6~w~4+W^rnP?psWY8QN*4f1Gw(JNZDuK*N>;@|fj!Byf zml8m~8~KE98q>-EB8^764_2-+^n^>M>385x1~5g{KMrIU8*T*rt^`vZjl&bcDirE> zAZd`^rE^w5P@3@Q`X&nT8{W=!a`Q)<|A?@UPB7;1?28k*w#i;(&?r4eL)Wgvg+zyD zx!9M{M+c2l=-kFyd58Oir3$PIu;Ux!!b4ZII~j&bm^^!)bP~{Pj%Xt`ePaUju{r)h zMuQ0xoBa~-KaI*a^@%~=dQ5P#RR2-q#xGi}gb_hq}~r0{%@)G$*ZtT>i5oI@jJ; zqF12ZRNJkm&x_Uk{JeQHjBfSfp+qUSM=Z3OdtyD@<9(aPv|sULFfYp-SX5jvn3lLe zK04pivd=nCMHjXy4MI@Utb$6vW<Ko;&X2*8(Vdn048n*aCx{o?Y}KEt!rr5?AZH z)v~h75&8iaLmVCjYxkc#D>x>%$YY_seXErpzR!V5$@t8yjh#OY&?Xa*(${K0H;i~y zdn%>jMrjxLAJ<19alM?+IGH9FxbV);0{VX8_tC&zqk*1cz6X$o*PE5dM1>3`*x=m& z6Ni-tPx`vsciKF=PY?PO6L#~$qqlJ()pr{$d^ich{0;pOU}lyO`mkRyTA=hXeg^f= zK2<})Wqs@*v0qh9M}ddy*c*(vfW+je+tT3gbWGXVUw;PWPCX-y^TJ2k`d2f&_M-p| z1hZ(@sVfUeZx5i%7K%-*&b-3Je;`rjv4JA*NVUW=;p;s71H-~M&0nY)tyj=l~_ zBabmdNed)Jn$cn%)pDv#uK zC-djlvt4RdlTFUb6RkQz>i3q$Ema?xu!+(8J00mgh|zJy28NqLT}5Whlc~+D^}b<8 zPbADUubMCrV(=$yYZL}5KjG5~Kd3G0M62djquaQ+UT&}p3chbv|Bg+0^t~#RiHSz$ z(8k}QExkS9xcq#1Jttg>J4qH&M_^eI-90lQ=aZ;HeEz~b;@cv%d_Xb5_Q#+bN&HLr zRL=SLaNGp1S1(LP@4`KOx#=-u#a|0JTc$=S*&i|0GECYh^WLF2tBsSvYVYdGhtM9O)*RG`bz-9Q_wY5%Zo_Asqb6-ES?15iuNq-*l`zwyqCMK!vy&+?Oitf;|n^MA2KsB-QK&W zVR74=P&aub^y=zOB(i*cjPd)|B3}>j;<=znLF@3mz9Rz{%c%lQc<08^szYg%dol;> z)eUXDqBEWY*^ShfkN^u(%dW3kZ2pbIO82+p2#M3wtTtnhof)&`UxxVYt09A zv}>RB%mBNgQDq+%TWc1yxx}b@I|{bGc*N2fPj=kwGf0Me{wB-Cj$lLE;tfq(3?jj5 z=)69id;8%*zO1VjdZqM%D>qoL?)owQP9LGny&~_wT!5X3`Z;tj5<}+mqHVLaX9HKx zM1IHn`M0>yYmO_Q263xfdsZ(!hcw^q^oaoan6ay0m(F&6*GtsnP3O&@Xhh|fm%3Q} zx!cKf?w)qq_T(<fz2lOXPj+B%kB-uepud;a^l{MX~8m#+~HIKv$}7m6spa0CRbcu(~A{}aGpIHvk( zr9hYrYQU&A4RM_N+IV$Jw7Dn7$EPMP;G{n5mITA$@UfHQ@nTI~Za{=rTK|t^?v`z< zRi8sH9uN4$OQr1*mnSj1WMFWZ9kUSy8l=HO(Ll!Q@EJ8!TI=Tmoc^Oe8X_tMM3*#j z3kZk1|)5`oM`JZm3D@9JM%ZTfv;UCQqH@sw^-#r)mideExM-O5~l zWDOn;WkKt6rK1h2?7WmUM7sCO;N6v8c+Kwvk zq_??rSMHFt`4wO&+Ufa*v53EqQVk7{z}8#7YM5sv@Qe8H3ocE*d+UaUnzJ)|eX#4b zkWSrSMWK^|>FX!LlxU3F>OtM8)Lqc!jST3($;O`cIFct!uwX1VgyIHdRAsC)qer~x zOf%ZlZci4S7^OxX5=E9KBfw8gU9SG&BdwPX9=gwqdqjXZJfO>c4MN>?{*c9gpPT`1 z3zfMALhJf)3LKwc_}84jyZ^+dKOmnqP=v$%`*b(kC3LV=IIU1MGmkf05DL*TH;K3z zWL4pv8f_{W6glX_Tza*vG1BMho~pLrNfULSJ1b6Uip1U>G1=JfotCMcIN`K1nIav% zq&fmwzCj>g;)6{jbym>zTkm`~4IvGlt*1<5WhHT9wESzoBRSeZyMM%aOiU zmojVTg~V>$1A;0;daboXpX}Ap^(KA;(H@$Ju?;EjzhDX@&R&V6p|pH|M=CBIwmWBp z<1x>umZdM(3I3jjBJ1`Y@sKak1Tmj<)C~Xa_76?aB^{JMeFGr+=f_%6)BhvE6^FyA zPE#EDk-tmFmc_k6Pxi02jooYz0it=K*7yxdK+MJ#p7(z{P77@uS@IRZL%@L_!rRMS zf1ipdBW#~ZVSxe6V4sBmhTeZPuc&VnGeH50?}1aBeJum2X#f8qF$@U1NP?_^z&j2i zZ|Hh>NkI6}Wjq9c{Xifcfyv@!^z-V~{8|FU0*fBY|ASEQjz_Y3Hyqw(1STDcWB;2B z+}j(FSDmcGJJIj^^eG$~)*i$gPbI$jB^tDyqn!2-oYI8yY{I0vH zW}ME#C*k*QA2J=3e;Y67Rozz)DJdP-D=oE)sG~9nB{wRXm z@khz`72_{mf#X7oCR`)hnE_;Bu~X_@=nz{=hcEm;Y84vD+#UCG{+LhlDDMyyS)KoJv|o!={@o$7=z4v^+@D?+qIdWJGx0q#IO&A;Cny0B z2(Sj>8M=BoQ=e#`r(w#ZU*nY}R+K0dGdo`bP33NOZje7zxTxQ&#uRunFOXeuQDymv zJ|UGNWMkbMtDftozF-7s%KHJNCqC8z-_Z(wdNkh<-{f=4=FhsjW_dIk)F&lzlQn6Pi})@ zl3d@6?&;F%{Rka#*>}<-53%Fgy9;09=3j_E&dwge=2SnNd!9d;@He)J ziQKw?eUM=hu%?prE^v3SR?6pVG=EEY%z#tIXqS)jcA*e&3A-ZV1CFANU(zfZYc^PT z*yn5BoSNQmf8EaoBs9^A0ALg70IIk5%@|_`#(Wq#R?x##xZ`Gl@~1DX^0ING8nmcJ zyn2k0ii~**M&Xu>t5@9Aix5YTaNVy~D^1}5tL<2Q9TPLh@S>=EBYTP1O6+KHsMCFi zCC|aOW91A59V)`@cwVfxc?yxq4Z<&90|M;JTGiC6`0WJ2KsV11THp&8dyeqYecQn! zw%BLRZGK_<#9Al>BLr96r76_*N!_#(H}h=lOkq|feE^KMM+;vCwqXqzrLeQi#!pBj zqYn)?f>j@eX*JPZa7;|$o7}m$?Php1v`0+Z1(2L8@DZjI5MXjoR1q?yF*Wie{sjU% zKk7#jteP;e@u$7eNqRtDhxmL7nN^q&08`eQH4tRwD!NztT zy!_GluT>;7^HV?={e)smWPX@4`5z=$AS6Rb@ivD6TInKN->{PDAUZW9e!+XR-$DQ= zK3x;n5K{(O(Ij&U!8#%m$i+u=vnQS!BEtdt1L<~aHFyXWezMlX+BuVik=a_kQ?mnU zuuOm0*~WAD@&qOzX3|hvoyKJ0N&*@sE-*~u83>Kk79Mfj-0qrrAa@v>FbW_-m-0$1 zTgHFYYR8O(PRCXzD|-h#>QnlAQ^$zzossV?Os!v}EkNpZd}CVY@a4pTUZU4ny4=x$ z1-s`nVFcb)ZszZX4ZIsXBj1wS&|41CO~SmB`C4~CP~A=z zsG0PRc!OlJb9?$BusG;H>+>=6JPFCv)g7x#Q!npJr;NebF^IdxYQq)s173Swr*(OKkhIoV8`{zw!wJ>e+rewUMjW zPO53yZ-oZK7eu8D|poTJ8he07@eP}h1nyXd6kF6y%Lc6qn6{}lZ8@c;|ZC4Wkn@Z}z) zdJ}HWCG(S@ua}qVO@3(2uREj(|I9Q!whXO(Y?fghu6IGtGs&^RplGkftDZ%gyMI9cPClb&6*oONwt&HjOggJq?l#t-5r`R#XLjp#Gl%pcHNll*Vo@1;)=m8FHhec3F=<7wZLu?YoOh@0;hjZ(eW zr!k~)O8p^Rz9y^^KWrJsJsPV$+3?o=6%YkReu&C_MYbbHR^JauhvvA)GA_+y4E*tK zSv)LlV(8>36VPzEA5)?CjV<^QdU*7MT5pTY9XPQ1gu(2s4cyk6xZ}E{rt zeylUwMewk^!%Kee{xeBwT@Tm3(D^U_1K_guilSD&Vil)GaQe4Eq=waO@wvCmsnWov z0_A@uE+S(A1``-9pJD%5O4$UCY2DUlcn-MzXLN!pb05(j+|wON0K|caNyX%9=-z)e zDgZs81UsTz(^p}Oy2KfQ(8{*2Cga7+&VFxR8~-;31o@sfpV00N_vWZFJii0L=_%wL zezFY`{B;b$6U7z}lJ4IhF|-IpHV#Ht6#I&hDiZwPcY6lQA@&m?wZIt`NYDbIeTFYN z6zp_Z|Mp<{>laMjU|n!r^h*$z81U7FAbMkt{r^7`sK8{l2)d2!?B%L@$9b^3-K49R={)P{f^?FLD!~kDH7Sg-s0seYR&|-5G3Q+rd@%I&Qfov2 zSS?rhjE$BKvp)Ra>!Hf1j+=Vha+s6siA%@;C_(neD-DS-C{?_W1|9w}*sDmbp>3{6 zu|BP<1A4%FN<7zyJArQc9M$a^yN{B_0);|02PQ4Q9f zc%i=@RYnU8Ga7u=B(M^cT$S_w{D6n(w`*CwKLEtU``vt@jf@H<7^drxtTfOX6#oxp zghRlcdsCX$78k>5PfQqqE}kz8)Z#beO;u|?j&)wM0*$__Q!tRL9gb=g1<}Q>**v0D z_hvd~&-Z(*K5N2_=>hmoI8Wnk1a(udBCXpl=$V2zGjLxhA(a~nH)QZfZ+z_jK&fmo zn~cjz9*7#Ydk*Tr_VTTivcV495gmFpgq9pLm!jn50WEsJAz*hg*e#>?AyhXAJ2_%( z7aLhB15mg`8QP@3HQwM}7eiRi731?}@m`MCB8e{w(+Q}zxh+B&?bWTE%T9E$uY z1N4#+d0FQ(1=XGsws#zuUe|s)tW6>YDufl`_A`|e7!>(Pj)_7&Ryvod`zHvSH$oPFrzkv6bH?;|tHupvcM*TuN$PiCI*WgB#TO z8Uf(R_+5(Q(kacOp84Ez5h74zPS9UQ8S`*bEH3?2znb3G1Ym8ZuXEz)v3)=P-Q*1* zKzO^2B~ORY>QcO+;L7(+;;2pLZXx;&pv)(^J6QqtCZnJ2A;=uzs(tB{Li<~6bkSVj z=MO!vb6lPy58fbV`42J;Uz*+c9)&(VYH}}|8U{bu-0m0(`%0hU)Cb-zWhsx;M1z8^ z`#h8B1KUhHIQm5Q*29EG<|+V#|&sP?Tyqj zYrxDrhzv_X%tmd+O!^vj`o!8D^*pMuHc|5z^xyz`m14mrdR+qHlQW5^|R z3jm8?o!g8%(ch+*f(sa6`$f1FRMgZRbTNRq?MtdAihW-Vp|ux=d{~n94#?8o26qQQ z5kZ4^K348FDW_PiQ9%@J+*e2HS0A@Qfk<7lFF`2xWf?gsZ6pg}0)s#L#Jvv;XCdYY zyG%=iF*k2dj~AfkEN~_#yU0U&`q*rR2QU{p|B7cnG!& zqZ$j)95{tEw&r0msBiM&HR+Qz3%8%(U)_`zYCeMY#!E#<7gEHW>met@M||AD;P9#;Dc4{N|G!H>Oa$o0XTlvY~^v8G4c`uy;_7rOZ07hI7DpEn~ zvo-r=c|C!Q2$pAOR zummfSrgXyKw5#2~EiZHD$6E5#cGj)Svs{yyDt%Kmq|cfM(jh>yJAxC?@&BfW1g{NL z8V75eL~qw;$Ip!x0?QrP&xN|L<=C`77s`0|y#o;By~~A;F5V`q`1#kE7C*nf0JHqg zOR}}2())xku$m?Ytl}F14Kjvyw9~C5u*OQ@#OHUf+!OR#;w>{`!1HPbYoM=Vxm1+< zZ#Ye>hTIOr?#M+TnziEV{ZKRT@uJi*6D*%T;C#3iicaY|I{2P%-qk+g_wz2g6ISI; zTJ{2hq*oC-&Aa6pcA9=P7@AWna!&MEmSMa3nddvF@ir=~O&W62S7M$s@DOv8ot>o2E8S4qeAG@=V!n9r{V2h@h`L4HFp^M9n)#tb>6V#kC zB=g7&S7jLrYCGtPzdJv78+kBW$g;bdE|EO$o6wTT0gdN4^Bim0bTE_8e0!zH`}_9| zLz}$?B)QwQE5^|rf^|`tW8<_hE9^owuWdKwWL!$*b}-q#x3C2Imd%}!HOhXOO2Sr90^uBw zF!#uLp`BWox4H5)Z8I(T!-VYKR`mT;soXzbb?fP?@_ejMt!4#Is;w`U565?fG2ERo zft?Btb*rL0wF2JzRLoVF#$`Pv_GIBg-Lz~QT}bsoAJ(+_d~dWMpQPI3bX1iiN#==^ zbXf)eO=&;j^_SvL`Yy@2NMF|TxKB7@*bAaJ<;ASSrzk}_*;}~AxFp^>ceV`vqs@bk z3_y~>JB;yd2{<)u?y`7UvgKk@9u)@Ssixf1Gz(WhgX z;ul>OEq7OcEb=^eq)!fhR^1Cd3#D%3A3b*)vdW3RenDk9FynD{@qR^Vks;aj3wYsP z{t!5dM?$A*-6Dr2^&GAJFM+@$_76fo&0U_`jIdP&r4-5d zo-@byPk1B%-p9plIsq9IH?Ni6WBzN{fWx@?AUtwXOSSR&ogXcpO8`Vk_0J|?v@a4O z@cy&8d6f{}9#IbI=RLwpCaa{#(EwitKelaG=%bHl%|tKZSg;i1Qj|P!^`4`vVT6u8 zJU=uvG6xxecOrf?PJ9Je3#|?oyZ?m1eI0UgQoJW|k@-}kG+XzS6xliYUiwc~rmOrX z+fRg7{?654NgXqdHxZ(;;=i}`G2!k@pgCF$q$Q0K zea9Dc!bp+y$fP5DZ{_dj=GDJ0d8Yo#OGE|9uUC}hhsAi<iO8K3N(wG!AshZ$jA4gUqr}4gb@H6lAviZn@KDy)w}5_AaF#3KU@9N2S&8gv931KU@G=we#zzas^=F z6Zt4Qqkm4pz7T4nm6<^|pry=NjZ*@!LT8l`)fXdex4tpH;sE0@m-h}AtT`%}BIelD87_Afu&b-XXKc6q^;^8!Pfp`UiyS+I5bb)m)B+tLnVf5X%{#^PMOAF*E)0 z_FwZH$uNK0Hi8t>2yb}?pYuNLoJY4l74CyU+%QDD5f|l(+AReJjeoDDmxkP~iF9t4 zj!ZjX(en~~Hw|!aTNPyu6R&)grwja_VpM4%3uSszF8-)(ZFsAhZD#B;04-|kZtL&% zjk*l0x`<}M6B9h}@zans5my7eh3yZb>qdbu&$k&OUA|P5p6b4){P!IuBsB14IX}91 zRaJNA)EbX9O%$61uX$o?Ab!x&Wl8Z*_@CJj>1WzRXnBK_`q`a+4zX@!aBRk%(37@l zjbz~9GeQz%X8E5Rsf56Pm?q^t-Si?Nlclq69QZ;=xfgu~DZsL9gmnC(1K$h$-9;e0 zSyKG47Ps~cvAa}j)u0Yl;F?Xa-SN9zUThiv)3t1hIf6q)(fI3elFv^)n_(Wd6pZUVKrcGyIfDmm((Ku+H^ z93s5iWM|Ee8)+b1j9|cdJHFP&p+Z?W89-IDKFo^A~DOs#pi+yJnZXW*KuNLwk zu*JO1Ov{4k+?U6eo$#Nc^;5^BRXkm<38^lN+OsCT#|5N# zX$31}VEX71PVwgK)pi3o+nI8xNN#hC2V)rCK})n1E;>W(a>@JGAuCf=S>nzSkA7HZ z)KkdyG5`mOSAC)!sYtzO!tnM6qUFvkt~Wt0zx^99=6&dv+uollo0$MAxovQ0A>~=k zhQsVx5!Wl-SP#na|Gu;k;DW^W2ipaE>+}J@Or$mtOp5g1>hHlbBPy%rP*W;+GjR|#FYOjgdO#$s>P|4^Lh<| zzuCs)_3`y$i262-PyGh{>=ip|!Cnh84NC>u%gxEVYZ;EceSSRJe^CEz6{vbAAr6rJ znCl=e%&{P3*3PMFBBA}a;bL&nY%XnjvodU+UG~JpZE(t2&1B@Qm3d^)Q?iF25&zDY z2jVz+h_~crh;i!H4GC{@$U@S0t0OuK!y^G-0o#x8&4e z`tqytcN=63NT@E?q0#r0Y0E91nb$f0KD%00)|vnoGiMh5exmQK_!+?MA-#2%#;?L-nZDjq55^eAYtTwJz0fL=#0~;VrOuTobA8%3NgtI zZz3Dcmd5UlT!@zw(3gP}vj`KJmIy0!ykR&SjuYc%BBcHE-@Rz7WGQw5KkJpeH(X#h zfS>akoS7SbJHK-DEW6a-Z}{|R(J{iYI7=HgJE@mOYp@h8^tdb1fz^r zz0Nx>f}{UK+*^P})qVfsLkmb42uhiRNEvjA3Zis_qzDMo-5nw&0@5W7QUcOB0@AI3 zbTgzdbj;mn0N?oj?(ct}``rJ%@B0YMUUSY_d+!yW^;u`mIP2z!24|#jAP>o?{>)eE zpaIWNf5iIQh(tK|P_h^vwi#X`)@yt9`QKp{uTgSz!1S*r#MvKq5kqE)`_T>A*UC)H(_lBB^RZQ?jtE~~qokOdAdARZNodmVUpJ~=a$iW4|Z{^E8Lp?y+qh`XXA9|l} z!c7zneNZ`;S+j;^PvJ~zW*c1om=n@O`WmK1&ig=kV~2{RvG<2ut1R#h$7XxqFw#d6 zQhpI#c&ePp{1;Z>Q#UZoR5~He_j}7>q`p5c<-tKil1mP}ne;2-8I@g&=cE0R4XK;V ztL8uF(fU4nDx}8o<>x$;?F(dt@3TlX&2%r*w9awlkJZB-e5CkdXKyc-zU38U)zA5^ zyW}ELspkUU>ndRwt1S;thr)CBp6zr+SbdVG-pY`YOl(LX^NWlUXcpiuVj>yQr>SV? zU%Akt{mP+O{k1z`a!SwJ5FwuAKB$2B{cDK#xB0he?QeTUI)PT+bLqa^ybW@^0%UbJXtAUuk@L!n?lLb%SRHyWDIY_~5VGf8Yay2Xa zN7^aMZ^FUH8bH)R;SW#Y)wLGvbS^#C!D1^s;4c_sGeuY-`# zQ7H%C`awv8?Z|*^J*q)w_zcIUOOMA0nvKl03Io!PXG$VscfKyc=7IK*O>quCgfa|7b~ zrJ-;9R}M@{c!Y*0A-m%$%ynqv84t*Is`(vk#W^mezI>(*N_~l(*e2ve_6(O$qqQtO zgdDIZuQxMt22j+lTTKYoBwyT#Uj_UxgG|5-${z|jC2>@2)elVyPHi8K)bh4R?pz+f zk74tx%4M58h)l!m^5(|lqxQhPL^l#E9~c=>W4vxaP_Y`jjzQ*SNAsuI;l=Qi93*Y(~wZq(3ONJ>p+47a%!AM4% zR{9#LS-zpj^3FcKUjsSK(@)U*yLp{{L9YEt@x7IUGz++lBxWg=bccO`O8efg-aMr4 zA$O77zMq0HI&}7&fBzHP-HG@Tsz>s@#92z1|EEe1F0^ zDg(A!07|5GG?X33gW&qC<(7vq%Z#?J-%M`r#KVumYa1-u_4Dw3zM*7?I&+>Po?bY% zp4t7Eb>Hh>C~cyo_w~JiDg|X1@tF5Q1>Y?CGcHSY3-05qHTbw&f$iG!a@!lUFt*xx zqI{6enY43WYjd_ukFR*EFznMxwVEl)NojP8+;ioh|VSW zXI6QwrTEDGT}vL?atf@#tRhT1KmA-SN4D38M)Zid=H<&(JZE(wgXgllI&P9K+|A=E zHw(X@9+-I!p%#01G5=RVgR?OAlDo!ozC=R7R~A6EANKS&EoXj*ysaj7XS(K}_tM*oVe!Q&fd>Il_xb?+}7L-c)&#rRpR zcX)m83aE7_>F`kAYcScJ-foT+rIg!_iq@xeeC_bQeEMDXdPNd+U&jUmLrlp(;-?oMg+GcVQRM?E*z^y61K|dJt9xxRUSSDo zkrTF9OJu&)pT_I0twUaxD3OFn&64>p%LN7;3_Mu3MSKAvj(GW9Ch(n-GHAL1;(1>Q z|Lt@xFQ9LzkK_wbPO$kLlDo#2*7(ZP!7nh7iCCboM&cpiN6~juJ-IPY+|}6OBHAPi zHvKJ)6OBot8600&3YVx_cIHbn1sH9b_@1nim!Mr~D1lH3JQaz$Z#|&Ey9C_aV2&gK zlbuf}E4mT2+1H@7GrCqdPsoFaz$AL(2ErH&a~Hoab76g`>!WM!WCE>fxauUaP`F;U zr`k*ctNp{Pd=6pxd?{1eRA4jJ*3jBh~q7cGgZ17P(k{P2W1VS{JHAHm6ewwXdN7Cgo2p>xWNG>Do zy-(2B*Yi|kB}%i$UJ_88_>#AdWxw}*q2%)`+e+juNc~oWK-^pLE?W{u(`<*@*UT{t zN<=O_MTcSGar2(o7r&OHSnDUp>eE&)mST0;%0&xYwQq72yhRbcd9GZDhux;E&tWDb zFZR>Zl&A9qn%r~;$xP=tywq>yt$z>@t5|=AFydlco|=nEuPUC+A4QK8mkC zGKr*Ws8Y=)f~B=dTPbePrSy|!|L;MnW}|6C@d%_;VCK|Z0dG{(9@y!T%YsnM%bg+y z&6oC^k7fC_Vd@IG@7-OG2I>_S!!C=WF4W>CqUK6R!0I)>uZg25vVZR>C62I0jOUpc01l*vJE>4z`UR`gHJM4G2xtz1?(nqN~LGAG6&|Oq=VCG@jnW^5z)znqy z80Yo&8W}?>&qpv?jI$kTze0#YaC9>4(Et zyEm6_52kdaWq9AIpr*u|nqUfVVGR(<;|U`x8sU%}8XRG;9-L0DFDbO0oO(M5`8=uk z*uQ)}*KLTU==~CXt4YN@qRjiB&XsCt(Y$#1p?)^ib1^cDkyfliR+U=GN`s@!sA48` zjNX#QSiHl4w;1(p{`2^a$rQn?&I9wa3>Zc*T&u}Y_(xl(Jr&tLL80_mPT#rCf##-o zzU%6<`1Ff6=ijRAe9Oe0Sn?&BAT3QYydGS?@m>4n@3@1zOL02`1qNhknj$wy;p`--sC}EHT>72LW>Dv`I_mSKWxdYhKY)&@6QO&kQ3Zio`-wO$QpcmdNoc4@qsW|E-7FMP_QZj#1$<+w%}xO*$XeC zZbSvD1ulHp>Wk!Yp{baBRnaBspu)_}VKa*C`@<;l&DfpL`xC2i`wtK;@N z#IR8u32dJP^Oep+eZCn|hn2a^SIR$MJ;njK&=C8_GpWidn{5f!Z`L#gpp z`hwYv-Hg(W8GEW{=sil?y#8H#04^)w<6x9-7ulps&To{f4Z~nW{9=zE%7dq%j4`hr z6wb#yChw}Rqjb+Fi!<14{^4*-YCx<)9eW@V{%xAiW@ZLb?PcTA*MvyPxhr~)@;I3P zJI$~tVel;5wq$#YPW+mr^BZ9^k2WY+4hjuh8$1>{v%Yf)UG;}?z*M}nOs~~ay4MQ& zSJSW2++FEz#?QV%TTz=C)`tHpwzjxK(Q-&3_EG|yVumC@?A=^NZ9J(Q4d}rHh*w&zTcexw2A6J@D|>tZFd7cpX%V*VJB9(O*?k zzt2jM!*fOr`d?{t=L--!MnSJQEFPpi-%D@o`@JzhrvJSEc`hzHP-$gGE%#vNhJn(v?5TGht#lE_B~C+o2jSH*mcPF%uQ9S$pC{RvY_5GS z1JM7)TRvON*waIP-Hl%dr>wG^X{(arn~A&d zt%-a_)oVZUewc^+9QBiO`kd>6+&OPQPVA=L&pW%a{ka*=FU6jKm)S5UYA8ppJ)!j3 zOxzc&e{T{Vc$AQ=ic(lngcsc%cLx(5o=;BTUnkd9X3fIoG$x% zW|GIep{SeICi>A~tbR1yck|`?+g*K7c_k&}mE7)3`yK>#A_+X9_EMV4R$7_$ zz2KK=1Ivyr(;~|$YL8y@JU67=K8RIbpQ3KLfOkeb0#f7F8CQDu%zj$u%T;BgVvWfQ zOEcM)(Hh*=j`ujQPf;MStb7AxG@mD{k)oEg)t&Vvfz8P(^nAOmwc9LNRm(ov*a~4}cxRSw zg9Tr@{o(D@&8w)Lkn|tEm8rrGga-XF)DJ#cUQXzEId{K;Axn{aY52~psdJGlO+_y~ zlH^7V-z2-vm)4q0%{W?e)s7F1(gJO<{r}wz$g@}bZFW`9VK61x9w3cTJ=x- z?H3YiqMW2U0dqG20U?o6{#>EATjc_L!!x?%?T?IxS5C6II06OA#j#uptTx?K1ilI% z$i6J);;3y?vfv}H5EMif?4U8Lx`npY?XVE_V`yO7;>qN2C(SfmA^wwIpmC5(TWm}s1N zd0_jio|8r6Vd6gar%==FePNQTU5|y1COkV+g7GBJ$#ykijb5Op7mXaj>PY`|H7v4HwNO%9Fz`PNIY1H1hs#W zO=g6@P_U%B$|eU`t4PN6`JZA!qw7hBSd78xi(l^ zOTUMHy%x7Nzem?Y3VGCGpx-w9F}|I(n%;AKeJJjy`VG2Dp(ryqp(u!zOB)nok;FVm zscWC?FLH=`N;p87(fwAVIirhSZ|f%b)}8mdCH|iXw48*wKX+#StCgH*PpSwEbF}EAtq&D z0zj^X=ic{LF`?X@wF{m@eK9HI0lj2DnC9*0AIUu8;r(Sg}P#r7-lK4 zt`l(SON>EJ({b-w_@h)$hy6fA7@x4?KzMeiS53~)G=tQQMF>cZwD9mJ%&9uCy1Y?7 z>na+cd6+@qiG`gd1TyyRw(}NN=Mxhyt_%)zbA1rFp2$l24!&T-_wvVuiu!>Ir34S@ zO&nJ^JRUXC8NnzVKG5piUy_Zab2hTPAq~n^2oaYrGQ4Nf8(>(vJ(8rL#K0v#&$LL_RgEN7-t{vh^%uUKpEciaf-v9&hoP-x=i(iex0)`+M<+x z+GLom%q()FOvO$o^=1P&C?YZkMkZBK$@o;&qTjf#N>GOqlde?g2)hfka-j zC&$>$;Uwu#*b9iTtLFM3IWF28bFf-(6ZE9Mj3V;~&ZVH~diaV+=5v++NpH?Ctt&mc zyIf0$(uV=h9mFY5wpI$A+ZaQnZ8@eRE({M6 z1vT%GB(KjDy=WD!dIqKD-O`6GS`FXX1bU2V!sYej=cCtt z++I}iqW+y~i?7K?B`XJp z<7B3V4aWmU^>~F!Hz5IFRnt>midWx@32C5KoEIO-b*5=jQZ3=F4;KBP5r4ik7CL3p z?9HhfsqSC(TvTT1Wqfb$-LC>_N#!gG4@H|fVZ5*1QU32o5m(=r^yD1$$7hW3SoB^i z@$L$dD=zzyN&+)MNf8I@5q8Z3k9m2(S77pLuCHn`a#i93H6D0$ z)LDR%v~UxXpOZ2O3-J$j#R$3{N!AD?xa0|Fo++cx$=!JTs4W@ChUQR;k97?@yw2#| z^I#!jk%g6die}4s6}%f(-FYqz;~UgIYs9cYe%)YKY@vjN*5zmEzq*-i%KR>wZz3z2 z3^2wJICaG3o(0}3hDNuV#P%|DKG@s}y}QQIQ?f+wJYjqmaRk3H+TmM8N#b&*WZ^QM zhEQS=_7Uw5DjFfC*exv>_)qMKe%uoWwSf+rAlgvO_vO1u4BgI>A=eIi&OlH>y4@`{WBN9v!8Ff7v zMtD{!^83Q>?!xy7#k0OJUl=Cp;J|I)eGg+76%2!++z#Bq3#{GUogHu>>hSP*z-7i4uCnWVc-=w2zKO$!Z_S@+i}~5ZMlIVx5EGw>Cfv5i}#r{k=ms6v^T4!Or$JbcG`@ z|HC79a8Xb2&m9t>4*xC+L=U0tx40lfDg0&qI?1`+KZg0mi<2&n9SM0p4; z^TGbX!T#R<{@yNFr@vHiJ0b&HRQP)@*k#20sjLa?#b(i| zEaaUBj1aZ_N7~_zBCP%+3=DFIQLZihkv8q1P+NZ;8~D}@_H_Mk^2T-)>f4{|h6MV( zgTaue@_sPGUKFaOzNY*$S}!2?fuS~z*B>xzctsN)4h%Lh@r)fKy_ z21qV)G9R~-75)vK;O}qfKb|iP_8Yyzc47k>Tc_y>O&N&i25Avqo-ivITI zs{AAa$REYAoXWxeq2;lt^;ha^C?`lRaxx*a}pFI4#e82hOu^hNn!QVFV*eFko2keDA?8@IP4Ak``0yX&EH{Byz5Ay(JOEzh=4cIFQ&INWVE5ZhraRpFOf>&whl z{16zUczPz86e9$i^ak@g=kDyU9$i86#q2Vq>t`6aiq-~{+LyP!x)}Q>GCaHL<8`_3 z7ZFG2GU4?zhS4|0>AV;XLSQ~Z()kiMZ;n}YXq1dPEasFTa#S6c4+Hfx4*3Qv5K2>f zd6w%rRULh{zt7+ZyGvia2>p`FtzBy*{88>WvbqF6>@L(lJXoq;T^+QA4~~51)v4}Y z#zKA0U9`3K+uRs&{yF9>u)4kNT#`rWbI*O%C$-ZDb@j&xKW(jaP%x8qn&lIvdV+|_ff0*7`1oNFJBWb9?Ejw#7WY8&#tvrE!wzE_%f*=&)Gs= zH|i^U6S;$I!ve?=c&4kYPQ4=3mlPRD3A`|qgut&@0-W*aYc%M; z(L-i@1ZP*Bw)lxxH7ig<4z@Ke9K$4|EP}An{4w&Qkg7SV(OP)LZ=?t{>bYr~yJy_! zw-OQuES6EXgI=)Rje$Mk33S~1Sc<34p} zj)KSqI*g$OJ&fVAyY*e0t|Xk7kF=9tpe9GPJLmRS_mf%uaJ7AoRRn6)z9aZXObrqioGZ42?vjvQ1c)*p@=Ggo%6ey9po z$kbHPPZ_1yaMb27ipPHd8}ZR5uk*^B?Jbfp!@6pEw}5__igd5mmeOj3e4?fkexwOo zuHkAcf3Z(ww>+WukQ24kZE`q!xQ|*`-EUGaVJ9i2oK-q( z;}1p_TIxM=cqGVIl(0!cJv+kfToO|4fReWRwX4;IQ;j3YKQEEtz?u~s>yt@C9w5PC zn8S+~^NxzG!0KTYV?o&qB(7W6L#higMk$rQ#&6HbnZ+jf`p3Q4w?}2#bE5i;a!?12 zjR!xfehMH~_ptC>~!8GuU=v;4wtiic0^*aLN8(1QFPm2hZ;xp znO^0e&HVKQ(o4PL6_x0*UefLpc`h%e zn>w*-ONc1p>k$$hE#t9s+A5vPm5*Ou$EG__t~P5ASjcizEC?w#5%7ZK!Zy;mIq&K_I1+jhiH4X5DE%}vp|Ul~nS z8@oE=?L9g||MqH7h`iB3EH?nX>pt+|<&$ zR6>M=UwhyfM%U}RsRp4dt_P7fxh|N!NL&>l;l#;Z^cl2H+_!ezpTIgKIdnx`m2`?c zjY+kPGFMGtvFD?7o*o;_3-<|xrhvYV@ezfcBev!sZHKR`(|G&Q+EeLUDBhG&PDXk{ z&doF)UGvM7WtS4%FB`#TxGFDZzqdeq&Qvc82vl9{5SySQKMn#02)U-zZL8S`6+@rU zCUcJbyMpKBuFXhC!`ZHL#TdbYHv4ng zzUPIBm*!K3FVBMQh)!dIWB{f)*7&!13iT5!dy3&ySmSu4Y)8JKY{wK@orNM=>zE%^ zy!u-}G;%biznN1plY3k1Q2@4HK1SHon(SxcmdwJBE*IweFWf^r-mnmxHV+;xC#;2= zS>NQDT&g~JY|MN3t9Sw?->(!$YS^&F`MxIilA6? zq60~H&s4|1!bLU%DJM)(hRNa)lxGJf2+q=ana&9EI4yQx)+vJW~M*F2sA{QVQ`?X+-}Y*?g~sxC^gt({H}6?aIO0f3dR=wK%?s z&^ES_IG7je<^dn+L#L-S$b;nwp75bviaHAo3xeVuSCW6uj?`S4r5wX>bzrSps3~#b z#f-;&-vhIv^ob^*6PHV{NFPK?yPx3RIN}n^}N$ft_U~{dmV9MeX&Zcxd&8@?g&V)agB9kRv4r_E&W8)ai zC|-%ZXkyWAOks0QJTgtdTFpU9-z6$lkISA)AB$<@0?0hXsoZC8coa7K#7|8qJb1u= zR(WDLeKU6N+gTIvSq}w&hwJk-!`twEAA8&OE@QPSThvn4(f-j=KIyHt6No^a1x58F zdI4fyXdf_K;DT0CZkz;b_YOu%Ja2EatqOf~fM46}GZkB>jP}tk2PV8Bx6&7*&{mhm zSVl2P7726@f8E#P4FD94az9M7kPXI7e4$dzpyVm*NyP4lr3$3QldTZgiSkoug`peKW=j zkOQe>Ur4iDGsjANt=^Z=Bfk*!?ksGYEh@dfC5hSX@-WPbDf`lLN}a5uF#Z9t`%2!P z$x&{g$xq%b!Chm{Ug6*8k0Eh>J7o92mb@A#AmG`dsI{}kI%@2!GgbmJ-vvEq6!y+- z)`PSoB-<*%8OKU(u=LD`Z1=eSzPUR27gYU^xVd!@f#HU8ed$x2e-J|04R@MTkS9v5 z*3r;|vzhj7w$T=LKU&;iD210+nkm-N(qr9TeRis7P%aNA9=GeKTL^!HUk)P={L( zanw@1F%~Mzddz*jf6AkvStN(~d9*ZE*Rj)f)HT_{F6Q{}$wlAhmkYsgqoUi8SLQCl zVe_O!TSeS`Wo@Y}a@J-q?;jJLF4cLoJ|){56H?o1I~^ptG@U28{e=u< zA%x0blke(0HZop<+?Mi47(3J^oqDKB`kUBIf+Jc!nDgvNOIEn5d-_8?3xY<84;^ya zGt-iCrk`amMHGa*`F;8SPnX4d5o|!mC}T&eq&-u+O0ZnbW(DWHy2v@3={i#iIe}*I2uX{`Hn28b_859*SY0`vRf|G#nU=&hCvQb{2uICu zR(8j~Y zW=Lu(O?So~k{qIpDq);T`|s%>{Z*!Lg_1=r_;a9?Zsw}d0{)U zW4!8Db0_gJAw4>)N+h{eM-E?PYB+z4lEra+I5qOW9<6QEq%Lx>xM@~z-Y|1_mQ<)O z8xol|v)Ap=<}hr1Rc4AEtp-H`4ztlS^8uBTa5KU>uZ8<++EPRK`>pg8iFyIk+CgGo zuRvW9%VYFR?l@M)s-F~PAii|Jde%!9CrI~gFy_EXmOt!~`e}HHvmyd4#&_*f40AHY z4iA0FfpwzjdN?JZXqM^x-$kSxQg^GYT|DDnO~+GI3x$S~c*v+ET+U|?7$ zbE?bDtq2eGegt%{>(u5bnqQ%G2axr@F#qSPQ9W^cx?9sdAr3+GH~1?nz0mfdRdVpS z%?m_nc)mNpTQ-4|uxD34WN6FEUAU{|ZJBU|ceB+g_N7Wr&ZW)1+Jq^WfOm27Br_>D z?O+@EUR0t}3FDNJM;A?Tk=rh!t`jjq(*nOCHw6oBmPH1FWV-6_NOH(;HQXn9@wSYe z4355;M5=cYZO~#rTuFM8#H3&CCMh#BZS|NqqKrx}`SQ$fpCpj}Ub7M{=swF?JN(@*Ij>p3_i^ap+t}_G8YMD23|Gy2~(HF zwm>*uO-&4m)XLtG<3wQn$d{Y5lN4+Ku>>(#+ht0rQ0d+H`Ef3j^UiSc4<&z(D=^U3 zCW7yJ;P>`TQG~no(*?^7B=Q+)^-v4FPKh7tOVglvoPK}iE-=ndaes)31?o4$Flo#j zyOq!Z3I6N8&3t5v#PR$~2LE>E74tNmyOz;vU@b=0FBBv_cYQc++_hA*%w4%JweNp) zAQ^J;q_nIRlZMJDY?)+Tw4;lG3e;5Xh2Uyq(`Mnyb+d`iO(I);-JR%2BI4iS#RQD> zbJs0OEAP&+QNAROlrvS7v$-c~iz($P`~Ef*o|MV5Xj+nJh~MB@5`f&?@?ZdF`MDTl zChPpnTktvRMmoykuXhZDiG+?Z1`i%dy2h<8Vz3g~q5uf_(M_%`k!so_FgUg^32|PTm0c|MG#-8-RzZxg9>HRSnthoyx#ngv^rK)QnUSQT(8!L zf%v3wALoM1wdtBh7@BF3zQ}cuq$%k71J1g>Se_0K|NUsj+N@bdsm)2EO+4)*y$ViN73b@)AbLkHnKAZ3(?7u+6 zu{_%sHV5Qp0+tud%Cf;ywXF+^#KeO-ESK4muQDqw%@;#Vp1mXz*Z?nm>l;-{1*Uc^ zDbKc++cW(m_i!?mH>HWKVYAx!+#MoO)d#WiLnH~yygTX`X7{wVy_GbWqrEPl1fa7J zNufi^{0xnQo)Vnpq_SIcs`52mUUk9Dm7`Tx!04=)4Szpn)VKa2UAU#W3{Xc1xl6u- zq?WS7Q$&wSz8H4Hh^D*vvNJp18~P`s6YXajs+rREGs0B{+NYF3%bEc?nf;qG$g~uc z3FcSm7>Fm1r~sZ&cL$|Yw9u?;G(B{;37&0e=s@xQF`1=5V_3)rthi8>}<0_v{g$+Q`FEZpcV zw^sQ{(o-}9pfV~|+Fon;=0kZl?b{vv@|fK|1+5~P9fhFS6ydF0%7SQzG;~1vw=GAE z_C{&yWnPw~X&S6;Ie0AY9rnoJn0QN?v$Io>kRZYOknz%l9p^%tt>pX6*uG>8$ZuQv zYk%lOi#@wY^G!jSo11wCZOsphncC`PO9Y&EH0~`{D6Njx9MK<=s9XBJra28*n2_&c znqR+&-gBAp@1ib;?1j0G96M6pZ-)0;52kTU#U$G*^q_4vdq56qd<&NAzO4LsL*iB1 zVxiI84%h9jgn7tE(MmYiWl00;+B8$ES(QU+N_@h7;j6F_yT_M`%}>Cy7$&(x^A*{i~E?_PTI3>PJ%I}KDe zag&6=Q=dMvJ@aAgZrdKymWJJoCUR{9Q}@{^tDy`g=GK4nn9jWU_aMV=Y(QFYB7+#Cn|;gzaNMJhxG2plS4*{ z@c7K{Fd^bl``e$XhA<=RK&%E{A$jF`UA@`+WmNh%ZgqKrJWD@!&7$<8 zAN=(&rnf7f<|50O>qLd1dRoINX8-|5dFFZohy{aHH=sULQR3AgJ_vt?^Zjb>{ z5I{zfAd6u=?4;2mwo@WXcc&=rzapag$`Ue~;&1C4N%^*_15eZXh+-c?PT%FQFpfH5 z6#lBqRWy2sGE@y{?5@00RAkIsiD!J;0L4BmHj?Mx%{f|-Gjm!C9(#QuaHE?%tG*Mg z6)Gs75!;FlsXcmiTP2UvCXgHLOQLfpby@k!ccM;Lq)~izgR32Z+P8$|H^StR2p&0Z zdEDb|W&eO)((4vGJ(h`q`yz=8gKgb1Yxkc@G!$Gc(T=Y`D;<&sPv$i6FP!QU+IpzwCOV=lVRBF`%yhbVspXx=38`vl2CXd*TMyiOiR`i zdUcRGVHOl7LTcXOg<4Y4QkSilo;ruFtQvgCsF-i2qtx|0;5l1T*X}0hBgkmiFq*Eh zd5-!lD>~l9q4{z9Ildq+@cJpnk)dm_;4c*RB|Uw0sts+W=)q&^!rJUm+ZFLKg|=0oJ%8=vF6XBYQaJ0q(+2gzSTo##CL6uZ?PA*?ch*hbzcaJ z`+lb(;$F(oWCj`#W#fr*o80q|HdUoKC0*`1sh$)P|0G=y!%}@ZQsMW$ro(4)fyuG8 zq9}|V0BK(Kwe3H!?43LVWBHu>Bz#17nXF%xnL%kid{VrS6 zCC_sJo3f!-ZTFv}gMG zNLpvOJ8=8c$f5EKjbAj1CgaP#2(Sv!o6#oj6Fx0_*%?7{RC8#V%d1KVM~5OU$J>BI z{yJwLm<(QH$ZD1T-X)3b)F&qzSt~Si-_f!kiIj`=f4=R(t}6$qCCR9kOzhjNZmk0h z=j?8!{T)1fFP<6X|ADTnf}4ByLl@6x9RPhT;Dh4WM*AH?M5M z(Fuk64RvYP@x=e-sCdfUK6Ct2c2*W`=G*y z#S7kl)}B14R6qA~r`(*E)1Afk*xY}r#n_q?Iuoj&fyFs}IV>ClH zk{@Ne2>9l0*$SRPb(^mH5{g+e8^ETy&hDQFbVireF%Xe9cDVLuzE7A|qL>y79Y0HS z>IDUPq+=if_eumO0z6x$RN3=YzvcmT!8+Ijotq?<;@59p0CBv}{6AYhl(0ZLxoD1s z1NLhjqti{95QN5T8%Oh?^C@p&T_6L&iJ+qF(vsK)V{#C6rfJV1zr=ZKa{j?r$wu!r zM|6xWx^=%2d!wjb7?+;g2p&dfTNR#|^B!c*Ij+Q0XO7L;gezY^`PcrVk;;8rbwQ^> zGF+Cmohx~diQf88Dc%grK*;B$T!SM0bm~QVvAIl|mgcyR)oaRy`PS{ExYax9^P@g5=<%NlvTTAA31Fx_uX6RoYb4JiMmY}Q5kjF%!(b4ZQm}2+) z1~N5gr!KY{8W(4z;~r6M>&P#qI55!Ps>3=CGG#@5axnyPe2tz>?UTd0GR{v`Iv$FH)#J~@ALg>^`P4g77y|_BlSL< z_r?Rnj-=#sdo*m9UM7GdZq@4tUr5LO99AY~Wb%E2V7qxEMpL$10-J}lV%^6Ccz!?R zkS~@48mg0OiIuLRI8ar=z9@VCJjx!^4XK)MDtv3gIT|^BXCiAQzPp7GHum{hfPD6v z>KKA#*m!d*mnUizT~T>GtsE2IPDPC)g%vpj@!q0L04VU&_&%#O3~gdGlBVHcTOhuA zUslT4P>z-4lbk6R)V=%iTK`We?$89jYAH;JDSrQ^ja=||?Yp2|;HgjIc;ydCPT(k8 zWha*A7`qVJ7E2c~Wdw0a0Po-Epg}%|H6AtAg`D((LIr8#a+RT{y#W_XpX#cM|rSG$=zFV+T z$OY(ShO{seafJ)b;Fw*eyoH&E2Grys@aN7glWZU@@>MhqO@D$oBs4ti>5J%o$*s#l zyvg=RWHtpEq6UmW);A&^q=!oSpzY%p!3g(&{Ir|jfB5iV-&`mNM?5uu^Whm!@4X0i zx=if#YyzhAS$k!cPIHb7jw;eWF!dAJc3b$SJtEeO#FQ9E;;DPgxG1)Z{`TJJ&&|%# zb!lp<LrsYST-EnATg)3Qf6x3%BvX|o;QIKPBUc8zCZS z-ay^nQbMx}cVRB8OKUiZ5zA4_4q~V&rLo2tZ8SHS-wfG$%#znP9*A)Pou0jeJmrMt zy~{h7T9N4o9U>0zSf(c@OUp{1K&Y`0v_PXK@RR8SVs6HPZcVeqM}cj|kxWfJDHiI? zIlH?(@Yd%8P!9svrd8^jcm@U_11SMqH2qnMk%)cW?+V?62iLF^xwbP40<3v>KO5W-&dFg4X*s#^60YW2l4Dh4n#&6 zz)G{qZ?IYvZnc~{xgp3{rRSKy1^sm^Vj9V+XNlAxZYu?g&!k);(uyF8zF`5975C2( zxjv@eOxw0J;b%7Q=McHUZ6o_0gGQjOnXU0Ux(84LG8DyND5Bx{-4O@dPP&Mu zFA!}Av6oLROZn)C3$M+(aa&8ua(oQxt7t+@4{?i@SNm#G3>?mmrdMy9B4sDg0K;q# zT9tIE{YZ!q7IweEd9cFSwztb#8$KX6QS;zjR$5i9hqC208w-}{*LcyXBDWz|T4^!o zK$w5zJ1J*n6TWb@`9y|J(wI^}NFMj~Ro__^31^?`4h|66LuVf31ZIWLLVYCN z@O8vWl!yFhKmhTeiEsU6aZMNEk1QEd)ZBm6Bbs7CM`rHKW;Wk3h5fHC9DJ^wz)}QE zC`HhGYPuM3ce7}(-~zPSb2-3Gos|R^U2!U#`u*?BP2NsTI3g^oEK-%?=8h*uCpn@l z@DPd<7k^&$x`E$P*I58pV)OCZeYa7FI4uRl{rycw+Xa61%N2|N?oODTc5?q`-3cy* z|F%0Jpxak)V^gBMCSB~)$|w35qcEcNYykII%1>sSdVksXh?PTc#B|AZZ$Ec>>)6B1 z-l5rlF3!PSJ+jl93hA6A8gPBP1|E}JShJfd9Rth0kGG^i4PbeW zyRt9+4rFI3rA?GRPy-p`%J(FDMY)7){g*_K85(}B7W0^MUJkwWr}tNdP4q?|-%1o( z52=S{X!_EFD~bvk_R;nM&TbhoYFT&Z7+b#_(ew`U6!nri2G?Kb zU!haEz1=cspd~$EmKy@#`86)+y@Jx&x(2#+sJSdRp7AEYub?NA|9Q?v<2pMC*@_mC zvB}^NXZMqSIJMVtM0oNV0I$AYG~LA0NHz=T4u@{TS4kl{#tuOpNf;94ysiA(FCX@M z#%~)r+OiNq>BHeuHFpfJgCDSK#C7`!b9z|zJ0p6}0laJ`x!>qR8v}!Gd zjALq+x{cAOPloZQ7FJuq58SZqzx6@Cr2N%6q2h~m`0we2)p$pR$CjXFgfLL0g!!(r zW%>~?(XWoL3{9h(Q?8(i$MyxyfR%5q#7nRQ>!NWpxY00V*34d?@(L`39J8l~sfJW9{KN4|sZY>YL6=*wnBu03ClY;GKMX}ila1XDA6 z?vY&vjY%&c_OKF&^%pA)i_Gq$SyDuaZJ7mekioaroI19J`2)5+DYtDr{sRKAZ4j zE$7k3(e9dH6e=eLbcN0No9HN?(EVqnZI2)#+|EF^#K9-mP2gtLP&DKcxusRyJav(S zfrK*B3Xk*($mzwI5qRBb$p0^(TYfO7WB56`yBb1x6-LrI^O?ua@kt{}(pj|!&isvv zH6#*rq%EoF<}&gv)(gr{+D+$$(d{NiFZo+7D*1qjntfW;!Y+wfwCCZ_AtPde&;ceO zPBqb+EYj>;T%$e&w&-tEnew_FH#dVF-z1Lo=R@Gf~-&GAi z+n!!gH0;2827sD~@Nv0%fjyV4<4x}qh8@GLk2RmuT~W1|acoG>r;2#m@dwzP@yVH~ znoZsbIvO9UJY#RhC1c+Em4t97rY|g(<`#*B=WivyD|AdBtulAA9}yj{qy;3Q!<8xl z`NdlycH}y?Z=t9)J-D%q0;V9Cuv}z+{t};SRZ;SxQ%TgQL;9#B+x_ng1|XMO{EBv; zLOw8I2Gdr4W8mX7O&p?;o)=rp4d*Qeg@8u=wHB&yqpz)YBVRddRB|`x>8uD5b9Yy< z5EyA1L#g=h;i+Q9-SPiqM+4PuVmAY7br* z0CEN_t6|{3p=7D^EEMzzUgCaLA-@9XnaN=}7BVZE3d_hvi6$c~^WwUuJdiPoJ^ZP6 z_-mQ+-_nM~reB%349dcV@np|8zi3kO7-H75ARl$D52?>S| z@imhv$5^j+dho<#prs#g4*`#~{&d{}jjqllqB4#Pr1@2l!YT9Kbq}!HEih29>%W(_ zstw6uMf-XLpFnB_AQq0=9&SZfs;`qoI6xoa{V9rijILC_!&7;tne6Tkak`i5OMh*~ zMSDkz$|qUd5)Hh1R&h(oa5@#LJUSMq%N;s7 zq3|hph>428a&WFc38w#!2z*449GYGD;MyT3%G+Fi|0)Y2kIEU+{`%hL~?>#xFtiE7{vso&WYUwE9^rEOXbE4!P3V<8Rb zd7K9SKzsSMFgH;OJRllEGqh5<9FP|t5#<<$pbykEq2jeD;HiSAxWT>($|~)4-9HlU$Ib*Rva!!k6+&U_NKy&K%)>Up2ASsWw3zPK2#Hua+(GL z4fOJUhUM9GR_K5qN3cpWfGX~@mm~CE(nqUF+sC}C$xbcwv|k)hDa#a8JGHa=0}{BT z)bhb&td3R&)E*;mA8GZqtl3=s&SS07%dbCfi%;i1e5Nd{&eVnUvW(CGS^afT41&Upi)|NjP5?Z4ivY*T--Cm8tz39OV-!DOB!-}_F1_BrqgI_ z9|AtI^Q&G?b{2Ng=&stCR1UjEO*Ir>H&3G-0|EJ~Z(cmP76Mf$15RCBSiP`2{2T|c zV(I7i+6$YTCn$vqgrtd)c*65OrfV%`cLo_s?G3O$p_(3KIQTU0h@kEm9!|)~%9^C{ z$ukdqQbPk*di|#&HYZo@f3+t7HB>oeDd~~;@nJyCq7sATQCz*gZF$twGVu9=eX6Hx zu>PYtb|E4h)iTWWl@mj8qD|_L`S25|b0LPdwl#}kn#v7`g?wAE%M#~;Giqc7G}gR( zz5!U7j-sc*+oD~2PaYqx5_R`;EoMTDq}OxjF69FaC(HOF*;%uwe-c`+wB?{zvMmujt>AF91DjHuInA3gcm%QhZuI0k%u25FAaoxWCV? zYp3@1f?B&~$x4Mwi;%zJ@aEekX?=moO8^PT`a)^c)6mBt_5rPPjoX6g=D^^hjw@|Q!kYTq z9VCW%LPgP;6~G36&8#e5VaQ-zL!;>rQrnJ$oPbHT7axF_FzDWp{E$`6oxc~_nwnx^ zRoei!&P%sQh`e~bmS#TF!z}oa*rBu?nYL|E^n7h+Ye_2f@gxV>Dd$Q66O8J8@cdw@ zFnyt6_kG$;anchBee7d`dAs|)>1E-dauB1?>_-$+T{}T8w6!qs2etjl6CE*1JAKP{ zOd&s6JU~2mUZ>cGzdiR#J$V zmPKRBCt)D#A>5(d{szz17X7M-&@xnS6aA*3>ZP0*5&4X{QWSy+A$nbnboP~50^xF` z{f%$GjH@cR4~*^`w5=s?f8V?6d-WY?R&ag|ZBIbbp2)H~BL|{pd@a-C=!*0fl6Kgk znA3A2j31N_@IW?f^h6k5A{4p-Xk05A1{zS(953aawtd>AMLZ`$SIII5*at{X()1W| zup}|{wsvpDLB;67V6y@!zRK|#mje>4%qS|3KRiH`wQx0G_S;A1Pg&>=BRxj}sB5P{ zqH;$A@N02V94mm$yNHD{rQmWysB3ImU%QQxyv*_)kk9D!I*6ka5iU{X)*Ij>sFVdN zi;Q5tTb!k%+%vzHY zw{)y|w-(!1le#w3_=yT_Mo&@ulrS&Ste$eqsC0oPbb#g{dS~QF@2Cke`w0Vda%h@> ztaJ;9B)TBA&zZLXC}-)u8X)4sFcz){aTPLH1Tb8r)?5=0i zGbeQd(I6{RYKEtZjTQU~F*eqZun?vU!iZ))Ix6V8gcNas+bhf>GhQ%Ak`hkX(yP)snFG?r| z=|8JmFGREPA+_RodSjb>N1%tvJ-0_mnYkE|g8IS?2g%Y?xBF^7+^mPhEz58ymv0sA zvrA8faq=CtMUQw?dmL*|wBa1 zC2w5YO$S$8Mz>hm^3F3*tYK$BC-^33{zP6fbbw1oGdqvFZ^D)A&~daoYdB-~^WEjV zWFrLH(oTm%#Mol#&sH`&=O4`kJji`>km|N~6nU+PwY8tNY5OGJ7hp-Mn|M)WjU9 zJ>#>K14sWAD^b3ZBWg^4pJA<>W@MTnxI z{JzeJLA(Sccfe0YxpzugU_Tf7LGj%o{mu*x8-}jeWyv{qX3=eaP(^1AS)WyJ_ahRq zR$-H7a8tW?KHywI#O)^7nvP9?A-=Z}fE|Vq?5J{l-UmristIbfk&{rmGh~3VSL8j$ z?=xN{g-4AWT~`<=j2t>{nA!u`54zo4-N+ZytnU5CH3si>D?ls7$xGW^zT*dFNAc`r zV;BW0s(0bn*vB~#KD{=5>#}?G#};G(Z7y?fFrK;na>?V*O{20WKuL?C_ommkuRub+ ztCOhjLL#iqB}}qHD4AG703>KR20zmMZcBcP4X&u+wASo1IG12xq$iy}B;C;rHNAo_1}B^;412- zI&Fgx;JDZoe$JX{))fW$Vy5^+UG@Me6f4;n*BV6c4R_Ah}52eoz`d4ropuY;tK^bDK7sFu8c_j1*kD>g&KC_UO+Q>eLHd z0z%7qL9rjz3P~-tzQnqgo^Qc&hq7u}xsM>7`43FWbxBV-&a>{5Q~7~Kd8B@oxT{0|QYvrv; z@mW;~X!1j~39h8d9O2dOh=kfvroy;vw<35C^Y#bitr3JBW4NxYxSt@L_se{BeFew! zu}=mkDiXg>JkEFBa#78ahqx3=7Mw|OSV`wVpn;q(4gt}J%Dp?Abrps%4rv_Zg3az6 zFJ=Lg7{=zGqA*GPrfyr1-0xsJV7Yz`we{Re8ITR zRW+djpyJu5x!99f+m&)bi}h`(8K)pIhUnWCP*hwbSrxV0AQP=@)&O#rUmeVUr5%*k z7MgjBx{26A0W*Hj`wviGNWBt_gqI-;&~168-+Vk_@znc5AM zs+$|F>i#%Y2KpT!Oz62Fx)8>?*p=P^&<-~dO>AAuei(&Cf^yVoSAKoceQu~u^E{LD zit1R+g1PWvnP9TpF}2+Qs<6hLE8~e<8ztpc=*bR4Mv=0uAUVd^9rhwVt%<;6|JOA*EfgoypB$p43_kO-89_YVlkAB9tQDIR0wY z)5hy3NP)fGy$VZVJGx{Qp(|pjCVSA;4&VWSp__JsSd+@W`l^LM9)_VFUQJC9 zf$%z{4t=Q$X==I?4Tl|)U!izVT{I8+xZdH~?WBG)#`q+T5)%v%(^ z$F2J>BpLjKku|4Wr(0^+@qY9%po1GlR;{(U)AxyBL22jtTZX&&YWhR-kPbXc)_0Et zp_yvm3`*+=%sQ3m5t~t)qjSaXIS=N%dl>IM72gFp4tRrK-r?;!mAu|_LX>c1h)+rv zP%S|Cc7ZocJR8tvg3mgf5vVPw=FV~Y zn%9B4-_5z(prtmA{*E(x(7`{llmCjF__H6P;il?h2dYbT=7G@?f6I9m0@6vKbWMob zK=G3)gTHt=rdo>a;ku?YKs-Q4A-ptj072Lsi>N==5hw_Y9w5+YY8yEzCrxA{A|buu zleC>sb6g)s38_;owICNOv=sZS3euS!WSxvZa+5~VFdokuPXBDOKn;nh<GF z38q!puHTw7bPP1BF9l9q+@3`gdf}tJB)>pSBKiQ`V54Mu%<7 zzo+j;2U9m+vYTC1d1&=sf#P@iFFUJC>vBlZi=jqHQ3MH2?M0v>N3El@_n+wyvx5c& zB-{9?7?B(b5_xoVrXJO0iV&p*8gF@fNN0=0sc1qXG!1335O{Ew=UA zGC2Vr&ib2^kyX0Ic%Rcmf4K}TnYHc5wU&Kf>q)96Z!ENt*F)7!p;XN8^sxB#^v~DD z!9el*>SQ3q~i`A-AaYZkrM^Zd|3rIOX1D=JJ%v z{F+0%LI~uap!=&Q5VfgGpz+ZCp4hg9A~d=M6;)u(cBpzvWBuX}R#pKIbu3wA8sMNl zCV@gS^EPL_2!8t_;i9NKZDV$5wnMmpou6>PBM_AA9*XU+F|TC@O}Aq?3p}I+ai0Tl z&RIlfMYUe&HGA(B?HBAU3wkdyC+B{Fgg&(kT8!0LN-UYs6+U@viaY^ANq+&tF~*8Tjtq9bPpP39(UP=kr{=XNZFos>VF= zFfoX+PK_2{pix&9KP%H@qI}ZjWjb=}Lt_%YwS(eSge!*wN!L8_$Dx zbIlb4^4syqFm_Z~@CRJ9N~?9*_1f)ttet?=9GZPPDI@F4odbRRjHF%RPOrAnUN={@ z$$ZEs?c)lzeR(-UV|7DwbyXgRpL_mU;qQLP&KRX$r~4{T2&goX)%@vkvaH;*t#$wj zwEmF$MdLR9uPbn;FZh76ze}};>T-f-ApA~iA^`{P?q{}LovTns?cne@JzY_-+33n` zhMM>IesoY+l|hA7M*AQ<99^7V+I&Ul91I?dZMU z`}=92i{B<{d|B0tVG!Xf1*K~*0O7kZ@y~>>Cz``kKf^_#H7xit)*k`yowWmfsJOcc zB0%4F=RQ;-`8THhEQD%8rQe?atRO?xg2=P4G}4g*S@6K_U5N3E+?()l~>d zIj(QWOIXj*d&2G5ZQUsW?;s*sUf)d*l&1@Q%keG&q_s>)^2+@_;gNL`*D~VKKv{^E zB^=H_n~q{y_=#cy^q!(C+D1?EMFw^C`_X#!?;V(Eg{qtHFrdKYB7Wp9sB(<_@&weG zhALk{b4ZF$0eO9t?2NBn1on-Oe%T_s>iAdazyOa7u{MEz*x8l!cW+Q5RXYEviS%C? z2J>g@*6$-#exJ`UT^u=wDwO`6Gr4o_r)k}8>s9lX3e-|5qV&bxx@blGle|0kI86dI zUqQDR5l@!z+S_$u^zl;7u=H+boyz4>uP9pq z%|cSg8$Qy>#C;ei?xzXF--c%QFjvPiB z?8L36Z5U}~Fm}v}?Gg{zfgjID|1l+4_N}#Hs7CfxZnkPmP9_wlk3+9w34MiW7k7>< zhPH2-aLv)P&4DAix^|xr@nn3zdth}VUEgYtqd|8h)1EbAEm<`r2w19)mhT=5qKT8r zEwvUC$NwSkm}HI1F4y`kBofcU(X{25MYx>sgdDyZZ_6G4)Xi*jWi{jMD6+hr2=w6p z)TS9dF%-N1@UI^E|3+~GyY8hH4eWEEMtkXJ52G7V$Oc-c-hpWilzq{+1@4sZCOxd_ zHgv6fk$D@kxPn&@*yAENvydwDrgpuN>zq`L+OD_jCh{TK^R{fQl=UC8r%?435oerE z>I=ypdnLiUaQA&?2Ipm~R|4QL!!f_#XOSY2^_@~TI-b?mzi7DB$$N0%*v<3wzhr7CXmPuK4wX;( z+u?$&1%7q~?dK(MqPJ`-B+$h?0RLzDduQc-a4rzif!V`ZFM-ysf5JKFM64(_Ee%p@ z1e$W7X_vTz$cn9`n4pnu3LXqOEy=86S=8A8xb})nfS}cyu0! z5z%66>nReI;V}ie$Um2ba`p*SmvZ0t{GoCYW?tKnbd&c^_(E@1lBymKXhyeY^8j5X zC^iVHl{RB^9q(B{!aWxZYgypx6;YB#Ts9TRp$t=SHBtQTP-w9w|8ywOL=>IuC)%!9 zoBonZ72YMtGP>&Fi=@KfcvvB)9YeHQZ$^C!Ne4F>OiGZ4O=2-o>d5*|Ky4bNE23}@y_UsS~3W}90FlZ{A zV+|EA>JqP0Hvf5vVbu@Y-_7hQ2VA^SW2^Qv3O<3mV{I`J{+aJV^+`Xn_n#`7L9lgq|Z7 zdVieyF?tBqgF!~1%&~r{&U0t9j@M@|RF&nL1Z96Cb<6Q8(H z&(D)v+YxWLZ?L&<%YEeBY;&iao&0w{29n&Dm|lH8nqyW++o{pXhm!FR3Uyd1MOvU& z>GH%hIhs|6c^_KW*llu=G#{)cuInYNeGn}PhH3>B0@z36>4R;C*eWmeE z`y4Ne_yu*Yq{(>xVVUeeD{mh}KxA0DwOW^2mH#-I_E0$IOLsB}xsUhPeGj2_0&-BC z83km=S0!lr)3mZn+kG%`>Z9h7WW2kx{Guq&U`aheYNNEn=M^vpQxj_?tq)?bZvE&P zK=F+KD?XO1C^qP;cr%0Y3>{+h>Xz$&*#UqIG& zTh)S6##Jx@LHq`kY9zY$PQ}~?jz&94Sh^VLwch6Mz1c>KZZP;|hn8+Q2djz!E~E@1 zp8It*_nR1$-~hA0QLu-M_xgttOnDo(nce1q0o-vR$D@}1TrW=3!yh>#>Q9tUS!hA-NFR9!7Pjc61kx9?(nW0X#Kkq_;7bPOu zr&?QhY1Da-w6%i9`#PgH-2E_NP$Zm%>M7{~%ag$370{^(LF~0SLkww;9Y?P#N=M5y zXP!zJi%B=18VF0V*LV!g&P@Q_I$#1u(J}3Zk~_r$oBY)7VphaI6vzdi+TcTjl{rvb zL|r;7C{n`9>jJeFZvBb3FTXcIK+>rHNPouda#Q1zIv zp9{s@@{(FGK&J&5`8PE4qvc-NCjqdWZ(m!0K~evrtYx)c?N_51x_bgxiHOC<<_*xT zt#dmmCClRBuK_EJ^Al*T`YW7aRJYT0tA$L^2S%&uA$#VCWFGm>W~J3^yRB?HuTuyR zbSrsK+V3n~XXp90cD+nn+PvDM^sLP0Y_jHG2qr+NG7)TzteXZ1x4O1{jFy^w_4?6LI}Ok)z-5Ex@SS;~1NH9=j7t38lKsYFB-N66Z(W%D2pncqGeG-XLO^XH{SAHWTxv34gP$Mw#DbL@=3 zZgStkjvj4+hFm>u-wBH7<-|4VrI!Z65-RjKN6BYnWCxglwoIn14v0p8z!#-3w4$+5 zfmAL5)Bk{GVPV|@EaadX?D0qx&HVnqRJK5Ok$(XW#{y3Q%=IERjV3PSDmYa~m({mg zwstbNMLlYJxtkPhH}k*w4(7}Q47e5WqecVyeHSG zNvpj|k5YF?Z5#4vl*y0a3DBkLcz|5!b}fNzIh2$5pStSUpHo5-{tg zNb*Uw$D9_*NOgIn-vP_XfGkIUj=AJEfVZ=KNz%!=RixFtOH0uTp^<+zJoWJ_oa;_S z)+g1>(VkBF&yy5xrS<(9Lf!C8V|?DsaJO_{*M)fNc|{)E_3n9!zXpvQ%(>c23omhz z<4oU2Uccd_-p{%PbqDIsgigF+FYsP^m@Kgr@Zqw`(QpsvCjg3mMLZO^S07*Y9<7;L zZ#uVO%9iG~1*D_?z;le>eSKC^trW8^H{auq^p=g^*F#m;O>>&RJe!OF9*^lU5sGv4 z-GJAl;Y+>Nxm&5V+0ba71l=mr!9arAEHsb`2p)*{t?7Vfq_8~y7y zq}G1tg!R2`lk{8*sI+kXjPudCLDBLp-R3Jgf^9jwqI}C_#$7N%-dZG zoc#MqP;&5Xjns%1oAnL(E47L*Q3eO`r`BGF0{F}6z-i6YTH7YBwM%fxz1F;?WLM7F zFHlwDcb&mFHs^X`zb7MO$6zXlkpVjjc@Ml&)^wKb-X@+Ikh zGMbpL*4C}x$)ClBVer)(+e3}zt9QZpKr5PCo4%kBYo7@O<<9_U8|R4mIiwz74uuB; z8y=aU4bQNY4F|N{g0>8Y_x4j@D5MNp$-*2R1(ZFh5dml_>@~NY|BpsamLGZ`JxC8! z)0tFEu@n7w4OV}5{SRS0NYTYKYLP zS6T(<%ez(--snD0W-LrmhYuz7Ny?(#uWbNifDQAb{JnPaW!V%m0 ztcr=`i5gz79Jo>@U1&Nd@lctY?x}U%73!h7#>9gFIY2%B3zrWqwPo5-4wwcb&_Kg1 zCe$z+TldFB$sc1;j*w<+D&u#nzKJ0nMsrq&MqI`|yuE9vfOlR7lgZc+_a5zyGpA4A zgg<2`Sw!gj#gLUCxCFkv_Um|qIE}yV5_TKz1iuNVA`9}nbY9qFb!A9+*Etcn$>X#r zxhC3ktH+?}u=g;xjjdKetm%Tuznky-GS_)a4w05kaQ)wS_WS z_(kDp=MO0?XGFRCwvJ4Ps+W|5BIZ})&)eEN7Ajdv$nm#cG;3IJ?A*@jDId62FC3F) z@CLqKk9#o0tKr@xdfi6kYPP>;y!5la4Y_wr>rVGpkHa6(9~|D*WHdWZ!c? zPH@^$V~DZMmEG)Ne96QtexsWY9nakui_tK)t&;>X9#ytC+85P$@Dx9!Iq43Z*S~y4 zZC)emiMlQRUOm5@{hi{ek{2y@2#IG)1Se(c1_X-&eX`AYZtt*hHjVP`Bx|zycPW+@ zV5l2~I}++%=XB#0Iy8)sRUUdDta>y)Ct(x~z&%U>i|s3EV;ZJm$vQ)|9ba@1EB4oG z2x3HGD(j6T#D42qm996=NxAue7rT9px>c7Dd0#QxT3*5v?x%_$Qf6N5@ne>Jl%5r> z&==H?q!AIa!@yx$I8$tSt+$ufSuFcrL8~m!(tSE1rEs?My9N(um%prIi%P9u5?9Nb z4ojrj+W5dJ;uV3d8p7lJEZB_wYwRqMXrgNQo%g!JL-TuQ zHXAq&-Is7U2TyE8*P{>9S}mIgqF(Q}W92yYNwYijQQurz^=amz3p-e*v|`qF%oK%8 zf_Nh+z`mr!g3dZAEMfPQ7Ivher5KSDM#b z)oEEICNgD346n%T+EHwGv$5Rcv%#{%#fnVCt%kl03}#yCyeVcX7rsdr zZhcuP!9h2V7LPsLG^|Ix9r6J017{nP!Ul*cG05g#P+)Xla>zga$~za{=~vr;Ux2}9 z|M`3a1>c9Ut*NiY-nWWBnepxt_6S)q8Y`nLefTwc3(C29o+O3yu#q zrXPiYyFP2hwg}mZ0C=s)qW3C81-Hp7ez)Qy?w$81OF>!Pbv|FjiZ1i|u{k!HJ{D)8 z7At&FdHz1*TV`Ou3I;+@tTlKK9%`Y$o^g?k`y1vqo|a5beDkR$o^) zJ~wbgPXsO=>CcN-rvK{6^sAVDKa|m7H&Xn^n-}zqt2ANo<|C*3CuI!TWz_0-!HJ{% zqQBCpU<)|EvTls3H3_?H$)hRdXNnCxbXz|hO>NWe+Wsy-bq?8ub1$MlZ+&u?y-(3T z)Y=->rPy^oTh?8*NCkKgR_>0fRMe&peV}iFZpGEHhYaz!N2V`{~@^h{Yvtag{K%5R|w|!r=9zS#F!%B zOjRi?BO$#O_pX*ddWyR0>4B&_h}9F@6ZyHVMiG-up1R`mS3$}tWe5KRRkqvtZP`vr zbneFafvRr)ofYS}_0q~H(!@@`86#)S6-QosZ+#pi5KxoY!iHt+_W50x;>sfl!jj$= zA&s$VgW@oKN{aX}<4iZXBt|z(U8zvPWyg2!S2rOu71zyr$!~{qS~68BG1g~QewgT> zo*&DYz9VGl+F2fkuAi6B(_Y+?u1unH`8{i)Q=h~@3iTjG`E=n&`ioC~de8>xj>>lu zOb*2JR+-TGEh>+?^S`(L7yRe16ST-HRZSbc=+h#c-@=lG@B8Ak5th+ibNmE0=maAl zBbO+0`*`mjR&)qyeAog0(}DoR$q zWQ=f|Kf9{hbV(A~U$Q1fF?GKDkQF}xZm>*F*QOqXvi?NJss}B@lj3{wY|>8Upq2Ax zXH>znHHv~G8-{2$g5fv|w=`H6V_QEPEXmc!UJe{|r&SPXJFb#%C2_oDQPrvrZ?h~uh44T5uP z7qL!0iqU6XP?J%*_Acg*xmsAp?xlc4`jX&_E{9doHQa^IeQfhEhK$b94Re&WH*&s= z@hu1eF)mF~X+PEiGCJspJ{+5J0c*{+Ig}LXdt`-jlu@-*8;V^QaFEW6`gW>C?Tsd` zisjSKS}OY8-?81z!>FQ%Ox+?;@gQupW9yR?RpN<6S@zfy6Tm;$y*q8IAcR?caJX^N z*T$*;z35!z`dARQWBs?u_ra|?aKZD`Up}*-#4BJ(CJ&PgUE>M8=#i^vIdVx&X#UBLACH@*Ev^c1 zDcdK9F@#hbY8Ue_s5R*Sig6Ji?kMNRTRD1m!F)L=EhDTiKRhf+6RiUdeEyc1&xL;K!JbWs6mY6q-AeDl6>IykcY>c@*`0vL3I0$G{9O0-1t76ndKO-%W(hQ1{f* zh3>l}mUZ_PH~gkezW=n~`D0S}k_lazSO#sv!;eA>XD-rRbwrutv&VN!0OV;Dcy=ay z6ZlJFy$mPF5TX45@#1@=`(Ax4ftx-l$OeW$;sQjECCefZXgkB4LPeoRF*KhZXeBv7 zQCa4UiT);rVDR+KOh5iPrfm*I~^5-;S~^iUo$lq z)dN5be(N9MN#i0_O9Y`T%67hfrqWln;`}Hkh#U^>9wuaeXO0G!3Uw@ND446i2r`$X z((ZF7cA1~g-;E}AN8vEyJL5BlyTgoaPdKrk%TKfLR}}!LfxT5y1Q1H+Ma7)3q%O-Y zA+c&jB}bdrz*Zjh?pVn?_$R79=-3^spT$7xZ2oq31*%qC#14I)Q^5<2Yh*N17(y`r zw#cWnzB6mXj=8=_nCg@_{Ut7+(9b?}PEu`T66c?vu`zZ0zGkKp zPQ$e~1h-@Meqwo*u+i=BAp+pDncekJL8^_?bDa)PO5~Pfs|il52J9S7L=rDtli^}5 zVJ+!Uq#6P@&edTByTOv4Ix9kudr@~`BvdQ7D>=V=IWvSlmjpv}5B$E$RL*vATf^C6 zG528t?`sjhA&FP5=@JXa2dR&&K0L3XZ+o&Wt#0t3y38;L)j#fa2j}*^f<1WB2c7oGm zn`>!Pvs95^!NqCNz}?z85AZXEc33q!ob6cR;xV%KL$|?ou2^4?O#OU)N`$y!@TJ1w z;n(KCKgI?p^h9nd$Hz_*i6k~R_f5lAM!=1mrK=3XBcs8D&JFg0j0a<%Ia6<}YQbw` z!aY|!eB1q4wxkBvirG#XI=qz>>ztoXW$UDFqEsYNRRw+HiUb=S&H5M8qb?_XS8weV zvI19bS=N4Z%%70BGGBkH|&YNgND3nG_T3;=moLJC}Iem~oLx##$UwG}vHcAT)~ zd==%L(?h;bTfPz|$o|SpyWtDW{`9h>;qrVjYGu!BschVPSshlg&h0U5#|ahD<6yMH zXmEPszFc%U>JtW=$lGl>s7#GXhLE|=_#kI~nc-$f-AUC}nYGs*17TV6r&wO~;O8^F z0`_h&UTBH$&l`2?g^rev`IKvM8}lu^Cj)qcdu#pHYz1&y23%k9J2g-DqWUoarBx{r|@wiuY zIt)EjH96|)BdoZ&$&VX3THtfk*oX(25;pd9HM{VIkT}jAg zcIzkN{svMEyr4ux(ik@`Qko;{l?|HbgG#6*kJi$ z z;=4U70>`w35d}B z^>-X3=#4s;WW4cYj5M(C2Zfv{@Zh>0r4umPya%tRp1U2V@ZNsi=LP)8Mt2rVs~ygkRRS83*kk6CoF)VBu|?Rsr54+TF9 zf0;dV$%^&J4~G5VO6}{G8%kcfNhG$a!S`EkYF`G&c}wQa^XFwtL zJI>-`;E7oLtGeM|@yJ*2h~;Is@x6Hp7=}?Xwli(Ui82qa$h~5Vr+4mw zrQLMfzNS;L-zx7MqXk}f5U-2uEOebL@aJ>qvgfC>qD!O*2r0}H_GL3ZNJ~gO1t%k8 zbbz1mHmH2Y*KnZ5>mchJk+vLIQ;&MQJ%ht;fN(7PLFCbfh|RaGZ(Gns_QP*zIXP=q zrTkSSQG)38=bT~k3b*eMXQJLqbH#!TQEQH`&*$)Jn`1MCez?rJIDv~ckr;8E zXJ|f9$ndZ|;kNbY1>|g%qvP$TM39L$V^1!f7=ALCX{x+Z^&sLga<;CFL55d3NDhXn zsWSd9!>J`SemA+1qB7Gx7B?AA2YW0SuS;r5a^=49#O`!F@=ca=xH1v+rlgQB;;35r zbWV#XIuS9tk4KgGHLb9zTD2P&T#s;s_eST&{M346 zOW?v=U+8`#gjMopL&lJ_R^6AnF0##HLVL@Hse9Gz$fInzhCha`cZP+m<@MJm`QZnp z(Q+@Ss3w6&q* z=~Q`EqYOOTcJ1t$v(|;PJE8hULHngwW>!<`t}0zb1-Vz6Gvz*RTMYReER1S6<_X8g znqs1vs0e6-S(K9@?Y{igfO>nyccL3g1s9`=Yw%+$NLGb!Or0ql9Zbg6B16EiGb0dp zY7DP> z#u77;!U5YH^XMx4F2U@Z4{rsViiDe{PDHlN$ZY$;K4>a3dM_uBw&vGm>krqazmkmR zs`}nti$@MEXz+BYZR>^O7oxTwEm!W}*>u#4Px(0u0KW)BJ&hEhzm~73N8+PSa+06d zQ5?$&eJl@L<|J-Y&%-gQ_F`glx9+Lfw&arA{0xwvdBdF26A>-MaM02tI(6$7bd{ZE zv@~}OaL3Yv!}XXpAAuKy0h0{1K|b8$f4U>3wV;xKqh6O`_6=Bl7{YshGT3931}>X$ z9dc1K?+zjaT+Vr>CcxIUe6Vq#t09Shg-zOkwejofBt3_a=^;>{bYjJ14Jt%0eV7k1D->9Hemma$6>_z(`mscAc(>y0YN?oW|wFBhPbn2(n!KC~Yo zx7xA_orpaBG>%hjVUZ)AvI~Ma1+18xy0Ox;-w_W@bnwlDV4Q`@Z@4s6566sx4$@uM z3=Oa=As?j7jFIbDiBbEe7ur<9ZDj?3d(c%B z)v6pMO4ewB6n@qqnnyw_2DW1a@`)UhAF5Vq9!UFC73lF`fdRLoFtA31OcLV8Y^Hqs-SWr)nv=?|XCRR`9rf*h-G?Gl%XS0-@2d%2f;V^^?$P$Xb8^mOXHL+j70?X*1Y)fSeffGHll_h2ls0+d?OL? zBYAP2N6>A-z{AFCV68n2tv0K_<;#>#KmmgCr{~%iMurbNG(m9ZbuSXR#(+An>3$!& zKF>{2Tm1Qv=rT-6^s*?z=r`xn8?dYu97#V}Q znG@vgFA`38&0y<~WI|+$mo(1d$4*_QfcDR~)_H`FL6D)pp7{%*QO@8!tdtzC=r=j#}oZkc2&> zXyfTX;6YMM2+v&DT@5{ct2KM|BmWiDk`?ggx#wgtF)w3ws3yhGVLwK}Cb{u1&({XN zcO~-V=0L~$`=z6!i2L6z%b)es7g%(*RoD>MNy zYJX-IgGTfoId}z4nG_~9y2JHO;)>}wu{*a|YEQ{r)oz8CyQMwruFp8)rb@)T2U!sf z9Y&RR&2WROv*o_RO@7P`5t*tN#IFK#&&~j6M8RZK66?S3=Y}j%p-@!oyadj~s0FW{ zfw6iaxr6k$?=XSU9gic@e^E@U8ibj(i~s1 z-RK(}fW037_F?rP?L$LZAn#kFg-9q48~p)3t;rT1o!-L)mg>|ScpX5%Mv5>tED4(h zNpTy6vfpoIrW|Qzkvk?aA)o+|r%Z}2_U!J>H+ORA#WAWb^H5AcVE~5t zn9TLCv%*=@iwxJ24RQ*N`IpD2VmwHa{tzDBqqj2}Imq;9f=pM`?142d4P(I{7*(~b z9f1fM$Uw#^o(5STk4}o0Bu4gL9 zXCAv56Qfq^dDv!_Vu>t^2?;M!Gq@8*Cn7@Om+9 zvU!P${UtdQxOS1DuqjmmZ17kB#gI=`_KLKa+x-=KnFShJUxIGkQN+!T4U{*+83 zbtC+se_+EecGAYH_Tjf?6xxt^VUo$c`Yb1CDho1bBDdoKYgV;{q%A8i_ zWZao=r(~W{k9zL9^u;T9>2nlif4--27BW|R3iH$m=zN^t^bxtw!tv8{RHVZogJ#`Es=sa^wh^Ycj%fMi{;)c(x@9J_!X- zh$;~9jfQ*ml`z~M@as^7V!p<-cEdxGVBRR&!GnR-$QV7vZqwweTGJ>U|WFlD~Hve_tM={3flV<{L0Ds3g^mnABPL_D&V6xC{_il%Qj~PgN4@Cy5NE+A2lD1 zxV_p(UQtfLSHGl+*hk%Z42(@WrM1zIw5`mH6>(vfu($q$VO~LH_Yy65kiLF1XJeU) zSm4luTVdmZ?ZV*CJROxkbVR2Z3qBS%tIQ(e=xcGiPD2}g#RwOFsC=$pJn}{;{4=f| z`neH^337y#V$WzZNP`aBU@)-c)2G`PJ5A|IYOJnw;ETh6b328&M4;)=R-c^x(tU*8 zgaY#6Fl;{`Ma5-kuz_9&g##0ad$^6LPGZr|yaA!82hc2mdOl?;vkL6)D zexLf#763U$3oTW`hJW}xw!rold7MBNxJrXWx42(+y zySaQuYwNVbcyXEHE%m-iV3=+*5%MP-P7^U*;Uv)eTH(i-erJJYmTa0$9+QVTY?flD z80w%m{gm%!s8uO4w+`=0&iZe(%OYYK;4G7F9<#NhM)BD{O@eY04D zmsXBb1AIGpeFS2H2mzx?m%wm9_H7spqF#tk3v-t0`P$&lr^3v)76Kp!SFX>t%kO@B z&&>e0JNpR*z-kFVJkr4+k;8{>$z#-Qeg~>AHQsyvi5{$aU$)H5u#Eg3S_XAw4m>42 z`4GxSoQhg)3bpUv4MhFw%DpeHD)=#J0eha^jw`VM0H||fil1Hl95CIaDe4y2_Zk9m zobT+04{f~PS4w+Cay&&xi{sPgBfB#vM1?u@7!LD<@8bn2phQGn1G7!Xy>FI*$HGeU z#u+*ov+gyAH8!=E6tGdzSL=RI=>g`8flmW2-gzws2ZuiCZnJmIP+}=FfKPLrl-6f6 zGrPd7%LZN1|EPQKsHm3iZLqs(l9DkXNX|$SBuJ1}KyuDWP>>uX zDoE&7u82y`8AUP(2#SC}t4Pj4B_lbAMDFLar+Tmmtj*ni0OZ0r*h4{G+8a#D%8* zNlUf_R?UUh6r&%td3a4c5}JzKI^$@(sQ7gesJ(?*@A0IH6DE>?}5Qwi+UF zHsp>EvL50RTi63HH=GsT89VeK-I0|iQ{lnQosJE)>+UxDsf6+}+sguV^vJ>8yWu0Z zW_Y!wu~Nn*dvPkyCOeR6X7OtQvrQ(zn=Y> z`i}x?`+$QW!(y97tX{OGVMB?QSN)gwN8hFFKILjBLPw&LlW6Pta^qYXbR|FI>=pf# zq=Mq8Shtv#{h8*ER;tJ@#8OR=MUn?EPKjZp&Td!i#x1AzD7_a!h=k@=&1nT9KFb7= zyd=S&5wf_b)xVH@7fP+oQ*2oy>OD`VFu1-G;NElj4Ki5qdyJ)Ropsqq-EWrNP`zOJu0ok zc545nVxa?zIOJRD>TI2sj0VHjq*yTeEKZDE3YlAJT^c;14%`}<-b)=Zf~Z5>97?5N zC6a!lv)sjX#fZa;be?TeS!5Df#+-5^*r=+WjI261-OA6H>~&$9Srl6SAjENW zO~SfURSN%o8mNF$X}v2&UKQ)tLJQz7hE>zW2U;IZ%)3morCsqs!U2|(O=bsG_dDB| zUccqGzFc1nS(9RB~ z?R&eMNn~D{#Z5z799BH#xVIFf`@SI0P62LeS*OBl;&}`ILtogEY1q8P3!U{^{*vq1 za6(f2WBXVxAUjohx8eF|DYgy@@;DmdkYmFn;^X4fuQ~(WB#8%g1wh9G-ILTLcyVh^ z6l61q*LqDF=odji_%Ig6nML*+1~egV|DocMg=U#n2ACJbj<0^qiACzPS?*gTF*wO& zpKb^77`0FHV1;01=tEXrAG7}~Fiv#QJLj=Wv;Jrzt0%nJS@2N_Q;y}dTLfADrJL`5 z7H&GeH{LpOAXK>8K!}@#s;1RJyN6dmixaf-E}mU;2JK$VQyL|k}4d?n!@ z-)>SB5HcuoY+Y8F*rkp$KN#<$BETs&5Bw^YFG?lDhp!#KT{|uqgv>v#x(uo?rbju6 z9xA`D?pGh+775=6 z!-T9KaZf58rwv5#isPTLfUQ|WJ4P|uqomqZ@|oUqa|TPpGTU9K8^mBOXfGPcmHAqR zlBCXj^81EhEfWsE>t;B7s~ftugstgt%gqT!uNM=?Nx9po+UiX?$ZTes9_Lbiql4(- zs@Fm=kE(5-;+WRtMigyC0hr_V`sM7OmWF6vo+*`e{_iZ=)72bVYk^&W7>v z9Hywh?7&g#VGed9$&81K-z;b$hd$(&Wq@3Qh)^Cb#F-`q)juMY$E`y6FL?XQdV}JX zS2Nu;jV{v z`Q6z3K${s>Y=+TJI;c0zAk}J7pK3Z12-@4pu@P6t7jTF;GH1e(63LGXE@xW0v;%p* z@29-DN7^8xb}dIkNQp<>yL1^ zO`t5Vj=mT@*HTWZ-KzzvDVPnn{BO%a2EF^ZV;s2axPeYIVy<%SyGz?*G5OjVGJUQo zkszvP)=2S@TKH)V+*~3HA-{Jo4ODMMAaq1vZ5WRj$AFFcxFWt*Y@GmtqM>@q=HeO~ z)9@kxq3dPI?v78|l-Kx-jf6!K@W5BW&w>jYg zK4)ow1Ezu7eb3d*$A73<6R^m;wtw=qepMMBK&Xs81%Xo|TlfAx_YA{amwv&l1OI#P zrKaf@FCsLi`V(pK%85Z<{+>c`aPG;4x2$w8~h>4svLtq2h3hAvk5W*F|1 zitR1(fc@)NtSq}KM9J`7_V zfBYoCeT{+PW<4R9GlU0ZTY}$Ak64(AaGF7)9YHLuXY0xgsuWRLF%Ofz7C&9 zvEN;afWSO=(sOcwYi|9a^?v1`-;R*txq_J)j|+?2Y2`fk{L52iGTdN!(opO4cV46W zxdRvET_hmWWkKXs_dS>IBNq>U+Wp3kcJn%VWbM1--szReXrvfgOvzPCbI%P#38$xz zF5#4pKy!EN?x)RK1$045mWhy3AAb(0E}TA$fP(`yE@^gwxBqm@o2d_|aSX8dZRn<1 zBw(EOvE!}qK}G61W}{W+o>`i0r#U|NP=`++yPX#}T54pb*Q@T$?#V8+CnHR%aT~O; zZ8w@(>!^`hsFrCP4Bkw&1^v>bNfin^Pfp#ycIJ)yT)}oKoU2`YQCyVbQjwMW7&J(j zyg-go{Koc&zrpo~EBp81dWC7xH+!kyB(DV^C>B#bK0g=z z{LUR(k@hQ~L5o8R(KhD}x`Yf%>`xj`$~*9lC!eIIUZxi7RCY0@$eA%qdi{7(qLLMF z2dPM&wX+HEB*uuDxSRw9Yi_G>e=|YS2f2=;e%i;&Wis1`*;+j6lTJrkhg&I!k1@UH zwNN-O(bj=IOqdNnwo!Dl)Ej&^3<0UhTRqK#54IZp_poOz>}GQVU7^1;9Q3Atjs5Y1 zfiK%HiDxP>U0!>(`Aj5y>v4oj_mK}PF~UWfO+~=QD?B;N-=T~hqM!9NGUP-u0{_P@zdhM z3oee~-$KQa+HbUG-*=X=yPLIep}30(De}GLtyr$z!pSy^o$Sd(ilPvG6{c<`)-PH= ze7{409@%M8yQ^4NDN=aj<)3H%JT5E<8xNYU{!6Vf&NpJ*O(xiMO{i5D?855 zF7Y5I)Z8IL_PX67V8BPAe>|Fb6K*Q7@y#LqcfTtLwsJ?#CLh{zeAmEr04}=y=TWja z^o&x8h1|QH$dn;+$bfLYaDN2!)4!fVSS^w!HXlw_XnOETK-#0s((_+T4q+UQ`bF?( zi$D4YwGlR}{<9#NU451oX8x!lL8@ROYAHyQTNa(W1 zMKt=-lCdN9X+`~2<&k_Yr0QRqL83WG=eafefD+50nJ<2JVqy+4kN&;poJfS4qMV#S zU-C0B+O%Fm%Oi7Hf#;uP{yo3Ui|`6vEoqO@&snWH9YY0);Q4`Pfvzret0!*$kM9SQ z+FJ*5$><8aTW5gGqO{VoV)xP=Z|9o++kEn*w0nfZc0|o+eDR{95w{r?N|G*0I~b`xY#~}n@dI)t9)*|QI_jc z8u<|*(h_}ZyVC^3Za@1U=I+2!s>!uB#HaQ8Etqee+-O0CpLg6(J#59|A8Ln^=s!go z%DH!KnMoMs-O255b%o?5HEK1hi%XTi#HTp_v?)4jXmNW^)wkY=aGt~FFNPij=)|rL z-mEEdaIg3u1I7Op+-V6f=C(t{BYWa`HgTMBvAzZb0hWI+(hyVqA>iVUt z8Wa>ap?i`W{pVSAA!t^A8--;};C%yI<0Ntjbf12&B)ZGAs5Jy7^*`px0$ZZ@+cO~W zRqy^l!vJX;NeB(4dUR@bei=n{88o~ z3d@r~)vAeljvEoe2Yx`bXSoX?G4%ibcxE8{g-A)s=OVRws1?&8X0qwn!jv$vAAbt? zhnT!MGMRlhmp3AW4%)%9nQU9tZ{=TK`}Yj{=3}606QJu6l zOH~=RTnXb^`BaKSN4 zIp&UBKAfOclmm(}Qd7KJtCnS*&fTYfl3J|)n9ytikP{A}&Pkm&Z?DxdJn`@gM zKMyLH^~oX#G-6nV<%BhqBzk09}N%5W|R$(WuGgk!Oz!H5a6}qjD)} z?gM(7{WEpqr(8c_*0}|LRNn3%Dj$K{TJEwP5NtP zJoTONaenhpb$i8|vV$h`Hdpj!e;lbY)+!}sAH+(X+gTw$6UTXPT{5ko8?@CPpD$v3 zPcC7pciyaof>aleP53u{c%bNedE>t`Tmrh`j`EKii z|4Xz8VMnKU-${4=$vdHLLoxS_G^b{Pn#_C+w-x7+tpb#)hSP6UXe~q9nU9RbryoZ+ihJ#}~ zitlKaI0 zY^)LD@M$tCPmD|J$W93;ml+JQ?8YBDMAx&nWKd(=RKz12%f7tt31zN)6vTe|{Xf8& zTDl1O7I$~47D+qEnMBa?A0Msi+qi;-*tqQ9dMISP$jrTpg~63SnF_N?`zzVmbhz2E z9kh3s?fz*8_u5OH`{mIAk>NE2z0;p%T)vAwQ<{!j0E4u&!%WBI&bKzI%a)T(GLuEo z0=IfgqO$7N!7S%feT~JAAa>PY%?G~6==QCbp z_Sn-sj~FWETuOOY{L(8|LF>4gQAl?&bIfVZw&oYfK;cp}kxR>4`!UnZ1s(UPww9T<0LbDw zeE$!Oa5AIMqXU5+^KM*oCL1m_;QH68)IdZdtL34vGtP+eS^frMjQ}9lpgA5ocRHC9 zCvp{m$KH+dSTG4dQIvsh^}q4sB)b2`2qtqMKao4W2`HPU9tYMQPj_nUOlso|%gO^j z&5ttl_d(ys7{2?x`%z@)Q0+s!`|&7=VdPPm`*FWyT0`O7c+-zoa8?t{!T}955N^@{ zJD(d&bzgUIK@)cAjJo zwS5&YW%s+IsVv_>&!#~yyyE{Q)N@>fb42Drw$qw@uT7WqTf1eFdg=-W0v3mxrU zRBG4=D_m!KskhJx5uO#A8<@OZB~~<)-dVHsM)kHGmsNsm-Sm#5NNiH^)TEbG^J8gc z9M&h?t(Rt$fe%3WGv5Ua_h13!rke$#@81HDVt6_Qz@=13RCoj~+uAMxw8i_E4I~TL zZI69T1Ba#=`QJs;yaeKCzFs%RLwuOh6+?g#oi+>HX7XgFNXBm51xi-FDxIfxr2z<6 z?QY#x{d83DS0(Cm$JaPVAKBUoRO6wI(R6qn@XcG6mRkUueS(Q6{zU`eZrlt1sie&B z=9DjYTyZDg!$DI@+mac7^aq{2FpUQ>CksgZFLw`(L-xKG)lSC^Wid0hNVTd@p%QKPiO^BR^;+rP zX^e+jsg#7+j7%B9RGTZ2c8U0Cef*JspHS`rzQ+;8%gVw~(^GdT8q=R$Vgzd5mIM3y z8HMrAM0rz6IX2PQVs#z_#i%A)-j$F74ScQsF5Zm*!7ZWAL(A?6O0794gn#A2Zpv|S zLi56r2fG}_e(r69Bm(UA5=T1!VS!CH{xUZP{bT#1e7L_Me6z`FdU0})&^bQoOy z($)6@14M}Yx^0mVxq!0Nz)R;{TiVh!ZZljx+^#rf*~aVeLM%0!w&_&*jp)J_U=Eho zFS1A^Y-?k&Y!wYx06GSRtX+CBHAwfqN00{#w`;xw-}JeM+uVzz9q2X29^b}6ja3M- z^aVHEa^};uHe$c%=d66 zDSifMP)@wtQSb;txK1enBXQ|2`yY#e{FlWjt2xiDfw|4nbPva1VTasCC8jv^;6bt2 ziNTaATYPJ9Z>>7J8MyRfndZCLMK`$b5L$(Ed8XxT>S9aH87jVd9$W9(i{-XB5{W-} z@V=HA9BsiBGp~Q;bTs2Qri#Xn=RPCiA}PB{Id|nu1w4D6SU#9%_9UWpiC-cE_dZ^) zt|)_!9d%M@)#ISUygHY47ffS$)tewy!#D?Qeose_8YJh7Rw8S}BptZv6_*643SgGF zr`1P^pTs{xU_I#$Oh>+6HSpsb{wu1UM99k-DSFSF>e;Q{bKU!8`^;rJv8sk|0Riw% z-%8of6I1+VneiCRahYCJhyBpV>_p)8DS4vLc2yOpdynqk4aM;ToMg6dW!A0Z)cfq$ znaIqj0NhfIuNhk@Bgzw{xVRc2hNB6|fXy>Dx$fO?W#UO7=Et-#^LdUJ zC)FOxt{-#wKKcQ#;JAU8@u~guzpxwzo;3eTC{GAc(p*+dX}?DX0eCV2RMCU%E&ZwF z<)NEz40}NGB$9$v?$V34X6)uTuVeRV+^1%Dc+LEW|MB~aMPlbgzk4mZ9W-5LOhHWA zjEJ_f*;E7IxNZ$dO3VSY9Iw}3v-fXc`6wtB9?nV#Eccb@HN8d99_gfuLc&uY)b$R2 z!YD*VUIb2j5oK>kaVVtQLs8Wj(|35O(*Fz&4sZsZ?6H9sO^-RWqd3ZPhF{b#c00a* zmC8QumCQ42cvM9@OYft9dCr{4lH>nE)(Q#`W+jmuUTx@Ldf?;*RQCMMl}8cLO9#yP zu_Iea`0FHu6&-xDGo&!*(2i;MiRtk=bKbY_*NS6PS<%?OH*iPL{59XBs8F>Gs{M@J zwS2cKCiZGz3c|rSb32xFxKw^Sl?*uW>-V7*PxL${c|PeWdsG3iriV8d)VV4R1#rax z`R$Gq?ZfX$anau<;BBq{r3f3}=_bCUoStb}y7#!kwtgg*RfbIapXgb&#rCgWc<)aF zgey>tRa&@SJa;B1yNS9`1$T4rK{7!LKn5q*9F1+ewYOCsCA6V1?9-nMlD2u|PL7G} ztXA>A4T^;V6a<21rruJQ&d=Fn0@iQ7t+(sU5X+5ufIWPenMe#b-=+O;Qz4v7#!^%K zpHeK8NLgP3NyYN~LMHdaM|T$^Y@Ufuc=ej&i@yNR_y4$H4BnYc!SZJGeZav-ZD}#h zSMDooaz4{Ed(hY8HcQ6c`+_U_U1I-5%W$Sv-UdPo#h*+o`Y7cv%zm#mH)1q}ok0FOau_o~Ox$ zYI5@e|2d_OB`i_#J~xadywJF(amwet6GPhW(V?{9drkB2_dZe=^$}?`&zHMS9V{LO`ORM}{?g+Ky*ZS6 zNQ8bIzfP?Dux8MGn_JKOqUA!2kjaBG|KO zI-9}MAjCW=771MdvdpHKUsjRA<)=o)AZB=6QSh8OJ4=thU+@$4Hc!>e<-$iz6Wx;> zvssi0N89p)Kh#3G^I-TM9+G_9fC1tcSkhaQp11i~r7GD0i(moqK@~Ca=IeD&%u_&+p?i0 zI-*^BrOz}2Z9(pI+ZH~*#omjDeQm>Ll|p|?_) zB!ispWP3|49lN>%Qh<1nHGb~`ga>KnpDe0Ui~sh^@(=&uvssavLSrH5csd(#c5tY| z)7iY_`okr4{<+o(vCoZhJIH*;T%r9=%ycKqMwQeb{j_SJNA?K4C*6Wfl4|M`&(iNR zR6VPYaK8e^xJviR7tk+=Lu;3@2R6+&6ZO(Km;3+jAOjLK&d)#hXepNmi2Hx0elbpo zktMKN+udn%u6o{ToB%rPc`l=7iO!~N%A8$(C{B#wyv3!8Z{re%)-F*y&L&|@#7cGv zvuEE2hiQYJdMVl;rTwYCpE#iEJ_Lvb=H%&V(EdRZ8v^hHWsa$9s@W3hCh4#8PA;W| zg`vf-LS*$iuI*$xrXIYSCKV?LK|{e!l_~6|qMS@ii^eY+NcrZVXupTr@8c4%tIsL_ zc;hlHc^6M+rZ7qKN870dlfVtrdT6>I=T-;*;<&q7k&08dt{t`r)H$n-&0^XV*R0{r z2XFqF#M~8q+ldVr;Bb4+5gd>J`;_lLYY@Rg(8NKW@m)Ekg}tMyWcw3u%z2Eg+FTB_<&PVmjM2l|ntAL|mk;L95D23g%p+xXK{(e%8 zz~?0M`cqN-pV_CcyrFP4wXE~;T)b=B)v)5LRicpij^}sdX@`+?47X`OdBK8oKFlt^ z(Lo46V=u81;p;w&@Xa^R2inVnlw8m4PI>qas}JPLAAw9_2ryc)$<&<*WGiWLf$)fy zsb~dXQ2~0VfR3uWuAg7VFzq#Un=9p>T(~9Pgz4ys3Hnzh`+i&Dsa;NWNM-c|&QHX` zG6y?ELuTd0(wd2oSJwxXTKPMf7u88XTdw|N^e^$VY5RAwD;vSDG(2gfSd>S&`6fEU z{FTL+_Gs5-R&4{gI@Q6a*-+1!KKg8bekB=xtRN1Fb=7cgvc9O@0?y&Vqzw@}PN~}> z*>gUBkpuh09l-lE5fb`SkC^pEwJ^xu6wS2lK@m9+U{0g#eMRh`F9N`A13`35AEw5i zB9c`&8(z^Xoss#fwkz6A=EJeO>iHxG+?>!5_+~ix&2W(V!dIf{qR8_(KtdH%-KMn) zzl|ifA5Mk^5Fi9(kNK*0##Q>>-fIWvyZP$~iruZ_xmK}=ge_qkd>cGdz zj)J{i0#&g&Cvo4L)2Ja@$*uW!9c@h-w+|U0s-F9p4@OD;REcMBE_uk7Es=UP|5Wp7 z{G9-}P;C5?o^3m$0$r1ZVWlRbfqcbicCT$f#l9_BH&sJ3&sAR2gSc3- zbAVn=R5b0=`n3qn<7-#b+yh!JWy|18?}$*6cK*C1?vEB?LbW&FBr>kZ^{FYKbXl~y zVbbSU9A)mN(lV{Mons6;IuqjlnFD08ESOt^UT=C2rk~tQZem#T#qI<^TSZS0Q-=v) zsL{NBGKPi1pCOd+0tH0ntFl{ca_`9@*2j0UMvgLuQwr&j9-vWnj3?8z;qD=|w@Dl+-x~D2+^j_#YFh?ssNlAO}7~n>vxV@*T!DkoLu|$CnF6z zl<^^m3>YS)=55kj_>VSC(EX9gNxfd-<_s40m0{3GzuE?ZV;OC{JblG*^FY2=&HEkEvO z3JF`oZ$D;b0@JjGg&ebMT|KzqRc*Ai4C=F9{3TiOoR&&Mvva zEYT{WR0FlT8FcCk&rd2K8Y&R)a|5Ih}?9HCo%CXqj1ksJF~>KO>5 z``lKhS+&7|HsFTt;?vm6&WhXh-;8f$#)A0GeW~`I2d`5W&!6is5!lCw$~>dY-fNRvZ#|FIrLerAwC zYQX%u`eKs@^*bi>Pb>!l_4QhrDezrbVg>txehfNWi6So`izk2sxb2lGy>pv9r?|L) z>P%sN!*^9nf_~V?P~jT}!MQsM5DQ@L3`ouqvUkbDK=pne?$w{@JKLS5itcfSDA?NM z^1pz=E`yNx0(}^mT`7C+Z?&nDqGqj+vqt*nKJzA#_aPAhBy^(5){8IQfZ-)&cCrETkD&6X=F zIThGGAE|=lZUU6dn*i}fFOmV{;Oj#NZqGAC;L}k-QrEUJPRbHkj)TlS<0@u!d|$3# zxH<()PZ6Qi#klSN1iO=94rzE-U*A5jf}OS()?|4HrmN9C)LbGbM#BLvNgQVv8Dbra zE~#9P1)3{TN2l&jpax%#ef9jn0EwFYjk#39l7%HXsXZnGJEBEFG7laI0rb{G4TviA zJJbT5y-2Zy3}kVLtRDKs%iH%P0NSxp+fGdw_h~OZrqf}I#;Zv(aSPQxyv z28%rs#!p)TBgB3XJpLJOdrp5UnwdP}B?v}$SxOI@hiwH-omid5Ax|Zbf{LFb<={8L zwN*`O({UKR$l9MQi@RI$V9%p!;tSuk)2$)sO`50u>&Zd{#s@@bstgs$TD7n3EW+1; zQN)g+nKww^K=M!C9AKdm)8Bae-6+ctL|<~!=ChEPQII^ud#hg9bBqFRr)>!HTe5zA zC4I&0+ty3LlL(STqQGsL|H|TgLOuufB0&VUF0_BC1Ntr}#jkjo44GX85DhY-!4Vul z1}uBqm=|vil`L?^1oRRciI{q26kE!t3WOMpKJ2mG=zSMyJPf*0jEXt0)&VE52b2Q| zDzLgEW`Vn}P8zRro+G?k4OHD^ovOLMImpgqi1Zi8szWz071Q@dD=}Byr2h?+|P~!l+9#*C2&b@s@EhrX$pro~2jK zPxFDfslfa;zQ(9)x&9Gw&Qn09^zv2A)wTQ2;$!pGiBT>}{l5w{_bf(< zf{WZoD}_ILfxrNrMo^WEg*`Jr(259kcVP`B8Vynwy5b5y|D;(>0W53RQ`?z{jSHE7 zbO8q9%w!*UxCikhaIp({=a;~tYv&Blc# zE5hpWJ^YntdRGU;sb*jO<7@c##efv4fbJopafon_HL=DcSs)ZYSn9EyU!%>*2m9k7 z5(Gs{t)eR;w8A-SiPx7HKtifSzoAfec;JQ3r7sr z02A;c9nnVS?|f~S2uUx~GH<6zMADyv@YoNkr51kpNANe*S$r>AS&u#~r((h~h9JKY zWTeS;gE$p*Rp_gE|NZN9z%Z;?SaxPc?# zP9e%?hG+<)t=7cENt@35{dGPOY>O*%PD{6-Oxum59ee_}I#d}Tka^f@ydDY4F7waP z)mb}vYWr{7Ul0vLx*aF<$cT7}0IJ&REL^;ia`qq1vNyFd-4|(Ro`<07?p+Mfu|Xoz zNEIHBz78rShh!7gwII^IKdO?qnudGHFKkgV_|jv^Ax^#-44BEzF3(9{zeY~QLyr1p z)ie(%25e_|;IPNE-5a^hqP}xP_Z#p49jw}lq7hz0dPWPOptDuj3+AT)8rqsMBbUCW z%WOU(15%c`l61!OKY^*}8Dc87aOU*W#sYtLU~W$|CpNzj_ooMDZ3ht{07c^w z(N}=Xq$7q_9bi7^Pbn*aI^xL$yID(JW1jh#cQ5pTH@Q?1OEytX&-J>L#!+vJh1-wR}?vxrEUM1`7H(rL$H`rjf)&hlyy2cu0o{s zkMUa#ktzT<_5qD(Js)6J(m9HkZYDy1J(-v+NLn^~xLL6`xcKNtLiN-~_E8g*=mX1j za0;yGiTEYqW(g!QZ#Q*1?EWUh89?1&)d0Gb00)G3g9`Q#ce12vEc1%J)_BuJi$^SA z`toe0)@#d-L2_mLz(#buROCLDg4o|E&*FPH{y;a1@I+I9Sp_g~RVf-%k+H$K5a?9< zP4D)xanMJ;bJiKQ!NCb%RIxgK?bn%NauV5DwCQ0Z#F(wT`M}*dPr@^xefcVTx_4Iv)9Kb(=(D4M3>C2%zS9Hd1=JCPI zQ%s7{t0p=iz|68tea|UL(P%ua2KJMi9GSi}2(6oR2(S;cWf{smu>?6(rJ)zocaCPT z7@n$w`VmOv-zNhqo(s@g9VVTTL;(|nSOSzEjj-*E(3;U0L>o|;_yxKqdS4)I|IKf0 z(2sAM0mYV4P|o8Gmw;k-L0axi_VUTg{t;kBpBn5CQ1EkAK)tcc@yEjfSlw@`g|qm@ zTWo#JcE)=54cK%11FvhR8H$<%d>qJc?W*9J70=~wpTw+WK$-(c%J!6y3kf0U3$sU# z7L^{=pjUb7`5J+2O~n1@PeJe}%K#^}{`T3QO`O=yKD+}0s?*wqSXKpAIEY?wSO@z~ zetFH;g+OHe$mAx*wZEHH*cB#f)|3|I|HteQnQkz1ShoZp8LO}d%p-Dq%ed|UxW!!9 zM-glw4WRB8HQRst1&@%$en|ZhBmtuSNa`vp6_=H%&Ufp*-wcrIgE!YD$+7!9mfq?G z8GsO;%*j|9HO&iIzk+R=1__V7i=j6W`dI{J;$cM|wmc}@#t9KKb;&vDD$ZkqR#`^f zs?YWF*1HVPiA3rYES34+OX&o?*Q6nRxsil=j}V-s_ec?(31P2JKJpHf3;_X0A)(z{ zAkR3d!r>UmBT$TbdDH(p`lf@O!fmQN22_%Ucgp3BKRA#~NBHb}gW@}jf1xXA?5}y% z`x)DN`~+?BQtUQZUIuj}!ul4kKm_z3fmc->(dFJZNh3s=J@5h@diShM4kgG6y=^;o zg)K;86A+%(zD`*pe}W-PHT}B8H9w0%qQ?G3=lDM z@0^pY6RaH&uZ$(@tev5?SNvqXFUSDVxmRiRY)x1Uj1FMlGZqYdfBN4u<$)6^#l_>wy+@Gln-@F(h@TUKf&M$phVGF^f9gy7t zDwIe`hXM!Tt0elN2MZ`f;2m!x zGPpwsgMxm15=Z!zV2wvamX^1Az7y(TUcr@b7&jUzZYolB8`+SX!8yQx(7cVdxuM)F zV#1wdBXaPqd}qvHCmrKi_^_a`x}e6X|t)>FW+-sw7r zKwu;+NC+(LO!ItPgWt;Kb8srJJ&XzwVD%O`_(NQoRmdG0@mh||?gxGPhgWp52 z==rpi5nQKbg9Vk)iXePxKpX-@-VMig?_%1y+6B2;%U*?KjWMJ<|g`rk1x17WN$nWfgAS7)o_da}< zWd1IM`+P~V9)zcu;*47}cI;q;i~#ZJlZmiQJVD+*W|JU##?!}cr5drOb{cYB-@^~# zr{8=AWpj#75UMh#A*>mjvQeNQ$m%0-VqB!@H z2~n}9f2`HAg@`|89OUxxsyWtNKGzbifuWdbRGe%>SNkbe6E}DXoxLD)4Rc@}pUz>s zx3FJhuy1GHdR0Y^7v?V*BSO=FLf=Lao`UH5`JsQx?gG;SnnbG4qmGZ8IOqd!{#v~m zWv{BUNm0IE-+Q<7*&$cL@hK~wZgHSF( z3hYrfjP$y{SfpPO&+jN# zED6e5_4Mtx)z7-!Dq2Ieryp?khb+ixKAH;Bs2}t%`vz6b&3CvJQW1<`fEO|Cu6*m- z(i^9FXm#WjLe8`ybmpDx>Wg6F^!U}DOB|AW1JS;}R~A?L3jXr>DT`aJ7s*ApdVvd` zQS)0#es@h+=R$u^aW*e}wdKdTc>dXLr`@b&i3Qa2K)nl=P2;ni=|(L6`>L1Cf;c|$ zy7jgZ-0B9_OMz-6{3R&68uUwTZ)xAmRHpEZV{DxL6giDcory?px=_*_Mkr0*sWQyvJvquNbyx}{VQS&amujIX?i;ve-6Ruc{p9myub9r=#Zj|8XMz! z*{p224>ANG#-8S;>)cv62|GZgs}(naw46?MT10+IcguR3I1gq5MoLn!WiOi8@oa+c%*;HM_w6Pk^d%&6T8CX6YmK2WpPkYD;(Y@txg@ig`i2)#M&yI$JShWjuAE!V*1UOr9A_~uXSyFBe=ZBufr1Tq zNRr6wFJRDK>MZFqazh@)+vA@fM!yr0mbGT}-|V9~Phbq<9FlP`9y2>0UVU(ZEMwoT z*6XKd+C&y!dg7<&E&bz8LCSLpE3PtC<7~%12FX~h^ecRLsNd{#O-tC~2w}!q>6X{F z0{S@%r(kOeem}J^nnGy{hod5V!A5-rs}5;qQ!Q@aD<~Oo{w2w)T?WxMUa(Px<6?1X zCUUgWu*9Iw_LEDhpWccwmF!xE)Y?#<-fh~VFR;O=!%y{$%pQ`Vz1?4$-bC8>X=GpW z#jcBGA_b9s6(UK1uGHaT1`?boMKX@(2TcbVSxWg0VSXyi9#%}%@?`jpxhC-g~`O_o{3~%D>=W1I>^OB$i zRL!v4<0JU~vg3spQ%ULYdv9yBsg<=OgK@iTHym~7fT2B3eQO@dF|;m!Wb31sU1=PG z_yXIWAR_%9Q2Wy-dIZTh%3Bq(DV~D2#9OD-ZF9I`se%xj8>b+*C`46QkqF?2%{R*) zGH+&ldO{<+p)u#`G><_)h!>-4u+4=9@m<@7Me>1fGT=L$Stt`x&RKd&@gtY*RgX#}@ zyQ@JD9#%y@pSs?TU1K?Xv+MI=!f_uVgy9|$qTI%T7>G>yDUxwNv>|3X+aXkla6)SK zO4x(vo&!#kU${%0-ML#F$HJWx?i~%ZoO))D^9lO%!e0p??1l7hQRi^~LBnq4NwZun zdiiICK;*~=1?j+%_rK?x-B9*ZTWoq?0=Z3CYgY4D=9k5qE`9vMhxK--5#eSE=CBx& z+XdWJ*@%|a6&D0Npfz)WM_e)i#DZlC6?&(cf7)C<(;2c~drvBdo2Twd1Jq zimhfRSQ4@lCY9Ym?d~C(0Qs>ijy#b*iE*gU_>3Z#H)j+>Upe#dH%>-AHzrCE6^d>G z`NW?cEMDclQT^Hw;=pLR4$`|#()kzKd)CJbFm(I#&C8LOu?CxgWE^7=sp_h4aBOb= zy{|%UR?Z8Xf%U|jwHoEvhcPnu-net>H%s)Z%bW&4h?PiQUdRvN%DqRvEDwPpDx-ft zY|e6CRO3uP><)J=cC*`7tpy&;x82>?FRhTW#ZLm#K_CfB_%lJMusLj^EialFM)KO6 zrFBuDjY;k5XRm#qc{@oKZE)wm9A3S>;gV|~lCJW_23bdbX%FbrkMIMWrPf+&7EHGg z4BZTWAo|#8M~`G}%X4h;<1fKyO1@Jg!3y$}mB}gFxX3%i4)QeF&P}XoS7@QbWrpiI zX~tq0$BSb=FseU@4Ni~*U0oTBgV7&KrOrk&nhxi`SvU`@1d&+<19s!&w$$rGoIEUE zjI~Y@F9oYa7^193cGGK3EuFnI4^gqBLtSe`(^i2{fFdJcSV=xdiyXMLG~9IV<@}4Jk_nY* z^x7#YQN3RI_$7C}O~rBcl16v2z~ajFQU&MVnLl1K5A+cnuymV1e_Pxd9KRX&z5Ea7A4QtQO z8GviQOl2J|q85E#kA|&vlY{ltoqN|=vi`ag?|~B3JSU)ZJM1*fcGdWDn^sFmK@g+h zhaY9EWe4eJYIgDuyX@zC4n1E&-e)qnRdWhkK$^i-%g=B#d8LYM*cue$Av+;w`g-oc zW!a_$iM_*5mW~aD`Xuug`1xmGInN(gdz}5IPa}MB-tZ2!Ip5pTUQuXYz3OC0>Tc^` z``av$r-xNpsks`~E{6`mtx~WT!#n^Io;8AsY zn@GzbkBKiKps4aOJ0Ym^QUJxSVP*8GB|g%IudjCBDhuZF4lFS71aw>ic~NG@(L{q~ zr`$TP7E`SKMg*t-?EazF?aA&6f0~aip8I4-<^4&u3==BlkH{AFpqlYQ;-diWC1!^; z?*kD0w5g0=B~+Kjp5pJ39@S;x7yCJI2wMxX^NXO7zIFv8&g12YXmIm1V}Z=MLIyK|0CdaBC32V6LUp&zU%dO zR6Dh?I)c*NSd~z{B)zlc5kde)(DYmz!b2^prp52uaT-pg4VAU#k=**e5%FeZTxGYP zlEZ(~iH3aPE{vaqLmv^b?@fc~QG*y$DJLWRGshpkW!jZ9vLOvZbGtlv%AEwuvCAep zm(i=Jv$IN)bS;e`m=Hw|pLDBPPJbu%>nA41R{J>{ScY&tvXeR5_jq_c!hY_E=GwYg zt@?yiExC)&aliv&6a|U8B`nhbNwKMsK%#%HyX8O~v!OuL+1uxn^r29M#)&!+T;1AT z2%2)?_US0Ue#(e4J@)f!l`3jz`6OACMp(tf_c~kcxxs~R!?SNeATWS^Diey@?b&Lj zRN4I@!QnsOHgczw@2a?C3?e8q0dmhRLENFQ0|xUeb&IbxZtpq&j6Z;t7;{>C?Hug% zDgFVqyT+$rwn^t`O{ns&ql;v6pA;XB_ZRs^VN{}7VFFab0hh9uM(U%}?~ia=lzdPS zx;rqeSI*Myi>gD|RnL$iJ1G_X*t-W0@2*~yUBw6-eY3>OKeH?ca~p-(E-ZMjERBXs zL0J+Y4cOl~ zm>&^xOu0Cey!Q-j;PhsipzT1)SN<*xprn9w?1BLbQc6fFCDI{CuZo0pcL~znz25=F7yW(zaP7r)_Bl_? z%rkS(J+t1(KKKtPTEBJOdWv@ds=uAlADl&%_k)t@?6m6CK5vjm8{C13DQ{L(*{1W` ziG~m1pJ;^n*pZ0KBXsa7xh~qcYB*daWkO<^Ap*|P4i)Q$_iCREwN^aaTKFg{ zJtK2bOxdB33fTNm}xk7H@-xcU^$3AOUkT*`?h2kj(vG$ z>e|imnu)1s`lF7BD>X)Da*I`A4#bw}fQ+8(GpgMRSctm+w=&YSxsnBO0 zuQXhfYkKLzi8tHa@*chAxfs^{`5}9Ded_j5hLUSm zNPTps*-TPt&}3uEYdL*tf|pw^Q(FTwtSh^PMX^Ln?1pG4a=E%@gkZGRC#*t=k!M1I z;@Pv{=7BQ=KcL8KSJ)cbM7qfQuG*_j^F~%UbuQ zaZz!M$kmhQz2xBtQ~tAzlx2GY2NqQ-XLnDQ3FNey{3D zHHAT2(f(8qCuZ1R#NvELUt07Bc{cm$EhE<=GZ!HZOCMw&oZrmwg5sd-YXf07_q?cN z378Q?0uS*Hz?!|Sg}Q$5axbfJ;Ip?4y?6gK<_*l-*h`qf zEbTpeMK*pyrYyroe<>J_VIwkWbWa;3 zLr7dt%Cz6VxzL`M?&mECdL(NE5txKE4GfO!b81$mnbW!y>MCR&${TlbW`=Z9;<_2H z2W!_(msB-3LB0Yuy?w`-B)0d%I7Nr``0X-N?H3G}2n6pSxD#VmWR

    Qv)KIn>u|? z#q0)w5*Bhkp5h_5%N{k0eVEF3(ArWQTsC0!8%*|%FZ@U3et2~u@s9#scLb?i7&>@3 z|3ztBgZO0~_Hz=`)FIbZ1qTUW)up$+)vrjFB)TCNWIa=gY`$cKiEyxfi12&wXbHj?sA)a zA~R1#-cSt?sZ+7I&lqD_Ix~U0RgcYyIf*GJLxLL+GhDDE#28+0?_hL`3Pwu--o!!o z(@(9dd_*=8Zt3oAxuSxnb68!nVD-xr&qdcY%f55O`47$^F6*i`jkkN@s)X;Kof-i6 zd0YZ($Z?s0P0^3uHpVSk$WyR0z(_Ap@k;GeVLo$AP-guUg?>DMT{Da<4OyB!UV+Uv zax;hXaZHr4OhHPG$anC3PF7CFw_-492aBI}=PPEq5ck*(Zz z+fwllAu%MwuZTa|IysIiKPrarv9Z{9F1*lobxmP@i+e>FL1`x6r8qeA%?sz9;3Z{W zq-8%sUjE9%U%u-eB!(t?XU(vk&@<3pl-Ot?9=Y3L)%|&Ys`omiEeRi2@g-wl@0_^N z4J1jlkHCJ)VCKs8d7a6}a$7z)X2VJA(=zkAbgiJ6Rt7iRaX+t zKoIs-t zS?o2Ja9<%(FX|w`5PiwYhUOF+BC5{fNF3*DNjyY&%_PCayU-g8Ub}W?h3?qmjbIh*DOjDa1nsM*> zmu@4~eis>rQh<@)!#I4D-#jx$T1d4$4 z^n-8~fZ)UUC0s?Zbl;{$<{aBLzJbA9PyE{LpTnOF!-pSh&S1Qp%#7bU!9JYftuB=* z)+mz$kvq<}S6QMz*fn)pn!dcETkJWnFZOUDGGhv@0j`@2`uX96!ua)tAlnR;lQrJh zFHq4vVh};sAwo%^3^1EvUU>Bd5?LfRh~Z$+)@s!EEVM(hY&qgK)NaFm>!v9~%lNVt zN(ZPbyQXn&%leNtU3FMKit@^Ym1|wY3Tv-}&tp1IL(2ri3%(5JsCa!`2P&9DAB)y2O%kvu zU{A&}jn_MY2~fu&W=C8CliEyqgMZeXh-{gRxAAHtOdroL7eND?CZE*4s!!0|wveDK zqL6=w_`$P+_Kw?k#J`y>o!j8Ajoud9(|>1f`1&l}`QcD(h}6{f>yD7Jc~y_^&-LE$ z#KQpzsf?|;)^{S%0kIK{Cc?o)X(rIyjzX4`#(x9+2H#yrS0^)mrIWD>@JvWudA>T+ zbD}OTt#Eb6MWSvpu@`D=0n;O!WOy}PUpUUVJ}jU^@JW5PS$dmm;09UWFh_)9m_qh4 z+_lPIW!yzi@5+q*^(U9fknwP6q<|sM$P&+M^PMs-^B6V>vSvl#0^rOamLdQ3(%x35 zpi&wb;Dw=M-`HsEU)v{}d}QosnG#E%t!CmL-t8yBw4MD>4H12*fwR0rD_K)1Ft%~1 zM8SX13cDH?ANoADQDiUaR;dC8t(}=NKEqt0bV@N_^~D4HkMY8}`d)FXeC4_(3SNP; z(F>-l*ulxq+5wA^=n%8;^|GMpg&oZvQB^V$cJy7t1s_kAK- zsPtl4VGz;uIsrIAY%SY+sjL@jxAC`wt!7@nBt>E=!615PbUE-j*|X6$FQ>}TjVTk) zgCIr1*SX8h+Y#F>Wvrh-7Z|MRq9; zWt7-E-ei7SKA$%6WGo**>4>C-X4&1Z;Vhr8uyCQ}XO%sK1b+P~CF7NqQ1xzG6)wI+ zP*2vJdsBlLcsKC?Ov+zGZO3UAduxJN!2#NN_-FVrc2yftd8`mLM@d8MupE)IzAkU$ zM?HB}K~-EYa+8;k^dQzh4EVu6-{IcIYn{bni~upz9tO^Z%M7SjliyKn6A_Sp*n7T) z@z~R{aDE==l7wIiM`C!@s3Hig#y|PeC}ic(InOX(J=gz<>=3v3J(ugy$ca*ImhvZH zr`)^)H{X^Jn~vX9V2lScd=ky}wYWce zO5)qkML+su(}0=6Ku4dLir@@vl^f6j2tE-brC8=vy*=4*iaTcL-9yajaE+y81TV!k z>#=-;W715gh$qhhVTu5)>1qKsgrFgcDnRktmj{cvyaXB=hs~S-PhEp|aL+OOUH^Y=3Wq?tN1KDYWV} zaL|)zL_C1SzlKx0tV8Lb^Bal#{q&+NVlrg-arjm!Nn|@0mKAu^wpExgWok!?yYbrp zzY`;E&I43jSx*wkp;p3y2(nA0LG$3xMg2ncj>b|(*e|EKEBd)llV;zzf#)}dq~FPX zp$c7E!|B&~eD~EmHXagn1AFdKfm{>+m0R4X^jQ)X;|oCIt`9go#8(gX*PJ~5C=oO{yw8i8_tv_M z&5q`60Mw6Hr@YjPpF)wrCshA?Iq9NiyjN01QE-np)ODfo9TW|Q@9>ZAo}mJuKe~syfuDv8LpPVSF8DFSr$^+pY|A_y{$FGQPNem7JzvV5(cKz78ZiC^e zj^v4iaSwi4c0>1l5l}joN8?2vqoj`8CLA2f25fi*ahhsf9QfvI?H~cZX zXtV|NiSZt|+g#}mTy#IKA0Oi2rI_c?CwY5j#6agw;Jx`bg<}&r6o>vZ%`eJ{tGDyu zfHCnMh)5gLgMS|ZBM;w;R0meK+jrvlo*$yKJn>+Uu<}_RF+8NBSln5{<3{Unn%H!7 zsskYsp=(+=eD>(N_;Ybw=0TaPjGQxV0%~pnm;JvS=J)I$pCRN5By~r~0b_0=N;7=qzY|0ZKf!9`>8#!W+UjOmfwrtj{Ne1AlE;MNP$+G6 z~Z$BD}yt!=pCbH(Qd*NUs!{O=mDge!dnhua1 z4Ys=Ee2@mFg)+Q$|Hqi(IM@hxk_D4Q>HQ*; z)-7khf3*YxnMgNX0Q;o>SvDFEdgFT*F7Rt?3V^E1q_joIUOQxr z{IRQ~NW>bnQzN#|CKihP8K9m;@Xs*Gilz#2aJLykh=Z(#$)HCIta_%`&tGe}XN zP@b%6(&)uJ`u9bMASFoJ(0)`0{~eCv=Wz7YsRrZMjwt%S2LqSDqK>7B+|V-MITc}+ zv;L58dE902-bWFr4r43E6f|4-uy^U*IaW**(njnX(@hdgJ<>+ZT#HY)n>SLzH#b~O zIj(SB5#4QERn@(}_hm+5s6#V}Gk-vobD3u%y>7!GKXdYa&;C*Y>%xQ+x1n}-^5WRy z)3&~_3~pV%Hq|F<&+sm|q>X*EG<*?B<;Zy@a-h&ia;eY0prIl!U8Ic@EFWlyMc zm+Cv;x|q`qQ7m06-K#Iv?p%$gT$wk_*KcWij{E#UtnnIlDfHcS@e5PTo@tifphbv{~)rrn5XPn94bkz~<3OQwJbU_DP?2rA2>8yQ~ z%Jtf6&f3oWZK^E=tTwMpBL)lJnYHY*s&dX6@->FUm~N+LbK@G7qV6e&XEd*JrgI8& zxRi{2b2v$99FwQN|1!Tj8_(dtbiGsqqvy?&mLxUELIsjph3M zAue>dQqxb{aeCJ6iZp;RAsnj;r6g&|m%&EJ1^(pZSz+9|#~-M8=FZ@YkNX5Sfkm@R zwUvyR{)lc5l4;|N?xh$3m)E=3=T$RJKs}!)o;)k(IC+=wS*OD0rslWw%hKMVhRl)b z2Ar*V{d>D$ZZQyM$sIc#@XZNRBS#NM&u6lm*j+5AKvp@$J4{qJFtkeSo5Wqf%=*em zOOlnyR%pLaotcP`RQoE;3&v$J=mV0}&e~G9CX0RV42yH)g71{!oq5+Ji%)4$KJPh|R~S$(0vj0EY0t1;a^4ss9(JNyfwpW|RM{{F_4 zl$YMC(VC&!hb-nGrbpRqL;H1Y==EYGqujW^h~jv(ldr=@xb;^~5RuD5f>A>+@nG;^ ztgshr=*n6tRv%a{sdt;kx}VA&--_YP=_N z8zOG1T0KSOTd_8@N$)4@rD?Vt7o*2HaN*#}xk}va=Mhq}VH~2nayK~jZk#%+2#lN) zCF{r{EDW`HiPj&Z@f?AoE1jUIB^^W}Fub-IqQ?aPp}X}&bw8yWZ)NbEQ1C;FGoXcO zK8Z2k83-wxQeDkWk&S9OX9WV+r=Vwm2Ut6YwkPudX-d8=1R;Q%!#lTzm=%SF2>|21 zi{zM2qHZ5mxz*M1wZ5#qj5*&<@Gi%|h$~aho7q%oHF*~ceO4oeG3$mkt!&|_+(Z>zXHQT7Bq;XEbBbLG{` zE4Ad9)5P5aP73*Rt^wY)Sz=etIDi``PoAyu1s|vUg}ppD@jZy}*}&gWBg}@c z7N-_i1;xHx!%|>u6($&6J3~$662Ko5Z^)m_+4*shn(viMYSf;1j%L`MxJ-#pf;_SFOM8SQA&a!+ydC<*hWZe+I7Cp8%5O-toZZE-#YpW(8v+R?GEm>f+4n|^ zaVGxwYT!VjP%$Tk`F+)?a~IvEM#eVD9Dcyw>2G^v8W?^3k%bPPF3-=(1W>bh`?rF% z4G<-C1fUJ@KH#9ub{DYa%TOGgSTTIIoc$5^>!{WM2AW!LQDL@RU zJyirk#9Eb~*O@+h(@x$1asnZHRTpWCIllpk2dop2CrdM| zm-jz_T}t;VXjP$~*x{B_%6x{v@T;GzoZ!$~lO zPe%%o0abI~!!@g5cGZKJ|S=V>1q|b z!s^p4Z5jB`tw>zaTpT{LJP~-&3PMV}%DVBIShz0zkiwqD*zSF7tW=0!Bb;2r-C<1A zGz56U2)LolleL|(3 zz~LrVWl}P*XXNw^WY>YP4M80(N(z_Q}2MI z-F?F9fDca|IhOc+0>EOS#+Qs3ryD2}b+hdxP0&3=T!*%B&nv{d8)54(C8$inN!oh| z=)4PHA#Qi}H_(M(W%N!2jeWMcVHw;=DwZ^4dXVbxfI7Z{B0ID!eL*2<=RiH{>?~q0 zIUl5gvHhxSB%8KxbU8-ustLWEa`og#N`OgsZ47!!{OlV@jTAR2}p#3kMRe4|0aN-C|0y14ib`O zfM~B3uVtL%LvCij!qIVhjr>>WMH)8I3`2o!sycHyad2MoBHG59R6nck8bGM*N*IKuhK z{)W)aMjPXK5%5m^n5d=>K@4T5&e8hlc;D@V5h|HOknE@LN&%Sbu;f)bjzfS8Q$Wxi zY-Kg|Ooh}|2O+{eGCE`@2KUaoh3)k8^PGbNijes4BergNa#^bpC?kPF{NTwxrh}^I zUpm8p;oydtlL(f5xklANe(2V8Y)~D&B;K*lPV;Qs8^UT_p-U6m_LF>6Mhjs12&zTJNt3? zohJTO(o@f9UQTNROST|K0qYJGzN-855c`RjfL8L}y8{47Kwd`bwo-8~gPH3?4TSqx znh}YWqp&A5OCBXVgr797USI*@i!{dHx=S7q1q8%UW+%AT(T_uI9d`*zPeFG*^C6Mk zU@V3?i@87yhZ5AY$D7rR&F|E^FXRqNVv4O-ZrVc-3sjNfyDQ8I&!H`!YBsl@+vFV5 zxQ{}wkn=%qlP`>_pN5c~RLj@H(&~2cxp;t_JFos_|49TN)Nz(jf*AeW&FI8qJ-sI-hf-*U1+}pHeol5#7B8*kPPJncaQ8`QSyIvY_7IbANkX>|_5EcmJC&NQ-nIn<2OQSvi~U zaWcK3U(Kd*jT+byfj{RXZ`G*$Ks6iOMmaii>wNcL`rwg)o&DJD7Cu6#ozPgBF-Dnl?w zd4z?erjU78c{)LSdM;w`992Xw7yov|S3**;W6|O~(b)W+reDF5 zetHSBme*JTW(GHEKz9isfTOpo8>b}ZY7%rF_D?ySh8+ViKn$y;QwVe`)ia+cmo|`R zOG#G`2T%g8?4$Od+26b-p8Ldt`o^&9*ND$Meyh3iIXKVXdxg$}Iyy(0WZ{U*Xba~B zurUoW*cGU;huZx9jZ3r_0UGjZfG&bX%vpG5j-bDmp=LKH8iyE+v#ejCnm>HKFm0gR_)+A z#7}tleNjW}8+&N*+=ET&W@kt|?sOSn=}FNPS!@F(jc(R;G{{3``^7{3we}!8O#d6N zSBot+iF%mTJE#flvt$Rh^{TL^#6VU0OTovwbi_VoWu!E^?BqlAf8)QjR5g36hAd7v zFTwuPr<@U}F*ak`iuvLZC{~a)9OAqf{6K-oaqO-H#qitY{Oim|+YN3!m~~RHZjhXu z+us+8nF@UriS|q62p@EM{ZX%ph*RXbihPYXn8{dum?O+-+EcV0LUJOG=ogxEs2Lxq zn=SSiw75okdG1sY>uz(S5;7OZO<8(g2>?ns7hRzU_9!w^D`zIsCPLd`Zfmm1THBBl ze-0chXj#?p>Y3Sp<%1KxSLT31j( zRvB|r2VM`}JC2B?Qu`JRa;Xm$Bi{`KCJsW;b{IK!;F6*4(3^2kX2bfE&zsDEJ6}rW zTlH7%Mkm$X*ZnuY!#Ud_xnOdaf9Tqcf$8(31tFC|UVic}2d*g2^Hv2ju|;oq zfI6#fic6f}+?(lSN+9_eb};C}TSQMU986q@I|S6!7#H)H;kBQxVK^EDfT|G7h{lX9 z)bVdMbjj!MT}@FxzbQ;WQ#NWq5k5`@d>JlgtGc0HPGtT>p!^(mzQt9|F)K?ug!<1s zz+bI}wq)Ypn-;HN?Ge|U8TzcebE`0s#9)&(D0sNn)U>@FiavW~;ruCUbpgCYu0XJV z?a+LY!K`Ol;*&b)6$W##F9qmJ9Uy6~TwpvYw_Z@UI*hxIsLV{?*^%7BDz@|?Ow>??7yA7YPg`>60UF}G?KKOeUE zwn=e*Bx{=5fWnhiRycz?`$krb^?d6tX#czXKAr*Ih^y=uQmML=tCC+XPyw@rT(DBP zM2l3MOX&GO%S1bY<|b{d(^LM7Y}T3Dhrkqe}}Ioj!0Sp+U5<1T^B zTTxDgG9$$9PXgc^sjtlhb!Np4u+A)rLfBD|Ee#-*jB4g^IHen3!!mtD3gf%}9_v*qnns!WYG<8718P~?q8 z?6N{Zs<4Md&;#0#U-g#?C^+mWvkqzZt2kR$!!x|wWL+hM5t;Y4)xm%p4J+H8B%>Iz=1piCwfe!T z^$u4p&*?(Ee^6I;2njD1`(yN4>%hACH$C9$T=>;m;U?^T$?kH18gP2*YT+kl--!W2mLoNze6l$pZ5e$!q%0OOkT9wb=%; zcAXVV%+r?|-Phkq1j;!tND5PlxiN#cNNU>PJAtK{jAY`v=%I-(bzefigk6z}4~44j z-gA8s)=3F$&+kV1S3D@G@^F7)l%jpWhrDBS!0!ZWyK{rNCF-6g-NxF6sd4z0^XoXw znVt?W;(j_5SHx0!Bi<1c;)CmTG9!V3QB}dJ*M*&%Y2^wwJ(@99>75A|>>rsmPf{Lj z*b$Ik4NEUmsNga0xzEAH35-Q5JG?gTfBfPFjS zD)vVMew$k?Jx0H*sdg{%^+*9oG^oG+R^`LKj|LmE???xah6Qs`V;Aj%&ot@vtiICG z0cvFF3f9j&O@7gg_@l4CpS7amb=~tyE3x!|pitkq-c*jbWq%Z7?EO!oe=P+ogefb# z%U%AsJV~(*yqBY+D08?<0`Dq5GC%jvqA^s&llizIfi%{xAJ&OK!8i{J#(6ptLHWmA zrGwWGzehI5icfw_0h)&%C7k}6oggjM{qI`x6^4;s!u~ulHe0PA#}Ui{_(sg=#-5`8 z&&mAtX*dikdNQj+x|}-e+`Zpfoeu=)Hs(IS?WR% zaX~_w1^?euwNT+)Tu0+(uP!iY=;^~&SQtatdi>@&oC4t)8rtllf_iX*8wFHgsz-$L zM!Eebd(VF}rXY@IGd+tdavUG*gkl|x)O1xJnzOTc9LwP!h7C7gqpcREa1WK{c!1UN z_0wc|ITuNVK_c4GjvRi%N@A2f7{3p+&FA+T9HiA^PQSA$6j$5+bDRB^LIfey_2%v) zV;Qe}r~7W;at&DYPBafbOcwcTJOJ~UK&C*Tx{{s)i1<9@ELV9ojMVMR|D1+Cl!R+< z@wV*CXX3Yj2o0ej%W&?!e~&hZ6!S8MY^Vr|Bz0F_>ho-nzIGy-_xFU37ShU&Qf8a% zj&`Q!1R}~cZCY~-Ld%!fjQ^RI15tP14tG>{cWS@51`r{?Sr?-a?Fk~Uf9;2P3Yu(c zlFt^*H}B~$rIIku!BTks9ti^CJ-n?^bp`_%Phx$?1C4Y6N$=(AzE9cz6(;8ksLI`N z?SUR1tT?ESf%i!rSI-cTNNOfNKGNCWzA!H&3T-^pNDa7pjjGUxr%(tBKR)Ir9X<_K z1jbI6Tyj#)qfIM}c}WfU^J)0t6v_y*8UIypKPuj3R%4c{>vNN>OHkxhH;T$|$Yc7~ z@rT9W$CvzuCn&EcGfSwVr&m`=27+C!aE*HEsW>;12UfTJeIT`z&APaO%h|4$Zsbhh zvj~#AmqHE`eZ{yIr1s#;x)uF6LHAz9ml*PkSTh_ zqVR^`HYaLhohz!ipf^LeOy7tIG%_M@YYlp)AKzz$gu^T=+iAE1sB?blL69RP>IE** z41_nl(R_vn5Xh4*de0EBu5Ix1iMW|;e6T&jC5R%Wgf`x_1Nie`=d$CGauAdhh-91z%i^Nez0o&`ci45g=x2b$G9#eQ2q3@sca3*6up-q68*4-7ZBx@I0? zr*s=!u<_44c_D6p0B#z5lF@J|QPywdX=LwVXWONeGN z$R0_mEtkIRwaE76i5G5MGt~t)M}MI7 z8QZU~O;Kehl(e1#(cO9i8MY#dKK4R@w|fn5t*7_Upu2Sr0gNVQgEPGqB-ltYf0Y>2%K4XKXxUU$Q_Y@+$pnnVwZ)4maoM> zfH1Gyk24Xb4ZdxlV=DlHoCuaTlObQvNWt;>o~L+NB$gW`-bPR#2GlLi^{2rX}-rT=dXq_MDw5N0Y4(Qs>$x0KB&CB9sCxUAI2*c2`bjq63Hl zVLK5B)6uuQ;P0YkO1ieA7$eVTf5NU0&TcwU4W+N>URDF)mHu>^ouWp2G6i@(HcrPmq5N z;YEeyq)k>nGM!)tmXcAkQ?m`31ebYuV}%A9-L>bGAlOS~h*6+$JfxCmwWr4yPIJfpWINQ_g>+X+{LNP;$n##}#B;b9jop2D8)y zvRyeqHs)`g4?2UHeGfJ!xpl(lvKRt|N8wS7x7Rt4qz(tW`in4jDA}Zm>pIF{??Iv{ z#0z?Up7cGU#9X296&^ZIuHqU-Idzal&9O6X!cUGa#!ps{k=xpJBWVg(6qM{BG6OBkI&BZ=cKy9(fcJ?l+3CkS9Ao?Xde(8PcS$UWY24N z?I^rkfZ0)yTj`JL>##gV3PCmMDe%Ho2DKUrZ7((g?#}t5#wSl?K zu!2XjvPbq7#7A4g#EbTZ+%KnZ7$AZsN2@-GNXFQM6J<}8+|J$aAK6QJ4kLTd!u#bO z@LEgjsL9P7mMUXB%^AOWGHvpWjC~HglS@&Xm(+S7N=()Woc*u_RFaMPJDXG1l{o0D z`WJCRW^07!FgIY!W)Q(vVCRqMen>*IC2blli*V{RQ+>lM4ouUVYmv6C!u9AXNyL+Evcz`iUXSNlR z?a;F=w>EVn)?ckS;Wcl8PaPR84dU*-8P;BB`?Qj`9x!qaRKS)q6J8qM1s)>6bWwz% zwX}%ret=KYI0Jz>e2`%?65kK(`1tFsEc%FzJk^ysuU34&O&unbj5WE)?1&<_BL_?+Py;|Ys_wWq&-pxFTEe3_i*Nm7MZaU}+48!AP*r=QoW za82BR5~v@Zu^zdEW^qsVeM_a7 zP&REAxV1C76;umEz}5)g`obP9Tdq{R0;CLv==Goohu*IJX8K#}c>|HJLTB~UuD_eT zLYGYoserHc;VRbnqcnk?_v6VaOWMH zMqdw^a6$Kp)0dX|aL(POmq4KktlIU##VPX3#OESGdpfFnv7%Pz$cCdJ80RY7;s_5{ zHr(bs*w%vYGrmVda~~Al2)Fe)-AikT|FV=+OAGsa;8B8{wZlk*^IIq0>p zIPKuC+I@L%&ZSBw_Zs`AyzYkehLEuhF|Y;6TUPt^_1lPZU0Xmt0oDskon(af`{g%5 zj(}ZZxn>hnKOR0bm6Dg-y?bJ;j2npfnYHuw^q{Ic1JX_!C52hCGJ0mMZ%Z-whu3C= z>6c&(HSdx}A%aXXeQSMQSvcqQVlZ1=dx~3rg*~F5Ec>hKWFndb_@j9BoTQn1-j7v1 zod!2t@G!RtB8KgTR#wXaR9K8x3QfyOJXq45g&uG#>>gonBSwNP9S$8$-Yn$is!)jA z@X&-uoCv9$51MktXJ7Hz!n%a!0x_@zOka8l7ChCP{Mbo}+@&J*Wrvr_&(>_i3r4tp zuT(AynLnjbo1vX?zb`*YrJUdlv5bC|tH&H}#H39Ppt<6e!RFpElDOrE6oda@!Uk5p zv{EqJHaVg=f-q*7IE&j((zcMcR&FdcLE_Ef@2uf3tE&A6c~UO`l?mpRRU3BoE|Tw9 ze6iQSz78d$Iv`9w^`zj(VecgHv=;Rcz3x#aHg0hYyJiwiuU1L5ZX+!C_0y;azK5P_ zRR^@zw^LSknzEevtrIcGJ?KL+)WjOtKF7d|ZuUqi8;Kq_>4|tOW)V<9~{|a6lTczCHWWV(no}<0lqo?svlYaiut%8l*an8@XMr~X`&A4d+mpxGg>|~4!+;G zw$(r-s2WPJc^)O5gU@ir%{(T8xrs7w_qwZifVHF@GuZ0j;EDvR6Q?mabxnED0voZP z{uE7^!`w^-vG|Ga5gstuAJ$0TD-Tj0mLeh$+jMl1&(`iwbCGYKWlc{ccs%OLhNU;! z7-Tm6*5oJpLoZm#=GHsr)4vA3#f)MnQOKXy4RQMs#T2@f6xg5JP zwwwK)ZL2g7rRJ?ZOs2vMD|j#c<`yMB7DIvirly>gerlj&w2djAoB`5nvMZjZE@5atvf z5}M1}N<;GXXK&`QiyxZa#B0c`(Ll!mo|cz8s}HkON=vlc#(gCzja5VDNSzC8>^24F zCTpHty#UnvhYV8L_A``@OKa3?>d{;_lED&UQay~;&f_zD$DK7U(e#~?V8aD5?Dgb@ zD4vL>k@G&hOw7Z;CRhnhT|MzBD>JMPZe3GNkI3nJKQ!25hb|fSO2unob=)GgxhTHP zwC;jL`=v=9x367e&7ec^0%~AT`Ub2$XlB8r?&**=KO4N2oek4B%I8HWuC{#CQ|gM} zpKZ&7|B$VS*i0dG$bHG$R#GWB+Vz_R;Gl!}PRTZ!*P|AEpL zFuj<~%UJr9!0(|O4;P1~-X?mf!u`{yN=(N3>h~nY%T3ognv5WB!@c2J%p22fQ_LsJ zP>JpwI-1Tp&irQf`iASB(Ue=^_MJa_dg%(s^E+Ly4`|GJ z${>x|iTgK=`J2uG4_QvS>vg69qDz6UF`d&5Wbpn-W-WPD8WE6cx%O*J%0$!7@KXI{ zBiFj;u}iww`>0~6V$ZnN+GyT?w6yKLJamFM2?Nj()Ut;dv*e1Xo{0@?|rl?}diDUcFNCj4PJmL&=uX z1J0)UwYsc4rsBG@_6N%{aU6QSciUH}Vg|YsK6k6!YONyhUO+=-npK#P_#r8~w!Zwj zRaogAa9MrNW3TUoU&+Y!I%ks9VXrw}n3_LQUz}U`UBg_GvXgQ{ec7@0#grarm6%z{ zZe7o#ye3nGg68D+T*{S7ZJ71}-5LJlQg6lB)RmoZOZ9ao13rpv=ni!OhYNW{ggzBr zsB@h=_3Q0Om%M|0Iu*sey`$xuHzvPpWZDw({mVt&9AqZQ@t(c4{KHmuWlSgEYUKU_ zb9&3HxO_I_7e!sXbYY}ZVUQbSkzemHX0$Q5i*wfRna-sY=$lkBdNz7-H(FbL`35*q zF3zg66?YEDkbfJ#>-buOdcn{JZdhhy0#+iPjoA2^^Tp?&C#Pbj8dXB8w zxEMD)T;ZO50eBT9M{2^;(c#8f`t4WmvEPmnNY^nTo~_d^TaHUo0!xt2`hhw%`=!j) zs&Yuf`Nf?h2lsdIR7>^Ap$Grz*0sVfG-|+mbco?c%UPTsStfO4)3dd|9!7qF`FG>H zsxpp;%)3-Qfnu-ly6R$YN?!3wwb6{wHj0hWI`Xc5f3KMXq{a{P)L(yBIEG4P0kOc4 z@AYDNvjI-pd_#IDiot(ib~$hK>#S8nyUAFV$06-B7l2Fr{8HgAf!22B!41v_o$!7K zZU>*@?V(@QB6g4y#ZCzz%<;lM^sM`yN(|{DBXy5|;XivP#)1lPHyK{ep{Ji7jI`ze zZVTM5tCoBlC86DrZ21p@+^hmwF&|o%#&tF_=+C`?A}N_uD4;55>2_1CzduIban2$9 z9RvPyXPem|7Rsw;<1ryt>Ru{NU@_kJ5dqoK{nHW|V`+D+8;=5#L*Ezt!$qAPx8Q|a zd=ut0Dvu8mp=oNcCOn-D&mMF?QT}J*I?UM?{6ySV%59zn3Xu4x4~6Qu`z_M-Zhhsp z{DYGIo(2(wb3yxI&*!}i^WH9D4xn8umvhke$-JFKMoEsuUsFaSLt*K=?-yF7HHA|@ zwhMxDu6iq6rA1*fm{g+N{)sc{7%}Q#-h$j1swjCw;xoWBjeXwinyNM@POm!i z-)fv@UvzNAf(P!i8SQ?>;tkqhC+_0&biX$HXmEmdR#Ly+t><;8=d&!#94~_P3>R*; z<79Z?o8|L+G26N*)xV?`z_`H5`D|-33k@p_X%?jMz)if)Yf*2M7P&pVHm>z8GW>H+ z%1}2uHflr1hE^EZzE~OQAH`cY_(^tw2#cR5A1nB`=xSLEeO&cmc5mrT41~hbY*JMX z5zIror}iE`qKHc5_-iJJ*HG7rHAYa~f)q2NE^mX>2;Z|J_w0%)ni-W;T1+(G9M5fG zZWGQ1I^a3xgsi()PL&T+$0}wnb zXx(^jN!O5yStLLH{+mA`=i$L#q0W|^bpwAl!Y$TBwlx80W^xQA-q(t{+Wc<({;@*M zgLq4AIKIJTzrMOMB!~j+svO`gIvvpGAG}fc-sQIobr3`!*a#4!Ul!S;Ug-N_XjEI{ z3q=xFe@=H^nOO5iTj+MfmH(D*1A@tP+|WYF7&g32j_s}dO~8B!8l}fG<0FHWemBMfPw)&iP^WM) zfITz0PP~i~ku9Ct>HJPb-}ILv2+VCZ+j2V9UJKFs1kl8 zEAp2qMiWDu)^9|<&?jhrM#BN*-#^m;LV{=g_QM^i3sMz}k0Qfgn-Ow})Gx;i#oZ$i zJ%;dj9sots$+n$y8PONZ`^nzd&8q*mO4gpqUd}1sVEDuw`FZOsB^)grXkl9!Lh`)( zSzkZbz~2x1k?|Ta%+mMa3jGK#uwuZSTS3x+WV{^xiWGG`mHZ-$;^SfjfsrFnY|3n| z&pnakAoHQW~ECt?E{E9n8Z8zdRA#+Q^IZ26t!rJod<6yifI9lH%Zj<3-TNm4&4Pa!iDqkz zkCAWGiheZ2-$Pyp|@U1j$!2>_eN~%pz``Llj zZPxktLVGLBMwi*p>dsF7-yDp5Wo&oTMuk(8*T)P=F&(h98T(FVZU7NMyJe zVDtCJs>2x;=;!xlk_+UFPZ5Js5s_VVD#F;yz8%(rYt~?Y)5m|D;|N+)D^gy5Dpw$=$l)Xx%Q4=e-OCrr<*z@_PkX4MOrS|AIqALb6mkF z)aBc)6A3jMMi%p=$qwKp$#9rjoE*ZkBPa+-pO??}a~F0sP7< zTb7k4qSId%bot^`O#hF%_YR73Th@n(0!kDS6a*9j5e1PfVL&7cqaaa|pdum}NkbF_ zkt9j-fRZGmNY0`nNRliW$r)itLzr*9GpKm(t*_2G_x!5vt>TZptMF#Vui<$e_-5+#siP zJ4ct{^5QJGG4#+k=q#~fWa>`Yp1u3wuXJ2Z>>w+;Dh8m;nwW~myJWnPHtpC*tHI3l zo}FA@rYpyUUj63!!T;UUgWwg}d_M`#_kzLd&Yk9G1fC`)S*!R1nf#C3KfcW;`^{`Z ziB9}zn`k4?!fsrpFd{09~;CXY)Q1Ch69d2k^S*x z(Nf&d;QPyuZl!`*M@h?|(hoUru&YqNUy6xlQ+Mf;OrpbC%@2A~AifAhcq-}0sj8L7 zc4L(JXt{CU7Xw3B5t{bvbZsoTO-{B{3P1NKG`VCjbh+-p8 zu$hFXt7MT=+jqX}^)=Z~=P%CmvvhVpQ9JhF{I!Wz^BSKXDT33dJsDp6oOPU>&ox~z z%`?q0&2d|gK`af3nobHQ!dtS}Zs)Z+wpNOowwCg<;t@c9`F%vwVwffIb|&}F53T$c zUb1^K;(ZO%{aLZj&0CT@IPLD)y)*ti@A;Y(9?`+SZtt3lt1`ETJ0zDrx8~KC_1Zqi zv&6ejqnqrs%|7K8vDmgto#W~n)crYg|D$jph)0kmKazWYXm{kTvZUSEY>sb`Y6N&P z{#+?tPI4lN^}T*Ur+}8{1}xdc*f;$3*ql_7MSnoZ-e&qx1!cK${RG*_p_-NKZjOS= z`cmGd*va9X<`3G({(4C%qo<_rVe-|BOZT|nQ)`OK5?K?D9P`pE6e_5G+`MX*K5ST6 znNLOPiFe?yX7=cVxb=QVfNr1h zhJo@gPq5~f6Y09Nz~UqvR_m=?h8HQXZfHOUD9iP+YMteR1oK8(k%h-IIg3PJ8-~BV z$ZCxyYbsB3`|(ZL%4KziCCESP8lEto=FG$SZ#)Zwt=owf^3|vCSpFdvw}bKA>Xu6D zk#?&~i{;*wiApqM{fvwKU`iemPD z@!-PMD;}-j!$~>xX|ms_jUya66c32<^50&U{gKBisn1t_*CVda>2*TaLswUvaUYFpG*` zsf!^Kso$Sa1TpDFD3i1sP(E2;*JtWBYem@=+`%$W4&%faZvDW=NJ;}rO>SD82mx0^U95p60@s5id1wX(qQyw_6`5Z)x z591cMLnJmhb`IqUmKq@{IY4Nx(P<}d+0%|tSoH5+%Bd)nGdI!r%QL+pL`CJfZa+e& z26oDJokZfz97%z37p(`2_4|1dJD4OE@=fw9M#WZC{@z{(zNcr+L)z$$f}iP3h?aW8 z!aj53at$^pKpbSdjaXbbYpgnM2l1q6*w7kL-E05MI==hLoW5a~Q zexetl^!nat$U~;D0J(e{McwTE=C8A!eZebtq0E$}6g5^|^^Vc_Z6p*S+-}aA zh|=}!dd%fPBBw>Davm&>Qbr!s)3J-h@<_W5<&AnX>*tlM;3E^Bah9chs#eh*R({qjeIVs)dgATU_D3<5j*r2L2(pZxxqUUnw6_zg3|kjRtK3Gh6)ocvq`!ocjV^LJjr39c+Q-C{VU6d*lu6Mw2M-9I z7asvC79%Uqvo*b1|D#QMQU37S+29dW$Dx$ zxq8GZKuU^sdb;#yYCZU3yk;~)r1Komb1G%i3#4r-p2JCrWY#pq z*0eR>fEM7->9Uq0ZR2g4MY@f*GkR=!#?#m9(GY;|c82~3YtA?1?#JOr<&$RilMCMV zmhp54G728ivl^k@^ya~`cK?tM=+NC>!H_1c&T`ZlPsin=(V5b_9G-}POPNZix}S%qyniDh`h?-Tw(vr?Y)g1=`h@Nk;{F1+(y zT1=#++y(m7wcG};foGNkdi^c2e!>>3uL#NT{0<$=L?J|y?JY$tRa;FV6$ltJrKv6q zGOT;gqhZSd8 zk$K;|`tmF5i4z|b3+96LNVulE#ID+pQYE-Wbrcl;?DHDxrtX-hkXE-2up*|Lkl zZdAzd&9<1yNVF5bSpFM6FYJ&GkEPT$JbC`VzO^>~H;oP#UC4%8&Pk4E-Lp zN@6Mta=r_9WDJ#7tNL~v%njN2UK>rO^(;lsKi8ISd+WbFL&^Y-l#z9f4n4twTcZ8y z{PJ7*_ZF+w-SMdWIk7!?3?^_cPy?$tEQaEAMv5C$5Eljh$qhD-bR=Sob{>U=npGcAr!KFqciL>`~7{HcwHd zdQdK}7wR&7{R?Ux^~#!3S#7Ipt)Oh>(wfOMiVBAi0cQ|3g=Ub{HXXdu%;CXUe_vYN zV4p_0NH58sGo_hWvt(g8@bh9l^6{x5jWTr4VaCN5P&Y%((B9)Mh3MW&G+$baSh9*; zd^-1*ujpW@>9r%!Czh;-{kjXlZflY=PpsJOv&v?v8p53~zs8cf#tOfeB6GU*DA6=Y zQ5)4G3!Z-T^jDbDWL~J76Z`SHqkqyn=)>iV0;+86e}BtSY( zhF?Kw1kX2_HlXb-X;n86GA~<7aU^uL&2y}EJ@{~kOp--x^?ctJrre(%lTIR%mdyl# zwNm9LPgUu?*13`EoCP}D8*yoF+cUBLq6e*xkQcpp`X-Tp{{Ag z)Aq~qIpr8Bg)YSdZMpN_w_z9FLDEevfk!4Zs zYtGZwh~a5&%^DSV$N`?ka!eAw{oPp^MxSIRY14Pe^n zK;_Gqo`QRc*^7VCZ8WlAJ+K;XMO*%GBQ1&l;3xCYI(4jf&)1@UU_u<7Df_%@bZJ0x zEG*O0Ubm-yu(UfKVl}Y+*+T)wbZPe?Lm9m%)j`7xo^BJ=M{G^bTZV|Q{@56P&mm@_ zLM>uJG%b8*gpf$eD6pnm-f&&QqGwP3IR@qyT*i{rv?+S%Ayd-od+f_KJH zG5Se1*Jg~LpH_EDS1@qt(VKS>dG#u>Flmx9t^MOM6NOnAyes_zT!G`%gs1kp*W z7msO$RI5!zbExZZhM6GSlup-V z%+WEFhVoLW(M$6=p9+^GD$~oS$09mZ7S7)@j_9*iwdUZ_zplTG~zba+rCj-RqCpr7vh7s3y&bay*LP%O1_uV1_>K&>iBV z376ib6PPIl78t=bteQey!pGvzj(5>_DhKn0sY|BiDmISOe2ZtYKg}60(9r-3d6&)? z77lyBS^Sdrc)Z|L?9nlDZ@HFC+fT=mJKxEc9nl~tj}+>p9K5a_57L<1EVykQlW>|M z5!9*+AVg|bJV^+AYhL9!p)v8zMHuN02dy|frh|S05uTft;6Z4xlh@8(%af%5H3~m7 zjnX5}v<+>)rfMl_bvm~j?m4WN@hPADzyXo!XwS17dW4z09U?v^(}Pa}XdGjLO-{Uk zE!M-}L%S)eo!$HGtL1+1ZLbSD&&4!yHaA4pSf(oaWyj^)pqrK#g1Az^H<3xRHaI)y zVn)w?zxioApth4@4m0!33(`z_GmXDJHm%(HYG||v-c=B5l02?+TJY4%MOeXYGp3ud zm-XEm^YsT829()>q=`yEaLuuMa z5plDX*5rrm5~a3INyywBT3gj5s!!n6?oh8ivrqNslFPUkU{9Y(g_|o8IUqU(%p#y5OFU6U$NThF zZnW{2V=V!9^?4U?hksh%+u*i)t9^<;`YB>E$$Zo&RJ45{TThhBU-FGv|3a*BnTg?1x6DmG!xvD4Nsp!Q6<3N5nDb-Hb6 z$xQgsz|^Ewa`|`O6yH_#_G2msEB{e1l&0s`5CPL4={sX{_(ZDs_&cUcC4rHoju zchJK-!8-iaPj(8nFj|X)=8(xLnteCwWB!iLj|k1RAHki#%B<;{3~Efuol zTvFfOHfw)s5A5+JzVj@UoW>PXWZxZU=ka~S1s!$Cs8lIK7u756*W6-nHNT}B*ST{} zA#zt<1NJ4Y4RuL%k>%`oxZUp}=K%$Z zl5FG@o*0p@J+-zk-mXEP$}qFOD`r4{4a*)+>4B-cS@s zu3mdeHKUH9P+Lubz}h42I1Q##tusID;a zoC_*XWd?n+{yKK2IorxjDvNfIGYYh8M>d+Idp?k{*`<`~l-jBtb-U4;ltaVLBWHM} zb4o~-d`0`Py@cKe0n=k$rp~q+(GuE8F;R zp9=I7mj*sL+s67%LB$yHGqK^`JmWs$_pfYC-CP%tvt1!s81J_I@T6c;Pu)2FPTLn9 z4Nztxbc+;E0!CFc4^h!v_N zEEmHV)8Q1=<)K%h#NHSkLEljLMf9d|x84^rClb&5=bb+0_oS5hjLQB1RVYn9LY@qO zmB`!8Z*Q(-zlcq1nD7P$f72c@GpoMXjjhc!-$7c?#HIt_fY;)@J#llaG*Ku}k zTANkBT!-%De_(#iKj2$&2i8?Q%3isC$~f>lm)>}&fM0)ZUSghGQ+a{DZxL8Iq_6f6BQ6bVbi)~>rC-2m`sT$4IRikgY92p3h ziFPcIZ+2{Hrm!DF&5R~&9#bnde*Q`>^!Oi>qf`j);#!GEnAQNr*p^;p~s8?@d_0=F4aC|=Ce1nV_lm_B{Qs7tu+{_5g72x}HuCOkQ2k7rKPdWmu>0P%p(rWVXQS5}9 zqMhx*IM@`-{C|QlFv;^~f#c&;eGNGiKE$TYP`0m23N6UgRQ2h1Rs4o#w4le0b3&vUOSd@`@IubHmw*Fmg)`{`axfs{vT`{Mh)x5bJ zly4`Y7!a)X)b{Y8=|wLqx2D1(s^!wrYNe4@mPw51FxSn&AgnLG^{lX&h3W6y;HAn-4GjZ>lK+s7KL75)^0}jU-Z-*LISts zpp2L9BhXH!%XN8)=c5Ld!g*54U(m`;rf`V%L@@Yqs_Z%6%1PnWqNM8VD13aig$(to z*C&vl{53OlPQI5!9>&as9?7evlHwt{<5hz^3XuEyF_^EnC%g5ud#h_#w&<8NAWa=D zh?su`1s-WOomWp&F{Rrn(0X+V*1aR~gcuz>p3A`{NFuZ&p?$TI@WhgVDr<39`@+GmH%2t4vaOBkcn??y3kY*-sVcpunmzGe@b$+} z)5?D6fwX7R%(yfV*dAtj4MK14jVIW1q>Le)TJaRhP>%0Shy1taNKP8v4;;4%R!$ku zj(K6zn7=$H4=Ryd2E`Onx$Vpo7p)(5QJB?f5DFRT=C^?pLd`Ycw3k&A8CL*wCZFvH z`*TR7>Ak4?_A)8=i)o)w2|5Lky@(N+E+)a9aZFQZPv=!78Q2Df z#;@=_R#D>!c{VwobVPJCB}R46IYJ^RG=4`~th6vbeO1wyGMYCkB+p$WysGy3z+yH^%QSTK;1nGnVEMd6`eiLWHw7QklN9 z{Ai-s)+u>lmOKsJjM4VG z#u+#tGuM@V*LN*rzr(UhN5tY%pgvVpKEp%G7^pIR{l}D97tVnZ&(v%W=k_C+o$0%B zdWr~r1E9hahi--_EJ=O?KV>V#yAv?X?T@u?C}iE|TEt>rQnDj$yNO#Q1$A+T@RhGK z)zg>?4Pw1N1-JJx!Hj5wm8B&U`XrzpA9phV1mpvqa-~bJ$w=cR2?qUmJvJ-icCV=H z=ps)J`NL@*CrVxCD|zq1dhx$I=lrL*AT09_5y}Zab1|$C^yYV!xgcN;A{yOp*B;6- z+mZ4xIES_Mu#9x(JS-C}E%Y?a&&D=HDvLzl*V zc{<-Cf0+An`6P2mIPZ>OiSzbUH8by?BNhJ@?;1-Qkfj^~E&x)}jJ3^ed1c$NU_BK@ z5iGxDGuu)bZT!Z*{mk!{`3}jj4XUtWIo6fa&&yZ-#_MR~Uh^<(;M zp$2C2$8)qZ=$tjD3y+@L8i;T;4)Y)bU%ofo zLKI-c34Pk`>#DOi$)Hab?Kxb9?9fwFn_-&+ z4AG~STIAbLq@;}IysKR;`-Q5nzCuLgqgjeUety5KD05f~kU=LM8vxO8hlE$e)dF@N zduGReprmjWGRH7!=`Nrj#zy0@Wff#keG~Oq$>6PR8=xl-M^J$Znf$L- zNMgVL4e)W`>d;B_YMTxK7AAqaUVj*HVQLY4f1F)1!@1g>_?OmkJZU6nx0!P9k#@P~MT%6`>RH*qcQQ^Y zPs9PPjJ^kWsDj`5`)QUQa8>y^m6%+~$9gWUMthgOHj%EJmLe@O5xP-DyExfIg1-bHhc2fV&r!^vF-}{v)9x zaD|gZ{|IMbQ|P4ac*-r+ybG14daV+Jx~gB23EhkyUL7=SqdHYJ-P#Jf+4 zsI|o)wBM(H`2sn?SK8@Z%qK)kF{QrTFuwCijc*h%J9C&Y$iu%GaEIkn@`hi(^6Z`p z3q{*=V99yiYN^&HpP&M9buL=Ao-{aQ7Hql(p{dwf^-dg+6)u`~k0Qjm0o`s?-0np9 zuNBV#N4#6t)1ozJRs>(=4vqI@%-o3|cnaDm0*HdInuch;v&6U=LCX_~)t&g8pMyKK zW_}`hxE!@4J{>dZO~NoC3;*;;*p`%Ufz9O8i;JSucR9zIy@rIB`f|76^`^I5F;9-< zZuvZF!s1N(3z{o@xKST4T?<_tp6~9 zJt^L%y7uz~(KLDaVmo62FN+Wczu>h?CAV@v%!5il$cvW<8i1wV(8 zXx29=8fUoNHT;YoLxKvxtCzHf+807ca9b=8_>_;P8j8c*d+wnSu8Fc2gf{!}YlX=M zijRums9*dgaH}JdM%?%fZ!?5#_Z!5{NunyT`~L&(Yuu3u6zY|#6wy+^J)8W+FN#|dfWn9#}Z;TxWndWLGhMnk6M@rvjQ_>5pN?62B zlyq?94Mg7=!oavHl0#p?@id5bMHO4XG*iN3cUIr%D#CM_nBSy>nN@rpx?-UW<2u#- zYHD!dgcSzWMhta@>o90wiRoeBB=UM8wc%yxy6nKeJyEp4Jeeqv5;p5kSRVN~0ZNiJ z6nM?ImY==KRfo=v8=wrTQ1SLLod4%Al#8wv-uuDCrpX0%zeIFP){%4CfFmM#3V1uF z2<{*|P`W*l*6;gSDt2rvI(9ESt^Sa93vLY%AJ3P6tl8n-p^H~lMP@i{#m_!4_f^&- z|E>m26Cv~DQgPkk15G1*q~YztH6)!{$3r<=ENj|y$#F)4zUeY95MS;Bw#@a6do+$P zCFH~oeR5a~TmaF&5^KOeuhJ{xdmFZqF1B1@C)NKky?tmqX^syFR*I-`YJM`D>jD=KziJZ|ND z*cuhIvCFk8UnlnCb*ksSjb?#SeFlo28gMs%B0jhpT$GZW;Hi}I@E#1+6}1=j{paoK zOtbbpibt^9uc1x=_t%Y->ffQj=vGe#RNY_YTH3@c|L|DIJ4Xq~Z&`@^=5jrE$ZJ+fX_tPC}x3il*9-JY-CA^E|0N3OuHrTQMUM?lrAp&`|dnP~wDrGOg z@nMJwj~xdrCKFNskeh{JNIg;U8?9v){T70&i^au7#d{O+RZD6xUx7Y7;3^%P+21CNUA?L~>(cDHzV9c32ZBjSRMwZX+pl4++)-}W@| zA14dA;~4h`_7OFb3Ak~9@#Rp|d#sth6wdrkdXm7V?FD%kLPmd|F3^;N$BNz~sKV-PF0{!Fkrh)`e!75^py_WR%^PqpP3eE)yLUZm6`m z7@eR1_T!<%zZtF9h<*5zwq>pPAfxlzlcke$XL{aHN48SszzUW>8x z9t}Hz>szRl*`tS9B00}2ZUxf5`Dm_|cwbSQyu9{SC5j;fP6);Y5ws5~6uY5hZ-}Et zWfBB`p*usDzp2qKokPX#A~OHWj~uu(Uk9_dIlo!G_hEH-w;|;RQ1;*vy*v#hVqb4u zr6l$AWNWL$d@__=ik<2ZBS1>ms$iHpVA8R!PuSRvdrQq%t_3Hm;P`|$1@}RpkIn9A zV+HK60?Z@DLcu)peQYR>N8@kOcWEUq*iY>DJZLXdCO%`qwO|W14NuR5>DHWIlmY1d zE7E$%5g^Es(y`%?R;STj<}K7@Q#hx+Xr#mP2#+h@2jCjSNE}CrD+T!wF)D+j)VQcK z!;&P|0-+`>(Dn1Frcp5E$?W=al?^m1!7UAhnJ8;br-iO3fL8)DxEZJB<{9;1b@bQb z;$lOmN%di8TKX}3$S4j{km3>VNCr4INU4n>!-^%>?p=PD^_5%CEhES=cki!|1xGx) z*~e}^!>It6-0*Hz;rO~EsO@MVPWovboGCo1P}yLkdUVCEj(9E1Byc<;1oQ%MhXBp& zPG50ulx|FZorE1+zcq~U>cdojZr|CfvEd1qDzg9=@QZ2rd!hla9*KT4h2-G8c;gR~ z-W-MOYb);v)ohr{0=Pq6*4A zieoG=A454S$7J+;KywQAhwuTpVolI?1BlH>$l72OPB)6b?H-f3*jRm~4JQ480`Jqc z>wL#Lf5Y~uM5ccKaUCy*EFhu@g8yoR!kzv(LC{x>vwibQ6`=HU0L}WPFcT~5p>PI# z^r1Dg28CSNU-W^fSK3r`z74v-w_MX1qM1(k;FLj!!7Lqgks80)gBMzcH+V%qE2wTo z0~JBI{53m>X0mR-&bcREg>-+ou}THovRJx6;*DLHbM>dqIO3o~s>nlf$&2#$Ih{#lYFY8iA-fdG3J%Mk zGy0%`Yy6C}Oc914x9al~ew%+{*imP0^?W5>YD{5qMpw+si73_=;`SU#_op2zdpK#) zq{|vt%pJE9(@1WUPa~GQG7vC3f3a;X<}B8AUtA~^G^7h0HWUJek zWaV2t=CagDTp@KrO$K%eC5*!bD7i!kw&ZG#%*?bnf(FJm*X7LFG=?I>O`@zn^hGFV zAa2In5WY_(eOG%9jqmpxJRs2$$cQ!J229tD7w5M_GTmROyn;v*wzk>YurqQeB5f1q zi5$DzSs{VXn@$C-Sip1k-BHALF<82*cC>CuB(}oerA1KG%tBLd9=HT!=?##Qy&y%xKRcL92g*q1gmCZNLNJz7u=7r{Rcl|KqT$_%Im8U*)^JFa z!J&@=s&i_B8Mzt<;p*&}KKbWgd|l44r!iPzW;XG1Vd(FD``aosL#ci<}y@`N|~{oS)YXZHDkws@%yJ4mFY zQ>ULL4kdE(57-6+PTUSAT(yv_6nBolWbwX*$VrJUxj#QM{9V3_mW%IGK1KJ4e|$Wb_>-eR zc!`A{OeewX7}JLV;Js&L$Qg2Q^vM?f(u0Pf z%d{C=aK|XH0 z+;xtz@dLIaHFAV{r^OXnN035j2zG-!CllMPgk0XIe6c&vclP7w!?4h-n@-wh9 zZMVXrffUO$Rgy7AGfCEFVs&8BU3;}{Y%0f~6G>0?Lg#O=x zp+8RH(S>uRX_UFDyvY*Ydi>CZfz$EyFOHkH4Af2nMX%3{cLxCzY}6_aGmUu5wx;1y zk*?f0r~wD!2BB$~-$B*diL{JwbN5xY^IAnP7p-2dUji{NH6j2l>vWJaje&nNCUC68 zOzkZ`LI9B*S^L;@walIFS@BTyIbt|bN5Lm-pSS!=4D(knoLNAQE0zC>Lgy2O=ktbR z9q09{I6AxHcCH9Y1csNt0McSCK%yT6QS6l>HAeBy^22AHd{bm1e`9Yb`n<$Y2m8b# zG+`iTL?zZ0X#Um>=Rcc?cVBO2DJob)SuJkz5lV^h5KEau{Pa3~ThH!N9I_dvh(#K=@pJvma%_OMwSH0^W z+KXX>?_pr93r5(g#tivVq6&|Jihz|G3>Wsc5RXp9!U`NhD)vv zw2H9vhOHGS_y>fVcclLYgKxBQQcMkXnBkroP_qeyB9N-V>tAa%|KnawiW!o_45O*) zg@p|4C&zNj6#HthUZsOtByQW&`G-h7rLHHHPrl=gF0M!R6%K|7uPz!$X1Sb!v`sWX zrA4%RP4zs24Xdwp-ESP58zIqZ4lN{(7vfwV?^Qkf@3LTe19)$uuk+=!PnciTuWZOu zhh$MlAT|=JN3P#;fPPQmu)q*2G*Bf*Om2xL2cF8vYaf%)S6j?=dCv7YUm7Ed1y}o8 zES3Jp#V^ove#OB%YKYp%VkJ>>2;Xb-LBmsHdZIbt@sC7hR0dV0Zc__W9dP&_A39*p zi+%q~UxvQ4xM=QazSkczw8<`jVY1*I$r2tjQdA6h2PUfbF8L|Xuv#QlhhJ(O_4_K7 zBQJ1Dihq3)_aZ5?)H_4qo?MTQV0gI8E$p{SX0}%-jM9@Q0DyXs9dVL!xNnRX# zP$3Nw6-U;aR_)|Yh^ZN-)+5SN2K3jCsR!Qi-m`P+{-u+;5tWh^tF!UCxqf%ceEK4W zN2c)(Hlm-?V#VEYFE^Ff8I?AImg?8mFHnGv>sNf zVF`Lax$+-}Jnln@@p)L!oEo^QC?czWLhq4+~mP3>A! zrydQ@tIv=j5y4YFP(yMXQdu^zDdJ|^g_Z{=PXCdHWTrjNr@|X_zg-3QZPfyxox6u^wF}*=Wp~U09wj5F z&)X{XD;(TWQ%YteXnrM`fE+2Ea#Ce*{t$fy8W6<0UvI>kBv7y1TNDf_3<^)`fR&P8 z^WIopXx^Ks39*8%l;Jg9JaDy-Uz`VOQc149lmqKD?E;O-)15~s!Rpg{rruKQ2Fide z*qLZ~&WLxYjWW;eiGEkXu?JULeS+$=LJ(I;MdShhC!OaM0 zKL-rD()YyE9`Qt?$5M7ebc7KNC*ZCf8eDi zN5~`eO_!IBEV~tN;V(JeQiWVUM1R0W#RiagL87h3ozt!Ryq}C)V;B&ssXmwAmnY(D zw#jVkXt?oC_SNzMh=m~171e7Yi@O&(3$zd8@lq^MFI%^4mWCU0r&vS!HXC}ZXdqa< z$Ne=D5gY$jf>3`6pisYpA9>$0(1kC_ZI4ey>L?khBRInG*?Rx2J+)(#h;MswLFe%i*9w{yK)E;Ga1sy zu?zuIBMfv4)vnz|o1?((#6)F_@4j~+`k+>O~>|E(RAmrgXX+>bdSjr{m&q;c;wL^{VGf53DTNJ@dGutGg8 z*N^t-EkVaik!elSvH2imLU2H~RC9SPeljdfiA6^kNI1>7c(E?CUHDDwoDQS!Zk_R8 zX5^Z<=hrHU8t%8MwpG4JhMn85vqRJ8s3A512(9W!gS@YoZ1$8WW=UTgXq5ve##R0hkTX0ZuM>ut7 znhMs-LFHYyTlF}Y&7XjzUsKE+URnCclxLxO|W8FE9lnSD;DGvdciZJw?NC$ejXjbc~E)053=sqAC zHi%q4Y_i+9xIZyNnx5p0+D9)B@BYc|Ob<;GnWA>Pgxtz6r)zWhL!tHreN^pfBl*ci zqt?zrfv;l;_(aT0xlc-~P!v&Qktfzks9(a0t4`qCe7;XFN(Y@4FB}24K4Lk9C;YU$z?n) zZaLCUcv_iltyIPAr8zaGij+*uvm$sWzBmq@?? zI%iJqc_ZA)o4Dzf@Hq7eASPSv#!4!a+X=A3;0y=V;TaDTe)BvL6Nep*O-qju+7PIy zzW{ItuZj|z(|n{hg1@#PtsccId#FoBB6aspIe#{X9PPL-zU@5zTg?TIa&u=u7ep*V znwo!qJ4b&60hnQ)&yjLW7tk- zxoo~^N-Q3XM7ZDKI^k@4vSAFat1MPz3)KqAL@bmnBr_zvC6Og6r1bBPJ^yFDsAa%o=%tIB(%s-MIBKifdm-S~ zlCH>a9l0-@e_!JMS7R1mwobb?&@mpkaAMj;3v`|FbRI#P5@3v8AI05G`?E7z5ijZ>Y+bzb%OYWTK}BDtaiRH(+rDREWf^Ch<}QN5Gh>D5jcs*68Y z_*-@cmfnXrZ!ctuUdKw(K_z~|nS10N4Nm4rO)!XXpB!4%E z2~GOcB*%Y=!`{Gk{?vQW5sTLxc6k8H%3S)SCnkbZlXLrh6}?k%L9G%jI>*yaLvuz` z2Fd3CR@yw<2k*3lhw~SiCe7)C_qW#E5!77+n_cL>JE~`wA~NPieTX!gPhC&t;xFU) z%6~EFdE_LRff_Jso{$7OR3jcCfP=(d;I^FVP!m(u8M#ZjsfgUX*}m^|^6r~KJsG~2 zAcX`N#6q(I4bQMA(}q>@rFDxSx){@IXp88_?!TMYjP zP*{0Lp~c2N=6W%Ybaw`695=GLX`9hyNY?7Mghi~l+fCmUTx&@Y^5rD zJd^VSkodRza(?@*s{G%5rej1CU(tD(nsn>iOb>A9eW;$(nl^$ixv5b+3NS}F(KB1< za09(*9gO08onY{=4 zM{<9?<+dey3Lho~4`fln4CcTM&<$^wn!#eK`ct1z`EDQR32?W0FdGp|yie5ViXy)C z>T*~6`L45fD*;4K?&PHYizVXw?{d*UCD;DfNTTNW*07C-Xs^s_L`miDV=RV>+?TT& z(L+Q6kCd!3mKeL1v_0}E?zYEnDwWm!L6g4Rti2ei%qDnr^XmOE)B;$}eq{h;V{Z4H z<6UacNHoS9PbASPWJ6PL;TwSckqF@<(_2^p+VuE(3OyIryJjhp#at@M;?GsF-}b9l z!k1=S@6yCyeA7`(IgtAxKDwsdHu9c+kPvn;FK0UR+NHlfb)YdLj&p)7caC(&g z)(#1(eq1BYuw+YqK{T(@j&uZfUrfy+gnkE21IeHWyrh(bm?%ZH5;3EiQ9jY`o<>pb zaWxVXF@?@UfX-n7y2->Cu!>s#6##??{pPoj#{R~Q$y;k0NsdrHclsALGRIEg5zcw- z9aFF4rxOKyJA`%PD~NxQmlff34*58N?S)QrOVvnj8=<|hs;?M7ePIu}p`k>PQLJ8N z9d}JF;yU)yDw(7?o;VBrL04t|L|Cl*>>5@35wGniB4;6eMXy{#X$9>-wZ!ZU`U~-F zR1Ix|h}J?tm2&4Sf~oIl)5OO08ELon`1xOjAbmKzUcL<6R0CZ`Qj*blIvls<^;@W3 zOMgs}$E-wqcMV$m{%L<_AGrZ4uC}FB{fC5ICAu@c-1lraNcr=zAvYV%<1F`Ln-NWh z{qEb5x7}dkxJ$3*vCWn;I+_AXg-1vSwsI3)+g>?uOy`=h$g~#C=o2(IrL58}PwSL` z_o;jT41ko<-}^d(5>Ll?8YZF3A5_(Ov!NRW{wu}$>pq;n(0B<7S-W%RWem-@q8@qf zJPVX<8qB;t)1(Gqx7Yunl9Pe);MyB3yBu#$Y}jhX!(OrQ+tr~>8=hL+EqOJKP`-|=6woGz z(i@oMV5;WZy6Krc&h5ta$#+=MIbGP5-II#TFu;GtB^P;e|1uO^sP=cLgH0;zICe>3 z?Zf$dilEWC2n(A8+X(v<$i41gI{&{ZkpEQcpOP|Het%CM<(ty;h`GOp>ZkHGXzqwd zU=Cdo+C6Q22YYYqGg1`hmeKY%)OJCK7-3Z;@*~Sjapy%IU!UG+m)fwflJ}kT+$1@d zj-?o3Zgx?fxVUFPRbsf(rk@iX@gw`=K*H=BR0~r+fMM9{1TydnqyZ4jEhj9@ z^>J3M7gbSXn=L$oIaSD%yN8WEuvI}SsT}!9_KD>ziVjnI5Yq(_vZoCX1}%uoACk$kzD&t7d}vRApM6 z?Ew3CD1e4Dz-f?`kX@kZm%K40u0L=HDFFpS{?RY;7neC`O^n6R>lfhtj}I7agPE`tq=fJZJSD zaHpli0t?HY7iJAvv=$jgg{=ZoM#B(q=Vr%cLk)ea-VQbR}kum7W1VhnV(pQBsGEuxq;CBt<9}{905u%qvPO)yT>;5AbHXfd0HI) zur$Wa41-Rs$ULVxD+gKPsV`M<`Pt`y^puNY<~W@d$&t$-^BDHE0lPWY+XXHGxj%Zy z)0i)sCJRe}{dj?EwHXd=fDzbSsy^kw|sx!Lp14r#D81(N5)3m}xDsel@<;yEouv<~gx_lYoI+IGIzEdlZ~(ARHOmcm7Z zrx1%NMykcF0}MjNE!DG`HMFkrFM*Y(VBzBuPIqc(H*(gQ_e=;EKsAea3*P5~bOET) zk9O&XgcOCE4g}JcnLcw9=cQ;H_e)MH!4YNG%9EU)Fu}6>M)W{~7G#KnQ2;N~9)Tvp zRB~I4Sl79=#Wbuj%IiJ_^GscpqD_4FB$2juqmWH@N+@y>5Fo#{m@`r!bS3Sbh3%3H zsVfKYC~L@dN2B%~kwlb=Iam!q$`8OO`{ogr83Q7Fmfvxt}^ zDdq_W{$De;__^2>Y~DEK_v+PwhS$%#N;PRiO<|5ea2U@u3S@yX+$#Wz%OF!*f7ndG zf8Ti3a{+u#Q^{dNfi=G^M&JL+qKQ1jLe;__T@xN1%`dXoY~w--TQroLcjQJ3-<0wA zH!c4^qNsReGOL@t8Zk8^BsV&c%pZz zXqIf^h96;ByBmXej!O;7DFoLi=iH=S_kc1lHAZg$g!vTUBZ2|x@A z^sYI@WPOeQk17{+-W6k($nk+sQyo>!+jFVWu-)L0&LW+&*AI*c5HwAZ0spNvMFXgD zhJ6b(rnjZ;Wa-9pWW%3*pX*ps=sgc}*?M5=bO(a#$}PJ~3-|ja`W`CywOD=pH<=Y^ zg4+Fl8#@DJwK34GevUxj@rO1R#5M56iHAwSqyorx8S;9Qs-)U77XoH|(Os0F+((-0H>XU_r!OXpSfoK5XYxh=k@BZBlA}xOuk@$-9;o zN2FPDY>pd9mbErpHJAZDY+ok53o1dek6-T-4swN9B;MEy%Zkch&N|So5Abj$cYo$D zs?!Xb>Yh5}AZtvNXj=8%_RX&QdVR4X@D359o_9L-|0c%)q_9)qdg(B>Vb{1<$EERn z_?zPCc}v|J6fjM5$T4h%O53-`710Uhk?YD&hXye`t zkaxu(A3Q*C{^p6;+;q%qWuM}vouy?}&z8OvT9-)asDpXeRKkw#Z2fvS7hG0*(OK;o zLmOu(sP3HiUu(Hq(YXdJ2ZoJFs*G3OzZzePYnIC zQmF*F{6|wtdXRMo3xGr*vn!o3_X+}I87*@meUA^4k$jbR(WkvBy%G2lyole?DmrgN z(f8W9q1EVfkH!cW=yUdY3$)4oK^sVM+~ZcaPd*gA|J4)3Q@yqPuJeSc)uU@8?mVN9 zu)HIWcA|sMZR5L2pFbW=>>o)byy#hLFO%%xG@DHN^Bd=tC#Uj+a|45{XZIzB5kIU) zboQ=pz`)w@)?Kv*a#O)v3JgEGMXgR9Rr8@rvYe%yTAu@VrCTGt-m6YGLr_ zUd=uxnv(C!Uno8*K~bO0v0{_x|0Xa!e=LGRp&Iljl{t@Vw0z8=3Qu`iBs&)Vl%Gi6 zENHpVsyU!jPR|OfK3{HT@#S#cFZf`++%Q2qpOk2$lr8SOWQ;jwSw1vLj$apvggaDg zJT0mV&ILa>xEVc&3BL=7V(OwM2j-UqCSsFx<|Fm(HL^eA9>wtGyB@z#X6{Z@H;)0$ zJJzeF9I4;cJQ)918UW8mt?IMERo%o+#2I}N-$W%WxCTa+Xi|Lh>P`%wb{$+r^j?a( zoraPHSs5f7_xsI>tq3&NSUMB(-UhJ$?BzniU9Soja^~QECJzOx*DA(7cRlw0b29|< zK*iaG>3rF_OP0cH@0DH9B00%|a0Unb%KLV^(`#*y-Ci$_;rj9 zZQI0dqVMwS<`_o0oIxZN#;_}RcAe?_vvNa$mvDxk7%e|1Y^xy9tpg+wAc%&s(_- zsZ81};6e>D2dVWEr1Dkb>;B6XC3h$}b<(Ny-DjtahnU@ikalhz>O(_;JR)r@w-iXq zL??q{&pR(hC3tc*eV46{pWx$b&iVGpF~_l&4O&*NeK^Nfs*HmdfAwl5e)COYo@8nw zv-=k1W=s$Sw7{jZ7$p3f&v3TVWn@*`<<(m>TjyPJzpo)OFdP+y%sK%U*{z6@34Ldd z3o&GBb{^IrdBtNmp|9Lu-?UngQ1+iQWRp&fLvPL>IaSqa+a{}L z8|}#FUe}t2KQ1&vWOC>@zpMyamS@d*Q81q}a^?FeC*eB%TAY0dNu>KbCYeX#jCl6V zbLmHzVwI+reV7K1WEOC4G%6Q;YrV;B5~z$5^6|iqB`L%(#HF83e)3ot2{E3X#Bj%>aeNP! zo=7-5^^hp;vq%Ip@@cxyCyOZ7DlDIv@U=l-=|vv87FhM0^exXqWzts*N{5 zyl2-dj%SnRK;U&3M!Ai=jI0Q04{!3iqcRPTw{Au#X0&I3G7h63O1+x*F3rt8PI@&V zYXX~uEjFrGyu|6KJ30RO!)2uQNl19iF=)wH0%shz?3{RJA#1Ewx*OfCTxT5d-CkC? z1x=);RFbG3%tP!#ZoGGAL83E}GAVK?^L^`FiQk!h<6|O8m^e|5`sN!Ezlug;$+HEW za+t<51sW!*mUs2l%Gi`Ig)8&?Shny@Ka?5P@AR@tVSbuwU_pRdr2U{S-7U1>Xq;FRk^J;>((e1`(jRL$;7t-2ZJvE*G@v(PA<<58#;xQ$XK$MVntTJ=&9Sf zgzElaZ)|%&+}TN3*l^w9bhS@6ge*Q}Pj3|6~)2GRX;6v;C?kP{);y58AK1-QSLS3_${NqTBj8=oNCb%?;%eRRpts3{sUNzW4T7?n%;d%A8BtOT z)S4}P)Pr4?DFdyKp|r-ui^rPQx07Tt50`ti%f2($ZT=~$?G|#E|C%U*c|Gp=t>K$U zF%eFczI;hjQjl7A!v~fyJa{8qOO=C{4LK z1N6W;C|@rRT!6Cj7chj0nT3^&10fTL@yB`iV6V!!`lH=FfGsPlX{@+cK$v-0TJMQPA(zgBO>CLWw5uryn4BLV7!L}?cuhH zo|s^q15h7a=!y*5%N2*q=HrimL@;F^7KmVuV2NP0!@7E7ki3GxAxr?;HNe%&=Z1nm z#tq|-!J;vC9%vsdykf|;2Ste+($rKBD9uf+HvVt*BbbAsC%dY}V<2XXZe&Xzic zfZJN`JphzXMCPQ5y4fXbTSr%S-;l_t=$P2J_{8M$s``e;H!a;mRK_3%6fk4RVicME J>YwG(e*qWax)cBa diff --git a/studio-desktop/src-tauri/icons/icon.ico b/studio-desktop/src-tauri/icons/icon.ico deleted file mode 100644 index 4780ecbf266b6b2b781b5d85a0626663de8090cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18820 zcmeIZRahKd*DYF&H7>y#cL?qdP2(CQIKc_-?$9_1l9v$NEkGc+Ya;;?2ofN;2M_Lk z`2KHS?EO6FIs5ipyme7sv#RE*Rn>EiQDd%I0008O06sqOywC!XNC4pTyaj>$*ZzqL z0JqQkXlegzZ=nFdAUXi>@ch@-0RzBSod44X5&xgIF6DpD{m()REHD8;IRgN^(^OZ) z!6e6g-if2EB=`FH_dh+rM@M^J)0{n7005GzvYfPzU$%F$hLVmJ(Lm^Sm-_&vHdtA^ zw^yaNX0gGZ;2{}i^uFOAAHc|q6O|;kl$cubF z^EwRVKXd80vRRJ*XnVFSdUZD{xgxra**$N_ z;L(+Trp6PC6QhzN`Y=zrX%qBes0mR9FDf34J|XtHP~Sz5zdK@C7B*2aw}gZMIjiz0 zXWKZ-^NMbQ%*{A1B=!cwQa~OEF~z2g7NVyFWb06ssqns!qAl+s*#wK)C6v5nGpLoh zy@}izQEC8h8XlQ$+Tq1F4LTkcyP}=FX7wdnn+~;UPWyROp}N9#36i@tQDzAsU`7%R zd;_xR5DUrIkN%FjxP)$d@~FJIC++naTzZ{d|AxIKtA1c9R|UJnZkt|gQ;&~P4vkILsyLMjFU6exR`gB zggzHXgyU^VJ7I>S%QMMjmE+A{7s|gk7%znO3%o~VB2Iz&`C|r8C~IpH1dpdR85EST zH6>5ky>_s3%2D1L5w$h@ZR!|YcbThfS&1bSm{&h@`?&J-wAAFb^xC9>9*a&=KlEnn zj_>G*CDk{kF1?h?$Ic|2JC#XCwV*Qh%H{rir1a@}X6rA#9*Nzk3&)M?hGN1{tpOKR zcfHlmq@B~dxp-jka@d_6SAq-~;D`S@-F-f&o=H==V z3;NURd+|~sk>J%vt5W6i{al1ohA4F$Tcnr*0UrSh0XnhAuwv2@P5+`FP`{m=AQ7uf z{XX_B)UGl+x(C+9@4s$>$Gm~j@3x~kHEq_xLUEoOU!sk}MxU++oBT)=*T!q-#PwC- zpdE#)X)bwGPJWO4r(7OKmtcF$pk47qtf+%c4F41~R(T-V0~6{hDL*b8g1m{D+5PH% zu>5yR7OZg|Y0}R+XncJCyV}UQ7J*K~{gQ<4#fyTyQjQ*d8Nn!g3mfWPXJo;IOPhU( zOi0H=X{vHg->Lomin??Nh78Q4fOS|#H?_-)W(fTj$cl-m`KZVMd6i2M*SbcF?fU$r z)qPuc5z~uZ52k;%kf*wX(eI52325H+QAaH9hl4s}AVxplz4aRU-1*i0)zrnUQAd*- zEpNMp)MaAe8->rwl{>c+f!LOpYeC7Fc5nk}-#|wL6w3tDfRcp4=%oOej%%5AVfSCL zBTEwl3}La5ydZ_E61a;-0G9O5VdR=A{t`a&`)2g&2O_GRH?~DPB~14;iTM@V6rx%2 z@2T65@V5pYR#h>+OZ>(E8G3YVt!NVFbcZ4qOm&Z*v9O}Th{pLCb?*Chc-9RzvkbFw zElQd(=#7(#Y+c|H4vyVZ^p!Tj&#B-yM`dqMQIl_zQL}F)(3(_Y@QH1kR;W_&tyS_x z^JXaK_w;t{ipTba+148gtBY~imgN>qF1<=pw6y0%u7Y2)t~JsWZG?trHSHRa{!^X5 zOc#;!mgW)kYXx`DqJ=QW7^Rt{Ufm|xtrUk>BCgTyxUgcZ;AZY(Pe*{*ur+>UG131@ zx+ZuCEj>6-y6I=p29|Rz6Kg&6WMp!x`%z*-Jc)?nkD=_~W45yCth&ZjX9*)b0m#B- ztshx5Nq-}S*7-G|`EnG@(|#!&_U-cbLNr~rsB+8oN1LTEBHfp2Zzq(V7*w@3Sevku zzrmLxt8zfizZ`P)RJ5d=LrW`iVV%D_RJ@BSw$W`vqnzeZ4Y|DnU;WPe8`_scqD!pM zy+|n75$~HNnD=E$d-7A~m1e?xAo_vldug^phj=|JMByemQQAAY0S=-UCZfB#7k4-F zI~{9(lo>q1PgSE*PR~e~pj}(b+BPoK#teTa|0Cav35~8+6~}dvq-a+m!hwbGoiuf7 z^@q_Dh~+OLRerjK#$%$Q6aA5VSLZ=;-4iyOP7SAq%?qZvluXUqFR^3TpJ#~Q=-loc zPlQT&TdxY-%}D>*>eGn)e$JDs>N8ARuke}+tef!V`-M-*_Lh`DvHkSQCu<0o#;~8? zbqUsBR+4`u!D&uRSJ&-BCoh)bRLa$yI_1acV5oge7duZu@9Jw+L;_3e^=U>O8%^HB zVnylG(Reqe$4}egyzU26!XJ09Di3k3p&BNKnr7kbY0hP-K_(LVce~{o8lA@~o|jb6 zH;>5c_zo!g@{)W17ci%NK2G~TVD1?Za1H<{U;hi{jrwn#h;$*3kNlH!OFm1^a1!#k zMJM?}V;$^UIY)Yhcsas%X>!PG^6@e}=ujo{Z%PzQ67QLBiy;@^hM1t}a^dE@2A{sX z!qV2iS6V+oNbxX zVBcFc>vFx(G(8|Hm(s)3K1+Rx{66sClr%WKs@j-OC(;!{he9uJI2tOgnIwDe1ugQ& zFAt3p>)EfQOT_y210LJBkQckfE%`>p$2|zy?QK!dBN0<*%y}j)8IpA3tr5R3N``l1 zPuKIBASN?7z59TZv6KU>LDwdm!76ZD0F@6BahFO~xB)C_CuHr}QQx;k;e>+o#TX3nuUx`gf|=yb7-~|xQx39_enwxz>MAVs43S3^ zd!5!QSiea=j5qux9cp%@sMiMs7Dz774!2^*;L41?;kAtDShiKbvf!M$3EBrdGz?Va zt5R!^z$6g0=(x)2t1w6%h`i0$wX0mCJMRDsd!6%pRoma{8c(50XP&lOr)Ed#Q7^a-$ zA7MCZPg-TkIja+@`ZG}#doh%82Ib6QI(CBa`O`cVn1B?{`%yeDD4DOKxPx9W%IwXJ z-upJ4`2b`1xM>p0Jd(&{I9A%g;5Nb`_{*tCfeBD}I`Uy;AVEez@3ZZIC8*}gbGVP~ zhW`-#JddUqoARvF;TBhhY5`aM;f(}-qP~w}`ca8R<*Wya&J(`*%9d|7Im(Azu-Wbf z1!M;eFXyKu&Nbq0beez*)f{&7tm3?xl zM97x*9EzBGRh^P0v#TvjF8qe0OOKeK8mN;!F)hY>3Lzwc)NS!i+SQTseKS$y$tUN0 zoOd|U2FJx8`i$?(XYt$=;Ja=~n(K;gr@n|!pMHIB(*L;eHUByXwb0%-!iEDad$HeI zSeKGLdE6En7HDVn9gMg_BKQlosHFXb#-a}Ta-aKgFVliEfb4fK&J8qh*JhSo40eI4 zEiY3L zuEEfEZ*T_Qxrt09&3r?No&WVVzS-+yMdl`sV}$>loDYgjUFLoO5aa@GAYqyZnQ^Pe zH_?yf0bKbRV^3@xo-~9HZuOrqL<$gi(WafpZ}O7~1iyAWeV-}2)&>EN`mOc5} zIB!)}V5pvDn1=_MB^Exg@1zCRCI}9Qm3|1CzIXIYo|t}u)Um>cK=DGc1FA7=3P)eo zPucn+xwg>-Q~o>W+?9U_2FoHEF75cxPoCD9;Vq#<8zlc1l>3hm61|0<1l;0ag)C;&Zj;bS$v`l!9S52WH~t z$)frAanPXLXR<$crz14jsM3keVD~D-sG`Kh!k#NK)mK`%CbdQZ8&VDVhgS-I1gJJj zzP)UoSbrdm{sut1EGh*E9hE9J$Lkj5dArdN)ITAtt@0iYCO7LvwknnY%_8L#!|Mv# z%@2mdc1?xf$Y`ra2MxbBt{L3hHr&en`e53dc1qJFAV0H*Y<`akBPx*<1&uNFSs%P3 z&0@xT2Rc1(ifJgoLrRZc>!TXKH9r+5q~`bmK(At$Yzdr3FH8*0=6pNn%8B z73N1zORJ3^9UhD5i_=ZvDFJkYW@mS90mVtped%>5`S8w+R87SYoZv%ev;8DNMWZTQ zDSw}$Bf{0H96VmTN%L;Lz(GC;A*r!GRFV|V>y2t2i8=p~Y~O0%^|q;~g>q{+G;1il z8HopzK!Ml_4)f=tgP`gzha*{_4_y9foB!N_#&h)2s>Bzmj7{goNV+)ZwDxfmP&i_@ z@e{o*53xDq8tBg(5pmW)RbAuP$pK(xjS> zUgh#+X5|j0%iX7bv32iB^aeG+dg#1b@|_svmee%Q_23=#1mqJaR&weD~ zz(L#^A!G3gF^J^q+Ej}dR1yuj(tR2k;pbrSX*HRnr8P)+9l^FY*_zC4y3R_nEoZi< z0HIAgS1Qfdcp&7k;vw$_MJkBYxj$`>Q+0#EKM1bZ`Dj;H6B%IzY&B|rU;6WvK|Btp z9)?K+uTCl`a#n1+D;qK}28u}(p-XdU!CT!zW^V=JzpuCxW+tke*Kt>iJD?1e7| zEMZTKBVkT&3nG39RC8kKwVg#(wbMrBXza4d$@0q#KgFz8(tyHvj5T-noQOIJW3SJ+ z$o;`6ST%nm${c+*`9E_2QTuRn)c)CwWeN&wp3huJ4biRb(@FC1iESke!ConJ9dR7X z^E6OW(t(XKmP~v%jpg4;X>YIoKd!Aw0jRO$ z`Z{8_c$7NnLez1&%_=1UD$6WRfd+N?3PoGp7uBHxM=FL4lHXqIxvdPM3O1G5AccDh z1t^NLH@aoo?llx@wlg$7F-j!0p(o;fAxtkvd{cL;_C@<5Rymr8jB zo7|iJ8xwO@J}2PG+HI!mJWxvtdBA!2?-!vtWX~B7*Y?pShE{7fgA%8!;cs0#R}MBI5r&j{S4w&7L4~+1@gi`TWOFoQS|>`SJp>r}g0Ver|({nv2VTS9a<99K)wy zH{t?&(h>nSsLrh^GD};5*gWluyHgmhT(wYSi6ePN()KSYBf~7ItECjkt(3^>bc(ri z6|3vP!#CX={)*GRTQek)cnTsEC{g+D&)9M@H2fv&k91q0mtWo)(w|FHVA-Ma(JQN) zMSh_Xk?vQmyo;m&zfU*n{hH@%Lr6&>F5s~2h+-5)fs8%ymwHV9~sadELrPg!P7{Hn1wGEPW_it|K-$wIrU$i`mav?SEv4~Q~%Ye|LWBL zAL&%kvx)@)|C9SQ_9(Lf0H(tK=6(;Bz}dvpH^Rp&{GR(l2C2)^L{9k934#Q&*t`z! ztM8dqoTOi!k_!$%id>Ba*)BicCmXy-n1IwW5fmw4*!9c6GQ)pmoky88E%R;rOL>yI zSuAu04riPONgao^1|E&fwfcr!jb!j|<40DUwCgKweE-8k_}$`tJhXq2aHKO<2bEtR zFa{~0hRMK@*tx*7kAz4q=@|!&Q^>KU)cPHcV`En4Is`hz5f$m0);vBnbv}?tPLi{E zO{(AH#oOfGN5~W2pT0TDhaGpQMw}SDEmq#Li}pt0$73lh(3Burg(^|?UlMAA&vHYx z@f!Rp53CRWY~Q6W7=@ml>b*2YUT+*RK-N<=AOARR+X*chrdA$`>7Qc+D6bQ81&|dZ zPUNG>Um=pry&-T-aWJg_7#29}&clsrg(1y}HU$pzn~*5y6^TQE+uT2L-x@@FbMPlH ztP^HTD+7v|q3LU&qe{T8LPFWbRIcAM->)kLdn8dkz(2U_s@5(K1r~Nv`2$ub;7*CK zg{)$XNRXI2c*6qtf%*Am2ef6B3bHl&Gc&K-irS7YkfqcM02L9(24-XTXO8H?)hk7M zx%{+hw*f!b02+eSsUZCCt{aQ%Ot~`8kH$`Ky3jG;9c%t6l3!`nW9mKwUTokYmUEv#ryR+thhKpwUUl<_KMohkkAfC)+C12#8kE+d22GF-D zAmzthZ?xaCvAcr^Luuj(ezG*0NJ^ywLw?MWmv@ERa{vycrSq90Z3rIai0hl$4}hbfAAe_YY30)35I%uF+E$c<^w%4o!r3pZ0PdT`4#x8QA%g**VQE7DfE<2@&J%qx=d9778@@9V!-2 zN%r)}YfN6xeHTbXHTwwIA$yis1RDhi)!!0_;q9K2x1zw2k;iNGOfh%INJuM`_s$wj;$pk2TFvldF15d>JTej7%AUh6jZhnMHpuG%lgc5RTeGC zFE`KlW?UylKp*g;GN-xkEe!`AL`c-QT<d8PYf&iJ;OUt+~}`SGNR+=CIb58)*!9yv!&b$Xt7IXtkYw z>Dnjr+?|qo`$iiuy;*Q~P&)DlsFjvtxaAblwdfa#DthitV(_T;FLJE?+W5yZSIo+> zJFv{-4^Po&L{-QJzzKLXdfz84dW$5;fR4Sjp5OCb^*~eig>2g}gE71L4BEP2%wy?p za}0J2*q;mdxK9mL%rH@$aQ>nA9C z5F=s|;EN}GtQV#KXkE#+IcXzHAP5D4<>Og&;>^Wy;+`MA(rJ!|LWZ}0$v5xs z-yEM7HJH9Or@MVVtV2)gy|$@r@l)@UWkBn-HYNr-4&U|Z(%w)*HlFV@7CD|*?IPs9 zz@lo;Ybz62P0$FE&qzl$k9~HXNCf@p56yh^-H~gFWJiJvOWv3W?dSqa|8Z3R#J6#T z(@lLVQ~+&Q;tl45LtP*boIB5l=pK5cHEjP$CZwN}GyHJaT zW9pkrK|(|kPB)pc(Rt|1!d0=zM=NgR)2-5KE4@jvzrQjLHYq;%qJI8G$AgxK`$dHB ztT~g+VGyZImpjZ+Z?jm!bO$qD;K$^x=NGmjeWwmG+&@D=O_M}0JMYTuE(I%S{1TcE z#M9X#AR+}1u6JtTtM!I8P=8D%Ar-)l^m!=Ur0#qWUPg&=U-TDry&1;oZ_)A z%CL5bPU#sjg;EELY^R{v5hli6iv?CW$AZ$xLfss)A~(pSAw^suBvi;Lj{&CVVk4Zj zsN9zTblx5fz7;RbgI@xx2V>d2av#JCI9#l;r6_dx%FGvve)aGu`n$Mg%kW`bdrm$) zu)z4gf~oXhNyTTFessTUOMHLZyW@$3`4b`l(lKfoKcU9uyN;R-4o*C`297UDZ);ya zq5LzLtarp89U?CL^&x{^)&Vrft}XXe7MSmQ_{KSh66o07q>sLMk^W~OmxJQ5>|Qf? z;mBKOZx257V;q=d5Aw~kG(&+)no5Bwo-kMAqL!OxG^?!|nzLSa6E?c6V5ReN*&J(& zDUh&TqfI9=u!BDKNO-^lLO^X~4_GUYtMY2sdfN756cSWG$3rWBY|CnQF$-CN4syPW zj?;=EWWogdL;jD?fq^-P-+@)B8B)1r&xTH0-qw1 zf2@Q0Axk*sWY0hO7>+qQBu6b}Ylo+vCRBj&MYHsX-^;v(WA-LX zH*EH*c9h(=_zzVlxregGWI*};L%+t4N=g4;4an*}7g^qrA?Bp^lQItn$ZW|lsj@n z)qEZZl67|RUa!TW;Igx@DI~ugy$cr4n=rjp<>3V!AL`>;d<02iMePg09aHxg9ut{X zGpFa9j)dh}T6Yuc2okXY8)m)VM}VAXqxytsqf2zt(%Y|odJ9d#Y(JPKe`L2qS6eGU zQzO?N3j1bO+yqUS1gUIN^qYIe}q3@H^@(hVpmdVZvxQ#oM^p0!*_qK=#V zt4NnvHKo|~(11$w1wwG4y~Nj!EGr}!nRMVla&D_Z+D`aehAEa%4z&*w6&SyJ!SG@= z`Y&2X5GGeQx#zy8DH0qP851eIJ%LVrjk%bp)&|=x8@y5)?N%j!q=b{{3oV%j#6AM% z8_?FRBkYbq!Ad4P&`IWEwRjWO_ttKtBje{`8^?vgy53&E545;MOIF>?)N@7-QB|45 z{prZ+S=ib-HwyI__0Ai6!9f{@ZY%hT{V_8Yu|%c z?sR!@2qlUQuB1Ubi}O|iU`WrLAhm(iq+NB|bW1J`tcQ)+pFn)?{TzOcn)B9C2m4*k zkNjx%rD=Zb*&cJ*Z+sU3C&pjFaj8TSb^^~-xpv+0n66kZ8HTu=-ixkRQB&MqzWF_< zu&9E9mZJCDdH>JStE)DPd-~Rm>Y`2q6gEk89X?8;1FXn^+2pGp!f>Yi_lvLgXQ$a1 zXPi|Mq|2JP0M{I_%g%ZIfh`?>dJBM9GVG=)R}IB+W*2AcI{;xX%kJzn=jigw zWIyj+;-KksMj1&_I4q4wTF?ptf4lKg6(GBHfcJv(Tl zJ#zk*uJUOaYq{}9bpm|$?Cf(3+0n{Fz+VSfGw;RM#H-(d-s1{QUx;ieV#m9V@}A4` zoGfm2R|7%GPs}5GT&tvsD&C=5vjJ#MmAt|3M7T@{$Ebm#0(ZII?_e^Zd!93u)8^Op zbS=g7r%#mttG6?^Vb^lk_$eQdajt#N1OwL`rXFY`)k7%<;DirtVD<8LoM66ckS0PM zmk=tusTdIuYUs-=#}%bQAaMarkFg1At|U!=i#m4rgB2E|3m&7s@9ZjWhtSgu!B%G- z&8cnhY&N;&4rqp*(E#BQa`aV^YxI~*MelxoIS8>uiWa!O0n_=dzsj$Z zKE{$+81$+D%yV7LM5yrc^51W03j%9>(LE@VKk9}VQnRn zKHX;5G_ltdSbMIVOX1aQ&Qr)%>x_XQB*-h~LhUHwk0Jbs5^-Ud5o^}$3IGMEzE zPz4eYq_*?e^;KVyp0dM`f4Hv1a#9wwk%H73>g|yI(T(5UM z9R$XkYdmb)6I}$g#c_~DbcE8ylNG%I1Ibre14YPQX)qB=UB7M$Y>?t1DKK*O7j&rD zv+?rR7UzV_U)c%j{Mc;`LcHxCTdbf=N8sdE3kYln@fa{S-@k7dBsgzzqZBFLWQA{6 zJe7YJi&EOIe+}(DyZc_aH3{DWG=oGs)Qz6xGl%ZdkPZwZ6795*SJ#f);8M{d_@ely zkG4_pHBKaWbkF{XJDtp#~zS!qbw>qC;NHVUgTeaDVPP$Jv@Ws8%={ z3zfH5i{yy>i6;o;R|jjrfRptCSY4lCxMa_+Y$y{2VtN?iz2EbW9DyDdz64uR3|EN} z@4g3HVi{lXPBo#zHgIX@(B%T)0rBAz+v!vJ+3NDrcU>Z5Md|P8KsADLzRE$bz7+`l zL~#ukzIY0rlqfZFAe+5+)ofvj?^yvZ+y8tJEXz3Q5 z!ITac!&FjZ@B55SB&M4D(J6fi%ajIerg|99`4JpeR=eik^7S4u7HdQg(#n3i%6<(+ zRksd46`0B-vzN+q{7oymjYg}LHskTGiFbVRku8bKgS-r<8cxw{^C))bRbV5U9bEwp zH@bMeRb860|R(9@(?`C*+TN8Ta|&^iNAdhN{n zx^6#JM52OQx!*V}^k#pOf6F+HHZEB|6YEq`b!N+MdXOz#Sk89mJsXTFCrzN~;`?Di zSf*?v350op7T)=qFiT+i7f(c^TbZd*lBph49xir z%5ojxaAu59>BWJdFMw9>!(ib{(((+j2@Cjyf@u(ufLZR9_S_Z6qZ{SJ-RKT?5+n+PiwyXqzQm znDr=GLpWO++FGINnLq1M8r{9IeV zqg9Qcs;;54?ICxlDcDHzIg^2j@9!eota*!32;!y9qMPwYBADqVZoJd2xWZ+laJF-h zAo(sV@E?gjCeu(8qTL+b?vT4Kpp;k9C)nea)vBLnhT@SDo*cpbub=4ZE!=_+>3t%c z0Q%H}9PQo&o-EctK7W|ohY_=xtGAk0vTFiU`&c~D*3@b`i=<(^X?^=6vSZT6j(DO6 zs+`0?qBN5gyyoi5y)&kq1$7VszH;bGw4$q8p6C!Pb!%!LP<+qsShXS(GQP-(KCBEo z#GE>a8EMcAi=`Hs7MBJ60`+~))z4J@HO%ywNBpU~>%?v{nI#Kq0kQ$<KIw?Mj z#7DXj?t2K)Zhk~L0i5@q0zLN>#)fjw=yv|W9NS}raj_PW3&c8fcbT=hcFBbDGVq{< z67B?Iwgj;19Ej1@ihKW~Sw=Z^V6NG$r7jWbl*Vf(5f5T1K|@|Uz(U|Gylw`xTPUZj z7|V`GrCr+prtwFvvNqFQo}(aCVD;(2WIUfA_{{xy%*A{o)5FodRi{zZ+J#n874Q{S ztU!0wvv?OGkS#jfUZYETfw;LeP-7mF=0s0h9Ic#mh80&da{om$XtvKA%;$29ec>Qg7HMGEe(0Gt}ID%v#jEd^m>vR{%C1NMnN# z6>db=Qqtjlk$F&~0rGI;_a(t5BQd%rOxclqV9NhNO{nRL0}nS6=8ohl_J8qu+89|g zz!6YCoMV=Q+T#NB?P#!KVW6&sQx9FAp|g1%e*u*L&*KP@4Ek6NoYMyfQQMb-PIt;; zZkZ6KiJ;C>xmp5bVtdzXqP)>2FcN@l{^3acLVO`@rp(MYbg^}LA$YRIQ5od>h2|^bMQ0s%CSI+s~l~(k>yjnZ8obqr(MCi^VsDE26ojgzQZsFZPy(< zqH(k5Jo@^ww8H*nG_N1TmY9w?Omw$`YEmUD_DQl0h^}jN z0sI^nn)?8CV~Ux8&jEwK*7Lf97j}{+<=N33cfBMRZ0={ez~)EmkCJY&+dD4_b&$s! zUgVlzIpW_WH5|S1?EX_I6}I2(FfVrC8-GLtV0xbCY;b};2``(|&G%g_{F5ChkIs@erQYdfShEhoB@0bQ6=bJL5m{Kjg~b5AsPXPQ9QkhXr|2*=Ia*5l9p z3(c^vp>M1({M>iBFKOxr9G1xxDy-VQ0iJHO zrMOVHikhgQ#Hak)-op%S%$!UixYdHR zwIXQ3BDa%4&5wxPVE8HePxgW~PG}o%jrcsvjY}yACcrw1!*2@`!D=g4aJ!()_u(z` zW5g#zN|$d_Ws+-eapAAjt?o5CWo!xfYDM0N;g`%MTX;qePdFhT0)cAu>qv~x%-k-F zX=ka3{?191ml*P5ZWtu>t-SFKF@pvT>FW@SuJgN8ZMjaRk2KaLCx zq{Ocv^@g76anQ*v^Ior%q}W}Fy&X&lS`3+fZYT(CV-7cTd98x8?m3&@*(ZapZy%33 zU;XGy4(JFKV2*?i``1R|`wzx%x0!vw9W33y7n3?GI!4+yEh1L$TZZKP;F-3{ftF4- ze##cYT9kMP&#L{!fAr368%Kh=M#3ZbG^Y|79t)vey5hCbP}YuC(yko9YTwf;9Nq7< z_qiw;JWy|OtB(}6rG3#lI9;Amzr^9f6ru6?tiJ*2xh8*>0pjB)+H+!g>-wGOFyH5I zmT+GRfk?eU1yh_*K%asIYj!aS-94c2g8Ow)(+{W>aQqv|VYi`UV&-5yjjT4WozweTDdC|s6h;~2W_e%O(3j)3oJe+gGeH|bCsZ_MAn z@K3$pQKp?(oqte^7oTiBPcs3CW+YG%jo$WErvH#zs>SMA-OPbjjT$68+^h!l_xNyu zLS>Rz*QhK<(1LC2O?dQ>pq^5f_U@i*=s#^q%+}Bl#hHP7_T0Pp;4V_2bbTy7pzis2CZ}^#ps=4sSKN@cQ z5!VV|UdGu3ejR^i!TEq?Jf=BgJAb-z(*f8QeykqT z5v=aOUR7%`bOKKe?B*9*z;3ki3#IvpGiGYS=Osvg*V*O^jVR-!9QmMhKw7Jy6^U43 zl~_Gqf`oZ!wAg7Ix6`l(wi+!IHZn}PTTlU}W(_uv44iDjL@p`Ok5fboZq-Z|BWuRYfyyhm{PPf!U97-WYUZje;+*)Mau1Fal*W!jA8fyvZ@>etB@}9*%r( zv2M+}ufHSH0M2bjf3rl|4Ob40`7A7*td#*uCL|~e+Vj7+9dcx19|Z6%9E8#ya6e7% zc9-87Ixa5DYND4~el}AG(W_@m+aIw9ioMu7N%L<+&8qRC3W#1iEAP>E&MgTbc7WyG z&g+>E^c<0%{WwurT~bNVS75OBX}5PBZF;G#}qdA-Q!~wXM7)DnIh4a1g#0c z4=9eJ@J+6KymqQO624_L14>JLBlnVk_*o+kT}M3J!9b#f9XWWX8Z_Gt`!+{`;bjPI zri;{P?cJQnJ2J`}bN(X;IO&{x-6nIpip7#4B0njTpZPm-=Va`U2cJ^#nK8y)?UQj* zMQ>&p=tU{;^(D7Bct3EoI zVKr(HxCrB2rO2hySFPXh@Vugns3t82Q{F=69RJEJq*jTSLH(9`D+#7Ib81Vd6V!mvp7@O+ zeOEtWy&(DoFWSawVMVh99{4$hI$L(-`y{6(_1grO?(`kmj9m5dIfSy87i3-(lKhkg z&)eaO!T0wFp3u!(!UMbOJUbluU-8f8+R33GnJ-dydRX;{-?nf8PBz_VuJoF}&vG%= zu!FSEe;3j4FqH~Mt+kPEx4u@t4j(T$a; z2ih1tzTIZyZ60L(=OC*F;r0EL*N{w$Z2Y^i1k>6}caiK3WP}1TmtQKP6lu1gokPaU zk`zK17t*jyFmoeG00@!0tx-n&+yGUMn~>1W*G3cN;dfddIJHDNA|VtaK359FUt^4< z7d?A6^dlDEhJU~_tJQN{3DE$<6K>6#`mp;o7*?5TXy@n^CMkovtNj5VLa+bZ^AohmvIo9&s?a6f z7Ai?{+(C_4^@j#?S>J8K9;=UzG@@CE5AasSJ)(rG`1qcI) zk-BZ5Ggou%&-j^%0S|I(^*i4YE&ury)9C$?)!^N8Upb?NYPtcu-n7tDY>9qCL3k>X zEO&5^5_2~U?pXB=v$V+YhZ6N#W5i1G^S?$QH4l^J7AMZHD8{NClKDs`93#w`qbcCM zsla`xJY$NgbjH>b(Q)bP%8vB`B%$Y<5gEwCGbV8SFg{fhw`!4F32Km&4Xr^KbYH{) zf9GL2&$GHQRs!=@T5@evKE^vAKS%~22i6hPFm&8E_hnSB@UK<;LQkJ(_=O((K>n~C zE}y2rWzs+iU8?|Uc=-)0LOtnNyO39*9>lOJB%mWIqdLyC?ppaeep>@H??8c0>Gf?x zLG~{#AdGDH%Y?b$71C-qC5SRse_1#@#a%pNEGYzl?tx(rXy&HGt!`b_ z+ok8hz~2;ukS7$`lN?%VcB-%r3czO{`l*d8;3Vd0^sIIh^9A6H8dh?MbfWc(a9kU7 z%*)y(>a}*i?XA{#pz{Ja5F`rm7$ZZuf8SFy`H=7Zu=-CG!XF!MtzuzRY&SG1uq)c? zeGj|e(13_-*h$VB>(SUhUqZGS0Y0KP9t(EK@s0qLbc9Y6^?4-sOYf1rT%>?Lbuwji zm4+~b#^pP%6FpG9abv5^2MB(l?kEq86W~e4d%>h zz0oMr(MyU?Dr~381qf(Kt9jzslI0eDp-1UzE`pVI)Je{j36KJ zemIj`gC5=OdoEBjsG>); - -/// Find a free TCP port by binding to port 0. -fn find_free_port() -> u16 { - let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind to ephemeral port"); - listener.local_addr().unwrap().port() -} - -/// Resolve the path to the sidecar binary. -/// -/// In development, looks for the binary relative to the executable. -/// In production (bundled), looks in the Tauri resources directory. -fn find_sidecar(app: &tauri::AppHandle) -> std::path::PathBuf { - // Try Tauri resource directory first (bundled app) - if let Ok(resource_dir) = app.path().resource_dir() { - let sidecar = resource_dir.join("sidecar").join(sidecar_name()); - if sidecar.exists() { - eprintln!("[studio] Found sidecar at: {}", sidecar.display()); - return sidecar; - } - eprintln!( - "[studio] Sidecar not found at: {} (trying fallback)", - sidecar.display() - ); - } - - // Fall back to looking next to the executable (dev mode) - let exe_dir = std::env::current_exe() - .expect("Failed to get executable path") - .parent() - .unwrap() - .to_path_buf(); - - let sidecar = exe_dir.join(sidecar_name()); - eprintln!("[studio] Fallback sidecar path: {}", sidecar.display()); - sidecar -} - -/// Platform-specific sidecar binary name. -fn sidecar_name() -> &'static str { - if cfg!(target_os = "windows") { - "firefly-studio.exe" - } else { - "firefly-studio" - } -} - -/// Poll the health endpoint until it responds or timeout is reached. -async fn wait_for_health(port: u16, timeout: Duration) -> Result<(), String> { - let url = format!("http://127.0.0.1:{port}/api/health"); - let client = reqwest::Client::builder() - .timeout(Duration::from_secs(2)) - .build() - .map_err(|e| format!("Failed to create HTTP client: {e}"))?; - - let start = Instant::now(); - let mut attempt = 0u32; - - while start.elapsed() < timeout { - attempt += 1; - match client.get(&url).send().await { - Ok(resp) if resp.status().is_success() => { - eprintln!( - "[studio] Health check passed after {attempt} attempts ({:.1}s)", - start.elapsed().as_secs_f64() - ); - return Ok(()); - } - Ok(resp) => { - eprintln!( - "[studio] Health check attempt {attempt}: status {}", - resp.status() - ); - } - Err(e) => { - if attempt <= 3 || attempt % 10 == 0 { - eprintln!("[studio] Health check attempt {attempt}: {e}"); - } - } - } - tokio::time::sleep(Duration::from_millis(500)).await; - } - - Err(format!( - "Sidecar did not become healthy within {}s ({attempt} attempts)", - timeout.as_secs() - )) -} - -fn main() { - tauri::Builder::default() - .plugin(tauri_plugin_shell::init()) - .manage(SidecarState(Mutex::new(None))) - .setup(|app| { - let port = find_free_port(); - let sidecar_path = find_sidecar(&app.handle()); - - eprintln!("[studio] Starting sidecar on port {port}..."); - eprintln!("[studio] Sidecar path: {}", sidecar_path.display()); - - // Spawn the sidecar process with stderr piped for debugging - let child = std::process::Command::new(&sidecar_path) - .args([ - "--port", - &port.to_string(), - "--host", - "127.0.0.1", - "--no-browser", - ]) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .spawn() - .map_err(|e| { - let msg = format!( - "Failed to start sidecar at {}: {e}", - sidecar_path.display() - ); - eprintln!("[studio] {msg}"); - msg - })?; - - eprintln!("[studio] Sidecar spawned (PID: {})", child.id()); - - // Store the child handle for cleanup - let state = app.state::(); - *state.0.lock().unwrap() = Some(child); - - // Wait for health and navigate in a background task - let handle = app.handle().clone(); - tauri::async_runtime::spawn(async move { - match wait_for_health(port, Duration::from_secs(30)).await { - Ok(()) => { - let url = format!("http://127.0.0.1:{port}"); - eprintln!("[studio] Navigating to {url}"); - if let Some(window) = handle.get_webview_window("main") { - let _ = window.navigate(url.parse().unwrap()); - } - } - Err(e) => { - eprintln!("[studio] {e}"); - } - } - }); - - Ok(()) - }) - .on_window_event(|window, event| { - if let tauri::WindowEvent::Destroyed = event { - // Kill the sidecar when the window is destroyed - let child = window.state::().0.lock().unwrap().take(); - if let Some(mut child) = child { - eprintln!("[studio] Killing sidecar (PID: {})", child.id()); - let _ = child.kill(); - let _ = child.wait(); - } - } - }) - .run(tauri::generate_context!()) - .expect("Error while running Firefly Studio"); -} diff --git a/studio-desktop/src-tauri/tauri.conf.json b/studio-desktop/src-tauri/tauri.conf.json deleted file mode 100644 index d23817e1..00000000 --- a/studio-desktop/src-tauri/tauri.conf.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-config-schema/schema.json", - "productName": "Firefly Agentic Studio", - "version": "0.1.0", - "identifier": "com.fireflyframework.studio", - "build": { - "frontendDist": "../frontend-dist" - }, - "app": { - "windows": [ - { - "title": "Firefly Agentic Studio", - "width": 1280, - "height": 800, - "minWidth": 900, - "minHeight": 600, - "center": true, - "decorations": true, - "resizable": true, - "fullscreen": false - } - ], - "security": { - "csp": "default-src 'self'; connect-src 'self' http://127.0.0.1:* ws://127.0.0.1:*; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'" - } - }, - "bundle": { - "active": true, - "targets": "all", - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ], - "resources": { - "sidecar": "sidecar" - } - }, - "plugins": { - "shell": { - "open": true - } - } -} diff --git a/studio-frontend/.gitignore b/studio-frontend/.gitignore deleted file mode 100644 index 3b462cb0..00000000 --- a/studio-frontend/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -node_modules - -# Output -.output -.vercel -.netlify -.wrangler -/.svelte-kit -/build - -# OS -.DS_Store -Thumbs.db - -# Env -.env -.env.* -!.env.example -!.env.test - -# Vite -vite.config.js.timestamp-* -vite.config.ts.timestamp-* diff --git a/studio-frontend/.npmrc b/studio-frontend/.npmrc deleted file mode 100644 index b6f27f13..00000000 --- a/studio-frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/studio-frontend/README.md b/studio-frontend/README.md deleted file mode 100644 index 0390a1cb..00000000 --- a/studio-frontend/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# Firefly Studio Frontend - -SvelteKit 5 frontend for [Firefly Studio](../docs/studio.md) -- the visual -agent IDE for the Firefly Agentic framework. - -## Prerequisites - -- Node.js 20+ -- npm (or pnpm) -- Python backend running (`firefly studio --dev` or see below) - -## Setup - -```bash -npm install -``` - -## Development - -Start the Vite dev server with hot module replacement: - -```bash -npm run dev -``` - -The frontend runs at `http://localhost:5173`. The Python backend must be -running separately (the backend's CORS config allows this origin): - -```bash -# In another terminal -firefly studio --no-browser --dev -``` - -## Build - -Build the static SPA for production: - -```bash -npm run build -``` - -Output goes to `build/`. To bundle it into the Python package: - -```bash -cp -r build/* ../src/fireflyframework_agentic/studio/static/ -``` - -## Type Check - -```bash -npm run check -``` - -## Tech Stack - -| Technology | Purpose | -|---|---| -| [SvelteKit 2](https://svelte.dev/docs/kit) | Application framework | -| [Svelte 5](https://svelte.dev/) | UI components (runes: `$state`, `$derived`, `$effect`, `$props`) | -| [@xyflow/svelte](https://svelteflow.dev/) | Node graph canvas | -| [Tailwind CSS 4](https://tailwindcss.com/) | Utility-first styling | -| [Lucide Svelte](https://lucide.dev/) | Icon library | -| [Vite 7](https://vite.dev/) | Build tool | - -## Project Structure - -``` -src/ - routes/ # SvelteKit file-based routing - build/+page.svelte # Main canvas workspace - evaluate/+page.svelte # Evaluation page - experiments/+page.svelte # Experiments page - deploy/+page.svelte # Deployment page - monitor/+page.svelte # Monitoring page - files/+page.svelte # File management page - lib/ - components/ - layout/ # AppShell, Sidebar, TopBar, CommandPalette, ShortcutsModal - canvas/ # Canvas, NodePalette, node components (Agent, Tool, Reasoning, Condition) - panels/ # BottomPanel, ConfigPanel, ChatTab, CodeTab, ConsoleTab, TimelineTab - stores/ # Svelte writable stores (pipeline, execution, ui, chat, project) - api/ # REST client (client.ts), WebSocket client (websocket.ts) - execution/ # Execution bridge (bridge.ts) - types/ # TypeScript type definitions (graph.ts) - app.css # Global styles, CSS custom properties, focus-visible ring -``` - -## Design Language - -Dark, premium developer-tool aesthetic. All colors via CSS custom properties. -No emojis -- icons only (Lucide). See [docs/studio.md](../docs/studio.md#frontend-development) -for the full design specification. diff --git a/studio-frontend/package-lock.json b/studio-frontend/package-lock.json deleted file mode 100644 index 1a4edbfa..00000000 --- a/studio-frontend/package-lock.json +++ /dev/null @@ -1,2361 +0,0 @@ -{ - "name": "studio-frontend", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "studio-frontend", - "version": "0.0.1", - "dependencies": { - "@tailwindcss/vite": "^4.2.0", - "@xyflow/svelte": "^1.5.1", - "highlight.js": "^11.11.1", - "lucide-svelte": "^0.575.0", - "marked": "^17.0.3", - "tailwindcss": "^4.2.0" - }, - "devDependencies": { - "@sveltejs/adapter-auto": "^7.0.0", - "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.50.2", - "@sveltejs/vite-plugin-svelte": "^6.2.4", - "@types/node": "^25.3.0", - "svelte": "^5.49.2", - "svelte-check": "^4.3.6", - "typescript": "^5.9.3", - "vite": "^7.3.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@svelte-put/shortcut": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@svelte-put/shortcut/-/shortcut-4.1.0.tgz", - "integrity": "sha512-wImNEIkbxAIWFqlfuhcbC+jRPDeRa/uJGIXHMEVVD+jqL9xCwWNnkGQJ6Qb2XVszuRLHlb8SGZDL3Io/h3vs8w==", - "license": "MIT", - "peerDependencies": { - "svelte": "^5.1.0" - } - }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", - "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", - "license": "MIT", - "peerDependencies": { - "acorn": "^8.9.0" - } - }, - "node_modules/@sveltejs/adapter-auto": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.1.tgz", - "integrity": "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/adapter-static": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", - "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "2.52.2", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.52.2.tgz", - "integrity": "sha512-1in76dftrofUt138rVLvYuwiQLkg9K3cG8agXEE6ksf7gCGs8oIr3+pFrVtbRmY9JvW+psW5fvLM/IwVybOLBA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/cookie": "^0.6.0", - "acorn": "^8.14.1", - "cookie": "^0.6.0", - "devalue": "^5.6.3", - "esm-env": "^1.2.2", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "mrmime": "^2.0.0", - "set-cookie-parser": "^3.0.0", - "sirv": "^3.0.0" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": ">=18.13" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": "^5.3.3", - "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.4.tgz", - "integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", - "deepmerge": "^4.3.1", - "magic-string": "^0.30.21", - "obug": "^2.1.0", - "vitefu": "^1.1.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz", - "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "obug": "^2.1.0" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.0.tgz", - "integrity": "sha512-Yv+fn/o2OmL5fh/Ir62VXItdShnUxfpkMA4Y7jdeC8O81WPB8Kf6TT6GSHvnqgSwDzlB5iT7kDpeXxLsUS0T6Q==", - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.19.0", - "jiti": "^2.6.1", - "lightningcss": "1.31.1", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.2.0" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.0.tgz", - "integrity": "sha512-AZqQzADaj742oqn2xjl5JbIOzZB/DGCYF/7bpvhA8KvjUj9HJkag6bBuwZvH1ps6dfgxNHyuJVlzSr2VpMgdTQ==", - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.0", - "@tailwindcss/oxide-darwin-arm64": "4.2.0", - "@tailwindcss/oxide-darwin-x64": "4.2.0", - "@tailwindcss/oxide-freebsd-x64": "4.2.0", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.0", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.0", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.0", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.0", - "@tailwindcss/oxide-linux-x64-musl": "4.2.0", - "@tailwindcss/oxide-wasm32-wasi": "4.2.0", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.0", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.0" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.0.tgz", - "integrity": "sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.0.tgz", - "integrity": "sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.0.tgz", - "integrity": "sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.0.tgz", - "integrity": "sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.0.tgz", - "integrity": "sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.0.tgz", - "integrity": "sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.0.tgz", - "integrity": "sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.0.tgz", - "integrity": "sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.0.tgz", - "integrity": "sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.0.tgz", - "integrity": "sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.8.1", - "@emnapi/runtime": "^1.8.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.1", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.0.tgz", - "integrity": "sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.0.tgz", - "integrity": "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.0.tgz", - "integrity": "sha512-da9mFCaHpoOgtQiWtDGIikTrSpUFBtIZCG3jy/u2BGV+l/X1/pbxzmIUxNt6JWm19N3WtGi4KlJdSH/Si83WOA==", - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.2.0", - "@tailwindcss/oxide": "4.2.0", - "tailwindcss": "4.2.0" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", - "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", - "devOptional": true, - "license": "MIT", - "peer": true, - "dependencies": { - "undici-types": "~7.18.0" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" - }, - "node_modules/@xyflow/svelte": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@xyflow/svelte/-/svelte-1.5.1.tgz", - "integrity": "sha512-PsurMZxEaTrAwt+PzQtzEkwZwJ9dSc92kusz1rNJTogU1ATxIwheznO2R+RCf2GNuyRuExeDn26WwwBTqkCIhg==", - "license": "MIT", - "dependencies": { - "@svelte-put/shortcut": "^4.1.0", - "@xyflow/system": "0.0.75" - }, - "peerDependencies": { - "svelte": "^5.25.0" - } - }, - "node_modules/@xyflow/system": { - "version": "0.0.75", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.75.tgz", - "integrity": "sha512-iXs+AGFLi8w/VlAoc/iSxk+CxfT6o64Uw/k0CKASOPqjqz6E0rb5jFZgJtXGZCpfQI6OQpu5EnumP5fGxQheaQ==", - "license": "MIT", - "dependencies": { - "@types/d3-drag": "^3.0.7", - "@types/d3-interpolate": "^3.0.4", - "@types/d3-selection": "^3.0.10", - "@types/d3-transition": "^3.0.8", - "@types/d3-zoom": "^3.0.8", - "d3-drag": "^3.0.0", - "d3-interpolate": "^3.0.1", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devalue": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", - "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "license": "MIT" - }, - "node_modules/esrap": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz", - "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", - "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.31.1", - "lightningcss-darwin-arm64": "1.31.1", - "lightningcss-darwin-x64": "1.31.1", - "lightningcss-freebsd-x64": "1.31.1", - "lightningcss-linux-arm-gnueabihf": "1.31.1", - "lightningcss-linux-arm64-gnu": "1.31.1", - "lightningcss-linux-arm64-musl": "1.31.1", - "lightningcss-linux-x64-gnu": "1.31.1", - "lightningcss-linux-x64-musl": "1.31.1", - "lightningcss-win32-arm64-msvc": "1.31.1", - "lightningcss-win32-x64-msvc": "1.31.1" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", - "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", - "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", - "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", - "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", - "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", - "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", - "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", - "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", - "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", - "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", - "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "license": "MIT" - }, - "node_modules/lucide-svelte": { - "version": "0.575.0", - "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.575.0.tgz", - "integrity": "sha512-Tu15tJfbmRNPaU61yeNFf3jfRHs8ABA+NwTt7TWmwVbhlSA3H7sW65tX6RttcP7HGV4aHUlYhXixZOlntoFBdw==", - "license": "ISC", - "peerDependencies": { - "svelte": "^3 || ^4 || ^5.0.0-next.42" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/marked": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.3.tgz", - "integrity": "sha512-jt1v2ObpyOKR8p4XaUJVk3YWRJ5n+i4+rjQopxvV32rSndTJXvIzuUdWWIy/1pFQMkQmvTXawzDNqOH/CUmx6A==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/set-cookie-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.0.1.tgz", - "integrity": "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/svelte": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.0.tgz", - "integrity": "sha512-7dhHkSamGS2vtoBmIW2hRab+gl5Z60alEHZB4910ePqqJNxAWnDAxsofVmlZ2tREmWyHNE+A1nCKwICAquoD2A==", - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/estree": "^1.0.5", - "@types/trusted-types": "^2.0.7", - "acorn": "^8.12.1", - "aria-query": "^5.3.1", - "axobject-query": "^4.1.0", - "clsx": "^2.1.1", - "devalue": "^5.6.3", - "esm-env": "^1.2.1", - "esrap": "^2.2.2", - "is-reference": "^3.0.3", - "locate-character": "^3.0.0", - "magic-string": "^0.30.11", - "zimmerframe": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/svelte-check": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.1.tgz", - "integrity": "sha512-y1bBT0CRCMMfdjyqX1e5zCygLgEEr4KJV1qP6GSUReHl90bmcQaAWjZygHPfQ8K63f1eR8IuivuZMwmCg3zT2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^4.0.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/tailwindcss": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.0.tgz", - "integrity": "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q==", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/zimmerframe": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", - "license": "MIT" - } - } -} diff --git a/studio-frontend/package.json b/studio-frontend/package.json deleted file mode 100644 index 00e8192e..00000000 --- a/studio-frontend/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "studio-frontend", - "private": true, - "version": "0.0.1", - "type": "module", - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" - }, - "devDependencies": { - "@sveltejs/adapter-auto": "^7.0.0", - "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.50.2", - "@sveltejs/vite-plugin-svelte": "^6.2.4", - "@types/node": "^25.3.0", - "svelte": "^5.49.2", - "svelte-check": "^4.3.6", - "typescript": "^5.9.3", - "vite": "^7.3.1" - }, - "dependencies": { - "@tailwindcss/vite": "^4.2.0", - "@xyflow/svelte": "^1.5.1", - "highlight.js": "^11.11.1", - "lucide-svelte": "^0.575.0", - "marked": "^17.0.3", - "tailwindcss": "^4.2.0" - } -} diff --git a/studio-frontend/src/app.css b/studio-frontend/src/app.css deleted file mode 100644 index db14a5d7..00000000 --- a/studio-frontend/src/app.css +++ /dev/null @@ -1,144 +0,0 @@ -@import 'tailwindcss'; - -@theme { - --color-bg-primary: #0a0a0f; - --color-bg-secondary: #12121a; - --color-bg-elevated: #1a1a26; - --color-bg-hover: #22222e; - --color-border: #2a2a3a; - --color-border-light: #333346; - --color-text-primary: #e8e8ed; - --color-text-secondary: #8888a0; - --color-text-muted: #5a5a72; - --color-accent: #ff6b35; - --color-accent-glow: oklch(from #ff6b35 l c h / 20%); - --color-success: #22c55e; - --color-error: #ef4444; - --color-warning: #f59e0b; - --color-info: #3b82f6; - --color-node-agent: #6366f1; - --color-node-tool: #8b5cf6; - --color-node-reasoning: #ec4899; - --color-node-pipeline: #06b6d4; - --color-grid-line: rgba(255, 255, 255, 0.10); - --color-vignette: rgba(0, 0, 0, 0.4); - --color-overlay-subtle: rgba(255, 255, 255, 0.06); - --color-overlay-light: rgba(255, 255, 255, 0.08); - --color-overlay-medium: rgba(255, 255, 255, 0.10); - --shadow-dropdown: 0 8px 24px rgba(0, 0, 0, 0.3); - - --font-sans: 'Inter', system-ui, sans-serif; - --font-mono: 'JetBrains Mono', ui-monospace, monospace; -} - -/* ── Theme Variables ─────────────────────────────────────────────── */ - -[data-theme="dark"] { - --color-bg-primary: #0a0a0f; - --color-bg-secondary: #12121a; - --color-bg-elevated: #1a1a26; - --color-bg-hover: #22222e; - --color-border: #2a2a3a; - --color-border-light: #333346; - --color-text-primary: #e8e8ed; - --color-text-secondary: #8888a0; - --color-text-muted: #5a5a72; - --color-accent: #ff6b35; - --color-accent-hover: #ff8255; - --color-accent-muted: rgba(255, 107, 53, 0.08); - --color-accent-glow: oklch(from #ff6b35 l c h / 20%); - --color-success: #22c55e; - --color-warning: #f59e0b; - --color-error: #ef4444; - --color-info: #3b82f6; - --color-code-bg: #12121a; - --color-code-border: #2a2a3a; - --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3); - --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4); - --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.5); - /* Theme-aware transparent overlays */ - --color-grid-line: rgba(255, 255, 255, 0.10); - --color-vignette: rgba(0, 0, 0, 0.4); - --color-overlay-subtle: rgba(255, 255, 255, 0.06); - --color-overlay-light: rgba(255, 255, 255, 0.08); - --color-overlay-medium: rgba(255, 255, 255, 0.10); - --shadow-dropdown: 0 8px 24px rgba(0, 0, 0, 0.3); -} - -[data-theme="light"] { - --color-bg-primary: #f8f9fb; - --color-bg-secondary: #eef0f4; - --color-bg-elevated: #ffffff; - --color-bg-hover: #e4e7ec; - --color-border: #d4d8e0; - --color-border-light: #e2e5eb; - --color-text-primary: #1a1d26; - --color-text-secondary: #64697a; - --color-text-muted: #9198a8; - --color-accent: #4f46e5; - --color-accent-hover: #6366f1; - --color-accent-muted: rgba(79, 70, 229, 0.08); - --color-accent-glow: oklch(from #4f46e5 l c h / 20%); - --color-success: #16a34a; - --color-warning: #d97706; - --color-error: #dc2626; - --color-info: #2563eb; - --color-code-bg: #f1f3f6; - --color-code-border: #d4d8e0; - --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06); - --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08); - --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12); - /* Theme-aware transparent overlays */ - --color-grid-line: rgba(0, 0, 0, 0.06); - --color-vignette: rgba(0, 0, 0, 0.08); - --color-overlay-subtle: rgba(0, 0, 0, 0.04); - --color-overlay-light: rgba(0, 0, 0, 0.06); - --color-overlay-medium: rgba(0, 0, 0, 0.08); - --shadow-dropdown: 0 8px 24px rgba(0, 0, 0, 0.12); -} - -/* Reset for full-height app */ -html, -body { - height: 100%; - margin: 0; - padding: 0; - overflow: hidden; -} - -/* Scrollbar styling for the dark theme */ -::-webkit-scrollbar { - width: 6px; - height: 6px; -} - -::-webkit-scrollbar-track { - background: var(--color-bg-primary); -} - -::-webkit-scrollbar-thumb { - background: var(--color-border); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: var(--color-text-secondary); -} - -/* Focus-visible ring for keyboard navigation */ -*:focus-visible { - outline: 2px solid oklch(from var(--color-accent) l c h / 60%); - outline-offset: 2px; -} - -/* Respect users who prefer reduced motion */ -@media (prefers-reduced-motion: reduce) { - *, - *::before, - *::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - scroll-behavior: auto !important; - } -} diff --git a/studio-frontend/src/app.d.ts b/studio-frontend/src/app.d.ts deleted file mode 100644 index da08e6da..00000000 --- a/studio-frontend/src/app.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -// See https://svelte.dev/docs/kit/types#app.d.ts -// for information about these interfaces -declare global { - namespace App { - // interface Error {} - // interface Locals {} - // interface PageData {} - // interface PageState {} - // interface Platform {} - } -} - -export {}; diff --git a/studio-frontend/src/app.html b/studio-frontend/src/app.html deleted file mode 100644 index f273cc58..00000000 --- a/studio-frontend/src/app.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - %sveltekit.head% - - -

    - - diff --git a/studio-frontend/src/lib/api/client.ts b/studio-frontend/src/lib/api/client.ts deleted file mode 100644 index 5a05652f..00000000 --- a/studio-frontend/src/lib/api/client.ts +++ /dev/null @@ -1,298 +0,0 @@ -import type { - AgentInfo, - ToolInfo, - PatternInfo, - ProjectInfo, - FileEntry, - FileContent, - DatasetInfo, - EvalRunResult, - Experiment, - UsageSummary, - Checkpoint, - StudioSettingsResponse, - SaveSettingsPayload, - SettingsStatus, - CustomToolDefinition, - SaveCustomToolPayload -} from '$lib/types/graph'; - -const BASE_URL = '/api'; - -async function request(path: string, options?: RequestInit): Promise { - const resp = await fetch(`${BASE_URL}${path}`, { - headers: { 'Content-Type': 'application/json' }, - ...options - }); - if (!resp.ok) { - const error = await resp.json().catch(() => ({ detail: resp.statusText })); - throw new Error(error.detail || resp.statusText); - } - return resp.json(); -} - -export const api = { - health: () => request<{ status: string; version: string }>('/health'), - - registry: { - agents: () => request('/registry/agents'), - tools: () => request('/registry/tools'), - patterns: () => request('/registry/patterns') - }, - - projects: { - list: () => request('/projects'), - create: (name: string, description?: string) => - request('/projects', { - method: 'POST', - body: JSON.stringify({ name, description }) - }), - delete: (name: string) => - request<{ status: string }>(`/projects/${encodeURIComponent(name)}`, { method: 'DELETE' }), - rename: (name: string, newName: string) => - request(`/projects/${encodeURIComponent(name)}`, { - method: 'PATCH', - body: JSON.stringify({ new_name: newName }) - }), - updateDescription: (name: string, description: string) => - request(`/projects/${encodeURIComponent(name)}`, { - method: 'PATCH', - body: JSON.stringify({ description }) - }), - deleteAll: () => - request<{ status: string; count: number }>('/projects', { method: 'DELETE' }), - savePipeline: (project: string, pipeline: string, graph: object) => - request<{ status: string }>(`/projects/${encodeURIComponent(project)}/pipelines/${encodeURIComponent(pipeline)}`, { - method: 'POST', - body: JSON.stringify({ graph }) - }), - loadPipeline: (project: string, pipeline: string) => - request(`/projects/${encodeURIComponent(project)}/pipelines/${encodeURIComponent(pipeline)}`), - getHistory: (project: string) => - request>(`/projects/${encodeURIComponent(project)}/history`), - restoreVersion: (project: string, commitSha: string) => - request<{ status: string }>(`/projects/${encodeURIComponent(project)}/restore`, { - method: 'POST', - body: JSON.stringify({ commit_sha: commitSha }) - }), - bookmarkVersion: (project: string, commitSha: string, label: string) => - request<{ status: string }>(`/projects/${encodeURIComponent(project)}/bookmark`, { - method: 'POST', - body: JSON.stringify({ commit_sha: commitSha, label }) - }) - }, - - files: { - list: (project: string) => request(`/projects/${encodeURIComponent(project)}/files`), - read: (project: string, path: string) => request(`/projects/${encodeURIComponent(project)}/files/${path}`) - }, - - evaluate: { - uploadDataset: (project: string, file: File) => { - const formData = new FormData(); - formData.append('file', file); - return fetch(`${BASE_URL}/projects/${encodeURIComponent(project)}/datasets/upload`, { - method: 'POST', - body: formData - }).then(async (resp) => { - if (!resp.ok) { - const error = await resp.json().catch(() => ({ detail: resp.statusText })); - throw new Error(error.detail || resp.statusText); - } - return resp.json() as Promise<{ filename: string; test_cases: number; status: string }>; - }); - }, - listDatasets: (project: string) => - request(`/projects/${encodeURIComponent(project)}/datasets`), - run: (project: string, dataset: string, graph: object) => - request('/evaluate/run', { - method: 'POST', - body: JSON.stringify({ project, dataset, graph }) - }) - }, - - experiments: { - list: (project: string) => request(`/projects/${encodeURIComponent(project)}/experiments`), - create: (project: string, name: string, variants: Array<{ name: string; pipeline: string; traffic: number }>) => - request(`/projects/${encodeURIComponent(project)}/experiments`, { - method: 'POST', - body: JSON.stringify({ name, variants }) - }), - get: (project: string, expId: string) => - request(`/projects/${encodeURIComponent(project)}/experiments/${expId}`), - delete: (project: string, expId: string) => - request<{ status: string }>(`/projects/${encodeURIComponent(project)}/experiments/${expId}`, { method: 'DELETE' }), - runVariant: (project: string, expId: string, variantName: string, graph: object, input?: string) => - request<{ experiment_id: string; variant_name: string; success: boolean; output: string }>( - `/projects/${encodeURIComponent(project)}/experiments/${expId}/run`, - { - method: 'POST', - body: JSON.stringify({ variant_name: variantName, graph, input: input ?? '' }) - } - ) - }, - - codegen: { - smith: (graph: object) => - request<{ code: string; notes: string[] }>('/codegen/smith', { - method: 'POST', - body: JSON.stringify({ graph }) - }) - }, - - monitoring: { - usage: () => request('/monitoring/usage') - }, - - checkpoints: { - list: () => request('/checkpoints'), - get: (index: number) => request(`/checkpoints/${index}`), - fork: (fromIndex: number, modifiedState: Record) => - request('/checkpoints/fork', { - method: 'POST', - body: JSON.stringify({ from_index: fromIndex, modified_state: modifiedState }) - }), - rewind: (index: number) => - request<{ status: string; index: number; node_id: string }>(`/checkpoints/${index}/rewind`, { - method: 'POST' - }), - diff: (indexA: number, indexB: number) => - request<{ added: string[]; removed: string[]; changed: string[] }>('/checkpoints/diff', { - method: 'POST', - body: JSON.stringify({ index_a: indexA, index_b: indexB }) - }), - clear: () => - request<{ status: string }>('/checkpoints', { method: 'DELETE' }) - }, - - settings: { - get: () => request('/settings'), - save: (payload: SaveSettingsPayload) => - request('/settings', { - method: 'POST', - body: JSON.stringify(payload) - }), - status: () => request('/settings/status'), - services: { - list: () => request>('/settings/services'), - add: (service: Record) => - request<{ status: string; id: string }>('/settings/services', { - method: 'POST', - body: JSON.stringify(service) - }), - delete: (id: string) => - request<{ status: string }>(`/settings/services/${id}`, { method: 'DELETE' }), - test: (id: string) => - request<{ status: string; message: string }>(`/settings/services/${id}/test`, { method: 'POST' }) - } - }, - - assistant: { - getHistory: (project: string) => - request>(`/assistant/${encodeURIComponent(project)}/history`), - saveHistory: (project: string, messages: Array<{ role: string; content: string; timestamp: string; toolCalls?: unknown[] }>) => - request<{ status: string }>(`/assistant/${encodeURIComponent(project)}/history`, { - method: 'POST', - body: JSON.stringify({ messages }) - }), - inferProjectName: (message: string) => - request<{ name: string }>('/assistant/infer-project-name', { - method: 'POST', - body: JSON.stringify({ message }) - }), - }, - - smith: { - getHistory: (project: string) => - request>(`/smith/${encodeURIComponent(project)}/history`), - saveHistory: (project: string, messages: Array<{ role: string; content: string; timestamp: string }>) => - request<{ status: string }>(`/smith/${encodeURIComponent(project)}/history`, { - method: 'POST', - body: JSON.stringify({ messages }) - }), - clearHistory: (project: string) => - request<{ status: string }>(`/smith/${encodeURIComponent(project)}/history`, { method: 'DELETE' }), - getFiles: (project: string) => - request>(`/smith/${encodeURIComponent(project)}/files`), - saveFiles: (project: string, files: Array<{ path: string; content: string; language: string }>) => - request<{ status: string }>(`/smith/${encodeURIComponent(project)}/files`, { - method: 'POST', - body: JSON.stringify({ files }) - }), - }, - - oracle: { - getInsights: (project: string) => - request>(`/oracle/${encodeURIComponent(project)}/insights`), - approveInsight: (project: string, insightId: string) => - request<{ status: string; action_instruction: string | null }>(`/oracle/${encodeURIComponent(project)}/insights/${insightId}/approve`, { method: 'POST' }), - skipInsight: (project: string, insightId: string) => - request<{ status: string }>(`/oracle/${encodeURIComponent(project)}/insights/${insightId}/skip`, { method: 'POST' }), - getChatHistory: (project: string) => - request>(`/oracle/${encodeURIComponent(project)}/chat-history`), - saveChatHistory: (project: string, messages: Array<{ role: string; content: string; timestamp: string }>) => - request<{ status: string }>(`/oracle/${encodeURIComponent(project)}/chat-history`, { - method: 'POST', - body: JSON.stringify({ messages }) - }), - clearChatHistory: (project: string) => - request<{ status: string }>(`/oracle/${encodeURIComponent(project)}/chat-history`, { method: 'DELETE' }), - }, - - tunnel: { - status: () => request<{ active: boolean; url: string | null; port: number }>('/tunnel/status'), - start: () => request<{ url: string; status: string }>('/tunnel/start', { method: 'POST' }), - stop: () => request<{ status: string }>('/tunnel/stop', { method: 'POST' }), - }, - - runtime: { - start: (project: string) => request<{ status: string }>(`/projects/${encodeURIComponent(project)}/runtime/start`, { method: 'POST' }), - stop: (project: string) => request<{ status: string }>(`/projects/${encodeURIComponent(project)}/runtime/stop`, { method: 'POST' }), - status: (project: string) => request<{ project: string; status: string; trigger_type: string | null; consumers: number; scheduler_active: boolean }>(`/projects/${encodeURIComponent(project)}/runtime/status`), - executions: (project: string) => request<{ executions: Array<{ execution_id: string; status: string; duration_ms: number | null }> }>(`/projects/${encodeURIComponent(project)}/runtime/executions`), - }, - - customTools: { - list: () => request('/custom-tools'), - get: (name: string) => request(`/custom-tools/${name}`), - save: (tool: SaveCustomToolPayload) => - request('/custom-tools', { - method: 'POST', - body: JSON.stringify(tool) - }), - delete: (name: string) => - request<{ status: string }>(`/custom-tools/${name}`, { method: 'DELETE' }), - register: (name: string) => - request<{ status: string; tool_name: string }>(`/custom-tools/${name}/register`, { - method: 'POST' - }), - test: (name: string) => - request<{ status: string; tool_name: string; response_time?: number; result?: string; error?: string }>( - `/custom-tools/${name}/test`, - { method: 'POST' } - ), - catalog: () => - request< - Array<{ - id: string; - name: string; - category: string; - description: string; - icon: string; - requires_credential: string | null; - installed: boolean; - tool_name: string; - setup_guide: string; - }> - >('/custom-tools/catalog'), - installConnector: (connectorId: string, overrides?: Record) => - request<{ status: string; tool_name: string }>(`/custom-tools/catalog/${connectorId}/install`, { - method: 'POST', - body: JSON.stringify(overrides ?? {}) - }), - verifyConnector: (connectorId: string) => - request<{ status: string; message: string }>(`/custom-tools/catalog/${connectorId}/verify`, { - method: 'POST' - }) - } -}; diff --git a/studio-frontend/src/lib/api/websocket.ts b/studio-frontend/src/lib/api/websocket.ts deleted file mode 100644 index d50d5583..00000000 --- a/studio-frontend/src/lib/api/websocket.ts +++ /dev/null @@ -1,104 +0,0 @@ -import type { ExecutionEvent } from '$lib/types/graph'; - -type EventCallback = (event: ExecutionEvent) => void; - -export class StudioWebSocket { - private ws: WebSocket | null = null; - private listeners = new Map>(); - private url: string; - private reconnectAttempts = 0; - private maxReconnectAttempts = 5; - private reconnectTimer: ReturnType | null = null; - private _intentionalClose = false; - - constructor(path: string) { - const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; - this.url = `${protocol}//${window.location.host}${path}`; - } - - connect(): void { - this._intentionalClose = false; - this.ws = new WebSocket(this.url); - - this.ws.onopen = () => { - this.reconnectAttempts = 0; - this.notify('_open', { type: '_open', timestamp: '' } as ExecutionEvent); - }; - - this.ws.onmessage = (event) => { - try { - const data = JSON.parse(event.data) as ExecutionEvent; - this.notify(data.type, data); - this.notify('*', data); - } catch { - console.warn('[StudioWebSocket] Unparseable frame:', event.data); - } - }; - - this.ws.onclose = () => { - this.notify('_close', { type: '_close', timestamp: '' } as ExecutionEvent); - if (!this._intentionalClose) { - this.attemptReconnect(); - } - }; - - this.ws.onerror = () => { - this.notify('_error', { type: '_error', timestamp: '' } as ExecutionEvent); - }; - } - - private attemptReconnect(): void { - if (this.reconnectAttempts >= this.maxReconnectAttempts) { - this.notify('_reconnect_failed', { type: '_reconnect_failed', timestamp: '' } as ExecutionEvent); - return; - } - this.reconnectAttempts++; - const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts - 1), 10000); - this.reconnectTimer = setTimeout(() => { - this.connect(); - }, delay); - } - - private notify(type: string, data: ExecutionEvent): void { - const callbacks = this.listeners.get(type); - if (callbacks) { - for (const cb of callbacks) { - try { - cb(data); - } catch (err) { - console.error(`[StudioWebSocket] Listener error for '${type}':`, err); - } - } - } - } - - on(eventType: string, callback: EventCallback): () => void { - if (!this.listeners.has(eventType)) { - this.listeners.set(eventType, new Set()); - } - this.listeners.get(eventType)!.add(callback); - return () => this.listeners.get(eventType)?.delete(callback); - } - - send(data: unknown): void { - if (this.ws?.readyState === WebSocket.OPEN) { - this.ws.send(JSON.stringify(data)); - } else { - console.warn('[StudioWebSocket] Cannot send: WebSocket not open'); - } - } - - get connected(): boolean { - return this.ws?.readyState === WebSocket.OPEN; - } - - disconnect(): void { - this._intentionalClose = true; - if (this.reconnectTimer) { - clearTimeout(this.reconnectTimer); - this.reconnectTimer = null; - } - this.ws?.close(); - this.ws = null; - } -} diff --git a/studio-frontend/src/lib/assets/favicon.svg b/studio-frontend/src/lib/assets/favicon.svg deleted file mode 100644 index 5524389a..00000000 --- a/studio-frontend/src/lib/assets/favicon.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/studio-frontend/src/lib/components/canvas/Canvas.svelte b/studio-frontend/src/lib/components/canvas/Canvas.svelte deleted file mode 100644 index 25a88848..00000000 --- a/studio-frontend/src/lib/components/canvas/Canvas.svelte +++ /dev/null @@ -1,198 +0,0 @@ - - -
    - selectedNodeId.set(node.id)} - onpaneclick={() => selectedNodeId.set(null)} - > - - - - - - {#if !isEmpty} -
    -
    - - Nodes - {totalNodes} -
    -
    -
    - - Agents - {agentCount} -
    -
    -
    - - Tools - {toolCount} -
    -
    -
    - - Links - {connectionCount} -
    -
    - {/if} - - {#if isEmpty} -
    -
    - -

    Start building your pipeline

    -

    Click components in the left panel to add them, or press Cmd+K to search

    -
    -
    - {/if} -
    - - diff --git a/studio-frontend/src/lib/components/canvas/NodePalette.svelte b/studio-frontend/src/lib/components/canvas/NodePalette.svelte deleted file mode 100644 index cc8e1eac..00000000 --- a/studio-frontend/src/lib/components/canvas/NodePalette.svelte +++ /dev/null @@ -1,132 +0,0 @@ - - - - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/AgentNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/AgentNode.svelte deleted file mode 100644 index 30d7e4e9..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/AgentNode.svelte +++ /dev/null @@ -1,333 +0,0 @@ - - -
    - -
    -
    -
    - {#if data.model} - {data.model} - {/if} - {#if hasMultimodal} - - - - {/if} -
    - - - -
    -
    - - - {data.label || 'Agent'} - {#if showComplete} - - - - {/if} - {#if execState === 'error'} - - - - {/if} -
    -
    - - -
    - -
    -
    Exec In
    -
    Exec Out
    -
    - - {#if data.description} -
    {String(data.description).slice(0, 80)}{String(data.description).length > 80 ? '\u2026' : ''}
    - {/if} - - {#if data.instructions} -
    - -

    {data.instructions}

    -
    - {/if} -
    - - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/ConditionNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/ConditionNode.svelte deleted file mode 100644 index 3b5e4fe6..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/ConditionNode.svelte +++ /dev/null @@ -1,269 +0,0 @@ - - -
    - -
    -
    -
    - - - {data.label || 'Condition'} - {#if showComplete} - - {/if} - {#if execState === 'error'} - - {/if} -
    -
    - - -
    - - {#if data.condition} -
    - {data.condition} -
    - {/if} - - {#if data.description} -
    {String(data.description).slice(0, 60)}{String(data.description).length > 60 ? '\u2026' : ''}
    - {/if} - - -
    -
    - - In -
    -
    -
    - True - -
    -
    - False - -
    -
    -
    -
    - - - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/CustomCodeNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/CustomCodeNode.svelte deleted file mode 100644 index f11c410b..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/CustomCodeNode.svelte +++ /dev/null @@ -1,139 +0,0 @@ - - -
    -
    - - {data.label || 'Code'} - {#if showComplete} - - {/if} - {#if execState === 'error'} - - {/if} -
    -
    -
    -
    In
    -
    Out
    -
    - {#if data.description} -
    desc{data.description}
    - {/if} - {#if data.code} -
    code{String(data.code).split('\n')[0].slice(0, 30)}{String(data.code).length > 30 ? '...' : ''}
    - {/if} -
    - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/FanInNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/FanInNode.svelte deleted file mode 100644 index 734c8fbe..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/FanInNode.svelte +++ /dev/null @@ -1,158 +0,0 @@ - - -
    -
    - - {data.label || 'Fan In'} - {#if showComplete} - - {/if} - {#if execState === 'error'} - - {/if} -
    -
    -
    -
    -
    In 1
    -
    In 2
    -
    -
    -
    Out
    -
    -
    - {#if data.merge_expression} -
    merge{data.merge_expression}
    - {/if} - {#if data.merge_timeout} -
    timeout{data.merge_timeout}s
    - {/if} -
    - - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/FanOutNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/FanOutNode.svelte deleted file mode 100644 index ea7495ce..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/FanOutNode.svelte +++ /dev/null @@ -1,157 +0,0 @@ - - -
    -
    - - {data.label || 'Fan Out'} - {#if showComplete} - - {/if} - {#if execState === 'error'} - - {/if} -
    -
    -
    -
    -
    In
    -
    -
    -
    Out 1
    -
    Out 2
    -
    -
    - {#if data.split_expression} -
    split{data.split_expression}
    - {/if} - {#if data.max_concurrent} -
    max{data.max_concurrent}
    - {/if} -
    - - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/InputNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/InputNode.svelte deleted file mode 100644 index 99c6fcaa..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/InputNode.svelte +++ /dev/null @@ -1,344 +0,0 @@ - - -
    - -
    -
    -
    - {triggerType} -
    - - - -
    -
    - -
    - -
    - {data.label || 'Input'} - {#if showComplete} - - - - {/if} - {#if execState === 'error'} - - - - {/if} -
    -
    - - -
    - -
    -
    -
    Exec Out
    -
    - - {#if data.description} -
    {String(data.description).slice(0, 80)}{String(data.description).length > 80 ? '\u2026' : ''}
    - {/if} - -
    - -

    {configSummary()}

    -
    -
    - - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/MemoryNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/MemoryNode.svelte deleted file mode 100644 index d0444b32..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/MemoryNode.svelte +++ /dev/null @@ -1,177 +0,0 @@ - - -
    -
    - - {data.label || 'Memory'} - {#if showComplete} - - - - {/if} - {#if execState === 'error'} - - - - {/if} -
    -
    -
    -
    Exec In
    -
    Exec Out
    -
    - {#if data.memory_action} -
    action{data.memory_action}
    - {/if} - {#if data.namespace} -
    namespace{data.namespace}
    - {/if} -
    - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/OutputNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/OutputNode.svelte deleted file mode 100644 index 2f671ae9..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/OutputNode.svelte +++ /dev/null @@ -1,343 +0,0 @@ - - -
    - -
    -
    -
    - {destinationType} -
    - - - -
    -
    - -
    - -
    - {data.label || 'Output'} - {#if showComplete} - - - - {/if} - {#if execState === 'error'} - - - - {/if} -
    -
    - - -
    - -
    -
    Exec In
    -
    -
    - - {#if data.description} -
    {String(data.description).slice(0, 80)}{String(data.description).length > 80 ? '\u2026' : ''}
    - {/if} - -
    - -

    {configSummary()}

    -
    -
    - - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/ReasoningNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/ReasoningNode.svelte deleted file mode 100644 index dc8c0ae3..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/ReasoningNode.svelte +++ /dev/null @@ -1,271 +0,0 @@ - - -
    - -
    -
    - -
    - -
    - {data.label || 'Reasoning'} - {#if showComplete} - - - - {/if} - {#if execState === 'error'} - - - - {/if} -
    - {#if data.pattern} -
    {data.pattern}
    - {/if} -
    - - -
    -
    -
    Exec In
    -
    Exec Out
    -
    - - {#if data.description} -
    {String(data.description).slice(0, 60)}{String(data.description).length > 60 ? '\u2026' : ''}
    - {/if} - - {#if data.maxSteps} -
    - Max Steps - {data.maxSteps} -
    - {/if} -
    - - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/ToolNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/ToolNode.svelte deleted file mode 100644 index b75dd38a..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/ToolNode.svelte +++ /dev/null @@ -1,262 +0,0 @@ - - -
    - -
    -
    - -
    - -
    - {data.label || 'Tool'} - {#if showComplete} - - - - {/if} - {#if execState === 'error'} - - - - {/if} -
    -
    - - -
    -
    -
    Exec In
    -
    Exec Out
    -
    - - {#if data.tool_name} -
    tool{data.tool_name}
    - {/if} - {#if data.description} -
    {String(data.description).slice(0, 60)}{String(data.description).length > 60 ? '\u2026' : ''}
    - {/if} - {#if data.timeout} -
    timeout{data.timeout}s
    - {/if} -
    - - - -
    - - diff --git a/studio-frontend/src/lib/components/canvas/nodes/ValidatorNode.svelte b/studio-frontend/src/lib/components/canvas/nodes/ValidatorNode.svelte deleted file mode 100644 index d5b31f66..00000000 --- a/studio-frontend/src/lib/components/canvas/nodes/ValidatorNode.svelte +++ /dev/null @@ -1,177 +0,0 @@ - - -
    -
    - - {data.label || 'Validator'} - {#if showComplete} - - - - {/if} - {#if execState === 'error'} - - - - {/if} -
    -
    -
    -
    Exec In
    -
    Exec Out
    -
    - {#if data.validation_rule} -
    rule{data.validation_rule}
    - {/if} - {#if data.fail_action} -
    on_fail{data.fail_action}
    - {/if} -
    - - -
    - - diff --git a/studio-frontend/src/lib/components/layout/AppShell.svelte b/studio-frontend/src/lib/components/layout/AppShell.svelte deleted file mode 100644 index b7924a9c..00000000 --- a/studio-frontend/src/lib/components/layout/AppShell.svelte +++ /dev/null @@ -1,249 +0,0 @@ - - - - -
    - - {#if isHomePage} -
    - {@render children()} -
    - {:else} -
    - -
    - {@render children()} -
    -
    - {/if} -
    - Made with - - by Firefly Software Solutions -
    -
    - - - - - - - - - diff --git a/studio-frontend/src/lib/components/layout/CommandPalette.svelte b/studio-frontend/src/lib/components/layout/CommandPalette.svelte deleted file mode 100644 index 466ed4cd..00000000 --- a/studio-frontend/src/lib/components/layout/CommandPalette.svelte +++ /dev/null @@ -1,541 +0,0 @@ - - -{#if $commandPaletteOpen} - -
    - -
    -{/if} - - diff --git a/studio-frontend/src/lib/components/layout/FirstStartWizard.svelte b/studio-frontend/src/lib/components/layout/FirstStartWizard.svelte deleted file mode 100644 index a61a8885..00000000 --- a/studio-frontend/src/lib/components/layout/FirstStartWizard.svelte +++ /dev/null @@ -1,814 +0,0 @@ - - -{#if $firstStartWizardOpen} -
    - -
    -{/if} - - diff --git a/studio-frontend/src/lib/components/layout/ProjectSettingsModal.svelte b/studio-frontend/src/lib/components/layout/ProjectSettingsModal.svelte deleted file mode 100644 index 34ab81d8..00000000 --- a/studio-frontend/src/lib/components/layout/ProjectSettingsModal.svelte +++ /dev/null @@ -1,244 +0,0 @@ - - - - { if (e.target === dialogEl) handleClose(); }} -> -
    -
    -

    Project Settings

    - -
    -
    - - { if (e.key === 'Enter') handleSave(); }} - /> - - -
    -
    - - -
    -
    -
    - - diff --git a/studio-frontend/src/lib/components/layout/SettingsModal.svelte b/studio-frontend/src/lib/components/layout/SettingsModal.svelte deleted file mode 100644 index 9a01621c..00000000 --- a/studio-frontend/src/lib/components/layout/SettingsModal.svelte +++ /dev/null @@ -1,1835 +0,0 @@ - - -{#if $settingsModalOpen} - -
    -
    - - - - -
    -
    -

    - {SECTIONS.find(s => s.id === activeSection)?.label} -

    -
    - {#if saved} - Saved - {/if} - -
    -
    - -
    - - {#if activeSection === 'profile'} -
    -

    Your Information

    -

    The Architect and Oracle use this to personalise interactions.

    -
    -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - -
    -

    Assistant Personality

    -

    - Choose the AI assistant's persona. "The Architect" uses a philosophical, - Matrix-inspired personality. Any other name uses a standard helpful assistant. -

    -
    - - -
    - {#if draftAssistantName === 'The Architect'} -
    - - The Architect speaks with measured authority and philosophical precision. He will address you by name and guide you through the design of your pipeline. -
    - {:else} -
    - - A friendly, helpful AI assistant that guides you through building pipelines. -
    - {/if} -
    - - - {:else if activeSection === 'providers'} -

    - Configure API keys for your LLM providers. Keys are stored locally and never sent to external services. -

    -
    - {#each PROVIDERS as provider} - {@const configured = provider.fields.every(f => isConfigured(f.key))} -
    -
    -
    - -
    - {provider.label} - {#if configured} - Active - {/if} -
    -
    - {#each provider.fields as field} -
    - -
    - { draftCreds[field.key] = (e.target as HTMLInputElement).value; }} - /> - -
    -
    - {/each} -
    -
    - {/each} -
    - - - {:else if activeSection === 'tools'} -

    - Configure credentials for pipeline tools. These enable search, database, and messaging capabilities in your pipelines. -

    -
    - {#each TOOL_CREDENTIAL_GROUPS as group} - {@const hasAny = group.fields.some(f => isToolConfigured(f.key))} -
    -
    -
    - -
    - {group.label} - {#if hasAny} - Active - {/if} -
    -
    - {#each group.fields as field} -
    - -
    - { draftToolCreds[field.key] = (e.target as HTMLInputElement).value; }} - /> - -
    -
    - {/each} -
    -
    - {/each} -
    - - -
    -
    -
    - -

    Service Connections

    -
    -

    - Manage external service connections for databases, queues, and third-party APIs. -

    -
    - - -
    - - - {#if showAddService} - - -
    - {#each serviceCatalogCategories as cat} - - {/each} -
    - {/if} -
    - - - {#if services.length === 0 && servicesLoaded} -
    - No service connections configured yet. Click "Add Service" to get started. -
    - {:else} - {#each getServicesByCategory() as group} -
    - {group.category} -
    - {#each group.items as svc (svc.id)} - {@const catalogEntry = SERVICE_CATALOG.find(c => c.type === svc.service_type)} - {@const fields = getCatalogFieldsForType(svc.service_type)} -
    -
    -
    - {#if group.category === 'Databases'} - - {:else if group.category === 'Queues'} - - {:else if group.category === 'Messaging'} - - {:else} - - {/if} -
    - {svc.label || catalogEntry?.label || svc.service_type} - {svc.service_type} -
    - - -
    -
    - - - {#if testResult && testResult.id === svc.id} -
    - {testResult.message} -
    - {/if} - - -
    - {#each fields as fieldName} -
    - - {#if fieldName === 'ssl_enabled'} - - {:else if fieldName === 'port'} - updateServiceField(svc.id, fieldName, parseInt((e.target as HTMLInputElement).value) || null)} - /> - {:else if fieldName === 'password' || fieldName === 'api_key' || fieldName === 'token'} -
    - updateServiceField(svc.id, fieldName, (e.target as HTMLInputElement).value)} - /> - -
    - {:else} - updateServiceField(svc.id, fieldName, (e.target as HTMLInputElement).value)} - /> - {/if} -
    - {/each} -
    -
    - {/each} -
    -
    - {/each} - {/if} -
    - - - {:else if activeSection === 'models'} -
    -

    Default Model

    -

    This model is used for new agent nodes and The Architect. You can override per-node.

    -
    - - -
    -
    - -
    -

    Generation Parameters

    -

    Control the creativity and reliability of model outputs.

    -
    - -
    - - {draftTemperature.toFixed(2)} -
    -
    - Precise - Creative -
    -
    -
    - -

    Number of retry attempts if a model call fails.

    - -
    -
    - - - {:else if activeSection === 'about'} -
    -

    Firefly Agentic Studio

    -

    A visual IDE for building, testing, and deploying AI agent pipelines.

    -
    -
    - Version - 0.1.0-alpha -
    -
    - Framework - Firefly Framework Agentic -
    -
    - Backend - FastAPI + Python 3.11+ -
    -
    - Frontend - SvelteKit 5 + TypeScript -
    -
    - License - Apache 2.0 -
    -
    -
    - -
    -

    Keyboard Shortcuts

    -
    -
    - Save Pipeline - Cmd + S -
    -
    - Toggle Architect - Cmd + / -
    -
    - Command Palette - Cmd + K -
    -
    - Close Modal / Panel - ESC -
    -
    -
    - {/if} -
    -
    -
    -
    -{/if} - - diff --git a/studio-frontend/src/lib/components/layout/ShareModal.svelte b/studio-frontend/src/lib/components/layout/ShareModal.svelte deleted file mode 100644 index deb5f55a..00000000 --- a/studio-frontend/src/lib/components/layout/ShareModal.svelte +++ /dev/null @@ -1,732 +0,0 @@ - - -{#if open} - - -{/if} - - diff --git a/studio-frontend/src/lib/components/layout/ShortcutsModal.svelte b/studio-frontend/src/lib/components/layout/ShortcutsModal.svelte deleted file mode 100644 index 745d22a5..00000000 --- a/studio-frontend/src/lib/components/layout/ShortcutsModal.svelte +++ /dev/null @@ -1,248 +0,0 @@ - - -{#if $shortcutsModalOpen} - -
    - -
    -{/if} - - diff --git a/studio-frontend/src/lib/components/layout/Sidebar.svelte b/studio-frontend/src/lib/components/layout/Sidebar.svelte deleted file mode 100644 index a76faf37..00000000 --- a/studio-frontend/src/lib/components/layout/Sidebar.svelte +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/studio-frontend/src/lib/components/layout/ToastContainer.svelte b/studio-frontend/src/lib/components/layout/ToastContainer.svelte deleted file mode 100644 index b99172a1..00000000 --- a/studio-frontend/src/lib/components/layout/ToastContainer.svelte +++ /dev/null @@ -1,110 +0,0 @@ - - -{#if $toasts.length > 0} -
    - {#each $toasts as toast (toast.id)} - - {/each} -
    -{/if} - - diff --git a/studio-frontend/src/lib/components/layout/TopBar.svelte b/studio-frontend/src/lib/components/layout/TopBar.svelte deleted file mode 100644 index cc123ef6..00000000 --- a/studio-frontend/src/lib/components/layout/TopBar.svelte +++ /dev/null @@ -1,1134 +0,0 @@ - - -
    -
    - - - - Firefly Agentic Studio - - - {#if !isHomePage} - - - - / -
    - - {#if projectDropdownOpen} - -
    { projectDropdownOpen = false; confirmDeleteProject = null; }} onkeydown={() => {}}>
    -
    - - {#if confirmDeleteProject} - - {:else} - - - {/if} -
    - {/if} -
    - - - - - - - {/if} -
    - -
    - -
    - {#if !isHomePage} - - - - - - - - - -
    - {/if} - {#if !isHomePage} - - - - {/if} - - - - - - - {#if !isHomePage} - - - - {/if} -
    -
    - - shareModalOpen = false} /> - - -{#if showRunDialog} - -
    showRunDialog = false} onkeydown={(e) => e.key === 'Escape' && (showRunDialog = false)}> - -
    e.stopPropagation()} onkeydown={() => {}}> -

    Run Pipeline

    -

    Provide input for your pipeline (or leave blank to run without input)

    - -
    - - -
    -
    -
    -{/if} - - diff --git a/studio-frontend/src/lib/components/panels/AgentSidebar.svelte b/studio-frontend/src/lib/components/panels/AgentSidebar.svelte deleted file mode 100644 index 4ce0367e..00000000 --- a/studio-frontend/src/lib/components/panels/AgentSidebar.svelte +++ /dev/null @@ -1,261 +0,0 @@ - - -{#if $agentSidebarOpen} - -{/if} - - diff --git a/studio-frontend/src/lib/components/panels/ArchitectSidebar.svelte b/studio-frontend/src/lib/components/panels/ArchitectSidebar.svelte deleted file mode 100644 index 92ec1d18..00000000 --- a/studio-frontend/src/lib/components/panels/ArchitectSidebar.svelte +++ /dev/null @@ -1,2329 +0,0 @@ - - -{#if $architectSidebarOpen} - -{/if} - - diff --git a/studio-frontend/src/lib/components/panels/ArchitectTab.svelte b/studio-frontend/src/lib/components/panels/ArchitectTab.svelte deleted file mode 100644 index 043a7fdb..00000000 --- a/studio-frontend/src/lib/components/panels/ArchitectTab.svelte +++ /dev/null @@ -1,1107 +0,0 @@ - - -
    - -
    - {#if $chatMessages.length === 0} -
    -
    - -
    - {assistantName} - {assistantName === 'The Architect' - ? 'I am The Architect. I designed the canvas upon which your agent pipelines take form. Describe what you wish to construct, and I shall design it.' - : `Ask ${assistantName} to help build your agent pipeline.`} -
    - {:else} - {#each $chatMessages as message (message.id)} -
    -
    - {#if message.role === 'user'} - - {:else} - - {/if} -
    -
    -
    - {message.role === 'user' ? 'You' : assistantName} - {formatTime(message.timestamp)} -
    -
    - {#if message.role === 'assistant'} - {#if message.streaming && !message.content} -
    - {spinnerFrame} - {#key currentThinkingMsg} - {currentThinkingMsg} - {/key} -
    - {:else} - {@html renderMarkdown(message.content)} - {#if message.streaming} - - {/if} - {/if} - {:else} - {message.content} - {/if} -
    - {#if message.toolCalls && message.toolCalls.length > 0} -
    - - -
    toggleToolGroup(message.id)}> -
    -
    - -
    - - {message.toolCalls.length} tool call{message.toolCalls.length !== 1 ? 's' : ''} -
    - {toolCallSummary(message.toolCalls)} -
    - {#if expandedToolGroups[message.id]} -
    - {#each message.toolCalls as tc, i} -
    -
    - {i + 1} - {tc.tool} - {#if tc.result} - - {/if} -
    - {#if tc.args && Object.keys(tc.args).length > 0} -
    - {#each Object.entries(tc.args) as [key, val]} -
    - {key}: - {typeof val === 'string' ? val.length > 120 ? val.slice(0, 117) + '...' : val : JSON.stringify(val)} -
    - {/each} -
    - {/if} - {#if tc.result} -
    - result - {tc.result.length > 200 ? tc.result.slice(0, 197) + '...' : tc.result} -
    - {/if} -
    - {/each} -
    - {/if} -
    - {/if} -
    -
    - {/each} - {/if} -
    - - - {#if activePlan} -
    -
    -
    -
    - Plan -
    - -
    -
    - {#if activePlan.summary} -

    {activePlan.summary}

    - {/if} - {#if activePlan.steps.length > 0} -
    - {#each activePlan.steps as step, i} -
    - {i + 1} - {step} -
    - {/each} -
    - {/if} - {#if activePlan.question} -

    {activePlan.question}

    - {/if} -
    - -
    - {/if} - - - {#if connectionError} -
    - {connectionError} - {#if reconnectAttempts >= MAX_RECONNECT_ATTEMPTS} - - {/if} -
    - {/if} - - -
    - {#if attachments.length > 0} -
    - {#each attachments as att (att.id)} -
    -
    - {#if att.category === 'image' && att.preview} - {att.name} - {:else} -
    - {#if att.category === 'pdf'} - {:else if att.category === 'spreadsheet'} - {:else if att.category === 'presentation'} - {:else if att.category === 'document'} - {:else if att.category === 'image'} - {:else} - {/if} -
    - {/if} -
    - - {att.name.length > 20 ? att.name.slice(0, 17) + '...' : att.name} - - -
    - -
    - {#if openTypeDropdown === att.id} -
    - {#each DOC_TYPE_OPTIONS as opt} - - {/each} -
    - {/if} -
    - {/each} -
    - {/if} -
    -
    - - {#if attachDropdownOpen} -
    - - -
    - {/if} -
    - - -
    - - -
    -
    -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/BottomPanel.svelte b/studio-frontend/src/lib/components/panels/BottomPanel.svelte deleted file mode 100644 index e9f3ffc4..00000000 --- a/studio-frontend/src/lib/components/panels/BottomPanel.svelte +++ /dev/null @@ -1,269 +0,0 @@ - - -
    - - {#if $bottomPanelOpen} -
    -
    -
    - {/if} - -
    -
    - {#each tabs as tab (tab.id)} - {@const TabIcon = tab.icon} - - {/each} -
    - - -
    - - {#if $bottomPanelOpen} -
    - {#if $bottomPanelTab === 'console'} - - {:else if $bottomPanelTab === 'timeline'} - - {:else if $bottomPanelTab === 'executions'} - - {:else if $bottomPanelTab === 'oracle'} - - {:else if $bottomPanelTab === 'history'} - - {/if} -
    - {/if} -
    - - diff --git a/studio-frontend/src/lib/components/panels/ChatTab.svelte b/studio-frontend/src/lib/components/panels/ChatTab.svelte deleted file mode 100644 index cec580d5..00000000 --- a/studio-frontend/src/lib/components/panels/ChatTab.svelte +++ /dev/null @@ -1,1097 +0,0 @@ - - -
    - -
    - {#if $chatMessages.length === 0} -
    -
    - -
    - {assistantName} - {assistantName === 'The Architect' - ? 'I am The Architect. I designed the canvas upon which your agent pipelines take form. Describe what you wish to construct, and I shall design it.' - : `Ask ${assistantName} to help build your agent pipeline. Add nodes, connect them, configure settings, and more.`} -
    - {:else} - {#each $chatMessages as message (message.id)} -
    -
    - {#if message.role === 'user'} - - {:else} - - {/if} -
    -
    -
    - {message.role === 'user' ? 'You' : assistantName} - {formatTime(message.timestamp)} -
    -
    - {#if message.role === 'assistant'} - {#if message.streaming && !message.content} -
    - - - - Thinking... -
    - {:else} - {@html renderMarkdown(message.content)} - {#if message.streaming} - - {/if} - {/if} - {:else} - {message.content} - {/if} -
    - {#if message.toolCalls && message.toolCalls.length > 0} -
    - - -
    toggleToolGroup(message.id)} - > -
    -
    - -
    - - {message.toolCalls.length} tool - call{message.toolCalls.length !== 1 - ? 's' - : ''} -
    - {toolCallSummary(message.toolCalls)} -
    - {#if expandedToolGroups[message.id]} -
    - {#each message.toolCalls as tc, i} -
    -
    - {i + 1} - {tc.tool} - {#if tc.result} - - {/if} -
    - {#if tc.args && Object.keys(tc.args).length > 0} -
    - {#each Object.entries(tc.args) as [key, val]} -
    - {key}: - {typeof val === 'string' - ? val.length > 120 - ? val.slice(0, 117) + - '...' - : val - : JSON.stringify( - val - )} -
    - {/each} -
    - {/if} - {#if tc.result} -
    - result - {tc.result.length > 200 - ? tc.result.slice(0, 197) + '...' - : tc.result} -
    - {/if} -
    - {/each} -
    - {/if} -
    - {/if} -
    -
    - {/each} - {/if} -
    - - - {#if connectionError} -
    - {connectionError} - {#if reconnectAttempts >= MAX_RECONNECT_ATTEMPTS} - - {/if} -
    - {/if} - - -
    - -
    - - -
    -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/CodeTab.svelte b/studio-frontend/src/lib/components/panels/CodeTab.svelte deleted file mode 100644 index 3897fbe6..00000000 --- a/studio-frontend/src/lib/components/panels/CodeTab.svelte +++ /dev/null @@ -1,635 +0,0 @@ - - -
    - -
    -
    - - -
    - {#if activeTab === 'code'} -
    - - - -
    - {/if} -
    - - - {#if activeTab === 'code'} -
    - -
    -
    - PROJECT FILES - {$smithFiles.length} -
    - {#if $smithFiles.length === 0 && !$smithIsThinking} -
    - No files generated yet. - -
    - {:else} -
    - {#each $smithFiles as file (file.path)} - {@const Icon = fileIcon(file.path)} - - {/each} -
    - {/if} -
    - - -
    - {#if $smithIsThinking && $smithFiles.length === 0} -
    - - Smith is generating code... -
    - {:else if activeFileContent} -
    - {$smithActiveFile} -
    -
    {activeFileContent}
    - {:else if $smithFiles.length > 0} -
    Select a file to view its content
    - {:else} -
    -

    Generate code from your pipeline

    -

    Click the refresh button or ask Smith in the Chat tab

    -
    - {/if} -
    -
    - - - {:else} -
    -
    - {#if $smithMessages.length === 0 && !$smithIsThinking} -
    -
    S
    -

    Agent Smith

    -

    Ask Smith to generate, modify, or explain your pipeline code.

    -
    - {/if} - {#each $smithMessages as msg} - - {#if msg.toolCalls} - {#each msg.toolCalls as tc} - - {/each} - {/if} - {/each} - {#if $smithIsThinking} - - {/if} -
    -
    - - -
    -
    - {/if} -
    - -{#if $pendingCommand} - {@const cmdId = $pendingCommand.commandId} - approveCommand(cmdId, true)} - onDeny={() => approveCommand(cmdId, false)} - /> -{/if} - - diff --git a/studio-frontend/src/lib/components/panels/ComponentPanel.svelte b/studio-frontend/src/lib/components/panels/ComponentPanel.svelte deleted file mode 100644 index fc31f463..00000000 --- a/studio-frontend/src/lib/components/panels/ComponentPanel.svelte +++ /dev/null @@ -1,327 +0,0 @@ - - - - - diff --git a/studio-frontend/src/lib/components/panels/ConfigPanel.svelte b/studio-frontend/src/lib/components/panels/ConfigPanel.svelte deleted file mode 100644 index 287de818..00000000 --- a/studio-frontend/src/lib/components/panels/ConfigPanel.svelte +++ /dev/null @@ -1,1041 +0,0 @@ - - -{#if $selectedNode} - {@const node = $selectedNode} - {@const NodeIcon = iconMap[node.type ?? ''] ?? Bot} - {@const nodeColor = nodeColorMap[node.type ?? ''] ?? '#ff6b35'} - - -{/if} - - diff --git a/studio-frontend/src/lib/components/panels/ConsoleTab.svelte b/studio-frontend/src/lib/components/panels/ConsoleTab.svelte deleted file mode 100644 index 2b54662a..00000000 --- a/studio-frontend/src/lib/components/panels/ConsoleTab.svelte +++ /dev/null @@ -1,243 +0,0 @@ - - -
    -
    - {$executionEvents.length} events - -
    - -
    - {#if $executionEvents.length === 0} -
    - No execution events yet. Run your pipeline to see logs here. -
    - {:else} - {#each $executionEvents as event, i (i)} - {@const extra = extraInfo(event)} -
    - {formatTimestamp(event.timestamp ?? '')} - {badgeLabel(event.type)} - {#if event.node_id} - {event.node_id} - {/if} - {#if event.pipeline_name} - {event.pipeline_name} - {/if} - {#if extra} - {extra} - {/if} -
    - {/each} - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/DeployPanel.svelte b/studio-frontend/src/lib/components/panels/DeployPanel.svelte deleted file mode 100644 index 48946edc..00000000 --- a/studio-frontend/src/lib/components/panels/DeployPanel.svelte +++ /dev/null @@ -1,238 +0,0 @@ - - -
    -
    - Deploy / Export -
    - {#if generatedCode} - - - {/if} - -
    -
    - -
    - {#if generatedCode} -
    -
    {generatedCode}
    -
    - {:else if loading} -
    - - Generating Python code... -
    - {:else} -
    - - Click "Export as Python" to generate deployable code from your pipeline. -
    - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/EvaluatePanel.svelte b/studio-frontend/src/lib/components/panels/EvaluatePanel.svelte deleted file mode 100644 index f33ebb2a..00000000 --- a/studio-frontend/src/lib/components/panels/EvaluatePanel.svelte +++ /dev/null @@ -1,456 +0,0 @@ - - -
    -
    - Evaluate -
    - - -
    - -
    - -
    -
    - - {#if loading} -
    - - Loading... -
    - {:else if datasets.length === 0} -
    - - No datasets. Upload a JSON or CSV file to get started. -
    - {:else} -
    - {#each datasets as ds (ds.filename)} - - {/each} -
    - {/if} -
    - -
    - -
    - - {#if result} -
    - -
    -
    - {result.total} - Total -
    -
    - {result.passed} - Passed -
    -
    - {result.failed} - Failed -
    -
    - {result.pass_rate.toFixed(1)}% - Pass Rate -
    -
    - - {#if result.results.length > 0} -
    - {#each result.results as r, i (i)} -
    - - {#if r.passed} - - {:else} - - {/if} - - {r.input} - {#if r.error} - {r.error} - {/if} -
    - {/each} -
    - {/if} -
    - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/ExecutionsPanel.svelte b/studio-frontend/src/lib/components/panels/ExecutionsPanel.svelte deleted file mode 100644 index 5339feeb..00000000 --- a/studio-frontend/src/lib/components/panels/ExecutionsPanel.svelte +++ /dev/null @@ -1,359 +0,0 @@ - - -
    -
    - Executions - -
    - -
    - {#if loading && executions.length === 0} -
    - - Loading executions... -
    - {:else if executions.length === 0} -
    - - No executions yet. Start the runtime and trigger a pipeline to see results. -
    - {:else} -
    -
    - Status - Execution ID - Duration - -
    - {#each executions as exec (exec.execution_id)} -
    - - {#if expandedId === exec.execution_id} -
    -
    - ID - {exec.execution_id} -
    -
    - Status - {exec.status} -
    -
    - Duration - {formatDuration(exec.duration_ms)} -
    -
    - {/if} -
    - {/each} -
    - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/ExperimentsPanel.svelte b/studio-frontend/src/lib/components/panels/ExperimentsPanel.svelte deleted file mode 100644 index 3e50f63e..00000000 --- a/studio-frontend/src/lib/components/panels/ExperimentsPanel.svelte +++ /dev/null @@ -1,535 +0,0 @@ - - -
    -
    - Experiments -
    - - -
    -
    - -
    - {#if showCreateForm} -
    -
    - - -
    -
    - -
    - {#each variants as v, i (i)} -
    - - -
    - - % -
    - {#if variants.length > 2} - - {/if} -
    - {/each} - -
    -
    -
    - - -
    -
    - {/if} - - {#if loading} -
    - - Loading... -
    - {:else if experiments.length === 0 && !showCreateForm} -
    - - No experiments yet. Create one to A/B test pipeline variants. -
    - {:else} -
    - {#each experiments as exp (exp.id)} -
    -
    - - {exp.name} - {exp.status} - {new Date(exp.created_at).toLocaleDateString()} - -
    -
    - {#each exp.variants as variant (variant.name)} -
    - {variant.name} -
    -
    -
    - {variant.traffic}% -
    - {/each} -
    -
    - {/each} -
    - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/FilesPanel.svelte b/studio-frontend/src/lib/components/panels/FilesPanel.svelte deleted file mode 100644 index bff23d2f..00000000 --- a/studio-frontend/src/lib/components/panels/FilesPanel.svelte +++ /dev/null @@ -1,377 +0,0 @@ - - -
    -
    - {#if selectedFile} - - {selectedFile} - {:else} - Files - {/if} - -
    - -
    - {#if selectedFile} - {#if loadingContent} -
    - - Loading file... -
    - {:else} -
    -
    {fileContent}
    -
    - {/if} - {:else if loading} -
    - - Loading files... -
    - {:else if files.length === 0} -
    - - No files in this project. -
    - {:else} -
    - {#each files as entry (entry.path)} - {@const Icon = fileIcon(entry)} - {#if entry.is_dir} -
    - - {entry.name} -
    - {:else} - - {/if} - {/each} -
    - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/FormField.svelte b/studio-frontend/src/lib/components/panels/FormField.svelte deleted file mode 100644 index 8f684812..00000000 --- a/studio-frontend/src/lib/components/panels/FormField.svelte +++ /dev/null @@ -1,113 +0,0 @@ - - -
    - - - {#if type === 'textarea'} - - {:else if type === 'number'} - - {:else if type === 'select'} - - {:else if type === 'datalist'} - - - {#each options as opt} - - {/each} - - {:else} - - {/if} -
    - - diff --git a/studio-frontend/src/lib/components/panels/HistoryPanel.svelte b/studio-frontend/src/lib/components/panels/HistoryPanel.svelte deleted file mode 100644 index b6530ed2..00000000 --- a/studio-frontend/src/lib/components/panels/HistoryPanel.svelte +++ /dev/null @@ -1,360 +0,0 @@ - - -
    -
    - Version History - -
    - -
    - {#if loading} -
    - - Loading history... -
    - {:else if versions.length === 0} -
    - - No version history yet -
    - {:else} - {#each versions as version (version.sha)} -
    -
    - -
    -
    - {version.sha.slice(0, 7)} - {version.message} - {timeAgo(version.timestamp)} -
    -
    - - -
    - {#if confirmRestore === version.sha} -
    - Restore to {version.sha.slice(0, 7)}? - - -
    - {/if} -
    - {/each} - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/IntegrationsPanel.svelte b/studio-frontend/src/lib/components/panels/IntegrationsPanel.svelte deleted file mode 100644 index 643fb4f5..00000000 --- a/studio-frontend/src/lib/components/panels/IntegrationsPanel.svelte +++ /dev/null @@ -1,989 +0,0 @@ - - -
    -
    -
    - - -
    -
    - {#if subTab === 'tools'} - - {/if} - -
    -
    - -
    - {#if loading} -
    - - Loading... -
    - {:else if subTab === 'connectors'} - {#if catalog.length === 0} -
    - - No connectors available -
    - {:else} -
    - {#each catalog as connector (connector.id)} - {@const IconComponent = ICON_MAP[connector.icon]} -
    -
    -
    - {#if IconComponent} - - {:else} - - {/if} -
    -
    -
    - {connector.name} - {#if connector.installed} - Installed - {/if} -
    - - {connector.category.toUpperCase()} - -
    -
    -

    {connector.description}

    - - {#if expandedGuideId === connector.id && connector.setup_guide} -
    - {#each connector.setup_guide.split('\n') as step} -

    {step}

    - {/each} -
    - {/if} -
    - {/each} -
    - {/if} - {:else} - - {#if showCreateForm} -
    -
    - Create Custom Tool - -
    - -
    -
    - - -
    - -
    - - -
    - -
    - - -
    - - {#if newToolType === 'api'} -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - {#if newToolAuthType !== 'none'} -
    - - -
    - {/if} - {:else if newToolType === 'webhook'} -
    - - -
    -
    - - -
    - {:else if newToolType === 'python'} -
    - - -
    - {/if} -
    - -
    - - -
    -
    - {/if} - - {#if tools.length === 0 && !showCreateForm} -
    - -
    - No custom tools defined - Create a custom API, webhook, or Python tool to extend your agents -
    - -
    - {:else if tools.length > 0} -
    - {#each tools as tool (tool.name)} -
    -
    - {#if tool.tool_type === 'api'} - - {:else if tool.tool_type === 'webhook'} - - {:else} - - {/if} -
    -
    -
    - {tool.name} - {tool.tool_type} -
    - {tool.description} -
    -
    - - -
    -
    - {/each} -
    - {/if} - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/MonitorPanel.svelte b/studio-frontend/src/lib/components/panels/MonitorPanel.svelte deleted file mode 100644 index 1fb21024..00000000 --- a/studio-frontend/src/lib/components/panels/MonitorPanel.svelte +++ /dev/null @@ -1,345 +0,0 @@ - - -
    -
    - Monitor - -
    - -
    - {#if loading && !usage} -
    - - Loading usage data... -
    - {:else if !usage} -
    - - No usage data available. Run a pipeline to see metrics. -
    - {:else} -
    -
    -
    -
    - {formatNumber(usage.total_requests)} - Total Requests -
    -
    -
    -
    -
    - {formatNumber(usage.total_tokens)} - Total Tokens -
    -
    -
    -
    -
    - {formatCost(usage.total_cost_usd)} - Total Cost -
    -
    -
    -
    -
    - {formatLatency(usage.total_latency_ms, usage.total_requests)} - Avg Latency -
    -
    -
    - -
    - {#if Object.keys(usage.by_model).length > 0} -
    -
    By Model
    -
    -
    - Model - Requests - Tokens - Cost -
    - {#each Object.entries(usage.by_model) as [model, data] (model)} -
    - {model} - {formatNumber(data.requests)} - {formatNumber(data.total_tokens)} - {formatCost(data.cost_usd)} -
    - {/each} -
    -
    - {/if} - - {#if Object.keys(usage.by_agent).length > 0} -
    -
    By Agent
    -
    -
    - Agent - Requests - Tokens - Cost -
    - {#each Object.entries(usage.by_agent) as [agent, data] (agent)} -
    - {agent} - {formatNumber(data.requests)} - {formatNumber(data.total_tokens)} - {formatCost(data.cost_usd)} -
    - {/each} -
    -
    - {/if} -
    - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/OraclePanel.svelte b/studio-frontend/src/lib/components/panels/OraclePanel.svelte deleted file mode 100644 index 3cbf9030..00000000 --- a/studio-frontend/src/lib/components/panels/OraclePanel.svelte +++ /dev/null @@ -1,316 +0,0 @@ - - -
    -
    -
    - - Insights -
    - -
    - -
    - {#if $oracleInsights.length === 0} -
    - -

    No insights yet

    -

    - Click "Analyze" to review your pipeline, or insights will appear - automatically as you build. -

    -
    - {:else} - {#each $oracleInsights as insight (insight.id)} - {@const sev = getSeverity(insight.severity)} - {@const SevIcon = sev.icon} -
    -
    toggleExpand(insight.id)} - onkeydown={(e) => e.key === 'Enter' && toggleExpand(insight.id)} - > - - - - {insight.title} - {formatTime(insight.timestamp)} -
    - - {#if expandedId === insight.id} -
    -

    {insight.description}

    -
    - {/if} - - {#if insight.status === 'pending'} -
    - - -
    - {:else if insight.status === 'approved'} -
    Sent to Architect
    - {:else} -
    Skipped
    - {/if} -
    - {/each} - {/if} -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/OracleTab.svelte b/studio-frontend/src/lib/components/panels/OracleTab.svelte deleted file mode 100644 index 5f5e904a..00000000 --- a/studio-frontend/src/lib/components/panels/OracleTab.svelte +++ /dev/null @@ -1,1313 +0,0 @@ - - -
    - -
    - {#if $oracleChatMessages.length === 0} -
    -
    - -
    - The Oracle - - I see what others cannot. Ask about your pipeline architecture, - patterns, or potential improvements. - -
    - {:else} - {#each $oracleChatMessages as msg (msg.id)} -
    -
    - {#if msg.role === 'user'} - - {:else} - - {/if} -
    -
    -
    - - {msg.role === 'user' ? 'You' : 'Oracle'} - - {formatTime(msg.timestamp)} -
    -
    - {#if msg.role === 'oracle'} - {#if msg.streaming && !msg.content} -
    - {spinnerFrame} - {#key currentThinkingMsg} - {currentThinkingMsg} - {/key} -
    - {:else} - {@html renderMarkdown(msg.content)} - {#if msg.streaming} - - {/if} - {/if} - {:else} - {msg.content} - {/if} -
    - - {#if (msg as any).toolCalls && (msg as any).toolCalls.length > 0} -
    - - -
    toggleToolGroup(msg.id)} - > -
    -
    - -
    - - - {(msg as any).toolCalls.length} tool call{(msg as any) - .toolCalls.length !== 1 - ? 's' - : ''} - -
    - - {toolCallSummary((msg as any).toolCalls)} - -
    - {#if expandedToolGroups[msg.id]} -
    - {#each (msg as any).toolCalls as tc, i} -
    -
    - {i + 1} - {tc.tool} - {#if tc.result} - - {/if} -
    - {#if tc.args && Object.keys(tc.args).length > 0} -
    - {#each Object.entries(tc.args) as [key, val]} -
    - {key}: - - {typeof val === 'string' - ? val.length > 120 - ? val.slice(0, 117) + - '...' - : val - : JSON.stringify(val)} - -
    - {/each} -
    - {/if} - {#if tc.result} -
    - result - - {tc.result.length > 200 - ? tc.result.slice(0, 197) + '...' - : tc.result} - -
    - {/if} -
    - {/each} -
    - {/if} -
    - {/if} -
    -
    - {/each} - {/if} -
    - - - {#if pendingInsights.length > 0} -
    - - -
    insightsExpanded = !insightsExpanded}> -
    - - Insights ({pendingInsights.length}) -
    -
    - -
    -
    - {#if insightsExpanded} -
    - {#each pendingInsights as insight (insight.id)} - {@const SevIcon = severityIcon(insight.severity)} -
    -
    - - - - {insight.title} -
    - {#if insight.description} -

    {insight.description}

    - {/if} -
    - - -
    -
    - {/each} -
    - {/if} -
    - {/if} - - - {#if !$oracleConnected} -
    - Oracle is not connected. Ensure the backend is running. -
    - {/if} - - -
    -
    - -
    - - - -
    -
    -
    -
    - - diff --git a/studio-frontend/src/lib/components/panels/SmithTab.svelte b/studio-frontend/src/lib/components/panels/SmithTab.svelte deleted file mode 100644 index 17ab1441..00000000 --- a/studio-frontend/src/lib/components/panels/SmithTab.svelte +++ /dev/null @@ -1,1868 +0,0 @@ - - -
    - -
    -
    - - -
    - {#if viewMode === 'code'} -
    - - - -
    - {/if} -
    - - {#if viewMode === 'chat'} - -
    - {#if $smithMessages.length === 0 && !$smithIsThinking} -
    -
    - -
    - Agent Smith - I am... inevitable. Describe what code you need and I shall compile it into existence. -
    - {:else} - {#each $smithMessages as message, msgIdx} -
    -
    - {#if message.role === 'user'} - - {:else} - - {/if} -
    -
    -
    - {message.role === 'user' ? 'You' : 'Smith'} - {formatTime(message.timestamp)} -
    -
    - {#if message.role === 'assistant'} - {@html renderMarkdown(message.content)} - {:else} - {message.content} - {/if} -
    - {#if message.toolCalls && message.toolCalls.length > 0} -
    - - -
    toggleToolGroup(msgIdx)} - > -
    -
    - -
    - - {message.toolCalls.length} tool call{message.toolCalls.length !== 1 ? 's' : ''} -
    - {toolCallSummary(message.toolCalls)} -
    - {#if expandedToolGroups[`msg-${msgIdx}`]} -
    - {#each message.toolCalls as tc, i} - {@const parsedArgs = parseToolArgs(tc.args)} -
    -
    - {i + 1} - {tc.name} - {#if tc.result} - - {/if} -
    - {#if parsedArgs && Object.keys(parsedArgs).length > 0} -
    - {#each Object.entries(parsedArgs) as [key, val]} -
    - {key}: - {typeof val === 'string' ? (val.length > 120 ? val.slice(0, 117) + '...' : val) : JSON.stringify(val)} -
    - {/each} -
    - {:else if tc.args} -
    -
    - {tc.args.length > 200 ? tc.args.slice(0, 197) + '...' : tc.args} -
    -
    - {/if} - {#if tc.result} -
    - result - {tc.result.length > 200 ? tc.result.slice(0, 197) + '...' : tc.result} -
    - {/if} -
    - {/each} -
    - {/if} -
    - {/if} -
    -
    - {/each} - {#if $smithIsThinking} -
    -
    - -
    -
    -
    - Smith -
    -
    -
    - {spinnerFrame} - {#key currentThinkingMsg} - {currentThinkingMsg} - {/key} -
    -
    -
    -
    - {/if} - {#if $smithFiles.length > 0} - - {/if} - {/if} -
    - - - {#if connectionError} -
    - {connectionError} - -
    - {/if} - - -
    - {#if attachments.length > 0} -
    - {#each attachments as att (att.id)} -
    -
    - {#if att.category === 'image' && att.preview} - {att.name} - {:else} -
    - {#if att.category === 'pdf'} - - {:else if att.category === 'spreadsheet'} - - {:else if att.category === 'presentation'} - - {:else if att.category === 'document'} - - {:else if att.category === 'image'} - - {:else} - - {/if} -
    - {/if} -
    - - {att.name.length > 20 ? att.name.slice(0, 17) + '...' : att.name} - - -
    - -
    - {#if openTypeDropdown === att.id} -
    - {#each DOC_TYPE_OPTIONS as opt} - - {/each} -
    - {/if} -
    - {/each} -
    - {/if} -
    -
    - - {#if attachDropdownOpen} -
    - - -
    - {/if} -
    - - -
    - - -
    -
    -
    - {:else} - -
    - {#if $smithFiles.length === 0 && !$smithIsThinking} -
    - No files generated yet. - -
    - {:else if $smithIsThinking && $smithFiles.length === 0} -
    - - Smith is generating code... -
    - {:else} - -
    - {#each $smithFiles as file (file.path)} - {@const Icon = fileIcon(file.path)} - - {/each} -
    - - {#if activeFileContent} -
    - {$smithActiveFile} - -
    -
    - - - {#each highlightedLines as line, i} - - - - - {/each} - -
    {i + 1}{@html line || ' '}
    -
    - {:else} -
    Select a file to view its content
    - {/if} - {/if} -
    - {/if} -
    - -{#if $pendingCommand} - {@const cmdId = $pendingCommand.commandId} - approveCommand(cmdId, true)} - onDeny={() => approveCommand(cmdId, false)} - /> -{/if} - - diff --git a/studio-frontend/src/lib/components/panels/TimelineTab.svelte b/studio-frontend/src/lib/components/panels/TimelineTab.svelte deleted file mode 100644 index 1d98bafb..00000000 --- a/studio-frontend/src/lib/components/panels/TimelineTab.svelte +++ /dev/null @@ -1,727 +0,0 @@ - - -
    - {#if $checkpoints.length === 0} - -
    -
    - -
    - Run your pipeline to see the execution timeline -
    - {:else} - -
    -
    - Timeline - {$checkpoints.length} checkpoint{$checkpoints.length === 1 ? '' : 's'} -
    - -
    - - -
    -
    -
    - {#each $checkpoints as cp (cp.index)} - {@const isSelected = selectedIndex === cp.index} - {@const isCompare = compareIndex === cp.index} - - {/each} -
    -
    - - - {#if selectedCheckpoint} -
    - - - {#if compareIndex !== null} - - {:else} - Shift+click another checkpoint to compare - {/if} -
    - {/if} - - - {#if diffResult} -
    -
    Diff: #{selectedIndex} vs #{compareIndex}
    -
    - {#if diffResult.added.length > 0} -
    - Added - {#each diffResult.added as key} - {key} - {/each} -
    - {/if} - {#if diffResult.removed.length > 0} -
    - Removed - {#each diffResult.removed as key} - {key} - {/each} -
    - {/if} - {#if diffResult.changed.length > 0} -
    - Changed - {#each diffResult.changed as key} - {key} - {/each} -
    - {/if} - {#if diffResult.added.length === 0 && diffResult.removed.length === 0 && diffResult.changed.length === 0} - No differences - {/if} -
    -
    - {/if} - - - {#if selectedCheckpoint} -
    -
    - - {selectedCheckpoint.node_id} - - {formatRelativeTime(selectedCheckpoint.timestamp)} - {formatTimestamp(selectedCheckpoint.timestamp)} -
    - - {#if selectedCheckpoint.branch_id} -
    - - Branch: {selectedCheckpoint.branch_id} - {#if selectedCheckpoint.parent_index !== null && selectedCheckpoint.parent_index !== undefined} - from checkpoint #{selectedCheckpoint.parent_index} - {/if} -
    - {/if} - - -
    - - {#if expandedState} -
    - {#each Object.entries(selectedCheckpoint.state) as [key, value]} -
    - {key}: - {renderValue(value)} -
    - {/each} - {#if Object.keys(selectedCheckpoint.state).length === 0} - empty - {/if} -
    - {/if} -
    - - -
    - - {#if expandedInputs} -
    - {#each Object.entries(selectedCheckpoint.inputs) as [key, value]} -
    - {key}: - {renderValue(value)} -
    - {/each} - {#if Object.keys(selectedCheckpoint.inputs).length === 0} - empty - {/if} -
    - {/if} -
    -
    - {/if} - {/if} -
    - - diff --git a/studio-frontend/src/lib/components/shared/ChatMessage.svelte b/studio-frontend/src/lib/components/shared/ChatMessage.svelte deleted file mode 100644 index 781ca12c..00000000 --- a/studio-frontend/src/lib/components/shared/ChatMessage.svelte +++ /dev/null @@ -1,88 +0,0 @@ - - -
    -
    - {#if role === 'assistant' && agentName} - {agentName} - {:else} - You - {/if} - {#if timestamp} - {timestamp} - {/if} -
    -
    - {@html content} -
    -
    - - diff --git a/studio-frontend/src/lib/components/shared/CommandApprovalModal.svelte b/studio-frontend/src/lib/components/shared/CommandApprovalModal.svelte deleted file mode 100644 index 98f7370f..00000000 --- a/studio-frontend/src/lib/components/shared/CommandApprovalModal.svelte +++ /dev/null @@ -1,107 +0,0 @@ - - - - - diff --git a/studio-frontend/src/lib/components/shared/ModelSelector.svelte b/studio-frontend/src/lib/components/shared/ModelSelector.svelte deleted file mode 100644 index 452e9c51..00000000 --- a/studio-frontend/src/lib/components/shared/ModelSelector.svelte +++ /dev/null @@ -1,293 +0,0 @@ - - -
    -
    - - -
    - - {#if value && !open} -
    {value}
    - {/if} - - {#if open} - - - - {/if} -
    - - diff --git a/studio-frontend/src/lib/components/shared/ThinkingIndicator.svelte b/studio-frontend/src/lib/components/shared/ThinkingIndicator.svelte deleted file mode 100644 index 3a0fd2a2..00000000 --- a/studio-frontend/src/lib/components/shared/ThinkingIndicator.svelte +++ /dev/null @@ -1,63 +0,0 @@ - - -
    -
    - - - -
    - {messages[messageIndex]} -
    - - diff --git a/studio-frontend/src/lib/components/shared/ToolCallDisplay.svelte b/studio-frontend/src/lib/components/shared/ToolCallDisplay.svelte deleted file mode 100644 index 6562c0c9..00000000 --- a/studio-frontend/src/lib/components/shared/ToolCallDisplay.svelte +++ /dev/null @@ -1,87 +0,0 @@ - - -
    - - {#if expanded} -
    - {#if args} -
    - Args -
    {args}
    -
    - {/if} - {#if result} -
    - Result -
    {result}
    -
    - {/if} -
    - {/if} -
    - - diff --git a/studio-frontend/src/lib/components/shared/Tooltip.svelte b/studio-frontend/src/lib/components/shared/Tooltip.svelte deleted file mode 100644 index 0e1ab7cc..00000000 --- a/studio-frontend/src/lib/components/shared/Tooltip.svelte +++ /dev/null @@ -1,173 +0,0 @@ - - - -
    - {@render children?.()} -
    - - - - diff --git a/studio-frontend/src/lib/data/models.ts b/studio-frontend/src/lib/data/models.ts deleted file mode 100644 index 67d304f6..00000000 --- a/studio-frontend/src/lib/data/models.ts +++ /dev/null @@ -1,127 +0,0 @@ -export interface ModelInfo { - id: string; - name: string; - provider: string; - contextWindow: number; - isDefault: boolean; -} - -export interface ProviderModels { - provider: string; - label: string; - models: ModelInfo[]; -} - -export const MODEL_CATALOG: ProviderModels[] = [ - { - provider: 'openai', - label: 'OpenAI', - models: [ - { id: 'openai:gpt-4.1', name: 'GPT-4.1', provider: 'openai', contextWindow: 1047576, isDefault: true }, - { id: 'openai:gpt-4.1-mini', name: 'GPT-4.1 Mini', provider: 'openai', contextWindow: 1047576, isDefault: false }, - { id: 'openai:gpt-4.1-nano', name: 'GPT-4.1 Nano', provider: 'openai', contextWindow: 1047576, isDefault: false }, - { id: 'openai:gpt-4o', name: 'GPT-4o', provider: 'openai', contextWindow: 128000, isDefault: false }, - { id: 'openai:gpt-4o-mini', name: 'GPT-4o Mini', provider: 'openai', contextWindow: 128000, isDefault: false }, - { id: 'openai:o3', name: 'o3', provider: 'openai', contextWindow: 200000, isDefault: false }, - { id: 'openai:o4-mini', name: 'o4-mini', provider: 'openai', contextWindow: 200000, isDefault: false }, - ] - }, - { - provider: 'anthropic', - label: 'Anthropic', - models: [ - { id: 'anthropic:claude-sonnet-4-6', name: 'Claude Sonnet 4.6', provider: 'anthropic', contextWindow: 200000, isDefault: true }, - { id: 'anthropic:claude-opus-4-6', name: 'Claude Opus 4.6', provider: 'anthropic', contextWindow: 200000, isDefault: false }, - { id: 'anthropic:claude-haiku-4-5', name: 'Claude Haiku 4.5', provider: 'anthropic', contextWindow: 200000, isDefault: false }, - ] - }, - { - provider: 'google', - label: 'Google Gemini', - models: [ - { id: 'google:gemini-2.5-pro', name: 'Gemini 2.5 Pro', provider: 'google', contextWindow: 1048576, isDefault: true }, - { id: 'google:gemini-2.5-flash', name: 'Gemini 2.5 Flash', provider: 'google', contextWindow: 1048576, isDefault: false }, - { id: 'google:gemini-2.0-flash', name: 'Gemini 2.0 Flash', provider: 'google', contextWindow: 1048576, isDefault: false }, - ] - }, - { - provider: 'groq', - label: 'Groq', - models: [ - { id: 'groq:llama-3.3-70b-versatile', name: 'Llama 3.3 70B', provider: 'groq', contextWindow: 128000, isDefault: true }, - { id: 'groq:mixtral-8x7b-32768', name: 'Mixtral 8x7B', provider: 'groq', contextWindow: 32768, isDefault: false }, - { id: 'groq:gemma2-9b-it', name: 'Gemma 2 9B', provider: 'groq', contextWindow: 8192, isDefault: false }, - ] - }, - { - provider: 'mistral', - label: 'Mistral', - models: [ - { id: 'mistral:mistral-large-latest', name: 'Mistral Large', provider: 'mistral', contextWindow: 128000, isDefault: true }, - { id: 'mistral:mistral-small-latest', name: 'Mistral Small', provider: 'mistral', contextWindow: 128000, isDefault: false }, - { id: 'mistral:codestral-latest', name: 'Codestral', provider: 'mistral', contextWindow: 256000, isDefault: false }, - ] - }, - { - provider: 'deepseek', - label: 'DeepSeek', - models: [ - { id: 'deepseek:deepseek-chat', name: 'DeepSeek Chat', provider: 'deepseek', contextWindow: 64000, isDefault: true }, - { id: 'deepseek:deepseek-reasoner', name: 'DeepSeek Reasoner', provider: 'deepseek', contextWindow: 64000, isDefault: false }, - ] - }, - { - provider: 'cohere', - label: 'Cohere', - models: [ - { id: 'cohere:command-r-plus', name: 'Command R+', provider: 'cohere', contextWindow: 128000, isDefault: true }, - { id: 'cohere:command-r', name: 'Command R', provider: 'cohere', contextWindow: 128000, isDefault: false }, - ] - }, - { - provider: 'azure', - label: 'Azure OpenAI', - models: [ - { id: 'azure:gpt-4o', name: 'GPT-4o (Azure)', provider: 'azure', contextWindow: 128000, isDefault: true }, - { id: 'azure:gpt-4o-mini', name: 'GPT-4o Mini (Azure)', provider: 'azure', contextWindow: 128000, isDefault: false }, - ] - }, - { - provider: 'bedrock', - label: 'Amazon Bedrock', - models: [ - { id: 'bedrock:anthropic.claude-3-5-sonnet-20241022-v2:0', name: 'Claude 3.5 Sonnet (Bedrock)', provider: 'bedrock', contextWindow: 200000, isDefault: true }, - { id: 'bedrock:anthropic.claude-3-haiku-20240307-v1:0', name: 'Claude 3 Haiku (Bedrock)', provider: 'bedrock', contextWindow: 200000, isDefault: false }, - { id: 'bedrock:amazon.nova-pro-v1:0', name: 'Amazon Nova Pro', provider: 'bedrock', contextWindow: 300000, isDefault: false }, - ] - }, - { - provider: 'ollama', - label: 'Ollama', - models: [ - { id: 'ollama:llama3.3', name: 'Llama 3.3', provider: 'ollama', contextWindow: 128000, isDefault: true }, - { id: 'ollama:mistral', name: 'Mistral', provider: 'ollama', contextWindow: 32768, isDefault: false }, - { id: 'ollama:codellama', name: 'Code Llama', provider: 'ollama', contextWindow: 16384, isDefault: false }, - { id: 'ollama:phi4', name: 'Phi-4', provider: 'ollama', contextWindow: 16384, isDefault: false }, - ] - } -]; - -export function getAllModels(): ModelInfo[] { - return MODEL_CATALOG.flatMap((p) => p.models); -} - -export function getModelsForProviders(providerIds: Set): ProviderModels[] { - return MODEL_CATALOG.filter((p) => providerIds.has(p.provider)); -} - -export function getDefaultModel(providerId: string): ModelInfo | undefined { - const provider = MODEL_CATALOG.find((p) => p.provider === providerId); - return provider?.models.find((m) => m.isDefault); -} - -export function formatContextWindow(tokens: number): string { - if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(1)}M`; - if (tokens >= 1000) return `${Math.round(tokens / 1000)}K`; - return String(tokens); -} diff --git a/studio-frontend/src/lib/data/patterns.ts b/studio-frontend/src/lib/data/patterns.ts deleted file mode 100644 index d6180643..00000000 --- a/studio-frontend/src/lib/data/patterns.ts +++ /dev/null @@ -1,69 +0,0 @@ -export interface PatternDefinition { - id: string; - name: string; - description: string; - defaultMaxSteps: number; - bestFor: string; - configKeys: string[]; -} - -export const PATTERN_CATALOG: PatternDefinition[] = [ - { - id: 'react', - name: 'ReAct', - description: - 'Reason-Act-Observe loop. The agent thinks, takes an action (tool call), observes the result, and repeats until done.', - defaultMaxSteps: 10, - bestFor: 'Tasks requiring tool interaction and iterative problem-solving', - configKeys: ['max_steps'] - }, - { - id: 'chain_of_thought', - name: 'Chain of Thought', - description: - 'Step-by-step reasoning without actions. The agent breaks down the problem into logical steps and thinks through each one.', - defaultMaxSteps: 10, - bestFor: 'Pure logic, analysis, and reasoning tasks without tool needs', - configKeys: ['max_steps'] - }, - { - id: 'plan_and_execute', - name: 'Plan & Execute', - description: - 'Generates a multi-step plan first, then executes each step sequentially. Can replan on failure.', - defaultMaxSteps: 15, - bestFor: 'Complex multi-step tasks that benefit from upfront planning', - configKeys: ['max_steps', 'allow_replan'] - }, - { - id: 'reflexion', - name: 'Reflexion', - description: - 'Execute-Critique-Retry loop. Generates output, critiques it for quality, and retries with feedback if unsatisfactory.', - defaultMaxSteps: 5, - bestFor: 'Quality-sensitive outputs that benefit from self-review', - configKeys: ['max_steps'] - }, - { - id: 'tree_of_thoughts', - name: 'Tree of Thoughts', - description: - 'Generates multiple solution branches, evaluates each with a score, and selects the best. Explores the solution space broadly.', - defaultMaxSteps: 3, - bestFor: 'Creative and exploratory problems with multiple valid approaches', - configKeys: ['branching_factor', 'max_depth'] - }, - { - id: 'goal_decomposition', - name: 'Goal Decomposition', - description: - 'Breaks a large goal into phases and tasks, then executes each task. Can delegate sub-tasks to other patterns.', - defaultMaxSteps: 20, - bestFor: 'Large ambiguous goals that need structured decomposition', - configKeys: ['max_steps', 'task_pattern'] - } -]; - -export function getPatternById(id: string): PatternDefinition | undefined { - return PATTERN_CATALOG.find((p) => p.id === id); -} diff --git a/studio-frontend/src/lib/data/templates.ts b/studio-frontend/src/lib/data/templates.ts deleted file mode 100644 index e1b17d7a..00000000 --- a/studio-frontend/src/lib/data/templates.ts +++ /dev/null @@ -1,85 +0,0 @@ -import type { Node, Edge } from '@xyflow/svelte'; - -export interface PipelineTemplate { - id: string; - name: string; - description: string; - /** If set, the template is generated by The Architect via this prompt. */ - architectPrompt?: string; - /** Static nodes/edges for templates that load directly (e.g. blank). */ - nodes: Node[]; - edges: Edge[]; -} - -export const PIPELINE_TEMPLATES: PipelineTemplate[] = [ - { - id: 'blank', - name: 'Blank Canvas', - description: 'Start with an empty canvas and build from scratch', - nodes: [], - edges: [] - }, - { - id: 'simple-qa', - name: 'Q&A Agent', - description: 'A conversational agent with web search capabilities', - architectPrompt: - 'Build a simple Q&A agent pipeline. Create one agent node with clear instructions for answering user questions helpfully and concisely. Connect it to a search tool so it can look up information when needed. Configure the agent with a good model and detailed instructions.', - nodes: [], - edges: [] - }, - { - id: 'multi-agent', - name: 'Multi-Agent Team', - description: 'Multiple specialized agents that collaborate on complex tasks', - architectPrompt: - 'Build a multi-agent team pipeline with 3 specialized agents: (1) a Router agent that analyzes the incoming request and decides which specialist to delegate to, (2) a Research agent that gathers information using search tools, and (3) a Writer agent that produces the final polished output. Connect the Router to a condition node that branches to the appropriate specialist based on the task type. Connect both specialists to a final output. Configure every agent with proper model, instructions, and description.', - nodes: [], - edges: [] - }, - { - id: 'rag-pipeline', - name: 'RAG Pipeline', - description: 'Retrieval-augmented generation with context injection', - architectPrompt: - 'Build a RAG (Retrieval-Augmented Generation) pipeline. Create: (1) an Input node for receiving queries, (2) a Retrieval agent that searches a knowledge base for relevant context, (3) a Reasoning node using chain_of_thought to synthesize the retrieved information, (4) a Generator agent that produces a well-grounded answer using the retrieved context, and (5) an Output node for the final response. Connect them in sequence. Configure all agents with proper models and instructions that emphasize grounding answers in retrieved context.', - nodes: [], - edges: [] - }, - { - id: 'reasoning-pipeline', - name: 'Reasoning Chain', - description: 'Multi-step reasoning with quality validation and retry logic', - architectPrompt: - 'Build a reasoning pipeline with quality control. Create: (1) an Input agent that receives and preprocesses user questions, (2) a Reasoning node using chain_of_thought pattern with maxSteps=5, (3) a Validator node that checks the reasoning output is not empty, (4) a Condition node that branches on quality: if valid, route to the Output agent; if invalid, route to a Retry agent that attempts the question with a different approach. Connect the Retry agent back to the Reasoning node for another pass. Configure all agents with proper models and detailed instructions.', - nodes: [], - edges: [] - }, - { - id: 'content-pipeline', - name: 'Content Generator', - description: 'Research, draft, and review content with quality checks', - architectPrompt: - 'Build a content generation pipeline with three stages: (1) a Research agent that gathers information on a topic using search tools, (2) a Writer agent that drafts content based on the research, and (3) a Reviewer agent that critiques the draft for accuracy, clarity, and completeness. Add a Reasoning node with reflexion pattern between the Writer and Reviewer for self-improvement. Add a Validator node after the Reviewer to ensure the output meets quality standards. Configure all agents with proper models, detailed instructions about their specific role, and descriptions.', - nodes: [], - edges: [] - }, - { - id: 'data-processing', - name: 'Data Processor', - description: 'Extract, transform, and validate structured data from text', - architectPrompt: - 'Build a data processing pipeline. Create: (1) an Input node with trigger_type="manual", (2) an Extractor agent that receives unstructured text and extracts structured data fields, (3) a Validator node to ensure extracted data is valid, (4) a Custom Code node for any data transformation logic (provide a placeholder async def execute function), (5) an Output node with destination_type="response". Connect them in sequence. Configure the Extractor agent with detailed instructions about what fields to extract and expected formats.', - nodes: [], - edges: [] - }, - { - id: 'parallel-analysis', - name: 'Parallel Analysis', - description: 'Fan-out to multiple analysts, then merge their results', - architectPrompt: - 'Build a parallel analysis pipeline using fan-out/fan-in pattern. Create: (1) a Coordinator agent that receives a complex question, (2) a Fan-Out node that splits the work, (3) three parallel Agent nodes: a Technical Analyst, a Business Analyst, and a Risk Analyst, each with specialized instructions for their domain, (4) a Fan-In node with merge_expression="collect" to gather all results, and (5) a Synthesizer agent that combines the parallel analyses into a unified report. Connect them properly: Coordinator to Fan-Out, Fan-Out to all three analysts, all three analysts to Fan-In, Fan-In to Synthesizer. Configure every agent with a proper model and role-specific instructions.', - nodes: [], - edges: [] - } -]; diff --git a/studio-frontend/src/lib/data/tools.ts b/studio-frontend/src/lib/data/tools.ts deleted file mode 100644 index 800c7069..00000000 --- a/studio-frontend/src/lib/data/tools.ts +++ /dev/null @@ -1,256 +0,0 @@ -export interface ToolParameter { - name: string; - type: string; - description: string; - required: boolean; - default?: string; - options?: string[]; // for enum/select types -} - -export interface ToolDefinition { - id: string; - name: string; - description: string; - category: string; - tags: string[]; - parameters: ToolParameter[]; -} - -export const TOOL_CATALOG: ToolDefinition[] = [ - { - id: 'calculator', - name: 'Calculator', - description: - 'Safe mathematical expression evaluator. Supports arithmetic, functions (sqrt, sin, cos, log, etc.), and constants (pi, e).', - category: 'Utility', - tags: ['math', 'calculator', 'utility'], - parameters: [ - { - name: 'expression', - type: 'string', - description: 'Math expression to evaluate', - required: true - } - ] - }, - { - id: 'datetime', - name: 'Date & Time', - description: 'Current date/time information with timezone support.', - category: 'Utility', - tags: ['datetime', 'utility'], - parameters: [ - { - name: 'action', - type: 'select', - description: 'What to retrieve', - required: true, - options: ['now', 'date', 'time', 'timestamp', 'timezones'] - }, - { - name: 'timezone', - type: 'string', - description: 'IANA timezone (e.g. America/New_York)', - required: false, - default: 'UTC' - }, - { - name: 'format', - type: 'string', - description: 'strftime format string', - required: false - } - ] - }, - { - id: 'filesystem', - name: 'File System', - description: - 'Read, write, and list files. Sandboxed to a base directory with path-traversal protection.', - category: 'I/O', - tags: ['filesystem', 'io'], - parameters: [ - { - name: 'action', - type: 'select', - description: 'File operation', - required: true, - options: ['read', 'write', 'list'] - }, - { - name: 'path', - type: 'string', - description: 'File or directory path', - required: true - }, - { - name: 'content', - type: 'string', - description: 'Content to write (for write action)', - required: false - } - ] - }, - { - id: 'http', - name: 'HTTP Client', - description: 'Make HTTP requests with connection pooling. Supports GET, POST, PUT, DELETE.', - category: 'Web', - tags: ['http', 'web'], - parameters: [ - { - name: 'url', - type: 'string', - description: 'Target URL', - required: true - }, - { - name: 'method', - type: 'select', - description: 'HTTP method', - required: false, - default: 'GET', - options: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'] - }, - { - name: 'body', - type: 'string', - description: 'Request body (JSON)', - required: false - }, - { - name: 'headers', - type: 'string', - description: 'Request headers (JSON)', - required: false - } - ] - }, - { - id: 'json', - name: 'JSON', - description: 'Parse, validate, extract, and format JSON data. Supports dot-path extraction.', - category: 'Utility', - tags: ['json', 'utility'], - parameters: [ - { - name: 'action', - type: 'select', - description: 'JSON operation', - required: true, - options: ['parse', 'validate', 'extract', 'format', 'keys'] - }, - { - name: 'data', - type: 'string', - description: 'JSON data to process', - required: true - }, - { - name: 'path', - type: 'string', - description: 'Dot-path for extraction (e.g. address.city)', - required: false - } - ] - }, - { - id: 'text', - name: 'Text Processing', - description: 'Count, extract, truncate, replace, and split text using regex patterns.', - category: 'Utility', - tags: ['text', 'utility'], - parameters: [ - { - name: 'action', - type: 'select', - description: 'Text operation', - required: true, - options: ['count', 'extract', 'truncate', 'replace', 'split'] - }, - { - name: 'text', - type: 'string', - description: 'Input text', - required: true - }, - { - name: 'pattern', - type: 'string', - description: 'Regex pattern (for extract/replace/split)', - required: false - }, - { - name: 'replacement', - type: 'string', - description: 'Replacement string (for replace)', - required: false - } - ] - }, - { - id: 'shell', - name: 'Shell', - description: 'Execute shell commands from an explicit allowlist. Sandboxed for safety.', - category: 'System', - tags: ['shell', 'system'], - parameters: [ - { - name: 'command', - type: 'string', - description: 'Command to execute (must be in allowlist)', - required: true - } - ] - }, - { - id: 'search', - name: 'Search', - description: 'Web search tool (abstract -- requires implementation of _search method).', - category: 'Web', - tags: ['search', 'web'], - parameters: [ - { - name: 'query', - type: 'string', - description: 'Search query', - required: true - } - ] - }, - { - id: 'database', - name: 'Database', - description: - 'Execute SQL queries (abstract -- requires implementation). Read-only by default with SQL injection detection.', - category: 'I/O', - tags: ['database', 'sql'], - parameters: [ - { - name: 'query', - type: 'string', - description: 'SQL query (SELECT/WITH only in read-only mode)', - required: true - }, - { - name: 'params', - type: 'string', - description: 'Query parameters (JSON)', - required: false - } - ] - } -]; - -export function getToolById(id: string): ToolDefinition | undefined { - return TOOL_CATALOG.find((t) => t.id === id); -} - -export function getToolsByCategory(): Record { - const map: Record = {}; - for (const tool of TOOL_CATALOG) { - if (!map[tool.category]) map[tool.category] = []; - map[tool.category].push(tool); - } - return map; -} diff --git a/studio-frontend/src/lib/execution/bridge.ts b/studio-frontend/src/lib/execution/bridge.ts deleted file mode 100644 index 21063f51..00000000 --- a/studio-frontend/src/lib/execution/bridge.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { StudioWebSocket } from '$lib/api/websocket'; -import { isRunning, isDebugging, activeNodes, checkpoints, pushExecutionEvent } from '$lib/stores/execution'; -import { setNodeState, clearNodeStates } from '$lib/stores/pipeline'; -import { addToast } from '$lib/stores/notifications'; -import { requestAnalysis as requestOracleAnalysis } from '$lib/stores/oracle'; -import { currentProject } from '$lib/stores/project'; -import { get } from 'svelte/store'; -import type { ExecutionEvent, Checkpoint } from '$lib/types/graph'; - -let ws: StudioWebSocket | null = null; -const unsubscribers: Array<() => void> = []; - -/** - * Connect to the execution WebSocket and wire up event listeners - * that update the Svelte stores. - */ -export function connectExecution(): void { - if (ws) return; - - ws = new StudioWebSocket('/ws/execution'); - ws.connect(); - - unsubscribers.push( - ws.on('node_start', (event: ExecutionEvent) => { - if (event.node_id) { - activeNodes.update((set) => { - const next = new Set(set); - next.add(event.node_id!); - return next; - }); - setNodeState(event.node_id, 'running'); - } - pushExecutionEvent(event); - }) - ); - - unsubscribers.push( - ws.on('node_complete', (event: ExecutionEvent) => { - if (event.node_id) { - activeNodes.update((set) => { - const next = new Set(set); - next.delete(event.node_id!); - return next; - }); - setNodeState(event.node_id, 'complete'); - } - pushExecutionEvent(event); - }) - ); - - unsubscribers.push( - ws.on('node_error', (event: ExecutionEvent) => { - if (event.node_id) { - activeNodes.update((set) => { - const next = new Set(set); - next.delete(event.node_id!); - return next; - }); - setNodeState(event.node_id, 'error'); - } - pushExecutionEvent(event); - }) - ); - - unsubscribers.push( - ws.on('node_skip', (event: ExecutionEvent) => { - if (event.node_id) { - activeNodes.update((set) => { - const next = new Set(set); - next.delete(event.node_id!); - return next; - }); - setNodeState(event.node_id, 'skipped'); - } - pushExecutionEvent(event); - }) - ); - - unsubscribers.push( - ws.on('debug_enabled', (event: ExecutionEvent) => { - pushExecutionEvent(event); - addToast('Debug mode active', 'info'); - }) - ); - - unsubscribers.push( - ws.on('error', (event: ExecutionEvent) => { - pushExecutionEvent(event); - addToast(event.message || event.error || 'An error occurred', 'error'); - }) - ); - - unsubscribers.push( - ws.on('pipeline_complete', (event: ExecutionEvent) => { - activeNodes.set(new Set()); - isRunning.set(false); - isDebugging.set(false); - pushExecutionEvent(event); - // Trigger Oracle analysis for post-execution insights - requestOracleAnalysis(); - }) - ); - - unsubscribers.push( - ws.on('checkpoint_created', (data: Checkpoint) => { - checkpoints.update((cps) => [...cps, data]); - }) - ); - - unsubscribers.push( - ws.on('pipeline_result', (event: ExecutionEvent) => { - activeNodes.set(new Set()); - isRunning.set(false); - isDebugging.set(false); - pushExecutionEvent(event); - }) - ); - - // Reset state on WebSocket close/error to prevent stuck UI - unsubscribers.push( - ws.on('_close', () => { - activeNodes.set(new Set()); - isRunning.set(false); - isDebugging.set(false); - }) - ); - unsubscribers.push( - ws.on('_error', () => { - activeNodes.set(new Set()); - isRunning.set(false); - isDebugging.set(false); - addToast('Execution connection lost. Attempting to reconnect...', 'warning'); - }) - ); - unsubscribers.push( - ws.on('_reconnect_failed', () => { - addToast('Could not reconnect to execution server. Please refresh the page.', 'error', 0); - }) - ); -} - -/** - * Disconnect from the execution WebSocket and clean up listeners. - */ -export function disconnectExecution(): void { - for (const unsub of unsubscribers) unsub(); - unsubscribers.length = 0; - ws?.disconnect(); - ws = null; -} - -/** - * Send a "run" action with the current graph to the backend. - */ -export function runPipeline(graph: object, inputs?: string): boolean { - if (!ws || !ws.connected) { - addToast('Cannot run pipeline: not connected to execution server', 'error'); - return false; - } - clearNodeStates(); - isRunning.set(true); - const project = get(currentProject)?.name ?? ''; - ws.send({ action: 'run', graph, inputs: inputs ?? null, project }); - return true; -} - -/** - * Send a "debug" action with the current graph to the backend. - */ -export function debugPipeline(graph: object, inputs?: string): boolean { - if (!ws || !ws.connected) { - addToast('Cannot debug pipeline: not connected to execution server', 'error'); - return false; - } - clearNodeStates(); - isDebugging.set(true); - const project = get(currentProject)?.name ?? ''; - ws.send({ action: 'debug', graph, inputs: inputs ?? null, project }); - return true; -} diff --git a/studio-frontend/src/lib/index.ts b/studio-frontend/src/lib/index.ts deleted file mode 100644 index 856f2b6c..00000000 --- a/studio-frontend/src/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -// place files you want to import through the `$lib` alias in this folder. diff --git a/studio-frontend/src/lib/stores/chat.ts b/studio-frontend/src/lib/stores/chat.ts deleted file mode 100644 index 62614222..00000000 --- a/studio-frontend/src/lib/stores/chat.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { writable } from 'svelte/store'; - -export interface ChatMessage { - id: string; - role: 'user' | 'assistant'; - content: string; - timestamp: string; - /** For assistant messages that are still streaming */ - streaming?: boolean; - /** Tool calls made during this message */ - toolCalls?: ToolCallInfo[]; -} - -export interface ToolCallInfo { - tool: string; - args: Record; - result: string; -} - -export const chatMessages = writable([]); -export const chatStreaming = writable(false); - -let messageCounter = 0; - -export function addUserMessage(content: string): string { - const id = `msg_${++messageCounter}`; - chatMessages.update((msgs) => [ - ...msgs, - { - id, - role: 'user', - content, - timestamp: new Date().toISOString() - } - ]); - return id; -} - -export function addAssistantMessage(): string { - const id = `msg_${++messageCounter}`; - chatMessages.update((msgs) => [ - ...msgs, - { - id, - role: 'assistant', - content: '', - timestamp: new Date().toISOString(), - streaming: true, - toolCalls: [] - } - ]); - chatStreaming.set(true); - return id; -} - -export function appendToken(msgId: string, token: string): void { - chatMessages.update((msgs) => - msgs.map((m) => (m.id === msgId ? { ...m, content: m.content + token } : m)) - ); -} - -export function completeMessage(msgId: string, fullText: string): void { - chatMessages.update((msgs) => - msgs.map((m) => (m.id === msgId ? { ...m, content: fullText, streaming: false } : m)) - ); - chatStreaming.set(false); -} - -export function addToolCall(msgId: string, toolCall: ToolCallInfo): void { - chatMessages.update((msgs) => - msgs.map((m) => - m.id === msgId ? { ...m, toolCalls: [...(m.toolCalls || []), toolCall] } : m - ) - ); -} - -export function clearChat(): void { - chatMessages.set([]); - chatStreaming.set(false); -} diff --git a/studio-frontend/src/lib/stores/connection.ts b/studio-frontend/src/lib/stores/connection.ts deleted file mode 100644 index 903c87a3..00000000 --- a/studio-frontend/src/lib/stores/connection.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { writable, derived } from 'svelte/store'; - -export type ConnectionState = 'connected' | 'disconnected' | 'checking'; - -const _state = writable('checking'); -const _version = writable(''); - -export const connectionState = { subscribe: _state.subscribe }; -export const serverVersion = { subscribe: _version.subscribe }; -export const isConnected = derived(_state, (s) => s === 'connected'); - -let intervalId: ReturnType | null = null; - -async function checkHealth(): Promise { - try { - const resp = await fetch('/api/health', { signal: AbortSignal.timeout(3000) }); - if (resp.ok) { - const data = await resp.json(); - _state.set('connected'); - _version.set(data.version ?? ''); - } else { - _state.set('disconnected'); - } - } catch { - _state.set('disconnected'); - } -} - -export function startHealthPolling(intervalMs = 10_000): void { - if (intervalId) return; - checkHealth(); - intervalId = setInterval(checkHealth, intervalMs); -} - -export function stopHealthPolling(): void { - if (intervalId) { - clearInterval(intervalId); - intervalId = null; - } -} diff --git a/studio-frontend/src/lib/stores/execution.ts b/studio-frontend/src/lib/stores/execution.ts deleted file mode 100644 index 3b1c9e63..00000000 --- a/studio-frontend/src/lib/stores/execution.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { writable } from 'svelte/store'; -import type { ExecutionEvent, Checkpoint } from '$lib/types/graph'; - -export const isRunning = writable(false); -export const isDebugging = writable(false); -export const executionEvents = writable([]); -export const activeNodes = writable>(new Set()); -export const checkpoints = writable([]); - -/** Push an event into the store, stamping it with the current time if it lacks a timestamp. */ -export function pushExecutionEvent(event: Omit & { timestamp?: string }) { - const stamped: ExecutionEvent = { - ...event, - timestamp: event.timestamp ?? new Date().toISOString() - }; - executionEvents.update((events) => [...events, stamped]); -} diff --git a/studio-frontend/src/lib/stores/notifications.ts b/studio-frontend/src/lib/stores/notifications.ts deleted file mode 100644 index 56e21391..00000000 --- a/studio-frontend/src/lib/stores/notifications.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { writable } from 'svelte/store'; - -export interface Toast { - id: string; - message: string; - type: 'success' | 'error' | 'warning' | 'info'; - duration: number; -} - -export const toasts = writable([]); - -let _counter = 0; - -export function addToast( - message: string, - type: Toast['type'] = 'info', - duration = 5000 -): string { - const id = `toast-${++_counter}`; - toasts.update((t) => [...t, { id, message, type, duration }]); - - if (duration > 0) { - setTimeout(() => removeToast(id), duration); - } - return id; -} - -export function removeToast(id: string): void { - toasts.update((t) => t.filter((toast) => toast.id !== id)); -} diff --git a/studio-frontend/src/lib/stores/oracle.ts b/studio-frontend/src/lib/stores/oracle.ts deleted file mode 100644 index b96cd2fe..00000000 --- a/studio-frontend/src/lib/stores/oracle.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { writable, derived, get } from 'svelte/store'; -import { api } from '$lib/api/client'; -import { StudioWebSocket } from '$lib/api/websocket'; -import type { ExecutionEvent } from '$lib/types/graph'; -import { nodes, edges } from './pipeline'; -import { currentProject } from './project'; - -export interface OracleInsight { - id: string; - title: string; - description: string; - severity: 'info' | 'warning' | 'suggestion' | 'critical'; - action_instruction: string | null; - timestamp: string; - status: 'pending' | 'approved' | 'skipped'; -} - -export interface OracleChatMessage { - id: string; - role: 'user' | 'oracle'; - content: string; - timestamp: string; - streaming?: boolean; -} - -export const oracleInsights = writable([]); -export const oracleConnected = writable(false); -export const oracleAnalyzing = writable(false); -export const oracleChatMessages = writable([]); -export const oracleChatStreaming = writable(false); - -let oracleWs: StudioWebSocket | null = null; -let chatMsgCounter = 0; -let currentOracleMsgId = ''; -let currentOracleProject = ''; - -// --- Canvas auto-sync --- -let syncTimeout: ReturnType | null = null; -let autoSyncUnsub: (() => void) | null = null; - -export function syncCanvasToOracle(n?: unknown[], e?: unknown[]): void { - if (oracleWs?.connected) { - const syncNodes = n ?? get(nodes); - const syncEdges = e ?? get(edges); - oracleWs.send({ action: 'sync_canvas', nodes: syncNodes, edges: syncEdges }); - } -} - -export function startCanvasAutoSync(): void { - // Prevent duplicate subscriptions - stopCanvasAutoSync(); - - const combined = derived([nodes, edges], ([$n, $e]) => ({ nodes: $n, edges: $e })); - autoSyncUnsub = combined.subscribe(({ nodes: n, edges: e }) => { - if (syncTimeout) clearTimeout(syncTimeout); - syncTimeout = setTimeout(() => { - syncCanvasToOracle(n, e); - }, 500); - }); -} - -export function stopCanvasAutoSync(): void { - if (autoSyncUnsub) { - autoSyncUnsub(); - autoSyncUnsub = null; - } - if (syncTimeout) { - clearTimeout(syncTimeout); - syncTimeout = null; - } -} - -// --- WebSocket connection --- - -export function connectOracle(project: string): void { - disconnectOracle(); - currentOracleProject = project; - - oracleWs = new StudioWebSocket(`/ws/oracle?project=${encodeURIComponent(project)}`); - - oracleWs.on('_open', () => { - oracleConnected.set(true); - // Send initial canvas state and start auto-sync - syncCanvasToOracle(); - startCanvasAutoSync(); - }); - - oracleWs.on('_close', () => { - oracleConnected.set(false); - stopCanvasAutoSync(); - }); - - oracleWs.on('insight', (data: ExecutionEvent) => { - const insight = data as unknown as OracleInsight; - oracleInsights.update((list) => [insight, ...list]); - }); - - oracleWs.on('analysis_complete', () => { - oracleAnalyzing.set(false); - }); - - oracleWs.on('oracle_token', (data: ExecutionEvent) => { - const token = (data as any).content as string; - if (!currentOracleMsgId) { - currentOracleMsgId = `oracle_msg_${++chatMsgCounter}`; - oracleChatMessages.update((msgs) => [ - ...msgs, - { - id: currentOracleMsgId, - role: 'oracle', - content: '', - timestamp: new Date().toISOString(), - streaming: true, - }, - ]); - oracleChatStreaming.set(true); - } - oracleChatMessages.update((msgs) => - msgs.map((m) => (m.id === currentOracleMsgId ? { ...m, content: m.content + token } : m)) - ); - }); - - oracleWs.on('oracle_response_complete', (data: ExecutionEvent) => { - const fullText = (data as any).full_text as string; - if (currentOracleMsgId) { - oracleChatMessages.update((msgs) => - msgs.map((m) => - m.id === currentOracleMsgId ? { ...m, content: fullText, streaming: false } : m - ) - ); - } - currentOracleMsgId = ''; - oracleChatStreaming.set(false); - // Auto-save chat history - _autoSaveOracleHistory(); - }); - - oracleWs.on('error', () => { - oracleAnalyzing.set(false); - if (currentOracleMsgId) { - oracleChatMessages.update((msgs) => - msgs.map((m) => - m.id === currentOracleMsgId ? { ...m, streaming: false } : m - ) - ); - currentOracleMsgId = ''; - oracleChatStreaming.set(false); - } - }); - - oracleWs.on('canvas_synced', () => { - // Canvas state acknowledged by Oracle - }); - - oracleWs.connect(); -} - -export function disconnectOracle(): void { - stopCanvasAutoSync(); - if (oracleWs) { - oracleWs.disconnect(); - oracleWs = null; - } - oracleConnected.set(false); - oracleAnalyzing.set(false); - oracleInsights.set([]); - oracleChatMessages.set([]); - currentOracleMsgId = ''; - oracleChatStreaming.set(false); -} - -// Context is now built server-side via shared_context.py — no need to send -// project/architect history from the frontend. - -export function requestAnalysis(): void { - if (oracleWs?.connected) { - oracleAnalyzing.set(true); - oracleWs.send({ action: 'analyze' }); - } -} - -export function requestNodeAnalysis(nodeId: string): void { - if (oracleWs?.connected) { - oracleAnalyzing.set(true); - oracleWs.send({ action: 'analyze_node', node_id: nodeId }); - } -} - -export function sendOracleChat(message: string): void { - if (!oracleWs?.connected || !message.trim()) return; - - // Add user message to chat - const userMsgId = `oracle_user_${++chatMsgCounter}`; - oracleChatMessages.update((msgs) => [ - ...msgs, - { - id: userMsgId, - role: 'user', - content: message.trim(), - timestamp: new Date().toISOString(), - }, - ]); - - // Send to backend — context is assembled server-side - oracleWs.send({ action: 'chat', message: message.trim() }); -} - -export function clearOracleChat(): void { - oracleChatMessages.set([]); - currentOracleMsgId = ''; - oracleChatStreaming.set(false); - if (currentOracleProject) { - api.oracle.clearChatHistory(currentOracleProject).catch(() => {}); - } -} - -export async function approveInsight(project: string, insightId: string): Promise { - const result = await api.oracle.approveInsight(project, insightId); - oracleInsights.update((list) => - list.map((i) => (i.id === insightId ? { ...i, status: 'approved' as const } : i)) - ); - return result.action_instruction ?? null; -} - -export async function skipInsight(project: string, insightId: string): Promise { - await api.oracle.skipInsight(project, insightId); - oracleInsights.update((list) => - list.map((i) => (i.id === insightId ? { ...i, status: 'skipped' as const } : i)) - ); -} - -export async function loadInsights(project: string): Promise { - const insights = await api.oracle.getInsights(project); - oracleInsights.set(insights); -} - -// --------------------------------------------------------------------------- -// Persistence — auto-save & load -// --------------------------------------------------------------------------- - -function _autoSaveOracleHistory(): void { - if (!currentOracleProject) return; - const msgs = get(oracleChatMessages) - .filter((m) => !m.streaming) - .map((m) => ({ - role: m.role, - content: m.content, - timestamp: m.timestamp, - })); - api.oracle.saveChatHistory(currentOracleProject, msgs).catch(() => {}); -} - -export async function loadOracleChatHistory(project: string): Promise { - try { - const msgs = await api.oracle.getChatHistory(project); - if (msgs.length > 0) { - oracleChatMessages.set( - msgs.map((m, i) => ({ - id: `oracle_loaded_${i}`, - role: m.role as 'user' | 'oracle', - content: m.content, - timestamp: m.timestamp, - })) - ); - chatMsgCounter = msgs.length; - } - } catch { - // No saved history — start fresh - } -} diff --git a/studio-frontend/src/lib/stores/pipeline.ts b/studio-frontend/src/lib/stores/pipeline.ts deleted file mode 100644 index 38780b59..00000000 --- a/studio-frontend/src/lib/stores/pipeline.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { writable, derived, get } from 'svelte/store'; -import type { Node, Edge } from '@xyflow/svelte'; - -export const nodes = writable([]); -export const edges = writable([]); - -/** - * Whether the current canvas has unsaved changes relative to the last save. - */ -export const isDirty = writable(false); - -// Auto-save: debounce pipeline changes and persist to backend. -let _autoSaveTimer: ReturnType | null = null; -let _autoSaveEnabled = false; -const AUTO_SAVE_DELAY = 2000; // 2 seconds after last change - -function _scheduleAutoSave(): void { - if (!_autoSaveEnabled) return; - isDirty.set(true); - if (_autoSaveTimer) clearTimeout(_autoSaveTimer); - _autoSaveTimer = setTimeout(() => { - _performAutoSave(); - }, AUTO_SAVE_DELAY); -} - -async function _performAutoSave(): Promise { - // Dynamically import to avoid circular dependency - const { currentProject } = await import('$lib/stores/project'); - const { api } = await import('$lib/api/client'); - const proj = get(currentProject); - if (!proj) return; - const graph = getGraphSnapshot(); - const nodeCount = get(nodes).length; - if (nodeCount === 0) return; // Don't auto-save empty canvas - try { - await api.projects.savePipeline(proj.name, 'main', graph); - isDirty.set(false); - } catch { - // Silent failure — user can manually save - } -} - -/** - * Enable auto-save subscriptions. Call once after stores are initialised. - */ -export function enableAutoSave(): void { - if (_autoSaveEnabled) return; - _autoSaveEnabled = true; - nodes.subscribe(() => { _scheduleAutoSave(); }); - edges.subscribe(() => { _scheduleAutoSave(); }); -} - -/** - * Temporarily suppress auto-save (e.g. during pipeline load from backend). - * Returns a function to re-enable. - */ -export function suppressAutoSave(): () => void { - _autoSaveEnabled = false; - if (_autoSaveTimer) { clearTimeout(_autoSaveTimer); _autoSaveTimer = null; } - return () => { _autoSaveEnabled = true; }; -} - -/** - * Snapshot the current canvas graph into the format expected by the backend - * GraphModel (nodes + edges + metadata). - */ -export function getGraphSnapshot(): object { - const currentNodes = get(nodes); - const currentEdges = get(edges); - return { - nodes: currentNodes.map((n) => ({ - id: n.id, - type: n.type ?? 'pipeline_step', - label: n.data?.label ?? n.id, - position: n.position, - data: n.data ?? {}, - width: n.measured?.width ?? n.width ?? null, - height: n.measured?.height ?? n.height ?? null - })), - edges: currentEdges.map((e) => ({ - id: e.id, - source: e.source, - target: e.target, - source_handle: e.sourceHandle ?? 'output', - target_handle: e.targetHandle ?? 'input', - label: e.label ?? null - })), - metadata: {} - }; -} -export const selectedNodeId = writable(null); - -export const selectedNode = derived( - [nodes, selectedNodeId], - ([$nodes, $id]) => ($id ? $nodes.find((n) => n.id === $id) ?? null : null) -); - -export type NodeExecutionState = 'idle' | 'running' | 'complete' | 'error' | 'skipped'; - -export const nodeStates = writable>(new Map()); - -export function setNodeState(nodeId: string, state: NodeExecutionState) { - nodeStates.update((map) => { - const next = new Map(map); - next.set(nodeId, state); - return next; - }); - updateNodeData(nodeId, '_executionState', state); -} - -export function clearNodeStates() { - nodeStates.update((map) => { - const next = new Map(); - for (const [id] of map) { - next.set(id, 'idle'); - } - return next; - }); - // Also clear _executionState from all nodes - nodes.update((ns) => - ns.map((n) => ({ ...n, data: { ...n.data, _executionState: 'idle' } })) - ); -} - -let _nodeIdCounter = 0; - -export function resetNodeCounter(): void { - // Set counter past any existing node IDs to avoid collisions with templates - const currentNodes = get(nodes); - let max = 0; - for (const node of currentNodes) { - const match = node.id.match(/-(\d+)$/); - if (match) { - const num = parseInt(match[1], 10); - if (num > max) max = num; - } - } - _nodeIdCounter = max; -} - -export function addNode(type: string, label: string): void { - _nodeIdCounter++; - const id = `${type}-${_nodeIdCounter}`; - const currentNodes = get(nodes); - const selId = get(selectedNodeId); - - // Smart placement: position relative to selected or rightmost node - let x = 250; - let y = 200; - const H_GAP = 280; - const V_OFFSET = 0; - - if (selId) { - const sel = currentNodes.find((n) => n.id === selId); - if (sel) { - x = sel.position.x + H_GAP; - y = sel.position.y + V_OFFSET; - } - } else if (currentNodes.length > 0) { - // Place after the rightmost node - let maxX = -Infinity; - let maxY = 200; - for (const n of currentNodes) { - if (n.position.x > maxX) { - maxX = n.position.x; - maxY = n.position.y; - } - } - x = maxX + H_GAP; - y = maxY; - } - - // Avoid exact overlap if a node already occupies this position - const occupied = currentNodes.some( - (n) => Math.abs(n.position.x - x) < 20 && Math.abs(n.position.y - y) < 20 - ); - if (occupied) { - y += 120; - } - - nodes.update((n) => [ - ...n, - { - id, - type, - position: { x, y }, - data: { label: `${label} ${_nodeIdCounter}`, origin: 'user' } - } - ]); -} - -export function updateNodeData(nodeId: string, key: string, value: unknown) { - nodes.update((ns) => - ns.map((n) => (n.id === nodeId ? { ...n, data: { ...n.data, [key]: value } } : n)) - ); -} diff --git a/studio-frontend/src/lib/stores/project.ts b/studio-frontend/src/lib/stores/project.ts deleted file mode 100644 index f0e1fcf6..00000000 --- a/studio-frontend/src/lib/stores/project.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { writable, get } from 'svelte/store'; -import type { ProjectInfo } from '$lib/types/graph'; -import { api } from '$lib/api/client'; -import { nodes, edges, resetNodeCounter, suppressAutoSave, isDirty } from '$lib/stores/pipeline'; -import { PIPELINE_TEMPLATES } from '$lib/data/templates'; -import { connectOracle, disconnectOracle, loadInsights } from '$lib/stores/oracle'; - -const STORAGE_KEY = 'fireflyStudio:selectedProject'; - -export const currentProject = writable(null); -export const projects = writable([]); - -/** - * Select a project and persist the choice to localStorage. - */ -export async function selectProject(project: ProjectInfo): Promise { - currentProject.set(project); - try { - localStorage.setItem(STORAGE_KEY, project.name); - } catch { - // localStorage may be unavailable (e.g. private browsing quota exceeded) - } - - // Load saved pipeline for this project (suppress auto-save during load) - const resume = suppressAutoSave(); - try { - const graph = await api.projects.loadPipeline(project.name, 'main'); - if (graph && typeof graph === 'object') { - const g = graph as { nodes?: any[]; edges?: any[] }; - if (g.nodes) nodes.set(g.nodes); - if (g.edges) edges.set(g.edges); - resetNodeCounter(); - } - } catch { - // No saved pipeline — start with empty canvas - nodes.set([]); - edges.set([]); - resetNodeCounter(); - } - isDirty.set(false); - resume(); - - // Connect Oracle WebSocket for the new project - disconnectOracle(); - connectOracle(project.name); - loadInsights(project.name).catch(() => {}); -} - -export async function renameProject(oldName: string, newName: string): Promise { - await api.projects.rename(oldName, newName); - const current = get(currentProject); - await initProjects(); - if (current?.name === oldName) { - const list = get(projects); - const found = list.find(p => p.name === newName); - if (found) selectProject(found); - } -} - -export async function updateProjectDescription(name: string, description: string): Promise { - await api.projects.updateDescription(name, description); - await initProjects(); -} - -export async function deleteProject(name: string): Promise { - await api.projects.delete(name); - const current = get(currentProject); - if (current?.name === name) { - currentProject.set(null); - nodes.set([]); - edges.set([]); - resetNodeCounter(); - } - await initProjects(); -} - -export async function deleteAllProjects(): Promise { - const result = await api.projects.deleteAll(); - currentProject.set(null); - nodes.set([]); - edges.set([]); - resetNodeCounter(); - projects.set([]); - return result.count; -} - -export async function createAndSelectProject(name: string): Promise { - const created = await api.projects.create(name); - await initProjects(); - const list = get(projects); - const found = list.find(p => p.name === name); - if (found) selectProject(found); - return created; -} - -/** - * Fetch all projects from the API, select a previously-used or first project, - * and create a default project when none exist. - */ -export async function initProjects(): Promise { - try { - let projectList = await api.projects.list(); - - if (projectList.length === 0) { - projects.set([]); - return; - } - - projects.set(projectList); - - // Restore previously-selected project if it still exists - let selected: ProjectInfo | undefined; - try { - const savedName = localStorage.getItem(STORAGE_KEY); - if (savedName) { - selected = projectList.find((p) => p.name === savedName); - } - } catch { - // localStorage unavailable — fall through to default selection - } - - selectProject(selected ?? projectList[0]); - } catch (err) { - console.warn('[studio] Failed to initialise projects:', err); - } -} - -export function loadTemplate(templateId: string, defaultModel?: string): void { - const template = PIPELINE_TEMPLATES.find((t) => t.id === templateId); - if (!template) return; - - // Apply the user's default model to all agent nodes in the template - const templateNodes = template.nodes.map((n) => { - const patched = defaultModel && n.type === 'agent' - ? { ...n, data: { ...n.data, model: defaultModel, origin: 'template' } } - : { ...n, data: { ...n.data, origin: 'template' } }; - return patched; - }); - - const resume = suppressAutoSave(); - nodes.set(templateNodes); - edges.set(template.edges); - resetNodeCounter(); // Must run AFTER nodes.set so it can scan existing IDs - isDirty.set(true); - resume(); -} diff --git a/studio-frontend/src/lib/stores/runtime.ts b/studio-frontend/src/lib/stores/runtime.ts deleted file mode 100644 index 0e3a6eeb..00000000 --- a/studio-frontend/src/lib/stores/runtime.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { writable } from 'svelte/store'; - -export const tunnelUrl = writable(null); -export const tunnelActive = writable(false); -export const runtimeStatus = writable<'stopped' | 'starting' | 'running' | 'error'>('stopped'); diff --git a/studio-frontend/src/lib/stores/settings.ts b/studio-frontend/src/lib/stores/settings.ts deleted file mode 100644 index 6d51b64c..00000000 --- a/studio-frontend/src/lib/stores/settings.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { writable, derived } from 'svelte/store'; -import type { StudioSettingsResponse, SaveSettingsPayload, ProviderCredentials, ModelDefaults, UserProfile } from '$lib/types/graph'; -import { api } from '$lib/api/client'; - -export const settingsData = writable(null); - -/** - * Derived set of provider IDs that have at least one credential configured. - */ -export const configuredProviders = derived(settingsData, ($data) => { - const result = new Set(); - if (!$data) return result; - - const c = $data.credentials; - if (c.openai_api_key) result.add('openai'); - if (c.anthropic_api_key) result.add('anthropic'); - if (c.google_api_key) result.add('google'); - if (c.groq_api_key) result.add('groq'); - if (c.mistral_api_key) result.add('mistral'); - if (c.deepseek_api_key) result.add('deepseek'); - if (c.cohere_api_key) result.add('cohere'); - if (c.azure_openai_api_key) result.add('azure'); - if (c.aws_access_key_id) result.add('bedrock'); - if (c.ollama_base_url) result.add('ollama'); - - return result; -}); - -export async function loadSettings(): Promise { - try { - const data = await api.settings.get(); - settingsData.set(data); - } catch (err) { - console.warn('[studio] Failed to load settings:', err); - } -} - -export async function saveSettings( - credentials?: Partial | null, - modelDefaults?: Partial | null, - setupComplete?: boolean | null, - userProfile?: Partial | null, - toolCredentials?: Record | null -): Promise { - const payload: SaveSettingsPayload = {}; - if (credentials !== undefined) payload.credentials = credentials; - if (modelDefaults !== undefined) payload.model_defaults = modelDefaults; - if (setupComplete !== undefined) payload.setup_complete = setupComplete; - if (userProfile !== undefined) payload.user_profile = userProfile; - if (toolCredentials !== undefined && toolCredentials !== null) { - (payload as Record).tool_credentials = toolCredentials; - } - - try { - const data = await api.settings.save(payload); - settingsData.set(data); - } catch (err) { - console.error('[studio] Failed to save settings:', err); - throw err; - } -} diff --git a/studio-frontend/src/lib/stores/smith.ts b/studio-frontend/src/lib/stores/smith.ts deleted file mode 100644 index 463697f1..00000000 --- a/studio-frontend/src/lib/stores/smith.ts +++ /dev/null @@ -1,381 +0,0 @@ -import { writable, derived, get } from 'svelte/store'; -import { api } from '$lib/api/client'; -import { currentProject } from '$lib/stores/project'; -import { nodes, edges } from '$lib/stores/pipeline'; - -// --------------------------------------------------------------------------- -// Types -// --------------------------------------------------------------------------- - -interface SmithMessage { - role: 'user' | 'assistant'; - content: string; - timestamp: string; - toolCalls?: Array<{ name: string; args: string; result: string }>; -} - -interface PendingCommand { - commandId: string; - command: string; - level: string; -} - -export interface SmithFile { - path: string; - content: string; - language: string; -} - -// --------------------------------------------------------------------------- -// Stores -// --------------------------------------------------------------------------- - -export const smithMessages = writable([]); -export const smithCode = writable(''); -export const smithFiles = writable([]); -export const smithActiveFile = writable(null); -export const smithIsThinking = writable(false); -export const smithConnected = writable(false); -export const pendingCommand = writable(null); - -// --------------------------------------------------------------------------- -// WebSocket connection with reconnect -// --------------------------------------------------------------------------- - -let ws: WebSocket | null = null; -let reconnectTimer: ReturnType | null = null; -let reconnectAttempts = 0; -const MAX_RECONNECT = 5; -let intentionalClose = false; -let currentSmithProject = ''; - -function getWsUrl(): string { - const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; - const proj = get(currentProject); - const projectParam = proj?.name ? `?project=${encodeURIComponent(proj.name)}` : ''; - currentSmithProject = proj?.name ?? ''; - return `${protocol}//${window.location.host}/ws/smith${projectParam}`; -} - -function attemptReconnect(): void { - if (intentionalClose) return; - if (reconnectAttempts >= MAX_RECONNECT) return; - reconnectAttempts++; - const delay = Math.min(1000 * Math.pow(2, reconnectAttempts - 1), 10000); - reconnectTimer = setTimeout(() => { - connectSmith(); - }, delay); -} - -export function connectSmith(): void { - if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) return; - intentionalClose = false; - - try { - ws = new WebSocket(getWsUrl()); - } catch { - return; - } - - ws.onopen = () => { - reconnectAttempts = 0; - smithConnected.set(true); - // Sync current canvas state on connect and start auto-sync - syncCanvasToSmith(); - startCanvasAutoSync(); - }; - - ws.onclose = () => { - smithConnected.set(false); - smithIsThinking.set(false); - stopCanvasAutoSync(); - ws = null; - attemptReconnect(); - }; - - ws.onerror = () => { - smithConnected.set(false); - }; - - ws.onmessage = (event) => { - try { - const data = JSON.parse(event.data); - handleSmithMessage(data); - } catch { - // ignore malformed messages - } - }; -} - -function handleSmithMessage(data: Record): void { - const type = data.type as string; - - if (type === 'smith_token') { - // Append streaming token to the last assistant message or create one - const token = (data.content ?? data.token ?? '') as string; - smithMessages.update((msgs) => { - const last = msgs[msgs.length - 1]; - if (last && last.role === 'assistant' && !data.complete) { - return [...msgs.slice(0, -1), { ...last, content: last.content + token }]; - } - return [...msgs, { role: 'assistant', content: token, timestamp: new Date().toISOString() }]; - }); - } else if (type === 'smith_response_complete') { - smithIsThinking.set(false); - if (data.code) { - smithCode.set(data.code as string); - } - const content = (data.full_text ?? data.content ?? '') as string; - if (content) { - smithMessages.update((msgs) => { - const last = msgs[msgs.length - 1]; - // Replace streamed tokens with the final complete text - if (last && last.role === 'assistant') { - return [...msgs.slice(0, -1), { ...last, content }]; - } - return [...msgs, { role: 'assistant', content, timestamp: new Date().toISOString() }]; - }); - } else if (data.code) { - // Code-only response with no narrative — remove streamed placeholder - smithMessages.update((msgs) => { - const last = msgs[msgs.length - 1]; - if (last && last.role === 'assistant' && !last.content.trim()) { - return msgs.slice(0, -1); - } - return msgs; - }); - } - // Auto-save chat history - _autoSaveSmithHistory(); - } else if (type === 'code_generated') { - const code = data.code as string; - smithCode.set(code); - smithFiles.set([{ path: 'main.py', content: code, language: 'python' }]); - smithActiveFile.set('main.py'); - smithIsThinking.set(false); - } else if (type === 'files_generated') { - const files = (data.files ?? []) as SmithFile[]; - smithFiles.set(files); - smithIsThinking.set(false); - if (files.length > 0) { - smithActiveFile.set(files[0].path); - } - const combined = files.map(f => `# --- ${f.path} ---\n${f.content}`).join('\n\n'); - smithCode.set(combined); - // Auto-save generated files - _autoSaveSmithFiles(files); - } else if (type === 'approval_required') { - pendingCommand.set({ - commandId: data.command_id as string, - command: data.command as string, - level: data.level as string, - }); - } else if (type === 'execution_result') { - const stdout = (data.stdout as string) || ''; - const stderr = (data.stderr as string) || ''; - const rc = data.return_code ?? 0; - let output = stdout; - if (stderr) output += (output ? '\n' : '') + `[stderr] ${stderr}`; - if (rc !== 0) output += `\n[exit code: ${rc}]`; - smithMessages.update((msgs) => [ - ...msgs, - { role: 'assistant', content: output || '(no output)', timestamp: new Date().toISOString() }, - ]); - smithIsThinking.set(false); - } else if (type === 'tool_call') { - // Tool call visibility -- attach to last assistant message's toolCalls - const toolCall = { - name: (data.tool ?? data.name ?? 'unknown') as string, - args: typeof data.args === 'string' ? data.args : JSON.stringify(data.args || {}), - result: typeof data.result === 'string' ? data.result : JSON.stringify(data.result || ''), - }; - smithMessages.update((msgs) => { - const last = msgs[msgs.length - 1]; - if (last && last.role === 'assistant') { - const calls = [...(last.toolCalls || []), toolCall]; - return [...msgs.slice(0, -1), { ...last, toolCalls: calls }]; - } - // No assistant message yet -- create one to hold the tool call - return [...msgs, { role: 'assistant', content: '', timestamp: new Date().toISOString(), toolCalls: [toolCall] }]; - }); - } else if (type === 'canvas_synced') { - // Acknowledgement, nothing to do - } else if (type === 'error') { - smithIsThinking.set(false); - smithMessages.update((msgs) => [ - ...msgs, - { role: 'assistant', content: `Error: ${data.message}`, timestamp: new Date().toISOString() }, - ]); - } -} - -function send(action: string, payload: Record = {}): void { - if (!ws || ws.readyState !== WebSocket.OPEN) return; - ws.send(JSON.stringify({ action, ...payload })); -} - -// --------------------------------------------------------------------------- -// Public API -// --------------------------------------------------------------------------- - -/** - * Sync the current canvas graph to Smith's per-connection state. - * Can be called with an explicit graph or will read from pipeline stores. - */ -export function syncCanvasToSmith(graph?: object): void { - if (graph) { - send('sync_canvas', graph as Record); - return; - } - const currentNodes = get(nodes); - const currentEdges = get(edges); - send('sync_canvas', { - nodes: currentNodes.map((n: any) => ({ - id: n.id, - type: n.type, - data: n.data, - position: n.position, - })), - edges: currentEdges.map((e: any) => ({ - id: e.id, - source: e.source, - target: e.target, - })), - }); -} - -export function generateCode(graph?: object): void { - smithIsThinking.set(true); - if (graph) { - send('generate', { graph }); - } else { - send('generate'); - } -} - -export function triggerSmithGeneration(): void { - generateCode(); -} - -export function executeCode(code: string): void { - smithIsThinking.set(true); - send('execute', { code }); -} - -// --- Canvas auto-sync (debounced) --- - -let syncTimeout: ReturnType | null = null; -let autoSyncUnsub: (() => void) | null = null; - -export function startCanvasAutoSync(): void { - stopCanvasAutoSync(); - const combined = derived([nodes, edges], ([$n, $e]) => ({ nodes: $n, edges: $e })); - autoSyncUnsub = combined.subscribe(({ nodes: n, edges: e }) => { - if (syncTimeout) clearTimeout(syncTimeout); - syncTimeout = setTimeout(() => { - syncCanvasToSmith({ - nodes: n.map((nd: any) => ({ id: nd.id, type: nd.type, data: nd.data, position: nd.position })), - edges: e.map((ed: any) => ({ id: ed.id, source: ed.source, target: ed.target })), - }); - }, 500); - }); -} - -export function stopCanvasAutoSync(): void { - if (autoSyncUnsub) { - autoSyncUnsub(); - autoSyncUnsub = null; - } - if (syncTimeout) { - clearTimeout(syncTimeout); - syncTimeout = null; - } -} - -export function chatWithSmith(message: string): void { - smithMessages.update((msgs) => [ - ...msgs, - { role: 'user', content: message, timestamp: new Date().toISOString() }, - ]); - smithIsThinking.set(true); - send('chat', { message }); -} - -export function approveCommand(commandId: string, approved: boolean): void { - send('approve_command', { command_id: commandId, approved }); - pendingCommand.set(null); - if (approved) { - smithIsThinking.set(true); - } -} - -export function disconnectSmith(): void { - intentionalClose = true; - stopCanvasAutoSync(); - if (reconnectTimer) { - clearTimeout(reconnectTimer); - reconnectTimer = null; - } - ws?.close(); - ws = null; -} - -// --------------------------------------------------------------------------- -// Persistence — auto-save & load -// --------------------------------------------------------------------------- - -function _autoSaveSmithHistory(): void { - if (!currentSmithProject) return; - const msgs = get(smithMessages).map((m) => ({ - role: m.role, - content: m.content, - timestamp: m.timestamp, - })); - api.smith.saveHistory(currentSmithProject, msgs).catch(() => {}); -} - -function _autoSaveSmithFiles(files: SmithFile[]): void { - if (!currentSmithProject) return; - api.smith.saveFiles(currentSmithProject, files).catch(() => {}); -} - -export async function loadSmithHistory(project: string): Promise { - try { - const msgs = await api.smith.getHistory(project); - if (msgs.length > 0) { - smithMessages.set( - msgs.map((m) => ({ - role: m.role as 'user' | 'assistant', - content: m.content, - timestamp: m.timestamp, - })) - ); - } - } catch { - // No saved history — start fresh - } -} - -export async function loadSmithFiles(project: string): Promise { - try { - const files = await api.smith.getFiles(project); - if (files.length > 0) { - smithFiles.set(files); - smithActiveFile.set(files[0].path); - const combined = files.map((f) => `# --- ${f.path} ---\n${f.content}`).join('\n\n'); - smithCode.set(combined); - } - } catch { - // No saved files — start fresh - } -} - -export function clearSmithChat(): void { - smithMessages.set([]); - smithCode.set(''); - smithFiles.set([]); - smithActiveFile.set(null); - if (currentSmithProject) { - api.smith.clearHistory(currentSmithProject).catch(() => {}); - } -} diff --git a/studio-frontend/src/lib/stores/theme.ts b/studio-frontend/src/lib/stores/theme.ts deleted file mode 100644 index 9347a3f1..00000000 --- a/studio-frontend/src/lib/stores/theme.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { writable, derived } from 'svelte/store'; -import { browser } from '$app/environment'; - -export type ThemeMode = 'dark' | 'light' | 'system'; - -const STORAGE_KEY = 'fireflyStudio:theme'; - -function getInitialTheme(): ThemeMode { - if (!browser) return 'dark'; - const stored = localStorage.getItem(STORAGE_KEY); - if (stored === 'dark' || stored === 'light' || stored === 'system') return stored; - return 'dark'; -} - -export const themeMode = writable(getInitialTheme()); - -export const resolvedTheme = derived(themeMode, ($mode) => { - if ($mode !== 'system') return $mode; - if (!browser) return 'dark'; - return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; -}); - -export function initTheme(): void { - if (!browser) return; - - themeMode.subscribe(($mode) => { - localStorage.setItem(STORAGE_KEY, $mode); - }); - - resolvedTheme.subscribe(($resolved) => { - document.documentElement.setAttribute('data-theme', $resolved); - }); - - const mq = window.matchMedia('(prefers-color-scheme: dark)'); - mq.addEventListener('change', () => { - themeMode.update((m) => m); - }); -} - -export function cycleTheme(): void { - themeMode.update((current) => { - if (current === 'dark') return 'light'; - if (current === 'light') return 'system'; - return 'dark'; - }); -} diff --git a/studio-frontend/src/lib/stores/ui.ts b/studio-frontend/src/lib/stores/ui.ts deleted file mode 100644 index 50221635..00000000 --- a/studio-frontend/src/lib/stores/ui.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { writable, derived } from 'svelte/store'; - -export type AgentTab = 'architect' | 'smith' | 'oracle'; -export type BottomPanelTab = 'console' | 'timeline' | 'executions' | 'oracle' | 'history'; -export type AppView = 'home' | 'construct'; - -// Persist activeAgentTab to localStorage -function createPersistedAgentTab() { - const stored = typeof localStorage !== 'undefined' ? localStorage.getItem('firefly:activeAgentTab') as AgentTab | null : null; - const store = writable(stored || 'architect'); - store.subscribe(val => { - if (typeof localStorage !== 'undefined') { - localStorage.setItem('firefly:activeAgentTab', val); - } - }); - return store; -} - -export const activeAgentTab = createPersistedAgentTab(); -export const agentSidebarOpen = writable(true); -// Backward compat alias — TopBar, AppShell, shortcuts reference this -export const architectSidebarOpen = agentSidebarOpen; - -export const rightPanelOpen = writable(true); -export const bottomPanelOpen = writable(false); -export const bottomPanelTab = writable('console'); -export const appView = writable('home'); -export const commandPaletteOpen = writable(false); -export const shortcutsModalOpen = writable(false); -export const settingsModalOpen = writable(false); -export const firstStartWizardOpen = writable(false); -export const projectSettingsModalOpen = writable(false); - -/** - * Pending message from the home page prompt to be sent to The Architect - * when the sidebar connects. Consumed once by ArchitectSidebar. - */ -export interface PendingArchitectMessage { - text: string; - attachments?: { name: string; size: number; category: string; data: string; type: string; docType: string }[]; -} -export const pendingArchitectMessage = writable(null); diff --git a/studio-frontend/src/lib/types/graph.ts b/studio-frontend/src/lib/types/graph.ts deleted file mode 100644 index 0fc0e7c6..00000000 --- a/studio-frontend/src/lib/types/graph.ts +++ /dev/null @@ -1,267 +0,0 @@ -export type NodeType = - | 'input' - | 'output' - | 'agent' - | 'tool' - | 'reasoning' - | 'pipeline_step' - | 'fan_out' - | 'fan_in' - | 'condition' - | 'memory' - | 'validator' - | 'custom_code'; - -export interface MultimodalConfig { - vision_enabled: boolean; - supported_file_types: string[]; // e.g. ['image/png', 'image/jpeg', 'application/pdf'] - max_file_size_mb: number; - image_detail: 'auto' | 'low' | 'high'; -} - -export interface GraphNodeData { - model?: string; - instructions?: string; - description?: string; - label?: string; - multimodal?: MultimodalConfig; - [key: string]: unknown; -} - -export interface AgentInfo { - name: string; - version: string; - description: string; - tags: string[]; -} - -export interface ToolInfo { - name: string; - description: string; - tags: string[]; - parameter_count: number; -} - -export interface PatternInfo { - name: string; -} - -export interface ProjectInfo { - name: string; - description: string; - created_at: string; -} - -export interface FileEntry { - path: string; - name: string; - is_dir: boolean; - size: number; -} - -export interface FileContent { - path: string; - content: string; - size: number; -} - -export interface DatasetInfo { - filename: string; - test_cases: number; - size: number; -} - -export interface EvalTestResult { - input: string; - expected_output: string; - actual_output: string; - passed: boolean; - error: string; -} - -export interface EvalRunResult { - dataset: string; - total: number; - passed: number; - failed: number; - error_count: number; - pass_rate: number; - results: EvalTestResult[]; -} - -export interface ExperimentVariant { - name: string; - pipeline: string; - traffic: number; -} - -export interface Experiment { - id: string; - name: string; - status: 'draft' | 'running' | 'completed'; - created_at: string; - variants: ExperimentVariant[]; -} - -export interface ExecutionEvent { - type: string; - node_id?: string; - pipeline_name?: string; - latency_ms?: number; - error?: string; - success?: boolean; - duration_ms?: number; - timestamp?: string; - reason?: string; - index?: number; - state?: Record; - inputs?: Record; - branch_id?: string; - parent_index?: number; - message?: string; -} - -export interface Checkpoint { - index: number; - node_id: string; - state: Record; - inputs: Record; - timestamp: string; - branch_id?: string; - parent_index?: number; -} - -export interface UsageBreakdown { - input_tokens: number; - output_tokens: number; - total_tokens: number; - cost_usd: number; - requests: number; -} - -export interface UsageSummary { - total_input_tokens: number; - total_output_tokens: number; - total_tokens: number; - total_cost_usd: number; - total_requests: number; - total_latency_ms: number; - record_count: number; - by_agent: Record; - by_model: Record; -} - -// --------------------------------------------------------------------------- -// Settings -// --------------------------------------------------------------------------- - -export interface ProviderCredentials { - openai_api_key: string | null; - anthropic_api_key: string | null; - google_api_key: string | null; - groq_api_key: string | null; - mistral_api_key: string | null; - deepseek_api_key: string | null; - cohere_api_key: string | null; - azure_openai_api_key: string | null; - azure_openai_endpoint: string | null; - aws_access_key_id: string | null; - aws_secret_access_key: string | null; - aws_default_region: string | null; - ollama_base_url: string | null; -} - -export interface ModelDefaults { - default_model: string; - temperature: number; - retries: number; -} - -export interface UserProfile { - name: string; - role: string; - context: string; - assistant_name: string; -} - -export interface ToolCredentials { - serpapi_api_key: string | null; - serper_api_key: string | null; - tavily_api_key: string | null; - database_url: string | null; - redis_url: string | null; - slack_bot_token: string | null; - telegram_bot_token: string | null; -} - -export interface StudioSettingsResponse { - credentials: ProviderCredentials; - model_defaults: ModelDefaults; - user_profile: UserProfile; - tool_credentials: ToolCredentials; - setup_complete: boolean; -} - -export interface SaveSettingsPayload { - credentials?: Partial | null; - model_defaults?: Partial | null; - user_profile?: Partial | null; - tool_credentials?: Partial | null; - setup_complete?: boolean | null; -} - -export interface SettingsStatus { - first_start: boolean; - setup_complete: boolean; -} - -// --------------------------------------------------------------------------- -// Custom Tools -// --------------------------------------------------------------------------- - -export interface CustomToolParameter { - name: string; - type: string; - description: string; - required: boolean; - default: unknown; -} - -export interface CustomToolDefinition { - name: string; - description: string; - tool_type: 'python' | 'webhook' | 'api'; - tags: string[]; - parameters: CustomToolParameter[]; - created_at: string; - updated_at: string; - module_path: string; - webhook_url: string; - webhook_method: string; - webhook_headers: Record; - api_base_url: string; - api_path: string; - api_method: string; - api_auth_type: string; - api_auth_value: string; - api_headers: Record; -} - -export interface SaveCustomToolPayload { - name: string; - description?: string; - tool_type: 'webhook' | 'api' | 'python'; - tags?: string[]; - parameters?: CustomToolParameter[]; - webhook_url?: string; - webhook_method?: string; - webhook_headers?: Record; - api_base_url?: string; - api_path?: string; - api_method?: string; - api_auth_type?: string; - api_auth_value?: string; - api_headers?: Record; - module_path?: string; - python_code?: string; -} diff --git a/studio-frontend/src/routes/+layout.svelte b/studio-frontend/src/routes/+layout.svelte deleted file mode 100644 index 8f0529cf..00000000 --- a/studio-frontend/src/routes/+layout.svelte +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - {@render children()} - diff --git a/studio-frontend/src/routes/+layout.ts b/studio-frontend/src/routes/+layout.ts deleted file mode 100644 index c37a5326..00000000 --- a/studio-frontend/src/routes/+layout.ts +++ /dev/null @@ -1,4 +0,0 @@ -// SPA mode: disable SSR and prerendering for the entire app. -// Firefly Studio is a local tool, not a website — no SSR needed. -export const ssr = false; -export const prerender = false; diff --git a/studio-frontend/src/routes/+page.svelte b/studio-frontend/src/routes/+page.svelte deleted file mode 100644 index 05d38b00..00000000 --- a/studio-frontend/src/routes/+page.svelte +++ /dev/null @@ -1,1452 +0,0 @@ - - -
    - - - - -
    - -
    -

    - {#if userName} - What do you want to build, {userName}? - {:else} - What do you want to build? - {/if} -

    -

    Describe your AI agent pipeline and The Architect will design it for you

    -
    - - -
    -
    - - {#if attachments.length > 0} -
    - {#each attachments as att (att.id)} -
    - - {#if att.category === 'image'} - - {:else} - - {/if} - - {att.name} - {formatFileSize(att.size)} - -
    - {/each} -
    - {/if} -
    -
    - - -
    -
    - -
    -
    -
    - {#if sending} -

    Creating your project...

    - {/if} -
    - - -
    - -
    - {#each templateCards as card (card.id)} - - {/each} -
    -
    - - - {#if hasProjects} -
    -
    - - {#if allProjects.length > 1} - {#if showDeleteAll} -
    - Delete all {allProjects.length} projects? - - -
    - {:else} - - {/if} - {/if} -
    - - {#if allProjects.length > 3} - - {/if} - -
    - {#each filteredProjects as project (project.name)} - {#if deletingProject === project.name} -
    -
    - Delete "{project.name}"? -
    - - -
    -
    -
    - {:else} - -
    handleProjectClick(project, e)}> -
    - -
    -
    - {#if renamingProject === project.name} - - e.stopPropagation()} - onkeydown={(e) => { - e.stopPropagation(); - if (e.key === 'Enter') { e.preventDefault(); confirmRename(project.name, e); } - if (e.key === 'Escape') { renamingProject = null; } - }} - onblur={(e) => confirmRename(project.name, e)} - /> - {:else} - {project.name} - {/if} - {#if editingDescProject === project.name} - - e.stopPropagation()} - onkeydown={(e) => { - e.stopPropagation(); - if (e.key === 'Enter') { e.preventDefault(); confirmDesc(project.name, e); } - if (e.key === 'Escape') { editingDescProject = null; } - }} - onblur={(e) => confirmDesc(project.name, e)} - /> - {:else if project.description} - {project.description} - {:else} - {formatDate(project.created_at)} - {/if} -
    -
    - -
    - - - - - - {#if menuOpenFor === project.name} -
    e.stopPropagation()}> - - - - -
    - {/if} -
    - {/if} - {/each} -
    - - {#if searchQuery && filteredProjects.length === 0} -

    No projects matching "{searchQuery}"

    - {/if} -
    - {/if} - - - {#if menuOpenFor} - - {/if} -
    -
    - - diff --git a/studio-frontend/src/routes/construct/+page.svelte b/studio-frontend/src/routes/construct/+page.svelte deleted file mode 100644 index e9879ebf..00000000 --- a/studio-frontend/src/routes/construct/+page.svelte +++ /dev/null @@ -1,29 +0,0 @@ - - -
    -
    - - -
    - -
    - - diff --git a/studio-frontend/src/routes/deploy/+page.svelte b/studio-frontend/src/routes/deploy/+page.svelte deleted file mode 100644 index d38e1fff..00000000 --- a/studio-frontend/src/routes/deploy/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/studio-frontend/src/routes/evaluate/+page.svelte b/studio-frontend/src/routes/evaluate/+page.svelte deleted file mode 100644 index 7161a2d8..00000000 --- a/studio-frontend/src/routes/evaluate/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/studio-frontend/src/routes/experiments/+page.svelte b/studio-frontend/src/routes/experiments/+page.svelte deleted file mode 100644 index ccf71443..00000000 --- a/studio-frontend/src/routes/experiments/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/studio-frontend/src/routes/files/+page.svelte b/studio-frontend/src/routes/files/+page.svelte deleted file mode 100644 index 4fd36d96..00000000 --- a/studio-frontend/src/routes/files/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/studio-frontend/src/routes/integrations/+page.svelte b/studio-frontend/src/routes/integrations/+page.svelte deleted file mode 100644 index c620f6e8..00000000 --- a/studio-frontend/src/routes/integrations/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/studio-frontend/src/routes/monitor/+page.svelte b/studio-frontend/src/routes/monitor/+page.svelte deleted file mode 100644 index b5af4ef8..00000000 --- a/studio-frontend/src/routes/monitor/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/studio-frontend/static/favicon.png b/studio-frontend/static/favicon.png deleted file mode 100644 index 5e1a506972b937f1d478dbb50ce2e2556f0eee1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1276 zcmV^4balYBG*ZQOqgBYh9&*@ax zJsu2>9+3^FM@qq!X^H>%pwaW)-5BRtJSU>YfhnJx0w#Uqfai><>m0%)+CrN<|GFgs z+Ot3Gr-JX`Ios7Z0n)&fC}8~A#Z4V355!w!b9XWykCmVN(+1zG=s>7z0+>WG)y*VvE6Z z!A+vWSJG`+*eY$~w*cEj^=Op1bzMCtlF`fK{Y*Jh(~MLuq=dPZHudp)PGZisp(EF) z&V?!S!x;_Ri8_l!`FbFdf2l02`lpe~MWvIE*WJ}j*}9J)5H9pqMIvcGVIedZ#Hnn6 z;H=V#v+HB?u^TrQ&I`>JScP|fc-}3OkDFCf7+#g-7U;r)Z`fJCj600?=ZE;cr*dBP zyN_Z{?Lia&WF|tf!s>)Y77)#p97d`hhQJ-UiW7b4$Ype(D_1~o2ikuz-2vG=(Rl>c zzKc}WW~X8~ttYWZAXtMAU(5rv82j$6NH_W+c$r6-^7rw5bo z-}F7O%CQ!#13Q>Ue-^fKDFE6DteyxueGr_R%Rg`dzvtVM4kQ5-Yw=S#82+`NGWEa( z3zg#;L_Zn|WY#)yybGV;9^00+0DNx| z<}kwOBvBF_ItM2InNlk1v6sD!y>#nDEUN40touKv=UFB2Rvy5adV3Q{TUtW0rh9j>>K>+9eAA|=gT@G z>`M!|Y2M&B?PAd$T-xzumrkseZShNK=JM*tPLsQO#LPM<+yyFid zO-b?njX=+Bq`#(?|BSpwDn|f-)NJY%;Yr}?Z6NQlEO|V#v;Xg@!JK=6%zge>%l7YA zkstmqW`Q#XeW?7^tG{LE^4^T3Zp#hZNjwI;4O3>s%*|2cyo~q3hsa6CV;rVFaq8H0000 CheckpointManager: - """Return the CheckpointManager stored on app state.""" - return app.state.checkpoint_manager - - -@pytest.fixture() -async def client(app): - """Provide an async httpx client bound to the test app.""" - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -# --------------------------------------------------------------------------- -# GET /api/checkpoints (list) -# --------------------------------------------------------------------------- - - -class TestListCheckpoints: - async def test_list_empty(self, client: httpx.AsyncClient): - resp = await client.get("/api/checkpoints") - assert resp.status_code == 200 - assert resp.json() == [] - - async def test_list_after_creation( - self, - client: httpx.AsyncClient, - checkpoint_manager: CheckpointManager, - ): - checkpoint_manager.create(node_id="agent-1", state={"key": "value"}, inputs={"prompt": "hello"}) - checkpoint_manager.create(node_id="tool-1", state={"result": 42}, inputs={"arg": "x"}) - - resp = await client.get("/api/checkpoints") - assert resp.status_code == 200 - body = resp.json() - assert len(body) == 2 - assert body[0]["index"] == 0 - assert body[0]["node_id"] == "agent-1" - assert body[0]["state"] == {"key": "value"} - assert body[1]["index"] == 1 - assert body[1]["node_id"] == "tool-1" - - -# --------------------------------------------------------------------------- -# GET /api/checkpoints/{index} -# --------------------------------------------------------------------------- - - -class TestGetCheckpoint: - async def test_get_by_index( - self, - client: httpx.AsyncClient, - checkpoint_manager: CheckpointManager, - ): - checkpoint_manager.create(node_id="agent-1", state={"key": "value"}, inputs={"prompt": "hello"}) - - resp = await client.get("/api/checkpoints/0") - assert resp.status_code == 200 - body = resp.json() - assert body["index"] == 0 - assert body["node_id"] == "agent-1" - assert body["state"] == {"key": "value"} - assert body["inputs"] == {"prompt": "hello"} - assert body["timestamp"] != "" - assert body["branch_id"] is None - assert body["parent_index"] is None - - async def test_get_out_of_range(self, client: httpx.AsyncClient): - resp = await client.get("/api/checkpoints/99") - assert resp.status_code == 404 - - async def test_get_negative_index(self, client: httpx.AsyncClient): - resp = await client.get("/api/checkpoints/-1") - assert resp.status_code == 404 - - -# --------------------------------------------------------------------------- -# POST /api/checkpoints/fork -# --------------------------------------------------------------------------- - - -class TestForkCheckpoint: - async def test_fork_creates_new_checkpoint( - self, - client: httpx.AsyncClient, - checkpoint_manager: CheckpointManager, - ): - checkpoint_manager.create(node_id="agent-1", state={"key": "value"}, inputs={"prompt": "hello"}) - - resp = await client.post( - "/api/checkpoints/fork", - json={"from_index": 0, "modified_state": {"key": "modified"}}, - ) - assert resp.status_code == 200 - body = resp.json() - assert body["index"] == 1 - assert body["node_id"] == "agent-1" # Inherited from parent - assert body["state"] == {"key": "modified"} - assert body["inputs"] == {"prompt": "hello"} # Inherited from parent - assert body["branch_id"] is not None - assert body["parent_index"] == 0 - - async def test_fork_invalid_index(self, client: httpx.AsyncClient): - resp = await client.post( - "/api/checkpoints/fork", - json={"from_index": 99, "modified_state": {}}, - ) - assert resp.status_code == 404 - - -# --------------------------------------------------------------------------- -# POST /api/checkpoints/diff -# --------------------------------------------------------------------------- - - -class TestDiffCheckpoints: - async def test_diff_two_checkpoints( - self, - client: httpx.AsyncClient, - checkpoint_manager: CheckpointManager, - ): - checkpoint_manager.create( - node_id="agent-1", - state={"a": 1, "b": 2, "c": 3}, - inputs={}, - ) - checkpoint_manager.create( - node_id="agent-2", - state={"b": 99, "c": 3, "d": 4}, - inputs={}, - ) - - resp = await client.post( - "/api/checkpoints/diff", - json={"index_a": 0, "index_b": 1}, - ) - assert resp.status_code == 200 - body = resp.json() - - # "a" was removed, "d" was added, "b" changed, "c" unchanged - assert sorted(body["added"]) == ["d"] - assert sorted(body["removed"]) == ["a"] - assert sorted(body["changed"]) == ["b"] - - async def test_diff_invalid_index(self, client: httpx.AsyncClient): - resp = await client.post( - "/api/checkpoints/diff", - json={"index_a": 0, "index_b": 1}, - ) - assert resp.status_code == 404 - - -# --------------------------------------------------------------------------- -# DELETE /api/checkpoints -# --------------------------------------------------------------------------- - - -class TestClearCheckpoints: - async def test_clear_removes_all( - self, - client: httpx.AsyncClient, - checkpoint_manager: CheckpointManager, - ): - checkpoint_manager.create(node_id="agent-1", state={"key": "value"}, inputs={}) - checkpoint_manager.create(node_id="agent-2", state={"key": "value2"}, inputs={}) - - resp = await client.delete("/api/checkpoints") - assert resp.status_code == 200 - assert resp.json() == {"status": "cleared"} - - # Confirm empty - resp2 = await client.get("/api/checkpoints") - assert resp2.status_code == 200 - assert resp2.json() == [] diff --git a/tests/test_studio/test_api_codegen.py b/tests/test_studio/test_api_codegen.py deleted file mode 100644 index 8afcbace..00000000 --- a/tests/test_studio/test_api_codegen.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Studio code generation API endpoints.""" - -from __future__ import annotations - -import pytest - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx - -from fireflyframework_agentic.studio.server import create_studio_app - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def app(): - """Create a Studio app for testing.""" - return create_studio_app() - - -@pytest.fixture() -async def client(app): - """Provide an async httpx client bound to the test app.""" - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -# --------------------------------------------------------------------------- -# Helper graph payloads -# --------------------------------------------------------------------------- - -SINGLE_AGENT_GRAPH = { - "nodes": [ - { - "id": "agent_1", - "type": "agent", - "label": "My Agent", - "position": {"x": 100, "y": 200}, - "data": {"model": "openai:gpt-4o", "instructions": "Be helpful."}, - }, - ], - "edges": [], -} - - -# --------------------------------------------------------------------------- -# POST /api/codegen/smith -# --------------------------------------------------------------------------- - - -class TestCodegenSmith: - """Tests for the POST /api/codegen/smith endpoint.""" - - async def test_smith_endpoint_exists(self, client: httpx.AsyncClient): - """The /api/codegen/smith endpoint should accept POST requests.""" - resp = await client.post( - "/api/codegen/smith", - json={"graph": SINGLE_AGENT_GRAPH}, - ) - # Smith requires an LLM API key, so it may return 200 (success), - # 500 (no API key / agent creation fails), or 422 (validation). - # Any of these prove the endpoint exists and routes correctly. - assert resp.status_code != 404 - - async def test_smith_missing_graph_returns_422(self, client: httpx.AsyncClient): - """A request missing the 'graph' key should return 422.""" - resp = await client.post("/api/codegen/smith", json={}) - assert resp.status_code == 422 - - async def test_old_tocode_endpoint_removed(self, client: httpx.AsyncClient): - """The old /api/codegen/to-code endpoint should no longer exist as an API route.""" - resp = await client.post( - "/api/codegen/to-code", - json={"graph": SINGLE_AGENT_GRAPH}, - ) - # The endpoint was removed. It may return 404/405 (route not found) - # or 200 (static file catch-all). Either way, it should NOT return - # a valid JSON codegen response with a 'code' key. - if resp.status_code == 200: - try: - body = resp.json() - assert "code" not in body, "to-code endpoint should not return generated code" - except Exception: - pass # Non-JSON response = static file served = endpoint removed diff --git a/tests/test_studio/test_api_monitoring.py b/tests/test_studio/test_api_monitoring.py deleted file mode 100644 index 077c4206..00000000 --- a/tests/test_studio/test_api_monitoring.py +++ /dev/null @@ -1,190 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Studio monitoring API endpoints.""" - -from __future__ import annotations - -import pytest - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx - -from fireflyframework_agentic.studio.server import create_studio_app - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def app(): - """Create a Studio app for testing.""" - return create_studio_app() - - -@pytest.fixture() -async def client(app): - """Provide an async httpx client bound to the test app.""" - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -@pytest.fixture(autouse=True) -def _reset_usage_tracker(): - """Reset the default usage tracker between tests.""" - from fireflyframework_agentic.observability.usage import default_usage_tracker - - default_usage_tracker.reset() - yield - default_usage_tracker.reset() - - -# --------------------------------------------------------------------------- -# GET /api/monitoring/usage -# --------------------------------------------------------------------------- - - -class TestMonitoringUsage: - async def test_usage_returns_valid_json_with_expected_fields(self, client: httpx.AsyncClient): - resp = await client.get("/api/monitoring/usage") - assert resp.status_code == 200 - body = resp.json() - - # Verify all expected top-level fields are present - expected_fields = [ - "total_input_tokens", - "total_output_tokens", - "total_tokens", - "total_cost_usd", - "total_requests", - "total_latency_ms", - "record_count", - "by_agent", - "by_model", - ] - for field in expected_fields: - assert field in body, f"Missing field: {field}" - - async def test_usage_returns_zeros_when_no_records(self, client: httpx.AsyncClient): - resp = await client.get("/api/monitoring/usage") - assert resp.status_code == 200 - body = resp.json() - - assert body["total_input_tokens"] == 0 - assert body["total_output_tokens"] == 0 - assert body["total_tokens"] == 0 - assert body["total_cost_usd"] == 0.0 - assert body["total_requests"] == 0 - assert body["total_latency_ms"] == 0.0 - assert body["record_count"] == 0 - assert body["by_agent"] == {} - assert body["by_model"] == {} - - async def test_usage_reflects_recorded_data(self, client: httpx.AsyncClient): - from fireflyframework_agentic.observability.usage import ( - UsageRecord, - default_usage_tracker, - ) - - default_usage_tracker.record( - UsageRecord( - agent="test-agent", - model="openai:gpt-4o", - input_tokens=100, - output_tokens=50, - total_tokens=150, - request_count=1, - cost_usd=0.0025, - latency_ms=350.0, - ) - ) - - resp = await client.get("/api/monitoring/usage") - assert resp.status_code == 200 - body = resp.json() - - assert body["total_input_tokens"] == 100 - assert body["total_output_tokens"] == 50 - assert body["total_tokens"] == 150 - assert body["total_requests"] == 1 - assert body["total_cost_usd"] == pytest.approx(0.0025) - assert body["total_latency_ms"] == pytest.approx(350.0) - assert body["record_count"] == 1 - - # Check by_agent breakdown - assert "test-agent" in body["by_agent"] - agent_data = body["by_agent"]["test-agent"] - assert agent_data["input_tokens"] == 100 - assert agent_data["output_tokens"] == 50 - assert agent_data["total_tokens"] == 150 - assert agent_data["cost_usd"] == pytest.approx(0.0025) - assert agent_data["requests"] == 1 - - # Check by_model breakdown - assert "openai:gpt-4o" in body["by_model"] - model_data = body["by_model"]["openai:gpt-4o"] - assert model_data["input_tokens"] == 100 - assert model_data["total_tokens"] == 150 - - async def test_usage_aggregates_multiple_records(self, client: httpx.AsyncClient): - from fireflyframework_agentic.observability.usage import ( - UsageRecord, - default_usage_tracker, - ) - - default_usage_tracker.record( - UsageRecord( - agent="agent-a", - model="openai:gpt-4o", - input_tokens=100, - output_tokens=50, - total_tokens=150, - request_count=1, - cost_usd=0.002, - latency_ms=200.0, - ) - ) - default_usage_tracker.record( - UsageRecord( - agent="agent-b", - model="anthropic:claude-3", - input_tokens=200, - output_tokens=100, - total_tokens=300, - request_count=1, - cost_usd=0.005, - latency_ms=450.0, - ) - ) - - resp = await client.get("/api/monitoring/usage") - assert resp.status_code == 200 - body = resp.json() - - assert body["total_input_tokens"] == 300 - assert body["total_output_tokens"] == 150 - assert body["total_tokens"] == 450 - assert body["total_requests"] == 2 - assert body["total_cost_usd"] == pytest.approx(0.007) - assert body["record_count"] == 2 - - # Both agents and models should appear - assert "agent-a" in body["by_agent"] - assert "agent-b" in body["by_agent"] - assert "openai:gpt-4o" in body["by_model"] - assert "anthropic:claude-3" in body["by_model"] diff --git a/tests/test_studio/test_api_registry.py b/tests/test_studio/test_api_registry.py deleted file mode 100644 index da8a203c..00000000 --- a/tests/test_studio/test_api_registry.py +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Studio registry API endpoints.""" - -from __future__ import annotations - -import pytest - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx - -from fireflyframework_agentic.studio.server import create_studio_app - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def app(): - """Create a Studio app for testing.""" - return create_studio_app() - - -@pytest.fixture() -async def client(app): - """Provide an async httpx client bound to the test app.""" - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -# --------------------------------------------------------------------------- -# GET /api/registry/agents -# --------------------------------------------------------------------------- - - -class TestRegistryAgents: - async def test_agents_returns_empty_list_when_none_registered(self, client: httpx.AsyncClient): - resp = await client.get("/api/registry/agents") - assert resp.status_code == 200 - assert resp.json() == [] - - async def test_agents_returns_agent_info_after_registration(self, client: httpx.AsyncClient): - from pydantic_ai.models.test import TestModel - - from fireflyframework_agentic.agents.base import FireflyAgent - from fireflyframework_agentic.agents.registry import agent_registry - - agent = FireflyAgent( - "test-agent", - model=TestModel(), - description="A test agent", - version="1.0.0", - tags=["test", "demo"], - auto_register=False, - ) - agent_registry.register(agent) - - resp = await client.get("/api/registry/agents") - assert resp.status_code == 200 - body = resp.json() - assert len(body) == 1 - assert body[0]["name"] == "test-agent" - assert body[0]["description"] == "A test agent" - assert body[0]["version"] == "1.0.0" - assert body[0]["tags"] == ["test", "demo"] - - -# --------------------------------------------------------------------------- -# GET /api/registry/tools -# --------------------------------------------------------------------------- - - -class TestRegistryTools: - async def test_tools_returns_empty_list_when_none_registered(self, client: httpx.AsyncClient): - resp = await client.get("/api/registry/tools") - assert resp.status_code == 200 - assert resp.json() == [] - - async def test_tools_returns_tool_info_after_registration(self, client: httpx.AsyncClient): - from fireflyframework_agentic.tools.base import BaseTool - from fireflyframework_agentic.tools.registry import tool_registry - - class DummyTool(BaseTool): - async def _execute(self, **kwargs): - return "ok" - - tool = DummyTool("dummy-tool", description="A dummy tool", tags=["test"]) - tool_registry.register(tool) - - resp = await client.get("/api/registry/tools") - assert resp.status_code == 200 - body = resp.json() - assert len(body) == 1 - assert body[0]["name"] == "dummy-tool" - assert body[0]["description"] == "A dummy tool" - - -# --------------------------------------------------------------------------- -# GET /api/registry/patterns -# --------------------------------------------------------------------------- - - -class TestRegistryPatterns: - async def test_patterns_returns_empty_list_when_none_registered(self, client: httpx.AsyncClient): - resp = await client.get("/api/registry/patterns") - assert resp.status_code == 200 - assert resp.json() == [] - - async def test_patterns_returns_list_after_registration(self, client: httpx.AsyncClient): - from fireflyframework_agentic.reasoning.registry import reasoning_registry - - reasoning_registry.register("chain-of-thought", object()) - reasoning_registry.register("react", object()) - - resp = await client.get("/api/registry/patterns") - assert resp.status_code == 200 - body = resp.json() - assert isinstance(body, list) - assert len(body) == 2 - # Patterns endpoint returns dicts with a "name" key - names = [p["name"] for p in body] - assert "chain-of-thought" in names - assert "react" in names diff --git a/tests/test_studio/test_assistant_agent.py b/tests/test_studio/test_assistant_agent.py deleted file mode 100644 index 80b07db5..00000000 --- a/tests/test_studio/test_assistant_agent.py +++ /dev/null @@ -1,157 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Studio AI assistant agent and canvas tools.""" - -from __future__ import annotations - -import json - -import pytest - -from fireflyframework_agentic.agents import FireflyAgent -from fireflyframework_agentic.studio.assistant.agent import ( - CanvasState, - create_canvas_tools, - create_studio_assistant, -) - - -class TestCreateStudioAssistant: - def test_create_studio_assistant_returns_firefly_agent(self, monkeypatch): - monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False) - monkeypatch.setenv("OPENAI_API_KEY", "test-key") - monkeypatch.setattr( - "fireflyframework_agentic.studio.assistant.agent._resolve_assistant_model", - lambda: "openai:gpt-4o", - ) - agent = create_studio_assistant() - assert isinstance(agent, FireflyAgent) - assert agent.name == "studio-assistant" - assert "studio" in agent.tags - assert "assistant" in agent.tags - - -class TestCanvasTools: - @pytest.fixture() - def canvas(self): - return CanvasState() - - @pytest.fixture() - def tools(self, canvas): - return {t.name: t for t in create_canvas_tools(canvas)} - - # -- add_node ------------------------------------------------------------ - - async def test_add_node_creates_node(self, canvas, tools): - result = await tools["add_node"].execute(node_type="agent", label="My Agent") - assert len(canvas.nodes) == 1 - assert canvas.nodes[0].type == "agent" - assert canvas.nodes[0].label == "My Agent" - - data = json.loads(result) - assert data["id"] == "agent_1" - assert data["type"] == "agent" - - async def test_add_node_rejects_invalid_type(self, canvas, tools): - with pytest.raises(Exception, match="Invalid node_type"): - await tools["add_node"].execute(node_type="invalid", label="Bad") - - # -- connect_nodes ------------------------------------------------------- - - async def test_connect_nodes_creates_edge(self, canvas, tools): - await tools["add_node"].execute(node_type="agent", label="A") - await tools["add_node"].execute(node_type="tool", label="B") - - result = await tools["connect_nodes"].execute(source_id="agent_1", target_id="tool_2") - assert len(canvas.edges) == 1 - assert canvas.edges[0].source == "agent_1" - assert canvas.edges[0].target == "tool_2" - - data = json.loads(result) - assert data["source"] == "agent_1" - assert data["target"] == "tool_2" - - async def test_connect_nodes_rejects_self_loop(self, canvas, tools): - await tools["add_node"].execute(node_type="agent", label="A") - with pytest.raises(Exception, match="Cannot connect a node to itself"): - await tools["connect_nodes"].execute(source_id="agent_1", target_id="agent_1") - - async def test_connect_nodes_rejects_missing_node(self, canvas, tools): - await tools["add_node"].execute(node_type="agent", label="A") - with pytest.raises(Exception, match="does not exist"): - await tools["connect_nodes"].execute(source_id="agent_1", target_id="node_999") - - # -- configure_node ------------------------------------------------------ - - async def test_configure_node_updates_config(self, canvas, tools): - await tools["add_node"].execute(node_type="agent", label="A") - result = await tools["configure_node"].execute(node_id="agent_1", key="model", value="openai:gpt-4o") - assert canvas.nodes[0].config["model"] == "openai:gpt-4o" - assert "model" in result - - async def test_configure_node_updates_label(self, canvas, tools): - await tools["add_node"].execute(node_type="agent", label="A") - await tools["configure_node"].execute(node_id="agent_1", key="label", value="Renamed") - assert canvas.nodes[0].label == "Renamed" - - async def test_configure_node_rejects_missing_node(self, canvas, tools): - with pytest.raises(Exception, match="does not exist"): - await tools["configure_node"].execute(node_id="node_999", key="model", value="openai:gpt-4o") - - # -- remove_node --------------------------------------------------------- - - async def test_remove_node_removes_node_and_edges(self, canvas, tools): - await tools["add_node"].execute(node_type="agent", label="A") - await tools["add_node"].execute(node_type="tool", label="B") - await tools["connect_nodes"].execute(source_id="agent_1", target_id="tool_2") - assert len(canvas.nodes) == 2 - assert len(canvas.edges) == 1 - - await tools["remove_node"].execute(node_id="agent_1") - assert len(canvas.nodes) == 1 - assert canvas.nodes[0].id == "tool_2" - assert len(canvas.edges) == 0 - - async def test_remove_node_rejects_missing_node(self, canvas, tools): - with pytest.raises(Exception, match="does not exist"): - await tools["remove_node"].execute(node_id="node_999") - - # -- list_nodes ---------------------------------------------------------- - - async def test_list_nodes_returns_all_nodes(self, canvas, tools): - await tools["add_node"].execute(node_type="agent", label="A") - await tools["add_node"].execute(node_type="tool", label="B") - await tools["add_node"].execute(node_type="reasoning", label="C") - - result = await tools["list_nodes"].execute() - data = json.loads(result) - assert len(data) == 3 - labels = {n["label"] for n in data} - assert labels == {"A", "B", "C"} - - # -- list_edges ---------------------------------------------------------- - - async def test_list_edges_returns_all_edges(self, canvas, tools): - await tools["add_node"].execute(node_type="agent", label="A") - await tools["add_node"].execute(node_type="tool", label="B") - await tools["add_node"].execute(node_type="condition", label="C") - await tools["connect_nodes"].execute(source_id="agent_1", target_id="tool_2") - await tools["connect_nodes"].execute(source_id="tool_2", target_id="condition_3") - - result = await tools["list_edges"].execute() - data = json.loads(result) - assert len(data) == 2 - sources = {e["source"] for e in data} - assert sources == {"agent_1", "tool_2"} diff --git a/tests/test_studio/test_checkpoint.py b/tests/test_studio/test_checkpoint.py deleted file mode 100644 index d09e6977..00000000 --- a/tests/test_studio/test_checkpoint.py +++ /dev/null @@ -1,319 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Studio checkpoint system (time-travel debugging).""" - -from __future__ import annotations - -import re -from datetime import UTC, datetime - -from fireflyframework_agentic.studio.execution.checkpoint import ( - Checkpoint, - CheckpointManager, -) - -# --------------------------------------------------------------------------- -# Checkpoint dataclass -# --------------------------------------------------------------------------- - - -class TestCheckpointDataclass: - def test_checkpoint_fields(self) -> None: - cp = Checkpoint( - index=0, - node_id="node_a", - state={"result": 42}, - inputs={"prompt": "hello"}, - timestamp="2026-01-01T00:00:00+00:00", - ) - assert cp.index == 0 - assert cp.node_id == "node_a" - assert cp.state == {"result": 42} - assert cp.inputs == {"prompt": "hello"} - assert cp.timestamp == "2026-01-01T00:00:00+00:00" - assert cp.branch_id is None - assert cp.parent_index is None - - def test_checkpoint_with_branch(self) -> None: - cp = Checkpoint( - index=3, - node_id="node_b", - state={"x": 1}, - inputs={"y": 2}, - timestamp="2026-01-01T00:00:00+00:00", - branch_id="abc12345", - parent_index=1, - ) - assert cp.branch_id == "abc12345" - assert cp.parent_index == 1 - - -# --------------------------------------------------------------------------- -# CheckpointManager — create -# --------------------------------------------------------------------------- - - -class TestCheckpointManagerCreate: - def test_create_returns_checkpoint(self) -> None: - mgr = CheckpointManager() - cp = mgr.create(node_id="node_a", state={"out": 1}, inputs={"in": 0}) - assert isinstance(cp, Checkpoint) - - def test_create_assigns_correct_fields(self) -> None: - mgr = CheckpointManager() - cp = mgr.create(node_id="node_a", state={"out": 1}, inputs={"in": 0}) - assert cp.node_id == "node_a" - assert cp.state == {"out": 1} - assert cp.inputs == {"in": 0} - - def test_create_assigns_index_zero_for_first(self) -> None: - mgr = CheckpointManager() - cp = mgr.create(node_id="n", state={}, inputs={}) - assert cp.index == 0 - - def test_create_auto_sets_timestamp(self) -> None: - mgr = CheckpointManager() - before = datetime.now(UTC) - cp = mgr.create(node_id="n", state={}, inputs={}) - after = datetime.now(UTC) - - ts = datetime.fromisoformat(cp.timestamp) - assert before <= ts <= after - - def test_create_timestamp_is_utc_iso8601(self) -> None: - mgr = CheckpointManager() - cp = mgr.create(node_id="n", state={}, inputs={}) - # Should parse as ISO 8601 and be in UTC - ts = datetime.fromisoformat(cp.timestamp) - assert ts.tzinfo is not None - - -# --------------------------------------------------------------------------- -# CheckpointManager — sequential index assignment -# --------------------------------------------------------------------------- - - -class TestCheckpointManagerSequentialIndex: - def test_sequential_indices(self) -> None: - mgr = CheckpointManager() - cp0 = mgr.create(node_id="a", state={}, inputs={}) - cp1 = mgr.create(node_id="b", state={}, inputs={}) - cp2 = mgr.create(node_id="c", state={}, inputs={}) - assert cp0.index == 0 - assert cp1.index == 1 - assert cp2.index == 2 - - -# --------------------------------------------------------------------------- -# CheckpointManager — get -# --------------------------------------------------------------------------- - - -class TestCheckpointManagerGet: - def test_get_by_index(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={"v": 1}, inputs={}) - mgr.create(node_id="b", state={"v": 2}, inputs={}) - - cp = mgr.get(0) - assert cp.node_id == "a" - assert cp.state == {"v": 1} - - cp = mgr.get(1) - assert cp.node_id == "b" - assert cp.state == {"v": 2} - - def test_get_invalid_index_raises(self) -> None: - mgr = CheckpointManager() - import pytest - - with pytest.raises(IndexError): - mgr.get(0) - - def test_get_negative_index_raises(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={}, inputs={}) - import pytest - - with pytest.raises(IndexError): - mgr.get(-1) - - -# --------------------------------------------------------------------------- -# CheckpointManager — list_all -# --------------------------------------------------------------------------- - - -class TestCheckpointManagerListAll: - def test_list_all_empty(self) -> None: - mgr = CheckpointManager() - assert mgr.list_all() == [] - - def test_list_all_returns_all_checkpoints(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={}, inputs={}) - mgr.create(node_id="b", state={}, inputs={}) - result = mgr.list_all() - assert len(result) == 2 - assert result[0].node_id == "a" - assert result[1].node_id == "b" - - def test_list_all_returns_defensive_copy(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={}, inputs={}) - first = mgr.list_all() - second = mgr.list_all() - assert first is not second - # Mutating the returned list should not affect the manager - first.clear() - assert len(mgr.list_all()) == 1 - - -# --------------------------------------------------------------------------- -# CheckpointManager — fork -# --------------------------------------------------------------------------- - - -class TestCheckpointManagerFork: - def test_fork_creates_new_checkpoint(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="node_a", state={"x": 1}, inputs={"in": 0}) - forked = mgr.fork(from_index=0, modified_state={"x": 99}) - assert isinstance(forked, Checkpoint) - - def test_fork_inherits_node_id_and_inputs(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="node_a", state={"x": 1}, inputs={"in": 0}) - forked = mgr.fork(from_index=0, modified_state={"x": 99}) - assert forked.node_id == "node_a" - assert forked.inputs == {"in": 0} - - def test_fork_uses_modified_state(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="node_a", state={"x": 1}, inputs={"in": 0}) - forked = mgr.fork(from_index=0, modified_state={"x": 99}) - assert forked.state == {"x": 99} - - def test_fork_assigns_branch_id(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="node_a", state={"x": 1}, inputs={"in": 0}) - forked = mgr.fork(from_index=0, modified_state={"x": 99}) - assert forked.branch_id is not None - # 8-char hex string - assert re.fullmatch(r"[0-9a-f]{8}", forked.branch_id) - - def test_fork_sets_parent_index(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="node_a", state={"x": 1}, inputs={"in": 0}) - forked = mgr.fork(from_index=0, modified_state={"x": 99}) - assert forked.parent_index == 0 - - def test_fork_gets_next_sequential_index(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={}, inputs={}) - mgr.create(node_id="b", state={}, inputs={}) - forked = mgr.fork(from_index=0, modified_state={"z": 1}) - assert forked.index == 2 - - def test_fork_is_retrievable(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={"x": 1}, inputs={"in": 0}) - forked = mgr.fork(from_index=0, modified_state={"x": 42}) - retrieved = mgr.get(forked.index) - assert retrieved.branch_id == forked.branch_id - assert retrieved.state == {"x": 42} - - -# --------------------------------------------------------------------------- -# CheckpointManager — diff -# --------------------------------------------------------------------------- - - -class TestCheckpointManagerDiff: - def test_diff_added_keys(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={"x": 1}, inputs={}) - mgr.create(node_id="b", state={"x": 1, "y": 2}, inputs={}) - result = mgr.diff(0, 1) - assert result["added"] == {"y"} - assert result["removed"] == set() - assert result["changed"] == set() - - def test_diff_removed_keys(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={"x": 1, "y": 2}, inputs={}) - mgr.create(node_id="b", state={"x": 1}, inputs={}) - result = mgr.diff(0, 1) - assert result["added"] == set() - assert result["removed"] == {"y"} - assert result["changed"] == set() - - def test_diff_changed_keys(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={"x": 1, "y": 2}, inputs={}) - mgr.create(node_id="b", state={"x": 99, "y": 2}, inputs={}) - result = mgr.diff(0, 1) - assert result["added"] == set() - assert result["removed"] == set() - assert result["changed"] == {"x"} - - def test_diff_mixed(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={"x": 1, "y": 2, "z": 3}, inputs={}) - mgr.create(node_id="b", state={"x": 99, "w": 4, "z": 3}, inputs={}) - result = mgr.diff(0, 1) - assert result["added"] == {"w"} - assert result["removed"] == {"y"} - assert result["changed"] == {"x"} - - def test_diff_identical_states(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={"x": 1}, inputs={}) - mgr.create(node_id="b", state={"x": 1}, inputs={}) - result = mgr.diff(0, 1) - assert result["added"] == set() - assert result["removed"] == set() - assert result["changed"] == set() - - def test_diff_empty_states(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={}, inputs={}) - mgr.create(node_id="b", state={}, inputs={}) - result = mgr.diff(0, 1) - assert result["added"] == set() - assert result["removed"] == set() - assert result["changed"] == set() - - -# --------------------------------------------------------------------------- -# CheckpointManager — clear -# --------------------------------------------------------------------------- - - -class TestCheckpointManagerClear: - def test_clear_empties_checkpoints(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={}, inputs={}) - mgr.create(node_id="b", state={}, inputs={}) - mgr.clear() - assert mgr.list_all() == [] - - def test_clear_resets_index_counter(self) -> None: - mgr = CheckpointManager() - mgr.create(node_id="a", state={}, inputs={}) - mgr.create(node_id="b", state={}, inputs={}) - mgr.clear() - cp = mgr.create(node_id="c", state={}, inputs={}) - assert cp.index == 0 diff --git a/tests/test_studio/test_cli.py b/tests/test_studio/test_cli.py deleted file mode 100644 index 59bb4cf4..00000000 --- a/tests/test_studio/test_cli.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Firefly Studio CLI entry point.""" - -from __future__ import annotations - -import pytest - -pytest.importorskip("uvicorn", reason="uvicorn not installed") - -from fireflyframework_agentic.studio.cli import main, parse_args - -# --------------------------------------------------------------------------- -# parse_args — defaults -# --------------------------------------------------------------------------- - - -class TestParseArgsDefaults: - def test_default_port(self) -> None: - args = parse_args([]) - assert args.port == 8470 - - def test_default_host(self) -> None: - args = parse_args([]) - assert args.host == "127.0.0.1" - - def test_default_no_browser(self) -> None: - args = parse_args([]) - assert args.no_browser is False - - def test_default_dev(self) -> None: - args = parse_args([]) - assert args.dev is False - - -# --------------------------------------------------------------------------- -# parse_args — overrides -# --------------------------------------------------------------------------- - - -class TestParseArgsOverrides: - def test_port_override(self) -> None: - args = parse_args(["--port", "9000"]) - assert args.port == 9000 - - def test_host_override(self) -> None: - args = parse_args(["--host", "0.0.0.0"]) - assert args.host == "0.0.0.0" - - def test_no_browser_flag(self) -> None: - args = parse_args(["--no-browser"]) - assert args.no_browser is True - - def test_dev_flag(self) -> None: - args = parse_args(["--dev"]) - assert args.dev is True - - def test_all_overrides(self) -> None: - args = parse_args(["--port", "9000", "--host", "0.0.0.0", "--no-browser"]) - assert args.port == 9000 - assert args.host == "0.0.0.0" - assert args.no_browser is True - - -# --------------------------------------------------------------------------- -# parse_args — explicit "studio" subcommand -# --------------------------------------------------------------------------- - - -class TestParseArgsSubcommand: - def test_explicit_studio_subcommand(self) -> None: - args = parse_args(["studio"]) - assert args.port == 8470 - assert args.host == "127.0.0.1" - assert args.no_browser is False - - def test_studio_subcommand_with_flags(self) -> None: - args = parse_args(["studio", "--port", "9000"]) - assert args.port == 9000 - - def test_studio_subcommand_with_all_flags(self) -> None: - args = parse_args(["studio", "--port", "9000", "--host", "0.0.0.0", "--no-browser", "--dev"]) - assert args.port == 9000 - assert args.host == "0.0.0.0" - assert args.no_browser is True - assert args.dev is True - - -# --------------------------------------------------------------------------- -# main — is callable -# --------------------------------------------------------------------------- - - -class TestMainCallable: - def test_main_is_callable(self) -> None: - assert callable(main) diff --git a/tests/test_studio/test_codegen_generator.py b/tests/test_studio/test_codegen_generator.py deleted file mode 100644 index 1a1e9cb8..00000000 --- a/tests/test_studio/test_codegen_generator.py +++ /dev/null @@ -1,339 +0,0 @@ -"""Tests for the code generator that converts graph models to Python code.""" - -from __future__ import annotations - -from fireflyframework_agentic.studio.codegen.generator import generate_python -from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - NodeType, -) - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _agent_node( - node_id: str, - label: str = "", - model: str = "openai:gpt-4o", - instructions: str = "", - **extra_data: object, -) -> GraphNode: - """Shortcut to build an agent GraphNode for tests.""" - data: dict = {"model": model, "instructions": instructions, **extra_data} - return GraphNode( - id=node_id, - type=NodeType.AGENT, - label=label or node_id, - position={"x": 0.0, "y": 0.0}, - data=data, - ) - - -def _edge(source: str, target: str, edge_id: str | None = None) -> GraphEdge: - """Shortcut to build a GraphEdge.""" - return GraphEdge( - id=edge_id or f"{source}->{target}", - source=source, - target=target, - ) - - -def _compiles(code: str) -> bool: - """Return True if *code* is syntactically valid Python.""" - try: - compile(code, "", "exec") - return True - except SyntaxError: - return False - - -# --------------------------------------------------------------------------- -# Single agent (standalone, no edges) -# --------------------------------------------------------------------------- - - -class TestSingleAgentStandalone: - def test_single_agent_produces_standalone_definition(self) -> None: - graph = GraphModel( - nodes=[_agent_node("classifier", instructions="Classify the input text.")], - ) - code = generate_python(graph) - - assert "FireflyAgent" in code - assert "PipelineBuilder" not in code - assert 'name="classifier"' in code - assert 'model="openai:gpt-4o"' in code - assert 'instructions="Classify the input text."' in code - - def test_single_agent_has_module_docstring(self) -> None: - graph = GraphModel( - nodes=[_agent_node("a", instructions="Do stuff.")], - ) - code = generate_python(graph) - - assert code.startswith('"""Pipeline generated by Firefly Agentic Studio."""') - - def test_single_agent_has_future_annotations(self) -> None: - graph = GraphModel( - nodes=[_agent_node("a", instructions="Do stuff.")], - ) - code = generate_python(graph) - - assert "from __future__ import annotations" in code - - def test_single_agent_compiles(self) -> None: - graph = GraphModel( - nodes=[_agent_node("classifier", instructions="Classify the input text.")], - ) - code = generate_python(graph) - - assert _compiles(code) - - def test_variable_name_matches_node_id(self) -> None: - graph = GraphModel( - nodes=[_agent_node("summarizer", instructions="Summarize.")], - ) - code = generate_python(graph) - - assert "summarizer = FireflyAgent(" in code - - -# --------------------------------------------------------------------------- -# Pipeline (edges present) -# --------------------------------------------------------------------------- - - -class TestPipelineGeneration: - def test_two_agents_with_edge_generates_pipeline(self) -> None: - graph = GraphModel( - nodes=[ - _agent_node("a", instructions="Agent A"), - _agent_node("b", instructions="Agent B"), - ], - edges=[_edge("a", "b")], - ) - code = generate_python(graph) - - assert "PipelineBuilder" in code - assert "AgentStep" in code - assert '.add_node("a"' in code - assert '.add_node("b"' in code - assert '.add_edge("a", "b")' in code - assert ".build()" in code - - def test_pipeline_compiles(self) -> None: - graph = GraphModel( - nodes=[ - _agent_node("a", instructions="Agent A"), - _agent_node("b", instructions="Agent B"), - ], - edges=[_edge("a", "b")], - ) - code = generate_python(graph) - - assert _compiles(code) - - def test_pipeline_imports_all_needed_symbols(self) -> None: - graph = GraphModel( - nodes=[ - _agent_node("x", instructions="X"), - _agent_node("y", instructions="Y"), - ], - edges=[_edge("x", "y")], - ) - code = generate_python(graph) - - assert "from fireflyframework_agentic.agents.base import FireflyAgent" in code - assert "from fireflyframework_agentic.pipeline.builder import PipelineBuilder" in code - assert "from fireflyframework_agentic.pipeline.steps import AgentStep" in code - - def test_multiple_edges(self) -> None: - graph = GraphModel( - nodes=[ - _agent_node("a", instructions="Agent A"), - _agent_node("b", instructions="Agent B"), - _agent_node("c", instructions="Agent C"), - ], - edges=[ - _edge("a", "b"), - _edge("b", "c"), - ], - ) - code = generate_python(graph) - - assert '.add_edge("a", "b")' in code - assert '.add_edge("b", "c")' in code - assert _compiles(code) - - def test_diamond_topology(self) -> None: - """A -> B, A -> C, B -> D, C -> D.""" - graph = GraphModel( - nodes=[ - _agent_node("a", instructions="Start"), - _agent_node("b", instructions="Left"), - _agent_node("c", instructions="Right"), - _agent_node("d", instructions="Merge"), - ], - edges=[ - _edge("a", "b"), - _edge("a", "c"), - _edge("b", "d"), - _edge("c", "d"), - ], - ) - code = generate_python(graph) - - assert '.add_edge("a", "b")' in code - assert '.add_edge("a", "c")' in code - assert '.add_edge("b", "d")' in code - assert '.add_edge("c", "d")' in code - assert _compiles(code) - - -# --------------------------------------------------------------------------- -# Special characters and edge cases -# --------------------------------------------------------------------------- - - -class TestSpecialCharacters: - def test_instructions_with_double_quotes(self) -> None: - graph = GraphModel( - nodes=[_agent_node("q", instructions='Say "hello" to the user.')], - ) - code = generate_python(graph) - - assert _compiles(code) - assert "hello" in code - - def test_instructions_with_single_quotes(self) -> None: - graph = GraphModel( - nodes=[_agent_node("q", instructions="It's a test.")], - ) - code = generate_python(graph) - - assert _compiles(code) - assert "It" in code - - def test_instructions_with_newlines_use_triple_quotes(self) -> None: - graph = GraphModel( - nodes=[ - _agent_node( - "multi", - instructions="Step 1: Read.\nStep 2: Think.\nStep 3: Answer.", - ), - ], - ) - code = generate_python(graph) - - assert _compiles(code) - # Multi-line instructions should use triple-quoted strings - assert '"""' in code or "'''" in code - - def test_instructions_with_backslashes(self) -> None: - graph = GraphModel( - nodes=[_agent_node("bs", instructions="Use path C:\\Users\\test")], - ) - code = generate_python(graph) - - assert _compiles(code) - - def test_instructions_with_triple_quotes(self) -> None: - """Instructions that themselves contain triple-double-quotes.""" - graph = GraphModel( - nodes=[_agent_node("tricky", instructions='She said """wow""".')], - ) - code = generate_python(graph) - - assert _compiles(code) - - -# --------------------------------------------------------------------------- -# Agent with no instructions -# --------------------------------------------------------------------------- - - -class TestAgentNoInstructions: - def test_agent_with_empty_instructions(self) -> None: - graph = GraphModel( - nodes=[_agent_node("bare", instructions="")], - ) - code = generate_python(graph) - - assert _compiles(code) - assert 'name="bare"' in code - - def test_agent_with_missing_instructions_key(self) -> None: - """data dict has no 'instructions' key at all.""" - node = GraphNode( - id="noinstr", - type=NodeType.AGENT, - label="No Instructions", - position={"x": 0, "y": 0}, - data={"model": "openai:gpt-4o"}, - ) - graph = GraphModel(nodes=[node]) - code = generate_python(graph) - - assert _compiles(code) - assert 'name="noinstr"' in code - - def test_agent_with_no_model_uses_default(self) -> None: - """data dict has no 'model' key -- should still generate valid code.""" - node = GraphNode( - id="nomodel", - type=NodeType.AGENT, - label="No Model", - position={"x": 0, "y": 0}, - data={"instructions": "Do something."}, - ) - graph = GraphModel(nodes=[node]) - code = generate_python(graph) - - assert _compiles(code) - assert 'name="nomodel"' in code - - -# --------------------------------------------------------------------------- -# Empty graph -# --------------------------------------------------------------------------- - - -class TestEmptyGraph: - def test_empty_graph_produces_valid_code(self) -> None: - graph = GraphModel() - code = generate_python(graph) - - assert _compiles(code) - assert '"""Pipeline generated by Firefly Agentic Studio."""' in code - - def test_empty_graph_has_future_annotations(self) -> None: - graph = GraphModel() - code = generate_python(graph) - - assert "from __future__ import annotations" in code - - -# --------------------------------------------------------------------------- -# Multiple standalone agents (no edges) -# --------------------------------------------------------------------------- - - -class TestMultipleStandaloneAgents: - def test_two_agents_no_edges(self) -> None: - graph = GraphModel( - nodes=[ - _agent_node("a", instructions="Agent A"), - _agent_node("b", instructions="Agent B"), - ], - ) - code = generate_python(graph) - - # No pipeline when there are no edges - assert "PipelineBuilder" not in code - assert "a = FireflyAgent(" in code - assert "b = FireflyAgent(" in code - assert _compiles(code) diff --git a/tests/test_studio/test_codegen_models.py b/tests/test_studio/test_codegen_models.py deleted file mode 100644 index 4db9eda1..00000000 --- a/tests/test_studio/test_codegen_models.py +++ /dev/null @@ -1,210 +0,0 @@ -"""Tests for studio code-generation graph IR models.""" - -from __future__ import annotations - -from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - NodeType, -) - -# --------------------------------------------------------------------------- -# NodeType enum -# --------------------------------------------------------------------------- - - -class TestNodeType: - def test_has_exactly_twelve_members(self) -> None: - assert len(NodeType) == 12 - - def test_expected_members(self) -> None: - expected = { - "agent", - "tool", - "reasoning", - "pipeline_step", - "fan_out", - "fan_in", - "condition", - "memory", - "validator", - "custom_code", - "input", - "output", - } - assert {m.value for m in NodeType} == expected - - def test_is_str_enum(self) -> None: - # StrEnum members should be usable directly as strings. - assert NodeType.AGENT == "agent" - assert isinstance(NodeType.TOOL, str) - - -# --------------------------------------------------------------------------- -# GraphNode -# --------------------------------------------------------------------------- - - -class TestGraphNode: - def test_creation_with_all_fields(self) -> None: - node = GraphNode( - id="node-1", - type=NodeType.AGENT, - label="My Agent", - position={"x": 100.0, "y": 200.0}, - data={"model": "gpt-4"}, - width=200.0, - height=80.0, - ) - assert node.id == "node-1" - assert node.type is NodeType.AGENT - assert node.label == "My Agent" - assert node.position == {"x": 100.0, "y": 200.0} - assert node.data == {"model": "gpt-4"} - assert node.width == 200.0 - assert node.height == 80.0 - - def test_width_and_height_default_to_none(self) -> None: - node = GraphNode( - id="node-2", - type=NodeType.TOOL, - label="Search", - position={"x": 0, "y": 0}, - data={}, - ) - assert node.width is None - assert node.height is None - - def test_type_accepts_string_value(self) -> None: - """NodeType should be coerced from its string value.""" - node = GraphNode( - id="node-3", - type="reasoning", - label="Thinker", - position={"x": 50, "y": 50}, - data={"depth": 3}, - ) - assert node.type is NodeType.REASONING - - -# --------------------------------------------------------------------------- -# GraphEdge -# --------------------------------------------------------------------------- - - -class TestGraphEdge: - def test_creation_with_defaults(self) -> None: - edge = GraphEdge(id="edge-1", source="node-1", target="node-2") - assert edge.id == "edge-1" - assert edge.source == "node-1" - assert edge.target == "node-2" - assert edge.source_handle == "output" - assert edge.target_handle == "input" - assert edge.label is None - - def test_creation_with_all_fields(self) -> None: - edge = GraphEdge( - id="edge-2", - source="a", - target="b", - source_handle="out_1", - target_handle="in_1", - label="on_success", - ) - assert edge.source_handle == "out_1" - assert edge.target_handle == "in_1" - assert edge.label == "on_success" - - -# --------------------------------------------------------------------------- -# GraphModel -# --------------------------------------------------------------------------- - - -class TestGraphModel: - def test_empty_graph(self) -> None: - graph = GraphModel() - assert graph.nodes == [] - assert graph.edges == [] - assert graph.metadata == {} - - def test_serialization_round_trip(self) -> None: - node = GraphNode( - id="n1", - type=NodeType.PIPELINE_STEP, - label="Step 1", - position={"x": 10, "y": 20}, - data={"timeout": 30}, - ) - edge = GraphEdge(id="e1", source="n1", target="n2") - graph = GraphModel( - nodes=[node], - edges=[edge], - metadata={"version": "1.0"}, - ) - - dumped = graph.model_dump() - restored = GraphModel.model_validate(dumped) - - assert restored == graph - assert restored.nodes[0].type is NodeType.PIPELINE_STEP - assert restored.metadata["version"] == "1.0" - - def test_multiple_nodes_and_edges(self) -> None: - nodes = [ - GraphNode( - id="a", - type=NodeType.AGENT, - label="Agent A", - position={"x": 0, "y": 0}, - data={}, - ), - GraphNode( - id="b", - type=NodeType.TOOL, - label="Tool B", - position={"x": 100, "y": 0}, - data={"name": "search"}, - ), - GraphNode( - id="c", - type=NodeType.CONDITION, - label="Check", - position={"x": 200, "y": 0}, - data={"expr": "result.ok"}, - ), - ] - edges = [ - GraphEdge(id="e1", source="a", target="b"), - GraphEdge(id="e2", source="b", target="c", label="next"), - ] - graph = GraphModel(nodes=nodes, edges=edges) - - assert len(graph.nodes) == 3 - assert len(graph.edges) == 2 - assert graph.edges[1].label == "next" - - def test_json_round_trip(self) -> None: - """model_dump_json / model_validate_json should also round-trip.""" - graph = GraphModel( - nodes=[ - GraphNode( - id="x", - type=NodeType.FAN_OUT, - label="Scatter", - position={"x": 5, "y": 5}, - data={"parallelism": 4}, - width=120, - height=60, - ), - ], - edges=[], - metadata={"author": "test"}, - ) - - json_str = graph.model_dump_json() - restored = GraphModel.model_validate_json(json_str) - - assert restored == graph - assert restored.nodes[0].width == 120 diff --git a/tests/test_studio/test_compiler.py b/tests/test_studio/test_compiler.py deleted file mode 100644 index d6685669..00000000 --- a/tests/test_studio/test_compiler.py +++ /dev/null @@ -1,1132 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Comprehensive tests for the Studio graph-to-engine compiler.""" - -from __future__ import annotations - -from unittest.mock import AsyncMock, MagicMock, patch - -import pytest - -from fireflyframework_agentic.agents.registry import agent_registry -from fireflyframework_agentic.pipeline.context import PipelineContext -from fireflyframework_agentic.pipeline.engine import PipelineEngine -from fireflyframework_agentic.pipeline.steps import ( - AgentStep, - BranchStep, - CallableStep, - FanInStep, - FanOutStep, - ReasoningStep, -) -from fireflyframework_agentic.reasoning.registry import reasoning_registry -from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - NodeType, -) -from fireflyframework_agentic.studio.execution.compiler import ( - CompilationError, - compile_graph, -) -from fireflyframework_agentic.tools.registry import tool_registry - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - -_POS = {"x": 0.0, "y": 0.0} - - -def _make_graph( - nodes: list[GraphNode], - edges: list[GraphEdge] | None = None, - metadata: dict | None = None, -) -> GraphModel: - return GraphModel( - nodes=nodes, - edges=edges or [], - metadata=metadata or {}, - ) - - -def _make_node( - node_id: str, - node_type: NodeType, - label: str = "test-node", - data: dict | None = None, -) -> GraphNode: - return GraphNode( - id=node_id, - type=node_type, - label=label, - position=_POS, - data=data or {}, - ) - - -def _mock_agent(name: str = "mock-agent") -> MagicMock: - """Create a mock agent that satisfies the AgentLike protocol.""" - agent = MagicMock() - agent.name = name - mock_result = MagicMock() - mock_result.output = f"output from {name}" - agent.run = AsyncMock(return_value=mock_result) - return agent - - -def _mock_tool(name: str = "mock-tool") -> MagicMock: - """Create a mock tool that satisfies the ToolProtocol.""" - tool = MagicMock() - tool.name = name - tool.description = f"Mock {name}" - tool.execute = AsyncMock(return_value=f"result from {name}") - return tool - - -def _mock_pattern(name: str = "mock-pattern") -> MagicMock: - """Create a mock reasoning pattern.""" - pattern = MagicMock() - mock_result = MagicMock() - mock_result.output = f"reasoning output from {name}" - pattern.execute = AsyncMock(return_value=mock_result) - return pattern - - -# --------------------------------------------------------------------------- -# CompilationError on empty / invalid graphs -# --------------------------------------------------------------------------- - - -class TestCompilationErrorCases: - def test_empty_graph_raises(self): - graph = GraphModel(nodes=[], edges=[]) - with pytest.raises(CompilationError, match="no nodes"): - compile_graph(graph) - - def test_unsupported_node_type_raises(self): - """A node whose type is absent from the dispatch table raises.""" - node = _make_node("n1", NodeType.AGENT, data={}) - graph = _make_graph([node]) - - # Temporarily replace the dispatch table to simulate an unsupported type - with ( - patch( - "fireflyframework_agentic.studio.execution.compiler._NODE_COMPILERS", - {}, - ), - pytest.raises(CompilationError, match="Unsupported node type"), - ): - compile_graph(graph) - - -# --------------------------------------------------------------------------- -# AGENT node compilation -# --------------------------------------------------------------------------- - - -class TestCompileAgentNode: - def test_agent_from_registry(self): - """When the agent is already registered, use the registered instance.""" - mock = _mock_agent("my-agent") - agent_registry._agents["my-agent"] = mock - - node = _make_node("a1", NodeType.AGENT, label="my-agent", data={"agent_name": "my-agent"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - # The DAG node's step should be an AgentStep wrapping our mock - dag_node = engine._dag.nodes["a1"] - assert isinstance(dag_node.step, AgentStep) - - def test_agent_created_dynamically_with_model(self): - """When the agent is not registered, a dynamic FireflyAgent is created.""" - node = _make_node( - "a2", - NodeType.AGENT, - label="Dynamic Agent", - data={"model": "openai:gpt-4o", "instructions": "Be concise."}, - ) - graph = _make_graph([node]) - - with patch( - "fireflyframework_agentic.agents.base.FireflyAgent", - ) as mock_firefly_agent: - mock_instance = MagicMock() - mock_firefly_agent.return_value = mock_instance - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - mock_firefly_agent.assert_called_once_with( - name="Dynamic Agent", - model="openai:gpt-4o", - instructions="Be concise.", - auto_register=False, - ) - - def test_agent_without_model_or_registry_raises(self): - """AGENT node without a 'model' and not in registry raises.""" - node = _make_node("a3", NodeType.AGENT, label="nomodel", data={}) - graph = _make_graph([node]) - - with pytest.raises(CompilationError, match="requires a 'model'"): - compile_graph(graph) - - def test_agent_name_falls_back_to_label(self): - """When 'agent_name' is absent from data, the node label is used.""" - node = _make_node( - "a4", - NodeType.AGENT, - label="Agent Label", - data={"model": "openai:gpt-4o"}, - ) - graph = _make_graph([node]) - - with patch( - "fireflyframework_agentic.agents.base.FireflyAgent", - ) as mock_firefly_agent: - mock_firefly_agent.return_value = MagicMock() - compile_graph(graph) - - mock_firefly_agent.assert_called_once_with( - name="Agent Label", - model="openai:gpt-4o", - instructions="", - auto_register=False, - ) - - -# --------------------------------------------------------------------------- -# TOOL node compilation -# --------------------------------------------------------------------------- - - -class TestCompileToolNode: - def test_tool_from_registry(self): - mock = _mock_tool("search") - tool_registry._tools["search"] = mock - - node = _make_node("t1", NodeType.TOOL, data={"tool_name": "search"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - dag_node = engine._dag.nodes["t1"] - assert isinstance(dag_node.step, CallableStep) - - def test_tool_missing_tool_name_raises(self): - node = _make_node("t2", NodeType.TOOL, data={}) - graph = _make_graph([node]) - - with pytest.raises(CompilationError, match="requires 'tool_name'"): - compile_graph(graph) - - def test_tool_not_registered_raises(self): - node = _make_node("t3", NodeType.TOOL, data={"tool_name": "nonexistent"}) - graph = _make_graph([node]) - - with pytest.raises(CompilationError, match="is not registered"): - compile_graph(graph) - - async def test_tool_step_calls_tool_execute(self): - """The compiled TOOL step delegates to tool.execute with inputs.""" - mock = _mock_tool("calc") - tool_registry._tools["calc"] = mock - - node = _make_node("t4", NodeType.TOOL, data={"tool_name": "calc"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - - step = engine._dag.nodes["t4"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"x": 1, "y": 2}) - - mock.execute.assert_awaited_once_with(x=1, y=2) - assert result == "result from calc" - - -# --------------------------------------------------------------------------- -# REASONING node compilation -# --------------------------------------------------------------------------- - - -class TestCompileReasoningNode: - def test_reasoning_from_registries(self): - mock_agent = _mock_agent("reasoner") - mock_pattern = _mock_pattern("chain_of_thought") - agent_registry._agents["reasoner"] = mock_agent - reasoning_registry._patterns["chain_of_thought"] = mock_pattern - - node = _make_node( - "r1", - NodeType.REASONING, - data={"pattern_name": "chain_of_thought", "agent_name": "reasoner"}, - ) - graph = _make_graph([node]) - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - dag_node = engine._dag.nodes["r1"] - assert isinstance(dag_node.step, ReasoningStep) - - def test_reasoning_missing_pattern_name_raises(self): - node = _make_node("r2", NodeType.REASONING, data={"agent_name": "a"}) - graph = _make_graph([node]) - - with pytest.raises(CompilationError, match="requires 'pattern_name'"): - compile_graph(graph) - - def test_reasoning_missing_agent_name_raises(self): - node = _make_node("r3", NodeType.REASONING, data={"pattern_name": "cot"}) - graph = _make_graph([node]) - - with pytest.raises(CompilationError, match="requires 'agent_name'"): - compile_graph(graph) - - def test_reasoning_unregistered_pattern_raises(self): - node = _make_node( - "r4", - NodeType.REASONING, - data={"pattern_name": "missing", "agent_name": "a"}, - ) - graph = _make_graph([node]) - - with pytest.raises(CompilationError, match="is not registered"): - compile_graph(graph) - - def test_reasoning_unregistered_agent_raises(self): - # Register pattern but not agent - reasoning_registry._patterns["cot"] = _mock_pattern("cot") - - node = _make_node( - "r5", - NodeType.REASONING, - data={"pattern_name": "cot", "agent_name": "missing_agent"}, - ) - graph = _make_graph([node]) - - with pytest.raises(CompilationError, match="is not registered"): - compile_graph(graph) - - -# --------------------------------------------------------------------------- -# PIPELINE_STEP node compilation -# --------------------------------------------------------------------------- - - -class TestCompilePipelineStepNode: - def test_pipeline_step_compiles(self): - node = _make_node("ps1", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["ps1"].step, CallableStep) - - async def test_pipeline_step_passthrough_with_input(self): - """The PIPELINE_STEP pass-through returns 'input' from inputs dict.""" - node = _make_node("ps2", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["ps2"].step - ctx = PipelineContext(inputs="fallback") - result = await step.execute(ctx, {"input": "hello"}) - assert result == "hello" - - async def test_pipeline_step_passthrough_falls_back_to_context(self): - """When 'input' key is absent, falls back to context.inputs.""" - node = _make_node("ps3", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["ps3"].step - ctx = PipelineContext(inputs="ctx-fallback") - result = await step.execute(ctx, {}) - assert result == "ctx-fallback" - - -# --------------------------------------------------------------------------- -# FAN_OUT node compilation -# --------------------------------------------------------------------------- - - -class TestCompileFanOutNode: - def test_fan_out_compiles(self): - node = _make_node("fo1", NodeType.FAN_OUT, data={"split_expression": "items"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["fo1"].step, FanOutStep) - - async def test_fan_out_splits_by_field(self): - node = _make_node("fo2", NodeType.FAN_OUT, data={"split_expression": "items"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["fo2"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": {"items": [1, 2, 3]}}) - assert result == [1, 2, 3] - - async def test_fan_out_wraps_non_list_field(self): - node = _make_node("fo3", NodeType.FAN_OUT, data={"split_expression": "key"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["fo3"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": {"key": "single"}}) - assert result == ["single"] - - async def test_fan_out_splits_list_input_no_expression(self): - node = _make_node("fo4", NodeType.FAN_OUT, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["fo4"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": [10, 20, 30]}) - assert result == [10, 20, 30] - - async def test_fan_out_wraps_scalar_input(self): - node = _make_node("fo5", NodeType.FAN_OUT, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["fo5"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": "scalar"}) - assert result == ["scalar"] - - -# --------------------------------------------------------------------------- -# FAN_IN node compilation -# --------------------------------------------------------------------------- - - -class TestCompileFanInNode: - def test_fan_in_compiles(self): - node = _make_node("fi1", NodeType.FAN_IN, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["fi1"].step, FanInStep) - - async def test_fan_in_collect_default(self): - node = _make_node("fi2", NodeType.FAN_IN, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["fi2"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"a": 1, "b": 2, "c": 3}) - assert result == [1, 2, 3] - - async def test_fan_in_concat_flattens_lists(self): - node = _make_node("fi3", NodeType.FAN_IN, data={"merge_expression": "concat"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["fi3"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"a": [1, 2], "b": [3, 4]}) - assert result == [1, 2, 3, 4] - - async def test_fan_in_concat_appends_non_list(self): - node = _make_node("fi4", NodeType.FAN_IN, data={"merge_expression": "concat"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["fi4"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"a": [1], "b": "scalar"}) - assert result == [1, "scalar"] - - async def test_fan_in_explicit_collect(self): - """Explicit 'collect' merge_expression behaves same as default.""" - node = _make_node("fi5", NodeType.FAN_IN, data={"merge_expression": "collect"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["fi5"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"x": "a", "y": "b"}) - assert result == ["a", "b"] - - -# --------------------------------------------------------------------------- -# CONDITION node compilation -# --------------------------------------------------------------------------- - - -class TestCompileConditionNode: - def test_condition_compiles(self): - node = _make_node( - "c1", - NodeType.CONDITION, - data={ - "condition": "status", - "branches": {"ok": "happy", "err": "sad"}, - }, - ) - graph = _make_graph([node]) - engine = compile_graph(graph) - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["c1"].step, BranchStep) - - def test_condition_missing_branches_raises(self): - node = _make_node("c2", NodeType.CONDITION, data={"condition": "status"}) - graph = _make_graph([node]) - with pytest.raises(CompilationError, match="requires 'branches'"): - compile_graph(graph) - - def test_condition_empty_branches_raises(self): - node = _make_node( - "c3", - NodeType.CONDITION, - data={"condition": "status", "branches": {}}, - ) - graph = _make_graph([node]) - with pytest.raises(CompilationError, match="requires 'branches'"): - compile_graph(graph) - - async def test_condition_routes_correctly(self): - node = _make_node( - "c4", - NodeType.CONDITION, - data={ - "condition": "status", - "branches": {"ok": "happy_path", "err": "error_path"}, - }, - ) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["c4"].step - ctx = PipelineContext(inputs=None) - - result = await step.execute(ctx, {"status": "ok"}) - assert result == "happy_path" - - result = await step.execute(ctx, {"status": "err"}) - assert result == "error_path" - - async def test_condition_returns_default_for_unknown_value(self): - node = _make_node( - "c5", - NodeType.CONDITION, - data={ - "condition": "status", - "branches": {"ok": "happy_path", "err": "error_path"}, - }, - ) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["c5"].step - ctx = PipelineContext(inputs=None) - - # Unknown value falls back to the first branch value - result = await step.execute(ctx, {"status": "unknown"}) - assert result == "happy_path" - - async def test_condition_uses_default_condition_key(self): - """When 'condition' is not set in data, defaults to 'input'.""" - node = _make_node( - "c6", - NodeType.CONDITION, - data={"branches": {"yes": "accept", "no": "reject"}}, - ) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["c6"].step - ctx = PipelineContext(inputs=None) - - result = await step.execute(ctx, {"input": "yes"}) - assert result == "accept" - - -# --------------------------------------------------------------------------- -# MEMORY node compilation -# --------------------------------------------------------------------------- - - -class TestCompileMemoryNode: - def test_memory_compiles(self): - node = _make_node("m1", NodeType.MEMORY, data={"memory_action": "store"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["m1"].step, CallableStep) - - async def test_memory_store_action(self): - node = _make_node("m2", NodeType.MEMORY, data={"memory_action": "store"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["m2"].step - - mock_memory = MagicMock() - ctx = PipelineContext(inputs=None, memory=mock_memory) - - result = await step.execute(ctx, {"key": "my_key", "input": "my_value"}) - assert result == "my_value" - mock_memory.set_fact.assert_called_once_with("my_key", "my_value") - - async def test_memory_retrieve_action(self): - node = _make_node("m3", NodeType.MEMORY, data={"memory_action": "retrieve"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["m3"].step - - mock_memory = MagicMock() - mock_memory.get_fact.return_value = "stored_value" - ctx = PipelineContext(inputs=None, memory=mock_memory) - - result = await step.execute(ctx, {"key": "my_key"}) - assert result == "stored_value" - mock_memory.get_fact.assert_called_once_with("my_key") - - async def test_memory_clear_action(self): - node = _make_node("m4", NodeType.MEMORY, data={"memory_action": "clear"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["m4"].step - - mock_memory = MagicMock() - ctx = PipelineContext(inputs=None, memory=mock_memory) - - result = await step.execute(ctx, {"key": "my_key"}) - assert result is None - mock_memory.working.delete.assert_called_once_with("my_key") - - async def test_memory_no_manager_returns_input(self): - node = _make_node("m5", NodeType.MEMORY, data={"memory_action": "store"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["m5"].step - - ctx = PipelineContext(inputs=None, memory=None) - result = await step.execute(ctx, {"input": "fallback_value"}) - assert result == "fallback_value" - - async def test_memory_default_action_is_retrieve(self): - node = _make_node("m6", NodeType.MEMORY, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["m6"].step - - mock_memory = MagicMock() - mock_memory.get_fact.return_value = "retrieved" - ctx = PipelineContext(inputs=None, memory=mock_memory) - - result = await step.execute(ctx, {"key": "k"}) - assert result == "retrieved" - - async def test_memory_store_with_value_key(self): - """The store action can also read from 'value' key when 'input' is absent.""" - node = _make_node("m7", NodeType.MEMORY, data={"memory_action": "store"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["m7"].step - - mock_memory = MagicMock() - ctx = PipelineContext(inputs=None, memory=mock_memory) - - result = await step.execute(ctx, {"key": "k", "value": "from_value"}) - assert result == "from_value" - mock_memory.set_fact.assert_called_once_with("k", "from_value") - - -# --------------------------------------------------------------------------- -# VALIDATOR node compilation -# --------------------------------------------------------------------------- - - -class TestCompileValidatorNode: - def test_validator_compiles(self): - node = _make_node("v1", NodeType.VALIDATOR, data={"validation_rule": "not_empty"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["v1"].step, CallableStep) - - async def test_validator_not_empty_passes(self): - node = _make_node("v2", NodeType.VALIDATOR, data={"validation_rule": "not_empty"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v2"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": "something"}) - assert result == "something" - - async def test_validator_not_empty_fails(self): - node = _make_node("v3", NodeType.VALIDATOR, data={"validation_rule": "not_empty"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v3"].step - ctx = PipelineContext(inputs=None) - with pytest.raises(ValueError, match="value is empty"): - await step.execute(ctx, {"input": ""}) - - async def test_validator_is_string_passes(self): - node = _make_node("v4", NodeType.VALIDATOR, data={"validation_rule": "is_string"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v4"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": "hello"}) - assert result == "hello" - - async def test_validator_is_string_fails(self): - node = _make_node("v5", NodeType.VALIDATOR, data={"validation_rule": "is_string"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v5"].step - ctx = PipelineContext(inputs=None) - with pytest.raises(TypeError, match="expected string"): - await step.execute(ctx, {"input": 42}) - - async def test_validator_is_list_passes(self): - node = _make_node("v6", NodeType.VALIDATOR, data={"validation_rule": "is_list"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v6"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": [1, 2, 3]}) - assert result == [1, 2, 3] - - async def test_validator_is_list_fails(self): - node = _make_node("v7", NodeType.VALIDATOR, data={"validation_rule": "is_list"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v7"].step - ctx = PipelineContext(inputs=None) - with pytest.raises(TypeError, match="expected list"): - await step.execute(ctx, {"input": "not-a-list"}) - - async def test_validator_is_dict_passes(self): - node = _make_node("v8", NodeType.VALIDATOR, data={"validation_rule": "is_dict"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v8"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": {"a": 1}}) - assert result == {"a": 1} - - async def test_validator_is_dict_fails(self): - node = _make_node("v9", NodeType.VALIDATOR, data={"validation_rule": "is_dict"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v9"].step - ctx = PipelineContext(inputs=None) - with pytest.raises(TypeError, match="expected dict"): - await step.execute(ctx, {"input": "not-a-dict"}) - - async def test_validator_custom_key_rule_passes(self): - node = _make_node("v10", NodeType.VALIDATOR, data={"validation_rule": "name"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v10"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": {"name": "Alice"}}) - assert result == {"name": "Alice"} - - async def test_validator_custom_key_rule_fails(self): - node = _make_node("v11", NodeType.VALIDATOR, data={"validation_rule": "name"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v11"].step - ctx = PipelineContext(inputs=None) - with pytest.raises(KeyError, match="key 'name' missing"): - await step.execute(ctx, {"input": {"age": 30}}) - - async def test_validator_no_rule_passes_through(self): - node = _make_node("v12", NodeType.VALIDATOR, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["v12"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": "anything"}) - assert result == "anything" - - -# --------------------------------------------------------------------------- -# CUSTOM_CODE node compilation -# --------------------------------------------------------------------------- - - -class TestCompileCustomCodeNode: - def test_custom_code_compiles(self): - code = "async def execute(context, inputs):\n return inputs.get('input', 'default')\n" - node = _make_node("cc1", NodeType.CUSTOM_CODE, data={"code": code}) - graph = _make_graph([node]) - engine = compile_graph(graph) - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["cc1"].step, CallableStep) - - async def test_custom_code_executes_correctly(self): - code = "async def execute(context, inputs):\n return inputs.get('input', '') + ' processed'\n" - node = _make_node("cc2", NodeType.CUSTOM_CODE, data={"code": code}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["cc2"].step - ctx = PipelineContext(inputs=None) - result = await step.execute(ctx, {"input": "data"}) - assert result == "data processed" - - def test_custom_code_missing_code_raises(self): - node = _make_node("cc3", NodeType.CUSTOM_CODE, data={}) - graph = _make_graph([node]) - with pytest.raises(CompilationError, match="requires 'code'"): - compile_graph(graph) - - def test_custom_code_empty_string_raises(self): - node = _make_node("cc4", NodeType.CUSTOM_CODE, data={"code": ""}) - graph = _make_graph([node]) - with pytest.raises(CompilationError, match="requires 'code'"): - compile_graph(graph) - - def test_custom_code_syntax_error_raises(self): - node = _make_node("cc5", NodeType.CUSTOM_CODE, data={"code": "def bad(:"}) - graph = _make_graph([node]) - with pytest.raises(CompilationError, match="Syntax error"): - compile_graph(graph) - - def test_custom_code_missing_execute_function_raises(self): - code = "def helper():\n return 42\n" - node = _make_node("cc6", NodeType.CUSTOM_CODE, data={"code": code}) - graph = _make_graph([node]) - with pytest.raises(CompilationError, match="must define"): - compile_graph(graph) - - def test_custom_code_non_callable_execute_raises(self): - code = "execute = 'not a function'\n" - node = _make_node("cc7", NodeType.CUSTOM_CODE, data={"code": code}) - graph = _make_graph([node]) - with pytest.raises(CompilationError, match="must define"): - compile_graph(graph) - - async def test_custom_code_can_access_context(self): - """Custom code can read context.inputs.""" - code = "async def execute(context, inputs):\n return f'ctx={context.inputs}'\n" - node = _make_node("cc8", NodeType.CUSTOM_CODE, data={"code": code}) - graph = _make_graph([node]) - engine = compile_graph(graph) - step = engine._dag.nodes["cc8"].step - ctx = PipelineContext(inputs="original") - result = await step.execute(ctx, {}) - assert result == "ctx=original" - - -# --------------------------------------------------------------------------- -# Edge wiring -# --------------------------------------------------------------------------- - - -class TestEdgeWiring: - def test_single_edge(self): - n1 = _make_node("n1", NodeType.PIPELINE_STEP, data={}) - n2 = _make_node("n2", NodeType.PIPELINE_STEP, data={}) - edge = GraphEdge(id="e1", source="n1", target="n2") - graph = _make_graph([n1, n2], [edge]) - - engine = compile_graph(graph) - dag = engine._dag - assert len(dag.edges) == 1 - assert dag.edges[0].source == "n1" - assert dag.edges[0].target == "n2" - - def test_multiple_edges(self): - n1 = _make_node("n1", NodeType.PIPELINE_STEP, data={}) - n2 = _make_node("n2", NodeType.PIPELINE_STEP, data={}) - n3 = _make_node("n3", NodeType.PIPELINE_STEP, data={}) - edges = [ - GraphEdge(id="e1", source="n1", target="n2"), - GraphEdge(id="e2", source="n1", target="n3"), - ] - graph = _make_graph([n1, n2, n3], edges) - - engine = compile_graph(graph) - dag = engine._dag - assert len(dag.edges) == 2 - assert set(dag.successors("n1")) == {"n2", "n3"} - - def test_edge_handles_passed_through(self): - """source_handle and target_handle from GraphEdge map to DAGEdge keys.""" - n1 = _make_node("n1", NodeType.PIPELINE_STEP, data={}) - n2 = _make_node("n2", NodeType.PIPELINE_STEP, data={}) - edge = GraphEdge( - id="e1", - source="n1", - target="n2", - source_handle="result", - target_handle="prompt", - ) - graph = _make_graph([n1, n2], [edge]) - - engine = compile_graph(graph) - dag = engine._dag - dag_edge = dag.edges[0] - assert dag_edge.output_key == "result" - assert dag_edge.input_key == "prompt" - - def test_default_edge_handles(self): - n1 = _make_node("n1", NodeType.PIPELINE_STEP, data={}) - n2 = _make_node("n2", NodeType.PIPELINE_STEP, data={}) - edge = GraphEdge(id="e1", source="n1", target="n2") - graph = _make_graph([n1, n2], [edge]) - - engine = compile_graph(graph) - dag = engine._dag - dag_edge = dag.edges[0] - assert dag_edge.output_key == "output" - assert dag_edge.input_key == "input" - - def test_chain_of_three_nodes(self): - nodes = [ - _make_node("a", NodeType.PIPELINE_STEP, data={}), - _make_node("b", NodeType.PIPELINE_STEP, data={}), - _make_node("c", NodeType.PIPELINE_STEP, data={}), - ] - edges = [ - GraphEdge(id="e1", source="a", target="b"), - GraphEdge(id="e2", source="b", target="c"), - ] - graph = _make_graph(nodes, edges) - - engine = compile_graph(graph) - dag = engine._dag - topo = dag.topological_sort() - assert topo.index("a") < topo.index("b") < topo.index("c") - - def test_diamond_topology(self): - """A -> B, A -> C, B -> D, C -> D.""" - nodes = [ - _make_node("a", NodeType.PIPELINE_STEP, data={}), - _make_node("b", NodeType.PIPELINE_STEP, data={}), - _make_node("c", NodeType.PIPELINE_STEP, data={}), - _make_node("d", NodeType.PIPELINE_STEP, data={}), - ] - edges = [ - GraphEdge(id="e1", source="a", target="b"), - GraphEdge(id="e2", source="a", target="c"), - GraphEdge(id="e3", source="b", target="d"), - GraphEdge(id="e4", source="c", target="d"), - ] - graph = _make_graph(nodes, edges) - - engine = compile_graph(graph) - dag = engine._dag - assert len(dag.nodes) == 4 - assert len(dag.edges) == 4 - topo = dag.topological_sort() - assert topo.index("a") < topo.index("b") - assert topo.index("a") < topo.index("c") - assert topo.index("b") < topo.index("d") - assert topo.index("c") < topo.index("d") - - -# --------------------------------------------------------------------------- -# Graph metadata -# --------------------------------------------------------------------------- - - -class TestGraphMetadata: - def test_pipeline_name_from_metadata(self): - node = _make_node("n1", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node], metadata={"name": "my-custom-pipeline"}) - - engine = compile_graph(graph) - assert engine._dag.name == "my-custom-pipeline" - - def test_default_pipeline_name(self): - node = _make_node("n1", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - - engine = compile_graph(graph) - assert engine._dag.name == "studio-pipeline" - - -# --------------------------------------------------------------------------- -# Event handler propagation -# --------------------------------------------------------------------------- - - -class TestEventHandlerPropagation: - def test_event_handler_is_set(self): - node = _make_node("n1", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - - mock_handler = MagicMock() - engine = compile_graph(graph, event_handler=mock_handler) - assert engine._event_handler is mock_handler - - def test_no_event_handler_by_default(self): - node = _make_node("n1", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - - engine = compile_graph(graph) - assert engine._event_handler is None - - -# --------------------------------------------------------------------------- -# Integration: compile and run graphs end-to-end -# --------------------------------------------------------------------------- - - -class TestIntegrationCompileAndRun: - async def test_agent_to_pipeline_step(self): - """End-to-end: compile a two-node graph and run it with a mocked agent.""" - mock = _mock_agent("test-agent") - agent_registry._agents["test-agent"] = mock - - agent_node = _make_node( - "agent1", - NodeType.AGENT, - label="test-agent", - data={"agent_name": "test-agent"}, - ) - step_node = _make_node("step1", NodeType.PIPELINE_STEP, data={}) - edge = GraphEdge(id="e1", source="agent1", target="step1") - graph = _make_graph([agent_node, step_node], [edge]) - - engine = compile_graph(graph) - result = await engine.run(inputs="hello") - - assert result.success is True - assert "agent1" in result.outputs - assert result.outputs["agent1"].success is True - assert result.outputs["agent1"].output == "output from test-agent" - assert "step1" in result.outputs - assert result.outputs["step1"].success is True - # step1 receives agent1's output via the edge - assert result.outputs["step1"].output == "output from test-agent" - - async def test_single_pipeline_step(self): - """Simplest possible pipeline: one PIPELINE_STEP node with no edges.""" - node = _make_node("solo", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - engine = compile_graph(graph) - - result = await engine.run(inputs="test input") - assert result.success is True - assert result.outputs["solo"].output == "test input" - - async def test_custom_code_end_to_end(self): - """Compile and run a graph with a CUSTOM_CODE node.""" - code = ( - "async def execute(context, inputs):\n" - " val = inputs.get('input', '')\n" - " return val.upper() if isinstance(val, str) else val\n" - ) - node = _make_node("upper", NodeType.CUSTOM_CODE, data={"code": code}) - graph = _make_graph([node]) - engine = compile_graph(graph) - - result = await engine.run(inputs="hello world") - assert result.success is True - assert result.outputs["upper"].output == "HELLO WORLD" - - async def test_fan_out_fan_in_end_to_end(self): - """Compile a FAN_OUT -> FAN_IN pair and verify the round-trip.""" - fo_node = _make_node("scatter", NodeType.FAN_OUT, data={}) - fi_node = _make_node("gather", NodeType.FAN_IN, data={}) - edge = GraphEdge(id="e1", source="scatter", target="gather") - graph = _make_graph([fo_node, fi_node], [edge]) - - engine = compile_graph(graph) - result = await engine.run(inputs=[1, 2, 3]) - - assert result.success is True - assert result.outputs["scatter"].output == [1, 2, 3] - # FAN_IN collects its upstream outputs into a list - assert result.outputs["gather"].output == [[1, 2, 3]] - - async def test_validator_passes_end_to_end(self): - """Compile and run with a validator that should pass.""" - node = _make_node("val", NodeType.VALIDATOR, data={"validation_rule": "not_empty"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - - result = await engine.run(inputs="non-empty") - assert result.success is True - assert result.outputs["val"].output == "non-empty" - - async def test_validator_fails_end_to_end(self): - """Compile and run with a validator that should fail.""" - node = _make_node("val", NodeType.VALIDATOR, data={"validation_rule": "not_empty"}) - graph = _make_graph([node]) - engine = compile_graph(graph) - - result = await engine.run(inputs="") - # The validator raises, which the engine catches as a node failure - assert result.outputs["val"].success is False - assert "value is empty" in result.outputs["val"].error - - async def test_pipeline_step_chain_end_to_end(self): - """Chain three PIPELINE_STEP nodes and verify data flows through.""" - nodes = [ - _make_node("a", NodeType.PIPELINE_STEP, data={}), - _make_node("b", NodeType.PIPELINE_STEP, data={}), - _make_node("c", NodeType.PIPELINE_STEP, data={}), - ] - edges = [ - GraphEdge(id="e1", source="a", target="b"), - GraphEdge(id="e2", source="b", target="c"), - ] - graph = _make_graph(nodes, edges) - engine = compile_graph(graph) - - result = await engine.run(inputs="chain-data") - assert result.success is True - assert result.outputs["a"].output == "chain-data" - assert result.outputs["b"].output == "chain-data" - assert result.outputs["c"].output == "chain-data" - - -# --------------------------------------------------------------------------- -# Mixed graph: multiple node types with edges -# --------------------------------------------------------------------------- - - -class TestMixedGraph: - def test_compile_graph_with_diverse_node_types(self): - """A graph with PIPELINE_STEP, VALIDATOR, FAN_OUT, FAN_IN, - CONDITION, MEMORY, and CUSTOM_CODE all compiled together.""" - code = "async def execute(context, inputs):\n return inputs\n" - nodes = [ - _make_node("ps", NodeType.PIPELINE_STEP, data={}), - _make_node("val", NodeType.VALIDATOR, data={"validation_rule": "not_empty"}), - _make_node("fo", NodeType.FAN_OUT, data={}), - _make_node("fi", NodeType.FAN_IN, data={}), - _make_node( - "cond", - NodeType.CONDITION, - data={ - "condition": "type", - "branches": {"a": "path_a", "b": "path_b"}, - }, - ), - _make_node("mem", NodeType.MEMORY, data={"memory_action": "retrieve"}), - _make_node("cc", NodeType.CUSTOM_CODE, data={"code": code}), - ] - edges = [ - GraphEdge(id="e1", source="ps", target="val"), - GraphEdge(id="e2", source="val", target="fo"), - GraphEdge(id="e3", source="fo", target="fi"), - GraphEdge(id="e4", source="fi", target="cond"), - GraphEdge(id="e5", source="cond", target="mem"), - GraphEdge(id="e6", source="mem", target="cc"), - ] - graph = _make_graph(nodes, edges) - - engine = compile_graph(graph) - dag = engine._dag - assert len(dag.nodes) == 7 - assert len(dag.edges) == 6 - topo = dag.topological_sort() - assert topo.index("ps") < topo.index("val") < topo.index("fo") - assert topo.index("fo") < topo.index("fi") < topo.index("cond") - assert topo.index("cond") < topo.index("mem") < topo.index("cc") diff --git a/tests/test_studio/test_compiler_io.py b/tests/test_studio/test_compiler_io.py deleted file mode 100644 index fd9338f7..00000000 --- a/tests/test_studio/test_compiler_io.py +++ /dev/null @@ -1,124 +0,0 @@ -"""Tests for Input/Output node compilation.""" - -from __future__ import annotations - -import pytest - -from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - NodeType, -) -from fireflyframework_agentic.studio.execution.compiler import ( - CompilationError, - compile_graph, -) - - -def _input_node(trigger_type: str = "manual", **extra: object) -> GraphNode: - return GraphNode( - id="input_1", - type=NodeType.INPUT, - label="Input", - position={"x": 0, "y": 200}, - data={"trigger_type": trigger_type, **extra}, - ) - - -def _output_node(destination_type: str = "response", **extra: object) -> GraphNode: - return GraphNode( - id="output_1", - type=NodeType.OUTPUT, - label="Output", - position={"x": 900, "y": 200}, - data={"destination_type": destination_type, **extra}, - ) - - -def _step_node(node_id: str = "step_1") -> GraphNode: - """A simple PIPELINE_STEP node that requires no external dependencies.""" - return GraphNode( - id=node_id, - type=NodeType.PIPELINE_STEP, - label="Step", - position={"x": 300, "y": 200}, - data={}, - ) - - -class TestInputOutputCompilation: - def test_input_to_step_to_output_compiles(self): - graph = GraphModel( - nodes=[_input_node(), _step_node(), _output_node()], - edges=[ - GraphEdge(id="e1", source="input_1", target="step_1"), - GraphEdge(id="e2", source="step_1", target="output_1"), - ], - ) - engine = compile_graph(graph) - assert engine is not None - - def test_multiple_input_nodes_raises(self): - graph = GraphModel( - nodes=[ - _input_node(), - GraphNode( - id="input_2", - type=NodeType.INPUT, - label="Input 2", - position={"x": 0, "y": 400}, - data={"trigger_type": "http"}, - ), - _step_node(), - _output_node(), - ], - edges=[ - GraphEdge(id="e1", source="input_1", target="step_1"), - GraphEdge(id="e2", source="input_2", target="step_1"), - GraphEdge(id="e3", source="step_1", target="output_1"), - ], - ) - with pytest.raises(CompilationError, match="exactly one Input node"): - compile_graph(graph) - - def test_no_output_node_raises(self): - graph = GraphModel( - nodes=[_input_node(), _step_node()], - edges=[GraphEdge(id="e1", source="input_1", target="step_1")], - ) - with pytest.raises(CompilationError, match="at least one Output node"): - compile_graph(graph) - - def test_input_node_with_schema_validates(self): - graph = GraphModel( - nodes=[ - _input_node(schema={"type": "object", "properties": {"text": {"type": "string"}}}), - _step_node(), - _output_node(), - ], - edges=[ - GraphEdge(id="e1", source="input_1", target="step_1"), - GraphEdge(id="e2", source="step_1", target="output_1"), - ], - ) - engine = compile_graph(graph) - assert engine is not None - - def test_pipeline_without_io_nodes_still_works(self): - """Backward compatibility: pipelines without IO nodes should still compile.""" - graph = GraphModel( - nodes=[ - _step_node("s1"), - GraphNode( - id="s2", - type=NodeType.PIPELINE_STEP, - label="Step 2", - position={"x": 300, "y": 200}, - data={}, - ), - ], - edges=[GraphEdge(id="e1", source="s1", target="s2")], - ) - engine = compile_graph(graph) - assert engine is not None diff --git a/tests/test_studio/test_config.py b/tests/test_studio/test_config.py deleted file mode 100644 index df33c6bd..00000000 --- a/tests/test_studio/test_config.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Tests for studio configuration.""" - -from __future__ import annotations - -import os -from pathlib import Path - -import pytest - -from fireflyframework_agentic.studio.config import StudioConfig - - -@pytest.fixture(autouse=True) -def _clean_studio_env(monkeypatch: pytest.MonkeyPatch) -> None: - """Clear any ambient FIREFLY_STUDIO_* env vars to isolate tests.""" - for key in list(os.environ): - if key.startswith("FIREFLY_STUDIO_"): - monkeypatch.delenv(key, raising=False) - - -class TestStudioConfigDefaults: - def test_default_host(self) -> None: - cfg = StudioConfig(_env_file=None) - assert cfg.host == "127.0.0.1" - - def test_default_port(self) -> None: - cfg = StudioConfig(_env_file=None) - assert cfg.port == 8470 - - def test_default_open_browser(self) -> None: - cfg = StudioConfig(_env_file=None) - assert cfg.open_browser is True - - def test_default_dev_mode(self) -> None: - cfg = StudioConfig(_env_file=None) - assert cfg.dev_mode is False - - def test_default_projects_dir(self) -> None: - cfg = StudioConfig(_env_file=None) - assert cfg.projects_dir == Path.home() / ".firefly-studio" / "projects" - - def test_default_log_level(self) -> None: - cfg = StudioConfig(_env_file=None) - assert cfg.log_level == "info" - - -class TestStudioConfigEnvOverrides: - def test_host_override(self, monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.setenv("FIREFLY_STUDIO_HOST", "0.0.0.0") - cfg = StudioConfig(_env_file=None) - assert cfg.host == "0.0.0.0" - - def test_port_override(self, monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.setenv("FIREFLY_STUDIO_PORT", "9090") - cfg = StudioConfig(_env_file=None) - assert cfg.port == 9090 - - def test_open_browser_override(self, monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.setenv("FIREFLY_STUDIO_OPEN_BROWSER", "false") - cfg = StudioConfig(_env_file=None) - assert cfg.open_browser is False - - def test_dev_mode_override(self, monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.setenv("FIREFLY_STUDIO_DEV_MODE", "true") - cfg = StudioConfig(_env_file=None) - assert cfg.dev_mode is True - - def test_log_level_override(self, monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.setenv("FIREFLY_STUDIO_LOG_LEVEL", "debug") - cfg = StudioConfig(_env_file=None) - assert cfg.log_level == "debug" - - def test_projects_dir_override(self, monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.setenv("FIREFLY_STUDIO_PROJECTS_DIR", "/tmp/my-projects") - cfg = StudioConfig(_env_file=None) - assert cfg.projects_dir == Path("/tmp/my-projects") diff --git a/tests/test_studio/test_dynamic_model.py b/tests/test_studio/test_dynamic_model.py deleted file mode 100644 index 69379941..00000000 --- a/tests/test_studio/test_dynamic_model.py +++ /dev/null @@ -1,67 +0,0 @@ -"""Tests for dynamic model configuration in The Architect and codegen.""" - -from __future__ import annotations - -import json - -from fireflyframework_agentic.studio.codegen.generator import _get_default_model, generate_python -from fireflyframework_agentic.studio.codegen.models import GraphModel, GraphNode, NodeType - - -class TestDynamicDefaultModel: - def test_get_default_model_reads_settings(self, tmp_path): - settings_file = tmp_path / "settings.json" - settings_file.write_text( - json.dumps( - { - "model_defaults": {"default_model": "anthropic:claude-sonnet-4-20250514"}, - "setup_complete": True, - } - ) - ) - model = _get_default_model(settings_path=settings_file) - assert model == "anthropic:claude-sonnet-4-20250514" - - def test_get_default_model_fallback(self, tmp_path): - model = _get_default_model(settings_path=tmp_path / "nonexistent.json") - assert model == "openai:gpt-4o" - - def test_codegen_uses_settings_model(self, tmp_path): - settings_file = tmp_path / "settings.json" - settings_file.write_text( - json.dumps( - { - "model_defaults": {"default_model": "google-gla:gemini-2.5-flash"}, - } - ) - ) - - node = GraphNode( - id="agent_1", - type=NodeType.AGENT, - label="Agent", - position={"x": 0, "y": 0}, - data={"instructions": "Help the user."}, # No model specified - ) - graph = GraphModel(nodes=[node]) - code = generate_python(graph, settings_path=settings_file) - assert 'model="google-gla:gemini-2.5-flash"' in code - - -class TestArchitectDefaultModel: - def test_architect_instructions_include_default_model(self, tmp_path): - settings_file = tmp_path / "settings.json" - settings_file.write_text( - json.dumps( - { - "model_defaults": {"default_model": "anthropic:claude-sonnet-4-20250514"}, - "user_profile": {"name": "TestUser"}, - "setup_complete": True, - } - ) - ) - - from fireflyframework_agentic.studio.assistant.agent import _build_instructions - - instructions = _build_instructions(settings_path=settings_file) - assert "anthropic:claude-sonnet-4-20250514" in instructions diff --git a/tests/test_studio/test_execution.py b/tests/test_studio/test_execution.py deleted file mode 100644 index 2db39ea5..00000000 --- a/tests/test_studio/test_execution.py +++ /dev/null @@ -1,259 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Studio execution event handler and WebSocket API.""" - -from __future__ import annotations - -import asyncio - -import pytest - -from fireflyframework_agentic.pipeline.engine import PipelineEventHandler -from fireflyframework_agentic.studio.execution.runner import StudioEventHandler - -pytest.importorskip("fastapi", reason="fastapi not installed") - - -# --------------------------------------------------------------------------- -# StudioEventHandler — Protocol compliance -# --------------------------------------------------------------------------- - - -class TestStudioEventHandlerProtocol: - def test_implements_pipeline_event_handler(self): - handler = StudioEventHandler() - assert isinstance(handler, PipelineEventHandler) - - def test_has_on_node_start(self): - handler = StudioEventHandler() - assert callable(getattr(handler, "on_node_start", None)) - - def test_has_on_node_complete(self): - handler = StudioEventHandler() - assert callable(getattr(handler, "on_node_complete", None)) - - def test_has_on_node_error(self): - handler = StudioEventHandler() - assert callable(getattr(handler, "on_node_error", None)) - - def test_has_on_node_skip(self): - handler = StudioEventHandler() - assert callable(getattr(handler, "on_node_skip", None)) - - def test_has_on_pipeline_complete(self): - handler = StudioEventHandler() - assert callable(getattr(handler, "on_pipeline_complete", None)) - - -# --------------------------------------------------------------------------- -# StudioEventHandler — Event collection -# --------------------------------------------------------------------------- - - -class TestStudioEventHandlerCollection: - async def test_on_node_start_collects_event(self): - handler = StudioEventHandler() - await handler.on_node_start("node_1", "my_pipeline") - - events = handler.drain_events() - assert len(events) == 1 - assert events[0]["type"] == "node_start" - assert events[0]["node_id"] == "node_1" - assert events[0]["pipeline_name"] == "my_pipeline" - - async def test_on_node_complete_collects_event(self): - handler = StudioEventHandler() - await handler.on_node_complete("node_1", "my_pipeline", 42.5) - - events = handler.drain_events() - assert len(events) == 1 - assert events[0]["type"] == "node_complete" - assert events[0]["node_id"] == "node_1" - assert events[0]["pipeline_name"] == "my_pipeline" - assert events[0]["latency_ms"] == 42.5 - - async def test_on_node_error_collects_event(self): - handler = StudioEventHandler() - await handler.on_node_error("node_1", "my_pipeline", "something broke") - - events = handler.drain_events() - assert len(events) == 1 - assert events[0]["type"] == "node_error" - assert events[0]["node_id"] == "node_1" - assert events[0]["pipeline_name"] == "my_pipeline" - assert events[0]["error"] == "something broke" - - async def test_on_node_skip_collects_event(self): - handler = StudioEventHandler() - await handler.on_node_skip("node_1", "my_pipeline", "upstream failed") - - events = handler.drain_events() - assert len(events) == 1 - assert events[0]["type"] == "node_skip" - assert events[0]["node_id"] == "node_1" - assert events[0]["pipeline_name"] == "my_pipeline" - assert events[0]["reason"] == "upstream failed" - - async def test_on_pipeline_complete_collects_event(self): - handler = StudioEventHandler() - await handler.on_pipeline_complete("my_pipeline", True, 1234.5) - - events = handler.drain_events() - assert len(events) == 1 - assert events[0]["type"] == "pipeline_complete" - assert events[0]["pipeline_name"] == "my_pipeline" - assert events[0]["success"] is True - assert events[0]["duration_ms"] == 1234.5 - - async def test_multiple_events_collected_in_order(self): - handler = StudioEventHandler() - await handler.on_node_start("a", "pipe") - await handler.on_node_complete("a", "pipe", 10.0) - await handler.on_node_start("b", "pipe") - await handler.on_node_error("b", "pipe", "fail") - - events = handler.drain_events() - assert len(events) == 4 - assert events[0]["type"] == "node_start" - assert events[0]["node_id"] == "a" - assert events[1]["type"] == "node_complete" - assert events[1]["node_id"] == "a" - assert events[2]["type"] == "node_start" - assert events[2]["node_id"] == "b" - assert events[3]["type"] == "node_error" - assert events[3]["node_id"] == "b" - - -# --------------------------------------------------------------------------- -# StudioEventHandler — drain_events -# --------------------------------------------------------------------------- - - -class TestStudioEventHandlerDrain: - async def test_drain_returns_empty_list_when_no_events(self): - handler = StudioEventHandler() - events = handler.drain_events() - assert events == [] - - async def test_drain_clears_queue(self): - handler = StudioEventHandler() - await handler.on_node_start("node_1", "pipe") - - first_drain = handler.drain_events() - assert len(first_drain) == 1 - - second_drain = handler.drain_events() - assert second_drain == [] - - async def test_drain_returns_new_events_after_clear(self): - handler = StudioEventHandler() - await handler.on_node_start("a", "pipe") - handler.drain_events() - - await handler.on_node_start("b", "pipe") - events = handler.drain_events() - assert len(events) == 1 - assert events[0]["node_id"] == "b" - - -# --------------------------------------------------------------------------- -# StudioEventHandler — wait_for_event -# --------------------------------------------------------------------------- - - -class TestStudioEventHandlerWait: - async def test_wait_returns_when_event_available(self): - handler = StudioEventHandler() - - async def _produce(): - await asyncio.sleep(0.05) - await handler.on_node_start("x", "pipe") - - asyncio.create_task(_produce()) - await handler.wait_for_event(timeout=2.0) - events = handler.drain_events() - assert len(events) == 1 - - async def test_wait_times_out_when_no_event(self): - handler = StudioEventHandler() - # Should not raise, just return after timeout - await handler.wait_for_event(timeout=0.05) - events = handler.drain_events() - assert events == [] - - -# --------------------------------------------------------------------------- -# WebSocket endpoint — integration test -# --------------------------------------------------------------------------- - - -class TestExecutionWebSocket: - @pytest.fixture() - def app(self): - from fireflyframework_agentic.studio.server import create_studio_app - - return create_studio_app() - - async def test_websocket_run_with_graph(self, app): - """Test that the WebSocket endpoint compiles and runs a graph, - returning execution events and a pipeline_result.""" - from starlette.testclient import TestClient - - graph = { - "nodes": [ - { - "id": "n1", - "type": "pipeline_step", - "label": "Step 1", - "position": {"x": 0, "y": 0}, - "data": {}, - } - ], - "edges": [], - "metadata": {"name": "test-pipeline"}, - } - client = TestClient(app) - with client.websocket_connect("/ws/execution") as ws: - ws.send_json({"action": "run", "graph": graph, "inputs": "hello"}) - # Collect messages until pipeline_result - messages = [] - for _ in range(20): - msg = ws.receive_json() - messages.append(msg) - if msg["type"] == "pipeline_result": - break - result = messages[-1] - assert result["type"] == "pipeline_result" - assert result["success"] is True - - async def test_websocket_run_missing_graph(self, app): - """Test that a run action without a graph returns an error.""" - from starlette.testclient import TestClient - - client = TestClient(app) - with client.websocket_connect("/ws/execution") as ws: - ws.send_json({"action": "run"}) - data = ws.receive_json() - assert data["type"] == "error" - - async def test_websocket_unknown_action(self, app): - """Test that unknown actions get an error response.""" - from starlette.testclient import TestClient - - client = TestClient(app) - with client.websocket_connect("/ws/execution") as ws: - ws.send_json({"action": "unknown_action"}) - data = ws.receive_json() - assert data["type"] == "error" diff --git a/tests/test_studio/test_graphql.py b/tests/test_studio/test_graphql.py deleted file mode 100644 index 0e87b8a9..00000000 --- a/tests/test_studio/test_graphql.py +++ /dev/null @@ -1,230 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the GraphQL API endpoint.""" - -from __future__ import annotations - -from pathlib import Path - -import pytest - -strawberry = pytest.importorskip("strawberry", reason="strawberry-graphql not installed") -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx # noqa: E402 - -from fireflyframework_agentic.studio.config import StudioConfig # noqa: E402 -from fireflyframework_agentic.studio.server import create_studio_app # noqa: E402 - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def app(tmp_path: Path): - """Create a Studio app with projects_dir pointing to tmp_path.""" - cfg = StudioConfig(_env_file=None, projects_dir=tmp_path) - return create_studio_app(config=cfg) - - -@pytest.fixture() -async def client(app): - """Provide an async httpx client bound to the test app.""" - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -# --------------------------------------------------------------------------- -# Query tests -# --------------------------------------------------------------------------- - - -class TestGraphQLQueries: - async def test_graphql_projects_query_empty(self, client: httpx.AsyncClient): - """Querying projects on a fresh instance returns an empty list.""" - resp = await client.post( - "/api/graphql", - json={"query": "{ projects { name description createdAt } }"}, - ) - assert resp.status_code == 200 - body = resp.json() - assert "data" in body - assert body["data"]["projects"] == [] - - async def test_graphql_projects_query_after_create(self, client: httpx.AsyncClient): - """Creating a project via REST and querying via GraphQL returns it.""" - # Create a project via the REST API - create_resp = await client.post("/api/projects", json={"name": "gql-test", "description": "GraphQL test"}) - assert create_resp.status_code == 200 - - resp = await client.post( - "/api/graphql", - json={"query": "{ projects { name description } }"}, - ) - assert resp.status_code == 200 - body = resp.json() - projects = body["data"]["projects"] - assert len(projects) == 1 - assert projects[0]["name"] == "gql-test" - assert projects[0]["description"] == "GraphQL test" - - async def test_graphql_project_by_name(self, client: httpx.AsyncClient): - """Querying a single project by name returns it.""" - await client.post("/api/projects", json={"name": "single-test", "description": "Single"}) - - resp = await client.post( - "/api/graphql", - json={"query": '{ project(name: "single-test") { name description } }'}, - ) - assert resp.status_code == 200 - body = resp.json() - assert body["data"]["project"]["name"] == "single-test" - - async def test_graphql_project_not_found(self, client: httpx.AsyncClient): - """Querying a non-existent project returns null.""" - resp = await client.post( - "/api/graphql", - json={"query": '{ project(name: "nonexistent") { name } }'}, - ) - assert resp.status_code == 200 - body = resp.json() - assert body["data"]["project"] is None - - async def test_graphql_runtime_status_stopped(self, client: httpx.AsyncClient): - """Runtime status for a project with no active runtime is 'stopped'.""" - resp = await client.post( - "/api/graphql", - json={"query": '{ runtimeStatus(project: "any-project") { project status consumers schedulerActive } }'}, - ) - assert resp.status_code == 200 - body = resp.json() - status = body["data"]["runtimeStatus"] - assert status["project"] == "any-project" - assert status["status"] == "stopped" - assert status["consumers"] == 0 - assert status["schedulerActive"] is False - - -# --------------------------------------------------------------------------- -# Introspection -# --------------------------------------------------------------------------- - - -class TestGraphQLIntrospection: - async def test_graphql_introspection(self, client: httpx.AsyncClient): - """Introspection query returns type information.""" - resp = await client.post( - "/api/graphql", - json={"query": "{ __schema { types { name } } }"}, - ) - assert resp.status_code == 200 - body = resp.json() - type_names = [t["name"] for t in body["data"]["__schema"]["types"]] - assert "Project" in type_names - assert "RuntimeStatus" in type_names - assert "ExecutionResult" in type_names - - async def test_graphql_query_type_fields(self, client: httpx.AsyncClient): - """The Query type exposes expected field names.""" - resp = await client.post( - "/api/graphql", - json={"query": '{ __type(name: "Query") { fields { name } } }'}, - ) - assert resp.status_code == 200 - body = resp.json() - field_names = [f["name"] for f in body["data"]["__type"]["fields"]] - assert "projects" in field_names - assert "project" in field_names - assert "runtimeStatus" in field_names - - -# --------------------------------------------------------------------------- -# Mutation tests -# --------------------------------------------------------------------------- - - -class TestGraphQLMutations: - async def test_run_pipeline_missing_project(self, client: httpx.AsyncClient): - """Running a pipeline for a non-existent project returns error status.""" - resp = await client.post( - "/api/graphql", - json={"query": 'mutation { runPipeline(project: "nope", input: "hello") { executionId status result } }'}, - ) - assert resp.status_code == 200 - body = resp.json() - result = body["data"]["runPipeline"] - assert result["status"] == "error" - assert "not found" in result["result"].lower() - - async def test_run_pipeline_no_pipeline_saved(self, client: httpx.AsyncClient): - """Running a pipeline when no pipeline JSON exists returns error.""" - await client.post("/api/projects", json={"name": "empty-proj"}) - resp = await client.post( - "/api/graphql", - json={ - "query": 'mutation { runPipeline(project: "empty-proj", input: "test") { executionId status result } }' - }, - ) - assert resp.status_code == 200 - body = resp.json() - result = body["data"]["runPipeline"] - assert result["status"] == "error" - assert result["executionId"] is not None - - -# --------------------------------------------------------------------------- -# Fallback when strawberry is missing -# --------------------------------------------------------------------------- - - -class TestGraphQLFallback: - def test_fallback_router_created_when_strawberry_missing(self, monkeypatch: pytest.MonkeyPatch): - """When strawberry import fails, a fallback APIRouter is returned.""" - import builtins - - original_import = builtins.__import__ - - def _mock_import(name: str, *args: object, **kwargs: object) -> object: - if name == "strawberry" or name.startswith("strawberry."): - raise ImportError("mocked: no strawberry") - return original_import(name, *args, **kwargs) - - monkeypatch.setattr(builtins, "__import__", _mock_import) - - # Need to reimport to trigger the fallback path - from importlib import reload - - import fireflyframework_agentic.studio.api.graphql_api as gql_mod - - reload(gql_mod) - - import tempfile - from pathlib import Path - - from fireflyframework_agentic.studio.projects import ProjectManager - - with tempfile.TemporaryDirectory() as td: - pm = ProjectManager(Path(td)) - router = gql_mod.create_graphql_router(pm) - - # Restore the module - reload(gql_mod) - - from fastapi import APIRouter - - assert isinstance(router, APIRouter) diff --git a/tests/test_studio/test_input_output_nodes.py b/tests/test_studio/test_input_output_nodes.py deleted file mode 100644 index 25bbb25f..00000000 --- a/tests/test_studio/test_input_output_nodes.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Tests for Input and Output boundary nodes.""" - -from __future__ import annotations - -import pytest - -from fireflyframework_agentic.studio.codegen.models import GraphNode, NodeType -from fireflyframework_agentic.studio.execution.io_nodes import ( - FileConfig, - HttpConfig, - InputNodeConfig, - OutputNodeConfig, - QueueConfig, - ScheduleConfig, - StoreConfig, - WebhookConfig, -) - - -class TestInputOutputNodeTypes: - def test_input_node_type_exists(self): - assert NodeType.INPUT == "input" - - def test_output_node_type_exists(self): - assert NodeType.OUTPUT == "output" - - def test_input_node_creation(self): - node = GraphNode( - id="input_1", - type=NodeType.INPUT, - label="HTTP Input", - position={"x": 0, "y": 200}, - data={"trigger_type": "http"}, - ) - assert node.type == "input" - assert node.data["trigger_type"] == "http" - - def test_output_node_creation(self): - node = GraphNode( - id="output_1", - type=NodeType.OUTPUT, - label="API Response", - position={"x": 600, "y": 200}, - data={"destination_type": "response"}, - ) - assert node.type == "output" - assert node.data["destination_type"] == "response" - - -class TestInputNodeConfig: - def test_manual_trigger(self): - config = InputNodeConfig(trigger_type="manual") - assert config.trigger_type == "manual" - assert config.schema is None - - def test_http_trigger(self): - config = InputNodeConfig( - trigger_type="http", - http_config=HttpConfig(method="POST", auth_required=True), - ) - assert config.http_config is not None - assert config.http_config.auth_required is True - - def test_queue_trigger(self): - config = InputNodeConfig( - trigger_type="queue", - queue_config=QueueConfig( - broker="kafka", - topic_or_queue="pipeline-input", - group_id="studio-group", - ), - ) - assert config.queue_config is not None - assert config.queue_config.broker == "kafka" - - def test_schedule_trigger(self): - config = InputNodeConfig( - trigger_type="schedule", - schedule_config=ScheduleConfig( - cron_expression="0 */6 * * *", - timezone="America/New_York", - payload={"action": "report"}, - ), - ) - assert config.schedule_config is not None - assert config.schedule_config.cron_expression == "0 */6 * * *" - - def test_file_upload_trigger(self): - config = InputNodeConfig( - trigger_type="file_upload", - file_config=FileConfig( - accepted_types=["application/pdf", "text/csv"], - max_size_mb=100, - ), - ) - assert config.file_config is not None - assert "application/pdf" in config.file_config.accepted_types - - def test_invalid_trigger_type(self): - with pytest.raises(ValueError): - InputNodeConfig(trigger_type="invalid") - - -class TestOutputNodeConfig: - def test_response_destination(self): - config = OutputNodeConfig(destination_type="response") - assert config.destination_type == "response" - - def test_queue_destination(self): - config = OutputNodeConfig( - destination_type="queue", - queue_config=QueueConfig(broker="redis", topic_or_queue="results"), - ) - assert config.queue_config is not None - - def test_webhook_destination(self): - config = OutputNodeConfig( - destination_type="webhook", - webhook_config=WebhookConfig(url="https://example.com/callback"), - ) - assert config.webhook_config is not None - - def test_store_destination(self): - config = OutputNodeConfig( - destination_type="store", - store_config=StoreConfig(storage_type="file", path_or_table="/tmp/results.json"), - ) - assert config.store_config is not None - - def test_invalid_destination_type(self): - with pytest.raises(ValueError): - OutputNodeConfig(destination_type="invalid") diff --git a/tests/test_studio/test_pipeline_events.py b/tests/test_studio/test_pipeline_events.py deleted file mode 100644 index 19bfbf6c..00000000 --- a/tests/test_studio/test_pipeline_events.py +++ /dev/null @@ -1,254 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for pipeline execution events and checkpoint creation. - -Verifies that :class:`StudioEventHandler` collects events in correct -order during pipeline execution, and that checkpoints can be created -for debug mode. -""" - -from __future__ import annotations - -from unittest.mock import AsyncMock, MagicMock - -from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - NodeType, -) -from fireflyframework_agentic.studio.execution.checkpoint import CheckpointManager -from fireflyframework_agentic.studio.execution.compiler import compile_graph -from fireflyframework_agentic.studio.execution.runner import StudioEventHandler - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - -_POS = {"x": 0.0, "y": 0.0} - - -def _make_graph( - nodes: list[GraphNode], - edges: list[GraphEdge] | None = None, -) -> GraphModel: - return GraphModel(nodes=nodes, edges=edges or []) - - -def _make_node( - node_id: str, - node_type: NodeType, - label: str = "test-node", - data: dict | None = None, -) -> GraphNode: - return GraphNode(id=node_id, type=node_type, label=label, position=_POS, data=data or {}) - - -def _mock_agent(name: str = "mock-agent") -> MagicMock: - agent = MagicMock() - agent.name = name - mock_result = MagicMock() - mock_result.output = f"output from {name}" - agent.run = AsyncMock(return_value=mock_result) - return agent - - -# --------------------------------------------------------------------------- -# Event streaming tests -# --------------------------------------------------------------------------- - - -class TestExecutionEventsStream: - """Run a compiled graph, verify StudioEventHandler collects events in order.""" - - async def test_events_include_start_complete_and_pipeline_complete(self): - handler = StudioEventHandler() - - # Simple two-node pipeline - nodes = [ - _make_node("a", NodeType.PIPELINE_STEP, data={}), - _make_node("b", NodeType.PIPELINE_STEP, data={}), - ] - edges = [GraphEdge(id="e1", source="a", target="b")] - graph = _make_graph(nodes, edges) - - engine = compile_graph(graph, event_handler=handler) - result = await engine.run(inputs="test") - - assert result.success is True - - events = handler.drain_events() - types = [e["type"] for e in events] - - # Should have node_start and node_complete for each node, plus pipeline_complete - assert types.count("node_start") >= 2 - assert types.count("node_complete") >= 2 - assert "pipeline_complete" in types - - # pipeline_complete should be last - assert types[-1] == "pipeline_complete" - - async def test_event_order_matches_topology(self): - handler = StudioEventHandler() - - nodes = [ - _make_node("first", NodeType.PIPELINE_STEP, data={}), - _make_node("second", NodeType.PIPELINE_STEP, data={}), - _make_node("third", NodeType.PIPELINE_STEP, data={}), - ] - edges = [ - GraphEdge(id="e1", source="first", target="second"), - GraphEdge(id="e2", source="second", target="third"), - ] - graph = _make_graph(nodes, edges) - - engine = compile_graph(graph, event_handler=handler) - await engine.run(inputs="chain") - - events = handler.drain_events() - node_starts = [e["node_id"] for e in events if e["type"] == "node_start"] - - # First node should start before second, second before third - assert node_starts.index("first") < node_starts.index("second") - assert node_starts.index("second") < node_starts.index("third") - - async def test_pipeline_complete_event_contains_success_flag(self): - handler = StudioEventHandler() - - node = _make_node("solo", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - - engine = compile_graph(graph, event_handler=handler) - await engine.run(inputs="test") - - events = handler.drain_events() - pc = next(e for e in events if e["type"] == "pipeline_complete") - assert pc["success"] is True - assert "duration_ms" in pc - - async def test_node_complete_event_contains_latency(self): - handler = StudioEventHandler() - - node = _make_node("timed", NodeType.PIPELINE_STEP, data={}) - graph = _make_graph([node]) - - engine = compile_graph(graph, event_handler=handler) - await engine.run(inputs="test") - - events = handler.drain_events() - nc = next(e for e in events if e["type"] == "node_complete") - assert "latency_ms" in nc - assert nc["latency_ms"] >= 0 - - -class TestDebugModeCheckpoints: - """Verify CheckpointManager receives entries during debug-like execution.""" - - def test_checkpoint_creation(self): - manager = CheckpointManager() - - # Simulate creating checkpoints as would happen during debug execution - cp1 = manager.create( - node_id="agent_1", - state={"output": "hello"}, - inputs={"input": "hi"}, - ) - cp2 = manager.create( - node_id="tool_1", - state={"output": "search result"}, - inputs={"query": "hello"}, - ) - - assert len(manager.list_all()) == 2 - assert cp1.index == 0 - assert cp2.index == 1 - assert cp1.node_id == "agent_1" - assert cp2.node_id == "tool_1" - assert cp1.timestamp # Non-empty timestamp - - def test_checkpoint_fork(self): - manager = CheckpointManager() - manager.create(node_id="n1", state={"val": 1}, inputs={"x": "a"}) - - forked = manager.fork(0, modified_state={"val": 99}) - assert forked.index == 1 - assert forked.parent_index == 0 - assert forked.branch_id is not None - assert forked.state == {"val": 99} - assert forked.node_id == "n1" # Inherits from parent - - def test_checkpoint_diff(self): - manager = CheckpointManager() - manager.create(node_id="n1", state={"a": 1, "b": 2}, inputs={}) - manager.create(node_id="n2", state={"b": 3, "c": 4}, inputs={}) - - diff = manager.diff(0, 1) - assert "c" in diff["added"] - assert "a" in diff["removed"] - assert "b" in diff["changed"] - - -class TestErrorEventOnNodeFailure: - """Node raises exception, verify node_error event is emitted.""" - - async def test_node_error_event(self): - handler = StudioEventHandler() - - # Validator that will fail on empty input - node = _make_node("val", NodeType.VALIDATOR, data={"validation_rule": "not_empty"}) - graph = _make_graph([node]) - - engine = compile_graph(graph, event_handler=handler) - await engine.run(inputs="") - - events = handler.drain_events() - error_events = [e for e in events if e["type"] == "node_error"] - assert len(error_events) >= 1 - assert error_events[0]["node_id"] == "val" - assert "error" in error_events[0] - - async def test_error_followed_by_pipeline_complete(self): - handler = StudioEventHandler() - - node = _make_node("bad", NodeType.VALIDATOR, data={"validation_rule": "not_empty"}) - graph = _make_graph([node]) - - engine = compile_graph(graph, event_handler=handler) - await engine.run(inputs="") - - events = handler.drain_events() - types = [e["type"] for e in events] - - assert "node_error" in types - assert "pipeline_complete" in types - # pipeline_complete comes after node_error - assert types.index("node_error") < types.index("pipeline_complete") - - async def test_custom_code_error_event(self): - handler = StudioEventHandler() - - code = "async def execute(context, inputs):\n raise RuntimeError('intentional failure')\n" - node = _make_node("broken", NodeType.CUSTOM_CODE, data={"code": code}) - graph = _make_graph([node]) - - engine = compile_graph(graph, event_handler=handler) - result = await engine.run(inputs="trigger") - - assert result.outputs["broken"].success is False - - events = handler.drain_events() - error_events = [e for e in events if e["type"] == "node_error"] - assert len(error_events) >= 1 - assert "intentional failure" in error_events[0]["error"] diff --git a/tests/test_studio/test_pipeline_integration.py b/tests/test_studio/test_pipeline_integration.py deleted file mode 100644 index 39652830..00000000 --- a/tests/test_studio/test_pipeline_integration.py +++ /dev/null @@ -1,404 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Integration tests proving realistic pipelines compile and execute. - -These tests exercise the same graph shapes that The Architect produces -via its ``add_node`` / ``connect_nodes`` tools, verifying the full -canvas -> compiler -> engine -> execution loop. -""" - -from __future__ import annotations - -from unittest.mock import AsyncMock, MagicMock, patch - -from fireflyframework_agentic.agents.registry import agent_registry -from fireflyframework_agentic.pipeline.context import PipelineContext -from fireflyframework_agentic.pipeline.engine import PipelineEngine -from fireflyframework_agentic.pipeline.steps import ( - AgentStep, - BranchStep, - CallableStep, - FanInStep, - FanOutStep, - ReasoningStep, -) -from fireflyframework_agentic.reasoning.registry import reasoning_registry -from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - NodeType, -) -from fireflyframework_agentic.studio.execution.compiler import compile_graph -from fireflyframework_agentic.tools.registry import tool_registry - -# --------------------------------------------------------------------------- -# Helpers (same patterns as test_compiler.py) -# --------------------------------------------------------------------------- - -_POS = {"x": 0.0, "y": 0.0} - - -def _make_graph( - nodes: list[GraphNode], - edges: list[GraphEdge] | None = None, - metadata: dict | None = None, -) -> GraphModel: - return GraphModel(nodes=nodes, edges=edges or [], metadata=metadata or {}) - - -def _make_node( - node_id: str, - node_type: NodeType, - label: str = "test-node", - data: dict | None = None, -) -> GraphNode: - return GraphNode(id=node_id, type=node_type, label=label, position=_POS, data=data or {}) - - -def _mock_agent(name: str = "mock-agent") -> MagicMock: - agent = MagicMock() - agent.name = name - mock_result = MagicMock() - mock_result.output = f"output from {name}" - agent.run = AsyncMock(return_value=mock_result) - return agent - - -def _mock_tool(name: str = "mock-tool") -> MagicMock: - tool = MagicMock() - tool.name = name - tool.description = f"Mock {name}" - tool.execute = AsyncMock(return_value=f"result from {name}") - return tool - - -def _mock_pattern(name: str = "mock-pattern") -> MagicMock: - pattern = MagicMock() - mock_result = MagicMock() - mock_result.output = f"reasoning output from {name}" - pattern.execute = AsyncMock(return_value=mock_result) - return pattern - - -# --------------------------------------------------------------------------- -# Pipeline integration tests -# --------------------------------------------------------------------------- - - -class TestSimpleQAPipeline: - """Single agent node with model + instructions compiles and produces AgentStep.""" - - def test_compiles_to_agent_step(self): - node = _make_node( - "agent_1", - NodeType.AGENT, - label="QA Agent", - data={ - "model": "openai:gpt-4o", - "instructions": "Answer questions concisely.", - "description": "A simple Q&A agent", - }, - ) - graph = _make_graph([node]) - - with patch("fireflyframework_agentic.agents.base.FireflyAgent") as mock_cls: - mock_cls.return_value = MagicMock() - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - dag_node = engine._dag.nodes["agent_1"] - assert isinstance(dag_node.step, AgentStep) - - async def test_executes_with_mocked_agent(self): - mock = _mock_agent("qa-agent") - agent_registry._agents["qa-agent"] = mock - - node = _make_node( - "agent_1", - NodeType.AGENT, - label="qa-agent", - data={"agent_name": "qa-agent"}, - ) - graph = _make_graph([node]) - engine = compile_graph(graph) - - result = await engine.run(inputs="What is 2+2?") - assert result.success is True - assert result.outputs["agent_1"].output == "output from qa-agent" - - -class TestAgentWithToolPipeline: - """Agent -> Tool -> Agent chain compiles with correct edges.""" - - def test_compiles_three_node_chain(self): - mock_agent = _mock_agent("chain-agent") - mock_tool = _mock_tool("search") - agent_registry._agents["chain-agent"] = mock_agent - tool_registry._tools["search"] = mock_tool - - nodes = [ - _make_node("a1", NodeType.AGENT, label="chain-agent", data={"agent_name": "chain-agent"}), - _make_node("t1", NodeType.TOOL, data={"tool_name": "search"}), - _make_node("a2", NodeType.AGENT, label="chain-agent", data={"agent_name": "chain-agent"}), - ] - edges = [ - GraphEdge(id="e1", source="a1", target="t1"), - GraphEdge(id="e2", source="t1", target="a2"), - ] - graph = _make_graph(nodes, edges) - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - dag = engine._dag - assert len(dag.nodes) == 3 - assert len(dag.edges) == 2 - - assert isinstance(dag.nodes["a1"].step, AgentStep) - assert isinstance(dag.nodes["t1"].step, CallableStep) - assert isinstance(dag.nodes["a2"].step, AgentStep) - - topo = dag.topological_sort() - assert topo.index("a1") < topo.index("t1") < topo.index("a2") - - -class TestConditionalRoutingPipeline: - """Agent -> Condition -> two branch agents verifies BranchStep.""" - - def test_compiles_conditional_graph(self): - mock = _mock_agent("router") - agent_registry._agents["router"] = mock - agent_registry._agents["handler-a"] = _mock_agent("handler-a") - agent_registry._agents["handler-b"] = _mock_agent("handler-b") - - nodes = [ - _make_node("router", NodeType.AGENT, label="router", data={"agent_name": "router"}), - _make_node( - "cond", - NodeType.CONDITION, - data={ - "condition": "category", - "branches": {"support": "handler_a", "sales": "handler_b"}, - }, - ), - _make_node("handler_a", NodeType.AGENT, label="handler-a", data={"agent_name": "handler-a"}), - _make_node("handler_b", NodeType.AGENT, label="handler-b", data={"agent_name": "handler-b"}), - ] - edges = [ - GraphEdge(id="e1", source="router", target="cond"), - GraphEdge(id="e2", source="cond", target="handler_a"), - GraphEdge(id="e3", source="cond", target="handler_b"), - ] - graph = _make_graph(nodes, edges) - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["cond"].step, BranchStep) - - async def test_condition_routes_correctly(self): - """Verify the condition step returns the right branch label.""" - nodes = [ - _make_node( - "cond", - NodeType.CONDITION, - data={ - "condition": "type", - "branches": {"question": "qa_path", "complaint": "complaint_path"}, - }, - ), - ] - graph = _make_graph(nodes) - engine = compile_graph(graph) - step = engine._dag.nodes["cond"].step - ctx = PipelineContext(inputs=None) - - assert await step.execute(ctx, {"type": "question"}) == "qa_path" - assert await step.execute(ctx, {"type": "complaint"}) == "complaint_path" - # Unknown value falls back to first branch - assert await step.execute(ctx, {"type": "unknown"}) == "qa_path" - - -class TestReasoningPipeline: - """Agent + reasoning node with ReAct pattern verifies ReasoningStep.""" - - def test_compiles_reasoning_step(self): - mock_agent = _mock_agent("thinker") - mock_pattern = _mock_pattern("react") - agent_registry._agents["thinker"] = mock_agent - reasoning_registry._patterns["react"] = mock_pattern - - nodes = [ - _make_node("a1", NodeType.AGENT, label="thinker", data={"agent_name": "thinker"}), - _make_node( - "r1", - NodeType.REASONING, - data={"pattern_name": "react", "agent_name": "thinker"}, - ), - ] - edges = [GraphEdge(id="e1", source="a1", target="r1")] - graph = _make_graph(nodes, edges) - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["r1"].step, ReasoningStep) - - -class TestFanOutFanInPipeline: - """Fan-out -> multiple agents -> Fan-in verifies parallel execution structure.""" - - def test_compiles_fan_structure(self): - agent_registry._agents["worker"] = _mock_agent("worker") - - nodes = [ - _make_node("scatter", NodeType.FAN_OUT, data={"split_expression": "items"}), - _make_node("w1", NodeType.AGENT, label="worker", data={"agent_name": "worker"}), - _make_node("w2", NodeType.AGENT, label="worker", data={"agent_name": "worker"}), - _make_node("gather", NodeType.FAN_IN, data={"merge_expression": "collect"}), - ] - edges = [ - GraphEdge(id="e1", source="scatter", target="w1"), - GraphEdge(id="e2", source="scatter", target="w2"), - GraphEdge(id="e3", source="w1", target="gather"), - GraphEdge(id="e4", source="w2", target="gather"), - ] - graph = _make_graph(nodes, edges) - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["scatter"].step, FanOutStep) - assert isinstance(engine._dag.nodes["gather"].step, FanInStep) - - topo = engine._dag.topological_sort() - assert topo.index("scatter") < topo.index("w1") - assert topo.index("scatter") < topo.index("w2") - assert topo.index("w1") < topo.index("gather") - assert topo.index("w2") < topo.index("gather") - - -class TestFullPipelineExecution: - """Build an agent -> tool graph, run with mocks, verify events fire.""" - - async def test_agent_tool_execution_flow(self): - mock_agent = _mock_agent("exec-agent") - mock_tool = _mock_tool("calculator") - agent_registry._agents["exec-agent"] = mock_agent - tool_registry._tools["calculator"] = mock_tool - - nodes = [ - _make_node("a1", NodeType.AGENT, label="exec-agent", data={"agent_name": "exec-agent"}), - _make_node("t1", NodeType.TOOL, data={"tool_name": "calculator"}), - ] - edges = [GraphEdge(id="e1", source="a1", target="t1")] - graph = _make_graph(nodes, edges) - - from fireflyframework_agentic.studio.execution.runner import StudioEventHandler - - handler = StudioEventHandler() - engine = compile_graph(graph, event_handler=handler) - result = await engine.run(inputs="compute something") - - assert result.success is True - assert result.outputs["a1"].success is True - assert result.outputs["t1"].success is True - - events = handler.drain_events() - event_types = [e["type"] for e in events] - assert "node_start" in event_types - assert "node_complete" in event_types - assert "pipeline_complete" in event_types - - async def test_single_custom_code_execution(self): - """A single custom code node runs end-to-end.""" - code = "async def execute(context, inputs):\n val = inputs.get('input', '')\n return val.upper() if isinstance(val, str) else val\n" - node = _make_node("upper", NodeType.CUSTOM_CODE, data={"code": code}) - graph = _make_graph([node]) - engine = compile_graph(graph) - - result = await engine.run(inputs="hello world") - assert result.success is True - assert result.outputs["upper"].output == "HELLO WORLD" - - -class TestArchitectStyleGraphCompiles: - """Use a GraphModel mirroring what The Architect's tools produce.""" - - def test_architect_graph_compiles(self): - """Simulate The Architect adding nodes and connecting them.""" - agent_registry._agents["classifier"] = _mock_agent("classifier") - agent_registry._agents["responder"] = _mock_agent("responder") - tool_registry._tools["search"] = _mock_tool("search") - - # This mirrors what add_node + connect_nodes produce - nodes = [ - _make_node( - "agent_1", - NodeType.AGENT, - label="classifier", - data={"agent_name": "classifier", "model": "openai:gpt-4o", "instructions": "Classify the input."}, - ), - _make_node( - "condition_2", - NodeType.CONDITION, - data={"condition": "category", "branches": {"tech": "tool_3", "general": "agent_4"}}, - ), - _make_node("tool_3", NodeType.TOOL, data={"tool_name": "search"}), - _make_node( - "agent_4", - NodeType.AGENT, - label="responder", - data={"agent_name": "responder"}, - ), - ] - edges = [ - GraphEdge(id="edge_5", source="agent_1", target="condition_2"), - GraphEdge(id="edge_6", source="condition_2", target="tool_3"), - GraphEdge(id="edge_7", source="condition_2", target="agent_4"), - ] - graph = _make_graph(nodes, edges, metadata={"name": "architect-pipeline"}) - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - assert engine._dag.name == "architect-pipeline" - assert len(engine._dag.nodes) == 4 - assert len(engine._dag.edges) == 3 - - -class TestMultimodalAgentNodeCompiles: - """Agent node with multimodal config in data dict compiles (forwards unknown data keys).""" - - def test_multimodal_config_does_not_block_compilation(self): - node = _make_node( - "mm_agent", - NodeType.AGENT, - label="Vision Agent", - data={ - "model": "openai:gpt-4o", - "instructions": "Analyze images.", - "multimodal": { - "vision_enabled": True, - "supported_file_types": ["image/png", "image/jpeg"], - "max_file_size_mb": 10, - "image_detail": "auto", - }, - }, - ) - graph = _make_graph([node]) - - with patch("fireflyframework_agentic.agents.base.FireflyAgent") as mock_cls: - mock_cls.return_value = MagicMock() - engine = compile_graph(graph) - - assert isinstance(engine, PipelineEngine) - assert isinstance(engine._dag.nodes["mm_agent"].step, AgentStep) diff --git a/tests/test_studio/test_project_api.py b/tests/test_studio/test_project_api.py deleted file mode 100644 index 0b4a1936..00000000 --- a/tests/test_studio/test_project_api.py +++ /dev/null @@ -1,218 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for per-project auto-generated API endpoints.""" - -from __future__ import annotations - -from pathlib import Path - -import pytest - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx - -from fireflyframework_agentic.studio.config import StudioConfig -from fireflyframework_agentic.studio.server import create_studio_app - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def app(tmp_path: Path): - """Create a Studio app with projects_dir pointing to tmp_path.""" - cfg = StudioConfig(_env_file=None, projects_dir=tmp_path) - return create_studio_app(config=cfg) - - -@pytest.fixture() -async def client(app): - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -# --------------------------------------------------------------------------- -# Runtime status / start / stop -# --------------------------------------------------------------------------- - - -class TestProjectRuntimeAPI: - async def test_runtime_status_returns_stopped(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "test-rt"}) - resp = await client.get("/api/projects/test-rt/runtime/status") - assert resp.status_code == 200 - body = resp.json() - assert body["status"] == "stopped" - - async def test_runtime_status_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.get("/api/projects/nonexistent/runtime/status") - assert resp.status_code == 404 - - async def test_runtime_stop_when_not_running(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "test-stop"}) - resp = await client.post("/api/projects/test-stop/runtime/stop") - assert resp.status_code == 200 - body = resp.json() - assert body["status"] == "stopped" - - async def test_runtime_stop_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.post("/api/projects/nonexistent/runtime/stop") - assert resp.status_code == 404 - - async def test_runtime_start_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.post("/api/projects/nonexistent/runtime/start") - assert resp.status_code == 404 - - async def test_runtime_start_returns_error_when_no_pipeline(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "test-start"}) - resp = await client.post("/api/projects/test-start/runtime/start") - # No pipeline saved yet, so it should fail - assert resp.status_code == 404 - - async def test_runtime_executions_empty(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "test-exec"}) - resp = await client.get("/api/projects/test-exec/runtime/executions") - assert resp.status_code == 200 - body = resp.json() - assert body["executions"] == [] - - async def test_runtime_executions_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.get("/api/projects/nonexistent/runtime/executions") - assert resp.status_code == 404 - - -# --------------------------------------------------------------------------- -# Schema endpoint -# --------------------------------------------------------------------------- - - -class TestProjectSchemaAPI: - async def test_project_schema_returns_empty_for_no_pipeline(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "test-schema"}) - resp = await client.get("/api/projects/test-schema/schema") - assert resp.status_code == 200 - body = resp.json() - assert body["trigger_type"] is None - assert body["input_schema"] is None - assert body["output_schema"] is None - - async def test_project_schema_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.get("/api/projects/nonexistent/schema") - assert resp.status_code == 404 - - async def test_project_schema_extracts_input_node(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "test-io-schema"}) - graph = { - "nodes": [ - { - "id": "input-1", - "type": "input", - "label": "Input", - "position": {"x": 0, "y": 0}, - "data": { - "trigger_type": "http", - "schema": {"type": "object", "properties": {"query": {"type": "string"}}}, - }, - }, - { - "id": "output-1", - "type": "output", - "label": "Output", - "position": {"x": 300, "y": 0}, - "data": { - "destination_type": "response", - "response_schema": {"type": "object", "properties": {"answer": {"type": "string"}}}, - }, - }, - ], - "edges": [{"id": "e1", "source": "input-1", "target": "output-1"}], - } - await client.post( - "/api/projects/test-io-schema/pipelines/main", - json={"graph": graph}, - ) - resp = await client.get("/api/projects/test-io-schema/schema") - assert resp.status_code == 200 - body = resp.json() - assert body["trigger_type"] == "http" - assert body["input_schema"]["properties"]["query"]["type"] == "string" - assert body["output_schema"]["properties"]["answer"]["type"] == "string" - - -# --------------------------------------------------------------------------- -# Run endpoint -# --------------------------------------------------------------------------- - - -class TestProjectRunAPI: - async def test_run_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.post( - "/api/projects/nonexistent/run", - json={"input": "hello"}, - ) - assert resp.status_code == 404 - - async def test_run_returns_error_when_no_pipeline(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "test-run"}) - resp = await client.post( - "/api/projects/test-run/run", - json={"input": "hello"}, - ) - assert resp.status_code == 404 - - -# --------------------------------------------------------------------------- -# Async run / poll endpoints -# --------------------------------------------------------------------------- - - -class TestProjectAsyncRunAPI: - async def test_async_run_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.post( - "/api/projects/nonexistent/run/async", - json={"input": "hello"}, - ) - assert resp.status_code == 404 - - async def test_poll_execution_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.get( - "/api/projects/nonexistent/runs/some-id", - ) - assert resp.status_code == 404 - - async def test_poll_execution_404_for_missing_execution(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "test-poll"}) - resp = await client.get( - "/api/projects/test-poll/runs/nonexistent-id", - ) - assert resp.status_code == 404 - - -# --------------------------------------------------------------------------- -# Upload endpoint -# --------------------------------------------------------------------------- - - -class TestProjectUploadAPI: - async def test_upload_404_for_missing_project(self, client: httpx.AsyncClient): - resp = await client.post( - "/api/projects/nonexistent/upload", - files={"file": ("test.txt", b"hello", "text/plain")}, - ) - assert resp.status_code == 404 diff --git a/tests/test_studio/test_project_runtime.py b/tests/test_studio/test_project_runtime.py deleted file mode 100644 index 9707e80d..00000000 --- a/tests/test_studio/test_project_runtime.py +++ /dev/null @@ -1,81 +0,0 @@ -"""Tests for ProjectRuntime lifecycle management.""" - -from __future__ import annotations - -import pytest - -from fireflyframework_agentic.studio.codegen.models import ( - GraphEdge, - GraphModel, - GraphNode, - NodeType, -) -from fireflyframework_agentic.studio.runtime import ProjectRuntime - - -def _simple_graph() -> GraphModel: - return GraphModel( - nodes=[ - GraphNode( - id="input_1", - type=NodeType.INPUT, - label="Input", - position={"x": 0, "y": 200}, - data={"trigger_type": "manual"}, - ), - GraphNode( - id="agent_1", - type=NodeType.AGENT, - label="Agent", - position={"x": 300, "y": 200}, - data={"model": "openai:gpt-4o", "instructions": "Echo input."}, - ), - GraphNode( - id="output_1", - type=NodeType.OUTPUT, - label="Output", - position={"x": 600, "y": 200}, - data={"destination_type": "response"}, - ), - ], - edges=[ - GraphEdge(id="e1", source="input_1", target="agent_1"), - GraphEdge(id="e2", source="agent_1", target="output_1"), - ], - ) - - -class TestProjectRuntime: - def test_create_runtime(self): - rt = ProjectRuntime("test-project") - assert rt.project_name == "test-project" - assert rt.status == "stopped" - - async def test_start_with_manual_trigger(self): - rt = ProjectRuntime("test-project") - await rt.start(_simple_graph()) - assert rt.status == "running" - await rt.stop() - assert rt.status == "stopped" - - def test_get_status(self): - rt = ProjectRuntime("test-project") - status = rt.get_status() - assert status["status"] == "stopped" - assert status["consumers"] == 0 - assert status["scheduler_active"] is False - - async def test_start_stop_idempotent(self): - rt = ProjectRuntime("test-project") - await rt.start(_simple_graph()) - assert rt.status == "running" - await rt.stop() - assert rt.status == "stopped" - # Stopping again should be safe - await rt.stop() - assert rt.status == "stopped" - - async def test_execute_without_graph_raises(self): - rt = ProjectRuntime("test-project") - with pytest.raises(RuntimeError, match="has no graph loaded"): - await rt.execute({"text": "hello"}) diff --git a/tests/test_studio/test_projects.py b/tests/test_studio/test_projects.py deleted file mode 100644 index f23cbb2a..00000000 --- a/tests/test_studio/test_projects.py +++ /dev/null @@ -1,379 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Project Management API (ProjectManager + REST endpoints).""" - -from __future__ import annotations - -import json -from pathlib import Path - -import httpx -import pytest - -from fireflyframework_agentic.studio.config import StudioConfig -from fireflyframework_agentic.studio.projects import ProjectInfo, ProjectManager -from fireflyframework_agentic.studio.server import create_studio_app - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def manager(tmp_path: Path) -> ProjectManager: - """Create a ProjectManager backed by a temporary directory.""" - return ProjectManager(tmp_path) - - -# --------------------------------------------------------------------------- -# ProjectManager unit tests -# --------------------------------------------------------------------------- - - -class TestProjectManagerCreate: - def test_create_returns_project_info(self, manager: ProjectManager): - info = manager.create("my-project", description="A test project") - assert isinstance(info, ProjectInfo) - assert info.name == "my-project" - assert info.description == "A test project" - - def test_create_makes_project_dir(self, manager: ProjectManager): - info = manager.create("my-project") - assert info.path.is_dir() - - def test_create_makes_pipelines_subdir(self, manager: ProjectManager): - info = manager.create("my-project") - assert (info.path / "pipelines").is_dir() - - def test_create_writes_project_json(self, manager: ProjectManager): - info = manager.create("my-project", description="desc") - meta_path = info.path / "project.json" - assert meta_path.is_file() - data = json.loads(meta_path.read_text()) - assert data["name"] == "my-project" - assert data["description"] == "desc" - assert "created_at" in data - - def test_create_sets_created_at(self, manager: ProjectManager): - info = manager.create("my-project") - assert info.created_at != "" - - def test_create_duplicate_raises(self, manager: ProjectManager): - manager.create("dup") - with pytest.raises(ValueError, match="Project 'dup' already exists"): - manager.create("dup") - - -class TestProjectManagerList: - def test_list_empty(self, manager: ProjectManager): - assert manager.list_all() == [] - - def test_list_returns_created_projects(self, manager: ProjectManager): - manager.create("alpha") - manager.create("beta") - names = [p.name for p in manager.list_all()] - assert names == ["alpha", "beta"] - - def test_list_sorted_by_name(self, manager: ProjectManager): - manager.create("charlie") - manager.create("alice") - manager.create("bob") - names = [p.name for p in manager.list_all()] - assert names == ["alice", "bob", "charlie"] - - -class TestProjectManagerDelete: - def test_delete_removes_directory(self, manager: ProjectManager, tmp_path: Path): - manager.create("doomed") - assert (tmp_path / "doomed").is_dir() - manager.delete("doomed") - assert not (tmp_path / "doomed").exists() - - def test_delete_removes_from_listing(self, manager: ProjectManager): - manager.create("doomed") - manager.delete("doomed") - assert manager.list_all() == [] - - def test_delete_nonexistent_raises(self, manager: ProjectManager): - with pytest.raises(FileNotFoundError, match="not found"): - manager.delete("nonexistent") - - -class TestProjectManagerPipelines: - def test_save_pipeline(self, manager: ProjectManager): - manager.create("proj") - graph = {"nodes": [{"id": "1"}], "edges": []} - manager.save_pipeline("proj", "my-pipeline", graph) - pipeline_path = manager._base_dir / "proj" / "pipelines" / "my-pipeline.json" - assert pipeline_path.is_file() - - def test_load_pipeline(self, manager: ProjectManager): - manager.create("proj") - graph = {"nodes": [{"id": "1"}], "edges": []} - manager.save_pipeline("proj", "my-pipeline", graph) - loaded = manager.load_pipeline("proj", "my-pipeline") - assert loaded == graph - - def test_load_missing_pipeline_raises(self, manager: ProjectManager): - manager.create("proj") - with pytest.raises(FileNotFoundError): - manager.load_pipeline("proj", "nonexistent") - - def test_save_pipeline_nonexistent_project_raises(self, manager: ProjectManager): - with pytest.raises(FileNotFoundError, match="not found"): - manager.save_pipeline("nonexistent", "pipe", {"nodes": [], "edges": []}) - - -class TestProjectManagerRename: - def test_rename_success(self, manager: ProjectManager): - manager.create("old-name", description="desc") - info = manager.rename("old-name", "new-name") - assert info.name == "new-name" - assert info.description == "desc" - names = [p.name for p in manager.list_all()] - assert "old-name" not in names - assert "new-name" in names - - def test_rename_updates_project_json(self, manager: ProjectManager, tmp_path: Path): - manager.create("original") - manager.rename("original", "renamed") - meta = json.loads((tmp_path / "renamed" / "project.json").read_text()) - assert meta["name"] == "renamed" - - def test_rename_conflict_raises(self, manager: ProjectManager): - manager.create("project-a") - manager.create("project-b") - with pytest.raises(ValueError, match="already exists"): - manager.rename("project-a", "project-b") - - def test_rename_not_found_raises(self, manager: ProjectManager): - with pytest.raises(FileNotFoundError, match="not found"): - manager.rename("nonexistent", "new-name") - - def test_rename_path_traversal_blocked(self, manager: ProjectManager): - manager.create("legit") - with pytest.raises(ValueError, match="Invalid path component"): - manager.rename("legit", "../../etc/evil") - - -class TestProjectManagerUpdate: - def test_update_description(self, manager: ProjectManager): - manager.create("proj", description="old desc") - info = manager.update("proj", description="new desc") - assert info.description == "new desc" - - def test_update_persists_to_disk(self, manager: ProjectManager, tmp_path: Path): - manager.create("proj") - manager.update("proj", description="persisted") - meta = json.loads((tmp_path / "proj" / "project.json").read_text()) - assert meta["description"] == "persisted" - - def test_update_not_found_raises(self, manager: ProjectManager): - with pytest.raises(FileNotFoundError, match="not found"): - manager.update("nonexistent", description="nope") - - -class TestProjectManagerDeleteAll: - def test_delete_all_removes_all(self, manager: ProjectManager): - manager.create("a") - manager.create("b") - manager.create("c") - count = manager.delete_all() - assert count == 3 - assert manager.list_all() == [] - - def test_delete_all_empty_returns_zero(self, manager: ProjectManager): - count = manager.delete_all() - assert count == 0 - - -class TestProjectManagerPathTraversal: - def test_create_path_traversal_raises(self, manager: ProjectManager): - with pytest.raises(ValueError, match="Invalid path component"): - manager.create("../../etc/evil") - - def test_delete_path_traversal_raises(self, manager: ProjectManager): - with pytest.raises(ValueError, match="Invalid path component"): - manager.delete("../../../tmp/evil") - - def test_save_pipeline_path_traversal_raises(self, manager: ProjectManager): - with pytest.raises(ValueError, match="Invalid path component"): - manager.save_pipeline("../../etc", "pipe", {}) - - -# --------------------------------------------------------------------------- -# REST API endpoint tests -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def app(tmp_path: Path): - """Create a Studio app with projects_dir pointing to tmp_path.""" - cfg = StudioConfig(_env_file=None, projects_dir=tmp_path) - return create_studio_app(config=cfg) - - -@pytest.fixture() -async def client(app): - """Provide an async httpx client bound to the test app.""" - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -class TestProjectsAPI: - async def test_list_projects_empty(self, client: httpx.AsyncClient): - resp = await client.get("/api/projects") - assert resp.status_code == 200 - assert resp.json() == [] - - async def test_create_project(self, client: httpx.AsyncClient): - resp = await client.post( - "/api/projects", - json={"name": "test-proj", "description": "Test project"}, - ) - assert resp.status_code == 200 - body = resp.json() - assert body["name"] == "test-proj" - assert body["description"] == "Test project" - - async def test_list_projects_after_create(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "proj-a"}) - await client.post("/api/projects", json={"name": "proj-b"}) - resp = await client.get("/api/projects") - names = [p["name"] for p in resp.json()] - assert names == ["proj-a", "proj-b"] - - async def test_create_duplicate_returns_409(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "dup"}) - resp = await client.post("/api/projects", json={"name": "dup"}) - assert resp.status_code == 409 - - async def test_delete_project(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "doomed"}) - resp = await client.delete("/api/projects/doomed") - assert resp.status_code == 200 - listing = await client.get("/api/projects") - assert listing.json() == [] - - async def test_save_pipeline(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "proj"}) - graph = {"nodes": [{"id": "n1"}], "edges": []} - resp = await client.post( - "/api/projects/proj/pipelines/my-pipe", - json={"graph": graph}, - ) - assert resp.status_code == 200 - - async def test_load_pipeline(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "proj"}) - graph = {"nodes": [{"id": "n1"}], "edges": []} - await client.post( - "/api/projects/proj/pipelines/my-pipe", - json={"graph": graph}, - ) - resp = await client.get("/api/projects/proj/pipelines/my-pipe") - assert resp.status_code == 200 - assert resp.json() == graph - - async def test_load_missing_pipeline_returns_404(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "proj"}) - resp = await client.get("/api/projects/proj/pipelines/nope") - assert resp.status_code == 404 - - async def test_delete_nonexistent_project_returns_404(self, client: httpx.AsyncClient): - resp = await client.delete("/api/projects/nonexistent") - assert resp.status_code == 404 - - async def test_save_pipeline_nonexistent_project_returns_404(self, client: httpx.AsyncClient): - resp = await client.post( - "/api/projects/nonexistent/pipelines/test", - json={"graph": {"nodes": [], "edges": []}}, - ) - assert resp.status_code == 404 - - -class TestProjectsAPIRename: - async def test_rename_project(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "old-name"}) - resp = await client.patch( - "/api/projects/old-name", - json={"new_name": "new-name"}, - ) - assert resp.status_code == 200 - body = resp.json() - assert body["name"] == "new-name" - listing = await client.get("/api/projects") - names = [p["name"] for p in listing.json()] - assert "new-name" in names - assert "old-name" not in names - - async def test_rename_conflict_returns_409(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "a"}) - await client.post("/api/projects", json={"name": "b"}) - resp = await client.patch( - "/api/projects/a", - json={"new_name": "b"}, - ) - assert resp.status_code == 409 - - async def test_rename_not_found_returns_404(self, client: httpx.AsyncClient): - resp = await client.patch( - "/api/projects/nonexistent", - json={"new_name": "new"}, - ) - assert resp.status_code == 404 - - async def test_update_description(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "proj"}) - resp = await client.patch( - "/api/projects/proj", - json={"description": "updated desc"}, - ) - assert resp.status_code == 200 - assert resp.json()["description"] == "updated desc" - - async def test_rename_and_update_description(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "old"}) - resp = await client.patch( - "/api/projects/old", - json={"new_name": "new", "description": "new desc"}, - ) - assert resp.status_code == 200 - body = resp.json() - assert body["name"] == "new" - assert body["description"] == "new desc" - - -class TestProjectsAPIDeleteAll: - async def test_delete_all(self, client: httpx.AsyncClient): - await client.post("/api/projects", json={"name": "a"}) - await client.post("/api/projects", json={"name": "b"}) - resp = await client.delete("/api/projects") - assert resp.status_code == 200 - body = resp.json() - assert body["status"] == "deleted" - assert body["count"] == 2 - listing = await client.get("/api/projects") - assert listing.json() == [] - - async def test_delete_all_empty(self, client: httpx.AsyncClient): - resp = await client.delete("/api/projects") - assert resp.status_code == 200 - assert resp.json()["count"] == 0 diff --git a/tests/test_studio/test_server.py b/tests/test_studio/test_server.py deleted file mode 100644 index 0a0879be..00000000 --- a/tests/test_studio/test_server.py +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the Studio FastAPI server.""" - -from __future__ import annotations - -import importlib.metadata - -import pytest - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx - -from fireflyframework_agentic.studio.server import create_studio_app - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def app(): - """Create a Studio app for testing.""" - return create_studio_app() - - -@pytest.fixture() -async def client(app): - """Provide an async httpx client bound to the test app.""" - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -# --------------------------------------------------------------------------- -# Health endpoint -# --------------------------------------------------------------------------- - - -class TestHealthEndpoint: - async def test_health_returns_200(self, client: httpx.AsyncClient): - resp = await client.get("/api/health") - assert resp.status_code == 200 - - async def test_health_returns_status_ok(self, client: httpx.AsyncClient): - resp = await client.get("/api/health") - body = resp.json() - assert body["status"] == "ok" - - async def test_health_returns_version(self, client: httpx.AsyncClient): - resp = await client.get("/api/health") - body = resp.json() - expected_version = importlib.metadata.version("fireflyframework-agentic") - assert body["version"] == expected_version - - -# --------------------------------------------------------------------------- -# CORS middleware -# --------------------------------------------------------------------------- - - -class TestCORSMiddleware: - async def test_cors_allows_localhost_5173(self, client: httpx.AsyncClient): - resp = await client.options( - "/api/health", - headers={ - "Origin": "http://localhost:5173", - "Access-Control-Request-Method": "GET", - }, - ) - assert resp.headers.get("access-control-allow-origin") == "http://localhost:5173" - - async def test_cors_allows_localhost_4173(self, client: httpx.AsyncClient): - resp = await client.options( - "/api/health", - headers={ - "Origin": "http://localhost:4173", - "Access-Control-Request-Method": "GET", - }, - ) - assert resp.headers.get("access-control-allow-origin") == "http://localhost:4173" - - async def test_cors_allows_tauri_localhost(self, client: httpx.AsyncClient): - resp = await client.options( - "/api/health", - headers={ - "Origin": "tauri://localhost", - "Access-Control-Request-Method": "GET", - }, - ) - assert resp.headers.get("access-control-allow-origin") == "tauri://localhost" - - async def test_cors_rejects_unknown_origin(self, client: httpx.AsyncClient): - resp = await client.options( - "/api/health", - headers={ - "Origin": "http://evil.example.com", - "Access-Control-Request-Method": "GET", - }, - ) - assert resp.headers.get("access-control-allow-origin") is None - - -# --------------------------------------------------------------------------- -# App factory -# --------------------------------------------------------------------------- - - -class TestAppFactory: - def test_create_studio_app_returns_fastapi(self): - from fastapi import FastAPI - - app = create_studio_app() - assert isinstance(app, FastAPI) - - def test_create_studio_app_has_correct_title(self): - app = create_studio_app() - assert app.title == "Firefly Agentic Studio" - - def test_create_studio_app_has_package_version(self): - app = create_studio_app() - expected_version = importlib.metadata.version("fireflyframework-agentic") - assert app.version == expected_version - - def test_create_studio_app_accepts_custom_config(self): - from fireflyframework_agentic.studio.config import StudioConfig - - config = StudioConfig(_env_file=None, port=9999) - app = create_studio_app(config=config) - assert app is not None diff --git a/tests/test_studio/test_settings.py b/tests/test_studio/test_settings.py deleted file mode 100644 index 2ed1b6cc..00000000 --- a/tests/test_studio/test_settings.py +++ /dev/null @@ -1,217 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for Studio settings persistence and REST API.""" - -from __future__ import annotations - -import json -import os -import stat - -import pytest -from pydantic import SecretStr - -from fireflyframework_agentic.studio.settings import ( - ModelDefaults, - ProviderCredentials, - StudioSettings, - apply_settings_to_env, - is_first_start, - load_settings, - save_settings, -) - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx - -from fireflyframework_agentic.studio.server import create_studio_app - -# --------------------------------------------------------------------------- -# Unit tests — file I/O -# --------------------------------------------------------------------------- - - -class TestIsFirstStart: - def test_true_when_no_file(self, tmp_path): - assert is_first_start(tmp_path / "settings.json") is True - - def test_false_when_file_exists(self, tmp_path): - settings_file = tmp_path / "settings.json" - settings_file.write_text("{}") - assert is_first_start(settings_file) is False - - -class TestLoadSettings: - def test_returns_defaults_when_no_file(self, tmp_path): - settings = load_settings(tmp_path / "settings.json") - assert settings.setup_complete is False - assert settings.model_defaults.default_model == "openai:gpt-4o" - - def test_handles_corrupt_file(self, tmp_path): - settings_file = tmp_path / "settings.json" - settings_file.write_text("not json!!!") - settings = load_settings(settings_file) - assert settings.setup_complete is False - - def test_loads_persisted_data(self, tmp_path): - settings_file = tmp_path / "settings.json" - data = { - "credentials": {"openai_api_key": "sk-test123"}, - "model_defaults": {"default_model": "anthropic:claude-3-opus", "temperature": 0.5, "retries": 2}, - "setup_complete": True, - } - settings_file.write_text(json.dumps(data)) - settings = load_settings(settings_file) - assert settings.setup_complete is True - assert settings.model_defaults.default_model == "anthropic:claude-3-opus" - assert settings.model_defaults.temperature == 0.5 - assert settings.credentials.openai_api_key is not None - assert settings.credentials.openai_api_key.get_secret_value() == "sk-test123" - - -class TestSaveSettings: - def test_creates_file(self, tmp_path): - settings_file = tmp_path / "sub" / "settings.json" - settings = StudioSettings() - save_settings(settings, settings_file) - assert settings_file.exists() - - def test_enforces_permissions(self, tmp_path): - settings_file = tmp_path / "settings.json" - save_settings(StudioSettings(), settings_file) - mode = settings_file.stat().st_mode - assert mode & stat.S_IRUSR # owner read - assert mode & stat.S_IWUSR # owner write - assert not mode & stat.S_IRGRP # no group read - assert not mode & stat.S_IROTH # no other read - - def test_roundtrip(self, tmp_path): - settings_file = tmp_path / "settings.json" - original = StudioSettings( - credentials=ProviderCredentials(openai_api_key=SecretStr("sk-roundtrip")), - model_defaults=ModelDefaults(default_model="test:model", temperature=1.0, retries=5), - setup_complete=True, - ) - save_settings(original, settings_file) - loaded = load_settings(settings_file) - assert loaded.setup_complete is True - assert loaded.model_defaults.default_model == "test:model" - assert loaded.model_defaults.temperature == 1.0 - assert loaded.model_defaults.retries == 5 - assert loaded.credentials.openai_api_key is not None - assert loaded.credentials.openai_api_key.get_secret_value() == "sk-roundtrip" - - -class TestApplySettingsToEnv: - def test_applies_keys(self, monkeypatch): - monkeypatch.delenv("OPENAI_API_KEY", raising=False) - settings = StudioSettings( - credentials=ProviderCredentials(openai_api_key=SecretStr("sk-env-test")), - ) - apply_settings_to_env(settings) - assert os.environ.get("OPENAI_API_KEY") == "sk-env-test" - # Cleanup - monkeypatch.delenv("OPENAI_API_KEY", raising=False) - - def test_does_not_override_existing(self, monkeypatch): - monkeypatch.setenv("OPENAI_API_KEY", "sk-existing") - settings = StudioSettings( - credentials=ProviderCredentials(openai_api_key=SecretStr("sk-new")), - ) - apply_settings_to_env(settings) - assert os.environ["OPENAI_API_KEY"] == "sk-existing" - - -# --------------------------------------------------------------------------- -# API integration tests -# --------------------------------------------------------------------------- - - -@pytest.fixture() -def app(tmp_path): - """Create a Studio app with an isolated settings path.""" - settings_file = tmp_path / "settings.json" - return create_studio_app(settings_path=settings_file) - - -@pytest.fixture() -async def client(app): - """Provide an async httpx client bound to the test app.""" - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -class TestSettingsAPI: - async def test_get_settings_returns_200(self, client: httpx.AsyncClient): - resp = await client.get("/api/settings") - assert resp.status_code == 200 - - async def test_get_settings_structure(self, client: httpx.AsyncClient): - resp = await client.get("/api/settings") - body = resp.json() - assert "credentials" in body - assert "model_defaults" in body - assert "setup_complete" in body - - async def test_post_settings_persists(self, client: httpx.AsyncClient): - payload = { - "credentials": {"openai_api_key": "sk-test-persist"}, - "model_defaults": {"default_model": "openai:gpt-4o-mini"}, - "setup_complete": True, - } - resp = await client.post("/api/settings", json=payload) - assert resp.status_code == 200 - body = resp.json() - assert body["setup_complete"] is True - assert body["model_defaults"]["default_model"] == "openai:gpt-4o-mini" - - async def test_keys_masked_in_get(self, client: httpx.AsyncClient): - # First save a key - await client.post("/api/settings", json={"credentials": {"openai_api_key": "sk-maskedtest1234"}}) - # Then GET and verify masking - resp = await client.get("/api/settings") - body = resp.json() - masked = body["credentials"]["openai_api_key"] - assert masked.startswith("****") - assert masked.endswith("1234") - assert "maskedtest" not in masked - - async def test_status_first_start(self, client: httpx.AsyncClient): - resp = await client.get("/api/settings/status") - assert resp.status_code == 200 - body = resp.json() - assert body["first_start"] is True - assert body["setup_complete"] is False - - async def test_status_after_setup(self, client: httpx.AsyncClient): - await client.post("/api/settings", json={"setup_complete": True}) - resp = await client.get("/api/settings/status") - body = resp.json() - assert body["first_start"] is False - assert body["setup_complete"] is True - - async def test_merge_preserves_existing(self, client: httpx.AsyncClient): - # Save openai key - await client.post("/api/settings", json={"credentials": {"openai_api_key": "sk-first"}}) - # Save anthropic key (openai should be preserved) - await client.post("/api/settings", json={"credentials": {"anthropic_api_key": "sk-ant-second"}}) - # Verify both exist - resp = await client.get("/api/settings") - body = resp.json() - assert body["credentials"]["openai_api_key"] is not None - assert body["credentials"]["anthropic_api_key"] is not None diff --git a/tests/test_studio/test_static_serving.py b/tests/test_studio/test_static_serving.py deleted file mode 100644 index 98fedce2..00000000 --- a/tests/test_studio/test_static_serving.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for static file serving of the bundled Studio frontend.""" - -from __future__ import annotations - -from pathlib import Path -from unittest.mock import patch - -import pytest - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx - -from fireflyframework_agentic.studio.server import create_studio_app - - -@pytest.fixture() -def static_dir(tmp_path: Path) -> Path: - """Create a temporary static directory with a minimal SPA.""" - d = tmp_path / "static" - d.mkdir() - (d / "index.html").write_text("Firefly Studio") - app_dir = d / "_app" - app_dir.mkdir() - (app_dir / "app.js").write_text("console.log('ok');") - return d - - -class TestStaticServing: - async def test_serves_index_html_when_static_dir_exists(self, static_dir: Path): - """When bundled static files exist, / serves index.html.""" - with patch( - "fireflyframework_agentic.studio.server._get_default_static_dir", - return_value=static_dir, - ): - app = create_studio_app() - - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as client: - resp = await client.get("/") - assert resp.status_code == 200 - assert "Firefly Studio" in resp.text - - async def test_api_routes_work_with_static_serving(self, static_dir: Path): - """API routes still work when static files are mounted.""" - with patch( - "fireflyframework_agentic.studio.server._get_default_static_dir", - return_value=static_dir, - ): - app = create_studio_app() - - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as client: - resp = await client.get("/api/health") - assert resp.status_code == 200 - assert resp.json()["status"] == "ok" - - async def test_no_static_serving_without_index_html(self): - """When no bundled frontend exists, the app still starts normally.""" - app = create_studio_app() - - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as client: - # API should still work - resp = await client.get("/api/health") - assert resp.status_code == 200 - assert resp.json()["status"] == "ok" diff --git a/tests/test_studio/test_tunnel.py b/tests/test_studio/test_tunnel.py deleted file mode 100644 index b95f243f..00000000 --- a/tests/test_studio/test_tunnel.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for Cloudflare Tunnel management.""" - -from __future__ import annotations - -import shutil -from unittest.mock import patch - -import pytest - -from fireflyframework_agentic.studio.tunnel import TunnelManager - - -class TestTunnelManager: - def test_cloudflared_not_installed(self): - with patch.object(shutil, "which", return_value=None): - tm = TunnelManager(port=8470) - assert tm.is_available() is False - - def test_cloudflared_installed(self): - with patch.object(shutil, "which", return_value="/usr/local/bin/cloudflared"): - tm = TunnelManager(port=8470) - assert tm.is_available() is True - - def test_initial_status_is_stopped(self): - tm = TunnelManager(port=8470) - status = tm.get_status() - assert status["active"] is False - assert status["url"] is None - assert status["port"] == 8470 - - def test_custom_port(self): - tm = TunnelManager(port=9090) - assert tm.port == 9090 - assert tm.get_status()["port"] == 9090 - - async def test_start_raises_when_cloudflared_not_available(self): - with patch.object(shutil, "which", return_value=None): - tm = TunnelManager(port=8470) - with pytest.raises(RuntimeError, match="cloudflared is not installed"): - await tm.start() - - async def test_start_raises_when_already_running(self): - tm = TunnelManager(port=8470) - tm._process = object() # fake a running process - with pytest.raises(RuntimeError, match="already running"): - await tm.start() - - async def test_stop_when_not_running(self): - tm = TunnelManager(port=8470) - await tm.stop() # Should not raise - assert tm.get_status()["active"] is False diff --git a/tests/test_studio/test_tunnel_api.py b/tests/test_studio/test_tunnel_api.py deleted file mode 100644 index 296a3d43..00000000 --- a/tests/test_studio/test_tunnel_api.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright 2026 Firefly Software Solutions Inc -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the tunnel API endpoints.""" - -from __future__ import annotations - -import pytest - -pytest.importorskip("fastapi", reason="fastapi not installed") -pytest.importorskip("httpx", reason="httpx not installed") - -import httpx - -from fireflyframework_agentic.studio.server import create_studio_app - - -@pytest.fixture() -def app(): - return create_studio_app() - - -@pytest.fixture() -async def client(app): - transport = httpx.ASGITransport(app=app) - async with httpx.AsyncClient(transport=transport, base_url="http://test") as c: - yield c - - -# --------------------------------------------------------------------------- -# Tunnel API -# --------------------------------------------------------------------------- - - -class TestTunnelAPI: - async def test_tunnel_status_initial(self, client): - resp = await client.get("/api/tunnel/status") - assert resp.status_code == 200 - body = resp.json() - assert body["active"] is False - assert body["url"] is None - - async def test_tunnel_stop_when_not_running(self, client): - resp = await client.post("/api/tunnel/stop") - assert resp.status_code == 200 - body = resp.json() - assert body["status"] == "stopped" - - -# --------------------------------------------------------------------------- -# Expose CLI subcommand -# --------------------------------------------------------------------------- - - -class TestExposeCLI: - def test_expose_parser(self): - from fireflyframework_agentic.studio.cli import parse_args - - args = parse_args(["expose", "--port", "9000"]) - assert args.command == "expose" - assert args.port == 9000 - - def test_expose_parser_default_port(self): - from fireflyframework_agentic.studio.cli import parse_args - - args = parse_args(["expose"]) - assert args.command == "expose" - assert args.port == 8470 From 43a94dbd05ee3606d0824900ec1f528cb5ed69fa Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 27 Apr 2026 19:09:32 +0200 Subject: [PATCH 3/7] fix: rename leftover fireflyframework_genai imports in test_google MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This file was excluded from the bulk sed because it uses mock_genai fixtures and patches fireflyframework_genai.embeddings.providers.google.genai where 'genai' is the Google generativeai library alias. The exclusion was too coarse — only the lowercase 'genai' identifier (Google's lib) should have been preserved. The package-prefix 'fireflyframework_genai' must still be renamed. Caused CI failure on PR #74: ModuleNotFoundError: No module named 'fireflyframework_genai' --- tests/test_embeddings/test_providers/test_google.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_embeddings/test_providers/test_google.py b/tests/test_embeddings/test_providers/test_google.py index e37157f1..5d341835 100644 --- a/tests/test_embeddings/test_providers/test_google.py +++ b/tests/test_embeddings/test_providers/test_google.py @@ -4,12 +4,12 @@ from unittest.mock import patch -from fireflyframework_genai.embeddings.providers.google import GoogleEmbedder -from fireflyframework_genai.embeddings.types import EmbeddingResult +from fireflyframework_agentic.embeddings.providers.google import GoogleEmbedder +from fireflyframework_agentic.embeddings.types import EmbeddingResult class TestGoogleEmbedder: - @patch("fireflyframework_genai.embeddings.providers.google.genai") + @patch("fireflyframework_agentic.embeddings.providers.google.genai") async def test_embed_batch(self, mock_genai): mock_genai.embed_content.return_value = {"embedding": [[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]} @@ -20,7 +20,7 @@ async def test_embed_batch(self, mock_genai): assert len(result.embeddings) == 2 assert result.model == "models/text-embedding-004" - @patch("fireflyframework_genai.embeddings.providers.google.genai") + @patch("fireflyframework_agentic.embeddings.providers.google.genai") async def test_embed_one(self, mock_genai): mock_genai.embed_content.return_value = {"embedding": [[0.1, 0.2, 0.3]]} @@ -30,12 +30,12 @@ async def test_embed_one(self, mock_genai): assert isinstance(vec, list) assert len(vec) == 3 - @patch("fireflyframework_genai.embeddings.providers.google.genai") + @patch("fireflyframework_agentic.embeddings.providers.google.genai") def test_default_model(self, mock_genai): embedder = GoogleEmbedder() assert embedder.model == "models/text-embedding-004" - @patch("fireflyframework_genai.embeddings.providers.google.genai") + @patch("fireflyframework_agentic.embeddings.providers.google.genai") def test_configure_with_api_key(self, mock_genai): GoogleEmbedder(api_key="test-key") mock_genai.configure.assert_called_once_with(api_key="test-key") From 95d65c1be53c2a33c0bc75c285557a6d39151473 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 27 Apr 2026 19:27:41 +0200 Subject: [PATCH 4/7] ci: retrigger after CodeQL JS/Rust language removal From 9cd053116516e376519e8efb1c10b4c457447e3a Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 27 Apr 2026 19:41:09 +0200 Subject: [PATCH 5/7] ci: retrigger From 524e17bf64175e4c9aa8442df38adca7e2b87c66 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 27 Apr 2026 19:45:17 +0200 Subject: [PATCH 6/7] ci: retrigger after stale codeql db cleanup From 34ab5448e84b779e0954f7a33b81d6fed04582c9 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 27 Apr 2026 19:48:45 +0200 Subject: [PATCH 7/7] ci: retrigger after codeql matrix refresh