soliplex 0.72.2__tar.gz → 0.73__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 (92) hide show
  1. {soliplex-0.72.2/src/soliplex.egg-info → soliplex-0.73}/PKG-INFO +3 -3
  2. {soliplex-0.72.2 → soliplex-0.73}/pyproject.toml +3 -3
  3. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/agents.py +5 -0
  4. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/agents.py +7 -3
  5. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/quizzes.py +19 -0
  6. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/rooms.py +42 -0
  7. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/skills.py +72 -13
  8. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/tools.py +38 -0
  9. {soliplex-0.72.2 → soliplex-0.73/src/soliplex.egg-info}/PKG-INFO +3 -3
  10. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex.egg-info/requires.txt +2 -2
  11. {soliplex-0.72.2 → soliplex-0.73}/LICENSE +0 -0
  12. {soliplex-0.72.2 → soliplex-0.73}/MANIFEST.in +0 -0
  13. {soliplex-0.72.2 → soliplex-0.73}/README.md +0 -0
  14. {soliplex-0.72.2 → soliplex-0.73}/example/skills/bare-bones/SKILL.md +0 -0
  15. {soliplex-0.72.2 → soliplex-0.73}/setup.cfg +0 -0
  16. {soliplex-0.72.2 → soliplex-0.73}/skills/soliplex-docs/SKILL.md +0 -0
  17. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/agui/__init__.py +0 -0
  18. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/agui/parser.py +0 -0
  19. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/agui/persistence.py +0 -0
  20. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/agui/schema.py +0 -0
  21. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/agui/util.py +0 -0
  22. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/authn.py +0 -0
  23. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/authz/__init__.py +0 -0
  24. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/authz/persistence.py +0 -0
  25. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/authz/schema.py +0 -0
  26. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/admin_users.py +0 -0
  27. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/ask.py +0 -0
  28. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/audit.py +0 -0
  29. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/cli_util.py +0 -0
  30. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/main.py +0 -0
  31. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/ollama.py +0 -0
  32. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/room_authz.py +0 -0
  33. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/serve.py +0 -0
  34. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/cli/types.py +0 -0
  35. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/completions.py +0 -0
  36. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/__init__.py +0 -0
  37. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/_utils.py +0 -0
  38. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/agui.py +0 -0
  39. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/authsystem.py +0 -0
  40. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/completions.py +0 -0
  41. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/exceptions.py +0 -0
  42. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/installation.py +0 -0
  43. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/logfire.py +0 -0
  44. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/meta.py +0 -0
  45. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/middleware.py +0 -0
  46. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/rag.py +0 -0
  47. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/routing.py +0 -0
  48. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/config/secrets.py +0 -0
  49. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/examples.py +0 -0
  50. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/installation.py +0 -0
  51. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/log_ingest.py +0 -0
  52. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/loggers.py +0 -0
  53. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/main.py +0 -0
  54. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/mcp_auth.py +0 -0
  55. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/mcp_client.py +0 -0
  56. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/mcp_server.py +0 -0
  57. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/models.py +0 -0
  58. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/ollama.py +0 -0
  59. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/quizzes.py +0 -0
  60. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/rag_audit.py +0 -0
  61. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/sandbox_audit.py +0 -0
  62. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/secrets.py +0 -0
  63. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/skills/bwrap_sandbox/SKILL.md +0 -0
  64. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/skills/bwrap_sandbox/__init__.py +0 -0
  65. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/titles.py +0 -0
  66. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/tools/__init__.py +0 -0
  67. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/tools/agui_run_feedback.py +0 -0
  68. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/tools/file_uploads.py +0 -0
  69. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/tools/rag.py +0 -0
  70. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/tui/cli.py +0 -0
  71. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/tui/main.py +0 -0
  72. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/tui/rest_api.py +0 -0
  73. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/tui/serve.py +0 -0
  74. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/util.py +0 -0
  75. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/__init__.py +0 -0
  76. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/agui.py +0 -0
  77. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/authn.py +0 -0
  78. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/authz.py +0 -0
  79. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/completions.py +0 -0
  80. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/installation.py +0 -0
  81. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/log_ingest.py +0 -0
  82. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/quizzes.py +0 -0
  83. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/room_file_uploads.py +0 -0
  84. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/rooms.py +0 -0
  85. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/sandbox_workdirs.py +0 -0
  86. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/stats.py +0 -0
  87. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/streaming.py +0 -0
  88. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex/views/thread_file_uploads.py +0 -0
  89. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex.egg-info/SOURCES.txt +0 -0
  90. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex.egg-info/dependency_links.txt +0 -0
  91. {soliplex-0.72.2 → soliplex-0.73}/src/soliplex.egg-info/entry_points.txt +0 -0
  92. {soliplex-0.72.2 → soliplex-0.73}/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.72.2
