riffer-rig 0.5.0 → 0.7.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 (172) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/README.md +77 -7
  4. data/exe/riffer +1 -1
  5. data/lib/riffer/rig/bundled/agents_md.rb +7 -0
  6. data/lib/riffer/rig/bundled/bash.rb +5 -0
  7. data/lib/riffer/rig/bundled/edit.rb +5 -0
  8. data/lib/riffer/rig/bundled/mcp.rb +9 -0
  9. data/lib/riffer/rig/bundled/read.rb +5 -0
  10. data/lib/riffer/rig/bundled/skills.rb +10 -0
  11. data/lib/riffer/rig/bundled/write.rb +5 -0
  12. data/lib/riffer/rig/bundled.rb +7 -0
  13. data/lib/riffer/rig/cli/flags.rb +77 -0
  14. data/lib/riffer/rig/cli.rb +70 -102
  15. data/lib/riffer/rig/command/context.rb +70 -0
  16. data/lib/riffer/rig/command.rb +29 -0
  17. data/lib/riffer/rig/commands/model.rb +54 -0
  18. data/lib/riffer/rig/commands/skill.rb +27 -0
  19. data/lib/riffer/rig/commands.rb +4 -0
  20. data/lib/riffer/rig/credentials/resolution.rb +16 -0
  21. data/lib/riffer/rig/credentials.rb +151 -60
  22. data/lib/riffer/rig/directories.rb +20 -0
  23. data/lib/riffer/rig/env/invalid.rb +13 -0
  24. data/lib/riffer/rig/env.rb +40 -0
  25. data/lib/riffer/rig/events/after_response.rb +25 -0
  26. data/lib/riffer/rig/events/after_tool_call.rb +31 -0
  27. data/lib/riffer/rig/events/before_prompt.rb +25 -0
  28. data/lib/riffer/rig/events/before_request.rb +25 -0
  29. data/lib/riffer/rig/events/before_tool_call.rb +28 -0
  30. data/lib/riffer/rig/events/command_output.rb +28 -0
  31. data/lib/riffer/rig/events/notify.rb +28 -0
  32. data/lib/riffer/rig/events/session_end.rb +25 -0
  33. data/lib/riffer/rig/events/session_start.rb +28 -0
  34. data/lib/riffer/rig/events/skill_activated.rb +25 -0
  35. data/lib/riffer/rig/events/turn_end.rb +33 -0
  36. data/lib/riffer/rig/events.rb +4 -0
  37. data/lib/riffer/rig/extension/failure.rb +16 -0
  38. data/lib/riffer/rig/extension.rb +16 -5
  39. data/lib/riffer/rig/hosts/mirror.rb +59 -0
  40. data/lib/riffer/rig/hosts/null.rb +36 -0
  41. data/lib/riffer/rig/loader.rb +163 -0
  42. data/lib/riffer/rig/mcp/declaration.rb +23 -0
  43. data/lib/riffer/rig/mcp/server.rb +16 -0
  44. data/lib/riffer/rig/mcp.rb +12 -0
  45. data/lib/riffer/rig/prompts/agents_md.rb +32 -0
  46. data/lib/riffer/rig/prompts.rb +4 -0
  47. data/lib/riffer/rig/provider_setup/field.rb +24 -0
  48. data/lib/riffer/rig/provider_setup.rb +84 -0
  49. data/lib/riffer/rig/registrar.rb +134 -7
  50. data/lib/riffer/rig/runtime/blocked.rb +13 -0
  51. data/lib/riffer/rig/runtime/cancel_flag.rb +27 -0
  52. data/lib/riffer/rig/runtime/hooks.rb +78 -0
  53. data/lib/riffer/rig/runtime/request_guardrail.rb +24 -0
  54. data/lib/riffer/rig/runtime/tool_runtime.rb +44 -0
  55. data/lib/riffer/rig/runtime.rb +582 -70
  56. data/lib/riffer/rig/settings/document.rb +28 -12
  57. data/lib/riffer/rig/settings/pricing.rb +16 -6
  58. data/lib/riffer/rig/settings.rb +108 -81
  59. data/lib/riffer/rig/skills/sources.rb +28 -0
  60. data/lib/riffer/rig/skills.rb +12 -0
  61. data/lib/riffer/rig/support/equatable.rb +21 -0
  62. data/lib/riffer/rig/{ui → terminal}/animator.rb +6 -13
  63. data/lib/riffer/rig/{ui → terminal}/banner.rb +17 -21
  64. data/lib/riffer/rig/{ui → terminal}/cursor.rb +4 -6
  65. data/lib/riffer/rig/terminal/host.rb +85 -0
  66. data/lib/riffer/rig/{ui → terminal}/palette.rb +1 -1
  67. data/lib/riffer/rig/{ui → terminal}/renderer.rb +121 -87
  68. data/lib/riffer/rig/{ui → terminal}/smoother.rb +15 -23
  69. data/lib/riffer/rig/{ui → terminal}/theme.rb +12 -14
  70. data/lib/riffer/rig/terminal.rb +207 -0
  71. data/lib/riffer/rig/tools/bash.rb +36 -13
  72. data/lib/riffer/rig/tools/edit.rb +3 -2
  73. data/lib/riffer/rig/tools/read.rb +3 -2
  74. data/lib/riffer/rig/tools/write.rb +3 -2
  75. data/lib/riffer/rig/version.rb +1 -1
  76. data/lib/riffer/rig.rb +10 -15
  77. data/sig/generated/riffer/rig/bundled/agents_md.rbs +5 -0
  78. data/sig/generated/riffer/rig/bundled/bash.rbs +5 -0
  79. data/sig/generated/riffer/rig/bundled/edit.rbs +5 -0
  80. data/sig/generated/riffer/rig/bundled/mcp.rbs +5 -0
  81. data/sig/generated/riffer/rig/bundled/read.rbs +5 -0
  82. data/sig/generated/riffer/rig/bundled/skills.rbs +5 -0
  83. data/sig/generated/riffer/rig/bundled/write.rbs +5 -0
  84. data/sig/generated/riffer/rig/bundled.rbs +5 -0
  85. data/sig/generated/riffer/rig/cli/flags.rbs +40 -0
  86. data/sig/generated/riffer/rig/cli.rbs +30 -27
  87. data/sig/generated/riffer/rig/command/context.rbs +50 -0
  88. data/sig/generated/riffer/rig/command.rbs +23 -0
  89. data/sig/generated/riffer/rig/commands/model.rbs +27 -0
  90. data/sig/generated/riffer/rig/commands/skill.rbs +12 -0
  91. data/sig/generated/riffer/rig/commands.rbs +4 -0
  92. data/sig/generated/riffer/rig/credentials/resolution.rbs +13 -0
  93. data/sig/generated/riffer/rig/credentials.rbs +70 -41
  94. data/sig/generated/riffer/rig/directories.rbs +11 -0
  95. data/sig/generated/riffer/rig/env/invalid.rbs +10 -0
  96. data/sig/generated/riffer/rig/env.rbs +26 -0
  97. data/sig/generated/riffer/rig/events/after_response.rbs +18 -0
  98. data/sig/generated/riffer/rig/events/after_tool_call.rbs +24 -0
  99. data/sig/generated/riffer/rig/events/before_prompt.rbs +18 -0
  100. data/sig/generated/riffer/rig/events/before_request.rbs +18 -0
  101. data/sig/generated/riffer/rig/events/before_tool_call.rbs +21 -0
  102. data/sig/generated/riffer/rig/events/command_output.rbs +21 -0
  103. data/sig/generated/riffer/rig/events/notify.rbs +21 -0
  104. data/sig/generated/riffer/rig/events/session_end.rbs +18 -0
  105. data/sig/generated/riffer/rig/events/session_start.rbs +21 -0
  106. data/sig/generated/riffer/rig/events/skill_activated.rbs +18 -0
  107. data/sig/generated/riffer/rig/events/turn_end.rbs +24 -0
  108. data/sig/generated/riffer/rig/events.rbs +4 -0
  109. data/sig/generated/riffer/rig/extension/failure.rbs +13 -0
  110. data/sig/generated/riffer/rig/extension.rbs +14 -5
  111. data/sig/generated/riffer/rig/hosts/mirror.rbs +41 -0
  112. data/sig/generated/riffer/rig/hosts/null.rbs +26 -0
  113. data/sig/generated/riffer/rig/loader.rbs +77 -0
  114. data/sig/generated/riffer/rig/mcp/declaration.rbs +18 -0
  115. data/sig/generated/riffer/rig/mcp/server.rbs +13 -0
  116. data/sig/generated/riffer/rig/mcp.rbs +8 -0
  117. data/sig/generated/riffer/rig/prompts/agents_md.rbs +19 -0
  118. data/sig/generated/riffer/rig/prompts.rbs +4 -0
  119. data/sig/generated/riffer/rig/provider_setup/field.rbs +22 -0
  120. data/sig/generated/riffer/rig/provider_setup.rbs +30 -0
  121. data/sig/generated/riffer/rig/registrar.rbs +88 -6
  122. data/sig/generated/riffer/rig/runtime/blocked.rbs +10 -0
  123. data/sig/generated/riffer/rig/runtime/cancel_flag.rbs +19 -0
  124. data/sig/generated/riffer/rig/runtime/hooks.rbs +49 -0
  125. data/sig/generated/riffer/rig/runtime/request_guardrail.rbs +16 -0
  126. data/sig/generated/riffer/rig/runtime/tool_runtime.rbs +23 -0
  127. data/sig/generated/riffer/rig/runtime.rbs +262 -40
  128. data/sig/generated/riffer/rig/settings/document.rbs +13 -9
  129. data/sig/generated/riffer/rig/settings/pricing.rbs +7 -3
  130. data/sig/generated/riffer/rig/settings.rbs +56 -64
  131. data/sig/generated/riffer/rig/skills/sources.rbs +18 -0
  132. data/sig/generated/riffer/rig/skills.rbs +7 -0
  133. data/sig/generated/riffer/rig/support/equatable.rbs +15 -0
  134. data/sig/generated/riffer/rig/{ui → terminal}/animator.rbs +5 -13
  135. data/sig/generated/riffer/rig/terminal/banner.rbs +39 -0
  136. data/sig/generated/riffer/rig/terminal/cursor.rbs +31 -0
  137. data/sig/generated/riffer/rig/terminal/host.rbs +50 -0
  138. data/sig/generated/riffer/rig/{ui → terminal}/palette.rbs +2 -2
  139. data/sig/generated/riffer/rig/terminal/renderer.rbs +126 -0
  140. data/sig/generated/riffer/rig/terminal/smoother.rbs +59 -0
  141. data/sig/generated/riffer/rig/{ui → terminal}/theme.rbs +5 -7
  142. data/sig/generated/riffer/rig/terminal.rbs +85 -0
  143. data/sig/generated/riffer/rig/tools/bash.rbs +14 -1
  144. data/sig/generated/riffer/rig.rbs +4 -7
  145. data/sig/manual/riffer/rig/cli.rbs +2 -4
  146. data/sig/manual/riffer/rig/commands/model.rbs +6 -0
  147. data/sig/manual/riffer/rig/commands/skill.rbs +6 -0
  148. data/sig/manual/riffer/rig/credentials.rbs +2 -4
  149. data/sig/manual/riffer/rig/directories.rbs +6 -0
  150. data/sig/manual/riffer/rig/events.rbs +6 -0
  151. data/sig/manual/riffer/rig/hosts.rbs +12 -0
  152. data/sig/manual/riffer/rig/mcp.rbs +11 -0
  153. data/sig/manual/riffer/rig/prompts/agents_md.rbs +6 -0
  154. data/sig/manual/riffer/rig/settings.rbs +2 -4
  155. data/sig/manual/riffer/rig/skills.rbs +6 -0
  156. data/sig/manual/riffer/rig/support.rbs +8 -0
  157. data/sig/manual/riffer/rig/terminal/banner.rbs +6 -0
  158. metadata +173 -35
  159. data/lib/riffer/rig/coding_agent.rb +0 -53
  160. data/lib/riffer/rig/host.rb +0 -52
  161. data/lib/riffer/rig/repl.rb +0 -189
  162. data/lib/riffer/rig/token_tally.rb +0 -74
  163. data/sig/generated/riffer/rig/coding_agent.rbs +0 -9
  164. data/sig/generated/riffer/rig/host.rbs +0 -42
  165. data/sig/generated/riffer/rig/repl.rbs +0 -77
  166. data/sig/generated/riffer/rig/token_tally.rbs +0 -61
  167. data/sig/generated/riffer/rig/ui/banner.rbs +0 -42
  168. data/sig/generated/riffer/rig/ui/cursor.rbs +0 -33
  169. data/sig/generated/riffer/rig/ui/renderer.rbs +0 -118
  170. data/sig/generated/riffer/rig/ui/smoother.rbs +0 -72
  171. data/sig/manual/riffer/rig/ui/banner.rbs +0 -8
  172. data/sig/manual/riffer/rig/ui.rbs +0 -5
