agent-cli 0.62.0__py3-none-any.whl → 0.64.0__py3-none-any.whl

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.
agent_cli/dev/cli.py CHANGED
@@ -344,6 +344,19 @@ def _launch_editor(path: Path, editor: Editor) -> None:
344
344
  _warn(f"Could not open editor: {e}")
345
345
 
346
346
 
347
+ def _write_prompt_to_worktree(worktree_path: Path, prompt: str) -> Path:
348
+ """Write the prompt to .claude/TASK.md in the worktree.
349
+
350
+ This makes the task description available to the spawned agent
351
+ and provides a record of what was requested.
352
+ """
353
+ claude_dir = worktree_path / ".claude"
354
+ claude_dir.mkdir(parents=True, exist_ok=True)
355
+ task_file = claude_dir / "TASK.md"
356
+ task_file.write_text(prompt + "\n")
357
+ return task_file
358
+
359
+
347
360
  def _format_env_prefix(env: dict[str, str]) -> str:
348
361
  """Format environment variables as shell prefix.
349
362
 
@@ -627,6 +640,11 @@ def new( # noqa: PLR0912, PLR0915
627
640
  # Only warn if user explicitly requested direnv
628
641
  _warn("direnv not installed, skipping .envrc setup")
629
642
 
643
+ # Write prompt to worktree (makes task available to the spawned agent)
644
+ if prompt:
645
+ task_file = _write_prompt_to_worktree(result.path, prompt)
646
+ _success(f"Wrote task to {task_file.relative_to(result.path)}")
647
+
630
648
  # Resolve editor and agent
631
649
  resolved_editor = _resolve_editor(editor, editor_name, default_editor)
632
650
  resolved_agent = _resolve_agent(agent, agent_name, default_agent)
@@ -1039,6 +1057,11 @@ def start_agent(
1039
1057
  if not agent.is_available():
1040
1058
  _error(f"{agent.name} is not installed. Install from: {agent.install_url}")
1041
1059
 
1060
+ # Write prompt to worktree (makes task available to the agent)
1061
+ if prompt:
1062
+ task_file = _write_prompt_to_worktree(wt.path, prompt)
1063
+ _success(f"Wrote task to {task_file.relative_to(wt.path)}")
1064
+
1042
1065
  merged_args = _merge_agent_args(agent, agent_args)
1043
1066
  agent_env = _get_agent_env(agent)
1044
1067
  _info(f"Starting {agent.name} in {wt.path}...")
@@ -47,8 +47,9 @@ agent-cli dev new <branch-name> --agent --prompt-file path/to/prompt.md
47
47
  This creates:
48
48
  1. A new git worktree with its own branch
49
49
  2. Runs project setup (installs dependencies)
50
- 3. Opens a new terminal tab with an AI coding agent
51
- 4. Passes your prompt to the agent
50
+ 3. Saves your prompt to `.claude/TASK.md` in the worktree (for reference)
51
+ 4. Opens a new terminal tab with an AI coding agent
52
+ 5. Passes your prompt to the agent
52
53
 
53
54
  **Important**: Use `--prompt-file` for prompts longer than a single line. The `--prompt` option passes text through the shell, which can cause issues with special characters (exclamation marks, dollar signs, backticks, quotes) in ZSH and other shells. Using `--prompt-file` avoids all shell quoting issues.
54
55
 
@@ -25,6 +25,7 @@ LOGGER = logging.getLogger(__name__)
25
25
 
26
26
  _DEFAULT_MMR_LAMBDA = 0.7
27
27
  _SUMMARY_ROLE = "summary"
28
+ _MIN_MAX_EPSILON = 1e-8 # Avoid division by zero in min-max normalization
28
29
 
29
30
 
30
31
  def gather_relevant_existing_memories(
@@ -135,7 +136,7 @@ def retrieve_memory(
135
136
  include_summary: bool = True,
136
137
  mmr_lambda: float = _DEFAULT_MMR_LAMBDA,
137
138
  recency_weight: float = 0.2,
138
- score_threshold: float = 0.35,
139
+ score_threshold: float | None = None,
139
140
  filters: dict[str, Any] | None = None,
140
141
  ) -> tuple[MemoryRetrieval, list[str]]:
141
142
  """Execute search + rerank + recency + MMR."""
@@ -161,8 +162,15 @@ def retrieve_memory(
161
162
  seen_ids.add(rec_id)
162
163
  raw_candidates.append(rec)
163
164
 
164
- def _sigmoid(x: float) -> float:
165
- return 1.0 / (1.0 + math.exp(-x))
165
+ def _min_max_normalize(scores: list[float]) -> list[float]:
166
+ """Normalize scores to 0-1 range using min-max scaling."""
167
+ if not scores:
168
+ return scores
169
+ min_score = min(scores)
170
+ max_score = max(scores)
171
+ if max_score - min_score < _MIN_MAX_EPSILON:
172
+ return [0.5] * len(scores) # All scores equal
173
+ return [(s - min_score) / (max_score - min_score) for s in scores]
166
174
 
167
175
  def recency_score(meta: MemoryMetadata) -> float:
168
176
  dt = datetime.fromisoformat(meta.created_at)
@@ -176,10 +184,12 @@ def retrieve_memory(
176
184
  if raw_candidates:
177
185
  pairs = [(query, mem.content) for mem in raw_candidates]
178
186
  rr_scores = predict_relevance(reranker_model, pairs)
179
- for mem, rr in zip(raw_candidates, rr_scores, strict=False):
180
- relevance = _sigmoid(rr)
181
- # Filter out low-relevance memories to reduce noise
182
- if relevance < score_threshold:
187
+ # Normalize raw reranker scores to 0-1 range
188
+ normalized_scores = _min_max_normalize(rr_scores)
189
+
190
+ for mem, relevance in zip(raw_candidates, normalized_scores, strict=False):
191
+ # Filter out low-relevance memories if threshold is set
192
+ if score_threshold is not None and relevance < score_threshold:
183
193
  continue
184
194
 
185
195
  recency = recency_score(mem.metadata)
@@ -235,7 +245,7 @@ async def augment_chat_request(
235
245
  include_global: bool = True,
236
246
  mmr_lambda: float = _DEFAULT_MMR_LAMBDA,
237
247
  recency_weight: float = 0.2,
238
- score_threshold: float = 0.35,
248
+ score_threshold: float | None = None,
239
249
  filters: dict[str, Any] | None = None,
240
250
  ) -> tuple[ChatRequest, MemoryRetrieval | None, str, list[str]]:
241
251
  """Retrieve memory context and augment the chat request."""
agent_cli/memory/api.py CHANGED
@@ -30,7 +30,7 @@ def create_app(
30
30
  max_entries: int = 500,
31
31
  mmr_lambda: float = 0.7,
32
32
  recency_weight: float = 0.2,
33
- score_threshold: float = 0.35,
33
+ score_threshold: float | None = None,
34
34
  enable_git_versioning: bool = True,
35
35
  ) -> FastAPI:
36
36
  """Create the FastAPI app for memory-backed chat."""
@@ -49,7 +49,7 @@ class MemoryClient:
49
49
  max_entries: int = 500,
50
50
  mmr_lambda: float = 0.7,
51
51
  recency_weight: float = 0.2,
52
- score_threshold: float = 0.35,
52
+ score_threshold: float | None = None,
53
53
  start_watcher: bool = False,
54
54
  enable_git_versioning: bool = True,
55
55
  ) -> None:
@@ -236,7 +236,7 @@ async def process_chat_request(
236
236
  max_entries: int = _DEFAULT_MAX_ENTRIES,
237
237
  mmr_lambda: float = _DEFAULT_MMR_LAMBDA,
238
238
  recency_weight: float = 0.2,
239
- score_threshold: float = 0.35,
239
+ score_threshold: float | None = None,
240
240
  postprocess_in_background: bool = True,
241
241
  enable_git_versioning: bool = False,
242
242
  filters: dict[str, Any] | None = None,
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env python3
2
+ """Check that plugin skill files are in sync with source files."""
3
+
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ SYNC_PAIRS = [
8
+ # Plugin marketplace distribution
9
+ ("agent_cli/dev/skill/SKILL.md", ".claude-plugin/skills/agent-cli-dev/SKILL.md"),
10
+ ("agent_cli/dev/skill/examples.md", ".claude-plugin/skills/agent-cli-dev/examples.md"),
11
+ # Project-local skill (for Claude Code working on this repo)
12
+ ("agent_cli/dev/skill/SKILL.md", ".claude/skills/agent-cli-dev/SKILL.md"),
13
+ ("agent_cli/dev/skill/examples.md", ".claude/skills/agent-cli-dev/examples.md"),
14
+ ]
15
+
16
+
17
+ def main() -> int:
18
+ """Check that plugin skill files match source files."""
19
+ root = Path(__file__).parent.parent
20
+ out_of_sync = []
21
+
22
+ for source, target in SYNC_PAIRS:
23
+ source_path = root / source
24
+ target_path = root / target
25
+
26
+ if not source_path.exists():
27
+ print(f"Source not found: {source}")
28
+ continue
29
+
30
+ if not target_path.exists():
31
+ out_of_sync.append((source, target, "target missing"))
32
+ continue
33
+
34
+ if source_path.read_text() != target_path.read_text():
35
+ out_of_sync.append((source, target, "content differs"))
36
+
37
+ if out_of_sync:
38
+ print("Plugin skill files are out of sync:")
39
+ for source, target, reason in out_of_sync:
40
+ print(f" {source} -> {target} ({reason})")
41
+ print("\nRun:")
42
+ print(" cp agent_cli/dev/skill/*.md .claude-plugin/skills/agent-cli-dev/")
43
+ print(" cp agent_cli/dev/skill/*.md .claude/skills/agent-cli-dev/")
44
+ return 1
45
+
46
+ return 0
47
+
48
+
49
+ if __name__ == "__main__":
50
+ sys.exit(main())
@@ -2,19 +2,18 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import io
6
5
  import logging
7
- import wave
8
6
  from functools import partial
9
7
  from typing import TYPE_CHECKING
10
8
 
11
9
  from wyoming.asr import Transcribe, Transcript
12
- from wyoming.audio import AudioChunk, AudioStop
10
+ from wyoming.audio import AudioChunk, AudioChunkConverter, AudioStop
13
11
  from wyoming.info import AsrModel, AsrProgram, Attribution, Describe, Info
14
12
  from wyoming.server import AsyncEventHandler, AsyncServer
15
13
 
16
- from agent_cli.server.common import setup_wav_file
14
+ from agent_cli import constants
17
15
  from agent_cli.server.whisper.languages import WHISPER_LANGUAGE_CODES
16
+ from agent_cli.services import pcm_to_wav
18
17
 
19
18
  if TYPE_CHECKING:
20
19
  from wyoming.event import Event
@@ -49,8 +48,12 @@ class WyomingWhisperHandler(AsyncEventHandler):
49
48
  """