3
+ Version: 0.73
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
@@ -19,8 +19,8 @@ Requires-Dist: fastapi
19
19
  Requires-Dist: fastmcp<3.4,>=3.3.0
20
20
  Requires-Dist: fakeredis!=2.35.0
21
21
  Requires-Dist: greenlet
22
- Requires-Dist: haiku.rag-slim<0.67,>=0.66
23
- Requires-Dist: haiku-skills<0.19,>=0.18.0
22
+ Requires-Dist: haiku.rag-slim<0.68,>=0.67
23
+ Requires-Dist: haiku-skills<0.19,>=0.18.1
24
24
  Requires-Dist: idna>=3.15
25
25
  Requires-Dist: itsdangerous
26
26
  Requires-Dist: joserfc<1.7,>=1.6.7
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "soliplex"
7
- version = "0.72.2"
7
+ version = "0.73"
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"
@@ -25,8 +25,8 @@ dependencies = [
25
25
  "fastmcp >= 3.3.0, < 3.4",
26
26
  "fakeredis != 2.35.0", # brownbag
27
27
  "greenlet",
28
- "haiku.rag-slim >= 0.66, < 0.67",
29
- "haiku-skills >= 0.18.0, < 0.19",
28
+ "haiku.rag-slim >= 0.67, < 0.68",
29
+ "haiku-skills >= 0.18.1, < 0.19",
30
30
  "idna >= 3.15",
31
31
  "itsdangerous",
32
32
  "joserfc >= 1.6.7, < 1.7", # CVE-2026-48990
@@ -31,6 +31,10 @@ class SkillToolsetConfig(typing.Protocol):
31
31
  @abc.abstractmethod
32
32
  def skill_toolset(self) -> hs_agent.SkillToolset: ...
33
33
 
34
+ @property
35
+ @abc.abstractmethod
36
+ def use_subagents(self) -> bool: ...
37
+
34
38
 
35
39
  @dataclasses.dataclass
36
40
  class AgentDependencies:
@@ -110,6 +114,7 @@ def get_default_agent_from_configs(
110
114
  instructions = hs_prompts.build_system_prompt(
111
115
  preamble=preamble,
112
116
  skill_catalog=toolset.skill_catalog,
117
+ use_subagents=skill_toolset_config.use_subagents,
113
118
  )
114
119
  else:
115
120
  instructions = agent_prompt
@@ -84,11 +84,14 @@ def _apply_agent_config_template(
84
84
  raise InvalidAgentTemplateID(template_id, config_path)
85
85
 
86
86
  template_config = ic_agent_configs_map[template_id]
87
+ tc_yaml_no_kind = {
88
+ key: value
89
+ for key, value in template_config.as_yaml.items()
90
+ if key != "kind"
91
+ }
87
92
 
88
93
  config_dict = (
89
- template_config.as_yaml
90
- | config_dict
91
- | {"_template_id": template_id}
94
+ tc_yaml_no_kind | config_dict | {"_template_id": template_id}
92
95
  )
93
96
 
94
97
  return config_dict
@@ -365,6 +368,7 @@ class FactoryAgentConfig:
365
368
  @property
366
369
  def as_yaml(self) -> dict:
367
370
  return {
371
+ "kind": self.kind,
368
372
  "id": self.id,
369
373
  "factory_name": self.factory_name,
370
374
  "with_agent_config": self.with_agent_config,
@@ -153,6 +153,25 @@ class QuizConfig:
153
153
  )
154
154
  self.judge_agent = agents.AgentConfig(**kwargs)
155
155
 
156
+ @property
157
+ def as_yaml(self) -> dict:
158
+ result = {
159
+ "id": self.id,
160
+ "title": self.title,
161
+ "randomize": self.randomize,
162
+ "judge_agent": self.judge_agent.as_yaml,
163
+ }
164
+
165
+ if self._question_file_stem is not None:
166
+ result["question_file"] = self._question_file_stem
167
+ else:
168
+ result["question_file"] = self._question_file_path_override
169
+
170
+ if self.max_questions is not None:
171
+ result["max_questions"] = self.max_questions
172
+
173
+ return result
174
+
156
175
  @property
157
176
  def question_file_path(self) -> pathlib.Path:
158
177
  if self._question_file_path_override is not None:
@@ -168,6 +168,48 @@ class RoomConfig:
168
168
  config_dict,
169
169
  ) from exc
170
170
 
171
+ @property
172
+ def as_yaml(self) -> dict:
173
+ result = {
174
+ "id": self.id,
175
+ "name": self.name,
176
+ "description": self.description,
177
+ "allow_mcp": self.allow_mcp,
178
+ "agent": self.agent_config.as_yaml,
179
+ }
180
+
181
+ if self._order is not None:
182
+ result["_order"] = self._order
183
+
184
+ if self.welcome_message:
185
+ result["welcome_message"] = self.welcome_message
186
+
187
+ if self.suggestions:
188
+ result["suggestions"] = self.suggestions
189
+
190
+ if self._logo_image:
191
+ result["logo_image"] = self._logo_image
192
+
193
+ if self.quizzes:
194
+ result["quizzes"] = [quiz.as_yaml for quiz in self.quizzes]
195
+
196
+ if self._agui_feature_names:
197
+ result["agui_feature_names"] = list(self._agui_feature_names)
198
+
199
+ if self.tool_configs:
200
+ result["tools"] = [tc.as_yaml for tc in self.tool_configs.values()]
201
+
202
+ if self.mcp_client_toolset_configs:
203
+ result["mcp_client_toolsets"] = {
204
+ key: mctc.as_yaml
205
+ for key, mctc in self.mcp_client_toolset_configs.items()
206
+ }
207
+
208
+ if self.skills:
209
+ result["skills"] = self.skills.as_yaml
210
+
211
+ return result
212
+
171
213
  @property
172
214
  def sort_key(self):
173
215
  if self._order is not None:
@@ -315,6 +315,19 @@ class _HR_SkillConfigBase(
315
315
  config_dict,
316
316
  ) from exc
317
317
 
318
+ @property
319
+ def as_yaml(self) -> dict:
320
+ result = {"kind": self.kind}
321
+
322
+ if self.rag_lancedb_stem is not None:
323
+ result["rag_lancedb_stem"] = self.rag_lancedb_stem
324
+ else:
325
+ result["rag_lancedb_override_path"] = (
326
+ self.rag_lancedb_override_path
327
+ )
328
+
329
+ return result
330
+
318
331
  @property
319
332
  def skill(self) -> hs_models.Skill:
320
333
  return self._hr_skill_module.create_skill(
@@ -342,19 +355,6 @@ class HR_Analysis_SkillConfig(_HR_SkillConfigBase):
342
355
  kind: typing.ClassVar[hs_models.SkillSource] = "haiku.rag.skills.analysis"
343
356
  _hr_skill_module = hr_skills_analysis
344
357
 
345
- @classmethod
346
- def from_yaml(
347
- cls,
348
- installation_config: InstallationConfig, # noqa F821 cycles
349
- config_path: pathlib.Path,
350
- config_dict: dict,
351
- ):
352
- return super().from_yaml(
353
- installation_config,
354
- config_path,
355
- config_dict,
356
- )
357
-
358
358
 
359
359
  @dataclasses.dataclass(kw_only=True)
360
360
  class BwrapSandboxSkillConfig(_SkillPropertiesFromMetadata):
@@ -398,6 +398,12 @@ class BwrapSandboxSkillConfig(_SkillPropertiesFromMetadata):
398
398
  **sandbox_config_dict,
399
399
  )
400
400
 
401
+ volumes_dict = config_dict.pop("volumes", {})
402
+ config_dict["volumes"] = {
403
+ key: bs_models.VolumeInfo(**value)
404
+ for key, value in volumes_dict.items()
405
+ }
406
+
401
407
  de_name = config_dict.pop("default_environment_name", None)
402
408
  if de_name is not None: # pragma: NO COVER forward-compat
403
409
  config_dict["default_environment"] = de_name
@@ -410,6 +416,38 @@ class BwrapSandboxSkillConfig(_SkillPropertiesFromMetadata):
410
416
  config_dict,
411
417
  ) from exc
412
418
 
419
+ @property
420
+ def as_yaml(self) -> dict:
421
+ result = {
422
+ "kind": self.kind,
423
+ "default_environment": self.default_environment,
424
+ }
425
+
426
+ if self.id is not None:
427
+ result["id"] = self.id
428
+
429
+ if self.allowed_environments is not None:
430
+ result["allowed_environments"] = self.allowed_environments
431
+
432
+ if self.sandbox_config is not None:
433
+ sc = self.sandbox_config
434
+ result["sandbox_config"] = {
435
+ "environments_pathname": sc.environments_pathname,
436
+ "execution_timeout_seconds": sc.execution_timeout_seconds,
437
+ "max_output_chars": sc.max_output_chars,
438
+ }
439
+
440
+ if self.volumes:
441
+ result["volumes"] = {
442
+ key: {
443
+ "host_path": str(value.host_path),
444
+ "writable": value.writable,
445
+ }
446
+ for key, value in self.volumes.items()
447
+ }
448
+
449
+ return result
450
+
413
451
  @property
414
452
  def agui_feature_names(self) -> tuple[str]:
415
453
  return (sk_bwrap_sandbox.STATE_NAMESPACE,)
@@ -508,6 +546,12 @@ class RoomSkillsConfig(_SkillConfigModelBase):
508
546
  #
509
547
  installation_skill_names: list[str] = _default_list_field()
510
548
 
549
+ #
550
+ # Run skills as isolated sub-agents (the default) or expose their tools
551
+ # directly to the room's agent.
552
+ #
553
+ use_subagents: bool = True
554
+
511
555
  # Set by `from_yaml` factory
512
556
  _skill_configs: SkillConfigMap = _default_dict_field()
513
557
  _installation_config: InstallationConfig = ( # noqa F821 cycles
@@ -569,6 +613,20 @@ class RoomSkillsConfig(_SkillConfigModelBase):
569
613
  config_dict,
570
614
  ) from exc
571
615
 
616
+ @property
617
+ def as_yaml(self) -> dict:
618
+ result = {"model_name": self.model_name}
619
+
620
+ if self.installation_skill_names:
621
+ result["installation_skill_names"] = self.installation_skill_names
622
+
623
+ sc_map = [sc.as_yaml for sc in self._skill_configs.values()]
624
+
625
+ if sc_map:
626
+ result["skill_configs"] = sc_map
627
+
628
+ return result
629
+
572
630
  @property
573
631
  def skill_configs(self) -> SkillConfigMap:
574
632
  ic_skill_configs = self._installation_config.skill_configs
@@ -625,6 +683,7 @@ class RoomSkillsConfig(_SkillConfigModelBase):
625
683
  return SoliplexSkillToolset(
626
684
  skills=skill_map.values(),
627
685
  skill_model=self.model_or_name,
686
+ use_subagents=self.use_subagents,
628
687
  )
629
688
 
630
689
 
@@ -228,6 +228,21 @@ class ToolConfig:
228
228
  config_path, "toolconfig", config_dict
229
229
  ) from exc
