llms-py 3.0.23__tar.gz → 3.0.24__tar.gz

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 (224) hide show
  1. {llms_py-3.0.23/llms_py.egg-info → llms_py-3.0.24}/PKG-INFO +1 -1
  2. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/README.md +13 -6
  3. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/__init__.py +21 -16
  4. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/index.mjs +15 -8
  5. {llms_py-3.0.23 → llms_py-3.0.24}/llms/main.py +1 -1
  6. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/ai.mjs +1 -1
  7. {llms_py-3.0.23 → llms_py-3.0.24/llms_py.egg-info}/PKG-INFO +1 -1
  8. {llms_py-3.0.23 → llms_py-3.0.24}/pyproject.toml +1 -1
  9. {llms_py-3.0.23 → llms_py-3.0.24}/setup.py +1 -1
  10. {llms_py-3.0.23 → llms_py-3.0.24}/LICENSE +0 -0
  11. {llms_py-3.0.23 → llms_py-3.0.24}/MANIFEST.in +0 -0
  12. {llms_py-3.0.23 → llms_py-3.0.24}/README.md +0 -0
  13. {llms_py-3.0.23 → llms_py-3.0.24}/llms/__init__.py +0 -0
  14. {llms_py-3.0.23 → llms_py-3.0.24}/llms/__main__.py +0 -0
  15. {llms_py-3.0.23 → llms_py-3.0.24}/llms/db.py +0 -0
  16. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/analytics/ui/index.mjs +0 -0
  17. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/app/README.md +0 -0
  18. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/app/__init__.py +0 -0
  19. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/app/db.py +0 -0
  20. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/app/ui/Recents.mjs +0 -0
  21. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/app/ui/index.mjs +0 -0
  22. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/app/ui/threadStore.mjs +0 -0
  23. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/README.md +0 -0
  24. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/__init__.py +0 -0
  25. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/base.py +0 -0
  26. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/bash.py +0 -0
  27. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/computer.py +0 -0
  28. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/edit.py +0 -0
  29. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/filesystem.py +0 -0
  30. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/platform.py +0 -0
  31. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/computer/run.py +0 -0
  32. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/CALCULATOR.md +0 -0
  33. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/__init__.py +0 -0
  34. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +0 -0
  35. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +0 -0
  36. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +0 -0
  37. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +0 -0
  38. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +0 -0
  39. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +0 -0
  40. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +0 -0
  41. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +0 -0
  42. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +0 -0
  43. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/codemirror.css +0 -0
  44. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/codemirror.js +0 -0
  45. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/doc/docs.css +0 -0
  46. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  47. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +0 -0
  48. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +0 -0
  49. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +0 -0
  50. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +0 -0
  51. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/mode/python/python.js +0 -0
  52. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/theme/dracula.css +0 -0
  53. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/codemirror/theme/mocha.css +0 -0
  54. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/core_tools/ui/index.mjs +0 -0
  55. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/gallery/README.md +0 -0
  56. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/gallery/__init__.py +0 -0
  57. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/gallery/db.py +0 -0
  58. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/gallery/ui/index.mjs +0 -0
  59. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/README.md +0 -0
  60. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/__init__.py +0 -0
  61. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/README.md +0 -0
  62. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/auto-render.js +0 -0
  63. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/auto-render.min.js +0 -0
  64. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/auto-render.mjs +0 -0
  65. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/copy-tex.js +0 -0
  66. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/copy-tex.min.js +0 -0
  67. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/copy-tex.mjs +0 -0
  68. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/mathtex-script-type.js +0 -0
  69. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +0 -0
  70. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +0 -0
  71. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/mhchem.js +0 -0
  72. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/mhchem.min.js +0 -0
  73. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/mhchem.mjs +0 -0
  74. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/render-a11y-string.js +0 -0
  75. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/render-a11y-string.min.js +0 -0
  76. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/contrib/render-a11y-string.mjs +0 -0
  77. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  78. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  79. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  80. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  81. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  82. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  83. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  84. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  85. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  86. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  87. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  88. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  89. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  90. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  91. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  92. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  93. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  94. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  95. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  96. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  97. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  98. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  99. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  100. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  101. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  102. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  103. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  104. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  105. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  106. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  107. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  108. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  109. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  110. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  111. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  112. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  113. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  114. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  115. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  116. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  117. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  118. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  119. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  120. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  121. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  122. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  123. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  124. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  125. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  126. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  127. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  128. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  129. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  130. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  131. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  132. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  133. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  134. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  135. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  136. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  137. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/index.mjs +0 -0
  138. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/katex-swap.css +0 -0
  139. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/katex-swap.min.css +0 -0
  140. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/katex.css +0 -0
  141. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/katex.js +0 -0
  142. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/katex.min.css +0 -0
  143. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/katex.min.js +0 -0
  144. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/katex.min.mjs +0 -0
  145. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/katex/ui/katex.mjs +0 -0
  146. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/__init__.py +0 -0
  147. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/anthropic.py +0 -0
  148. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/cerebras.py +0 -0
  149. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/chutes.py +0 -0
  150. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/google.py +0 -0
  151. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/nvidia.py +0 -0
  152. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/openai.py +0 -0
  153. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/openrouter.py +0 -0
  154. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/providers/zai.py +0 -0
  155. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/LICENSE +0 -0
  156. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/errors.py +0 -0
  157. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/installer.py +0 -0
  158. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/models.py +0 -0
  159. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/parser.py +0 -0
  160. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/data/skills-top-5000.json +0 -0
  161. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/skills/create-plan/SKILL.md +0 -0
  162. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/skills/skill-creator/LICENSE.txt +0 -0
  163. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/skills/skill-creator/SKILL.md +0 -0
  164. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/skills/skill-creator/references/output-patterns.md +0 -0
  165. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/skills/skill-creator/references/workflows.md +0 -0
  166. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/skills/skill-creator/scripts/init_skill.py +0 -0
  167. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/skills/skill-creator/scripts/package_skill.py +0 -0
  168. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/ui/skills/skill-creator/scripts/quick_validate.py +0 -0
  169. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/skills/validator.py +0 -0
  170. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/system_prompts/README.md +0 -0
  171. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/system_prompts/__init__.py +0 -0
  172. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/system_prompts/ui/index.mjs +0 -0
  173. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/system_prompts/ui/prompts.json +0 -0
  174. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/tools/__init__.py +0 -0
  175. {llms_py-3.0.23 → llms_py-3.0.24}/llms/extensions/tools/ui/index.mjs +0 -0
  176. {llms_py-3.0.23 → llms_py-3.0.24}/llms/index.html +0 -0
  177. {llms_py-3.0.23 → llms_py-3.0.24}/llms/llms.json +0 -0
  178. {llms_py-3.0.23 → llms_py-3.0.24}/llms/providers-extra.json +0 -0
  179. {llms_py-3.0.23 → llms_py-3.0.24}/llms/providers.json +0 -0
  180. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/App.mjs +0 -0
  181. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/app.css +0 -0
  182. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/ctx.mjs +0 -0
  183. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/fav.svg +0 -0
  184. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/index.mjs +0 -0
  185. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/chart.js +0 -0
  186. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/charts.mjs +0 -0
  187. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/color.js +0 -0
  188. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/highlight.min.mjs +0 -0
  189. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/idb.min.mjs +0 -0
  190. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/marked.min.mjs +0 -0
  191. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/servicestack-client.mjs +0 -0
  192. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/servicestack-vue.mjs +0 -0
  193. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/vue-router.min.mjs +0 -0
  194. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/vue.min.mjs +0 -0
  195. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/lib/vue.mjs +0 -0
  196. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/markdown.mjs +0 -0
  197. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/modules/chat/ChatBody.mjs +0 -0
  198. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/modules/chat/SettingsDialog.mjs +0 -0
  199. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/modules/chat/index.mjs +0 -0
  200. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/modules/icons.mjs +0 -0
  201. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/modules/layout.mjs +0 -0
  202. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/modules/model-selector.mjs +0 -0
  203. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/tailwind.input.css +0 -0
  204. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/typography.css +0 -0
  205. {llms_py-3.0.23 → llms_py-3.0.24}/llms/ui/utils.mjs +0 -0
  206. {llms_py-3.0.23 → llms_py-3.0.24}/llms_py.egg-info/SOURCES.txt +0 -0
  207. {llms_py-3.0.23 → llms_py-3.0.24}/llms_py.egg-info/dependency_links.txt +0 -0
  208. {llms_py-3.0.23 → llms_py-3.0.24}/llms_py.egg-info/entry_points.txt +0 -0
  209. {llms_py-3.0.23 → llms_py-3.0.24}/llms_py.egg-info/not-zip-safe +0 -0
  210. {llms_py-3.0.23 → llms_py-3.0.24}/llms_py.egg-info/requires.txt +0 -0
  211. {llms_py-3.0.23 → llms_py-3.0.24}/llms_py.egg-info/top_level.txt +0 -0
  212. {llms_py-3.0.23 → llms_py-3.0.24}/requirements.txt +0 -0
  213. {llms_py-3.0.23 → llms_py-3.0.24}/setup.cfg +0 -0
  214. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_async.py +0 -0
  215. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_config.py +0 -0
  216. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_core_tools_direct.py +0 -0
  217. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_extensions.py +0 -0
  218. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_gemini_tool_calling.py +0 -0
  219. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_gemini_upload.py +0 -0
  220. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_integration.py +0 -0
  221. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_interleaved_thinking.py +0 -0
  222. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_provider_checks.py +0 -0
  223. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_provider_config.py +0 -0
  224. {llms_py-3.0.23 → llms_py-3.0.24}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.23
