llm-shell 0.9.2 → 0.10.0

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 (258) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +61 -66
  3. data/lib/llm/shell/command.rb +40 -40
  4. data/lib/llm/shell/commands/clear_screen.rb +4 -18
  5. data/lib/llm/shell/commands/debug_mode.rb +12 -0
  6. data/lib/llm/shell/commands/dir_import.rb +4 -20
  7. data/lib/llm/shell/commands/disable_tool.rb +33 -0
  8. data/lib/llm/shell/commands/enable_tool.rb +33 -0
  9. data/lib/llm/shell/commands/file_import.rb +4 -20
  10. data/lib/llm/shell/commands/help.rb +23 -36
  11. data/lib/llm/shell/commands/show_chat.rb +4 -19
  12. data/lib/llm/shell/commands/show_version.rb +4 -20
  13. data/lib/llm/shell/commands/system_prompt.rb +4 -18
  14. data/lib/llm/shell/completion.rb +5 -5
  15. data/lib/llm/shell/config.rb +4 -5
  16. data/lib/llm/shell/formatter.rb +1 -2
  17. data/lib/llm/shell/internal/coderay/lib/coderay/duo.rb +81 -0
  18. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/_map.rb +17 -0
  19. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/comment_filter.rb +25 -0
  20. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/count.rb +39 -0
  21. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/debug.rb +49 -0
  22. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/debug_lint.rb +63 -0
  23. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/div.rb +23 -0
  24. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/encoder.rb +190 -0
  25. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/filter.rb +58 -0
  26. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/html/css.rb +65 -0
  27. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/html/numbering.rb +108 -0
  28. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/html/output.rb +164 -0
  29. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/html.rb +333 -0
  30. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/json.rb +83 -0
  31. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/lines_of_code.rb +45 -0
  32. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/lint.rb +59 -0
  33. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/null.rb +18 -0
  34. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/page.rb +24 -0
  35. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/span.rb +23 -0
  36. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/statistic.rb +95 -0
  37. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/terminal.rb +195 -0
  38. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/text.rb +46 -0
  39. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/token_kind_filter.rb +111 -0
  40. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/xml.rb +72 -0
  41. data/lib/llm/shell/internal/coderay/lib/coderay/encoders/yaml.rb +50 -0
  42. data/lib/llm/shell/internal/coderay/lib/coderay/encoders.rb +18 -0
  43. data/lib/llm/shell/internal/coderay/lib/coderay/for_redcloth.rb +95 -0
  44. data/lib/llm/shell/internal/coderay/lib/coderay/helpers/file_type.rb +151 -0
  45. data/lib/llm/shell/internal/coderay/lib/coderay/helpers/plugin.rb +55 -0
  46. data/lib/llm/shell/internal/coderay/lib/coderay/helpers/plugin_host.rb +221 -0
  47. data/lib/llm/shell/internal/coderay/lib/coderay/helpers/word_list.rb +72 -0
  48. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/_map.rb +24 -0
  49. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/c.rb +189 -0
  50. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/clojure.rb +217 -0
  51. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/cpp.rb +217 -0
  52. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/css.rb +196 -0
  53. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/debug.rb +75 -0
  54. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/delphi.rb +144 -0
  55. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/diff.rb +221 -0
  56. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/erb.rb +81 -0
  57. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/go.rb +208 -0
  58. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/groovy.rb +268 -0
  59. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/haml.rb +168 -0
  60. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/html.rb +275 -0
  61. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/java/builtin_types.rb +421 -0
  62. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/java.rb +174 -0
  63. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/java_script.rb +236 -0
  64. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/json.rb +98 -0
  65. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/lua.rb +280 -0
  66. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/php.rb +527 -0
  67. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/python.rb +287 -0
  68. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/raydebug.rb +75 -0
  69. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/ruby/patterns.rb +178 -0
  70. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/ruby/string_state.rb +79 -0
  71. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/ruby.rb +477 -0
  72. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/sass.rb +232 -0
  73. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/scanner.rb +337 -0
  74. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/sql.rb +169 -0
  75. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/taskpaper.rb +36 -0
  76. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/text.rb +26 -0
  77. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/xml.rb +17 -0
  78. data/lib/llm/shell/internal/coderay/lib/coderay/scanners/yaml.rb +140 -0
  79. data/lib/llm/shell/internal/coderay/lib/coderay/scanners.rb +27 -0
  80. data/lib/llm/shell/internal/coderay/lib/coderay/styles/_map.rb +7 -0
  81. data/lib/llm/shell/internal/coderay/lib/coderay/styles/alpha.rb +153 -0
  82. data/lib/llm/shell/internal/coderay/lib/coderay/styles/style.rb +18 -0
  83. data/lib/llm/shell/internal/coderay/lib/coderay/styles.rb +15 -0
  84. data/lib/llm/shell/internal/coderay/lib/coderay/token_kinds.rb +85 -0
  85. data/lib/llm/shell/internal/coderay/lib/coderay/tokens.rb +164 -0
  86. data/lib/llm/shell/internal/coderay/lib/coderay/tokens_proxy.rb +55 -0
  87. data/lib/llm/shell/internal/coderay/lib/coderay/version.rb +3 -0
  88. data/lib/llm/shell/internal/coderay/lib/coderay.rb +284 -0
  89. data/lib/llm/shell/internal/io-line/lib/io/line/multiple.rb +19 -0
  90. data/lib/{io → llm/shell/internal/io-line/lib/io}/line.rb +2 -0
  91. data/lib/llm/shell/internal/llm.rb/lib/llm/bot/builder.rb +31 -0
  92. data/lib/llm/shell/internal/llm.rb/lib/llm/bot/conversable.rb +37 -0
  93. data/lib/llm/shell/internal/llm.rb/lib/llm/bot/prompt/completion.rb +49 -0
  94. data/lib/llm/shell/internal/llm.rb/lib/llm/bot/prompt/respond.rb +49 -0
  95. data/lib/llm/shell/internal/llm.rb/lib/llm/bot.rb +150 -0
  96. data/lib/llm/shell/internal/llm.rb/lib/llm/buffer.rb +162 -0
  97. data/lib/llm/shell/internal/llm.rb/lib/llm/client.rb +36 -0
  98. data/lib/llm/shell/internal/llm.rb/lib/llm/error.rb +49 -0
  99. data/lib/llm/shell/internal/llm.rb/lib/llm/eventhandler.rb +44 -0
  100. data/lib/llm/shell/internal/llm.rb/lib/llm/eventstream/event.rb +69 -0
  101. data/lib/llm/shell/internal/llm.rb/lib/llm/eventstream/parser.rb +88 -0
  102. data/lib/llm/shell/internal/llm.rb/lib/llm/eventstream.rb +8 -0
  103. data/lib/llm/shell/internal/llm.rb/lib/llm/file.rb +91 -0
  104. data/lib/llm/shell/internal/llm.rb/lib/llm/function.rb +177 -0
  105. data/lib/llm/shell/internal/llm.rb/lib/llm/message.rb +178 -0
  106. data/lib/llm/shell/internal/llm.rb/lib/llm/mime.rb +140 -0
  107. data/lib/llm/shell/internal/llm.rb/lib/llm/multipart.rb +101 -0
  108. data/lib/llm/shell/internal/llm.rb/lib/llm/object/builder.rb +38 -0
  109. data/lib/llm/shell/internal/llm.rb/lib/llm/object/kernel.rb +53 -0
  110. data/lib/llm/shell/internal/llm.rb/lib/llm/object.rb +89 -0
  111. data/lib/llm/shell/internal/llm.rb/lib/llm/provider.rb +352 -0
  112. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/error_handler.rb +36 -0
  113. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/files.rb +155 -0
  114. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/format/completion_format.rb +88 -0
  115. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/format.rb +29 -0
  116. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/models.rb +54 -0
  117. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/response/completion.rb +39 -0
  118. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/response/enumerable.rb +11 -0
  119. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/response/file.rb +23 -0
  120. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/response/web_search.rb +21 -0
  121. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic/stream_parser.rb +66 -0
  122. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/anthropic.rb +138 -0
  123. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/deepseek/format/completion_format.rb +68 -0
  124. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/deepseek/format.rb +27 -0
  125. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/deepseek.rb +75 -0
  126. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/audio.rb +73 -0
  127. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/error_handler.rb +47 -0
  128. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/files.rb +146 -0
  129. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/format/completion_format.rb +69 -0
  130. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/format.rb +39 -0
  131. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/images.rb +133 -0
  132. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/models.rb +60 -0
  133. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/response/completion.rb +35 -0
  134. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/response/embedding.rb +8 -0
  135. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/response/file.rb +11 -0
  136. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/response/files.rb +15 -0
  137. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/response/image.rb +31 -0
  138. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/response/models.rb +15 -0
  139. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/response/web_search.rb +22 -0
  140. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini/stream_parser.rb +86 -0
  141. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/gemini.rb +173 -0
  142. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/llamacpp.rb +74 -0
  143. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/ollama/error_handler.rb +36 -0
  144. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/ollama/format/completion_format.rb +77 -0
  145. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/ollama/format.rb +29 -0
  146. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/ollama/models.rb +56 -0
  147. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/ollama/response/completion.rb +28 -0
  148. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/ollama/response/embedding.rb +9 -0
  149. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/ollama/stream_parser.rb +44 -0
  150. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/ollama.rb +116 -0
  151. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/audio.rb +91 -0
  152. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/error_handler.rb +46 -0
  153. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/files.rb +134 -0
  154. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/format/completion_format.rb +90 -0
  155. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/format/moderation_format.rb +35 -0
  156. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/format/respond_format.rb +72 -0
  157. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/format.rb +54 -0
  158. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/images.rb +109 -0
  159. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/models.rb +55 -0
  160. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/moderations.rb +65 -0
  161. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/audio.rb +7 -0
  162. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/completion.rb +40 -0
  163. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/embedding.rb +9 -0
  164. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/enumerable.rb +23 -0
  165. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/file.rb +7 -0
  166. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/image.rb +16 -0
  167. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/moderations.rb +34 -0
  168. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/responds.rb +48 -0
  169. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/response/web_search.rb +21 -0
  170. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/responses/stream_parser.rb +76 -0
  171. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/responses.rb +99 -0
  172. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/stream_parser.rb +86 -0
  173. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai/vector_stores.rb +228 -0
  174. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/openai.rb +206 -0
  175. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/xai/images.rb +58 -0
  176. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/xai.rb +72 -0
  177. data/lib/llm/shell/internal/llm.rb/lib/llm/providers/zai.rb +74 -0
  178. data/lib/llm/shell/internal/llm.rb/lib/llm/response.rb +67 -0
  179. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/array.rb +26 -0
  180. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/boolean.rb +13 -0
  181. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/integer.rb +43 -0
  182. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/leaf.rb +78 -0
  183. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/null.rb +13 -0
  184. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/number.rb +43 -0
  185. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/object.rb +41 -0
  186. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/string.rb +34 -0
  187. data/lib/llm/shell/internal/llm.rb/lib/llm/schema/version.rb +8 -0
  188. data/lib/llm/shell/internal/llm.rb/lib/llm/schema.rb +81 -0
  189. data/lib/llm/shell/internal/llm.rb/lib/llm/server_tool.rb +32 -0
  190. data/lib/llm/shell/internal/llm.rb/lib/llm/tool/param.rb +75 -0
  191. data/lib/llm/shell/internal/llm.rb/lib/llm/tool.rb +78 -0
  192. data/lib/llm/shell/internal/llm.rb/lib/llm/utils.rb +19 -0
  193. data/lib/llm/shell/internal/llm.rb/lib/llm/version.rb +5 -0
  194. data/lib/llm/shell/internal/llm.rb/lib/llm.rb +121 -0
  195. data/lib/llm/shell/internal/optparse/lib/optionparser.rb +2 -0
  196. data/lib/llm/shell/internal/optparse/lib/optparse/ac.rb +70 -0
  197. data/lib/llm/shell/internal/optparse/lib/optparse/date.rb +18 -0
  198. data/lib/llm/shell/internal/optparse/lib/optparse/kwargs.rb +27 -0
  199. data/lib/llm/shell/internal/optparse/lib/optparse/shellwords.rb +7 -0
  200. data/lib/llm/shell/internal/optparse/lib/optparse/time.rb +11 -0
  201. data/lib/llm/shell/internal/optparse/lib/optparse/uri.rb +7 -0
  202. data/lib/llm/shell/internal/optparse/lib/optparse/version.rb +80 -0
  203. data/lib/llm/shell/internal/optparse/lib/optparse.rb +2469 -0
  204. data/lib/llm/shell/internal/paint/lib/paint/constants.rb +104 -0
  205. data/lib/llm/shell/internal/paint/lib/paint/pa.rb +13 -0
  206. data/lib/llm/shell/internal/paint/lib/paint/rgb_colors.rb +14 -0
  207. data/lib/llm/shell/internal/paint/lib/paint/shortcuts.rb +100 -0
  208. data/lib/llm/shell/internal/paint/lib/paint/shortcuts_version.rb +5 -0
  209. data/lib/llm/shell/internal/paint/lib/paint/util.rb +16 -0
  210. data/lib/llm/shell/internal/paint/lib/paint/version.rb +5 -0
  211. data/lib/llm/shell/internal/paint/lib/paint.rb +261 -0
  212. data/lib/llm/shell/internal/reline/lib/reline/config.rb +378 -0
  213. data/lib/llm/shell/internal/reline/lib/reline/face.rb +199 -0
  214. data/lib/llm/shell/internal/reline/lib/reline/history.rb +76 -0
  215. data/lib/llm/shell/internal/reline/lib/reline/io/ansi.rb +322 -0
  216. data/lib/llm/shell/internal/reline/lib/reline/io/dumb.rb +120 -0
  217. data/lib/llm/shell/internal/reline/lib/reline/io/windows.rb +530 -0
  218. data/lib/llm/shell/internal/reline/lib/reline/io.rb +55 -0
  219. data/lib/llm/shell/internal/reline/lib/reline/key_actor/base.rb +37 -0
  220. data/lib/llm/shell/internal/reline/lib/reline/key_actor/composite.rb +17 -0
  221. data/lib/llm/shell/internal/reline/lib/reline/key_actor/emacs.rb +517 -0
  222. data/lib/llm/shell/internal/reline/lib/reline/key_actor/vi_command.rb +518 -0
  223. data/lib/llm/shell/internal/reline/lib/reline/key_actor/vi_insert.rb +517 -0
  224. data/lib/llm/shell/internal/reline/lib/reline/key_actor.rb +8 -0
  225. data/lib/llm/shell/internal/reline/lib/reline/key_stroke.rb +119 -0
  226. data/lib/llm/shell/internal/reline/lib/reline/kill_ring.rb +125 -0
  227. data/lib/llm/shell/internal/reline/lib/reline/line_editor.rb +2356 -0
  228. data/lib/llm/shell/internal/reline/lib/reline/unicode/east_asian_width.rb +1292 -0
  229. data/lib/llm/shell/internal/reline/lib/reline/unicode.rb +421 -0
  230. data/lib/llm/shell/internal/reline/lib/reline/version.rb +3 -0
  231. data/lib/llm/shell/internal/reline/lib/reline.rb +527 -0
  232. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/generated_parser.rb +712 -0
  233. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/handler.rb +268 -0
  234. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/local_date.rb +35 -0
  235. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/local_date_time.rb +42 -0
  236. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/local_time.rb +40 -0
  237. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/parser.rb +21 -0
  238. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/scanner.rb +92 -0
  239. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/string_utils.rb +40 -0
  240. data/lib/llm/shell/internal/tomlrb/lib/tomlrb/version.rb +5 -0
  241. data/lib/llm/shell/internal/tomlrb/lib/tomlrb.rb +49 -0
  242. data/lib/llm/shell/options.rb +1 -1
  243. data/lib/llm/shell/renderer.rb +2 -3
  244. data/lib/llm/shell/repl.rb +21 -16
  245. data/lib/llm/shell/tool.rb +42 -0
  246. data/lib/llm/shell/tools/read_file.rb +15 -0
  247. data/lib/llm/shell/tools/system.rb +17 -0
  248. data/lib/llm/shell/tools/write_file.rb +16 -0
  249. data/lib/llm/shell/version.rb +1 -1
  250. data/lib/llm/shell.rb +83 -39
  251. data/libexec/llm-shell/shell +4 -6
  252. data/llm-shell.gemspec +0 -4
  253. metadata +233 -63
  254. data/lib/llm/function.rb +0 -17
  255. data/lib/llm/shell/command/extension.rb +0 -42
  256. data/lib/llm/shell/commands/utils.rb +0 -21
  257. data/lib/llm/shell/functions/read_file.rb +0 -22
  258. data/lib/llm/shell/functions/write_file.rb +0 -22
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # The {LLM::Tool LLM::Tool} class represents a local tool
5
+ # that can be called by an LLM. Under the hood, it is a wrapper
6
+ # around {LLM::Function LLM::Function} but allows the definition
7
+ # of a function (also known as a tool) as a class.
8
+ # @example
9
+ # class System < LLM::Tool
10
+ # name "system"
11
+ # description "Runs system commands"
12
+ # params do |schema|
13
+ # schema.object(command: schema.string.required)
14
+ # end
15
+ #
16
+ # def call(command:)
17
+ # {success: Kernel.system(command)}
18
+ # end
19
+ # end
20
+ class LLM::Tool
21
+ require_relative "tool/param"
22
+ extend LLM::Tool::Param
23
+
24
+ ##
25
+ # Registers the tool as a function when inherited
26
+ # @param [Class] klass The subclass
27
+ # @return [void]
28
+ def self.inherited(klass)
29
+ LLM.lock(:inherited) do
30
+ klass.instance_eval { @__monitor ||= Monitor.new }
31
+ klass.function.register(klass)
32
+ end
33
+ end
34
+
35
+ ##
36
+ # Returns (or sets) the tool name
37
+ # @param [String, nil] name The tool name
38
+ # @return [String]
39
+ def self.name(name = nil)
40
+ lock do
41
+ name ? function.name(name) : function.name
42
+ end
43
+ end
44
+
45
+ ##
46
+ # Returns (or sets) the tool description
47
+ # @param [String, nil] desc The tool description
48
+ # @return [String]
49
+ def self.description(desc = nil)
50
+ lock do
51
+ desc ? function.description(desc) : function.description
52
+ end
53
+ end
54
+
55
+ ##
56
+ # Returns (or sets) tool parameters
57
+ # @yieldparam [LLM::Schema] schema The schema object to define parameters
58
+ # @return [LLM::Schema]
59
+ def self.params(&)
60
+ lock do
61
+ function.tap { _1.params(&) }
62
+ end
63
+ end
64
+
65
+ ##
66
+ # @api private
67
+ def self.function
68
+ lock do
69
+ @function ||= LLM::Function.new(self)
70
+ end
71
+ end
72
+
73
+ ##
74
+ # @api private
75
+ def self.lock(&)
76
+ @__monitor.synchronize(&)
77
+ end
78
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # @private
5
+ module LLM::Utils
6
+ def camelcase(key)
7
+ key.to_s
8
+ .split("_")
9
+ .map.with_index { (_2 > 0) ? _1.capitalize : _1 }
10
+ .join
11
+ end
12
+
13
+ def snakecase(key)
14
+ key
15
+ .split(/([A-Z])/)
16
+ .map { (_1.size == 1) ? "_#{_1.downcase}" : _1 }
17
+ .join
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LLM
4
+ VERSION = "1.0.1"
5
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LLM
4
+ require "stringio"
5
+ require_relative "llm/schema"
6
+ require_relative "llm/object"
7
+ require_relative "llm/version"
8
+ require_relative "llm/utils"
9
+ require_relative "llm/error"
10
+ require_relative "llm/message"
11
+ require_relative "llm/response"
12
+ require_relative "llm/mime"
13
+ require_relative "llm/multipart"
14
+ require_relative "llm/file"
15
+ require_relative "llm/provider"
16
+ require_relative "llm/bot"
17
+ require_relative "llm/buffer"
18
+ require_relative "llm/function"
19
+ require_relative "llm/eventstream"
20
+ require_relative "llm/eventhandler"
21
+ require_relative "llm/tool"
22
+ require_relative "llm/server_tool"
23
+
24
+ ##
25
+ # Thread-safe monitors for different contexts
26
+ @monitors = {require: Monitor.new, clients: Monitor.new, inherited: Monitor.new}
27
+
28
+ module_function
29
+
30
+ ##
31
+ # @param (see LLM::Provider#initialize)
32
+ # @return (see LLM::Anthropic#initialize)
33
+ def anthropic(**)
34
+ lock(:require) { require_relative "llm/providers/anthropic" unless defined?(LLM::Anthropic) }
35
+ LLM::Anthropic.new(**)
36
+ end
37
+
38
+ ##
39
+ # @param (see LLM::Provider#initialize)
40
+ # @return (see LLM::Gemini#initialize)
41
+ def gemini(**)
42
+ lock(:require) { require_relative "llm/providers/gemini" unless defined?(LLM::Gemini) }
43
+ LLM::Gemini.new(**)
44
+ end
45
+
46
+ ##
47
+ # @param key (see LLM::Provider#initialize)
48
+ # @return (see LLM::Ollama#initialize)
49
+ def ollama(key: nil, **)
50
+ lock(:require) { require_relative "llm/providers/ollama" unless defined?(LLM::Ollama) }
51
+ LLM::Ollama.new(key:, **)
52
+ end
53
+
54
+ ##
55
+ # @param key (see LLM::Provider#initialize)
56
+ # @return (see LLM::LlamaCpp#initialize)
57
+ def llamacpp(key: nil, **)
58
+ lock(:require) { require_relative "llm/providers/llamacpp" unless defined?(LLM::LlamaCpp) }
59
+ LLM::LlamaCpp.new(key:, **)
60
+ end
61
+
62
+ ##
63
+ # @param key (see LLM::Provider#initialize)
64
+ # @return (see LLM::DeepSeek#initialize)
65
+ def deepseek(**)
66
+ lock(:require) { require_relative "llm/providers/deepseek" unless defined?(LLM::DeepSeek) }
67
+ LLM::DeepSeek.new(**)
68
+ end
69
+
70
+ ##
71
+ # @param key (see LLM::Provider#initialize)
72
+ # @return (see LLM::OpenAI#initialize)
73
+ def openai(**)
74
+ lock(:require) { require_relative "llm/providers/openai" unless defined?(LLM::OpenAI) }
75
+ LLM::OpenAI.new(**)
76
+ end
77
+
78
+ ##
79
+ # @param key (see LLM::XAI#initialize)
80
+ # @param host (see LLM::XAI#initialize)
81
+ # @return (see LLM::XAI#initialize)
82
+ def xai(**)
83
+ lock(:require) { require_relative "llm/providers/xai" unless defined?(LLM::XAI) }
84
+ LLM::XAI.new(**)
85
+ end
86
+
87
+ ##
88
+ # @param key (see LLM::ZAI#initialize)
89
+ # @param host (see LLM::ZAI#initialize)
90
+ # @return (see LLM::ZAI#initialize)
91
+ def zai(**)
92
+ lock(:require) { require_relative "llm/providers/zai" unless defined?(LLM::ZAI) }
93
+ LLM::ZAI.new(**)
94
+ end
95
+
96
+ ##
97
+ # Define a function
98
+ # @example
99
+ # LLM.function(:system) do |fn|
100
+ # fn.description "Run system command"
101
+ # fn.params do |schema|
102
+ # schema.object(command: schema.string.required)
103
+ # end
104
+ # fn.define do |command:|
105
+ # system(command)
106
+ # end
107
+ # end
108
+ # @param [Symbol] key The function name / key
109
+ # @param [Proc] b The block to define the function
110
+ # @return [LLM::Function] The function object
111
+ def function(key, &b)
112
+ LLM::Function.new(key, &b)
113
+ end
114
+
115
+ ##
116
+ # Provides a thread-safe lock
117
+ # @param [Symbol] name The name of the lock
118
+ # @param [Proc] & The block to execute within the lock
119
+ # @return [void]
120
+ def lock(name, &) = @monitors[name].synchronize(&)
121
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: false
2
+ require_relative 'optparse'
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: false
2
+ require_relative '../optparse'
3
+
4
+ #
5
+ # autoconf-like options.
6
+ #
7
+ class OptionParser::AC < OptionParser
8
+ # :stopdoc:
9
+ private
10
+
11
+ def _check_ac_args(name, block)
12
+ unless /\A\w[-\w]*\z/ =~ name
13
+ raise ArgumentError, name
14
+ end
15
+ unless block
16
+ raise ArgumentError, "no block given", ParseError.filter_backtrace(caller)
17
+ end
18
+ end
19
+
20
+ ARG_CONV = proc {|val| val.nil? ? true : val}
21
+ private_constant :ARG_CONV
22
+
23
+ def _ac_arg_enable(prefix, name, help_string, block)
24
+ _check_ac_args(name, block)
25
+
26
+ sdesc = []
27
+ ldesc = ["--#{prefix}-#{name}"]
28
+ desc = [help_string]
29
+ q = name.downcase
30
+ ac_block = proc {|val| block.call(ARG_CONV.call(val))}
31
+ enable = Switch::PlacedArgument.new(nil, ARG_CONV, sdesc, ldesc, nil, desc, ac_block)
32
+ disable = Switch::NoArgument.new(nil, proc {false}, sdesc, ldesc, nil, desc, ac_block)
33
+ top.append(enable, [], ["enable-" + q], disable, ['disable-' + q])
34
+ enable
35
+ end
36
+
37
+ # :startdoc:
38
+
39
+ public
40
+
41
+ # Define <tt>--enable</tt> / <tt>--disable</tt> style option
42
+ #
43
+ # Appears as <tt>--enable-<i>name</i></tt> in help message.
44
+ def ac_arg_enable(name, help_string, &block)
45
+ _ac_arg_enable("enable", name, help_string, block)
46
+ end
47
+
48
+ # Define <tt>--enable</tt> / <tt>--disable</tt> style option
49
+ #
50
+ # Appears as <tt>--disable-<i>name</i></tt> in help message.
51
+ def ac_arg_disable(name, help_string, &block)
52
+ _ac_arg_enable("disable", name, help_string, block)
53
+ end
54
+
55
+ # Define <tt>--with</tt> / <tt>--without</tt> style option
56
+ #
57
+ # Appears as <tt>--with-<i>name</i></tt> in help message.
58
+ def ac_arg_with(name, help_string, &block)
59
+ _check_ac_args(name, block)
60
+
61
+ sdesc = []
62
+ ldesc = ["--with-#{name}"]
63
+ desc = [help_string]
64
+ q = name.downcase
65
+ with = Switch::PlacedArgument.new(*search(:atype, String), sdesc, ldesc, nil, desc, block)
66
+ without = Switch::NoArgument.new(nil, proc {}, sdesc, ldesc, nil, desc, block)
67
+ top.append(with, [], ["with-" + q], without, ['without-' + q])
68
+ with
69
+ end
70
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: false
2
+ require_relative '../optparse'
3
+ require 'date'
4
+
5
+ OptionParser.accept(DateTime) do |s,|
6
+ begin
7
+ DateTime.parse(s) if s
8
+ rescue ArgumentError
9
+ raise OptionParser::InvalidArgument, s
10
+ end
11
+ end
12
+ OptionParser.accept(Date) do |s,|
13
+ begin
14
+ Date.parse(s) if s
15
+ rescue ArgumentError
16
+ raise OptionParser::InvalidArgument, s
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../optparse'
3
+
4
+ class OptionParser
5
+ # :call-seq:
6
+ # define_by_keywords(options, method, **params)
7
+ #
8
+ # :include: ../../doc/optparse/creates_option.rdoc
9
+ #
10
+ # Defines options which set in to _options_ for keyword parameters
11
+ # of _method_.
12
+ #
13
+ # Parameters for each keywords are given as elements of _params_.
14
+ #
15
+ def define_by_keywords(options, method, **params)
16
+ method.parameters.each do |type, name|
17
+ case type
18
+ when :key, :keyreq
19
+ op, cl = *(type == :key ? %w"[ ]" : ["", ""])
20
+ define("--#{name}=#{op}#{name.upcase}#{cl}", *params[name]) do |o|
21
+ options[name] = o
22
+ end
23
+ end
24
+ end
25
+ options
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: false
2
+ # -*- ruby -*-
3
+
4
+ require 'shellwords'
5
+ require_relative '../optparse'
6
+
7
+ OptionParser.accept(Shellwords) {|s,| Shellwords.shellwords(s)}
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: false
2
+ require_relative '../optparse'
3
+ require 'time'
4
+
5
+ OptionParser.accept(Time) do |s,|
6
+ begin
7
+ (Time.httpdate(s) rescue Time.parse(s)) if s
8
+ rescue
9
+ raise OptionParser::InvalidArgument, s
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: false
2
+ # -*- ruby -*-
3
+
4
+ require_relative '../optparse'
5
+ require 'uri'
6
+
7
+ OptionParser.accept(URI) {|s,| URI.parse(s) if s}
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: false
2
+ # OptionParser internal utility
3
+
4
+ class << OptionParser
5
+ #
6
+ # Shows version string in packages if Version is defined.
7
+ #
8
+ # +pkgs+:: package list
9
+ #
10
+ def show_version(*pkgs)
11
+ progname = ARGV.options.program_name
12
+ result = false
13
+ show = proc do |klass, cname, version|
14
+ str = "#{progname}"
15
+ unless klass == ::Object and cname == :VERSION
16
+ version = version.join(".") if Array === version
17
+ str << ": #{klass}" unless klass == Object
18
+ str << " version #{version}"
19
+ end
20
+ [:Release, :RELEASE].find do |rel|
21
+ if klass.const_defined?(rel)
22
+ str << " (#{klass.const_get(rel)})"
23
+ end
24
+ end
25
+ puts str
26
+ result = true
27
+ end
28
+ if pkgs.size == 1 and pkgs[0] == "all"
29
+ self.search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version|
30
+ unless cname[1] == ?e and klass.const_defined?(:Version)
31
+ show.call(klass, cname.intern, version)
32
+ end
33
+ end
34
+ else
35
+ pkgs.each do |pkg|
36
+ begin
37
+ pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)}
38
+ v = case
39
+ when pkg.const_defined?(:Version)
40
+ pkg.const_get(n = :Version)
41
+ when pkg.const_defined?(:VERSION)
42
+ pkg.const_get(n = :VERSION)
43
+ else
44
+ n = nil
45
+ "unknown"
46
+ end
47
+ show.call(pkg, n, v)
48
+ rescue NameError
49
+ end
50
+ end
51
+ end
52
+ result
53
+ end
54
+
55
+ # :stopdoc:
56
+
57
+ def each_const(path, base = ::Object)
58
+ path.split(/::|\//).inject(base) do |klass, name|
59
+ raise NameError, path unless Module === klass
60
+ klass.constants.grep(/#{name}/i) do |c|
61
+ klass.const_defined?(c) or next
62
+ klass.const_get(c)
63
+ end
64
+ end
65
+ end
66
+
67
+ def search_const(klass, name)
68
+ klasses = [klass]
69
+ while klass = klasses.shift
70
+ klass.constants.each do |cname|
71
+ klass.const_defined?(cname) or next
72
+ const = klass.const_get(cname)
73
+ yield klass, cname, const if name === cname
74
+ klasses << const if Module === const and const != ::Object
75
+ end
76
+ end
77
+ end
78
+
79
+ # :startdoc:
80
+ end