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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +58 -0
- data/README.md +77 -7
- data/exe/riffer +1 -1
- data/lib/riffer/rig/bundled/agents_md.rb +7 -0
- data/lib/riffer/rig/bundled/bash.rb +5 -0
- data/lib/riffer/rig/bundled/edit.rb +5 -0
- data/lib/riffer/rig/bundled/mcp.rb +9 -0
- data/lib/riffer/rig/bundled/read.rb +5 -0
- data/lib/riffer/rig/bundled/skills.rb +10 -0
- data/lib/riffer/rig/bundled/write.rb +5 -0
- data/lib/riffer/rig/bundled.rb +7 -0
- data/lib/riffer/rig/cli/flags.rb +77 -0
- data/lib/riffer/rig/cli.rb +70 -102
- data/lib/riffer/rig/command/context.rb +70 -0
- data/lib/riffer/rig/command.rb +29 -0
- data/lib/riffer/rig/commands/model.rb +54 -0
- data/lib/riffer/rig/commands/skill.rb +27 -0
- data/lib/riffer/rig/commands.rb +4 -0
- data/lib/riffer/rig/credentials/resolution.rb +16 -0
- data/lib/riffer/rig/credentials.rb +151 -60
- data/lib/riffer/rig/directories.rb +20 -0
- data/lib/riffer/rig/env/invalid.rb +13 -0
- data/lib/riffer/rig/env.rb +40 -0
- data/lib/riffer/rig/events/after_response.rb +25 -0
- data/lib/riffer/rig/events/after_tool_call.rb +31 -0
- data/lib/riffer/rig/events/before_prompt.rb +25 -0
- data/lib/riffer/rig/events/before_request.rb +25 -0
- data/lib/riffer/rig/events/before_tool_call.rb +28 -0
- data/lib/riffer/rig/events/command_output.rb +28 -0
- data/lib/riffer/rig/events/notify.rb +28 -0
- data/lib/riffer/rig/events/session_end.rb +25 -0
- data/lib/riffer/rig/events/session_start.rb +28 -0
- data/lib/riffer/rig/events/skill_activated.rb +25 -0
- data/lib/riffer/rig/events/turn_end.rb +33 -0
- data/lib/riffer/rig/events.rb +4 -0
- data/lib/riffer/rig/extension/failure.rb +16 -0
- data/lib/riffer/rig/extension.rb +16 -5
- data/lib/riffer/rig/hosts/mirror.rb +59 -0
- data/lib/riffer/rig/hosts/null.rb +36 -0
- data/lib/riffer/rig/loader.rb +163 -0
- data/lib/riffer/rig/mcp/declaration.rb +23 -0
- data/lib/riffer/rig/mcp/server.rb +16 -0
- data/lib/riffer/rig/mcp.rb +12 -0
- data/lib/riffer/rig/prompts/agents_md.rb +32 -0
- data/lib/riffer/rig/prompts.rb +4 -0
- data/lib/riffer/rig/provider_setup/field.rb +24 -0
- data/lib/riffer/rig/provider_setup.rb +84 -0
- data/lib/riffer/rig/registrar.rb +134 -7
- data/lib/riffer/rig/runtime/blocked.rb +13 -0
- data/lib/riffer/rig/runtime/cancel_flag.rb +27 -0
- data/lib/riffer/rig/runtime/hooks.rb +78 -0
- data/lib/riffer/rig/runtime/request_guardrail.rb +24 -0
- data/lib/riffer/rig/runtime/tool_runtime.rb +44 -0
- data/lib/riffer/rig/runtime.rb +582 -70
- data/lib/riffer/rig/settings/document.rb +28 -12
- data/lib/riffer/rig/settings/pricing.rb +16 -6
- data/lib/riffer/rig/settings.rb +108 -81
- data/lib/riffer/rig/skills/sources.rb +28 -0
- data/lib/riffer/rig/skills.rb +12 -0
- data/lib/riffer/rig/support/equatable.rb +21 -0
- data/lib/riffer/rig/{ui → terminal}/animator.rb +6 -13
- data/lib/riffer/rig/{ui → terminal}/banner.rb +17 -21
- data/lib/riffer/rig/{ui → terminal}/cursor.rb +4 -6
- data/lib/riffer/rig/terminal/host.rb +85 -0
- data/lib/riffer/rig/{ui → terminal}/palette.rb +1 -1
- data/lib/riffer/rig/{ui → terminal}/renderer.rb +121 -87
- data/lib/riffer/rig/{ui → terminal}/smoother.rb +15 -23
- data/lib/riffer/rig/{ui → terminal}/theme.rb +12 -14
- data/lib/riffer/rig/terminal.rb +207 -0
- data/lib/riffer/rig/tools/bash.rb +36 -13
- data/lib/riffer/rig/tools/edit.rb +3 -2
- data/lib/riffer/rig/tools/read.rb +3 -2
- data/lib/riffer/rig/tools/write.rb +3 -2
- data/lib/riffer/rig/version.rb +1 -1
- data/lib/riffer/rig.rb +10 -15
- data/sig/generated/riffer/rig/bundled/agents_md.rbs +5 -0
- data/sig/generated/riffer/rig/bundled/bash.rbs +5 -0
- data/sig/generated/riffer/rig/bundled/edit.rbs +5 -0
- data/sig/generated/riffer/rig/bundled/mcp.rbs +5 -0
- data/sig/generated/riffer/rig/bundled/read.rbs +5 -0
- data/sig/generated/riffer/rig/bundled/skills.rbs +5 -0
- data/sig/generated/riffer/rig/bundled/write.rbs +5 -0
- data/sig/generated/riffer/rig/bundled.rbs +5 -0
- data/sig/generated/riffer/rig/cli/flags.rbs +40 -0
- data/sig/generated/riffer/rig/cli.rbs +30 -27
- data/sig/generated/riffer/rig/command/context.rbs +50 -0
- data/sig/generated/riffer/rig/command.rbs +23 -0
- data/sig/generated/riffer/rig/commands/model.rbs +27 -0
- data/sig/generated/riffer/rig/commands/skill.rbs +12 -0
- data/sig/generated/riffer/rig/commands.rbs +4 -0
- data/sig/generated/riffer/rig/credentials/resolution.rbs +13 -0
- data/sig/generated/riffer/rig/credentials.rbs +70 -41
- data/sig/generated/riffer/rig/directories.rbs +11 -0
- data/sig/generated/riffer/rig/env/invalid.rbs +10 -0
- data/sig/generated/riffer/rig/env.rbs +26 -0
- data/sig/generated/riffer/rig/events/after_response.rbs +18 -0
- data/sig/generated/riffer/rig/events/after_tool_call.rbs +24 -0
- data/sig/generated/riffer/rig/events/before_prompt.rbs +18 -0
- data/sig/generated/riffer/rig/events/before_request.rbs +18 -0
- data/sig/generated/riffer/rig/events/before_tool_call.rbs +21 -0
- data/sig/generated/riffer/rig/events/command_output.rbs +21 -0
- data/sig/generated/riffer/rig/events/notify.rbs +21 -0
- data/sig/generated/riffer/rig/events/session_end.rbs +18 -0
- data/sig/generated/riffer/rig/events/session_start.rbs +21 -0
- data/sig/generated/riffer/rig/events/skill_activated.rbs +18 -0
- data/sig/generated/riffer/rig/events/turn_end.rbs +24 -0
- data/sig/generated/riffer/rig/events.rbs +4 -0
- data/sig/generated/riffer/rig/extension/failure.rbs +13 -0
- data/sig/generated/riffer/rig/extension.rbs +14 -5
- data/sig/generated/riffer/rig/hosts/mirror.rbs +41 -0
- data/sig/generated/riffer/rig/hosts/null.rbs +26 -0
- data/sig/generated/riffer/rig/loader.rbs +77 -0
- data/sig/generated/riffer/rig/mcp/declaration.rbs +18 -0
- data/sig/generated/riffer/rig/mcp/server.rbs +13 -0
- data/sig/generated/riffer/rig/mcp.rbs +8 -0
- data/sig/generated/riffer/rig/prompts/agents_md.rbs +19 -0
- data/sig/generated/riffer/rig/prompts.rbs +4 -0
- data/sig/generated/riffer/rig/provider_setup/field.rbs +22 -0
- data/sig/generated/riffer/rig/provider_setup.rbs +30 -0
- data/sig/generated/riffer/rig/registrar.rbs +88 -6
- data/sig/generated/riffer/rig/runtime/blocked.rbs +10 -0
- data/sig/generated/riffer/rig/runtime/cancel_flag.rbs +19 -0
- data/sig/generated/riffer/rig/runtime/hooks.rbs +49 -0
- data/sig/generated/riffer/rig/runtime/request_guardrail.rbs +16 -0
- data/sig/generated/riffer/rig/runtime/tool_runtime.rbs +23 -0
- data/sig/generated/riffer/rig/runtime.rbs +262 -40
- data/sig/generated/riffer/rig/settings/document.rbs +13 -9
- data/sig/generated/riffer/rig/settings/pricing.rbs +7 -3
- data/sig/generated/riffer/rig/settings.rbs +56 -64
- data/sig/generated/riffer/rig/skills/sources.rbs +18 -0
- data/sig/generated/riffer/rig/skills.rbs +7 -0
- data/sig/generated/riffer/rig/support/equatable.rbs +15 -0
- data/sig/generated/riffer/rig/{ui → terminal}/animator.rbs +5 -13
- data/sig/generated/riffer/rig/terminal/banner.rbs +39 -0
- data/sig/generated/riffer/rig/terminal/cursor.rbs +31 -0
- data/sig/generated/riffer/rig/terminal/host.rbs +50 -0
- data/sig/generated/riffer/rig/{ui → terminal}/palette.rbs +2 -2
- data/sig/generated/riffer/rig/terminal/renderer.rbs +126 -0
- data/sig/generated/riffer/rig/terminal/smoother.rbs +59 -0
- data/sig/generated/riffer/rig/{ui → terminal}/theme.rbs +5 -7
- data/sig/generated/riffer/rig/terminal.rbs +85 -0
- data/sig/generated/riffer/rig/tools/bash.rbs +14 -1
- data/sig/generated/riffer/rig.rbs +4 -7
- data/sig/manual/riffer/rig/cli.rbs +2 -4
- data/sig/manual/riffer/rig/commands/model.rbs +6 -0
- data/sig/manual/riffer/rig/commands/skill.rbs +6 -0
- data/sig/manual/riffer/rig/credentials.rbs +2 -4
- data/sig/manual/riffer/rig/directories.rbs +6 -0
- data/sig/manual/riffer/rig/events.rbs +6 -0
- data/sig/manual/riffer/rig/hosts.rbs +12 -0
- data/sig/manual/riffer/rig/mcp.rbs +11 -0
- data/sig/manual/riffer/rig/prompts/agents_md.rbs +6 -0
- data/sig/manual/riffer/rig/settings.rbs +2 -4
- data/sig/manual/riffer/rig/skills.rbs +6 -0
- data/sig/manual/riffer/rig/support.rbs +8 -0
- data/sig/manual/riffer/rig/terminal/banner.rbs +6 -0
- metadata +173 -35
- data/lib/riffer/rig/coding_agent.rb +0 -53
- data/lib/riffer/rig/host.rb +0 -52
- data/lib/riffer/rig/repl.rb +0 -189
- data/lib/riffer/rig/token_tally.rb +0 -74
- data/sig/generated/riffer/rig/coding_agent.rbs +0 -9
- data/sig/generated/riffer/rig/host.rbs +0 -42
- data/sig/generated/riffer/rig/repl.rbs +0 -77
- data/sig/generated/riffer/rig/token_tally.rbs +0 -61
- data/sig/generated/riffer/rig/ui/banner.rbs +0 -42
- data/sig/generated/riffer/rig/ui/cursor.rbs +0 -33
- data/sig/generated/riffer/rig/ui/renderer.rbs +0 -118
- data/sig/generated/riffer/rig/ui/smoother.rbs +0 -72
- data/sig/manual/riffer/rig/ui/banner.rbs +0 -8
- 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
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
20
|
+
resolved = File.expand_path(path, context&.[](:cwd))
|
|
20
21
|
FileUtils.mkdir_p(File.dirname(resolved))
|
|
21
22
|
File.write(resolved, content)
|
|
22
23
|
|
data/lib/riffer/rig/version.rb
CHANGED
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'
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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,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
|
-
|
|
4
|
+
PRINT_FLAGS: Array[String]
|
|
5
5
|
|
|
6
|
-
|
|
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, ?
|
|
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
|
|
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
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# @rbs
|
|
26
|
-
# @rbs return:
|
|
27
|
-
def
|
|
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
|
|
30
|
-
# @rbs
|
|
31
|
-
|
|
31
|
+
# @rbs name: String
|
|
32
|
+
# @rbs error: IO
|
|
33
|
+
# @rbs return: Integer
|
|
34
|
+
def unavailable: (String name, IO error) -> Integer
|
|
32
35
|
|
|
33
|
-
# @rbs
|
|
34
|
-
# @rbs
|
|
35
|
-
# @rbs
|
|
36
|
-
|
|
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
|
|
40
|
-
|
|
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,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
|
-
|
|
6
|
+
ENTRY_TYPE: ::String
|
|
25
7
|
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
# @rbs
|
|
30
|
-
# @rbs
|
|
31
|
-
# @rbs
|
|
32
|
-
|
|
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
|
-
#
|
|
35
|
-
#
|
|
36
|
-
# @rbs
|
|
37
|
-
# @rbs
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
45
|
-
# @rbs
|
|
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
|
|
70
|
+
def presence: (String? value) -> String?
|
|
48
71
|
|
|
49
|
-
#
|
|
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
|
|
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
|