3
+ Version: 3.0.24
4
4
  Summary: A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers
5
5
  Home-page: https://github.com/ServiceStack/llms
6
6
  Author: ServiceStack
@@ -33,14 +33,21 @@ Access the skills panel by clicking the **Skills** icon in the top toolbar. The
33
33
 
34
34
  ### Skill Groups
35
35
 
36
- Skills are organized into groups based on their source:
36
+ Skills are organized into groups based on their source location. Skills are discovered from these directories in order:
37
37
 
38
- | Group | Description | Editable |
39
- |-------|-------------|----------|
40
- | `~/.llms/.agents` | Your personal skills collection | ✓ Yes |
41
- | Built-in | Skills bundled with the extension | No |
38
+ | Group | Location | Description | Editable |
39
+ |-------|----------|-------------|----------|
40
+ | Project (Agent) | `.agent/skills/` | Skills local to the current project | ✓ Yes |
41
+ | Project (Claude) | `.claude/skills/` | Claude-format skills in the current project | Yes |
42
+ | User (Agent) | `~/.llms/.agents/skills/` | Your personal skills collection | ✓ Yes |
43
+ | User (Claude) | `~/.claude/skills/` | Claude-format skills in your home directory | ✓ Yes |
44
+ | Built-in | Extension directory | Skills bundled with the extension | ✗ No |
42
45
 
