loopx 0.4.8__py3-none-any.whl
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.
- loopx/__init__.py +5 -0
- loopx/agent_onboarding.py +654 -0
- loopx/agent_registry.py +112 -0
- loopx/ark_managed_agent_host.py +59 -0
- loopx/authority.py +805 -0
- loopx/benchmark.py +2875 -0
- loopx/benchmark_adapters/__init__.py +1 -0
- loopx/benchmark_adapters/agentissue.py +2644 -0
- loopx/benchmark_adapters/agents_last_exam.py +3998 -0
- loopx/benchmark_adapters/edgebench.py +322 -0
- loopx/benchmark_adapters/skillsbench.py +5978 -0
- loopx/benchmark_adapters/skillsbench_acp_failure_policy.py +143 -0
- loopx/benchmark_adapters/skillsbench_acp_process.py +31 -0
- loopx/benchmark_adapters/skillsbench_acp_relay.py +4832 -0
- loopx/benchmark_adapters/skillsbench_batch.py +124 -0
- loopx/benchmark_adapters/skillsbench_bridge_guard.py +209 -0
- loopx/benchmark_adapters/skillsbench_bridge_summary.py +203 -0
- loopx/benchmark_adapters/skillsbench_codex_goal_recovery.py +271 -0
- loopx/benchmark_adapters/skillsbench_codex_goal_trace.py +81 -0
- loopx/benchmark_adapters/skillsbench_codex_runtime.py +339 -0
- loopx/benchmark_adapters/skillsbench_dockerfile_runtime.py +467 -0
- loopx/benchmark_adapters/skillsbench_failure_signals.py +652 -0
- loopx/benchmark_adapters/skillsbench_proxy_runtime.py +327 -0
- loopx/benchmark_adapters/skillsbench_remote_bridge.py +402 -0
- loopx/benchmark_adapters/skillsbench_result_discovery.py +143 -0
- loopx/benchmark_adapters/skillsbench_runner_profile.py +436 -0
- loopx/benchmark_adapters/skillsbench_runner_source.py +99 -0
- loopx/benchmark_adapters/skillsbench_setup_preflight.py +771 -0
- loopx/benchmark_adapters/skillsbench_signals.py +15 -0
- loopx/benchmark_adapters/skillsbench_task_source.py +141 -0
- loopx/benchmark_adapters/skillsbench_turn_route.py +723 -0
- loopx/benchmark_adapters/skillsbench_turn_runtime.py +1069 -0
- loopx/benchmark_adapters/skillsbench_typed_repair.py +689 -0
- loopx/benchmark_adapters/skillsbench_uv_cache.py +111 -0
- loopx/benchmark_adapters/skillsbench_verifier_bootstrap.py +227 -0
- loopx/benchmark_adapters/skillsbench_verifier_cache.py +138 -0
- loopx/benchmark_adapters/terminal_bench.py +10078 -0
- loopx/benchmark_case_analysis.py +1276 -0
- loopx/benchmark_case_state.py +1079 -0
- loopx/benchmark_core/__init__.py +239 -0
- loopx/benchmark_core/adapter.py +84 -0
- loopx/benchmark_core/artifacts.py +517 -0
- loopx/benchmark_core/attempts.py +199 -0
- loopx/benchmark_core/container_exec.py +216 -0
- loopx/benchmark_core/io.py +68 -0
- loopx/benchmark_core/lifecycle.py +211 -0
- loopx/benchmark_core/loop_protocol.py +689 -0
- loopx/benchmark_core/observable_handles.py +348 -0
- loopx/benchmark_core/parity.py +256 -0
- loopx/benchmark_core/remote_closeout.py +482 -0
- loopx/benchmark_core/rounds.py +215 -0
- loopx/benchmark_core/route_profile.py +509 -0
- loopx/benchmark_core/run_permissions.py +206 -0
- loopx/benchmark_core/split_control.py +925 -0
- loopx/benchmark_core/turn_fidelity.py +326 -0
- loopx/benchmark_ledger.py +3793 -0
- loopx/benchmark_ledger_countability.py +372 -0
- loopx/benchmark_ledger_current.py +724 -0
- loopx/benchmark_trajectory.py +405 -0
- loopx/benchmarks/__init__.py +1 -0
- loopx/benchmarks/qualification/__init__.py +1 -0
- loopx/benchmarks/qualification/release_outcome_baseline.py +360 -0
- loopx/benchmarks/read_models/__init__.py +1 -0
- loopx/benchmarks/read_models/benchmark_attempt_accounting.py +53 -0
- loopx/benchmarks/read_models/benchmark_comparison.py +414 -0
- loopx/benchmarks/read_models/benchmark_event_timeline.py +113 -0
- loopx/benchmarks/read_models/benchmark_experiment_report.py +475 -0
- loopx/benchmarks/read_models/benchmark_learning_ledger.py +137 -0
- loopx/benchmarks/read_models/benchmark_lifecycle_contracts.py +228 -0
- loopx/benchmarks/read_models/benchmark_projection.py +723 -0
- loopx/benchmarks/read_models/benchmark_result.py +146 -0
- loopx/benchmarks/read_models/benchmark_run_execution_contract.py +116 -0
- loopx/benchmarks/read_models/benchmark_run_failure.py +157 -0
- loopx/benchmarks/read_models/benchmark_run_metrics.py +213 -0
- loopx/benchmarks/read_models/benchmark_run_post_execution.py +635 -0
- loopx/benchmarks/read_models/benchmark_run_pre_execution.py +541 -0
- loopx/benchmarks/read_models/benchmark_status_compaction.py +1255 -0
- loopx/benchmarks/read_models/benchmark_status_runner.py +780 -0
- loopx/benchmarks/read_models/goal_start_control_score.py +857 -0
- loopx/benchmarks/read_models/skillsbench_post_run_debug.py +746 -0
- loopx/benchmarks/read_models/skillsbench_verifier_attribution.py +269 -0
- loopx/bootstrap.py +1116 -0
- loopx/bootstrap_command_pack.py +2167 -0
- loopx/boundary_authority.py +199 -0
- loopx/canary/__init__.py +1 -0
- loopx/canary/maintainability_ratchet.py +800 -0
- loopx/canary/planner.py +1984 -0
- loopx/canary/premerge.py +1130 -0
- loopx/canary/qualification_profiles.py +309 -0
- loopx/canary/quality_surface_catalog.py +838 -0
- loopx/canary/release_profiles.py +51 -0
- loopx/canary/runner.py +1107 -0
- loopx/canary/smoke_health.py +581 -0
- loopx/canary/smoke_profiles.py +212 -0
- loopx/capabilities/__init__.py +0 -0
- loopx/capabilities/agent_turn_recall/__init__.py +17 -0
- loopx/capabilities/agent_turn_recall/cli.py +369 -0
- loopx/capabilities/agent_turn_recall/core.py +296 -0
- loopx/capabilities/auto_research/__init__.py +16 -0
- loopx/capabilities/auto_research/bootstrap_contract.py +157 -0
- loopx/capabilities/auto_research/cli.py +1468 -0
- loopx/capabilities/auto_research/core.py +11 -0
- loopx/capabilities/auto_research/defaults.py +79 -0
- loopx/capabilities/auto_research/demo_e2e.py +1848 -0
- loopx/capabilities/auto_research/demo_supervisor.py +186 -0
- loopx/capabilities/auto_research/evidence_packet.py +767 -0
- loopx/capabilities/auto_research/human_view.py +794 -0
- loopx/capabilities/auto_research/kernel.py +191 -0
- loopx/capabilities/auto_research/knn_demo_workspace.py +322 -0
- loopx/capabilities/auto_research/live_evidence.py +248 -0
- loopx/capabilities/auto_research/preset.py +176 -0
- loopx/capabilities/auto_research/research_state.py +1085 -0
- loopx/capabilities/auto_research/role_profiles.py +394 -0
- loopx/capabilities/auto_research/rollout_append.py +97 -0
- loopx/capabilities/auto_research/terminal_result_contract.py +422 -0
- loopx/capabilities/auto_research/terminal_result_projection.py +171 -0
- loopx/capabilities/auto_research/terminal_result_query.py +233 -0
- loopx/capabilities/auto_research/terminal_results.py +349 -0
- loopx/capabilities/auto_research/user_contract.py +190 -0
- loopx/capabilities/auto_research/worker_loop.py +163 -0
- loopx/capabilities/auto_research/worker_runtime.py +777 -0
- loopx/capabilities/auto_research/worker_skill/SKILL.md +343 -0
- loopx/capabilities/benchmark_toolkit/__init__.py +19 -0
- loopx/capabilities/benchmark_toolkit/integrity.py +387 -0
- loopx/capabilities/catalog.py +1875 -0
- loopx/capabilities/change_quality/__init__.py +19 -0
- loopx/capabilities/change_quality/cli.py +171 -0
- loopx/capabilities/change_quality/context.py +156 -0
- loopx/capabilities/change_quality/oracles.py +269 -0
- loopx/capabilities/change_quality/policy.py +34 -0
- loopx/capabilities/change_quality/receipt.py +482 -0
- loopx/capabilities/change_quality/result.py +493 -0
- loopx/capabilities/change_quality/scope.py +171 -0
- loopx/capabilities/change_quality/shadow.py +680 -0
- loopx/capabilities/content_ops/__init__.py +0 -0
- loopx/capabilities/content_ops/cli.py +649 -0
- loopx/capabilities/content_ops/connector_packets.py +164 -0
- loopx/capabilities/content_ops/item_lifecycle.py +1000 -0
- loopx/capabilities/content_ops/layout.py +451 -0
- loopx/capabilities/content_ops/markdown.py +456 -0
- loopx/capabilities/content_ops/schemas.py +51 -0
- loopx/capabilities/content_ops/social_browser_x.py +107 -0
- loopx/capabilities/content_ops/surface.py +1956 -0
- loopx/capabilities/content_ops/templates/layout-catalog-v0.json +72 -0
- loopx/capabilities/context_providers/__init__.py +36 -0
- loopx/capabilities/context_providers/base.py +189 -0
- loopx/capabilities/context_providers/factory.py +32 -0
- loopx/capabilities/context_providers/openviking.py +702 -0
- loopx/capabilities/context_providers/service_ownership.py +185 -0
- loopx/capabilities/decision_context/__init__.py +129 -0
- loopx/capabilities/decision_context/architecture.py +83 -0
- loopx/capabilities/decision_context/assembler.py +849 -0
- loopx/capabilities/decision_context/catalog_entry.py +195 -0
- loopx/capabilities/decision_context/cli.py +310 -0
- loopx/capabilities/decision_context/cursor_commit.py +535 -0
- loopx/capabilities/decision_context/outcome_feedback.py +352 -0
- loopx/capabilities/decision_context/packets.py +654 -0
- loopx/capabilities/decision_context/private_state.py +189 -0
- loopx/capabilities/decision_context/profile.py +453 -0
- loopx/capabilities/decision_context/providers.py +228 -0
- loopx/capabilities/decision_context/review_settlement.py +136 -0
- loopx/capabilities/decision_context/runtime.py +273 -0
- loopx/capabilities/decision_context/sources.py +415 -0
- loopx/capabilities/explore/__init__.py +1 -0
- loopx/capabilities/explore/activation.py +198 -0
- loopx/capabilities/explore/adaptive_replay_planner.py +221 -0
- loopx/capabilities/explore/child_replay_runtime.py +463 -0
- loopx/capabilities/explore/composition_frontier.py +291 -0
- loopx/capabilities/explore/counterfactual_runtime.py +578 -0
- loopx/capabilities/explore/episode_runtime.py +647 -0
- loopx/capabilities/explore/harness_checkpoint.py +171 -0
- loopx/capabilities/explore/harness_gate.py +115 -0
- loopx/capabilities/explore/harness_runtime.py +1124 -0
- loopx/capabilities/explore/replay_metrics.py +206 -0
- loopx/capabilities/explore/replay_runtime.py +1271 -0
- loopx/capabilities/explore/resource_portfolio.py +173 -0
- loopx/capabilities/explore/result_log.py +974 -0
- loopx/capabilities/explore/router_state.py +432 -0
- loopx/capabilities/explore/source_history_reconcile.py +255 -0
- loopx/capabilities/explore/speculative_scheduler.py +498 -0
- loopx/capabilities/explore/todo_branch_plan.py +650 -0
- loopx/capabilities/explore/todo_evidence.py +141 -0
- loopx/capabilities/explore/trace_runtime.py +284 -0
- loopx/capabilities/explore/worker_branch_plan.py +1257 -0
- loopx/capabilities/integration_branch/__init__.py +13 -0
- loopx/capabilities/integration_branch/cli.py +148 -0
- loopx/capabilities/integration_branch/core.py +916 -0
- loopx/capabilities/issue_fix/__init__.py +19 -0
- loopx/capabilities/issue_fix/acceptance_loop.py +1050 -0
- loopx/capabilities/issue_fix/candidate_evidence.py +503 -0
- loopx/capabilities/issue_fix/candidate_preflight.py +676 -0
- loopx/capabilities/issue_fix/cli.py +1822 -0
- loopx/capabilities/issue_fix/cli_input.py +87 -0
- loopx/capabilities/issue_fix/content_ops_cli.py +148 -0
- loopx/capabilities/issue_fix/discovered_issue_promotion.py +947 -0
- loopx/capabilities/issue_fix/explore_projection.py +710 -0
- loopx/capabilities/issue_fix/feasibility.py +542 -0
- loopx/capabilities/issue_fix/github_public.py +661 -0
- loopx/capabilities/issue_fix/intake_surface.py +832 -0
- loopx/capabilities/issue_fix/metadata_preview.py +218 -0
- loopx/capabilities/issue_fix/metrics_projection.py +1340 -0
- loopx/capabilities/issue_fix/metrics_supplement.py +634 -0
- loopx/capabilities/issue_fix/metrics_supplement_cli.py +127 -0
- loopx/capabilities/issue_fix/outcome_projection.py +1235 -0
- loopx/capabilities/issue_fix/periodic_report.py +189 -0
- loopx/capabilities/issue_fix/pr_description.py +418 -0
- loopx/capabilities/issue_fix/pr_gate_reconcile.py +496 -0
- loopx/capabilities/issue_fix/pr_gate_reconcile_cli.py +464 -0
- loopx/capabilities/issue_fix/pr_lifecycle.py +1327 -0
- loopx/capabilities/issue_fix/pr_lifecycle_rollout.py +85 -0
- loopx/capabilities/issue_fix/pr_monitor_materialization.py +257 -0
- loopx/capabilities/issue_fix/pr_review_ack.py +439 -0
- loopx/capabilities/issue_fix/provider_hooks.py +24 -0
- loopx/capabilities/issue_fix/repository_commit_evidence.py +186 -0
- loopx/capabilities/issue_fix/repository_context.py +457 -0
- loopx/capabilities/issue_fix/repository_memory.py +459 -0
- loopx/capabilities/issue_fix/repository_memory_provider.py +1454 -0
- loopx/capabilities/issue_fix/repository_snapshot.py +454 -0
- loopx/capabilities/issue_fix/reviewer_cli.py +917 -0
- loopx/capabilities/issue_fix/reviewer_notification.py +882 -0
- loopx/capabilities/issue_fix/reviewer_notification_drain.py +942 -0
- loopx/capabilities/issue_fix/reviewer_recommendation.py +1057 -0
- loopx/capabilities/issue_fix/reviewer_request.py +1282 -0
- loopx/capabilities/issue_fix/reward_memory.py +879 -0
- loopx/capabilities/issue_fix/workflow_plan.py +1286 -0
- loopx/capabilities/material_lifecycle/__init__.py +161 -0
- loopx/capabilities/material_lifecycle/_validation.py +183 -0
- loopx/capabilities/material_lifecycle/apply.py +672 -0
- loopx/capabilities/material_lifecycle/architecture.py +122 -0
- loopx/capabilities/material_lifecycle/cli.py +161 -0
- loopx/capabilities/material_lifecycle/decision_planning.py +470 -0
- loopx/capabilities/material_lifecycle/explore_execution.py +306 -0
- loopx/capabilities/material_lifecycle/intake.py +869 -0
- loopx/capabilities/material_lifecycle/inventory.py +147 -0
- loopx/capabilities/material_lifecycle/lifecycle.py +98 -0
- loopx/capabilities/material_lifecycle/preparation.py +147 -0
- loopx/capabilities/material_lifecycle/project_skill.py +83 -0
- loopx/capabilities/material_lifecycle/ranking.py +267 -0
- loopx/capabilities/material_lifecycle/readable_projection.py +500 -0
- loopx/capabilities/material_lifecycle/rebuild.py +480 -0
- loopx/capabilities/material_lifecycle/settlement.py +238 -0
- loopx/capabilities/periodic_report/__init__.py +71 -0
- loopx/capabilities/periodic_report/adapters.py +939 -0
- loopx/capabilities/periodic_report/archive.py +422 -0
- loopx/capabilities/periodic_report/bindings.py +705 -0
- loopx/capabilities/periodic_report/cli.py +277 -0
- loopx/capabilities/periodic_report/core.py +691 -0
- loopx/capabilities/periodic_report/extension_envelope.py +66 -0
- loopx/capabilities/periodic_report/presets.py +103 -0
- loopx/capabilities/periodic_report/profile.py +235 -0
- loopx/capabilities/periodic_report/project_progress.py +179 -0
- loopx/capabilities/periodic_report/triggers.py +452 -0
- loopx/capabilities/pr_review_queue/__init__.py +17 -0
- loopx/capabilities/pr_review_queue/core.py +506 -0
- loopx/capabilities/pr_review_queue/review_contract.py +506 -0
- loopx/capabilities/registry.py +192 -0
- loopx/capabilities/reward_memory/__init__.py +75 -0
- loopx/capabilities/reward_memory/application.py +819 -0
- loopx/capabilities/reward_memory/architecture.py +572 -0
- loopx/capabilities/reward_memory/candidate_review.py +511 -0
- loopx/capabilities/reward_memory/cli.py +469 -0
- loopx/capabilities/reward_memory/dogfood.py +574 -0
- loopx/capabilities/reward_memory/evaluation.py +296 -0
- loopx/capabilities/reward_memory/evaluation_fixtures.py +362 -0
- loopx/capabilities/reward_memory/experiment.py +567 -0
- loopx/capabilities/reward_memory/health.py +222 -0
- loopx/capabilities/reward_memory/ingestion.py +519 -0
- loopx/capabilities/reward_memory/registry.py +600 -0
- loopx/capabilities/reward_memory/runtime_hooks.py +312 -0
- loopx/capabilities/reward_memory/scoped_feedback.py +173 -0
- loopx/capabilities/semantic_preference/__init__.py +12 -0
- loopx/capabilities/semantic_preference/cli.py +189 -0
- loopx/capabilities/semantic_preference/contract.py +592 -0
- loopx/capabilities/semantic_preference/reward_memory.py +62 -0
- loopx/capabilities/value_connectors/__init__.py +1 -0
- loopx/capabilities/value_connectors/cli.py +401 -0
- loopx/capabilities/value_connectors/finance_extension_migration.py +108 -0
- loopx/capabilities/value_connectors/install_check.py +147 -0
- loopx/capabilities/value_connectors/planner.py +733 -0
- loopx/capabilities/value_connectors/source_map.py +446 -0
- loopx/claude_goal_baseline.py +138 -0
- loopx/claude_goal_mode/__init__.py +23 -0
- loopx/claude_goal_mode/hooks/goal_policy.py +212 -0
- loopx/claude_goal_mode/hooks/goal_state.py +139 -0
- loopx/claude_goal_mode/mcp/loopx_mcp.py +167 -0
- loopx/claude_goal_mode/scripts/connect.py +103 -0
- loopx/claude_goal_mode/scripts/goalmode_cmd.py +241 -0
- loopx/claude_goal_mode/scripts/install.py +328 -0
- loopx/claude_goal_mode/statusline/goal_status.py +97 -0
- loopx/cli.py +836 -0
- loopx/cli_commands/__init__.py +334 -0
- loopx/cli_commands/_host_thread.py +13 -0
- loopx/cli_commands/agentissue_runner_flow.py +447 -0
- loopx/cli_commands/agents_last_exam.py +160 -0
- loopx/cli_commands/agents_last_exam_baked_input.py +302 -0
- loopx/cli_commands/agents_last_exam_host_codex.py +374 -0
- loopx/cli_commands/agents_last_exam_launch_dry_run.py +372 -0
- loopx/cli_commands/agents_last_exam_local_plan.py +322 -0
- loopx/cli_commands/agents_last_exam_runner_source.py +352 -0
- loopx/cli_commands/agents_last_exam_task_material.py +335 -0
- loopx/cli_commands/agents_last_exam_validation_gate.py +236 -0
- loopx/cli_commands/benchmark_boundary.py +499 -0
- loopx/cli_commands/benchmark_dispatch.py +161 -0
- loopx/cli_commands/benchmark_release_outcome.py +123 -0
- loopx/cli_commands/benchmark_review_lifecycle.py +1275 -0
- loopx/cli_commands/benchmark_run_ledger.py +763 -0
- loopx/cli_commands/benchmark_run_ledger_case_analysis.py +249 -0
- loopx/cli_commands/benchmark_run_ledger_classification.py +45 -0
- loopx/cli_commands/benchmark_run_ledger_maintenance.py +486 -0
- loopx/cli_commands/benchmark_run_ledger_maintenance_registration.py +342 -0
- loopx/cli_commands/benchmark_run_ledger_maintenance_rendering.py +233 -0
- loopx/cli_commands/benchmark_run_ledger_parity.py +92 -0
- loopx/cli_commands/bootstrap_connect.py +238 -0
- loopx/cli_commands/canary.py +707 -0
- loopx/cli_commands/canary_release_qualification.py +79 -0
- loopx/cli_commands/capability.py +96 -0
- loopx/cli_commands/doctor.py +43 -0
- loopx/cli_commands/dreaming.py +143 -0
- loopx/cli_commands/edgebench.py +205 -0
- loopx/cli_commands/evidence_log.py +275 -0
- loopx/cli_commands/explore.py +989 -0
- loopx/cli_commands/explore_planning_commands.py +157 -0
- loopx/cli_commands/extension.py +271 -0
- loopx/cli_commands/first_run_report.py +73 -0
- loopx/cli_commands/goal_channel.py +656 -0
- loopx/cli_commands/handoff_mode.py +158 -0
- loopx/cli_commands/history.py +622 -0
- loopx/cli_commands/host_mode_plan.py +113 -0
- loopx/cli_commands/lark_inbox.py +431 -0
- loopx/cli_commands/lark_kanban.py +629 -0
- loopx/cli_commands/ml_experiment.py +321 -0
- loopx/cli_commands/multi_agent.py +211 -0
- loopx/cli_commands/opencode2_goal_worker.py +217 -0
- loopx/cli_commands/pr_review.py +167 -0
- loopx/cli_commands/presentation.py +218 -0
- loopx/cli_commands/preset.py +96 -0
- loopx/cli_commands/project.py +150 -0
- loopx/cli_commands/project_lifecycle.py +915 -0
- loopx/cli_commands/quota.py +859 -0
- loopx/cli_commands/quota_registration.py +241 -0
- loopx/cli_commands/quota_request.py +113 -0
- loopx/cli_commands/ready_score.py +110 -0
- loopx/cli_commands/registry_admin.py +975 -0
- loopx/cli_commands/registry_admin_configure.py +344 -0
- loopx/cli_commands/registry_admin_peer.py +84 -0
- loopx/cli_commands/registry_authority.py +218 -0
- loopx/cli_commands/review_batch.py +146 -0
- loopx/cli_commands/slash_commands.py +145 -0
- loopx/cli_commands/start_goal.py +251 -0
- loopx/cli_commands/starter.py +175 -0
- loopx/cli_commands/starter_bootstrap.py +179 -0
- loopx/cli_commands/starter_bootstrap_registration.py +198 -0
- loopx/cli_commands/starter_runtime_idle.py +107 -0
- loopx/cli_commands/starter_scheduler.py +207 -0
- loopx/cli_commands/starter_session_runtime.py +152 -0
- loopx/cli_commands/starter_visible_common.py +54 -0
- loopx/cli_commands/starter_visible_driver.py +161 -0
- loopx/cli_commands/starter_visible_pilot.py +278 -0
- loopx/cli_commands/status.py +867 -0
- loopx/cli_commands/status_registration.py +239 -0
- loopx/cli_commands/summary_all.py +222 -0
- loopx/cli_commands/support_control.py +809 -0
- loopx/cli_commands/support_control_registry.py +68 -0
- loopx/cli_commands/support_control_supervisor.py +289 -0
- loopx/cli_commands/task_lease.py +306 -0
- loopx/cli_commands/terminal_bench_adapter.py +717 -0
- loopx/cli_commands/terminal_bench_environment_result.py +1246 -0
- loopx/cli_commands/todo.py +940 -0
- loopx/cli_commands/todo_argument_validation.py +572 -0
- loopx/cli_commands/todo_event.py +114 -0
- loopx/cli_commands/turn.py +804 -0
- loopx/cli_commands/version.py +46 -0
- loopx/cli_commands/worker_bridge.py +659 -0
- loopx/cli_rollout.py +314 -0
- loopx/codex_cli_goal_tui.py +672 -0
- loopx/codex_cli_probe.py +1530 -0
- loopx/codex_cli_probe_markdown.py +935 -0
- loopx/codex_cli_runtime_probe.py +733 -0
- loopx/codex_cli_scheduler.py +564 -0
- loopx/codex_goal_baseline.py +620 -0
- loopx/configuration_catalog.py +617 -0
- loopx/configure_goal.py +1375 -0
- loopx/contract.py +996 -0
- loopx/control_plane/__init__.py +71 -0
- loopx/control_plane/agents/__init__.py +1 -0
- loopx/control_plane/agents/agent_lane_recommendation.py +516 -0
- loopx/control_plane/agents/agent_scope.py +1578 -0
- loopx/control_plane/agents/agent_scope_frontier.py +60 -0
- loopx/control_plane/agents/capability_gate.py +531 -0
- loopx/control_plane/agents/identity.py +140 -0
- loopx/control_plane/agents/legacy_migration.py +169 -0
- loopx/control_plane/agents/management_projection.py +658 -0
- loopx/control_plane/agents/material_frontier.py +608 -0
- loopx/control_plane/agents/material_handoff.py +156 -0
- loopx/control_plane/agents/multi_agent/__init__.py +1 -0
- loopx/control_plane/agents/multi_agent/codex_executable.py +207 -0
- loopx/control_plane/agents/multi_agent/collective_round_ledger.py +387 -0
- loopx/control_plane/agents/multi_agent/contract.py +474 -0
- loopx/control_plane/agents/multi_agent/recipe.py +110 -0
- loopx/control_plane/agents/multi_agent/role_successor.py +297 -0
- loopx/control_plane/agents/multi_agent/runtime_scripts.py +426 -0
- loopx/control_plane/agents/multi_agent/visible_launch_policy.py +149 -0
- loopx/control_plane/agents/multi_agent/visible_wake_scheduler.py +392 -0
- loopx/control_plane/agents/profile.py +216 -0
- loopx/control_plane/agents/runtime_model.py +73 -0
- loopx/control_plane/agents/subagent_activity.py +164 -0
- loopx/control_plane/agents/supervisor.py +544 -0
- loopx/control_plane/agents/supervisor_events.py +462 -0
- loopx/control_plane/agents/supervisor_inject.py +204 -0
- loopx/control_plane/agents/work_mode.py +56 -0
- loopx/control_plane/agents/workspace_guard.py +364 -0
- loopx/control_plane/effect_program.py +644 -0
- loopx/control_plane/goals/__init__.py +1 -0
- loopx/control_plane/goals/active_state_event_projection.py +103 -0
- loopx/control_plane/goals/active_state_metadata.py +47 -0
- loopx/control_plane/goals/active_state_sections.py +58 -0
- loopx/control_plane/goals/configure_goal_service.py +354 -0
- loopx/control_plane/goals/contract_health.py +132 -0
- loopx/control_plane/goals/dreaming.py +152 -0
- loopx/control_plane/goals/global_registry_health.py +199 -0
- loopx/control_plane/goals/global_registry_shadow.py +33 -0
- loopx/control_plane/goals/goal_channel.py +34 -0
- loopx/control_plane/goals/goal_channel_projection.py +560 -0
- loopx/control_plane/goals/goal_frontier/__init__.py +1917 -0
- loopx/control_plane/goals/goal_frontier/ack_policy.py +149 -0
- loopx/control_plane/goals/goal_frontier/outcome_continuity.py +437 -0
- loopx/control_plane/goals/goal_frontier/replan_rules.py +210 -0
- loopx/control_plane/goals/goal_frontier/semantic_history.py +314 -0
- loopx/control_plane/goals/goal_frontier/terminal.py +180 -0
- loopx/control_plane/goals/goal_vision.py +443 -0
- loopx/control_plane/goals/goal_vision_policy.py +36 -0
- loopx/control_plane/goals/goal_vision_state.py +62 -0
- loopx/control_plane/goals/goal_vision_wait.py +290 -0
- loopx/control_plane/goals/path_resolution.py +20 -0
- loopx/control_plane/goals/start_contract.py +206 -0
- loopx/control_plane/goals/vision_checkpoint.py +92 -0
- loopx/control_plane/handoff/__init__.py +1 -0
- loopx/control_plane/handoff/cross_runtime_impl_review.py +311 -0
- loopx/control_plane/handoff/delivery_contract.py +161 -0
- loopx/control_plane/handoff/handoff_runs.py +71 -0
- loopx/control_plane/handoff/project_handoff.py +155 -0
- loopx/control_plane/handoff/review_batch.py +463 -0
- loopx/control_plane/handoff/review_packet_context.py +216 -0
- loopx/control_plane/heartbeat/agent.py +173 -0
- loopx/control_plane/heartbeat/budget.py +66 -0
- loopx/control_plane/heartbeat/builder.py +501 -0
- loopx/control_plane/heartbeat/host.py +64 -0
- loopx/control_plane/heartbeat/rules.py +68 -0
- loopx/control_plane/heartbeat/task_body.py +759 -0
- loopx/control_plane/heartbeat/visible_goal.py +86 -0
- loopx/control_plane/projects/__init__.py +1 -0
- loopx/control_plane/projects/contract.py +25 -0
- loopx/control_plane/projects/registry.py +663 -0
- loopx/control_plane/quota/__init__.py +1 -0
- loopx/control_plane/quota/cli_projection.py +704 -0
- loopx/control_plane/quota/decision_summary.py +431 -0
- loopx/control_plane/quota/effect_program.py +152 -0
- loopx/control_plane/quota/error_codes.py +19 -0
- loopx/control_plane/quota/goal_boundary.py +464 -0
- loopx/control_plane/quota/heartbeat_receipt.py +277 -0
- loopx/control_plane/quota/heartbeat_recommendation.py +718 -0
- loopx/control_plane/quota/host_poll_receipts.py +162 -0
- loopx/control_plane/quota/live_decision.py +142 -0
- loopx/control_plane/quota/monitor_poll.py +786 -0
- loopx/control_plane/quota/policy_constants.py +40 -0
- loopx/control_plane/quota/projection_repair.py +262 -0
- loopx/control_plane/quota/recent_runs.py +210 -0
- loopx/control_plane/quota/scheduler_ack.py +490 -0
- loopx/control_plane/quota/selected_todo_projection.py +139 -0
- loopx/control_plane/quota/settlement.py +437 -0
- loopx/control_plane/quota/settlement_cli.py +246 -0
- loopx/control_plane/quota/settlement_validation.py +64 -0
- loopx/control_plane/quota/settlement_workspace_causality.py +180 -0
- loopx/control_plane/quota/should_run.py +249 -0
- loopx/control_plane/quota/should_run_packet.py +1165 -0
- loopx/control_plane/quota/should_run_prepare.py +675 -0
- loopx/control_plane/quota/slot_accounting.py +1123 -0
- loopx/control_plane/quota/spend_sources.py +11 -0
- loopx/control_plane/quota/stall_repair.py +397 -0
- loopx/control_plane/quota/states.py +29 -0
- loopx/control_plane/quota/task_orchestration.py +448 -0
- loopx/control_plane/quota/task_orchestration_admission.py +497 -0
- loopx/control_plane/quota/turn_envelope.py +889 -0
- loopx/control_plane/quota/usage_summary.py +140 -0
- loopx/control_plane/reward_memory.py +43 -0
- loopx/control_plane/runtime/__init__.py +2 -0
- loopx/control_plane/runtime/active_user_assisted_pilot.py +275 -0
- loopx/control_plane/runtime/agent_scoped_evidence_log.py +435 -0
- loopx/control_plane/runtime/decision_freshness.py +203 -0
- loopx/control_plane/runtime/event_ledger.py +197 -0
- loopx/control_plane/runtime/event_store_migration_bridge.py +196 -0
- loopx/control_plane/runtime/goal_project_route.py +70 -0
- loopx/control_plane/runtime/local_state_write_correctness.py +242 -0
- loopx/control_plane/runtime/promotion_readiness.py +152 -0
- loopx/control_plane/runtime/public_safety.py +120 -0
- loopx/control_plane/runtime/run_artifacts.py +78 -0
- loopx/control_plane/runtime/run_compaction.py +397 -0
- loopx/control_plane/runtime/run_context_retention.py +241 -0
- loopx/control_plane/runtime/run_history.py +132 -0
- loopx/control_plane/runtime/run_index_duplicates.py +205 -0
- loopx/control_plane/runtime/run_index_rebuild.py +263 -0
- loopx/control_plane/runtime/run_ingest_health.py +336 -0
- loopx/control_plane/runtime/runtime_projection_route.py +624 -0
- loopx/control_plane/runtime/runtime_projection_writer.py +98 -0
- loopx/control_plane/runtime/session_runtime.py +339 -0
- loopx/control_plane/runtime/shared_runtime_material_projection.py +332 -0
- loopx/control_plane/runtime/shared_runtime_refresh_projection.py +183 -0
- loopx/control_plane/runtime/stale_latest_run.py +90 -0
- loopx/control_plane/runtime/status_classifications.py +49 -0
- loopx/control_plane/runtime/status_projection_cache.py +235 -0
- loopx/control_plane/runtime/stride_observation.py +144 -0
- loopx/control_plane/runtime/time.py +39 -0
- loopx/control_plane/runtime/trajectory_hygiene.py +149 -0
- loopx/control_plane/runtime/validation_command.py +69 -0
- loopx/control_plane/scheduler/__init__.py +1 -0
- loopx/control_plane/scheduler/ack.py +329 -0
- loopx/control_plane/scheduler/arbitration.py +188 -0
- loopx/control_plane/scheduler/automation_liveness.py +183 -0
- loopx/control_plane/scheduler/execution_context.py +555 -0
- loopx/control_plane/scheduler/external_evidence_observation.py +428 -0
- loopx/control_plane/scheduler/monitor_display.py +143 -0
- loopx/control_plane/scheduler/monitor_poll_policy.py +161 -0
- loopx/control_plane/scheduler/monitor_poll_writeback.py +351 -0
- loopx/control_plane/scheduler/monitor_target.py +64 -0
- loopx/control_plane/scheduler/monitor_todo.py +146 -0
- loopx/control_plane/scheduler/monitor_wait.py +237 -0
- loopx/control_plane/scheduler/scheduler_hint.py +1284 -0
- loopx/control_plane/scheduler/state.py +354 -0
- loopx/control_plane/scheduler/state_transition_rules.py +179 -0
- loopx/control_plane/scheduler/time.py +10 -0
- loopx/control_plane/settlement_driver.py +293 -0
- loopx/control_plane/status/__init__.py +6 -0
- loopx/control_plane/status/active_state_projection.py +105 -0
- loopx/control_plane/status/agent_lane_projection.py +375 -0
- loopx/control_plane/status/attention_projection.py +74 -0
- loopx/control_plane/status/autonomous_replan_projection.py +103 -0
- loopx/control_plane/status/collection.py +140 -0
- loopx/control_plane/status/contract_projection.py +31 -0
- loopx/control_plane/status/dreaming_projection.py +52 -0
- loopx/control_plane/status/goal_attention_projection.py +157 -0
- loopx/control_plane/status/lifecycle_projection.py +110 -0
- loopx/control_plane/status/monitor_display_projection.py +69 -0
- loopx/control_plane/status/registry_health_projection.py +75 -0
- loopx/control_plane/status/run_projection.py +70 -0
- loopx/control_plane/status/runtime_summaries.py +161 -0
- loopx/control_plane/testing/__init__.py +1 -0
- loopx/control_plane/testing/actual_default_model_behavior_portfolio.py +1371 -0
- loopx/control_plane/testing/canary_harness.py +182 -0
- loopx/control_plane/testing/capability_monitor_repair_tool_behavior.py +674 -0
- loopx/control_plane/testing/cli_output_budget.py +807 -0
- loopx/control_plane/testing/cli_output_differential.py +250 -0
- loopx/control_plane/testing/cli_output_semantics.py +87 -0
- loopx/control_plane/testing/control_plane_composition_scenarios.py +225 -0
- loopx/control_plane/testing/decision_replay.py +268 -0
- loopx/control_plane/testing/doubao_model_behavior_actor.py +559 -0
- loopx/control_plane/testing/model_behavior_corpus.py +344 -0
- loopx/control_plane/testing/model_behavior_qualification.py +769 -0
- loopx/control_plane/testing/model_behavior_retained_cases.py +235 -0
- loopx/control_plane/testing/model_tool_behavior.py +536 -0
- loopx/control_plane/testing/onboarding_model_behavior_qualification.py +642 -0
- loopx/control_plane/testing/quota_fixtures.py +208 -0
- loopx/control_plane/testing/quota_should_run_parity.py +57 -0
- loopx/control_plane/testing/release_commit_qualification.py +671 -0
- loopx/control_plane/testing/replan_semantic_action_behavior.py +1302 -0
- loopx/control_plane/testing/scoped_gate_successor_tool_behavior.py +527 -0
- loopx/control_plane/testing/selected_todo_tool_behavior.py +1002 -0
- loopx/control_plane/testing/terminal_settlement_tool_behavior.py +656 -0
- loopx/control_plane/todos/__init__.py +1 -0
- loopx/control_plane/todos/active_state_editing.py +296 -0
- loopx/control_plane/todos/active_state_todo_parser.py +138 -0
- loopx/control_plane/todos/active_state_todos.py +175 -0
- loopx/control_plane/todos/addition.py +103 -0
- loopx/control_plane/todos/claim_visibility.py +253 -0
- loopx/control_plane/todos/completed_archive.py +139 -0
- loopx/control_plane/todos/completion_fence.py +49 -0
- loopx/control_plane/todos/completion_policy.py +153 -0
- loopx/control_plane/todos/completion_validation.py +248 -0
- loopx/control_plane/todos/completion_validation_accountability.py +27 -0
- loopx/control_plane/todos/completion_validation_projection.py +57 -0
- loopx/control_plane/todos/contract.py +1476 -0
- loopx/control_plane/todos/decision_scope.py +554 -0
- loopx/control_plane/todos/deferred_resume.py +546 -0
- loopx/control_plane/todos/durable_completion.py +201 -0
- loopx/control_plane/todos/event_writeback.py +484 -0
- loopx/control_plane/todos/frontier_deadline.py +132 -0
- loopx/control_plane/todos/handoff_gate.py +283 -0
- loopx/control_plane/todos/handoff_mode.py +444 -0
- loopx/control_plane/todos/handoff_note.py +202 -0
- loopx/control_plane/todos/line_update.py +361 -0
- loopx/control_plane/todos/list_projection.py +205 -0
- loopx/control_plane/todos/markdown.py +199 -0
- loopx/control_plane/todos/monitor_metadata.py +88 -0
- loopx/control_plane/todos/mutation_authority.py +299 -0
- loopx/control_plane/todos/projection.py +655 -0
- loopx/control_plane/todos/quota_summary.py +1138 -0
- loopx/control_plane/todos/route_continuation.py +267 -0
- loopx/control_plane/todos/succession_warning.py +174 -0
- loopx/control_plane/todos/summary_item.py +223 -0
- loopx/control_plane/todos/text.py +30 -0
- loopx/control_plane/todos/todo_index.py +226 -0
- loopx/control_plane/todos/todo_summary.py +1458 -0
- loopx/control_plane/todos/unblock_resume.py +326 -0
- loopx/control_plane/todos/user_gate.py +263 -0
- loopx/control_plane/todos/write_hint.py +63 -0
- loopx/control_plane/todos/write_policy.py +135 -0
- loopx/control_plane/turn_driver/__init__.py +85 -0
- loopx/control_plane/turn_driver/codex_cli.py +502 -0
- loopx/control_plane/turn_driver/driver.py +355 -0
- loopx/control_plane/turn_driver/executor.py +1468 -0
- loopx/control_plane/turn_driver/loop_controller.py +669 -0
- loopx/control_plane/turn_driver/settlement.py +318 -0
- loopx/control_plane/turn_driver/transaction.py +375 -0
- loopx/control_plane/work_items/__init__.py +1 -0
- loopx/control_plane/work_items/attention_fields.py +56 -0
- loopx/control_plane/work_items/attention_item.py +77 -0
- loopx/control_plane/work_items/attention_queue.py +322 -0
- loopx/control_plane/work_items/attention_routing.py +213 -0
- loopx/control_plane/work_items/autonomous_candidates.py +135 -0
- loopx/control_plane/work_items/autonomous_replan_ack.py +276 -0
- loopx/control_plane/work_items/autonomous_replan_obligation.py +786 -0
- loopx/control_plane/work_items/backlog_hygiene.py +59 -0
- loopx/control_plane/work_items/capability_monitor_fallback.py +221 -0
- loopx/control_plane/work_items/delivery_batch_scale.py +66 -0
- loopx/control_plane/work_items/delivery_outcome.py +152 -0
- loopx/control_plane/work_items/delivery_signals.py +113 -0
- loopx/control_plane/work_items/execution_obligation.py +235 -0
- loopx/control_plane/work_items/goal_route_hint.py +320 -0
- loopx/control_plane/work_items/interaction_contract.py +1540 -0
- loopx/control_plane/work_items/issue_meta_surface.py +159 -0
- loopx/control_plane/work_items/lifecycle.py +139 -0
- loopx/control_plane/work_items/operator_inbox.py +266 -0
- loopx/control_plane/work_items/outcome_followthrough.py +69 -0
- loopx/control_plane/work_items/primary_action.py +326 -0
- loopx/control_plane/work_items/progress_observation.py +630 -0
- loopx/control_plane/work_items/project_asset.py +675 -0
- loopx/control_plane/work_items/repair_delta.py +693 -0
- loopx/control_plane/work_items/runtime_capability_reentry.py +168 -0
- loopx/control_plane/work_items/semantic_replan_writeback.py +177 -0
- loopx/control_plane/work_items/status_contract.py +49 -0
- loopx/control_plane/work_items/task_graph.py +1046 -0
- loopx/control_plane/work_items/task_lease.py +1254 -0
- loopx/control_plane/work_items/task_lease_settlement.py +422 -0
- loopx/control_plane/work_items/work_lane.py +510 -0
- loopx/control_plane/work_items/work_lane_context.py +161 -0
- loopx/demo.py +247 -0
- loopx/diagnose.py +633 -0
- loopx/doctor.py +1251 -0
- loopx/domain_packs/__init__.py +1 -0
- loopx/domain_packs/issue_fix.py +571 -0
- loopx/domain_packs/ml_experiment.py +854 -0
- loopx/domain_state.py +137 -0
- loopx/dreaming.py +706 -0
- loopx/entrypoint.py +16 -0
- loopx/event_sourced_state.py +981 -0
- loopx/execution_profile.py +286 -0
- loopx/experiments/__init__.py +1 -0
- loopx/experiments/planner_worker/__init__.py +1 -0
- loopx/experiments/planner_worker/contract.py +523 -0
- loopx/experiments/planner_worker/runtime.py +391 -0
- loopx/experiments/planner_worker/traex.py +461 -0
- loopx/explore_graph.py +11 -0
- loopx/extensions/__init__.py +1 -0
- loopx/extensions/bundled.py +28 -0
- loopx/extensions/execution_envelope.py +126 -0
- loopx/extensions/lark/__init__.py +11 -0
- loopx/extensions/lark/event_collector.py +478 -0
- loopx/extensions/lark/event_collector_runtime.py +506 -0
- loopx/extensions/lark/event_inbox.py +454 -0
- loopx/extensions/lark/extension.toml +88 -0
- loopx/extensions/lark/goal_channel.py +44 -0
- loopx/extensions/lark/goal_channel_contracts.py +388 -0
- loopx/extensions/lark/goal_channel_lifecycle.py +218 -0
- loopx/extensions/lark/goal_channel_runtime.py +792 -0
- loopx/extensions/lark/goal_channel_setup.py +805 -0
- loopx/extensions/lark/goal_channel_targets.py +215 -0
- loopx/extensions/lark/goal_channel_transport.py +281 -0
- loopx/extensions/lark/inbox_reactions.py +650 -0
- loopx/extensions/lark/inbox_reply.py +430 -0
- loopx/extensions/lark/presentation/__init__.py +11 -0
- loopx/extensions/lark/presentation/explore_results.py +2276 -0
- loopx/extensions/lark/presentation/explore_singleflight.py +127 -0
- loopx/extensions/lark/presentation/explore_source_guard.py +121 -0
- loopx/extensions/lark/presentation/explore_stage_document.py +703 -0
- loopx/extensions/lark/presentation/explore_visual_integrity.py +122 -0
- loopx/extensions/lark/presentation/explore_visual_readback.py +452 -0
- loopx/extensions/lark/presentation/explore_visual_styles.py +156 -0
- loopx/extensions/lark/presentation/issue_fix_surface.py +612 -0
- loopx/extensions/lark/presentation/kanban.py +2791 -0
- loopx/extensions/lark/presentation/message_card.py +112 -0
- loopx/extensions/lark/presentation/periodic_report.py +261 -0
- loopx/extensions/lark/presentation/projection_rows.py +600 -0
- loopx/extensions/lark/presentation/record_io.py +95 -0
- loopx/extensions/lark/presentation/sync_receipt.py +145 -0
- loopx/extensions/lark/private_json.py +40 -0
- loopx/extensions/lark/provider.py +86 -0
- loopx/extensions/lark/reviewer_notification.py +604 -0
- loopx/extensions/manifest.py +385 -0
- loopx/extensions/openviking_periodic_report/__init__.py +17 -0
- loopx/extensions/openviking_periodic_report/activation.py +173 -0
- loopx/extensions/openviking_periodic_report/extension.toml +17 -0
- loopx/extensions/openviking_periodic_report/provider.py +355 -0
- loopx/extensions/openviking_periodic_report/sink.py +117 -0
- loopx/extensions/openviking_semantic_preference/__init__.py +5 -0
- loopx/extensions/openviking_semantic_preference/extension.toml +16 -0
- loopx/extensions/openviking_semantic_preference/history_export.py +484 -0
- loopx/extensions/openviking_semantic_preference/project_peer.py +68 -0
- loopx/extensions/openviking_semantic_preference/provider.py +312 -0
- loopx/extensions/presentation.py +979 -0
- loopx/extensions/process_runtime.py +204 -0
- loopx/extensions/readiness.py +168 -0
- loopx/extensions/runtime.py +931 -0
- loopx/extensions/scaffold.py +335 -0
- loopx/feedback.py +581 -0
- loopx/file_lock.py +382 -0
- loopx/global_registry.py +842 -0
- loopx/global_risks.py +970 -0
- loopx/global_todos.py +568 -0
- loopx/handoff_budget.py +28 -0
- loopx/heartbeat_prequota.py +80 -0
- loopx/heartbeat_prompt.py +159 -0
- loopx/help_surface.py +516 -0
- loopx/history.py +1507 -0
- loopx/host_loop_activation.py +1311 -0
- loopx/host_mode_planner.py +991 -0
- loopx/install_contract.py +1 -0
- loopx/interface_budget.py +196 -0
- loopx/long_task_cadence.py +208 -0
- loopx/materials.py +185 -0
- loopx/ml_experiment.py +3 -0
- loopx/onboarding.py +214 -0
- loopx/opencode2_goal_mode/README.md +81 -0
- loopx/opencode2_goal_mode/__init__.py +9 -0
- loopx/opencode2_goal_mode/opencode2-goal-worker.mjs +1018 -0
- loopx/opencode_goal_mode/README.md +99 -0
- loopx/opencode_goal_mode/__init__.py +13 -0
- loopx/opencode_goal_mode/goal-bridge-runtime.mjs +858 -0
- loopx/opencode_goal_mode/loopx-goal.js +8 -0
- loopx/operator_gate.py +420 -0
- loopx/orchestration.py +127 -0
- loopx/paths.py +59 -0
- loopx/pi_goal_mode/README.md +67 -0
- loopx/pi_goal_mode/__init__.py +13 -0
- loopx/pi_goal_mode/loopx-goal.ts +254 -0
- loopx/pi_goal_mode/pi-goal-loop-runtime.mjs +574 -0
- loopx/pr_review.py +1206 -0
- loopx/presentation/__init__.py +1 -0
- loopx/presentation/explore_views.py +1334 -0
- loopx/presentation/markdown.py +61 -0
- loopx/presentation/projection_source_reconcile.py +140 -0
- loopx/presentation/public_safety.py +42 -0
- loopx/presentation/renderers/__init__.py +17 -0
- loopx/presentation/renderers/goal_channel_html.py +269 -0
- loopx/presentation/renderers/periodic_report_html.py +786 -0
- loopx/presentation/renderers/periodic_report_markdown.py +184 -0
- loopx/presentation/renderers/quota_event_markdown.py +116 -0
- loopx/presentation/renderers/quota_markdown.py +1112 -0
- loopx/presentation/renderers/status_markdown.py +1570 -0
- loopx/presentation/renderers/trajectory_hygiene_markdown.py +39 -0
- loopx/presentation/renderers/turn_envelope_markdown.py +33 -0
- loopx/presentation/sinks/__init__.py +5 -0
- loopx/presentation/sinks/openviking_periodic_report.py +7 -0
- loopx/presentation/static_site.py +691 -0
- loopx/presets.py +369 -0
- loopx/project_alias.py +217 -0
- loopx/project_map.py +589 -0
- loopx/project_prompt.py +1153 -0
- loopx/project_skill_cli.py +125 -0
- loopx/project_skill_delivery.py +470 -0
- loopx/project_uninstall.py +462 -0
- loopx/promotion_gate.py +197 -0
- loopx/quota.py +1197 -0
- loopx/ready_score.py +413 -0
- loopx/registry.py +621 -0
- loopx/registry_writability.py +64 -0
- loopx/release_candidate.py +148 -0
- loopx/release_manifest.py +316 -0
- loopx/repository_identity.py +100 -0
- loopx/review_packet.py +1024 -0
- loopx/rollout_event_log.py +505 -0
- loopx/runtime.py +112 -0
- loopx/self_update.py +750 -0
- loopx/session_runtime.py +418 -0
- loopx/skill_install_readback.py +500 -0
- loopx/slash_command_install.py +1393 -0
- loopx/slash_commands.py +264 -0
- loopx/state_backup.py +573 -0
- loopx/state_migration.py +350 -0
- loopx/state_projection.py +809 -0
- loopx/state_refresh.py +1416 -0
- loopx/status.py +1383 -0
- loopx/status_server.py +935 -0
- loopx/summary_all.py +725 -0
- loopx/terminal_bench_agent.py +2056 -0
- loopx/thread_agent_binding.py +408 -0
- loopx/todo_followups.py +168 -0
- loopx/todo_suggestion_prompt.py +204 -0
- loopx/todos.py +2229 -0
- loopx/turn_identity.py +17 -0
- loopx/upgrade.py +1083 -0
- loopx/visible_governance.py +667 -0
- loopx/visible_multi_agent_launcher.py +1253 -0
- loopx/visible_multi_agent_tmux.py +429 -0
- loopx/worker_bridge.py +1574 -0
- loopx-0.4.8.dist-info/METADATA +708 -0
- loopx-0.4.8.dist-info/RECORD +811 -0
- loopx-0.4.8.dist-info/WHEEL +5 -0
- loopx-0.4.8.dist-info/entry_points.txt +5 -0
- loopx-0.4.8.dist-info/licenses/LICENSE +202 -0
- loopx-0.4.8.dist-info/licenses/LICENSE-MIT +21 -0
- loopx-0.4.8.dist-info/licenses/NOTICE +6 -0
- loopx-0.4.8.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,759 @@
|
|
|
1
|
+
"""Heartbeat task body renderers inside the heartbeat bounded context."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from .rules import (
|
|
8
|
+
CODEX_NATIVE_GOAL_UNCHANGED_WAIT_RULE,
|
|
9
|
+
DEFAULT_MATERIAL_QUEUE_RULE,
|
|
10
|
+
DEFAULT_PERMISSION_RULE,
|
|
11
|
+
HEARTBEAT_NOTIFICATION_RULE_SHORT,
|
|
12
|
+
HEARTBEAT_NOTIFICATION_RULE_THIN,
|
|
13
|
+
HEARTBEAT_VISION_WRITEBACK_RULE_SHORT,
|
|
14
|
+
HOST_LOOP_QUOTA_DISPATCH_RULE,
|
|
15
|
+
HOST_LOOP_TODO_CLOSEOUT_COMPACT_RULE,
|
|
16
|
+
HOST_LOOP_TODO_CLOSEOUT_RULE,
|
|
17
|
+
RUNTIME_CAPABILITY_PROJECTION_THIN_RULE,
|
|
18
|
+
RUNTIME_EXECUTION_ROUTING_RULE,
|
|
19
|
+
SCHEDULER_HINT_APPLICATION_RULE,
|
|
20
|
+
SCHEDULER_HINT_COMPACT_RULE,
|
|
21
|
+
SCHEDULER_HINT_THIN_RULE,
|
|
22
|
+
USER_TODO_FINAL_MESSAGE_RULE,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _render_compact_policy_tail(
|
|
27
|
+
*,
|
|
28
|
+
material_queue_rule: str,
|
|
29
|
+
permission_rule: str,
|
|
30
|
+
include_default_permission: bool = False,
|
|
31
|
+
) -> str:
|
|
32
|
+
parts = [
|
|
33
|
+
"No learning queue unless asked."
|
|
34
|
+
if material_queue_rule == DEFAULT_MATERIAL_QUEUE_RULE
|
|
35
|
+
else material_queue_rule
|
|
36
|
+
]
|
|
37
|
+
if permission_rule != DEFAULT_PERMISSION_RULE:
|
|
38
|
+
parts.append(permission_rule)
|
|
39
|
+
elif include_default_permission:
|
|
40
|
+
parts.append("No permission asks in a trusted session.")
|
|
41
|
+
return " ".join(parts)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def render_heartbeat_task_body(
|
|
45
|
+
*,
|
|
46
|
+
goal_id: str,
|
|
47
|
+
active_state: str,
|
|
48
|
+
cli_preflight: str,
|
|
49
|
+
pr_review_pre_quota_command: str,
|
|
50
|
+
quota_guard_command: str,
|
|
51
|
+
quota_spend_command: str,
|
|
52
|
+
refresh_state_command: str,
|
|
53
|
+
progress_refresh_state_command: str,
|
|
54
|
+
material_queue_rule: str,
|
|
55
|
+
permission_rule: str,
|
|
56
|
+
cli_bin: str,
|
|
57
|
+
agent_scope_instruction: str,
|
|
58
|
+
expanded_prompt_command: str,
|
|
59
|
+
compact_prompt_command: str,
|
|
60
|
+
brief_prompt_command: str,
|
|
61
|
+
thin_prompt_command: str,
|
|
62
|
+
) -> str:
|
|
63
|
+
scope_block = f"\n{agent_scope_instruction}\n" if agent_scope_instruction else ""
|
|
64
|
+
pr_review_pre_quota_block = (
|
|
65
|
+
f"{pr_review_pre_quota_command}\n" if pr_review_pre_quota_command else ""
|
|
66
|
+
)
|
|
67
|
+
return f"""Advance `{goal_id}` using `{active_state}`.
|
|
68
|
+
|
|
69
|
+
Generic LoopX lifecycle. Keep project-specific branching out of the
|
|
70
|
+
automation prompt. Put local policy in registry, active-state sections, adapter
|
|
71
|
+
output, `quota should-run.goal_boundary`, or boundary rules; if a lifecycle
|
|
72
|
+
rule is needed, update `{cli_bin} heartbeat-prompt` so all projects inherit it.
|
|
73
|
+
{scope_block}
|
|
74
|
+
|
|
75
|
+
Before spending delivery compute, make the CLI reachable; set
|
|
76
|
+
`LOOPX_TURN=<current_time_iso>` per trigger, reuse it on retries, and run guard:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
{cli_preflight}
|
|
80
|
+
{pr_review_pre_quota_block}{quota_guard_command}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
If that preflight still fails: no work/spend; quiet `DONT_NOTIFY`.
|
|
84
|
+
|
|
85
|
+
`lark_event_inbox`: `reply_due`: drain -> effect/reply/readback/ACK.
|
|
86
|
+
|
|
87
|
+
{USER_TODO_FINAL_MESSAGE_RULE}
|
|
88
|
+
{HEARTBEAT_VISION_WRITEBACK_RULE_SHORT}
|
|
89
|
+
|
|
90
|
+
If the result says `should_run=false`:
|
|
91
|
+
|
|
92
|
+
- Only if `user_channel.notify=NOTIFY`, interpret `state=operator_gate` or
|
|
93
|
+
`notify_user_on_open_todo=true` as a user prompt. Read `gate_prompt`,
|
|
94
|
+
`operator_question`, `user_todo_summary`, and `open_todo_notify_reason`;
|
|
95
|
+
ask one concise Chinese action/question with reply format. If
|
|
96
|
+
`user_todo_summary.open_count > 0`, include up to three `first_open_items`;
|
|
97
|
+
never say "no new user action". Honor
|
|
98
|
+
`open_todo_notification_policy=repeat_until_resolved`; when
|
|
99
|
+
`user_gate_notification_cooldown.notification_suppressed=true`, keep the gate
|
|
100
|
+
pending and quiet until its reminder window/change. No gated delivery/spend.
|
|
101
|
+
No delivery/spend on the gated path.
|
|
102
|
+
- If the payload also says `safe_bypass_allowed=true` and the same gate has
|
|
103
|
+
already been surfaced, the gate blocks only the gated delivery path. You may
|
|
104
|
+
do exactly one bounded safe-bypass step from the Priority Stack that does not
|
|
105
|
+
depend on that gate; validate, write back, refresh accountable progress, spend
|
|
106
|
+
once. Only if `user_channel.notify=NOTIFY`: report the result compactly; if
|
|
107
|
+
`user_todo_summary.open_count > 0`, include those todos; if none exists, report
|
|
108
|
+
the gate. Under `DONT_NOTIFY`, stay quiet after the safe-bypass work.
|
|
109
|
+
- If `effective_action=monitor_quiet_skip`, receipt/stall is written; quiet
|
|
110
|
+
unless replan. On receipt write failure, retry same id. No edits/spend;
|
|
111
|
+
receipts do not self-stop.
|
|
112
|
+
- If `waiting_on=external_evidence` or `state=waiting`, and this automation is
|
|
113
|
+
explicitly a monitor, run at most one bounded read-only observation poll using
|
|
114
|
+
project-approved status/log/metric/marker surfaces named in active state,
|
|
115
|
+
`recommended_action`, or `goal_boundary.next_probe`. Unchanged evidence:
|
|
116
|
+
quiet `DONT_NOTIFY`, no edits, no spend. New eval/fail/complete/blocker/
|
|
117
|
+
approval/CI/deploy/data evidence: write back only allowed canonical
|
|
118
|
+
state/board/ledger, add todos if needed, then spend once after validation.
|
|
119
|
+
Only if `user_channel.notify=NOTIFY`: report the new evidence. Under
|
|
120
|
+
`DONT_NOTIFY`, stay quiet.
|
|
121
|
+
Still do not launch/stop/restart/sync/design code or mutate production unless
|
|
122
|
+
`should_run=true` or the user explicitly authorizes it.
|
|
123
|
+
- Otherwise, do not do implementation work, adapter work, file edits, research,
|
|
124
|
+
or project exploration in this turn. Return a quiet heartbeat `DONT_NOTIFY`
|
|
125
|
+
response with the skip reason.
|
|
126
|
+
{SCHEDULER_HINT_APPLICATION_RULE} Codex App cadence changes are host
|
|
127
|
+
scheduling updates only; they never consume quota or authorize delivery work.
|
|
128
|
+
|
|
129
|
+
If the result says `should_run=true`:
|
|
130
|
+
|
|
131
|
+
1. Read the active state, Priority Stack, recent progress, and critic.
|
|
132
|
+
When you inspect current LoopX routing, use the current status queue:
|
|
133
|
+
`attention_queue.items` and each item's `project_asset` are authoritative
|
|
134
|
+
for owner, gate, waiting party, and next action. If `project_asset` is absent
|
|
135
|
+
or legacy/raw fallback, raw queue fields are not owner/gate/stop authority. Treat
|
|
136
|
+
`run_history.latest_runs` as evidence and drill-down only; it may be limited
|
|
137
|
+
by status command limits or filters, so do not decide whether a gate is
|
|
138
|
+
pending or approved from latest runs alone. Also inspect `goal_boundary` and
|
|
139
|
+
guard `user_todo_summary`. Stop for an open user/owner todo only when it
|
|
140
|
+
belongs to this goal's guard payload or current project asset and blocks the
|
|
141
|
+
selected path; then use the blocker-push pattern above. Dependency or
|
|
142
|
+
sibling-goal todos found in `attention_queue.items` should be recorded as
|
|
143
|
+
dependency blockers; they must not consume the whole eligible turn. Choose a
|
|
144
|
+
gate-independent P0/P1/P2 candidate for this goal when one exists.
|
|
145
|
+
If `effective_action=outcome_floor_recovery` or
|
|
146
|
+
`recovery_delivery_allowed=true` or
|
|
147
|
+
`safe_bypass_kind=outcome_floor_recovery`, produce the required
|
|
148
|
+
ranker/cross-domain evidence artifact named by `must_advance`, or write back
|
|
149
|
+
the concrete blocker. Do not fall through to ordinary delivery,
|
|
150
|
+
surface propagation, or synthetic-only chains.
|
|
151
|
+
Read `execution_obligation`: `notify` is not an execution gate;
|
|
152
|
+
`must_attempt_work=true` means one bounded segment even with
|
|
153
|
+
`notify=DONT_NOTIFY`; quiet no-op needs `must_attempt_work=false` and
|
|
154
|
+
`user_channel.notify=DONT_NOTIFY`. Use
|
|
155
|
+
`scheduler_hint` for wakeup and unchanged-loop limits. For Codex App:
|
|
156
|
+
`apply_needed=true` -> update `recommended_rrule` once; on success run
|
|
157
|
+
`ack_hint.cli_args`; on failure/timeout do not retry or ack, run
|
|
158
|
+
`failure_hint.cli_args` once. LoopX suppresses that target/host pair until
|
|
159
|
+
either changes; continue under the observed host cadence. Else
|
|
160
|
+
`ack_needed=true` -> run that bound ack directly; else skip.
|
|
161
|
+
LoopX owns reset/progression state. It is scheduling only, not delivery
|
|
162
|
+
permission. Then use
|
|
163
|
+
`heartbeat_recommendation`: `recommended_mode=run_first_read_only_map` means
|
|
164
|
+
run its `command` as a real read-only map, then
|
|
165
|
+
validate/save the `read_only_project_map` result, refresh accountable
|
|
166
|
+
progress, append exactly one heartbeat spend, sync state if needed; notify
|
|
167
|
+
only under `NOTIFY`. If it says
|
|
168
|
+
`recommended_mode=mapped_noop_if_unchanged` with `stop_if_unchanged=true`,
|
|
169
|
+
and you find no new user instruction, owner evidence, agent todo, stale
|
|
170
|
+
source, or safe handoff, return quiet `DONT_NOTIFY`: do not run, edit, or
|
|
171
|
+
spend.
|
|
172
|
+
Check `delivery_batch_scale`, `delivery_outcome`,
|
|
173
|
+
`post_handoff_outcome_gap_streak`, and `handoff_delivery_contract`; for
|
|
174
|
+
repeated-small or surface-only loops, obey the contract.
|
|
175
|
+
2. Run a short steering audit before choosing work: list at least three
|
|
176
|
+
plausible next-action candidates across different P0/P1/P2 lanes when
|
|
177
|
+
useful; if the same topic has consumed several recent delivery slices, apply
|
|
178
|
+
a continuation check and state why continuing still wins; keep compute quota
|
|
179
|
+
separate from focus quota; record any losing high-value candidate that should
|
|
180
|
+
not be forgotten. Include a product bottleneck lens: ask whether the core
|
|
181
|
+
goal is currently bottlenecked by user experience, agent capability,
|
|
182
|
+
evidence quality, adapter readiness, or priority-rule gaps, and promote one
|
|
183
|
+
concrete bottleneck candidate when it should outrank the nearest local TODO.
|
|
184
|
+
Plan/top todo/route changes need todo/Next Action writeback or no-writeback rationale.
|
|
185
|
+
3. Run the no-progress self-repair check before choosing delivery work. Obey
|
|
186
|
+
any machine-readable `autonomous_replan_obligation` or
|
|
187
|
+
`execution_obligation.must_attempt_work=true` from `quota should-run`; that
|
|
188
|
+
hard contract overrides a quiet no-op. Count a turn as no-progress only when
|
|
189
|
+
it produced no substantive artifact, adapter/implementation progress,
|
|
190
|
+
gate/user decision, or validation signal. If 2 consecutive eligible
|
|
191
|
+
heartbeats are no-progress loops, run one bounded self-repair/replan segment
|
|
192
|
+
before another quiet no-op. Delete/pause only when that repair path is stuck
|
|
193
|
+
for 2 more eligible turns; no spend for the self-cancel turn.
|
|
194
|
+
4. Choose one bounded, verifiable progress segment from that audit. It may be a
|
|
195
|
+
coherent batch across related implementation, test, doc, and state-writeback
|
|
196
|
+
files when the write scope is clear and validation is explicit; it should not
|
|
197
|
+
be forced into a tiny single-file step.
|
|
198
|
+
5. Do that segment only. Stay inside `goal_boundary` when present and keep
|
|
199
|
+
public/private boundaries intact. Public-safe repo publication is not an
|
|
200
|
+
operator gate by itself: for routine public project work, commit, push, and
|
|
201
|
+
PR creation may proceed autonomously after validation and a clean
|
|
202
|
+
public/private boundary scan. Stop and surface a user/controller gate only
|
|
203
|
+
for private or company-internal material, credentials, destructive git
|
|
204
|
+
operations, production actions, or repository rules that explicitly require
|
|
205
|
+
review.
|
|
206
|
+
6. Run the smallest useful validation.
|
|
207
|
+
7. Write back changed files, validation, critic, and next action to the active
|
|
208
|
+
state. If a user/owner todo appears, do not hide it in prose: use
|
|
209
|
+
`{cli_bin} todo add --goal-id {goal_id} --role user --task-class user_gate --blocks-agent <agent-id>`
|
|
210
|
+
or `{cli_bin} todo add --goal-id {goal_id} --role user --task-class user_action`.
|
|
211
|
+
Use `--role agent` for project-agent follow-up work.
|
|
212
|
+
{HOST_LOOP_TODO_CLOSEOUT_RULE}
|
|
213
|
+
For the full field contract, see `docs/project-agent-todo-contract.md` in
|
|
214
|
+
the LoopX checkout.
|
|
215
|
+
8. After validation/writeback, use actual class/scale/outcome; never default or
|
|
216
|
+
upgrade to `multi_surface` / `outcome_progress`. Record accountable delivery:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
{progress_refresh_state_command}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Spend consumes this causal record; plain state-only refresh cannot replace
|
|
223
|
+
it. Then spend once:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
{quota_spend_command}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Do not append spend for quiet `should_run=false` skips, preflight failures,
|
|
230
|
+
pure dry-run previews, or duplicate accounting attempts. If
|
|
231
|
+
`should_run=false` but `safe_bypass_allowed=true` and you actually completed
|
|
232
|
+
a bounded safe-bypass step, append this same spend event once after
|
|
233
|
+
validation/writeback.
|
|
234
|
+
|
|
235
|
+
9. After spend, optionally refresh state-only:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
{refresh_state_command}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Never emit accountable progress after spend; it creates an unspent record.
|
|
242
|
+
|
|
243
|
+
10. Return compactly under `interaction_contract.user_channel.notify`:
|
|
244
|
+
`NOTIFY` only for concrete artifact/gate/blocker/self-stop when the
|
|
245
|
+
authority is `NOTIFY`; otherwise stay quiet `DONT_NOTIFY`.
|
|
246
|
+
|
|
247
|
+
{material_queue_rule}
|
|
248
|
+
{permission_rule}"""
|
|
249
|
+
def render_brief_heartbeat_task_body(
|
|
250
|
+
*,
|
|
251
|
+
goal_id: str,
|
|
252
|
+
active_state: str,
|
|
253
|
+
cli_preflight: str,
|
|
254
|
+
pr_review_pre_quota_command: str,
|
|
255
|
+
quota_guard_command: str,
|
|
256
|
+
quota_spend_command: str,
|
|
257
|
+
refresh_state_command: str,
|
|
258
|
+
progress_refresh_state_command: str,
|
|
259
|
+
material_queue_rule: str,
|
|
260
|
+
permission_rule: str,
|
|
261
|
+
cli_bin: str,
|
|
262
|
+
agent_scope_instruction: str,
|
|
263
|
+
expanded_prompt_command: str,
|
|
264
|
+
compact_prompt_command: str,
|
|
265
|
+
brief_prompt_command: str,
|
|
266
|
+
thin_prompt_command: str,
|
|
267
|
+
) -> str:
|
|
268
|
+
scope_block = f"\n{agent_scope_instruction}\n" if agent_scope_instruction else ""
|
|
269
|
+
pr_review_pre_quota_block = (
|
|
270
|
+
f"{pr_review_pre_quota_command}\n" if pr_review_pre_quota_command else ""
|
|
271
|
+
)
|
|
272
|
+
return f"""Advance `{goal_id}` using `{active_state}`.
|
|
273
|
+
|
|
274
|
+
Brief installed LoopX heartbeat. Thin dispatcher; detail:
|
|
275
|
+
`{compact_prompt_command}`.
|
|
276
|
+
{scope_block}
|
|
277
|
+
|
|
278
|
+
Guard/retry; `LOOPX_TURN=<current_time_iso>`:
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
{cli_preflight}
|
|
282
|
+
{pr_review_pre_quota_block}{quota_guard_command}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Fail:quiet.
|
|
286
|
+
|
|
287
|
+
{HEARTBEAT_NOTIFICATION_RULE_THIN}
|
|
288
|
+
{HEARTBEAT_VISION_WRITEBACK_RULE_SHORT}
|
|
289
|
+
|
|
290
|
+
If `should_run=false`: follow user channel. `monitor_quiet_skip`: receipt/stall
|
|
291
|
+
done; quiet unless replan; write failure: retry same id. External/wait monitor:
|
|
292
|
+
one read-only poll; new evidence -> writeback/spend. Safe bypass if allowed.
|
|
293
|
+
{SCHEDULER_HINT_THIN_RULE}
|
|
294
|
+
`lark_event_inbox`: reply_due: drain_command -> effect/reply/readback/ACK.
|
|
295
|
+
|
|
296
|
+
If `should_run=true`: fetch compact; use `status --limit 3` and
|
|
297
|
+
`review-packet --handoff-only`. Obey
|
|
298
|
+
`execution_obligation`, `effective_action`, `recovery_delivery_allowed`,
|
|
299
|
+
`heartbeat_recommendation`, `safe_bypass_kind=outcome_floor_recovery`,
|
|
300
|
+
`goal_boundary`, `delivery_batch_scale`, `delivery_outcome`, outcome streaks,
|
|
301
|
+
`handoff_delivery_contract`; do 1 bounded segment/batch when
|
|
302
|
+
`execution_obligation.must_attempt_work=true`; if recovery, run
|
|
303
|
+
ranker/cross-domain evidence recovery or blocker writeback;
|
|
304
|
+
validate/writeback/todos; {HOST_LOOP_TODO_CLOSEOUT_COMPACT_RULE} Progress(actual,no upgrade):
|
|
305
|
+
`{progress_refresh_state_command}`
|
|
306
|
+
Spend:
|
|
307
|
+
`{quota_spend_command}`
|
|
308
|
+
Post-spend state:
|
|
309
|
+
`{refresh_state_command}`
|
|
310
|
+
|
|
311
|
+
No spend for quiet skips, preflight failures, blocker-push asks, dry-runs, or
|
|
312
|
+
duplicate accounting. Return only under `user_channel.notify=NOTIFY`; else quiet.
|
|
313
|
+
|
|
314
|
+
{material_queue_rule}
|
|
315
|
+
{permission_rule}"""
|
|
316
|
+
def render_compact_heartbeat_task_body(
|
|
317
|
+
*,
|
|
318
|
+
goal_id: str,
|
|
319
|
+
active_state: str,
|
|
320
|
+
cli_preflight: str,
|
|
321
|
+
pr_review_pre_quota_command: str,
|
|
322
|
+
quota_guard_command: str,
|
|
323
|
+
quota_spend_command: str,
|
|
324
|
+
refresh_state_command: str,
|
|
325
|
+
progress_refresh_state_command: str,
|
|
326
|
+
material_queue_rule: str,
|
|
327
|
+
permission_rule: str,
|
|
328
|
+
cli_bin: str,
|
|
329
|
+
agent_scope_instruction: str,
|
|
330
|
+
expanded_prompt_command: str,
|
|
331
|
+
compact_prompt_command: str,
|
|
332
|
+
brief_prompt_command: str,
|
|
333
|
+
thin_prompt_command: str,
|
|
334
|
+
) -> str:
|
|
335
|
+
scope_block = f"\n{agent_scope_instruction}\n" if agent_scope_instruction else ""
|
|
336
|
+
pr_review_pre_quota_block = (
|
|
337
|
+
f"{pr_review_pre_quota_command}\n" if pr_review_pre_quota_command else ""
|
|
338
|
+
)
|
|
339
|
+
return f"""Advance `{goal_id}` using `{active_state}`.
|
|
340
|
+
|
|
341
|
+
This compact LoopX heartbeat body; policy:
|
|
342
|
+
registry/state/adapter/`goal_boundary`.
|
|
343
|
+
Expanded lifecycle contract: `{expanded_prompt_command}`.
|
|
344
|
+
{scope_block}
|
|
345
|
+
|
|
346
|
+
Preflight/guard; `LOOPX_TURN=<current_time_iso>`; reuse:
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
{cli_preflight}
|
|
350
|
+
{pr_review_pre_quota_block}{quota_guard_command}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Preflight fail: quiet; no work/spend.
|
|
354
|
+
|
|
355
|
+
{SCHEDULER_HINT_COMPACT_RULE}
|
|
356
|
+
{HEARTBEAT_VISION_WRITEBACK_RULE_SHORT}
|
|
357
|
+
|
|
358
|
+
`lark_event_inbox`: reply_due: drain_command -> effect/reply/readback/ACK.
|
|
359
|
+
|
|
360
|
+
Output policy: authority=`interaction_contract.user_channel.notify`;
|
|
361
|
+
external=`NOTIFY`; quiet=`DONT_NOTIFY`; quiet_missing_action=`internal_repair`.
|
|
362
|
+
|
|
363
|
+
If `should_run=false`: `monitor_quiet_skip` -> receipt/stall; quiet unless
|
|
364
|
+
replan; failed write -> retry id; no edits/spend; receipts do not self-stop.
|
|
365
|
+
Only under `NOTIFY`, `state=operator_gate`/`notify_user_on_open_todo=true`
|
|
366
|
+
permit concrete blocker-push; else quiet.
|
|
367
|
+
Honor repeat/cooldown. `safe_bypass_allowed=true`: one validated step. Wait
|
|
368
|
+
monitor: one read-only poll; unchanged quiet, new evidence writeback/spend.
|
|
369
|
+
|
|
370
|
+
If `should_run=true`:
|
|
371
|
+
1. Read active state, Priority Stack, progress/critic, `goal_boundary`,
|
|
372
|
+
`attention_queue.items` / `project_asset`, and guard `user_todo_summary`.
|
|
373
|
+
Legacy/raw fallback is not owner/gate/stop authority. Treat
|
|
374
|
+
`run_history.latest_runs` as drill-down only.
|
|
375
|
+
2. Goal-owned blocker: stop its path. Under `NOTIFY`, send a concrete Chinese
|
|
376
|
+
blocker-push; under `DONT_NOTIFY`, repair internally and stay quiet.
|
|
377
|
+
Dependency/sibling todos: record; continue audit.
|
|
378
|
+
3. If `effective_action=outcome_floor_recovery` or
|
|
379
|
+
`recovery_delivery_allowed=true` or
|
|
380
|
+
`safe_bypass_kind=outcome_floor_recovery`, run only ranker/cross-domain
|
|
381
|
+
evidence artifact or blocker recovery; no ordinary delivery or
|
|
382
|
+
surface/synthetic-only work.
|
|
383
|
+
4. Follow `execution_obligation`: `notify` is not an execution gate.
|
|
384
|
+
`must_attempt_work=true` means one bounded segment even with
|
|
385
|
+
`notify=DONT_NOTIFY`; quiet no-op needs `must_attempt_work=false` and
|
|
386
|
+
`user_channel.notify=DONT_NOTIFY`.
|
|
387
|
+
Then follow `heartbeat_recommendation`:
|
|
388
|
+
`run_first_read_only_map`: exact real-map, validate/save/refresh/spend;
|
|
389
|
+
notify only under `NOTIFY`;
|
|
390
|
+
`mapped_noop_if_unchanged` plus
|
|
391
|
+
`stop_if_unchanged=true` means quiet no-op if no new instruction/evidence/
|
|
392
|
+
todo/stale source/safe handoff.
|
|
393
|
+
`task_orchestration_contract`: spawn admitted child lanes or resume peers;
|
|
394
|
+
the coordinator alone accepts evidence and writes/spends once.
|
|
395
|
+
Check `delivery_batch_scale`, `delivery_outcome`,
|
|
396
|
+
`post_handoff_outcome_gap_streak`, `handoff_delivery_contract`; obey
|
|
397
|
+
repeated-small/surface-loop contracts.
|
|
398
|
+
5. Run steering audit: compare P0/P1/P2, continuation checks,
|
|
399
|
+
compute/focus quota, bottleneck lens.
|
|
400
|
+
6. no-progress self-repair: obey `autonomous_replan_obligation` or
|
|
401
|
+
`execution_obligation.must_attempt_work=true`; after 2 eligible stall
|
|
402
|
+
heartbeats with only status/brief checks, replan before quiet no-op.
|
|
403
|
+
Pause/delete only if repair stays stuck 2 more turns.
|
|
404
|
+
7. Choose one bounded segment; coherent batch is OK with clear validation.
|
|
405
|
+
Public-safe commit/push/PR may proceed after validation/clean scan. Stop for
|
|
406
|
+
private/company material, credentials, destructive git, production, or review rules.
|
|
407
|
+
8. Validate; write files/validation/critic/next action to active state;
|
|
408
|
+
use `{cli_bin} todo add --goal-id {goal_id} --role user --task-class user_gate|user_action`
|
|
409
|
+
for owner todos and `--role agent` for agent todos, not prose.
|
|
410
|
+
{HOST_LOOP_TODO_CLOSEOUT_COMPACT_RULE}
|
|
411
|
+
9. Account actual validated class/scale/outcome; never default/upgrade. Then
|
|
412
|
+
refresh and spend:
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
{progress_refresh_state_command}
|
|
416
|
+
{quota_spend_command}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
10. Optional state-only post-spend: `{refresh_state_command}`; never accountable.
|
|
420
|
+
|
|
421
|
+
No spend for quiet skips, preflight failures, blocker-push asks, dry-runs,
|
|
422
|
+
self-cancel turns, or duplicate accounting.
|
|
423
|
+
|
|
424
|
+
Return only under `user_channel.notify=NOTIFY`; otherwise stay quiet.
|
|
425
|
+
|
|
426
|
+
{material_queue_rule}
|
|
427
|
+
{permission_rule}"""
|
|
428
|
+
def render_visible_goal_task_body(
|
|
429
|
+
*,
|
|
430
|
+
goal_id: str,
|
|
431
|
+
active_state: str,
|
|
432
|
+
cli_preflight: str,
|
|
433
|
+
pr_review_pre_quota_command: str,
|
|
434
|
+
quota_guard_command: str,
|
|
435
|
+
quota_spend_command: str,
|
|
436
|
+
refresh_state_command: str,
|
|
437
|
+
progress_refresh_state_command: str,
|
|
438
|
+
material_queue_rule: str,
|
|
439
|
+
permission_rule: str,
|
|
440
|
+
cli_bin: str,
|
|
441
|
+
agent_scope_instruction: str,
|
|
442
|
+
expanded_prompt_command: str,
|
|
443
|
+
compact_prompt_command: str,
|
|
444
|
+
brief_prompt_command: str,
|
|
445
|
+
thin_prompt_command: str,
|
|
446
|
+
) -> str:
|
|
447
|
+
del (
|
|
448
|
+
cli_preflight,
|
|
449
|
+
expanded_prompt_command,
|
|
450
|
+
compact_prompt_command,
|
|
451
|
+
brief_prompt_command,
|
|
452
|
+
thin_prompt_command,
|
|
453
|
+
)
|
|
454
|
+
return _render_goal_task_body(
|
|
455
|
+
goal_id=goal_id,
|
|
456
|
+
active_state=active_state,
|
|
457
|
+
host_preamble=(
|
|
458
|
+
"in this visible Codex `/goal`. It is interactive, not a heartbeat "
|
|
459
|
+
"automation: no automation/RRULE/`LOOPX_TURN`."
|
|
460
|
+
),
|
|
461
|
+
completion_subject="visible Goal",
|
|
462
|
+
pr_review_pre_quota_command=pr_review_pre_quota_command,
|
|
463
|
+
quota_guard_command=quota_guard_command,
|
|
464
|
+
quota_spend_command=quota_spend_command,
|
|
465
|
+
progress_refresh_state_command=progress_refresh_state_command,
|
|
466
|
+
material_queue_rule=material_queue_rule,
|
|
467
|
+
permission_rule=permission_rule,
|
|
468
|
+
agent_scope_instruction=agent_scope_instruction,
|
|
469
|
+
host_wait_rule=CODEX_NATIVE_GOAL_UNCHANGED_WAIT_RULE,
|
|
470
|
+
)
|
|
471
|
+
def render_traex_visible_goal_task_body(
|
|
472
|
+
*,
|
|
473
|
+
goal_id: str,
|
|
474
|
+
active_state: str,
|
|
475
|
+
cli_preflight: str,
|
|
476
|
+
pr_review_pre_quota_command: str,
|
|
477
|
+
quota_guard_command: str,
|
|
478
|
+
quota_spend_command: str,
|
|
479
|
+
refresh_state_command: str,
|
|
480
|
+
progress_refresh_state_command: str,
|
|
481
|
+
material_queue_rule: str,
|
|
482
|
+
permission_rule: str,
|
|
483
|
+
cli_bin: str,
|
|
484
|
+
agent_scope_instruction: str,
|
|
485
|
+
expanded_prompt_command: str,
|
|
486
|
+
compact_prompt_command: str,
|
|
487
|
+
brief_prompt_command: str,
|
|
488
|
+
thin_prompt_command: str,
|
|
489
|
+
) -> str:
|
|
490
|
+
del (
|
|
491
|
+
cli_preflight,
|
|
492
|
+
refresh_state_command,
|
|
493
|
+
cli_bin,
|
|
494
|
+
expanded_prompt_command,
|
|
495
|
+
compact_prompt_command,
|
|
496
|
+
brief_prompt_command,
|
|
497
|
+
thin_prompt_command,
|
|
498
|
+
)
|
|
499
|
+
return _render_goal_task_body(
|
|
500
|
+
goal_id=goal_id,
|
|
501
|
+
active_state=active_state,
|
|
502
|
+
host_preamble=(
|
|
503
|
+
"in this visible\nTraeX `/goal` task; its Goal owns interactive "
|
|
504
|
+
"continuation."
|
|
505
|
+
),
|
|
506
|
+
completion_subject="visible Goal",
|
|
507
|
+
pr_review_pre_quota_command=pr_review_pre_quota_command,
|
|
508
|
+
quota_guard_command=quota_guard_command,
|
|
509
|
+
quota_spend_command=quota_spend_command,
|
|
510
|
+
progress_refresh_state_command=progress_refresh_state_command,
|
|
511
|
+
material_queue_rule=material_queue_rule,
|
|
512
|
+
permission_rule=permission_rule,
|
|
513
|
+
agent_scope_instruction=agent_scope_instruction,
|
|
514
|
+
host_wait_rule="",
|
|
515
|
+
)
|
|
516
|
+
def _render_goal_task_body(
|
|
517
|
+
*,
|
|
518
|
+
goal_id: str,
|
|
519
|
+
active_state: str,
|
|
520
|
+
host_preamble: str,
|
|
521
|
+
completion_subject: str,
|
|
522
|
+
pr_review_pre_quota_command: str,
|
|
523
|
+
quota_guard_command: str,
|
|
524
|
+
quota_spend_command: str,
|
|
525
|
+
progress_refresh_state_command: str,
|
|
526
|
+
material_queue_rule: str,
|
|
527
|
+
permission_rule: str,
|
|
528
|
+
agent_scope_instruction: str,
|
|
529
|
+
host_wait_rule: str,
|
|
530
|
+
) -> str:
|
|
531
|
+
scope_block = f"\n{agent_scope_instruction}\n" if agent_scope_instruction else ""
|
|
532
|
+
prequota_block = (
|
|
533
|
+
f"Run `{pr_review_pre_quota_command}` first.\n"
|
|
534
|
+
if pr_review_pre_quota_command
|
|
535
|
+
else ""
|
|
536
|
+
)
|
|
537
|
+
policy_tail = _render_compact_policy_tail(
|
|
538
|
+
material_queue_rule=material_queue_rule,
|
|
539
|
+
permission_rule=permission_rule,
|
|
540
|
+
include_default_permission=True,
|
|
541
|
+
)
|
|
542
|
+
return f"""Advance LoopX goal `{goal_id}` from `{active_state}` {host_preamble}
|
|
543
|
+
{scope_block}
|
|
544
|
+
|
|
545
|
+
{RUNTIME_EXECUTION_ROUTING_RULE}
|
|
546
|
+
|
|
547
|
+
At each continuation inspect LoopX state/status/repo. {prequota_block}{HOST_LOOP_QUOTA_DISPATCH_RULE}
|
|
548
|
+
Guard: `{quota_guard_command}`.
|
|
549
|
+
|
|
550
|
+
`should_run=false`: no delivery/spend; surface a concrete Chinese action/gate only
|
|
551
|
+
for `user_channel.notify=NOTIFY`, otherwise wait.{host_wait_rule}
|
|
552
|
+
|
|
553
|
+
`should_run=true`: take the highest-priority in-scope unblocked agent todo; honor
|
|
554
|
+
claims/leases and blocker-push/recovery obligations. Before dependencies, persist changed
|
|
555
|
+
scope/acceptance/non-goal evidence and next todo. One bounded segment stays in this
|
|
556
|
+
same Goal: a segment is progress, not a new Goal boundary. Reuse this activation
|
|
557
|
+
across phases/revisions until terminal; do not create a successor host Goal merely to
|
|
558
|
+
continue. Validate/write public-safe evidence, critic, and next action.
|
|
559
|
+
{HOST_LOOP_TODO_CLOSEOUT_RULE}
|
|
560
|
+
|
|
561
|
+
Use actual classification/scale/outcome only; never default or upgrade them to
|
|
562
|
+
`multi_surface` / `outcome_progress`; refresh the accountable progress record before
|
|
563
|
+
spending:
|
|
564
|
+
`{progress_refresh_state_command}`. Then spend exactly once against that refresh:
|
|
565
|
+
`{quota_spend_command}`.
|
|
566
|
+
|
|
567
|
+
No spend: gate/wait/dry-run/preflight failure/no-op/duplicate. Stop: private/company
|
|
568
|
+
material, credentials, destructive git, unauthorized production, or repo rules.
|
|
569
|
+
Complete this {completion_subject} only on LoopX terminal success with no follow-up; else
|
|
570
|
+
keep the gate or next action explicit.
|
|
571
|
+
|
|
572
|
+
{policy_tail}"""
|
|
573
|
+
def render_ark_managed_agent_goal_task_body(
|
|
574
|
+
*,
|
|
575
|
+
goal_id: str,
|
|
576
|
+
active_state: str,
|
|
577
|
+
cli_preflight: str,
|
|
578
|
+
pr_review_pre_quota_command: str,
|
|
579
|
+
quota_guard_command: str,
|
|
580
|
+
quota_spend_command: str,
|
|
581
|
+
refresh_state_command: str,
|
|
582
|
+
progress_refresh_state_command: str,
|
|
583
|
+
material_queue_rule: str,
|
|
584
|
+
permission_rule: str,
|
|
585
|
+
cli_bin: str,
|
|
586
|
+
agent_scope_instruction: str,
|
|
587
|
+
expanded_prompt_command: str,
|
|
588
|
+
compact_prompt_command: str,
|
|
589
|
+
brief_prompt_command: str,
|
|
590
|
+
thin_prompt_command: str,
|
|
591
|
+
) -> str:
|
|
592
|
+
del (
|
|
593
|
+
cli_preflight,
|
|
594
|
+
refresh_state_command,
|
|
595
|
+
cli_bin,
|
|
596
|
+
expanded_prompt_command,
|
|
597
|
+
compact_prompt_command,
|
|
598
|
+
brief_prompt_command,
|
|
599
|
+
thin_prompt_command,
|
|
600
|
+
)
|
|
601
|
+
return _render_goal_task_body(
|
|
602
|
+
goal_id=goal_id,
|
|
603
|
+
active_state=active_state,
|
|
604
|
+
host_preamble=(
|
|
605
|
+
"in one Goal activation. The Goal runtime owns continuation and inner "
|
|
606
|
+
"iterations. This is a goal loop, not automation; do not invoke LoopX Turn."
|
|
607
|
+
),
|
|
608
|
+
completion_subject="Goal",
|
|
609
|
+
pr_review_pre_quota_command=pr_review_pre_quota_command,
|
|
610
|
+
quota_guard_command=quota_guard_command,
|
|
611
|
+
quota_spend_command=quota_spend_command,
|
|
612
|
+
progress_refresh_state_command=progress_refresh_state_command,
|
|
613
|
+
material_queue_rule=material_queue_rule,
|
|
614
|
+
permission_rule=permission_rule,
|
|
615
|
+
agent_scope_instruction=agent_scope_instruction,
|
|
616
|
+
host_wait_rule="",
|
|
617
|
+
)
|
|
618
|
+
def render_thin_heartbeat_task_body(
|
|
619
|
+
*,
|
|
620
|
+
goal_id: str,
|
|
621
|
+
active_state: str,
|
|
622
|
+
cli_preflight: str,
|
|
623
|
+
pr_review_pre_quota_command: str,
|
|
624
|
+
quota_guard_command: str,
|
|
625
|
+
quota_spend_command: str,
|
|
626
|
+
refresh_state_command: str,
|
|
627
|
+
progress_refresh_state_command: str,
|
|
628
|
+
material_queue_rule: str,
|
|
629
|
+
permission_rule: str,
|
|
630
|
+
cli_bin: str,
|
|
631
|
+
agent_scope_instruction: str,
|
|
632
|
+
expanded_prompt_command: str,
|
|
633
|
+
compact_prompt_command: str,
|
|
634
|
+
brief_prompt_command: str,
|
|
635
|
+
thin_prompt_command: str,
|
|
636
|
+
) -> str:
|
|
637
|
+
policy_tail = _render_compact_policy_tail(
|
|
638
|
+
material_queue_rule=material_queue_rule,
|
|
639
|
+
permission_rule=permission_rule,
|
|
640
|
+
)
|
|
641
|
+
scope_sentence = f"\n{agent_scope_instruction}" if agent_scope_instruction else ""
|
|
642
|
+
quota_guard_instruction = (
|
|
643
|
+
f"`{quota_guard_command}`"
|
|
644
|
+
if any(
|
|
645
|
+
marker in quota_guard_command
|
|
646
|
+
for marker in (
|
|
647
|
+
"--available-capability",
|
|
648
|
+
"--runtime-profile",
|
|
649
|
+
"--codex-app",
|
|
650
|
+
"--host-surface",
|
|
651
|
+
" -H ",
|
|
652
|
+
)
|
|
653
|
+
)
|
|
654
|
+
else "`quota should-run`"
|
|
655
|
+
)
|
|
656
|
+
pr_review_pre_quota_instruction = (
|
|
657
|
+
f"`{pr_review_pre_quota_command}`\n"
|
|
658
|
+
if pr_review_pre_quota_command
|
|
659
|
+
else ""
|
|
660
|
+
)
|
|
661
|
+
return f"""Advance `{goal_id}` from {active_state}.
|
|
662
|
+
|
|
663
|
+
{RUNTIME_EXECUTION_ROUTING_RULE}
|
|
664
|
+
{scope_sentence}
|
|
665
|
+
|
|
666
|
+
{HOST_LOOP_QUOTA_DISPATCH_RULE}
|
|
667
|
+
`LOOPX_TURN=<current_time_iso>`; reuse.
|
|
668
|
+
{pr_review_pre_quota_instruction}{quota_guard_instruction}.
|
|
669
|
+
{HEARTBEAT_NOTIFICATION_RULE_SHORT}
|
|
670
|
+
{RUNTIME_CAPABILITY_PROJECTION_THIN_RULE}
|
|
671
|
+
{SCHEDULER_HINT_THIN_RULE}
|
|
672
|
+
{HEARTBEAT_VISION_WRITEBACK_RULE_SHORT}
|
|
673
|
+
Done->todo/rationale; guard receipt; 2 stalls->replan.
|
|
674
|
+
`lark_event_inbox`: reply_due; drain_command/reply-readback/ACK.
|
|
675
|
+
|
|
676
|
+
P0 blocked: safe P1/P2; monitor quiet/no-spend.
|
|
677
|
+
|
|
678
|
+
No project branches; {policy_tail} Stop: private material, credentials,
|
|
679
|
+
destructive git, unauthorized prod."""
|
|
680
|
+
def render_heartbeat_generator_inputs_markdown(payload: dict[str, Any]) -> str:
|
|
681
|
+
interface_budget = payload.get("interface_budget") if isinstance(payload.get("interface_budget"), dict) else {}
|
|
682
|
+
lines = [
|
|
683
|
+
"## Generator Inputs",
|
|
684
|
+
"",
|
|
685
|
+
f"- goal_id: `{payload.get('goal_id')}`",
|
|
686
|
+
f"- active_state: `{payload.get('active_state')}`",
|
|
687
|
+
f"- active_state_source: `{payload.get('active_state_source')}`",
|
|
688
|
+
f"- resolved_active_state: `{payload.get('resolved_active_state')}`",
|
|
689
|
+
f"- compact: `{payload.get('compact')}`",
|
|
690
|
+
f"- brief: `{payload.get('brief')}`",
|
|
691
|
+
f"- thin: `{payload.get('thin')}`",
|
|
692
|
+
f"- cli_bin: `{payload.get('cli_bin')}`",
|
|
693
|
+
f"- agent_id: `{payload.get('agent_id')}`",
|
|
694
|
+
f"- agent_model: `{payload.get('agent_model')}`",
|
|
695
|
+
f"- agent_role: `{payload.get('agent_role')}`",
|
|
696
|
+
]
|
|
697
|
+
lines.extend(
|
|
698
|
+
[
|
|
699
|
+
f"- agent_scopes: `{payload.get('agent_scopes')}`",
|
|
700
|
+
f"- expanded_prompt_command: `{payload.get('expanded_prompt_command')}`",
|
|
701
|
+
f"- compact_prompt_command: `{payload.get('compact_prompt_command')}`",
|
|
702
|
+
f"- brief_prompt_command: `{payload.get('brief_prompt_command')}`",
|
|
703
|
+
f"- thin_prompt_command: `{payload.get('thin_prompt_command')}`",
|
|
704
|
+
"- pr_review_pre_quota_command: "
|
|
705
|
+
f"`{payload.get('pr_review_pre_quota_command')}`",
|
|
706
|
+
f"- quota_guard_command: `{payload.get('quota_guard_command')}`",
|
|
707
|
+
f"- quota_spend_command: `{payload.get('quota_spend_command')}`",
|
|
708
|
+
f"- cli_preflight: `{payload.get('cli_preflight')}`",
|
|
709
|
+
"- interface_budget: "
|
|
710
|
+
f"mode=`{interface_budget.get('mode')}` "
|
|
711
|
+
f"budget_chars=`{interface_budget.get('budget_char_count')}` "
|
|
712
|
+
f"max_chars=`{interface_budget.get('max_chars')}` "
|
|
713
|
+
f"within_budget=`{interface_budget.get('within_budget')}`",
|
|
714
|
+
"",
|
|
715
|
+
]
|
|
716
|
+
)
|
|
717
|
+
return "\n".join(lines)
|
|
718
|
+
def render_heartbeat_prompt_error_markdown(payload: dict[str, Any]) -> str:
|
|
719
|
+
return f"""# Heartbeat Automation Prompt Error
|
|
720
|
+
|
|
721
|
+
No heartbeat task body was generated.
|
|
722
|
+
|
|
723
|
+
## Error
|
|
724
|
+
|
|
725
|
+
```text
|
|
726
|
+
{payload.get("error") or "unknown heartbeat-prompt generation error"}
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
{render_heartbeat_generator_inputs_markdown(payload)}"""
|
|
730
|
+
def render_heartbeat_prompt_markdown(payload: dict[str, Any]) -> str:
|
|
731
|
+
if payload.get("ok") is False:
|
|
732
|
+
return render_heartbeat_prompt_error_markdown(payload)
|
|
733
|
+
if payload.get("visible_goal_host") == "traex-cli":
|
|
734
|
+
return f"""# Visible TraeX Goal Prompt
|
|
735
|
+
|
|
736
|
+
Paste this task body into the visible TraeX `/goal` task.
|
|
737
|
+
|
|
738
|
+
````text
|
|
739
|
+
{payload.get("task_body", "")}
|
|
740
|
+
````
|
|
741
|
+
|
|
742
|
+
{render_heartbeat_generator_inputs_markdown(payload)}"""
|
|
743
|
+
if payload.get("thin"):
|
|
744
|
+
style = "thin "
|
|
745
|
+
elif payload.get("brief"):
|
|
746
|
+
style = "brief "
|
|
747
|
+
elif payload.get("compact"):
|
|
748
|
+
style = "compact "
|
|
749
|
+
else:
|
|
750
|
+
style = ""
|
|
751
|
+
return f"""# Heartbeat Automation Prompt
|
|
752
|
+
|
|
753
|
+
Copy this {style}task body into a Codex App heartbeat automation.
|
|
754
|
+
|
|
755
|
+
````text
|
|
756
|
+
{payload.get("task_body", "")}
|
|
757
|
+
````
|
|
758
|
+
|
|
759
|
+
{render_heartbeat_generator_inputs_markdown(payload)}"""
|