@@ -5,7 +5,7 @@ require 'open3'
5
5
  class Riffer::Rig::Tools::Bash < Riffer::Tool
6
6
  identifier 'bash'
7
7
  description 'Run a shell command in the working directory and return its combined stdout/stderr and exit status. ' \
8
- 'Use this for listing, searching (rg/grep/find), running tests, git, etc.'
8
+ 'Use this for exploring and running things: ls, rg or grep, find, tests, git, package managers.'
9
9
 
10
10
  timeout 600
11
11
 
@@ -13,6 +13,8 @@ class Riffer::Rig::Tools::Bash < Riffer::Tool
13
13
 
14
14
  MAX_OUTPUT_BYTES = 30_000 #: Integer
15
15
 
16
+ POLL_SECONDS = 0.1 #: Float
17
+
16
18
  params do
17
19
  required :command, String, description: 'The shell command to run'
18
20
  optional :timeout_ms,
@@ -26,7 +28,9 @@ class Riffer::Rig::Tools::Bash < Riffer::Tool
26
28
  # @rbs timeout_ms: Integer
27
29
  # @rbs return: Riffer::Tools::Response
28
30
  def call(context:, command:, timeout_ms: DEFAULT_TIMEOUT_MS)
29
- output, status = run(command, timeout_ms / 1000.0)
31
+ cancel_flag = context&.[](:cancel_flag) #: Riffer::Rig::Runtime::CancelFlag?
32
+ cwd = context&.[](:cwd) #: String
33
+ output, status = run(command, cwd, timeout_ms / 1000.0, cancel_flag)
30
34
  output = truncate(output.rstrip)
