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.
@@ -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,3 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2026 Liceron
3
+ """REST routes of the Studio launcher (workflows, runs, modules; traces come from the runtime)."""
@@ -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)