soliplex 0.78.2__tar.gz → 0.80__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.
- {soliplex-0.78.2/src/soliplex.egg-info → soliplex-0.80}/PKG-INFO +5 -5
- {soliplex-0.78.2 → soliplex-0.80}/pyproject.toml +18 -10
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/persistence.py +0 -3
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/util.py +1 -1
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/authz/__init__.py +9 -7
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/authz/schema.py +1 -1
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/audit.py +626 -27
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/agents.py +24 -20
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/authsystem.py +11 -9
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/completions.py +6 -2
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/installation.py +76 -55
- soliplex-0.80/src/soliplex/config/interpolation.py +483 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/logfire.py +39 -29
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/quizzes.py +6 -2
- soliplex-0.80/src/soliplex/config/rag.py +508 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/rooms.py +25 -27
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/secrets.py +13 -9
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/skills.py +13 -16
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/tools.py +56 -42
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/examples.py +1 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/installation.py +86 -11
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/loggers.py +59 -4
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/models.py +7 -2
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/ollama.py +31 -5
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/quizzes.py +5 -3
- soliplex-0.80/src/soliplex/sandbox_audit.py +164 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/secrets.py +8 -4
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/skills/bwrap_sandbox/__init__.py +125 -85
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tools/agui_run_feedback.py +1 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tools/rag.py +5 -5
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tui/main.py +10 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/log_ingest.py +2 -1
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/rooms.py +35 -7
- {soliplex-0.78.2 → soliplex-0.80/src/soliplex.egg-info}/PKG-INFO +5 -5
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/SOURCES.txt +1 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/requires.txt +3 -3
- soliplex-0.78.2/src/soliplex/config/rag.py +0 -198
- soliplex-0.78.2/src/soliplex/sandbox_audit.py +0 -65
- {soliplex-0.78.2 → soliplex-0.80}/LICENSE +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/MANIFEST.in +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/README.md +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/example/skills/bare-bones/SKILL.md +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/example/skills/stanzas/SKILL.md +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/setup.cfg +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/skills/soliplex-docs/SKILL.md +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agents.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/__init__.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/parser.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/schema.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/authn.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/authz/persistence.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/capabilities/filesystem.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/capabilities/rag_audit.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/admin_users.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/ask.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/cli_util.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/main.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/ollama.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/room_authz.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/serve.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/types.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/completions.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/__init__.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/_utils.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/agui.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/exceptions.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/meta.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/middleware.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/routing.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/log_ingest.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/main.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/mcp_auth.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/mcp_client.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/mcp_server.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/rag_audit.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/skills/bwrap_sandbox/SKILL.md +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/titles.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tools/__init__.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tools/file_uploads.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tui/cli.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tui/rest_api.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tui/serve.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/util.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/__init__.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/agui.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/authn.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/authz.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/completions.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/installation.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/quizzes.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/room_file_uploads.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/sandbox_workdirs.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/stats.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/streaming.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/thread_file_uploads.py +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/dependency_links.txt +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/entry_points.txt +0 -0
- {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/top_level.txt +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soliplex
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.80
|
|
4
4
|
Summary: An AI-powered Retrieval-Augmented Generation (RAG) system with a modern web interface.
|
|
5
5
|
Author-email: Enfold <info@enfoldsystems.net>
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
7
7
|
Classifier: Operating System :: OS Independent
|
|
8
|
-
Requires-Python: >=3.
|
|
8
|
+
Requires-Python: >=3.13
|
|
9
9
|
Description-Content-Type: text/markdown
|
|
10
10
|
License-File: LICENSE
|
|
11
11
|
Requires-Dist: ag-ui-protocol<0.1.19,>=0.1.18
|
|
@@ -16,10 +16,10 @@ Requires-Dist: authlib
|
|
|
16
16
|
Requires-Dist: bubble-sandbox<0.13,>=0.12.0
|
|
17
17
|
Requires-Dist: cryptography>=50.0.0
|
|
18
18
|
Requires-Dist: fastapi
|
|
19
|
-
Requires-Dist: fastmcp<
|
|
19
|
+
Requires-Dist: fastmcp<5.0,>=4.0.2
|
|
20
20
|
Requires-Dist: fakeredis!=2.35.0
|
|
21
21
|
Requires-Dist: greenlet
|
|
22
|
-
Requires-Dist: haiku.rag-slim<0.
|
|
22
|
+
Requires-Dist: haiku.rag-slim<0.85,>=0.84.0
|
|
23
23
|
Requires-Dist: idna>=3.15
|
|
24
24
|
Requires-Dist: itsdangerous
|
|
25
25
|
Requires-Dist: joserfc<1.7,>=1.6.7
|
|
@@ -31,7 +31,7 @@ Requires-Dist: python-multipart>=0.0.31
|
|
|
31
31
|
Requires-Dist: jwcrypto
|
|
32
32
|
Requires-Dist: logfire[fastapi]
|
|
33
33
|
Requires-Dist: pyasn1>=0.6.4
|
|
34
|
-
Requires-Dist: pydantic-ai-slim[google]<3.0,>=2.
|
|
34
|
+
Requires-Dist: pydantic-ai-slim[google]<3.0,>=2.40.0
|
|
35
35
|
Requires-Dist: pydantic-settings<2.15,>=2.14.2
|
|
36
36
|
Requires-Dist: pyjwt<2.14,>=2.13.0
|
|
37
37
|
Requires-Dist: pymdown-extensions>=11.0.0
|
|
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "soliplex"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.80"
|
|
8
8
|
description = "An AI-powered Retrieval-Augmented Generation (RAG) system with a modern web interface."
|
|
9
9
|
authors = [{ name = "Enfold", email = "info@enfoldsystems.net" }]
|
|
10
10
|
readme = "README.md"
|
|
11
|
-
requires-python = ">=3.
|
|
11
|
+
requires-python = ">=3.13"
|
|
12
12
|
classifiers = [
|
|
13
13
|
"Programming Language :: Python :: 3",
|
|
14
14
|
"Operating System :: OS Independent",
|
|
@@ -22,10 +22,10 @@ dependencies = [
|
|
|
22
22
|
"bubble-sandbox >= 0.12.0, < 0.13",
|
|
23
23
|
"cryptography >= 50.0.0", # PYSEC-2026-3552
|
|
24
24
|
"fastapi",
|
|
25
|
-
"fastmcp >=
|
|
25
|
+
"fastmcp >= 4.0.2, < 5.0",
|
|
26
26
|
"fakeredis != 2.35.0", # brownbag
|
|
27
27
|
"greenlet",
|
|
28
|
-
"haiku.rag-slim >= 0.
|
|
28
|
+
"haiku.rag-slim >= 0.84.0, < 0.85",
|
|
29
29
|
"idna >= 3.15",
|
|
30
30
|
"itsdangerous",
|
|
31
31
|
"joserfc >= 1.6.7, < 1.7", # CVE-2026-48990
|
|
@@ -37,7 +37,7 @@ dependencies = [
|
|
|
37
37
|
"jwcrypto",
|
|
38
38
|
"logfire[fastapi]",
|
|
39
39
|
"pyasn1 >= 0.6.4", # PYSEC-2026-3456
|
|
40
|
-
"pydantic-ai-slim[google] >= 2.
|
|
40
|
+
"pydantic-ai-slim[google] >= 2.40.0, < 3.0",
|
|
41
41
|
"pydantic-settings >= 2.14.2, < 2.15", # GHSA-4xgf-cpjx-pc3j
|
|
42
42
|
"pyjwt >= 2.13.0, < 2.14", # PYSEC-2026-{175,177,178,179}
|
|
43
43
|
"pymdown-extensions >= 11.0.0", # CVE-2026-61632
|
|
@@ -60,9 +60,9 @@ dev = [
|
|
|
60
60
|
"coverage >= 7.13.5, < 7.14",
|
|
61
61
|
"pytest >= 9.0.2, < 9.1",
|
|
62
62
|
"pytest-cov >= 7.0.0, < 7.1",
|
|
63
|
-
"pytest-asyncio >= 1.
|
|
63
|
+
"pytest-asyncio >= 1.4.0, < 1.5",
|
|
64
64
|
"pytest-xdist >= 3.8.0, < 3.9",
|
|
65
|
-
"ruff >= 0.
|
|
65
|
+
"ruff >= 0.16.6, < 0.17",
|
|
66
66
|
"soliplex-skills >= 0.6",
|
|
67
67
|
]
|
|
68
68
|
docs = [
|
|
@@ -84,7 +84,13 @@ pythonpath = [".", "tests/unit"]
|
|
|
84
84
|
python_files = "test_*.py"
|
|
85
85
|
# skip 'tests/functional' by default
|
|
86
86
|
testpaths = ["tests/unit"]
|
|
87
|
-
|
|
87
|
+
# 'src/soliplex' (a path), not 'soliplex' (the importable name):
|
|
88
|
+
# 'soliplex' is a namespace package, and coverage cannot enumerate one
|
|
89
|
+
# by walking the filesystem, so a package-name target silently measures
|
|
90
|
+
# only the modules some test happened to import. A path target reports
|
|
91
|
+
# never-imported modules at 0%, which is what makes 'omit' below the
|
|
92
|
+
# single place that decides what is exempt.
|
|
93
|
+
addopts = "--cov=src/soliplex --cov=tests/unit --cov=scripts --cov=skills/soliplex-docs/scripts --cov-branch --cov-fail-under=100"
|
|
88
94
|
filterwarnings = [
|
|
89
95
|
# "ignore::DeprecationWarning:<source-package>",
|
|
90
96
|
]
|
|
@@ -95,8 +101,8 @@ markers = [
|
|
|
95
101
|
[tool.coverage.run]
|
|
96
102
|
omit = [
|
|
97
103
|
"scripts/lint_textio.py", # runs its own '--self-test' during lint
|
|
98
|
-
"
|
|
99
|
-
"src/soliplex/tui
|
|
104
|
+
"scripts/lint_interpolation.py", # ditto
|
|
105
|
+
"src/soliplex/tui/*", # the TUI is deliberately untested
|
|
100
106
|
]
|
|
101
107
|
|
|
102
108
|
[tool.coverage.report]
|
|
@@ -105,7 +111,9 @@ show_missing = true
|
|
|
105
111
|
[tool.ruff]
|
|
106
112
|
line-length = 79
|
|
107
113
|
exclude = [
|
|
114
|
+
"*.md", # ruff 0.16 formats Python in Markdown fences
|
|
108
115
|
]
|
|
116
|
+
force-exclude = true
|
|
109
117
|
target-version = "py313"
|
|
110
118
|
|
|
111
119
|
[tool.ruff.lint]
|
|
@@ -16,9 +16,6 @@ from soliplex.agui import persistence as agui_persistence
|
|
|
16
16
|
from soliplex.agui import schema as agui_schema
|
|
17
17
|
from soliplex.agui import util as agui_util
|
|
18
18
|
|
|
19
|
-
# Temporary backward-compatibility: to be removed in 'v0.45'
|
|
20
|
-
from soliplex.agui.schema import * # noqa F403
|
|
21
|
-
|
|
22
19
|
FeedbackReviewStatus = agui.FeedbackReviewStatus
|
|
23
20
|
|
|
24
21
|
|
|
@@ -9,7 +9,9 @@ import typing
|
|
|
9
9
|
import jsonpath
|
|
10
10
|
|
|
11
11
|
# Avoid circular import when only used for typing
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
if typing.TYPE_CHECKING: # avoid an import cycle at runtime
|
|
14
|
+
from soliplex import models
|
|
13
15
|
|
|
14
16
|
UserToken = dict[str, typing.Any]
|
|
15
17
|
|
|
@@ -249,14 +251,14 @@ class RoomAuthorizationPolicy(abc.ABC):
|
|
|
249
251
|
async def get_room_policy(
|
|
250
252
|
self,
|
|
251
253
|
room_id: str,
|
|
252
|
-
) -> models.RoomPolicy | None:
|
|
254
|
+
) -> models.RoomPolicy | None:
|
|
253
255
|
"""Return the authorization policy for the room"""
|
|
254
256
|
|
|
255
257
|
@abc.abstractmethod
|
|
256
258
|
async def update_room_policy(
|
|
257
259
|
self,
|
|
258
260
|
room_id: str,
|
|
259
|
-
room_policy: models.RoomPolicy,
|
|
261
|
+
room_policy: models.RoomPolicy,
|
|
260
262
|
) -> None:
|
|
261
263
|
"""Update the authorization policy for the room"""
|
|
262
264
|
|
|
@@ -271,13 +273,13 @@ class RoomAuthorizationPolicy(abc.ABC):
|
|
|
271
273
|
async def get_room_policy_unchecked(
|
|
272
274
|
self,
|
|
273
275
|
room_id: str,
|
|
274
|
-
) -> models.RoomPolicyUnchecked | None:
|
|
276
|
+
) -> models.RoomPolicyUnchecked | None:
|
|
275
277
|
"""Return the room policy, tolerating non-compiling 'json_path's."""
|
|
276
278
|
|
|
277
279
|
@abc.abstractmethod
|
|
278
280
|
async def list_room_policies(
|
|
279
281
|
self,
|
|
280
|
-
) -> list[models.RoomPolicyUnchecked]:
|
|
282
|
+
) -> list[models.RoomPolicyUnchecked]:
|
|
281
283
|
"""List every stored room policy as an unchecked model.
|
|
282
284
|
|
|
283
285
|
Each policy is returned as the unchecked model -- the analogue
|
|
@@ -298,7 +300,7 @@ class RoomAuthorizationPolicy(abc.ABC):
|
|
|
298
300
|
async def add_acl_entry(
|
|
299
301
|
self,
|
|
300
302
|
room_id: str,
|
|
301
|
-
entry: models.ACLEntry,
|
|
303
|
+
entry: models.ACLEntry,
|
|
302
304
|
) -> None:
|
|
303
305
|
"""Add an ACL entry to the room's policy, replacing any entry with
|
|
304
306
|
the same discriminator."""
|
|
@@ -307,7 +309,7 @@ class RoomAuthorizationPolicy(abc.ABC):
|
|
|
307
309
|
async def remove_acl_entry(
|
|
308
310
|
self,
|
|
309
311
|
room_id: str,
|
|
310
|
-
entry: models.ACLEntryUnchecked,
|
|
312
|
+
entry: models.ACLEntryUnchecked,
|
|
311
313
|
) -> None:
|
|
312
314
|
"""Remove the matching ACL entry from the room's policy."""
|
|
313
315
|
|
|
@@ -23,7 +23,7 @@ relationship = sqla_orm.relationship
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def _timestamp() -> datetime.datetime:
|
|
26
|
-
return datetime.datetime.now(datetime.
|
|
26
|
+
return datetime.datetime.now(datetime.UTC)
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
# Recommended naming convention used by Alembic, as various different database
|