31
35
 
32
36
  return error("Command exited with status #{status}\n#{output}", type: :command_failed) unless status.zero?
@@ -37,24 +41,43 @@ class Riffer::Rig::Tools::Bash < Riffer::Tool
37
41
  private
38
42
 
39
43
  # @rbs command: String
44
+ # @rbs cwd: String
40
45
  # @rbs timeout_seconds: Float
46
+ # @rbs cancel_flag: Riffer::Rig::Runtime::CancelFlag?
41
47
  # @rbs return: [String, Integer]
42
- def run(command, timeout_seconds)
43
- stdin, stdout_and_stderr, wait_thread = Open3.popen2e(command, chdir: Dir.pwd, pgroup: true)
48
+ def run(command, cwd, timeout_seconds, cancel_flag)
49
+ stdin, stdout_and_stderr, wait_thread = Open3.popen2e(command, chdir: cwd, pgroup: true)
44
50
  stdin.close
45
51
 
46
- joined = wait_thread.join(timeout_seconds) #: Thread?
52
+ ending = await(wait_thread, monotonic_now + timeout_seconds, cancel_flag)
53
+ kill_group(wait_thread.pid) unless ending == :exited
54
+ output = stdout_and_stderr.read
55
+ stdout_and_stderr.close
47
56
 
48
- unless joined
49
- kill_group(wait_thread.pid)
50
- output = stdout_and_stderr.read
51
- stdout_and_stderr.close
52
- return ["#{output}\n[timed out after #{timeout_seconds.round}s]", 124]
57
+ case ending
58
+ when :timed_out then ["#{output}\n[timed out after #{timeout_seconds.round}s]", 124]
59
+ when :cancelled then ["#{output}\n[cancelled]", 130]
60
+ else [output, wait_thread.value.exitstatus || 1]
53
61
  end
62
+ end
54
63
 
55
- output = stdout_and_stderr.read
56
- stdout_and_stderr.close
57
- [output, wait_thread.value.exitstatus || 1]
64
+ # @rbs wait_thread: Process::Waiter
65
+ # @rbs deadline: Float
66
+ # @rbs cancel_flag: Riffer::Rig::Runtime::CancelFlag?
67
+ # @rbs return: Symbol
68
+ def await(wait_thread, deadline, cancel_flag)
69
+ # Upstream candidate: a cancel token on riffer's run loop would reach a
70
+ # running tool directly; until then the flag is polled from the context.
71
+ until wait_thread.join(POLL_SECONDS)
72
+ return :cancelled if cancel_flag&.set?
73
+ return :timed_out if monotonic_now >= deadline
74
+ end
75
+ :exited
76
+ end
77
+
78
+ # @rbs return: Float
79
+ def monotonic_now
80
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
58
81
  end
59
82
 
60
83
  # @rbs pid: Integer
@@ -3,7 +3,8 @@
3
3
  class Riffer::Rig::Tools::Edit < Riffer::Tool
4
4
  identifier 'edit'
5
5
  description 'Replace an exact string in a file. By default old_string must occur exactly once; ' \
6
- 'set replace_all to replace every occurrence.'
6
+ 'set replace_all to replace every occurrence. ' \
7
+ 'Prefer this over write for existing files; pass enough surrounding text to make old_string unique.'
7
8
 
8
9
  params do
9
10
  required :path, String, description: 'Path to the file (absolute, or relative to the working directory)'
@@ -22,7 +23,7 @@ class Riffer::Rig::Tools::Edit < Riffer::Tool
22
23
  # @rbs replace_all: bool
23
24
  # @rbs return: Riffer::Tools::Response
24
25
  def call(context:, path:, old_string:, new_string:, replace_all: false)
25
- resolved = File.expand_path(path, Dir.pwd)
26
+ resolved = File.expand_path(path, context&.[](:cwd))
26
27
  return error("File not found: #{path}", type: :not_found) unless File.file?(resolved)
27
28
 
28
29
  content = File.read(resolved)
@@ -3,7 +3,8 @@
3
3
  class Riffer::Rig::Tools::Read < Riffer::Tool
4
4
  identifier 'read'
5
5
  description 'Read a file from the filesystem. Returns its contents with line numbers. ' \
6
- 'Use offset/limit to read a slice of a large file.'
6
+ 'Use offset/limit to read a slice of a large file. ' \
7
+ 'Read a file before editing it, and read rather than guess what a file contains.'
7
8
 
8
9
  DEFAULT_LIMIT = 2000 #: Integer
9
10
 
@@ -19,7 +20,7 @@ class Riffer::Rig::Tools::Read < Riffer::Tool
19
20
  # @rbs limit: Integer
20
21
  # @rbs return: Riffer::Tools::Response
21
22
  def call(context:, path:, offset: nil, limit: DEFAULT_LIMIT)
22
- resolved = File.expand_path(path, Dir.pwd)
23
+ resolved = File.expand_path(path, context&.[](:cwd))
23
24
  return error("File not found: #{path}", type: :not_found) unless File.file?(resolved)
24
25
  return error('offset must be >= 1', type: :invalid_argument) if offset && offset < 1
25
26
 
@@ -4,7 +4,8 @@ require 'fileutils'
4
4
 
5
5
  class Riffer::Rig::Tools::Write < Riffer::Tool
6
6
  identifier 'write'
7
- description 'Write content to a file, creating it (and any parent directories) or overwriting it.'
7
+ description 'Write content to a file, creating it (and any parent directories) or overwriting it. ' \
8
+ 'Use this for new files or full rewrites; prefer edit for changes to an existing file.'
8
9
 
9
10
  params do
10
11
  required :path, String, description: 'Path to the file (absolute, or relative to the working directory)'
@@ -16,7 +17,7 @@ class Riffer::Rig::Tools::Write < Riffer::Tool
16
17
  # @rbs content: String
17
18
  # @rbs return: Riffer::Tools::Response
18
19
  def call(context:, path:, content:)
19
- resolved = File.expand_path(path, Dir.pwd)
20
+ resolved = File.expand_path(path, context&.[](:cwd))
20
21
  FileUtils.mkdir_p(File.dirname(resolved))
21
22
  File.write(resolved, content)
22
23
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Riffer
4
4
  module Rig
5
- VERSION = '0.5.0'
5
+ VERSION = '0.7.0'
6
6
  end
7
7
  end
data/lib/riffer/rig.rb CHANGED
@@ -6,36 +6,31 @@ require_relative 'rig/version'
6
6
 
7
7
  loader = Zeitwerk::Loader.for_gem_extension(Riffer)
8
8
  loader.ignore("#{__dir__}/rig/version.rb")
9
- loader.inflector.inflect('cli' => 'CLI', 'repl' => 'REPL', 'ui' => 'UI')
9
+ loader.inflector.inflect('cli' => 'CLI')
10
10
  loader.setup
11
11
 
12
12
  module Riffer::Rig
13
13
  # @rbs self.@extensions: Hash[String, Riffer::Rig::Extension]
14
14
  @extensions = {} #: Hash[String, Riffer::Rig::Extension]
15
15
 
16
- # Records an extension block in the process registry and returns the
17
- # extension object. Re-recording a name replaces the block.
18
- #
19
- # Riffer::Rig.extension('git') do |rig|
20
- # rig.tool GitLog
21
- # end
22
- #
23
16
  # @rbs name: String
24
17
  # @rbs requires: String?
25
18
  # @rbs &block: (::Riffer::Rig::Registrar) -> void
26
19
  # @rbs return: Riffer::Rig::Extension
27
20
  def self.extension(name, requires: nil, &)
28
- ext = Extension.new(name, requires: requires, &)
29
- if ext.requires && !ext.requires.satisfied_by?(Gem::Version.new(Riffer::Rig::VERSION))
30
- raise Riffer::ArgumentError,
31
- "extension #{name} requires riffer-rig #{ext.requires}, found #{Riffer::Rig::VERSION}"
32
- end
33
-
34
- @extensions[name] = ext
21
+ # Keyed by name so reloading a file replaces its block rather than
22
+ # duplicating it.
23
+ @extensions[name] = Extension.new(name, requires: requires, &)
35
24
  end
36
25
 
37
26
  # @rbs return: Hash[String, Riffer::Rig::Extension]
38
27
  def self.extensions
39
28
  @extensions.dup
40
29
  end
30
+
31
+ # @rbs name: Symbol?
32
+ # @rbs return: Riffer::Rig::Extension | Array[Riffer::Rig::Extension]
33
+ def self.bundled(name = nil)
34
+ name ? Bundled::BY_NAME.fetch(name) : Bundled::BY_NAME.values
35
+ end
41
36
  end
@@ -0,0 +1,5 @@
1
+ # Generated from lib/riffer/rig/bundled/agents_md.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Bundled
4
+ AgentsMd: Riffer::Rig::Extension
5
+ end
@@ -0,0 +1,5 @@
1
+ # Generated from lib/riffer/rig/bundled/bash.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Bundled
4
+ Bash: Riffer::Rig::Extension
5
+ end
@@ -0,0 +1,5 @@
1
+ # Generated from lib/riffer/rig/bundled/edit.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Bundled
4
+ Edit: Riffer::Rig::Extension
5
+ end
@@ -0,0 +1,5 @@
1
+ # Generated from lib/riffer/rig/bundled/mcp.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Bundled
4
+ Mcp: Riffer::Rig::Extension
5
+ end
@@ -0,0 +1,5 @@
1
+ # Generated from lib/riffer/rig/bundled/read.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Bundled
4
+ Read: Riffer::Rig::Extension
5
+ end
@@ -0,0 +1,5 @@
1
+ # Generated from lib/riffer/rig/bundled/skills.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Bundled
4
+ Skills: Riffer::Rig::Extension
5
+ end
@@ -0,0 +1,5 @@
1
+ # Generated from lib/riffer/rig/bundled/write.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Bundled
4
+ Write: Riffer::Rig::Extension
5
+ end
@@ -0,0 +1,5 @@
1
+ # Generated from lib/riffer/rig/bundled.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Bundled
4
+ BY_NAME: Hash[Symbol, Riffer::Rig::Extension]
5
+ end
@@ -0,0 +1,40 @@
1
+ # Generated from lib/riffer/rig/cli/flags.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::CLI::Flags
4
+ BANNER: String
5
+
6
+ # @dynamic model, extensions, skills, agents_md, tools, max_steps, help
7
+ attr_reader model: String?
8
+
9
+ attr_reader extensions: bool
10
+
11
+ attr_reader skills: bool
12
+
13
+ attr_reader agents_md: bool
14
+
15
+ attr_reader help: bool
16
+
17
+ attr_reader tools: Array[String]?
18
+
19
+ attr_reader max_steps: Integer?
20
+
21
+ # @rbs argv: Array[String]
22
+ # @rbs return: Riffer::Rig::CLI::Flags | String
23
+ def self.parse: (Array[String] argv) -> (Riffer::Rig::CLI::Flags | String)
24
+
25
+ # @rbs return: String
26
+ def self.usage: () -> String
27
+
28
+ # @rbs return: OptionParser
29
+ def self.parser: () -> OptionParser
30
+
31
+ # @rbs model: String?
32
+ # @rbs extensions: bool
33
+ # @rbs skills: bool
34
+ # @rbs agents_md: bool
35
+ # @rbs tools: Array[String]?
36
+ # @rbs max_steps: Integer?
37
+ # @rbs help: bool
38
+ # @rbs return: void
39
+ def initialize: (?model: String?, ?extensions: bool, ?skills: bool, ?agents_md: bool, ?tools: Array[String]?, ?max_steps: Integer?, ?help: bool) -> void
40
+ end
@@ -1,41 +1,44 @@
1
1
  # Generated from lib/riffer/rig/cli.rb with RBS::Inline
