nexura-runtime 0.4.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 (318) hide show
  1. nexura_runtime-0.4.0/.gitignore +79 -0
  2. nexura_runtime-0.4.0/LICENSE +21 -0
  3. nexura_runtime-0.4.0/PKG-INFO +239 -0
  4. nexura_runtime-0.4.0/README.md +204 -0
  5. nexura_runtime-0.4.0/THIRD_PARTY.md +171 -0
  6. nexura_runtime-0.4.0/pyproject.toml +176 -0
  7. nexura_runtime-0.4.0/src/nexura_runtime/__init__.py +607 -0
  8. nexura_runtime-0.4.0/src/nexura_runtime/_removed.py +92 -0
  9. nexura_runtime-0.4.0/src/nexura_runtime/_workflow_journal.py +728 -0
  10. nexura_runtime-0.4.0/src/nexura_runtime/agents_spec.py +395 -0
  11. nexura_runtime-0.4.0/src/nexura_runtime/agents_store.py +286 -0
  12. nexura_runtime-0.4.0/src/nexura_runtime/artifacts/__init__.py +23 -0
  13. nexura_runtime-0.4.0/src/nexura_runtime/artifacts/errors.py +58 -0
  14. nexura_runtime-0.4.0/src/nexura_runtime/artifacts/module.py +104 -0
  15. nexura_runtime-0.4.0/src/nexura_runtime/artifacts/store.py +239 -0
  16. nexura_runtime-0.4.0/src/nexura_runtime/builder_assistant.py +721 -0
  17. nexura_runtime-0.4.0/src/nexura_runtime/cli/__init__.py +9 -0
  18. nexura_runtime-0.4.0/src/nexura_runtime/cli/commands.py +29 -0
  19. nexura_runtime-0.4.0/src/nexura_runtime/cli/main.py +1233 -0
  20. nexura_runtime-0.4.0/src/nexura_runtime/codegen.py +573 -0
  21. nexura_runtime-0.4.0/src/nexura_runtime/credentials/__init__.py +21 -0
  22. nexura_runtime-0.4.0/src/nexura_runtime/credentials/backends.py +127 -0
  23. nexura_runtime-0.4.0/src/nexura_runtime/credentials/errors.py +35 -0
  24. nexura_runtime-0.4.0/src/nexura_runtime/credentials/models.py +49 -0
  25. nexura_runtime-0.4.0/src/nexura_runtime/credentials/store.py +263 -0
  26. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/__init__.py +98 -0
  27. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/_service_access.py +19 -0
  28. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/dataset.py +181 -0
  29. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/errors.py +75 -0
  30. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/graders.py +812 -0
  31. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/models.py +206 -0
  32. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/module.py +228 -0
  33. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/openai_import.py +763 -0
  34. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/runner.py +707 -0
  35. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/store.py +320 -0
  36. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/studio_engine.py +756 -0
  37. nexura_runtime-0.4.0/src/nexura_runtime/evaluation/studio_store.py +277 -0
  38. nexura_runtime-0.4.0/src/nexura_runtime/integrations/__init__.py +99 -0
  39. nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/__init__.py +102 -0
  40. nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/email.py +340 -0
  41. nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/errors.py +56 -0
  42. nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/models.py +75 -0
  43. nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/module.py +339 -0
  44. nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/outbox.py +272 -0
  45. nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/redaction.py +94 -0
  46. nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/whatsapp.py +347 -0
  47. nexura_runtime-0.4.0/src/nexura_runtime/integrations/http/__init__.py +30 -0
  48. nexura_runtime-0.4.0/src/nexura_runtime/integrations/http/errors.py +19 -0
  49. nexura_runtime-0.4.0/src/nexura_runtime/integrations/http/module.py +256 -0
  50. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/__init__.py +65 -0
  51. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/build.py +1221 -0
  52. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/components.py +662 -0
  53. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/errors.py +66 -0
  54. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/export.py +355 -0
  55. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/flow.py +517 -0
  56. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/models.py +137 -0
  57. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/registry.py +254 -0
  58. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/tools.py +118 -0
  59. nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/tweaks.py +108 -0
  60. nexura_runtime-0.4.0/src/nexura_runtime/integrations/mcp_defaults.py +64 -0
  61. nexura_runtime-0.4.0/src/nexura_runtime/integrations/nexura_v2/README.md +55 -0
  62. nexura_runtime-0.4.0/src/nexura_runtime/integrations/nexura_v2/__init__.py +25 -0
  63. nexura_runtime-0.4.0/src/nexura_runtime/integrations/nexura_v2/exporter.py +422 -0
  64. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/__init__.py +145 -0
  65. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/_monty_files.py +71 -0
  66. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/backends.py +300 -0
  67. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/errors.py +134 -0
  68. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/models.py +315 -0
  69. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/module.py +599 -0
  70. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/monty_worker.py +554 -0
  71. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/worker.py +665 -0
  72. nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/__init__.py +47 -0
  73. nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/errors.py +35 -0
  74. nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/module.py +224 -0
  75. nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/service.py +477 -0
  76. nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/types.py +170 -0
  77. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sql/__init__.py +76 -0
  78. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sql/connection.py +239 -0
  79. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sql/errors.py +123 -0
  80. nexura_runtime-0.4.0/src/nexura_runtime/integrations/sql/modules.py +414 -0
  81. nexura_runtime-0.4.0/src/nexura_runtime/integrations/tools/__init__.py +7 -0
  82. nexura_runtime-0.4.0/src/nexura_runtime/integrations/tools/adapter.py +162 -0
  83. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/__init__.py +201 -0
  84. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunking/__init__.py +41 -0
  85. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/__init__.py +52 -0
  86. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/chunkers.py +469 -0
  87. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/errors.py +47 -0
  88. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/models.py +104 -0
  89. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/module.py +168 -0
  90. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/tokenizers.py +19 -0
  91. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/__init__.py +48 -0
  92. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/cache.py +192 -0
  93. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/config.py +116 -0
  94. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/embedder.py +240 -0
  95. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/errors.py +92 -0
  96. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/models.py +100 -0
  97. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/module.py +205 -0
  98. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/provider.py +107 -0
  99. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/hybrid.py +972 -0
  100. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/__init__.py +69 -0
  101. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/detector.py +75 -0
  102. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/errors.py +97 -0
  103. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/models.py +52 -0
  104. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/module.py +140 -0
  105. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/parsers.py +429 -0
  106. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/pipeline.py +245 -0
  107. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/__init__.py +58 -0
  108. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/errors.py +72 -0
  109. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/fusion.py +157 -0
  110. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/lexical.py +98 -0
  111. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/models.py +85 -0
  112. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/module.py +176 -0
  113. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/packer.py +138 -0
  114. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/pipeline.py +298 -0
  115. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/tool.py +48 -0
  116. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/__init__.py +60 -0
  117. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/adapters/__init__.py +20 -0
  118. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/adapters/common.py +120 -0
  119. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/errors.py +111 -0
  120. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/metrics.py +64 -0
  121. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/models.py +133 -0
  122. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/module.py +301 -0
  123. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/sqlite.py +635 -0
  124. nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/store.py +437 -0
  125. nexura_runtime-0.4.0/src/nexura_runtime/memory/__init__.py +39 -0
  126. nexura_runtime-0.4.0/src/nexura_runtime/memory/errors.py +111 -0
  127. nexura_runtime-0.4.0/src/nexura_runtime/memory/models.py +51 -0
  128. nexura_runtime-0.4.0/src/nexura_runtime/memory/module.py +165 -0
  129. nexura_runtime-0.4.0/src/nexura_runtime/memory/store.py +647 -0
  130. nexura_runtime-0.4.0/src/nexura_runtime/memory/vector_memory.py +202 -0
  131. nexura_runtime-0.4.0/src/nexura_runtime/modules/__init__.py +46 -0
  132. nexura_runtime-0.4.0/src/nexura_runtime/modules/__main__.py +10 -0
  133. nexura_runtime-0.4.0/src/nexura_runtime/modules/cli.py +160 -0
  134. nexura_runtime-0.4.0/src/nexura_runtime/modules/data/__init__.py +35 -0
  135. nexura_runtime-0.4.0/src/nexura_runtime/modules/data/errors.py +41 -0
  136. nexura_runtime-0.4.0/src/nexura_runtime/modules/data/module.py +125 -0
  137. nexura_runtime-0.4.0/src/nexura_runtime/modules/data/transform.py +264 -0
  138. nexura_runtime-0.4.0/src/nexura_runtime/modules/optional_packages.py +135 -0
  139. nexura_runtime-0.4.0/src/nexura_runtime/modules/registry.py +425 -0
  140. nexura_runtime-0.4.0/src/nexura_runtime/modules/text/__init__.py +27 -0
  141. nexura_runtime-0.4.0/src/nexura_runtime/modules/text/errors.py +40 -0
  142. nexura_runtime-0.4.0/src/nexura_runtime/modules/text/module.py +94 -0
  143. nexura_runtime-0.4.0/src/nexura_runtime/modules/text/template.py +408 -0
  144. nexura_runtime-0.4.0/src/nexura_runtime/observability/__init__.py +61 -0
  145. nexura_runtime-0.4.0/src/nexura_runtime/observability/errors.py +26 -0
  146. nexura_runtime-0.4.0/src/nexura_runtime/observability/metrics.py +95 -0
  147. nexura_runtime-0.4.0/src/nexura_runtime/observability/models.py +70 -0
  148. nexura_runtime-0.4.0/src/nexura_runtime/observability/module.py +182 -0
  149. nexura_runtime-0.4.0/src/nexura_runtime/observability/otlp.py +82 -0
  150. nexura_runtime-0.4.0/src/nexura_runtime/observability/run_diagnostics.py +662 -0
  151. nexura_runtime-0.4.0/src/nexura_runtime/observability/sinks.py +345 -0
  152. nexura_runtime-0.4.0/src/nexura_runtime/observability/tracer.py +128 -0
  153. nexura_runtime-0.4.0/src/nexura_runtime/project/__init__.py +48 -0
  154. nexura_runtime-0.4.0/src/nexura_runtime/project/config.py +135 -0
  155. nexura_runtime-0.4.0/src/nexura_runtime/project/deploy.py +94 -0
  156. nexura_runtime-0.4.0/src/nexura_runtime/project/dev.py +308 -0
  157. nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/README.md.tmpl +45 -0
  158. nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/__package__/__init__.py.tmpl +5 -0
  159. nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/__package__/__main__.py.tmpl +32 -0
  160. nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/__package__/agent.py.tmpl +116 -0
  161. nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/__package__/studio.py.tmpl +55 -0
  162. nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/env.example.tmpl +8 -0
  163. nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/tests/test_agent.py.tmpl +65 -0
  164. nexura_runtime-0.4.0/src/nexura_runtime/project/files/common/dot-gitignore.tmpl +22 -0
  165. nexura_runtime-0.4.0/src/nexura_runtime/project/files/common/pyproject.toml.tmpl +40 -0
  166. nexura_runtime-0.4.0/src/nexura_runtime/project/files/docker/DEPLOY.md.tmpl +47 -0
  167. nexura_runtime-0.4.0/src/nexura_runtime/project/files/docker/Dockerfile.tmpl +38 -0
  168. nexura_runtime-0.4.0/src/nexura_runtime/project/files/docker/dot-dockerignore.tmpl +17 -0
  169. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/README.md.tmpl +53 -0
  170. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/__package__/__init__.py.tmpl +5 -0
  171. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/__package__/__main__.py.tmpl +30 -0
  172. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/__package__/rag.py.tmpl +157 -0
  173. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/__package__/studio.py.tmpl +45 -0
  174. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/docs/refunds.md.tmpl +4 -0
  175. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/docs/shipping.md.tmpl +4 -0
  176. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/env.example.tmpl +11 -0
  177. nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/tests/test_rag.py.tmpl +62 -0
  178. nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/README.md.tmpl +47 -0
  179. nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/__package__/__init__.py.tmpl +5 -0
  180. nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/__package__/__main__.py.tmpl +37 -0
  181. nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/__package__/studio.py.tmpl +10 -0
  182. nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/__package__/workflow.py.tmpl +90 -0
  183. nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/env.example.tmpl +7 -0
  184. nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/tests/test_workflow.py.tmpl +52 -0
  185. nexura_runtime-0.4.0/src/nexura_runtime/project/scaffold.py +255 -0
  186. nexura_runtime-0.4.0/src/nexura_runtime/py.typed +1 -0
  187. nexura_runtime-0.4.0/src/nexura_runtime/release/__init__.py +53 -0
  188. nexura_runtime-0.4.0/src/nexura_runtime/release/backup.py +267 -0
  189. nexura_runtime-0.4.0/src/nexura_runtime/release/capabilities.json +582 -0
  190. nexura_runtime-0.4.0/src/nexura_runtime/release/diagnostics.py +134 -0
  191. nexura_runtime-0.4.0/src/nexura_runtime/release/evidence.py +201 -0
  192. nexura_runtime-0.4.0/src/nexura_runtime/release/health.py +219 -0
  193. nexura_runtime-0.4.0/src/nexura_runtime/release/matrix.py +69 -0
  194. nexura_runtime-0.4.0/src/nexura_runtime/release/migration.py +118 -0
  195. nexura_runtime-0.4.0/src/nexura_runtime/repro_workflow.py +87 -0
  196. nexura_runtime-0.4.0/src/nexura_runtime/retention.py +2104 -0
  197. nexura_runtime-0.4.0/src/nexura_runtime/runtime/__init__.py +53 -0
  198. nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/__init__.py +77 -0
  199. nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/call_ledger.py +340 -0
  200. nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/coordinator.py +896 -0
  201. nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/definition.py +533 -0
  202. nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/errors.py +186 -0
  203. nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/module.py +239 -0
  204. nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/saved.py +351 -0
  205. nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/types.py +50 -0
  206. nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/__init__.py +53 -0
  207. nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/errors.py +243 -0
  208. nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/gate.py +447 -0
  209. nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/manager.py +494 -0
  210. nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/models.py +109 -0
  211. nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/module.py +181 -0
  212. nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/__init__.py +46 -0
  213. nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/compiler.py +242 -0
  214. nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/errors.py +113 -0
  215. nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/executor.py +184 -0
  216. nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/models.py +71 -0
  217. nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/module.py +70 -0
  218. nexura_runtime-0.4.0/src/nexura_runtime/runtime/effects/__init__.py +30 -0
  219. nexura_runtime-0.4.0/src/nexura_runtime/runtime/effects/errors.py +23 -0
  220. nexura_runtime-0.4.0/src/nexura_runtime/runtime/effects/models.py +22 -0
  221. nexura_runtime-0.4.0/src/nexura_runtime/runtime/effects/reconciler.py +21 -0
  222. nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/__init__.py +36 -0
  223. nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/engine.py +21 -0
  224. nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/errors.py +24 -0
  225. nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/models.py +26 -0
  226. nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/module.py +21 -0
  227. nexura_runtime-0.4.0/src/nexura_runtime/secrets/__init__.py +49 -0
  228. nexura_runtime-0.4.0/src/nexura_runtime/secrets/errors.py +64 -0
  229. nexura_runtime-0.4.0/src/nexura_runtime/secrets/keys.py +120 -0
  230. nexura_runtime-0.4.0/src/nexura_runtime/secrets/store.py +264 -0
  231. nexura_runtime-0.4.0/src/nexura_runtime/service/__init__.py +136 -0
  232. nexura_runtime-0.4.0/src/nexura_runtime/service/api/__init__.py +59 -0
  233. nexura_runtime-0.4.0/src/nexura_runtime/service/api/agents.py +616 -0
  234. nexura_runtime-0.4.0/src/nexura_runtime/service/api/app.py +851 -0
  235. nexura_runtime-0.4.0/src/nexura_runtime/service/api/auth_providers.py +136 -0
  236. nexura_runtime-0.4.0/src/nexura_runtime/service/api/bind_guard.py +70 -0
  237. nexura_runtime-0.4.0/src/nexura_runtime/service/api/builder.py +246 -0
  238. nexura_runtime-0.4.0/src/nexura_runtime/service/api/builtin_extensions.py +31 -0
  239. nexura_runtime-0.4.0/src/nexura_runtime/service/api/chat_models.py +166 -0
  240. nexura_runtime-0.4.0/src/nexura_runtime/service/api/client.py +1773 -0
  241. nexura_runtime-0.4.0/src/nexura_runtime/service/api/credentials.py +377 -0
  242. nexura_runtime-0.4.0/src/nexura_runtime/service/api/descriptors.py +423 -0
  243. nexura_runtime-0.4.0/src/nexura_runtime/service/api/diagnostics.py +49 -0
  244. nexura_runtime-0.4.0/src/nexura_runtime/service/api/effects.py +176 -0
  245. nexura_runtime-0.4.0/src/nexura_runtime/service/api/errors.py +27 -0
  246. nexura_runtime-0.4.0/src/nexura_runtime/service/api/evaluations.py +730 -0
  247. nexura_runtime-0.4.0/src/nexura_runtime/service/api/export.py +541 -0
  248. nexura_runtime-0.4.0/src/nexura_runtime/service/api/guardrails.py +425 -0
  249. nexura_runtime-0.4.0/src/nexura_runtime/service/api/integrations.py +991 -0
  250. nexura_runtime-0.4.0/src/nexura_runtime/service/api/knowledge.py +583 -0
  251. nexura_runtime-0.4.0/src/nexura_runtime/service/api/local_secrets.py +56 -0
  252. nexura_runtime-0.4.0/src/nexura_runtime/service/api/local_session.py +326 -0
  253. nexura_runtime-0.4.0/src/nexura_runtime/service/api/middleware.py +604 -0
  254. nexura_runtime-0.4.0/src/nexura_runtime/service/api/models.py +303 -0
  255. nexura_runtime-0.4.0/src/nexura_runtime/service/api/operator_token.py +780 -0
  256. nexura_runtime-0.4.0/src/nexura_runtime/service/api/policy.py +45 -0
  257. nexura_runtime-0.4.0/src/nexura_runtime/service/api/ratelimit.py +42 -0
  258. nexura_runtime-0.4.0/src/nexura_runtime/service/api/run_revocation.py +142 -0
  259. nexura_runtime-0.4.0/src/nexura_runtime/service/api/runs.py +2435 -0
  260. nexura_runtime-0.4.0/src/nexura_runtime/service/api/sessions.py +1269 -0
  261. nexura_runtime-0.4.0/src/nexura_runtime/service/api/skills.py +166 -0
  262. nexura_runtime-0.4.0/src/nexura_runtime/service/api/studio_evals.py +1170 -0
  263. nexura_runtime-0.4.0/src/nexura_runtime/service/api/templates.py +111 -0
  264. nexura_runtime-0.4.0/src/nexura_runtime/service/api/triggers.py +810 -0
  265. nexura_runtime-0.4.0/src/nexura_runtime/service/api/validation.py +436 -0
  266. nexura_runtime-0.4.0/src/nexura_runtime/service/api/workflows.py +871 -0
  267. nexura_runtime-0.4.0/src/nexura_runtime/service/api/workspaces.py +286 -0
  268. nexura_runtime-0.4.0/src/nexura_runtime/service/auth/__init__.py +61 -0
  269. nexura_runtime-0.4.0/src/nexura_runtime/service/auth/errors.py +106 -0
  270. nexura_runtime-0.4.0/src/nexura_runtime/service/auth/models.py +37 -0
  271. nexura_runtime-0.4.0/src/nexura_runtime/service/auth/permissions.py +56 -0
  272. nexura_runtime-0.4.0/src/nexura_runtime/service/auth/profile.py +45 -0
  273. nexura_runtime-0.4.0/src/nexura_runtime/service/auth/resources.py +36 -0
  274. nexura_runtime-0.4.0/src/nexura_runtime/service/extensions.py +542 -0
  275. nexura_runtime-0.4.0/src/nexura_runtime/service/repro_capture.py +185 -0
  276. nexura_runtime-0.4.0/src/nexura_runtime/service/run_liveness.py +175 -0
  277. nexura_runtime-0.4.0/src/nexura_runtime/service/stream_adapters.py +477 -0
  278. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/__init__.py +77 -0
  279. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/errors.py +93 -0
  280. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/manager.py +256 -0
  281. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/models.py +93 -0
  282. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/module.py +240 -0
  283. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/schedules.py +212 -0
  284. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/secretbox.py +119 -0
  285. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/signatures.py +96 -0
  286. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/store.py +1096 -0
  287. nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/worker.py +594 -0
  288. nexura_runtime-0.4.0/src/nexura_runtime/service/workflow_state.py +59 -0
  289. nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/__init__.py +29 -0
  290. nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/errors.py +46 -0
  291. nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/membership.py +40 -0
  292. nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/models.py +35 -0
  293. nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/repository.py +395 -0
  294. nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/scoping.py +356 -0
  295. nexura_runtime-0.4.0/src/nexura_runtime/skills_store.py +338 -0
  296. nexura_runtime-0.4.0/src/nexura_runtime/storage/__init__.py +24 -0
  297. nexura_runtime-0.4.0/src/nexura_runtime/storage/execution_bridge.py +154 -0
  298. nexura_runtime-0.4.0/src/nexura_runtime/storage/migrations.py +260 -0
  299. nexura_runtime-0.4.0/src/nexura_runtime/storage/models.py +35 -0
  300. nexura_runtime-0.4.0/src/nexura_runtime/storage/repository.py +427 -0
  301. nexura_runtime-0.4.0/src/nexura_runtime/studio/__init__.py +27 -0
  302. nexura_runtime-0.4.0/src/nexura_runtime/studio/api/__init__.py +6 -0
  303. nexura_runtime-0.4.0/src/nexura_runtime/studio/api/traces.py +46 -0
  304. nexura_runtime-0.4.0/src/nexura_runtime/studio/builtin_modules.py +284 -0
  305. nexura_runtime-0.4.0/src/nexura_runtime/studio/security.py +275 -0
  306. nexura_runtime-0.4.0/src/nexura_runtime/studio/store.py +1117 -0
  307. nexura_runtime-0.4.0/src/nexura_runtime/studio/traces.py +506 -0
  308. nexura_runtime-0.4.0/src/nexura_runtime/templates/__init__.py +39 -0
  309. nexura_runtime-0.4.0/src/nexura_runtime/templates/catalog.py +141 -0
  310. nexura_runtime-0.4.0/src/nexura_runtime/templates/data/approval-workflow.json +115 -0
  311. nexura_runtime-0.4.0/src/nexura_runtime/templates/data/rag-qa-citations.json +126 -0
  312. nexura_runtime-0.4.0/src/nexura_runtime/templates/data/research-team.json +101 -0
  313. nexura_runtime-0.4.0/src/nexura_runtime/templates/data/scheduled-report.json +108 -0
  314. nexura_runtime-0.4.0/src/nexura_runtime/templates/data/structured-extraction.json +104 -0
  315. nexura_runtime-0.4.0/src/nexura_runtime/templates/data/support-desk-refund-approval.json +121 -0
  316. nexura_runtime-0.4.0/src/nexura_runtime/templates/handlers.py +346 -0
  317. nexura_runtime-0.4.0/src/nexura_runtime/templates/runner.py +88 -0
  318. nexura_runtime-0.4.0/src/nexura_runtime/workflow.py +7374 -0
