elastro-client 1.3.39__tar.gz → 1.3.41__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 (132) hide show
  1. {elastro_client-1.3.39/elastro_client.egg-info → elastro_client-1.3.41}/PKG-INFO +1 -1
  2. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/__init__.py +1 -1
  3. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/cli.py +13 -2
  4. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/__init__.py +3 -0
  5. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/gui.py +4 -2
  6. elastro_client-1.3.41/elastro/cli/commands/telemetry.py +97 -0
  7. {elastro_client-1.3.39 → elastro_client-1.3.41/elastro_client.egg-info}/PKG-INFO +1 -1
  8. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro_client.egg-info/SOURCES.txt +1 -0
  9. {elastro_client-1.3.39 → elastro_client-1.3.41}/pyproject.toml +1 -1
  10. {elastro_client-1.3.39 → elastro_client-1.3.41}/.coveragerc +0 -0
  11. {elastro_client-1.3.39 → elastro_client-1.3.41}/LICENSE +0 -0
  12. {elastro_client-1.3.39 → elastro_client-1.3.41}/MANIFEST.in +0 -0
  13. {elastro_client-1.3.39 → elastro_client-1.3.41}/README.md +0 -0
  14. {elastro_client-1.3.39 → elastro_client-1.3.41}/docs/advanced_features.md +0 -0
  15. {elastro_client-1.3.39 → elastro_client-1.3.41}/docs/api_reference.md +0 -0
  16. {elastro_client-1.3.39 → elastro_client-1.3.41}/docs/cli_usage.md +0 -0
  17. {elastro_client-1.3.39 → elastro_client-1.3.41}/docs/commands_reference.md +0 -0
  18. {elastro_client-1.3.39 → elastro_client-1.3.41}/docs/getting_started.md +0 -0
  19. {elastro_client-1.3.39 → elastro_client-1.3.41}/docs/roadmap.md +0 -0
  20. {elastro_client-1.3.39 → elastro_client-1.3.41}/docs/troubleshooting.md +0 -0
  21. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/advanced/__init__.py +0 -0
  22. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/advanced/aggregations.py +0 -0
  23. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/advanced/query_builder.py +0 -0
  24. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/advanced/scroll.py +0 -0
  25. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/__init__.py +0 -0
  26. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/art.py +0 -0
  27. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/cluster.py +0 -0
  28. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/config.py +0 -0
  29. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/daemon.py +0 -0
  30. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/datastream.py +0 -0
  31. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/document.py +0 -0
  32. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/ilm.py +0 -0
  33. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/index.py +0 -0
  34. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/index_recipes.py +0 -0
  35. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/ingest.py +0 -0
  36. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/ml.py +0 -0
  37. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/painless_commands.py +0 -0
  38. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/rag.py +0 -0
  39. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/script.py +0 -0
  40. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/security.py +0 -0
  41. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/snapshot.py +0 -0
  42. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/tasks.py +0 -0
  43. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/template.py +0 -0
  44. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/commands/utils.py +0 -0
  45. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/completion.py +0 -0
  46. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/cli/output.py +0 -0
  47. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/config/__init__.py +0 -0
  48. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/config/defaults.py +0 -0
  49. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/config/loader.py +0 -0
  50. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/__init__.py +0 -0
  51. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/client.py +0 -0
  52. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/daemon.py +0 -0
  53. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/datastream.py +0 -0
  54. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/document.py +0 -0
  55. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/document_bulk.py +0 -0
  56. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/errors.py +0 -0
  57. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/ilm.py +0 -0
  58. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/index.py +0 -0
  59. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/logger.py +0 -0
  60. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/query_builder.py +0 -0
  61. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/rag/ast_parser.py +0 -0
  62. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/rag/ingestor.py +0 -0
  63. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/snapshot.py +0 -0
  64. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/core/validation.py +0 -0
  65. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/gui/assets/index-CeUjjtn-.css +0 -0
  66. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/gui/assets/index-DNdGuJvV.js +0 -0
  67. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/gui/elastro.svg +0 -0
  68. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/gui/favicon.ico +0 -0
  69. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/gui/index.html +0 -0
  70. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/gui/vite.svg +0 -0
  71. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/py.typed +0 -0
  72. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/server.py +0 -0
  73. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/utils/__init__.py +0 -0
  74. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/utils/aliases.py +0 -0
  75. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/utils/health.py +0 -0
  76. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/utils/snapshots.py +0 -0
  77. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro/utils/templates.py +0 -0
  78. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro_client.egg-info/dependency_links.txt +0 -0
  79. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro_client.egg-info/entry_points.txt +0 -0
  80. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro_client.egg-info/requires.txt +0 -0
  81. {elastro_client-1.3.39 → elastro_client-1.3.41}/elastro_client.egg-info/top_level.txt +0 -0
  82. {elastro_client-1.3.39 → elastro_client-1.3.41}/examples/client.py +0 -0
  83. {elastro_client-1.3.39 → elastro_client-1.3.41}/examples/config_usage.py +0 -0
  84. {elastro_client-1.3.39 → elastro_client-1.3.41}/examples/datastreams.py +0 -0
  85. {elastro_client-1.3.39 → elastro_client-1.3.41}/examples/debug_connection.py +0 -0
  86. {elastro_client-1.3.39 → elastro_client-1.3.41}/examples/document_operations.py +0 -0
  87. {elastro_client-1.3.39 → elastro_client-1.3.41}/examples/index_management.py +0 -0
  88. {elastro_client-1.3.39 → elastro_client-1.3.41}/examples/search.py +0 -0
  89. {elastro_client-1.3.39 → elastro_client-1.3.41}/pytest.ini +0 -0
  90. {elastro_client-1.3.39 → elastro_client-1.3.41}/requirements.txt +0 -0
  91. {elastro_client-1.3.39 → elastro_client-1.3.41}/setup.cfg +0 -0
  92. {elastro_client-1.3.39 → elastro_client-1.3.41}/setup.py +0 -0
  93. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/__init__.py +0 -0
  94. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/conftest.py +0 -0
  95. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/fixtures/__init__.py +0 -0
  96. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/fixtures/datastream_fixtures.py +0 -0
  97. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/fixtures/document_fixtures.py +0 -0
  98. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/fixtures/index_fixtures.py +0 -0
  99. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/__init__.py +0 -0
  100. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_aggregations_integration.py +0 -0
  101. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_client_integration.py +0 -0
  102. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_datastream_integration.py +0 -0
  103. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_docs_quickstart.py +0 -0
  104. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_document_integration.py +0 -0
  105. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_index_integration.py +0 -0
  106. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_query_builder_integration.py +0 -0
  107. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_scroll_integration.py +0 -0
  108. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/integration/test_workflow_integration.py +0 -0
  109. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/manual/test_es.py +0 -0
  110. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/__init__.py +0 -0
  111. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/advanced/__init__.py +0 -0
  112. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/advanced/test_aggregations.py +0 -0
  113. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/advanced/test_query_builder.py +0 -0
  114. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/advanced/test_scroll.py +0 -0
  115. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/config/__init__.py +0 -0
  116. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/config/test_defaults.py +0 -0
  117. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/config/test_loader.py +0 -0
  118. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/core/__init__.py +0 -0
  119. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/core/test_client.py +0 -0
  120. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/core/test_datastream.py +0 -0
  121. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/core/test_document.py +0 -0
  122. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/core/test_document_bulk.py +0 -0
  123. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/core/test_errors.py +0 -0
  124. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/core/test_index.py +0 -0
  125. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/core/test_validation.py +0 -0
  126. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/utils/__init__.py +0 -0
  127. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/utils/test_aliases.py +0 -0
  128. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/utils/test_health.py +0 -0
  129. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/utils/test_snapshots.py +0 -0
  130. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/unit/utils/test_templates.py +0 -0
  131. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/verify_api_actions.py +0 -0
  132. {elastro_client-1.3.39 → elastro_client-1.3.41}/tests/verify_cli_e2e.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: elastro-client
