riffer-rig 0.3.0 → 0.5.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/lib/riffer/rig/cli.rb +16 -8
  4. data/lib/riffer/rig/coding_agent.rb +31 -34
  5. data/lib/riffer/rig/credentials.rb +7 -7
  6. data/lib/riffer/rig/extension.rb +31 -0
  7. data/lib/riffer/rig/host.rb +52 -0
  8. data/lib/riffer/rig/registrar.rb +23 -0
  9. data/lib/riffer/rig/repl.rb +63 -59
  10. data/lib/riffer/rig/runtime.rb +162 -0
  11. data/lib/riffer/rig/settings/document.rb +23 -0
  12. data/lib/riffer/rig/settings/pricing.rb +11 -0
  13. data/lib/riffer/rig/settings.rb +9 -17
  14. data/lib/riffer/rig/token_tally.rb +1 -1
  15. data/lib/riffer/rig/tools/bash.rb +5 -2
  16. data/lib/riffer/rig/tools/edit.rb +11 -3
  17. data/lib/riffer/rig/tools/read.rb +2 -2
  18. data/lib/riffer/rig/ui/animator.rb +6 -6
  19. data/lib/riffer/rig/ui/cursor.rb +4 -4
  20. data/lib/riffer/rig/ui/renderer.rb +115 -36
  21. data/lib/riffer/rig/ui/smoother.rb +29 -13
  22. data/lib/riffer/rig/ui/theme.rb +2 -2
  23. data/lib/riffer/rig/version.rb +1 -1
  24. data/lib/riffer/rig.rb +31 -0
  25. data/sig/generated/riffer/rig/cli.rbs +8 -8
  26. data/sig/generated/riffer/rig/credentials.rbs +4 -3
  27. data/sig/generated/riffer/rig/extension.rbs +28 -0
  28. data/sig/generated/riffer/rig/host.rbs +42 -0
  29. data/sig/generated/riffer/rig/registrar.rbs +17 -0
  30. data/sig/generated/riffer/rig/repl.rbs +24 -23
  31. data/sig/generated/riffer/rig/runtime.rbs +101 -0
  32. data/sig/generated/riffer/rig/settings/document.rbs +20 -0
  33. data/sig/generated/riffer/rig/settings/pricing.rbs +4 -0
  34. data/sig/generated/riffer/rig/settings.rbs +5 -5
  35. data/sig/generated/riffer/rig/token_tally.rbs +2 -2
  36. data/sig/generated/riffer/rig/tools/bash.rbs +2 -2
  37. data/sig/generated/riffer/rig/tools/edit.rbs +2 -2
  38. data/sig/generated/riffer/rig/tools/read.rbs +3 -3
  39. data/sig/generated/riffer/rig/ui/animator.rbs +8 -8
  40. data/sig/generated/riffer/rig/ui/cursor.rbs +4 -4
  41. data/sig/generated/riffer/rig/ui/renderer.rbs +65 -15
  42. data/sig/generated/riffer/rig/ui/smoother.rbs +10 -5
  43. data/sig/generated/riffer/rig/ui/theme.rbs +2 -2
  44. data/sig/generated/riffer/rig.rbs +19 -0
  45. data/sig/manual/riffer/rig.rbs +11 -0
  46. metadata +24 -7
@@ -3,42 +3,96 @@
3
3
  class Riffer::Rig::UI::Renderer
4
4
  RESULT_PREVIEW_LIMIT: Integer
5
5
 
6
- @io: untyped
6
+ @prose_gap_pending: bool
7
7
 
8
- @theme: Riffer::Rig::UI::Theme
8
+ @deferred_usage: Riffer::Providers::TokenUsage?
9
+
10
+ @smoother: Riffer::Rig::UI::Smoother | PassThroughSmoother?
9
11
 
10
12
  @tally: Riffer::Rig::TokenTally?
11
13
 
12
- @smoother: Riffer::Rig::UI::Smoother | PassThroughSmoother?
14
+ @theme: Riffer::Rig::UI::Theme
15
+
16
+ @io: IO
13
17
 
14
- # @rbs io: untyped
15
- # @rbs ?theme: Riffer::Rig::UI::Theme
16
- # @rbs ?tally: Riffer::Rig::TokenTally?
17
- # @rbs ?smoother: Riffer::Rig::UI::Smoother | PassThroughSmoother?
18
+ # @rbs io: IO
19
+ # @rbs theme: Riffer::Rig::UI::Theme
20
+ # @rbs tally: Riffer::Rig::TokenTally?
21
+ # @rbs smoother: Riffer::Rig::UI::Smoother | PassThroughSmoother?
18
22
  # @rbs return: void
19
- def initialize: (?io: untyped, ?theme: untyped, ?tally: untyped, ?smoother: untyped) -> void
23
+ def initialize: (?io: IO, ?theme: Riffer::Rig::UI::Theme, ?tally: Riffer::Rig::TokenTally?, ?smoother: Riffer::Rig::UI::Smoother | PassThroughSmoother?) -> void
20
24
 
21
25
  # @rbs event: Riffer::StreamEvents::Base
22
26
  # @rbs return: void
23
27
  def render: (Riffer::StreamEvents::Base event) -> void
24
28
 
29
+ # The prompt holds the line open for typed input, so unlike render_block it
30
+ # ends without a newline. It sits at the renderer so a tool group left open by
31
+ # the previous turn closes here, and the next turn's blocks open cleanly.
32
+ #
33
+ # @rbs return: void
34
+ def prompt: () -> void
35
+
36
+ # Usage arrives per model call but tool results arrive via the session
37
+ # callback after each call's stream ends, so rendering inline would print the
38
+ # stats above the results they belong with. Held until the turn's output is
39
+ # done, then printed as one line below it.
40
+ #
41
+ # @rbs return: void
42
+ def flush_usage: () -> void
43
+
25
44
  # @rbs message: Riffer::Messages::Base
26
45
  # @rbs return: void
27
46
  def render_tool_result: (Riffer::Messages::Base message) -> void
28
47
 
29
48
  private
30
49
 
50
+ # Rule 2 for one-off blocks (skill line, interrupt, stats): one blank line
51
+ # above, no indent. The smoother drains first so any pending partial prose
52
+ # block ends cleanly before the gap is written, and any open tool group closes
53
+ # so the next group opens with its own gap.
54
+ #
55
+ # @rbs indent: Integer
56
+ # @rbs &block: () -> String
57
+ # @rbs return: void
58
+ def render_block: (Integer indent) { () -> String } -> void
59
+
60
+ # The blank line above a prose block is written at the first delta after a
61
+ # non-prose block. Streaming makes "which block is first?" a stateful
62
+ # question, so the answer is tracked rather than embedded at each render site.
63
+ #
64
+ # @rbs content: String
65
+ # @rbs return: void
66
+ def render_prose: (String content) -> void
67
+
68
+ # @rbs indent: Integer
69
+ # @rbs &block: () -> String
70
+ # @rbs return: void
71
+ def render_tool_activity: (Integer indent) { () -> String } -> void
72
+
73
+ # Tool-activity lines (⚙ calls, ↳ results) share one blank line above the
74
+ # group instead of one between each line — the gap goes between groups, not
75
+ # inside a pair. The group stays open so prose after it pays the closing gap.
76
+ #
77
+ # @rbs return: void
78
+ def open_tool_activity: () -> void
79
+
80
+ # @rbs usage: Riffer::Providers::TokenUsage
81
+ # @rbs tally: Riffer::Rig::TokenTally
82
+ # @rbs return: String
83
+ def usage_line: (Riffer::Providers::TokenUsage usage, Riffer::Rig::TokenTally tally) -> String
84
+
31
85
  # @rbs return: Riffer::Rig::UI::Smoother | PassThroughSmoother
32
86
  def smoother: () -> (Riffer::Rig::UI::Smoother | PassThroughSmoother)
33
87
 
34
88
  # Stand-in when no smoother is injected, so a bare Riffer::Rig::UI::Renderer still prints
35
89
  # synchronously.
36
90
  class PassThroughSmoother
37
- @io: untyped
91
+ @io: IO
38
92
 
