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.
Files changed (98) hide show
  1. {soliplex-0.78.2/src/soliplex.egg-info → soliplex-0.80}/PKG-INFO +5 -5
  2. {soliplex-0.78.2 → soliplex-0.80}/pyproject.toml +18 -10
  3. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/persistence.py +0 -3
  4. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/util.py +1 -1
  5. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/authz/__init__.py +9 -7
  6. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/authz/schema.py +1 -1
  7. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/audit.py +626 -27
  8. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/agents.py +24 -20
  9. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/authsystem.py +11 -9
  10. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/completions.py +6 -2
  11. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/installation.py +76 -55
  12. soliplex-0.80/src/soliplex/config/interpolation.py +483 -0
  13. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/logfire.py +39 -29
  14. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/quizzes.py +6 -2
  15. soliplex-0.80/src/soliplex/config/rag.py +508 -0
  16. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/rooms.py +25 -27
  17. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/secrets.py +13 -9
  18. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/skills.py +13 -16
  19. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/tools.py +56 -42
  20. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/examples.py +1 -0
  21. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/installation.py +86 -11
  22. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/loggers.py +59 -4
  23. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/models.py +7 -2
  24. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/ollama.py +31 -5
  25. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/quizzes.py +5 -3
  26. soliplex-0.80/src/soliplex/sandbox_audit.py +164 -0
  27. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/secrets.py +8 -4
  28. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/skills/bwrap_sandbox/__init__.py +125 -85
  29. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tools/agui_run_feedback.py +1 -0
  30. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tools/rag.py +5 -5
  31. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tui/main.py +10 -0
  32. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/log_ingest.py +2 -1
  33. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/rooms.py +35 -7
  34. {soliplex-0.78.2 → soliplex-0.80/src/soliplex.egg-info}/PKG-INFO +5 -5
  35. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/SOURCES.txt +1 -0
  36. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/requires.txt +3 -3
  37. soliplex-0.78.2/src/soliplex/config/rag.py +0 -198
  38. soliplex-0.78.2/src/soliplex/sandbox_audit.py +0 -65
  39. {soliplex-0.78.2 → soliplex-0.80}/LICENSE +0 -0
  40. {soliplex-0.78.2 → soliplex-0.80}/MANIFEST.in +0 -0
  41. {soliplex-0.78.2 → soliplex-0.80}/README.md +0 -0
  42. {soliplex-0.78.2 → soliplex-0.80}/example/skills/bare-bones/SKILL.md +0 -0
  43. {soliplex-0.78.2 → soliplex-0.80}/example/skills/stanzas/SKILL.md +0 -0
  44. {soliplex-0.78.2 → soliplex-0.80}/setup.cfg +0 -0
  45. {soliplex-0.78.2 → soliplex-0.80}/skills/soliplex-docs/SKILL.md +0 -0
  46. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agents.py +0 -0
  47. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/__init__.py +0 -0
  48. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/parser.py +0 -0
  49. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/agui/schema.py +0 -0
  50. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/authn.py +0 -0
  51. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/authz/persistence.py +0 -0
  52. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/capabilities/filesystem.py +0 -0
  53. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/capabilities/rag_audit.py +0 -0
  54. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/admin_users.py +0 -0
  55. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/ask.py +0 -0
  56. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/cli_util.py +0 -0
  57. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/main.py +0 -0
  58. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/ollama.py +0 -0
  59. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/room_authz.py +0 -0
  60. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/serve.py +0 -0
  61. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/cli/types.py +0 -0
  62. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/completions.py +0 -0
  63. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/__init__.py +0 -0
  64. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/_utils.py +0 -0
  65. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/agui.py +0 -0
  66. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/exceptions.py +0 -0
  67. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/meta.py +0 -0
  68. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/middleware.py +0 -0
  69. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/config/routing.py +0 -0
  70. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/log_ingest.py +0 -0
  71. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/main.py +0 -0
  72. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/mcp_auth.py +0 -0
  73. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/mcp_client.py +0 -0
  74. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/mcp_server.py +0 -0
  75. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/rag_audit.py +0 -0
  76. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/skills/bwrap_sandbox/SKILL.md +0 -0
  77. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/titles.py +0 -0
  78. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tools/__init__.py +0 -0
  79. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tools/file_uploads.py +0 -0
  80. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tui/cli.py +0 -0
  81. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tui/rest_api.py +0 -0
  82. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/tui/serve.py +0 -0
  83. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/util.py +0 -0
  84. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/__init__.py +0 -0
  85. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/agui.py +0 -0
  86. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/authn.py +0 -0
  87. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/authz.py +0 -0
  88. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/completions.py +0 -0
  89. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/installation.py +0 -0
  90. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/quizzes.py +0 -0
  91. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/room_file_uploads.py +0 -0
  92. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/sandbox_workdirs.py +0 -0
  93. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/stats.py +0 -0
  94. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/streaming.py +0 -0
  95. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex/views/thread_file_uploads.py +0 -0
  96. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/dependency_links.txt +0 -0
  97. {soliplex-0.78.2 → soliplex-0.80}/src/soliplex.egg-info/entry_points.txt +0 -0
  98. {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.78.2
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.12
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<3.4,>=3.3.0
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.79,>=0.78.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.11.0
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.78.2"
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.12"
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 >= 3.3.0, < 3.4",
25
+ "fastmcp >= 4.0.2, < 5.0",
26
26
  "fakeredis != 2.35.0", # brownbag
27
27
  "greenlet",
28
- "haiku.rag-slim >= 0.78.0, < 0.79",
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.11.0, < 3.0",
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.3.0, < 1.4",
63
+ "pytest-asyncio >= 1.4.0, < 1.5",
64
64
  "pytest-xdist >= 3.8.0, < 3.9",
65
- "ruff >= 0.15.6, < 0.16",
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
- addopts = "--cov=soliplex --cov=tests/unit --cov=scripts --cov=skills/soliplex-docs/scripts --cov-branch --cov-fail-under=100"
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
- "src/soliplex/cli/__init__.py",
99
- "src/soliplex/tui.py",
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
 
@@ -7,4 +7,4 @@ def _make_uuid_str() -> str:
7
7
 
8
8
 
9
9
  def _timestamp() -> datetime.datetime:
10
- return datetime.datetime.now(datetime.timezone.utc) # noqa UP07
10
+ return datetime.datetime.now(datetime.UTC)
@@ -9,7 +9,9 @@ import typing
9
9
  import jsonpath
10
10
 
11
11
  # Avoid circular import when only used for typing
12
- # from soliplex import models
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: # noqa: F821
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, # noqa: F821
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: # noqa: F821
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]: # noqa: F821
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, # noqa: F821
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, # noqa: F821
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.timezone.utc) # noqa UP07
26
+ return datetime.datetime.now(datetime.UTC)
27
27
 
28
28
 
29
29
  # Recommended naming convention used by Alembic, as various different database