2
2
 
3
3
  module Riffer::Rig::CLI
4
- PROVIDER_URLS: Hash[String, String]
4
+ PRINT_FLAGS: Array[String]
5
5
 
6
- # @rbs output: IO
6
+ ACP_COMMAND: ::String
7
+
8
+ USAGE_ERROR: ::Integer
9
+
10
+ # @rbs argv: Array[String]
7
11
  # @rbs input: IO
12
+ # @rbs output: IO
13
+ # @rbs error: IO
14
+ # @rbs env: Riffer::Rig::Env | Riffer::Rig::Env::Invalid
15
+ # @rbs cwd: String
16
+ # @rbs home: String
8
17
  # @rbs return: Integer
9
- def start: (?output: IO, ?input: IO) -> Integer
18
+ def start: (?Array[String] argv, ?input: IO, ?output: IO, ?error: IO, ?env: Riffer::Rig::Env | Riffer::Rig::Env::Invalid, ?cwd: String, ?home: String) -> Integer
10
19
 
11
20
  private
12
21
 
13
- # @rbs provider: String?
14
- # @rbs api_key: String
15
- # @rbs return: void
16
- def configure_provider: (String? provider, String api_key) -> void
17
-
18
- # @rbs provider: String?
19
- # @rbs theme: Riffer::Rig::UI::Theme
20
- # @rbs output: IO
22
+ # @rbs flags: Riffer::Rig::CLI::Flags
21
23
  # @rbs input: IO
22
- # @rbs return: String?
23
- def onboard: (String? provider, Riffer::Rig::UI::Theme theme, output: IO, input: IO) -> String?
24
-
25
- # @rbs provider: String?
26
- # @rbs return: String
27
- def env_var_for: (String? provider) -> String
24
+ # @rbs output: IO
25
+ # @rbs env: Riffer::Rig::Env | Riffer::Rig::Env::Invalid
26
+ # @rbs cwd: String
27
+ # @rbs home: String
28
+ # @rbs return: Integer
29
+ def terminal: (Riffer::Rig::CLI::Flags flags, input: IO, output: IO, env: Riffer::Rig::Env | Riffer::Rig::Env::Invalid, cwd: String, home: String) -> Integer
28
30
 
29
- # @rbs input: IO
30
- # @rbs return: String?
31
- def read_secret: (IO input) -> String?
31
+ # @rbs name: String
32
+ # @rbs error: IO
33
+ # @rbs return: Integer
34
+ def unavailable: (String name, IO error) -> Integer
32
35
 
33
- # @rbs theme: Riffer::Rig::UI::Theme
34
- # @rbs animator: Riffer::Rig::UI::Animator
35
- # @rbs model: String
36
- # @rbs return: void
37
- def reveal_banner: (Riffer::Rig::UI::Theme theme, Riffer::Rig::UI::Animator animator, String model) -> void
36
+ # @rbs message: String
37
+ # @rbs error: IO
38
+ # @rbs return: Integer
39
+ def refuse: (String message, IO error) -> Integer
38
40
 
39
- # @rbs return: String
40
- def count_skills: () -> String
41
+ # @rbs output: IO
42
+ # @rbs return: Integer
43
+ def help: (IO output) -> Integer
41
44
  end
@@ -0,0 +1,50 @@
1
+ # Generated from lib/riffer/rig/command/context.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Command::Context
4
+ @command: String
5
+
6
+ @emit: ^(Riffer::Rig::Events::_Event) -> void
7
+
8
+ @turn: ^(String) -> void
9
+
10
+ # @dynamic args, runtime, host, settings
11
+ attr_reader args: String
12
+
13
+ attr_reader runtime: Riffer::Rig::Runtime
14
+
15
+ attr_reader host: Riffer::Rig::Hosts::_Host
16
+
17
+ attr_reader settings: Hash[Symbol, untyped]
18
+
19
+ # @rbs command: String
20
+ # @rbs args: String
21
+ # @rbs runtime: Riffer::Rig::Runtime
22
+ # @rbs host: Riffer::Rig::Hosts::_Host
23
+ # @rbs settings: Hash[Symbol, untyped]
24
+ # @rbs emit: ^(Riffer::Rig::Events::_Event) -> void
25
+ # @rbs turn: ^(String) -> void
26
+ # @rbs return: void
27
+ def initialize: (String command, String args, runtime: Riffer::Rig::Runtime, host: Riffer::Rig::Hosts::_Host, settings: Hash[Symbol, untyped], emit: ^(Riffer::Rig::Events::_Event) -> void, turn: ^(String) -> void) -> void
28
+
29
+ # @rbs text: String
30
+ # @rbs return: nil
31
+ def say: (String text) -> nil
32
+
33
+ # @rbs event: Riffer::Rig::Events::_Event
34
+ # @rbs return: nil
35
+ def emit: (Riffer::Rig::Events::_Event event) -> nil
36
+
37
+ # @rbs text: String
38
+ # @rbs return: nil
39
+ def prompt: (String text) -> nil
40
+
41
+ # @rbs question: String?
42
+ # @rbs options: Array[String]?
43
+ # @rbs secret: bool
44
+ # @rbs return: String?
45
+ def ask: (?String? question, ?options: Array[String]?, ?secret: bool) -> String?
46
+
47
+ # @rbs question: String?
48
+ # @rbs return: bool
49
+ def confirm: (?String? question) -> bool
50
+ end
@@ -0,0 +1,23 @@
1
+ # Generated from lib/riffer/rig/command.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Command
4
+ @block: ^(Riffer::Rig::Command::Context) -> void
5
+
6
+ # @dynamic name, description, extension
7
+ attr_reader name: String
8
+
9
+ attr_reader description: String
10
+
11
+ attr_reader extension: String
12
+
13
+ # @rbs name: String
14
+ # @rbs description: String
15
+ # @rbs extension: String
16
+ # @rbs &block: (Riffer::Rig::Command::Context) -> void
17
+ # @rbs return: void
18
+ def initialize: (String name, description: String, extension: String) { (Riffer::Rig::Command::Context) -> void } -> void
19
+
20
+ # @rbs ctx: Riffer::Rig::Command::Context
21
+ # @rbs return: void
22
+ def call: (Riffer::Rig::Command::Context ctx) -> void
23
+ end
@@ -0,0 +1,27 @@
1
+ # Generated from lib/riffer/rig/commands/model.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Commands::Model
4
+ HINT: String
5
+
6
+ SAVE_UNAVAILABLE: ::String
7
+
8
+ # @rbs return: Riffer::Rig::Command
9
+ def command: () -> Riffer::Rig::Command
10
+
11
+ # @rbs ctx: Riffer::Rig::Command::Context
12
+ # @rbs return: void
13
+ def run: (Riffer::Rig::Command::Context ctx) -> void
14
+
15
+ private
16
+
17
+ # @rbs model: String
18
+ # @rbs provider: String
19
+ # @rbs missing: Array[Symbol]
20
+ # @rbs return: String
21
+ def refusal: (String model, String provider, Array[Symbol] missing) -> String
22
+
23
+ # @rbs provider: String
24
+ # @rbs credentials: Hash[Symbol, Hash[Symbol, String]]
25
+ # @rbs return: Array[Symbol]
26
+ def missing_credentials: (String provider, Hash[Symbol, Hash[Symbol, String]] credentials) -> Array[Symbol]
27
+ end
@@ -0,0 +1,12 @@
1
+ # Generated from lib/riffer/rig/commands/skill.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Commands::Skill
4
+ # @rbs skill: Riffer::Skills::Frontmatter
5
+ # @rbs return: Riffer::Rig::Command
6
+ def command: (Riffer::Skills::Frontmatter skill) -> Riffer::Rig::Command
7
+
8
+ # @rbs ctx: Riffer::Rig::Command::Context
9
+ # @rbs skill: Riffer::Skills::Frontmatter
10
+ # @rbs return: void
11
+ def run: (Riffer::Rig::Command::Context ctx, Riffer::Skills::Frontmatter skill) -> void
12
+ end
@@ -0,0 +1,4 @@
1
+ # Generated from lib/riffer/rig/commands.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Commands
4
+ end
@@ -0,0 +1,13 @@
1
+ # Generated from lib/riffer/rig/credentials/resolution.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Credentials::Resolution
4
+ # @dynamic values, missing
5
+ attr_reader values: Hash[Symbol, String]
6
+
7
+ attr_reader missing: Array[Symbol]
8
+
9
+ # @rbs values: Hash[Symbol, String]
10
+ # @rbs missing: Array[Symbol]
11
+ # @rbs return: void
12
+ def initialize: (values: Hash[Symbol, String], missing: Array[Symbol]) -> void
13
+ end
@@ -1,56 +1,85 @@
1
1
  # Generated from lib/riffer/rig/credentials.rb with RBS::Inline
2
2
 
3
- # Reads and writes API keys for each supported provider in
4
- # <tt>~/.riffer/auth.json</tt>.
5
- #
6
- # Keys are stored under the provider name, e.g.:
7
- #
8
- # {
9
- # "anthropic": "sk-ant-...",
10
- # "openai": "sk-...",
11
- # "gemini": "...",
12
- # "openrouter": "sk-or-..."
13
- # }
14
- #
15
- # The environment variable checked per provider:
16
- #
17
- # anthropic → ANTHROPIC_API_KEY
18
- # openai → OPENAI_API_KEY
19
- # gemini → GEMINI_API_KEY
20
- # openrouter → OPENROUTER_API_KEY
21
3
  module Riffer::Rig::Credentials
22
4
  PATH: String
23
5
 
24
- PROVIDER_ENV_VARS: Hash[String, String]
6
+ ENTRY_TYPE: ::String
25
7
 
26
- # Returns the API key for +provider+, checking the environment variable first,
27
- # then the stored file. Returns +nil+ if no key is available.
28
- #
29
- # @rbs provider: String?
30
- # @rbs path: String
31
- # @rbs return: String?
32
- def api_key_for: (String? provider, ?path: String) -> String?
8
+ # @rbs identifier: String | Symbol
9
+ # @rbs host: Riffer::Rig::Hosts::_Host
10
+ # @rbs setup: Riffer::Rig::ProviderSetup
11
+ # @rbs env: Riffer::Rig::Env
12
+ # @rbs auth_path: String
13
+ # @rbs settings_path: String
14
+ # @rbs return: Resolution
15
+ def resolve: (String | Symbol identifier, host: Riffer::Rig::Hosts::_Host, ?setup: Riffer::Rig::ProviderSetup, ?env: Riffer::Rig::Env, ?auth_path: String, ?settings_path: String) -> Resolution
33
16
 
34
- # Saves an API key for +provider+ to the auth file with 0600 permissions.
35
- #
36
- # @rbs provider: String
37
- # @rbs key: String
38
- # @rbs path: String
39
- # @rbs return: String
40
- def save_api_key: (String provider, String key, ?path: String) -> String
17
+ # @rbs identifier: String | Symbol
18
+ # @rbs values: Hash[Symbol, String]
19
+ # @rbs config: Riffer::Config
20
+ # @rbs return: void
21
+ def apply: (String | Symbol identifier, Hash[Symbol, String] values, ?config: Riffer::Config) -> void
22
+
23
+ # @rbs identifier: String | Symbol
24
+ # @rbs values: Hash[Symbol, String]
25
+ # @rbs setup: Riffer::Rig::ProviderSetup
26
+ # @rbs auth_path: String
27
+ # @rbs settings_path: String
28
+ # @rbs return: void
29
+ def store: (String | Symbol identifier, Hash[Symbol, String] values, ?setup: Riffer::Rig::ProviderSetup, ?auth_path: String, ?settings_path: String) -> void
30
+
31
+ # @rbs identifier: String | Symbol
32
+ # @rbs auth_path: String
33
+ # @rbs settings_path: String
34
+ # @rbs return: void
35
+ def remove: (String | Symbol identifier, ?auth_path: String, ?settings_path: String) -> void
36
+
37
+ # @rbs identifier: String | Symbol
38
+ # @rbs setup: Riffer::Rig::ProviderSetup
39
+ # @rbs env: Riffer::Rig::Env
40
+ # @rbs auth_path: String
41
+ # @rbs return: :env | :stored | :chain | :missing
42
+ def status: (String | Symbol identifier, ?setup: Riffer::Rig::ProviderSetup, ?env: Riffer::Rig::Env, ?auth_path: String) -> (:env | :stored | :chain | :missing)
41
43
 
42
44
  private
43
45
 
44
- # @rbs provider: String?
45
- # @rbs path: String
46
+ # @rbs fields: Array[Riffer::Rig::ProviderSetup::Field]
47
+ # @rbs identifier: String | Symbol
48
+ # @rbs host: Riffer::Rig::Hosts::_Host
49
+ # @rbs return: Hash[Symbol, String]
50
+ def ask_for: (Array[Riffer::Rig::ProviderSetup::Field] fields, String | Symbol identifier, Riffer::Rig::Hosts::_Host host) -> Hash[Symbol, String]
51
+
52
+ # @rbs field: Riffer::Rig::ProviderSetup::Field
53
+ # @rbs secrets: Hash[String, String]
54
+ # @rbs plain: Hash[String, String]
55
+ # @rbs env: Riffer::Rig::Env
56
+ # @rbs return: String?
57
+ def stored_value: (Riffer::Rig::ProviderSetup::Field field, Hash[String, String] secrets, Hash[String, String] plain, Riffer::Rig::Env env) -> String?
58
+
59
+ # @rbs value: String?
60
+ # @rbs env: Riffer::Rig::Env
61
+ # @rbs return: String?
62
+ def expand: (String? value, Riffer::Rig::Env env) -> String?
63
+
64
+ # @rbs command: String
65
+ # @rbs return: String?
66
+ def run: (String command) -> String?
67
+
68
+ # @rbs value: String?
46
69
  # @rbs return: String?
47
- def key_from_file: (String? provider, String path) -> String?
70
+ def presence: (String? value) -> String?
48
71
 
49
- # The parsed auth file, or an empty hash when the file is absent or
50
- # malformed. Non-string values can't be keys, so they're dropped here rather
51
- # than re-checked by every reader.
52
- #
72
+ # @rbs identifier: String | Symbol
53
73
  # @rbs path: String
54
74
  # @rbs return: Hash[String, String]
55
- def read: (String path) -> Hash[String, String]
75
+ def stored_secrets: (String | Symbol identifier, String path) -> Hash[String, String]
76
+
77
+ # @rbs path: String
78
+ # @rbs return: Hash[String, Hash[String, String]]
79
+ def read_auth: (String path) -> Hash[String, Hash[String, String]]
80
+
81
+ # @rbs path: String
82
+ # @rbs entries: Hash[String, Hash[String, String]]
83
+ # @rbs return: void
84
+ def write_auth: (String path, Hash[String, Hash[String, String]] entries) -> void
56
85
  end
@@ -0,0 +1,11 @@
1
+ # Generated from lib/riffer/rig/directories.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Directories
4
+ # @rbs dir: String
5
+ # @rbs return: Array[String]
6
+ def ancestors: (String dir) -> Array[String]
7
+
8
+ # @rbs cwd: String
9
+ # @rbs return: Array[String]
10
+ def up_to_repo_root: (String cwd) -> Array[String]
11
+ end
@@ -0,0 +1,10 @@
1
+ # Generated from lib/riffer/rig/env/invalid.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Env::Invalid
4
+ # @dynamic message
5
+ attr_reader message: String
6
+
7
+ # @rbs message: String
8
+ # @rbs return: void
9
+ def initialize: (String message) -> void
10
+ end