soliplex 0.77__tar.gz → 0.77.2__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 (95) hide show
  1. {soliplex-0.77/src/soliplex.egg-info → soliplex-0.77.2}/PKG-INFO +2 -2
  2. {soliplex-0.77 → soliplex-0.77.2}/pyproject.toml +2 -2
  3. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/rooms.py +20 -0
  4. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/loggers.py +2 -0
  5. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/models.py +10 -2
  6. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/authz.py +22 -0
  7. {soliplex-0.77 → soliplex-0.77.2/src/soliplex.egg-info}/PKG-INFO +2 -2
  8. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex.egg-info/requires.txt +1 -1
  9. {soliplex-0.77 → soliplex-0.77.2}/LICENSE +0 -0
  10. {soliplex-0.77 → soliplex-0.77.2}/MANIFEST.in +0 -0
  11. {soliplex-0.77 → soliplex-0.77.2}/README.md +0 -0
  12. {soliplex-0.77 → soliplex-0.77.2}/example/skills/bare-bones/SKILL.md +0 -0
  13. {soliplex-0.77 → soliplex-0.77.2}/example/skills/stanzas/SKILL.md +0 -0
  14. {soliplex-0.77 → soliplex-0.77.2}/setup.cfg +0 -0
  15. {soliplex-0.77 → soliplex-0.77.2}/skills/soliplex-docs/SKILL.md +0 -0
  16. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/agents.py +0 -0
  17. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/agui/__init__.py +0 -0
  18. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/agui/parser.py +0 -0
  19. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/agui/persistence.py +0 -0
  20. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/agui/schema.py +0 -0
  21. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/agui/util.py +0 -0
  22. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/authn.py +0 -0
  23. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/authz/__init__.py +0 -0
  24. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/authz/persistence.py +0 -0
  25. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/authz/schema.py +0 -0
  26. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/capabilities/filesystem.py +0 -0
  27. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/capabilities/rag_audit.py +0 -0
  28. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/admin_users.py +0 -0
  29. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/ask.py +0 -0
  30. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/audit.py +0 -0
  31. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/cli_util.py +0 -0
  32. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/main.py +0 -0
  33. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/ollama.py +0 -0
  34. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/room_authz.py +0 -0
  35. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/serve.py +0 -0
  36. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/cli/types.py +0 -0
  37. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/completions.py +0 -0
  38. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/__init__.py +0 -0
  39. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/_utils.py +0 -0
  40. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/agents.py +0 -0
  41. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/agui.py +0 -0
  42. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/authsystem.py +0 -0
  43. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/completions.py +0 -0
  44. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/exceptions.py +0 -0
  45. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/installation.py +0 -0
  46. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/logfire.py +0 -0
  47. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/meta.py +0 -0
  48. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/middleware.py +0 -0
  49. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/quizzes.py +0 -0
  50. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/rag.py +0 -0
  51. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/routing.py +0 -0
  52. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/secrets.py +0 -0
  53. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/skills.py +0 -0
  54. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/config/tools.py +0 -0
  55. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/examples.py +0 -0
  56. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/installation.py +0 -0
  57. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/log_ingest.py +0 -0
  58. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/main.py +0 -0
  59. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/mcp_auth.py +0 -0
  60. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/mcp_client.py +0 -0
  61. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/mcp_server.py +0 -0
  62. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/ollama.py +0 -0
  63. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/quizzes.py +0 -0
  64. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/rag_audit.py +0 -0
  65. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/sandbox_audit.py +0 -0
  66. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/secrets.py +0 -0
  67. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/skills/bwrap_sandbox/SKILL.md +0 -0
  68. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/skills/bwrap_sandbox/__init__.py +0 -0
  69. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/titles.py +0 -0
  70. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/tools/__init__.py +0 -0
  71. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/tools/agui_run_feedback.py +0 -0
  72. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/tools/file_uploads.py +0 -0
  73. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/tools/rag.py +0 -0
  74. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/tui/cli.py +0 -0
  75. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/tui/main.py +0 -0
  76. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/tui/rest_api.py +0 -0
  77. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/tui/serve.py +0 -0
  78. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/util.py +0 -0
  79. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/__init__.py +0 -0
  80. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/agui.py +0 -0
  81. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/authn.py +0 -0
  82. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/completions.py +0 -0
  83. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/installation.py +0 -0
  84. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/log_ingest.py +0 -0
  85. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/quizzes.py +0 -0
  86. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/room_file_uploads.py +0 -0
  87. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/rooms.py +0 -0
  88. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/sandbox_workdirs.py +0 -0
  89. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/stats.py +0 -0
  90. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/streaming.py +0 -0
  91. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex/views/thread_file_uploads.py +0 -0
  92. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex.egg-info/SOURCES.txt +0 -0
  93. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex.egg-info/dependency_links.txt +0 -0
  94. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex.egg-info/entry_points.txt +0 -0
  95. {soliplex-0.77 → soliplex-0.77.2}/src/soliplex.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soliplex
