quantum-framework 0.9.0__tar.gz → 0.10.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.
Files changed (303) hide show
  1. {quantum_framework-0.9.0/quantum_framework.egg-info → quantum_framework-0.10.0}/PKG-INFO +62 -32
  2. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/README.md +58 -29
  3. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/pyproject.toml +4 -3
  4. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/runner.py +3 -0
  5. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/expression_stdlib.py +34 -0
  6. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_import/src/runtime.py +13 -18
  7. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/data_parser.py +5 -2
  8. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/tiers.py +52 -0
  9. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/data_executor.py +4 -1
  10. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/knowledge_service.py +78 -32
  11. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/pypy_compat.py +5 -3
  12. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/service_container.py +29 -8
  13. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/web_server.py +6 -1
  14. {quantum_framework-0.9.0 → quantum_framework-0.10.0/quantum_framework.egg-info}/PKG-INFO +62 -32
  15. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_pypy_compat.py +10 -0
  16. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/LICENSE +0 -0
  17. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/__init__.py +0 -0
  18. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/__init__.py +0 -0
  19. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/__init__.py +0 -0
  20. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/build.py +0 -0
  21. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/dev.py +0 -0
  22. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/docs.py +0 -0
  23. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/lint.py +0 -0
  24. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/migrate.py +0 -0
  25. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/new.py +0 -0
  26. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/serve.py +0 -0
  27. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/commands/test.py +0 -0
  28. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/deploy.py +0 -0
  29. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/hot_reload.py +0 -0
  30. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/jobs.py +0 -0
  31. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/mq.py +0 -0
  32. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/pkg.py +0 -0
  33. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/server_process.py +0 -0
  34. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/cli/utils.py +0 -0
  35. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/__init__.py +0 -0
  36. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/base_generator.py +0 -0
  37. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/cli.py +0 -0
  38. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/expression_transformer.py +0 -0
  39. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/javascript/__init__.py +0 -0
  40. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/javascript/generator.py +0 -0
  41. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/optimizer.py +0 -0
  42. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/python/__init__.py +0 -0
  43. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/python/generator.py +0 -0
  44. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/python/runtime.py +0 -0
  45. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/compiler/transpiler.py +0 -0
  46. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/__init__.py +0 -0
  47. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/ast_nodes.py +0 -0
  48. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/expression_diagnostics.py +0 -0
  49. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/expressions.py +0 -0
  50. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/agents/src/__init__.py +0 -0
  51. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/agents/src/ast_node.py +0 -0
  52. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/conditionals/src/__init__.py +0 -0
  53. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/conditionals/src/ast_node.py +0 -0
  54. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/__init__.py +0 -0
  55. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/ast_node.py +0 -0
  56. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/desktop_adapter.py +0 -0
  57. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/html_adapter.py +0 -0
  58. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_fetching/src/parser.py +0 -0
  59. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_import/src/__init__.py +0 -0
  60. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/data_import/src/ast_node.py +0 -0
  61. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/dump/src/__init__.py +0 -0
  62. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/dump/src/ast_node.py +0 -0
  63. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/dump/src/parser.py +0 -0
  64. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/dump/src/runtime.py +0 -0
  65. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/functions/src/__init__.py +0 -0
  66. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/functions/src/ast_node.py +0 -0
  67. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/game_engine_2d/src/__init__.py +0 -0
  68. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/game_engine_2d/src/ast_nodes.py +0 -0
  69. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/game_engine_2d/src/parser.py +0 -0
  70. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/invocation/src/__init__.py +0 -0
  71. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/invocation/src/ast_node.py +0 -0
  72. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/invocation/src/runtime.py +0 -0
  73. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/knowledge_base/src/__init__.py +0 -0
  74. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/knowledge_base/src/ast_node.py +0 -0
  75. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/knowledge_base/src/parser.py +0 -0
  76. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/logging/src/__init__.py +0 -0
  77. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/logging/src/ast_node.py +0 -0
  78. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/logging/src/parser.py +0 -0
  79. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/logging/src/runtime.py +0 -0
  80. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/loops/src/__init__.py +0 -0
  81. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/loops/src/ast_node.py +0 -0
  82. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/query/src/__init__.py +0 -0
  83. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/query/src/database_service.py +0 -0
  84. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/query/src/query_validators.py +0 -0
  85. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/state_management/src/__init__.py +0 -0
  86. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/state_management/src/ast_node.py +0 -0
  87. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/terminal_engine/src/__init__.py +0 -0
  88. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/terminal_engine/src/ast_nodes.py +0 -0
  89. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/terminal_engine/src/parser.py +0 -0
  90. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/testing_engine/src/__init__.py +0 -0
  91. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/testing_engine/src/ast_nodes.py +0 -0
  92. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/testing_engine/src/parser.py +0 -0
  93. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/theming/src/__init__.py +0 -0
  94. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/theming/src/ast_node.py +0 -0
  95. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/theming/src/presets.py +0 -0
  96. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/ui_engine/src/__init__.py +0 -0
  97. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/ui_engine/src/ast_nodes.py +0 -0
  98. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/ui_engine/src/parser.py +0 -0
  99. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/websocket/src/__init__.py +0 -0
  100. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/features/websocket/src/ast_node.py +0 -0
  101. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/html_compat.py +0 -0
  102. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parser.py +0 -0
  103. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parser_registry.py +0 -0
  104. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/__init__.py +0 -0
  105. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/__init__.py +0 -0
  106. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/agent_parser.py +0 -0
  107. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/knowledge_parser.py +0 -0
  108. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/llm_parser.py +0 -0
  109. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/ai/team_parser.py +0 -0
  110. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/base.py +0 -0
  111. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/composition/__init__.py +0 -0
  112. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/composition/import_parser.py +0 -0
  113. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/composition/slot_parser.py +0 -0
  114. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/control_flow/__init__.py +0 -0
  115. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/control_flow/if_parser.py +0 -0
  116. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/control_flow/loop_parser.py +0 -0
  117. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/control_flow/set_parser.py +0 -0
  118. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/__init__.py +0 -0
  119. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/invoke_parser.py +0 -0
  120. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/query_parser.py +0 -0
  121. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/data/transaction_parser.py +0 -0
  122. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/events/__init__.py +0 -0
  123. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/events/dispatch_event_parser.py +0 -0
  124. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/forms/__init__.py +0 -0
  125. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/forms/action_parser.py +0 -0
  126. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/forms/flash_parser.py +0 -0
  127. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/forms/redirect_parser.py +0 -0
  128. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/functions/__init__.py +0 -0
  129. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/functions/function_parser.py +0 -0
  130. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/functions/param_parser.py +0 -0
  131. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/functions/return_parser.py +0 -0
  132. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/html/__init__.py +0 -0
  133. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/html/component_call_parser.py +0 -0
  134. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/html/html_parser.py +0 -0
  135. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/jobs/__init__.py +0 -0
  136. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/jobs/job_parser.py +0 -0
  137. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/jobs/schedule_parser.py +0 -0
  138. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/jobs/thread_parser.py +0 -0
  139. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/__init__.py +0 -0
  140. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/message_ack_parser.py +0 -0
  141. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/message_nack_parser.py +0 -0
  142. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/message_parser.py +0 -0
  143. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/queue_parser.py +0 -0
  144. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/messaging/websocket_parser.py +0 -0
  145. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/persistence/__init__.py +0 -0
  146. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/persistence/persist_parser.py +0 -0
  147. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/routing/__init__.py +0 -0
  148. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/routing/route_parser.py +0 -0
  149. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/__init__.py +0 -0
  150. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/pyclass_parser.py +0 -0
  151. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/pydecorator_parser.py +0 -0
  152. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/pyimport_parser.py +0 -0
  153. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/scripting/python_parser.py +0 -0
  154. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/__init__.py +0 -0
  155. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/dump_parser.py +0 -0
  156. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/file_parser.py +0 -0
  157. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/log_parser.py +0 -0
  158. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/core/parsers/services/mail_parser.py +0 -0
  159. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/__init__.py +0 -0
  160. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/manager.py +0 -0
  161. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/manifest.py +0 -0
  162. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/registry.py +0 -0
  163. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/packages/resolver.py +0 -0
  164. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/__init__.py +0 -0
  165. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/hooks.py +0 -0
  166. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/loader.py +0 -0
  167. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/manifest.py +0 -0
  168. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/plugins/registry.py +0 -0
  169. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/__init__.py +0 -0
  170. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/action_handler.py +0 -0
  171. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/__init__.py +0 -0
  172. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/memory_adapter.py +0 -0
  173. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/rabbitmq_adapter.py +0 -0
  174. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/redis_adapter.py +0 -0
  175. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/adapters/sqlite_adapter.py +0 -0
  176. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/agent_service.py +0 -0
  177. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/api_server.py +0 -0
  178. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ast_cache.py +0 -0
  179. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/auth_service.py +0 -0
  180. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/component.py +0 -0
  181. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/component_composer.py +0 -0
  182. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/component_resolver.py +0 -0
  183. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/database_service.py +0 -0
  184. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/email_service.py +0 -0
  185. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/error_handler.py +0 -0
  186. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/execution_context.py +0 -0
  187. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executor_registry.py +0 -0
  188. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/__init__.py +0 -0
  189. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/__init__.py +0 -0
  190. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/agent_executor.py +0 -0
  191. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/knowledge_executor.py +0 -0
  192. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/llm_executor.py +0 -0
  193. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/ai/team_executor.py +0 -0
  194. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/base.py +0 -0
  195. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/control_flow/__init__.py +0 -0
  196. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/control_flow/if_executor.py +0 -0
  197. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/control_flow/loop_executor.py +0 -0
  198. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/control_flow/set_executor.py +0 -0
  199. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/__init__.py +0 -0
  200. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/invoke_executor.py +0 -0
  201. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/query_executor.py +0 -0
  202. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/data/transaction_executor.py +0 -0
  203. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/jobs/__init__.py +0 -0
  204. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/jobs/job_executor.py +0 -0
  205. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/jobs/schedule_executor.py +0 -0
  206. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/jobs/thread_executor.py +0 -0
  207. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/__init__.py +0 -0
  208. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/message_ack_executor.py +0 -0
  209. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/message_executor.py +0 -0
  210. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/queue_executor.py +0 -0
  211. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/messaging/websocket_executor.py +0 -0
  212. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/scripting/__init__.py +0 -0
  213. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/scripting/pyclass_executor.py +0 -0
  214. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/scripting/pyimport_executor.py +0 -0
  215. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/scripting/python_executor.py +0 -0
  216. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/__init__.py +0 -0
  217. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/dump_executor.py +0 -0
  218. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/file_executor.py +0 -0
  219. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/log_executor.py +0 -0
  220. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/executors/services/mail_executor.py +0 -0
  221. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/expression_cache.py +0 -0
  222. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/file_upload_service.py +0 -0
  223. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/function_registry.py +0 -0
  224. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/game_builder.py +0 -0
  225. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/game_code_generator.py +0 -0
  226. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/game_templates.py +0 -0
  227. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/godot_code_generator.py +0 -0
  228. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/godot_templates.py +0 -0
  229. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/job_executor.py +0 -0
  230. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/llm_cache.py +0 -0
  231. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/llm_providers.py +0 -0
  232. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/llm_service.py +0 -0
  233. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/logging_setup.py +0 -0
  234. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/message_broker.py +0 -0
  235. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/message_queue_service.py +0 -0
  236. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/param_validation.py +0 -0
  237. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/python_bridge.py +0 -0
  238. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/query_validators.py +0 -0
  239. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/renderer.py +0 -0
  240. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/terminal_builder.py +0 -0
  241. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/terminal_code_generator.py +0 -0
  242. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/terminal_templates.py +0 -0
  243. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/testing_builder.py +0 -0
  244. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/testing_code_generator.py +0 -0
  245. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/testing_templates.py +0 -0
  246. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_builder.py +0 -0
  247. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_desktop_adapter.py +0 -0
  248. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_desktop_templates.py +0 -0
  249. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_html_adapter.py +0 -0
  250. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_html_templates.py +0 -0
  251. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_mobile_adapter.py +0 -0
  252. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_mobile_templates.py +0 -0
  253. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_textual_adapter.py +0 -0
  254. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_textual_templates.py +0 -0
  255. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_tokens.py +0 -0
  256. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/ui_validator.py +0 -0
  257. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/validators.py +0 -0
  258. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/websocket_adapter.py +0 -0
  259. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/websocket_service.py +0 -0
  260. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/websocket_transport.py +0 -0
  261. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/runtime/wsgi.py +0 -0
  262. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum/utils/__init__.py +0 -0
  263. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/SOURCES.txt +0 -0
  264. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/dependency_links.txt +0 -0
  265. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/entry_points.txt +0 -0
  266. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/requires.txt +0 -0
  267. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/quantum_framework.egg-info/top_level.txt +0 -0
  268. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/setup.cfg +0 -0
  269. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_agent.py +0 -0
  270. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_animations.py +0 -0
  271. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ast_cache.py +0 -0
  272. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_cli_commands.py +0 -0
  273. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_component_library.py +0 -0
  274. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_data_fetching.py +0 -0
  275. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_desktop_bridge.py +0 -0
  276. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_expression_cache.py +0 -0
  277. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_form_validation.py +0 -0
  278. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_game_codegen.py +0 -0
  279. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_game_e2e.py +0 -0
  280. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_game_engine.py +0 -0
  281. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_game_parser.py +0 -0
  282. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_godot_codegen.py +0 -0
  283. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_job_executor.py +0 -0
  284. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_llm_providers.py +0 -0
  285. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_message_broker.py +0 -0
  286. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_message_queue.py +0 -0
  287. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_mobile_target.py +0 -0
  288. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_multi_agent.py +0 -0
  289. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_packages.py +0 -0
  290. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_plugins.py +0 -0
  291. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_projects_blog_components_admin.py +0 -0
  292. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_python_scripting.py +0 -0
  293. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_state_persistence.py +0 -0
  294. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_terminal_codegen.py +0 -0
  295. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_terminal_parser.py +0 -0
  296. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_testing_codegen.py +0 -0
  297. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_testing_parser.py +0 -0
  298. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_theming.py +0 -0
  299. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ui_html_adapter.py +0 -0
  300. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ui_parity.py +0 -0
  301. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ui_parser.py +0 -0
  302. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_ui_textual_adapter.py +0 -0
  303. {quantum_framework-0.9.0 → quantum_framework-0.10.0}/tests/test_websocket.py +0 -0
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quantum-framework
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: Full-stack declarative framework for building web, desktop, and mobile applications
5
5
  Author-email: Daniel Gregorio <danielgregorio2611@gmail.com>