43
- Your personal skills (`~/.llms/.agents`) are fully editable. Built-in skills provide reference implementations you can learn from.
46
+ **Project-level skills** (`.agent/` and `.claude/`) are specific to the workspace you're working in. They're ideal for project-specific workflows, coding standards, or team conventions.
47
+
48
+ **User-level skills** (`~/.llms/.agents/` and `~/.claude/`) are available across all projects. Use these for personal workflows and preferences.
49
+
50
+ Both `.agent` and `.claude` directory formats are supported for compatibility with different tooling conventions.
44
51
 
45
52
  ### Selecting Skills for a Conversation
46
53
 
@@ -21,6 +21,9 @@ g_home_skills = None
21
21
  # }
22
22
  g_available_skills = []
23
23
 
24
+ LLMS_HOME_SKILLS = "~/.llms/.agent/skills"
25
+ LLMS_LOCAL_SKILLS = ".agent/skills"
26
+
24
27
 
25
28
  def is_safe_path(base_path: str, requested_path: str) -> bool:
26
29
  """Check if the requested path is safely within the base path."""
@@ -132,10 +135,12 @@ def install(ctx):
132
135
  if os.path.exists(os.path.join(".claude", "skills")):
133
136
  skill_roots[".claude/skills"] = os.path.join(".claude", "skills")
134
137
 
135
- skill_roots["~/.llms/.agents"] = home_skills
138
+ skill_roots[LLMS_HOME_SKILLS] = home_skills
136
139
 
137
- if os.path.exists(os.path.join(".agent", "skills")):
138
- skill_roots[".agents"] = os.path.join(".agent", "skills")
140
+ local_skills = os.path.join(".agent", "skills")
141
+ if os.path.exists(local_skills):
142
+ local_skills = str(Path(local_skills).resolve())
143
+ skill_roots[LLMS_LOCAL_SKILLS] = local_skills
139
144
 
140
145
  g_skills = {}
141
146
  for group, root in skill_roots.items():
@@ -237,7 +242,7 @@ def install(ctx):
237
242
  skill_props = props.to_dict()
