quantum-framework 0.22.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.1/PKG-INFO +356 -0
- quantum_framework-1.0.1/README.md +307 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/pyproject.toml +34 -13
- quantum_framework-1.0.1/quantum/cli/__init__.py +3 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/hot_reload.py +18 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/jobs.py +2 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/migrations.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/mq.py +2 -9
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/pkg.py +3 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/runner.py +47 -62
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/server_process.py +55 -14
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/base_generator.py +2 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/cli.py +2 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/expression_transformer.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/javascript/generator.py +4 -13
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/optimizer.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/python/generator.py +4 -9
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/python/runtime.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/transpiler.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/ast_nodes.py +69 -136
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/docs_links.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/expression_stdlib.py +90 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/expressions.py +27 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/conditionals/src/ast_node.py +0 -2
- quantum_framework-1.0.1/quantum/core/features/data_import/src/ast_node.py +19 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/data_import/src/runtime.py +18 -16
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/dump/src/runtime.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/functions/src/ast_node.py +4 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/game_engine_2d/src/ast_nodes.py +9 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/game_engine_2d/src/parser.py +7 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/invocation/src/runtime.py +24 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/knowledge_base/src/ast_node.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/knowledge_base/src/parser.py +3 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/logging/src/parser.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/logging/src/runtime.py +2 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/loops/src/ast_node.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/native_testing/src/parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/state_management/src/ast_node.py +2 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/terminal_engine/src/ast_nodes.py +0 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/terminal_engine/src/parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/theming/src/ast_node.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/ui_engine/src/ast_nodes.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/ui_engine/src/parser.py +2 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/websocket/src/ast_node.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parser.py +47 -42
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/agent_parser.py +4 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/knowledge_parser.py +3 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/base.py +3 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/composition/import_parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/control_flow/loop_parser.py +13 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/control_flow/set_parser.py +43 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/data_parser.py +12 -27
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/invoke_parser.py +17 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/query_parser.py +2 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/transaction_parser.py +18 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/functions/param_parser.py +2 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/html/component_call_parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/html/html_parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/jobs/job_parser.py +3 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/tiers.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/packages/manifest.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/packages/registry.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/packages/resolver.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/plugins/loader.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/plugins/registry.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/action_handler.py +16 -9
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/memory_adapter.py +5 -23
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/rabbitmq_adapter.py +4 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/redis_adapter.py +17 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/agent_service.py +2 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ast_cache.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/auth_service.py +6 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/component.py +11 -49
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/component_resolver.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/database_service.py +28 -13
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/dev_panel.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/error_handler.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/execution_context.py +21 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/agent_executor.py +9 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/knowledge_executor.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/llm_executor.py +4 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/team_executor.py +3 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/base.py +2 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/if_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/loop_executor.py +73 -44
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/set_executor.py +31 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/data_executor.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/invoke_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/transaction_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/message_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/websocket_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/scripting/pyclass_executor.py +3 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/scripting/pyimport_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/scripting/python_executor.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/dump_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/log_executor.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/mail_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/expression_cache.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/function_registry.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/game_builder.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/game_code_generator.py +15 -17
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/game_templates.py +17 -19
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/godot_code_generator.py +97 -117
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/godot_templates.py +36 -38
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/job_executor.py +68 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/knowledge_service.py +79 -15
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/llm_providers.py +3 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/logging_setup.py +7 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/message_broker.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/message_queue_service.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/param_validation.py +44 -1
- quantum_framework-1.0.1/quantum/runtime/process_identity.py +76 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/pypy_compat.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/python_bridge.py +5 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/query_validators.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/renderer.py +11 -48
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/service_container.py +10 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/table_params.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/terminal_builder.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/terminal_code_generator.py +4 -11
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_builder.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_console.py +19 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_html_adapter.py +1 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_mobile_adapter.py +3 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_page_renderer.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_table_edit.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_textual_adapter.py +21 -24
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_textual_templates.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_tokens.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_validator.py +2 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_view.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/web_config.py +11 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/web_html.py +25 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/web_lifecycle.py +32 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/web_server.py +31 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/websocket_adapter.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/websocket_service.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/websocket_transport.py +16 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/wsgi.py +4 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/services.py +17 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/login.q +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/auth_service.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/connector_service.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/crud.py +6 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/database.py +8 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/environment_service.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/models.py +40 -32
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/settings_service.py +2 -20
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/apps.py +13 -0
- quantum_framework-1.0.1/quantum_framework.egg-info/PKG-INFO +356 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/SOURCES.txt +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/requires.txt +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_agent.py +2 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_animations.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_ast_cache.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_component_library.py +0 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_form_validation.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_game_codegen.py +9 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_game_e2e.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_game_engine.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_game_parser.py +41 -45
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_godot_codegen.py +440 -449
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_job_executor.py +1 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_llm_providers.py +3 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_message_broker.py +1 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_message_queue.py +2 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_mobile_target.py +0 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_multi_agent.py +5 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_packages.py +1 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_plugins.py +2 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_pypy_compat.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_python_scripting.py +2 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_terminal_codegen.py +2 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_terminal_parser.py +2 -9
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_theming.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_ui_html_adapter.py +0 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_ui_parity.py +4 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_ui_parser.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_ui_textual_adapter.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_websocket.py +3 -7
- quantum_framework-0.22.0/PKG-INFO +0 -285
- quantum_framework-0.22.0/README.md +0 -235
- quantum_framework-0.22.0/quantum/cli/__init__.py +0 -2
- quantum_framework-0.22.0/quantum/cli/deploy.py +0 -810
- quantum_framework-0.22.0/quantum/core/features/data_import/src/ast_node.py +0 -292
- quantum_framework-0.22.0/quantum_framework.egg-info/PKG-INFO +0 -285
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/LICENSE +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/admin.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/check.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/cli/schema_plan.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/javascript/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/compiler/python/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/config_env.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/expression_diagnostics.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/agents/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/agents/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/conditionals/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/data_import/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/dump/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/dump/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/dump/src/parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/functions/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/game_engine_2d/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/invocation/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/invocation/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/knowledge_base/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/logging/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/logging/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/loops/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/native_testing/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/native_testing/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/query/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/query/src/query_validators.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/state_management/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/terminal_engine/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/theming/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/theming/src/presets.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/ui_engine/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/features/websocket/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/guards.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/html_compat.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parser_registry.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/llm_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/ai/team_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/composition/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/composition/slot_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/control_flow/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/control_flow/if_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/data/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/events/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/events/dispatch_event_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/forms/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/forms/action_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/forms/flash_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/forms/redirect_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/functions/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/functions/function_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/functions/return_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/html/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/jobs/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/jobs/schedule_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/jobs/thread_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/message_ack_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/message_nack_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/message_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/queue_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/messaging/websocket_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/routing/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/routing/route_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/pyclass_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/pydecorator_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/pyimport_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/scripting/python_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/dump_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/file_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/log_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/parsers/services/mail_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/core/xml_lines.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/packages/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/packages/manager.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/plugins/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/plugins/hooks.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/plugins/manifest.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/adapters/sqlite_adapter.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/app_testing.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/component_composer.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/conditions.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/db_schema.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/email_service.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executor_registry.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/ai/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/control_flow/redirect_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/data/query_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/jobs/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/jobs/job_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/jobs/schedule_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/jobs/thread_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/message_ack_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/messaging/queue_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/scripting/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/executors/services/file_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/file_upload_service.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/history.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/llm_cache.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/llm_service.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/llm_stream.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/local_server.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/terminal_templates.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_desktop.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_form_rules.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_html_templates.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_mobile_templates.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/ui_pager.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/validators.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/runtime/web_errors.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum/utils/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/assets/quantum-admin-connectors.js +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/assets/quantum-admin.css +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/assets/quantum-source-highlight.js +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/_layout/AdminShell.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/agents.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/app/[name].q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/applications.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/component/[...path].q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/components.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/connectors.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/dashboard.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/database.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/features.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/index.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/jobs.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/logout.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/settings.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/source.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/components/admin/tests.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/docker_service.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/core/secret_manager.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/_base.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/_component_test_generator.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/_yaml_editor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/auth.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/components.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/connectors.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/projects.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/repository.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/settings.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_admin/services/yaml_import.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/dependency_links.txt +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/entry_points.txt +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/quantum_framework.egg-info/top_level.txt +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/setup.cfg +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.1}/tests/test_expression_cache.py +0 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: quantum-framework
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: Declarative web applications in XML, with AI and RAG built into the language
|
|
5
|
+
Author-email: Daniel Gregorio <danielgregorio2611@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/danielgregorio/quantum
|
|
8
|
+
Project-URL: Documentation, https://quantumframework.net/
|
|
9
|
+
Project-URL: Changelog, https://github.com/danielgregorio/quantum/releases
|
|
10
|
+
Project-URL: Repository, https://github.com/danielgregorio/quantum
|
|
11
|
+
Keywords: framework,declarative,xml,web,llm,rag
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Framework :: Flask
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Requires-Python: >=3.12
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: flask>=3.0.0
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Requires-Dist: sqlparse>=0.4.4
|
|
23
|
+
Requires-Dist: gunicorn>=21.0.0
|
|
24
|
+
Requires-Dist: textual>=0.80.0
|
|
25
|
+
Requires-Dist: requests>=2.31.0
|
|
26
|
+
Requires-Dist: bcrypt>=4.1.0
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-mock>=3.11.1; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-xdist>=3.5; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff<0.17,>=0.16; extra == "dev"
|
|
33
|
+
Provides-Extra: db
|
|
34
|
+
Requires-Dist: psycopg2-binary>=2.9.9; extra == "db"
|
|
35
|
+
Requires-Dist: pymysql>=1.1.0; extra == "db"
|
|
36
|
+
Provides-Extra: rag
|
|
37
|
+
Requires-Dist: chromadb>=0.5.0; extra == "rag"
|
|
38
|
+
Provides-Extra: jobs
|
|
39
|
+
Requires-Dist: apscheduler>=3.10.0; extra == "jobs"
|
|
40
|
+
Provides-Extra: admin
|
|
41
|
+
Requires-Dist: sqlalchemy>=2.0; extra == "admin"
|
|
42
|
+
Requires-Dist: PyJWT>=2.8; extra == "admin"
|
|
43
|
+
Requires-Dist: cryptography>=42.0; extra == "admin"
|
|
44
|
+
Provides-Extra: desktop
|
|
45
|
+
Requires-Dist: pywebview>=5.0; extra == "desktop"
|
|
46
|
+
Provides-Extra: websocket
|
|
47
|
+
Requires-Dist: websockets>=12.0; extra == "websocket"
|
|
48
|
+
Dynamic: license-file
|
|
49
|
+
|
|
50
|
+
# Quantum
|
|
51
|
+
|
|
52
|
+
[](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml)
|
|
53
|
+
[](https://pypi.org/project/quantum-framework/)
|
|
54
|
+
[](https://pypi.org/project/quantum-framework/)
|
|
55
|
+
[](https://quantumframework.net/)
|
|
56
|
+
[](https://github.com/danielgregorio/quantum/blob/main/LICENSE)
|
|
57
|
+
|
|
58
|
+
> **Declarative web apps in XML, with AI and RAG built into the language.
|
|
59
|
+
> No build chain, no JavaScript, no frontend framework.**
|
|
60
|
+
|
|
61
|
+
Quantum is a full-stack framework whose language is markup. State, database queries,
|
|
62
|
+
forms, LLM calls and retrieval-augmented generation are all tags — not libraries you
|
|
63
|
+
wire together. It takes its philosophy from ColdFusion and Adobe Flex: the markup *is*
|
|
64
|
+
the app.
|
|
65
|
+
|
|
66
|
+
> **1.0, and honest about it.** See [Stability](#stability) — the table there
|
|
67
|
+
> reflects what has actually been executed end-to-end, not what is aspirational.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## The part that isn't like the others
|
|
72
|
+
|
|
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:
|
|
75
|
+
|
|
76
|
+
```xml
|
|
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" />
|
|
83
|
+
</q:knowledge>
|
|
84
|
+
|
|
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>
|
|
114
|
+
</q:component>
|
|
115
|
+
```
|
|
116
|
+
|
|
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).)
|
|
122
|
+
|
|
123
|
+
An agent whose tools you write in Quantum, same idea:
|
|
124
|
+
|
|
125
|
+
```xml
|
|
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>
|
|
161
|
+
```
|
|
162
|
+
|
|
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).)
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## The rest of the language
|
|
172
|
+
|
|
173
|
+
```xml
|
|
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" />
|
|
183
|
+
</q:query>
|
|
184
|
+
|
|
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>
|
|
192
|
+
</q:component>
|
|
193
|
+
```
|
|
194
|
+
|
|
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).)
|
|
199
|
+
|
|
200
|
+
`q:query` refuses to run SQL with an undeclared `:param` — parameterised queries are
|
|
201
|
+
enforced by the parser, not by discipline.
|
|
202
|
+
|
|
203
|
+
Also core: `q:set` with `session.` / `application.` / `request.` scopes, `q:if`,
|
|
204
|
+
`q:function`, `q:action` for form handling, `q:data` for CSV/JSON/XML import,
|
|
205
|
+
`q:import` / `q:slot` for composition.
|
|
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
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Quick start
|
|
214
|
+
|
|
215
|
+
**Requirements:** Python 3.12+ and `pip`.
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
pip install quantum-framework
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Create `hello.q`:
|
|
222
|
+
|
|
223
|
+
```xml
|
|
224
|
+
<q:component name="HelloWorld" xmlns:q="https://quantum.lang/ns">
|
|
225
|
+
<q:return value="Hello World!" />
|
|
226
|
+
</q:component>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
quantum run hello.q
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
[EXEC] Executing component: HelloWorld
|
|
235
|
+
[SUCCESS] Result: Hello World!
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
For a web app, put `.q` files in `components/` and run `quantum start`
|
|
239
|
+
(`components/index.q` is served at `/`). `quantum stop` stops it.
|
|
240
|
+
|
|
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`.
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
pip install "quantum-framework[rag]"
|
|
248
|
+
ollama pull phi3 && ollama pull nomic-embed-text
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Declare datasources in `quantum.config.yaml` (next to `components/`) and `q:query` works
|
|
252
|
+
with nothing else running — SQLite needs no extra; PostgreSQL and MySQL drivers come with
|
|
253
|
+
`pip install "quantum-framework[db]"`:
|
|
254
|
+
|
|
255
|
+
```yaml
|
|
256
|
+
datasources:
|
|
257
|
+
db:
|
|
258
|
+
driver: sqlite
|
|
259
|
+
database: ./data/app.db
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### CLI
|
|
263
|
+
|
|
264
|
+
| Command | What it does |
|
|
265
|
+
|---------|--------------|
|
|
266
|
+
| `run <file.q>` | Execute a component, or build a `q:application` (`ui`, `terminal`, `game`) |
|
|
267
|
+
| `start` | Start the web server (port 8080 by default; `--port` to change) |
|
|
268
|
+
| `stop` | Stop the server started by `start` |
|
|
269
|
+
| `check` | Check that pages parse, SQL compiles and query fields exist |
|
|
270
|
+
| `test` | Run the app's `*.test.q` tests |
|
|
271
|
+
| `console` · `desktop` | The application's pages in the terminal, or in a desktop window |
|
|
272
|
+
| `migrate` | Apply, roll back and plan database migrations |
|
|
273
|
+
| `admin` | Start the Quantum Admin (`pip install "quantum-framework[admin]"`) |
|
|
274
|
+
| `pkg` · `jobs` · `mq` | Component packages (a page cannot import one yet), jobs, message queues — no stability promise |
|
|
275
|
+
|
|
276
|
+
### From source
|
|
277
|
+
|
|
278
|
+
To work on Quantum itself:
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
git clone https://github.com/danielgregorio/quantum.git
|
|
282
|
+
cd quantum
|
|
283
|
+
pip install -e ".[dev]"
|
|
284
|
+
quantum run examples/hello.q
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
See [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md) for the test suite and the architecture.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Documentation
|
|
292
|
+
|
|
293
|
+
Full docs at **[quantumframework.net](https://quantumframework.net/)**:
|
|
294
|
+
|
|
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/)
|
|
299
|
+
|
|
300
|
+
The site is also in [Português](https://quantumframework.net/pt/), [Español](https://quantumframework.net/es/) and [中文](https://quantumframework.net/zh/).
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Stability
|
|
305
|
+
|
|
306
|
+
Support levels are defined in **[SUPPORT_TIERS.md](https://github.com/danielgregorio/quantum/blob/main/SUPPORT_TIERS.md)**. Short version:
|
|
307
|
+
|
|
308
|
+
| Tier | Surface |
|
|
309
|
+
|------|---------|
|
|
310
|
+
| **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` |
|
|
311
|
+
| **AI** — the Core contract plus a live test against a real model | `q:llm`, `q:knowledge`, `q:agent` |
|
|
312
|
+
| **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 |
|
|
313
|
+
| 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) |
|
|
314
|
+
|
|
315
|
+
A functional audit in 2026-09 found that several of these surfaces had never been run
|
|
316
|
+
end-to-end despite being documented as complete. They were fixed or re-labelled, and
|
|
317
|
+
feature status is now verified by execution rather than asserted by hand.
|
|
318
|
+
|
|
319
|
+
From 1.0, **Core and AI follow semantic versioning**: a 1.x release does not break a
|
|
320
|
+
program that uses only them — their meaning is fixed by the rules in
|
|
321
|
+
[SPEC.md](https://github.com/danielgregorio/quantum/blob/main/SPEC.md), and a break
|
|
322
|
+
waits for 2.0. Experimental and Laboratory surfaces carry no such promise and may
|
|
323
|
+
change in any release.
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## Project layout
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
quantum/
|
|
331
|
+
├── quantum/
|
|
332
|
+
│ ├── core/ # Parser & AST (registry-based, modular)
|
|
333
|
+
│ ├── runtime/ # Execution engine, web server, renderer
|
|
334
|
+
│ └── cli/ # Command-line entry point
|
|
335
|
+
├── examples/ # runnable .q examples
|
|
336
|
+
├── tests/ # pytest suite; conformance/ cites SPEC.md
|
|
337
|
+
├── scripts/ # dev tools
|
|
338
|
+
└── docs/ # VitePress documentation
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Adding a tag is one parser + one executor + a registry entry — see
|
|
342
|
+
[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md).
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Contributing
|
|
347
|
+
|
|
348
|
+
Read **[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md)** for dev setup and how the modular
|
|
349
|
+
parser/executor architecture works. By participating you agree to the
|
|
350
|
+
[Code of Conduct](https://github.com/danielgregorio/quantum/blob/main/CODE_OF_CONDUCT.md).
|
|
351
|
+
|
|
352
|
+
Found a security issue? Follow [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) — **do not** open a public issue.
|
|
353
|
+
|
|
354
|
+
## License
|
|
355
|
+
|
|
356
|
+
MIT — see [LICENSE](https://github.com/danielgregorio/quantum/blob/main/LICENSE).
|
|
@@ -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).
|