koru 0.1.332__tar.gz → 0.1.333__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.332/src/koru.egg-info → koru-0.1.333}/PKG-INFO +5 -5
- {koru-0.1.332 → koru-0.1.333}/README.md +4 -4
- {koru-0.1.332 → koru-0.1.333}/pyproject.toml +1 -1
- {koru-0.1.332 → koru-0.1.333}/src/koru/agent_backend_runtime.py +6 -6
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_gate.py +8 -5
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy_strategy/openrouter.py +63 -0
- koru-0.1.333/src/koru/integrations/autonomy_session.py +271 -0
- koru-0.1.333/src/koru/integrations/vdisplay_client.py +4135 -0
- {koru-0.1.332 → koru-0.1.333/src/koru.egg-info}/PKG-INFO +5 -5
- {koru-0.1.332 → koru-0.1.333}/src/koru.egg-info/SOURCES.txt +2 -0
- koru-0.1.333/tests/test_photo_vql_drive.py +610 -0
- koru-0.1.333/tests/test_vdisplay_control_fallback.py +383 -0
- koru-0.1.332/src/koru/integrations/vdisplay_client.py +0 -918
- koru-0.1.332/tests/test_vdisplay_control_fallback.py +0 -120
- {koru-0.1.332 → koru-0.1.333}/LICENSE +0 -0
- {koru-0.1.332 → koru-0.1.333}/MANIFEST.in +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/cli_calibration.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/control.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/ecosystem.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/ide_detection.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/commands.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/diagnostics.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/domain.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/pipeline.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/projector.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/query.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/service.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair/store.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/repair_registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/daemon_ctl.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/editor_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/http_handlers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/http_server.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/http_util.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/models.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/paths.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/probe.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/service.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/socket_path.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/packages/coru/src/coru/supervisor/systemd_unit.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/schemas/koru-stdio-event.schema.json +0 -0
- {koru-0.1.332 → koru-0.1.333}/setup.cfg +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/env2llm/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/env2llm/integrators/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/env2llm/integrators/_service_factory.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/env2llm/probes/testql.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/env2llm/service/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/env2llm/service/registry_service.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/imgl/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/imgl/autodiag.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/imgl/freshness.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/__main__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/activity_log.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/agent_backends.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/agent_cli_helpers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/agents.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/api/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.29.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.30.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.32.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.35.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.36.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.38.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.39.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.40.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.41.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.42.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.43.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.44.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.45.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.46.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.55.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.56.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.57.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.2.0.vsix +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autoloop_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_auto_pipeline.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_checkpoint.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cli_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_bridge.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_chat_activity.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_chat_activity_analyzer.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_chat_activity_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_chat_activity_text.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_chat_activity_tickets.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_common.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_drive_outcome.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_drive_retry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_orchestrator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_post_drive.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_cycle_skip_conditions.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_daemon.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_diag_markers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_diagnostics.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_drive_retry_policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_env.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_loop_runner.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_onboarding.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_operator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_parser.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_plugin.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_plugin_lifecycle.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_plugin_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_plugin_wait.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_process_guard.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_processes.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_readiness.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_resources.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_startup.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_submit_strategy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_up.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomous_wup.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/code2llm_discovery.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/cycle_finalize.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/cycle_trace.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/decision_arbiter.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/decision_trace.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/env.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/environment.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/heal.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/ide_operator_guidance.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/ide_work.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/operator_pipeline.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/contexts.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/drive_phase.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/queue_phase.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/scan_phase.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/sleep_phase.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/startup_phase.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/utils.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/phases/verify_phase.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/planfile_handoff.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/planning_llm.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/planning_llm_budget.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/planning_llm_parsing.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/planning_llm_prompts.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/planning_llm_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/planning_llm_types.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/policy_decision.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/post_run_verify.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/prompts.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/reflection_policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/replay_actions.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/replay_builders.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/replay_execution.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/replay_handlers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/replay_parser.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/replay_quick_actions.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/replay_types.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/state.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/structured_report.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/telemetry_snapshot.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy/verification_engine.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy_strategy/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy_strategy/config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy_strategy/defaults.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy_strategy/heuristics.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autonomy_strategy/prompts.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/audit.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/calibrate_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/cli_command.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/cli_direct_drive.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/cli_parser.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/cli_snapshot.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/cli_trace.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/commands/drive.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/commands/handoff.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/commands/manage.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/commands/shutdown.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/commands/status.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/daemon.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/daemon_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/doctor_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/drive_repair_policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/host_setup.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/injector.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/install_checks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/install_manager.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/install_plugin_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/lane_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/local_manager.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/log_contract.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/os_injector.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/plugin_installer.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/protocol.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/systemd_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/tail_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/utils/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/autopilot/utils/client_helpers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bootstrap.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/autonomous_checkpoint/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/autonomous_checkpoint/application.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/autonomous_checkpoint/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/autonomous_checkpoint/events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/autonomous_checkpoint/queries/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/autonomous_checkpoint/read_model.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/env_config/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/env_config/application.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/env_config/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/env_config/events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/env_config/queries/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/env_config/read_model.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/local_manager/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/local_manager/application.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/local_manager/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/local_manager/events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/local_manager/queries/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/local_manager/read_model.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/planfile_queue/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/planfile_queue/application.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/planfile_queue/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/planfile_queue/events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/planfile_queue/queries/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/planfile_queue/read_model.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/repairs/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/repairs/application.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/repairs/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/repairs/events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/repairs/queries/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/repairs/read_model.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/tasks/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/tasks/application.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/tasks/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/tasks/events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/tasks/queries/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/tasks/read_model.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/topology/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/topology/application.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/topology/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/topology/events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/topology/queries/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/topology/read_model.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/wup/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/wup/application.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/wup/commands/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/wup/events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/wup/queries/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/bounded_contexts/wup/read_model.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli/__main__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli/commands.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli/parsers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_agent.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_agent_backends.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_auto.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_bootstrap.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_cleaned.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_doctor.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_gate.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_gc.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_ide_router.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_imgl.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_init.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_local_serve.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_loop.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_parser.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_queue.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_refactor_planfile_handoff.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_replay.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_runtime_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_scan.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_self.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_serve.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_shim_builders.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_strategy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_tagi.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_task.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_tools.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_topology.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cli_watch.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/configurator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/context_render.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/control_commands.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cqrs/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cqrs/domain_event.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cqrs/event_bus.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cqrs/event_log_projection.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cqrs/event_log_query.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/cqrs/event_store.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/data/koru-interface-registry.yaml +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/decision_engine.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/deployment_events/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/deployment_events/analyzer.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/deployment_events/batch.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/deployment_events/emitter.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/deployment_events/enums.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/deployment_events/models.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/deps_autorepair.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/dev_sync.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_autonomous_streams.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_autopilot_checks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_autopilot_debug.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_chat_control.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_constants.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_models.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_plugin_bundle.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_plugin_console.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_project_checks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_project_health.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_registry_checks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_render.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_reporting_checks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_runner.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/doctor_runtime_checks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/domain/env/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/dotenv_loader.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/dsl/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/env_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/env_flags.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/environment_profile.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/gate.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/gc.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/gc_cli_helpers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/git_attribution.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/git_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/base.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/bridge.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/gillm_client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/gillm_recovery.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/ide_reload.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/shared.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_adapters/vscode_family.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_control_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_doctor_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_router.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ide_status_systemmap.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/init.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/init_host_environment.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/integration_ledger.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/integrations/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/integrations/imgl_autodiag.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/integrations/imgl_client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/interface_registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/llm_reflect.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/local_manager_client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/local_manager_state.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/local_service.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/loop.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/mcp_provision.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/mcp_server.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/observability_dsl.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/observability_events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/observability_writer.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/planfile_queue.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/project_pipeline.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/human.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/koru_queue_argv.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/local_manager.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/locking.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/loop.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/planfile_ticket_note.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/runner.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/runners.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/shell_evidence.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/ticket.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue/types.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue_clean.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/queue_cli_helpers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/redup_integration.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/refactor_planfile_handoff.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/remote/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/remote/client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/run_log.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/scan.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/scan_collection.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/scan_dedupe_policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/scan_render.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/scan_ticket_emission.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/scan_types.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/scripts/koru-autoloop.sh +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/self_control.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/semcod_tools.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/serve.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/stdio_events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/tagi_integration.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/task_dedupe.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/task_intake.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/task_io.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/task_models.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/task_ticket.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/tasks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/ticket_evidence.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/tillm_bridge.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/tools.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/topology.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/topology_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/utils/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/utils/subprocess_runner.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/watch.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/cli_main.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/gui/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/gui/app.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/gui/server.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/gui/session.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/gui/static/wizard.css +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/gui/static/wizard.js +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/gui/templates/wizard.html +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/ide_install.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/llx.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/orchestrator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/project.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/prompters.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/strategies.json +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/templates/cli-tool.json +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/templates/library.json +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/templates/ml-research.json +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/templates/registry.json +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/templates/web-app.json +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/templates.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wizard/tree.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru/wup_testql_compat.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru.egg-info/dependency_links.txt +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru.egg-info/entry_points.txt +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru.egg-info/requires.txt +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koru.egg-info/top_level.txt +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/calibration_validator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_html.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_http.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_observability.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_plugin_logs.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_projects.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_routes.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_serve.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_serve_utils.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_state.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_template.html +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_tickets.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/dashboard_topology.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/desktop_uri.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/env2llm_registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/integrations.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/invoke.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/invoke_handlers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/local.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_desktop_uri.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_dispatch.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_env2llm.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_nlp2oql.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_planfile.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_schema.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_testql.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/mcp_server_transport.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/nlp2oql_bridge.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/openapi.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/runtime_insights.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/server.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/testql_bridge.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruapi/topology_post.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korudsl/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korudsl/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korudsl/library.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korudsl/transform.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/audit.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/chat_history.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/command_catalog.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/command_catalog_store.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/command_picker.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/command_scenario.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/command_telemetry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/handlers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/handlers_ack.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/handlers_drive.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/handlers_hello.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/handlers_plugin_event.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/metadata.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/protocol.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/server.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon/storage.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/daemon_storage.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/drive_orchestrator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/drive_policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/host_setup.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ide_control.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/antigravity.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/base.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/cursor.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/fallback.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/jetbrains.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/vscode.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/vscodium.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/windsurf.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ides/zed.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/injector.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/injector_backends.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/injector_errors.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/os_injector.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/plugin_installer.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/plugin_router.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/plugin_version.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/ports.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/protocol.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/socket.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/strategy_prompt.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruide/utils.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/strategies/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/strategies/base.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/strategies/claude.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/strategies/codex.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/strategies/gpt.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/strategies/ide_chat.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/strategies/ollama.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korullm/strategies/registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/browser_capture.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/cli_commands.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/cli_parser.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/codec.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/dashboard.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/dashboard_parse.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/envelope.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/grid_template.html +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/keys.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/store.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/store_persistence.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/korumesh/transport.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruobserve/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruobserve/bootstrap.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruobserve/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruobserve/cli_parser.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruobserve/diagnostics.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruobserve/lifecycle.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruobserve/paths.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruobserve/providers_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruos/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/agent.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/capture.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/capture_mss.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/capture_probe.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/cli_parser.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/mesh.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/portal_capture.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/base.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/browser_getdisplay.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/cli_tools.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/detector.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/env.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/grim.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/mss.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/obs_websocket.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/portal_screencast.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/portal_screenshot.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/providers/screencast_session.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/koruvision/scaling.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/nlp2imgl/__init__.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/src/nlp2imgl/control.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_activity_log.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_agent_backend_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_agent_backends.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_agent_backends_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_agent_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_agents.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autoloop_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_bridge.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_chat_activity_analyzer.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_chat_activity_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_chat_activity_text.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_chat_activity_tickets.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_drive_retry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_cycle_skip_conditions.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_daemon_metadata.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_diag_markers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_diagnostics.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_gillm_fallback.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_loop_runner.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_nlp2uri_drive.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_onboarding.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_operator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_operator_reload.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_operator_unsupported_ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_parser_detection.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_plugin_lifecycle.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_plugin_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_process_detection.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_process_guard.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_readiness.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_redrive_cooldown.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_scenarios.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_startup.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_submit_strategy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomous_up.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomy_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomy_env.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomy_environment.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomy_events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomy_policy_decision.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomy_prompts.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autonomy_strategy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_audit.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_cli_direct_drive.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_client_drive_errors.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_commands_drive.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_commands_handoff.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_commands_manage.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_commands_shutdown.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_commands_status.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_daemon.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_host_setup.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_jetbrains_scaffold.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_lane_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_plugin_installer.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_protocol.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_autopilot_socket_path.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_bootstrap.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_calibration_validator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_capture_host_template.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_chat_history.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cli_shim_builders.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_code2llm_discovery.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_command_catalog_store.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_command_picker.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_command_telemetry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_configurator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_configurator_toggle.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_autonomous_checkpoint_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_env_config_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_local_manager_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_planfile_queue_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_primitives.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_repairs_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_tasks_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_topology_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cqrs_wup_context.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_cycle_trace.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_dashboard_html.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_dashboard_projects_by_ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_dashboard_ticket_handlers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_dashboard_topology_post.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_decision_arbiter.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_decision_engine.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_decision_trace.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_deployment_events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_deps_autorepair.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_desktop_uri.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_dev_sync.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_docker_capture.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_docker_e2e.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_docker_ide_matrix.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_docker_ide_matrix_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_docs_ide_control_surfaces.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_doctor.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_doctor_facade.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_doctor_koru_auto_probe.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_doctor_reporting_checks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_dotenv_loader.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_drive_orchestrator.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_drive_repair_policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_e2e.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_env2llm_registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_env_config.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_env_flags.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_environment_profile.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_events.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_gate.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_gc.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_gc_cli_helpers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_gillm_ide_client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_gillm_recovery.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_git_attribution.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_git_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_healing_webhook_split.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_adapters.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_client_contract.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_command_catalog.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_doctor_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_operator_guidance.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_reload.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_router.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_status_systemmap.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ide_work.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_imgl_integration.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_init.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_injection_moved_to_gillm.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_install_checks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_install_manager.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_integration_ledger.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_interface_registry.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koru_browser_stack.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koru_gate_capture.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koru_queue_argv.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruapi.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruapi_transports.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_korudsl.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruide_bridges.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruide_client.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruide_daemon_handlers_ack.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruide_daemon_handlers_console_log.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruide_daemon_handlers_drive.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruide_daemon_handlers_hello.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruide_daemon_handlers_plugin_event.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruide_ports.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_korumesh_envelope.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_korumesh_store.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_korumesh_transport.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruobserve_diagnostics.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruobserve_lifecycle.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruvision_agent.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruvision_capture.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_koruvision_mesh.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_lane_plugin_matching.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_llm_reflect.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_llm_strategies.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_local_service.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_loop.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_mcp_provision.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_mcp_server.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_mcp_server_split.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_nlp2oql_bridge.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_nlp2uri_ide_control_gate.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_observability_dsl.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_observation_mesh_e2e.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_observe_providers_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_operator_pipeline.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_package_deduplication.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_planfile_queue.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_planning_llm.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_plugin_router.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_post_run_verify.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_provider_browser_upload.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_provider_obs.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_provider_portal_screencast.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_pyproject_metadata.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_queue_clean.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_queue_cli_helpers.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_redup_integration.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_refactor_planfile_handoff.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_reflection_policy.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_regix_taskfile.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_remote_control.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_replay_actions.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_run_log.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_runtime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_runtime_insights.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_scan.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_scan_phase.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_scan_split.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_screencast_session.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_self_control.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_semcod_tools.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_serve.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_shell_evidence.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_stdio_autonomous_jsonl.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_strategy_metadata_accessors.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_strategy_prompt.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_structured_report.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_sync_plugin_build.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_tasks.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_testql_bridge.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_ticket_evidence.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_tools.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_topology.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_topology_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_verification_cycle_integration.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_verification_engine.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_vision_interval_floor.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_vision_provider_mime.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_watch.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_cli.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_env_e2e.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_gui.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_ide.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_ide_extras.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_llx.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_project.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_templates.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/tests/test_wizard_tree.py +0 -0
- {koru-0.1.332 → koru-0.1.333}/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.333
|
|
4
4
|
Summary: Closed-loop automation across semcod/* repositories.
|
|
5
5
|
Author: Semcod
|
|
6
6
|
Author-email: Tom Sapletta <tom@sapletta.com>
|
|
@@ -156,13 +156,13 @@ Dynamic: license-file
|
|
|
156
156
|
|
|
157
157
|
## AI Cost Tracking
|
|
158
158
|
|
|
159
|
-
    
|
|
160
|
+
  
|
|
161
161
|
|
|
162
|
-
- 🤖 **LLM usage:** $
|
|
162
|
+
- 🤖 **LLM usage:** $26.3238 (439 commits)
|
|
163
163
|
- 👤 **Human dev:** ~$15021 (150.2h @ $100/h, 30min dedup)
|
|
164
164
|
|
|
165
|
-
Generated on 2026-06-
|
|
165
|
+
Generated on 2026-06-12 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
|
|
166
166
|
|
|
167
167
|
---
|
|
168
168
|
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
|
|
8
8
|
## AI Cost Tracking
|
|
9
9
|
|
|
10
|
-
    
|
|
11
|
+
  
|
|
12
12
|
|
|
13
|
-
- 🤖 **LLM usage:** $
|
|
13
|
+
- 🤖 **LLM usage:** $26.3238 (439 commits)
|
|
14
14
|
- 👤 **Human dev:** ~$15021 (150.2h @ $100/h, 30min dedup)
|
|
15
15
|
|
|
16
|
-
Generated on 2026-06-
|
|
16
|
+
Generated on 2026-06-12 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
@@ -281,15 +281,15 @@ 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:
|
|
284
|
+
def _build_plugin_socket_backend(client: IDEControlClient | None = None) -> AgentBackend:
|
|
285
285
|
if client is None:
|
|
286
286
|
raise ValueError("plugin_socket backend requires an IDEControlClient")
|
|
287
287
|
return PluginSocketBackend(client=client)
|
|
288
288
|
|
|
289
|
-
def _build_mcp_tool_backend(mcp_server: str | None) -> AgentBackend:
|
|
289
|
+
def _build_mcp_tool_backend(mcp_server: str | None = None) -> AgentBackend:
|
|
290
290
|
return McpToolBackend(mcp_server=mcp_server)
|
|
291
291
|
|
|
292
|
-
def _build_vendor_agent_cli_backend(shell_client_id: str | None) -> AgentBackend:
|
|
292
|
+
def _build_vendor_agent_cli_backend(shell_client_id: str | None = None) -> AgentBackend:
|
|
293
293
|
return TillmShellBackend(
|
|
294
294
|
client_id=shell_client_id or os.environ.get("KORU_TILLM_CLIENT", "aider"),
|
|
295
295
|
execute=os.environ.get("KORU_TILLM_DRY_RUN", "").strip().lower()
|
|
@@ -369,11 +369,11 @@ def build_agent_backend(
|
|
|
369
369
|
normalized = normalize_agent_backend_id(backend_id or "")
|
|
370
370
|
builder = _BACKEND_BUILDERS.get(bid) or _BACKEND_BUILDERS.get(normalized)
|
|
371
371
|
if builder:
|
|
372
|
-
if "client" in builder.__code__.co_varnames
|
|
372
|
+
if "client" in builder.__code__.co_varnames:
|
|
373
373
|
return builder(client=client)
|
|
374
|
-
elif "mcp_server" in builder.__code__.co_varnames
|
|
374
|
+
elif "mcp_server" in builder.__code__.co_varnames:
|
|
375
375
|
return builder(mcp_server=mcp_server)
|
|
376
|
-
elif "shell_client_id" in builder.__code__.co_varnames
|
|
376
|
+
elif "shell_client_id" in builder.__code__.co_varnames:
|
|
377
377
|
return builder(shell_client_id=shell_client_id)
|
|
378
378
|
elif "noop_reason" in builder.__code__.co_varnames:
|
|
379
379
|
return builder(noop_reason=noop_reason)
|
|
@@ -266,11 +266,13 @@ def try_vdisplay_control_fallback(
|
|
|
266
266
|
# Ensure session for audit/recovery when using vdisplay (addresses gap in auto runner not setting VDISPLAY_SESSION)
|
|
267
267
|
os.environ.setdefault("VDISPLAY_SESSION", "1")
|
|
268
268
|
try:
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
269
|
+
from koru.integrations.vdisplay_client import (
|
|
270
|
+
load_vql_metadata,
|
|
271
|
+
prepare_photo_vql_for_drive,
|
|
272
|
+
record_koru_drive_step,
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
observe = prepare_photo_vql_for_drive(ide=ide)
|
|
274
276
|
vql = load_vql_metadata()
|
|
275
277
|
vql_note = ""
|
|
276
278
|
if vql.get("ui_elements"):
|
|
@@ -279,6 +281,7 @@ def try_vdisplay_control_fallback(
|
|
|
279
281
|
reply = send_chat(prompt, ide=ide, submit=submit)
|
|
280
282
|
reply.setdefault("fallback_from", "plugin")
|
|
281
283
|
reply.setdefault("vql_context", vql.get("_source") or "loaded")
|
|
284
|
+
reply.setdefault("photo_vql_observe", observe)
|
|
282
285
|
if vql_note:
|
|
283
286
|
reply["vql_note"] = vql_note
|
|
284
287
|
# Record to vdisplay session for audit trail (P1)
|
|
@@ -99,8 +99,71 @@ def ask_openrouter_for_strategy_patch(
|
|
|
99
99
|
)
|
|
100
100
|
|
|
101
101
|
|
|
102
|
+
def call_openrouter_vision(
|
|
103
|
+
text_prompt: str,
|
|
104
|
+
image_data_url: str, # e.g. "data:image/png;base64,...."
|
|
105
|
+
*,
|
|
106
|
+
system_prompt: str = "You are a precise desktop automation agent. Given a screenshot and VQL UI description, decide the best action. Return ONLY valid minified JSON with keys: click_center (dict with int x,y), strategy (short string), confidence (float 0-1), reason (short string).",
|
|
107
|
+
model: str | None = None,
|
|
108
|
+
api_key: str | None = None,
|
|
109
|
+
timeout_seconds: float = 60.0,
|
|
110
|
+
) -> OpenRouterStrategyResponse:
|
|
111
|
+
"""Call OpenRouter with vision (image + text). For models that support image_url content."""
|
|
112
|
+
key = api_key or os.environ.get("OPENROUTER_API_KEY", "").strip()
|
|
113
|
+
if not key:
|
|
114
|
+
return OpenRouterStrategyResponse(
|
|
115
|
+
ok=False,
|
|
116
|
+
content="",
|
|
117
|
+
error="OPENROUTER_API_KEY is not set",
|
|
118
|
+
)
|
|
119
|
+
if model is None:
|
|
120
|
+
model = os.environ.get("LLM_MODEL", "google/gemini-flash-1.5")
|
|
121
|
+
# Normalize: some .env use "openrouter/..." prefix (for registry); OR API expects "provider/model"
|
|
122
|
+
if isinstance(model, str) and model.startswith("openrouter/"):
|
|
123
|
+
model = model.split("/", 1)[1]
|
|
124
|
+
messages = [
|
|
125
|
+
{"role": "system", "content": system_prompt},
|
|
126
|
+
{
|
|
127
|
+
"role": "user",
|
|
128
|
+
"content": [
|
|
129
|
+
{"type": "text", "text": text_prompt},
|
|
130
|
+
{"type": "image_url", "image_url": {"url": image_data_url}},
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
]
|
|
134
|
+
payload = {
|
|
135
|
+
"model": model,
|
|
136
|
+
"messages": messages,
|
|
137
|
+
}
|
|
138
|
+
req = urllib.request.Request(
|
|
139
|
+
OPENROUTER_CHAT_COMPLETIONS_URL,
|
|
140
|
+
data=json.dumps(payload).encode("utf-8"),
|
|
141
|
+
headers={
|
|
142
|
+
"Authorization": f"Bearer {key}",
|
|
143
|
+
"Content-Type": "application/json",
|
|
144
|
+
**get_openrouter_headers(),
|
|
145
|
+
},
|
|
146
|
+
method="POST",
|
|
147
|
+
)
|
|
148
|
+
try:
|
|
149
|
+
with urllib.request.urlopen(req, timeout=timeout_seconds) as resp: # noqa: S310
|
|
150
|
+
data = json.loads(resp.read().decode("utf-8"))
|
|
151
|
+
except OSError as exc:
|
|
152
|
+
return OpenRouterStrategyResponse(ok=False, content="", error=str(exc))
|
|
153
|
+
try:
|
|
154
|
+
content = str(data["choices"][0]["message"]["content"])
|
|
155
|
+
except (KeyError, IndexError, TypeError) as exc:
|
|
156
|
+
return OpenRouterStrategyResponse(
|
|
157
|
+
ok=False,
|
|
158
|
+
content="",
|
|
159
|
+
error=f"unexpected OpenRouter response: {exc}",
|
|
160
|
+
)
|
|
161
|
+
return OpenRouterStrategyResponse(ok=True, content=content)
|
|
162
|
+
|
|
163
|
+
|
|
102
164
|
__all__ = [
|
|
103
165
|
"OpenRouterStrategyResponse",
|
|
104
166
|
"ask_openrouter_for_strategy_patch",
|
|
105
167
|
"call_openrouter_json",
|
|
168
|
+
"call_openrouter_vision",
|
|
106
169
|
]
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"""Session-scoped autonomy artifacts under ``.vdisplay/YYYY-MM-DD/**``.
|
|
2
|
+
|
|
3
|
+
Each koru photo-VQL drive gets its own folder with observe → decide → act → verify
|
|
4
|
+
JSON sidecars so inference never mixes stale global captures with the current run.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
import time
|
|
12
|
+
from datetime import datetime, timezone
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def metadata_root() -> Path:
|
|
18
|
+
return Path(os.environ.get("VDISPLAY_METADATA_DIR", ".vdisplay")).expanduser()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def vql_max_age_seconds() -> float:
|
|
22
|
+
raw = os.environ.get("KORU_VDISPLAY_VQL_MAX_AGE_S", "300").strip()
|
|
23
|
+
try:
|
|
24
|
+
return max(0.0, float(raw))
|
|
25
|
+
except ValueError:
|
|
26
|
+
return 300.0
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def active_session_dir() -> Path | None:
|
|
30
|
+
raw = os.environ.get("KORU_AUTONOMY_SESSION_DIR", "").strip()
|
|
31
|
+
if not raw:
|
|
32
|
+
return None
|
|
33
|
+
path = Path(raw).expanduser()
|
|
34
|
+
return path if path.is_dir() else None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def session_observe_paths(session_dir: Path | None = None) -> tuple[Path, Path]:
|
|
38
|
+
root = session_dir or active_session_dir()
|
|
39
|
+
if root is None:
|
|
40
|
+
raise RuntimeError("no active autonomy session")
|
|
41
|
+
observe = root / "observe"
|
|
42
|
+
observe.mkdir(parents=True, exist_ok=True)
|
|
43
|
+
png = observe / "capture.png"
|
|
44
|
+
vql = observe / "capture.png.vql.json"
|
|
45
|
+
return png, vql
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def begin_autonomy_session(*, ide: str, source: str) -> Path:
|
|
49
|
+
"""Create ``.vdisplay/YYYY-MM-DD/ISO__koru-{ide}/`` and pin env for this run."""
|
|
50
|
+
existing = active_session_dir()
|
|
51
|
+
if existing is not None:
|
|
52
|
+
return existing
|
|
53
|
+
|
|
54
|
+
now = datetime.now(timezone.utc)
|
|
55
|
+
date_dir = metadata_root() / now.strftime("%Y-%m-%d")
|
|
56
|
+
ts = now.strftime("%Y-%m-%dT%H-%M-%SZ")
|
|
57
|
+
slug = (ide or "auto").strip().lower().replace(" ", "-")[:32] or "auto"
|
|
58
|
+
session_dir = date_dir / f"{ts}__koru-{slug}"
|
|
59
|
+
session_dir.mkdir(parents=True, exist_ok=True)
|
|
60
|
+
for sub in ("observe", "decide", "act", "verify"):
|
|
61
|
+
(session_dir / sub).mkdir(exist_ok=True)
|
|
62
|
+
|
|
63
|
+
manifest = {
|
|
64
|
+
"kind": "koru-autonomy-session",
|
|
65
|
+
"started_at": now.isoformat(),
|
|
66
|
+
"ide": ide,
|
|
67
|
+
"source": source,
|
|
68
|
+
"observe_dir": "observe",
|
|
69
|
+
"decide_dir": "decide",
|
|
70
|
+
"act_dir": "act",
|
|
71
|
+
"verify_dir": "verify",
|
|
72
|
+
"vql_max_age_s": vql_max_age_seconds(),
|
|
73
|
+
}
|
|
74
|
+
(session_dir / "session.json").write_text(
|
|
75
|
+
json.dumps(manifest, indent=2, ensure_ascii=False),
|
|
76
|
+
encoding="utf-8",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
os.environ["KORU_AUTONOMY_SESSION_DIR"] = str(session_dir.resolve())
|
|
80
|
+
os.environ["VDISPLAY_SESSION_DIR"] = str(session_dir.resolve())
|
|
81
|
+
os.environ.setdefault("VDISPLAY_SESSION", "1")
|
|
82
|
+
os.environ.setdefault("VDISPLAY_SESSION_ID", f"koru-{slug}")
|
|
83
|
+
|
|
84
|
+
png, vql = session_observe_paths(session_dir)
|
|
85
|
+
os.environ["KORU_VDISPLAY_PHOTO_PATH"] = str(png.resolve())
|
|
86
|
+
os.environ["KORU_VDISPLAY_VQL_PATH"] = str(vql.resolve())
|
|
87
|
+
return session_dir
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def append_session_index(session_dir: Path, *, phase: str, name: str, ok: bool | None) -> None:
|
|
91
|
+
entry = {
|
|
92
|
+
"ts": datetime.now(timezone.utc).isoformat(),
|
|
93
|
+
"phase": phase,
|
|
94
|
+
"name": name,
|
|
95
|
+
"ok": ok,
|
|
96
|
+
}
|
|
97
|
+
index_path = session_dir / "index.jsonl"
|
|
98
|
+
with index_path.open("a", encoding="utf-8") as fh:
|
|
99
|
+
fh.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def find_latest_koru_session(*, ide: str = "jetbrains", root: Path | None = None) -> Path | None:
|
|
103
|
+
"""Newest ``.vdisplay/YYYY-MM-DD/*__koru-{ide}/`` with act/decide artifacts if possible."""
|
|
104
|
+
base = root or metadata_root()
|
|
105
|
+
if not base.is_dir():
|
|
106
|
+
return None
|
|
107
|
+
slug = (ide or "jetbrains").strip().lower().replace(" ", "-")[:32]
|
|
108
|
+
pattern = f"*__koru-{slug}"
|
|
109
|
+
candidates: list[Path] = []
|
|
110
|
+
for child in base.iterdir():
|
|
111
|
+
if not child.is_dir():
|
|
112
|
+
continue
|
|
113
|
+
candidates.extend(p for p in child.glob(pattern) if p.is_dir())
|
|
114
|
+
if not candidates:
|
|
115
|
+
return None
|
|
116
|
+
with_artifacts = [
|
|
117
|
+
p
|
|
118
|
+
for p in candidates
|
|
119
|
+
if (p / "act" / "drive_result.json").is_file()
|
|
120
|
+
or (p / "decide" / "vql_chat_target_selected.json").is_file()
|
|
121
|
+
]
|
|
122
|
+
pool = with_artifacts if with_artifacts else candidates
|
|
123
|
+
pool.sort(key=lambda p: p.stat().st_mtime, reverse=True)
|
|
124
|
+
return pool[0]
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def append_session_jsonl(session_dir: Path, rel_path: str, entry: dict[str, Any]) -> Path:
|
|
128
|
+
"""Append one JSON line under the session (e.g. act/cursor_positioning.jsonl)."""
|
|
129
|
+
path = session_dir / rel_path
|
|
130
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
131
|
+
payload = {**entry, "ts": datetime.now(timezone.utc).isoformat()}
|
|
132
|
+
with path.open("a", encoding="utf-8") as fh:
|
|
133
|
+
fh.write(json.dumps(payload, ensure_ascii=False, default=str) + "\n")
|
|
134
|
+
return path
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def persist_autonomy_phase(
|
|
138
|
+
session_dir: Path,
|
|
139
|
+
phase: str,
|
|
140
|
+
name: str,
|
|
141
|
+
payload: dict[str, Any],
|
|
142
|
+
) -> Path:
|
|
143
|
+
phase_dir = session_dir / phase
|
|
144
|
+
phase_dir.mkdir(parents=True, exist_ok=True)
|
|
145
|
+
path = phase_dir / f"{name}.json"
|
|
146
|
+
path.write_text(json.dumps(payload, indent=2, ensure_ascii=False, default=str), encoding="utf-8")
|
|
147
|
+
append_session_index(session_dir, phase=phase, name=name, ok=payload.get("ok"))
|
|
148
|
+
return path
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def vql_sidecar_is_stale(
|
|
152
|
+
vql_path: Path,
|
|
153
|
+
png_path: Path | None,
|
|
154
|
+
*,
|
|
155
|
+
ide: str = "auto",
|
|
156
|
+
layer_count: int | None = None,
|
|
157
|
+
window_mismatch: dict[str, Any] | None = None,
|
|
158
|
+
capture_validation: dict[str, Any] | None = None,
|
|
159
|
+
) -> tuple[bool, dict[str, Any]]:
|
|
160
|
+
"""Return (stale, diagnostics). Stale sidecars must not feed decide/act."""
|
|
161
|
+
reasons: list[str] = []
|
|
162
|
+
now = time.time()
|
|
163
|
+
max_age = vql_max_age_seconds()
|
|
164
|
+
|
|
165
|
+
if not vql_path.is_file():
|
|
166
|
+
return True, {"stale": True, "reasons": ["missing_vql"], "vql_path": str(vql_path)}
|
|
167
|
+
|
|
168
|
+
vql_mt = vql_path.stat().st_mtime
|
|
169
|
+
age_s = now - vql_mt
|
|
170
|
+
info: dict[str, Any] = {
|
|
171
|
+
"stale": False,
|
|
172
|
+
"reasons": reasons,
|
|
173
|
+
"vql_path": str(vql_path.resolve()),
|
|
174
|
+
"vql_mtime": vql_mt,
|
|
175
|
+
"age_s": round(age_s, 2),
|
|
176
|
+
"max_age_s": max_age,
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if capture_validation is None:
|
|
180
|
+
try:
|
|
181
|
+
import json
|
|
182
|
+
|
|
183
|
+
data = json.loads(vql_path.read_text(encoding="utf-8"))
|
|
184
|
+
meta = data.get("metadata") if isinstance(data.get("metadata"), dict) else {}
|
|
185
|
+
cv = meta.get("capture_validation")
|
|
186
|
+
if isinstance(cv, dict):
|
|
187
|
+
capture_validation = cv
|
|
188
|
+
except Exception:
|
|
189
|
+
capture_validation = None
|
|
190
|
+
|
|
191
|
+
if max_age > 0 and age_s > max_age:
|
|
192
|
+
reasons.append(f"vql_age_s>{max_age}")
|
|
193
|
+
|
|
194
|
+
if png_path is not None:
|
|
195
|
+
if not png_path.is_file():
|
|
196
|
+
reasons.append("missing_png")
|
|
197
|
+
else:
|
|
198
|
+
png_mt = png_path.stat().st_mtime
|
|
199
|
+
info["png_mtime"] = png_mt
|
|
200
|
+
info["png_path"] = str(png_path.resolve())
|
|
201
|
+
if max_age > 0 and (now - png_mt) > max_age:
|
|
202
|
+
reasons.append(f"png_age_s>{max_age}")
|
|
203
|
+
# Sidecar is written after screenshot — VQL mtime may be newer than PNG by seconds.
|
|
204
|
+
# Stale only when VQL is older than PNG (sidecar not regenerated for this capture).
|
|
205
|
+
if vql_mt + 2.0 < png_mt:
|
|
206
|
+
reasons.append("vql_sidecar_older_than_png")
|
|
207
|
+
elif png_mt > vql_mt + 600.0:
|
|
208
|
+
reasons.append("png_newer_than_vql_by_600s")
|
|
209
|
+
|
|
210
|
+
if layer_count is not None and layer_count == 0:
|
|
211
|
+
reasons.append("empty_vql_layers")
|
|
212
|
+
|
|
213
|
+
if window_mismatch is not None:
|
|
214
|
+
reasons.append("ide_window_mismatch")
|
|
215
|
+
info["ide_window_warning"] = window_mismatch
|
|
216
|
+
elif isinstance(capture_validation, dict):
|
|
217
|
+
info["capture_validation"] = capture_validation
|
|
218
|
+
cv_reasons = capture_validation.get("reasons") or []
|
|
219
|
+
expected = str(capture_validation.get("expected_ide") or "").strip()
|
|
220
|
+
if expected and capture_validation.get("capture_confirmed") is False:
|
|
221
|
+
reasons.append("capture_validation_failed")
|
|
222
|
+
for item in cv_reasons:
|
|
223
|
+
if item not in reasons:
|
|
224
|
+
reasons.append(str(item))
|
|
225
|
+
|
|
226
|
+
info["stale"] = bool(reasons)
|
|
227
|
+
info["reasons"] = reasons
|
|
228
|
+
return bool(reasons), info
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def copy_observe_artifacts_to_session(
|
|
232
|
+
session_dir: Path,
|
|
233
|
+
*,
|
|
234
|
+
png: Path,
|
|
235
|
+
vql: Path,
|
|
236
|
+
) -> dict[str, str]:
|
|
237
|
+
"""Copy fresh capture + sidecars into session observe/ and pin env paths."""
|
|
238
|
+
dest_png, dest_vql = session_observe_paths(session_dir)
|
|
239
|
+
if png.resolve() != dest_png.resolve() and png.is_file():
|
|
240
|
+
dest_png.write_bytes(png.read_bytes())
|
|
241
|
+
if vql.resolve() != dest_vql.resolve() and vql.is_file():
|
|
242
|
+
dest_vql.write_text(vql.read_text(encoding="utf-8"), encoding="utf-8")
|
|
243
|
+
|
|
244
|
+
ctx = png.with_suffix(png.suffix + ".context.json")
|
|
245
|
+
dest_ctx = dest_png.with_suffix(dest_png.suffix + ".context.json")
|
|
246
|
+
if ctx.is_file() and ctx.resolve() != dest_ctx.resolve():
|
|
247
|
+
dest_ctx.write_text(ctx.read_text(encoding="utf-8"), encoding="utf-8")
|
|
248
|
+
|
|
249
|
+
imgl = Path(str(vql).replace(".png.vql.json", ".png.vql.imgl.json"))
|
|
250
|
+
dest_imgl = Path(str(dest_vql).replace(".png.vql.json", ".png.vql.imgl.json"))
|
|
251
|
+
if imgl.is_file() and imgl.resolve() != dest_imgl.resolve():
|
|
252
|
+
dest_imgl.write_text(imgl.read_text(encoding="utf-8"), encoding="utf-8")
|
|
253
|
+
|
|
254
|
+
os.environ["KORU_VDISPLAY_PHOTO_PATH"] = str(dest_png.resolve())
|
|
255
|
+
os.environ["KORU_VDISPLAY_VQL_PATH"] = str(dest_vql.resolve())
|
|
256
|
+
return {"png": str(dest_png), "vql": str(dest_vql)}
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
__all__ = [
|
|
260
|
+
"active_session_dir",
|
|
261
|
+
"append_session_index",
|
|
262
|
+
"begin_autonomy_session",
|
|
263
|
+
"copy_observe_artifacts_to_session",
|
|
264
|
+
"metadata_root",
|
|
265
|
+
"persist_autonomy_phase",
|
|
266
|
+
"session_observe_paths",
|
|
267
|
+
"vql_max_age_seconds",
|
|
268
|
+
"vql_sidecar_is_stale",
|
|
269
|
+
"append_session_jsonl",
|
|
270
|
+
"find_latest_koru_session",
|
|
271
|
+
]
|