230
230
 
231
+ @property
232
+ def as_yaml(self) -> dict:
233
+ result = {
234
+ "tool_name": self.tool_name,
235
+ "allow_mcp": self.allow_mcp,
236
+ }
237
+
238
+ if self.agui_feature_names:
239
+ result["agui_feature_names"] = list(self.agui_feature_names)
240
+
241
+ if self._ai_tool_params is not None:
242
+ result["ai_tool_params"] = self._ai_tool_params.as_yaml
243
+
244
+ return result
245
+
231
246
  @property
232
247
  def kind(self):
233
248
  _, kind = self.tool_name.rsplit(".", 1)
@@ -326,6 +341,21 @@ class SearchDocumentsToolConfig(ToolConfig, config_rag._RAGConfigBase):
326
341
 
327
342
  return instance
328
343
 
344
+ @property
345
+ def as_yaml(self) -> dict:
346
+ result = super().as_yaml
347
+
348
+ if self.rag_lancedb_stem is not None:
349
+ result["rag_lancedb_stem"] = self.rag_lancedb_stem
350
+ else:
351
+ result["rag_lancedb_override_path"] = (
352
+ self.rag_lancedb_override_path
353
+ )
354
+
355
+ result["search_documents_limit"] = self.search_documents_limit
356
+
357
+ return result
358
+
329
359
  def get_extra_parameters(self) -> dict:
