Initial release: aireng

This commit is contained in:
admin
2026-05-18 11:44:59 +08:00
commit f0fd5575e1
5 changed files with 374 additions and 0 deletions

184
scripts/aireng_mode.py Normal file
View File

@@ -0,0 +1,184 @@
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import sys
from pathlib import Path
def _add_lib_path() -> None:
root = Path(__file__).resolve().parents[3]
lib_path = root / "lib"
if str(lib_path) not in sys.path:
sys.path.insert(0, str(lib_path))
_add_lib_path()
from air_runtime.engine import (
build_engine_plan,
dispatch_worker_group,
enter_engine,
intervene_engine,
merge_worker_result,
monitor_engine,
run_engine_once,
status_engine,
)
from air_runtime.paths import todo_path as workflow_todo_path
from air_runtime.project_bootstrap import ensure_project_bootstrap
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="AirEng public scheduler runtime")
parser.add_argument(
"--mode",
choices=["enter", "status", "plan", "dispatch", "merge", "monitor", "run", "intervene"],
default="status",
)
parser.add_argument("--project", default=".")
parser.add_argument("--todo", default="")
parser.add_argument("--result", default="")
parser.add_argument("--dispatch-group", default="")
return parser.parse_args()
def main() -> None:
args = parse_args()
project_root = Path(args.project).expanduser().resolve()
ensure_project_bootstrap(project_root)
if args.mode == "enter":
state_path, health = enter_engine(project_root)
print("aireng_mode=enabled")
print(f"project_root={project_root}")
print(f"state_path={state_path}")
for key, value in health.items():
print(f"{key}={'ok' if value else 'missing'}")
return
if args.mode == "status":
state = status_engine(project_root)
print(f"aireng_mode={'enabled' if state.get('enabled') else 'disabled'}")
print(f"project_root={project_root}")
print(f"engine_mode={state.get('engineMode', '')}")
print(f"active_wave_id={state.get('activeWaveId', '')}")
print(f"active_dispatch_path={state.get('activeDispatchPath', '')}")
print(f"active_worker_count={len(state.get('activeWorkers', []))}")
print(f"merged_results={len(state.get('mergedResults', []))}")
print(f"pending_global_updates={len(state.get('pendingGlobalUpdates', []))}")
print(f"planning_source={state.get('planningSource', '')}")
print(f"xdb_sessions={len(state.get('xdbSessions', []))}")
print(f"xdb_policy_enabled={state.get('xdbPolicy', {}).get('enabled')}")
print(f"debug_sessions={len(state.get('debugSessions', []))}")
print(f"debug_policy_enabled={state.get('debugPolicy', {}).get('enabled')}")
print(f"repair_attempts={len(state.get('repairAttempts', []))}")
print(f"active_repairs={state.get('activeRepairCount', 0)}")
print(f"repair_policy_enabled={state.get('repairPolicy', {}).get('enabled')}")
print(f"monitor_interval_seconds={state.get('monitoringPolicy', {}).get('checkIntervalSeconds', 0)}")
print(f"last_loop_at={state.get('lastLoopAt', '')}")
print(f"last_intervention_at={state.get('lastInterventionAt', '')}")
print(f"next_action={state.get('nextAction', '')}")
for key, value in state.get("artifactHealth", {}).items():
print(f"{key}={'ok' if value else 'missing'}")
return
if args.mode == "plan":
current_todo_path = Path(args.todo).expanduser().resolve() if args.todo else workflow_todo_path(project_root)
result = build_engine_plan(project_root, current_todo_path)
print("aireng_mode=planned")
print(f"project_root={project_root}")
print(f"todo_path={current_todo_path}")
print(f"plan_path={result['planPath']}")
print(f"plan_markdown_path={result['planMarkdownPath']}")
print(f"review_json_path={result['reviewJsonPath']}")
print(f"review_markdown_path={result['reviewMarkdownPath']}")
print(f"planning_source={result['planningSource']}")
print(f"review_source_path={result['reviewSourcePath']}")
print(f"selected_tasks={','.join(result['selectedTasks'])}")
print(f"parallel_group_count={result['parallelGroupCount']}")
print(f"conflict_count={result['conflictCount']}")
return
if args.mode == "dispatch":
result = dispatch_worker_group(project_root, args.dispatch_group)
print("aireng_mode=dispatched")
print(f"project_root={project_root}")
print(f"dispatch_path={result['dispatchPath']}")
print(f"group_name={result['groupName']}")
print(f"wave_id={result['waveId']}")
print(f"task_ids={','.join(result['taskIds'])}")
print(f"recommended_concurrency={result['recommendedConcurrency']}")
return
if args.mode == "monitor":
result = monitor_engine(project_root)
print("aireng_mode=monitored")
print(f"project_root={project_root}")
print(f"engine_mode={result['engineMode']}")
print(f"active_worker_count={result['activeWorkerCount']}")
print(f"ready_to_merge_count={result['readyToMergeCount']}")
print(f"merged_count={result['mergedCount']}")
print(f"stalled_count={result['stalledCount']}")
print(f"intervention_count={result['interventionCount']}")
print(f"blocked_task_count={result['blockedTaskCount']}")
print(f"repair_queue_path={result['repairQueuePath']}")
print(f"next_action={result['nextAction']}")
return
if args.mode == "intervene":
result = intervene_engine(project_root)
print("aireng_mode=intervened")
print(f"project_root={project_root}")
print(f"engine_mode={result['engineMode']}")
print(f"stalled_count={result['stalledCount']}")
print(f"intervention_count={result['interventionCount']}")
print(f"blocked_task_count={result['blockedTaskCount']}")
print(f"next_action={result['nextAction']}")
return
if args.mode == "run":
current_todo_path = Path(args.todo).expanduser().resolve() if args.todo else workflow_todo_path(project_root)
result = run_engine_once(project_root, current_todo_path)
print("aireng_mode=ran")
print(f"project_root={project_root}")
print(f"action={result['action']}")
print(f"steps={','.join(result['steps'])}")
print(f"plan_path={result['planPath']}")
print(f"engine_mode={result['engineMode']}")
print(f"next_action={result['nextAction']}")
if 'dispatchPath' in result:
print(f"dispatch_path={result['dispatchPath']}")
if 'waveId' in result:
print(f"wave_id={result['waveId']}")
if 'taskIds' in result:
print(f"task_ids={','.join(result['taskIds'])}")
if 'activeWorkerCount' in result:
print(f"active_worker_count={result['activeWorkerCount']}")
return
if not args.result:
raise SystemExit("--result is required for merge mode")
result_path = Path(args.result).expanduser().resolve()
merged = merge_worker_result(project_root, result_path)
print("aireng_mode=merged")
print(f"project_root={project_root}")
print(f"task_id={merged['taskId']}")
print(f"task_status={merged['status']}")
print(f"archived_result_path={merged['archivedResultPath']}")
print(f"pending_global_update_count={merged['pendingGlobalUpdateCount']}")
print(f"doc_queue_path={merged['docQueuePath']}")
print(f"repair_queue_path={merged['repairQueuePath']}")
print(f"todo_path={merged['todoPath']}")
print(f"applied_doc_path_count={merged['appliedDocPathCount']}")
print(f"xdb_session_count={merged['xdbSessionCount']}")
print(f"debug_session_count={merged['debugSessionCount']}")
print(f"repair_attempt_count={merged['repairAttemptCount']}")
print(f"repair_prepared={merged['repairPrepared']}")
print(f"repair_dispatch_path={merged['repairDispatchPath']}")
print(f"next_action={merged['nextAction']}")
if __name__ == "__main__":
main()