diff options
author | icebaker <113217272+icebaker@users.noreply.github.com> | 2023-11-29 07:53:19 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-29 07:53:19 -0300 |
commit | 9f79a161905f5af8e331930cc77c7be10703596f (patch) | |
tree | b2ab75665e42de79f22cca82bf03cfc49759f485 /controllers/interfaces/tools.rb | |
parent | e1ab6853262b83f483060961f17bf895989a19c0 (diff) | |
parent | 154aa68caf50a18af5c0dff1d368fc639314e0ba (diff) |
Merge pull request #5 from icebaker/ib-tools
Adding support for Spec 1.0.0: Tools (Functions)
Diffstat (limited to 'controllers/interfaces/tools.rb')
-rw-r--r-- | controllers/interfaces/tools.rb | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/controllers/interfaces/tools.rb b/controllers/interfaces/tools.rb new file mode 100644 index 0000000..f079a2b --- /dev/null +++ b/controllers/interfaces/tools.rb @@ -0,0 +1,104 @@ +# frozen_string_literal: true + +require 'rainbow' + +require_relative '../../logic/cartridge/tools' +require_relative '../../logic/cartridge/safety' +require_relative '../../components/embedding' + +module NanoBot + module Controllers + module Interfaces + module Tool + def self.confirming(session, cartridge, mode, feedback) + yeses = Logic::Cartridge::Safety.yeses(cartridge) + default_answer = Logic::Cartridge::Safety.default_answer(cartridge) + dispatch_feedback(session, cartridge, mode, feedback) + session.flush + answer = $stdin.gets.chomp.to_s.downcase.strip + answer = default_answer if answer == '' + session.print("\n") + yeses.include?(answer) + end + + def self.adapt(feedback, adapter, cartridge) + call = { + parameters: %w[id name parameters parameters-as-json output], + values: [ + feedback[:id], feedback[:name], feedback[:parameters], + feedback[:parameters].to_json, + feedback[:output] + ], + safety: { sandboxed: Logic::Cartridge::Safety.sandboxed?(cartridge) } + } + + raise StandardError, 'conflicting adapters' if %i[fennel lua clojure].count { |key| !adapter[key].nil? } > 1 + + if adapter[:fennel] + call[:source] = adapter[:fennel] + Components::Embedding.fennel(**call) + elsif adapter[:clojure] + call[:source] = adapter[:clojure] + Components::Embedding.clojure(**call) + elsif adapter[:lua] + call[:parameters] = %w[id name parameters parameters_as_json output] + call[:source] = adapter[:lua] + Components::Embedding.lua(**call) + else + raise 'missing handler for adapter' + end + end + + def self.dispatch_feedback(session, cartridge, mode, feedback) + enabled = Logic::Cartridge::Tools.feedback?(cartridge, mode.to_sym, feedback[:action].to_sym) + + enabled = true if feedback[:action].to_sym == :confirming + + return unless enabled + + color = Logic::Cartridge::Tools.fetch_from_interface( + cartridge, mode.to_sym, feedback[:action].to_sym, [:color] + ) + + adapter = Tool.adapter(cartridge, mode, feedback) + + if %i[fennel lua clojure].any? { |key| !adapter[key].nil? } + message = adapt(feedback, adapter, cartridge) + else + message = "#{feedback[:name]} #{feedback[:parameters].to_json}" + + message += "\n#{feedback[:output]}" if feedback[:action].to_sym == :responding + end + + message = "#{adapter[:prefix]}#{message}#{adapter[:suffix]}" + + session.print(color.nil? ? message : Rainbow(message).send(color)) + end + + def self.adapter(cartridge, mode, feedback) + prefix = Logic::Cartridge::Tools.fetch_from_interface( + cartridge, mode.to_sym, feedback[:action].to_sym, [:prefix] + ) + + suffix = Logic::Cartridge::Tools.fetch_from_interface( + cartridge, mode.to_sym, feedback[:action].to_sym, [:suffix] + ) + + fennel = Logic::Cartridge::Tools.fetch_from_interface( + cartridge, mode.to_sym, feedback[:action].to_sym, %i[adapter fennel] + ) + + lua = Logic::Cartridge::Tools.fetch_from_interface( + cartridge, mode.to_sym, feedback[:action].to_sym, %i[adapter lua] + ) + + clojure = Logic::Cartridge::Tools.fetch_from_interface( + cartridge, mode.to_sym, feedback[:action].to_sym, %i[adapter clojure] + ) + + { prefix:, suffix:, fennel:, lua:, clojure: } + end + end + end + end +end |