riffer-rig 0.4.0 → 0.6.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +37 -0
  3. data/README.md +43 -6
  4. data/lib/riffer/rig/cli.rb +51 -47
  5. data/lib/riffer/rig/coding_agent.rb +1 -6
  6. data/lib/riffer/rig/credentials/resolution.rb +16 -0
  7. data/lib/riffer/rig/credentials.rb +151 -60
  8. data/lib/riffer/rig/env.rb +29 -0
  9. data/lib/riffer/rig/events/command_output.rb +27 -0
  10. data/lib/riffer/rig/events/event.rb +30 -0
  11. data/lib/riffer/rig/events/notify.rb +27 -0
  12. data/lib/riffer/rig/events/session_end.rb +24 -0
  13. data/lib/riffer/rig/events/session_start.rb +27 -0
  14. data/lib/riffer/rig/events/skill_activated.rb +24 -0
  15. data/lib/riffer/rig/events/turn_end.rb +32 -0
  16. data/lib/riffer/rig/events.rb +4 -0
  17. data/lib/riffer/rig/extension.rb +27 -0
  18. data/lib/riffer/rig/hosts/base.rb +36 -0
  19. data/lib/riffer/rig/hosts/mirror.rb +60 -0
  20. data/lib/riffer/rig/hosts/null.rb +36 -0
  21. data/lib/riffer/rig/provider_setup/field.rb +24 -0
  22. data/lib/riffer/rig/provider_setup.rb +84 -0
  23. data/lib/riffer/rig/registrar.rb +35 -0
  24. data/lib/riffer/rig/repl.rb +42 -31
  25. data/lib/riffer/rig/runtime/cancel_flag.rb +27 -0
  26. data/lib/riffer/rig/runtime.rb +225 -0
  27. data/lib/riffer/rig/settings/document.rb +28 -0
  28. data/lib/riffer/rig/settings/pricing.rb +11 -1
  29. data/lib/riffer/rig/settings.rb +49 -60
  30. data/lib/riffer/rig/token_tally.rb +1 -21
  31. data/lib/riffer/rig/tools/bash.rb +33 -12
  32. data/lib/riffer/rig/tools/edit.rb +1 -1
  33. data/lib/riffer/rig/tools/read.rb +2 -2
  34. data/lib/riffer/rig/ui/animator.rb +8 -15
  35. data/lib/riffer/rig/ui/cursor.rb +4 -6
  36. data/lib/riffer/rig/ui/renderer.rb +18 -31
  37. data/lib/riffer/rig/ui/smoother.rb +15 -23
  38. data/lib/riffer/rig/ui/theme.rb +4 -6
  39. data/lib/riffer/rig/version.rb +1 -1
  40. data/lib/riffer/rig.rb +26 -0
  41. data/sig/generated/riffer/rig/cli.rbs +27 -19
  42. data/sig/generated/riffer/rig/credentials/resolution.rbs +13 -0
  43. data/sig/generated/riffer/rig/credentials.rbs +71 -41
  44. data/sig/generated/riffer/rig/env.rbs +20 -0
  45. data/sig/generated/riffer/rig/events/command_output.rbs +19 -0
  46. data/sig/generated/riffer/rig/events/event.rbs +20 -0
  47. data/sig/generated/riffer/rig/events/notify.rbs +19 -0
  48. data/sig/generated/riffer/rig/events/session_end.rbs +16 -0
  49. data/sig/generated/riffer/rig/events/session_start.rbs +19 -0
  50. data/sig/generated/riffer/rig/events/skill_activated.rbs +16 -0
  51. data/sig/generated/riffer/rig/events/turn_end.rbs +22 -0
  52. data/sig/generated/riffer/rig/events.rbs +4 -0
  53. data/sig/generated/riffer/rig/extension.rbs +24 -0
  54. data/sig/generated/riffer/rig/hosts/base.rbs +26 -0
  55. data/sig/generated/riffer/rig/hosts/mirror.rbs +41 -0
  56. data/sig/generated/riffer/rig/hosts/null.rbs +26 -0
  57. data/sig/generated/riffer/rig/provider_setup/field.rbs +22 -0
  58. data/sig/generated/riffer/rig/provider_setup.rbs +30 -0
  59. data/sig/generated/riffer/rig/registrar.rbs +25 -0
  60. data/sig/generated/riffer/rig/repl.rbs +17 -16
  61. data/sig/generated/riffer/rig/runtime/cancel_flag.rbs +19 -0
  62. data/sig/generated/riffer/rig/runtime.rbs +120 -0
  63. data/sig/generated/riffer/rig/settings/document.rbs +24 -0
  64. data/sig/generated/riffer/rig/settings/pricing.rbs +4 -1
  65. data/sig/generated/riffer/rig/settings.rbs +28 -49
  66. data/sig/generated/riffer/rig/token_tally.rbs +2 -21
  67. data/sig/generated/riffer/rig/tools/bash.rbs +15 -3
  68. data/sig/generated/riffer/rig/tools/edit.rbs +2 -2
  69. data/sig/generated/riffer/rig/tools/read.rbs +3 -3
  70. data/sig/generated/riffer/rig/ui/animator.rbs +8 -16
  71. data/sig/generated/riffer/rig/ui/cursor.rbs +4 -6
  72. data/sig/generated/riffer/rig/ui/renderer.rbs +13 -35
  73. data/sig/generated/riffer/rig/ui/smoother.rbs +9 -22
  74. data/sig/generated/riffer/rig/ui/theme.rbs +3 -5
  75. data/sig/generated/riffer/rig.rbs +12 -0
  76. data/sig/manual/riffer/rig/cli.rbs +2 -4
  77. data/sig/manual/riffer/rig/credentials.rbs +2 -4
  78. data/sig/manual/riffer/rig/hosts.rbs +5 -0
  79. data/sig/manual/riffer/rig/settings.rbs +2 -4
  80. data/sig/manual/riffer/rig/ui/banner.rbs +2 -4
  81. data/sig/manual/riffer/rig.rbs +11 -0
  82. metadata +45 -3
@@ -0,0 +1,22 @@
1
+ # Generated from lib/riffer/rig/events/turn_end.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Events::TurnEnd < Riffer::Rig::Events::Event
4
+ # @dynamic stop_reason, usage
5
+ attr_reader stop_reason: Symbol
6
+
7
+ attr_reader usage: ::Riffer::Providers::TokenUsage?
8
+
9
+ # @rbs stop_reason: Symbol
10
+ # @rbs usage: ::Riffer::Providers::TokenUsage?
11
+ # @rbs return: void
12
+ def initialize: (Symbol stop_reason, ::Riffer::Providers::TokenUsage? usage) -> void
13
+
14
+ # @rbs return: Float?
15
+ def cost: () -> Float?
16
+
17
+ # @rbs return: Symbol
18
+ def type: () -> Symbol
19
+
20
+ # @rbs return: Hash[Symbol, untyped]
21
+ def to_h: () -> Hash[Symbol, untyped]
22
+ end
@@ -0,0 +1,4 @@
1
+ # Generated from lib/riffer/rig/events.rb with RBS::Inline
2
+
3
+ module Riffer::Rig::Events
4
+ end
@@ -0,0 +1,24 @@
1
+ # Generated from lib/riffer/rig/extension.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Extension
4
+ @name: String
5
+
6
+ @requires: Gem::Requirement?
7
+
8
+ @block: ^(::Riffer::Rig::Registrar) -> void
9
+
10
+ # @dynamic name, requires
11
+ attr_reader name: String
12
+
13
+ attr_reader requires: Gem::Requirement?
14
+
15
+ # @rbs name: String
16
+ # @rbs requires: String?
17
+ # @rbs &block: (::Riffer::Rig::Registrar) -> void
18
+ # @rbs return: void
19
+ def initialize: (String name, ?requires: String?) { (::Riffer::Rig::Registrar) -> void } -> void
20
+
21
+ # @rbs registrar: Riffer::Rig::Registrar
22
+ # @rbs return: void
23
+ def run: (Riffer::Rig::Registrar registrar) -> void
24
+ end
@@ -0,0 +1,26 @@
1
+ # Generated from lib/riffer/rig/hosts/base.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Hosts::Base
4
+ # @rbs return: Set[Symbol]
5
+ def capabilities: () -> Set[Symbol]
6
+
7
+ # @rbs question: String?
8
+ # @rbs options: Array[String]?
9
+ # @rbs secret: bool
10
+ # @rbs return: String?
11
+ def ask: (?String? question, ?options: Array[String]?, ?secret: bool) -> String?
12
+
13
+ # @rbs question: String?
14
+ # @rbs return: bool
15
+ def confirm: (?String? question) -> bool
16
+
17
+ # @rbs message: String?
18
+ # @rbs level: Symbol
19
+ # @rbs return: void
20
+ def notify: (?String? message, ?level: Symbol) -> void
21
+
22
+ # @rbs label: String?
23
+ # @rbs &: ? () -> void
24
+ # @rbs return: void
25
+ def progress: (?String? label) ?{ () -> void } -> void
26
+ end
@@ -0,0 +1,41 @@
1
+ # Generated from lib/riffer/rig/hosts/mirror.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Hosts::Mirror < Riffer::Rig::Hosts::Base
4
+ @host: Riffer::Rig::Hosts::Base
5
+
6
+ @queue: Array[Riffer::Rig::Events::Event]
7
+
8
+ # @dynamic capabilities
9
+ attr_reader capabilities: Set[Symbol]
10
+
11
+ # @rbs host: Riffer::Rig::Hosts::Base
12
+ # @rbs return: void
13
+ def initialize: (Riffer::Rig::Hosts::Base host) -> void
14
+
15
+ # @rbs question: String?
16
+ # @rbs options: Array[String]?
17
+ # @rbs secret: bool
18
+ # @rbs return: String?
19
+ def ask: (?String? question, ?options: Array[String]?, ?secret: bool) -> String?
20
+
21
+ # @rbs question: String?
22
+ # @rbs return: bool
23
+ def confirm: (?String? question) -> bool
24
+
25
+ # @rbs message: String?
26
+ # @rbs level: Symbol
27
+ # @rbs return: void
28
+ def notify: (?String? message, ?level: Symbol) -> void
29
+
30
+ # @rbs label: String?
31
+ # @rbs &block: ? () -> void
32
+ # @rbs return: void
33
+ def progress: (?String? label) ?{ () -> void } -> void
34
+
35
+ # @rbs event: Riffer::Rig::Events::Event
36
+ # @rbs return: void
37
+ def queue: (Riffer::Rig::Events::Event event) -> void
38
+
39
+ # @rbs return: Array[Riffer::Rig::Events::Event]
40
+ def drain: () -> Array[Riffer::Rig::Events::Event]
41
+ end
@@ -0,0 +1,26 @@
1
+ # Generated from lib/riffer/rig/hosts/null.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Hosts::Null < Riffer::Rig::Hosts::Base
4
+ # @rbs return: Set[Symbol]
5
+ def capabilities: () -> Set[Symbol]
6
+
7
+ # @rbs question: String?
8
+ # @rbs options: Array[String]?
9
+ # @rbs secret: bool
10
+ # @rbs return: String?
11
+ def ask: (?String? question, ?options: Array[String]?, ?secret: bool) -> String?
12
+
13
+ # @rbs question: String?
14
+ # @rbs return: bool
15
+ def confirm: (?String? question) -> bool
16
+
17
+ # @rbs message: String?
18
+ # @rbs level: Symbol
19
+ # @rbs return: void
20
+ def notify: (?String? message, ?level: Symbol) -> void
21
+
22
+ # @rbs label: String?
23
+ # @rbs &block: ? () -> void
24
+ # @rbs return: void
25
+ def progress: (?String? label) ?{ () -> void } -> void
26
+ end
@@ -0,0 +1,22 @@
1
+ # Generated from lib/riffer/rig/provider_setup/field.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::ProviderSetup::Field
4
+ # @dynamic name, env, secret, required, fallback
5
+ attr_reader name: Symbol
6
+
7
+ attr_reader env: Array[String]
8
+
9
+ attr_reader secret: bool
10
+
11
+ attr_reader required: bool
12
+
13
+ attr_reader fallback: (^() -> String?)?
14
+
15
+ # @rbs name: Symbol
16
+ # @rbs env: Array[String]
17
+ # @rbs secret: bool
18
+ # @rbs required: bool
19
+ # @rbs fallback: (^() -> String?)?
20
+ # @rbs return: void
21
+ def initialize: (name: Symbol, env: Array[String], secret: bool, required: bool, ?fallback: (^() -> String?)?) -> void
22
+ end
@@ -0,0 +1,30 @@
1
+ # Generated from lib/riffer/rig/provider_setup.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::ProviderSetup
4
+ # @dynamic url, chain, fields
5
+ attr_reader url: String?
6
+
7
+ attr_reader chain: bool
8
+
9
+ attr_reader fields: Array[Riffer::Rig::ProviderSetup::Field]
10
+
11
+ # @rbs fields: Array[Riffer::Rig::ProviderSetup::Field]
12
+ # @rbs url: String?
13
+ # @rbs chain: bool
14
+ # @rbs return: void
15
+ def initialize: (fields: Array[Riffer::Rig::ProviderSetup::Field], ?url: String?, ?chain: bool) -> void
16
+
17
+ AWS_SHARED_CONFIG_REGION: ^() -> String?
18
+
19
+ # Upstream candidate: each riffer provider could declare its own credential
20
+ # fields, and this table would go.
21
+ TABLE: Hash[Symbol, Riffer::Rig::ProviderSetup]
22
+
23
+ # @rbs identifier: String | Symbol
24
+ # @rbs return: Riffer::Rig::ProviderSetup?
25
+ def self.[]: (String | Symbol identifier) -> Riffer::Rig::ProviderSetup?
26
+
27
+ # @rbs identifier: String | Symbol
28
+ # @rbs return: Riffer::Rig::ProviderSetup
29
+ def self.for: (String | Symbol identifier) -> Riffer::Rig::ProviderSetup
30
+ end
@@ -0,0 +1,25 @@
1
+ # Generated from lib/riffer/rig/registrar.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Registrar
4
+ @tools: Array[singleton(Riffer::Tool)]
5
+
6
+ @prompts: Hash[Symbol, ^(Riffer::Rig::Runtime) -> String?]
7
+
8
+ # @rbs return: void
9
+ def initialize: () -> void
10
+
11
+ # @rbs klass: singleton(Riffer::Tool)
12
+ # @rbs return: void
13
+ def tool: (singleton(Riffer::Tool) klass) -> void
14
+
15
+ # @rbs name: Symbol
16
+ # @rbs &block: (Riffer::Rig::Runtime) -> String?
17
+ # @rbs return: void
18
+ def prompt: (Symbol name) { (Riffer::Rig::Runtime) -> String? } -> void
19
+
20
+ # @rbs return: Array[singleton(Riffer::Tool)]
21
+ def tools: () -> Array[singleton(Riffer::Tool)]
22
+
23
+ # @rbs return: Hash[Symbol, ^(Riffer::Rig::Runtime) -> String?]
24
+ def prompts: () -> Hash[Symbol, ^(Riffer::Rig::Runtime) -> String?]
25
+ end
@@ -5,9 +5,9 @@ class Riffer::Rig::REPL
5
5
 
6
6
  SKILL_COMMAND: Regexp
7
7
 
8
- @output: untyped
8
+ @output: IO
9
9
 
10
- @input: untyped
10
+ @input: IO
11
11
 
12
12
  @theme: Riffer::Rig::UI::Theme
13
13
 
@@ -21,16 +21,16 @@ class Riffer::Rig::REPL
21
21
 
22
22
  @agent: Riffer::Agent
23
23
 
24
- # @rbs ?agent: Riffer::Agent
25
- # @rbs ?renderer: Riffer::Rig::UI::Renderer
26
- # @rbs input: untyped
27
- # @rbs output: untyped
28
- # @rbs ?theme: Riffer::Rig::UI::Theme
29
- # @rbs ?animator: Riffer::Rig::UI::Animator
30
- # @rbs ?smoother: Riffer::Rig::UI::Smoother
31
- # @rbs ?cursor: Riffer::Rig::UI::Cursor
24
+ # @rbs agent: Riffer::Agent
25
+ # @rbs renderer: Riffer::Rig::UI::Renderer
26
+ # @rbs input: IO
27
+ # @rbs output: IO
28
+ # @rbs theme: Riffer::Rig::UI::Theme
29
+ # @rbs animator: Riffer::Rig::UI::Animator
30
+ # @rbs smoother: Riffer::Rig::UI::Smoother
31
+ # @rbs cursor: Riffer::Rig::UI::Cursor
32
32
  # @rbs return: void
33
- def initialize: (agent: untyped, renderer: untyped, ?input: untyped, ?output: untyped, ?theme: untyped, ?animator: untyped, ?smoother: untyped, ?cursor: untyped) -> void
33
+ def initialize: (agent: Riffer::Agent, renderer: Riffer::Rig::UI::Renderer, ?input: IO, ?output: IO, ?theme: Riffer::Rig::UI::Theme, ?animator: Riffer::Rig::UI::Animator, ?smoother: Riffer::Rig::UI::Smoother, ?cursor: Riffer::Rig::UI::Cursor) -> void
34
34
 
35
35
  # @rbs return: Symbol
36
36
  def run: () -> Symbol
@@ -55,14 +55,15 @@ class Riffer::Rig::REPL
55
55
  # @rbs return: String
56
56
  def skill_block: (String name, String body) -> String
57
57
 
58
- # Chrome lines that never pass through the renderer (errors, exit line) end
59
- # their line with a newline but leave the renderer's tool-group state alone —
60
- # they can only follow prose, never mid-group.
61
- #
58
+ # @rbs &block: () -> String
62
59
  # @rbs return: void
63
- def print_block: () ?{ (?) -> untyped } -> void
60
+ def print_block: () { () -> String } -> void
64
61
 
65
62
  # @rbs message: Riffer::Messages::Base
66
63
  # @rbs return: void
67
64
  def render_tool_result: (Riffer::Messages::Base message) -> void
65
+
66
+ # @rbs mode: Symbol
67
+ # @rbs return: void
68
+ def start_animator: (?Symbol mode) -> void
68
69
  end
@@ -0,0 +1,19 @@
1
+ # Generated from lib/riffer/rig/runtime/cancel_flag.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Runtime::CancelFlag
4
+ @mutex: Thread::Mutex
5
+
6
+ @set: bool
7
+
8
+ # @rbs return: void
9
+ def initialize: () -> void
10
+
11
+ # @rbs return: void
12
+ def set: () -> void
13
+
14
+ # @rbs return: void
15
+ def clear: () -> void
16
+
17
+ # @rbs return: bool
18
+ def set?: () -> bool
19
+ end
@@ -0,0 +1,120 @@
1
+ # Generated from lib/riffer/rig/runtime.rb with RBS::Inline
2
+
3
+ # Never renders, prints or reads the filesystem: anything a host needs is a
4
+ # Runtime feature, so embedders get it too.
5
+ class Riffer::Rig::Runtime
6
+ class BusyError < StandardError
7
+ end
8
+
9
+ class ClosedError < StandardError
10
+ end
11
+
12
+ BASE_PROMPT_TEMPLATE: ::String
13
+
14
+ DEFAULT_NAME: ::String
15
+
16
+ # Unlimited: riffer's own default (16) is too small for a general-purpose
17
+ # harness.
18
+ DEFAULT_MAX_STEPS: Integer?
19
+
20
+ INTERRUPT_CANCELLED: Symbol
21
+
22
+ @agent: Riffer::Agent
23
+
24
+ @base_prompt: String
25
+
26
+ @cancel_flag: Riffer::Rig::Runtime::CancelFlag
27
+
28
+ @credentials: Hash[Symbol, Hash[Symbol, String]]
29
+
30
+ @cwd: String
31
+
32
+ @host: Riffer::Rig::Hosts::Mirror
33
+
34
+ @id: String
35
+
36
+ @settings: Hash[Symbol, untyped]
37
+
38
+ @busy: bool
39
+
40
+ @closed: bool
41
+
42
+ @session_start_pending: bool
43
+
44
+ @registrar: Riffer::Rig::Registrar
45
+
46
+ # @dynamic agent, credentials, cwd, host, id, settings
47
+ attr_reader agent: Riffer::Agent
48
+
49
+ attr_reader credentials: Hash[Symbol, Hash[Symbol, String]]
50
+
51
+ attr_reader cwd: String
52
+
53
+ attr_reader host: Riffer::Rig::Hosts::Mirror
54
+
55
+ attr_reader id: String
56
+
57
+ attr_reader settings: Hash[Symbol, untyped]
58
+
59
+ # @rbs model: String
60
+ # @rbs extensions: Array[Riffer::Rig::Extension]
61
+ # @rbs tools: Array[String]?
62
+ # @rbs settings: Hash[Symbol, untyped]
63
+ # @rbs host: Riffer::Rig::Hosts::Base
64
+ # @rbs cwd: String?
65
+ # @rbs name: String
66
+ # @rbs instructions: String?
67
+ # @rbs credentials: Hash[Symbol, Hash[Symbol, String]]
68
+ # @rbs pricing: Hash[String, Riffer::Rig::Settings::Pricing]
69
+ # @rbs max_steps: Integer?
70
+ # @rbs snapshot: Hash[Symbol, untyped]?
71
+ # @rbs return: void
72
+ def initialize: (String model, ?extensions: Array[Riffer::Rig::Extension], ?tools: Array[String]?, ?settings: Hash[Symbol, untyped], ?host: Riffer::Rig::Hosts::Base, ?cwd: String?, ?name: String, ?instructions: String?, ?credentials: Hash[Symbol, Hash[Symbol, String]], ?pricing: Hash[String, Riffer::Rig::Settings::Pricing], ?max_steps: Integer?, ?snapshot: Hash[Symbol, untyped]?) -> void
73
+
74
+ # @rbs text: String
75
+ # @rbs &block: ?(::Riffer::StreamEvents::Base | Riffer::Rig::Events::Event) -> void
76
+ # @rbs return: (nil | Enumerator[::Riffer::StreamEvents::Base | Riffer::Rig::Events::Event, Riffer::Agent::Response])
77
+ def prompt: (String text) ?{ (::Riffer::StreamEvents::Base | Riffer::Rig::Events::Event) -> void } -> (nil | Enumerator[::Riffer::StreamEvents::Base | Riffer::Rig::Events::Event, Riffer::Agent::Response])
78
+
79
+ # @rbs text: String
80
+ # @rbs return: Riffer::Agent::Response
81
+ def ask: (String text) -> Riffer::Agent::Response
82
+
83
+ # @rbs return: nil
84
+ def cancel: () -> nil
85
+
86
+ # @rbs return: void
87
+ def close: () -> void
88
+
89
+ private
90
+
91
+ # @rbs stream: Enumerator[Riffer::StreamEvents::Base, Riffer::Agent::Response]
92
+ # @rbs return: Enumerator[::Riffer::StreamEvents::Base | Riffer::Rig::Events::Event, Riffer::Agent::Response]
93
+ def wrap_stream: (Enumerator[Riffer::StreamEvents::Base, Riffer::Agent::Response] stream) -> Enumerator[::Riffer::StreamEvents::Base | Riffer::Rig::Events::Event, Riffer::Agent::Response]
94
+
95
+ # @rbs return: void
96
+ def interrupt_if_cancelled: () -> void
97
+
98
+ # @rbs outcome: Riffer::Agent::Outcome
99
+ # @rbs return: Symbol
100
+ def stop_reason: (Riffer::Agent::Outcome outcome) -> Symbol
101
+
102
+ # @rbs extensions: Array[Riffer::Rig::Extension]
103
+ # @rbs return: Riffer::Rig::Registrar
104
+ def build_registrar: (Array[Riffer::Rig::Extension] extensions) -> Riffer::Rig::Registrar
105
+
106
+ # @rbs registered: Array[singleton(Riffer::Tool)]
107
+ # @rbs allowlist: Array[String]?
108
+ # @rbs return: Array[singleton(Riffer::Tool)]
109
+ def select_tools: (Array[singleton(Riffer::Tool)] registered, Array[String]? allowlist) -> Array[singleton(Riffer::Tool)]
110
+
111
+ # @rbs return: void
112
+ def refresh_system_message: () -> void
113
+
114
+ # @rbs return: Array[String]
115
+ def rendered_sections: () -> Array[String]
116
+
117
+ # @rbs sections: Array[String]
118
+ # @rbs return: String
119
+ def system_prompt: (Array[String] sections) -> String
120
+ end
@@ -0,0 +1,24 @@
1
+ # Generated from lib/riffer/rig/settings/document.rb with RBS::Inline
2
+
3
+ class Riffer::Rig::Settings::Document
4
+ @model: String?
5
+
6
+ @reasoning: String?
7
+
8
+ @models: Hash[String, Riffer::Rig::Settings::Pricing]
9
+
10
+ @providers: Hash[String, Hash[String, String]]
11
+
12
+ # @dynamic model, reasoning, models, providers
13
+ attr_reader model: String?
14
+
15
+ attr_reader reasoning: String?
16
+
17
+ attr_reader models: Hash[String, Riffer::Rig::Settings::Pricing]
18
+
19
+ attr_reader providers: Hash[String, Hash[String, String]]
20
+
21
+ # @rbs source: untyped
22
+ # @rbs return: void
23
+ def initialize: (untyped source) -> void
24
+ end
@@ -1,6 +1,5 @@
1
1
  # Generated from lib/riffer/rig/settings/pricing.rb with RBS::Inline
2
2
 
3
- # USD per million tokens, parsed from a model's entry in the settings file.
4
3
  class Riffer::Rig::Settings::Pricing
5
4
  # @dynamic input, output, cache_write, cache_read
6
5
  attr_reader input: Float
@@ -14,6 +13,10 @@ class Riffer::Rig::Settings::Pricing
14
13
  # @dynamic input, output, cache_write, cache_read
15
14
  attr_reader cache_read: Float
16
15
 
16
+ # @rbs entry: Hash[String, untyped]
17
+ # @rbs return: ::Riffer::Rig::Settings::Pricing
18
+ def self.from: (Hash[String, untyped] entry) -> ::Riffer::Rig::Settings::Pricing
19
+
17
20
  # @rbs input: Float
18
21
  # @rbs output: Float
19
22
  # @rbs cache_write: Float
@@ -1,34 +1,5 @@
1
1
  # Generated from lib/riffer/rig/settings.rb with RBS::Inline
2
2
 
3
- # Reads and writes the riffer-rig user settings file at
4
- # <tt>~/.riffer/settings.json</tt>.
5
- #
6
- # Example file:
7
- #
8
- # {
9
- # "model": "anthropic/claude-sonnet-4-6",
10
- # "reasoning": "low",
11
- # "models": {
12
- # "anthropic/claude-sonnet-4-6": {
13
- # "input": 3.0,
14
- # "output": 15.0,
15
- # "cache_write": 3.75,
16
- # "cache_read": 0.3
17
- # }
18
- # }
19
- # }
20
- #
21
- # All keys are optional. Missing pricing means cost display is suppressed.
22
- # <tt>"reasoning"</tt> is translated to the appropriate provider-specific
23
- # parameter on each API call; accepted values depend on the provider:
24
- #
25
- # - Anthropic: <tt>"low"</tt>, <tt>"medium"</tt>, <tt>"high"</tt>,
26
- # <tt>"xhigh"</tt>, <tt>"max"</tt>
27
- # - OpenAI / OpenRouter: <tt>"low"</tt>, <tt>"medium"</tt>, <tt>"high"</tt>,
28
- # <tt>"xhigh"</tt>
29
- #
30
- # Omitting the key (or supplying an unrecognised value) leaves the model's
31
- # default reasoning behaviour unchanged.
32
3
  module Riffer::Rig::Settings
33
4
  PATH: String
34
5
 
@@ -36,57 +7,65 @@ module Riffer::Rig::Settings
36
7
 
37
8
  REASONING_LEVELS_BY_PROVIDER: Hash[String, Array[String]]
38
9
 
39
- # Returns the configured model string, or +DEFAULT_MODEL+ if not set.
40
- #
41
10
  # @rbs path: String
42
11
  # @rbs return: String
43
12
  def model: (?path: String) -> String
44
13
 
45
- # Returns model options for the configured model and reasoning level, ready
46
- # to pass directly to the Riffer agent's +model_options+.
47
- #
48
14
  # @rbs path: String
49
15
  # @rbs return: Hash[Symbol, untyped]
50
16
  def model_options: (?path: String) -> Hash[Symbol, untyped]
51
17
 
52
- # Returns the provider prefix for +model_string+, e.g. <tt>"anthropic"</tt>
53
- # for <tt>"anthropic/claude-sonnet-4-6"</tt>. Returns +nil+ if the model
54
- # string contains no slash.
55
- #
56
18
  # @rbs model_string: String
57
19
  # @rbs return: String?
58
20
  def provider_for: (String model_string) -> String?
59
21
 
60
- # Returns the pricing for +model+, or +nil+ if not configured.
61
- #
62
22
  # @rbs model: String
63
23
  # @rbs path: String
64
24
  # @rbs return: Pricing?
65
25
  def pricing_for: (String model, ?path: String) -> Pricing?
66
26
 
27
+ # @rbs identifier: String
28
+ # @rbs path: String
29
+ # @rbs return: Hash[String, String]
30
+ def provider_fields: (String identifier, ?path: String) -> Hash[String, String]
31
+
32
+ # @rbs identifier: String
33
+ # @rbs fields: Hash[String, String]
34
+ # @rbs path: String
35
+ # @rbs return: void
36
+ def store_provider: (String identifier, Hash[String, String] fields, ?path: String) -> void
37
+
38
+ # @rbs identifier: String
39
+ # @rbs path: String
40
+ # @rbs return: void
41
+ def remove_provider: (String identifier, ?path: String) -> void
42
+
67
43
  private
68
44
 
45
+ # @rbs path: String
46
+ # @rbs &: (Hash[String, Hash[String, String]]) -> Hash[String, Hash[String, String]]
47
+ # @rbs return: void
48
+ def update_providers: (String path) { (Hash[String, Hash[String, String]]) -> Hash[String, Hash[String, String]] } -> void
49
+
69
50
  # @rbs provider: String?
70
51
  # @rbs return: Hash[Symbol, untyped]
71
52
  def base_options: (String? provider) -> Hash[Symbol, untyped]
72
53
 
73
54
  # @rbs path: String
74
- # @rbs ?provider: String?
55
+ # @rbs provider: String?
75
56
  # @rbs return: String?
76
- def reasoning_for: (?path: String, ?provider: untyped) -> String?
57
+ def reasoning_for: (?path: String, ?provider: String?) -> String?
77
58
 
78
- # Maps a reasoning level to the provider-specific model option hash expected
79
- # by Riffer. Returns an empty hash when +level+ is +nil+.
80
- #
81
59
  # @rbs level: String?
82
60
  # @rbs provider: String?
83
61
  # @rbs return: Hash[Symbol, untyped]
84
62
  def reasoning_options: (String? level, String? provider) -> Hash[Symbol, untyped]
85
63
 
