quantum-framework 1.0.0__tar.gz → 1.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {quantum_framework-1.0.0/quantum_framework.egg-info → quantum_framework-1.0.1}/PKG-INFO +123 -57
- quantum_framework-1.0.1/README.md +307 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/pyproject.toml +2 -2
- quantum_framework-1.0.1/quantum/cli/__init__.py +3 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/runner.py +25 -5
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/docs_links.py +1 -1
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/expression_stdlib.py +36 -6
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/control_flow/loop_parser.py +4 -1
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/transaction_parser.py +17 -5
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/tiers.py +1 -1
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/action_handler.py +8 -6
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/execution_context.py +3 -4
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/loop_executor.py +42 -17
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/set_executor.py +4 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/knowledge_service.py +58 -5
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/param_validation.py +14 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/renderer.py +4 -15
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/web_html.py +24 -4
- {quantum_framework-1.0.0 → quantum_framework-1.0.1/quantum_framework.egg-info}/PKG-INFO +123 -57
- quantum_framework-1.0.0/README.md +0 -241
- quantum_framework-1.0.0/quantum/cli/__init__.py +0 -2
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/LICENSE +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/admin.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/check.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/hot_reload.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/jobs.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/migrations.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/mq.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/pkg.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/schema_plan.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/cli/server_process.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/base_generator.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/cli.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/expression_transformer.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/javascript/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/javascript/generator.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/optimizer.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/python/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/python/generator.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/python/runtime.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/compiler/transpiler.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/ast_nodes.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/config_env.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/expression_diagnostics.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/expressions.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/agents/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/agents/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/conditionals/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/conditionals/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/data_import/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/data_import/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/data_import/src/runtime.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/dump/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/dump/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/dump/src/parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/dump/src/runtime.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/functions/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/functions/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/game_engine_2d/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/game_engine_2d/src/ast_nodes.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/game_engine_2d/src/parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/invocation/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/invocation/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/invocation/src/runtime.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/knowledge_base/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/knowledge_base/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/knowledge_base/src/parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/logging/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/logging/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/logging/src/parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/logging/src/runtime.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/loops/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/loops/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/native_testing/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/native_testing/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/native_testing/src/parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/query/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/query/src/query_validators.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/state_management/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/state_management/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/terminal_engine/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/terminal_engine/src/ast_nodes.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/terminal_engine/src/parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/theming/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/theming/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/theming/src/presets.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/ui_engine/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/ui_engine/src/ast_nodes.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/ui_engine/src/parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/websocket/src/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/features/websocket/src/ast_node.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/guards.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/html_compat.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parser_registry.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/agent_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/knowledge_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/llm_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/team_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/base.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/composition/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/composition/import_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/composition/slot_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/control_flow/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/control_flow/if_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/control_flow/set_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/data_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/invoke_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/query_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/events/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/events/dispatch_event_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/forms/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/forms/action_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/forms/flash_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/forms/redirect_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/functions/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/functions/function_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/functions/param_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/functions/return_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/html/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/html/component_call_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/html/html_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/jobs/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/jobs/job_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/jobs/schedule_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/jobs/thread_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/message_ack_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/message_nack_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/message_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/queue_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/websocket_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/routing/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/routing/route_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/pyclass_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/pydecorator_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/pyimport_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/python_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/dump_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/file_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/log_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/mail_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/core/xml_lines.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/packages/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/packages/manager.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/packages/manifest.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/packages/registry.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/packages/resolver.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/plugins/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/plugins/hooks.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/plugins/loader.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/plugins/manifest.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/plugins/registry.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/memory_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/rabbitmq_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/redis_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/sqlite_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/agent_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/app_testing.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ast_cache.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/auth_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/component.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/component_composer.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/component_resolver.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/conditions.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/database_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/db_schema.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/dev_panel.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/email_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/error_handler.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executor_registry.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/agent_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/knowledge_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/llm_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/team_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/base.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/if_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/redirect_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/data_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/invoke_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/query_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/transaction_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/jobs/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/jobs/job_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/jobs/schedule_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/jobs/thread_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/message_ack_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/message_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/queue_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/websocket_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/scripting/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/scripting/pyclass_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/scripting/pyimport_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/scripting/python_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/dump_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/file_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/log_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/mail_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/expression_cache.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/file_upload_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/function_registry.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/game_builder.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/game_code_generator.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/game_templates.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/godot_code_generator.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/godot_templates.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/history.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/job_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/llm_cache.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/llm_providers.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/llm_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/llm_stream.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/local_server.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/logging_setup.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/message_broker.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/message_queue_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/process_identity.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/pypy_compat.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/python_bridge.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/query_validators.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/service_container.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/table_params.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/terminal_builder.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/terminal_code_generator.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/terminal_templates.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_builder.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_console.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_desktop.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_form_rules.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_html_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_html_templates.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_mobile_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_mobile_templates.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_page_renderer.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_pager.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_table_edit.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_textual_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_textual_templates.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_tokens.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_validator.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/ui_view.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/validators.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/web_config.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/web_errors.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/web_lifecycle.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/web_server.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/websocket_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/websocket_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/websocket_transport.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/runtime/wsgi.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/services.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum/utils/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/assets/quantum-admin-connectors.js +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/assets/quantum-admin.css +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/assets/quantum-source-highlight.js +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/_layout/AdminShell.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/agents.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/app/[name].q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/applications.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/component/[...path].q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/components.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/connectors.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/dashboard.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/database.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/features.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/index.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/jobs.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/login.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/logout.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/settings.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/source.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/tests.q +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/auth_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/connector_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/crud.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/database.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/docker_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/environment_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/models.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/secret_manager.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/core/settings_service.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/__init__.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/_base.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/_component_test_generator.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/_yaml_editor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/apps.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/auth.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/components.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/connectors.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/projects.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/repository.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/settings.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_admin/services/yaml_import.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/SOURCES.txt +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/dependency_links.txt +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/entry_points.txt +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/requires.txt +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/top_level.txt +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/setup.cfg +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_agent.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_animations.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_ast_cache.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_component_library.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_expression_cache.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_form_validation.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_game_codegen.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_game_e2e.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_game_engine.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_game_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_godot_codegen.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_job_executor.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_llm_providers.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_message_broker.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_message_queue.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_mobile_target.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_multi_agent.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_packages.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_plugins.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_pypy_compat.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_python_scripting.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_terminal_codegen.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_terminal_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_theming.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_ui_html_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_ui_parity.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_ui_parser.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_ui_textual_adapter.py +0 -0
- {quantum_framework-1.0.0 → quantum_framework-1.0.1}/tests/test_websocket.py +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quantum-framework
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: Declarative web applications in XML, with AI and RAG built into the language
|
|
5
5
|
Author-email: Daniel Gregorio <danielgregorio2611@gmail.com>
|
|
6
6
|
License: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/danielgregorio/quantum
|
|
8
|
-
Project-URL: Documentation, https://
|
|
8
|
+
Project-URL: Documentation, https://quantumframework.net/
|
|
9
9
|
Project-URL: Changelog, https://github.com/danielgregorio/quantum/releases
|
|
10
10
|
Project-URL: Repository, https://github.com/danielgregorio/quantum
|
|
11
11
|
Keywords: framework,declarative,xml,web,llm,rag
|
|
@@ -52,7 +52,7 @@ Dynamic: license-file
|
|
|
52
52
|
[](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml)
|
|
53
53
|
[](https://pypi.org/project/quantum-framework/)
|
|
54
54
|
[](https://pypi.org/project/quantum-framework/)
|
|
55
|
-
[](https://quantumframework.net/)
|
|
56
56
|
[](https://github.com/danielgregorio/quantum/blob/main/LICENSE)
|
|
57
57
|
|
|
58
58
|
> **Declarative web apps in XML, with AI and RAG built into the language.
|
|
@@ -70,73 +70,132 @@ the app.
|
|
|
70
70
|
|
|
71
71
|
## The part that isn't like the others
|
|
72
72
|
|
|
73
|
-
Retrieval-augmented generation, as a language construct
|
|
73
|
+
Retrieval-augmented generation, as a language construct — this page answers a
|
|
74
|
+
question from the Markdown files in `knowledge/` and lists the ones it used:
|
|
74
75
|
|
|
75
76
|
```xml
|
|
76
|
-
<q:component name="
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
<q:component name="Ask">
|
|
78
|
+
<!-- The documents in knowledge/, split into chunks and embedded when the
|
|
79
|
+
page runs. persist="false" keeps the index in memory; without it, it is
|
|
80
|
+
stored in ./.quantum/knowledge and reused until a document changes. -->
|
|
81
|
+
<q:knowledge name="docs" persist="false" chunkSize="300" chunkOverlap="30">
|
|
82
|
+
<q:source type="directory" path="knowledge" pattern="*.md" />
|
|
79
83
|
</q:knowledge>
|
|
80
84
|
|
|
81
|
-
<q:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
<
|
|
88
|
-
|
|
85
|
+
<q:set name="question" value="{query.q}" default="" />
|
|
86
|
+
|
|
87
|
+
<q:if condition="question">
|
|
88
|
+
<!-- The question retrieves the closest chunks; they reach the model
|
|
89
|
+
numbered, with the instruction to answer only from them and cite
|
|
90
|
+
them like [1]. -->
|
|
91
|
+
<q:llm name="answer" knowledge="docs" top="2">
|
|
92
|
+
<q:message role="user">{question}</q:message>
|
|
93
|
+
</q:llm>
|
|
94
|
+
</q:if>
|
|
95
|
+
|
|
96
|
+
<ui:window title="Ask the store">
|
|
97
|
+
<ui:form>
|
|
98
|
+
<ui:input bind="q" value="{question}" placeholder="Your question" />
|
|
99
|
+
<ui:button variant="primary">Ask</ui:button>
|
|
100
|
+
</ui:form>
|
|
101
|
+
<q:if condition="question">
|
|
102
|
+
<ui:text>{answer}</ui:text>
|
|
103
|
+
<q:if condition="answer_result.grounded">
|
|
104
|
+
<ui:text>Sources:</ui:text>
|
|
105
|
+
<q:loop items="{answer_result.sources}" var="s">
|
|
106
|
+
<ui:text>[{s.n}] {s.name}</ui:text>
|
|
107
|
+
</q:loop>
|
|
108
|
+
<q:else>
|
|
109
|
+
<ui:alert variant="warning">This answer cites none of the documents.</ui:alert>
|
|
110
|
+
</q:else>
|
|
111
|
+
</q:if>
|
|
112
|
+
</q:if>
|
|
113
|
+
</ui:window>
|
|
89
114
|
</q:component>
|
|
90
115
|
```
|
|
91
116
|
|
|
92
|
-
That
|
|
93
|
-
and asks the model to answer from them, citing each one — in the markup.
|
|
94
|
-
|
|
95
|
-
behind it.
|
|
117
|
+
That splits the documents into chunks, embeds them, retrieves the closest ones
|
|
118
|
+
and asks the model to answer only from them, citing each one — in the markup.
|
|
119
|
+
`answer_result.grounded` says whether the answer cites any of them. There is no
|
|
120
|
+
Python file behind it. (Recipe:
|
|
121
|
+
[Answers with their sources](https://quantumframework.net/cookbook/ai/answer-with-sources).)
|
|
96
122
|
|
|
97
|
-
An agent
|
|
123
|
+
An agent whose tools you write in Quantum, same idea:
|
|
98
124
|
|
|
99
125
|
```xml
|
|
100
|
-
<q:
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
<q:
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
126
|
+
<q:component name="Assistant">
|
|
127
|
+
<!-- The model never writes SQL: it picks a tool and its arguments. The
|
|
128
|
+
tool is a read-only query you wrote; its q:param says the argument's
|
|
129
|
+
type, and the model's value is converted to it before the query runs. -->
|
|
130
|
+
<q:agent name="stock" maxIterations="4" timeout="60000" onerror="continue">
|
|
131
|
+
<q:instruction>You help a shop owner. Use the tools to look at the data,
|
|
132
|
+
then answer in one sentence.</q:instruction>
|
|
133
|
+
|
|
134
|
+
<q:tool name="low_stock" description="Products with fewer units in stock than `below`">
|
|
135
|
+
<q:param name="below" type="integer" default="5" />
|
|
136
|
+
<q:function name="lowStock">
|
|
137
|
+
<q:query name="rows" datasource="db">
|
|
138
|
+
SELECT name, stock FROM products WHERE stock < :below ORDER BY stock
|
|
139
|
+
<q:param name="below" value="{below}" type="integer" />
|
|
140
|
+
</q:query>
|
|
141
|
+
<q:return value="{rows}" />
|
|
142
|
+
</q:function>
|
|
143
|
+
</q:tool>
|
|
144
|
+
|
|
145
|
+
<q:execute task="Which products are running out of stock?" />
|
|
146
|
+
</q:agent>
|
|
147
|
+
|
|
148
|
+
<ui:window title="Stock assistant">
|
|
149
|
+
<q:if condition="stock_result.success">
|
|
150
|
+
<ui:text>{stock}</ui:text>
|
|
151
|
+
<q:else>
|
|
152
|
+
<ui:alert variant="warning">The assistant did not finish: {stock_result.error.message}</ui:alert>
|
|
153
|
+
</q:else>
|
|
154
|
+
</q:if>
|
|
155
|
+
<!-- Every tool call the agent made, written out. -->
|
|
156
|
+
<q:loop items="{stock_result.actions}" var="a">
|
|
157
|
+
<ui:text>Called {a.call}</ui:text>
|
|
158
|
+
</q:loop>
|
|
159
|
+
</ui:window>
|
|
160
|
+
</q:component>
|
|
114
161
|
```
|
|
115
162
|
|
|
116
|
-
The
|
|
117
|
-
|
|
163
|
+
The model never writes SQL: it picks a tool and its arguments, and the
|
|
164
|
+
argument is converted to the `q:param`'s type before the query runs. The
|
|
165
|
+
reasoning loop, the tool calls and the failure contract (`onerror`,
|
|
166
|
+
`stock_result`) are the runtime's job. (Recipe:
|
|
167
|
+
[An agent over your database](https://quantumframework.net/cookbook/ai/agent-over-your-database).)
|
|
118
168
|
|
|
119
169
|
---
|
|
120
170
|
|
|
121
171
|
## The rest of the language
|
|
122
172
|
|
|
123
173
|
```xml
|
|
124
|
-
<q:component name="
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
174
|
+
<q:component name="Products">
|
|
175
|
+
<!-- ?name=mouse from the URL; empty when it is not there. -->
|
|
176
|
+
<q:set name="term" value="{query.name}" default="" />
|
|
177
|
+
|
|
178
|
+
<!-- :pattern is bound to the q:param: the value is sent to the database
|
|
179
|
+
apart from the SQL, so it can never change what the SQL does. -->
|
|
180
|
+
<q:query name="products" datasource="db">
|
|
181
|
+
SELECT name, price FROM products WHERE name LIKE :pattern ORDER BY price
|
|
182
|
+
<q:param name="pattern" value="%{term}%" type="string" />
|
|
128
183
|
</q:query>
|
|
129
184
|
|
|
130
|
-
<
|
|
131
|
-
<
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
185
|
+
<ui:window title="Products">
|
|
186
|
+
<ui:text>{products_result.recordCount} products</ui:text>
|
|
187
|
+
<ui:table source="{products}">
|
|
188
|
+
<ui:column key="name" label="Name" />
|
|
189
|
+
<ui:column key="price" label="Price" />
|
|
190
|
+
</ui:table>
|
|
191
|
+
</ui:window>
|
|
135
192
|
</q:component>
|
|
136
193
|
```
|
|
137
194
|
|
|
138
|
-
|
|
139
|
-
`http://localhost:8080
|
|
195
|
+
Saved as `components/index.q`, with the database declared in
|
|
196
|
+
`quantum.config.yaml`, `quantum start` serves it at `http://localhost:8080/`,
|
|
197
|
+
and `/?name=mouse` filters it. (Recipe:
|
|
198
|
+
[A query with parameters](https://quantumframework.net/cookbook/data-and-sql/query-with-parameters).)
|
|
140
199
|
|
|
141
200
|
`q:query` refuses to run SQL with an undeclared `:param` — parameterised queries are
|
|
142
201
|
enforced by the parser, not by discipline.
|
|
@@ -145,6 +204,10 @@ Also core: `q:set` with `session.` / `application.` / `request.` scopes, `q:if`,
|
|
|
145
204
|
`q:function`, `q:action` for form handling, `q:data` for CSV/JSON/XML import,
|
|
146
205
|
`q:import` / `q:slot` for composition.
|
|
147
206
|
|
|
207
|
+
The examples above are files of [Cookbook](https://quantumframework.net/cookbook/)
|
|
208
|
+
recipes, byte for byte, and the recipes run in CI; the quick start below is run
|
|
209
|
+
as shown (`tests/docs/test_readme.py` checks both).
|
|
210
|
+
|
|
148
211
|
---
|
|
149
212
|
|
|
150
213
|
## Quick start
|
|
@@ -175,13 +238,14 @@ quantum run hello.q
|
|
|
175
238
|
For a web app, put `.q` files in `components/` and run `quantum start`
|
|
176
239
|
(`components/index.q` is served at `/`). `quantum stop` stops it.
|
|
177
240
|
|
|
178
|
-
For the AI examples you also need
|
|
179
|
-
|
|
241
|
+
For the AI examples you also need a model server — [Ollama](https://ollama.com)
|
|
242
|
+
at `http://localhost:11434` unless `QUANTUM_LLM_BASE_URL` says otherwise — and
|
|
243
|
+
the RAG extra. There is no built-in model name: say which one in
|
|
244
|
+
`quantum.config.yaml` (`llm: model: phi3`) or `QUANTUM_LLM_DEFAULT_MODEL`.
|
|
180
245
|
|
|
181
246
|
```bash
|
|
182
247
|
pip install "quantum-framework[rag]"
|
|
183
248
|
ollama pull phi3 && ollama pull nomic-embed-text
|
|
184
|
-
export QUANTUM_LLM_BASE_URL=http://localhost:11434
|
|
185
249
|
```
|
|
186
250
|
|
|
187
251
|
Declare datasources in `quantum.config.yaml` (next to `components/`) and `q:query` works
|
|
@@ -205,8 +269,9 @@ datasources:
|
|
|
205
269
|
| `check` | Check that pages parse, SQL compiles and query fields exist |
|
|
206
270
|
| `test` | Run the app's `*.test.q` tests |
|
|
207
271
|
| `console` · `desktop` | The application's pages in the terminal, or in a desktop window |
|
|
272
|
+
| `migrate` | Apply, roll back and plan database migrations |
|
|
208
273
|
| `admin` | Start the Quantum Admin (`pip install "quantum-framework[admin]"`) |
|
|
209
|
-
| `pkg` · `jobs` · `mq`
|
|
274
|
+
| `pkg` · `jobs` · `mq` | Component packages (a page cannot import one yet), jobs, message queues — no stability promise |
|
|
210
275
|
|
|
211
276
|
### From source
|
|
212
277
|
|
|
@@ -225,13 +290,14 @@ See [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRI
|
|
|
225
290
|
|
|
226
291
|
## Documentation
|
|
227
292
|
|
|
228
|
-
Full docs at **[
|
|
293
|
+
Full docs at **[quantumframework.net](https://quantumframework.net/)**:
|
|
229
294
|
|
|
230
|
-
- [
|
|
231
|
-
- [
|
|
232
|
-
- [
|
|
295
|
+
- **Start:** [Installation](https://quantumframework.net/guide/installation) · [Quick Start](https://quantumframework.net/guide/quick-start) · [Tutorial: build the tasks app](https://quantumframework.net/tutorial/tasks-app)
|
|
296
|
+
- **Learn:** [Guide](https://quantumframework.net/guide/getting-started) · [Cookbook](https://quantumframework.net/cookbook/) — short tested recipes · [Showcase](https://quantumframework.net/showcase/) — the complete apps
|
|
297
|
+
- **Look up:** [Reference](https://quantumframework.net/reference/) — every tag, function, command and SPEC rule, generated from the code
|
|
298
|
+
- **Plan:** [Stability](https://quantumframework.net/stability/) — what 1.0 promises · [Roadmap](https://quantumframework.net/roadmap/) · [Changelog](https://quantumframework.net/changelog/)
|
|
233
299
|
|
|
234
|
-
|
|
300
|
+
The site is also in [Português](https://quantumframework.net/pt/), [Español](https://quantumframework.net/es/) and [中文](https://quantumframework.net/zh/).
|
|
235
301
|
|
|
236
302
|
---
|
|
237
303
|
|
|
@@ -267,7 +333,7 @@ quantum/
|
|
|
267
333
|
│ ├── runtime/ # Execution engine, web server, renderer
|
|
268
334
|
│ └── cli/ # Command-line entry point
|
|
269
335
|
├── examples/ # runnable .q examples
|
|
270
|
-
├── tests/ # pytest suite
|
|
336
|
+
├── tests/ # pytest suite; conformance/ cites SPEC.md
|
|
271
337
|
├── scripts/ # dev tools
|
|
272
338
|
└── docs/ # VitePress documentation
|
|
273
339
|
```
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# Quantum
|
|
2
|
+
|
|
3
|
+
[](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml)
|
|
4
|
+
[](https://pypi.org/project/quantum-framework/)
|
|
5
|
+
[](https://pypi.org/project/quantum-framework/)
|
|
6
|
+
[](https://quantumframework.net/)
|
|
7
|
+
[](https://github.com/danielgregorio/quantum/blob/main/LICENSE)
|
|
8
|
+
|
|
9
|
+
> **Declarative web apps in XML, with AI and RAG built into the language.
|
|
10
|
+
> No build chain, no JavaScript, no frontend framework.**
|
|
11
|
+
|
|
12
|
+
Quantum is a full-stack framework whose language is markup. State, database queries,
|
|
13
|
+
forms, LLM calls and retrieval-augmented generation are all tags — not libraries you
|
|
14
|
+
wire together. It takes its philosophy from ColdFusion and Adobe Flex: the markup *is*
|
|
15
|
+
the app.
|
|
16
|
+
|
|
17
|
+
> **1.0, and honest about it.** See [Stability](#stability) — the table there
|
|
18
|
+
> reflects what has actually been executed end-to-end, not what is aspirational.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## The part that isn't like the others
|
|
23
|
+
|
|
24
|
+
Retrieval-augmented generation, as a language construct — this page answers a
|
|
25
|
+
question from the Markdown files in `knowledge/` and lists the ones it used:
|
|
26
|
+
|
|
27
|
+
```xml
|
|
28
|
+
<q:component name="Ask">
|
|
29
|
+
<!-- The documents in knowledge/, split into chunks and embedded when the
|
|
30
|
+
page runs. persist="false" keeps the index in memory; without it, it is
|
|
31
|
+
stored in ./.quantum/knowledge and reused until a document changes. -->
|
|
32
|
+
<q:knowledge name="docs" persist="false" chunkSize="300" chunkOverlap="30">
|
|
33
|
+
<q:source type="directory" path="knowledge" pattern="*.md" />
|
|
34
|
+
</q:knowledge>
|
|
35
|
+
|
|
36
|
+
<q:set name="question" value="{query.q}" default="" />
|
|
37
|
+
|
|
38
|
+
<q:if condition="question">
|
|
39
|
+
<!-- The question retrieves the closest chunks; they reach the model
|
|
40
|
+
numbered, with the instruction to answer only from them and cite
|
|
41
|
+
them like [1]. -->
|
|
42
|
+
<q:llm name="answer" knowledge="docs" top="2">
|
|
43
|
+
<q:message role="user">{question}</q:message>
|
|
44
|
+
</q:llm>
|
|
45
|
+
</q:if>
|
|
46
|
+
|
|
47
|
+
<ui:window title="Ask the store">
|
|
48
|
+
<ui:form>
|
|
49
|
+
<ui:input bind="q" value="{question}" placeholder="Your question" />
|
|
50
|
+
<ui:button variant="primary">Ask</ui:button>
|
|
51
|
+
</ui:form>
|
|
52
|
+
<q:if condition="question">
|
|
53
|
+
<ui:text>{answer}</ui:text>
|
|
54
|
+
<q:if condition="answer_result.grounded">
|
|
55
|
+
<ui:text>Sources:</ui:text>
|
|
56
|
+
<q:loop items="{answer_result.sources}" var="s">
|
|
57
|
+
<ui:text>[{s.n}] {s.name}</ui:text>
|
|
58
|
+
</q:loop>
|
|
59
|
+
<q:else>
|
|
60
|
+
<ui:alert variant="warning">This answer cites none of the documents.</ui:alert>
|
|
61
|
+
</q:else>
|
|
62
|
+
</q:if>
|
|
63
|
+
</q:if>
|
|
64
|
+
</ui:window>
|
|
65
|
+
</q:component>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
That splits the documents into chunks, embeds them, retrieves the closest ones
|
|
69
|
+
and asks the model to answer only from them, citing each one — in the markup.
|
|
70
|
+
`answer_result.grounded` says whether the answer cites any of them. There is no
|
|
71
|
+
Python file behind it. (Recipe:
|
|
72
|
+
[Answers with their sources](https://quantumframework.net/cookbook/ai/answer-with-sources).)
|
|
73
|
+
|
|
74
|
+
An agent whose tools you write in Quantum, same idea:
|
|
75
|
+
|
|
76
|
+
```xml
|
|
77
|
+
<q:component name="Assistant">
|
|
78
|
+
<!-- The model never writes SQL: it picks a tool and its arguments. The
|
|
79
|
+
tool is a read-only query you wrote; its q:param says the argument's
|
|
80
|
+
type, and the model's value is converted to it before the query runs. -->
|
|
81
|
+
<q:agent name="stock" maxIterations="4" timeout="60000" onerror="continue">
|
|
82
|
+
<q:instruction>You help a shop owner. Use the tools to look at the data,
|
|
83
|
+
then answer in one sentence.</q:instruction>
|
|
84
|
+
|
|
85
|
+
<q:tool name="low_stock" description="Products with fewer units in stock than `below`">
|
|
86
|
+
<q:param name="below" type="integer" default="5" />
|
|
87
|
+
<q:function name="lowStock">
|
|
88
|
+
<q:query name="rows" datasource="db">
|
|
89
|
+
SELECT name, stock FROM products WHERE stock < :below ORDER BY stock
|
|
90
|
+
<q:param name="below" value="{below}" type="integer" />
|
|
91
|
+
</q:query>
|
|
92
|
+
<q:return value="{rows}" />
|
|
93
|
+
</q:function>
|
|
94
|
+
</q:tool>
|
|
95
|
+
|
|
96
|
+
<q:execute task="Which products are running out of stock?" />
|
|
97
|
+
</q:agent>
|
|
98
|
+
|
|
99
|
+
<ui:window title="Stock assistant">
|
|
100
|
+
<q:if condition="stock_result.success">
|
|
101
|
+
<ui:text>{stock}</ui:text>
|
|
102
|
+
<q:else>
|
|
103
|
+
<ui:alert variant="warning">The assistant did not finish: {stock_result.error.message}</ui:alert>
|
|
104
|
+
</q:else>
|
|
105
|
+
</q:if>
|
|
106
|
+
<!-- Every tool call the agent made, written out. -->
|
|
107
|
+
<q:loop items="{stock_result.actions}" var="a">
|
|
108
|
+
<ui:text>Called {a.call}</ui:text>
|
|
109
|
+
</q:loop>
|
|
110
|
+
</ui:window>
|
|
111
|
+
</q:component>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The model never writes SQL: it picks a tool and its arguments, and the
|
|
115
|
+
argument is converted to the `q:param`'s type before the query runs. The
|
|
116
|
+
reasoning loop, the tool calls and the failure contract (`onerror`,
|
|
117
|
+
`stock_result`) are the runtime's job. (Recipe:
|
|
118
|
+
[An agent over your database](https://quantumframework.net/cookbook/ai/agent-over-your-database).)
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## The rest of the language
|
|
123
|
+
|
|
124
|
+
```xml
|
|
125
|
+
<q:component name="Products">
|
|
126
|
+
<!-- ?name=mouse from the URL; empty when it is not there. -->
|
|
127
|
+
<q:set name="term" value="{query.name}" default="" />
|
|
128
|
+
|
|
129
|
+
<!-- :pattern is bound to the q:param: the value is sent to the database
|
|
130
|
+
apart from the SQL, so it can never change what the SQL does. -->
|
|
131
|
+
<q:query name="products" datasource="db">
|
|
132
|
+
SELECT name, price FROM products WHERE name LIKE :pattern ORDER BY price
|
|
133
|
+
<q:param name="pattern" value="%{term}%" type="string" />
|
|
134
|
+
</q:query>
|
|
135
|
+
|
|
136
|
+
<ui:window title="Products">
|
|
137
|
+
<ui:text>{products_result.recordCount} products</ui:text>
|
|
138
|
+
<ui:table source="{products}">
|
|
139
|
+
<ui:column key="name" label="Name" />
|
|
140
|
+
<ui:column key="price" label="Price" />
|
|
141
|
+
</ui:table>
|
|
142
|
+
</ui:window>
|
|
143
|
+
</q:component>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Saved as `components/index.q`, with the database declared in
|
|
147
|
+
`quantum.config.yaml`, `quantum start` serves it at `http://localhost:8080/`,
|
|
148
|
+
and `/?name=mouse` filters it. (Recipe:
|
|
149
|
+
[A query with parameters](https://quantumframework.net/cookbook/data-and-sql/query-with-parameters).)
|
|
150
|
+
|
|
151
|
+
`q:query` refuses to run SQL with an undeclared `:param` — parameterised queries are
|
|
152
|
+
enforced by the parser, not by discipline.
|
|
153
|
+
|
|
154
|
+
Also core: `q:set` with `session.` / `application.` / `request.` scopes, `q:if`,
|
|
155
|
+
`q:function`, `q:action` for form handling, `q:data` for CSV/JSON/XML import,
|
|
156
|
+
`q:import` / `q:slot` for composition.
|
|
157
|
+
|
|
158
|
+
The examples above are files of [Cookbook](https://quantumframework.net/cookbook/)
|
|
159
|
+
recipes, byte for byte, and the recipes run in CI; the quick start below is run
|
|
160
|
+
as shown (`tests/docs/test_readme.py` checks both).
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Quick start
|
|
165
|
+
|
|
166
|
+
**Requirements:** Python 3.12+ and `pip`.
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
pip install quantum-framework
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Create `hello.q`:
|
|
173
|
+
|
|
174
|
+
```xml
|
|
175
|
+
<q:component name="HelloWorld" xmlns:q="https://quantum.lang/ns">
|
|
176
|
+
<q:return value="Hello World!" />
|
|
177
|
+
</q:component>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
quantum run hello.q
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
[EXEC] Executing component: HelloWorld
|
|
186
|
+
[SUCCESS] Result: Hello World!
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
For a web app, put `.q` files in `components/` and run `quantum start`
|
|
190
|
+
(`components/index.q` is served at `/`). `quantum stop` stops it.
|
|
191
|
+
|
|
192
|
+
For the AI examples you also need a model server — [Ollama](https://ollama.com)
|
|
193
|
+
at `http://localhost:11434` unless `QUANTUM_LLM_BASE_URL` says otherwise — and
|
|
194
|
+
the RAG extra. There is no built-in model name: say which one in
|
|
195
|
+
`quantum.config.yaml` (`llm: model: phi3`) or `QUANTUM_LLM_DEFAULT_MODEL`.
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
pip install "quantum-framework[rag]"
|
|
199
|
+
ollama pull phi3 && ollama pull nomic-embed-text
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Declare datasources in `quantum.config.yaml` (next to `components/`) and `q:query` works
|
|
203
|
+
with nothing else running — SQLite needs no extra; PostgreSQL and MySQL drivers come with
|
|
204
|
+
`pip install "quantum-framework[db]"`:
|
|
205
|
+
|
|
206
|
+
```yaml
|
|
207
|
+
datasources:
|
|
208
|
+
db:
|
|
209
|
+
driver: sqlite
|
|
210
|
+
database: ./data/app.db
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### CLI
|
|
214
|
+
|
|
215
|
+
| Command | What it does |
|
|
216
|
+
|---------|--------------|
|
|
217
|
+
| `run <file.q>` | Execute a component, or build a `q:application` (`ui`, `terminal`, `game`) |
|
|
218
|
+
| `start` | Start the web server (port 8080 by default; `--port` to change) |
|
|
219
|
+
| `stop` | Stop the server started by `start` |
|
|
220
|
+
| `check` | Check that pages parse, SQL compiles and query fields exist |
|
|
221
|
+
| `test` | Run the app's `*.test.q` tests |
|
|
222
|
+
| `console` · `desktop` | The application's pages in the terminal, or in a desktop window |
|
|
223
|
+
| `migrate` | Apply, roll back and plan database migrations |
|
|
224
|
+
| `admin` | Start the Quantum Admin (`pip install "quantum-framework[admin]"`) |
|
|
225
|
+
| `pkg` · `jobs` · `mq` | Component packages (a page cannot import one yet), jobs, message queues — no stability promise |
|
|
226
|
+
|
|
227
|
+
### From source
|
|
228
|
+
|
|
229
|
+
To work on Quantum itself:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
git clone https://github.com/danielgregorio/quantum.git
|
|
233
|
+
cd quantum
|
|
234
|
+
pip install -e ".[dev]"
|
|
235
|
+
quantum run examples/hello.q
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
See [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md) for the test suite and the architecture.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Documentation
|
|
243
|
+
|
|
244
|
+
Full docs at **[quantumframework.net](https://quantumframework.net/)**:
|
|
245
|
+
|
|
246
|
+
- **Start:** [Installation](https://quantumframework.net/guide/installation) · [Quick Start](https://quantumframework.net/guide/quick-start) · [Tutorial: build the tasks app](https://quantumframework.net/tutorial/tasks-app)
|
|
247
|
+
- **Learn:** [Guide](https://quantumframework.net/guide/getting-started) · [Cookbook](https://quantumframework.net/cookbook/) — short tested recipes · [Showcase](https://quantumframework.net/showcase/) — the complete apps
|
|
248
|
+
- **Look up:** [Reference](https://quantumframework.net/reference/) — every tag, function, command and SPEC rule, generated from the code
|
|
249
|
+
- **Plan:** [Stability](https://quantumframework.net/stability/) — what 1.0 promises · [Roadmap](https://quantumframework.net/roadmap/) · [Changelog](https://quantumframework.net/changelog/)
|
|
250
|
+
|
|
251
|
+
The site is also in [Português](https://quantumframework.net/pt/), [Español](https://quantumframework.net/es/) and [中文](https://quantumframework.net/zh/).
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Stability
|
|
256
|
+
|
|
257
|
+
Support levels are defined in **[SUPPORT_TIERS.md](https://github.com/danielgregorio/quantum/blob/main/SUPPORT_TIERS.md)**. Short version:
|
|
258
|
+
|
|
259
|
+
| Tier | Surface |
|
|
260
|
+
|------|---------|
|
|
261
|
+
| **Core** — documented, tested end to end, stable | `q:component`, `q:set`, `q:if`, `q:loop`, `q:function`, `q:query`, `q:transaction`, `q:action`, `q:invoke`, `q:data`, `q:import` / `q:slot`, `q:file`, `q:mail`, the Core set of `ui:*`, `require_auth` / `require_role` |
|
|
262
|
+
| **AI** — the Core contract plus a live test against a real model | `q:llm`, `q:knowledge`, `q:agent` |
|
|
263
|
+
| **Experimental** — they run, but no API stability promise | `q:team`, jobs, messaging, websockets, `q:log` / `q:dump`, `ui:*` outside the Core set, the terminal target |
|
|
264
|
+
| Experimental, and a full-trust escape hatch | Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) — off by default, see [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) |
|
|
265
|
+
|
|
266
|
+
A functional audit in 2026-09 found that several of these surfaces had never been run
|
|
267
|
+
end-to-end despite being documented as complete. They were fixed or re-labelled, and
|
|
268
|
+
feature status is now verified by execution rather than asserted by hand.
|
|
269
|
+
|
|
270
|
+
From 1.0, **Core and AI follow semantic versioning**: a 1.x release does not break a
|
|
271
|
+
program that uses only them — their meaning is fixed by the rules in
|
|
272
|
+
[SPEC.md](https://github.com/danielgregorio/quantum/blob/main/SPEC.md), and a break
|
|
273
|
+
waits for 2.0. Experimental and Laboratory surfaces carry no such promise and may
|
|
274
|
+
change in any release.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Project layout
|
|
279
|
+
|
|
280
|
+
```
|
|
281
|
+
quantum/
|
|
282
|
+
├── quantum/
|
|
283
|
+
│ ├── core/ # Parser & AST (registry-based, modular)
|
|
284
|
+
│ ├── runtime/ # Execution engine, web server, renderer
|
|
285
|
+
│ └── cli/ # Command-line entry point
|
|
286
|
+
├── examples/ # runnable .q examples
|
|
287
|
+
├── tests/ # pytest suite; conformance/ cites SPEC.md
|
|
288
|
+
├── scripts/ # dev tools
|
|
289
|
+
└── docs/ # VitePress documentation
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Adding a tag is one parser + one executor + a registry entry — see
|
|
293
|
+
[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md).
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## Contributing
|
|
298
|
+
|
|
299
|
+
Read **[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md)** for dev setup and how the modular
|
|
300
|
+
parser/executor architecture works. By participating you agree to the
|
|
301
|
+
[Code of Conduct](https://github.com/danielgregorio/quantum/blob/main/CODE_OF_CONDUCT.md).
|
|
302
|
+
|
|
303
|
+
Found a security issue? Follow [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) — **do not** open a public issue.
|
|
304
|
+
|
|
305
|
+
## License
|
|
306
|
+
|
|
307
|
+
MIT — see [LICENSE](https://github.com/danielgregorio/quantum/blob/main/LICENSE).
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "quantum-framework"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.1"
|
|
8
8
|
description = "Declarative web applications in XML, with AI and RAG built into the language"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -74,7 +74,7 @@ quantum = "quantum.cli.runner:main"
|
|
|
74
74
|
|
|
75
75
|
[project.urls]
|
|
76
76
|
Homepage = "https://github.com/danielgregorio/quantum"
|
|
77
|
-
Documentation = "https://
|
|
77
|
+
Documentation = "https://quantumframework.net/"
|
|
78
78
|
Changelog = "https://github.com/danielgregorio/quantum/releases"
|
|
79
79
|
Repository = "https://github.com/danielgregorio/quantum"
|
|
80
80
|
|