330
360
  local = {
331
361
  "search_documents_limit": self.search_documents_limit,
@@ -405,6 +435,10 @@ class Stdio_MCP_ClientToolsetConfig:
405
435
  config_dict,
406
436
  ) from exc
407
437
 
438
+ @property
439
+ def as_yaml(self) -> dict:
440
+ return {"kind": self.kind} | self.toolset_params
441
+
408
442
  @property
409
443
  def toolset_params(self) -> dict:
410
444
  return {
@@ -462,6 +496,10 @@ class _Remote_MCP_ClientToolsetConfig:
462
496
  config_dict,
463
497
  ) from exc
464
498
 
499
+ @property
500
+ def as_yaml(self) -> dict:
501
+ return {"kind": self.kind} | self.toolset_params
502
+
465
503
  @property
466
504
  def toolset_params(self) -> dict:
467
505
  return {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soliplex
3
- Version: 0.72.2
3
+ Version: 0.73
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
@@ -19,8 +19,8 @@ Requires-Dist: fastapi
19
19
  Requires-Dist: fastmcp<3.4,>=3.3.0
20
20
  Requires-Dist: fakeredis!=2.35.0
21
21
  Requires-Dist: greenlet
22
- Requires-Dist: haiku.rag-slim<0.67,>=0.66
23
- Requires-Dist: haiku-skills<0.19,>=0.18.0
22
+ Requires-Dist: haiku.rag-slim<0.68,>=0.67
23
+ Requires-Dist: haiku-skills<0.19,>=0.18.1
24
24
  Requires-Dist: idna>=3.15
25
25
  Requires-Dist: itsdangerous
26
26
  Requires-Dist: joserfc<1.7,>=1.6.7
@@ -9,8 +9,8 @@ fastapi
9
9
  fastmcp<3.4,>=3.3.0
10
10
  fakeredis!=2.35.0
11
11
  greenlet
12
- haiku.rag-slim<0.67,>=0.66
13
- haiku-skills<0.19,>=0.18.0
12
+ haiku.rag-slim<0.68,>=0.67
13
+ haiku-skills<0.19,>=0.18.1
14
14
  idna>=3.15
15
15
  itsdangerous
16
16
  joserfc<1.7,>=1.6.7
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes