riffer 0.47.2 → 0.49.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 (267) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/rules/comments.md +2 -4
  3. data/.claude/rules/rbs-inline.md +2 -12
  4. data/.release-please-manifest.json +1 -1
  5. data/.rubocop.yml +5 -0
  6. data/CHANGELOG.md +42 -0
  7. data/docs/AGENTS.md +39 -7
  8. data/docs/AGENT_LIFECYCLE.md +14 -16
  9. data/docs/CONFIGURATION.md +23 -34
  10. data/docs/EVALS.md +2 -1
  11. data/docs/MCP.md +0 -4
  12. data/docs/MESSAGES.md +85 -17
  13. data/docs/STREAM_EVENTS.md +8 -4
  14. data/docs/TOOL_ADVANCED.md +1 -3
  15. data/docs/TRACING.md +2 -2
  16. data/docs/providers/AMAZON_BEDROCK.md +32 -1
  17. data/docs/providers/CUSTOM_PROVIDERS.md +56 -4
  18. data/docs/providers/GEMINI.md +1 -1
  19. data/docs/providers/MOCK_PROVIDER.md +17 -0
  20. data/docs/providers/OPENROUTER.md +18 -1
  21. data/docs-site/build.rb +0 -6
  22. data/docs-site/check.rb +1 -5
  23. data/lib/riffer/agent/config.rb +27 -44
  24. data/lib/riffer/agent/context.rb +2 -26
  25. data/lib/riffer/agent/outcome.rb +0 -20
  26. data/lib/riffer/agent/response.rb +4 -35
  27. data/lib/riffer/agent/run.rb +32 -48
  28. data/lib/riffer/agent/serializer.rb +10 -39
  29. data/lib/riffer/agent/session/repair.rb +3 -15
  30. data/lib/riffer/agent/session.rb +26 -38
  31. data/lib/riffer/agent/structured_output/result.rb +0 -8
  32. data/lib/riffer/agent/structured_output.rb +0 -7
  33. data/lib/riffer/agent.rb +31 -127
  34. data/lib/riffer/config/amazon_bedrock.rb +30 -0
  35. data/lib/riffer/config/anthropic.rb +21 -0
  36. data/lib/riffer/config/azure_open_ai.rb +30 -0
  37. data/lib/riffer/config/evals.rb +18 -0
  38. data/lib/riffer/config/files.rb +61 -0
  39. data/lib/riffer/config/gemini.rb +21 -0
  40. data/lib/riffer/config/mcp.rb +31 -0
  41. data/lib/riffer/config/open_ai.rb +30 -0
  42. data/lib/riffer/config/open_router.rb +21 -0
  43. data/lib/riffer/config/pricing/rates.rb +36 -0
  44. data/lib/riffer/config/pricing.rb +64 -0
  45. data/lib/riffer/config/skills.rb +38 -0
  46. data/lib/riffer/config/tracing.rb +43 -0
  47. data/lib/riffer/config.rb +3 -362
  48. data/lib/riffer/evals/evaluator.rb +22 -23
  49. data/lib/riffer/evals/evaluator_runner.rb +0 -15
  50. data/lib/riffer/evals/judge.rb +9 -11
  51. data/lib/riffer/evals/result.rb +1 -11
  52. data/lib/riffer/evals/run_result.rb +0 -12
  53. data/lib/riffer/evals/scenario_result.rb +0 -19
  54. data/lib/riffer/files/downloader.rb +2 -3
  55. data/lib/riffer/files/resolver.rb +5 -10
  56. data/lib/riffer/guardrail.rb +2 -22
  57. data/lib/riffer/guardrails/modification.rb +0 -8
  58. data/lib/riffer/guardrails/result.rb +0 -17
  59. data/lib/riffer/guardrails/runner.rb +2 -11
  60. data/lib/riffer/guardrails/tripwire.rb +0 -8
  61. data/lib/riffer/guardrails.rb +0 -2
  62. data/lib/riffer/helpers/boolean.rb +0 -4
  63. data/lib/riffer/helpers/call_or_value.rb +0 -3
  64. data/lib/riffer/helpers/deep_dup.rb +37 -0
  65. data/lib/riffer/helpers/dependencies.rb +0 -4
  66. data/lib/riffer/helpers/identifier.rb +3 -12
  67. data/lib/riffer/helpers/validate.rb +42 -0
  68. data/lib/riffer/mcp/authenticated_tool.rb +4 -12
  69. data/lib/riffer/mcp/client.rb +0 -7
  70. data/lib/riffer/mcp/manifest.rb +3 -7
  71. data/lib/riffer/mcp/registration.rb +0 -10
  72. data/lib/riffer/mcp/registry.rb +0 -9
  73. data/lib/riffer/mcp/search_tool.rb +0 -4
  74. data/lib/riffer/mcp/tool.rb +1 -4
  75. data/lib/riffer/mcp/tool_factory.rb +3 -6
  76. data/lib/riffer/mcp.rb +2 -23
  77. data/lib/riffer/messages/assistant/reasoning_part.rb +73 -0
  78. data/lib/riffer/messages/assistant/tool_call.rb +55 -0
  79. data/lib/riffer/messages/assistant.rb +43 -15
  80. data/lib/riffer/messages/base.rb +5 -33
  81. data/lib/riffer/messages/system.rb +8 -1
  82. data/lib/riffer/messages/tool.rb +15 -13
  83. data/lib/riffer/messages/{file_part.rb → user/file_part.rb} +16 -40
  84. data/lib/riffer/messages/user.rb +11 -4
  85. data/lib/riffer/params/boolean.rb +1 -5
  86. data/lib/riffer/params/param.rb +15 -31
  87. data/lib/riffer/params.rb +15 -39
  88. data/lib/riffer/providers/amazon_bedrock.rb +104 -44
  89. data/lib/riffer/providers/anthropic.rb +11 -26
  90. data/lib/riffer/providers/azure_open_ai.rb +3 -8
  91. data/lib/riffer/providers/base.rb +30 -32
  92. data/lib/riffer/providers/finish_reason.rb +0 -6
  93. data/lib/riffer/providers/gemini/client.rb +4 -17
  94. data/lib/riffer/providers/gemini.rb +6 -12
  95. data/lib/riffer/providers/mock.rb +18 -27
  96. data/lib/riffer/providers/open_ai.rb +12 -21
  97. data/lib/riffer/providers/open_router.rb +109 -33
  98. data/lib/riffer/providers/repository.rb +2 -14
  99. data/lib/riffer/providers/token_usage.rb +19 -12
  100. data/lib/riffer/registrable.rb +11 -45
  101. data/lib/riffer/runner/fibers.rb +1 -6
  102. data/lib/riffer/runner/sequential.rb +0 -1
  103. data/lib/riffer/runner/threaded.rb +0 -3
  104. data/lib/riffer/runner.rb +0 -3
  105. data/lib/riffer/skills/activate_tool.rb +0 -3
  106. data/lib/riffer/skills/adapter.rb +0 -8
  107. data/lib/riffer/skills/backend.rb +2 -7
  108. data/lib/riffer/skills/config.rb +13 -17
  109. data/lib/riffer/skills/context.rb +0 -29
  110. data/lib/riffer/skills/filesystem_backend.rb +0 -7
  111. data/lib/riffer/skills/frontmatter.rb +2 -16
  112. data/lib/riffer/skills/markdown_adapter.rb +3 -6
  113. data/lib/riffer/skills/xml_adapter.rb +0 -3
  114. data/lib/riffer/stream_events/base.rb +0 -3
  115. data/lib/riffer/stream_events/finish_reason_done.rb +1 -6
  116. data/lib/riffer/stream_events/guardrail_modification.rb +0 -10
  117. data/lib/riffer/stream_events/guardrail_tripwire.rb +0 -10
  118. data/lib/riffer/stream_events/interrupt.rb +2 -12
  119. data/lib/riffer/stream_events/reasoning_delta.rb +0 -3
  120. data/lib/riffer/stream_events/reasoning_done.rb +6 -8
  121. data/lib/riffer/stream_events/skill_activation.rb +0 -3
  122. data/lib/riffer/stream_events/text_delta.rb +0 -2
  123. data/lib/riffer/stream_events/text_done.rb +0 -2
  124. data/lib/riffer/stream_events/token_usage_done.rb +0 -2
  125. data/lib/riffer/stream_events/tool_call_delta.rb +1 -5
  126. data/lib/riffer/stream_events/tool_call_done.rb +0 -5
  127. data/lib/riffer/stream_events/web_search_done.rb +0 -3
  128. data/lib/riffer/stream_events/web_search_status.rb +1 -5
  129. data/lib/riffer/testing/minitest.rb +4 -5
  130. data/lib/riffer/testing.rb +5 -38
  131. data/lib/riffer/tool.rb +2 -28
  132. data/lib/riffer/tools/response.rb +3 -32
  133. data/lib/riffer/tools/runtime/fibers.rb +0 -6
  134. data/lib/riffer/tools/runtime/inline.rb +0 -1
  135. data/lib/riffer/tools/runtime/threaded.rb +0 -6
  136. data/lib/riffer/tools/runtime.rb +8 -30
  137. data/lib/riffer/tools/toolable.rb +0 -37
  138. data/lib/riffer/tracing/capture.rb +5 -9
  139. data/lib/riffer/tracing/no_op.rb +0 -7
  140. data/lib/riffer/tracing/otel.rb +7 -16
  141. data/lib/riffer/tracing/stream_recorder.rb +0 -7
  142. data/lib/riffer/tracing.rb +4 -27
  143. data/lib/riffer/version.rb +1 -1
  144. data/lib/riffer.rb +2 -30
  145. data/sig/generated/riffer/agent/config.rbs +24 -46
  146. data/sig/generated/riffer/agent/context.rbs +2 -26
  147. data/sig/generated/riffer/agent/outcome.rbs +0 -20
  148. data/sig/generated/riffer/agent/response.rbs +4 -27
  149. data/sig/generated/riffer/agent/run.rbs +12 -31
  150. data/sig/generated/riffer/agent/serializer.rbs +2 -27
  151. data/sig/generated/riffer/agent/session/repair.rbs +2 -10
  152. data/sig/generated/riffer/agent/session.rbs +10 -36
  153. data/sig/generated/riffer/agent/structured_output/result.rbs +0 -7
  154. data/sig/generated/riffer/agent/structured_output.rbs +0 -7
  155. data/sig/generated/riffer/agent.rbs +25 -125
  156. data/sig/generated/riffer/config/amazon_bedrock.rbs +21 -0
  157. data/sig/generated/riffer/config/anthropic.rbs +15 -0
  158. data/sig/generated/riffer/config/azure_open_ai.rbs +21 -0
  159. data/sig/generated/riffer/config/evals.rbs +13 -0
  160. data/sig/generated/riffer/config/files.rbs +43 -0
  161. data/sig/generated/riffer/config/gemini.rbs +15 -0
  162. data/sig/generated/riffer/config/mcp.rbs +19 -0
  163. data/sig/generated/riffer/config/open_ai.rbs +21 -0
  164. data/sig/generated/riffer/config/open_router.rbs +15 -0
  165. data/sig/generated/riffer/config/pricing/rates.rbs +19 -0
  166. data/sig/generated/riffer/config/pricing.rbs +31 -0
  167. data/sig/generated/riffer/config/skills.rbs +19 -0
  168. data/sig/generated/riffer/config/tracing.rbs +25 -0
  169. data/sig/generated/riffer/config.rbs +2 -307
  170. data/sig/generated/riffer/evals/evaluator.rbs +12 -21
  171. data/sig/generated/riffer/evals/evaluator_runner.rbs +0 -14
  172. data/sig/generated/riffer/evals/judge.rbs +4 -8
  173. data/sig/generated/riffer/evals/result.rbs +1 -11
  174. data/sig/generated/riffer/evals/run_result.rbs +0 -12
  175. data/sig/generated/riffer/evals/scenario_result.rbs +0 -14
  176. data/sig/generated/riffer/files/resolver.rbs +6 -13
  177. data/sig/generated/riffer/guardrail.rbs +2 -22
  178. data/sig/generated/riffer/guardrails/modification.rbs +0 -6
  179. data/sig/generated/riffer/guardrails/result.rbs +0 -15
  180. data/sig/generated/riffer/guardrails/runner.rbs +0 -11
  181. data/sig/generated/riffer/guardrails/tripwire.rbs +0 -8
  182. data/sig/generated/riffer/guardrails.rbs +0 -2
  183. data/sig/generated/riffer/helpers/boolean.rbs +0 -4
  184. data/sig/generated/riffer/helpers/call_or_value.rbs +0 -3
  185. data/sig/generated/riffer/helpers/deep_dup.rbs +13 -0
  186. data/sig/generated/riffer/helpers/dependencies.rbs +0 -4
  187. data/sig/generated/riffer/helpers/identifier.rbs +0 -12
  188. data/sig/generated/riffer/helpers/validate.rbs +21 -0
  189. data/sig/generated/riffer/mcp/authenticated_tool.rbs +0 -5
  190. data/sig/generated/riffer/mcp/client.rbs +0 -7
  191. data/sig/generated/riffer/mcp/manifest.rbs +3 -7
  192. data/sig/generated/riffer/mcp/registration.rbs +0 -10
  193. data/sig/generated/riffer/mcp/registry.rbs +0 -9
  194. data/sig/generated/riffer/mcp/search_tool.rbs +0 -4
  195. data/sig/generated/riffer/mcp/tool.rbs +0 -4
  196. data/sig/generated/riffer/mcp/tool_factory.rbs +0 -6
  197. data/sig/generated/riffer/mcp.rbs +2 -22
  198. data/sig/generated/riffer/messages/assistant/reasoning_part.rbs +45 -0
  199. data/sig/generated/riffer/messages/assistant/tool_call.rbs +34 -0
  200. data/sig/generated/riffer/messages/assistant.rbs +25 -31
  201. data/sig/generated/riffer/messages/base.rbs +0 -12
  202. data/sig/generated/riffer/messages/system.rbs +4 -1
  203. data/sig/generated/riffer/messages/tool.rbs +4 -10
  204. data/sig/generated/riffer/messages/user/file_part.rbs +76 -0
  205. data/sig/generated/riffer/messages/user.rbs +7 -5
  206. data/sig/generated/riffer/params/boolean.rbs +1 -4
  207. data/sig/generated/riffer/params/param.rbs +7 -31
  208. data/sig/generated/riffer/params.rbs +8 -38
  209. data/sig/generated/riffer/providers/amazon_bedrock.rbs +33 -29
  210. data/sig/generated/riffer/providers/anthropic.rbs +2 -12
  211. data/sig/generated/riffer/providers/azure_open_ai.rbs +0 -8
  212. data/sig/generated/riffer/providers/base.rbs +18 -34
  213. data/sig/generated/riffer/providers/finish_reason.rbs +0 -6
  214. data/sig/generated/riffer/providers/gemini/client.rbs +4 -17
  215. data/sig/generated/riffer/providers/gemini.rbs +4 -10
  216. data/sig/generated/riffer/providers/mock.rbs +6 -27
  217. data/sig/generated/riffer/providers/open_ai.rbs +6 -13
  218. data/sig/generated/riffer/providers/open_router.rbs +37 -18
  219. data/sig/generated/riffer/providers/repository.rbs +2 -14
  220. data/sig/generated/riffer/providers/token_usage.rbs +9 -12
  221. data/sig/generated/riffer/registrable.rbs +0 -45
  222. data/sig/generated/riffer/runner/fibers.rbs +0 -6
  223. data/sig/generated/riffer/runner/sequential.rbs +0 -1
  224. data/sig/generated/riffer/runner/threaded.rbs +0 -3
  225. data/sig/generated/riffer/runner.rbs +0 -3
  226. data/sig/generated/riffer/skills/activate_tool.rbs +0 -3
  227. data/sig/generated/riffer/skills/adapter.rbs +0 -8
  228. data/sig/generated/riffer/skills/backend.rbs +2 -7
  229. data/sig/generated/riffer/skills/config.rbs +6 -17
  230. data/sig/generated/riffer/skills/context.rbs +0 -29
  231. data/sig/generated/riffer/skills/filesystem_backend.rbs +0 -7
  232. data/sig/generated/riffer/skills/frontmatter.rbs +2 -16
  233. data/sig/generated/riffer/skills/markdown_adapter.rbs +0 -6
  234. data/sig/generated/riffer/skills/xml_adapter.rbs +0 -3
  235. data/sig/generated/riffer/stream_events/base.rbs +0 -3
  236. data/sig/generated/riffer/stream_events/finish_reason_done.rbs +1 -6
  237. data/sig/generated/riffer/stream_events/guardrail_modification.rbs +0 -10
  238. data/sig/generated/riffer/stream_events/guardrail_tripwire.rbs +0 -10
  239. data/sig/generated/riffer/stream_events/interrupt.rbs +2 -10
  240. data/sig/generated/riffer/stream_events/reasoning_delta.rbs +0 -3
  241. data/sig/generated/riffer/stream_events/reasoning_done.rbs +4 -6
  242. data/sig/generated/riffer/stream_events/skill_activation.rbs +0 -3
  243. data/sig/generated/riffer/stream_events/text_delta.rbs +0 -2
  244. data/sig/generated/riffer/stream_events/text_done.rbs +0 -2
  245. data/sig/generated/riffer/stream_events/token_usage_done.rbs +0 -2
  246. data/sig/generated/riffer/stream_events/tool_call_delta.rbs +1 -5
  247. data/sig/generated/riffer/stream_events/tool_call_done.rbs +0 -5
  248. data/sig/generated/riffer/stream_events/web_search_done.rbs +0 -3
  249. data/sig/generated/riffer/stream_events/web_search_status.rbs +1 -5
  250. data/sig/generated/riffer/testing.rbs +0 -38
  251. data/sig/generated/riffer/tool.rbs +0 -27
  252. data/sig/generated/riffer/tools/response.rbs +3 -29
  253. data/sig/generated/riffer/tools/runtime/fibers.rbs +0 -5
  254. data/sig/generated/riffer/tools/runtime/inline.rbs +0 -1
  255. data/sig/generated/riffer/tools/runtime/threaded.rbs +0 -5
  256. data/sig/generated/riffer/tools/runtime.rbs +4 -26
  257. data/sig/generated/riffer/tools/toolable.rbs +0 -37
  258. data/sig/generated/riffer/tracing/capture.rbs +6 -9
  259. data/sig/generated/riffer/tracing/no_op.rbs +0 -7
  260. data/sig/generated/riffer/tracing/otel.rbs +7 -16
  261. data/sig/generated/riffer/tracing/stream_recorder.rbs +0 -2
  262. data/sig/generated/riffer/tracing.rbs +4 -23
  263. data/sig/generated/riffer.rbs +2 -29
  264. data/sig/manual/riffer/helpers/deep_dup.rbs +5 -0
  265. data/sig/manual/riffer/helpers/validate.rbs +5 -0
  266. metadata +39 -3
  267. data/sig/generated/riffer/messages/file_part.rbs +0 -101
@@ -1,8 +1,5 @@
1
1
  # Generated from lib/riffer/runner/threaded.rb with RBS::Inline
2
2
 
3
- # Processes items concurrently using a thread pool of up to +max_concurrency+
4
- # workers pulling from a shared queue, so a slow item doesn't block others. If
5
- # multiple workers raise, only the first exception is re-raised after all finish.
6
3
  class Riffer::Runner::Threaded < Riffer::Runner
7
4
  @max_concurrency: Integer
8
5
 
@@ -1,9 +1,6 @@
1
1
  # Generated from lib/riffer/runner.rb with RBS::Inline
2
2
 
3
- # Generic concurrency primitive for batch execution. Subclasses implement
4
- # +map+ to control how items are processed.
5
3
  class Riffer::Runner
6
- # Maps over items using the provided block.
7
4
  # --
8
5
  # : (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
9
6
  def map: (Array[untyped], context: Riffer::Agent::Context?) { (untyped) -> untyped } -> Array[untyped]
@@ -1,9 +1,6 @@
1
1
  # Generated from lib/riffer/skills/activate_tool.rb with RBS::Inline
2
2
 
3
- # Tool the LLM calls to activate a skill and receive its instructions;
4
- # registered automatically when an agent has skills configured.
5
3
  class Riffer::Skills::ActivateTool < Riffer::Tool
6
- # Activates a skill by name and returns its wrapped body, or a short pointer when the skill is already active.
7
4
  # --
8
5
  # : (context: Riffer::Agent::Context?, name: String) -> Riffer::Tools::Response
9
6
  def call: (context: Riffer::Agent::Context?, name: String) -> Riffer::Tools::Response
@@ -1,28 +1,20 @@
1
1
  # Generated from lib/riffer/skills/adapter.rb with RBS::Inline
2
2
 
3
- # Interface for skill adapters — provider-specific rendering of the
4
- # available-skills section in the system prompt. Subclass and override
5
- # +render_catalog+; the activation tool is exposed via +#skill_activate_tool+
6
- # for the rendered output.
7
3
  class Riffer::Skills::Adapter
8
- # The activation tool class for this adapter.
9
4
  attr_reader skill_activate_tool: singleton(Riffer::Tool)
10
5
 
11
6
  # --
12
7
  # : (skill_activate_tool: singleton(Riffer::Tool)) -> void
13
8
  def initialize: (skill_activate_tool: singleton(Riffer::Tool)) -> void
14
9
 
15
- # Renders a skill catalog section for the system prompt.
16
10
  # --
17
11
  # : (Array[Riffer::Skills::Frontmatter]) -> String
18
12
  def render_catalog: (Array[Riffer::Skills::Frontmatter]) -> String
19
13
 
20
- # Renders an activated skill body wrapped in identifying tags.
21
14
  # --
22
15
  # : (Riffer::Skills::Frontmatter, String) -> String
23
16
  def render_activation: (Riffer::Skills::Frontmatter, String) -> String
24
17
 
25
- # The behavioral instructions rendered alongside the catalog.
26
18
  # --
27
19
  # : () -> String
28
20
  def catalog_instructions: () -> String
@@ -1,21 +1,16 @@
1
1
  # Generated from lib/riffer/skills/backend.rb with RBS::Inline
2
2
 
3
- # Interface for skill storage backends. Subclass and implement +list_skills+
4
- # and +read_skill+ for custom storage (database, S3, etc.); use
5
- # Riffer::Skills::Frontmatter.parse on raw SKILL.md content.
6
3
  class Riffer::Skills::Backend
7
4
  SKILL_FILENAME: String
8
5
 
9
6
  def initialize: () -> untyped
10
7
 
11
- # Returns frontmatter for all available skills; called once at the start of
12
- # generate/stream.
13
8
  # --
14
9
  # : () -> Array[Riffer::Skills::Frontmatter]
15
10
  def list_skills: () -> Array[Riffer::Skills::Frontmatter]
16
11
 
17
- # Returns the full SKILL.md body (without frontmatter) for a skill. Raises
18
- # Riffer::ArgumentError if the skill is not found.
12
+ # Returns the SKILL.md body without frontmatter. Raises Riffer::ArgumentError
13
+ # if the skill is not found.
19
14
  # --
20
15
  # : (String) -> String
21
16
  def read_skill: (String) -> String
@@ -1,12 +1,5 @@
1
1
  # Generated from lib/riffer/skills/config.rb with RBS::Inline
2
2
 
3
- # Configuration object for the skills block DSL.
4
- #
5
- # skills do
6
- # backend Riffer::Skills::FilesystemBackend.new(".skills")
7
- # adapter Riffer::Skills::XmlAdapter
8
- # activate ["code-review"]
9
- # end
10
3
  class Riffer::Skills::Config
11
4
  @backend: (Riffer::Skills::Backend | Proc)?
12
5
 
@@ -20,29 +13,25 @@ class Riffer::Skills::Config
20
13
  # : () -> void
21
14
  def initialize: () -> void
22
15
 
23
- # Gets or sets the skills backend (a Backend or a +context+-resolved Proc).
24
16
  # --
25
17
  # : (?(Riffer::Skills::Backend | Proc)?) -> (Riffer::Skills::Backend | Proc)?
26
18
  def backend: (?(Riffer::Skills::Backend | Proc)?) -> (Riffer::Skills::Backend | Proc)?
27
19
 
28
- # Gets or sets a custom skill adapter class; defaults to the provider's
29
- # preferred adapter.
30
20
  # --
31
21
  # : (?singleton(Riffer::Skills::Adapter)?) -> singleton(Riffer::Skills::Adapter)?
32
22
  def adapter: (?singleton(Riffer::Skills::Adapter)?) -> singleton(Riffer::Skills::Adapter)?
33
23
 
34
- # Gets or sets skill names to activate at startup (an array or a
35
- # +context+-resolved Proc); activated skills' bodies are included in the
36
- # system prompt without a tool call.
37
24
  # --
38
25
  # : (?(Array[String] | Proc)?) -> (Array[String] | Proc)?
39
26
  def activate: (?(Array[String] | Proc)?) -> (Array[String] | Proc)?
40
27
 
41
- # Gets or sets the per-agent skill activation tool override, or +nil+ when
42
- # unset — the global fallback to <tt>Riffer.config.skills.default_activate_tool</tt>
43
- # is applied by the agent at resolution, not here. Raises Riffer::ArgumentError
44
- # on an invalid value.
45
28
  # --
46
29
  # : (?singleton(Riffer::Tool)?) -> singleton(Riffer::Tool)?
47
30
  def activate_tool: (?singleton(Riffer::Tool)?) -> singleton(Riffer::Tool)?
31
+
32
+ private
33
+
34
+ # --
35
+ # : (Riffer::Skills::Config) -> void
36
+ def initialize_copy: (Riffer::Skills::Config) -> void
48
37
  end
@@ -1,8 +1,5 @@
1
1
  # Generated from lib/riffer/skills/context.rb with RBS::Inline
2
2
 
3
- # Skills context for an agent generation cycle — coordinates discovery,
4
- # activation, and prompt rendering, caching skill bodies to avoid redundant
5
- # backend reads. Exposed to tools via <tt>context.skills</tt>.
6
3
  class Riffer::Skills::Context
7
4
  @preactivated: Array[String]
8
5
 
@@ -12,79 +9,53 @@ class Riffer::Skills::Context
12
9
 
13
10
  @backend: Riffer::Skills::Backend
14
11
 
15
- # Skill catalog indexed by name.
16
12
  attr_reader skills: Hash[String, Riffer::Skills::Frontmatter]
17
13
 
18
- # The skill adapter used for this context.
19
14
  attr_reader adapter: Riffer::Skills::Adapter
20
15
 
21
- # Optional callback invoked when a skill is first activated.
22
16
  attr_accessor on_activate: (^(String) -> void)?
23
17
 
24
18
  # --
25
19
  # : (backend: Riffer::Skills::Backend, skills: Hash[String, Riffer::Skills::Frontmatter], adapter: Riffer::Skills::Adapter) -> void
26
20
  def initialize: (backend: Riffer::Skills::Backend, skills: Hash[String, Riffer::Skills::Frontmatter], adapter: Riffer::Skills::Adapter) -> void
27
21
 
28
- # Returns a skill's body without recording an activation.
29
- #
30
22
  # Raises Riffer::ArgumentError if the skill is not in the catalog.
31
- #
32
23
  # --
33
24
  # : (String) -> String
34
25
  def read: (String) -> String
35
26
 
36
- # Activates a skill by name. Returns the cached body on re-activation.
37
- #
38
27
  # Raises Riffer::ArgumentError if the skill is not in the catalog.
39
- #
40
28
  # --
41
29
  # : (String) -> String
42
30
  def activate: (String) -> String
43
31
 
44
- # Activates a skill and returns its body wrapped for injection as a user
45
- # message.
46
- #
47
32
  # Raises Riffer::ArgumentError if the skill is not in the catalog.
48
- #
49
33
  # --
50
34
  # : (String) -> String
51
35
  def activation_prompt: (String) -> String
52
36
 
53
- # Activates a skill whose body renders in the system prompt rather than the
54
- # conversation.
55
- #
56
37
  # Raises Riffer::ArgumentError if the skill is not in the catalog.
57
- #
58
38
  # --
59
39
  # : (String) -> void
60
40
  def preactivate: (String) -> void
61
41
 
62
- # Clears a skill's activation so the next activation is treated as the first.
63
- #
64
42
  # Raises Riffer::ArgumentError if the skill is not in the catalog.
65
- #
66
43
  # --
67
44
  # : (String) -> void
68
45
  def deactivate: (String) -> void
69
46
 
70
- # Returns whether a skill has been activated.
71
- #
72
47
  # --
73
48
  # : (String) -> bool
74
49
  def activated?: (String) -> bool
75
50
 
76
- # Returns whether a skill exists and may be activated by the model.
77
51
  # --
78
52
  # : (String) -> bool
79
53
  def model_invocable?: (String) -> bool
80
54
 
81
- # Returns whether any skill is available for the model to activate.
82
55
  # --
83
56
  # : () -> bool
84
57
  def activatable?: () -> bool
85
58
 
86
- # Returns the complete skills section for the system prompt — the catalog plus
87
- # any pre-activated skill bodies.
88
59
  # --
89
60
  # : () -> String
90
61
  def system_prompt: () -> String
@@ -1,8 +1,5 @@
1
1
  # Generated from lib/riffer/skills/filesystem_backend.rb with RBS::Inline
2
2
 
3
- # Built-in backend that reads skills from the filesystem. Scans configured
4
- # directories for immediate child directories containing +SKILL.md+; directory
5
- # names must match the skill +name+.
6
3
  class Riffer::Skills::FilesystemBackend < Riffer::Skills::Backend
7
4
  @paths: Array[String]
8
5
 
@@ -12,14 +9,10 @@ class Riffer::Skills::FilesystemBackend < Riffer::Skills::Backend
12
9
  # : (*String) -> void
13
10
  def initialize: (*String) -> void
14
11
 
15
- # Returns frontmatter for all discovered skills; on a name collision across
16
- # paths, first-path-wins.
17
12
  # --
18
13
  # : () -> Array[Riffer::Skills::Frontmatter]
19
14
  def list_skills: () -> Array[Riffer::Skills::Frontmatter]
20
15
 
21
- # Returns the full SKILL.md body (without frontmatter) for a skill. Raises
22
- # Riffer::ArgumentError if the skill is not found.
23
16
  # --
24
17
  # : (String) -> String
25
18
  def read_skill: (String) -> String
@@ -1,9 +1,5 @@
1
1
  # Generated from lib/riffer/skills/frontmatter.rb with RBS::Inline
2
2
 
3
- # Immutable value object holding parsed SKILL.md YAML frontmatter. Required
4
- # fields: +name+ and +description+; the optional +disable-model-invocation+
5
- # flag is recognized, and any other unrecognized top-level keys are merged into
6
- # +metadata+.
7
3
  class Riffer::Skills::Frontmatter
8
4
  NAME_PATTERN: Regexp
9
5
 
@@ -11,29 +7,20 @@ class Riffer::Skills::Frontmatter
11
7
 
12
8
  MAX_DESCRIPTION_LENGTH: Integer
13
9
 
14
- # The skill name (1-64 chars, lowercase alphanumeric and hyphens).
15
10
  attr_reader name: String
16
11
 
17
- # The skill description (1-1024 chars).
18
12
  attr_reader description: String
19
13
 
20
- # Whether the skill opts out of model-driven activation. Hidden from the
21
- # catalog and rejected at model activation; still reachable via programmatic
22
- # activation.
23
14
  attr_reader disable_model_invocation: bool
24
15
 
25
- # Metadata from the spec's +metadata+ field plus any unrecognized top-level
26
- # keys.
27
16
  attr_reader metadata: Hash[Symbol, untyped]
28
17
 
29
- # Parses a raw SKILL.md string into a +[Frontmatter, body]+ pair — public so
30
- # custom backends needn't reimplement parsing. Raises Riffer::ArgumentError
31
- # if the frontmatter is invalid.
18
+ # Public so custom backends needn't reimplement parsing. Raises
19
+ # Riffer::ArgumentError if the frontmatter is invalid.
32
20
  # --
33
21
  # : (String) -> [Riffer::Skills::Frontmatter, String]
34
22
  def self.parse: (String) -> [ Riffer::Skills::Frontmatter, String ]
35
23
 
36
- # Parses only the frontmatter from a raw SKILL.md string, ignoring the body.
37
24
  # Raises Riffer::ArgumentError if the frontmatter is invalid.
38
25
  # --
39
26
  # : (String) -> Riffer::Skills::Frontmatter
@@ -44,7 +31,6 @@ class Riffer::Skills::Frontmatter
44
31
  def self.split_frontmatter: (String) -> [ Hash[Symbol, untyped], String ]
45
32
 
46
33
  # Raises Riffer::ArgumentError if +name+ or +description+ is invalid.
47
- # +disable_model_invocation+ is treated as set only when literally +true+.
48
34
  # --
49
35
  # : (name: String, description: String, ?disable_model_invocation: bool, ?metadata: Hash[Symbol, untyped]) -> void
50
36
  def initialize: (name: String, description: String, ?disable_model_invocation: bool, ?metadata: Hash[Symbol, untyped]) -> void
@@ -1,18 +1,12 @@
1
1
  # Generated from lib/riffer/skills/markdown_adapter.rb with RBS::Inline
2
2
 
3
- # Default skill adapter — renders a skill catalog as Markdown for the system
4
- # prompt.
5
3
  class Riffer::Skills::MarkdownAdapter < Riffer::Skills::Adapter
6
- # Renders a skill catalog as Markdown.
7
4
  # --
8
5
  # : (Array[Riffer::Skills::Frontmatter]) -> String
9
6
  def render_catalog: (Array[Riffer::Skills::Frontmatter]) -> String
10
7
 
11
8
  private
12
9
 
13
- # Collapses whitespace so a multi-line (block scalar) description stays within
14
- # its `-` list item instead of breaking out to column 0, where continuation
15
- # lines would read as top-level prompt text or fabricated catalog entries.
16
10
  # --
17
11
  # : (String) -> String
18
12
  def single_line: (String) -> String
@@ -1,9 +1,6 @@
1
1
  # Generated from lib/riffer/skills/xml_adapter.rb with RBS::Inline
2
2
 
3
- # Renders a skill catalog as XML for the system prompt, optimized for
4
- # Anthropic/Claude.
5
3
  class Riffer::Skills::XmlAdapter < Riffer::Skills::Adapter
6
- # Renders a skill catalog as XML.
7
4
  # --
8
5
  # : (Array[Riffer::Skills::Frontmatter]) -> String
9
6
  def render_catalog: (Array[Riffer::Skills::Frontmatter]) -> String
@@ -1,15 +1,12 @@
1
1
  # Generated from lib/riffer/stream_events/base.rb with RBS::Inline
2
2
 
3
- # Base class for all streaming events. Subclasses must implement +to_h+.
4
3
  class Riffer::StreamEvents::Base
5
- # The message role (typically :assistant).
6
4
  attr_reader role: Symbol
7
5
 
8
6
  # --
9
7
  # : (?role: Symbol) -> void
10
8
  def initialize: (?role: Symbol) -> void
11
9
 
12
- # Converts the event to a hash.
13
10
  # --
14
11
  # : () -> Hash[Symbol, untyped]
15
12
  def to_h: () -> Hash[Symbol, untyped]
@@ -1,16 +1,11 @@
1
1
  # Generated from lib/riffer/stream_events/finish_reason_done.rb with RBS::Inline
2
2
 
3
- # Normalized reason the LLM finished, emitted once near the end of the
4
- # stream; no ordering guarantee relative to TokenUsageDone.
3
+ # No ordering guarantee relative to TokenUsageDone.
5
4
  class Riffer::StreamEvents::FinishReasonDone < Riffer::StreamEvents::Base
6
- # The normalized finish reason (see <tt>Riffer::Providers::FinishReason::VALUES</tt>).
7
5
  attr_reader finish_reason: Symbol
8
6
 
9
- # The provider's raw finish-reason value, when one exists on the wire.
10
7
  attr_reader raw_finish_reason: String?
11
8
 
12
- # Raises Riffer::ArgumentError when +finish_reason+ is outside the
13
- # normalized vocabulary.
14
9
  # --
15
10
  # : (finish_reason: Symbol, ?raw_finish_reason: String?, ?role: Symbol) -> void
16
11
  def initialize: (finish_reason: Symbol, ?raw_finish_reason: String?, ?role: Symbol) -> void
@@ -1,34 +1,24 @@
1
1
  # Generated from lib/riffer/stream_events/guardrail_modification.rb with RBS::Inline
2
2
 
3
- # Emitted when a guardrail transforms data during streaming.
4
3
  class Riffer::StreamEvents::GuardrailModification < Riffer::StreamEvents::Base
5
- # The modification record.
6
4
  attr_reader modification: Riffer::Guardrails::Modification
7
5
 
8
6
  # --
9
7
  # : (Riffer::Guardrails::Modification, ?role: Symbol) -> void
10
8
  def initialize: (Riffer::Guardrails::Modification, ?role: Symbol) -> void
11
9
 
12
- # The guardrail class that made the transformation.
13
- #
14
10
  # --
15
11
  # : () -> singleton(Riffer::Guardrail)
16
12
  def guardrail: () -> singleton(Riffer::Guardrail)
17
13
 
18
- # The phase when the transformation occurred.
19
- #
20
14
  # --
21
15
  # : () -> Symbol
22
16
  def phase: () -> Symbol
23
17
 
24
- # The indices of messages that were changed.
25
- #
26
18
  # --
27
19
  # : () -> Array[Integer]
28
20
  def message_indices: () -> Array[Integer]
29
21
 
30
- # Converts the event to a hash.
31
- #
32
22
  # --
33
23
  # : () -> Hash[Symbol, untyped]
34
24
  def to_h: () -> Hash[Symbol, untyped]
@@ -1,34 +1,24 @@
1
1
  # Generated from lib/riffer/stream_events/guardrail_tripwire.rb with RBS::Inline
2
2
 
3
- # Emitted when a guardrail blocks execution during streaming.
4
3
  class Riffer::StreamEvents::GuardrailTripwire < Riffer::StreamEvents::Base
5
- # The tripwire containing block details.
6
4
  attr_reader tripwire: Riffer::Guardrails::Tripwire
7
5
 
8
6
  # --
9
7
  # : (Riffer::Guardrails::Tripwire, ?role: Symbol) -> void
10
8
  def initialize: (Riffer::Guardrails::Tripwire, ?role: Symbol) -> void
11
9
 
12
- # The reason for blocking.
13
- #
14
10
  # --
15
11
  # : () -> String
16
12
  def reason: () -> String
17
13
 
18
- # The phase when blocking occurred (:before or :after).
19
- #
20
14
  # --
21
15
  # : () -> Symbol
22
16
  def phase: () -> Symbol
23
17
 
24
- # The guardrail class that triggered the block.
25
- #
26
18
  # --
27
19
  # : () -> singleton(Riffer::Guardrail)
28
20
  def guardrail: () -> singleton(Riffer::Guardrail)
29
21
 
30
- # Converts the event to a hash.
31
- #
32
22
  # --
33
23
  # : () -> Hash[Symbol, untyped]
34
24
  def to_h: () -> Hash[Symbol, untyped]
@@ -1,20 +1,12 @@
1
1
  # Generated from lib/riffer/stream_events/interrupt.rb with RBS::Inline
2
2
 
3
- # Represents an interrupt during streaming, fired when a callback throws
4
- # +:riffer_interrupt+.
5
3
  class Riffer::StreamEvents::Interrupt < Riffer::StreamEvents::Base
6
- # The reason provided with the interrupt, if any.
7
4
  attr_reader reason: (String | Symbol)?
8
5
 
9
- # Call ids of tool_use blocks riffer filled with placeholder results when the
10
- # interrupt fired (only when history healing is on).
11
- attr_reader healed_tool_call_ids: Array[String]
12
-
13
6
  # --
14
- # : (?reason: (String | Symbol)?, ?healed_tool_call_ids: Array[String]) -> void
15
- def initialize: (?reason: (String | Symbol)?, ?healed_tool_call_ids: Array[String]) -> void
7
+ # : (?reason: (String | Symbol)?) -> void
8
+ def initialize: (?reason: (String | Symbol)?) -> void
16
9
 
17
- # Converts the event to a hash.
18
10
  # --
19
11
  # : () -> Hash[Symbol, untyped]
20
12
  def to_h: () -> Hash[Symbol, untyped]
