Class: Kward::Skills::Capture
- Inherits:
-
Object
- Object
- Kward::Skills::Capture
- Defined in:
- lib/kward/skills/capture.rb
Overview
Generates and persists reviewed personal skills from saved session branches.
Defined Under Namespace
Classes: ConflictError, Draft, Error, InvalidDraftError, SourceTooLargeError
Constant Summary collapse
- OUTPUT_TOKEN_RESERVE =
4_096- PROMPT_TOKEN_RESERVE =
1_024- NAME_PATTERN =
/\A[a-z0-9]+(?:-[a-z0-9]+)*\z/
Instance Method Summary collapse
- #generate(session_path, cancellation: nil) ⇒ Object
-
#initialize(session_store:, client:, config_dir: ConfigFiles.config_dir, token_estimator: Compaction::TokenEstimator.new) ⇒ Capture
constructor
A new instance of Capture.
- #save(content, overwrite: false) ⇒ Object
- #skill_path(name) ⇒ Object
Constructor Details
#initialize(session_store:, client:, config_dir: ConfigFiles.config_dir, token_estimator: Compaction::TokenEstimator.new) ⇒ Capture
Returns a new instance of Capture.
25 26 27 28 29 30 |
# File 'lib/kward/skills/capture.rb', line 25 def initialize(session_store:, client:, config_dir: ConfigFiles.config_dir, token_estimator: Compaction::TokenEstimator.new) @session_store = session_store @client = client @config_dir = config_dir @token_estimator = token_estimator end |
Instance Method Details
#generate(session_path, cancellation: nil) ⇒ Object
32 33 34 35 36 37 38 39 40 41 |
# File 'lib/kward/skills/capture.rb', line 32 def generate(session_path, cancellation: nil) ensure_personal_session_path!(session_path) source = @session_store.capture_branch(session_path) raise Error, "Session has no active branch to capture" if source[:entries].empty? source_json = JSON.pretty_generate(source) ensure_source_fits!(source_json) response = @client.chat((source_json), tools: [], cancellation: cancellation) draft(source_path: source[:path], content: MessageAccess.content(response).to_s) end |
#save(content, overwrite: false) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/kward/skills/capture.rb', line 43 def save(content, overwrite: false) reviewed_draft = draft(content: content) path = skill_path(reviewed_draft.name) if File.exist?(path) && !overwrite raise ConflictError, "A personal skill named #{reviewed_draft.name.inspect} already exists" end FileUtils.mkdir_p(File.dirname(path), mode: 0o700) write_atomically(path, reviewed_draft.content) reviewed_draft end |
#skill_path(name) ⇒ Object
55 56 57 |
# File 'lib/kward/skills/capture.rb', line 55 def skill_path(name) File.join(@config_dir, "skills", name.to_s, "SKILL.md") end |