koru 0.1.332__tar.gz → 0.1.334__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.
Files changed (843) hide show
  1. {koru-0.1.332/src/koru.egg-info → koru-0.1.334}/PKG-INFO +6 -6
  2. {koru-0.1.332 → koru-0.1.334}/README.md +5 -5
  3. {koru-0.1.332 → koru-0.1.334}/pyproject.toml +1 -1
  4. {koru-0.1.332 → koru-0.1.334}/src/koru/agent_backend_runtime.py +6 -6
  5. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_gate.py +8 -5
  6. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy_strategy/openrouter.py +63 -0
  7. koru-0.1.334/src/koru/integrations/autonomy_session.py +264 -0
  8. koru-0.1.334/src/koru/integrations/vdisplay_client.py +4565 -0
  9. {koru-0.1.332 → koru-0.1.334/src/koru.egg-info}/PKG-INFO +6 -6
  10. {koru-0.1.332 → koru-0.1.334}/src/koru.egg-info/SOURCES.txt +2 -0
  11. koru-0.1.334/tests/test_photo_vql_drive.py +1043 -0
  12. koru-0.1.334/tests/test_vdisplay_control_fallback.py +383 -0
  13. koru-0.1.332/src/koru/integrations/vdisplay_client.py +0 -918
  14. koru-0.1.332/tests/test_vdisplay_control_fallback.py +0 -120
  15. {koru-0.1.332 → koru-0.1.334}/LICENSE +0 -0
  16. {koru-0.1.332 → koru-0.1.334}/MANIFEST.in +0 -0
  17. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/__init__.py +0 -0
  18. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/cli.py +0 -0
  19. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/cli_calibration.py +0 -0
  20. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/control.py +0 -0
  21. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/ecosystem.py +0 -0
  22. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/ide_detection.py +0 -0
  23. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/__init__.py +0 -0
  24. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/commands.py +0 -0
  25. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/diagnostics.py +0 -0
  26. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/domain.py +0 -0
  27. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/events.py +0 -0
  28. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/pipeline.py +0 -0
  29. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/projector.py +0 -0
  30. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/query.py +0 -0
  31. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/registry.py +0 -0
  32. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/runtime.py +0 -0
  33. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/service.py +0 -0
  34. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair/store.py +0 -0
  35. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/repair_registry.py +0 -0
  36. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/__init__.py +0 -0
  37. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/cli.py +0 -0
  38. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/daemon_ctl.py +0 -0
  39. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/editor_cli.py +0 -0
  40. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/http_handlers.py +0 -0
  41. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/http_server.py +0 -0
  42. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/http_util.py +0 -0
  43. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/models.py +0 -0
  44. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/paths.py +0 -0
  45. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/probe.py +0 -0
  46. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/registry.py +0 -0
  47. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/service.py +0 -0
  48. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/socket_path.py +0 -0
  49. {koru-0.1.332 → koru-0.1.334}/packages/coru/src/coru/supervisor/systemd_unit.py +0 -0
  50. {koru-0.1.332 → koru-0.1.334}/schemas/koru-stdio-event.schema.json +0 -0
  51. {koru-0.1.332 → koru-0.1.334}/setup.cfg +0 -0
  52. {koru-0.1.332 → koru-0.1.334}/src/env2llm/__init__.py +0 -0
  53. {koru-0.1.332 → koru-0.1.334}/src/env2llm/integrators/__init__.py +0 -0
  54. {koru-0.1.332 → koru-0.1.334}/src/env2llm/integrators/_service_factory.py +0 -0
  55. {koru-0.1.332 → koru-0.1.334}/src/env2llm/probes/testql.py +0 -0
  56. {koru-0.1.332 → koru-0.1.334}/src/env2llm/service/__init__.py +0 -0
  57. {koru-0.1.332 → koru-0.1.334}/src/env2llm/service/registry_service.py +0 -0
  58. {koru-0.1.332 → koru-0.1.334}/src/imgl/__init__.py +0 -0
  59. {koru-0.1.332 → koru-0.1.334}/src/imgl/autodiag.py +0 -0
  60. {koru-0.1.332 → koru-0.1.334}/src/imgl/freshness.py +0 -0
  61. {koru-0.1.332 → koru-0.1.334}/src/koru/__init__.py +0 -0
  62. {koru-0.1.332 → koru-0.1.334}/src/koru/__main__.py +0 -0
  63. {koru-0.1.332 → koru-0.1.334}/src/koru/activity_log.py +0 -0
  64. {koru-0.1.332 → koru-0.1.334}/src/koru/agent_backends.py +0 -0
  65. {koru-0.1.332 → koru-0.1.334}/src/koru/agent_cli_helpers.py +0 -0
  66. {koru-0.1.332 → koru-0.1.334}/src/koru/agents.py +0 -0
  67. {koru-0.1.332 → koru-0.1.334}/src/koru/api/__init__.py +0 -0
  68. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.29.vsix +0 -0
  69. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.30.vsix +0 -0
  70. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.32.vsix +0 -0
  71. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.35.vsix +0 -0
  72. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.36.vsix +0 -0
  73. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.38.vsix +0 -0
  74. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.39.vsix +0 -0
  75. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.40.vsix +0 -0
  76. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.41.vsix +0 -0
  77. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.42.vsix +0 -0
  78. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.43.vsix +0 -0
  79. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.44.vsix +0 -0
  80. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.45.vsix +0 -0
  81. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.46.vsix +0 -0
  82. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.55.vsix +0 -0
  83. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.56.vsix +0 -0
  84. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.1.57.vsix +0 -0
  85. {koru-0.1.332 → koru-0.1.334}/src/koru/assets/koru-autopilot-vscode/koru-autopilot-0.2.0.vsix +0 -0
  86. {koru-0.1.332 → koru-0.1.334}/src/koru/autoloop_cli.py +0 -0
  87. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous.py +0 -0
  88. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_auto_pipeline.py +0 -0
  89. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_checkpoint.py +0 -0
  90. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cli_config.py +0 -0
  91. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle.py +0 -0
  92. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_bridge.py +0 -0
  93. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_chat_activity.py +0 -0
  94. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_chat_activity_analyzer.py +0 -0
  95. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_chat_activity_config.py +0 -0
  96. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_chat_activity_text.py +0 -0
  97. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_chat_activity_tickets.py +0 -0
  98. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_common.py +0 -0
  99. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_config.py +0 -0
  100. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_drive_outcome.py +0 -0
  101. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_drive_retry.py +0 -0
  102. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_orchestrator.py +0 -0
  103. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_post_drive.py +0 -0
  104. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_cycle_skip_conditions.py +0 -0
  105. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_daemon.py +0 -0
  106. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_diag_markers.py +0 -0
  107. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_diagnostics.py +0 -0
  108. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_drive_retry_policy.py +0 -0
  109. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_env.py +0 -0
  110. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_loop_runner.py +0 -0
  111. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_onboarding.py +0 -0
  112. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_operator.py +0 -0
  113. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_parser.py +0 -0
  114. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_plugin.py +0 -0
  115. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_plugin_lifecycle.py +0 -0
  116. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_plugin_runtime.py +0 -0
  117. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_plugin_wait.py +0 -0
  118. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_process_guard.py +0 -0
  119. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_processes.py +0 -0
  120. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_readiness.py +0 -0
  121. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_resources.py +0 -0
  122. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_runtime.py +0 -0
  123. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_startup.py +0 -0
  124. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_submit_strategy.py +0 -0
  125. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_up.py +0 -0
  126. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomous_wup.py +0 -0
  127. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/__init__.py +0 -0
  128. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/code2llm_discovery.py +0 -0
  129. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/config.py +0 -0
  130. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/cycle_finalize.py +0 -0
  131. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/cycle_trace.py +0 -0
  132. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/decision_arbiter.py +0 -0
  133. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/decision_trace.py +0 -0
  134. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/env.py +0 -0
  135. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/environment.py +0 -0
  136. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/events.py +0 -0
  137. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/heal.py +0 -0
  138. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/ide_operator_guidance.py +0 -0
  139. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/ide_work.py +0 -0
  140. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/operator_pipeline.py +0 -0
  141. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/__init__.py +0 -0
  142. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/contexts.py +0 -0
  143. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/drive_phase.py +0 -0
  144. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/queue_phase.py +0 -0
  145. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/scan_phase.py +0 -0
  146. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/sleep_phase.py +0 -0
  147. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/startup_phase.py +0 -0
  148. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/utils.py +0 -0
  149. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/phases/verify_phase.py +0 -0
  150. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/planfile_handoff.py +0 -0
  151. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/planning_llm.py +0 -0
  152. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/planning_llm_budget.py +0 -0
  153. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/planning_llm_parsing.py +0 -0
  154. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/planning_llm_prompts.py +0 -0
  155. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/planning_llm_runtime.py +0 -0
  156. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/planning_llm_types.py +0 -0
  157. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/policy_decision.py +0 -0
  158. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/post_run_verify.py +0 -0
  159. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/prompts.py +0 -0
  160. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/reflection_policy.py +0 -0
  161. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/replay_actions.py +0 -0
  162. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/replay_builders.py +0 -0
  163. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/replay_execution.py +0 -0
  164. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/replay_handlers.py +0 -0
  165. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/replay_parser.py +0 -0
  166. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/replay_quick_actions.py +0 -0
  167. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/replay_types.py +0 -0
  168. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/state.py +0 -0
  169. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/structured_report.py +0 -0
  170. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/telemetry_snapshot.py +0 -0
  171. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy/verification_engine.py +0 -0
  172. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy_strategy/__init__.py +0 -0
  173. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy_strategy/config.py +0 -0
  174. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy_strategy/defaults.py +0 -0
  175. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy_strategy/heuristics.py +0 -0
  176. {koru-0.1.332 → koru-0.1.334}/src/koru/autonomy_strategy/prompts.py +0 -0
  177. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/__init__.py +0 -0
  178. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/audit.py +0 -0
  179. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/calibrate_cli.py +0 -0
  180. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/cli_command.py +0 -0
  181. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/cli_direct_drive.py +0 -0
  182. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/cli_parser.py +0 -0
  183. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/cli_snapshot.py +0 -0
  184. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/cli_trace.py +0 -0
  185. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/client.py +0 -0
  186. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/commands/__init__.py +0 -0
  187. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/commands/drive.py +0 -0
  188. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/commands/handoff.py +0 -0
  189. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/commands/manage.py +0 -0
  190. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/commands/shutdown.py +0 -0
  191. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/commands/status.py +0 -0
  192. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/config.py +0 -0
  193. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/daemon.py +0 -0
  194. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/daemon_cli.py +0 -0
  195. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/doctor_cli.py +0 -0
  196. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/drive_repair_policy.py +0 -0
  197. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/host_setup.py +0 -0
  198. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/ide.py +0 -0
  199. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/injector.py +0 -0
  200. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/install_checks.py +0 -0
  201. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/install_manager.py +0 -0
  202. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/install_plugin_cli.py +0 -0
  203. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/lane_context.py +0 -0
  204. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/local_manager.py +0 -0
  205. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/log_contract.py +0 -0
  206. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/os_injector.py +0 -0
  207. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/plugin_installer.py +0 -0
  208. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/protocol.py +0 -0
  209. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/systemd_cli.py +0 -0
  210. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/tail_cli.py +0 -0
  211. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/utils/__init__.py +0 -0
  212. {koru-0.1.332 → koru-0.1.334}/src/koru/autopilot/utils/client_helpers.py +0 -0
  213. {koru-0.1.332 → koru-0.1.334}/src/koru/bootstrap.py +0 -0
  214. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/__init__.py +0 -0
  215. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/autonomous_checkpoint/__init__.py +0 -0
  216. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/autonomous_checkpoint/application.py +0 -0
  217. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/autonomous_checkpoint/commands/__init__.py +0 -0
  218. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/autonomous_checkpoint/events/__init__.py +0 -0
  219. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/autonomous_checkpoint/queries/__init__.py +0 -0
  220. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/autonomous_checkpoint/read_model.py +0 -0
  221. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/env_config/__init__.py +0 -0
  222. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/env_config/application.py +0 -0
  223. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/env_config/commands/__init__.py +0 -0
  224. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/env_config/events/__init__.py +0 -0
  225. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/env_config/queries/__init__.py +0 -0
  226. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/env_config/read_model.py +0 -0
  227. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/local_manager/__init__.py +0 -0
  228. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/local_manager/application.py +0 -0
  229. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/local_manager/commands/__init__.py +0 -0
  230. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/local_manager/events/__init__.py +0 -0
  231. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/local_manager/queries/__init__.py +0 -0
  232. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/local_manager/read_model.py +0 -0
  233. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/planfile_queue/__init__.py +0 -0
  234. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/planfile_queue/application.py +0 -0
  235. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/planfile_queue/commands/__init__.py +0 -0
  236. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/planfile_queue/events/__init__.py +0 -0
  237. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/planfile_queue/queries/__init__.py +0 -0
  238. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/planfile_queue/read_model.py +0 -0
  239. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/repairs/__init__.py +0 -0
  240. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/repairs/application.py +0 -0
  241. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/repairs/commands/__init__.py +0 -0
  242. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/repairs/events/__init__.py +0 -0
  243. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/repairs/queries/__init__.py +0 -0
  244. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/repairs/read_model.py +0 -0
  245. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/tasks/__init__.py +0 -0
  246. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/tasks/application.py +0 -0
  247. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/tasks/commands/__init__.py +0 -0
  248. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/tasks/events/__init__.py +0 -0
  249. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/tasks/queries/__init__.py +0 -0
  250. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/tasks/read_model.py +0 -0
  251. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/topology/__init__.py +0 -0
  252. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/topology/application.py +0 -0
  253. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/topology/commands/__init__.py +0 -0
  254. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/topology/events/__init__.py +0 -0
  255. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/topology/queries/__init__.py +0 -0
  256. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/topology/read_model.py +0 -0
  257. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/wup/__init__.py +0 -0
  258. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/wup/application.py +0 -0
  259. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/wup/commands/__init__.py +0 -0
  260. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/wup/events/__init__.py +0 -0
  261. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/wup/queries/__init__.py +0 -0
  262. {koru-0.1.332 → koru-0.1.334}/src/koru/bounded_contexts/wup/read_model.py +0 -0
  263. {koru-0.1.332 → koru-0.1.334}/src/koru/cli/__init__.py +0 -0
  264. {koru-0.1.332 → koru-0.1.334}/src/koru/cli/__main__.py +0 -0
  265. {koru-0.1.332 → koru-0.1.334}/src/koru/cli/commands.py +0 -0
  266. {koru-0.1.332 → koru-0.1.334}/src/koru/cli/parsers.py +0 -0
  267. {koru-0.1.332 → koru-0.1.334}/src/koru/cli.py +0 -0
  268. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_agent.py +0 -0
  269. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_agent_backends.py +0 -0
  270. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_auto.py +0 -0
  271. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_bootstrap.py +0 -0
  272. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_cleaned.py +0 -0
  273. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_context.py +0 -0
  274. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_doctor.py +0 -0
  275. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_events.py +0 -0
  276. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_gate.py +0 -0
  277. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_gc.py +0 -0
  278. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_ide.py +0 -0
  279. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_ide_router.py +0 -0
  280. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_imgl.py +0 -0
  281. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_init.py +0 -0
  282. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_local_serve.py +0 -0
  283. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_loop.py +0 -0
  284. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_parser.py +0 -0
  285. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_queue.py +0 -0
  286. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_refactor_planfile_handoff.py +0 -0
  287. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_replay.py +0 -0
  288. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_runtime_context.py +0 -0
  289. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_scan.py +0 -0
  290. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_self.py +0 -0
  291. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_serve.py +0 -0
  292. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_shim_builders.py +0 -0
  293. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_strategy.py +0 -0
  294. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_tagi.py +0 -0
  295. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_task.py +0 -0
  296. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_tools.py +0 -0
  297. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_topology.py +0 -0
  298. {koru-0.1.332 → koru-0.1.334}/src/koru/cli_watch.py +0 -0
  299. {koru-0.1.332 → koru-0.1.334}/src/koru/configurator.py +0 -0
  300. {koru-0.1.332 → koru-0.1.334}/src/koru/context.py +0 -0
  301. {koru-0.1.332 → koru-0.1.334}/src/koru/context_render.py +0 -0
  302. {koru-0.1.332 → koru-0.1.334}/src/koru/control_commands.py +0 -0
  303. {koru-0.1.332 → koru-0.1.334}/src/koru/cqrs/__init__.py +0 -0
  304. {koru-0.1.332 → koru-0.1.334}/src/koru/cqrs/domain_event.py +0 -0
  305. {koru-0.1.332 → koru-0.1.334}/src/koru/cqrs/event_bus.py +0 -0
  306. {koru-0.1.332 → koru-0.1.334}/src/koru/cqrs/event_log_projection.py +0 -0
  307. {koru-0.1.332 → koru-0.1.334}/src/koru/cqrs/event_log_query.py +0 -0
  308. {koru-0.1.332 → koru-0.1.334}/src/koru/cqrs/event_store.py +0 -0
  309. {koru-0.1.332 → koru-0.1.334}/src/koru/data/koru-interface-registry.yaml +0 -0
  310. {koru-0.1.332 → koru-0.1.334}/src/koru/decision_engine.py +0 -0
  311. {koru-0.1.332 → koru-0.1.334}/src/koru/deployment_events/__init__.py +0 -0
  312. {koru-0.1.332 → koru-0.1.334}/src/koru/deployment_events/analyzer.py +0 -0
  313. {koru-0.1.332 → koru-0.1.334}/src/koru/deployment_events/batch.py +0 -0
  314. {koru-0.1.332 → koru-0.1.334}/src/koru/deployment_events/emitter.py +0 -0
  315. {koru-0.1.332 → koru-0.1.334}/src/koru/deployment_events/enums.py +0 -0
  316. {koru-0.1.332 → koru-0.1.334}/src/koru/deployment_events/models.py +0 -0
  317. {koru-0.1.332 → koru-0.1.334}/src/koru/deps_autorepair.py +0 -0
  318. {koru-0.1.332 → koru-0.1.334}/src/koru/dev_sync.py +0 -0
  319. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor.py +0 -0
  320. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_autonomous_streams.py +0 -0
  321. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_autopilot_checks.py +0 -0
  322. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_autopilot_debug.py +0 -0
  323. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_chat_control.py +0 -0
  324. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_constants.py +0 -0
  325. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_models.py +0 -0
  326. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_plugin_bundle.py +0 -0
  327. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_plugin_console.py +0 -0
  328. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_project_checks.py +0 -0
  329. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_project_health.py +0 -0
  330. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_registry_checks.py +0 -0
  331. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_render.py +0 -0
  332. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_reporting_checks.py +0 -0
  333. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_runner.py +0 -0
  334. {koru-0.1.332 → koru-0.1.334}/src/koru/doctor_runtime_checks.py +0 -0
  335. {koru-0.1.332 → koru-0.1.334}/src/koru/domain/env/__init__.py +0 -0
  336. {koru-0.1.332 → koru-0.1.334}/src/koru/dotenv_loader.py +0 -0
  337. {koru-0.1.332 → koru-0.1.334}/src/koru/dsl/__init__.py +0 -0
  338. {koru-0.1.332 → koru-0.1.334}/src/koru/env_config.py +0 -0
  339. {koru-0.1.332 → koru-0.1.334}/src/koru/env_flags.py +0 -0
  340. {koru-0.1.332 → koru-0.1.334}/src/koru/environment_profile.py +0 -0
  341. {koru-0.1.332 → koru-0.1.334}/src/koru/events.py +0 -0
  342. {koru-0.1.332 → koru-0.1.334}/src/koru/gate.py +0 -0
  343. {koru-0.1.332 → koru-0.1.334}/src/koru/gc.py +0 -0
  344. {koru-0.1.332 → koru-0.1.334}/src/koru/gc_cli_helpers.py +0 -0
  345. {koru-0.1.332 → koru-0.1.334}/src/koru/git_attribution.py +0 -0
  346. {koru-0.1.332 → koru-0.1.334}/src/koru/git_cli.py +0 -0
  347. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/__init__.py +0 -0
  348. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/base.py +0 -0
  349. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/bridge.py +0 -0
  350. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/gillm_client.py +0 -0
  351. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/gillm_recovery.py +0 -0
  352. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/ide_reload.py +0 -0
  353. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/registry.py +0 -0
  354. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/shared.py +0 -0
  355. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_adapters/vscode_family.py +0 -0
  356. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_client.py +0 -0
  357. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_control_cli.py +0 -0
  358. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_doctor_cli.py +0 -0
  359. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_router.py +0 -0
  360. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_runtime.py +0 -0
  361. {koru-0.1.332 → koru-0.1.334}/src/koru/ide_status_systemmap.py +0 -0
  362. {koru-0.1.332 → koru-0.1.334}/src/koru/init.py +0 -0
  363. {koru-0.1.332 → koru-0.1.334}/src/koru/init_host_environment.py +0 -0
  364. {koru-0.1.332 → koru-0.1.334}/src/koru/integration_ledger.py +0 -0
  365. {koru-0.1.332 → koru-0.1.334}/src/koru/integrations/__init__.py +0 -0
  366. {koru-0.1.332 → koru-0.1.334}/src/koru/integrations/imgl_autodiag.py +0 -0
  367. {koru-0.1.332 → koru-0.1.334}/src/koru/integrations/imgl_client.py +0 -0
  368. {koru-0.1.332 → koru-0.1.334}/src/koru/interface_registry.py +0 -0
  369. {koru-0.1.332 → koru-0.1.334}/src/koru/llm_reflect.py +0 -0
  370. {koru-0.1.332 → koru-0.1.334}/src/koru/local_manager_client.py +0 -0
  371. {koru-0.1.332 → koru-0.1.334}/src/koru/local_manager_state.py +0 -0
  372. {koru-0.1.332 → koru-0.1.334}/src/koru/local_service.py +0 -0
  373. {koru-0.1.332 → koru-0.1.334}/src/koru/loop.py +0 -0
  374. {koru-0.1.332 → koru-0.1.334}/src/koru/mcp_provision.py +0 -0
  375. {koru-0.1.332 → koru-0.1.334}/src/koru/mcp_server.py +0 -0
  376. {koru-0.1.332 → koru-0.1.334}/src/koru/observability_dsl.py +0 -0
  377. {koru-0.1.332 → koru-0.1.334}/src/koru/observability_events.py +0 -0
  378. {koru-0.1.332 → koru-0.1.334}/src/koru/observability_writer.py +0 -0
  379. {koru-0.1.332 → koru-0.1.334}/src/koru/planfile_queue.py +0 -0
  380. {koru-0.1.332 → koru-0.1.334}/src/koru/policy.py +0 -0
  381. {koru-0.1.332 → koru-0.1.334}/src/koru/project_pipeline.py +0 -0
  382. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/__init__.py +0 -0
  383. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/human.py +0 -0
  384. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/koru_queue_argv.py +0 -0
  385. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/local_manager.py +0 -0
  386. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/locking.py +0 -0
  387. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/loop.py +0 -0
  388. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/planfile_ticket_note.py +0 -0
  389. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/runner.py +0 -0
  390. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/runners.py +0 -0
  391. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/shell_evidence.py +0 -0
  392. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/ticket.py +0 -0
  393. {koru-0.1.332 → koru-0.1.334}/src/koru/queue/types.py +0 -0
  394. {koru-0.1.332 → koru-0.1.334}/src/koru/queue_clean.py +0 -0
  395. {koru-0.1.332 → koru-0.1.334}/src/koru/queue_cli_helpers.py +0 -0
  396. {koru-0.1.332 → koru-0.1.334}/src/koru/redup_integration.py +0 -0
  397. {koru-0.1.332 → koru-0.1.334}/src/koru/refactor_planfile_handoff.py +0 -0
  398. {koru-0.1.332 → koru-0.1.334}/src/koru/remote/__init__.py +0 -0
  399. {koru-0.1.332 → koru-0.1.334}/src/koru/remote/client.py +0 -0
  400. {koru-0.1.332 → koru-0.1.334}/src/koru/run_log.py +0 -0
  401. {koru-0.1.332 → koru-0.1.334}/src/koru/runtime.py +0 -0
  402. {koru-0.1.332 → koru-0.1.334}/src/koru/scan.py +0 -0
  403. {koru-0.1.332 → koru-0.1.334}/src/koru/scan_collection.py +0 -0
  404. {koru-0.1.332 → koru-0.1.334}/src/koru/scan_dedupe_policy.py +0 -0
  405. {koru-0.1.332 → koru-0.1.334}/src/koru/scan_render.py +0 -0
  406. {koru-0.1.332 → koru-0.1.334}/src/koru/scan_ticket_emission.py +0 -0
  407. {koru-0.1.332 → koru-0.1.334}/src/koru/scan_types.py +0 -0
  408. {koru-0.1.332 → koru-0.1.334}/src/koru/scripts/koru-autoloop.sh +0 -0
  409. {koru-0.1.332 → koru-0.1.334}/src/koru/self_control.py +0 -0
  410. {koru-0.1.332 → koru-0.1.334}/src/koru/semcod_tools.py +0 -0
  411. {koru-0.1.332 → koru-0.1.334}/src/koru/serve.py +0 -0
  412. {koru-0.1.332 → koru-0.1.334}/src/koru/stdio_events.py +0 -0
  413. {koru-0.1.332 → koru-0.1.334}/src/koru/tagi_integration.py +0 -0
  414. {koru-0.1.332 → koru-0.1.334}/src/koru/task_dedupe.py +0 -0
  415. {koru-0.1.332 → koru-0.1.334}/src/koru/task_intake.py +0 -0
  416. {koru-0.1.332 → koru-0.1.334}/src/koru/task_io.py +0 -0
  417. {koru-0.1.332 → koru-0.1.334}/src/koru/task_models.py +0 -0
  418. {koru-0.1.332 → koru-0.1.334}/src/koru/task_ticket.py +0 -0
  419. {koru-0.1.332 → koru-0.1.334}/src/koru/tasks.py +0 -0
  420. {koru-0.1.332 → koru-0.1.334}/src/koru/ticket_evidence.py +0 -0
  421. {koru-0.1.332 → koru-0.1.334}/src/koru/tillm_bridge.py +0 -0
  422. {koru-0.1.332 → koru-0.1.334}/src/koru/tools.py +0 -0
  423. {koru-0.1.332 → koru-0.1.334}/src/koru/topology.py +0 -0
  424. {koru-0.1.332 → koru-0.1.334}/src/koru/topology_cli.py +0 -0
  425. {koru-0.1.332 → koru-0.1.334}/src/koru/utils/__init__.py +0 -0
  426. {koru-0.1.332 → koru-0.1.334}/src/koru/utils/subprocess_runner.py +0 -0
  427. {koru-0.1.332 → koru-0.1.334}/src/koru/watch.py +0 -0
  428. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/__init__.py +0 -0
  429. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/cli.py +0 -0
  430. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/cli_main.py +0 -0
  431. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/gui/__init__.py +0 -0
  432. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/gui/app.py +0 -0
  433. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/gui/server.py +0 -0
  434. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/gui/session.py +0 -0
  435. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/gui/static/wizard.css +0 -0
  436. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/gui/static/wizard.js +0 -0
  437. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/gui/templates/wizard.html +0 -0
  438. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/ide.py +0 -0
  439. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/ide_install.py +0 -0
  440. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/llx.py +0 -0
  441. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/orchestrator.py +0 -0
  442. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/project.py +0 -0
  443. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/prompters.py +0 -0
  444. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/strategies.json +0 -0
  445. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/templates/cli-tool.json +0 -0
  446. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/templates/library.json +0 -0
  447. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/templates/ml-research.json +0 -0
  448. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/templates/registry.json +0 -0
  449. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/templates/web-app.json +0 -0
  450. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/templates.py +0 -0
  451. {koru-0.1.332 → koru-0.1.334}/src/koru/wizard/tree.py +0 -0
  452. {koru-0.1.332 → koru-0.1.334}/src/koru/wup_testql_compat.py +0 -0
  453. {koru-0.1.332 → koru-0.1.334}/src/koru.egg-info/dependency_links.txt +0 -0
  454. {koru-0.1.332 → koru-0.1.334}/src/koru.egg-info/entry_points.txt +0 -0
  455. {koru-0.1.332 → koru-0.1.334}/src/koru.egg-info/requires.txt +0 -0
  456. {koru-0.1.332 → koru-0.1.334}/src/koru.egg-info/top_level.txt +0 -0
  457. {koru-0.1.332 → koru-0.1.334}/src/koruapi/__init__.py +0 -0
  458. {koru-0.1.332 → koru-0.1.334}/src/koruapi/calibration_validator.py +0 -0
  459. {koru-0.1.332 → koru-0.1.334}/src/koruapi/cli.py +0 -0
  460. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard.py +0 -0
  461. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_config.py +0 -0
  462. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_context.py +0 -0
  463. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_html.py +0 -0
  464. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_http.py +0 -0
  465. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_observability.py +0 -0
  466. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_plugin_logs.py +0 -0
  467. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_projects.py +0 -0
  468. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_routes.py +0 -0
  469. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_runtime.py +0 -0
  470. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_serve.py +0 -0
  471. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_serve_utils.py +0 -0
  472. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_state.py +0 -0
  473. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_template.html +0 -0
  474. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_tickets.py +0 -0
  475. {koru-0.1.332 → koru-0.1.334}/src/koruapi/dashboard_topology.py +0 -0
  476. {koru-0.1.332 → koru-0.1.334}/src/koruapi/desktop_uri.py +0 -0
  477. {koru-0.1.332 → koru-0.1.334}/src/koruapi/env2llm_registry.py +0 -0
  478. {koru-0.1.332 → koru-0.1.334}/src/koruapi/integrations.py +0 -0
  479. {koru-0.1.332 → koru-0.1.334}/src/koruapi/invoke.py +0 -0
  480. {koru-0.1.332 → koru-0.1.334}/src/koruapi/invoke_handlers.py +0 -0
  481. {koru-0.1.332 → koru-0.1.334}/src/koruapi/local.py +0 -0
  482. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp.py +0 -0
  483. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server.py +0 -0
  484. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_cli.py +0 -0
  485. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_desktop_uri.py +0 -0
  486. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_dispatch.py +0 -0
  487. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_env2llm.py +0 -0
  488. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_ide.py +0 -0
  489. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_nlp2oql.py +0 -0
  490. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_planfile.py +0 -0
  491. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_runtime.py +0 -0
  492. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_schema.py +0 -0
  493. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_testql.py +0 -0
  494. {koru-0.1.332 → koru-0.1.334}/src/koruapi/mcp_server_transport.py +0 -0
  495. {koru-0.1.332 → koru-0.1.334}/src/koruapi/nlp2oql_bridge.py +0 -0
  496. {koru-0.1.332 → koru-0.1.334}/src/koruapi/openapi.py +0 -0
  497. {koru-0.1.332 → koru-0.1.334}/src/koruapi/runtime_insights.py +0 -0
  498. {koru-0.1.332 → koru-0.1.334}/src/koruapi/server.py +0 -0
  499. {koru-0.1.332 → koru-0.1.334}/src/koruapi/testql_bridge.py +0 -0
  500. {koru-0.1.332 → koru-0.1.334}/src/koruapi/topology_post.py +0 -0
  501. {koru-0.1.332 → koru-0.1.334}/src/korudsl/__init__.py +0 -0
  502. {koru-0.1.332 → koru-0.1.334}/src/korudsl/cli.py +0 -0
  503. {koru-0.1.332 → koru-0.1.334}/src/korudsl/library.py +0 -0
  504. {koru-0.1.332 → koru-0.1.334}/src/korudsl/transform.py +0 -0
  505. {koru-0.1.332 → koru-0.1.334}/src/koruide/__init__.py +0 -0
  506. {koru-0.1.332 → koru-0.1.334}/src/koruide/audit.py +0 -0
  507. {koru-0.1.332 → koru-0.1.334}/src/koruide/chat_history.py +0 -0
  508. {koru-0.1.332 → koru-0.1.334}/src/koruide/client.py +0 -0
  509. {koru-0.1.332 → koru-0.1.334}/src/koruide/command_catalog.py +0 -0
  510. {koru-0.1.332 → koru-0.1.334}/src/koruide/command_catalog_store.py +0 -0
  511. {koru-0.1.332 → koru-0.1.334}/src/koruide/command_picker.py +0 -0
  512. {koru-0.1.332 → koru-0.1.334}/src/koruide/command_scenario.py +0 -0
  513. {koru-0.1.332 → koru-0.1.334}/src/koruide/command_telemetry.py +0 -0
  514. {koru-0.1.332 → koru-0.1.334}/src/koruide/config.py +0 -0
  515. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/__init__.py +0 -0
  516. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/handlers.py +0 -0
  517. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/handlers_ack.py +0 -0
  518. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/handlers_drive.py +0 -0
  519. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/handlers_hello.py +0 -0
  520. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/handlers_plugin_event.py +0 -0
  521. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/metadata.py +0 -0
  522. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/protocol.py +0 -0
  523. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/server.py +0 -0
  524. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon/storage.py +0 -0
  525. {koru-0.1.332 → koru-0.1.334}/src/koruide/daemon_storage.py +0 -0
  526. {koru-0.1.332 → koru-0.1.334}/src/koruide/drive_orchestrator.py +0 -0
  527. {koru-0.1.332 → koru-0.1.334}/src/koruide/drive_policy.py +0 -0
  528. {koru-0.1.332 → koru-0.1.334}/src/koruide/host_setup.py +0 -0
  529. {koru-0.1.332 → koru-0.1.334}/src/koruide/ide.py +0 -0
  530. {koru-0.1.332 → koru-0.1.334}/src/koruide/ide_control.py +0 -0
  531. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/__init__.py +0 -0
  532. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/antigravity.py +0 -0
  533. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/base.py +0 -0
  534. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/cursor.py +0 -0
  535. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/fallback.py +0 -0
  536. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/jetbrains.py +0 -0
  537. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/registry.py +0 -0
  538. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/vscode.py +0 -0
  539. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/vscodium.py +0 -0
  540. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/windsurf.py +0 -0
  541. {koru-0.1.332 → koru-0.1.334}/src/koruide/ides/zed.py +0 -0
  542. {koru-0.1.332 → koru-0.1.334}/src/koruide/injector.py +0 -0
  543. {koru-0.1.332 → koru-0.1.334}/src/koruide/injector_backends.py +0 -0
  544. {koru-0.1.332 → koru-0.1.334}/src/koruide/injector_errors.py +0 -0
  545. {koru-0.1.332 → koru-0.1.334}/src/koruide/os_injector.py +0 -0
  546. {koru-0.1.332 → koru-0.1.334}/src/koruide/plugin_installer.py +0 -0
  547. {koru-0.1.332 → koru-0.1.334}/src/koruide/plugin_router.py +0 -0
  548. {koru-0.1.332 → koru-0.1.334}/src/koruide/plugin_version.py +0 -0
  549. {koru-0.1.332 → koru-0.1.334}/src/koruide/ports.py +0 -0
  550. {koru-0.1.332 → koru-0.1.334}/src/koruide/protocol.py +0 -0
  551. {koru-0.1.332 → koru-0.1.334}/src/koruide/socket.py +0 -0
  552. {koru-0.1.332 → koru-0.1.334}/src/koruide/strategy_prompt.py +0 -0
  553. {koru-0.1.332 → koru-0.1.334}/src/koruide/utils.py +0 -0
  554. {koru-0.1.332 → koru-0.1.334}/src/korullm/__init__.py +0 -0
  555. {koru-0.1.332 → koru-0.1.334}/src/korullm/strategies/__init__.py +0 -0
  556. {koru-0.1.332 → koru-0.1.334}/src/korullm/strategies/base.py +0 -0
  557. {koru-0.1.332 → koru-0.1.334}/src/korullm/strategies/claude.py +0 -0
  558. {koru-0.1.332 → koru-0.1.334}/src/korullm/strategies/codex.py +0 -0
  559. {koru-0.1.332 → koru-0.1.334}/src/korullm/strategies/gpt.py +0 -0
  560. {koru-0.1.332 → koru-0.1.334}/src/korullm/strategies/ide_chat.py +0 -0
  561. {koru-0.1.332 → koru-0.1.334}/src/korullm/strategies/ollama.py +0 -0
  562. {koru-0.1.332 → koru-0.1.334}/src/korullm/strategies/registry.py +0 -0
  563. {koru-0.1.332 → koru-0.1.334}/src/korumesh/__init__.py +0 -0
  564. {koru-0.1.332 → koru-0.1.334}/src/korumesh/browser_capture.py +0 -0
  565. {koru-0.1.332 → koru-0.1.334}/src/korumesh/cli.py +0 -0
  566. {koru-0.1.332 → koru-0.1.334}/src/korumesh/cli_commands.py +0 -0
  567. {koru-0.1.332 → koru-0.1.334}/src/korumesh/cli_parser.py +0 -0
  568. {koru-0.1.332 → koru-0.1.334}/src/korumesh/codec.py +0 -0
  569. {koru-0.1.332 → koru-0.1.334}/src/korumesh/dashboard.py +0 -0
  570. {koru-0.1.332 → koru-0.1.334}/src/korumesh/dashboard_parse.py +0 -0
  571. {koru-0.1.332 → koru-0.1.334}/src/korumesh/envelope.py +0 -0
  572. {koru-0.1.332 → koru-0.1.334}/src/korumesh/grid_template.html +0 -0
  573. {koru-0.1.332 → koru-0.1.334}/src/korumesh/keys.py +0 -0
  574. {koru-0.1.332 → koru-0.1.334}/src/korumesh/store.py +0 -0
  575. {koru-0.1.332 → koru-0.1.334}/src/korumesh/store_persistence.py +0 -0
  576. {koru-0.1.332 → koru-0.1.334}/src/korumesh/transport.py +0 -0
  577. {koru-0.1.332 → koru-0.1.334}/src/koruobserve/__init__.py +0 -0
  578. {koru-0.1.332 → koru-0.1.334}/src/koruobserve/bootstrap.py +0 -0
  579. {koru-0.1.332 → koru-0.1.334}/src/koruobserve/cli.py +0 -0
  580. {koru-0.1.332 → koru-0.1.334}/src/koruobserve/cli_parser.py +0 -0
  581. {koru-0.1.332 → koru-0.1.334}/src/koruobserve/diagnostics.py +0 -0
  582. {koru-0.1.332 → koru-0.1.334}/src/koruobserve/lifecycle.py +0 -0
  583. {koru-0.1.332 → koru-0.1.334}/src/koruobserve/paths.py +0 -0
  584. {koru-0.1.332 → koru-0.1.334}/src/koruobserve/providers_cli.py +0 -0
  585. {koru-0.1.332 → koru-0.1.334}/src/koruos/__init__.py +0 -0
  586. {koru-0.1.332 → koru-0.1.334}/src/koruvision/__init__.py +0 -0
  587. {koru-0.1.332 → koru-0.1.334}/src/koruvision/agent.py +0 -0
  588. {koru-0.1.332 → koru-0.1.334}/src/koruvision/capture.py +0 -0
  589. {koru-0.1.332 → koru-0.1.334}/src/koruvision/capture_mss.py +0 -0
  590. {koru-0.1.332 → koru-0.1.334}/src/koruvision/capture_probe.py +0 -0
  591. {koru-0.1.332 → koru-0.1.334}/src/koruvision/cli.py +0 -0
  592. {koru-0.1.332 → koru-0.1.334}/src/koruvision/cli_parser.py +0 -0
  593. {koru-0.1.332 → koru-0.1.334}/src/koruvision/mesh.py +0 -0
  594. {koru-0.1.332 → koru-0.1.334}/src/koruvision/portal_capture.py +0 -0
  595. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/__init__.py +0 -0
  596. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/base.py +0 -0
  597. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/browser_getdisplay.py +0 -0
  598. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/cli_tools.py +0 -0
  599. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/detector.py +0 -0
  600. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/env.py +0 -0
  601. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/grim.py +0 -0
  602. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/mss.py +0 -0
  603. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/obs_websocket.py +0 -0
  604. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/portal_screencast.py +0 -0
  605. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/portal_screenshot.py +0 -0
  606. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/registry.py +0 -0
  607. {koru-0.1.332 → koru-0.1.334}/src/koruvision/providers/screencast_session.py +0 -0
  608. {koru-0.1.332 → koru-0.1.334}/src/koruvision/scaling.py +0 -0
  609. {koru-0.1.332 → koru-0.1.334}/src/nlp2imgl/__init__.py +0 -0
  610. {koru-0.1.332 → koru-0.1.334}/src/nlp2imgl/control.py +0 -0
  611. {koru-0.1.332 → koru-0.1.334}/tests/test_activity_log.py +0 -0
  612. {koru-0.1.332 → koru-0.1.334}/tests/test_agent_backend_runtime.py +0 -0
  613. {koru-0.1.332 → koru-0.1.334}/tests/test_agent_backends.py +0 -0
  614. {koru-0.1.332 → koru-0.1.334}/tests/test_agent_backends_cli.py +0 -0
  615. {koru-0.1.332 → koru-0.1.334}/tests/test_agent_cli.py +0 -0
  616. {koru-0.1.332 → koru-0.1.334}/tests/test_agents.py +0 -0
  617. {koru-0.1.332 → koru-0.1.334}/tests/test_autoloop_cli.py +0 -0
  618. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous.py +0 -0
  619. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_bridge.py +0 -0
  620. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_chat_activity_analyzer.py +0 -0
  621. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_chat_activity_config.py +0 -0
  622. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_chat_activity_text.py +0 -0
  623. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_chat_activity_tickets.py +0 -0
  624. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_config.py +0 -0
  625. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_drive_retry.py +0 -0
  626. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_events.py +0 -0
  627. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_cycle_skip_conditions.py +0 -0
  628. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_daemon_metadata.py +0 -0
  629. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_diag_markers.py +0 -0
  630. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_diagnostics.py +0 -0
  631. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_gillm_fallback.py +0 -0
  632. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_loop_runner.py +0 -0
  633. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_nlp2uri_drive.py +0 -0
  634. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_onboarding.py +0 -0
  635. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_operator.py +0 -0
  636. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_operator_reload.py +0 -0
  637. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_operator_unsupported_ide.py +0 -0
  638. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_parser_detection.py +0 -0
  639. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_plugin_lifecycle.py +0 -0
  640. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_plugin_runtime.py +0 -0
  641. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_process_detection.py +0 -0
  642. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_process_guard.py +0 -0
  643. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_readiness.py +0 -0
  644. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_redrive_cooldown.py +0 -0
  645. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_runtime.py +0 -0
  646. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_scenarios.py +0 -0
  647. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_startup.py +0 -0
  648. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_submit_strategy.py +0 -0
  649. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomous_up.py +0 -0
  650. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomy_config.py +0 -0
  651. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomy_env.py +0 -0
  652. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomy_environment.py +0 -0
  653. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomy_events.py +0 -0
  654. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomy_policy_decision.py +0 -0
  655. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomy_prompts.py +0 -0
  656. {koru-0.1.332 → koru-0.1.334}/tests/test_autonomy_strategy.py +0 -0
  657. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_audit.py +0 -0
  658. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_cli.py +0 -0
  659. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_cli_direct_drive.py +0 -0
  660. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_client_drive_errors.py +0 -0
  661. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_commands_drive.py +0 -0
  662. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_commands_handoff.py +0 -0
  663. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_commands_manage.py +0 -0
  664. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_commands_shutdown.py +0 -0
  665. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_commands_status.py +0 -0
  666. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_config.py +0 -0
  667. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_daemon.py +0 -0
  668. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_host_setup.py +0 -0
  669. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_ide.py +0 -0
  670. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_jetbrains_scaffold.py +0 -0
  671. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_lane_context.py +0 -0
  672. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_plugin_installer.py +0 -0
  673. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_protocol.py +0 -0
  674. {koru-0.1.332 → koru-0.1.334}/tests/test_autopilot_socket_path.py +0 -0
  675. {koru-0.1.332 → koru-0.1.334}/tests/test_bootstrap.py +0 -0
  676. {koru-0.1.332 → koru-0.1.334}/tests/test_calibration_validator.py +0 -0
  677. {koru-0.1.332 → koru-0.1.334}/tests/test_capture_host_template.py +0 -0
  678. {koru-0.1.332 → koru-0.1.334}/tests/test_chat_history.py +0 -0
  679. {koru-0.1.332 → koru-0.1.334}/tests/test_cli.py +0 -0
  680. {koru-0.1.332 → koru-0.1.334}/tests/test_cli_shim_builders.py +0 -0
  681. {koru-0.1.332 → koru-0.1.334}/tests/test_code2llm_discovery.py +0 -0
  682. {koru-0.1.332 → koru-0.1.334}/tests/test_command_catalog_store.py +0 -0
  683. {koru-0.1.332 → koru-0.1.334}/tests/test_command_picker.py +0 -0
  684. {koru-0.1.332 → koru-0.1.334}/tests/test_command_telemetry.py +0 -0
  685. {koru-0.1.332 → koru-0.1.334}/tests/test_configurator.py +0 -0
  686. {koru-0.1.332 → koru-0.1.334}/tests/test_configurator_toggle.py +0 -0
  687. {koru-0.1.332 → koru-0.1.334}/tests/test_context.py +0 -0
  688. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_autonomous_checkpoint_context.py +0 -0
  689. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_env_config_context.py +0 -0
  690. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_local_manager_context.py +0 -0
  691. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_planfile_queue_context.py +0 -0
  692. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_primitives.py +0 -0
  693. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_repairs_context.py +0 -0
  694. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_tasks_context.py +0 -0
  695. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_topology_context.py +0 -0
  696. {koru-0.1.332 → koru-0.1.334}/tests/test_cqrs_wup_context.py +0 -0
  697. {koru-0.1.332 → koru-0.1.334}/tests/test_cycle_trace.py +0 -0
  698. {koru-0.1.332 → koru-0.1.334}/tests/test_dashboard_html.py +0 -0
  699. {koru-0.1.332 → koru-0.1.334}/tests/test_dashboard_projects_by_ide.py +0 -0
  700. {koru-0.1.332 → koru-0.1.334}/tests/test_dashboard_ticket_handlers.py +0 -0
  701. {koru-0.1.332 → koru-0.1.334}/tests/test_dashboard_topology_post.py +0 -0
  702. {koru-0.1.332 → koru-0.1.334}/tests/test_decision_arbiter.py +0 -0
  703. {koru-0.1.332 → koru-0.1.334}/tests/test_decision_engine.py +0 -0
  704. {koru-0.1.332 → koru-0.1.334}/tests/test_decision_trace.py +0 -0
  705. {koru-0.1.332 → koru-0.1.334}/tests/test_deployment_events.py +0 -0
  706. {koru-0.1.332 → koru-0.1.334}/tests/test_deps_autorepair.py +0 -0
  707. {koru-0.1.332 → koru-0.1.334}/tests/test_desktop_uri.py +0 -0
  708. {koru-0.1.332 → koru-0.1.334}/tests/test_dev_sync.py +0 -0
  709. {koru-0.1.332 → koru-0.1.334}/tests/test_docker_capture.py +0 -0
  710. {koru-0.1.332 → koru-0.1.334}/tests/test_docker_e2e.py +0 -0
  711. {koru-0.1.332 → koru-0.1.334}/tests/test_docker_ide_matrix.py +0 -0
  712. {koru-0.1.332 → koru-0.1.334}/tests/test_docker_ide_matrix_config.py +0 -0
  713. {koru-0.1.332 → koru-0.1.334}/tests/test_docs_ide_control_surfaces.py +0 -0
  714. {koru-0.1.332 → koru-0.1.334}/tests/test_doctor.py +0 -0
  715. {koru-0.1.332 → koru-0.1.334}/tests/test_doctor_facade.py +0 -0
  716. {koru-0.1.332 → koru-0.1.334}/tests/test_doctor_koru_auto_probe.py +0 -0
  717. {koru-0.1.332 → koru-0.1.334}/tests/test_doctor_reporting_checks.py +0 -0
  718. {koru-0.1.332 → koru-0.1.334}/tests/test_dotenv_loader.py +0 -0
  719. {koru-0.1.332 → koru-0.1.334}/tests/test_drive_orchestrator.py +0 -0
  720. {koru-0.1.332 → koru-0.1.334}/tests/test_drive_repair_policy.py +0 -0
  721. {koru-0.1.332 → koru-0.1.334}/tests/test_e2e.py +0 -0
  722. {koru-0.1.332 → koru-0.1.334}/tests/test_env2llm_registry.py +0 -0
  723. {koru-0.1.332 → koru-0.1.334}/tests/test_env_config.py +0 -0
  724. {koru-0.1.332 → koru-0.1.334}/tests/test_env_flags.py +0 -0
  725. {koru-0.1.332 → koru-0.1.334}/tests/test_environment_profile.py +0 -0
  726. {koru-0.1.332 → koru-0.1.334}/tests/test_events.py +0 -0
  727. {koru-0.1.332 → koru-0.1.334}/tests/test_gate.py +0 -0
  728. {koru-0.1.332 → koru-0.1.334}/tests/test_gc.py +0 -0
  729. {koru-0.1.332 → koru-0.1.334}/tests/test_gc_cli_helpers.py +0 -0
  730. {koru-0.1.332 → koru-0.1.334}/tests/test_gillm_ide_client.py +0 -0
  731. {koru-0.1.332 → koru-0.1.334}/tests/test_gillm_recovery.py +0 -0
  732. {koru-0.1.332 → koru-0.1.334}/tests/test_git_attribution.py +0 -0
  733. {koru-0.1.332 → koru-0.1.334}/tests/test_git_cli.py +0 -0
  734. {koru-0.1.332 → koru-0.1.334}/tests/test_healing_webhook_split.py +0 -0
  735. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_adapters.py +0 -0
  736. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_client.py +0 -0
  737. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_client_contract.py +0 -0
  738. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_command_catalog.py +0 -0
  739. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_doctor_cli.py +0 -0
  740. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_operator_guidance.py +0 -0
  741. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_reload.py +0 -0
  742. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_router.py +0 -0
  743. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_runtime.py +0 -0
  744. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_status_systemmap.py +0 -0
  745. {koru-0.1.332 → koru-0.1.334}/tests/test_ide_work.py +0 -0
  746. {koru-0.1.332 → koru-0.1.334}/tests/test_imgl_integration.py +0 -0
  747. {koru-0.1.332 → koru-0.1.334}/tests/test_init.py +0 -0
  748. {koru-0.1.332 → koru-0.1.334}/tests/test_injection_moved_to_gillm.py +0 -0
  749. {koru-0.1.332 → koru-0.1.334}/tests/test_install_checks.py +0 -0
  750. {koru-0.1.332 → koru-0.1.334}/tests/test_install_manager.py +0 -0
  751. {koru-0.1.332 → koru-0.1.334}/tests/test_integration_ledger.py +0 -0
  752. {koru-0.1.332 → koru-0.1.334}/tests/test_interface_registry.py +0 -0
  753. {koru-0.1.332 → koru-0.1.334}/tests/test_koru_browser_stack.py +0 -0
  754. {koru-0.1.332 → koru-0.1.334}/tests/test_koru_gate_capture.py +0 -0
  755. {koru-0.1.332 → koru-0.1.334}/tests/test_koru_queue_argv.py +0 -0
  756. {koru-0.1.332 → koru-0.1.334}/tests/test_koruapi.py +0 -0
  757. {koru-0.1.332 → koru-0.1.334}/tests/test_koruapi_transports.py +0 -0
  758. {koru-0.1.332 → koru-0.1.334}/tests/test_korudsl.py +0 -0
  759. {koru-0.1.332 → koru-0.1.334}/tests/test_koruide_bridges.py +0 -0
  760. {koru-0.1.332 → koru-0.1.334}/tests/test_koruide_client.py +0 -0
  761. {koru-0.1.332 → koru-0.1.334}/tests/test_koruide_daemon_handlers_ack.py +0 -0
  762. {koru-0.1.332 → koru-0.1.334}/tests/test_koruide_daemon_handlers_console_log.py +0 -0
  763. {koru-0.1.332 → koru-0.1.334}/tests/test_koruide_daemon_handlers_drive.py +0 -0
  764. {koru-0.1.332 → koru-0.1.334}/tests/test_koruide_daemon_handlers_hello.py +0 -0
  765. {koru-0.1.332 → koru-0.1.334}/tests/test_koruide_daemon_handlers_plugin_event.py +0 -0
  766. {koru-0.1.332 → koru-0.1.334}/tests/test_koruide_ports.py +0 -0
  767. {koru-0.1.332 → koru-0.1.334}/tests/test_korumesh_envelope.py +0 -0
  768. {koru-0.1.332 → koru-0.1.334}/tests/test_korumesh_store.py +0 -0
  769. {koru-0.1.332 → koru-0.1.334}/tests/test_korumesh_transport.py +0 -0
  770. {koru-0.1.332 → koru-0.1.334}/tests/test_koruobserve_diagnostics.py +0 -0
  771. {koru-0.1.332 → koru-0.1.334}/tests/test_koruobserve_lifecycle.py +0 -0
  772. {koru-0.1.332 → koru-0.1.334}/tests/test_koruvision_agent.py +0 -0
  773. {koru-0.1.332 → koru-0.1.334}/tests/test_koruvision_capture.py +0 -0
  774. {koru-0.1.332 → koru-0.1.334}/tests/test_koruvision_mesh.py +0 -0
  775. {koru-0.1.332 → koru-0.1.334}/tests/test_lane_plugin_matching.py +0 -0
  776. {koru-0.1.332 → koru-0.1.334}/tests/test_llm_reflect.py +0 -0
  777. {koru-0.1.332 → koru-0.1.334}/tests/test_llm_strategies.py +0 -0
  778. {koru-0.1.332 → koru-0.1.334}/tests/test_local_service.py +0 -0
  779. {koru-0.1.332 → koru-0.1.334}/tests/test_loop.py +0 -0
  780. {koru-0.1.332 → koru-0.1.334}/tests/test_mcp_provision.py +0 -0
  781. {koru-0.1.332 → koru-0.1.334}/tests/test_mcp_server.py +0 -0
  782. {koru-0.1.332 → koru-0.1.334}/tests/test_mcp_server_split.py +0 -0
  783. {koru-0.1.332 → koru-0.1.334}/tests/test_nlp2oql_bridge.py +0 -0
  784. {koru-0.1.332 → koru-0.1.334}/tests/test_nlp2uri_ide_control_gate.py +0 -0
  785. {koru-0.1.332 → koru-0.1.334}/tests/test_observability_dsl.py +0 -0
  786. {koru-0.1.332 → koru-0.1.334}/tests/test_observation_mesh_e2e.py +0 -0
  787. {koru-0.1.332 → koru-0.1.334}/tests/test_observe_providers_cli.py +0 -0
  788. {koru-0.1.332 → koru-0.1.334}/tests/test_operator_pipeline.py +0 -0
  789. {koru-0.1.332 → koru-0.1.334}/tests/test_package_deduplication.py +0 -0
  790. {koru-0.1.332 → koru-0.1.334}/tests/test_planfile_queue.py +0 -0
  791. {koru-0.1.332 → koru-0.1.334}/tests/test_planning_llm.py +0 -0
  792. {koru-0.1.332 → koru-0.1.334}/tests/test_plugin_router.py +0 -0
  793. {koru-0.1.332 → koru-0.1.334}/tests/test_policy.py +0 -0
  794. {koru-0.1.332 → koru-0.1.334}/tests/test_post_run_verify.py +0 -0
  795. {koru-0.1.332 → koru-0.1.334}/tests/test_provider_browser_upload.py +0 -0
  796. {koru-0.1.332 → koru-0.1.334}/tests/test_provider_obs.py +0 -0
  797. {koru-0.1.332 → koru-0.1.334}/tests/test_provider_portal_screencast.py +0 -0
  798. {koru-0.1.332 → koru-0.1.334}/tests/test_pyproject_metadata.py +0 -0
  799. {koru-0.1.332 → koru-0.1.334}/tests/test_queue_clean.py +0 -0
  800. {koru-0.1.332 → koru-0.1.334}/tests/test_queue_cli_helpers.py +0 -0
  801. {koru-0.1.332 → koru-0.1.334}/tests/test_redup_integration.py +0 -0
  802. {koru-0.1.332 → koru-0.1.334}/tests/test_refactor_planfile_handoff.py +0 -0
  803. {koru-0.1.332 → koru-0.1.334}/tests/test_reflection_policy.py +0 -0
  804. {koru-0.1.332 → koru-0.1.334}/tests/test_regix_taskfile.py +0 -0
  805. {koru-0.1.332 → koru-0.1.334}/tests/test_remote_control.py +0 -0
  806. {koru-0.1.332 → koru-0.1.334}/tests/test_replay_actions.py +0 -0
  807. {koru-0.1.332 → koru-0.1.334}/tests/test_run_log.py +0 -0
  808. {koru-0.1.332 → koru-0.1.334}/tests/test_runtime.py +0 -0
  809. {koru-0.1.332 → koru-0.1.334}/tests/test_runtime_insights.py +0 -0
  810. {koru-0.1.332 → koru-0.1.334}/tests/test_scan.py +0 -0
  811. {koru-0.1.332 → koru-0.1.334}/tests/test_scan_phase.py +0 -0
  812. {koru-0.1.332 → koru-0.1.334}/tests/test_scan_split.py +0 -0
  813. {koru-0.1.332 → koru-0.1.334}/tests/test_screencast_session.py +0 -0
  814. {koru-0.1.332 → koru-0.1.334}/tests/test_self_control.py +0 -0
  815. {koru-0.1.332 → koru-0.1.334}/tests/test_semcod_tools.py +0 -0
  816. {koru-0.1.332 → koru-0.1.334}/tests/test_serve.py +0 -0
  817. {koru-0.1.332 → koru-0.1.334}/tests/test_shell_evidence.py +0 -0
  818. {koru-0.1.332 → koru-0.1.334}/tests/test_stdio_autonomous_jsonl.py +0 -0
  819. {koru-0.1.332 → koru-0.1.334}/tests/test_strategy_metadata_accessors.py +0 -0
  820. {koru-0.1.332 → koru-0.1.334}/tests/test_strategy_prompt.py +0 -0
  821. {koru-0.1.332 → koru-0.1.334}/tests/test_structured_report.py +0 -0
  822. {koru-0.1.332 → koru-0.1.334}/tests/test_sync_plugin_build.py +0 -0
  823. {koru-0.1.332 → koru-0.1.334}/tests/test_tasks.py +0 -0
  824. {koru-0.1.332 → koru-0.1.334}/tests/test_testql_bridge.py +0 -0
  825. {koru-0.1.332 → koru-0.1.334}/tests/test_ticket_evidence.py +0 -0
  826. {koru-0.1.332 → koru-0.1.334}/tests/test_tools.py +0 -0
  827. {koru-0.1.332 → koru-0.1.334}/tests/test_topology.py +0 -0
  828. {koru-0.1.332 → koru-0.1.334}/tests/test_topology_cli.py +0 -0
  829. {koru-0.1.332 → koru-0.1.334}/tests/test_verification_cycle_integration.py +0 -0
  830. {koru-0.1.332 → koru-0.1.334}/tests/test_verification_engine.py +0 -0
  831. {koru-0.1.332 → koru-0.1.334}/tests/test_vision_interval_floor.py +0 -0
  832. {koru-0.1.332 → koru-0.1.334}/tests/test_vision_provider_mime.py +0 -0
  833. {koru-0.1.332 → koru-0.1.334}/tests/test_watch.py +0 -0
  834. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_cli.py +0 -0
  835. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_env_e2e.py +0 -0
  836. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_gui.py +0 -0
  837. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_ide.py +0 -0
  838. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_ide_extras.py +0 -0
  839. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_llx.py +0 -0
  840. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_project.py +0 -0
  841. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_templates.py +0 -0
  842. {koru-0.1.332 → koru-0.1.334}/tests/test_wizard_tree.py +0 -0
  843. {koru-0.1.332 → koru-0.1.334}/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.332
3
+ Version: 0.1.334
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
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.332-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
160
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$27.58-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-150.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fdeep%2Fdeep--v4--pro-lightgrey)
159
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.334-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
160
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$26.70-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-151.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fdeep%2Fdeep--v4--pro-lightgrey)
161
161
 
162
- - 🤖 **LLM usage:** $27.5767 (438 commits)
163
- - 👤 **Human dev:** ~$15021 (150.2h @ $100/h, 30min dedup)
162
+ - 🤖 **LLM usage:** $26.6979 (440 commits)
163
+ - 👤 **Human dev:** ~$15121 (151.2h @ $100/h, 30min dedup)
164
164
 
165
- Generated on 2026-06-11 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
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
- ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.332-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
11
- ![AI Cost](https://img.shields.io/badge/AI%20Cost-$27.58-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-150.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fdeep%2Fdeep--v4--pro-lightgrey)
10
+ ![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-0.1.334-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green)
11
+ ![AI Cost](https://img.shields.io/badge/AI%20Cost-$26.70-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-151.2h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fdeep%2Fdeep--v4--pro-lightgrey)
12
12
 
13
- - 🤖 **LLM usage:** $27.5767 (438 commits)
14
- - 👤 **Human dev:** ~$15021 (150.2h @ $100/h, 30min dedup)
13
+ - 🤖 **LLM usage:** $26.6979 (440 commits)
14
+ - 👤 **Human dev:** ~$15121 (151.2h @ $100/h, 30min dedup)
15
15
 
16
- Generated on 2026-06-11 using [openrouter/deep/deep-v4-pro](https://openrouter.ai/deep/deep-v4-pro)
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
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "koru"
7
- version = "0.1.332"
7
+ version = "0.1.334"
8
8
  description = "Closed-loop automation across semcod/* repositories."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12,<3.14"
@@ -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 and client is not None:
372
+ if "client" in builder.__code__.co_varnames:
373
373
  return builder(client=client)
374
- elif "mcp_server" in builder.__code__.co_varnames and mcp_server is not None:
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 and shell_client_id is not None:
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
- # 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
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,264 @@
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}/`` by session directory mtime."""
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
+ candidates.sort(key=lambda p: p.stat().st_mtime, reverse=True)
117
+ return candidates[0]
118
+
119
+
120
+ def append_session_jsonl(session_dir: Path, rel_path: str, entry: dict[str, Any]) -> Path:
121
+ """Append one JSON line under the session (e.g. act/cursor_positioning.jsonl)."""
122
+ path = session_dir / rel_path
123
+ path.parent.mkdir(parents=True, exist_ok=True)
124
+ payload = {**entry, "ts": datetime.now(timezone.utc).isoformat()}
125
+ with path.open("a", encoding="utf-8") as fh:
126
+ fh.write(json.dumps(payload, ensure_ascii=False, default=str) + "\n")
127
+ return path
128
+
129
+
130
+ def persist_autonomy_phase(
131
+ session_dir: Path,
132
+ phase: str,
133
+ name: str,
134
+ payload: dict[str, Any],
135
+ ) -> Path:
136
+ phase_dir = session_dir / phase
137
+ phase_dir.mkdir(parents=True, exist_ok=True)
138
+ path = phase_dir / f"{name}.json"
139
+ path.write_text(json.dumps(payload, indent=2, ensure_ascii=False, default=str), encoding="utf-8")
140
+ append_session_index(session_dir, phase=phase, name=name, ok=payload.get("ok"))
141
+ return path
142
+
143
+
144
+ def vql_sidecar_is_stale(
145
+ vql_path: Path,
146
+ png_path: Path | None,
147
+ *,
148
+ ide: str = "auto",
149
+ layer_count: int | None = None,
150
+ window_mismatch: dict[str, Any] | None = None,
151
+ capture_validation: dict[str, Any] | None = None,
152
+ ) -> tuple[bool, dict[str, Any]]:
153
+ """Return (stale, diagnostics). Stale sidecars must not feed decide/act."""
154
+ reasons: list[str] = []
155
+ now = time.time()
156
+ max_age = vql_max_age_seconds()
157
+
158
+ if not vql_path.is_file():
159
+ return True, {"stale": True, "reasons": ["missing_vql"], "vql_path": str(vql_path)}
160
+
161
+ vql_mt = vql_path.stat().st_mtime
162
+ age_s = now - vql_mt
163
+ info: dict[str, Any] = {
164
+ "stale": False,
165
+ "reasons": reasons,
166
+ "vql_path": str(vql_path.resolve()),
167
+ "vql_mtime": vql_mt,
168
+ "age_s": round(age_s, 2),
169
+ "max_age_s": max_age,
170
+ }
171
+
172
+ if capture_validation is None:
173
+ try:
174
+ import json
175
+
176
+ data = json.loads(vql_path.read_text(encoding="utf-8"))
177
+ meta = data.get("metadata") if isinstance(data.get("metadata"), dict) else {}
178
+ cv = meta.get("capture_validation")
179
+ if isinstance(cv, dict):
180
+ capture_validation = cv
181
+ except Exception:
182
+ capture_validation = None
183
+
184
+ if max_age > 0 and age_s > max_age:
185
+ reasons.append(f"vql_age_s>{max_age}")
186
+
187
+ if png_path is not None:
188
+ if not png_path.is_file():
189
+ reasons.append("missing_png")
190
+ else:
191
+ png_mt = png_path.stat().st_mtime
192
+ info["png_mtime"] = png_mt
193
+ info["png_path"] = str(png_path.resolve())
194
+ if max_age > 0 and (now - png_mt) > max_age:
195
+ reasons.append(f"png_age_s>{max_age}")
196
+ # Sidecar is written after screenshot — VQL mtime may be newer than PNG by seconds.
197
+ # Stale only when VQL is older than PNG (sidecar not regenerated for this capture).
198
+ if vql_mt + 2.0 < png_mt:
199
+ reasons.append("vql_sidecar_older_than_png")
200
+ elif png_mt > vql_mt + 600.0:
201
+ reasons.append("png_newer_than_vql_by_600s")
202
+
203
+ if layer_count is not None and layer_count == 0:
204
+ reasons.append("empty_vql_layers")
205
+
206
+ if window_mismatch is not None:
207
+ reasons.append("ide_window_mismatch")
208
+ info["ide_window_warning"] = window_mismatch
209
+ elif isinstance(capture_validation, dict):
210
+ info["capture_validation"] = capture_validation
211
+ cv_reasons = capture_validation.get("reasons") or []
212
+ expected = str(capture_validation.get("expected_ide") or "").strip()
213
+ if expected and capture_validation.get("capture_confirmed") is False:
214
+ reasons.append("capture_validation_failed")
215
+ for item in cv_reasons:
216
+ if item not in reasons:
217
+ reasons.append(str(item))
218
+
219
+ info["stale"] = bool(reasons)
220
+ info["reasons"] = reasons
221
+ return bool(reasons), info
222
+
223
+
224
+ def copy_observe_artifacts_to_session(
225
+ session_dir: Path,
226
+ *,
227
+ png: Path,
228
+ vql: Path,
229
+ ) -> dict[str, str]:
230
+ """Copy fresh capture + sidecars into session observe/ and pin env paths."""
231
+ dest_png, dest_vql = session_observe_paths(session_dir)
232
+ if png.resolve() != dest_png.resolve() and png.is_file():
233
+ dest_png.write_bytes(png.read_bytes())
234
+ if vql.resolve() != dest_vql.resolve() and vql.is_file():
235
+ dest_vql.write_text(vql.read_text(encoding="utf-8"), encoding="utf-8")
236
+
237
+ ctx = png.with_suffix(png.suffix + ".context.json")
238
+ dest_ctx = dest_png.with_suffix(dest_png.suffix + ".context.json")
239
+ if ctx.is_file() and ctx.resolve() != dest_ctx.resolve():
240
+ dest_ctx.write_text(ctx.read_text(encoding="utf-8"), encoding="utf-8")
241
+
242
+ imgl = Path(str(vql).replace(".png.vql.json", ".png.vql.imgl.json"))
243
+ dest_imgl = Path(str(dest_vql).replace(".png.vql.json", ".png.vql.imgl.json"))
244
+ if imgl.is_file() and imgl.resolve() != dest_imgl.resolve():
245
+ dest_imgl.write_text(imgl.read_text(encoding="utf-8"), encoding="utf-8")
246
+
247
+ os.environ["KORU_VDISPLAY_PHOTO_PATH"] = str(dest_png.resolve())
248
+ os.environ["KORU_VDISPLAY_VQL_PATH"] = str(dest_vql.resolve())
249
+ return {"png": str(dest_png), "vql": str(dest_vql)}
250
+
251
+
252
+ __all__ = [
253
+ "active_session_dir",
254
+ "append_session_index",
255
+ "begin_autonomy_session",
256
+ "copy_observe_artifacts_to_session",
257
+ "metadata_root",
258
+ "persist_autonomy_phase",
259
+ "session_observe_paths",
260
+ "vql_max_age_seconds",
261
+ "vql_sidecar_is_stale",
262
+ "append_session_jsonl",
263
+ "find_latest_koru_session",
264
+ ]