Class: Ace::Hitl::CLI::Commands::Update

Inherits:
Support::Cli::Command
  • Object
show all
Includes:
Support::Cli::Base
Defined in:
lib/ace/hitl/cli/commands/update.rb

Instance Method Summary collapse

Instance Method Details

#call(ref:, **options) ⇒ Object

Raises:

  • (Ace::Support::Cli::Error)


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/ace/hitl/cli/commands/update.rb', line 29

def call(ref:, **options)
  set_args = Array(options[:set])
  add_args = Array(options[:add])
  remove_args = Array(options[:remove])
  move_to = options[:"move-to"]
  answer = options[:answer]
  resume = options[:resume] == true
  scope = validate_scope(options[:scope])

  if set_args.empty? && add_args.empty? && remove_args.empty? && move_to.nil? && answer.nil? && !resume
    raise Ace::Support::Cli::Error.new("No update operations specified")
  end

  set_hash = parse_kv_pairs(set_args)
  add_hash = parse_kv_pairs(add_args)
  remove_hash = parse_kv_pairs(remove_args)

  manager = Ace::Hitl::Organisms::HitlManager.new
  event = begin
    manager.update(
      ref,
      set: set_hash,
      add: add_hash,
      remove: remove_hash,
      move_to: move_to,
      answer: answer,
      scope: scope
    )
  rescue Ace::Hitl::Organisms::HitlManager::AmbiguousReferenceError => e
    candidates = e.matches.map(&:file_path).join(", ")
    raise Ace::Support::Cli::Error.new(
      "HITL event '#{ref}' is ambiguous across scope '#{scope || "all"}'. Candidates: #{candidates}"
    )
  end

  raise Ace::Support::Cli::Error.new("HITL event '#{ref}' not found") unless event

  if move_to
    folder_info = event.special_folder || "root"
    puts "HITL event updated: #{event.id} #{event.title} -> #{folder_info}"
  else
    puts "HITL event updated: #{event.id} #{event.title}"
  end

  return unless resume

  dispatch = manager.dispatch_resume(event.id, scope: scope)
  case dispatch[:status]
  when :waiter_active
    puts "Resume dispatch skipped: active waiter lease detected."
  when :dispatched
    puts "Resume dispatched: mode=#{dispatch[:mode]} details=#{dispatch[:details]}"
    puts "HITL event archived after successful dispatch."
  when :no_answer
    raise Ace::Support::Cli::Error.new("Cannot resume '#{event.id}' without an answer")
  when :failed
    raise Ace::Support::Cli::Error.new(dispatch[:error] || "Resume dispatch failed")
  else
    raise Ace::Support::Cli::Error.new("Resume dispatch failed: unexpected status #{dispatch[:status]}")
  end
end