@@ -0,0 +1,79 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments
24
+ .venv/
25
+ venv/
26
+ ENV/
27
+
28
+ # Testing and linting
29
+ .pytest_cache/
30
+ .coverage
31
+ htmlcov/
32
+ .ruff_cache/
33
+ .mypy_cache/
34
+
35
+ # IDE
36
+ .idea/
37
+ .vscode/
38
+ *.swp
39
+ *.swo
40
+
41
+ # Local databases and run state (never commit)
42
+ *.sqlite3
43
+ *.sqlite3-shm
44
+ *.sqlite3-wal
45
+ /:memory:
46
+ .agy/
47
+
48
+ # Node / Studio build output
49
+ node_modules/
50
+ studio-web/dist/
51
+ clients/typescript/dist/
52
+ studio-web/test-results/
53
+ studio-web/playwright-report/
54
+ *.tgz
55
+
56
+ # Never commit (added 2026-10-18 before the first local git commit)
57
+ # Local databases, trigger encryption keys and other key material
58
+ *.db
59
+ *.key
60
+ *.sqlite3.trigger.key
61
+ .env
62
+ .env.*
63
+ !.env.example
64
+ *.pem
65
+ # Local run logs at the project root (gate, suite, browser)
66
+ *.log
67
+ .*.log
68
+ # Autopilot scratch (backups, repros, agent prompts); history lives in oss-completion-blueprint/
69
+ /.autopilot/
70
+ # Tool caches and local agent state
71
+ .mypy_cache/
72
+ .claude/
73
+ .playwright-mcp/
74
+ # Closed edition: its own nested local git repository, never part of this one
75
+ /enterprise/
76
+ # Internal review archive from the founder; not part of the public repository
77
+ /codex reviews/
78
+ # Demo-video recorder (local only; videos go to .autopilot)
79
+ studio-web/demos/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Liceron
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,239 @@
1
+ Metadata-Version: 2.5
2
+ Name: nexura-runtime
3
+ Version: 0.4.0
4
+ Summary: Nexura platform: durable agent workflows with exact-action approvals, guardrail policy, RAG, evaluations and a local REST service.
5
+ Project-URL: Homepage, https://github.com/Liceron/nexura
6
+ Project-URL: Documentation, https://github.com/Liceron/nexura/blob/main/docs/README.md
7
+ Project-URL: Source, https://github.com/Liceron/nexura
8
+ Project-URL: Issues, https://github.com/Liceron/nexura/issues
9
+ Project-URL: Changelog, https://github.com/Liceron/nexura/blob/main/CHANGELOG.md
10
+ Author-email: Liceron <info@liceron.in>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ License-File: THIRD_PARTY.md
14
+ Keywords: agents,ai,llm,sdk,tools
15
+ Classifier: Development Status :: 3 - Alpha
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
+ Classifier: Typing :: Typed
20
+ Requires-Python: <3.13,>=3.12
21
+ Requires-Dist: cryptography>=46.0.0
22
+ Requires-Dist: httpx<1.0.0,>=0.27.0
23
+ Requires-Dist: nexura-agents==0.4.0
24
+ Requires-Dist: packaging>=24.0
25
+ Requires-Dist: pydantic<3.0.0,>=2.7.0
26
+ Provides-Extra: knowledge
27
+ Requires-Dist: pypdf>=6.19.0; extra == 'knowledge'
28
+ Provides-Extra: sandbox
29
+ Requires-Dist: pydantic-monty<2.0.0,>=1.1.0; extra == 'sandbox'
30
+ Provides-Extra: secrets
31
+ Provides-Extra: studio
32
+ Requires-Dist: fastapi<1.0.0,>=0.111.0; extra == 'studio'
33
+ Requires-Dist: uvicorn<1.0.0,>=0.30.0; extra == 'studio'
34
+ Description-Content-Type: text/markdown
35
+
36
+ # Nexura
37
+
38
+ Nexura is a typed Python SDK for operational agents and approval-gated workflows, with an optional local REST service, TypeScript API client and browser Studio. Use `nexura-agents` for the standalone agent SDK (just `httpx` and `pydantic`), or `nexura-runtime` for durable workflows, RAG, evaluations and the service. Python runs the workflows; Studio and the TypeScript client use the same API.
39
+
40
+ ## Review the exact action
41
+
42
+ Pause before a risky tool or workflow step and review its resolved inputs. Approval is bound to the action digest and expiry; editing the inputs requires a fresh approval, and a decision cannot be used twice. See [Human approval](https://github.com/Liceron/nexura/blob/main/docs/approvals.md) for the supported paths and limits.
43
+
44
+ ## Reproduce a failure offline
45
+
46
+ Export a recorded run and replay it with scripted models and tool fixtures, without provider keys. Recordings use best-effort redaction of known secret shapes; review every bundle before sharing it. See [Reproducing failures](https://github.com/Liceron/nexura/blob/main/docs/reproducing-failures.md).
47
+
48
+ ## Control shared spending
49
+
50
+ Agents and workflow steps can share a budget that reserves estimated cost before dispatch. Unknown usage and prices stay unknown; this is admission control, not a provider-invoice ceiling, and actual billed usage can exceed an estimate before later calls are refused. See [Budgets and usage](https://github.com/Liceron/nexura/blob/main/docs/budgets-and-usage.md).
51
+
52
+ ## Install
53
+
54
+ **Alpha (0.4).** `nexura-runtime` and its add-ons need Python 3.12; `nexura-agents`, `nexura-guardrails` and `nexura-vertex` run on Python 3.11-3.13. Install from PyPI and npm:
55
+
56
+ ```bash
57
+ pip install "nexura-runtime[studio]" # platform + REST service and Studio
58
+ pip install nexura-agents # or only the standalone agent SDK
59
+ ```
60
+
61
+ Each Python package is independent; the runtime does not require every add-on. The TypeScript package is an HTTP client, with no runtime of its own.
62
+
63
+ | Package | Purpose | Install |
64
+ |---|---|---|
65
+ | `nexura-agents` | Standalone agents, tools, teams, providers | `pip install nexura-agents` |
66
+ | `nexura-runtime` | Durable workflows, RAG, evaluations | `pip install nexura-runtime` |
67
+ | `nexura-connectors` | 15 SaaS/database/mail workflow connectors | `pip install nexura-connectors` |
68
+ | `nexura-postgres` | PostgreSQL storage and pgvector | `pip install nexura-postgres` |
69
+ | `nexura-qdrant` | Qdrant vector store | `pip install nexura-qdrant` |
70
+ | `nexura-sandbox` | WASI, bubblewrap and gVisor backends | `pip install nexura-sandbox` |
71
+ | `nexura-vertex` | Google Vertex AI provider | `pip install nexura-vertex` |
72
+ | `nexura-guardrails` | LLM judge, pre-filters, tiered checks | `pip install nexura-guardrails` |
73
+ | `nexura-studio` | Older built-in Studio and launcher | `pip install nexura-studio` |
74
+ | `@liceron/nexura-sdk` | TypeScript REST API client | `npm install @liceron/nexura-sdk` |
75
+
76
+ To work from a source checkout instead, run `git clone https://github.com/Liceron/nexura && cd nexura && uv sync`. See [Packages and installation](https://github.com/Liceron/nexura/blob/main/docs/packages.md) for dependencies, source installs and backend requirements.
77
+
78
+ Core runtime dependencies are `httpx`, `pydantic`, `packaging` and `cryptography`. Optional extras:
79
+
80
+ | Extra | Adds | Needed for |
81
+ |---|---|---|
82
+ | `studio` | fastapi, uvicorn | REST service, `serve`, `worker`, `create_api_app`; the older launcher is a separate package |
83
+ | `knowledge` | pypdf | PDF ingestion |
84
+ | `secrets` | (nothing; `cryptography` is core since 0.4.0) | Compatibility with old install commands |
85
+ | `sandbox` | pydantic-monty | Default Monty code-execution backend |
86
+
87
+ `nexura-agents[litellm]` adds LiteLLM and `nexura-agents[otel]` adds tracing. Use `nexura-sandbox[wasi]` for WASI. Earlier `postgres`, `vector`, `vertex` and `sandbox-wasi` extras became the separate packages above. Missing dependencies are reported as `MODULE_UNAVAILABLE` rather than silently skipped.
88
+
89
+ ## Five-minute quickstart (keyless)
90
+
91
+ After `uv sync`, save this as `quickstart.py` and run `uv run python quickstart.py`. `FakeModel` is a deterministic local fake: no API keys or network calls.
92
+
93
+ ```python
94
+ from nexura_runtime import Agent, FakeModel, Runner, ToolCall, tool
95
+
96
+
97
+ @tool
98
+ async def lookup_order(order_id: str) -> dict[str, str]:
99
+ """Look up order delivery status."""
100
+ return {"order_id": order_id, "status": "Out for Delivery"}
101
+
102
+
103
+ agent = Agent(
104
+ name="SupportBot",
105
+ instructions="You are a helpful customer support agent.",
106
+ model=FakeModel(
107
+ responses=[
108
+ [ToolCall(id="call_1", name="lookup_order", arguments={"order_id": "ORD-101"})],
109
+ "Order ORD-101 is out for delivery.",
110
+ ]
111
+ ),
112
+ tools=[lookup_order],
113
+ )
114
+ result = Runner().run(agent, "Where is my order ORD-101?")
115
+ print(result.tool_calls_count, result.final_output)
116
+ ```
117
+
118
+ Output: `1 Order ORD-101 is out for delivery.` To try approval next, save this independent example as `approval.py` and run `uv run python approval.py`:
119
+
120
+ ```python
121
+ import asyncio
122
+ from nexura_runtime.workflow import (
123
+ MemoryWorkflowStore, ModuleRegistry, WorkflowEngine, WorkflowNode, WorkflowSpec,
124
+ )
125
+
126
+ registry = ModuleRegistry()
127
+
128
+
129
+ @registry.register_handler("refund")
130
+ async def refund(state: dict) -> dict:
131
+ return {"refund_id": "REF-9901"} # local fake action, no payment is sent
132
+
133
+
134
+ async def main() -> None:
135
+ spec = WorkflowSpec(
136
+ name="Refund", entry_node="refund",
137
+ nodes={"refund": WorkflowNode(id="refund", handler="refund", requires_approval=True)},
138
+ terminal_nodes=["refund"],
139
+ )
140
+ engine = WorkflowEngine(spec, registry, store=MemoryWorkflowStore())
141
+ paused = await engine.run({"order_id": "ORD-1"})
142
+ print(paused.status)
143
+ done = await engine.resume(
144
+ paused.workflow_run_id, paused.pending_approval.approval_id, decision="approve",
145
+ )
146
+ print(done.status, done.state["refund_id"])
147
+
148
+
149
+ asyncio.run(main())
150
+ ```
151
+
152
+ Output is `paused`, then `completed REF-9901`. The full [approval workflow tutorial](https://github.com/Liceron/nexura/blob/main/docs/workflows.md#tutorial-an-approval-gated-workflow) adds SQLite persistence and resumes through a new engine after a restart. [Getting started](https://github.com/Liceron/nexura/blob/main/docs/getting-started.md) covers async use and further keyless examples.
153
+
154
+ ## Running Studio
155
+
156
+ Short recordings of the local Studio, offline with fake models (click a picture to play the video):
157
+
158
+ | Build and run a workflow, no API key | Review the exact action before approving | Agents, knowledge, traces, evaluations |
159
+ |---|---|---|
160
+ | [![Build and run a workflow](https://raw.githubusercontent.com/Liceron/nexura/main/docs/media/demo-build-and-run.png)](https://github.com/Liceron/nexura/blob/main/docs/media/demo-build-and-run.mp4) | [![Exact-action approval](https://raw.githubusercontent.com/Liceron/nexura/main/docs/media/demo-exact-action-approval.png)](https://github.com/Liceron/nexura/blob/main/docs/media/demo-exact-action-approval.mp4) | [![Studio tour](https://raw.githubusercontent.com/Liceron/nexura/main/docs/media/demo-studio-tour.png)](https://github.com/Liceron/nexura/blob/main/docs/media/demo-studio-tour.mp4) |
161
+
162
+ From the source checkout, start the API and Studio in separate terminals:
163
+
164
+ ```bash
165
+ uv sync --extra studio
166
+ uv run nexura-runtime serve --port 8765 --db ./nexura_service.sqlite3
167
+ ```
168
+
169
+ ```bash
170
+ cd studio-web
171
+ npm ci
172
+ npm run dev
173
+ ```
174
+
175
+ Open the Vite URL printed in the second terminal. Studio proxies `/api` to `http://127.0.0.1:8765`; override with `VITE_BACKEND_URL`. Chat uses an offline fixture by default. The service uses the single-owner `local-owner` profile and loopback binding; do not expose it on a network as is.
176
+
177
+ For schedules, workers, model allowlists, streaming chat, exports, pending input and the older built-in Studio, see [Service and Studio](https://github.com/Liceron/nexura/blob/main/docs/studio-and-service.md).
178
+
179
+ ## Two editions
180
+
181
+ | Edition | Includes | Boundary |
182
+ |---|---|---|
183
+ | MIT open source | Agents, workflows, local Studio/service, local credentials, approvals, budgets, sandbox safety, Langflow import/export and trace export | **single user, this machine only; for a team or a public endpoint use the hosted or enterprise edition** |
184
+ | [Enterprise](https://github.com/Liceron/nexura-enterprise) (private) | Authentication, workspace members, organisations/invites, hosted secrets and rotation, publishing/widget, Nexura V2 compatibility, client and Studio add-ons | Proprietary; no external security review; installing MIT packages alone does not enable these features |
185
+
186
+ Local workspaces organise one owner's projects; they are not tenant or member accounts. The open-source service has no account logins, authentication tokens or API keys. Even when embedded, `create_api_app()` refuses non-loopback peers and requires `X-Nexura-Session` for state-changing requests. The session token stops other web pages, not local programs on this machine, which can read it. An insecure network opt-in adds no authentication and does not make a public endpoint safe. A single-user local Docker setup is in `deployment/`.
187
+
188
+ ## What is verified, and what is not
189
+
190
+ The latest recorded local gate, **2026-10-20**, reported **Ready: True, 21/21** required checks: **5110 Python tests + 89 browser tests**, on one machine. It included disposable Postgres/Qdrant, the real gVisor test profile, lint/types, keyless examples, external Python/TypeScript consumers, standalone installs of all eight packages, service load, Studio unit/build checks and the enforced edition boundary. This is a historical local result, not release approval, production readiness or security certification; this README edit does not rerun that gate.
191
+
192
+ Provider adapters are mock-verified except for owner-run **Vertex AI (Gemini 2.5 Flash), 2026-10-08** (reply, tool call, streaming) and **Gemini API, 2026-10-20** (reply, tool call, streaming, structured answer). OpenAI, Anthropic and Sarvam live checks have not run. LiteLLM is checked only with the real library's offline mock-response mode, not live providers.
193
+
194
+ | Component | Supported | Verified scope |
195
+ |---|---|---|
196
+ | Python | 3.12 only (`>=3.12,<3.13`) | Runtime on CPython 3.12.14 |
197
+ | `nexura-agents` alone | 3.11, 3.12, 3.13 (`>=3.11,<3.14`) | 295 SDK tests from wheels on 3.11 and 3.13, 2026-10-09; 4 platform-importing files excluded |
198
+ | Node.js | 24.x | Node 24.20.0, npm 11.19.0 |
199
+ | OS | Linux; macOS and Windows smoke-tested | Full suite on Linux x86_64 (kernel 7.0 and GitHub's ubuntu-24.04); on macOS and Windows, GitHub Actions runs the `nexura-agents` wheel suite, an offline runtime workflow example and a generated project's tests (first green 2026-10-21) |
200
+ | Storage | SQLite by default; Postgres/pgvector and Qdrant need services | SQLite and disposable local services; no managed-cloud claim |
201
+
202
+ GitHub Actions runs on every push: the full suite on Linux (vector-store tests in their own job against Postgres/pgvector and Qdrant services), the `nexura-agents` wheel on Python 3.11–3.13, the TypeScript client, Studio, the edition boundary and the macOS/Windows smoke checks; all jobs first passed together on 2026-10-21. There has been **no external security audit/review**, including of the closed edition's shared-service path. MCP speaks revision 2026-07-28 (stateless) with fallback to the 2025-11-25 ... 2024-11-05 handshake; offline interop tests (`experiments/interop`) pass against the official MCP Python SDK (`mcp` 2.3.0 and the handshake-only 1.30.0) in both directions over stdio and localhost HTTP. Public MCP servers, live image calls and desktop MCP client apps remain unverified. A2A supports the 1.0 JSON-RPC binding (0.3 method names accepted) and signed agent cards, tested offline against the official `a2a-sdk` 1.2.3 in both directions; there are no push notifications, OAuth or gRPC, and no MCP extensions (Tasks, Apps, Enterprise Managed Authorization).
203
+
204
+ Workflow JSON never contains code: only trusted registered handlers run. Approvals cover supported connector writes and gated nodes, bind resolved inputs (low-level gates also bind run/node/spec/action/payload, including positional tool arguments), enforce expiry on claim and before execution, refuse non-string mapping keys in canonical digests and return 409 for duplicate decisions. Plain `@tool` functions need `requires_approval=True`; Python setting `ExecutionContext.approval_granted` itself is trusted. Side-effecting handlers/tools are never retried automatically; a crash can leave their outcome uncertain, recorded rather than replayed. See [SECURITY_MODEL.md](https://github.com/Liceron/nexura/blob/main/SECURITY_MODEL.md) for controls and open gaps.
205
+
206
+ Historical fake-model measurements establish neither real-model quality, provider bills/cache savings, production scale, customer demand nor superiority over other frameworks. The older gate that skipped a required browser check remains documented separately. The approximately 135 ms SDK import on 2026-10-09 (Python 3.12, warm cache, lazy provider loading) is a single local measurement, not a benchmark. See the [verification record](https://github.com/Liceron/nexura/blob/main/docs/testing.md#verification-record) for the complete chronology and limitations.
207
+
208
+ Version 0.4.0 was published to PyPI and npm on 2026-10-25. Copyright holder and security contact: Liceron, info@liceron.in.
209
+
210
+ ## Documentation map
211
+
212
+ [Documentation index](https://github.com/Liceron/nexura/blob/main/docs/README.md): **46 guides** plus the generated [API reference](https://github.com/Liceron/nexura/blob/main/docs/api-reference.md). Offline Python examples are executed by tests; blocks needing a real model or running service are marked and skipped.
213
+
214
+ | Start with | Continue to |
215
+ |---|---|
216
+ | [Getting started](https://github.com/Liceron/nexura/blob/main/docs/getting-started.md) | [Agents](https://github.com/Liceron/nexura/blob/main/docs/agents.md), [tools](https://github.com/Liceron/nexura/blob/main/docs/tools.md), [teams](https://github.com/Liceron/nexura/blob/main/docs/teams.md), [structured output](https://github.com/Liceron/nexura/blob/main/docs/structured-output.md) |
217
+ | [Human approval](https://github.com/Liceron/nexura/blob/main/docs/approvals.md) | [Durable runs](https://github.com/Liceron/nexura/blob/main/docs/durable-runs.md), [reproducing failures](https://github.com/Liceron/nexura/blob/main/docs/reproducing-failures.md), [workflows](https://github.com/Liceron/nexura/blob/main/docs/workflows.md) (retries, input, forks, sub-workflows, parallel steps) |
218
+ | [Models and providers](https://github.com/Liceron/nexura/blob/main/docs/providers.md) | Vertex AI, LiteLLM, settings, retry/fallback; [budgets and usage](https://github.com/Liceron/nexura/blob/main/docs/budgets-and-usage.md) |
219
+ | [Service and Studio](https://github.com/Liceron/nexura/blob/main/docs/studio-and-service.md) | [Extending](https://github.com/Liceron/nexura/blob/main/docs/extensions.md), [local secrets](https://github.com/Liceron/nexura/blob/main/docs/local-secrets.md), [troubleshooting](https://github.com/Liceron/nexura/blob/main/docs/troubleshooting.md) |
220
+ | [Packages and installation](https://github.com/Liceron/nexura/blob/main/docs/packages.md) | Add-on backends and their caveats; [historical comparisons](https://github.com/Liceron/nexura/blob/main/docs/comparisons.md) |
221
+ | [Testing](https://github.com/Liceron/nexura/blob/main/docs/testing.md) | Verification history and public backend catalog |
222
+
223
+ ## Contributing
224
+
225
+ See [CONTRIBUTING.md](https://github.com/Liceron/nexura/blob/main/CONTRIBUTING.md) for setup, test profiles and support/deprecation policy. Contributions require the [CLA](https://github.com/Liceron/nexura/blob/main/CLA.md): it is a draft awaiting lawyer review, and outside pull requests cannot be merged until the reviewed version is published. The automated CLA check is planned; current signing instructions are in the contributing guide.
226
+
227
+ ```bash
228
+ uv run pytest
229
+ uv run ruff check src tests examples
230
+ uv run mypy src packages/*/src
231
+ ```
232
+
233
+ ## Security policy
234
+
235
+ Report vulnerabilities privately using [SECURITY.md](https://github.com/Liceron/nexura/blob/main/SECURITY.md) (info@liceron.in). Read the [security model](https://github.com/Liceron/nexura/blob/main/SECURITY_MODEL.md) before enabling tools, connectors or code execution.
236
+
237
+ ## Licence
238
+
239
+ MIT. **Copyright (c) 2026 Liceron.** See [LICENSE](https://github.com/Liceron/nexura/blob/main/LICENSE) and [third-party notices](https://github.com/Liceron/nexura/blob/main/THIRD_PARTY.md).
@@ -0,0 +1,204 @@
1
+ # Nexura
2
+
3
+ Nexura is a typed Python SDK for operational agents and approval-gated workflows, with an optional local REST service, TypeScript API client and browser Studio. Use `nexura-agents` for the standalone agent SDK (just `httpx` and `pydantic`), or `nexura-runtime` for durable workflows, RAG, evaluations and the service. Python runs the workflows; Studio and the TypeScript client use the same API.
4
+
5
+ ## Review the exact action
6
+
7
+ Pause before a risky tool or workflow step and review its resolved inputs. Approval is bound to the action digest and expiry; editing the inputs requires a fresh approval, and a decision cannot be used twice. See [Human approval](https://github.com/Liceron/nexura/blob/main/docs/approvals.md) for the supported paths and limits.
8
+
9
+ ## Reproduce a failure offline
10
+
11
+ Export a recorded run and replay it with scripted models and tool fixtures, without provider keys. Recordings use best-effort redaction of known secret shapes; review every bundle before sharing it. See [Reproducing failures](https://github.com/Liceron/nexura/blob/main/docs/reproducing-failures.md).
12
+
13
+ ## Control shared spending
14
+
15
+ Agents and workflow steps can share a budget that reserves estimated cost before dispatch. Unknown usage and prices stay unknown; this is admission control, not a provider-invoice ceiling, and actual billed usage can exceed an estimate before later calls are refused. See [Budgets and usage](https://github.com/Liceron/nexura/blob/main/docs/budgets-and-usage.md).
16
+
17
+ ## Install
18
+
19
+ **Alpha (0.4).** `nexura-runtime` and its add-ons need Python 3.12; `nexura-agents`, `nexura-guardrails` and `nexura-vertex` run on Python 3.11-3.13. Install from PyPI and npm:
20
+
21
+ ```bash
22
+ pip install "nexura-runtime[studio]" # platform + REST service and Studio
23
+ pip install nexura-agents # or only the standalone agent SDK
24
+ ```
25
+
26
+ Each Python package is independent; the runtime does not require every add-on. The TypeScript package is an HTTP client, with no runtime of its own.
27
+
28
+ | Package | Purpose | Install |
29
+ |---|---|---|
30
+ | `nexura-agents` | Standalone agents, tools, teams, providers | `pip install nexura-agents` |
31
+ | `nexura-runtime` | Durable workflows, RAG, evaluations | `pip install nexura-runtime` |
32
+ | `nexura-connectors` | 15 SaaS/database/mail workflow connectors | `pip install nexura-connectors` |
33
+ | `nexura-postgres` | PostgreSQL storage and pgvector | `pip install nexura-postgres` |
34
+ | `nexura-qdrant` | Qdrant vector store | `pip install nexura-qdrant` |
35
+ | `nexura-sandbox` | WASI, bubblewrap and gVisor backends | `pip install nexura-sandbox` |
36
+ | `nexura-vertex` | Google Vertex AI provider | `pip install nexura-vertex` |
37
+ | `nexura-guardrails` | LLM judge, pre-filters, tiered checks | `pip install nexura-guardrails` |
38
+ | `nexura-studio` | Older built-in Studio and launcher | `pip install nexura-studio` |
39
+ | `@liceron/nexura-sdk` | TypeScript REST API client | `npm install @liceron/nexura-sdk` |
40
+
41
+ To work from a source checkout instead, run `git clone https://github.com/Liceron/nexura && cd nexura && uv sync`. See [Packages and installation](https://github.com/Liceron/nexura/blob/main/docs/packages.md) for dependencies, source installs and backend requirements.
42
+
43
+ Core runtime dependencies are `httpx`, `pydantic`, `packaging` and `cryptography`. Optional extras:
44
+
45
+ | Extra | Adds | Needed for |
46
+ |---|---|---|
47
+ | `studio` | fastapi, uvicorn | REST service, `serve`, `worker`, `create_api_app`; the older launcher is a separate package |
48
+ | `knowledge` | pypdf | PDF ingestion |
49
+ | `secrets` | (nothing; `cryptography` is core since 0.4.0) | Compatibility with old install commands |
50
+ | `sandbox` | pydantic-monty | Default Monty code-execution backend |
51
+
52
+ `nexura-agents[litellm]` adds LiteLLM and `nexura-agents[otel]` adds tracing. Use `nexura-sandbox[wasi]` for WASI. Earlier `postgres`, `vector`, `vertex` and `sandbox-wasi` extras became the separate packages above. Missing dependencies are reported as `MODULE_UNAVAILABLE` rather than silently skipped.
53
+
54
+ ## Five-minute quickstart (keyless)
55
+
56
+ After `uv sync`, save this as `quickstart.py` and run `uv run python quickstart.py`. `FakeModel` is a deterministic local fake: no API keys or network calls.
57
+
58
+ ```python
59
+ from nexura_runtime import Agent, FakeModel, Runner, ToolCall, tool
60
+
61
+
62
+ @tool
63
+ async def lookup_order(order_id: str) -> dict[str, str]:
64
+ """Look up order delivery status."""
65
+ return {"order_id": order_id, "status": "Out for Delivery"}
66
+
67
+
68
+ agent = Agent(
69
+ name="SupportBot",
70
+ instructions="You are a helpful customer support agent.",
71
+ model=FakeModel(
72
+ responses=[
73
+ [ToolCall(id="call_1", name="lookup_order", arguments={"order_id": "ORD-101"})],
74
+ "Order ORD-101 is out for delivery.",
75
+ ]
76
+ ),
77
+ tools=[lookup_order],
78
+ )
79
+ result = Runner().run(agent, "Where is my order ORD-101?")
80
+ print(result.tool_calls_count, result.final_output)
81
+ ```
82
+
83
+ Output: `1 Order ORD-101 is out for delivery.` To try approval next, save this independent example as `approval.py` and run `uv run python approval.py`:
84
+
85
+ ```python
86
+ import asyncio
87
+ from nexura_runtime.workflow import (
88
+ MemoryWorkflowStore, ModuleRegistry, WorkflowEngine, WorkflowNode, WorkflowSpec,
89
+ )
90
+
91
+ registry = ModuleRegistry()
92
+
93
+
94
+ @registry.register_handler("refund")
95
+ async def refund(state: dict) -> dict:
96
+ return {"refund_id": "REF-9901"} # local fake action, no payment is sent
97
+
98
+
99
+ async def main() -> None:
100
+ spec = WorkflowSpec(
101
+ name="Refund", entry_node="refund",
102
+ nodes={"refund": WorkflowNode(id="refund", handler="refund", requires_approval=True)},
103
+ terminal_nodes=["refund"],
104
+ )
105
+ engine = WorkflowEngine(spec, registry, store=MemoryWorkflowStore())
106
+ paused = await engine.run({"order_id": "ORD-1"})
107
+ print(paused.status)
108
+ done = await engine.resume(
109
+ paused.workflow_run_id, paused.pending_approval.approval_id, decision="approve",
110
+ )
111
+ print(done.status, done.state["refund_id"])
112
+
113
+
114
+ asyncio.run(main())
115
+ ```
116
+
117
+ Output is `paused`, then `completed REF-9901`. The full [approval workflow tutorial](https://github.com/Liceron/nexura/blob/main/docs/workflows.md#tutorial-an-approval-gated-workflow) adds SQLite persistence and resumes through a new engine after a restart. [Getting started](https://github.com/Liceron/nexura/blob/main/docs/getting-started.md) covers async use and further keyless examples.
118
+
119
+ ## Running Studio
120
+
121
+ Short recordings of the local Studio, offline with fake models (click a picture to play the video):
122
+
123
+ | Build and run a workflow, no API key | Review the exact action before approving | Agents, knowledge, traces, evaluations |
124
+ |---|---|---|
125
+ | [![Build and run a workflow](https://raw.githubusercontent.com/Liceron/nexura/main/docs/media/demo-build-and-run.png)](https://github.com/Liceron/nexura/blob/main/docs/media/demo-build-and-run.mp4) | [![Exact-action approval](https://raw.githubusercontent.com/Liceron/nexura/main/docs/media/demo-exact-action-approval.png)](https://github.com/Liceron/nexura/blob/main/docs/media/demo-exact-action-approval.mp4) | [![Studio tour](https://raw.githubusercontent.com/Liceron/nexura/main/docs/media/demo-studio-tour.png)](https://github.com/Liceron/nexura/blob/main/docs/media/demo-studio-tour.mp4) |
126
+
127
+ From the source checkout, start the API and Studio in separate terminals:
128
+
129
+ ```bash
130
+ uv sync --extra studio
131
+ uv run nexura-runtime serve --port 8765 --db ./nexura_service.sqlite3
132
+ ```
133
+
134
+ ```bash
135
+ cd studio-web
136
+ npm ci
137
+ npm run dev
138
+ ```
139
+
140
+ Open the Vite URL printed in the second terminal. Studio proxies `/api` to `http://127.0.0.1:8765`; override with `VITE_BACKEND_URL`. Chat uses an offline fixture by default. The service uses the single-owner `local-owner` profile and loopback binding; do not expose it on a network as is.
141
+
142
+ For schedules, workers, model allowlists, streaming chat, exports, pending input and the older built-in Studio, see [Service and Studio](https://github.com/Liceron/nexura/blob/main/docs/studio-and-service.md).
143
+
144
+ ## Two editions
145
+
146
+ | Edition | Includes | Boundary |
147
+ |---|---|---|
148
+ | MIT open source | Agents, workflows, local Studio/service, local credentials, approvals, budgets, sandbox safety, Langflow import/export and trace export | **single user, this machine only; for a team or a public endpoint use the hosted or enterprise edition** |
149
+ | [Enterprise](https://github.com/Liceron/nexura-enterprise) (private) | Authentication, workspace members, organisations/invites, hosted secrets and rotation, publishing/widget, Nexura V2 compatibility, client and Studio add-ons | Proprietary; no external security review; installing MIT packages alone does not enable these features |
150
+
151
+ Local workspaces organise one owner's projects; they are not tenant or member accounts. The open-source service has no account logins, authentication tokens or API keys. Even when embedded, `create_api_app()` refuses non-loopback peers and requires `X-Nexura-Session` for state-changing requests. The session token stops other web pages, not local programs on this machine, which can read it. An insecure network opt-in adds no authentication and does not make a public endpoint safe. A single-user local Docker setup is in `deployment/`.
152
+
153
+ ## What is verified, and what is not
154
+
155
+ The latest recorded local gate, **2026-10-20**, reported **Ready: True, 21/21** required checks: **5110 Python tests + 89 browser tests**, on one machine. It included disposable Postgres/Qdrant, the real gVisor test profile, lint/types, keyless examples, external Python/TypeScript consumers, standalone installs of all eight packages, service load, Studio unit/build checks and the enforced edition boundary. This is a historical local result, not release approval, production readiness or security certification; this README edit does not rerun that gate.
156
+
157
+ Provider adapters are mock-verified except for owner-run **Vertex AI (Gemini 2.5 Flash), 2026-10-08** (reply, tool call, streaming) and **Gemini API, 2026-10-20** (reply, tool call, streaming, structured answer). OpenAI, Anthropic and Sarvam live checks have not run. LiteLLM is checked only with the real library's offline mock-response mode, not live providers.
158
+
159
+ | Component | Supported | Verified scope |
160
+ |---|---|---|
161
+ | Python | 3.12 only (`>=3.12,<3.13`) | Runtime on CPython 3.12.14 |
162
+ | `nexura-agents` alone | 3.11, 3.12, 3.13 (`>=3.11,<3.14`) | 295 SDK tests from wheels on 3.11 and 3.13, 2026-10-09; 4 platform-importing files excluded |
163
+ | Node.js | 24.x | Node 24.20.0, npm 11.19.0 |
164
+ | OS | Linux; macOS and Windows smoke-tested | Full suite on Linux x86_64 (kernel 7.0 and GitHub's ubuntu-24.04); on macOS and Windows, GitHub Actions runs the `nexura-agents` wheel suite, an offline runtime workflow example and a generated project's tests (first green 2026-10-21) |
165
+ | Storage | SQLite by default; Postgres/pgvector and Qdrant need services | SQLite and disposable local services; no managed-cloud claim |
166
+
167
+ GitHub Actions runs on every push: the full suite on Linux (vector-store tests in their own job against Postgres/pgvector and Qdrant services), the `nexura-agents` wheel on Python 3.11–3.13, the TypeScript client, Studio, the edition boundary and the macOS/Windows smoke checks; all jobs first passed together on 2026-10-21. There has been **no external security audit/review**, including of the closed edition's shared-service path. MCP speaks revision 2026-07-28 (stateless) with fallback to the 2025-11-25 ... 2024-11-05 handshake; offline interop tests (`experiments/interop`) pass against the official MCP Python SDK (`mcp` 2.3.0 and the handshake-only 1.30.0) in both directions over stdio and localhost HTTP. Public MCP servers, live image calls and desktop MCP client apps remain unverified. A2A supports the 1.0 JSON-RPC binding (0.3 method names accepted) and signed agent cards, tested offline against the official `a2a-sdk` 1.2.3 in both directions; there are no push notifications, OAuth or gRPC, and no MCP extensions (Tasks, Apps, Enterprise Managed Authorization).
168
+
169
+ Workflow JSON never contains code: only trusted registered handlers run. Approvals cover supported connector writes and gated nodes, bind resolved inputs (low-level gates also bind run/node/spec/action/payload, including positional tool arguments), enforce expiry on claim and before execution, refuse non-string mapping keys in canonical digests and return 409 for duplicate decisions. Plain `@tool` functions need `requires_approval=True`; Python setting `ExecutionContext.approval_granted` itself is trusted. Side-effecting handlers/tools are never retried automatically; a crash can leave their outcome uncertain, recorded rather than replayed. See [SECURITY_MODEL.md](https://github.com/Liceron/nexura/blob/main/SECURITY_MODEL.md) for controls and open gaps.
170
+
171
+ Historical fake-model measurements establish neither real-model quality, provider bills/cache savings, production scale, customer demand nor superiority over other frameworks. The older gate that skipped a required browser check remains documented separately. The approximately 135 ms SDK import on 2026-10-09 (Python 3.12, warm cache, lazy provider loading) is a single local measurement, not a benchmark. See the [verification record](https://github.com/Liceron/nexura/blob/main/docs/testing.md#verification-record) for the complete chronology and limitations.
172
+
173
+ Version 0.4.0 was published to PyPI and npm on 2026-10-25. Copyright holder and security contact: Liceron, info@liceron.in.
174
+
175
+ ## Documentation map
176
+
177
+ [Documentation index](https://github.com/Liceron/nexura/blob/main/docs/README.md): **46 guides** plus the generated [API reference](https://github.com/Liceron/nexura/blob/main/docs/api-reference.md). Offline Python examples are executed by tests; blocks needing a real model or running service are marked and skipped.
178
+
179
+ | Start with | Continue to |
180
+ |---|---|
181
+ | [Getting started](https://github.com/Liceron/nexura/blob/main/docs/getting-started.md) | [Agents](https://github.com/Liceron/nexura/blob/main/docs/agents.md), [tools](https://github.com/Liceron/nexura/blob/main/docs/tools.md), [teams](https://github.com/Liceron/nexura/blob/main/docs/teams.md), [structured output](https://github.com/Liceron/nexura/blob/main/docs/structured-output.md) |
182
+ | [Human approval](https://github.com/Liceron/nexura/blob/main/docs/approvals.md) | [Durable runs](https://github.com/Liceron/nexura/blob/main/docs/durable-runs.md), [reproducing failures](https://github.com/Liceron/nexura/blob/main/docs/reproducing-failures.md), [workflows](https://github.com/Liceron/nexura/blob/main/docs/workflows.md) (retries, input, forks, sub-workflows, parallel steps) |
183
+ | [Models and providers](https://github.com/Liceron/nexura/blob/main/docs/providers.md) | Vertex AI, LiteLLM, settings, retry/fallback; [budgets and usage](https://github.com/Liceron/nexura/blob/main/docs/budgets-and-usage.md) |
184
+ | [Service and Studio](https://github.com/Liceron/nexura/blob/main/docs/studio-and-service.md) | [Extending](https://github.com/Liceron/nexura/blob/main/docs/extensions.md), [local secrets](https://github.com/Liceron/nexura/blob/main/docs/local-secrets.md), [troubleshooting](https://github.com/Liceron/nexura/blob/main/docs/troubleshooting.md) |
185
+ | [Packages and installation](https://github.com/Liceron/nexura/blob/main/docs/packages.md) | Add-on backends and their caveats; [historical comparisons](https://github.com/Liceron/nexura/blob/main/docs/comparisons.md) |
186
+ | [Testing](https://github.com/Liceron/nexura/blob/main/docs/testing.md) | Verification history and public backend catalog |
187
+
188
+ ## Contributing
189
+
190
+ See [CONTRIBUTING.md](https://github.com/Liceron/nexura/blob/main/CONTRIBUTING.md) for setup, test profiles and support/deprecation policy. Contributions require the [CLA](https://github.com/Liceron/nexura/blob/main/CLA.md): it is a draft awaiting lawyer review, and outside pull requests cannot be merged until the reviewed version is published. The automated CLA check is planned; current signing instructions are in the contributing guide.
191
+
192
+ ```bash
193
+ uv run pytest
194
+ uv run ruff check src tests examples
195
+ uv run mypy src packages/*/src
196
+ ```
197
+
198
+ ## Security policy
199
+
200
+ Report vulnerabilities privately using [SECURITY.md](https://github.com/Liceron/nexura/blob/main/SECURITY.md) (info@liceron.in). Read the [security model](https://github.com/Liceron/nexura/blob/main/SECURITY_MODEL.md) before enabling tools, connectors or code execution.
201
+
202
+ ## Licence
203
+
204
+ MIT. **Copyright (c) 2026 Liceron.** See [LICENSE](https://github.com/Liceron/nexura/blob/main/LICENSE) and [third-party notices](https://github.com/Liceron/nexura/blob/main/THIRD_PARTY.md).