kash-shell 0.3.30__py3-none-any.whl → 0.3.34__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.
Files changed (33) hide show
  1. kash/actions/core/chat.py +1 -0
  2. kash/actions/core/markdownify_html.py +1 -1
  3. kash/actions/core/readability.py +1 -4
  4. kash/actions/core/render_as_html.py +1 -0
  5. kash/actions/core/show_webpage.py +2 -0
  6. kash/actions/core/summarize_as_bullets.py +1 -1
  7. kash/config/logger.py +1 -1
  8. kash/config/text_styles.py +1 -1
  9. kash/docs/markdown/topics/a2_installation.md +3 -2
  10. kash/exec/action_decorators.py +5 -3
  11. kash/exec/action_exec.py +50 -5
  12. kash/exec/fetch_url_items.py +4 -2
  13. kash/exec/llm_transforms.py +14 -5
  14. kash/exec/runtime_settings.py +2 -0
  15. kash/file_storage/file_store.py +50 -92
  16. kash/file_storage/item_id_index.py +128 -0
  17. kash/mcp/mcp_server_routes.py +42 -12
  18. kash/model/actions_model.py +18 -7
  19. kash/model/exec_model.py +3 -0
  20. kash/model/items_model.py +54 -12
  21. kash/utils/api_utils/gather_limited.py +2 -0
  22. kash/utils/api_utils/multitask_gather.py +134 -0
  23. kash/utils/common/s3_utils.py +108 -0
  24. kash/utils/common/url.py +16 -4
  25. kash/utils/rich_custom/multitask_status.py +84 -10
  26. kash/utils/text_handling/markdown_footnotes.py +16 -43
  27. kash/utils/text_handling/markdown_utils.py +108 -28
  28. kash/web_content/web_fetch.py +2 -1
  29. {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/METADATA +5 -5
  30. {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/RECORD +33 -30
  31. {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/WHEEL +0 -0
  32. {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/entry_points.txt +0 -0
  33. {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/licenses/LICENSE +0 -0
@@ -26,10 +26,48 @@ MARKDOWN_ESCAPE_CHARS = r"([\\`*_{}\[\]()#+.!-])"
26
26
  MARKDOWN_ESCAPE_RE = re.compile(MARKDOWN_ESCAPE_CHARS)
27
27
 
28
28
  # Use flowmark for Markdown parsing and rendering.
29
- # Replaces the single shard marko Markdown object.
29
+ # This replaces the single shared Markdown object that marko offers.
30
30
  MARKDOWN = flowmark_markdown(line_wrap_by_sentence(is_markdown=True))
31
31
 
32
32
 
33
+ # Regex for a markdown footnote definition line: "[^id]: ..."
34
+ FOOTNOTE_DEF_RE = re.compile(r"^\[\^[^\]]+\]:")
35
+
36
+
37
+ def normalize_footnotes_in_markdown(content: str) -> str:
38
+ """
39
+ Ensure blank lines between consecutive footnote definitions.
40
+
41
+ Some markdown parsers (marko) merge consecutive footnotes without blank
42
+ lines into a single definition. This adds blank lines where needed.
43
+ """
44
+ lines = content.split("\n")
45
+ result: list[str] = []
46
+ i = 0
47
+
48
+ while i < len(lines):
49
+ line = lines[i]
50
+ result.append(line)
51
+
52
+ # Check if this is a footnote definition
53
+ if FOOTNOTE_DEF_RE.match(line):
54
+ # Look ahead to see if the next non-empty line is also a footnote
55
+ j = i + 1
56
+ while j < len(lines) and not lines[j].strip():
57
+ result.append(lines[j])
58
+ j += 1
59
+
60
+ if j < len(lines) and FOOTNOTE_DEF_RE.match(lines[j]):
61
+ # Next non-empty line is also a footnote, add blank line
62
+ result.append("")
63
+
64
+ i = j
65
+ else:
66
+ i += 1
67
+
68
+ return "\n".join(result)
69
+
70
+
33
71
  def escape_markdown(text: str) -> str:
34
72
  """
35
73
  Escape characters with special meaning in Markdown.
@@ -87,42 +125,49 @@ def comprehensive_transform_tree(element: Any, transformer: Callable[[Any], None
87
125
  comprehensive_transform_tree(child, transformer)
88
126
 
89
127
 
90
- def _tree_links(element, include_internal=False):
91
- links = []
128
+ def _tree_links(element, include_internal=False) -> list[str]:
129
+ links: list[str] = []
92
130
 
93
131
  def _find_links(element):
94
132
  if isinstance(element, (Link, AutoLink)):
95
133
  if include_internal or not element.dest.startswith("#"):
134
+ assert isinstance(element.dest, str)
96
135
  links.append(element.dest)
97
136
 
98
137
  comprehensive_transform_tree(element, _find_links)
99
138
  return links
100
139
 
101
140
 
102
- def extract_links(content: str, include_internal=False) -> list[str]:
141
+ # TODO: Marko seems to include trailing parentheses on bare links.
142
+ # Fix this in flowmark
143
+ def _fix_link(url: str) -> str:
144
+ return url.rstrip(")")
145
+
146
+
147
+ def extract_urls(content: str, include_internal=False) -> list[Url]:
103
148
  """
104
- Extract all links from Markdown content. Deduplicates and
105
- preserves order.
149
+ Extract all URLs from Markdown content. Deduplicates and preserves order.
106
150
 
107
151
  Raises:
108
152
  marko.ParseError: If the markdown content contains invalid syntax that cannot be parsed.
109
153
  """
154
+ content = normalize_footnotes_in_markdown(content)
110
155
  document = MARKDOWN.parse(content)
111
156
  all_links = _tree_links(document, include_internal)
112
157
 
113
158
  # Deduplicate while preserving order
114
159
  seen: dict[str, None] = {}
115
- result = []
160
+ result: list[Url] = []
116
161
  for link in all_links:
117
162
  if link not in seen:
118
163
  seen[link] = None
119
- result.append(link)
164
+ result.append(Url(_fix_link(link)))
120
165
  return result
121
166
 
122
167
 
123
- def extract_file_links(file_path: Path, include_internal=False) -> list[str]:
168
+ def extract_file_urls(file_path: Path, include_internal=False) -> list[Url]:
124
169
  """
125
- Extract all links from a Markdown file. Future: Include textual and section context.
170
+ Extract all URLs from a Markdown file. Future: Include textual and section context.
126
171
 
127
172
  Returns an empty list if there are parsing errors.
128
173
  """
@@ -130,7 +175,7 @@ def extract_file_links(file_path: Path, include_internal=False) -> list[str]:
130
175
 
131
176
  try:
132
177
  content = file_path.read_text()
133
- return extract_links(content, include_internal)
178
+ return extract_urls(content, include_internal)
134
179
  except Exception as e:
135
180
  logging.warning(f"Failed to extract links from {file_path}: {e}")
136
181
  return []
@@ -156,6 +201,7 @@ def rewrite_urls(
156
201
  Raises:
157
202
  marko.ParseError: If the markdown content contains invalid syntax that cannot be parsed.
158
203
  """
204
+ content = normalize_footnotes_in_markdown(content)
159
205
  document = MARKDOWN.parse(content)
160
206
  _rewrite_tree_urls(document, url_rewriter, element_types)
161
207
 
@@ -232,6 +278,7 @@ def extract_first_header(content: str) -> str | None:
232
278
  Raises:
233
279
  marko.ParseError: If the markdown content contains invalid syntax that cannot be parsed.
234
280
  """
281
+ content = normalize_footnotes_in_markdown(content)
235
282
  document = MARKDOWN.parse(content)
236
283
 
237
284
  if document.children and isinstance(document.children[0], Heading):
@@ -282,18 +329,25 @@ def _extract_list_item_markdown(element: Any) -> str:
282
329
  return ""
283
330
 
284
331
 
285
- def extract_bullet_points(content: str, *, strict: bool = False) -> list[str]:
332
+ def extract_bullet_points(
333
+ content: str, *, strict: bool = False, allow_paragraphs: bool = False
334
+ ) -> list[str]:
286
335
  """
287
336
  Extract list item values from a Markdown file, preserving all original formatting.
288
337
 
289
338
  If no bullet points are found and `strict` is False, returns the entire content
290
339
  as a single item (treating plain text as if it were the first bullet point).
340
+
291
341
  If `strict` is True, only actual list items are returned.
292
342
 
343
+ If `allow_paragraphs` is True, if the content contains multiple paragraphs and no
344
+ bullet points are found, return the paragraphs as separate items.
345
+
293
346
  Raises:
294
347
  ValueError: If `strict` is True and no bullet points are found.
295
348
  marko.ParseError: If the markdown content contains invalid syntax that cannot be parsed.
296
349
  """
350
+ content = normalize_footnotes_in_markdown(content)
297
351
  document = MARKDOWN.parse(content)
298
352
  bullet_points: list[str] = []
299
353
 
@@ -308,6 +362,8 @@ def extract_bullet_points(content: str, *, strict: bool = False) -> list[str]:
308
362
  if not bullet_points:
309
363
  if strict:
310
364
  raise ValueError("No bullet points found in content")
365
+ elif allow_paragraphs and "\n\n" in content:
366
+ return [p.strip() for p in content.split("\n\n")]
311
367
  elif content.strip():
312
368
  # Not strict mode, treat as plain text
313
369
  return [content.strip()]
@@ -372,6 +428,7 @@ def extract_headings(text: str) -> list[tuple[HTag, str]]:
372
428
  marko.ParseError: If the markdown content contains invalid syntax that cannot be parsed.
373
429
  ValueError: If a heading with an unsupported level is encountered.
374
430
  """
431
+ text = normalize_footnotes_in_markdown(text)
375
432
  document = MARKDOWN.parse(text)
376
433
  headings_list: list[tuple[HTag, str]] = []
377
434
 
@@ -788,7 +845,7 @@ def test_markdown_utils_exceptions() -> None:
788
845
  import tempfile
789
846
 
790
847
  # Test extract_file_links with non-existent file
791
- result = extract_file_links(Path("/non/existent/file.md"))
848
+ result = extract_file_urls(Path("/non/existent/file.md"))
792
849
  assert result == [] # Should return empty list for any error
793
850
 
794
851
  # Test extract_file_links with empty file (should work fine)
@@ -797,7 +854,7 @@ def test_markdown_utils_exceptions() -> None:
797
854
  tmp_path = Path(tmp.name)
798
855
 
799
856
  try:
800
- result = extract_file_links(tmp_path)
857
+ result = extract_file_urls(tmp_path)
801
858
  assert result == [] # Empty file has no links
802
859
  finally:
803
860
  tmp_path.unlink()
@@ -808,7 +865,7 @@ def test_markdown_utils_exceptions() -> None:
808
865
  tmp_path = Path(tmp.name)
809
866
 
810
867
  try:
811
- result = extract_file_links(tmp_path)
868
+ result = extract_file_urls(tmp_path)
812
869
  # Should still work - marko is very permissive with markdown
813
870
  assert isinstance(result, list)
814
871
  finally:
@@ -816,11 +873,11 @@ def test_markdown_utils_exceptions() -> None:
816
873
 
817
874
  # Test extract_links with string content
818
875
  content = "Check out [this link](https://example.com) and [internal](#section)"
819
- result = extract_links(content)
876
+ result = extract_urls(content)
820
877
  assert "https://example.com" in result
821
878
  assert "#section" not in result # Internal links excluded by default
822
879
 
823
- result_with_internal = extract_links(content, include_internal=True)
880
+ result_with_internal = extract_urls(content, include_internal=True)
824
881
  assert "https://example.com" in result_with_internal
825
882
  assert "#section" in result_with_internal
826
883
 
@@ -830,21 +887,21 @@ def test_extract_links_comprehensive() -> None:
830
887
 
831
888
  # Test regular markdown links
832
889
  regular_links = "Check out [this link](https://example.com) and [another](https://test.com)"
833
- result = extract_links(regular_links)
890
+ result = extract_urls(regular_links)
834
891
  assert "https://example.com" in result
835
892
  assert "https://test.com" in result
836
893
  assert len(result) == 2
837
894
 
838
895
  # Test bare/autolinks in angle brackets
839
896
  bare_links = "Visit <https://google.com> and also <https://github.com>"
840
- result_bare = extract_links(bare_links)
897
+ result_bare = extract_urls(bare_links)
841
898
  assert "https://google.com" in result_bare
842
899
  assert "https://github.com" in result_bare
843
900
  assert len(result_bare) == 2
844
901
 
845
902
  # Test autolinks without brackets (GFM extension enables auto-linking of plain URLs)
846
903
  auto_links = "Visit https://stackoverflow.com or http://reddit.com"
847
- result_auto = extract_links(auto_links)
904
+ result_auto = extract_urls(auto_links)
848
905
  assert "https://stackoverflow.com" in result_auto
849
906
  assert "http://reddit.com" in result_auto
850
907
  assert len(result_auto) == 2 # GFM auto-links plain URLs
@@ -855,7 +912,7 @@ def test_extract_links_comprehensive() -> None:
855
912
  - The Ko-Op, accessed June 28, 2025,
856
913
  <https://psychedelictherapists.co/blog/the-future-of-ketamine-assisted-psychotherapy/>
857
914
  """
858
- result_footnote = extract_links(footnote_content)
915
+ result_footnote = extract_urls(footnote_content)
859
916
  assert (
860
917
  "https://psychedelictherapists.co/blog/the-future-of-ketamine-assisted-psychotherapy/"
861
918
  in result_footnote
@@ -873,7 +930,7 @@ Auto link: https://auto-link.com
873
930
  [^1]: Footnote with [regular link](https://footnote-regular.com)
874
931
  [^2]: Footnote with bare link <https://footnote-bare.com>
875
932
  """
876
- result_mixed = extract_links(mixed_content)
933
+ result_mixed = extract_urls(mixed_content)
877
934
  expected_links = [
878
935
  "https://example.com", # Regular link
879
936
  "https://bare-link.com", # Bare link
@@ -889,7 +946,7 @@ Auto link: https://auto-link.com
889
946
  def test_extract_bare_links() -> None:
890
947
  """Test extraction of bare links in angle brackets."""
891
948
  content = "Visit <https://example.com> and <https://github.com/user/repo> for more info"
892
- result = extract_links(content)
949
+ result = extract_urls(content)
893
950
  assert "https://example.com" in result
894
951
  assert "https://github.com/user/repo" in result
895
952
  assert len(result) == 2
@@ -902,7 +959,7 @@ def test_extract_footnote_links() -> None:
902
959
 
903
960
  [^1]: This footnote has a [regular link](https://example.com) and <https://bare-link.com>
904
961
  """)
905
- result = extract_links(content)
962
+ result = extract_urls(content)
906
963
  assert "https://example.com" in result
907
964
  assert "https://bare-link.com" in result
908
965
  assert len(result) == 2
@@ -916,7 +973,7 @@ def test_extract_reference_style_links() -> None:
916
973
  [ref1]: https://example.com/article1
917
974
  [ref2]: https://example.com/article2
918
975
  """)
919
- result = extract_links(content)
976
+ result = extract_urls(content)
920
977
  assert "https://example.com/article1" in result
921
978
  assert "https://example.com/article2" in result
922
979
  assert len(result) == 2
@@ -931,14 +988,14 @@ def test_extract_links_and_dups() -> None:
931
988
  """)
932
989
 
933
990
  # Default behavior: exclude internal links
934
- result = extract_links(content)
991
+ result = extract_urls(content)
935
992
  assert "https://example.com" in result
936
993
  assert "#introduction" not in result
937
994
  assert "#conclusion" not in result
938
995
  assert len(result) == 1
939
996
 
940
997
  # Include internal links
941
- result_with_internal = extract_links(content, include_internal=True)
998
+ result_with_internal = extract_urls(content, include_internal=True)
942
999
  assert "https://example.com" in result_with_internal
943
1000
  assert "#introduction" in result_with_internal
944
1001
  assert "#conclusion" in result_with_internal
@@ -966,7 +1023,7 @@ def test_extract_links_mixed_real_world() -> None:
966
1023
  <https://psychedelictherapists.co/blog/the-future-of-ketamine-assisted-psychotherapy/>
967
1024
  """)
968
1025
 
969
- result = extract_links(content)
1026
+ result = extract_urls(content)
970
1027
  expected_links = [
971
1028
  "https://pubmed.ncbi.nlm.nih.gov",
972
1029
  "https://scholar.google.com",
@@ -1369,3 +1426,26 @@ def test_rewrite_urls_simplified_api() -> None:
1369
1426
  # Verify that relative URLs in angle brackets remain unchanged
1370
1427
  # (marko doesn't parse them as URL elements)
1371
1428
  assert "<./contact.html>" in result
1429
+
1430
+
1431
+ def test_extract_links_parentheses_adjacent() -> None:
1432
+ """URLs adjacent to closing parentheses should not include the parenthesis."""
1433
+ content = dedent(
1434
+ """
1435
+ [^res1]: Under 50 U.S.C. § 4531(c)(3), amounts in the Defense Production Act Fund (used
1436
+ for Title III) “shall remain available until expended,” meaning they do not expire
1437
+ at the end of a fiscal year (law text:
1438
+ https://www.law.cornell.edu/uscode/text/50/4531).
1439
+
1440
+ [^res2]: USAspending.gov’s federal account 097-0801 (Defense Production Act Purchases,
1441
+ Defense) provides official figures for obligations and unobligated balances by
1442
+ fiscal year drawn from Treasury data (https://www.usaspending.gov/account/097-0801).
1443
+ """
1444
+ )
1445
+
1446
+ links = extract_urls(content)
1447
+ assert "https://www.law.cornell.edu/uscode/text/50/4531" in links
1448
+ assert "https://www.law.cornell.edu/uscode/text/50/4531)" not in links
1449
+
1450
+ assert "https://www.usaspending.gov/account/097-0801" in links
1451
+ assert "https://www.usaspending.gov/account/097-0801)" not in links
@@ -293,7 +293,8 @@ def download_url(
293
293
 
294
294
  s3 = boto3.resource("s3")
295
295
  s3_path = parsed_url.path.lstrip("/")
296
- s3.Bucket(parsed_url.netloc).download_file(s3_path, target_filename)
296
+ with atomic_output_file(target_filename, make_parents=True) as temp_filename:
297
+ s3.Bucket(parsed_url.netloc).download_file(s3_path, temp_filename)
297
298
  return None
298
299
 
299
300
  req_headers = _get_req_headers(mode, headers)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kash-shell
3
- Version: 0.3.30
3
+ Version: 0.3.34
4
4
  Summary: The knowledge agent shell (core)
5
5
  Project-URL: Repository, https://github.com/jlevy/kash-shell
6
6
  Author-email: Joshua Levy <joshua@cal.berkeley.edu>
@@ -20,7 +20,7 @@ Requires-Dist: aiolimiter>=1.2.1
20
20
  Requires-Dist: anyio>=4.8.0
21
21
  Requires-Dist: audioop-lts>=0.2.1; python_version >= '3.13'
22
22
  Requires-Dist: cachetools>=5.5.2
23
- Requires-Dist: chopdiff>=0.2.5
23
+ Requires-Dist: chopdiff>=0.2.6
24
24
  Requires-Dist: clideps>=0.1.4
25
25
  Requires-Dist: colour>=0.1.5
26
26
  Requires-Dist: cssselect>=1.2.0
@@ -41,7 +41,7 @@ Requires-Dist: litellm>=1.74.15.post1
41
41
  Requires-Dist: markdownify>=0.13.1
42
42
  Requires-Dist: mcp-proxy>=0.5.0
43
43
  Requires-Dist: mcp>=1.6.0
44
- Requires-Dist: openai>=1.66.3
44
+ Requires-Dist: openai==1.99.9
45
45
  Requires-Dist: pandas>=2.2.3
46
46
  Requires-Dist: patch-ng>=1.18.1
47
47
  Requires-Dist: pathspec>=0.12.1
@@ -280,8 +280,8 @@ These are for `kash-media` but you can use a `kash-shell` for a more basic setup
280
280
 
281
281
  ```shell
282
282
  sudo apt-get update
283
- sudo apt-get install -y libgl1 ffmpeg libmagic-dev
284
- # For the additional command-line tools, pixi is better on Ubuntu:
283
+ sudo apt-get install -y libgl1 ffmpeg libmagic-dev imagemagick bat ripgrep hexyl
284
+ # Or for more additional command-line tools, pixi is better on Ubuntu:
285
285
  curl -fsSL https://pixi.sh/install.sh | sh
286
286
  . ~/.bashrc
287
287
  pixi global install ripgrep bat eza hexyl imagemagick zoxide
@@ -2,18 +2,18 @@ kash/__init__.py,sha256=hplHtnRqt1MpGIgKv3WZb9YoCoMPGtnNGtu8Eb9G6zI,110
2
2
  kash/__main__.py,sha256=83JiHvCNK7BAwEkaTD0kVekj7PEMucvCyquSl4p-1QA,78
3
3
  kash/actions/__init__.py,sha256=t3navovxzBkHxx0tQv7-97mXKl_kZmmXAIWszEeU77U,2725
4
4
  kash/actions/core/assistant_chat.py,sha256=28G20cSr7Z94cltouTPve5TXY3km0lACrRvpLE27fK8,1837
5
- kash/actions/core/chat.py,sha256=yCannBFa0cSpR_in-XSSuMm1x2ZZQUCKmlqzhsUfpOo,2696
5
+ kash/actions/core/chat.py,sha256=9_xh9cWwXjkC_SYme-ScOg6Miqeydv15ccrwHqQvgq8,2727
6
6
  kash/actions/core/combine_docs.py,sha256=5bTU7n_ICavvTXfC7fs5BDMeZYn7Xh5FkU7DVQqDHAQ,1536
7
7
  kash/actions/core/concat_docs.py,sha256=Umx3VzFiHJGY-76AEs4ju_1HnB9SbQsBux03Mkeig24,1345
8
8
  kash/actions/core/format_markdown_template.py,sha256=ZJbtyTSypPo2ewLiGRSyIpVf711vQMhI_-Ng-FgCs80,2991
9
- kash/actions/core/markdownify_html.py,sha256=3no9UkI6YT9FdiDmwUCG1CdeCanO0jHa9zWzfk-adro,1733
9
+ kash/actions/core/markdownify_html.py,sha256=Oqpq9b9JgMItOwJwbC5b5rG8UR0pXhxernjsdHyVB-o,1749
10
10
  kash/actions/core/minify_html.py,sha256=TRhyn7Gvcowou8pzq9vzDTtcCFOA4eC5217pJ9rPuOw,1386
11
- kash/actions/core/readability.py,sha256=ljdB2rOpzfKU2FpEJ2UELIzcdOAWvdUjFsxoHRTE3xo,989
12
- kash/actions/core/render_as_html.py,sha256=AtPZrNBByQHFnmOD77DqGjslOy2NR7Zp7NOZ99nfMmU,1870
11
+ kash/actions/core/readability.py,sha256=P1whiDanaAKTPw2KwHG15QNcjHzwpuTWne0s4LyUfuQ,990
12
+ kash/actions/core/render_as_html.py,sha256=i0WgtDgEJAeTTpVLS_CxDloDCb1Mhkzrcvv0VmoOyQ8,1901
13
13
  kash/actions/core/save_sidematter_meta.py,sha256=fKLE5eWIorOdw_FW46AUivXACQ6cxWvKWllcEjT6mz8,1440
14
- kash/actions/core/show_webpage.py,sha256=Ggba9jkx9U-FZOcuL0lkS-SwtPNUyxVsGdeQrqwWs1s,887
14
+ kash/actions/core/show_webpage.py,sha256=2A8u29Wf-iWNbPRfnz7u6MUhcXk_b8B8ruUT825d_mA,978
15
15
  kash/actions/core/strip_html.py,sha256=FDLN_4CKB11q5cU4NixTf7PGrAq92AjQNbKAdvQDwCY,849
16
- kash/actions/core/summarize_as_bullets.py,sha256=Zwr8lNzL77pwpnW_289LQjNBijNDpTPANfFdOJA-PZ4,2070
16
+ kash/actions/core/summarize_as_bullets.py,sha256=bzEH43BwwdqMJCt6m01iIME8sfmVPylBtF1PNbDdrBw,2055
17
17
  kash/actions/core/tabbed_webpage_config.py,sha256=rIbzEhBTmnkbSiRZC-Rj46T1J6c0jOztiKE9Usa4nsc,980
18
18
  kash/actions/core/tabbed_webpage_generate.py,sha256=935HkDSuP4eZ1e0xf-LhjPOdicU3wI5Kuh79r61QCl8,988
19
19
  kash/actions/core/zip_sidematter.py,sha256=E7ae0g9Bz7uXApYdNY-a8GvSIIPoqXcD95mjMaKQlsM,1557
@@ -46,14 +46,14 @@ kash/config/colors.py,sha256=cV3LRBegDZxZXjV-XEjc3fystFY_defhz1LN8QPdaKc,13727
46
46
  kash/config/env_settings.py,sha256=uhCdfs9-TzJ15SzbuIQP1yIORaLUqYXCxh9qq_Z8cJc,996
47
47
  kash/config/init.py,sha256=aE4sZ6DggBmmoZEx9C5mQKrEbcDiswX--HF7pfCFKzc,526
48
48
  kash/config/lazy_imports.py,sha256=MCZXLnKvNyfHi0k7MU5rNwcdJtUF28naCixuogsAOAA,805
49
- kash/config/logger.py,sha256=5_1ePJwfwIifoYQ_OWYIxTe2AM0XdmDUe4JXkH52bpg,12190
49
+ kash/config/logger.py,sha256=Wrhau5gPYwGSmA1V2IbMhyApTRgB8p4Pyk8JL7OCTaE,12189
50
50
  kash/config/logger_basic.py,sha256=Gsxitz7xeMGCUr5qjWK6y72qeMsIz4mcDZP5xyzK0WU,1598
51
51
  kash/config/logo.txt,sha256=P4RO1cJ9HRF1BavTp3Kae9iByDNhzhEC-qLAa6ww1RA,217
52
52
  kash/config/server_config.py,sha256=eQ1yxDk031QI0Efp0I1VetqQd9wG7MrLVBCHFm4gp2g,1790
53
53
  kash/config/settings.py,sha256=Tja5MNZJDjo5SRaCngfQQFTTjmVGUlmkCZ7UEAhvXqw,9087
54
54
  kash/config/setup.py,sha256=SepMs7CvWdIXCjs03_noA16PETW_YOxH33F8cdP8kYc,2643
55
55
  kash/config/suppress_warnings.py,sha256=yty5ZodMLIpmjphRtcVmRamXfiWbyfga9annve6qxb0,1475
56
- kash/config/text_styles.py,sha256=1qIrMgDYYuBoVj9kFCaEEOca_Ibz5VnPVNI-xTSQnlk,13840
56
+ kash/config/text_styles.py,sha256=pQ0FKJW7eSXU6ol5LhyaGZewxF40L6Q0o92mfsNNCYQ,13843
57
57
  kash/config/unified_live.py,sha256=tUEnTWMSYKYSJkEoAPbaJET-bJ1HnfU2Ar-XeyBOtlo,8420
58
58
  kash/docs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
59
  kash/docs/all_docs.py,sha256=NutfgU8VOA7_K2HX18FoOHVvvLL14dALoCxK9qDbQ04,3157
@@ -67,7 +67,7 @@ kash/docs/markdown/readme_template.md,sha256=iGx9IjSni1t_9BuYD5d2GgkxkNIkqvE3k78
67
67
  kash/docs/markdown/warning.md,sha256=ipTFWQc1F0cPGrIG0epX5RqQH6PmshyZOoCQDz0zDos,88
68
68
  kash/docs/markdown/welcome.md,sha256=wdvPehSgQWFPXJFRfBcA1GqA_WsS7C2rrpPuAnVVens,613
69
69
  kash/docs/markdown/topics/a1_what_is_kash.md,sha256=3zDbkF7IAS4sLz1bASturGUZBI65tJbQrRBJOXPa4Os,7341
70
- kash/docs/markdown/topics/a2_installation.md,sha256=J9dqn9Cen9FgUIdBJm9hWdNihj2RW5X9CvgzN2FUnVA,5762
70
+ kash/docs/markdown/topics/a2_installation.md,sha256=EFIVGu9epbRMLzdu4LMnQEfJLOddbsXPaMDUYSsdGig,5791
71
71
  kash/docs/markdown/topics/a3_getting_started.md,sha256=8V95mk9MKH7fTWb0YoyOkRpeFHL2J9oaf5Lo7Ci-WXI,9396
72
72
  kash/docs/markdown/topics/a4_elements.md,sha256=GSu6vEEiNA9b87FGmJcL-VsCuaL3T9sbhFKMe0sI834,4623
73
73
  kash/docs/markdown/topics/a5_tips_for_use_with_other_tools.md,sha256=rd7EIqqQJH-gVDwFFUYnJKamZMyeJi7P8svFdDTNXyQ,3303
@@ -87,21 +87,21 @@ kash/embeddings/cosine.py,sha256=QTWPWUHivXjxCM6APSqij_-4mywM2BVVm0xb0hu7FHA,158
87
87
  kash/embeddings/embeddings.py,sha256=DirB5DjowEQADfxtp1BTROINyIxU2QEUj79_tXipRfo,6664
88
88
  kash/embeddings/text_similarity.py,sha256=2jp0A27dOto6kItzqe95-f-lx6Mop68d-MJevyCHj9o,1817
89
89
  kash/exec/__init__.py,sha256=Najls8No143yoj_KAaOQgo8ufC2LWCB_DwwEQ-8nDM0,1277
90
- kash/exec/action_decorators.py,sha256=LJaXObZlnROZliZ2usuQmpkilq97sh54Ddgkv6nGV6o,16782
91
- kash/exec/action_exec.py,sha256=OV3ijpzsek5ILqn_xzMTohe7iwHeupFAyYQw2x4ZVko,19361
90
+ kash/exec/action_decorators.py,sha256=omCr3oxB7LRBWksRrB8nif1bSgFv2ZBKhfMGQuTBp2k,16956
91
+ kash/exec/action_exec.py,sha256=HZ7ZtWhpkRxjzai_ZIeTf33Ak_4HmmLujjvSud8yGsw,20943
92
92
  kash/exec/action_registry.py,sha256=numU9pH_W5RgIrYmfi0iYMYy_kLJl6vup8PMrhxAfdc,2627
93
93
  kash/exec/combiners.py,sha256=AJ6wgPUHsmwanObsUw64B83XzU26yuh5t4l7igLn82I,4291
94
94
  kash/exec/command_exec.py,sha256=zc-gWm7kyB5J5Kp8xhULQ9Jj9AL927KkDPXXk-Yr1Bw,1292
95
95
  kash/exec/command_registry.py,sha256=1s2ogU8b8nqK_AEtslbr1eYrXCGDkeT30UrB7L0BRoM,2027
96
- kash/exec/fetch_url_items.py,sha256=l994G1b_vd1JQu3Akp5-B0JlZsQso81qyw4c6C_kGIg,6086
96
+ kash/exec/fetch_url_items.py,sha256=BNqAPL4VaXUGZ_q3pNt5QLNKMfU0PMLDrdw8f6xQRo8,6211
97
97
  kash/exec/history.py,sha256=l2XwHGBR1UgTGSFPSBE9mltmxvjR_5qFFO6d-Z008nc,1208
98
98
  kash/exec/importing.py,sha256=xunmBapeUMNc6Zox7y6e_DZkidyWeouiFZpphajwSzc,1843
99
- kash/exec/llm_transforms.py,sha256=n7S-Dew8z_BoAwp-14lY4LueFeUtG117eK_8msbn02c,4375
99
+ kash/exec/llm_transforms.py,sha256=jQAnxHhcvF3oILjpSHx0YRw8Qw-ZnioukXaJuaqjNVk,4626
100
100
  kash/exec/precondition_checks.py,sha256=HymxL7qm4Yz8V76Um5pKdIRnQ2N-p9rpQQi1fI38bNA,2139
101
101
  kash/exec/precondition_registry.py,sha256=9O-01d2OrsYLuhqodVuWjouLR2ABJbUotAmfJNBCRzs,1439
102
102
  kash/exec/preconditions.py,sha256=bwNuuPEnkymj24ySPTl8K5DEgTtB2NPGAm9cWaomhAk,5262
103
103
  kash/exec/resolve_args.py,sha256=jxuur3ZjnbXiMa_dvp-faeAkA8k43CJ7xX4NYbpQwP0,4510
104
- kash/exec/runtime_settings.py,sha256=-mv4cyslnviaQUmPn3IBc004JMb7I97hL7UGShaGGpc,3961
104
+ kash/exec/runtime_settings.py,sha256=6wKjms4uacmwtnH4hZTB3tncCi38bzPfVO_smmjyNno,4022
105
105
  kash/exec/shell_callable_action.py,sha256=IN50c_Xsbn5Pv_ZKrel-UlrNDyIKh2BdeAkMmJ88Uis,4397
106
106
  kash/exec_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
107
  kash/exec_model/args_model.py,sha256=gquOD0msFA-5xhNU-3R5l8wlwyAMefpMHltpxrDlYGQ,2662
@@ -109,8 +109,9 @@ kash/exec_model/commands_model.py,sha256=iM8QhzA0tAas5OwF5liUfHtm45XIH1LcvCviuh3
109
109
  kash/exec_model/script_model.py,sha256=1VG3LhkTmlKzHOYouZ92ZpOSKSCcsz3-tHNcFMQF788,5031
110
110
  kash/exec_model/shell_model.py,sha256=LUhQivbpXlerM-DUzNY7BtctNBbn08Wto8CSSxQDxRU,568
111
111
  kash/file_storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
- kash/file_storage/file_store.py,sha256=mGWr5Fz7YT_pLtw56WULMqNxga_HqUgKyh3s1shHJic,32516
112
+ kash/file_storage/file_store.py,sha256=rWFJD_PVzNgBtFBUD8Ltj9GK-am5zFj9vrMdyIy9pjQ,31442
113
113
  kash/file_storage/item_file_format.py,sha256=QNNpvMDDNyBLLrIwy3yhNgN0Ktsvjh-_Uzkf2XQpI98,7531
114
+ kash/file_storage/item_id_index.py,sha256=aiDHomizFLO_Ui2i6n-YIF4RUosIsxRIQca35yCdIIk,4589
114
115
  kash/file_storage/metadata_dirs.py,sha256=9AqO3S3SSY1dtvP2iLX--E4ui0VIzXttG8R040otfyg,3820
115
116
  kash/file_storage/persisted_yaml.py,sha256=4-4RkFqdlBUkTOwkdA4vRKUywEE9TaDo13OGaDUyU9M,1309
116
117
  kash/file_storage/store_cache_warmer.py,sha256=cQ_KwxkBPWT3lMmYOCTkXgo7CKaGINns2YzIH32ExSU,1013
@@ -148,7 +149,7 @@ kash/mcp/__init__.py,sha256=HA_aFskEchpAwA0wOKi5nasytx2JZfH8z9oCVXUI7MQ,160
148
149
  kash/mcp/mcp_cli.py,sha256=UC0Jwd7DLxx2zEFj0hK1UWPkXXXGntV1te33CensyHM,3849
149
150
  kash/mcp/mcp_main.py,sha256=6PhjKwp631mezDTUAd-pL8lUZx9Gl7yCrCQFW61pqJU,3167
150
151
  kash/mcp/mcp_server_commands.py,sha256=sKPBD4DptUArxo833eJRRYYRt32E5Dwpr0k8Qe6U8ec,4349
151
- kash/mcp/mcp_server_routes.py,sha256=hH9bJfdIJnkmL4GjIcgCOJASNykX-3VgKLJhL9Ljby0,10596
152
+ kash/mcp/mcp_server_routes.py,sha256=gWsr9WkEVzSslF-XaiO7wMUD9bJeabXj4xNy6WwqHaM,11757
152
153
  kash/mcp/mcp_server_sse.py,sha256=7zAOJodrCVfLtChUTRxzgxWGymQnmj1e9fRG7H_yqXg,5678
153
154
  kash/mcp/mcp_server_stdio.py,sha256=u-oeIZKwzIAGlKmBpipC-hfNQKx36Md9hST11y3AZUY,1174
154
155
  kash/media_base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -162,13 +163,13 @@ kash/media_base/transcription_format.py,sha256=rOVPTpwvW22c27BRwYF-Tc_xzqK_wOtUZ
162
163
  kash/media_base/transcription_whisper.py,sha256=GqvroW9kBAH4-gcbYkMgNCfs2MpMIgm1ip3NMWtJ0IE,1169
163
164
  kash/media_base/services/local_file_media.py,sha256=_NV-T90rShJ8ucUjQXMPCKKJ50GSFE9PyyVzhXp5z9w,5624
164
165
  kash/model/__init__.py,sha256=kFfBKb5N70NWYUfpRRxn_Sb9p_vXlB6BBaTCqWmSReo,2978
165
- kash/model/actions_model.py,sha256=rQsMon-uEhOIPFIR4CBUG4g0f7-LP69XTdqO-UhdqBs,22493
166
+ kash/model/actions_model.py,sha256=D-q-eZO_yOug3fuvDUWB1AI_MNwhpElSomaPS7PybyU,23362
166
167
  kash/model/assistant_response_model.py,sha256=6eDfC27nyuBDFjv5nCYMa_Qb2mPbKwDzZy7uLOIyskI,2653
167
168
  kash/model/compound_actions_model.py,sha256=oYEtVKtQv-mA1abZkK7PvaM9xazVBUuk1z0geKBulak,6965
168
169
  kash/model/concept_model.py,sha256=we2qOcy9Mv1q7XPfkDLp_CyO_-8DwAUfUYlpgy_jrFs,1011
169
- kash/model/exec_model.py,sha256=OC-yS_mtDb-dKvzfglfNfGHRwVRbPYD3O9B7-lZWbBs,3032
170
+ kash/model/exec_model.py,sha256=3Su3NEmEtDoSuQSxvg75FYY_EdClSM5pwQK1i7_S88A,3131
170
171
  kash/model/graph_model.py,sha256=T034y0E9OJtITd1g9zp9vll5pLscdatq6JoT08KvPZE,2724
171
- kash/model/items_model.py,sha256=CaKURUcisoWdZiNYq9Jh-LQxJP98FziJOnZ5WHAG_nQ,38051
172
+ kash/model/items_model.py,sha256=--n5PzDHuX0zp0cleCAEhigqzj9g4uSIoF58iIpv2AI,39720
172
173
  kash/model/language_list.py,sha256=I3RIbxTseVmPdhExQimimEv18Gmy2ImMbpXe0-_t1Qw,450
173
174
  kash/model/llm_actions_model.py,sha256=a29uXVNfS2CiqvM7HPdC6H9A23rSQQihAideuBLMH8g,2110
174
175
  kash/model/media_model.py,sha256=ZnlZ-FkswbAIGpUAuNqLce1WDZK-WbnwHn2ipg8x7-0,3511
@@ -205,8 +206,9 @@ kash/utils/__init__.py,sha256=4Jl_AtgRADdGORimWhYZwbSfQSpQ6SiexNIZzmbcngI,111
205
206
  kash/utils/errors.py,sha256=2lPL0fxI8pPOiDvjl0j-rvwY8uhmWetsrYYIc2-x1WY,3906
206
207
  kash/utils/api_utils/api_retries.py,sha256=TtgxLxoMnXIzYMKbMUzsnVcPf-aKFm3cJ95zOcSeae8,21844
207
208
  kash/utils/api_utils/cache_requests_limited.py,sha256=TA5buZ9Dgbj4I1zHhwerTXre018i0TCACGsezsjX9Uc,3140
208
- kash/utils/api_utils/gather_limited.py,sha256=CV-9YjZakbKZ5AN3xIZSOyHwGvtvMljpl5Dq_SuDfNs,32945
209
+ kash/utils/api_utils/gather_limited.py,sha256=6K0Z3u_NeX9wBfFFk21wUQeSimaDIm53AHlGYRLD6LQ,33018
209
210
  kash/utils/api_utils/http_utils.py,sha256=Ou6QNiba5w7n71cgNmV168OFTLmMDNxWW5MM-XkFEME,1461
211
+ kash/utils/api_utils/multitask_gather.py,sha256=LAylwWZ2APbv-O_l0kLwBfP762D0qswMBV8ID4eCOA0,4446
210
212
  kash/utils/api_utils/progress_protocol.py,sha256=6cT5URY6cScHYd6UZoTT_rHI0mbsE52joBf88regEN8,8816
211
213
  kash/utils/common/__init__.py,sha256=ggeWw1xmbl1mgCQD3c4CNN2h5WXFCsN2wXlCWurEUEI,161
212
214
  kash/utils/common/format_utils.py,sha256=83FhAwbMnOQIFudpnOGMuCqCiyoAlWGS6cc8q6xgZus,2072
@@ -217,12 +219,13 @@ kash/utils/common/obj_replace.py,sha256=AuiXptUOnuDNcWDgAJ3jEHkLh89XIqCP_SOkgaVy
217
219
  kash/utils/common/parse_docstring.py,sha256=oM1ecGGySRA3L_poddjReJ_qPY5506Le7E8_CDUrU8k,10922
218
220
  kash/utils/common/parse_key_vals.py,sha256=yZRZIa5GD9SlnBSn2YNZm8PRVKoSJMY8DCmdGujQj_I,2418
219
221
  kash/utils/common/parse_shell_args.py,sha256=UZXTZDbV5m5Jy39jdAQ6W8uilr1TNa0__RqnE8UmQ_M,10604
222
+ kash/utils/common/s3_utils.py,sha256=YZ_qTKtuUtb_oJd8Ke0PgVdg8sYa47PwUkTZVsJ0rWM,3311
220
223
  kash/utils/common/stack_traces.py,sha256=a2NwlK_0xxnjMCDC4LrQu7ueFylF-OImFG3bAAHpPwY,1392
221
224
  kash/utils/common/task_stack.py,sha256=XkeBz3BwYY1HxxTqd3f7CulV0s61PePAKw1Irrtvf5o,4536
222
225
  kash/utils/common/testing.py,sha256=9at6m_2YwRYitQoo-KeGsd2aoA59YUPs-x7cKcmy1C4,1802
223
226
  kash/utils/common/type_utils.py,sha256=SJirXhPilQom_-OKkFToDLm_82ZwpjcNjRy8U1HaQ0Q,3829
224
227
  kash/utils/common/uniquifier.py,sha256=75OY4KIVF8u1eoO0FCPbEGTyVpPOtM-0ctoG_s_jahM,3082
225
- kash/utils/common/url.py,sha256=R_P-CkOUiFxVdo9COcaL7YFvFIoAULj5-XxvmlFLvzo,9416
228
+ kash/utils/common/url.py,sha256=u4qT0sWYsuEYazFCr3IIpmrR6nXyATH-_6GHM2xF5E0,9689
226
229
  kash/utils/common/url_slice.py,sha256=QJb_qJp-hd5lFrxpw7P009yeMTJWDMfF11KRKEo7mIA,10963
227
230
  kash/utils/file_formats/chat_format.py,sha256=XQpyUyq3jBKqM1f1eRZmg5hPBWZIobHNusQPFctFbRQ,11901
228
231
  kash/utils/file_utils/__init__.py,sha256=loL_iW0oOZs0mJ5GelBPptBcqzYKSWdsGcHrpRyxitQ,43
@@ -241,15 +244,15 @@ kash/utils/lang_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
241
244
  kash/utils/lang_utils/capitalization.py,sha256=5XbqBvjkzlxsm1Ue5AQP3P1J1IG0PubMVmGnoKVTF-c,3903
242
245
  kash/utils/rich_custom/__init__.py,sha256=_g2F3Bqc1UnLTdAdCwkvzXmW7OvmqXrA8DpfT1dKy6w,75
243
246
  kash/utils/rich_custom/ansi_cell_len.py,sha256=oQlNrqWB0f6pmigkbRRyeK6oWlGHMPbV_YLO_qmDH5E,2356
244
- kash/utils/rich_custom/multitask_status.py,sha256=eOON62evEAOmmNyVBSjfYkh5y9OTejQrs02rc2L55VE,24375
247
+ kash/utils/rich_custom/multitask_status.py,sha256=3hMxXNAClxcQzzQdBA0rPDNp19Y_6gT8NRIuT8OkO7Q,27667
245
248
  kash/utils/rich_custom/rich_char_transform.py,sha256=3M89tViKM0y31VHsDoHi5eHFWlv5ME7F4p35IdDxnrw,2616
246
249
  kash/utils/rich_custom/rich_indent.py,sha256=nz72yNpUuYjOsaPNVmxM81oEQm-GKEfQkNsuWmv16G0,2286
247
250
  kash/utils/rich_custom/rich_markdown_fork.py,sha256=M_JRaSAyHrSg-wuLv9C9P7SkehSim3lwkqQPuMIFkVw,26551
248
251
  kash/utils/text_handling/doc_normalization.py,sha256=GsK8J8HSVINYYIeO2XQvWYK1ZSiQ6mX34mVb9UOjgG8,3029
249
252
  kash/utils/text_handling/escape_html_tags.py,sha256=8pC3JgoKRtdnbnOu8DiWrlvNR6GAqjwhGbQgl3jiFG4,6441
250
- kash/utils/text_handling/markdown_footnotes.py,sha256=4_ZOez-xHjiSn_XHyqXPk9MNbjts1hiHOh1ARs9vVZA,7494
253
+ kash/utils/text_handling/markdown_footnotes.py,sha256=TgS3un4h_qmZB1KnDUVKaOYLZWhljlUZ-QjLfL6gkgg,6480
251
254
  kash/utils/text_handling/markdown_render.py,sha256=LHPdJc__2ejBx7iwkp_P9wIePNmiVSgwu4-uhamVjms,3791
252
- kash/utils/text_handling/markdown_utils.py,sha256=Yf57dVljpbg8vuHbtcOSHZqz1PafOSBal6R8ESJz1Bs,49220
255
+ kash/utils/text_handling/markdown_utils.py,sha256=ufVYSBvBl9jRYP6Bfsoxhgv754SW3KDxo8rN67OK6a4,52274
253
256
  kash/utils/text_handling/markdownify_utils.py,sha256=fXl3uSUk9aHXL0PDqxdlvWvIvBXUQTOfQxnK9uicQcg,2964
254
257
  kash/utils/text_handling/unified_diffs.py,sha256=JfHSakISkT_GuBPBI4fTooHrp2aenWzDKiVvDewVfMk,2655
255
258
  kash/web_content/canon_url.py,sha256=Zv2q7xQdIHBFkxxwyJn3_ME-qqMFRi_fKxE_IgV2Z50,742
@@ -260,7 +263,7 @@ kash/web_content/local_file_cache.py,sha256=PEDKU5VIwhCnSC-HXG4EkO2OzrOUDuuDBMuo
260
263
  kash/web_content/web_extract.py,sha256=TrGOohn99LF1F0zbycgXqYiIR-V3leefFFEVk3tnW6Y,2979
261
264
  kash/web_content/web_extract_justext.py,sha256=74HLJBKDGKatwxyRDX6za70bZG9LrVmtj9jLX7UJzg4,2540
262
265
  kash/web_content/web_extract_readabilipy.py,sha256=IT7ET5IoU2-Nf37-Neh6CkKMvLL3WTNVJjq7ZMOx6OM,808
263
- kash/web_content/web_fetch.py,sha256=hC4kijKVez4_QtfwdE0OPrEkfEGT2hVcB1vVZko8o78,12129
266
+ kash/web_content/web_fetch.py,sha256=TGzGRyG9KW26V8WhQJkK-MwFN2MJBtMX-j4iY72tVtg,12217
264
267
  kash/web_content/web_page_model.py,sha256=TWgWreGOoOvl7lUkjMSd0rxoDf2VuaKOq7WijwydW0Q,1387
265
268
  kash/web_gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
266
269
  kash/web_gen/tabbed_webpage.py,sha256=e0GGG1bQ4CQegpJgOIT2KpyM6cmwN_BQ9eJSsi4BjgY,4945
@@ -301,8 +304,8 @@ kash/xonsh_custom/xonsh_modern_tools.py,sha256=mj_b34LZXfE8MJe9EpDmp5JZ0tDM1biYN
301
304
  kash/xonsh_custom/xonsh_ranking_completer.py,sha256=ZRGiAfoEgqgnlq2-ReUVEaX5oOgW1DQ9WxIv2OJLuTo,5620
302
305
  kash/xontrib/fnm.py,sha256=V2tsOdmIDgbFbZSfMLpsvDIwwJJqiYnOkOySD1cXNXw,3700
303
306
  kash/xontrib/kash_extension.py,sha256=FLIMlgR3C_6A1fwKE-Ul0nmmpJSszVPbAriinUyQ8Zg,1896
304
- kash_shell-0.3.30.dist-info/METADATA,sha256=g7JD1AYfHubO3mqMqRV4JwGYbebI9rioQ2oGohlElpI,33514
305
- kash_shell-0.3.30.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
306
- kash_shell-0.3.30.dist-info/entry_points.txt,sha256=SQraWDAo8SqYpthLXThei0mf_hGGyhYBUO-Er_0HcwI,85
307
- kash_shell-0.3.30.dist-info/licenses/LICENSE,sha256=rCh2PsfYeiU6FK_0wb58kHGm_Fj5c43fdcHEexiVzIo,34562
308
- kash_shell-0.3.30.dist-info/RECORD,,
307
+ kash_shell-0.3.34.dist-info/METADATA,sha256=ubXLWP8kfglDx7f2zvpr1TKaah6BZ6ye-B7hPYorfYc,33547
308
+ kash_shell-0.3.34.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
309
+ kash_shell-0.3.34.dist-info/entry_points.txt,sha256=SQraWDAo8SqYpthLXThei0mf_hGGyhYBUO-Er_0HcwI,85
310
+ kash_shell-0.3.34.dist-info/licenses/LICENSE,sha256=rCh2PsfYeiU6FK_0wb58kHGm_Fj5c43fdcHEexiVzIo,34562
311
+ kash_shell-0.3.34.dist-info/RECORD,,