238
243
  skill_props.update(
239
244
  {
240
- "group": "~/.llms/.agents",
245
+ "group": LLMS_HOME_SKILLS,
241
246
  "location": str(skill_dir),
242
247
  "files": files,
243
248
  }
@@ -303,9 +308,9 @@ def install(ctx):
303
308
 
304
309
  location = skill_info.get("location")
305
310
 
306
- # Only allow modifications to skills in home directory
307
- if not is_safe_path(home_skills, location):
308
- raise Exception("Cannot modify skills outside of home directory")
311
+ # Only allow modifications to skills in home or local .agent directory
312
+ if not is_safe_path(home_skills, location) and not (local_skills and is_safe_path(local_skills, location)):
313
+ raise Exception("Cannot modify skills outside of allowed directories")
309
314
 
310
315
  full_path = os.path.join(location, file_path)
311
316
 
@@ -319,7 +324,7 @@ def install(ctx):
319
324
  f.write(content)
320
325
 
321
326
  # Reload skill metadata
322
- group = skill_info.get("group", "~/.llms/.agents")
327
+ group = skill_info.get("group", LLMS_HOME_SKILLS)
323
328
  updated_skill = reload_skill(name, location, group)
324
329
 
325
330
  return aiohttp.web.json_response({"path": file_path, "skill": updated_skill})
@@ -342,9 +347,9 @@ def install(ctx):
342
347
 
343
348
  location = skill_info.get("location")
344
349
 
345
- # Only allow modifications to skills in home directory
346
- if not is_safe_path(home_skills, location):
347
- raise Exception("Cannot modify skills outside of home directory")
350
+ # Only allow modifications to skills in home or local .agent directory
351
+ if not is_safe_path(home_skills, location) and not (local_skills and is_safe_path(local_skills, location)):
352
+ raise Exception("Cannot modify skills outside of allowed directories")
348
353
 
349
354
  full_path = os.path.join(location, file_path)
350
355
 
@@ -371,7 +376,7 @@ def install(ctx):
371
376
  break
372
377
 
373
378
  # Reload skill metadata
374
- group = skill_info.get("group", "~/.llms/.agents")
379
+ group = skill_info.get("group", LLMS_HOME_SKILLS)
375
380
  updated_skill = reload_skill(name, location, group)
376
381
 
377
382
  return aiohttp.web.json_response({"path": file_path, "skill": updated_skill})
@@ -433,7 +438,7 @@ def install(ctx):
433
438
  skill_props = props.to_dict()
434
439
  skill_props.update(
435
440
  {
436
- "group": "~/.llms/.agents",
441
+ "group": LLMS_HOME_SKILLS,
437
442
  "location": str(skill_dir_path),
438
443
  "files": files,
439
444
  }
@@ -467,9 +472,9 @@ def install(ctx):
467
472
  else:
468
473
  raise Exception(f"Skill '{name}' not found")
469
474
 
470
- # Only allow deletion of skills in home directory
471
- if not is_safe_path(home_skills, location):
472
- raise Exception("Cannot delete skills outside of home directory")
475
+ # Only allow deletion of skills in home or local .agent directory
476
+ if not is_safe_path(home_skills, location) and not (local_skills and is_safe_path(local_skills, location)):
477
+ raise Exception("Cannot delete skills outside of allowed directories")
473
478
 
474
479
  try:
475
480
  if os.path.exists(location):
@@ -3,6 +3,9 @@ import { leftPart } from "@servicestack/client"
3
3
 
4
4
  let ext
5
5
 
6
+ const LLMS_HOME_SKILLS = "~/.llms/.agent/skills"
7
+ const LLMS_LOCAL_SKILLS = ".agent/skills"
8
+
6
9
  const SkillSelector = {
7
10
  template: `
8
11
  <div class="px-4 py-4 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 max-h-[80vh] overflow-y-auto">
@@ -119,10 +122,10 @@ const SkillSelector = {
119
122
  skills
120
123
  }))
121
124
 
122
- // Sort groups: writable (~/.llms/.agents) first, then alphabetically
125
+ // Sort groups: writable (~/.llms/.agent/skills,.agent/skills) first, then alphabetically
123
126
  definedGroups.sort((a, b) => {
124
- const aEditable = a.name === '~/.llms/.agents'
125
- const bEditable = b.name === '~/.llms/.agents'
127
+ const aEditable = a.name === LLMS_HOME_SKILLS || a.name === LLMS_LOCAL_SKILLS
128
+ const bEditable = b.name === LLMS_HOME_SKILLS || b.name === LLMS_LOCAL_SKILLS
126
129
  if (aEditable !== bEditable) return aEditable ? -1 : 1
127
130
  return a.name.localeCompare(b.name)
128
131
  })
@@ -158,6 +161,10 @@ const SkillSelector = {
158
161
  onlySkills = onlySkills.filter(s => s !== name)
159
162
  } else {
160
163
  onlySkills = [...onlySkills, name]
164
+ // If has all skills set to 'All' (null)
165
+ if (onlySkills.length === availableSkills.value.length) {
166
+ onlySkills = null
167
+ }
161
168
  }
162
169
  }
163
170
 
@@ -395,8 +402,8 @@ const SkillPage = {
395
402
  grouped[group].push(skill)
396
403
  })
397
404
  return Object.entries(grouped).sort((a, b) => {
398
- const aEditable = a[0] === '~/.llms/.agents'
399
- const bEditable = b[0] === '~/.llms/.agents'
405
+ const aEditable = a[0] === LLMS_HOME_SKILLS || a[0] === LLMS_LOCAL_SKILLS
406
+ const bEditable = b[0] === LLMS_HOME_SKILLS || b[0] === LLMS_LOCAL_SKILLS
400
407
  if (aEditable !== bEditable) return aEditable ? -1 : 1
401
408
  return a[0].localeCompare(b[0])
402
409
  }).map(([name, skills]) => ({ name, skills: skills.sort((a, b) => a.name.localeCompare(b.name)) }))
@@ -419,8 +426,8 @@ const SkillPage = {
419
426
  return tree.sort((a, b) => { if (a.isFile !== b.isFile) return a.isFile ? 1 : -1; return a.name.localeCompare(b.name) })
420
427
  }
421
428
  const hasUnsavedChanges = computed(() => isEditing.value && editContent.value !== fileContent.value)
422
- function isGroupEditable(groupName) { return groupName === '~/.llms/.agents' }
423
- function isEditable(skill) { return skill?.group === '~/.llms/.agents' }
429
+ function isGroupEditable(groupName) { return groupName === LLMS_HOME_SKILLS || groupName === LLMS_LOCAL_SKILLS }
430
+ function isEditable(skill) { return skill?.group === LLMS_HOME_SKILLS || skill?.group === LLMS_LOCAL_SKILLS }
424
431
  function isSkillExpanded(name) { return !!expandedSkills.value[name] }
425
432
  function toggleSkillExpand(skill) {
426
433
  expandedSkills.value[skill.name] = !expandedSkills.value[skill.name]
@@ -579,7 +586,7 @@ const SkillStore = {
579
586
  <div class="h-full flex flex-col">
580
587
  <div class="px-4 py-3 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between flex-shrink-0">
581
588
  <div>
582
- <h1 class="text-xl font-bold text-gray-900 dark:text-gray-100">Skill Store</h1>
589
+ <h1 class="text-xl font-bold text-gray-900 dark:text-gray-100">Discover Skills</h1>
583
590
  <p class="text-sm text-gray-500 dark:text-gray-400">{{ total.toLocaleString() }} skills available</p>
584
591
  </div>
585
592
  <div class="flex items-center gap-2">
@@ -57,7 +57,7 @@ try:
57
57
  except ImportError:
58
58
  HAS_PIL = False
59
59
 
60
- VERSION = "3.0.23"
60
+ VERSION = "3.0.24"
61
61
  _ROOT = None
62
62
  DEBUG = os.getenv("DEBUG") == "1"
63
63
  MOCK = os.getenv("MOCK") == "1"
@@ -6,7 +6,7 @@ const headers = { 'Accept': 'application/json' }
6
6
  const prefsKey = 'llms.prefs'
7
7
 
8
8
  export const o = {
9
- version: '3.0.23',
9
+ version: '3.0.24',
10
10
  base,
11
11
  prefsKey,
12
12
  welcome: 'Welcome to llms.py',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.23
3
+ Version: 3.0.24
4
4
  Summary: A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers
5
5
  Home-page: https://github.com/ServiceStack/llms
6
6
  Author: ServiceStack
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "llms-py"
7
- version = "3.0.23"
7
+ version = "3.0.24"
8
8
  description = "A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers"
9
9
  readme = "README.md"
10
10
  license = "BSD-3-Clause"
@@ -15,7 +15,7 @@ with open(os.path.join(this_directory, "requirements.txt"), encoding="utf-8") as
15
15
 
16
16
  setup(
17
17
  name="llms-py",
18
- version="3.0.23",
18
+ version="3.0.24",
19
19
  author="ServiceStack",
20
20
  author_email="team@servicestack.net",
21
21
  description="A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes