kash-shell 0.3.28__py3-none-any.whl → 0.3.30__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 (61) hide show
  1. kash/actions/core/markdownify_html.py +1 -4
  2. kash/actions/core/minify_html.py +4 -5
  3. kash/actions/core/render_as_html.py +9 -7
  4. kash/actions/core/save_sidematter_meta.py +47 -0
  5. kash/actions/core/zip_sidematter.py +47 -0
  6. kash/commands/base/basic_file_commands.py +7 -4
  7. kash/commands/base/diff_commands.py +6 -4
  8. kash/commands/base/files_command.py +31 -30
  9. kash/commands/base/general_commands.py +3 -2
  10. kash/commands/base/logs_commands.py +6 -4
  11. kash/commands/base/reformat_command.py +3 -2
  12. kash/commands/base/search_command.py +4 -3
  13. kash/commands/base/show_command.py +9 -7
  14. kash/commands/help/assistant_commands.py +6 -4
  15. kash/commands/help/help_commands.py +7 -4
  16. kash/commands/workspace/selection_commands.py +18 -16
  17. kash/commands/workspace/workspace_commands.py +39 -26
  18. kash/config/setup.py +2 -27
  19. kash/docs/markdown/topics/a1_what_is_kash.md +26 -18
  20. kash/exec/action_decorators.py +2 -2
  21. kash/exec/action_exec.py +56 -50
  22. kash/exec/fetch_url_items.py +36 -9
  23. kash/exec/preconditions.py +2 -2
  24. kash/exec/resolve_args.py +4 -1
  25. kash/exec/runtime_settings.py +1 -0
  26. kash/file_storage/file_store.py +59 -23
  27. kash/file_storage/item_file_format.py +91 -26
  28. kash/help/help_types.py +1 -1
  29. kash/llm_utils/llms.py +6 -1
  30. kash/local_server/local_server_commands.py +2 -1
  31. kash/mcp/mcp_server_commands.py +3 -2
  32. kash/mcp/mcp_server_routes.py +1 -1
  33. kash/model/actions_model.py +31 -30
  34. kash/model/compound_actions_model.py +4 -3
  35. kash/model/exec_model.py +30 -3
  36. kash/model/items_model.py +114 -57
  37. kash/model/params_model.py +4 -4
  38. kash/shell/output/shell_output.py +1 -2
  39. kash/utils/file_formats/chat_format.py +7 -4
  40. kash/utils/file_utils/file_ext.py +1 -0
  41. kash/utils/file_utils/file_formats.py +4 -2
  42. kash/utils/file_utils/file_formats_model.py +12 -0
  43. kash/utils/text_handling/doc_normalization.py +1 -1
  44. kash/utils/text_handling/markdown_footnotes.py +224 -0
  45. kash/utils/text_handling/markdown_utils.py +532 -41
  46. kash/utils/text_handling/markdownify_utils.py +2 -1
  47. kash/web_gen/templates/components/tooltip_scripts.js.jinja +186 -1
  48. kash/web_gen/templates/components/youtube_popover_scripts.js.jinja +223 -0
  49. kash/web_gen/templates/components/youtube_popover_styles.css.jinja +150 -0
  50. kash/web_gen/templates/content_styles.css.jinja +53 -1
  51. kash/web_gen/templates/youtube_webpage.html.jinja +47 -0
  52. kash/web_gen/webpage_render.py +103 -0
  53. kash/workspaces/workspaces.py +0 -5
  54. kash/xonsh_custom/custom_shell.py +4 -3
  55. {kash_shell-0.3.28.dist-info → kash_shell-0.3.30.dist-info}/METADATA +33 -24
  56. {kash_shell-0.3.28.dist-info → kash_shell-0.3.30.dist-info}/RECORD +59 -54
  57. kash/llm_utils/llm_features.py +0 -72
  58. kash/web_gen/simple_webpage.py +0 -55
  59. {kash_shell-0.3.28.dist-info → kash_shell-0.3.30.dist-info}/WHEEL +0 -0
  60. {kash_shell-0.3.28.dist-info → kash_shell-0.3.30.dist-info}/entry_points.txt +0 -0
  61. {kash_shell-0.3.28.dist-info → kash_shell-0.3.30.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,103 @@
1
+ from chopdiff.html import rewrite_html_img_urls
2
+ from sidematter_format import Sidematter, copy_sidematter
3
+
4
+ from kash.config.logger import get_logger
5
+ from kash.model.items_model import Item
6
+ from kash.utils.file_utils.file_formats_model import Format
7
+ from kash.utils.text_handling.markdown_utils import rewrite_image_urls
8
+ from kash.web_gen.template_render import render_web_template
9
+ from kash.workspaces.workspaces import current_ws
10
+
11
+ log = get_logger(__name__)
12
+
13
+
14
+ def copy_item_sidematter(
15
+ input_item: Item,
16
+ result_item: Item,
17
+ ) -> tuple[str, str]:
18
+ """
19
+ Copy the sidematter of an item to a new item. Useful for copying assets, especially images.
20
+ """
21
+ ws = current_ws()
22
+
23
+ # Manually copy over metadata and assets. This makes image assets work.
24
+ assert input_item.store_path
25
+ src_path = ws.base_dir / input_item.store_path
26
+ dest_path = ws.assign_store_path(result_item)
27
+
28
+ log.message(
29
+ "Copying sidematter and assets: %s -> %s",
30
+ input_item.store_path,
31
+ result_item.store_path,
32
+ )
33
+ copy_sidematter(
34
+ src_path=src_path,
35
+ dest_path=dest_path,
36
+ make_parents=True,
37
+ copy_original=False,
38
+ )
39
+
40
+ old_prefix = Sidematter(src_path).assets_dir.name
41
+ new_prefix = Sidematter(dest_path).assets_dir.name
42
+
43
+ return old_prefix, new_prefix
44
+
45
+
46
+ def rewrite_item_image_urls(
47
+ input_item: Item,
48
+ old_prefix: str,
49
+ new_prefix: str,
50
+ ) -> Item:
51
+ """
52
+ Rewrite image path prefixes. Useful when we are rendering an item with sidematter
53
+ asset paths.
54
+ """
55
+
56
+ # Rewrite image paths to be relative to the workspace.
57
+ assert input_item.body
58
+ if input_item.format in (Format.markdown, Format.md_html):
59
+ rewritten_body = rewrite_image_urls(input_item.body, old_prefix, new_prefix)
60
+ elif input_item.format == Format.html:
61
+ rewritten_body = rewrite_html_img_urls(
62
+ input_item.body, from_prefix=old_prefix, to_prefix=new_prefix
63
+ )
64
+ else:
65
+ rewritten_body = input_item.body
66
+
67
+ change_str = "found" if rewritten_body != input_item.body else "none found"
68
+ log.message("Rewrote doc image paths (%s): `%s` -> `%s`", change_str, old_prefix, new_prefix)
69
+ rewritten_item = input_item.derived_copy(body=rewritten_body)
70
+
71
+ return rewritten_item
72
+
73
+
74
+ def render_item_as_html(
75
+ input_item: Item,
76
+ result_item: Item,
77
+ *,
78
+ add_title_h1: bool,
79
+ template_filename: str = "youtube_webpage.html.jinja",
80
+ ) -> Item:
81
+ """
82
+ Render an item as HTML, including copying sidematter and assets.
83
+ Also rewrites image paths to be relative to the workspace.
84
+ The partly filled-in result item is needed to be able to assign a store path.
85
+ If `add_title_h1` is True, the title will be inserted as an h1 heading above the body.
86
+ """
87
+
88
+ old_prefix, new_prefix = copy_item_sidematter(input_item, result_item)
89
+
90
+ rewritten_item = rewrite_item_image_urls(input_item, old_prefix, new_prefix)
91
+
92
+ result_item.body = render_web_template(
93
+ template_filename=template_filename,
94
+ data={
95
+ "title": input_item.pick_title(),
96
+ "add_title_h1": add_title_h1,
97
+ "content_html": rewritten_item.body_as_html(),
98
+ "thumbnail_url": input_item.thumbnail_url,
99
+ "enable_themes": True,
100
+ "show_theme_toggle": True,
101
+ },
102
+ )
103
+ return result_item
@@ -53,11 +53,6 @@ class Workspace(ABC):
53
53
  def base_dir(self) -> Path:
54
54
  """The base directory for this workspace."""
55
55
 
56
- @property
57
- @abstractmethod
58
- def assets_dir(self) -> Path:
59
- """The directory for this workspace's assets."""
60
-
61
56
 
62
57
  def resolve_ws(name: str | Path) -> WorkspaceInfo:
63
58
  """
@@ -100,7 +100,7 @@ class CustomPTKPromptFormatter(PTKPromptFormatter):
100
100
  if isinstance(result, FormattedText):
101
101
  return result
102
102
  except Exception as e:
103
- log.error("Error formatting prompt: evaluating %s: %s", template, e)
103
+ log.error("Error formatting prompt: evaluating %s: %s", template, e, exc_info=True)
104
104
  # On any error, return a simple fallback prompt.
105
105
  return FormattedText([("", "$ ")])
106
106
  # If it's not FormattedText, use it as the template for parent formatter
@@ -431,8 +431,9 @@ def start_shell(single_command: str | None = None, ready_event: threading.Event
431
431
  other customizations but then the rest of the customization is via the `kash_extension`
432
432
  xontrib.
433
433
 
434
- :param single_command: Optional command to run in non-interactive mode
435
- :param shell_ready_event: Optional event to signal when shell is ready
434
+ Args:
435
+ single_command: Optional command to run in non-interactive mode
436
+ shell_ready_event: Optional event to signal when shell is ready
436
437
  """
437
438
  import builtins
438
439
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kash-shell
3
- Version: 0.3.28
3
+ Version: 0.3.30
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.3
23
+ Requires-Dist: chopdiff>=0.2.5
24
24
  Requires-Dist: clideps>=0.1.4
25
25
  Requires-Dist: colour>=0.1.5
26
26
  Requires-Dist: cssselect>=1.2.0
@@ -28,8 +28,8 @@ Requires-Dist: curl-cffi>=0.11.4
28
28
  Requires-Dist: deepgram-sdk>=3.10.1
29
29
  Requires-Dist: dunamai>=1.23.0
30
30
  Requires-Dist: fastapi>=0.115.11
31
- Requires-Dist: flowmark>=0.5.2
32
- Requires-Dist: frontmatter-format>=0.2.2
31
+ Requires-Dist: flowmark>=0.5.3
32
+ Requires-Dist: frontmatter-format>=0.2.3
33
33
  Requires-Dist: funlog>=0.2.0
34
34
  Requires-Dist: httpx[brotli]>=0.28.1
35
35
  Requires-Dist: humanfriendly>=10.0
@@ -46,7 +46,7 @@ Requires-Dist: pandas>=2.2.3
46
46
  Requires-Dist: patch-ng>=1.18.1
47
47
  Requires-Dist: pathspec>=0.12.1
48
48
  Requires-Dist: pluralizer>=1.2.0
49
- Requires-Dist: prettyfmt>=0.3.1
49
+ Requires-Dist: prettyfmt>=0.4.1
50
50
  Requires-Dist: prompt-toolkit>=3.0.50
51
51
  Requires-Dist: pydantic>=2.10.6
52
52
  Requires-Dist: pydub>=0.25.1
@@ -62,9 +62,10 @@ Requires-Dist: regex>=2024.11.6
62
62
  Requires-Dist: rich-argparse>=1.7.0
63
63
  Requires-Dist: rich>=14.0.0
64
64
  Requires-Dist: ripgrepy>=2.1.0
65
+ Requires-Dist: selectolax>=0.3.32
65
66
  Requires-Dist: send2trash>=1.8.3
66
67
  Requires-Dist: setproctitle>=1.3.5
67
- Requires-Dist: sidematter-format>=0.0.1
68
+ Requires-Dist: sidematter-format>=0.0.5
68
69
  Requires-Dist: strif>=3.0.1
69
70
  Requires-Dist: tenacity>=9.0.0
70
71
  Requires-Dist: thefuzz>=0.22.1
@@ -85,6 +86,19 @@ src="https://github.com/user-attachments/assets/a5d62ae4-17e6-46bb-a9cb-3b6ec8d8
85
86
 
86
87
  </div>
87
88
 
89
+ ## Hello!
90
+
91
+ If you’re seeing this, you there’s a good chance I shared it with you for feedback.
92
+ Thank you for checking out Kash.
93
+
94
+ It’s new, the result of some experimentation over the past few months.
95
+ I like a lot of things about it but it isn’t mature and I’d love your help to make it
96
+ more usable. If you try it please **let me know** what works and what doesn’t work.
97
+ Or if you just don’t get it, where you lost interest or got stuck.
98
+ My contact info is at [github.com/jlevy](https://github.com/jlevy) or [follow or DM
99
+ me](https://x.com/ojoshe) (I’m fastest on Twitter DMs).
100
+ Thank you. :)
101
+
88
102
  ## What is Kash?
89
103
 
90
104
  > “*Simple should be simple.
@@ -99,9 +113,15 @@ It operates on “items” such as URLs, files, or Markdown notes within a works
99
113
  directory.
100
114
 
101
115
  You can use Kash as an **interactive, AI-native command-line** shell for practical
102
- knowledge tasks. It’s also **a Python library** that lets you convert a simple Python
103
- function into a command and an MCP tool, so it integrates with other tools like
104
- Anthropic Desktop or Cursor.
116
+ knowledge tasks.
117
+
118
+ But it’s actually not just a shell, and you can skip the shell entirely.
119
+ It’s really simply **a Python library** that lets you convert a simple Python function
120
+ into “actions” that work in a clean way on plain files in a workspace.
121
+ An action is also an MCP tool, so it integrates with other tools like Anthropic Desktop
122
+ or Cursor.
123
+
124
+ So basically, it gives a unified way to use the shell, Python functions, and MCP tools.
105
125
 
106
126
  It’s new and still has some rough edges, but it’s now working well enough it is feeling
107
127
  quite powerful. It now serves as a replacement for my usual shell (previously bash or
@@ -160,10 +180,10 @@ quick to install via uv.
160
180
  - **Support for any API:** Kash is tool agnostic and runs locally, on file inputs in
161
181
  simple formats, so you own and manage your data and workspaces however you like.
162
182
  You can use it with any models or APIs you like, and is already set up to use the APIs
163
- of **OpenAI GPT-4o and o1**, **Anthropic Claude 3.7**, **Google Gemini**, **xAI
164
- Grok**, **Mistral**, **Groq (Llama, Qwen, Deepseek)** (via **LiteLLM**), **Deepgram**,
165
- **Perplexity**, **Firecrawl**, **Exa**, and any Python libraries.
166
- There is also some experimental support for **LlamaIndex** and **ChromaDB**.
183
+ of **OpenAI** (GPT-5 is now the default model), **Anthropic Claude**, **Google
184
+ Gemini**, **xAI Grok**, **Mistral**, **Groq (Llama, Qwen, Deepseek)** (via
185
+ **LiteLLM**), **Deepgram**, **Perplexity**, **Firecrawl**, **Exa**, and any Python
186
+ libraries. There is also some experimental support for **LlamaIndex** and **ChromaDB**.
167
187
 
168
188
  - **MCP support:** Finally, an action is also an **MCP tool server** so you can use it
169
189
  in any MCP client, like Anthropic Desktop or Cursor.
@@ -198,17 +218,6 @@ I’ve separately built a new desktop terminal app, Kerm, which adds support for
198
218
  the terminal. Because Kash supports these codes, as this develops you will get the
199
219
  visuals of a web app layered on the flexibility of a text-based terminal.
200
220
 
201
- ### Is Kash Mature?
202
-
203
- It’s the result of a couple months of coding and experimentation, and it’s still in
204
- progress and has rough edges.
205
- Please help me make it better by sharing your ideas and feedback!
206
- It’s easiest to DM me at [twitter.com/ojoshe](https://x.com/ojoshe).
207
- My contact info is at [github.com/jlevy](https://github.com/jlevy).
208
-
209
- [**Please follow or DM me**](https://x.com/ojoshe) for future updates or if you have
210
- ideas, feedback, or use cases for Kash!
211
-
212
221
  ## Installation
213
222
 
214
223
  ### Running the Kash Shell
@@ -6,38 +6,40 @@ kash/actions/core/chat.py,sha256=yCannBFa0cSpR_in-XSSuMm1x2ZZQUCKmlqzhsUfpOo,269
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=luMXwwaY6E8oidgdrwV6KSgzdG0iX2JKS5aTNYDdZpA,1810
10
- kash/actions/core/minify_html.py,sha256=F8TOn9DGSa6fLy27ABzDgOMN-BMZ386N0MzvGe1sU8k,1349
9
+ kash/actions/core/markdownify_html.py,sha256=3no9UkI6YT9FdiDmwUCG1CdeCanO0jHa9zWzfk-adro,1733
10
+ kash/actions/core/minify_html.py,sha256=TRhyn7Gvcowou8pzq9vzDTtcCFOA4eC5217pJ9rPuOw,1386
11
11
  kash/actions/core/readability.py,sha256=ljdB2rOpzfKU2FpEJ2UELIzcdOAWvdUjFsxoHRTE3xo,989
12
- kash/actions/core/render_as_html.py,sha256=CIPGKCjUEVNsnXmpqHCUnjGwTfEfOyCXxlYFUN8mahY,1870
12
+ kash/actions/core/render_as_html.py,sha256=AtPZrNBByQHFnmOD77DqGjslOy2NR7Zp7NOZ99nfMmU,1870
13
+ kash/actions/core/save_sidematter_meta.py,sha256=fKLE5eWIorOdw_FW46AUivXACQ6cxWvKWllcEjT6mz8,1440
13
14
  kash/actions/core/show_webpage.py,sha256=Ggba9jkx9U-FZOcuL0lkS-SwtPNUyxVsGdeQrqwWs1s,887
14
15
  kash/actions/core/strip_html.py,sha256=FDLN_4CKB11q5cU4NixTf7PGrAq92AjQNbKAdvQDwCY,849
15
16
  kash/actions/core/summarize_as_bullets.py,sha256=Zwr8lNzL77pwpnW_289LQjNBijNDpTPANfFdOJA-PZ4,2070
16
17
  kash/actions/core/tabbed_webpage_config.py,sha256=rIbzEhBTmnkbSiRZC-Rj46T1J6c0jOztiKE9Usa4nsc,980
17
18
  kash/actions/core/tabbed_webpage_generate.py,sha256=935HkDSuP4eZ1e0xf-LhjPOdicU3wI5Kuh79r61QCl8,988
19
+ kash/actions/core/zip_sidematter.py,sha256=E7ae0g9Bz7uXApYdNY-a8GvSIIPoqXcD95mjMaKQlsM,1557
18
20
  kash/actions/meta/write_instructions.py,sha256=zeKKX-Yi8jSyjvZ4Ii_4MNBRtM2MENuHyrD0Vxsaos8,1277
19
21
  kash/actions/meta/write_new_action.py,sha256=w7SJZ2FjzRbKwqKX9PeozUrh8cNJAumX7F80wW7dQts,6356
20
22
  kash/commands/__init__.py,sha256=MhdPSluWGE3XVQ7LSv2L8_aAxaey8CLjQBjGC9B4nRM,191
21
- kash/commands/base/basic_file_commands.py,sha256=7xQreY3oewiJKYZYqcMZtClhqyKirg1WTXf95tXAPtc,7061
23
+ kash/commands/base/basic_file_commands.py,sha256=y13xxPWldXp03ndqVKxz6MrLwSV9DjuKKg4rMTIyb0U,7079
22
24
  kash/commands/base/browser_commands.py,sha256=iYvpW4D_tlhW_p0cq3A6YO9UGCdHtvzIQiNMDwCY07A,1574
23
25
  kash/commands/base/debug_commands.py,sha256=9I5W3SMQvsnpcs-b6CJCYu1Ydl6gIoTUcDZxvn1dN3g,7643
24
- kash/commands/base/diff_commands.py,sha256=gOeSyCPg95LBnL6JobCR7lQHNS_c-29bDo1aIJkfyGw,4913
25
- kash/commands/base/files_command.py,sha256=fBuZ8sLqmfH8QekGe-P11mZ4jPxRLi3rLKhZqpdwQ5g,16759
26
- kash/commands/base/general_commands.py,sha256=Y0Vdn5jIWHFWVFGPXZA9XkoTu5uBFiH0-2LNFbslM0w,7011
27
- kash/commands/base/logs_commands.py,sha256=IyNgxaAoa5LlS-VxD_x8bXTVbD04pT8qEHlIJNM09UU,2963
26
+ kash/commands/base/diff_commands.py,sha256=5FypsOGiSvZAiis0bahlgR1vfmcxBpLwnkF8oZQD3eY,4921
27
+ kash/commands/base/files_command.py,sha256=e4yLfb4_hsKQEvVdeBQSl7TNr8v4FDSUsYk9iOUR6hk,16756
28
+ kash/commands/base/general_commands.py,sha256=V18XZv5fu-Wi3T41pLVx8BKe_6VkS8FRehMsnuo5ikE,7015
29
+ kash/commands/base/logs_commands.py,sha256=9w11XLKbZ_ZKMF9SasaKGM6lZNXRjJrQy8LE-2xkV8Q,2971
28
30
  kash/commands/base/model_commands.py,sha256=d17a2NvfDbwV1y8gyZVsOtX-j5H5we5OEXM9TxTqvBs,1790
29
- kash/commands/base/reformat_command.py,sha256=fhGSfC8KyPsEcKWq6lXXlXSIPRw1CweLIFsS3AmYGYU,1869
30
- kash/commands/base/search_command.py,sha256=FXtP09HmmfHRrjenvmU4j0Lcw34piIzdI3UFGbUQ1tg,2201
31
- kash/commands/base/show_command.py,sha256=rFyIW_5oZArRSTpe71PaX87Hq30WE-t6RAJKeCwJ3lM,3299
31
+ kash/commands/base/reformat_command.py,sha256=G1u4FVjGMx4FxzfsqQkLn7420ABi8GW_nJzYle7wwBI,1884
32
+ kash/commands/base/search_command.py,sha256=K3_N1po1CUPRw6PQVeyQvEVtUoVRCfOgHEaTngZ1x3A,2202
33
+ kash/commands/base/show_command.py,sha256=o8wAYAulwNhwhPwGMS_0wjwYsTqBjcLYcN5UumsOyuE,3345
32
34
  kash/commands/extras/parse_uv_lock.py,sha256=HVqmGhJAd3ZCTTTaXe_nzzTMFKhwjLLP7hx4NTM224U,5696
33
35
  kash/commands/extras/utils_commands.py,sha256=rz3N7VxoUHvCxksRt-sLubkvyW-VH9OTltLEMEnjRfU,769
34
- kash/commands/help/assistant_commands.py,sha256=YYIiTxFju4ZF11HXztDe4McaAuPrIkfBwVfj1sNTv0A,3045
36
+ kash/commands/help/assistant_commands.py,sha256=tZXmMqCrlDHI1KWmKpQEz5kTxYViPWxATF5hSupbeWM,3060
35
37
  kash/commands/help/doc_commands.py,sha256=7lKR7mzue2N7pSkNqblpFJy892fS5N6jWVOHqeXziHw,2466
36
- kash/commands/help/help_commands.py,sha256=eJTpIhXck123PAUq2k-D3Q6UL6IQ8atOVYurLi2GD0A,4229
38
+ kash/commands/help/help_commands.py,sha256=5exWU4SpnI20GD-zhLchSaL0664jA2t41xh6trPLnC4,4255
37
39
  kash/commands/help/logo.py,sha256=4K3pPIiNlPIgdNeOgdIGbJQCKmqCEsDOhuWPH51msWo,3377
38
40
  kash/commands/help/welcome.py,sha256=16pAASjc4UNbm-eKC482Co6VB8i-fSwII8XYrW9JbHA,934
39
- kash/commands/workspace/selection_commands.py,sha256=nZzA-H7Pk8kqSJVRlX7j1m6cZX-e0X8isOryDU41vqU,8156
40
- kash/commands/workspace/workspace_commands.py,sha256=xJ3Agg_tzGvH55705ovoZDYiTEO4FejWclwcsMWKitY,21965
41
+ kash/commands/workspace/selection_commands.py,sha256=cMB6O1ejDb2s_u3o2Zaq-iytykhQzWYtDGd0j4jkGLo,8142
42
+ kash/commands/workspace/workspace_commands.py,sha256=GE_wHdeYFJ1ruRi4spZtyyTjYXJWCYEQ1Vmc52fIpSQ,22296
41
43
  kash/config/__init__.py,sha256=ytly9Typ1mWV4CXfV9G3CIPtPQ02u2rpZ304L3GlFro,148
42
44
  kash/config/capture_output.py,sha256=ud3uUVNuDicHj3mI_nBUBO-VmOrxtBdA3z-I3D1lSCU,2398
43
45
  kash/config/colors.py,sha256=cV3LRBegDZxZXjV-XEjc3fystFY_defhz1LN8QPdaKc,13727
@@ -49,7 +51,7 @@ kash/config/logger_basic.py,sha256=Gsxitz7xeMGCUr5qjWK6y72qeMsIz4mcDZP5xyzK0WU,1
49
51
  kash/config/logo.txt,sha256=P4RO1cJ9HRF1BavTp3Kae9iByDNhzhEC-qLAa6ww1RA,217
50
52
  kash/config/server_config.py,sha256=eQ1yxDk031QI0Efp0I1VetqQd9wG7MrLVBCHFm4gp2g,1790
51
53
  kash/config/settings.py,sha256=Tja5MNZJDjo5SRaCngfQQFTTjmVGUlmkCZ7UEAhvXqw,9087
52
- kash/config/setup.py,sha256=zFxfTPG1cbsozuwUkIyAYebxuHhpYCiaexHnYnYJG1c,3524
54
+ kash/config/setup.py,sha256=SepMs7CvWdIXCjs03_noA16PETW_YOxH33F8cdP8kYc,2643
53
55
  kash/config/suppress_warnings.py,sha256=yty5ZodMLIpmjphRtcVmRamXfiWbyfga9annve6qxb0,1475
54
56
  kash/config/text_styles.py,sha256=1qIrMgDYYuBoVj9kFCaEEOca_Ibz5VnPVNI-xTSQnlk,13840
55
57
  kash/config/unified_live.py,sha256=tUEnTWMSYKYSJkEoAPbaJET-bJ1HnfU2Ar-XeyBOtlo,8420
@@ -64,7 +66,7 @@ kash/docs/markdown/assistant_instructions_template.md,sha256=oLZbr8DPbl1x8pfouqt
64
66
  kash/docs/markdown/readme_template.md,sha256=iGx9IjSni1t_9BuYD5d2GgkxkNIkqvE3k78IufHF6Yg,409
65
67
  kash/docs/markdown/warning.md,sha256=ipTFWQc1F0cPGrIG0epX5RqQH6PmshyZOoCQDz0zDos,88
66
68
  kash/docs/markdown/welcome.md,sha256=wdvPehSgQWFPXJFRfBcA1GqA_WsS7C2rrpPuAnVVens,613
67
- kash/docs/markdown/topics/a1_what_is_kash.md,sha256=aQOx3EDVmGTbeEbt80jbTu5cCVRDY2qt8IfplmTNgWQ,6941
69
+ kash/docs/markdown/topics/a1_what_is_kash.md,sha256=3zDbkF7IAS4sLz1bASturGUZBI65tJbQrRBJOXPa4Os,7341
68
70
  kash/docs/markdown/topics/a2_installation.md,sha256=J9dqn9Cen9FgUIdBJm9hWdNihj2RW5X9CvgzN2FUnVA,5762
69
71
  kash/docs/markdown/topics/a3_getting_started.md,sha256=8V95mk9MKH7fTWb0YoyOkRpeFHL2J9oaf5Lo7Ci-WXI,9396
70
72
  kash/docs/markdown/topics/a4_elements.md,sha256=GSu6vEEiNA9b87FGmJcL-VsCuaL3T9sbhFKMe0sI834,4623
@@ -85,21 +87,21 @@ kash/embeddings/cosine.py,sha256=QTWPWUHivXjxCM6APSqij_-4mywM2BVVm0xb0hu7FHA,158
85
87
  kash/embeddings/embeddings.py,sha256=DirB5DjowEQADfxtp1BTROINyIxU2QEUj79_tXipRfo,6664
86
88
  kash/embeddings/text_similarity.py,sha256=2jp0A27dOto6kItzqe95-f-lx6Mop68d-MJevyCHj9o,1817
87
89
  kash/exec/__init__.py,sha256=Najls8No143yoj_KAaOQgo8ufC2LWCB_DwwEQ-8nDM0,1277
88
- kash/exec/action_decorators.py,sha256=kCEqQFN1MIhRbFeIEGux956LzsiwonhyIIrJ8Pq9zPk,16765
89
- kash/exec/action_exec.py,sha256=tLL3ESIuxqS_gSOD4eGRYLuTzesRMTyKb_Uy3i_28VU,19022
90
+ kash/exec/action_decorators.py,sha256=LJaXObZlnROZliZ2usuQmpkilq97sh54Ddgkv6nGV6o,16782
91
+ kash/exec/action_exec.py,sha256=OV3ijpzsek5ILqn_xzMTohe7iwHeupFAyYQw2x4ZVko,19361
90
92
  kash/exec/action_registry.py,sha256=numU9pH_W5RgIrYmfi0iYMYy_kLJl6vup8PMrhxAfdc,2627
91
93
  kash/exec/combiners.py,sha256=AJ6wgPUHsmwanObsUw64B83XzU26yuh5t4l7igLn82I,4291
92
94
  kash/exec/command_exec.py,sha256=zc-gWm7kyB5J5Kp8xhULQ9Jj9AL927KkDPXXk-Yr1Bw,1292
93
95
  kash/exec/command_registry.py,sha256=1s2ogU8b8nqK_AEtslbr1eYrXCGDkeT30UrB7L0BRoM,2027
94
- kash/exec/fetch_url_items.py,sha256=onKoAOg747r5T9fAIO8sTjJcllxKh3XLzh59FU5EFE8,5466
96
+ kash/exec/fetch_url_items.py,sha256=l994G1b_vd1JQu3Akp5-B0JlZsQso81qyw4c6C_kGIg,6086
95
97
  kash/exec/history.py,sha256=l2XwHGBR1UgTGSFPSBE9mltmxvjR_5qFFO6d-Z008nc,1208
96
98
  kash/exec/importing.py,sha256=xunmBapeUMNc6Zox7y6e_DZkidyWeouiFZpphajwSzc,1843
97
99
  kash/exec/llm_transforms.py,sha256=n7S-Dew8z_BoAwp-14lY4LueFeUtG117eK_8msbn02c,4375
98
100
  kash/exec/precondition_checks.py,sha256=HymxL7qm4Yz8V76Um5pKdIRnQ2N-p9rpQQi1fI38bNA,2139
99
101
  kash/exec/precondition_registry.py,sha256=9O-01d2OrsYLuhqodVuWjouLR2ABJbUotAmfJNBCRzs,1439
100
- kash/exec/preconditions.py,sha256=fuK_tfI7FiJ5F36MXOgopFtD5O_gf8yLvQ-xjowNKSw,5221
101
- kash/exec/resolve_args.py,sha256=gu65epzVrwWHdHA-KwAwYssncJIB84oHOJeoXXrQ2mM,4428
102
- kash/exec/runtime_settings.py,sha256=aK6nGbZhKSIDVmV6AqV68hQkiaIGWnCiNzHtwwZ5V0w,3960
102
+ kash/exec/preconditions.py,sha256=bwNuuPEnkymj24ySPTl8K5DEgTtB2NPGAm9cWaomhAk,5262
103
+ kash/exec/resolve_args.py,sha256=jxuur3ZjnbXiMa_dvp-faeAkA8k43CJ7xX4NYbpQwP0,4510
104
+ kash/exec/runtime_settings.py,sha256=-mv4cyslnviaQUmPn3IBc004JMb7I97hL7UGShaGGpc,3961
103
105
  kash/exec/shell_callable_action.py,sha256=IN50c_Xsbn5Pv_ZKrel-UlrNDyIKh2BdeAkMmJ88Uis,4397
104
106
  kash/exec_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
107
  kash/exec_model/args_model.py,sha256=gquOD0msFA-5xhNU-3R5l8wlwyAMefpMHltpxrDlYGQ,2662
@@ -107,8 +109,8 @@ kash/exec_model/commands_model.py,sha256=iM8QhzA0tAas5OwF5liUfHtm45XIH1LcvCviuh3
107
109
  kash/exec_model/script_model.py,sha256=1VG3LhkTmlKzHOYouZ92ZpOSKSCcsz3-tHNcFMQF788,5031
108
110
  kash/exec_model/shell_model.py,sha256=LUhQivbpXlerM-DUzNY7BtctNBbn08Wto8CSSxQDxRU,568
109
111
  kash/file_storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
- kash/file_storage/file_store.py,sha256=GeAHIvAFcIj_cKssqzHajmpJmZQ8sFNDbFDvy4fETys,30877
111
- kash/file_storage/item_file_format.py,sha256=_o2CjWstk_Z__qMr-Inct9wJm2VEUK0GZvF-fDZ8bcc,5377
112
+ kash/file_storage/file_store.py,sha256=mGWr5Fz7YT_pLtw56WULMqNxga_HqUgKyh3s1shHJic,32516
113
+ kash/file_storage/item_file_format.py,sha256=QNNpvMDDNyBLLrIwy3yhNgN0Ktsvjh-_Uzkf2XQpI98,7531
112
114
  kash/file_storage/metadata_dirs.py,sha256=9AqO3S3SSY1dtvP2iLX--E4ui0VIzXttG8R040otfyg,3820
113
115
  kash/file_storage/persisted_yaml.py,sha256=4-4RkFqdlBUkTOwkdA4vRKUywEE9TaDo13OGaDUyU9M,1309
114
116
  kash/file_storage/store_cache_warmer.py,sha256=cQ_KwxkBPWT3lMmYOCTkXgo7CKaGINns2YzIH32ExSU,1013
@@ -122,7 +124,7 @@ kash/help/help_embeddings.py,sha256=EERozW4CriUv1L9blox5eK3OYm31ypoNicxzaUBrYtU,
122
124
  kash/help/help_lookups.py,sha256=0dtuLWEXncqhJCijC98IA9stBDNNcJewt1JYqMLkTx4,2029
123
125
  kash/help/help_pages.py,sha256=TaKsE26R-pZTrK4Pa593DK5osdJodFHaVm5pZpjqgaI,3894
124
126
  kash/help/help_printing.py,sha256=eZbZdyJC158JiXcEk2zvUmqYbYzbYOpHvxEhC1kIN-Q,6086
125
- kash/help/help_types.py,sha256=xo0AXfaNjlMrWp6dkGixo6P61n1tIhFhlvv9sWhNBrI,7909
127
+ kash/help/help_types.py,sha256=pZDxisdqH6_VaS1EOzYMgAfRcy0KauQNW_DdVCUGfD0,7888
126
128
  kash/help/recommended_commands.py,sha256=jqc3TjWFBqDJ-iSzXn8vTOplb4uHndwvdAGJfcUV_qs,2486
127
129
  kash/help/tldr_help.py,sha256=bcu__MIF4vYlZEeqQqieGIBcRhNCTK5u8jPV08ObzCI,9654
128
130
  kash/llm_utils/__init__.py,sha256=3yjign7KD-kM3ZBBcgtrZz-zjJ2Yx2Q-9bzknBx5vbU,401
@@ -132,13 +134,12 @@ kash/llm_utils/fuzzy_parsing.py,sha256=bbG2Y7i5w6kxAVPAixyluv3MDS2hW_pkhnJpVOLHZ
132
134
  kash/llm_utils/init_litellm.py,sha256=5Fn9uW4P7lfEO8Rk1EJJUzDEGNjw-PDvxFgHlKDf-Ok,409
133
135
  kash/llm_utils/llm_api_keys.py,sha256=nTB9wSFfHTOXvqshSQCQGCPxUwOW1U7oslngya8nHkw,1168
134
136
  kash/llm_utils/llm_completion.py,sha256=SzeWGRrsjuN1TXdPwscYG6whLQkHclITtwTvQK19GE0,5436
135
- kash/llm_utils/llm_features.py,sha256=ZpQhHiRDtF1BY8HGxTQH0dIeM3rux7a9CvJ0JO2KAlI,1847
136
137
  kash/llm_utils/llm_messages.py,sha256=70QwIIvdwo-h4Jfn_6MbEHb3LTUjUmzg_v_dU_Ey__g,1174
137
138
  kash/llm_utils/llm_names.py,sha256=VZbdKnoeBx_luB5YQ-Rz37gMt3_FcueJdp40ZaQbpUA,3620
138
- kash/llm_utils/llms.py,sha256=Sm7SdNVE0pVIOpAggIgGp9s_Waw8vq6hNOCu-GTc6GI,3788
139
+ kash/llm_utils/llms.py,sha256=S4hBDeOraKOp9e99M8Ga61u6xAkocxs02jXgJRdFNSA,3983
139
140
  kash/local_server/__init__.py,sha256=AyNpvCOJlQF6A4DnlYKRMbbfRNzdizEA-ytp-F2SLZU,162
140
141
  kash/local_server/local_server.py,sha256=EugjL30VM0pWdZDsiQxU-o6EdEa082qlGd_7RHvI5tk,5863
141
- kash/local_server/local_server_commands.py,sha256=ZMp1DpYgg-MJ0iqH0DHfhWKDpFqNRG_txkRdODIr9mU,1661
142
+ kash/local_server/local_server_commands.py,sha256=T5wN-Xty3IbwbyeJxTULPB2NqssWLJcuV8IoqMu9bus,1668
142
143
  kash/local_server/local_server_routes.py,sha256=JlIVsrbsU0yiwv7vAoD9BctqiBI0w6u8Ld3BYY4jmo8,10530
143
144
  kash/local_server/local_url_formatters.py,sha256=SqHjGMEufvm43n34SCa_8Asdwm7utx91Wwymj15TuSY,5327
144
145
  kash/local_server/port_tools.py,sha256=oFfOvO6keqS5GowTpVg2FTu5KqkPHBq-dWAEomUIgGo,2008
@@ -146,8 +147,8 @@ kash/local_server/rich_html_template.py,sha256=O9CnkMYkWuMvKJkqD0P8jaZqfUe6hMP4L
146
147
  kash/mcp/__init__.py,sha256=HA_aFskEchpAwA0wOKi5nasytx2JZfH8z9oCVXUI7MQ,160
147
148
  kash/mcp/mcp_cli.py,sha256=UC0Jwd7DLxx2zEFj0hK1UWPkXXXGntV1te33CensyHM,3849
148
149
  kash/mcp/mcp_main.py,sha256=6PhjKwp631mezDTUAd-pL8lUZx9Gl7yCrCQFW61pqJU,3167
149
- kash/mcp/mcp_server_commands.py,sha256=C-gKLbUVEpF76SmW3NgjlEWoM3YaA3ARrCos5UH1Zh8,4345
150
- kash/mcp/mcp_server_routes.py,sha256=radxy5cc0yBmcbqAbB1LpZ0qcNtfDbtS5RTGwvgliDM,10617
150
+ kash/mcp/mcp_server_commands.py,sha256=sKPBD4DptUArxo833eJRRYYRt32E5Dwpr0k8Qe6U8ec,4349
151
+ kash/mcp/mcp_server_routes.py,sha256=hH9bJfdIJnkmL4GjIcgCOJASNykX-3VgKLJhL9Ljby0,10596
151
152
  kash/mcp/mcp_server_sse.py,sha256=7zAOJodrCVfLtChUTRxzgxWGymQnmj1e9fRG7H_yqXg,5678
152
153
  kash/mcp/mcp_server_stdio.py,sha256=u-oeIZKwzIAGlKmBpipC-hfNQKx36Md9hST11y3AZUY,1174
153
154
  kash/media_base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -161,18 +162,18 @@ kash/media_base/transcription_format.py,sha256=rOVPTpwvW22c27BRwYF-Tc_xzqK_wOtUZ
161
162
  kash/media_base/transcription_whisper.py,sha256=GqvroW9kBAH4-gcbYkMgNCfs2MpMIgm1ip3NMWtJ0IE,1169
162
163
  kash/media_base/services/local_file_media.py,sha256=_NV-T90rShJ8ucUjQXMPCKKJ50GSFE9PyyVzhXp5z9w,5624
163
164
  kash/model/__init__.py,sha256=kFfBKb5N70NWYUfpRRxn_Sb9p_vXlB6BBaTCqWmSReo,2978
164
- kash/model/actions_model.py,sha256=nYvQNr2M8ooFRL2YZ3_yPxFuqYdxO__6fFTgx5mxwbQ,22269
165
+ kash/model/actions_model.py,sha256=rQsMon-uEhOIPFIR4CBUG4g0f7-LP69XTdqO-UhdqBs,22493
165
166
  kash/model/assistant_response_model.py,sha256=6eDfC27nyuBDFjv5nCYMa_Qb2mPbKwDzZy7uLOIyskI,2653
166
- kash/model/compound_actions_model.py,sha256=HiDK5wwCu3WwZYHATZoLEguiqwR9V6V296wiKtGIX8s,6926
167
+ kash/model/compound_actions_model.py,sha256=oYEtVKtQv-mA1abZkK7PvaM9xazVBUuk1z0geKBulak,6965
167
168
  kash/model/concept_model.py,sha256=we2qOcy9Mv1q7XPfkDLp_CyO_-8DwAUfUYlpgy_jrFs,1011
168
- kash/model/exec_model.py,sha256=IlfvtQyoFRRWhWju7vdXp9J-w_NGcGtL5DhDLy9gRd8,2250
169
+ kash/model/exec_model.py,sha256=OC-yS_mtDb-dKvzfglfNfGHRwVRbPYD3O9B7-lZWbBs,3032
169
170
  kash/model/graph_model.py,sha256=T034y0E9OJtITd1g9zp9vll5pLscdatq6JoT08KvPZE,2724
170
- kash/model/items_model.py,sha256=UMPA4-rmkX6XXuB1bFWP7KwUE4thOEp-tnfvwJCBols,35844
171
+ kash/model/items_model.py,sha256=CaKURUcisoWdZiNYq9Jh-LQxJP98FziJOnZ5WHAG_nQ,38051
171
172
  kash/model/language_list.py,sha256=I3RIbxTseVmPdhExQimimEv18Gmy2ImMbpXe0-_t1Qw,450
172
173
  kash/model/llm_actions_model.py,sha256=a29uXVNfS2CiqvM7HPdC6H9A23rSQQihAideuBLMH8g,2110
173
174
  kash/model/media_model.py,sha256=ZnlZ-FkswbAIGpUAuNqLce1WDZK-WbnwHn2ipg8x7-0,3511
174
175
  kash/model/operations_model.py,sha256=WmU-xeWGsqMLVN369dQEyVGU8T7G_KyLLsj6YFc5sVw,6517
175
- kash/model/params_model.py,sha256=vSFMjWfksysEhAOQ2Ge2ZEvRqgUmIL7febxcI3-7Smg,15083
176
+ kash/model/params_model.py,sha256=NHW-74_sFCY58spf9bzU1EaVxLDpdbqmiw8SCSKASCw,15079
176
177
  kash/model/paths_model.py,sha256=KDFm7wan7hjObHbnV2rR8-jsyLTVqbKcwFdKeLFRtdM,15889
177
178
  kash/model/preconditions_model.py,sha256=-IfsVR0NkQhq_3hUTXzK2bFYAd--3YjSwUiDKHVQQqk,2887
178
179
  kash/shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -193,7 +194,7 @@ kash/shell/output/kerm_code_utils.py,sha256=92A4AV-IFKKZMWLNZnd_zksNFMBgE_VNXySy
193
194
  kash/shell/output/kerm_codes.py,sha256=KLVdTM_dL_NeYmGbllzsQoW4IHXJjEsgqqIp1s7P1yI,18877
194
195
  kash/shell/output/kmarkdown.py,sha256=RRB5b0Ip0KZ71vnJKFfvxerYkeDFTCVTlHqHfmMy80Y,3675
195
196
  kash/shell/output/shell_formatting.py,sha256=oxmAeJ2j0ANYSUsL15CUv--KcGlQ6Wa_rywXSDlsZM4,3331
196
- kash/shell/output/shell_output.py,sha256=JfE3kHqAaeJmy_PUzdEuZsUNL4LwmNoarnpL3lXLYWI,11869
197
+ kash/shell/output/shell_output.py,sha256=yG-4YjQUkPQZASMRGcfVRUadOcRO6hm-eaAC74jms6c,11812
197
198
  kash/shell/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
198
199
  kash/shell/ui/shell_results.py,sha256=mvFHxK_oz3bNfF5_Twt6VqDO44TA1b256Bjf5oco804,4130
199
200
  kash/shell/ui/shell_syntax.py,sha256=1fuDqcCV16AAWwWS4w4iT-tlSnl-Ywdrf68Ge8XIfmQ,751
@@ -223,13 +224,13 @@ kash/utils/common/type_utils.py,sha256=SJirXhPilQom_-OKkFToDLm_82ZwpjcNjRy8U1HaQ
223
224
  kash/utils/common/uniquifier.py,sha256=75OY4KIVF8u1eoO0FCPbEGTyVpPOtM-0ctoG_s_jahM,3082
224
225
  kash/utils/common/url.py,sha256=R_P-CkOUiFxVdo9COcaL7YFvFIoAULj5-XxvmlFLvzo,9416
225
226
  kash/utils/common/url_slice.py,sha256=QJb_qJp-hd5lFrxpw7P009yeMTJWDMfF11KRKEo7mIA,10963
226
- kash/utils/file_formats/chat_format.py,sha256=Onby7Zany1UQSUo_JzLs6MIfmoXViZeOAacRTMVe92M,11818
227
+ kash/utils/file_formats/chat_format.py,sha256=XQpyUyq3jBKqM1f1eRZmg5hPBWZIobHNusQPFctFbRQ,11901
227
228
  kash/utils/file_utils/__init__.py,sha256=loL_iW0oOZs0mJ5GelBPptBcqzYKSWdsGcHrpRyxitQ,43
228
229
  kash/utils/file_utils/csv_utils.py,sha256=ZqchXD4y0buWtgnEsR_UeHyWBHM1wEJl5u-IxQvFa3s,4064
229
230
  kash/utils/file_utils/dir_info.py,sha256=HamMr58k_DanTLifj7A2JDxTGWXEZZx2pQuE6Hjcm8g,1856
230
- kash/utils/file_utils/file_ext.py,sha256=-H63vlrVI3pfE2Cn_9qF7-QLDaUIu_njc4TieNgAHSY,1860
231
- kash/utils/file_utils/file_formats.py,sha256=fANAe5Dq5y_Vw_LaWvvy9hH6rXqaW7u-7Z2sbQhgeE4,4942
232
- kash/utils/file_utils/file_formats_model.py,sha256=KA697MPW-V0Xw82eeNATW1UrnUMnzldFKA1XWM3Obq0,15628
231
+ kash/utils/file_utils/file_ext.py,sha256=U0fG3rowgtc56fNhhCK8P1UCYFbCNoa87pv7mGiEQgA,1876
232
+ kash/utils/file_utils/file_formats.py,sha256=4bq0-ZomFidL2GJBFyszGPurNQeTMOdLaXlGgrXznhA,4973
233
+ kash/utils/file_utils/file_formats_model.py,sha256=WqtAb10_vBuWeP2cUHzUHNjNmLx5GdqPjsnuqziB6Zg,15970
233
234
  kash/utils/file_utils/file_sort_filter.py,sha256=_k1chT3dJl5lSmKA2PW90KaoG4k4zftGdtwWoNEljP4,7136
234
235
  kash/utils/file_utils/file_walk.py,sha256=cpwVDPuaVm95_ZwFJiAdIuZAGhASI3gJ3ZUsCGP75b8,5527
235
236
  kash/utils/file_utils/filename_parsing.py,sha256=drHrH2B9W_5yAbXURNGJxNqj9GmTe8FayH6Gjw9e4-U,4194
@@ -244,11 +245,12 @@ kash/utils/rich_custom/multitask_status.py,sha256=eOON62evEAOmmNyVBSjfYkh5y9OTej
244
245
  kash/utils/rich_custom/rich_char_transform.py,sha256=3M89tViKM0y31VHsDoHi5eHFWlv5ME7F4p35IdDxnrw,2616
245
246
  kash/utils/rich_custom/rich_indent.py,sha256=nz72yNpUuYjOsaPNVmxM81oEQm-GKEfQkNsuWmv16G0,2286
246
247
  kash/utils/rich_custom/rich_markdown_fork.py,sha256=M_JRaSAyHrSg-wuLv9C9P7SkehSim3lwkqQPuMIFkVw,26551
247
- kash/utils/text_handling/doc_normalization.py,sha256=UtVfaSHE5k_n7BzTbOkc5FUJtXiTbaw9QUl03AnCvLs,3043
248
+ kash/utils/text_handling/doc_normalization.py,sha256=GsK8J8HSVINYYIeO2XQvWYK1ZSiQ6mX34mVb9UOjgG8,3029
248
249
  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
249
251
  kash/utils/text_handling/markdown_render.py,sha256=LHPdJc__2ejBx7iwkp_P9wIePNmiVSgwu4-uhamVjms,3791
250
- kash/utils/text_handling/markdown_utils.py,sha256=tAPMZulEcJOmWQHnZVKRqstThmsLB0mm7Fey5DHMFvc,31985
251
- kash/utils/text_handling/markdownify_utils.py,sha256=xNMlBX36BJ5VK5kxY2Ofo-Q84R2kBSM91u1grkQ-5As,2925
252
+ kash/utils/text_handling/markdown_utils.py,sha256=Yf57dVljpbg8vuHbtcOSHZqz1PafOSBal6R8ESJz1Bs,49220
253
+ kash/utils/text_handling/markdownify_utils.py,sha256=fXl3uSUk9aHXL0PDqxdlvWvIvBXUQTOfQxnK9uicQcg,2964
252
254
  kash/utils/text_handling/unified_diffs.py,sha256=JfHSakISkT_GuBPBI4fTooHrp2aenWzDKiVvDewVfMk,2655
253
255
  kash/web_content/canon_url.py,sha256=Zv2q7xQdIHBFkxxwyJn3_ME-qqMFRi_fKxE_IgV2Z50,742
254
256
  kash/web_content/dir_store.py,sha256=BJc-s-RL5CC-GwhFTC_lhLXSMWluPPnLVmVBx-66DiM,3425
@@ -261,20 +263,23 @@ kash/web_content/web_extract_readabilipy.py,sha256=IT7ET5IoU2-Nf37-Neh6CkKMvLL3W
261
263
  kash/web_content/web_fetch.py,sha256=hC4kijKVez4_QtfwdE0OPrEkfEGT2hVcB1vVZko8o78,12129
262
264
  kash/web_content/web_page_model.py,sha256=TWgWreGOoOvl7lUkjMSd0rxoDf2VuaKOq7WijwydW0Q,1387
263
265
  kash/web_gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
264
- kash/web_gen/simple_webpage.py,sha256=ks_0ljxCeS2-gAAEaUc1JEnzY3JY0nzqGFiyyqyRuZs,1537
265
266
  kash/web_gen/tabbed_webpage.py,sha256=e0GGG1bQ4CQegpJgOIT2KpyM6cmwN_BQ9eJSsi4BjgY,4945
266
267
  kash/web_gen/template_render.py,sha256=aypo6UanouftV4RpxgNm6JdquelI52fV0IlihdA3yjE,1908
268
+ kash/web_gen/webpage_render.py,sha256=C3xFdmTROh_cWcuh1q2ZXnbeJfgK8wEZ7b1PBAB5i2g,3352
267
269
  kash/web_gen/templates/base_styles.css.jinja,sha256=9ftNuhUrTpS8TcxP239AqWsIhPl_i0wS0J4rhsvQkrM,24962
268
270
  kash/web_gen/templates/base_webpage.html.jinja,sha256=ZP9p1S29yXNZ6CU0DYYAXUA-v6YhnUv9NLX4aYupvBE,14723
269
- kash/web_gen/templates/content_styles.css.jinja,sha256=1gHukwjv6PR5APX9KwNqMOBIKUjFenuudVZ8fjtavYY,4672
271
+ kash/web_gen/templates/content_styles.css.jinja,sha256=NyZRUNIrqf7RuJ0_bVuvwiQmimcWNh067bFvtb2xp-Q,6002
270
272
  kash/web_gen/templates/explain_view.html.jinja,sha256=DNw5Iw5SrhIUFRGB4qNvfcKXsBHVbEJVURGdhvyC75Q,949
271
273
  kash/web_gen/templates/item_view.html.jinja,sha256=_b51RuoBmYu7nxVq-S_zw_tv8mfQXHICGqfDWNIB9Xg,7304
272
274
  kash/web_gen/templates/simple_webpage.html.jinja,sha256=_RVu0AvrN5fK_Kz-tEi4AlPQ_wuu8-S9oFIYg_sdcec,2556
273
275
  kash/web_gen/templates/tabbed_webpage.html.jinja,sha256=umkipUXW-lDGnbV-tlDroCfCx_385PFnpbzsvwmityo,1843
276
+ kash/web_gen/templates/youtube_webpage.html.jinja,sha256=uUdu3HWv0lwwgEh094QbzzesxAdYv9rCxCkiuuIr1MY,1380
274
277
  kash/web_gen/templates/components/toc_scripts.js.jinja,sha256=9AanLJaVormGi52h-k2tKJTRT4BiBGGNnw3Kmrnr40Q,10481
275
278
  kash/web_gen/templates/components/toc_styles.css.jinja,sha256=SM99C9bOu11qdZ1U6hN7lLe2w_Hk6u9qNZcx2knSkgg,7553
276
- kash/web_gen/templates/components/tooltip_scripts.js.jinja,sha256=iz_5L5X4D4D1guotJjGVxMh5LcyOpjepw1R3nQd1NLE,32084
279
+ kash/web_gen/templates/components/tooltip_scripts.js.jinja,sha256=63HUSXtT07Vh2ndp90ViuPHTdzslrkGO5it4s-5EheM,40181
277
280
  kash/web_gen/templates/components/tooltip_styles.css.jinja,sha256=tD-GBEFNIeVPAbbeB88bsOWzEFoThcSP5FfH9LmSAeM,14216
281
+ kash/web_gen/templates/components/youtube_popover_scripts.js.jinja,sha256=txlltrlP-xDvkFDd_ZOKNKA1Kr5aS3VSFQ51TqeKCpU,7383
282
+ kash/web_gen/templates/components/youtube_popover_styles.css.jinja,sha256=00hVUdGXpJSxKevid4DPTpxxrEc6ejJUurzRjUpnUDI,4113
278
283
  kash/workspaces/__init__.py,sha256=q1gFERRZLJMA9-XSUKvB1ulauHDKqyzzc86GFLbxAuk,700
279
284
  kash/workspaces/param_state.py,sha256=vT_eGWqg2SRviIM5jqEAauznX2B5Xt2nHHu2oRxTcIU,746
280
285
  kash/workspaces/selections.py,sha256=rEUuQlrQ3C_54bzBSKDTTptgX8oZPqN0Ao4uaXSWA-Q,12003
@@ -282,9 +287,9 @@ kash/workspaces/source_items.py,sha256=Pwnw3OhjR2IJEMEeHf6hpKloj-ellM5vsY7LgkGev
282
287
  kash/workspaces/workspace_dirs.py,sha256=kjuY4t7mSSXq00fZmln7p9TWq4kAZoPTCDM0DG7uEaI,1545
283
288
  kash/workspaces/workspace_output.py,sha256=MMg_KumkHKFGc0DOUFaW5ImpgqIfdlsLtvXbLEt1hwI,5692
284
289
  kash/workspaces/workspace_registry.py,sha256=SQt2DZgBEu95Zj9fpy67XdJPgJyKFDCU2laSuiZswNo,2200
285
- kash/workspaces/workspaces.py,sha256=ypxlX2K64QOhNsta69arlvKbiVpUW_4CDeX_sEcIQbg,6907
290
+ kash/workspaces/workspaces.py,sha256=H-VpigO2zvWvWCZIT2G-cqEqcZATiwCLFX2jwFW08bw,6781
286
291
  kash/xonsh_custom/command_nl_utils.py,sha256=6Xcx98HXL5HywziHi0XskwFx6kfvz7oCmMX-siJib1A,3392
287
- kash/xonsh_custom/custom_shell.py,sha256=xthM_CAHw6FNlXx-vicLXfRgMHK2f7MpLprhc8PCD84,19005
292
+ kash/xonsh_custom/custom_shell.py,sha256=wTYwDt6zJzVtljcDh1j__cJXkoMy9w687vhgDk6nlqU,19024
288
293
  kash/xonsh_custom/customize_prompt.py,sha256=u-jRY-ftXYflBkbJVetEg6GYelPUvqZEpjrPRUTfy8w,6896
289
294
  kash/xonsh_custom/load_into_xonsh.py,sha256=Z_PAaW_Uv-PDRKdw9E_7dC1eMe6FbwwIUioxyS1Sp_g,3596
290
295
  kash/xonsh_custom/shell_load_commands.py,sha256=2SzigO-IDK5QTBhAkv7bL4hPuRLWIT0r5D9t4mrXANY,4673
@@ -296,8 +301,8 @@ kash/xonsh_custom/xonsh_modern_tools.py,sha256=mj_b34LZXfE8MJe9EpDmp5JZ0tDM1biYN
296
301
  kash/xonsh_custom/xonsh_ranking_completer.py,sha256=ZRGiAfoEgqgnlq2-ReUVEaX5oOgW1DQ9WxIv2OJLuTo,5620
297
302
  kash/xontrib/fnm.py,sha256=V2tsOdmIDgbFbZSfMLpsvDIwwJJqiYnOkOySD1cXNXw,3700
298
303
  kash/xontrib/kash_extension.py,sha256=FLIMlgR3C_6A1fwKE-Ul0nmmpJSszVPbAriinUyQ8Zg,1896
299
- kash_shell-0.3.28.dist-info/METADATA,sha256=IM3U_GjrsZruEj5jtyFT3grUb6TGe-kRzzwO2MdLIxY,33080
300
- kash_shell-0.3.28.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
301
- kash_shell-0.3.28.dist-info/entry_points.txt,sha256=SQraWDAo8SqYpthLXThei0mf_hGGyhYBUO-Er_0HcwI,85
302
- kash_shell-0.3.28.dist-info/licenses/LICENSE,sha256=rCh2PsfYeiU6FK_0wb58kHGm_Fj5c43fdcHEexiVzIo,34562
303
- kash_shell-0.3.28.dist-info/RECORD,,
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,,
@@ -1,72 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass
4
- from typing import Literal, TypeAlias
5
-
6
- from prettyfmt import custom_key_sort
7
-
8
- from kash.llm_utils.llm_names import LLMName
9
- from kash.llm_utils.llms import LLM
10
-
11
- Speed: TypeAlias = Literal["fast", "medium", "slow"]
12
-
13
- ContextSize: TypeAlias = Literal["small", "medium", "large"]
14
-
15
- ModelSize: TypeAlias = Literal["small", "medium", "large"]
16
-
17
-
18
- @dataclass(frozen=True)
19
- class LLMFeatures:
20
- speed: Speed | None = None
21
- context_size: ContextSize | None = None
22
- model_size: ModelSize | None = None
23
- structured_output: bool | None = None
24
- thinking: bool = False
25
-
26
- def satisfies(self, features: LLMFeatures) -> bool:
27
- return all(
28
- getattr(self, attr) == getattr(features, attr)
29
- for attr in features.__dataclass_fields__
30
- if getattr(self, attr) is not None
31
- )
32
-
33
-
34
- def pick_llm(desired_features: LLMFeatures) -> LLMName:
35
- """
36
- Pick the preferred model that satisfies the desired features.
37
- """
38
- satisfied_models: list[LLMName] = [
39
- llm for llm, features in FEATURES.items() if features.satisfies(desired_features)
40
- ]
41
- satisfied_models.sort(key=custom_key_sort(preferred_llms))
42
- if not satisfied_models:
43
- raise ValueError(f"No model found for features: {desired_features}")
44
- return satisfied_models[0]
45
-
46
-
47
- FEATURES = {
48
- LLM.o3_mini: LLMFeatures(
49
- speed="fast",
50
- context_size="small",
51
- model_size="small",
52
- structured_output=True,
53
- thinking=True,
54
- ),
55
- # FIXME
56
- }
57
-
58
- preferred_llms: list[LLMName] = [
59
- LLM.o4_mini,
60
- LLM.o3,
61
- LLM.o3_mini,
62
- LLM.o1_mini,
63
- LLM.o1,
64
- LLM.gpt_4o_mini,
65
- LLM.gpt_4o,
66
- LLM.gpt_4,
67
- LLM.claude_4_sonnet,
68
- LLM.claude_4_opus,
69
- LLM.claude_3_7_sonnet,
70
- LLM.claude_3_5_haiku,
71
- LLM.gemini_2_5_pro,
72
- ]