50
49
  super().__init__(*args, **kwargs)
51
50
  self._registry = registry
52
- self._audio_buffer: io.BytesIO | None = None
53
- self._wav_file: wave.Wave_write | None = None
51
+ self._audio_bytes: bytes = b""
52
+ self._audio_converter = AudioChunkConverter(
53
+ rate=constants.AUDIO_RATE,
54
+ width=constants.AUDIO_FORMAT_WIDTH,
55
+ channels=constants.AUDIO_CHANNELS,
56
+ )
54
57
  self._language: str | None = None
55
58
  self._initial_prompt: str | None = None
56
59
 
@@ -80,39 +83,31 @@ class WyomingWhisperHandler(AsyncEventHandler):
80
83
 
81
84
  async def _handle_audio_chunk(self, event: Event) -> bool:
82
85
  """Handle an audio chunk event."""
83
- chunk = AudioChunk.from_event(event)
84
-
85
- if self._wav_file is None:
86
+ if not self._audio_bytes:
86
87
  logger.debug("AudioChunk begin")
87
- self._audio_buffer = io.BytesIO()
88
- self._wav_file = wave.open(self._audio_buffer, "wb") # noqa: SIM115
89
- setup_wav_file(
90
- self._wav_file,
91
- rate=chunk.rate,
92
- channels=chunk.channels,
93
- sample_width=chunk.width,
94
- )
95
88
 
96
- self._wav_file.writeframes(chunk.audio)
89
+ chunk = AudioChunk.from_event(event)
90
+ chunk = self._audio_converter.convert(chunk)
91
+ self._audio_bytes += chunk.audio
97
92
  return True
98
93
 
99
94
  async def _handle_audio_stop(self) -> bool:
100
95
  """Handle audio stop event - transcribe the collected audio."""
101
96
  logger.debug("AudioStop")
102
97
 
103
- if self._wav_file is None or self._audio_buffer is None:
98
+ if not self._audio_bytes:
104
99
  logger.warning("AudioStop received but no audio data")
105
100
  await self.write_event(Transcript(text="").event())
106
101
  return False
107
102
 
108
- # Close WAV file
109
- self._wav_file.close()
110
- self._wav_file = None
111
-
112
- # Get audio data
113
- self._audio_buffer.seek(0)
114
- audio_data = self._audio_buffer.read()
115
- self._audio_buffer = None
103
+ # Wrap PCM in WAV format for the backend
104
+ audio_data = pcm_to_wav(
105
+ self._audio_bytes,
106
+ sample_rate=constants.AUDIO_RATE,
107
+ sample_width=constants.AUDIO_FORMAT_WIDTH,
108
+ channels=constants.AUDIO_CHANNELS,
109
+ )
110
+ self._audio_bytes = b""
116
111
 
