nexura-studio 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_studio-0.4.0/.gitignore +80 -0
- nexura_studio-0.4.0/LICENSE +21 -0
- nexura_studio-0.4.0/PKG-INFO +81 -0
- nexura_studio-0.4.0/README.md +53 -0
- nexura_studio-0.4.0/pyproject.toml +60 -0
- nexura_studio-0.4.0/src/nexura_studio/__init__.py +36 -0
- nexura_studio-0.4.0/src/nexura_studio/api/__init__.py +3 -0
- nexura_studio-0.4.0/src/nexura_studio/api/modules.py +44 -0
- nexura_studio-0.4.0/src/nexura_studio/api/router.py +18 -0
- nexura_studio-0.4.0/src/nexura_studio/api/runs.py +431 -0
- nexura_studio-0.4.0/src/nexura_studio/api/workflows.py +111 -0
- nexura_studio-0.4.0/src/nexura_studio/cli.py +112 -0
- nexura_studio-0.4.0/src/nexura_studio/commands.py +15 -0
- nexura_studio-0.4.0/src/nexura_studio/py.typed +0 -0
- nexura_studio-0.4.0/src/nexura_studio/server.py +183 -0
- nexura_studio-0.4.0/src/nexura_studio/static/app.js +1090 -0
- nexura_studio-0.4.0/src/nexura_studio/static/fonts/NotoSansDevanagari.ttf +0 -0
- nexura_studio-0.4.0/src/nexura_studio/static/fonts/OFL.txt +93 -0
- nexura_studio-0.4.0/src/nexura_studio/static/fonts/PROVENANCE.md +9 -0
- nexura_studio-0.4.0/src/nexura_studio/static/index.html +247 -0
- nexura_studio-0.4.0/src/nexura_studio/static/styles.css +867 -0
|
@@ -0,0 +1,80 @@
|
|
|
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/
|
|
80
|
+
.gstack/
|
|
@@ -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,81 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: nexura-studio
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: Nexura Studio: a local web page to build, run and approve nexura-runtime workflows, and its nexura-studio launcher.
|
|
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 AND OFL-1.1
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
License-File: src/nexura_studio/static/fonts/OFL.txt
|
|
14
|
+
Keywords: agents,approvals,fastapi,studio,workflows
|
|
15
|
+
Classifier: Development Status :: 3 - Alpha
|
|
16
|
+
Classifier: Framework :: FastAPI
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: <3.13,>=3.12
|
|
22
|
+
Requires-Dist: fastapi<1.0.0,>=0.111.0
|
|
23
|
+
Requires-Dist: nexura-agents==0.4.0
|
|
24
|
+
Requires-Dist: nexura-runtime==0.4.0
|
|
25
|
+
Requires-Dist: pydantic<3.0.0,>=2.7.0
|
|
26
|
+
Requires-Dist: uvicorn<1.0.0,>=0.30.0
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# Nexura Studio
|
|
30
|
+
|
|
31
|
+
The older local workflow Studio and its nexura-studio launcher.
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install nexura-studio
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Alpha (0.4): `pip install nexura-studio`. See [package installation](https://github.com/Liceron/nexura/blob/main/docs/packages.md).
|
|
40
|
+
|
|
41
|
+
## Minimal example
|
|
42
|
+
|
|
43
|
+
This example uses an in-process ASGI transport and a disposable database, without a listener. Runs use the real workflow engine; built-in demo data is synthetic. The React Studio/API uses `nexura-runtime[studio]` instead. Without this package, `nexura_runtime.studio.create_app()` raises `MissingDependencyError` naming `nexura-studio`.
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
import asyncio
|
|
47
|
+
import tempfile
|
|
48
|
+
from pathlib import Path
|
|
49
|
+
|
|
50
|
+
import httpx
|
|
51
|
+
|
|
52
|
+
from nexura_studio import create_app
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
async def main() -> None:
|
|
56
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
57
|
+
app = create_app(db_path=Path(tmp) / "studio.sqlite3")
|
|
58
|
+
async with httpx.AsyncClient(
|
|
59
|
+
transport=httpx.ASGITransport(app=app),
|
|
60
|
+
base_url="http://127.0.0.1",
|
|
61
|
+
headers={"X-Nexura-Session": app.state.session_token},
|
|
62
|
+
) as client:
|
|
63
|
+
modules = (await client.get("/api/v1/modules")).json()["modules"]
|
|
64
|
+
print(len(modules), "modules, for example", sorted(m["name"] for m in modules)[0])
|
|
65
|
+
page = await client.get("/")
|
|
66
|
+
assert page.status_code == 200 and "nexura-session" in page.text
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
asyncio.run(main())
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Status and limits
|
|
73
|
+
|
|
74
|
+
> Status: **alpha** (0.4), Python 3.12 (the same as `nexura-runtime`). Single user, local
|
|
75
|
+
> use; it has not had an external security review.
|
|
76
|
+
|
|
77
|
+
Single user, this machine only. The launcher defaults to `127.0.0.1` and refuses non-loopback `--host` without `NEXURA_STUDIO_TOKEN` or the explicit insecure opt-in. State changes require the session token: it stops other web pages, not local programs that can read it. An insecure opt-in does not make a public endpoint safe.
|
|
78
|
+
|
|
79
|
+
## Documentation and licence
|
|
80
|
+
|
|
81
|
+
[Main documentation](https://github.com/Liceron/nexura/blob/main/docs/README.md) · [Full guide](https://github.com/Liceron/nexura/blob/main/docs/studio-and-service.md). MIT, Copyright (c) 2026 Liceron. See [LICENSE](https://github.com/Liceron/nexura/blob/main/packages/nexura-studio/LICENSE). Bundled Noto Sans Devanagari is SIL OFL 1.1; see its `OFL.txt`.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Nexura Studio
|
|
2
|
+
|
|
3
|
+
The older local workflow Studio and its nexura-studio launcher.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install nexura-studio
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Alpha (0.4): `pip install nexura-studio`. See [package installation](https://github.com/Liceron/nexura/blob/main/docs/packages.md).
|
|
12
|
+
|
|
13
|
+
## Minimal example
|
|
14
|
+
|
|
15
|
+
This example uses an in-process ASGI transport and a disposable database, without a listener. Runs use the real workflow engine; built-in demo data is synthetic. The React Studio/API uses `nexura-runtime[studio]` instead. Without this package, `nexura_runtime.studio.create_app()` raises `MissingDependencyError` naming `nexura-studio`.
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import asyncio
|
|
19
|
+
import tempfile
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
import httpx
|
|
23
|
+
|
|
24
|
+
from nexura_studio import create_app
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def main() -> None:
|
|
28
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
29
|
+
app = create_app(db_path=Path(tmp) / "studio.sqlite3")
|
|
30
|
+
async with httpx.AsyncClient(
|
|
31
|
+
transport=httpx.ASGITransport(app=app),
|
|
32
|
+
base_url="http://127.0.0.1",
|
|
33
|
+
headers={"X-Nexura-Session": app.state.session_token},
|
|
34
|
+
) as client:
|
|
35
|
+
modules = (await client.get("/api/v1/modules")).json()["modules"]
|
|
36
|
+
print(len(modules), "modules, for example", sorted(m["name"] for m in modules)[0])
|
|
37
|
+
page = await client.get("/")
|
|
38
|
+
assert page.status_code == 200 and "nexura-session" in page.text
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
asyncio.run(main())
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Status and limits
|
|
45
|
+
|
|
46
|
+
> Status: **alpha** (0.4), Python 3.12 (the same as `nexura-runtime`). Single user, local
|
|
47
|
+
> use; it has not had an external security review.
|
|
48
|
+
|
|
49
|
+
Single user, this machine only. The launcher defaults to `127.0.0.1` and refuses non-loopback `--host` without `NEXURA_STUDIO_TOKEN` or the explicit insecure opt-in. State changes require the session token: it stops other web pages, not local programs that can read it. An insecure opt-in does not make a public endpoint safe.
|
|
50
|
+
|
|
51
|
+
## Documentation and licence
|
|
52
|
+
|
|
53
|
+
[Main documentation](https://github.com/Liceron/nexura/blob/main/docs/README.md) · [Full guide](https://github.com/Liceron/nexura/blob/main/docs/studio-and-service.md). MIT, Copyright (c) 2026 Liceron. See [LICENSE](https://github.com/Liceron/nexura/blob/main/packages/nexura-studio/LICENSE). Bundled Noto Sans Devanagari is SIL OFL 1.1; see its `OFL.txt`.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "nexura-studio"
|
|
3
|
+
version = "0.4.0"
|
|
4
|
+
description = "Nexura Studio: a local web page to build, run and approve nexura-runtime workflows, and its nexura-studio launcher."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.12,<3.13"
|
|
7
|
+
# The bundled Noto Sans Devanagari font is under the SIL Open Font License 1.1.
|
|
8
|
+
license = "MIT AND OFL-1.1"
|
|
9
|
+
license-files = ["LICENSE", "src/nexura_studio/static/fonts/OFL.txt"]
|
|
10
|
+
authors = [{ name = "Liceron", email = "info@liceron.in" }]
|
|
11
|
+
keywords = ["agents", "workflows", "studio", "approvals", "fastapi"]
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Development Status :: 3 - Alpha",
|
|
14
|
+
"Intended Audience :: Developers",
|
|
15
|
+
"Framework :: FastAPI",
|
|
16
|
+
"Programming Language :: Python :: 3.12",
|
|
17
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
18
|
+
"Typing :: Typed",
|
|
19
|
+
]
|
|
20
|
+
# Same version as the runtime it serves. FastAPI and uvicorn have the same constraints as the
|
|
21
|
+
# runtime's `studio` extra, which the REST service (`nexura-runtime serve`) still uses.
|
|
22
|
+
dependencies = [
|
|
23
|
+
"nexura-runtime==0.4.0",
|
|
24
|
+
"nexura-agents==0.4.0",
|
|
25
|
+
"fastapi>=0.111.0,<1.0.0",
|
|
26
|
+
"uvicorn>=0.30.0,<1.0.0",
|
|
27
|
+
"pydantic>=2.7.0,<3.0.0",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[project.urls]
|
|
31
|
+
Homepage = "https://github.com/Liceron/nexura"
|
|
32
|
+
Documentation = "https://github.com/Liceron/nexura/blob/main/docs/README.md"
|
|
33
|
+
Source = "https://github.com/Liceron/nexura"
|
|
34
|
+
Issues = "https://github.com/Liceron/nexura/issues"
|
|
35
|
+
Changelog = "https://github.com/Liceron/nexura/blob/main/CHANGELOG.md"
|
|
36
|
+
|
|
37
|
+
[project.scripts]
|
|
38
|
+
nexura-studio = "nexura_studio.cli:main"
|
|
39
|
+
|
|
40
|
+
[project.entry-points."nexura.commands"]
|
|
41
|
+
studio = "nexura_studio.commands:main"
|
|
42
|
+
|
|
43
|
+
[tool.uv.sources]
|
|
44
|
+
# Development inside the monorepo uses the workspace copies.
|
|
45
|
+
nexura-runtime = { workspace = true }
|
|
46
|
+
nexura-agents = { workspace = true }
|
|
47
|
+
|
|
48
|
+
[build-system]
|
|
49
|
+
requires = ["hatchling"]
|
|
50
|
+
build-backend = "hatchling.build"
|
|
51
|
+
|
|
52
|
+
[tool.hatch.build.targets.wheel]
|
|
53
|
+
packages = ["src/nexura_studio"]
|
|
54
|
+
|
|
55
|
+
[tool.hatch.build.targets.sdist]
|
|
56
|
+
include = ["/src", "/README.md", "/LICENSE", "/pyproject.toml"]
|
|
57
|
+
exclude = [
|
|
58
|
+
"**/__pycache__", "**/*.pyc",
|
|
59
|
+
"**/*blueprint*/**", "**/internal/**", "**/product/**", "**/.autopilot/**",
|
|
60
|
+
]
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2026 Liceron
|
|
3
|
+
"""Nexura Studio: the local workflow and approval web page and its launcher.
|
|
4
|
+
|
|
5
|
+
Distributed as ``nexura-studio`` (it depends on ``nexura-runtime`` with FastAPI and uvicorn).
|
|
6
|
+
The ``nexura-studio`` command starts it; ``create_app`` builds the FastAPI application. The
|
|
7
|
+
run store, built-in demo modules, traces and security middleware it uses are part of
|
|
8
|
+
``nexura-runtime`` (``nexura_runtime.studio``), which the REST service shares.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
import fastapi # noqa: F401
|
|
17
|
+
import uvicorn # noqa: F401
|
|
18
|
+
|
|
19
|
+
_STUDIO_AVAILABLE = True
|
|
20
|
+
except ImportError:
|
|
21
|
+
_STUDIO_AVAILABLE = False
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def create_app(*args: Any, **kwargs: Any) -> Any:
|
|
25
|
+
"""Create configured FastAPI app, checking for optional studio extra dependencies."""
|
|
26
|
+
if not _STUDIO_AVAILABLE:
|
|
27
|
+
raise ImportError(
|
|
28
|
+
"Nexura Studio requires the 'studio' extra dependencies (fastapi, uvicorn).\n"
|
|
29
|
+
"Please install them with: pip install 'nexura-runtime[studio]'"
|
|
30
|
+
)
|
|
31
|
+
from nexura_studio.server import create_app as _create_app
|
|
32
|
+
|
|
33
|
+
return _create_app(*args, **kwargs)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
__all__ = ["create_app"]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2026 Liceron
|
|
3
|
+
"""API endpoints for inspecting available registered workflow modules."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from fastapi import APIRouter, Request
|
|
10
|
+
|
|
11
|
+
from nexura_runtime.studio.builtin_modules import get_default_module_metadata
|
|
12
|
+
from nexura_runtime.workflow import ModuleRegistry
|
|
13
|
+
|
|
14
|
+
router = APIRouter(prefix="/modules", tags=["modules"])
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@router.get("", response_model=dict[str, list[dict[str, Any]]])
|
|
18
|
+
async def list_modules(request: Request) -> dict[str, list[dict[str, Any]]]:
|
|
19
|
+
"""List all trusted Python modules registered in this Studio instance."""
|
|
20
|
+
registry: ModuleRegistry = request.app.state.registry
|
|
21
|
+
metadata_lookup = {m["name"]: m for m in get_default_module_metadata()}
|
|
22
|
+
|
|
23
|
+
modules: list[dict[str, Any]] = []
|
|
24
|
+
# Inspect registered handlers
|
|
25
|
+
for name, fn in registry._handlers.items():
|
|
26
|
+
meta = metadata_lookup.get(name)
|
|
27
|
+
if meta:
|
|
28
|
+
modules.append(dict(meta))
|
|
29
|
+
else:
|
|
30
|
+
doc = fn.__doc__ or "Custom developer-registered Python handler."
|
|
31
|
+
modules.append(
|
|
32
|
+
{
|
|
33
|
+
"name": name,
|
|
34
|
+
"title": name.replace("_", " ").title(),
|
|
35
|
+
"description": doc.strip().split("\n")[0],
|
|
36
|
+
"disclaimer": "Custom Trusted Python Handler (Registered at create_app)",
|
|
37
|
+
"is_synthetic": False,
|
|
38
|
+
"parameters": [],
|
|
39
|
+
"outputs": [],
|
|
40
|
+
"branches": [],
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
return {"modules": modules}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2026 Liceron
|
|
3
|
+
"""Main API v1 router combining modules, workflows, and runs endpoints."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from fastapi import APIRouter
|
|
8
|
+
|
|
9
|
+
from nexura_runtime.studio.api.traces import router as traces_router
|
|
10
|
+
from nexura_studio.api.modules import router as modules_router
|
|
11
|
+
from nexura_studio.api.runs import router as runs_router
|
|
12
|
+
from nexura_studio.api.workflows import router as workflows_router
|
|
13
|
+
|
|
14
|
+
api_v1_router = APIRouter(prefix="/api/v1")
|
|
15
|
+
api_v1_router.include_router(modules_router)
|
|
16
|
+
api_v1_router.include_router(workflows_router)
|
|
17
|
+
api_v1_router.include_router(runs_router)
|
|
18
|
+
api_v1_router.include_router(traces_router)
|