- create_session.sh: add explicit case fallback for delegate_agent (R1) - lib_py.agents: add spawn-spec, resume-spec, exit-key argv CLI subcommands (R2) - resume_session.sh, stop_session.sh: replace python string interpolation with safe argv subcommands (R2) - stop_session.sh: dynamically iterate adapter.identity_cache_fields (R3) - verify_session.py, workspace_uuid.py: remove dead imports (R9/N4) - tests/test_a4_adapter_contract.py: add CLI bridge subcommand, clean-env PYTHONPATH safety, and fallback contract tests (R12/N1) - SKILL.md, docs, logs: synchronize IMPROVEMENTS.md, LOG.md, and resolve_session_id wording (R8/R10/R11) - promote verified peer review reports for cline (e7b9812b) and claude (31730364)
89 lines
3.3 KiB
Python
89 lines
3.3 KiB
Python
# __main__.py — CLI bridge for lib_py.agents facts and resolution (N4)
|
|
|
|
import sys, json, shlex
|
|
from lib_py.agents.registry import get_adapter, own_key, agent_of_row
|
|
|
|
def main():
|
|
if len(sys.argv) < 2:
|
|
print("Usage: python -m lib_py.agents <facts|resolve> [args...]", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
cmd = sys.argv[1]
|
|
if cmd == 'facts':
|
|
agent_name = sys.argv[2] if len(sys.argv) > 2 else ''
|
|
adapter = get_adapter(agent_name)
|
|
if not adapter:
|
|
print(f"ERROR: Unknown agent {agent_name!r}", file=sys.stderr)
|
|
sys.exit(1)
|
|
# Emit shell-eval friendly facts
|
|
q = shlex.quote
|
|
print(f"MAM_AGENT_NAME={q(adapter.name)}")
|
|
print(f"MAM_OWN_KEY={q(adapter.own_key)}")
|
|
print(f"MAM_INPUT_PROMPT={q(adapter.input_prompt or '')}")
|
|
print(f"MAM_INPUT_PLACEHOLDER={q(adapter.input_placeholder or '')}")
|
|
print(f"MAM_INPUT_RULE_PATTERN={q(adapter.input_rule_pattern or '')}")
|
|
print(f"MAM_READY_TOKENS={q(adapter.ready_tokens)}")
|
|
print(f"MAM_EXIT_KEY={q(adapter.exit_key)}")
|
|
print(f"MAM_DELEGATE_AGENT_KEY={q(adapter.delegate_agent_key)}")
|
|
|
|
elif cmd == 'resolve':
|
|
name = sys.argv[2] if len(sys.argv) > 2 else ''
|
|
resolved = agent_of_row({}, session_name=name)
|
|
if resolved:
|
|
print(resolved)
|
|
sys.exit(0)
|
|
sys.exit(1)
|
|
|
|
elif cmd == 'input-region':
|
|
agent_name = sys.argv[2] if len(sys.argv) > 2 else ''
|
|
pane_text = sys.stdin.read()
|
|
from lib_py.agents.input_region import extract_input_region
|
|
try:
|
|
region = extract_input_region(pane_text, agent_name)
|
|
print(region)
|
|
sys.exit(0)
|
|
except Exception as ex:
|
|
print(f"ERROR: {ex}", file=sys.stderr)
|
|
sys.exit(5)
|
|
|
|
elif cmd == 'spawn-spec':
|
|
agent_name = sys.argv[2] if len(sys.argv) > 2 else ''
|
|
binary = sys.argv[3] if len(sys.argv) > 3 else agent_name
|
|
uuid = sys.argv[4] if len(sys.argv) > 4 else ''
|
|
use_wrapper = (sys.argv[5].lower() in ('1', 'true', 'yes')) if len(sys.argv) > 5 else False
|
|
adapter = get_adapter(agent_name)
|
|
if not adapter:
|
|
sys.exit(1)
|
|
print(adapter.spawn_spec(binary, uuid, use_wrapper=use_wrapper))
|
|
sys.exit(0)
|
|
|
|
elif cmd == 'resume-spec':
|
|
agent_name = sys.argv[2] if len(sys.argv) > 2 else ''
|
|
binary = sys.argv[3] if len(sys.argv) > 3 else agent_name
|
|
uuid = sys.argv[4] if len(sys.argv) > 4 else ''
|
|
workspace = sys.argv[5] if len(sys.argv) > 5 else ''
|
|
adapter = get_adapter(agent_name)
|
|
if not adapter:
|
|
sys.exit(1)
|
|
from lib_py.agents.base import DiscoveryContext
|
|
ctx = DiscoveryContext(workspace, agent_name) if workspace else None
|
|
mat = adapter.verify_artifact(uuid, ctx) if (ctx and uuid) else False
|
|
print(adapter.resume_spec(binary, uuid, materialized=mat))
|
|
sys.exit(0)
|
|
|
|
elif cmd == 'exit-key':
|
|
agent_name = sys.argv[2] if len(sys.argv) > 2 else ''
|
|
adapter = get_adapter(agent_name)
|
|
if adapter:
|
|
print(adapter.exit_key)
|
|
sys.exit(0)
|
|
print('/exit')
|
|
sys.exit(0)
|
|
|
|
else:
|
|
print(f"ERROR: Unknown CLI command {cmd!r}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|