39
- # @rbs io: untyped
93
+ # @rbs io: IO
40
94
  # @rbs return: void
41
- def initialize: (untyped io) -> void
95
+ def initialize: (IO io) -> void
42
96
 
43
97
  # @rbs content: String
44
98
  # @rbs return: self
@@ -54,10 +108,6 @@ class Riffer::Rig::UI::Renderer
54
108
  # @rbs return: void
55
109
  def drain_smoother: () -> void
56
110
 
57
- # @rbs usage: Riffer::Providers::TokenUsage
58
- # @rbs return: void
59
- def render_token_usage: (Riffer::Providers::TokenUsage usage) -> void
60
-
61
111
  # @rbs arguments: String
62
112
  # @rbs return: String
63
113
  def format_arguments: (String arguments) -> String
@@ -16,6 +16,8 @@ class Riffer::Rig::UI::Smoother
16
16
 
17
17
  MIN_CHARS_PER_TICK: Rational
18
18
 
19
+ @newline_pending: bool
20
+
19
21
  @stop: bool
20
22
 
21
23
  @thread: Thread?
@@ -30,13 +32,13 @@ class Riffer::Rig::UI::Smoother
30
32
 
31
33
  @theme: Riffer::Rig::UI::Theme
32
34
 
33
- @io: untyped
35
+ @io: IO
34
36
 
35
- # @rbs io: untyped
36
- # @rbs ?theme: Riffer::Rig::UI::Theme
37
+ # @rbs io: IO
38
+ # @rbs theme: Riffer::Rig::UI::Theme
37
39
  # @rbs clock: singleton(Kernel)
38
40
  # @rbs return: void
39
- def initialize: (?io: untyped, ?theme: untyped, ?clock: singleton(Kernel)) -> void
41
+ def initialize: (?io: IO, ?theme: Riffer::Rig::UI::Theme, ?clock: singleton(Kernel)) -> void
40
42
 
41
43
  # @rbs return: void
42
44
  def start: () -> void
@@ -50,7 +52,10 @@ class Riffer::Rig::UI::Smoother
50
52
  # @rbs return: void
51
53
  def tick: () -> void
52
54
 
53
- # Called before non-delta output so printed order matches stream order.
55
+ # Called before non-prose output so printed order matches stream order. The
56
+ # backlog is flushed, then any partial prose block the model left without a
57
+ # trailing newline gets one, so block spacing never depends on the model's
58
+ # last character.
54
59
  #
55
60
  # @rbs return: void
56
61
  def drain: () -> void
@@ -13,9 +13,9 @@ class Riffer::Rig::UI::Theme
13
13
  # @rbs return: void
14
14
  def initialize: (enabled: bool) -> void
15
15
 
16
- # @rbs io: untyped
16
+ # @rbs io: IO
17
17
  # @rbs return: Riffer::Rig::UI::Theme
18
- def self.for: (untyped io) -> Riffer::Rig::UI::Theme
18
+ def self.for: (IO io) -> Riffer::Rig::UI::Theme
19
19
 
20
20
  # @rbs text: String
21
21
  # @rbs rgb: Array[Integer]
@@ -1,2 +1,21 @@
1
1
  # Generated from lib/riffer/rig.rb with RBS::Inline
2
2
 
3
+ module Riffer::Rig
4
+ self.@extensions: Hash[String, Riffer::Rig::Extension]
5
+
6
+ # Records an extension block in the process registry and returns the
7
+ # extension object. Re-recording a name replaces the block.
8
+ #
9
+ # Riffer::Rig.extension('git') do |rig|
10
+ # rig.tool GitLog
11
+ # end
12
+ #
13
+ # @rbs name: String
14
+ # @rbs requires: String?
15
+ # @rbs &block: (::Riffer::Rig::Registrar) -> void
16
+ # @rbs return: Riffer::Rig::Extension
17
+ def self.extension: (String name, ?requires: String?) { (::Riffer::Rig::Registrar) -> void } -> Riffer::Rig::Extension
18
+
19
+ # @rbs return: Hash[String, Riffer::Rig::Extension]
20
+ def self.extensions: () -> Hash[String, Riffer::Rig::Extension]
21
+ end
@@ -0,0 +1,11 @@
1
+ # rbs-inline emits the `def self.extension` / `def self.extensions`
2
+ # declarations in `sig/generated/riffer/rig.rbs`, but Steep binds them to the
3
+ # file that first declares the module in RBS (`lib/riffer/rig/version.rb`'s
4
+ # empty reopen), so it reports MethodDefinitionMissing at that reopen. Making
5
+ # the generated declarations visible there without duplicating them needs a
6
+ # `...` alias per method.
7
+
8
+ module Riffer::Rig
9
+ def self.extension: ...
10
+ def self.extensions: ...
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riffer-rig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Bottrall
@@ -55,16 +55,22 @@ dependencies:
55
55
  name: riffer
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - "~>"
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0.45'
61
+ - - "<"
59
62
  - !ruby/object:Gem::Version
60
- version: 0.45.0
63
+ version: '0.48'
61
64
  type: :runtime
62
65
  prerelease: false
63
66
  version_requirements: !ruby/object:Gem::Requirement
64
67
  requirements:
65
- - - "~>"
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0.45'
71
+ - - "<"
66
72
  - !ruby/object:Gem::Version
67
- version: 0.45.0
73
+ version: '0.48'
68
74
  - !ruby/object:Gem::Dependency
69
75
  name: zeitwerk
70
76
  requirement: !ruby/object:Gem::Requirement
@@ -79,8 +85,8 @@ dependencies:
79
85
  - - "~>"
80
86
  - !ruby/object:Gem::Version
81
87
  version: '2.8'
82
- description: An interactive terminal coding agent (read/write/edit/bash) built on
83
- the riffer agentic framework.
88
+ description: An interactive terminal agent (read/write/edit/bash) built on the riffer
89
+ agentic framework.
84
90
  email:
85
91
  - jakebottrall@gmail.com
86
92
  executables:
@@ -95,8 +101,13 @@ files:
95
101
  - lib/riffer/rig/cli.rb
96
102
  - lib/riffer/rig/coding_agent.rb
97
103
  - lib/riffer/rig/credentials.rb
104
+ - lib/riffer/rig/extension.rb
105
+ - lib/riffer/rig/host.rb
106
+ - lib/riffer/rig/registrar.rb
98
107
  - lib/riffer/rig/repl.rb
108
+ - lib/riffer/rig/runtime.rb
99
109
  - lib/riffer/rig/settings.rb
110
+ - lib/riffer/rig/settings/document.rb
100
111
  - lib/riffer/rig/settings/pricing.rb
101
112
  - lib/riffer/rig/token_tally.rb
102
113
  - lib/riffer/rig/tools/bash.rb
@@ -115,8 +126,13 @@ files:
115
126
  - sig/generated/riffer/rig/cli.rbs
116
127
  - sig/generated/riffer/rig/coding_agent.rbs
117
128
  - sig/generated/riffer/rig/credentials.rbs
129
+ - sig/generated/riffer/rig/extension.rbs
130
+ - sig/generated/riffer/rig/host.rbs
131
+ - sig/generated/riffer/rig/registrar.rbs
118
132
  - sig/generated/riffer/rig/repl.rbs
133
+ - sig/generated/riffer/rig/runtime.rbs
119
134
  - sig/generated/riffer/rig/settings.rbs
135
+ - sig/generated/riffer/rig/settings/document.rbs
120
136
  - sig/generated/riffer/rig/settings/pricing.rbs
121
137
  - sig/generated/riffer/rig/token_tally.rbs
122
138
  - sig/generated/riffer/rig/tools/bash.rbs
@@ -131,6 +147,7 @@ files:
131
147
  - sig/generated/riffer/rig/ui/smoother.rbs
132
148
  - sig/generated/riffer/rig/ui/theme.rbs
133
149
  - sig/generated/riffer/rig/version.rbs
150
+ - sig/manual/riffer/rig.rbs
134
151
  - sig/manual/riffer/rig/cli.rbs
135
152
  - sig/manual/riffer/rig/credentials.rbs
136
153
  - sig/manual/riffer/rig/settings.rbs