6
6
  License: MIT
7
- Project-URL: Homepage, https://quantum.sargas.cloud
8
- Project-URL: Documentation, https://quantum.sargas.cloud
7
+ Project-URL: Homepage, https://github.com/danielgregorio/quantum
8
+ Project-URL: Documentation, https://danielgregorio.github.io/quantum/
9
+ Project-URL: Changelog, https://github.com/danielgregorio/quantum/releases
9
10
  Project-URL: Repository, https://github.com/danielgregorio/quantum
10
11
  Keywords: framework,declarative,xml,web,desktop,mobile
11
12
  Classifier: Development Status :: 4 - Beta
@@ -43,9 +44,10 @@ Dynamic: license-file
43
44
  # Quantum
44
45
 
45
46
  [![CI](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml/badge.svg)](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml)
46
- [![Docker](https://github.com/danielgregorio/quantum/actions/workflows/docker.yml/badge.svg)](https://github.com/danielgregorio/quantum/actions/workflows/docker.yml)
47
+ [![PyPI](https://img.shields.io/pypi/v/quantum-framework)](https://pypi.org/project/quantum-framework/)
48
+ [![Python](https://img.shields.io/pypi/pyversions/quantum-framework)](https://pypi.org/project/quantum-framework/)
47
49
  [![Docs](https://img.shields.io/badge/docs-github.io-blue)](https://danielgregorio.github.io/quantum/)
48
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
50
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/danielgregorio/quantum/blob/main/LICENSE)
49
51
 
50
52
  > **Declarative web apps in XML, with AI and RAG built into the language.
51
53
  > No build chain, no JavaScript, no frontend framework.**
@@ -123,6 +125,9 @@ coercion of the model's arguments are the runtime's job.
123
125
  </q:component>
124
126
  ```
125
127
 
128
+ Save it as `components/orders.q`, run `quantum start`, and it is served at
129
+ `http://localhost:8080/orders`.
130
+
126
131
  `q:query` refuses to run SQL with an undeclared `:param` — parameterised queries are
127
132
  enforced by the parser, not by discipline.
128
133
 
@@ -134,14 +139,22 @@ Also core: `q:set` with `session.` / `application.` / `request.` scopes, `q:if`,
134
139
 
135
140
  ## Quick start
136
141
 
137
- **Requirements:** Python 3.11+ and `pip`.
142
+ **Requirements:** Python 3.12+ and `pip`.
138
143
 
139
144
  ```bash
140
- git clone https://github.com/danielgregorio/quantum.git
141
- cd quantum
142
- pip install -e ".[dev]"
145
+ pip install quantum-framework
146
+ ```
143
147
 
144
- quantum run examples/hello.q
148
+ Create `hello.q`:
149
+
150
+ ```xml
151
+ <q:component name="HelloWorld" xmlns:q="https://quantum.lang/ns">
152
+ <q:return value="Hello World!" />
153
+ </q:component>
154
+ ```
155
+
156
+ ```bash
157
+ quantum run hello.q
145
158
  ```
146
159
 
147
160
  ```
@@ -149,17 +162,21 @@ quantum run examples/hello.q
149
162
  [SUCCESS] Result: Hello World!
150
163
  ```
151
164
 
165
+ For a web app, put `.q` files in `components/` and run `quantum start`
166
+ (`components/index.q` is served at `/`). `quantum stop` stops it.
167
+
152
168
  For the AI examples you also need an [Ollama](https://ollama.com) server and the RAG
153
169
  extra:
154
170
 
155
171
  ```bash
156
- pip install -e ".[rag]"
172
+ pip install "quantum-framework[rag]"
157
173
  ollama pull phi3 && ollama pull nomic-embed-text
158
174
  export QUANTUM_LLM_BASE_URL=http://localhost:11434
159
175
  ```
160
176
 
161
- Declare datasources in `quantum.config.yaml` and `q:query` works with nothing else
162
- running:
177
+ Declare datasources in `quantum.config.yaml` (next to `components/`) and `q:query` works
178
+ with nothing else running — SQLite needs no extra; PostgreSQL and MySQL drivers come with
179
+ `pip install "quantum-framework[db]"`:
163
180
 
164
181
  ```yaml
165
182
  datasources:
@@ -173,26 +190,41 @@ datasources:
173
190
  | Command | What it does |
174
191
  |---------|--------------|
175
192
  | `run <file.q>` | Execute a component, app, or API |
176
- | `start` | Start the web server |
177
- | `deploy <dir>` | Deploy an application |
193
+ | `start` | Start the web server (port 8080 by default; `--port` to change) |
194
+ | `stop` | Stop the server started by `start` |
195
+ | `deploy [path]` · `apps` | Deploy an application, manage deployed ones |
178
196
  | `pkg` · `jobs` · `mq` · `migrate` | Packages, jobs, message queues, migrations |
179
197
 
198
+ ### From source
199
+
200
+ To work on Quantum itself:
201
+
202
+ ```bash
203
+ git clone https://github.com/danielgregorio/quantum.git
204
+ cd quantum
205
+ pip install -e ".[dev]"
206
+ quantum run examples/hello.q
207
+ ```
208
+
209
+ See [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md) for the test suite and the architecture.
210
+
180
211
  ---
181
212
 
182
213
  ## Documentation
183
214
 
184
- Full docs (VitePress) at **[danielgregorio.github.io/quantum](https://danielgregorio.github.io/quantum/)** and in
185
- [`docs/`](docs/):
215
+ Full docs at **[danielgregorio.github.io/quantum](https://danielgregorio.github.io/quantum/)**:
216
+
217
+ - [Getting Started](https://danielgregorio.github.io/quantum/guide/getting-started) · [Installation](https://danielgregorio.github.io/quantum/guide/installation) · [Quick Start](https://danielgregorio.github.io/quantum/guide/quick-start)
218
+ - [Components](https://danielgregorio.github.io/quantum/guide/components) · [State](https://danielgregorio.github.io/quantum/guide/state-management) · [Loops](https://danielgregorio.github.io/quantum/guide/loops) · [Conditionals](https://danielgregorio.github.io/quantum/guide/conditionals)
219
+ - [Queries](https://danielgregorio.github.io/quantum/guide/query) · [Functions](https://danielgregorio.github.io/quantum/guide/functions) · [Data fetching](https://danielgregorio.github.io/quantum/guide/data-fetching)
186
220
 
187
- - [Getting Started](docs/guide/getting-started.md) · [Installation](docs/guide/installation.md) · [Quick Start](docs/guide/quick-start.md)
188
- - [Components](docs/guide/components.md) · [State](docs/guide/state-management.md) · [Loops](docs/guide/loops.md) · [Conditionals](docs/guide/conditionals.md)
189
- - [Queries](docs/guide/query.md) · [Functions](docs/guide/functions.md) · [Data fetching](docs/guide/data-fetching.md)
221
+ Releases and their notes are on the [GitHub Releases](https://github.com/danielgregorio/quantum/releases) page.
190
222
 
191
223
  ---
192
224
 
193
225
  ## Stability
194
226
 
195
- Support levels are defined in **[SUPPORT_TIERS.md](SUPPORT_TIERS.md)**. Short version:
227
+ Support levels are defined in **[SUPPORT_TIERS.md](https://github.com/danielgregorio/quantum/blob/main/SUPPORT_TIERS.md)**. Short version:
196
228
 
197
229
  | Surface | Status |
198
230
  |---------|--------|
@@ -200,13 +232,11 @@ Support levels are defined in **[SUPPORT_TIERS.md](SUPPORT_TIERS.md)**. Short ve
200
232
  | AI — `q:llm`, `q:knowledge`, `q:agent` | **Beta** — validated end-to-end against a live Ollama server |
201
233
  | `q:team` (multi-agent handoff) | Beta, less exercised |
202
234
  | Jobs, messaging, websockets, mail, file uploads, `ui:*`, terminal target | **Experimental** — they run, but no API stability promise |
203
- | Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) | Experimental, and a full-trust escape hatch — see [SECURITY.md](SECURITY.md) |
235
+ | 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) |
204
236
 
205
237
  A functional audit in 2026-09 found that several of these surfaces had never been run
206
- end-to-end despite being documented as complete. The findings and the fixes are in
207
- [`FULL_AUDIT_2026-09.md`](FULL_AUDIT_2026-09.md) and
208
- [`AUDIT_FIX_PLAN.md`](AUDIT_FIX_PLAN.md). Feature status is now verified by execution
209
- rather than asserted by hand.
238
+ end-to-end despite being documented as complete. They were fixed or re-labelled, and
239
+ feature status is now verified by execution rather than asserted by hand.
210
240
 
211
241
  Pre-1.0: APIs may change between minor versions.
212
242
 
@@ -221,24 +251,24 @@ quantum/
221
251
  │ ├── runtime/ # Execution engine, web server, renderer
222
252
  │ └── cli/ # Command-line entry point
223
253
  ├── examples/ # runnable .q examples
224
- ├── tests/ # pytest suite (~2.4k tests)
254
+ ├── tests/ # pytest suite (~3.8k tests)
225
255
  ├── scripts/ # dev tools
226
256
  └── docs/ # VitePress documentation
227
257
  ```
228
258
 
229
259
  Adding a tag is one parser + one executor + a registry entry — see
230
- [CONTRIBUTING.md](CONTRIBUTING.md).
260
+ [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md).
231
261
 
232
262
  ---
233
263
 
234
264
  ## Contributing
235
265
 
236
- Read **[CONTRIBUTING.md](CONTRIBUTING.md)** for dev setup and how the modular
266
+ Read **[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md)** for dev setup and how the modular
237
267
  parser/executor architecture works. By participating you agree to the
238
- [Code of Conduct](CODE_OF_CONDUCT.md).
268
+ [Code of Conduct](https://github.com/danielgregorio/quantum/blob/main/CODE_OF_CONDUCT.md).
239
269
 
240
- Found a security issue? Follow [SECURITY.md](SECURITY.md) — **do not** open a public issue.
270
+ Found a security issue? Follow [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) — **do not** open a public issue.
241
271
 
242
272
  ## License
243
273
 
244
- MIT — see [LICENSE](LICENSE).
274
+ MIT — see [LICENSE](https://github.com/danielgregorio/quantum/blob/main/LICENSE).
@@ -1,9 +1,10 @@
1
1
  # Quantum
2
2
 
3
3
  [![CI](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml/badge.svg)](https://github.com/danielgregorio/quantum/actions/workflows/ci.yml)
4
- [![Docker](https://github.com/danielgregorio/quantum/actions/workflows/docker.yml/badge.svg)](https://github.com/danielgregorio/quantum/actions/workflows/docker.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/quantum-framework)](https://pypi.org/project/quantum-framework/)
5
+ [![Python](https://img.shields.io/pypi/pyversions/quantum-framework)](https://pypi.org/project/quantum-framework/)
5
6
  [![Docs](https://img.shields.io/badge/docs-github.io-blue)](https://danielgregorio.github.io/quantum/)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/danielgregorio/quantum/blob/main/LICENSE)
7
8
 
8
9
  > **Declarative web apps in XML, with AI and RAG built into the language.
9
10
  > No build chain, no JavaScript, no frontend framework.**
@@ -81,6 +82,9 @@ coercion of the model's arguments are the runtime's job.
81
82
  </q:component>
82
83
  ```
83
84
 
85
+ Save it as `components/orders.q`, run `quantum start`, and it is served at
86
+ `http://localhost:8080/orders`.
87
+
84
88
  `q:query` refuses to run SQL with an undeclared `:param` — parameterised queries are
85
89
  enforced by the parser, not by discipline.
86
90
 
@@ -92,14 +96,22 @@ Also core: `q:set` with `session.` / `application.` / `request.` scopes, `q:if`,
92
96
 
93
97
  ## Quick start
94
98
 
95
- **Requirements:** Python 3.11+ and `pip`.
99
+ **Requirements:** Python 3.12+ and `pip`.
96
100
 
97
101
  ```bash
98
- git clone https://github.com/danielgregorio/quantum.git
99
- cd quantum
100
- pip install -e ".[dev]"
102
+ pip install quantum-framework
103
+ ```
101
104
 
102
- quantum run examples/hello.q
105
+ Create `hello.q`:
106
+
107
+ ```xml
108
+ <q:component name="HelloWorld" xmlns:q="https://quantum.lang/ns">
109
+ <q:return value="Hello World!" />
110
+ </q:component>
111
+ ```
112
+
113
+ ```bash
114
+ quantum run hello.q
103
115
  ```
104
116
 
105
117
  ```
@@ -107,17 +119,21 @@ quantum run examples/hello.q
107
119
  [SUCCESS] Result: Hello World!
108
120
  ```
109
121
 
122
+ For a web app, put `.q` files in `components/` and run `quantum start`
123
+ (`components/index.q` is served at `/`). `quantum stop` stops it.
124
+
110
125
  For the AI examples you also need an [Ollama](https://ollama.com) server and the RAG
111
126
  extra:
112
127
 
113
128
  ```bash
114
- pip install -e ".[rag]"
129
+ pip install "quantum-framework[rag]"
115
130
  ollama pull phi3 && ollama pull nomic-embed-text
116
131
  export QUANTUM_LLM_BASE_URL=http://localhost:11434
117
132
  ```
118
133
 
119
- Declare datasources in `quantum.config.yaml` and `q:query` works with nothing else
120
- running:
134
+ Declare datasources in `quantum.config.yaml` (next to `components/`) and `q:query` works
135
+ with nothing else running — SQLite needs no extra; PostgreSQL and MySQL drivers come with
136
+ `pip install "quantum-framework[db]"`:
121
137
 
122
138
  ```yaml
123
139
  datasources:
@@ -131,26 +147,41 @@ datasources:
131
147
  | Command | What it does |
132
148
  |---------|--------------|
133
149
  | `run <file.q>` | Execute a component, app, or API |
134
- | `start` | Start the web server |
135
- | `deploy <dir>` | Deploy an application |
150
+ | `start` | Start the web server (port 8080 by default; `--port` to change) |
151
+ | `stop` | Stop the server started by `start` |
152
+ | `deploy [path]` · `apps` | Deploy an application, manage deployed ones |
136
153
  | `pkg` · `jobs` · `mq` · `migrate` | Packages, jobs, message queues, migrations |
137
154
 
155
+ ### From source
156
+
157
+ To work on Quantum itself:
158
+
159
+ ```bash
160
+ git clone https://github.com/danielgregorio/quantum.git
161
+ cd quantum
162
+ pip install -e ".[dev]"
163
+ quantum run examples/hello.q
164
+ ```
165
+
166
+ See [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md) for the test suite and the architecture.
167
+
138
168
  ---
139
169
 
140
170
  ## Documentation
141
171
 
142
- Full docs (VitePress) at **[danielgregorio.github.io/quantum](https://danielgregorio.github.io/quantum/)** and in
143
- [`docs/`](docs/):
172
+ Full docs at **[danielgregorio.github.io/quantum](https://danielgregorio.github.io/quantum/)**:
173
+
174
+ - [Getting Started](https://danielgregorio.github.io/quantum/guide/getting-started) · [Installation](https://danielgregorio.github.io/quantum/guide/installation) · [Quick Start](https://danielgregorio.github.io/quantum/guide/quick-start)
175
+ - [Components](https://danielgregorio.github.io/quantum/guide/components) · [State](https://danielgregorio.github.io/quantum/guide/state-management) · [Loops](https://danielgregorio.github.io/quantum/guide/loops) · [Conditionals](https://danielgregorio.github.io/quantum/guide/conditionals)
176
+ - [Queries](https://danielgregorio.github.io/quantum/guide/query) · [Functions](https://danielgregorio.github.io/quantum/guide/functions) · [Data fetching](https://danielgregorio.github.io/quantum/guide/data-fetching)
144
177
 
145
- - [Getting Started](docs/guide/getting-started.md) · [Installation](docs/guide/installation.md) · [Quick Start](docs/guide/quick-start.md)
146
- - [Components](docs/guide/components.md) · [State](docs/guide/state-management.md) · [Loops](docs/guide/loops.md) · [Conditionals](docs/guide/conditionals.md)
147
- - [Queries](docs/guide/query.md) · [Functions](docs/guide/functions.md) · [Data fetching](docs/guide/data-fetching.md)
178
+ Releases and their notes are on the [GitHub Releases](https://github.com/danielgregorio/quantum/releases) page.
148
179
 
149
180
  ---
150
181
 
151
182
  ## Stability
152
183
 
153
- Support levels are defined in **[SUPPORT_TIERS.md](SUPPORT_TIERS.md)**. Short version:
184
+ Support levels are defined in **[SUPPORT_TIERS.md](https://github.com/danielgregorio/quantum/blob/main/SUPPORT_TIERS.md)**. Short version:
154
185
 
155
186
  | Surface | Status |
156
187
  |---------|--------|
@@ -158,13 +189,11 @@ Support levels are defined in **[SUPPORT_TIERS.md](SUPPORT_TIERS.md)**. Short ve
158
189
  | AI — `q:llm`, `q:knowledge`, `q:agent` | **Beta** — validated end-to-end against a live Ollama server |
159
190
  | `q:team` (multi-agent handoff) | Beta, less exercised |
160
191
  | Jobs, messaging, websockets, mail, file uploads, `ui:*`, terminal target | **Experimental** — they run, but no API stability promise |
161
- | Python scripting (`q:python`, `q:pyclass`, `q:pyimport`) | Experimental, and a full-trust escape hatch — see [SECURITY.md](SECURITY.md) |
192
+ | 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) |
162
193
 
163
194
  A functional audit in 2026-09 found that several of these surfaces had never been run
164
- end-to-end despite being documented as complete. The findings and the fixes are in
165
- [`FULL_AUDIT_2026-09.md`](FULL_AUDIT_2026-09.md) and
166
- [`AUDIT_FIX_PLAN.md`](AUDIT_FIX_PLAN.md). Feature status is now verified by execution
167
- rather than asserted by hand.
195
+ end-to-end despite being documented as complete. They were fixed or re-labelled, and
196
+ feature status is now verified by execution rather than asserted by hand.
168
197
 
169
198
  Pre-1.0: APIs may change between minor versions.
170
199
 
@@ -179,24 +208,24 @@ quantum/
179
208
  │ ├── runtime/ # Execution engine, web server, renderer
180
209
  │ └── cli/ # Command-line entry point
181
210
  ├── examples/ # runnable .q examples
182
- ├── tests/ # pytest suite (~2.4k tests)
211
+ ├── tests/ # pytest suite (~3.8k tests)
183
212
  ├── scripts/ # dev tools
184
213
  └── docs/ # VitePress documentation
185
214
  ```
186
215
 
187
216
  Adding a tag is one parser + one executor + a registry entry — see
188
- [CONTRIBUTING.md](CONTRIBUTING.md).
217
+ [CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md).
189
218
 
190
219
  ---
191
220
 
192
221
  ## Contributing
193
222
 
194
- Read **[CONTRIBUTING.md](CONTRIBUTING.md)** for dev setup and how the modular
223
+ Read **[CONTRIBUTING.md](https://github.com/danielgregorio/quantum/blob/main/CONTRIBUTING.md)** for dev setup and how the modular
195
224
  parser/executor architecture works. By participating you agree to the
196
- [Code of Conduct](CODE_OF_CONDUCT.md).
225
+ [Code of Conduct](https://github.com/danielgregorio/quantum/blob/main/CODE_OF_CONDUCT.md).
197
226
 
198
- Found a security issue? Follow [SECURITY.md](SECURITY.md) — **do not** open a public issue.
227
+ Found a security issue? Follow [SECURITY.md](https://github.com/danielgregorio/quantum/blob/main/SECURITY.md) — **do not** open a public issue.
199
228
 
200
229
  ## License
201
230
 
202
- MIT — see [LICENSE](LICENSE).
231
+ MIT — see [LICENSE](https://github.com/danielgregorio/quantum/blob/main/LICENSE).
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "quantum-framework"
7
- version = "0.9.0"
7
+ version = "0.10.0"
8
8
  description = "Full-stack declarative framework for building web, desktop, and mobile applications"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -60,8 +60,9 @@ websocket = [
60
60
  quantum = "quantum.cli.runner:main"
61
61
 
62
62
  [project.urls]
63
- Homepage = "https://quantum.sargas.cloud"
64
- Documentation = "https://quantum.sargas.cloud"
63
+ Homepage = "https://github.com/danielgregorio/quantum"
64
+ Documentation = "https://danielgregorio.github.io/quantum/"
65
+ Changelog = "https://github.com/danielgregorio/quantum/releases"
65
66
  Repository = "https://github.com/danielgregorio/quantum"
66
67
 
67
68
  [tool.setuptools.packages.find]
@@ -175,6 +175,9 @@ class QuantumRunner:
175
175
  for route in app.routes:
176
176
  print(f" {route.method} {route.path}")
177
177
 
178
+ from quantum.core.tiers import warn_app_type
179
+ warn_app_type(app.app_type)
180
+
178
181
  if app.app_type == 'game':
179
182
  return self._build_game(app, debug)
180
183
  elif app.app_type == 'terminal':
@@ -118,7 +118,41 @@ def _round(v: Any, digits: int = 0) -> Any:
118
118
  return int(result) if digits == 0 else result
119
119
 
120
120
 
121
+ # -- passwords ---------------------------------------------------------------
122
+ #
123
+ # Authentication is Core (decision D4), and a login is "look the user up, then
124
+ # check the password". Without these, a .q could not check a password against
125
+ # a stored hash without q:python — so every login example just set
126
+ # session.authenticated=true for whoever submitted the form (gap AUTH-1).
127
+
128
+ def hash_password(password: Any) -> str:
129
+ """bcrypt hash of a password, for storing. Never store the password itself."""
130
+ import bcrypt
131
+ if password is None or password == '':
132
+ raise ValueError("hashPassword: the password is empty")
133
+ return bcrypt.hashpw(str(password).encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
134
+
135
+
136
+ def verify_password(password: Any, hashed: Any) -> bool:
137
+ """True when `password` matches a hash made by hashPassword.
138
+
139
+ Fail-closed: an empty password, a missing hash or a malformed hash is
140
+ False, never an error — so `q:if condition="verifyPassword(senha, h)"`
141
+ cannot be tricked into the true branch by bad data.
142
+ """
143
+ import bcrypt
144
+ if not password or not hashed or not isinstance(hashed, str):
145
+ return False
146
+ try:
147
+ return bcrypt.checkpw(str(password).encode('utf-8'), hashed.encode('utf-8'))
148
+ except (ValueError, TypeError):
149
+ return False
150
+
151
+
121
152
  STDLIB = {
153
+ # passwords
154
+ 'hashPassword': hash_password,
155
+ 'verifyPassword': verify_password,
122
156
  # dates
123
157
  'now': now,
124
158
  'dateAdd': date_add,
@@ -241,7 +241,7 @@ class DataImportService:
241
241
  data.append(record)
242
242
 
243
243
  return DataResult(
244
- success=False,
244
+ success=True, # was False: every XML import "failed", so no transform ran on it
245
245
  data=data,
246
246
  recordCount=len(data),
247
247
  source=source
@@ -385,7 +385,7 @@ class DataImportService:
385
385
  """Compute derived field"""
386
386
  field = compute_op.get('field')
387
387
  expression = compute_op.get('expression')
388
- comp_type = compute_op.get('type', 'string')
388
+ comp_type = compute_op.get('comp_type', 'string')
389
389
 
390
390
  if not field or not expression:
391
391
  return data
@@ -482,23 +482,18 @@ class DataImportService:
482
482
  if xpath == 'text()':
483
483
  return node.text
484
484
 
485
- # Handle child element
486
- child = node.find(xpath)
487
- if child is not None:
488
- if xpath.endswith('/text()'):
489
- return child.text
490
- elif xpath.endswith('/@'):
491
- # Extract attribute from child
492
- parts = xpath.rsplit('/@', 1)
493
- if len(parts) == 2:
494
- child_path, attr = parts
495
- child_elem = node.find(child_path)
496
- if child_elem is not None:
497
- return child_elem.get(attr)
498
- else:
499
- return child.text
485
+ # child/@attr — ElementTree's find() does not understand the @ step.
486
+ if '/@' in xpath:
487
+ child_path, attr = xpath.rsplit('/@', 1)
488
+ child = node.find(child_path)
489
+ return child.get(attr) if child is not None else None
500
490
 
501
- return None
491
+ # child/text() — nor text(); it raised SyntaxError on every such field.
492
+ if xpath.endswith('/text()'):
493
+ xpath = xpath[:-len('/text()')]
494
+
495
+ child = node.find(xpath)
496
+ return child.text if child is not None else None
502
497
 
503
498
  def _evaluate_condition(self, condition: str, record: Dict[str, Any], context: Any) -> bool:
504
499
  """Evaluate a q:data filter condition against one imported record.
@@ -125,12 +125,15 @@ class DataParser(BaseTagParser):
125
125
  def _parse_field(self, element: ET.Element) -> FieldNode:
126
126
  """Parse q:field for JSON/XML."""
127
127
  name = self.get_attr(element, 'name')
128
- path = self.get_attr(element, 'path')
128
+ # `xpath` is the attribute every example and the reference use; only
129
+ # `path` was read, so `xpath="@id"` became the name "id" and `type` was
130
+ # dropped — attributes came back None and numbers came back as text.
131
+ path = self.get_attr(element, 'xpath') or self.get_attr(element, 'path')
129
132
 
130
133
  if not name:
131
134
  raise ParserError("Field requires 'name' attribute")
132
135
 
133
- return FieldNode(name, path or name)
136
+ return FieldNode(name, path or name, self.get_attr(element, 'type') or 'string')
134
137
 
135
138
  def _parse_transform(self, element: ET.Element) -> TransformNode:
136
139
  """Parse q:transform — a container of operations.
@@ -38,6 +38,28 @@ EXPERIMENTAL = frozenset({
38
38
 
39
39
  SUPPORTED = CORE | DIFERENCIAL
40
40
 
41
+ # Authentication is Core too (decision D4, 2026-09-10), but it is not a tag:
42
+ # it is the require_auth / require_role attributes of q:component plus the
43
+ # session scope. Listed here so the surface is complete in one place.
44
+ CORE_ATTRIBUTES = frozenset({"require_auth", "require_role"})
45
+
46
+ # Application types, by tier. A q:application's type decides which engine
47
+ # runs it, so the tier of the type is the tier of the whole app.
48
+ #
49
+ # LABORATORIO (decision D1/D2): the 2D game engine (qg:, including the Godot
50
+ # codegen) stays in the repository on purpose — games press on the language
51
+ # and surface features and bugs the core needs — but it carries no stability
52
+ # promise and is not part of the pitch. Its tests run in the main suite, so a
53
+ # core change that breaks a game shows up in CI.
54
+ LAB_APP_TYPES = frozenset({"game"})
55
+ # "html" and "api" are experimental too, measured 2026-09-10: `quantum run` on a
56
+ # type="html" application fails at once (gap G17), and the type="api" server
57
+ # never executes a route's body — it serves the literal text of the first
58
+ # q:return (gap G18). The supported way to build a web app is pages in
59
+ # components/ served by `quantum start`, which runs no q:application at all.
60
+ EXPERIMENTAL_APP_TYPES = frozenset({"terminal", "ui", "testing", "microservices",
61
+ "html", "api"})
62
+
41
63
 
42
64
  def tier_of(tag_name: str) -> str:
43
65
  """'core' | 'diferencial' | 'experimental' | 'unknown'."""
@@ -77,6 +99,36 @@ def warn_if_unsupported(tag_name: str) -> None:
77
99
  )
78
100
 
79
101
 
102
+ def app_tier_of(app_type: str) -> str:
103
+ """'laboratorio' | 'experimental' | 'supported' for a q:application type."""
104
+ if app_type in LAB_APP_TYPES:
105
+ return "laboratorio"
106
+ if app_type in EXPERIMENTAL_APP_TYPES:
107
+ return "experimental"
108
+ return "supported"
109
+
110
+
111
+ def warn_app_type(app_type: str) -> None:
112
+ """One-time warning when an application of a non-supported type runs."""
113
+ tier = app_tier_of(app_type)
114
+ key = f"application:{app_type}"
115
+ if tier == "supported" or key in _warned:
116
+ return
117
+ _warned.add(key)
118
+ if tier == "laboratorio":
119
+ logger.warning(
120
+ "q:application type=%r is LABORATÓRIO — it exists to press on the "
121
+ "language, with no stability promise (SUPPORT_TIERS.md). It may "
122
+ "change or break without notice.", app_type
123
+ )
124
+ else:
125
+ logger.warning(
126
+ "q:application type=%r is EXPERIMENTAL — not covered by the "
127
+ "supported surface (SUPPORT_TIERS.md). It may change or break "
128
+ "without notice; do not rely on it in production.", app_type
129
+ )
130
+
131
+
80
132
  def reset_warnings() -> None:
81
133
  """For tests, and for a reloading server."""
82
134
  _warned.clear()
@@ -119,7 +119,10 @@ class DataExecutor(BaseExecutor):
119
119
  elif hasattr(operation, 'field'):
120
120
  op_dict['field'] = operation.field
121
121
  op_dict['expression'] = operation.expression
122
- op_dict['type'] = operation.comp_type
122
+ # Not 'type': that key names the operation ('compute').
123
+ # Writing the result type over it made every q:compute
124
+ # unrecognised, and the transformation was skipped.
125
+ op_dict['comp_type'] = operation.comp_type
123
126
 
124
127
  params['transforms'].append(op_dict)
125
128