3
- Version: 0.77
3
+ Version: 0.77.2
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
@@ -13,7 +13,7 @@ Requires-Dist: aiohttp<3.15,>=3.14.2
13
13
  Requires-Dist: aiosqlite
14
14
  Requires-Dist: alembic<1.19,>=1.18.4
15
15
  Requires-Dist: authlib
16
- Requires-Dist: bubble-sandbox<0.12,>=0.11.0
16
+ Requires-Dist: bubble-sandbox<0.13,>=0.12.0
17
17
  Requires-Dist: cryptography>=50.0.0
18
18
  Requires-Dist: fastapi
19
19
  Requires-Dist: fastmcp<3.4,>=3.3.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "soliplex"
7
- version = "0.77"
7
+ version = "0.77.2"
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"
@@ -19,7 +19,7 @@ dependencies = [
19
19
  "aiosqlite",
20
20
  "alembic >= 1.18.4, < 1.19",
21
21
  "authlib",
22
- "bubble-sandbox >= 0.11.0, < 0.12",
22
+ "bubble-sandbox >= 0.12.0, < 0.13",
23
23
  "cryptography >= 50.0.0", # PYSEC-2026-3552
24
24
  "fastapi",
25
25
  "fastmcp >= 3.3.0, < 3.4",
@@ -217,6 +217,26 @@ class RoomConfig:
217
217
  """Does the room have the sandbox skill?"""
218
218
  return self.skills.has_sandbox if self.skills is not None else False
219
219
 
220
+ @property
221
+ def has_thread_uploads(self) -> bool:
222
+ """Can files be uploaded to threads in this room at all?"""
223
+ upload_path = getattr(
224
+ self._installation_config,
225
+ "threads_upload_path",
226
+ None,
227
+ )
228
+ return self.has_sandbox and upload_path is not None
229
+
230
+ @property
231
+ def has_room_uploads(self) -> bool:
232
+ """Can files be uploaded to this room at all?"""
233
+ upload_path = getattr(
234
+ self._installation_config,
235
+ "rooms_upload_path",
236
+ None,
237
+ )
238
+ return self.has_sandbox and upload_path is not None
239
+
220
240
  @property
221
241
  def agui_feature_names(self) -> tuple[str]:
222
242
  agent_features = set(self.agent_config.agui_feature_names)
@@ -55,6 +55,7 @@ AUTHZ_GET_ROOM_POLICY = "get room policy"
55
55
  AUTHZ_POST_ROOM_POLICY = "post room policy"
56
56
  AUTHZ_DELETE_ROOM_POLICY = "delete room policy"
57
57
  AUTHZ_GET_INSTALLATION_AUTHZ = "get installation authz"
58
+ AUTHZ_GET_USER_AUTHZ = "get user authz"
58
59
 
59
60
  INST_GET_INSTALLATION = "get installation"
60
61
  INST_GET_INSTALLATION_VERSIONS = "get installation versions"
@@ -114,6 +115,7 @@ AUDIT_ACTION_UPDATE = "update"
114
115
  AUDIT_ACTION_DELETE = "delete"
115
116
  AUDIT_RESOURCE_ROOM_POLICY = "room-policy"
116
117
  AUDIT_RESOURCE_INSTALLATION_AUTHZ = "installation-authz"
118
+ AUDIT_RESOURCE_USER_AUTHZ = "user-authz"
117
119
  AUDIT_RESOURCE_INSTALLATION = "installation"
118
120
  AUDIT_RESOURCE_INSTALLATION_VERSIONS = "installation-versions"
119
121
  AUDIT_RESOURCE_INSTALLATION_PROVIDERS = "installation-providers"
@@ -262,6 +262,8 @@ class Room(pydantic.BaseModel):
262
262
  agent: Agent
263
263
  agui_feature_names: list[str]
264
264
  allow_mcp: bool
265
+ has_thread_uploads: bool
266
+ has_room_uploads: bool
265
267
 
266
268
  @classmethod
267
269
  def from_config(cls, room_config: config_rooms.RoomConfig):
@@ -300,9 +302,11 @@ class Room(pydantic.BaseModel):
300
302
  quizzes={
301
303
  quiz.id: Quiz.from_config(quiz) for quiz in room_config.quizzes
302
304
  },
303
- allow_mcp=room_config.allow_mcp,
304
- agui_feature_names=list(room_config.agui_feature_names),
305
305
  agent=agent,
306
+ agui_feature_names=list(room_config.agui_feature_names),
307
+ allow_mcp=room_config.allow_mcp,
308
+ has_thread_uploads=room_config.has_thread_uploads,
309
+ has_room_uploads=room_config.has_room_uploads,
306
310
  )