117
112
  # Transcribe
118
113
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-cli
3
- Version: 0.62.0
3
+ Version: 0.64.0
4
4
  Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
5
5
  Project-URL: Homepage, https://github.com/basnijholt/agent-cli
6
6
  Author-email: Bas Nijholt <bas@nijho.lt>
@@ -37,7 +37,7 @@ agent_cli/core/utils.py,sha256=MHttXeGiM9qGUNxK0s6vAHthh033TDjaruqocdtMMFY,16802
37
37
  agent_cli/core/vad.py,sha256=67-EBjY-pTOf61VhrjVdDXgaNIBwWFFFccYth_1rQmg,6569
38
38
  agent_cli/core/watch.py,sha256=MKgGxxMe0yLlu78-XXqO4ferCpu_ljNr4MAzOMDsuuo,1951
39
39
  agent_cli/dev/__init__.py,sha256=doTYiUFEBpnOxsQA69HQP9AA4QHBN0DjuHSTGRq5Xbg,551
40
- agent_cli/dev/cli.py,sha256=dQwLqrAwLUhg7iAFmlMfdMS60W-WjrWWDD01yxFqrpU,51223
40
+ agent_cli/dev/cli.py,sha256=KH5RYAwJLSArnXDrccDmFN7OV1C9kwLHwoHWIiJfCHQ,52120
41
41
  agent_cli/dev/project.py,sha256=wJMGKTK1rmw8letrV6l6wcLU1fkQQDjCSEixAnsvyaY,18971
42
42
  agent_cli/dev/registry.py,sha256=c6t3ClyRFPvU4GGXJT79-D-qV4FqY7W_7P-tLT7LKZs,1887
43
43
  agent_cli/dev/worktree.py,sha256=Yw8jlhkf8BeKFc6pPEazGXnUIvryvYwbUmYxTluXILs,26916
@@ -64,7 +64,7 @@ agent_cli/dev/editors/sublime.py,sha256=owEfRSMuArSeFKqk-LE2JOXaZy5QlQfHQ-l0I4k2
64
64
  agent_cli/dev/editors/vim.py,sha256=Fo-IQMPVbIiwBdOfmkFxR37f96QW6xc5LV3Pvr3u-b0,1378
65
65
  agent_cli/dev/editors/vscode.py,sha256=GOrl4FwVdDyuSn7t4lglgnVt_T6NtpjLVh1OWBxDMwE,318
66
66
  agent_cli/dev/editors/zed.py,sha256=lRMhdN_SKmHBA1ulx8x-p7Th_0EGSIv6ppAE84xobU4,515
67
- agent_cli/dev/skill/SKILL.md,sha256=Guod9r9in3FFmYeUoXbLCosP3JtnOzssjnJ75NacadU,4347
67
+ agent_cli/dev/skill/SKILL.md,sha256=r_QoJR5VLrsI7h-oopfJ8o89oWM43EHgy8IYYa52q9c,4421
68
68
  agent_cli/dev/skill/examples.md,sha256=ZzCyfudBk4lMR-sz8ER9l5vi6hI3HTeUlvQorRFVol4,16405
