fno-agents 0.3.1

PTY supervisor substrate for persistent, attachable multi-CLI coding agents (codex, gemini, claude)
Documentation
# kimi readiness manifest (x-83e7) - full-roster parity port from
# the reference manifest for kimi per ADAPTING.md.
#
# UNVALIDATED + INERT: kimi has no fno provider host (no build_pane_argv arm /
# provider impl), so scrape_targets never selects it and this manifest is
# bundled-but-dormant (like opencode). Markers are reference-derived, NOT pinned
# against a live kimi TUI. Our engine is case-sensitive and the reference engine is not, so
# these lowercase needles under-fire until smoke-pinned - the conservative
# never-false-ready direction (readiness OQ#9). State vocab + arbitration: see
# codex.toml.
#
# Priority (highest wins): 400 current_approval > 390 question > 300 legacy
# (blocked) > 120 background_agent > 100 moon_spinner > 90 braille (working).

min_engine_version = 1

[[rule]]
id = "current_approval_panel"
state = "blocked"
priority = 400
region = "whole_recent"
gate = { all = [
  { contains = "↵ confirm" },
  { any = [
    { contains = "run this command?" },
    { contains = "write this file?" },
    { contains = "apply these edits?" },
    { contains = "stop this task?" },
    { contains = "ready to build with this plan?" },
    { line_regex = '(?i)^\s*▶?\s*approve .*\?$' },
  ] },
  { contains = " choose" },
  { any = [ { contains = "approve" }, { contains = "reject" }, { contains = "revise" } ] },
] }

[[rule]]
id = "question_panel"
state = "blocked"
priority = 390
region = "whole_recent"
gate = { all = [
  { contains = "↑↓ select" },
  { contains = "esc cancel" },
  { line_regex = '^\s*question\s*$' },
  { line_regex = '^\s*\? ' },
  { any = [
    { contains = "↵ choose" },
    { contains = "↵ toggle" },
    { contains = "↵ save" },
  ] },
] }

[[rule]]
id = "legacy_approval_panel"
state = "blocked"
priority = 300
region = "whole_recent"
gate = { all = [
  { contains = "requesting approval" },
  { contains = "reject" },
  { any = [
    { contains = "approve once" },
    { contains = "approve for this session" },
  ] },
  { any = [
    { contains = "1/2/3/4 choose" },
    { contains = "↵ confirm" },
  ] },
] }

[[rule]]
id = "background_agent_status_working"
state = "working"
priority = 120
region = "bottom_non_empty_lines(3)"
gate = { line_regex = '\bkimi[-\w.]*\s+thinking\b.*\[[1-9][0-9]*\s+agents?\s+running\]' }

[[rule]]
id = "moon_spinner_working"
state = "working"
priority = 100
region = "whole_recent"
gate = { line_regex = '^\s*(🌕|🌖|🌗|🌘|🌑|🌒|🌓|🌔)\s*$' }

[[rule]]
id = "braille_spinner_working"
state = "working"
priority = 90
region = "whole_recent"
gate = { line_regex = '^\s*[\x{2800}-\x{28FF}]+\s*(thinking\.\.\.|working\.\.\.|using )' }