quantum-framework 0.22.0__tar.gz → 1.0.0__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-0.22.0 → quantum_framework-1.0.0}/PKG-INFO +23 -18
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/README.md +18 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/pyproject.toml +33 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/hot_reload.py +18 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/jobs.py +2 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/migrations.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/mq.py +2 -9
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/pkg.py +3 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/runner.py +22 -57
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/server_process.py +55 -14
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/base_generator.py +2 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/cli.py +2 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/expression_transformer.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/javascript/generator.py +4 -13
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/optimizer.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/python/generator.py +4 -9
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/python/runtime.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/transpiler.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/ast_nodes.py +69 -136
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/expression_stdlib.py +54 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/expressions.py +27 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/conditionals/src/ast_node.py +0 -2
- quantum_framework-1.0.0/quantum/core/features/data_import/src/ast_node.py +19 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/data_import/src/runtime.py +18 -16
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/dump/src/runtime.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/functions/src/ast_node.py +4 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/game_engine_2d/src/ast_nodes.py +9 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/game_engine_2d/src/parser.py +7 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/invocation/src/runtime.py +24 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/knowledge_base/src/ast_node.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/knowledge_base/src/parser.py +3 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/logging/src/parser.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/logging/src/runtime.py +2 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/loops/src/ast_node.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/native_testing/src/parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/state_management/src/ast_node.py +2 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/terminal_engine/src/ast_nodes.py +0 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/terminal_engine/src/parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/theming/src/ast_node.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/ui_engine/src/ast_nodes.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/ui_engine/src/parser.py +2 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/websocket/src/ast_node.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parser.py +47 -42
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/ai/agent_parser.py +4 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/ai/knowledge_parser.py +3 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/base.py +3 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/composition/import_parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/control_flow/loop_parser.py +9 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/control_flow/set_parser.py +43 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/data/data_parser.py +12 -27
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/data/invoke_parser.py +17 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/data/query_parser.py +2 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/data/transaction_parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/functions/param_parser.py +2 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/html/component_call_parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/html/html_parser.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/jobs/job_parser.py +3 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/tiers.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/packages/manifest.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/packages/registry.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/packages/resolver.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/plugins/loader.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/plugins/registry.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/action_handler.py +8 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/adapters/memory_adapter.py +5 -23
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/adapters/rabbitmq_adapter.py +4 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/adapters/redis_adapter.py +17 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/agent_service.py +2 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ast_cache.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/auth_service.py +6 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/component.py +11 -49
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/component_resolver.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/database_service.py +28 -13
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/dev_panel.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/error_handler.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/execution_context.py +18 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/ai/agent_executor.py +9 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/ai/knowledge_executor.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/ai/llm_executor.py +4 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/ai/team_executor.py +3 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/base.py +2 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/control_flow/if_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/control_flow/loop_executor.py +31 -27
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/control_flow/set_executor.py +27 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/data/data_executor.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/data/invoke_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/data/transaction_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/messaging/message_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/messaging/websocket_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/scripting/pyclass_executor.py +3 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/scripting/pyimport_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/scripting/python_executor.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/services/dump_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/services/log_executor.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/services/mail_executor.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/expression_cache.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/function_registry.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/game_builder.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/game_code_generator.py +15 -17
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/game_templates.py +17 -19
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/godot_code_generator.py +97 -117
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/godot_templates.py +36 -38
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/job_executor.py +68 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/knowledge_service.py +21 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/llm_providers.py +3 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/logging_setup.py +7 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/message_broker.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/message_queue_service.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/param_validation.py +30 -1
- quantum_framework-1.0.0/quantum/runtime/process_identity.py +76 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/pypy_compat.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/python_bridge.py +5 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/query_validators.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/renderer.py +7 -33
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/service_container.py +10 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/table_params.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/terminal_builder.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/terminal_code_generator.py +4 -11
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_builder.py +2 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_console.py +19 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_html_adapter.py +1 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_mobile_adapter.py +3 -7
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_page_renderer.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_table_edit.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_textual_adapter.py +21 -24
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_textual_templates.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_tokens.py +0 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_validator.py +2 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_view.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/web_config.py +11 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/web_html.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/web_lifecycle.py +32 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/web_server.py +31 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/websocket_adapter.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/websocket_service.py +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/websocket_transport.py +16 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/wsgi.py +4 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/services.py +17 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/login.q +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/auth_service.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/connector_service.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/crud.py +6 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/database.py +8 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/environment_service.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/models.py +40 -32
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/settings_service.py +2 -20
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/apps.py +13 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_framework.egg-info/PKG-INFO +23 -18
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_framework.egg-info/SOURCES.txt +1 -1
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_framework.egg-info/requires.txt +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_agent.py +2 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_animations.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_ast_cache.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_component_library.py +0 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_form_validation.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_game_codegen.py +9 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_game_e2e.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_game_engine.py +1 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_game_parser.py +41 -45
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_godot_codegen.py +440 -449
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_job_executor.py +1 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_llm_providers.py +3 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_message_broker.py +1 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_message_queue.py +2 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_mobile_target.py +0 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_multi_agent.py +5 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_packages.py +1 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_plugins.py +2 -10
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_pypy_compat.py +4 -4
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_python_scripting.py +2 -5
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_terminal_codegen.py +2 -6
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_terminal_parser.py +2 -9
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_theming.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_ui_html_adapter.py +0 -12
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_ui_parity.py +4 -8
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_ui_parser.py +1 -3
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_ui_textual_adapter.py +0 -2
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_websocket.py +3 -7
- 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-1.0.0}/LICENSE +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/admin.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/check.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/cli/schema_plan.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/javascript/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/compiler/python/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/config_env.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/docs_links.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/expression_diagnostics.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/agents/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/agents/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/conditionals/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/data_import/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/dump/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/dump/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/dump/src/parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/functions/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/game_engine_2d/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/invocation/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/invocation/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/knowledge_base/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/logging/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/logging/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/loops/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/native_testing/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/native_testing/src/ast_node.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/query/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/query/src/query_validators.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/state_management/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/terminal_engine/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/theming/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/theming/src/presets.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/ui_engine/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/features/websocket/src/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/guards.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/html_compat.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parser_registry.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/ai/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/ai/llm_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/ai/team_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/composition/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/composition/slot_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/control_flow/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/control_flow/if_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/data/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/events/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/events/dispatch_event_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/forms/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/forms/action_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/forms/flash_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/forms/redirect_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/functions/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/functions/function_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/functions/return_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/html/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/jobs/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/jobs/schedule_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/jobs/thread_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/messaging/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/messaging/message_ack_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/messaging/message_nack_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/messaging/message_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/messaging/queue_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/messaging/websocket_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/routing/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/routing/route_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/scripting/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/scripting/pyclass_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/scripting/pydecorator_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/scripting/pyimport_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/scripting/python_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/services/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/services/dump_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/services/file_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/services/log_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/parsers/services/mail_parser.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/core/xml_lines.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/packages/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/packages/manager.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/plugins/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/plugins/hooks.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/plugins/manifest.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/adapters/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/adapters/sqlite_adapter.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/app_testing.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/component_composer.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/conditions.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/db_schema.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/email_service.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executor_registry.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/ai/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/control_flow/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/control_flow/redirect_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/data/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/data/query_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/jobs/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/jobs/job_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/jobs/schedule_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/jobs/thread_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/messaging/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/messaging/message_ack_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/messaging/queue_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/scripting/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/services/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/executors/services/file_executor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/file_upload_service.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/history.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/llm_cache.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/llm_service.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/llm_stream.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/local_server.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/terminal_templates.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_desktop.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_form_rules.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_html_templates.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_mobile_templates.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/ui_pager.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/validators.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/runtime/web_errors.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum/utils/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/assets/quantum-admin-connectors.js +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/assets/quantum-admin.css +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/assets/quantum-source-highlight.js +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/_layout/AdminShell.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/agents.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/app/[name].q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/applications.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/component/[...path].q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/components.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/connectors.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/dashboard.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/database.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/features.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/index.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/jobs.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/logout.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/settings.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/source.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/components/admin/tests.q +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/docker_service.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/core/secret_manager.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/__init__.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/_base.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/_component_test_generator.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/_yaml_editor.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/auth.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/components.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/connectors.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/projects.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/repository.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/settings.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_admin/services/yaml_import.py +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_framework.egg-info/dependency_links.txt +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_framework.egg-info/entry_points.txt +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/quantum_framework.egg-info/top_level.txt +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/setup.cfg +0 -0
- {quantum_framework-0.22.0 → quantum_framework-1.0.0}/tests/test_expression_cache.py +0 -0
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quantum-framework
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 1.0.0
|
|
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
8
|
Project-URL: Documentation, https://danielgregorio.github.io/quantum/
|
|
9
9
|
Project-URL: Changelog, https://github.com/danielgregorio/quantum/releases
|
|
10
10
|
Project-URL: Repository, https://github.com/danielgregorio/quantum
|
|
11
|
-
Keywords: framework,declarative,xml,web,
|
|
12
|
-
Classifier: Development Status ::
|
|
11
|
+
Keywords: framework,declarative,xml,web,llm,rag
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
13
|
Classifier: Framework :: Flask
|
|
14
14
|
Classifier: Intended Audience :: Developers
|
|
15
15
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -29,8 +29,7 @@ Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
|
29
29
|
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
30
30
|
Requires-Dist: pytest-mock>=3.11.1; extra == "dev"
|
|
31
31
|
Requires-Dist: pytest-xdist>=3.5; extra == "dev"
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff<0.17,>=0.16; extra == "dev"
|
|
34
33
|
Provides-Extra: db
|
|
35
34
|
Requires-Dist: psycopg2-binary>=2.9.9; extra == "db"
|
|
36
35
|
Requires-Dist: pymysql>=1.1.0; extra == "db"
|
|
@@ -64,7 +63,7 @@ forms, LLM calls and retrieval-augmented generation are all tags — not librari
|
|
|
64
63
|
wire together. It takes its philosophy from ColdFusion and Adobe Flex: the markup *is*
|
|
65
64
|
the app.
|
|
66
65
|
|
|
67
|
-
>
|
|
66
|
+
> **1.0, and honest about it.** See [Stability](#stability) — the table there
|
|
68
67
|
> reflects what has actually been executed end-to-end, not what is aspirational.
|
|
69
68
|
|
|
70
69
|
---
|
|
@@ -75,7 +74,7 @@ Retrieval-augmented generation, as a language construct:
|
|
|
75
74
|
|
|
76
75
|
```xml
|
|
77
76
|
<q:component name="DocsBot">
|
|
78
|
-
<q:knowledge name="docs"
|
|
77
|
+
<q:knowledge name="docs" embedModel="nomic-embed-text">
|
|
79
78
|
<q:source type="directory" path="./docs/" pattern="*.md" />
|
|
80
79
|
</q:knowledge>
|
|
81
80
|
|
|
@@ -200,10 +199,13 @@ datasources:
|
|
|
200
199
|
|
|
201
200
|
| Command | What it does |
|
|
202
201
|
|---------|--------------|
|
|
203
|
-
| `run <file.q>` | Execute a component,
|
|
202
|
+
| `run <file.q>` | Execute a component, or build a `q:application` (`ui`, `terminal`, `game`) |
|
|
204
203
|
| `start` | Start the web server (port 8080 by default; `--port` to change) |
|
|
205
204
|
| `stop` | Stop the server started by `start` |
|
|
206
|
-
| `
|
|
205
|
+
| `check` | Check that pages parse, SQL compiles and query fields exist |
|
|
206
|
+
| `test` | Run the app's `*.test.q` tests |
|
|
207
|
+
| `console` · `desktop` | The application's pages in the terminal, or in a desktop window |
|
|
208
|
+
| `admin` | Start the Quantum Admin (`pip install "quantum-framework[admin]"`) |
|
|
207
209
|
| `pkg` · `jobs` · `mq` · `migrate` | Packages, jobs, message queues, migrations |
|
|
208
210
|
|
|
209
211
|
### From source
|
|
@@ -237,19 +239,22 @@ Releases and their notes are on the [GitHub Releases](https://github.com/danielg
|
|
|
237
239
|
|
|
238
240
|
Support levels are defined in **[SUPPORT_TIERS.md](https://github.com/danielgregorio/quantum/blob/main/SUPPORT_TIERS.md)**. Short version:
|
|
239
241
|
|
|
240
|
-
|
|
|
241
|
-
|
|
242
|
-
| Core
|
|
243
|
-
| AI — `q:llm`, `q:knowledge`, `q:agent` |
|
|
244
|
-
| `q:team`
|
|
245
|
-
|
|
|
246
|
-
| Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) | Experimental, and a full-trust escape hatch — see [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) |
|
|
242
|
+
| Tier | Surface |
|
|
243
|
+
|------|---------|
|
|
244
|
+
| **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` |
|
|
245
|
+
| **AI** — the Core contract plus a live test against a real model | `q:llm`, `q:knowledge`, `q:agent` |
|
|
246
|
+
| **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 |
|
|
247
|
+
| 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) |
|
|
247
248
|
|
|
248
249
|
A functional audit in 2026-09 found that several of these surfaces had never been run
|
|
249
250
|
end-to-end despite being documented as complete. They were fixed or re-labelled, and
|
|
250
251
|
feature status is now verified by execution rather than asserted by hand.
|
|
251
252
|
|
|
252
|
-
|
|
253
|
+
From 1.0, **Core and AI follow semantic versioning**: a 1.x release does not break a
|
|
254
|
+
program that uses only them — their meaning is fixed by the rules in
|
|
255
|
+
[SPEC.md](https://github.com/danielgregorio/quantum/blob/main/SPEC.md), and a break
|
|
256
|
+
waits for 2.0. Experimental and Laboratory surfaces carry no such promise and may
|
|
257
|
+
change in any release.
|
|
253
258
|
|
|
254
259
|
---
|
|
255
260
|
|
|
@@ -14,7 +14,7 @@ forms, LLM calls and retrieval-augmented generation are all tags — not librari
|
|
|
14
14
|
wire together. It takes its philosophy from ColdFusion and Adobe Flex: the markup *is*
|
|
15
15
|
the app.
|
|
16
16
|
|
|
17
|
-
>
|
|
17
|
+
> **1.0, and honest about it.** See [Stability](#stability) — the table there
|
|
18
18
|
> reflects what has actually been executed end-to-end, not what is aspirational.
|
|
19
19
|
|
|
20
20
|
---
|
|
@@ -25,7 +25,7 @@ Retrieval-augmented generation, as a language construct:
|
|
|
25
25
|
|
|
26
26
|
```xml
|
|
27
27
|
<q:component name="DocsBot">
|
|
28
|
-
<q:knowledge name="docs"
|
|
28
|
+
<q:knowledge name="docs" embedModel="nomic-embed-text">
|
|
29
29
|
<q:source type="directory" path="./docs/" pattern="*.md" />
|
|
30
30
|
</q:knowledge>
|
|
31
31
|
|
|
@@ -150,10 +150,13 @@ datasources:
|
|
|
150
150
|
|
|
151
151
|
| Command | What it does |
|
|
152
152
|
|---------|--------------|
|
|
153
|
-
| `run <file.q>` | Execute a component,
|
|
153
|
+
| `run <file.q>` | Execute a component, or build a `q:application` (`ui`, `terminal`, `game`) |
|
|
154
154
|
| `start` | Start the web server (port 8080 by default; `--port` to change) |
|
|
155
155
|
| `stop` | Stop the server started by `start` |
|
|
156
|
-
| `
|
|
156
|
+
| `check` | Check that pages parse, SQL compiles and query fields exist |
|
|
157
|
+
| `test` | Run the app's `*.test.q` tests |
|
|
158
|
+
| `console` · `desktop` | The application's pages in the terminal, or in a desktop window |
|
|
159
|
+
| `admin` | Start the Quantum Admin (`pip install "quantum-framework[admin]"`) |
|
|
157
160
|
| `pkg` · `jobs` · `mq` · `migrate` | Packages, jobs, message queues, migrations |
|
|
158
161
|
|
|
159
162
|
### From source
|
|
@@ -187,19 +190,22 @@ Releases and their notes are on the [GitHub Releases](https://github.com/danielg
|
|
|
187
190
|
|
|
188
191
|
Support levels are defined in **[SUPPORT_TIERS.md](https://github.com/danielgregorio/quantum/blob/main/SUPPORT_TIERS.md)**. Short version:
|
|
189
192
|
|
|
190
|
-
|
|
|
191
|
-
|
|
192
|
-
| Core
|
|
193
|
-
| AI — `q:llm`, `q:knowledge`, `q:agent` |
|
|
194
|
-
| `q:team`
|
|
195
|
-
|
|
|
196
|
-
| Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) | Experimental, and a full-trust escape hatch — see [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) |
|
|
193
|
+
| Tier | Surface |
|
|
194
|
+
|------|---------|
|
|
195
|
+
| **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` |
|
|
196
|
+
| **AI** — the Core contract plus a live test against a real model | `q:llm`, `q:knowledge`, `q:agent` |
|
|
197
|
+
| **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 |
|
|
198
|
+
| 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) |
|
|
197
199
|
|
|
198
200
|
A functional audit in 2026-09 found that several of these surfaces had never been run
|
|
199
201
|
end-to-end despite being documented as complete. They were fixed or re-labelled, and
|
|
200
202
|
feature status is now verified by execution rather than asserted by hand.
|
|
201
203
|
|
|
202
|
-
|
|
204
|
+
From 1.0, **Core and AI follow semantic versioning**: a 1.x release does not break a
|
|
205
|
+
program that uses only them — their meaning is fixed by the rules in
|
|
206
|
+
[SPEC.md](https://github.com/danielgregorio/quantum/blob/main/SPEC.md), and a break
|
|
207
|
+
waits for 2.0. Experimental and Laboratory surfaces carry no such promise and may
|
|
208
|
+
change in any release.
|
|
203
209
|
|
|
204
210
|
---
|
|
205
211
|
|
|
@@ -4,16 +4,16 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "quantum-framework"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "
|
|
7
|
+
version = "1.0.0"
|
|
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"}
|
|
11
11
|
authors = [
|
|
12
12
|
{name = "Daniel Gregorio", email = "danielgregorio2611@gmail.com"}
|
|
13
13
|
]
|
|
14
|
-
keywords = ["framework", "declarative", "xml", "web", "
|
|
14
|
+
keywords = ["framework", "declarative", "xml", "web", "llm", "rag"]
|
|
15
15
|
classifiers = [
|
|
16
|
-
"Development Status ::
|
|
16
|
+
"Development Status :: 5 - Production/Stable",
|
|
17
17
|
"Framework :: Flask",
|
|
18
18
|
"Intended Audience :: Developers",
|
|
19
19
|
"License :: OSI Approved :: MIT License",
|
|
@@ -36,8 +36,9 @@ dev = [
|
|
|
36
36
|
"pytest-cov>=4.1.0",
|
|
37
37
|
"pytest-mock>=3.11.1",
|
|
38
38
|
"pytest-xdist>=3.5",
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
# Pinned to a minor version: `ruff check` blocks CI, and a new release
|
|
40
|
+
# that adds checks must not turn main red with no change to the code.
|
|
41
|
+
"ruff>=0.16,<0.17",
|
|
41
42
|
]
|
|
42
43
|
db = [
|
|
43
44
|
"psycopg2-binary>=2.9.9",
|
|
@@ -99,14 +100,34 @@ quantum_admin = ["backend/*", "backend/**/*", "templates/**/*", "static/**/*", "
|
|
|
99
100
|
"settings/**/*", "*.db"]
|
|
100
101
|
|
|
101
102
|
|
|
102
|
-
[tool.black]
|
|
103
|
-
line-length = 100
|
|
104
|
-
target-version = ['py311', 'py312']
|
|
105
|
-
|
|
106
103
|
[tool.ruff]
|
|
107
104
|
line-length = 100
|
|
108
|
-
|
|
109
|
-
|
|
105
|
+
|
|
106
|
+
# `ruff check quantum tests` is clean and blocking in CI. Each rule left out
|
|
107
|
+
# says why; anything else it finds is a finding to fix.
|
|
108
|
+
[tool.ruff.lint]
|
|
109
|
+
# "I" (import sorting) is not selected: sorting the imports of ~400 files is
|
|
110
|
+
# churn with no bug behind it, and it would conflict with every open branch.
|
|
111
|
+
select = ["E", "F", "W"]
|
|
112
|
+
ignore = [
|
|
113
|
+
# Line length: templates, SQL and user-facing messages read better whole;
|
|
114
|
+
# length is left to review.
|
|
115
|
+
"E501",
|
|
116
|
+
# Ambiguous names (`l`, `O`, `I`): 13 short-lived loop variables; renaming
|
|
117
|
+
# them fixes nothing.
|
|
118
|
+
"E741",
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
[tool.ruff.lint.per-file-ignores]
|
|
122
|
+
# A package __init__ re-exports names on purpose (and quantum.core re-exports
|
|
123
|
+
# the AST with `*`).
|
|
124
|
+
"**/__init__.py" = ["F401", "F403"]
|
|
125
|
+
# The feature modules import QuantumNode from ast_nodes, so their node classes
|
|
126
|
+
# can only be imported after QuantumNode is defined, mid-module.
|
|
127
|
+
"quantum/core/ast_nodes.py" = ["E402"]
|
|
128
|
+
# A pytest fixture imported into a test module and requested as a parameter
|
|
129
|
+
# reads as a redefinition.
|
|
130
|
+
"tests/**" = ["F811"]
|
|
110
131
|
|
|
111
132
|
[tool.pytest.ini_options]
|
|
112
133
|
testpaths = ["tests"]
|
|
@@ -293,11 +293,13 @@ class HotReloadServer:
|
|
|
293
293
|
|
|
294
294
|
def stop(self):
|
|
295
295
|
"""Stop the WebSocket server."""
|
|
296
|
+
# Only clear the flag: main() leaves its loop within 0.1 s and the
|
|
297
|
+
# `async with serve(...)` closes the server and its sockets. Stopping
|
|
298
|
+
# the event loop instead abandoned main() mid-`async with`; the loop
|
|
299
|
+
# was then closed under it, and when the orphaned coroutine was
|
|
300
|
+
# collected later its cleanup raised "Event loop is closed".
|
|
296
301
|
self._running = False
|
|
297
302
|
|
|
298
|
-
if self._loop:
|
|
299
|
-
self._loop.call_soon_threadsafe(self._loop.stop)
|
|
300
|
-
|
|
301
303
|
if self._thread:
|
|
302
304
|
self._thread.join(timeout=2)
|
|
303
305
|
self._thread = None
|
|
@@ -306,7 +308,11 @@ class HotReloadServer:
|
|
|
306
308
|
"""Run the WebSocket server (in background thread)."""
|
|
307
309
|
try:
|
|
308
310
|
import websockets
|
|
309
|
-
|
|
311
|
+
try:
|
|
312
|
+
# websockets >= 13; the legacy module warns since 14.
|
|
313
|
+
from websockets.asyncio.server import serve
|
|
314
|
+
except ImportError:
|
|
315
|
+
from websockets.server import serve
|
|
310
316
|
except ImportError:
|
|
311
317
|
print("[Hot Reload] websockets library not found. Using fallback polling.")
|
|
312
318
|
print("[Hot Reload] Install with: pip install websockets")
|
|
@@ -338,7 +344,7 @@ class HotReloadServer:
|
|
|
338
344
|
self._clients.discard(websocket)
|
|
339
345
|
|
|
340
346
|
async def main():
|
|
341
|
-
async with
|
|
347
|
+
async with serve(handler, self.host, self.port):
|
|
342
348
|
while self._running:
|
|
343
349
|
await asyncio.sleep(0.1)
|
|
344
350
|
|
|
@@ -350,6 +356,7 @@ class HotReloadServer:
|
|
|
350
356
|
except Exception:
|
|
351
357
|
pass
|
|
352
358
|
finally:
|
|
359
|
+
self._loop.run_until_complete(self._loop.shutdown_asyncgens())
|
|
353
360
|
self._loop.close()
|
|
354
361
|
|
|
355
362
|
def broadcast(self, message: dict):
|
|
@@ -505,20 +512,21 @@ class HotReloadManager:
|
|
|
505
512
|
self._broadcast_error(parse_error)
|
|
506
513
|
return
|
|
507
514
|
|
|
508
|
-
#
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
# Call optional callback
|
|
515
|
+
# The callback runs BEFORE the browsers are told: the server clears
|
|
516
|
+
# its caches there, and a page reloading right after the message must
|
|
517
|
+
# not be served from the old ones.
|
|
512
518
|
if self.on_reload:
|
|
513
519
|
try:
|
|
514
520
|
self.on_reload(changes, reload_type)
|
|
515
521
|
except Exception as e:
|
|
516
522
|
self._log(f"Error in reload callback: {e}")
|
|
517
523
|
|
|
524
|
+
# Broadcast reload to clients
|
|
525
|
+
self._broadcast_reload(changes, reload_type)
|
|
526
|
+
|
|
518
527
|
def _check_parse_error(self, path: Path) -> Optional[dict]:
|
|
519
528
|
"""Check if a .q file has parse errors."""
|
|
520
529
|
try:
|
|
521
|
-
import sys
|
|
522
530
|
from quantum.core.parser import QuantumParser, QuantumParseError
|
|
523
531
|
|
|
524
532
|
parser = QuantumParser()
|
|
@@ -6,12 +6,8 @@ Quantum CLI - Job Management Commands
|
|
|
6
6
|
Commands for managing scheduled jobs, threads, and job queues.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
import argparse
|
|
10
|
-
import sys
|
|
11
9
|
import json
|
|
12
|
-
from pathlib import Path
|
|
13
10
|
from datetime import datetime
|
|
14
|
-
from typing import Optional
|
|
15
11
|
|
|
16
12
|
# Add parent to path for imports
|
|
17
13
|
|
|
@@ -203,7 +199,7 @@ def _handle_jobs_run(executor, args) -> int:
|
|
|
203
199
|
|
|
204
200
|
if args.sync:
|
|
205
201
|
if result.get('success'):
|
|
206
|
-
print(
|
|
202
|
+
print("Job completed successfully.")
|
|
207
203
|
if result.get('result'):
|
|
208
204
|
print(f"Result: {result['result']}")
|
|
209
205
|
else:
|
|
@@ -286,7 +282,7 @@ def _handle_jobs_worker(executor, args) -> int:
|
|
|
286
282
|
|
|
287
283
|
if args.worker_action == 'start':
|
|
288
284
|
queues = [q.strip() for q in args.queue.split(',')]
|
|
289
|
-
print(
|
|
285
|
+
print("Starting worker...")
|
|
290
286
|
print(f" Queues: {', '.join(queues)}")
|
|
291
287
|
print(f" Concurrency: {args.concurrency}")
|
|
292
288
|
print(f" Poll interval: {args.poll_interval}s")
|
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
Database migrations: applies migrations/*.sql to a datasource declared in
|
|
3
3
|
quantum.config.yaml (DB-6). `quantum migrate` (cli/runner.py) drives it.
|
|
4
4
|
"""
|
|
5
|
-
import os
|
|
6
|
-
import sys
|
|
7
5
|
import hashlib
|
|
8
6
|
import logging
|
|
9
7
|
from pathlib import Path
|
|
10
8
|
from datetime import datetime
|
|
11
|
-
from typing import
|
|
9
|
+
from typing import List, Dict, Any
|
|
12
10
|
|
|
13
11
|
|
|
14
12
|
logger = logging.getLogger(__name__)
|
|
@@ -6,12 +6,7 @@ Quantum CLI - Message Queue Commands
|
|
|
6
6
|
Commands for managing message queues, publishing messages, and running consumers.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
import argparse
|
|
10
|
-
import sys
|
|
11
9
|
import json
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from datetime import datetime
|
|
14
|
-
from typing import Optional
|
|
15
10
|
|
|
16
11
|
# Add parent to path for imports
|
|
17
12
|
|
|
@@ -100,15 +95,13 @@ def create_mq_parser(subparsers):
|
|
|
100
95
|
stats_parser.add_argument('--format', choices=['table', 'json'], default='table')
|
|
101
96
|
|
|
102
97
|
# Connection info
|
|
103
|
-
|
|
98
|
+
mq_sub.add_parser('info', help='Show connection information')
|
|
104
99
|
|
|
105
100
|
return mq_parser
|
|
106
101
|
|
|
107
102
|
|
|
108
103
|
def handle_mq(args) -> int:
|
|
109
104
|
"""Handle mq command"""
|
|
110
|
-
from quantum.runtime.message_broker import MessageBroker, Message
|
|
111
|
-
from quantum.runtime.adapters.memory_adapter import InMemoryAdapter
|
|
112
105
|
|
|
113
106
|
if not args.mq_action:
|
|
114
107
|
print("Usage: quantum mq <action>")
|
|
@@ -504,7 +497,7 @@ def _handle_mq_worker(broker, args) -> int:
|
|
|
504
497
|
"""Start message worker"""
|
|
505
498
|
queues = [q.strip() for q in args.queues.split(',')]
|
|
506
499
|
|
|
507
|
-
print(
|
|
500
|
+
print("Starting message worker...")
|
|
508
501
|
print(f" Queues: {', '.join(queues)}")
|
|
509
502
|
print(f" Concurrency: {args.concurrency}")
|
|
510
503
|
print(f" Prefetch: {args.prefetch}")
|
|
@@ -12,9 +12,7 @@ CLI commands for package management:
|
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
14
|
import argparse
|
|
15
|
-
import sys
|
|
16
15
|
from pathlib import Path
|
|
17
|
-
from typing import Optional
|
|
18
16
|
|
|
19
17
|
|
|
20
18
|
def create_pkg_parser(subparsers: argparse._SubParsersAction) -> None:
|
|
@@ -216,8 +214,8 @@ def _handle_init(pm, args: argparse.Namespace) -> int:
|
|
|
216
214
|
print(" README.md")
|
|
217
215
|
print()
|
|
218
216
|
print("Next steps:")
|
|
219
|
-
print(
|
|
220
|
-
print(
|
|
217
|
+
print(" 1. Edit src/index.q to create your component")
|
|
218
|
+
print(" 2. Update quantum.yaml with description and keywords")
|
|
221
219
|
print(f" 3. Run 'quantum pkg publish {args.path}' to create archive")
|
|
222
220
|
|
|
223
221
|
return 0
|
|
@@ -231,7 +229,7 @@ def _handle_publish(pm, args: argparse.Namespace) -> int:
|
|
|
231
229
|
|
|
232
230
|
archive_path = pm.publish(str(path))
|
|
233
231
|
|
|
234
|
-
print(
|
|
232
|
+
print("[SUCCESS] Package archive created!")
|
|
235
233
|
print(f" Archive: {archive_path}")
|
|
236
234
|
print()
|
|
237
235
|
print("Share this archive or upload to a registry.")
|
|
@@ -16,7 +16,7 @@ if os.name == 'nt': # Windows
|
|
|
16
16
|
if hasattr(sys.stdout, 'reconfigure'):
|
|
17
17
|
sys.stdout.reconfigure(encoding='utf-8')
|
|
18
18
|
sys.stderr.reconfigure(encoding='utf-8')
|
|
19
|
-
except:
|
|
19
|
+
except Exception:
|
|
20
20
|
pass # Silent fallback
|
|
21
21
|
|
|
22
22
|
# Fix imports - use absolute imports
|
|
@@ -25,18 +25,6 @@ from quantum.core.parser import QuantumParser, QuantumParseError
|
|
|
25
25
|
from quantum.core.ast_nodes import ComponentNode, ApplicationNode, JobNode
|
|
26
26
|
from quantum.runtime.component import ComponentRuntime, ComponentExecutionError
|
|
27
27
|
from quantum.runtime.executors.control_flow.redirect_executor import PageRedirect
|
|
28
|
-
from quantum.runtime.web_server import QuantumWebServer
|
|
29
|
-
|
|
30
|
-
# Import deploy commands (lazy load to avoid import errors if requests not installed)
|
|
31
|
-
def _get_deploy_module():
|
|
32
|
-
try:
|
|
33
|
-
from quantum.cli.deploy import (
|
|
34
|
-
create_deploy_parser, create_apps_parser,
|
|
35
|
-
handle_deploy, handle_apps
|
|
36
|
-
)
|
|
37
|
-
return True, create_deploy_parser, create_apps_parser, handle_deploy, handle_apps
|
|
38
|
-
except ImportError as e:
|
|
39
|
-
return False, None, None, None, str(e)
|
|
40
28
|
|
|
41
29
|
# Import package commands
|
|
42
30
|
def _get_pkg_module():
|
|
@@ -98,23 +86,23 @@ class QuantumRunner:
|
|
|
98
86
|
self.parser = QuantumParser()
|
|
99
87
|
self.config = config if config is not None else load_config()
|
|
100
88
|
self.component_runtime = ComponentRuntime(config=self.config)
|
|
101
|
-
|
|
89
|
+
|
|
102
90
|
def run(self, file_path: str, debug: bool = False) -> int:
|
|
103
91
|
"""Execute .q file"""
|
|
104
92
|
try:
|
|
105
93
|
if debug:
|
|
106
94
|
print(f"[DEBUG] Parsing file: {Path(file_path).name}")
|
|
107
|
-
|
|
95
|
+
|
|
108
96
|
# Store source directory for asset resolution
|
|
109
97
|
self._source_dir = str(Path(file_path).resolve().parent)
|
|
110
98
|
|
|
111
99
|
# Parse file → AST
|
|
112
100
|
ast_node = self.parser.parse_file(file_path)
|
|
113
|
-
|
|
101
|
+
|
|
114
102
|
if debug:
|
|
115
103
|
print(f"[DEBUG] AST generated: {type(ast_node).__name__}")
|
|
116
|
-
print(
|
|
117
|
-
|
|
104
|
+
print("[DEBUG] Validating AST...")
|
|
105
|
+
|
|
118
106
|
# Validate AST
|
|
119
107
|
validation_errors = ast_node.validate()
|
|
120
108
|
if validation_errors:
|
|
@@ -122,10 +110,10 @@ class QuantumRunner:
|
|
|
122
110
|
for error in validation_errors:
|
|
123
111
|
print(f" - {error}")
|
|
124
112
|
return 1
|
|
125
|
-
|
|
113
|
+
|
|
126
114
|
# Execute based on type
|
|
127
115
|
return self._execute_ast(ast_node, debug)
|
|
128
|
-
|
|
116
|
+
|
|
129
117
|
except QuantumParseError as e:
|
|
130
118
|
print(f"[ERROR] Parse error: {e}")
|
|
131
119
|
return 1
|
|
@@ -135,7 +123,7 @@ class QuantumRunner:
|
|
|
135
123
|
import traceback
|
|
136
124
|
traceback.print_exc()
|
|
137
125
|
return 1
|
|
138
|
-
|
|
126
|
+
|
|
139
127
|
def _execute_ast(self, ast_node, debug: bool = False) -> int:
|
|
140
128
|
"""Execute AST based on type"""
|
|
141
129
|
if isinstance(ast_node, ComponentNode):
|
|
@@ -147,7 +135,7 @@ class QuantumRunner:
|
|
|
147
135
|
else:
|
|
148
136
|
print(f"[ERROR] Unsupported AST type: {type(ast_node)}")
|
|
149
137
|
return 1
|
|
150
|
-
|
|
138
|
+
|
|
151
139
|
def _execute_component(self, component: ComponentNode, debug: bool = False) -> int:
|
|
152
140
|
"""Execute q:component"""
|
|
153
141
|
print(f"[EXEC] Executing component: {component.name}")
|
|
@@ -155,7 +143,7 @@ class QuantumRunner:
|
|
|
155
143
|
print(f" Type: {component.component_type}")
|
|
156
144
|
print(f" Params: {len(component.params)}")
|
|
157
145
|
print(f" Returns: {len(component.returns)}")
|
|
158
|
-
|
|
146
|
+
|
|
159
147
|
try:
|
|
160
148
|
result = self.component_runtime.execute_component(component)
|
|
161
149
|
if result is not None:
|
|
@@ -163,14 +151,14 @@ class QuantumRunner:
|
|
|
163
151
|
else:
|
|
164
152
|
print("[WARN] Component executed without return")
|
|
165
153
|
return 0
|
|
166
|
-
|
|
154
|
+
|
|
167
155
|
except ComponentExecutionError as e:
|
|
168
156
|
print(f"[ERROR] Execution error: {e}")
|
|
169
157
|
return 1
|
|
170
158
|
except PageRedirect as r:
|
|
171
159
|
print(f"[REDIRECT] {r.status} {r.url}")
|
|
172
160
|
return 0
|
|
173
|
-
|
|
161
|
+
|
|
174
162
|
def _execute_application(self, app: ApplicationNode, debug: bool = False) -> int:
|
|
175
163
|
"""Execute q:application"""
|
|
176
164
|
print(f"[EXEC] Executing application: {app.app_id}")
|
|
@@ -251,7 +239,7 @@ class QuantumRunner:
|
|
|
251
239
|
print(f"[EXEC] Executing job: {job.job_id}")
|
|
252
240
|
if job.schedule:
|
|
253
241
|
print(f"[INFO] Schedule: {job.schedule}")
|
|
254
|
-
|
|
242
|
+
|
|
255
243
|
# TODO: Implement real job execution
|
|
256
244
|
print("[SUCCESS] Job executed successfully")
|
|
257
245
|
return 0
|
|
@@ -260,7 +248,7 @@ class QuantumRunner:
|
|
|
260
248
|
def main():
|
|
261
249
|
"""CLI entry point"""
|
|
262
250
|
parser = argparse.ArgumentParser(
|
|
263
|
-
description='Quantum CLI - Execute .q files
|
|
251
|
+
description='Quantum CLI - Execute .q files and start servers',
|
|
264
252
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
265
253
|
epilog="""
|
|
266
254
|
Examples:
|
|
@@ -273,9 +261,6 @@ Examples:
|
|
|
273
261
|
quantum test # Run the app's *.test.q tests
|
|
274
262
|
quantum run game.q --engine godot # Build Godot 4 project
|
|
275
263
|
quantum run backup-job.q # Execute job
|
|
276
|
-
quantum deploy ./my-app # Deploy application
|
|
277
|
-
quantum apps # List deployed apps
|
|
278
|
-
quantum apps logs my-app # View app logs
|
|
279
264
|
quantum pkg init ./my-component # Initialize new package
|
|
280
265
|
quantum pkg install ./package # Install package
|
|
281
266
|
quantum pkg list # List installed packages
|
|
@@ -317,6 +302,10 @@ Examples:
|
|
|
317
302
|
start_parser.add_argument('--port', type=int, help='Port (overrides config)')
|
|
318
303
|
start_parser.add_argument('--config', default='quantum.config.yaml', help='Config file')
|
|
319
304
|
start_parser.add_argument('--debug', action='store_true', help='Debug mode')
|
|
305
|
+
start_parser.add_argument('--hot-reload', action='store_true',
|
|
306
|
+
help='Reload the open pages when a component or static file changes')
|
|
307
|
+
start_parser.add_argument('--hot-reload-port', type=int, default=None,
|
|
308
|
+
help='WebSocket port for --hot-reload (default 35729)')
|
|
320
309
|
|
|
321
310
|
# Stop command
|
|
322
311
|
subparsers.add_parser('stop', help='Stop running web server')
|
|
@@ -346,13 +335,6 @@ Examples:
|
|
|
346
335
|
from quantum.cli.admin import create_admin_parser
|
|
347
336
|
create_admin_parser(subparsers)
|
|
348
337
|
|
|
349
|
-
# Deploy commands (if available)
|
|
350
|
-
deploy_available, create_deploy_parser, create_apps_parser, handle_deploy, handle_apps = _get_deploy_module()
|
|
351
|
-
|
|
352
|
-
if deploy_available:
|
|
353
|
-
create_deploy_parser(subparsers)
|
|
354
|
-
create_apps_parser(subparsers)
|
|
355
|
-
|
|
356
338
|
# Package commands (if available)
|
|
357
339
|
pkg_available, create_pkg_parser, handle_pkg = _get_pkg_module()
|
|
358
340
|
|
|
@@ -409,7 +391,9 @@ Examples:
|
|
|
409
391
|
try:
|
|
410
392
|
# Exit with whatever the server reports: a taken port or a failed
|
|
411
393
|
# bind must not look like a clean start to a supervisor or CI.
|
|
412
|
-
sys.exit(start_server(args.config, port=getattr(args, 'port', None)
|
|
394
|
+
sys.exit(start_server(args.config, port=getattr(args, 'port', None),
|
|
395
|
+
hot_reload=getattr(args, 'hot_reload', False),
|
|
396
|
+
hot_reload_port=getattr(args, 'hot_reload_port', None)) or 0)
|
|
413
397
|
except Exception as e:
|
|
414
398
|
print(f"[ERROR] Failed to start server: {e}")
|
|
415
399
|
if getattr(args, 'debug', False):
|
|
@@ -455,24 +439,6 @@ Examples:
|
|
|
455
439
|
exit_code = runner.run(args.file, getattr(args, 'debug', False))
|
|
456
440
|
sys.exit(exit_code)
|
|
457
441
|
|
|
458
|
-
# Handle 'deploy' command
|
|
459
|
-
elif args.command == 'deploy':
|
|
460
|
-
if not deploy_available:
|
|
461
|
-
print("[ERROR] Deploy functionality not available.")
|
|
462
|
-
print(f"Missing dependency: {handle_apps}")
|
|
463
|
-
print("Install with: pip install requests")
|
|
464
|
-
sys.exit(1)
|
|
465
|
-
sys.exit(handle_deploy(args))
|
|
466
|
-
|
|
467
|
-
# Handle 'apps' command
|
|
468
|
-
elif args.command == 'apps':
|
|
469
|
-
if not deploy_available:
|
|
470
|
-
print("[ERROR] Apps functionality not available.")
|
|
471
|
-
print(f"Missing dependency: {handle_apps}")
|
|
472
|
-
print("Install with: pip install requests")
|
|
473
|
-
sys.exit(1)
|
|
474
|
-
sys.exit(handle_apps(args))
|
|
475
|
-
|
|
476
442
|
# Handle 'jobs' command
|
|
477
443
|
elif args.command == 'jobs':
|
|
478
444
|
if not jobs_available:
|
|
@@ -510,7 +476,6 @@ Examples:
|
|
|
510
476
|
runner = MigrationRunner(datasource=getattr(args, 'datasource', None))
|
|
511
477
|
|
|
512
478
|
if args.migrate_command == 'status':
|
|
513
|
-
import json
|
|
514
479
|
status = runner.status()
|
|
515
480
|
print(f"\nDatabase: {status['database_type']}")
|
|
516
481
|
print(f"Applied migrations: {status['total_applied']}")
|