69
69
  agent_cli/dev/terminals/__init__.py,sha256=yUTNtvs1Do2hvhx56XxyfI-5HA5mjiv0IbJuuaL9TeE,371
70
70
  agent_cli/dev/terminals/apple_terminal.py,sha256=s7GdxXPgbpSLKK1DUwjNpshQpjR5Nt1QbL_cKPefIRI,2595
@@ -88,13 +88,13 @@ agent_cli/memory/_indexer.py,sha256=iWIRG61g2O4_cUjJYDXe03hkpRO5kVAqOwDeCb7Efu0,
88
88
  agent_cli/memory/_ingest.py,sha256=_WeFLTxrlWKFpyB1KR0tUWLgEq-eevB8ytAgpq6BOlY,13649
89
89
  agent_cli/memory/_persistence.py,sha256=7TsphuYsJfJbp-294IvWmtW98G_Sag9GTm8AUGU9dtQ,5401
90
90
  agent_cli/memory/_prompt.py,sha256=ncvYM5ewLrYRP8KizdFHtPQl2cWYg0SW0VQxA8rz_9E,4667
91
- agent_cli/memory/_retrieval.py,sha256=szQxy1OyjetyvidUsyyijtOiYEXFk21rvBpses9r3Po,9211
91
+ agent_cli/memory/_retrieval.py,sha256=K_2TUcgzfntBARPyf0K6VR3NIgHHJrqGFMP_53Nae_w,9778
92
92
  agent_cli/memory/_store.py,sha256=m9mD1GxjdTXpnyL-X-MIU4cj28unqxJ_azV3kwM8blM,5086
93
93
  agent_cli/memory/_streaming.py,sha256=-WlOPtH61ogCSJKQRpfYHp2gBgIIN6hIJqb5padjmpw,1379
94
94
  agent_cli/memory/_tasks.py,sha256=XgEkN_3NCVQDWafZ_rqazpAE68yQ87x-amnQKMkfPXg,1469
95
- agent_cli/memory/api.py,sha256=sRLvidQeg-ooxHIDHvYkkbGof-CLKvMXjdviyRU12Do,3588
96
- agent_cli/memory/client.py,sha256=QWzY562nLr0OlpOW2vaArzALMWLxy-vv6H-DJgJ08n0,9987
97
- agent_cli/memory/engine.py,sha256=V6QURnnKvvAN4hW8tuGkbgLaMbo4NB7_jdpZg0mC6n0,11649
95
+ agent_cli/memory/api.py,sha256=riaGTOIw7g3KuDNcPtDy9wO44-D1wDtVadRj3RTT10k,3595
96
+ agent_cli/memory/client.py,sha256=XomHhP-hPSoosORkBKSY1dW3gjheFEVqAac0b-tAULo,9994
97
+ agent_cli/memory/engine.py,sha256=rABVC86b5wU1QxY3BM43RhvfDOxoRT7Ddm98BN_qCL4,11656
98
98
  agent_cli/memory/entities.py,sha256=_8wyJz--tNa66CEtSpl2TUN_zeHQvMzm42htnDaOr6g,1219
99
99
  agent_cli/memory/models.py,sha256=KK0wToEf-tXssYVL0hYaJlcADlJ3G2lcSXwo1UmA0VU,2352
100
100
  agent_cli/rag/__init__.py,sha256=suQDSGBUlt4_KNxz2CyVqrJw58e64T3ltfmmg2F8iQY,543
@@ -109,6 +109,7 @@ agent_cli/rag/client.py,sha256=mFiZ4yjI75Vsehie6alsV1My50uIsp-G07Qz6SaNrZw,8913
109
109
  agent_cli/rag/engine.py,sha256=XySDer0fNTsEUjbUby5yf7JqB7uCE7tw2A6tYJixHnI,9800
110
110
  agent_cli/rag/models.py,sha256=uECWoeBChlkAK7uTM-pUnPGaaMO4EYJ3pJcAf8uh1vI,1043
111
111
  agent_cli/scripts/__init__.py,sha256=QvI1gnTagN85mmKDy2IRw96MEU9DKRWKkhSKSBshGVY,78
112
+ agent_cli/scripts/check_plugin_skill_sync.py,sha256=abuiSjvj34mazYeKOG-Mw6y14uN_1Ie8dkcCs_M_RF0,1656
112
113
  agent_cli/scripts/run-openwakeword.sh,sha256=jXZ3hegiL5TINFttvOPnnfDWuIR6x8Mv_pAEWij7Z08,446
