Module: Ace::LLM::Providers::CLI::Atoms::InteractiveStartupPolicy

Defined in:
lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb

Class Method Summary collapse

Class Method Details

.codex_overlay_home(working_dir:, subprocess_env: nil) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 28

def codex_overlay_home(working_dir:, subprocess_env: nil)
  return nil unless tmux_context?(subprocess_env)

  root = working_dir.to_s.strip
  return nil if root.empty?

  overlay_home = File.join(root, ".ace-local", "llm", "codex-home", Digest::SHA256.hexdigest(root)[0, 12])
  prepare_codex_overlay_home(overlay_home: overlay_home, working_dir: root)
  overlay_home
end

.codex_trust_override(working_dir:, subprocess_env: nil) ⇒ Object



19
20
21
22
23
24
25
26
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 19

def codex_trust_override(working_dir:, subprocess_env: nil)
  return nil unless tmux_context?(subprocess_env)

  path = working_dir.to_s.strip
  return nil if path.empty?

  %{projects."#{escape_toml_basic_string(path)}".trust_level="trusted"}
end

.escape_toml_basic_string(value) ⇒ Object



55
56
57
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 55

def escape_toml_basic_string(value)
  value.to_s.gsub("\\", "\\\\\\\\").gsub("\"", "\\\\\"")
end

.normalized_env(subprocess_env) ⇒ Object



39
40
41
42
43
44
45
46
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 39

def normalized_env(subprocess_env)
  env = ENV.to_h
  return env unless subprocess_env

  subprocess_env.each_with_object(env) do |(key, value), memo|
    memo[key.to_s] = value
  end
end

.prepare_codex_overlay_home(overlay_home:, working_dir:) ⇒ Object



59
60
61
62
63
64
65
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 59

def prepare_codex_overlay_home(overlay_home:, working_dir:)
  codex_dir = File.join(overlay_home, ".codex")
  FileUtils.mkdir_p(codex_dir)

  sync_codex_overlay_links(codex_dir)
  write_codex_overlay_config(codex_dir: codex_dir, working_dir: working_dir)
end


67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 67

def sync_codex_overlay_links(codex_dir)
  source_dir = File.expand_path("~/.codex")
  return unless Dir.exist?(source_dir)

  %w[auth.json installation_id version.json skills rules memories].each do |entry|
    source = File.join(source_dir, entry)
    next unless File.exist?(source)

    target = File.join(codex_dir, entry)
    next if File.exist?(target) || File.symlink?(target)

    File.symlink(source, target)
  end
end

.tmux_context?(subprocess_env = nil) ⇒ Boolean

Returns:

  • (Boolean)


14
15
16
17
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 14

def tmux_context?(subprocess_env = nil)
  env = normalized_env(subprocess_env)
  !tmux_session_name(env).empty?
end

.tmux_session_name(env) ⇒ Object



48
49
50
51
52
53
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 48

def tmux_session_name(env)
  explicit = env["ACE_TMUX_SESSION"].to_s.strip
  return explicit unless explicit.empty?

  env["TMUX"].to_s.strip
end

.write_codex_overlay_config(codex_dir:, working_dir:) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/ace/llm/providers/cli/atoms/interactive_startup_policy.rb', line 82

def write_codex_overlay_config(codex_dir:, working_dir:)
  source_config = File.expand_path("~/.codex/config.toml")
  base = File.exist?(source_config) ? File.read(source_config) : ""
  trust_block = <<~TOML

    [projects."#{escape_toml_basic_string(working_dir)}"]
    trust_level = "trusted"
  TOML

  target = File.join(codex_dir, "config.toml")
  content = base.include?(trust_block.strip) ? base : "#{base.rstrip}#{trust_block}"
  File.write(target, content)
end