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.
- nexura_runtime-0.4.0/.gitignore +79 -0
- nexura_runtime-0.4.0/LICENSE +21 -0
- nexura_runtime-0.4.0/PKG-INFO +239 -0
- nexura_runtime-0.4.0/README.md +204 -0
- nexura_runtime-0.4.0/THIRD_PARTY.md +171 -0
- nexura_runtime-0.4.0/pyproject.toml +176 -0
- nexura_runtime-0.4.0/src/nexura_runtime/__init__.py +607 -0
- nexura_runtime-0.4.0/src/nexura_runtime/_removed.py +92 -0
- nexura_runtime-0.4.0/src/nexura_runtime/_workflow_journal.py +728 -0
- nexura_runtime-0.4.0/src/nexura_runtime/agents_spec.py +395 -0
- nexura_runtime-0.4.0/src/nexura_runtime/agents_store.py +286 -0
- nexura_runtime-0.4.0/src/nexura_runtime/artifacts/__init__.py +23 -0
- nexura_runtime-0.4.0/src/nexura_runtime/artifacts/errors.py +58 -0
- nexura_runtime-0.4.0/src/nexura_runtime/artifacts/module.py +104 -0
- nexura_runtime-0.4.0/src/nexura_runtime/artifacts/store.py +239 -0
- nexura_runtime-0.4.0/src/nexura_runtime/builder_assistant.py +721 -0
- nexura_runtime-0.4.0/src/nexura_runtime/cli/__init__.py +9 -0
- nexura_runtime-0.4.0/src/nexura_runtime/cli/commands.py +29 -0
- nexura_runtime-0.4.0/src/nexura_runtime/cli/main.py +1233 -0
- nexura_runtime-0.4.0/src/nexura_runtime/codegen.py +573 -0
- nexura_runtime-0.4.0/src/nexura_runtime/credentials/__init__.py +21 -0
- nexura_runtime-0.4.0/src/nexura_runtime/credentials/backends.py +127 -0
- nexura_runtime-0.4.0/src/nexura_runtime/credentials/errors.py +35 -0
- nexura_runtime-0.4.0/src/nexura_runtime/credentials/models.py +49 -0
- nexura_runtime-0.4.0/src/nexura_runtime/credentials/store.py +263 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/__init__.py +98 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/_service_access.py +19 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/dataset.py +181 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/errors.py +75 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/graders.py +812 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/models.py +206 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/module.py +228 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/openai_import.py +763 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/runner.py +707 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/store.py +320 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/studio_engine.py +756 -0
- nexura_runtime-0.4.0/src/nexura_runtime/evaluation/studio_store.py +277 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/__init__.py +99 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/__init__.py +102 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/email.py +340 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/errors.py +56 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/models.py +75 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/module.py +339 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/outbox.py +272 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/redaction.py +94 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/channels/whatsapp.py +347 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/http/__init__.py +30 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/http/errors.py +19 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/http/module.py +256 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/__init__.py +65 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/build.py +1221 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/components.py +662 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/errors.py +66 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/export.py +355 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/flow.py +517 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/models.py +137 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/registry.py +254 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/tools.py +118 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/langflow/tweaks.py +108 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/mcp_defaults.py +64 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/nexura_v2/README.md +55 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/nexura_v2/__init__.py +25 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/nexura_v2/exporter.py +422 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/__init__.py +145 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/_monty_files.py +71 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/backends.py +300 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/errors.py +134 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/models.py +315 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/module.py +599 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/monty_worker.py +554 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sandbox/worker.py +665 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/__init__.py +47 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/errors.py +35 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/module.py +224 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/service.py +477 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/speech/types.py +170 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sql/__init__.py +76 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sql/connection.py +239 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sql/errors.py +123 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/sql/modules.py +414 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/tools/__init__.py +7 -0
- nexura_runtime-0.4.0/src/nexura_runtime/integrations/tools/adapter.py +162 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/__init__.py +201 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunking/__init__.py +41 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/__init__.py +52 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/chunkers.py +469 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/errors.py +47 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/models.py +104 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/module.py +168 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/chunks/tokenizers.py +19 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/__init__.py +48 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/cache.py +192 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/config.py +116 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/embedder.py +240 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/errors.py +92 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/models.py +100 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/module.py +205 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/embeddings/provider.py +107 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/hybrid.py +972 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/__init__.py +69 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/detector.py +75 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/errors.py +97 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/models.py +52 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/module.py +140 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/parsers.py +429 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/ingest/pipeline.py +245 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/__init__.py +58 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/errors.py +72 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/fusion.py +157 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/lexical.py +98 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/models.py +85 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/module.py +176 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/packer.py +138 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/pipeline.py +298 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/retrieval/tool.py +48 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/__init__.py +60 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/adapters/__init__.py +20 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/adapters/common.py +120 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/errors.py +111 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/metrics.py +64 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/models.py +133 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/module.py +301 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/sqlite.py +635 -0
- nexura_runtime-0.4.0/src/nexura_runtime/knowledge/vector/store.py +437 -0
- nexura_runtime-0.4.0/src/nexura_runtime/memory/__init__.py +39 -0
- nexura_runtime-0.4.0/src/nexura_runtime/memory/errors.py +111 -0
- nexura_runtime-0.4.0/src/nexura_runtime/memory/models.py +51 -0
- nexura_runtime-0.4.0/src/nexura_runtime/memory/module.py +165 -0
- nexura_runtime-0.4.0/src/nexura_runtime/memory/store.py +647 -0
- nexura_runtime-0.4.0/src/nexura_runtime/memory/vector_memory.py +202 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/__init__.py +46 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/__main__.py +10 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/cli.py +160 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/data/__init__.py +35 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/data/errors.py +41 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/data/module.py +125 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/data/transform.py +264 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/optional_packages.py +135 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/registry.py +425 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/text/__init__.py +27 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/text/errors.py +40 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/text/module.py +94 -0
- nexura_runtime-0.4.0/src/nexura_runtime/modules/text/template.py +408 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/__init__.py +61 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/errors.py +26 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/metrics.py +95 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/models.py +70 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/module.py +182 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/otlp.py +82 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/run_diagnostics.py +662 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/sinks.py +345 -0
- nexura_runtime-0.4.0/src/nexura_runtime/observability/tracer.py +128 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/__init__.py +48 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/config.py +135 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/deploy.py +94 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/dev.py +308 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/README.md.tmpl +45 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/__package__/__init__.py.tmpl +5 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/__package__/__main__.py.tmpl +32 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/__package__/agent.py.tmpl +116 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/__package__/studio.py.tmpl +55 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/env.example.tmpl +8 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/agent/tests/test_agent.py.tmpl +65 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/common/dot-gitignore.tmpl +22 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/common/pyproject.toml.tmpl +40 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/docker/DEPLOY.md.tmpl +47 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/docker/Dockerfile.tmpl +38 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/docker/dot-dockerignore.tmpl +17 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/README.md.tmpl +53 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/__package__/__init__.py.tmpl +5 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/__package__/__main__.py.tmpl +30 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/__package__/rag.py.tmpl +157 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/__package__/studio.py.tmpl +45 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/docs/refunds.md.tmpl +4 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/docs/shipping.md.tmpl +4 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/env.example.tmpl +11 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/rag/tests/test_rag.py.tmpl +62 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/README.md.tmpl +47 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/__package__/__init__.py.tmpl +5 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/__package__/__main__.py.tmpl +37 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/__package__/studio.py.tmpl +10 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/__package__/workflow.py.tmpl +90 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/env.example.tmpl +7 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/files/workflow/tests/test_workflow.py.tmpl +52 -0
- nexura_runtime-0.4.0/src/nexura_runtime/project/scaffold.py +255 -0
- nexura_runtime-0.4.0/src/nexura_runtime/py.typed +1 -0
- nexura_runtime-0.4.0/src/nexura_runtime/release/__init__.py +53 -0
- nexura_runtime-0.4.0/src/nexura_runtime/release/backup.py +267 -0
- nexura_runtime-0.4.0/src/nexura_runtime/release/capabilities.json +582 -0
- nexura_runtime-0.4.0/src/nexura_runtime/release/diagnostics.py +134 -0
- nexura_runtime-0.4.0/src/nexura_runtime/release/evidence.py +201 -0
- nexura_runtime-0.4.0/src/nexura_runtime/release/health.py +219 -0
- nexura_runtime-0.4.0/src/nexura_runtime/release/matrix.py +69 -0
- nexura_runtime-0.4.0/src/nexura_runtime/release/migration.py +118 -0
- nexura_runtime-0.4.0/src/nexura_runtime/repro_workflow.py +87 -0
- nexura_runtime-0.4.0/src/nexura_runtime/retention.py +2104 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/__init__.py +53 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/__init__.py +77 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/call_ledger.py +340 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/coordinator.py +896 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/definition.py +533 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/errors.py +186 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/module.py +239 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/saved.py +351 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/agents/types.py +50 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/__init__.py +53 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/errors.py +243 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/gate.py +447 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/manager.py +494 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/models.py +109 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/approvals/module.py +181 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/__init__.py +46 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/compiler.py +242 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/errors.py +113 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/executor.py +184 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/models.py +71 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/compiler/module.py +70 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/effects/__init__.py +30 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/effects/errors.py +23 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/effects/models.py +22 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/effects/reconciler.py +21 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/__init__.py +36 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/engine.py +21 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/errors.py +24 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/models.py +26 -0
- nexura_runtime-0.4.0/src/nexura_runtime/runtime/execution/module.py +21 -0
- nexura_runtime-0.4.0/src/nexura_runtime/secrets/__init__.py +49 -0
- nexura_runtime-0.4.0/src/nexura_runtime/secrets/errors.py +64 -0
- nexura_runtime-0.4.0/src/nexura_runtime/secrets/keys.py +120 -0
- nexura_runtime-0.4.0/src/nexura_runtime/secrets/store.py +264 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/__init__.py +136 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/__init__.py +59 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/agents.py +616 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/app.py +851 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/auth_providers.py +136 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/bind_guard.py +70 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/builder.py +246 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/builtin_extensions.py +31 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/chat_models.py +166 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/client.py +1773 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/credentials.py +377 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/descriptors.py +423 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/diagnostics.py +49 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/effects.py +176 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/errors.py +27 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/evaluations.py +730 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/export.py +541 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/guardrails.py +425 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/integrations.py +991 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/knowledge.py +583 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/local_secrets.py +56 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/local_session.py +326 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/middleware.py +604 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/models.py +303 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/operator_token.py +780 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/policy.py +45 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/ratelimit.py +42 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/run_revocation.py +142 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/runs.py +2435 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/sessions.py +1269 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/skills.py +166 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/studio_evals.py +1170 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/templates.py +111 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/triggers.py +810 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/validation.py +436 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/workflows.py +871 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/api/workspaces.py +286 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/auth/__init__.py +61 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/auth/errors.py +106 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/auth/models.py +37 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/auth/permissions.py +56 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/auth/profile.py +45 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/auth/resources.py +36 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/extensions.py +542 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/repro_capture.py +185 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/run_liveness.py +175 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/stream_adapters.py +477 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/__init__.py +77 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/errors.py +93 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/manager.py +256 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/models.py +93 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/module.py +240 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/schedules.py +212 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/secretbox.py +119 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/signatures.py +96 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/store.py +1096 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/triggers/worker.py +594 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/workflow_state.py +59 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/__init__.py +29 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/errors.py +46 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/membership.py +40 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/models.py +35 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/repository.py +395 -0
- nexura_runtime-0.4.0/src/nexura_runtime/service/workspaces/scoping.py +356 -0
- nexura_runtime-0.4.0/src/nexura_runtime/skills_store.py +338 -0
- nexura_runtime-0.4.0/src/nexura_runtime/storage/__init__.py +24 -0
- nexura_runtime-0.4.0/src/nexura_runtime/storage/execution_bridge.py +154 -0
- nexura_runtime-0.4.0/src/nexura_runtime/storage/migrations.py +260 -0
- nexura_runtime-0.4.0/src/nexura_runtime/storage/models.py +35 -0
- nexura_runtime-0.4.0/src/nexura_runtime/storage/repository.py +427 -0
- nexura_runtime-0.4.0/src/nexura_runtime/studio/__init__.py +27 -0
- nexura_runtime-0.4.0/src/nexura_runtime/studio/api/__init__.py +6 -0
- nexura_runtime-0.4.0/src/nexura_runtime/studio/api/traces.py +46 -0
- nexura_runtime-0.4.0/src/nexura_runtime/studio/builtin_modules.py +284 -0
- nexura_runtime-0.4.0/src/nexura_runtime/studio/security.py +275 -0
- nexura_runtime-0.4.0/src/nexura_runtime/studio/store.py +1117 -0
- nexura_runtime-0.4.0/src/nexura_runtime/studio/traces.py +506 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/__init__.py +39 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/catalog.py +141 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/data/approval-workflow.json +115 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/data/rag-qa-citations.json +126 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/data/research-team.json +101 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/data/scheduled-report.json +108 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/data/structured-extraction.json +104 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/data/support-desk-refund-approval.json +121 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/handlers.py +346 -0
- nexura_runtime-0.4.0/src/nexura_runtime/templates/runner.py +88 -0
- 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
|
+
| [](https://github.com/Liceron/nexura/blob/main/docs/media/demo-build-and-run.mp4) | [](https://github.com/Liceron/nexura/blob/main/docs/media/demo-exact-action-approval.mp4) | [](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
|
+
| [](https://github.com/Liceron/nexura/blob/main/docs/media/demo-build-and-run.mp4) | [](https://github.com/Liceron/nexura/blob/main/docs/media/demo-exact-action-approval.mp4) | [](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).
|