@@ -1,9 +1,6 @@
1
1
  # Generated from lib/riffer/stream_events/reasoning_delta.rb with RBS::Inline
2
2
 
3
- # Represents an incremental reasoning chunk during streaming; only emitted by
4
- # providers that support reasoning (e.g. OpenAI with the reasoning option).
5
3
  class Riffer::StreamEvents::ReasoningDelta < Riffer::StreamEvents::Base
6
- # The incremental reasoning content.
7
4
  attr_reader content: String
8
5
 
9
6
  # --
@@ -1,14 +1,12 @@
1
1
  # Generated from lib/riffer/stream_events/reasoning_done.rb with RBS::Inline
2
2
 
3
- # Represents completed reasoning during streaming; only emitted by providers
4
- # that support reasoning (e.g. OpenAI with the reasoning option).
5
3
  class Riffer::StreamEvents::ReasoningDone < Riffer::StreamEvents::Base
6
- # The complete reasoning content.
7
- attr_reader content: String
4
+ # +text+ is the concatenation of the preceding ReasoningDelta events.
5
+ attr_reader part: Riffer::Messages::Assistant::ReasoningPart
8
6
 
9
7
  # --
10
- # : (String, ?role: Symbol) -> void
11
- def initialize: (String, ?role: Symbol) -> void
8
+ # : (Riffer::Messages::Assistant::ReasoningPart, ?role: Symbol) -> void
9
+ def initialize: (Riffer::Messages::Assistant::ReasoningPart, ?role: Symbol) -> void
12
10
 
13
11
  # --
14
12
  # : () -> Hash[Symbol, untyped]
@@ -1,9 +1,6 @@
1
1
  # Generated from lib/riffer/stream_events/skill_activation.rb with RBS::Inline
2
2
 
3
- # Emitted when a skill is activated during streaming, via the +on_activate+
4
- # callback when the LLM calls the activation tool.
5
3
  class Riffer::StreamEvents::SkillActivation < Riffer::StreamEvents::Base
6
- # The activated skill name.
7
4
  attr_reader name: String
8
5
 
9
6
  # --
@@ -1,8 +1,6 @@
1
1
  # Generated from lib/riffer/stream_events/text_delta.rb with RBS::Inline
2
2
 
3
- # Represents an incremental text chunk during streaming.
4
3
  class Riffer::StreamEvents::TextDelta < Riffer::StreamEvents::Base
5
- # The incremental text content.
6
4
  attr_reader content: String
7
5
 
8
6
  # --
@@ -1,8 +1,6 @@
1
1
  # Generated from lib/riffer/stream_events/text_done.rb with RBS::Inline
2
2
 
3
- # Represents completed text generation during streaming.
4
3
  class Riffer::StreamEvents::TextDone < Riffer::StreamEvents::Base
5
- # The complete text content.
6
4
  attr_reader content: String
7
5
 
8
6
  # --
@@ -1,8 +1,6 @@
1
1
  # Generated from lib/riffer/stream_events/token_usage_done.rb with RBS::Inline
2
2
 
3
- # Final token usage for the response, emitted when the LLM finishes.
4
3
  class Riffer::StreamEvents::TokenUsageDone < Riffer::StreamEvents::Base
5
- # The token usage data for this response.
6
4
  attr_reader token_usage: Riffer::Providers::TokenUsage
7
5
 
8
6
  # --
@@ -1,15 +1,11 @@
1
1
  # Generated from lib/riffer/stream_events/tool_call_delta.rb with RBS::Inline
2
2
 
3
- # Represents an incremental tool call chunk (partial argument data) during
4
- # streaming.
5
3
  class Riffer::StreamEvents::ToolCallDelta < Riffer::StreamEvents::Base
6
- # The tool call item identifier.
7
4
  attr_reader item_id: String
8
5
 
9
- # The tool name (may only be present in first delta).
6
+ # Providers may send the name only on the first delta.
10
7
  attr_reader name: String?
11
8
 
12
- # The incremental arguments JSON fragment.
13
9
  attr_reader arguments_delta: String
14
10
 
15
11
  # --
@@ -1,17 +1,12 @@
1
1
  # Generated from lib/riffer/stream_events/tool_call_done.rb with RBS::Inline
2
2
 
3
- # Represents a completed tool call during streaming.
4
3
  class Riffer::StreamEvents::ToolCallDone < Riffer::StreamEvents::Base
5
- # The tool call item identifier.
6
4
  attr_reader item_id: String
7
5
 
8
- # The call identifier for response matching.
9
6
  attr_reader call_id: String
10
7
 
11
- # The tool name.
12
8
  attr_reader name: String
13
9
 
14
- # The complete arguments JSON string.
15
10
  attr_reader arguments: String
16
11
 
17
12
  # --
@@ -1,11 +1,8 @@
1
1
  # Generated from lib/riffer/stream_events/web_search_done.rb with RBS::Inline
2
2
 
3
- # The result of a completed server-side web search during streaming.
4
3
  class Riffer::StreamEvents::WebSearchDone < Riffer::StreamEvents::Base
5
- # The search query used.
6
4
  attr_reader query: String
7
5
 
8
- # The search result sources with title and url.
9
6
  attr_reader sources: Array[Hash[Symbol, String?]]
10
7
 
11
8
  # --
@@ -1,15 +1,11 @@
1
1
  # Generated from lib/riffer/stream_events/web_search_status.rb with RBS::Inline
2
2
 
3
- # A web search status notification, emitted as a server-side web search
4
- # progresses.
5
3
  class Riffer::StreamEvents::WebSearchStatus < Riffer::StreamEvents::Base
6
- # The web search status ("in_progress", "searching", "completed", "open_page").
4
+ # One of "in_progress", "searching", "open_page", or "completed".
7
5
  attr_reader status: String
8
6
 
9
- # The URL being fetched (present for "open_page" status).
10
7
  attr_reader url: String?
11
8
 
12
- # The search query (present when available during status changes).
13
9
  attr_reader query: String?
14
10
 
15
11
  # --