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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/lib/riffer/rig/cli.rb +16 -8
- data/lib/riffer/rig/coding_agent.rb +31 -34
- data/lib/riffer/rig/credentials.rb +7 -7
- data/lib/riffer/rig/extension.rb +31 -0
- data/lib/riffer/rig/host.rb +52 -0
- data/lib/riffer/rig/registrar.rb +23 -0
- data/lib/riffer/rig/repl.rb +63 -59
- data/lib/riffer/rig/runtime.rb +162 -0
- data/lib/riffer/rig/settings/document.rb +23 -0
- data/lib/riffer/rig/settings/pricing.rb +11 -0
- data/lib/riffer/rig/settings.rb +9 -17
- data/lib/riffer/rig/token_tally.rb +1 -1
- data/lib/riffer/rig/tools/bash.rb +5 -2
- data/lib/riffer/rig/tools/edit.rb +11 -3
- data/lib/riffer/rig/tools/read.rb +2 -2
- data/lib/riffer/rig/ui/animator.rb +6 -6
- data/lib/riffer/rig/ui/cursor.rb +4 -4
- data/lib/riffer/rig/ui/renderer.rb +115 -36
- data/lib/riffer/rig/ui/smoother.rb +29 -13
- data/lib/riffer/rig/ui/theme.rb +2 -2
- data/lib/riffer/rig/version.rb +1 -1
- data/lib/riffer/rig.rb +31 -0
- data/sig/generated/riffer/rig/cli.rbs +8 -8
- data/sig/generated/riffer/rig/credentials.rbs +4 -3
- data/sig/generated/riffer/rig/extension.rbs +28 -0
- data/sig/generated/riffer/rig/host.rbs +42 -0
- data/sig/generated/riffer/rig/registrar.rbs +17 -0
- data/sig/generated/riffer/rig/repl.rbs +24 -23
- data/sig/generated/riffer/rig/runtime.rbs +101 -0
- data/sig/generated/riffer/rig/settings/document.rbs +20 -0
- data/sig/generated/riffer/rig/settings/pricing.rbs +4 -0
- data/sig/generated/riffer/rig/settings.rbs +5 -5
- data/sig/generated/riffer/rig/token_tally.rbs +2 -2
- data/sig/generated/riffer/rig/tools/bash.rbs +2 -2
- data/sig/generated/riffer/rig/tools/edit.rbs +2 -2
- data/sig/generated/riffer/rig/tools/read.rbs +3 -3
- data/sig/generated/riffer/rig/ui/animator.rbs +8 -8
- data/sig/generated/riffer/rig/ui/cursor.rbs +4 -4
- data/sig/generated/riffer/rig/ui/renderer.rbs +65 -15
- data/sig/generated/riffer/rig/ui/smoother.rbs +10 -5
- data/sig/generated/riffer/rig/ui/theme.rbs +2 -2
- data/sig/generated/riffer/rig.rbs +19 -0
- data/sig/manual/riffer/rig.rbs +11 -0
- metadata +24 -7
|
@@ -3,42 +3,96 @@
|
|
|
3
3
|
class Riffer::Rig::UI::Renderer
|
|
4
4
|
RESULT_PREVIEW_LIMIT: Integer
|
|
5
5
|
|
|
6
|
-
@
|
|
6
|
+
@prose_gap_pending: bool
|
|
7
7
|
|
|
8
|
-
@
|
|
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
|
-
@
|
|
14
|
+
@theme: Riffer::Rig::UI::Theme
|
|
15
|
+
|
|
16
|
+
@io: IO
|
|
13
17
|
|
|
14
|
-
# @rbs io:
|
|
15
|
-
# @rbs
|
|
16
|
-
# @rbs
|
|
17
|
-
# @rbs
|
|
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:
|
|
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:
|
|
91
|
+
@io: IO
|
|
38
92
|
|
|
39
|
-
# @rbs io:
|
|
93
|
+
# @rbs io: IO
|
|
40
94
|
# @rbs return: void
|
|
41
|
-
def initialize: (
|
|
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:
|
|
35
|
+
@io: IO
|
|
34
36
|
|
|
35
|
-
# @rbs io:
|
|
36
|
-
# @rbs
|
|
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:
|
|
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-
|
|
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:
|
|
16
|
+
# @rbs io: IO
|
|
17
17
|
# @rbs return: Riffer::Rig::UI::Theme
|
|
18
|
-
def self.for: (
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
83
|
-
|
|
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
|