86
- # The parsed settings file, or an empty hash when the file is absent or
87
- # malformed.
88
- #
64
+ # @rbs path: String
65
+ # @rbs return: Document
66
+ def read: (String path) -> Document
67
+
89
68
  # @rbs path: String
90
69
  # @rbs return: Hash[String, untyped]
91
- def read: (String path) -> Hash[String, untyped]
70
+ def read_source: (String path) -> Hash[String, untyped]
92
71
  end
@@ -1,16 +1,5 @@
1
1
  # Generated from lib/riffer/rig/token_tally.rb with RBS::Inline
2
2
 
3
- # Accumulates token usage across multiple turns in a session and computes an
4
- # estimated cost based on a pricing object sourced from
5
- # +Riffer::Rig::Settings+.
6
- #
7
- # Instantiate once per REPL session, call +add+ after each turn, then read
8
- # +total_tokens+ and +estimated_cost+ for display.
9
- #
10
- # pricing = Riffer::Rig::Settings.pricing_for('anthropic/claude-sonnet-4-6')
11
- # tally = Riffer::Rig::TokenTally.new(pricing: pricing)
12
- # tally.add(usage)
13
- # tally.estimated_cost # => 0.000042 (USD), or nil if pricing is nil
14
3
  class Riffer::Rig::TokenTally
15
4
  @input_tokens: Integer
16
5
 
@@ -34,28 +23,20 @@ class Riffer::Rig::TokenTally
34
23
  # @dynamic input_tokens, output_tokens, cache_write_tokens, cache_read_tokens
35
24
  attr_reader cache_read_tokens: untyped
36
25
 
37
- # @rbs ?pricing: Riffer::Rig::Settings::Pricing?
26
+ # @rbs pricing: Riffer::Rig::Settings::Pricing?
38
27
  # @rbs return: void
39
- def initialize: (?pricing: untyped) -> void
28
+ def initialize: (?pricing: Riffer::Rig::Settings::Pricing?) -> void
40
29
 
41
- # Accumulates token counts from a +Riffer::Providers::TokenUsage+ object.
42
- #
43
30
  # @rbs usage: Riffer::Providers::TokenUsage
44
31
  # @rbs return: void
45
32
  def add: (Riffer::Providers::TokenUsage usage) -> void
46
33
 
47
- # Returns the total token count across all categories.
48
- #
49
34
  # @rbs return: Integer
50
35
  def total_tokens: () -> Integer
51
36
 
52
- # Returns +true+ if any tokens have been counted.
53
- #
54
37
  # @rbs return: bool
55
38
  def any?: () -> bool
56
39
 
57
- # Returns the estimated cost in USD, or +nil+ if no pricing was provided.
58
- #
59
40
  # @rbs return: Float?
60
41
  def estimated_cost: () -> Float?
61
42
  end
@@ -5,18 +5,30 @@ class Riffer::Rig::Tools::Bash < Riffer::Tool
5
5
 
6
6
  MAX_OUTPUT_BYTES: Integer
7
7
 
8
+ POLL_SECONDS: Float
9
+
8
10
  # @rbs context: Riffer::Agent::Context?
9
11
  # @rbs command: String
10
- # @rbs ?timeout_ms: Integer
12
+ # @rbs timeout_ms: Integer
11
13
  # @rbs return: Riffer::Tools::Response
12
- def call: (context: Riffer::Agent::Context?, command: String, ?timeout_ms: untyped) -> Riffer::Tools::Response
14
+ def call: (context: Riffer::Agent::Context?, command: String, ?timeout_ms: Integer) -> Riffer::Tools::Response
13
15
 
14
16
  private
15
17
 
16
18
  # @rbs command: String
17
19
  # @rbs timeout_seconds: Float
20
+ # @rbs cancel_flag: Riffer::Rig::Runtime::CancelFlag?
18
21
  # @rbs return: [String, Integer]
19
- def run: (String command, Float timeout_seconds) -> [ String, Integer ]
22
+ def run: (String command, Float timeout_seconds, Riffer::Rig::Runtime::CancelFlag? cancel_flag) -> [ String, Integer ]
23
+
24
+ # @rbs wait_thread: Process::Waiter
25
+ # @rbs deadline: Float
26
+ # @rbs cancel_flag: Riffer::Rig::Runtime::CancelFlag?
27
+ # @rbs return: Symbol
28
+ def await: (Process::Waiter wait_thread, Float deadline, Riffer::Rig::Runtime::CancelFlag? cancel_flag) -> Symbol
29
+
30
+ # @rbs return: Float
31
+ def monotonic_now: () -> Float
20
32
 
21
33
  # @rbs pid: Integer
22
34
  # @rbs return: Integer