113
114
  agent_cli/scripts/run-piper-windows.ps1,sha256=jpy4-3NxCoBpT3mnNbmCCSGbahjbv34KozlQ3lCDpV4,1134
114
115
  agent_cli/scripts/run-piper.sh,sha256=MAI1yTnmcn3z-t7UWwK5oSvpr9KNgh6Z2h7ns_dbYNc,877
@@ -161,7 +162,7 @@ agent_cli/server/whisper/api.py,sha256=_2z04tUfuQ6QnKMaZnikb5Ji7LbtCfKYs42MG6v-Q
161
162
  agent_cli/server/whisper/languages.py,sha256=Tv3qsIOSQQLxw-v5Wy41jSS6uHG_YBiG-T2uJVVt3u0,2686
162
163
  agent_cli/server/whisper/model_manager.py,sha256=LI92mkueu8o8m6AhzlUaaIWygnZucJa295-j7ymx7Ss,4925
163
164
  agent_cli/server/whisper/model_registry.py,sha256=qoRkB0ex6aRtUlsUN5BGik-oIZlwJbVHGQKaCbf_yVg,789
164
- agent_cli/server/whisper/wyoming_handler.py,sha256=bX0nYeSKFuyccVyNj0034QNuWJvAS1r7XMopiFK72X4,6712
165
+ agent_cli/server/whisper/wyoming_handler.py,sha256=HjN565YfDHeVfaGjQfoy9xjCZPx_TvYvjRYgbKn3aOI,6634
165
166
  agent_cli/server/whisper/backends/__init__.py,sha256=DfgyigwMLKiSfaRzZ1TTeV7fa9HWSmT1UJnJa-6el7k,2338
166
167
  agent_cli/server/whisper/backends/base.py,sha256=gQi5EyMCFS464mKXGIKbh1vgtBm99eNkf93SCIYRYg0,2597
167
168
  agent_cli/server/whisper/backends/faster_whisper.py,sha256=-BogM_-_rhlXKUZuW1qUN8zw2gD0ut1bJozPDP19knA,6717
@@ -172,8 +173,8 @@ agent_cli/services/asr.py,sha256=V6SV-USnMhK-0aE-pneiktU4HpmLqenmMb-jZ-_74zU,169
172
173
  agent_cli/services/llm.py,sha256=Kwdo6pbMYI9oykF-RBe1iaL3KsYrNWTLdRSioewmsGQ,7199
173
174
  agent_cli/services/tts.py,sha256=exKo-55_670mx8dQOzVSZkv6aWYLv04SVmBcjOlD458,14772
174
175
  agent_cli/services/wake_word.py,sha256=j6Z8rsGq_vAdRevy9fkXIgLZd9UWfrIsefmTreNmM0c,4575
175
- agent_cli-0.62.0.dist-info/METADATA,sha256=9NRk688EZxkuThkRJOahxw-ZH6Y2yQsVHuYMpK5Qm2A,151909
176
- agent_cli-0.62.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
177
- agent_cli-0.62.0.dist-info/entry_points.txt,sha256=FUv-fB2atLsPUk_RT4zqnZl1coz4_XHFwRALOKOF38s,97
178
- agent_cli-0.62.0.dist-info/licenses/LICENSE,sha256=majJU6S9kC8R8bW39NVBHyv32Dq50FL6TDxECG2WVts,1068
179
- agent_cli-0.62.0.dist-info/RECORD,,
176
+ agent_cli-0.64.0.dist-info/METADATA,sha256=WqgllIIkSkpdrweYCTidamE3s_F0eCLPLknMCM6Bj48,151909
177
+ agent_cli-0.64.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
178
+ agent_cli-0.64.0.dist-info/entry_points.txt,sha256=FUv-fB2atLsPUk_RT4zqnZl1coz4_XHFwRALOKOF38s,97
179
+ agent_cli-0.64.0.dist-info/licenses/LICENSE,sha256=majJU6S9kC8R8bW39NVBHyv32Dq50FL6TDxECG2WVts,1068
180
+ agent_cli-0.64.0.dist-info/RECORD,,