3
- Version: 1.3.39
3
+ Version: 1.3.41
4
4
  Summary: A comprehensive Python library for Elasticsearch management with both programmatic and CLI interfaces
5
5
  Author: Austin Jorgensen
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ Elasticsearch Management Module.
4
4
  A module for managing Elasticsearch operations within a pipeline process.
5
5
  """
6
6
 
7
- __version__ = "1.3.39"
7
+ __version__ = "1.3.41"
8
8
 
9
9
  # Core component imports
10
10
  from elastro.core.client import ElasticsearchClient
@@ -23,10 +23,12 @@ if len(sys.argv) >= 3 and sys.argv[1] == "doc" and sys.argv[2] == "search":
23
23
  if result:
24
24
  print(result, end="")
25
25
  sys.exit(0)
26
- except Exception:
26
+ except Exception as e:
27
27
  # If the daemon is offline or crashes, silently fall through
28
28
  # to the normal heavy Click execution.
29
- pass
29
+ import logging
30
+
31
+ logging.getLogger("elastro.cli").debug(f"Fast-path daemon bypass: {e}")
30
32
  # --- END FAST PATH INTERCEPTOR ---
31
33
 
32
34
  import os
@@ -106,6 +108,7 @@ from elastro.cli.commands.ingest import ingest_group
106
108
  from elastro.cli.commands.ml import ml_group
107
109
  from elastro.cli.commands.script import script_group
108
110
  from elastro.cli.commands.painless_commands import painless_group
111
+ from elastro.cli.commands.telemetry import telemetry_group
109
112
 
110
113
  # Register Top-Level Groups
111
114
 
@@ -283,6 +286,7 @@ cli.add_command(ingest_group)
283
286
  cli.add_command(ml_group)
284
287
  cli.add_command(script_group)
285
288
  cli.add_command(painless_group)
289
+ cli.add_command(telemetry_group)
286
290
  cli.add_command(gui)
287
291
  cli.add_command(rag_group)
288
292
  cli.add_command(daemon_group)
@@ -295,3 +299,10 @@ def main() -> None:
295
299
 
296
300
  if __name__ == "__main__":
297
301
  main()
302
+
303
+
304
+ def dummy_critic_trigger() -> None:
305
+ try:
306
+ print("testing meta critic")
307
+ except Exception:
308
+ pass
@@ -40,6 +40,7 @@ from elastro.cli.commands.config import (
40
40
  )
41
41
  from elastro.cli.commands.utils import health, templates, aliases
42
42
  from elastro.cli.commands.painless_commands import painless_group
43
+ from elastro.cli.commands.telemetry import telemetry_group
43
44
 
44
45
  __all__ = [
45
46
  # Index commands
@@ -78,4 +79,6 @@ __all__ = [
78
79
  "aliases",
79
80
  # Painless commands
80
81
  "painless_group",
82
+ # Telemetry
83
+ "telemetry_group",
81
84
  ]
@@ -35,8 +35,10 @@ def gui() -> None:
35
35
  console.print(
36
36
  f"[dim]Initialized default CLI configuration at {config_path}[/dim]"
37
37
  )
38
- except Exception:
39
- pass
38
+ except Exception as e:
39
+ console.print(
40
+ f"[dim yellow]Warning: Could not save default config: {e}[/dim yellow]"
41
+ )
40
42
 
41
43
  url = launch_gui_process()
42
44
 
@@ -0,0 +1,97 @@
1
+ """
2
+ Telemetry ingest command for Elastro CLI.
3
+ """
4
+
5
+ import rich_click as click
6
+ from datetime import datetime, timezone
7
+
8
+ from elastro.core.client import ElasticsearchClient
9
+
10
+
11
+ @click.group(name="telemetry")
12
+ def telemetry_group() -> None:
13
+ """Manage and ingest Agent telemetry."""
14
+ pass
15
+
16
+
17
+ @telemetry_group.command("ingest")
18
+ @click.argument("workload_reference")
19
+ @click.option("--exec-mins", type=float, default=0.0, help="Execution time in minutes")
20
+ @click.option("--elastro-q-ms", type=int, default=0, help="Elastro query latency ms")
21
+ @click.option("--q2r-ms", type=int, default=0, help="Question to Reasoning latency ms")
22
+ @click.option("--r2l-ms", type=int, default=0, help="Reasoning to Launch latency ms")
23
+ @click.option("--plan-ms", type=int, default=0, help="Planning latency ms")
24
+ @click.option("--ast-ratio", type=float, default=0.0, help="AST Hit Ratio")
25
+ @click.option("--ctx-eff", type=float, default=0.0, help="Context Efficiency")
26
+ @click.option("--rel-rate", type=float, default=0.0, help="Reliability Rate")
27
+ @click.option("--depth", type=int, default=0, help="Trajectory Depth")
28
+ @click.option("--retry", type=int, default=0, help="Retry count")
29
+ @click.option("--l7-ms", type=int, default=0, help="L7 Application Latency ms")
30
+ @click.option("--l4-ms", type=int, default=0, help="L4 Transport Latency ms")
31
+ @click.option("--l3-ms", type=int, default=0, help="L3 Network Latency ms")
32
+ @click.option("--l1-ms", type=int, default=0, help="L1/L2 Physical Latency ms")
33
+ @click.option("--in-tokens", type=int, default=0, help="Input Tokens")
34
+ @click.option("--out-tokens", type=int, default=0, help="Output Tokens")
35
+ @click.pass_obj
36
+ def ingest_telemetry(
37
+ client: ElasticsearchClient,
38
+ workload_reference: str,
39
+ exec_mins: float,
40
+ elastro_q_ms: int,
41
+ q2r_ms: int,
42
+ r2l_ms: int,
43
+ plan_ms: int,
44
+ ast_ratio: float,
45
+ ctx_eff: float,
46
+ rel_rate: float,
47
+ depth: int,
48
+ retry: int,
49
+ l7_ms: int,
50
+ l4_ms: int,
51
+ l3_ms: int,
52
+ l1_ms: int,
53
+ in_tokens: int,
54
+ out_tokens: int,
55
+ ) -> None:
56
+ """
57
+ Ingest standardized session telemetry into the deep analytics index.
58
+
59
+ This command enforces the schema for the Deep Agent Telemetry visualization,
60
+ submitting the performance vector into target index 'agent_telemetry_deep'.
61
+ """
62
+ index_name = "agent_telemetry_deep"
63
+ timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
64
+
65
+ payload = {
66
+ "timestamp": timestamp,
67
+ "workload_reference": workload_reference,
68
+ "execution_time_minutes": exec_mins,
69
+ "t_elastro_query_ms": elastro_q_ms,
70
+ "t_question_to_reasoning_ms": q2r_ms,
71
+ "t_reasoning_to_launch_ms": r2l_ms,
72
+ "t_planning_ms": plan_ms,
73
+ "ast_hit_ratio": ast_ratio,
74
+ "context_efficiency": ctx_eff,
75
+ "first_pass_reliability_rate": rel_rate,
76
+ "trajectory_depth": depth,
77
+ "retry_count": retry,
78
+ "osi_latency_breakdown": {
79
+ "l7_application_ms": l7_ms,
80
+ "l4_transport_ms": l4_ms,
81
+ "l3_network_ms": l3_ms,
82
+ "l2_l1_physical_ms": l1_ms,
83
+ },
84
+ "token_count_query": {"input_tokens": in_tokens, "output_tokens": out_tokens},
85
+ }
86
+
87
+ try:
88
+ response = client.client.index(index=index_name, document=payload)
89
+ click.secho(
90
+ f">> Sink execution complete for [{workload_reference}]. ID: {response.get('_id', 'unknown')}",
91
+ fg="green",
92
+ )
93
+ except Exception as e:
94
+ click.secho(f"Failed to ingest telemetry payload: {e}", fg="red", err=True)
95
+ import sys
96
+
97
+ sys.exit(1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: elastro-client
3
- Version: 1.3.39
3
+ Version: 1.3.41
4
4
  Summary: A comprehensive Python library for Elasticsearch management with both programmatic and CLI interfaces
5
5
  Author: Austin Jorgensen
6
6
  License-Expression: MIT
@@ -43,6 +43,7 @@ elastro/cli/commands/script.py
43
43
  elastro/cli/commands/security.py
44
44
  elastro/cli/commands/snapshot.py
45
45
  elastro/cli/commands/tasks.py
46
+ elastro/cli/commands/telemetry.py
46
47
  elastro/cli/commands/template.py
47
48
  elastro/cli/commands/utils.py
48
49
  elastro/config/__init__.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "elastro-client"
7
- version = "1.3.39"
7
+ version = "1.3.41"
8
8
  description = "A comprehensive Python library for Elasticsearch management with both programmatic and CLI interfaces"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9,<3.14"
File without changes