307
311
 
308
312
 
@@ -923,6 +927,10 @@ class InstallationAuthorization(pydantic.BaseModel):
923
927
  room_policies: RoomPolicyMap = pydantic.Field(default_factory=dict)
924
928
 
925
929
 
930
+ class UserAuthorization(pydantic.BaseModel):
931
+ is_admin_user: bool
932
+
933
+
926
934
  # ----------------------------------------------------------------------------
927
935
  # 'ask_with_rich_citations' tool models
928
936
  # ----------------------------------------------------------------------------
@@ -170,3 +170,25 @@ async def get_installation_authz(
170
170
  for room_id, room_policy in room_policies.items()
171
171
  },
172
172
  )
173
+
174
+
175
+ @util.logfire_span("GET /v1/user/authz")
176
+ @router.get(
177
+ "/v1/user/authz",
178
+ summary="Get authorization info for the user",
179
+ )
180
+ async def get_user_authz(
181
+ the_installation: installation.Installation = depend_the_installation,
182
+ the_admin_users: authz.AdminUserPolicy = depend_the_admin_users,
183
+ the_user_claims: authn.UserClaims = depend_the_user_claims,
184
+ the_authz_logger: loggers.LogWrapper = depend_the_authz_logger,
185
+ ) -> models.UserAuthorization:
186
+ the_authz_logger.debug(loggers.AUTHZ_GET_USER_AUTHZ)
187
+
188
+ is_admin_user = await the_admin_users.check_admin_access(
189
+ the_user_claims,
190
+ resource=loggers.AUDIT_RESOURCE_USER_AUTHZ,
191
+ action=loggers.AUDIT_ACTION_READ,
192
+ )
193
+
194
+ return models.UserAuthorization(is_admin_user=is_admin_user)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soliplex
3
- Version: 0.77
3
+ Version: 0.77.2
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
@@ -13,7 +13,7 @@ Requires-Dist: aiohttp<3.15,>=3.14.2
13
13
  Requires-Dist: aiosqlite
14
14
  Requires-Dist: alembic<1.19,>=1.18.4
15
15
  Requires-Dist: authlib
16
- Requires-Dist: bubble-sandbox<0.12,>=0.11.0
16
+ Requires-Dist: bubble-sandbox<0.13,>=0.12.0
17
17
  Requires-Dist: cryptography>=50.0.0
18
18
  Requires-Dist: fastapi
19
19
  Requires-Dist: fastmcp<3.4,>=3.3.0
@@ -3,7 +3,7 @@ aiohttp<3.15,>=3.14.2
3
3
  aiosqlite
4
4
  alembic<1.19,>=1.18.4
5
5
  authlib
6
- bubble-sandbox<0.12,>=0.11.0
6
+ bubble-sandbox<0.13,>=0.12.0
7
7
  cryptography>=50.0.0
8
8
  fastapi
9
9
  fastmcp<3.4,>=3.3.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes