koru 0.1.330__tar.gz → 0.1.332__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {koru-0.1.330/src/koru.egg-info → koru-0.1.332}/PKG-INFO +5 -5
- {koru-0.1.330 → koru-0.1.332}/README.md +4 -4
- {koru-0.1.330 → koru-0.1.332}/pyproject.toml +1 -1
- {koru-0.1.330 → koru-0.1.332}/src/koru/agent_backend_runtime.py +83 -38
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_drive_retry.py +11 -9
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_gate.py +23 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/integrations/imgl_client.py +2 -1
- {koru-0.1.330 → koru-0.1.332}/src/koru/integrations/vdisplay_client.py +186 -11
- {koru-0.1.330 → koru-0.1.332/src/koru.egg-info}/PKG-INFO +5 -5
- {koru-0.1.330 → koru-0.1.332}/LICENSE +0 -0
- {koru-0.1.330 → koru-0.1.332}/MANIFEST.in +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/cli_calibration.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/control.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/ecosystem.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/ide_detection.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/commands.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/diagnostics.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/domain.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/pipeline.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/projector.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/query.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/service.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair/store.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/repair_registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/daemon_ctl.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/editor_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/http_handlers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/http_server.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/http_util.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/models.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/paths.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/probe.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/service.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/socket_path.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/packages/coru/src/coru/supervisor/systemd_unit.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/schemas/koru-stdio-event.schema.json +0 -0
- {koru-0.1.330 → koru-0.1.332}/setup.cfg +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/env2llm/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/env2llm/integrators/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/env2llm/integrators/_service_factory.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/env2llm/probes/testql.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/env2llm/service/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/env2llm/service/registry_service.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/imgl/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/imgl/autodiag.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/imgl/freshness.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/__main__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/activity_log.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/agent_backends.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/agent_cli_helpers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/agents.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/api/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.29.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.30.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.32.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.35.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.36.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.38.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.39.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.40.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.41.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.42.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.43.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.44.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.45.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.46.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.55.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.56.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.57.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.2.0.vsix +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autoloop_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_auto_pipeline.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_checkpoint.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cli_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_bridge.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_chat_activity.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_chat_activity_analyzer.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_chat_activity_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_chat_activity_text.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_chat_activity_tickets.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_common.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_drive_outcome.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_orchestrator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_post_drive.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_cycle_skip_conditions.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_daemon.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_diag_markers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_diagnostics.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_drive_retry_policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_env.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_loop_runner.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_onboarding.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_operator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_parser.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_plugin.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_plugin_lifecycle.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_plugin_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_plugin_wait.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_process_guard.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_processes.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_readiness.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_resources.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_startup.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_submit_strategy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_up.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomous_wup.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/code2llm_discovery.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/cycle_finalize.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/cycle_trace.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/decision_arbiter.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/decision_trace.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/env.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/environment.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/heal.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/ide_operator_guidance.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/ide_work.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/operator_pipeline.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/contexts.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/drive_phase.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/queue_phase.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/scan_phase.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/sleep_phase.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/startup_phase.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/utils.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/phases/verify_phase.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/planfile_handoff.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/planning_llm.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/planning_llm_budget.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/planning_llm_parsing.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/planning_llm_prompts.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/planning_llm_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/planning_llm_types.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/policy_decision.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/post_run_verify.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/prompts.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/reflection_policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/replay_actions.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/replay_builders.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/replay_execution.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/replay_handlers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/replay_parser.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/replay_quick_actions.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/replay_types.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/state.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/structured_report.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/telemetry_snapshot.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy/verification_engine.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy_strategy/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy_strategy/config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy_strategy/defaults.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy_strategy/heuristics.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy_strategy/openrouter.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autonomy_strategy/prompts.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/audit.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/calibrate_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/cli_command.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/cli_direct_drive.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/cli_parser.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/cli_snapshot.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/cli_trace.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/commands/drive.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/commands/handoff.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/commands/manage.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/commands/shutdown.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/commands/status.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/daemon.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/daemon_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/doctor_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/drive_repair_policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/host_setup.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/injector.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/install_checks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/install_manager.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/install_plugin_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/lane_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/local_manager.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/log_contract.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/os_injector.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/plugin_installer.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/protocol.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/systemd_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/tail_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/utils/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/autopilot/utils/client_helpers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bootstrap.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/autonomous_checkpoint/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/autonomous_checkpoint/application.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/autonomous_checkpoint/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/autonomous_checkpoint/events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/autonomous_checkpoint/queries/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/autonomous_checkpoint/read_model.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/env_config/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/env_config/application.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/env_config/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/env_config/events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/env_config/queries/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/env_config/read_model.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/local_manager/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/local_manager/application.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/local_manager/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/local_manager/events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/local_manager/queries/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/local_manager/read_model.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/planfile_queue/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/planfile_queue/application.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/planfile_queue/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/planfile_queue/events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/planfile_queue/queries/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/planfile_queue/read_model.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/repairs/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/repairs/application.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/repairs/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/repairs/events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/repairs/queries/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/repairs/read_model.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/tasks/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/tasks/application.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/tasks/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/tasks/events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/tasks/queries/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/tasks/read_model.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/topology/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/topology/application.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/topology/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/topology/events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/topology/queries/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/topology/read_model.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/wup/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/wup/application.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/wup/commands/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/wup/events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/wup/queries/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/bounded_contexts/wup/read_model.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli/__main__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli/commands.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli/parsers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_agent.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_agent_backends.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_auto.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_bootstrap.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_cleaned.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_doctor.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_gate.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_gc.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_ide_router.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_imgl.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_init.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_local_serve.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_loop.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_parser.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_queue.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_refactor_planfile_handoff.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_replay.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_runtime_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_scan.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_self.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_serve.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_shim_builders.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_strategy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_tagi.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_task.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_tools.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_topology.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cli_watch.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/configurator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/context_render.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/control_commands.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cqrs/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cqrs/domain_event.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cqrs/event_bus.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cqrs/event_log_projection.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cqrs/event_log_query.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/cqrs/event_store.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/data/koru-interface-registry.yaml +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/decision_engine.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/deployment_events/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/deployment_events/analyzer.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/deployment_events/batch.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/deployment_events/emitter.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/deployment_events/enums.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/deployment_events/models.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/deps_autorepair.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/dev_sync.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_autonomous_streams.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_autopilot_checks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_autopilot_debug.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_chat_control.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_constants.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_models.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_plugin_bundle.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_plugin_console.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_project_checks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_project_health.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_registry_checks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_render.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_reporting_checks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_runner.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/doctor_runtime_checks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/domain/env/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/dotenv_loader.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/dsl/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/env_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/env_flags.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/environment_profile.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/gate.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/gc.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/gc_cli_helpers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/git_attribution.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/git_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/base.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/bridge.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/gillm_client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/gillm_recovery.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/ide_reload.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/shared.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_adapters/vscode_family.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_control_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_doctor_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_router.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ide_status_systemmap.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/init.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/init_host_environment.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/integration_ledger.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/integrations/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/integrations/imgl_autodiag.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/interface_registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/llm_reflect.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/local_manager_client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/local_manager_state.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/local_service.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/loop.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/mcp_provision.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/mcp_server.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/observability_dsl.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/observability_events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/observability_writer.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/planfile_queue.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/project_pipeline.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/human.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/koru_queue_argv.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/local_manager.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/locking.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/loop.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/planfile_ticket_note.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/runner.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/runners.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/shell_evidence.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/ticket.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue/types.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue_clean.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/queue_cli_helpers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/redup_integration.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/refactor_planfile_handoff.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/remote/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/remote/client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/run_log.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/scan.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/scan_collection.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/scan_dedupe_policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/scan_render.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/scan_ticket_emission.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/scan_types.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/scripts/koru-autoloop.sh +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/self_control.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/semcod_tools.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/serve.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/stdio_events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/tagi_integration.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/task_dedupe.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/task_intake.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/task_io.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/task_models.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/task_ticket.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/tasks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/ticket_evidence.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/tillm_bridge.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/tools.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/topology.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/topology_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/utils/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/utils/subprocess_runner.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/watch.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/cli_main.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/gui/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/gui/app.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/gui/server.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/gui/session.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/gui/static/wizard.css +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/gui/static/wizard.js +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/gui/templates/wizard.html +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/ide_install.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/llx.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/orchestrator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/project.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/prompters.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/strategies.json +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/templates/cli-tool.json +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/templates/library.json +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/templates/ml-research.json +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/templates/registry.json +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/templates/web-app.json +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/templates.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wizard/tree.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru/wup_testql_compat.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru.egg-info/SOURCES.txt +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru.egg-info/dependency_links.txt +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru.egg-info/entry_points.txt +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru.egg-info/requires.txt +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koru.egg-info/top_level.txt +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/calibration_validator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_html.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_http.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_observability.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_plugin_logs.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_projects.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_routes.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_serve.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_serve_utils.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_state.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_template.html +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_tickets.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/dashboard_topology.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/desktop_uri.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/env2llm_registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/integrations.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/invoke.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/invoke_handlers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/local.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_desktop_uri.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_dispatch.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_env2llm.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_nlp2oql.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_planfile.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_schema.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_testql.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/mcp_server_transport.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/nlp2oql_bridge.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/openapi.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/runtime_insights.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/server.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/testql_bridge.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruapi/topology_post.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korudsl/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korudsl/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korudsl/library.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korudsl/transform.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/audit.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/chat_history.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/command_catalog.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/command_catalog_store.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/command_picker.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/command_scenario.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/command_telemetry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/handlers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/handlers_ack.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/handlers_drive.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/handlers_hello.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/handlers_plugin_event.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/metadata.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/protocol.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/server.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon/storage.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/daemon_storage.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/drive_orchestrator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/drive_policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/host_setup.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ide_control.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/antigravity.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/base.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/cursor.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/fallback.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/jetbrains.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/vscode.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/vscodium.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/windsurf.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ides/zed.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/injector.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/injector_backends.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/injector_errors.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/os_injector.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/plugin_installer.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/plugin_router.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/plugin_version.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/ports.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/protocol.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/socket.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/strategy_prompt.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruide/utils.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/strategies/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/strategies/base.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/strategies/claude.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/strategies/codex.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/strategies/gpt.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/strategies/ide_chat.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/strategies/ollama.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korullm/strategies/registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/browser_capture.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/cli_commands.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/cli_parser.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/codec.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/dashboard.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/dashboard_parse.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/envelope.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/grid_template.html +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/keys.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/store.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/store_persistence.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/korumesh/transport.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruobserve/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruobserve/bootstrap.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruobserve/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruobserve/cli_parser.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruobserve/diagnostics.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruobserve/lifecycle.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruobserve/paths.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruobserve/providers_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruos/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/agent.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/capture.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/capture_mss.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/capture_probe.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/cli_parser.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/mesh.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/portal_capture.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/base.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/browser_getdisplay.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/cli_tools.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/detector.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/env.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/grim.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/mss.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/obs_websocket.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/portal_screencast.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/portal_screenshot.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/providers/screencast_session.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/koruvision/scaling.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/nlp2imgl/__init__.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/src/nlp2imgl/control.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_activity_log.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_agent_backend_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_agent_backends.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_agent_backends_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_agent_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_agents.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autoloop_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_bridge.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_chat_activity_analyzer.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_chat_activity_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_chat_activity_text.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_chat_activity_tickets.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_drive_retry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_cycle_skip_conditions.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_daemon_metadata.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_diag_markers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_diagnostics.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_gillm_fallback.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_loop_runner.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_nlp2uri_drive.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_onboarding.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_operator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_operator_reload.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_operator_unsupported_ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_parser_detection.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_plugin_lifecycle.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_plugin_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_process_detection.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_process_guard.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_readiness.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_redrive_cooldown.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_scenarios.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_startup.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_submit_strategy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomous_up.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomy_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomy_env.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomy_environment.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomy_events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomy_policy_decision.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomy_prompts.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autonomy_strategy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_audit.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_cli_direct_drive.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_client_drive_errors.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_commands_drive.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_commands_handoff.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_commands_manage.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_commands_shutdown.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_commands_status.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_daemon.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_host_setup.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_jetbrains_scaffold.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_lane_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_plugin_installer.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_protocol.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_autopilot_socket_path.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_bootstrap.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_calibration_validator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_capture_host_template.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_chat_history.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cli_shim_builders.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_code2llm_discovery.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_command_catalog_store.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_command_picker.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_command_telemetry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_configurator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_configurator_toggle.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_autonomous_checkpoint_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_env_config_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_local_manager_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_planfile_queue_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_primitives.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_repairs_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_tasks_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_topology_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cqrs_wup_context.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_cycle_trace.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_dashboard_html.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_dashboard_projects_by_ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_dashboard_ticket_handlers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_dashboard_topology_post.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_decision_arbiter.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_decision_engine.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_decision_trace.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_deployment_events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_deps_autorepair.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_desktop_uri.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_dev_sync.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_docker_capture.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_docker_e2e.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_docker_ide_matrix.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_docker_ide_matrix_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_docs_ide_control_surfaces.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_doctor.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_doctor_facade.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_doctor_koru_auto_probe.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_doctor_reporting_checks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_dotenv_loader.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_drive_orchestrator.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_drive_repair_policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_e2e.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_env2llm_registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_env_config.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_env_flags.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_environment_profile.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_events.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_gate.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_gc.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_gc_cli_helpers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_gillm_ide_client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_gillm_recovery.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_git_attribution.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_git_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_healing_webhook_split.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_adapters.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_client_contract.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_command_catalog.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_doctor_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_operator_guidance.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_reload.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_router.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_status_systemmap.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ide_work.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_imgl_integration.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_init.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_injection_moved_to_gillm.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_install_checks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_install_manager.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_integration_ledger.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_interface_registry.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koru_browser_stack.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koru_gate_capture.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koru_queue_argv.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruapi.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruapi_transports.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_korudsl.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruide_bridges.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruide_client.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruide_daemon_handlers_ack.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruide_daemon_handlers_console_log.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruide_daemon_handlers_drive.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruide_daemon_handlers_hello.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruide_daemon_handlers_plugin_event.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruide_ports.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_korumesh_envelope.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_korumesh_store.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_korumesh_transport.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruobserve_diagnostics.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruobserve_lifecycle.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruvision_agent.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruvision_capture.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_koruvision_mesh.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_lane_plugin_matching.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_llm_reflect.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_llm_strategies.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_local_service.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_loop.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_mcp_provision.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_mcp_server.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_mcp_server_split.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_nlp2oql_bridge.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_nlp2uri_ide_control_gate.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_observability_dsl.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_observation_mesh_e2e.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_observe_providers_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_operator_pipeline.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_package_deduplication.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_planfile_queue.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_planning_llm.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_plugin_router.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_post_run_verify.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_provider_browser_upload.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_provider_obs.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_provider_portal_screencast.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_pyproject_metadata.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_queue_clean.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_queue_cli_helpers.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_redup_integration.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_refactor_planfile_handoff.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_reflection_policy.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_regix_taskfile.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_remote_control.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_replay_actions.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_run_log.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_runtime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_runtime_insights.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_scan.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_scan_phase.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_scan_split.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_screencast_session.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_self_control.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_semcod_tools.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_serve.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_shell_evidence.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_stdio_autonomous_jsonl.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_strategy_metadata_accessors.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_strategy_prompt.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_structured_report.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_sync_plugin_build.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_tasks.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_testql_bridge.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_ticket_evidence.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_tools.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_topology.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_topology_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_vdisplay_control_fallback.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_verification_cycle_integration.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_verification_engine.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_vision_interval_floor.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_vision_provider_mime.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_watch.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_cli.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_env_e2e.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_gui.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_ide.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_ide_extras.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_llx.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_project.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_templates.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wizard_tree.py +0 -0
- {koru-0.1.330 → koru-0.1.332}/tests/test_wup_taskfile.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: koru
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.332
|
|
4
4
|
Summary: Closed-loop automation across semcod/* repositories.
|
|
5
5
|
Author: Semcod
|
|
6
6
|
Author-email: Tom Sapletta <tom@sapletta.com>
|
|
@@ -156,11 +156,11 @@ Dynamic: license-file
|
|
|
156
156
|
|
|
157
157
|
## AI Cost Tracking
|
|
158
158
|
|
|
159
|
-
    
|
|
160
|
+
  
|
|
161
161
|
|
|
162
|
-
- 🤖 **LLM usage:** $
|
|
163
|
-
- 👤 **Human dev:** ~$
|
|
162
|
+
- 🤖 **LLM usage:** $27.5767 (438 commits)
|
|
163
|
+
- 👤 **Human dev:** ~$15021 (150.2h @ $100/h, 30min dedup)
|
|
164
164
|
|
|
165
165
|
Generated on 2026-06-11 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
|
|
166
166
|
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
|
|
8
8
|
## AI Cost Tracking
|
|
9
9
|
|
|
10
|
-
    
|
|
11
|
+
  
|
|
12
12
|
|
|
13
|
-
- 🤖 **LLM usage:** $
|
|
14
|
-
- 👤 **Human dev:** ~$
|
|
13
|
+
- 🤖 **LLM usage:** $27.5767 (438 commits)
|
|
14
|
+
- 👤 **Human dev:** ~$15021 (150.2h @ $100/h, 30min dedup)
|
|
15
15
|
|
|
16
16
|
Generated on 2026-06-11 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
|
|
17
17
|
|
|
@@ -281,6 +281,77 @@ class Nlp2UriDesktopBackend:
|
|
|
281
281
|
return _nlp2uri_desktop_send(prompt, ide=ide, submit=submit, dry_run=self.dry_run)
|
|
282
282
|
|
|
283
283
|
|
|
284
|
+
def _build_plugin_socket_backend(client: IDEControlClient | None) -> AgentBackend:
|
|
285
|
+
if client is None:
|
|
286
|
+
raise ValueError("plugin_socket backend requires an IDEControlClient")
|
|
287
|
+
return PluginSocketBackend(client=client)
|
|
288
|
+
|
|
289
|
+
def _build_mcp_tool_backend(mcp_server: str | None) -> AgentBackend:
|
|
290
|
+
return McpToolBackend(mcp_server=mcp_server)
|
|
291
|
+
|
|
292
|
+
def _build_vendor_agent_cli_backend(shell_client_id: str | None) -> AgentBackend:
|
|
293
|
+
return TillmShellBackend(
|
|
294
|
+
client_id=shell_client_id or os.environ.get("KORU_TILLM_CLIENT", "aider"),
|
|
295
|
+
execute=os.environ.get("KORU_TILLM_DRY_RUN", "").strip().lower()
|
|
296
|
+
not in {"1", "true", "yes", "on"},
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
def _build_gillm_gui_backend() -> AgentBackend:
|
|
300
|
+
return GillmGuiBackend(client=build_gillm_ide_client())
|
|
301
|
+
|
|
302
|
+
def _build_os_injector_backend() -> AgentBackend:
|
|
303
|
+
profile = os.environ.get("KORU_OS_INJECTOR_PROFILE", "").strip()
|
|
304
|
+
if not profile:
|
|
305
|
+
raise ValueError("os_injector backend requires KORU_OS_INJECTOR_PROFILE")
|
|
306
|
+
raw_cfg = os.environ.get("KORU_OS_INJECTOR_CONFIG", "").strip()
|
|
307
|
+
cfg = Path(raw_cfg).expanduser().resolve() if raw_cfg else None
|
|
308
|
+
return OsInjectorBackend(profile_id=profile, config_path=cfg)
|
|
309
|
+
|
|
310
|
+
def _build_nlp2uri_desktop_backend() -> AgentBackend:
|
|
311
|
+
dry = os.environ.get("KORU_NLP2URI_DRY_RUN", "").strip().lower() in {
|
|
312
|
+
"1", "true", "yes", "on",
|
|
313
|
+
}
|
|
314
|
+
return Nlp2UriDesktopBackend(dry_run=dry)
|
|
315
|
+
|
|
316
|
+
def _build_imgl_desktop_backend() -> AgentBackend:
|
|
317
|
+
dry = os.environ.get("KORU_IMGL_DRY_RUN", "").strip().lower() in {
|
|
318
|
+
"1", "true", "yes", "on",
|
|
319
|
+
}
|
|
320
|
+
return ImglDesktopBackend(dry_run=dry)
|
|
321
|
+
|
|
322
|
+
def _build_vdisplay_control_backend() -> AgentBackend:
|
|
323
|
+
dry = os.environ.get("KORU_VDISPLAY_DRY_RUN", "").strip().lower() in {
|
|
324
|
+
"1", "true", "yes", "on",
|
|
325
|
+
}
|
|
326
|
+
return VdisplayControlBackend(dry_run=dry)
|
|
327
|
+
|
|
328
|
+
def _build_noop_backend(noop_reason: str) -> AgentBackend:
|
|
329
|
+
return NoopBackend(reason=noop_reason)
|
|
330
|
+
|
|
331
|
+
_BACKEND_BUILDERS = {
|
|
332
|
+
"plugin_socket": _build_plugin_socket_backend,
|
|
333
|
+
"vscode_family_plugin_socket": _build_plugin_socket_backend,
|
|
334
|
+
"mcp_tool": _build_mcp_tool_backend,
|
|
335
|
+
"mcp_stdio_server": _build_mcp_tool_backend,
|
|
336
|
+
"vendor_agent_cli": _build_vendor_agent_cli_backend,
|
|
337
|
+
"gillm_gui": _build_gillm_gui_backend,
|
|
338
|
+
"gillm_gui_driver": _build_gillm_gui_backend,
|
|
339
|
+
"os_injector": _build_os_injector_backend,
|
|
340
|
+
"os_keyboard_injector": _build_os_injector_backend,
|
|
341
|
+
"nlp2uri_desktop": _build_nlp2uri_desktop_backend,
|
|
342
|
+
"nlp2uri_desktop_window": _build_nlp2uri_desktop_backend,
|
|
343
|
+
"imgl": _build_imgl_desktop_backend,
|
|
344
|
+
"imgl_vision": _build_imgl_desktop_backend,
|
|
345
|
+
"imgl_desktop": _build_imgl_desktop_backend,
|
|
346
|
+
"imgl_vision_driver": _build_imgl_desktop_backend,
|
|
347
|
+
"vdisplay": _build_vdisplay_control_backend,
|
|
348
|
+
"vdisplay_control": _build_vdisplay_control_backend,
|
|
349
|
+
"vdisplay_semantic_control": _build_vdisplay_control_backend,
|
|
350
|
+
"none": _build_noop_backend,
|
|
351
|
+
"noop": _build_noop_backend,
|
|
352
|
+
"": _build_noop_backend,
|
|
353
|
+
}
|
|
354
|
+
|
|
284
355
|
def build_agent_backend(
|
|
285
356
|
*,
|
|
286
357
|
backend_id: str,
|
|
@@ -296,44 +367,18 @@ def build_agent_backend(
|
|
|
296
367
|
"""
|
|
297
368
|
bid = (backend_id or "").strip().lower().replace("-", "_")
|
|
298
369
|
normalized = normalize_agent_backend_id(backend_id or "")
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
if bid == "gillm_gui" or normalized == "gillm_gui_driver":
|
|
312
|
-
return GillmGuiBackend(client=build_gillm_ide_client())
|
|
313
|
-
if bid == "os_injector" or normalized == "os_keyboard_injector":
|
|
314
|
-
profile = os.environ.get("KORU_OS_INJECTOR_PROFILE", "").strip()
|
|
315
|
-
if not profile:
|
|
316
|
-
raise ValueError("os_injector backend requires KORU_OS_INJECTOR_PROFILE")
|
|
317
|
-
raw_cfg = os.environ.get("KORU_OS_INJECTOR_CONFIG", "").strip()
|
|
318
|
-
cfg = Path(raw_cfg).expanduser().resolve() if raw_cfg else None
|
|
319
|
-
return OsInjectorBackend(profile_id=profile, config_path=cfg)
|
|
320
|
-
if bid == "nlp2uri_desktop" or normalized == "nlp2uri_desktop_window":
|
|
321
|
-
dry = os.environ.get("KORU_NLP2URI_DRY_RUN", "").strip().lower() in {
|
|
322
|
-
"1", "true", "yes", "on",
|
|
323
|
-
}
|
|
324
|
-
return Nlp2UriDesktopBackend(dry_run=dry)
|
|
325
|
-
if bid in ("imgl", "imgl_vision", "imgl_desktop") or normalized == "imgl_vision_driver":
|
|
326
|
-
dry = os.environ.get("KORU_IMGL_DRY_RUN", "").strip().lower() in {
|
|
327
|
-
"1", "true", "yes", "on",
|
|
328
|
-
}
|
|
329
|
-
return ImglDesktopBackend(dry_run=dry)
|
|
330
|
-
if bid in ("vdisplay", "vdisplay_control") or normalized == "vdisplay_semantic_control":
|
|
331
|
-
dry = os.environ.get("KORU_VDISPLAY_DRY_RUN", "").strip().lower() in {
|
|
332
|
-
"1", "true", "yes", "on",
|
|
333
|
-
}
|
|
334
|
-
return VdisplayControlBackend(dry_run=dry)
|
|
335
|
-
if bid in ("none", "noop", ""):
|
|
336
|
-
return NoopBackend(reason=noop_reason)
|
|
370
|
+
builder = _BACKEND_BUILDERS.get(bid) or _BACKEND_BUILDERS.get(normalized)
|
|
371
|
+
if builder:
|
|
372
|
+
if "client" in builder.__code__.co_varnames and client is not None:
|
|
373
|
+
return builder(client=client)
|
|
374
|
+
elif "mcp_server" in builder.__code__.co_varnames and mcp_server is not None:
|
|
375
|
+
return builder(mcp_server=mcp_server)
|
|
376
|
+
elif "shell_client_id" in builder.__code__.co_varnames and shell_client_id is not None:
|
|
377
|
+
return builder(shell_client_id=shell_client_id)
|
|
378
|
+
elif "noop_reason" in builder.__code__.co_varnames:
|
|
379
|
+
return builder(noop_reason=noop_reason)
|
|
380
|
+
else:
|
|
381
|
+
return builder()
|
|
337
382
|
raise ValueError(f"unknown agent backend id: {backend_id!r}")
|
|
338
383
|
|
|
339
384
|
|
|
@@ -347,6 +347,17 @@ def _invoke_client_autopilot_drive(
|
|
|
347
347
|
ok = bool(reply.get("ok", True))
|
|
348
348
|
if ok or require_plugin:
|
|
349
349
|
return reply, ok
|
|
350
|
+
# Prefer vdisplay semantic control (with VQL click_centers, vision, resolve fallback)
|
|
351
|
+
# for non-plugin lanes like jetbrains when available (Wayland, KORU_VDISPLAY_...=1)
|
|
352
|
+
vdisplay = _try_vdisplay_control_fallback(
|
|
353
|
+
prompt,
|
|
354
|
+
submit=submit,
|
|
355
|
+
ide=autopilot_ide,
|
|
356
|
+
project=project,
|
|
357
|
+
plugin_connected=bool(reply.get("ok")),
|
|
358
|
+
)
|
|
359
|
+
if vdisplay is not None and vdisplay.get("ok"):
|
|
360
|
+
return vdisplay, True
|
|
350
361
|
imgl = _try_imgl_gui_fallback(
|
|
351
362
|
prompt,
|
|
352
363
|
submit=submit,
|
|
@@ -363,15 +374,6 @@ def _invoke_client_autopilot_drive(
|
|
|
363
374
|
)
|
|
364
375
|
if gillm is not None and gillm.get("ok"):
|
|
365
376
|
return gillm, True
|
|
366
|
-
vdisplay = _try_vdisplay_control_fallback(
|
|
367
|
-
prompt,
|
|
368
|
-
submit=submit,
|
|
369
|
-
ide=autopilot_ide,
|
|
370
|
-
project=project,
|
|
371
|
-
plugin_connected=bool(reply.get("ok")),
|
|
372
|
-
)
|
|
373
|
-
if vdisplay is not None and vdisplay.get("ok"):
|
|
374
|
-
return vdisplay, True
|
|
375
377
|
nlp2uri_focus = _try_nlp2uri_focus_fallback(prompt, submit=submit, ide=autopilot_ide)
|
|
376
378
|
if nlp2uri_focus is not None and nlp2uri_focus.get("ok"):
|
|
377
379
|
return nlp2uri_focus, True
|
|
@@ -263,9 +263,32 @@ def try_vdisplay_control_fallback(
|
|
|
263
263
|
|
|
264
264
|
if not vdisplay_fallback_enabled(ide=ide, plugin_connected=plugin_connected):
|
|
265
265
|
return None
|
|
266
|
+
# Ensure session for audit/recovery when using vdisplay (addresses gap in auto runner not setting VDISPLAY_SESSION)
|
|
267
|
+
os.environ.setdefault("VDISPLAY_SESSION", "1")
|
|
266
268
|
try:
|
|
269
|
+
# Load VQL metadata (our analysis or fresh per-screenshot) to provide
|
|
270
|
+
# click_center / data_locations / decision_data for semantic actions.
|
|
271
|
+
# This gives the autonomy loop precise mouse coords and "where the data is"
|
|
272
|
+
# (pngs, client code, .env LLM, planfile) for decisions in JetBrains/Cursor.
|
|
273
|
+
from koru.integrations.vdisplay_client import load_vql_metadata, record_koru_drive_step
|
|
274
|
+
vql = load_vql_metadata()
|
|
275
|
+
vql_note = ""
|
|
276
|
+
if vql.get("ui_elements"):
|
|
277
|
+
cc = vql["ui_elements"][0].get("click_center", {})
|
|
278
|
+
vql_note = f" VQL click_center={cc} (use for editor focus / chat in IDE)"
|
|
267
279
|
reply = send_chat(prompt, ide=ide, submit=submit)
|
|
268
280
|
reply.setdefault("fallback_from", "plugin")
|
|
281
|
+
reply.setdefault("vql_context", vql.get("_source") or "loaded")
|
|
282
|
+
if vql_note:
|
|
283
|
+
reply["vql_note"] = vql_note
|
|
284
|
+
# Record to vdisplay session for audit trail (P1)
|
|
285
|
+
try:
|
|
286
|
+
record_koru_drive_step(reply, profile_id=ide, text=prompt)
|
|
287
|
+
except Exception:
|
|
288
|
+
pass
|
|
289
|
+
# If the drive used vdisplay, autonomy can now use the coords from VQL
|
|
290
|
+
# (e.g. resolve_click_for_frame or the centers from fresh 31-elem captures)
|
|
291
|
+
# instead of blind keyboard.
|
|
269
292
|
return reply
|
|
270
293
|
except Exception as exc:
|
|
271
294
|
return {
|
|
@@ -87,7 +87,8 @@ def imgl_desktop_transport_enabled() -> bool:
|
|
|
87
87
|
|
|
88
88
|
def default_image_path() -> Path:
|
|
89
89
|
if _IMGL_DIRECT:
|
|
90
|
-
|
|
90
|
+
p = _default_image_path()
|
|
91
|
+
return Path(p) if isinstance(p, (str, bytes, os.PathLike)) else p
|
|
91
92
|
raw = os.environ.get("KORU_IMGL_IMAGE", "/tmp/koru-imgl-screen.png").strip()
|
|
92
93
|
return Path(raw).expanduser()
|
|
93
94
|
|
|
@@ -7,6 +7,7 @@ automation: AT-SPI / Playwright / terminal / X11 / vision routing with verify.
|
|
|
7
7
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
|
+
import json
|
|
10
11
|
import os
|
|
11
12
|
import urllib.error
|
|
12
13
|
import urllib.request
|
|
@@ -435,6 +436,7 @@ def _find_first_selector(
|
|
|
435
436
|
ide: str,
|
|
436
437
|
selectors: tuple[dict[str, str], ...],
|
|
437
438
|
backend: str = "auto",
|
|
439
|
+
vql_fallback: bool = True,
|
|
438
440
|
) -> tuple[dict[str, str] | None, dict[str, Any] | None]:
|
|
439
441
|
hints = _ide_hints(ide)
|
|
440
442
|
base = {
|
|
@@ -453,6 +455,27 @@ def _find_first_selector(
|
|
|
453
455
|
if found.get("ok") and int(found.get("count") or 0) > 0:
|
|
454
456
|
return spec, found
|
|
455
457
|
last_error = found
|
|
458
|
+
|
|
459
|
+
# VQL fallback: if vision found nothing, use explicit click_center from loaded VQL
|
|
460
|
+
# (fresh 31-elem capture or our analysis with decision_data + mouse coords for JetBrains/Cursor)
|
|
461
|
+
if vql_fallback:
|
|
462
|
+
vql = load_vql_metadata()
|
|
463
|
+
if vql.get("ui_elements"):
|
|
464
|
+
cc = vql["ui_elements"][0].get("click_center", {})
|
|
465
|
+
if cc:
|
|
466
|
+
return None, {
|
|
467
|
+
"ok": True,
|
|
468
|
+
"count": 1,
|
|
469
|
+
"selected": {
|
|
470
|
+
"id": "vql-fallback:0",
|
|
471
|
+
"backend": "vql",
|
|
472
|
+
"role": "unknown",
|
|
473
|
+
"name": "vql-center",
|
|
474
|
+
"click_point": {"x": cc.get("x"), "y": cc.get("y")},
|
|
475
|
+
"note": f"VQL fallback center from {vql.get('_source')}"
|
|
476
|
+
},
|
|
477
|
+
"matches": [{"id": "vql-fallback:0", "click_center": cc}]
|
|
478
|
+
}
|
|
456
479
|
return None, last_error
|
|
457
480
|
|
|
458
481
|
|
|
@@ -596,6 +619,28 @@ def send_chat(
|
|
|
596
619
|
"fallback_from": "plugin",
|
|
597
620
|
}
|
|
598
621
|
|
|
622
|
+
|
|
623
|
+
def _resolve_vql_chat_target(ide: str, hints: dict) -> dict | None:
|
|
624
|
+
"""Resolve chat target using VQL metadata for precise mouse nav on second monitor (DP-1).
|
|
625
|
+
Used in autonomous PyCharm/JetBrains control via vdisplay + VQL centers (e.g. 1024,640).
|
|
626
|
+
"""
|
|
627
|
+
vql_target = get_vql_target(ide, role="input", name_contains="chat") or get_vql_target(ide, role="input") or get_vql_target(ide, label="chat")
|
|
628
|
+
if not vql_target and ide in ("pycharm", "jetbrains"):
|
|
629
|
+
vql_target = {"click_center": {"x": 1024, "y": 640, "note": "PyCharm/JetBrains editor area on DP-1 second monitor from VQL"}}
|
|
630
|
+
if vql_target:
|
|
631
|
+
return {
|
|
632
|
+
"ok": True,
|
|
633
|
+
"count": 1,
|
|
634
|
+
"selected": {
|
|
635
|
+
"id": vql_target.get("id", "vql-chat"),
|
|
636
|
+
"backend": "vql",
|
|
637
|
+
"role": vql_target.get("role"),
|
|
638
|
+
"click_point": vql_target.get("click_center"),
|
|
639
|
+
"note": f"VQL target from {vql_target.get('source', 'VQL analysis for second monitor')}"
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
return None
|
|
643
|
+
|
|
599
644
|
canon = _canonical_ide(ide)
|
|
600
645
|
if canon in {"jetbrains", "pycharm"}:
|
|
601
646
|
try:
|
|
@@ -645,17 +690,21 @@ def send_chat(
|
|
|
645
690
|
|
|
646
691
|
selector, found = _find_first_selector(ide=ide, selectors=_chat_selectors_for(ide))
|
|
647
692
|
if selector is None:
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
"
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
693
|
+
found = _resolve_vql_chat_target(ide, hints)
|
|
694
|
+
if found:
|
|
695
|
+
selector = {"role": "input", "name_contains": "Chat"}
|
|
696
|
+
else:
|
|
697
|
+
return {
|
|
698
|
+
"ok": False,
|
|
699
|
+
"backend": "vdisplay",
|
|
700
|
+
"message": (
|
|
701
|
+
f"no chat input matched for ide={ide} "
|
|
702
|
+
f"(app={hints.get('app')!r}); focus_error={focus_error or '-'}"
|
|
703
|
+
),
|
|
704
|
+
"type": "error",
|
|
705
|
+
"fallback_from": "plugin",
|
|
706
|
+
"diagnostics": found,
|
|
707
|
+
}
|
|
659
708
|
|
|
660
709
|
write_kwargs = {
|
|
661
710
|
"backend": "auto",
|
|
@@ -733,6 +782,129 @@ def send_chat(
|
|
|
733
782
|
}
|
|
734
783
|
|
|
735
784
|
|
|
785
|
+
def load_vql_metadata(path: str | None = None) -> dict:
|
|
786
|
+
"""Load VQL metadata (from .vdisplay/2026-06-11-vql-metadata-analysis-previous-current.json or per-capture .vql.json).
|
|
787
|
+
Returns ui_elements with click_center, data_locations, decision_data etc for mouse nav + decide.
|
|
788
|
+
Used to augment vision/control with explicit coords and data sources from previous/current analysis.
|
|
789
|
+
Now also falls back to latest fresh capture VQL (e.g. koru-cont-*.vql.json) for up-to-date 30+ element bboxes/centers.
|
|
790
|
+
Always normalizes to have 'layers' alias for ui_elements for compatibility with VQL consumers expecting layers.
|
|
791
|
+
"""
|
|
792
|
+
candidates = []
|
|
793
|
+
if path:
|
|
794
|
+
candidates.append(path)
|
|
795
|
+
else:
|
|
796
|
+
candidates += [
|
|
797
|
+
".vdisplay/2026-06-11-vql-metadata-analysis-previous-current.json",
|
|
798
|
+
".vdisplay/koru-cont-dp1-*.png.vql.json", # glob handled below
|
|
799
|
+
"/tmp/koru-cont-dp1-*.png.vql.json",
|
|
800
|
+
"/tmp/vdisplay-auto-observe-auto-vision-find-cursor.png.vql.json",
|
|
801
|
+
]
|
|
802
|
+
for cand in candidates:
|
|
803
|
+
try:
|
|
804
|
+
import glob
|
|
805
|
+
if "*" in cand:
|
|
806
|
+
matches = sorted(glob.glob(cand), reverse=True)
|
|
807
|
+
if not matches: continue
|
|
808
|
+
cand = matches[0]
|
|
809
|
+
if not os.path.exists(cand): continue
|
|
810
|
+
with open(cand) as f:
|
|
811
|
+
data = json.load(f)
|
|
812
|
+
# Normalize various VQL structures (analysis, fresh capture from screenshot, imgl, etc.)
|
|
813
|
+
if "ui_elements" in data and data.get("ui_elements"):
|
|
814
|
+
data["_source"] = cand
|
|
815
|
+
if "layers" not in data:
|
|
816
|
+
data["layers"] = data["ui_elements"]
|
|
817
|
+
return data
|
|
818
|
+
if "elements" in data and isinstance(data.get("elements"), list) and data["elements"]:
|
|
819
|
+
# Fresh per-capture .vql.json from screenshot (top-level elements + by_role + element_count)
|
|
820
|
+
ui_els = []
|
|
821
|
+
for e in data["elements"]:
|
|
822
|
+
bbox = e.get("bbox") or [0,0,0,0]
|
|
823
|
+
if isinstance(bbox, (list, tuple)) and len(bbox) >= 4:
|
|
824
|
+
cx = (bbox[0] + bbox[2]) / 2
|
|
825
|
+
cy = (bbox[1] + bbox[3]) / 2
|
|
826
|
+
else:
|
|
827
|
+
c = e.get("center") or [1024, 640]
|
|
828
|
+
cx, cy = (c if isinstance(c, (list,tuple)) else [1024,640])[:2]
|
|
829
|
+
ui_els.append({
|
|
830
|
+
"id": str(e.get("id", f"elem-{len(ui_els)}")),
|
|
831
|
+
"role": e.get("role", "unknown"),
|
|
832
|
+
"bounds": {"x": int(bbox[0]), "y": int(bbox[1]), "width": int(bbox[2]-bbox[0]) if len(bbox)>2 else 0, "height": int(bbox[3]-bbox[1]) if len(bbox)>3 else 0, "coordinate_space": "capture_frame_local"},
|
|
833
|
+
"click_center": {"x": int(cx), "y": int(cy), "note": f"fresh VQL elem, color={e.get('color')}, conf={e.get('confidence')}"},
|
|
834
|
+
"label": e.get("label"),
|
|
835
|
+
"metadata": {k: e.get(k) for k in ("color","confidence","location") if k in e}
|
|
836
|
+
})
|
|
837
|
+
res = {"ui_elements": ui_els, "layers": ui_els, "element_count": data.get("element_count", len(ui_els)), "by_role": data.get("by_role", {}), "scene": data.get("scene"), "_source": cand, "raw_fresh": True}
|
|
838
|
+
return res
|
|
839
|
+
if "vql" in data and isinstance(data.get("vql"), dict):
|
|
840
|
+
prog = data["vql"].get("program", data["vql"])
|
|
841
|
+
if isinstance(prog, dict):
|
|
842
|
+
prog["_source"] = cand
|
|
843
|
+
if "layers" not in prog and "ui_elements" in prog:
|
|
844
|
+
prog["layers"] = prog["ui_elements"]
|
|
845
|
+
return prog
|
|
846
|
+
if "screen_context" in data or "metadata" in data:
|
|
847
|
+
return {"ui_elements": [], "layers": [], "metadata": data.get("metadata", data.get("screen_context", {})), "environment": data.get("environment", {}), "_source": cand}
|
|
848
|
+
if isinstance(data.get("program"), (str, dict)) and "elements" not in data:
|
|
849
|
+
data["_source"] = cand
|
|
850
|
+
if "layers" not in data:
|
|
851
|
+
data["layers"] = data.get("ui_elements", [])
|
|
852
|
+
return data
|
|
853
|
+
data["_source"] = cand
|
|
854
|
+
if "layers" not in data:
|
|
855
|
+
data["layers"] = data.get("ui_elements", [])
|
|
856
|
+
return data
|
|
857
|
+
except Exception as exc:
|
|
858
|
+
continue
|
|
859
|
+
return {"error": "no vql found", "tried": candidates, "layers": [], "ui_elements": []}
|
|
860
|
+
|
|
861
|
+
|
|
862
|
+
def get_vql_target(ide: str, *, role: str | None = None, name_contains: str | None = None, label: str | None = None) -> dict | None:
|
|
863
|
+
"""Select target from loaded VQL ui_elements/layers by role or name/label.
|
|
864
|
+
Returns dict with click_center, bounds, id for use in act (mouse nav).
|
|
865
|
+
Used to close observe -> decide -> act gap when vision stub or no map.
|
|
866
|
+
"""
|
|
867
|
+
vql = load_vql_metadata()
|
|
868
|
+
targets = vql.get("ui_elements") or vql.get("layers") or []
|
|
869
|
+
for t in targets:
|
|
870
|
+
if role and t.get("role") != role:
|
|
871
|
+
continue
|
|
872
|
+
if name_contains and name_contains.lower() not in str(t.get("label", "")).lower() and name_contains.lower() not in str(t.get("id", "")).lower():
|
|
873
|
+
continue
|
|
874
|
+
if label and label.lower() not in str(t.get("label", "")).lower():
|
|
875
|
+
continue
|
|
876
|
+
cc = t.get("click_center") or {}
|
|
877
|
+
if cc:
|
|
878
|
+
return {
|
|
879
|
+
"id": t.get("id"),
|
|
880
|
+
"role": t.get("role"),
|
|
881
|
+
"click_center": cc,
|
|
882
|
+
"bounds": t.get("bounds"),
|
|
883
|
+
"source": vql.get("_source"),
|
|
884
|
+
}
|
|
885
|
+
return None
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
def resolve_click_for_frame(source: str = "DP-1", vql_path: str | None = None, vision_fallback: bool = True) -> dict:
|
|
889
|
+
"""Helper: return best click coords for a monitor/frame.
|
|
890
|
+
Prefers explicit from load_vql_metadata (fresh capture or analysis).
|
|
891
|
+
Can be used when vision find returns no match (e.g. "planfile" anchor) as general editor/center action.
|
|
892
|
+
"""
|
|
893
|
+
m = load_vql_metadata(vql_path)
|
|
894
|
+
if m.get("ui_elements"):
|
|
895
|
+
# Prefer first (usually the main capture frame for --source)
|
|
896
|
+
for el in m.get("ui_elements", []):
|
|
897
|
+
if source.lower() in str(el.get("source", "")).lower() or "dp-1" in str(el).lower() or not el.get("source"):
|
|
898
|
+
if cc := el.get("click_center"):
|
|
899
|
+
return {"x": cc.get("x"), "y": cc.get("y"), "source": m.get("_source"), "note": el.get("note", "from VQL")}
|
|
900
|
+
# fallback any
|
|
901
|
+
el = m["ui_elements"][0]
|
|
902
|
+
if cc := el.get("click_center") or el.get("center"):
|
|
903
|
+
return {"x": cc.get("x") if isinstance(cc, dict) else cc[0], "y": cc.get("y") if isinstance(cc, dict) else cc[1], "source": m.get("_source")}
|
|
904
|
+
# last resort frame center for 2048x1280 DP-1 crop
|
|
905
|
+
return {"x": 1024, "y": 640, "source": "hardcoded-fallback", "note": "DP-1 capture frame center"}
|
|
906
|
+
|
|
907
|
+
|
|
736
908
|
__all__ = [
|
|
737
909
|
"send_chat",
|
|
738
910
|
"send_chat_via_ide_prompt",
|
|
@@ -740,4 +912,7 @@ __all__ = [
|
|
|
740
912
|
"vdisplay_available",
|
|
741
913
|
"vdisplay_fallback_enabled",
|
|
742
914
|
"vdisplay_missing_message",
|
|
915
|
+
"load_vql_metadata",
|
|
916
|
+
"get_vql_target",
|
|
917
|
+
"resolve_click_for_frame",
|
|
743
918
|
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: koru
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.332
|
|
4
4
|
Summary: Closed-loop automation across semcod/* repositories.
|
|
5
5
|
Author: Semcod
|
|
6
6
|
Author-email: Tom Sapletta <tom@sapletta.com>
|
|
@@ -156,11 +156,11 @@ Dynamic: license-file
|
|
|
156
156
|
|
|
157
157
|
## AI Cost Tracking
|
|
158
158
|
|
|
159
|
-
    
|
|
160
|
+
  
|
|
161
161
|
|
|
162
|
-
- 🤖 **LLM usage:** $
|
|
163
|
-
- 👤 **Human dev:** ~$
|
|
162
|
+
- 🤖 **LLM usage:** $27.5767 (438 commits)
|
|
163
|
+
- 👤 **Human dev:** ~$15021 (150.2h @ $100/h, 30min dedup)
|
|
164
164
|
|
|
165
165
|
Generated on 2026-06-11 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
|
|
166
166
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|