Skip to content
Kward Search API index

Class: Kward::Skills::Capture

Inherits:
Object
  • Object
show all
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

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

Raises:



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(draft_messages(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