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.
- kash/actions/core/chat.py +1 -0
- kash/actions/core/markdownify_html.py +1 -1
- kash/actions/core/readability.py +1 -4
- kash/actions/core/render_as_html.py +1 -0
- kash/actions/core/show_webpage.py +2 -0
- kash/actions/core/summarize_as_bullets.py +1 -1
- kash/config/logger.py +1 -1
- kash/config/text_styles.py +1 -1
- kash/docs/markdown/topics/a2_installation.md +3 -2
- kash/exec/action_decorators.py +5 -3
- kash/exec/action_exec.py +50 -5
- kash/exec/fetch_url_items.py +4 -2
- kash/exec/llm_transforms.py +14 -5
- kash/exec/runtime_settings.py +2 -0
- kash/file_storage/file_store.py +50 -92
- kash/file_storage/item_id_index.py +128 -0
- kash/mcp/mcp_server_routes.py +42 -12
- kash/model/actions_model.py +18 -7
- kash/model/exec_model.py +3 -0
- kash/model/items_model.py +54 -12
- kash/utils/api_utils/gather_limited.py +2 -0
- kash/utils/api_utils/multitask_gather.py +134 -0
- kash/utils/common/s3_utils.py +108 -0
- kash/utils/common/url.py +16 -4
- kash/utils/rich_custom/multitask_status.py +84 -10
- kash/utils/text_handling/markdown_footnotes.py +16 -43
- kash/utils/text_handling/markdown_utils.py +108 -28
- kash/web_content/web_fetch.py +2 -1
- {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/METADATA +5 -5
- {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/RECORD +33 -30
- {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/WHEEL +0 -0
- {kash_shell-0.3.30.dist-info → kash_shell-0.3.34.dist-info}/entry_points.txt +0 -0
- {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
|
-
#
|
|
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
|
-
|
|
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
|
|
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
|
|
168
|
+
def extract_file_urls(file_path: Path, include_internal=False) -> list[Url]:
|
|
124
169
|
"""
|
|
125
|
-
Extract all
|
|
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
|
|
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(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
kash/web_content/web_fetch.py
CHANGED
|
@@ -293,7 +293,8 @@ def download_url(
|
|
|
293
293
|
|
|
294
294
|
s3 = boto3.resource("s3")
|
|
295
295
|
s3_path = parsed_url.path.lstrip("/")
|
|
296
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
#
|
|
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=
|
|
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=
|
|
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=
|
|
12
|
-
kash/actions/core/render_as_html.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
91
|
-
kash/exec/action_exec.py,sha256=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
305
|
-
kash_shell-0.3.
|
|
306
|
-
kash_shell-0.3.
|
|
307
|
-
kash_shell-0.3.
|
|
308
|
-
kash_shell-0.3.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|