kash-shell 0.3.20__py3-none-any.whl → 0.3.22__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 (40) hide show
  1. kash/actions/core/markdownify_html.py +11 -0
  2. kash/actions/core/tabbed_webpage_generate.py +2 -2
  3. kash/commands/help/assistant_commands.py +2 -4
  4. kash/commands/help/logo.py +12 -17
  5. kash/commands/help/welcome.py +5 -4
  6. kash/config/colors.py +8 -6
  7. kash/config/text_styles.py +2 -0
  8. kash/docs/markdown/topics/b1_kash_overview.md +34 -45
  9. kash/docs/markdown/warning.md +3 -3
  10. kash/docs/markdown/welcome.md +2 -1
  11. kash/exec/action_decorators.py +20 -5
  12. kash/exec/fetch_url_items.py +6 -4
  13. kash/exec/llm_transforms.py +1 -1
  14. kash/exec/preconditions.py +7 -2
  15. kash/exec/shell_callable_action.py +1 -1
  16. kash/llm_utils/llm_completion.py +1 -1
  17. kash/model/actions_model.py +6 -0
  18. kash/model/items_model.py +14 -11
  19. kash/shell/output/shell_output.py +20 -1
  20. kash/utils/api_utils/api_retries.py +305 -0
  21. kash/utils/api_utils/cache_requests_limited.py +84 -0
  22. kash/utils/api_utils/gather_limited.py +987 -0
  23. kash/utils/api_utils/progress_protocol.py +299 -0
  24. kash/utils/common/function_inspect.py +66 -1
  25. kash/utils/common/testing.py +10 -7
  26. kash/utils/rich_custom/multitask_status.py +631 -0
  27. kash/utils/text_handling/escape_html_tags.py +16 -11
  28. kash/utils/text_handling/markdown_render.py +1 -0
  29. kash/utils/text_handling/markdown_utils.py +158 -1
  30. kash/web_gen/tabbed_webpage.py +2 -2
  31. kash/web_gen/templates/base_styles.css.jinja +26 -20
  32. kash/web_gen/templates/components/toc_styles.css.jinja +1 -1
  33. kash/web_gen/templates/components/tooltip_scripts.js.jinja +171 -19
  34. kash/web_gen/templates/components/tooltip_styles.css.jinja +23 -8
  35. kash/xonsh_custom/load_into_xonsh.py +0 -3
  36. {kash_shell-0.3.20.dist-info → kash_shell-0.3.22.dist-info}/METADATA +3 -1
  37. {kash_shell-0.3.20.dist-info → kash_shell-0.3.22.dist-info}/RECORD +40 -35
  38. {kash_shell-0.3.20.dist-info → kash_shell-0.3.22.dist-info}/WHEEL +0 -0
  39. {kash_shell-0.3.20.dist-info → kash_shell-0.3.22.dist-info}/entry_points.txt +0 -0
  40. {kash_shell-0.3.20.dist-info → kash_shell-0.3.22.dist-info}/licenses/LICENSE +0 -0
@@ -7,8 +7,8 @@ const TOOLTIP_CONFIG = {
7
7
  // Timing delays (in milliseconds)
8
8
  delays: {
9
9
  show: 500, // Delay before showing tooltip
10
- hide: 1500, // Default delay before hiding tooltip
11
- hideWideRight: 2000, // Delay for wide-right tooltips (farther away)
10
+ hide: 2500, // Default delay before hiding tooltip
11
+ hideWideRight: 4000, // Delay for wide-right tooltips (farther away)
12
12
  hideMovingToward: 500, // Shorter delay when mouse moving toward tooltip
13
13
  hideLinkClick: 300, // Delay after clicking a link in tooltip
14
14
  },
@@ -79,6 +79,14 @@ const TooltipUtils = {
79
79
  return this.extractContent(element, true);
80
80
  },
81
81
 
82
+ // Add footnote navigation button to tooltip content
83
+ addFootnoteNavigationButton(content, footnoteId) {
84
+ const navButton = `<span class="footnote-nav-container">
85
+ <a href="#${footnoteId}" class="footnote" data-footnote-id="${footnoteId}" title="Go to footnote">&nbsp;↓&nbsp;</a>
86
+ </span>`;
87
+ return content + navButton;
88
+ },
89
+
82
90
  // Determine optimal tooltip position based on element location and screen size
83
91
  getOptimalPosition(element) {
84
92
  const viewportWidth = window.innerWidth;
@@ -106,6 +114,69 @@ const TooltipUtils = {
106
114
  }
107
115
  };
108
116
 
117
+ /* -----------------------------------------------------------------------------
118
+ Mobile tap-outside-to-close functionality
119
+ ----------------------------------------------------------------------------- */
120
+
121
+ // Mobile interaction manager
122
+ const MobileInteractionManager = {
123
+ isActive: false,
124
+
125
+ // Initialize mobile interaction handling
126
+ init() {
127
+ if (this.isActive) return;
128
+
129
+ // Only activate on mobile screens
130
+ if (window.innerWidth <= TOOLTIP_CONFIG.breakpoints.mobile) {
131
+ this.activate();
132
+ }
133
+
134
+ // Listen for resize events to activate/deactivate
135
+ window.addEventListener('resize', () => {
136
+ if (window.innerWidth <= TOOLTIP_CONFIG.breakpoints.mobile) {
137
+ this.activate();
138
+ } else {
139
+ this.deactivate();
140
+ }
141
+ });
142
+ },
143
+
144
+ // Activate mobile interaction handling
145
+ activate() {
146
+ if (this.isActive) return;
147
+ this.isActive = true;
148
+ document.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: true });
149
+ console.debug('Mobile interaction manager activated');
150
+ },
151
+
152
+ // Deactivate mobile interaction handling
153
+ deactivate() {
154
+ if (!this.isActive) return;
155
+ this.isActive = false;
156
+ document.removeEventListener('touchstart', this.handleTouchStart.bind(this));
157
+ console.debug('Mobile interaction manager deactivated');
158
+ },
159
+
160
+ // Handle touch start events
161
+ handleTouchStart(event) {
162
+ // Check if any tooltip is visible
163
+ const hasVisibleTooltips = Array.from(TooltipManager.activeTooltips.values())
164
+ .some(state => state.isVisible);
165
+
166
+ if (!hasVisibleTooltips) return;
167
+
168
+ // Check if touch is outside all tooltips
169
+ const touchedElement = event.target;
170
+ const isInsideTooltip = touchedElement.closest('.tooltip-element');
171
+ const isTooltipTrigger = touchedElement.closest('[data-tooltip-trigger]');
172
+
173
+ if (!isInsideTooltip && !isTooltipTrigger) {
174
+ // Close all tooltips
175
+ TooltipManager.closeAllTooltips();
176
+ }
177
+ }
178
+ };
179
+
109
180
  /* -----------------------------------------------------------------------------
110
181
  Generic tooltip creation and management functions
111
182
  ----------------------------------------------------------------------------- */
@@ -115,7 +186,7 @@ const TooltipManager = {
115
186
  activeTooltips: new Map(), // Track active tooltip states
116
187
 
117
188
  // Add tooltip to any element with HTML content
118
- addTooltip(element, htmlContent, position = 'auto') {
189
+ addTooltip(element, htmlContent, position = 'auto', options = {}) {
119
190
  if (!element || !htmlContent) return;
120
191
 
121
192
  // Check if tooltip already exists for this element
@@ -128,7 +199,7 @@ const TooltipManager = {
128
199
  TooltipUtils.getOptimalPosition(element) : position;
129
200
 
130
201
  // Create real DOM tooltip element
131
- const tooltipElement = this.createTooltipElement(htmlContent, actualPosition);
202
+ const tooltipElement = this.createTooltipElement(htmlContent, actualPosition, options);
132
203
 
133
204
  // Mark the trigger element
134
205
  element.setAttribute('data-tooltip-trigger', 'true');
@@ -147,29 +218,62 @@ const TooltipManager = {
147
218
  }
148
219
 
149
220
  // Set up enhanced hover behavior
150
- this.setupAdvancedHover(element, tooltipElement, actualPosition);
221
+ this.setupAdvancedHover(element, tooltipElement, actualPosition, options);
151
222
  },
152
223
 
153
224
  // Create a real DOM tooltip element
154
- createTooltipElement(htmlContent, position) {
225
+ createTooltipElement(htmlContent, position, options = {}) {
155
226
  const tooltip = document.createElement('div');
156
227
  tooltip.className = `tooltip-element tooltip-${position}`;
157
228
 
158
229
  // Add footnote-specific class if content contains footnote or links
159
- if (htmlContent.includes('footnote') || htmlContent.includes('<a')) {
230
+ if (htmlContent.includes('footnote') || htmlContent.includes('<a') || options.isFootnote) {
160
231
  tooltip.classList.add('footnote-element');
161
232
  }
162
233
 
163
234
  tooltip.innerHTML = htmlContent;
235
+
236
+ // Set up footnote navigation button if present
237
+ if (options.isFootnote) {
238
+ this.setupFootnoteNavigation(tooltip, options.footnoteId);
239
+ }
240
+
164
241
  return tooltip;
165
242
  },
166
243
 
244
+ // Set up footnote navigation link functionality
245
+ setupFootnoteNavigation(tooltipElement, footnoteId) {
246
+ const navLink = tooltipElement.querySelector('.footnote-nav-container .footnote');
247
+ if (navLink) {
248
+ navLink.addEventListener('click', (e) => {
249
+ e.preventDefault();
250
+ e.stopPropagation();
251
+
252
+ // Navigate to the footnote
253
+ const footnoteElement = document.getElementById(footnoteId);
254
+ if (footnoteElement) {
255
+ footnoteElement.scrollIntoView({ behavior: 'smooth', block: 'center' });
256
+
257
+ // Close tooltip after navigation
258
+ setTimeout(() => {
259
+ const tooltipState = Array.from(this.activeTooltips.values())
260
+ .find(state => state.tooltipElement === tooltipElement);
261
+ if (tooltipState) {
262
+ this.hideTooltip(tooltipState);
263
+ }
264
+ }, TOOLTIP_CONFIG.delays.hideLinkClick);
265
+ }
266
+ });
267
+ }
268
+ },
269
+
167
270
  // Set up advanced hover behavior with delays and mouse tracking
168
- setupAdvancedHover(triggerElement, tooltipElement, position) {
271
+ setupAdvancedHover(triggerElement, tooltipElement, position, options = {}) {
169
272
  const tooltipState = {
170
273
  triggerElement,
171
274
  tooltipElement,
172
275
  position,
276
+ options,
173
277
  showTimeout: null,
174
278
  hideTimeout: null,
175
279
  isVisible: false
@@ -181,6 +285,7 @@ const TooltipManager = {
181
285
  const handlers = {
182
286
  triggerEnter: (e) => this.handleTriggerEnter(tooltipState, e),
183
287
  triggerLeave: (e) => this.handleTriggerLeave(tooltipState, e),
288
+ triggerTouch: (e) => this.handleTriggerTouch(tooltipState, e),
184
289
  tooltipEnter: () => this.handleTooltipEnter(tooltipState),
185
290
  tooltipLeave: () => this.handleTooltipLeave(tooltipState),
186
291
  tooltipClick: (e) => this.handleTooltipClick(tooltipState, e)
@@ -189,6 +294,7 @@ const TooltipManager = {
189
294
  // Add event listeners
190
295
  triggerElement.addEventListener('mouseenter', handlers.triggerEnter);
191
296
  triggerElement.addEventListener('mouseleave', handlers.triggerLeave);
297
+ triggerElement.addEventListener('touchstart', handlers.triggerTouch, { passive: false });
192
298
  tooltipElement.addEventListener('mouseenter', handlers.tooltipEnter);
193
299
  tooltipElement.addEventListener('mouseleave', handlers.tooltipLeave);
194
300
  tooltipElement.addEventListener('click', handlers.tooltipClick);
@@ -197,6 +303,7 @@ const TooltipManager = {
197
303
  tooltipState.cleanupListeners = () => {
198
304
  triggerElement.removeEventListener('mouseenter', handlers.triggerEnter);
199
305
  triggerElement.removeEventListener('mouseleave', handlers.triggerLeave);
306
+ triggerElement.removeEventListener('touchstart', handlers.triggerTouch);
200
307
  tooltipElement.removeEventListener('mouseenter', handlers.tooltipEnter);
201
308
  tooltipElement.removeEventListener('mouseleave', handlers.tooltipLeave);
202
309
  tooltipElement.removeEventListener('click', handlers.tooltipClick);
@@ -228,6 +335,26 @@ const TooltipManager = {
228
335
  }
229
336
  },
230
337
 
338
+ // Handle touch events on trigger elements (mobile)
339
+ handleTriggerTouch(tooltipState, event) {
340
+ // Prevent default to avoid triggering mouse events and navigation
341
+ event.preventDefault();
342
+ event.stopPropagation();
343
+
344
+ // If tooltip is already visible, hide it
345
+ if (tooltipState.isVisible) {
346
+ this.hideTooltip(tooltipState);
347
+ return;
348
+ }
349
+
350
+ // Cancel any pending timers
351
+ this.clearTimeout(tooltipState, 'hideTimeout');
352
+ this.clearTimeout(tooltipState, 'showTimeout');
353
+
354
+ // Show tooltip immediately on touch (no delay like hover)
355
+ this.showTooltip(tooltipState, event);
356
+ },
357
+
231
358
  // Handle tooltip mouse enter
232
359
  handleTooltipEnter(tooltipState) {
233
360
  this.clearTimeout(tooltipState, 'hideTimeout');
@@ -242,14 +369,17 @@ const TooltipManager = {
242
369
 
243
370
  // Handle clicks within tooltip
244
371
  handleTooltipClick(tooltipState, event) {
245
- // Allow clicks on links within tooltips
246
- if (event.target.tagName === 'A') {
372
+ // Allow clicks on all links and buttons within tooltips
373
+ if (event.target.tagName === 'A' || event.target.tagName === 'BUTTON' ||
374
+ event.target.closest('a') || event.target.closest('button')) {
247
375
  event.stopPropagation();
248
- // Keep tooltip open briefly after clicking a link
249
- this.clearTimeout(tooltipState, 'hideTimeout');
250
- tooltipState.hideTimeout = setTimeout(() => {
251
- this.hideTooltip(tooltipState);
252
- }, TOOLTIP_CONFIG.delays.hideLinkClick);
376
+ // Keep tooltip open briefly after clicking a link (except footnote nav link)
377
+ if (!event.target.closest('.footnote-nav-container')) {
378
+ this.clearTimeout(tooltipState, 'hideTimeout');
379
+ tooltipState.hideTimeout = setTimeout(() => {
380
+ this.hideTooltip(tooltipState);
381
+ }, TOOLTIP_CONFIG.delays.hideLinkClick);
382
+ }
253
383
  }
254
384
  },
255
385
 
@@ -632,8 +762,9 @@ const TooltipManager = {
632
762
 
633
763
  if (shouldBeWideRight !== isWideRight) {
634
764
  const htmlContent = tooltipState.tooltipElement.innerHTML;
765
+ const options = tooltipState.options;
635
766
  this.removeTooltip(element);
636
- this.addTooltip(element, htmlContent, 'auto');
767
+ this.addTooltip(element, htmlContent, 'auto', options);
637
768
  }
638
769
  });
639
770
  }
@@ -667,6 +798,18 @@ function initFootnoteTooltips() {
667
798
  return;
668
799
  }
669
800
 
801
+ // Prevent default action immediately for all footnote reference links
802
+ refLink.addEventListener('click', (e) => {
803
+ e.preventDefault();
804
+ return false;
805
+ });
806
+
807
+ // Also prevent default on touch events for mobile
808
+ refLink.addEventListener('touchend', (e) => {
809
+ e.preventDefault();
810
+ return false;
811
+ });
812
+
670
813
  // Extract and validate content
671
814
  const footnoteHtml = TooltipUtils.extractHtmlContent(footnoteElement);
672
815
  const footnoteText = TooltipUtils.extractTextContent(footnoteElement);
@@ -677,10 +820,16 @@ function initFootnoteTooltips() {
677
820
  }
678
821
 
679
822
  // Truncate if needed
680
- const displayContent = truncateFootnoteContent(footnoteHtml, footnoteText);
823
+ let displayContent = truncateFootnoteContent(footnoteHtml, footnoteText);
681
824
 
682
- // Add tooltip
683
- TooltipManager.addTooltip(refLink, displayContent, 'auto');
825
+ // Add footnote navigation button
826
+ displayContent = TooltipUtils.addFootnoteNavigationButton(displayContent, footnoteId);
827
+
828
+ // Add tooltip with footnote options
829
+ TooltipManager.addTooltip(refLink, displayContent, 'auto', {
830
+ isFootnote: true,
831
+ footnoteId: footnoteId
832
+ });
684
833
  tooltipsAdded++;
685
834
 
686
835
  console.debug(`Added tooltip for footnote ${footnoteId}: "${footnoteText.substring(0, 50)}..."`);
@@ -715,6 +864,9 @@ function initTooltips() {
715
864
  console.debug('Starting tooltip initialization...');
716
865
 
717
866
  try {
867
+ // Initialize mobile interaction manager
868
+ MobileInteractionManager.init();
869
+
718
870
  const footnoteCount = initFootnoteTooltips();
719
871
  console.debug(`Tooltip initialization complete. Total footnote tooltips: ${footnoteCount}`);
720
872
  } catch (error) {
@@ -62,10 +62,10 @@
62
62
  z-index: 1000;
63
63
 
64
64
  /* Tooltip styling - matching TOC active item */
65
- background: var(--color-bg-selected);
65
+ background: var(--color-bg-meta-solid);
66
66
  border: 1px solid var(--color-border-hint);
67
67
  border-left: 2px solid var(--color-primary);
68
- color: var(--color-secondary);
68
+ color: var(--color-text);
69
69
  font-family: var(--font-sans);
70
70
  font-size: var(--font-size-small);
71
71
  line-height: 1.4;
@@ -104,11 +104,6 @@
104
104
  pointer-events: auto;
105
105
  }
106
106
 
107
- /* Tooltip hover state */
108
- .tooltip-element:hover {
109
- background: var(--color-hover-bg);
110
- }
111
-
112
107
  /* -----------------------------------------------------------------------------
113
108
  General Tooltip Positioning - Using margin variables
114
109
  ----------------------------------------------------------------------------- */
@@ -323,7 +318,7 @@
323
318
 
324
319
  /* Footnote reference styling */
325
320
  .footnote-ref a[data-tooltip-trigger] {
326
- transition: color 0.4s ease-in-out;
321
+ transition: color 0.2s ease-in-out;
327
322
  }
328
323
 
329
324
  .footnote-ref a[data-tooltip-trigger]:hover {
@@ -367,6 +362,16 @@
367
362
  display: none;
368
363
  }
369
364
 
365
+ /* But show our navigation footnote link */
366
+ .footnote-element .footnote-nav-container .footnote {
367
+ display: inline;
368
+ text-decoration: none !important;
369
+ }
370
+
371
+ .footnote-element .footnote-nav-container .footnote:hover {
372
+ text-decoration: none !important;
373
+ }
374
+
370
375
  /* Text breaking rules for all tooltips */
371
376
  .tooltip-element .force-break,
372
377
  .tooltip-element code,
@@ -479,4 +484,14 @@
479
484
  .tooltip-element:not(.tooltip-mobile-bottom) {
480
485
  max-width: min(var(--tooltip-max-width), calc(100vw - 2rem)) !important;
481
486
  }
487
+ }
488
+
489
+ /* -----------------------------------------------------------------------------
490
+ Footnote Navigation Button Styles
491
+ ----------------------------------------------------------------------------- */
492
+
493
+ /* Container for footnote navigation link */
494
+ .footnote-nav-container {
495
+ float: right;
496
+ margin-left: 0.5rem;
482
497
  }
@@ -15,7 +15,6 @@ from kash.config.settings import RECOMMENDED_PKGS, check_kerm_code_support
15
15
  from kash.config.text_styles import LOGO_NAME, STYLE_HINT
16
16
  from kash.mcp.mcp_server_commands import start_mcp_server
17
17
  from kash.shell.output.shell_output import PrintHooks, cprint
18
- from kash.shell.version import get_version_tag
19
18
  from kash.workspaces import current_ws
20
19
  from kash.xonsh_custom.customize_prompt import get_prompt_info, kash_xonsh_prompt
21
20
  from kash.xonsh_custom.shell_load_commands import (
@@ -109,5 +108,3 @@ def load_into_xonsh():
109
108
 
110
109
  else:
111
110
  reload_shell_commands_and_actions()
112
-
113
- log.info("kash %s loaded", get_version_tag())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kash-shell
3
- Version: 0.3.20
3
+ Version: 0.3.22
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>
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Programming Language :: Python :: 3.13
17
17
  Classifier: Typing :: Typed
18
18
  Requires-Python: <4.0,>=3.11
19
+ Requires-Dist: aiolimiter>=1.2.1
19
20
  Requires-Dist: anyio>=4.8.0
20
21
  Requires-Dist: audioop-lts>=0.2.1; python_version >= '3.13'
21
22
  Requires-Dist: cachetools>=5.5.2
@@ -50,6 +51,7 @@ Requires-Dist: pydantic>=2.10.6
50
51
  Requires-Dist: pydub>=0.25.1
51
52
  Requires-Dist: pygments>=2.19.1
52
53
  Requires-Dist: pyperclip>=1.9.0
54
+ Requires-Dist: pyrate-limiter>=3.7.0
53
55
  Requires-Dist: python-dotenv>=1.0.1
54
56
  Requires-Dist: python-magic-bin>=0.4.14; platform_system == 'Windows'
55
57
  Requires-Dist: python-magic>=0.4.27; platform_system == 'Linux' or platform_system == 'Darwin'
@@ -4,7 +4,7 @@ kash/actions/__init__.py,sha256=a4pQw8O-Y3q5N4Qg2jUV0xEZLX6d164FQhZ6zizY9fE,1357
4
4
  kash/actions/core/assistant_chat.py,sha256=28G20cSr7Z94cltouTPve5TXY3km0lACrRvpLE27fK8,1837
5
5
  kash/actions/core/chat.py,sha256=yCannBFa0cSpR_in-XSSuMm1x2ZZQUCKmlqzhsUfpOo,2696
6
6
  kash/actions/core/format_markdown_template.py,sha256=ZJbtyTSypPo2ewLiGRSyIpVf711vQMhI_-Ng-FgCs80,2991
7
- kash/actions/core/markdownify_html.py,sha256=RXsC59rhDoLssRujkS32PETN1zzncIofFO7J3qTrnJc,1277
7
+ kash/actions/core/markdownify_html.py,sha256=luMXwwaY6E8oidgdrwV6KSgzdG0iX2JKS5aTNYDdZpA,1810
8
8
  kash/actions/core/minify_html.py,sha256=99r3SjpI2NQP7e5MnMixAiT5lxPx7t2nyJvJi6Yps6w,1365
9
9
  kash/actions/core/readability.py,sha256=ljdB2rOpzfKU2FpEJ2UELIzcdOAWvdUjFsxoHRTE3xo,989
10
10
  kash/actions/core/render_as_html.py,sha256=CIPGKCjUEVNsnXmpqHCUnjGwTfEfOyCXxlYFUN8mahY,1870
@@ -12,7 +12,7 @@ kash/actions/core/show_webpage.py,sha256=Ggba9jkx9U-FZOcuL0lkS-SwtPNUyxVsGdeQrqw
12
12
  kash/actions/core/strip_html.py,sha256=FDLN_4CKB11q5cU4NixTf7PGrAq92AjQNbKAdvQDwCY,849
13
13
  kash/actions/core/summarize_as_bullets.py,sha256=Zwr8lNzL77pwpnW_289LQjNBijNDpTPANfFdOJA-PZ4,2070
14
14
  kash/actions/core/tabbed_webpage_config.py,sha256=rIbzEhBTmnkbSiRZC-Rj46T1J6c0jOztiKE9Usa4nsc,980
15
- kash/actions/core/tabbed_webpage_generate.py,sha256=oYx9fdgY8NndFekXsZbil0luGa2OFDi2e0s5l7Toh7E,992
15
+ kash/actions/core/tabbed_webpage_generate.py,sha256=935HkDSuP4eZ1e0xf-LhjPOdicU3wI5Kuh79r61QCl8,988
16
16
  kash/actions/meta/write_instructions.py,sha256=zeKKX-Yi8jSyjvZ4Ii_4MNBRtM2MENuHyrD0Vxsaos8,1277
17
17
  kash/actions/meta/write_new_action.py,sha256=w7SJZ2FjzRbKwqKX9PeozUrh8cNJAumX7F80wW7dQts,6356
18
18
  kash/commands/__init__.py,sha256=MhdPSluWGE3XVQ7LSv2L8_aAxaey8CLjQBjGC9B4nRM,191
@@ -29,16 +29,16 @@ kash/commands/base/search_command.py,sha256=FXtP09HmmfHRrjenvmU4j0Lcw34piIzdI3UF
29
29
  kash/commands/base/show_command.py,sha256=rFyIW_5oZArRSTpe71PaX87Hq30WE-t6RAJKeCwJ3lM,3299
30
30
  kash/commands/extras/parse_uv_lock.py,sha256=HVqmGhJAd3ZCTTTaXe_nzzTMFKhwjLLP7hx4NTM224U,5696
31
31
  kash/commands/extras/utils_commands.py,sha256=rz3N7VxoUHvCxksRt-sLubkvyW-VH9OTltLEMEnjRfU,769
32
- kash/commands/help/assistant_commands.py,sha256=BhGhtyoiEbu6xYfi-r47g_U4pxptUkucyNmiv5_kg34,3042
32
+ kash/commands/help/assistant_commands.py,sha256=TR5HtKEoWWyK1VRfqm-SdSVHX0F3RUWrSMqAD78WXqs,3039
33
33
  kash/commands/help/doc_commands.py,sha256=7lKR7mzue2N7pSkNqblpFJy892fS5N6jWVOHqeXziHw,2466
34
34
  kash/commands/help/help_commands.py,sha256=eJTpIhXck123PAUq2k-D3Q6UL6IQ8atOVYurLi2GD0A,4229
35
- kash/commands/help/logo.py,sha256=W8SUach9FjoTqpHZwTGS582ry4ZluxbBp86ZCiAtDkY,3505
36
- kash/commands/help/welcome.py,sha256=F4QBgj3e1dM9Pf0H4TSzCrkVfXQVKUIl0b6Qmofbdo4,905
35
+ kash/commands/help/logo.py,sha256=4K3pPIiNlPIgdNeOgdIGbJQCKmqCEsDOhuWPH51msWo,3377
36
+ kash/commands/help/welcome.py,sha256=uM2UMtHG4oXTxU8IFlFbTOTmR5_XTCUtT828V_tKMsk,920
37
37
  kash/commands/workspace/selection_commands.py,sha256=nZzA-H7Pk8kqSJVRlX7j1m6cZX-e0X8isOryDU41vqU,8156
38
38
  kash/commands/workspace/workspace_commands.py,sha256=_2TcthGOu-nU9E_-jjf4kba9ldLRA6qe6Do6zV06EKc,21960
39
39
  kash/config/__init__.py,sha256=ytly9Typ1mWV4CXfV9G3CIPtPQ02u2rpZ304L3GlFro,148
40
40
  kash/config/capture_output.py,sha256=ud3uUVNuDicHj3mI_nBUBO-VmOrxtBdA3z-I3D1lSCU,2398
41
- kash/config/colors.py,sha256=qUUUE-x8srSp1IdJePNAUtNQbOZKBLix8FeOe-Rxmgg,13421
41
+ kash/config/colors.py,sha256=osHrR1rLrFV5j2kTdN4z-DDM-HmbnBfMaOj4NiBdFzg,13527
42
42
  kash/config/env_settings.py,sha256=uhCdfs9-TzJ15SzbuIQP1yIORaLUqYXCxh9qq_Z8cJc,996
43
43
  kash/config/init.py,sha256=aE4sZ6DggBmmoZEx9C5mQKrEbcDiswX--HF7pfCFKzc,526
44
44
  kash/config/lazy_imports.py,sha256=MCZXLnKvNyfHi0k7MU5rNwcdJtUF28naCixuogsAOAA,805
@@ -49,7 +49,7 @@ kash/config/server_config.py,sha256=eQ1yxDk031QI0Efp0I1VetqQd9wG7MrLVBCHFm4gp2g,
49
49
  kash/config/settings.py,sha256=P3g0RSR6vrvfovDDYOIx6Hxafrg1mYTAxrTiVgH2Tm4,8889
50
50
  kash/config/setup.py,sha256=zFxfTPG1cbsozuwUkIyAYebxuHhpYCiaexHnYnYJG1c,3524
51
51
  kash/config/suppress_warnings.py,sha256=yty5ZodMLIpmjphRtcVmRamXfiWbyfga9annve6qxb0,1475
52
- kash/config/text_styles.py,sha256=R9jHvupnC_ln3-wWksYLQXWZZBJCazr3ru8WyDsL6UA,13790
52
+ kash/config/text_styles.py,sha256=QCidaUPRbelZjBnI6Q_Dtw-g_4VHdr99g4KHvDyQAo4,13810
53
53
  kash/docs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
54
  kash/docs/all_docs.py,sha256=NutfgU8VOA7_K2HX18FoOHVvvLL14dALoCxK9qDbQ04,3157
55
55
  kash/docs/load_actions_info.py,sha256=D9uv8gdBtkBmdbFZeyIigsupPF9_WfidHVwWQrlggI0,937
@@ -59,15 +59,15 @@ kash/docs/load_source_code.py,sha256=CtMBUXrRetSO81HYW-DgJZ0bL_9Nn4GNidGKg-U11LU
59
59
  kash/docs/markdown/api_docs_template.md,sha256=nUjrV5FhDql8odjjPiwOK8roCUiauy31G2ARiS_OGiQ,1457
60
60
  kash/docs/markdown/assistant_instructions_template.md,sha256=Fzeledd_nr3bKhvQ1qZfMqyNtA7-_e05J5Jx5ecerBA,4758
61
61
  kash/docs/markdown/readme_template.md,sha256=iGx9IjSni1t_9BuYD5d2GgkxkNIkqvE3k78IufHF6Yg,409
62
- kash/docs/markdown/warning.md,sha256=bG0T3UFqAkzF8217J8AbIbQ7ftJ_GKMRilIGq9eLdYc,162
63
- kash/docs/markdown/welcome.md,sha256=yp_tmGXGIb8043ZDIL97Q1uaKVys7-ArHCprgDlon7w,611
62
+ kash/docs/markdown/warning.md,sha256=ipTFWQc1F0cPGrIG0epX5RqQH6PmshyZOoCQDz0zDos,88
63
+ kash/docs/markdown/welcome.md,sha256=uNI6CyZOuPUe6FZgKd9MpO_pumHxlGN7Lfhb52XJRa0,611
64
64
  kash/docs/markdown/topics/a1_what_is_kash.md,sha256=rgVrv6tRXEwdqQ54DAfHP3BSAuq8Ux4wCNeluTwpkhU,6758
65
65
  kash/docs/markdown/topics/a2_installation.md,sha256=DSzaniHjOYPC3soGLPTGOGDVvbiPTROtb3S8zYUCPEs,5736
66
66
  kash/docs/markdown/topics/a3_getting_started.md,sha256=xOMevEXMIpVJvTGuuwI9Cc9sun3tQM3OqCgynSgMpeM,9376
67
67
  kash/docs/markdown/topics/a4_elements.md,sha256=XNJRw-iqnytiIHOAshp1YnUpHM5KBgFAhuOdp_fekxQ,4615
68
68
  kash/docs/markdown/topics/a5_tips_for_use_with_other_tools.md,sha256=VGUdq8dm78E8PFbNR9BmV8Gj-r8zP-vOQz8TibQmGw0,3259
69
69
  kash/docs/markdown/topics/b0_philosophy_of_kash.md,sha256=ADtgbvv756vKrJPhdvNGVzJVedOgo6ak7_vGEEFi8Sc,8749
70
- kash/docs/markdown/topics/b1_kash_overview.md,sha256=xGNR6uGGwGAjCLOdt-ZFKE7csOOC4abIgQvov1FAOGE,10121
70
+ kash/docs/markdown/topics/b1_kash_overview.md,sha256=W-ctjXpLdhZhkW9Qnl5PpnbUbL_pLDQ9GN-KyHvhAdo,9255
71
71
  kash/docs/markdown/topics/b2_workspace_and_file_formats.md,sha256=DsiDjAe8FSIf18OjkPq-ttbhkpQO4c1UBVjcK2iy-BM,2845
72
72
  kash/docs/markdown/topics/b3_modern_shell_tool_recommendations.md,sha256=F-0mhSl7sm6mpTx17N4OaGn8DobTY6d9P0TjTsPqluI,2258
73
73
  kash/docs/markdown/topics/b4_faq.md,sha256=ofLMC1JxdWAMZkiUzyhJTewBhEti8ULEF8yOTViZZLA,7093
@@ -82,22 +82,22 @@ kash/embeddings/cosine.py,sha256=QTWPWUHivXjxCM6APSqij_-4mywM2BVVm0xb0hu7FHA,158
82
82
  kash/embeddings/embeddings.py,sha256=v6RmrEHsx5PuE3fPrY15RK4fgW0K_VlNWDTjCVr11zY,4451
83
83
  kash/embeddings/text_similarity.py,sha256=BOo9Vcs5oi2Zs5La56uTkPMHo65XSd4qz_yr6GTfUA4,1924
84
84
  kash/exec/__init__.py,sha256=Najls8No143yoj_KAaOQgo8ufC2LWCB_DwwEQ-8nDM0,1277
85
- kash/exec/action_decorators.py,sha256=VOSCnFiev2_DuFoSk0i_moejwM4wJ1j6QfsQd93uetI,16480
85
+ kash/exec/action_decorators.py,sha256=kCEqQFN1MIhRbFeIEGux956LzsiwonhyIIrJ8Pq9zPk,16765
86
86
  kash/exec/action_exec.py,sha256=O_4UB_Vt7QRxltviMeBwNIfw9ten06n4fQ39MregacE,19017
87
87
  kash/exec/action_registry.py,sha256=numU9pH_W5RgIrYmfi0iYMYy_kLJl6vup8PMrhxAfdc,2627
88
88
  kash/exec/combiners.py,sha256=AJ6wgPUHsmwanObsUw64B83XzU26yuh5t4l7igLn82I,4291
89
89
  kash/exec/command_exec.py,sha256=zc-gWm7kyB5J5Kp8xhULQ9Jj9AL927KkDPXXk-Yr1Bw,1292
90
90
  kash/exec/command_registry.py,sha256=1s2ogU8b8nqK_AEtslbr1eYrXCGDkeT30UrB7L0BRoM,2027
91
- kash/exec/fetch_url_items.py,sha256=UUj3wrP3adzZHV_Icx7zSB9zRtl0S7EC54Ios8fuvbg,4404
91
+ kash/exec/fetch_url_items.py,sha256=egTnrYaPHWRIXwO-Mgaxh1GINPtoy4VQXJlzGgQBj6Y,4441
92
92
  kash/exec/history.py,sha256=l2XwHGBR1UgTGSFPSBE9mltmxvjR_5qFFO6d-Z008nc,1208
93
93
  kash/exec/importing.py,sha256=xunmBapeUMNc6Zox7y6e_DZkidyWeouiFZpphajwSzc,1843
94
- kash/exec/llm_transforms.py,sha256=p_aLp70VoIgheW4v8uoweeuEVWj06AzQekvn_jM3B-g,4378
94
+ kash/exec/llm_transforms.py,sha256=n7S-Dew8z_BoAwp-14lY4LueFeUtG117eK_8msbn02c,4375
95
95
  kash/exec/precondition_checks.py,sha256=HymxL7qm4Yz8V76Um5pKdIRnQ2N-p9rpQQi1fI38bNA,2139
96
96
  kash/exec/precondition_registry.py,sha256=9O-01d2OrsYLuhqodVuWjouLR2ABJbUotAmfJNBCRzs,1439
97
- kash/exec/preconditions.py,sha256=6bJ76AVFo0TLoykrGBNB0rrpIDWD0umfb3F5sMcmoKo,5131
97
+ kash/exec/preconditions.py,sha256=fuK_tfI7FiJ5F36MXOgopFtD5O_gf8yLvQ-xjowNKSw,5221
98
98
  kash/exec/resolve_args.py,sha256=gu65epzVrwWHdHA-KwAwYssncJIB84oHOJeoXXrQ2mM,4428
99
99
  kash/exec/runtime_settings.py,sha256=aK6nGbZhKSIDVmV6AqV68hQkiaIGWnCiNzHtwwZ5V0w,3960
100
- kash/exec/shell_callable_action.py,sha256=x-Hs4EqpsZfKEcwhWkhc27HCIfoI91b-DrbG40BLxRY,4350
100
+ kash/exec/shell_callable_action.py,sha256=iSv3w33oJbIenOI6s9v5cHU4gX2U9w7MIWc8jHgk6HE,4377
101
101
  kash/exec_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
102
  kash/exec_model/args_model.py,sha256=gquOD0msFA-5xhNU-3R5l8wlwyAMefpMHltpxrDlYGQ,2662
103
103
  kash/exec_model/commands_model.py,sha256=iM8QhzA0tAas5OwF5liUfHtm45XIH1LcvCviuh3As7s,4923
@@ -128,7 +128,7 @@ kash/llm_utils/custom_sliding_transforms.py,sha256=z07WCdBoiywBIGk2EXK3xY4t_6g8I
128
128
  kash/llm_utils/fuzzy_parsing.py,sha256=bbG2Y7i5w6kxAVPAixyluv3MDS2hW_pkhnJpVOLHZQc,3278
129
129
  kash/llm_utils/init_litellm.py,sha256=5Fn9uW4P7lfEO8Rk1EJJUzDEGNjw-PDvxFgHlKDf-Ok,409
130
130
  kash/llm_utils/llm_api_keys.py,sha256=nTB9wSFfHTOXvqshSQCQGCPxUwOW1U7oslngya8nHkw,1168
131
- kash/llm_utils/llm_completion.py,sha256=qhDYRjiknAFrDm31atD8b22Rs_XwZELTft3eoiGgFp8,5442
131
+ kash/llm_utils/llm_completion.py,sha256=HPgxFys8RZsenfKq2S2dkUrpu-A88xXb-xK578zNd2g,5439
132
132
  kash/llm_utils/llm_features.py,sha256=tgcz8qQByZ80noybXS2144K9eCw1iOFxPYkCK2kJJOw,1861
133
133
  kash/llm_utils/llm_messages.py,sha256=70QwIIvdwo-h4Jfn_6MbEHb3LTUjUmzg_v_dU_Ey__g,1174
134
134
  kash/llm_utils/llm_names.py,sha256=VZbdKnoeBx_luB5YQ-Rz37gMt3_FcueJdp40ZaQbpUA,3620
@@ -158,13 +158,13 @@ kash/media_base/transcription_format.py,sha256=rOVPTpwvW22c27BRwYF-Tc_xzqK_wOtUZ
158
158
  kash/media_base/transcription_whisper.py,sha256=GqvroW9kBAH4-gcbYkMgNCfs2MpMIgm1ip3NMWtJ0IE,1169
159
159
  kash/media_base/services/local_file_media.py,sha256=_NV-T90rShJ8ucUjQXMPCKKJ50GSFE9PyyVzhXp5z9w,5624
160
160
  kash/model/__init__.py,sha256=kFfBKb5N70NWYUfpRRxn_Sb9p_vXlB6BBaTCqWmSReo,2978
161
- kash/model/actions_model.py,sha256=iEp8QSB7My5xT4lurv03vXG6COD8aTLpgiSh5GT7Cr4,22088
161
+ kash/model/actions_model.py,sha256=nYvQNr2M8ooFRL2YZ3_yPxFuqYdxO__6fFTgx5mxwbQ,22269
162
162
  kash/model/assistant_response_model.py,sha256=6eDfC27nyuBDFjv5nCYMa_Qb2mPbKwDzZy7uLOIyskI,2653
163
163
  kash/model/compound_actions_model.py,sha256=HiDK5wwCu3WwZYHATZoLEguiqwR9V6V296wiKtGIX8s,6926
164
164
  kash/model/concept_model.py,sha256=we2qOcy9Mv1q7XPfkDLp_CyO_-8DwAUfUYlpgy_jrFs,1011
165
165
  kash/model/exec_model.py,sha256=IlfvtQyoFRRWhWju7vdXp9J-w_NGcGtL5DhDLy9gRd8,2250
166
166
  kash/model/graph_model.py,sha256=jnctrPiBZ0xwAR8D54JMAJPanA1yZdaxSFQoIpe8anA,2662
167
- kash/model/items_model.py,sha256=ZWAsqTHA4p6GSNz3QjPr46LRwY7pbv7d73_KqU3gsO0,35686
167
+ kash/model/items_model.py,sha256=d95duvrAvi7LjMQF6urUuwGiizo1K1QCnRfyAa7tcbA,35827
168
168
  kash/model/language_list.py,sha256=I3RIbxTseVmPdhExQimimEv18Gmy2ImMbpXe0-_t1Qw,450
169
169
  kash/model/llm_actions_model.py,sha256=a29uXVNfS2CiqvM7HPdC6H9A23rSQQihAideuBLMH8g,2110
170
170
  kash/model/media_model.py,sha256=ZnlZ-FkswbAIGpUAuNqLce1WDZK-WbnwHn2ipg8x7-0,3511
@@ -190,7 +190,7 @@ kash/shell/output/kerm_code_utils.py,sha256=92A4AV-IFKKZMWLNZnd_zksNFMBgE_VNXySy
190
190
  kash/shell/output/kerm_codes.py,sha256=KLVdTM_dL_NeYmGbllzsQoW4IHXJjEsgqqIp1s7P1yI,18877
191
191
  kash/shell/output/kmarkdown.py,sha256=RRB5b0Ip0KZ71vnJKFfvxerYkeDFTCVTlHqHfmMy80Y,3675
192
192
  kash/shell/output/shell_formatting.py,sha256=oxmAeJ2j0ANYSUsL15CUv--KcGlQ6Wa_rywXSDlsZM4,3331
193
- kash/shell/output/shell_output.py,sha256=J3c6L_gkMgjwla4U0LkXsyzLODVAGbkVuLK0zKvf-JQ,11178
193
+ kash/shell/output/shell_output.py,sha256=A4XcEo2P3CVVOuJHFHut3Wd4I2DBnim-NiYEsdokb9s,11831
194
194
  kash/shell/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
195
  kash/shell/ui/shell_results.py,sha256=mvFHxK_oz3bNfF5_Twt6VqDO44TA1b256Bjf5oco804,4130
196
196
  kash/shell/ui/shell_syntax.py,sha256=1fuDqcCV16AAWwWS4w4iT-tlSnl-Ywdrf68Ge8XIfmQ,751
@@ -199,9 +199,13 @@ kash/shell/utils/native_utils.py,sha256=pAiuqqrjfNTesdArSya6CVavKVsuAXOcX3_XAIQr
199
199
  kash/shell/utils/shell_function_wrapper.py,sha256=fgUuVhocYMKLkGJJQJOER5nFMAvM0ZVpfGu7iJPJI9s,7385
200
200
  kash/utils/__init__.py,sha256=4Jl_AtgRADdGORimWhYZwbSfQSpQ6SiexNIZzmbcngI,111
201
201
  kash/utils/errors.py,sha256=2lPL0fxI8pPOiDvjl0j-rvwY8uhmWetsrYYIc2-x1WY,3906
202
+ kash/utils/api_utils/api_retries.py,sha256=0actlvQSP2puSvM7DwzC7eifDLAFYSRirNuo1Tp1Xvg,9040
203
+ kash/utils/api_utils/cache_requests_limited.py,sha256=TA5buZ9Dgbj4I1zHhwerTXre018i0TCACGsezsjX9Uc,3140
204
+ kash/utils/api_utils/gather_limited.py,sha256=nnaR2jdvDz5ut95K7ZJltfTGCVigo0Y1828iLKd4pVA,35781
205
+ kash/utils/api_utils/progress_protocol.py,sha256=Z_umf2DVmyTlfjiW57juN3wwlruU0camvVAHJKPHjtk,9041
202
206
  kash/utils/common/__init__.py,sha256=ggeWw1xmbl1mgCQD3c4CNN2h5WXFCsN2wXlCWurEUEI,161
203
207
  kash/utils/common/format_utils.py,sha256=83FhAwbMnOQIFudpnOGMuCqCiyoAlWGS6cc8q6xgZus,2072
204
- kash/utils/common/function_inspect.py,sha256=gczPhFlrF4NotkJKw8rDcl1DFlWfHdur_J47-9bS0GE,17216
208
+ kash/utils/common/function_inspect.py,sha256=KE5QgIPx16iupCZrMlcvU6MuA5fUFboPEkqmltpFw3E,19824
205
209
  kash/utils/common/import_utils.py,sha256=zyCa5sG_vTxzgIgjOS98xAwqkSeCQzN-8UkM6k9ZZOI,4615
206
210
  kash/utils/common/lazyobject.py,sha256=9dmOfSheblOXgo2RRakMwgfPIKdTgtyrlm6dCKAze04,5157
207
211
  kash/utils/common/obj_replace.py,sha256=AuiXptUOnuDNcWDgAJ3jEHkLh89XIqCP_SOkgaVyFIQ,2075
@@ -210,7 +214,7 @@ kash/utils/common/parse_key_vals.py,sha256=yZRZIa5GD9SlnBSn2YNZm8PRVKoSJMY8DCmdG
210
214
  kash/utils/common/parse_shell_args.py,sha256=UZXTZDbV5m5Jy39jdAQ6W8uilr1TNa0__RqnE8UmQ_M,10604
211
215
  kash/utils/common/stack_traces.py,sha256=a2NwlK_0xxnjMCDC4LrQu7ueFylF-OImFG3bAAHpPwY,1392
212
216
  kash/utils/common/task_stack.py,sha256=XkeBz3BwYY1HxxTqd3f7CulV0s61PePAKw1Irrtvf5o,4536
213
- kash/utils/common/testing.py,sha256=WHsXpHxgl5DTIu5OnlPGh71DbSiNJcFy8OoCCHFD3tM,1618
217
+ kash/utils/common/testing.py,sha256=9at6m_2YwRYitQoo-KeGsd2aoA59YUPs-x7cKcmy1C4,1802
214
218
  kash/utils/common/type_utils.py,sha256=SJirXhPilQom_-OKkFToDLm_82ZwpjcNjRy8U1HaQ0Q,3829
215
219
  kash/utils/common/uniquifier.py,sha256=75OY4KIVF8u1eoO0FCPbEGTyVpPOtM-0ctoG_s_jahM,3082
216
220
  kash/utils/common/url.py,sha256=R_P-CkOUiFxVdo9COcaL7YFvFIoAULj5-XxvmlFLvzo,9416
@@ -231,13 +235,14 @@ kash/utils/lang_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
231
235
  kash/utils/lang_utils/capitalization.py,sha256=5XbqBvjkzlxsm1Ue5AQP3P1J1IG0PubMVmGnoKVTF-c,3903
232
236
  kash/utils/rich_custom/__init__.py,sha256=_g2F3Bqc1UnLTdAdCwkvzXmW7OvmqXrA8DpfT1dKy6w,75
233
237
  kash/utils/rich_custom/ansi_cell_len.py,sha256=oQlNrqWB0f6pmigkbRRyeK6oWlGHMPbV_YLO_qmDH5E,2356
238
+ kash/utils/rich_custom/multitask_status.py,sha256=9K8jA_WCskb2-S3WZOgGQo19qkWYpX4WqB2RF1p1apE,21540
234
239
  kash/utils/rich_custom/rich_char_transform.py,sha256=3M89tViKM0y31VHsDoHi5eHFWlv5ME7F4p35IdDxnrw,2616
235
240
  kash/utils/rich_custom/rich_indent.py,sha256=nz72yNpUuYjOsaPNVmxM81oEQm-GKEfQkNsuWmv16G0,2286
236
241
  kash/utils/rich_custom/rich_markdown_fork.py,sha256=M_JRaSAyHrSg-wuLv9C9P7SkehSim3lwkqQPuMIFkVw,26551
237
242
  kash/utils/text_handling/doc_normalization.py,sha256=C211eSof8PUDVCqQtShuC4AMJpTZeBK8GHlGATp3c9E,2976
238
- kash/utils/text_handling/escape_html_tags.py,sha256=7ZNQw3wfGzATVBBKmJMWmBTuznEPGzS6utjrH9HmmlQ,6361
239
- kash/utils/text_handling/markdown_render.py,sha256=Ea-QiBND0kp4Dc9rYr8Z3dB_CRpAxneGHBOlTDWsDo0,3751
240
- kash/utils/text_handling/markdown_utils.py,sha256=kB_zqqwBX7AHfxWqPsTCD2xpvW49z47Vs-Jet107woc,25561
243
+ kash/utils/text_handling/escape_html_tags.py,sha256=8pC3JgoKRtdnbnOu8DiWrlvNR6GAqjwhGbQgl3jiFG4,6441
244
+ kash/utils/text_handling/markdown_render.py,sha256=LHPdJc__2ejBx7iwkp_P9wIePNmiVSgwu4-uhamVjms,3791
245
+ kash/utils/text_handling/markdown_utils.py,sha256=4RGIK9weadZ1UYTk7eVmCIFX9yktMyLSFsMLNTCnmoY,31681
241
246
  kash/utils/text_handling/markdownify_utils.py,sha256=xNMlBX36BJ5VK5kxY2Ofo-Q84R2kBSM91u1grkQ-5As,2925
242
247
  kash/utils/text_handling/unified_diffs.py,sha256=JfHSakISkT_GuBPBI4fTooHrp2aenWzDKiVvDewVfMk,2655
243
248
  kash/web_content/canon_url.py,sha256=Zv2q7xQdIHBFkxxwyJn3_ME-qqMFRi_fKxE_IgV2Z50,742
@@ -252,9 +257,9 @@ kash/web_content/web_fetch.py,sha256=J8DLFP1vzp7aScanFq0Bd7xCP6AVL4JgMMBqyRPtZjQ
252
257
  kash/web_content/web_page_model.py,sha256=aPpgC1fH2z2LTzGJhEDvZgq_mYwgsQIZaDS3UE7v98w,1147
253
258
  kash/web_gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
254
259
  kash/web_gen/simple_webpage.py,sha256=ks_0ljxCeS2-gAAEaUc1JEnzY3JY0nzqGFiyyqyRuZs,1537
255
- kash/web_gen/tabbed_webpage.py,sha256=DiZV48TVvcjOf31g3nzTAtGKpH5Cek1Unksr7Cwcwog,4949
260
+ kash/web_gen/tabbed_webpage.py,sha256=e0GGG1bQ4CQegpJgOIT2KpyM6cmwN_BQ9eJSsi4BjgY,4945
256
261
  kash/web_gen/template_render.py,sha256=aypo6UanouftV4RpxgNm6JdquelI52fV0IlihdA3yjE,1908
257
- kash/web_gen/templates/base_styles.css.jinja,sha256=2ZaH08oJ_MWLX_DHuymZ798XulHd5mNSAMJbGSvhZmc,14835
262
+ kash/web_gen/templates/base_styles.css.jinja,sha256=kLFEntQ7SHkbG9BEJTLtsiJCP5ldflILMXHAZGKjaF0,14942
258
263
  kash/web_gen/templates/base_webpage.html.jinja,sha256=gwxXMSC_eY-stu8uT5AVyQJ-Ppy2GyWwq9vEdTEbVi0,12887
259
264
  kash/web_gen/templates/content_styles.css.jinja,sha256=qwMKnjDRdjXxNfUgSrZEAkliHSLZ9OMsWGulonp-1Zs,3764
260
265
  kash/web_gen/templates/explain_view.html.jinja,sha256=DNw5Iw5SrhIUFRGB4qNvfcKXsBHVbEJVURGdhvyC75Q,949
@@ -262,9 +267,9 @@ kash/web_gen/templates/item_view.html.jinja,sha256=cYGyGKFcX8-5L2SM7-BC5oK6GLuH6
262
267
  kash/web_gen/templates/simple_webpage.html.jinja,sha256=I5O_z3BLo0p1HTghK2S1kUJBtvY-nSAIbJiapUns408,2576
263
268
  kash/web_gen/templates/tabbed_webpage.html.jinja,sha256=umkipUXW-lDGnbV-tlDroCfCx_385PFnpbzsvwmityo,1843
264
269
  kash/web_gen/templates/components/toc_scripts.js.jinja,sha256=9AanLJaVormGi52h-k2tKJTRT4BiBGGNnw3Kmrnr40Q,10481
265
- kash/web_gen/templates/components/toc_styles.css.jinja,sha256=kco8clYjO2Z-WYC8JIiYl04vIHsD4JR4aTUSNTMNA7o,6991
266
- kash/web_gen/templates/components/tooltip_scripts.js.jinja,sha256=WikUcizjWOpsr6rPkF3BNy4pZzGmeWRGPNP8jGp5soE,26704
267
- kash/web_gen/templates/components/tooltip_styles.css.jinja,sha256=Ln1kBcwFts94eZzH2b9mIV4Ir2vZ15dOJL7LP9UGNyo,13667
270
+ kash/web_gen/templates/components/toc_styles.css.jinja,sha256=Rd8P7nFTscex8iYrZbYRogxA9Yl4w0iI9_7q--3NyqY,6991
271
+ kash/web_gen/templates/components/tooltip_scripts.js.jinja,sha256=iz_5L5X4D4D1guotJjGVxMh5LcyOpjepw1R3nQd1NLE,32084
272
+ kash/web_gen/templates/components/tooltip_styles.css.jinja,sha256=o0qUwpe6--TyFjkfOZDMcL-ytk3jy3fob-mn6uQQOlw,14144
268
273
  kash/workspaces/__init__.py,sha256=q1gFERRZLJMA9-XSUKvB1ulauHDKqyzzc86GFLbxAuk,700
269
274
  kash/workspaces/param_state.py,sha256=vT_eGWqg2SRviIM5jqEAauznX2B5Xt2nHHu2oRxTcIU,746
270
275
  kash/workspaces/selections.py,sha256=rEUuQlrQ3C_54bzBSKDTTptgX8oZPqN0Ao4uaXSWA-Q,12003
@@ -276,7 +281,7 @@ kash/workspaces/workspaces.py,sha256=ypxlX2K64QOhNsta69arlvKbiVpUW_4CDeX_sEcIQbg
276
281
  kash/xonsh_custom/command_nl_utils.py,sha256=6Xcx98HXL5HywziHi0XskwFx6kfvz7oCmMX-siJib1A,3392
277
282
  kash/xonsh_custom/custom_shell.py,sha256=jydWwHR0-RslioaHHY1sHnM6H6fG3cwOw1XO__sG_b0,19026
278
283
  kash/xonsh_custom/customize_prompt.py,sha256=u-jRY-ftXYflBkbJVetEg6GYelPUvqZEpjrPRUTfy8w,6896
279
- kash/xonsh_custom/load_into_xonsh.py,sha256=3EuSXUOLz8ZCWrTHQUoaDHPB8koMY14Hhfbeo6idPns,3694
284
+ kash/xonsh_custom/load_into_xonsh.py,sha256=Z_PAaW_Uv-PDRKdw9E_7dC1eMe6FbwwIUioxyS1Sp_g,3596
280
285
  kash/xonsh_custom/shell_load_commands.py,sha256=bndmVEecIhuzQBI3OUDpH4ac7DXGkAMUVqXXcbrmEqI,4719
281
286
  kash/xonsh_custom/shell_which.py,sha256=zRaLhFVg9HEDFXo4dqWKwX07YpfPh25kopeG_fgctOE,1926
282
287
  kash/xonsh_custom/xonsh_completers.py,sha256=jxsc279DwZUHm0-iCnCtvbzqJBtq8zu0FUls5J1BA8o,17959
@@ -286,8 +291,8 @@ kash/xonsh_custom/xonsh_modern_tools.py,sha256=mj_b34LZXfE8MJe9EpDmp5JZ0tDM1biYN
286
291
  kash/xonsh_custom/xonsh_ranking_completer.py,sha256=ZRGiAfoEgqgnlq2-ReUVEaX5oOgW1DQ9WxIv2OJLuTo,5620
287
292
  kash/xontrib/fnm.py,sha256=V2tsOdmIDgbFbZSfMLpsvDIwwJJqiYnOkOySD1cXNXw,3700
288
293
  kash/xontrib/kash_extension.py,sha256=FLIMlgR3C_6A1fwKE-Ul0nmmpJSszVPbAriinUyQ8Zg,1896
289
- kash_shell-0.3.20.dist-info/METADATA,sha256=aImcO_J_PXzx57HrdQOq66nSLoqCp5oBg6__ZzSwN8k,32586
290
- kash_shell-0.3.20.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
291
- kash_shell-0.3.20.dist-info/entry_points.txt,sha256=SQraWDAo8SqYpthLXThei0mf_hGGyhYBUO-Er_0HcwI,85
292
- kash_shell-0.3.20.dist-info/licenses/LICENSE,sha256=rCh2PsfYeiU6FK_0wb58kHGm_Fj5c43fdcHEexiVzIo,34562
293
- kash_shell-0.3.20.dist-info/RECORD,,
294
+ kash_shell-0.3.22.dist-info/METADATA,sha256=IySaDz82xNb4v9ukcdw_kzOGEJxNWUBG4_fltjOfB90,32656
295
+ kash_shell-0.3.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
296
+ kash_shell-0.3.22.dist-info/entry_points.txt,sha256=SQraWDAo8SqYpthLXThei0mf_hGGyhYBUO-Er_0HcwI,85
297
+ kash_shell-0.3.22.dist-info/licenses/LICENSE,sha256=rCh2PsfYeiU6FK_0wb58kHGm_Fj5c43fdcHEexiVzIo,34562
298
+ kash_shell-0.3.22.dist-info/RECORD,,