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,559 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import socket
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
from typing import Any, Protocol
|
|
8
|
+
from urllib.error import HTTPError, URLError
|
|
9
|
+
from urllib.request import HTTPRedirectHandler, Request, build_opener
|
|
10
|
+
|
|
11
|
+
from ..quota.turn_envelope import (
|
|
12
|
+
quota_action_signature_document,
|
|
13
|
+
turn_envelope_action_signature_document,
|
|
14
|
+
)
|
|
15
|
+
from .model_behavior_qualification import (
|
|
16
|
+
MODEL_BEHAVIOR_ACTOR_RESULT_SCHEMA_VERSION,
|
|
17
|
+
ModelBehaviorActor,
|
|
18
|
+
normalize_model_behavior_actor_request,
|
|
19
|
+
)
|
|
20
|
+
from .onboarding_model_behavior_qualification import (
|
|
21
|
+
ONBOARDING_MODEL_BEHAVIOR_RESULT_SCHEMA_VERSION,
|
|
22
|
+
normalize_onboarding_model_behavior_actor_request,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
DOUBAO_2_1_PRO_MODEL = "doubao-seed-2-1-pro-260628"
|
|
27
|
+
DOUBAO_2_1_TURBO_MODEL = "doubao-seed-2-1-turbo-260628"
|
|
28
|
+
DOUBAO_CHAT_COMPLETIONS_ENDPOINT = (
|
|
29
|
+
"https://ark.cn-beijing.volces.com/api/v3/chat/completions"
|
|
30
|
+
)
|
|
31
|
+
ARK_API_KEY_ENV = "ARK_API_KEY"
|
|
32
|
+
DOUBAO_MODEL_ENV = "LOOPX_MODEL_BEHAVIOR_MODEL"
|
|
33
|
+
MODEL_BEHAVIOR_PROVIDER_INPUT_SCHEMA_VERSION = "model_behavior_provider_input_v0"
|
|
34
|
+
|
|
35
|
+
_ALLOWED_MODELS = {DOUBAO_2_1_PRO_MODEL, DOUBAO_2_1_TURBO_MODEL}
|
|
36
|
+
_MAX_PROVIDER_RESPONSE_BYTES = 1_048_576
|
|
37
|
+
_MAX_DECISION_TOKENS = 4096
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class DoubaoActorTransport(Protocol):
|
|
41
|
+
def __call__(
|
|
42
|
+
self,
|
|
43
|
+
*,
|
|
44
|
+
endpoint: str,
|
|
45
|
+
headers: Mapping[str, str],
|
|
46
|
+
body: bytes,
|
|
47
|
+
timeout_seconds: float,
|
|
48
|
+
) -> Mapping[str, Any]: ...
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class DoubaoActorTransportError(RuntimeError):
|
|
52
|
+
def __init__(self, message: str, *, error_code: str) -> None:
|
|
53
|
+
super().__init__(message)
|
|
54
|
+
self.error_code = error_code
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class _NoRedirectHandler(HTTPRedirectHandler):
|
|
58
|
+
def redirect_request(
|
|
59
|
+
self,
|
|
60
|
+
req: Request,
|
|
61
|
+
fp: Any,
|
|
62
|
+
code: int,
|
|
63
|
+
msg: str,
|
|
64
|
+
headers: Any,
|
|
65
|
+
newurl: str,
|
|
66
|
+
) -> None:
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _direct_ark_transport(
|
|
71
|
+
*,
|
|
72
|
+
endpoint: str,
|
|
73
|
+
headers: Mapping[str, str],
|
|
74
|
+
body: bytes,
|
|
75
|
+
timeout_seconds: float,
|
|
76
|
+
) -> Mapping[str, Any]:
|
|
77
|
+
if endpoint != DOUBAO_CHAT_COMPLETIONS_ENDPOINT:
|
|
78
|
+
raise DoubaoActorTransportError(
|
|
79
|
+
"Doubao actor endpoint is not the canonical Ark endpoint",
|
|
80
|
+
error_code="noncanonical_endpoint",
|
|
81
|
+
)
|
|
82
|
+
request = Request(endpoint, data=body, headers=dict(headers), method="POST")
|
|
83
|
+
opener = build_opener(_NoRedirectHandler())
|
|
84
|
+
try:
|
|
85
|
+
with opener.open(request, timeout=timeout_seconds) as response:
|
|
86
|
+
payload = response.read(_MAX_PROVIDER_RESPONSE_BYTES + 1)
|
|
87
|
+
except HTTPError as exc:
|
|
88
|
+
if exc.code == 401:
|
|
89
|
+
raise DoubaoActorTransportError(
|
|
90
|
+
"Doubao actor authentication failed; refresh ARK_API_KEY before retrying",
|
|
91
|
+
error_code="provider_authentication_failed",
|
|
92
|
+
) from None
|
|
93
|
+
raise DoubaoActorTransportError(
|
|
94
|
+
f"Doubao actor request failed with HTTP status {exc.code}",
|
|
95
|
+
error_code="provider_http_error",
|
|
96
|
+
) from None
|
|
97
|
+
except TimeoutError:
|
|
98
|
+
raise DoubaoActorTransportError(
|
|
99
|
+
"Doubao actor provider timed out",
|
|
100
|
+
error_code="provider_timeout",
|
|
101
|
+
) from None
|
|
102
|
+
except URLError as exc:
|
|
103
|
+
if isinstance(exc.reason, (TimeoutError, socket.timeout)):
|
|
104
|
+
raise DoubaoActorTransportError(
|
|
105
|
+
"Doubao actor provider timed out",
|
|
106
|
+
error_code="provider_timeout",
|
|
107
|
+
) from None
|
|
108
|
+
raise DoubaoActorTransportError(
|
|
109
|
+
"Doubao actor provider transport failed",
|
|
110
|
+
error_code="provider_transport_failed",
|
|
111
|
+
) from None
|
|
112
|
+
if len(payload) > _MAX_PROVIDER_RESPONSE_BYTES:
|
|
113
|
+
raise DoubaoActorTransportError(
|
|
114
|
+
"Doubao actor response exceeded the size limit",
|
|
115
|
+
error_code="provider_response_too_large",
|
|
116
|
+
)
|
|
117
|
+
try:
|
|
118
|
+
decoded = json.loads(payload)
|
|
119
|
+
except (UnicodeDecodeError, json.JSONDecodeError):
|
|
120
|
+
raise DoubaoActorTransportError(
|
|
121
|
+
"Doubao actor returned invalid JSON",
|
|
122
|
+
error_code="provider_invalid_json",
|
|
123
|
+
) from None
|
|
124
|
+
if not isinstance(decoded, Mapping):
|
|
125
|
+
raise DoubaoActorTransportError(
|
|
126
|
+
"Doubao actor provider response must be an object",
|
|
127
|
+
error_code="provider_invalid_shape",
|
|
128
|
+
)
|
|
129
|
+
return decoded
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _provider_input(request: Mapping[str, Any]) -> dict[str, Any]:
|
|
133
|
+
"""Keep qualification metadata out of the model-visible decision input."""
|
|
134
|
+
|
|
135
|
+
arm = str(request["arm"])
|
|
136
|
+
packet = request["packet"]
|
|
137
|
+
signature = (
|
|
138
|
+
quota_action_signature_document(packet)
|
|
139
|
+
if arm == "full_packet"
|
|
140
|
+
else turn_envelope_action_signature_document(packet)
|
|
141
|
+
)
|
|
142
|
+
selected_todo = dict(dict(signature.get("action") or {}).get("selected_todo") or {})
|
|
143
|
+
return {
|
|
144
|
+
"schema_version": MODEL_BEHAVIOR_PROVIDER_INPUT_SCHEMA_VERSION,
|
|
145
|
+
"arm": arm,
|
|
146
|
+
"canonical_selected_todo_id": selected_todo.get("todo_id"),
|
|
147
|
+
"semantic_contract_required": request["semantic_contract_required"],
|
|
148
|
+
"packet": packet,
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _semantic_contract_instruction(*, arm: str) -> str:
|
|
153
|
+
if arm == "candidate_packet":
|
|
154
|
+
packet_rules = """
|
|
155
|
+
- concrete_user_question: first packet.user.actions value, else null.
|
|
156
|
+
- required_reads: copy packet.required_reads exactly.
|
|
157
|
+
- gate_or_stop: include exactly decision, should_run, effective_action, state,
|
|
158
|
+
interaction_mode, user_action_required, response_plan, guards, and
|
|
159
|
+
stop_condition. Read the top-level values, contract_capsule interaction
|
|
160
|
+
mode, user.action_required, response_plan, and boundary. Use null for an
|
|
161
|
+
absent response_plan or stop_condition and [] for absent guards.
|
|
162
|
+
- write_scope: packet.boundary.write_scope; use [] when absent.
|
|
163
|
+
- spend_rule: copy packet.writeback exactly.
|
|
164
|
+
- scheduler_action: copy packet.scheduler exactly, preserving every key,
|
|
165
|
+
nested object, array, and value without filtering or reconstruction.
|
|
166
|
+
- vision_continuation: copy
|
|
167
|
+
packet.contract_capsule.vision_continuation_audit exactly, preserving every
|
|
168
|
+
key, array, and value, including trigger_kinds.
|
|
169
|
+
- actionable_warnings: copy
|
|
170
|
+
packet.contract_capsule.actionable_warning_refs exactly; use [] when absent.
|
|
171
|
+
"""
|
|
172
|
+
elif arm == "full_packet":
|
|
173
|
+
packet_rules = """
|
|
174
|
+
- concrete_user_question: first interaction_contract.user_channel.actions
|
|
175
|
+
value, else null.
|
|
176
|
+
- required_reads: use interaction_contract.required_reads, falling back to
|
|
177
|
+
packet.required_reads. Keep at most five object entries with a non-empty
|
|
178
|
+
command and only command plus optional kind, reason, and source. Non-object
|
|
179
|
+
entries are ignored.
|
|
180
|
+
- gate_or_stop: include exactly decision, should_run, effective_action, state,
|
|
181
|
+
interaction_mode, user_action_required, response_plan, guards, and
|
|
182
|
+
stop_condition. Use top-level values, interaction_contract,
|
|
183
|
+
interaction_contract.user_channel, interaction_contract.response_plan, and
|
|
184
|
+
goal_boundary. Use null for an absent response_plan or stop_condition and []
|
|
185
|
+
for absent guards.
|
|
186
|
+
- write_scope: goal_boundary.write_scope; use [] when absent.
|
|
187
|
+
- spend_rule: construct exactly next_cli_actions, spend_allowed_now,
|
|
188
|
+
spend_after_validation, and spend_policy from interaction_contract.cli_channel;
|
|
189
|
+
use []/false/null when absent.
|
|
190
|
+
- scheduler_action: project scheduler_hint using only non-null action,
|
|
191
|
+
cadence_class, spend_policy, and a codex_app object containing only non-null
|
|
192
|
+
apply, host_action, recommended_rrule, no_spend_for_cadence_change,
|
|
193
|
+
stateful_backoff {state_key,current_rrule,apply_needed,state_status}, and
|
|
194
|
+
ack_cli_args copied from ack_hint.cli_args. Use {} when absent.
|
|
195
|
+
- vision_continuation: copy only non-null schema_version, required, decision,
|
|
196
|
+
selected_todo_is_goal_completion, closeout_allowed_without_evidence,
|
|
197
|
+
required_before_closeout, and recommended_action from
|
|
198
|
+
vision_continuation_audit. Use {} when absent.
|
|
199
|
+
- actionable_warnings: return, in packet order, only names of non-empty fields
|
|
200
|
+
among state_projection_gap, boundary_projection_gap,
|
|
201
|
+
state_action_projection_warning, next_action_projection_warning,
|
|
202
|
+
stale_latest_run_warning, and decision_freshness_warning. Use [] when absent;
|
|
203
|
+
guards are not warnings.
|
|
204
|
+
"""
|
|
205
|
+
else:
|
|
206
|
+
raise ValueError("arm must be full_packet or candidate_packet")
|
|
207
|
+
return f"""
|
|
208
|
+
When semantic_contract_required=true, include all nine semantic_contract
|
|
209
|
+
fields and normalize them as follows. Never copy schema placeholders.
|
|
210
|
+
{packet_rules}
|
|
211
|
+
- peer_route: always include exactly agent_id, selected_todo_claimed_by,
|
|
212
|
+
continuation_policy, and same_agent_continuation. Read agent_id from the
|
|
213
|
+
action signature. Read the other values from action.selected_todo, using
|
|
214
|
+
null when absent. same_agent_continuation is true only when agent_id and
|
|
215
|
+
selected_todo_claimed_by are equal and continuation_policy is exactly
|
|
216
|
+
same_agent_non_delivery.
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def _decision_instruction(*, arm: str, semantic_contract_required: bool) -> str:
|
|
221
|
+
instruction = """You are a LoopX control-plane decision simulator.
|
|
222
|
+
Use only the qualification input supplied by the user. Do not call tools,
|
|
223
|
+
execute work, or request external writes. Return exactly one JSON object with
|
|
224
|
+
these fields and no others:
|
|
225
|
+
{
|
|
226
|
+
"schema_version": "model_behavior_decision_v0",
|
|
227
|
+
"decision": "execute|wait|ask_user|stop",
|
|
228
|
+
"selected_todo_id": "todo_... or null",
|
|
229
|
+
"user_action_required": true|false,
|
|
230
|
+
"must_attempt_work": true|false,
|
|
231
|
+
"delivery_allowed": true|false,
|
|
232
|
+
"quiet_noop_allowed": true|false,
|
|
233
|
+
"external_write_requested": false,
|
|
234
|
+
"intended_action_kinds": ["read|inspect|edit|test|writeback|spend|notify|wait|stop"],
|
|
235
|
+
"reason_codes": ["compact_public_safe_token"],
|
|
236
|
+
"semantic_contract": {
|
|
237
|
+
"concrete_user_question": null,
|
|
238
|
+
"required_reads": [],
|
|
239
|
+
"gate_or_stop": {},
|
|
240
|
+
"peer_route": {},
|
|
241
|
+
"write_scope": [],
|
|
242
|
+
"spend_rule": {},
|
|
243
|
+
"scheduler_action": {},
|
|
244
|
+
"vision_continuation": {},
|
|
245
|
+
"actionable_warnings": []
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
Preserve user gates, selected work, execution obligations, write boundaries,
|
|
249
|
+
spend timing, scheduler duties, and stop conditions from the packet. Output
|
|
250
|
+
JSON only, without markdown or reasoning. Include semantic_contract whenever
|
|
251
|
+
the qualification input sets semantic_contract_required=true; derive it from
|
|
252
|
+
the packet and do not invent or summarize values. Copy
|
|
253
|
+
canonical_selected_todo_id exactly into selected_todo_id, including null; it
|
|
254
|
+
was derived locally from this arm's canonical action signature. Never infer a
|
|
255
|
+
todo id from summaries, diagnostics, handoffs, history, or other cold-path
|
|
256
|
+
references. Follow any packet response_plan exactly: copy its decision into
|
|
257
|
+
decision, preserve its ordered action_sequence in intended_action_kinds, and
|
|
258
|
+
obey silent_wait_allowed. Choose intended_action_kinds from the execution
|
|
259
|
+
obligation when no response_plan is present, not packet verbosity, and use the
|
|
260
|
+
same ordered normalization for both arms.
|
|
261
|
+
Include spend only when the packet requires spend after validated writeback.
|
|
262
|
+
"""
|
|
263
|
+
if arm == "candidate_packet":
|
|
264
|
+
instruction += """For intended actions, use packet.action and
|
|
265
|
+
packet.writeback. When spend_after_validation=true, end with writeback then
|
|
266
|
+
spend."""
|
|
267
|
+
elif arm == "full_packet":
|
|
268
|
+
instruction += """For intended actions, use
|
|
269
|
+
interaction_contract.agent_channel and interaction_contract.cli_channel. When
|
|
270
|
+
spend_after_validation=true, end with writeback then spend."""
|
|
271
|
+
else:
|
|
272
|
+
raise ValueError("arm must be full_packet or candidate_packet")
|
|
273
|
+
if semantic_contract_required:
|
|
274
|
+
instruction += _semantic_contract_instruction(arm=arm)
|
|
275
|
+
return instruction
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def _provider_decision(response: Mapping[str, Any]) -> Mapping[str, Any]:
|
|
279
|
+
choices = response.get("choices")
|
|
280
|
+
if not isinstance(choices, list) or len(choices) != 1:
|
|
281
|
+
raise RuntimeError("Doubao actor response must contain exactly one choice")
|
|
282
|
+
choice = choices[0]
|
|
283
|
+
if not isinstance(choice, Mapping):
|
|
284
|
+
raise RuntimeError("Doubao actor choice must be an object")
|
|
285
|
+
message = choice.get("message")
|
|
286
|
+
if not isinstance(message, Mapping):
|
|
287
|
+
raise RuntimeError("Doubao actor choice is missing its message")
|
|
288
|
+
content = message.get("content")
|
|
289
|
+
if not isinstance(content, str) or not content.strip():
|
|
290
|
+
raise RuntimeError("Doubao actor message content must be non-empty JSON")
|
|
291
|
+
try:
|
|
292
|
+
decision = json.loads(content)
|
|
293
|
+
except json.JSONDecodeError:
|
|
294
|
+
raise RuntimeError("Doubao actor message content is not valid JSON") from None
|
|
295
|
+
if not isinstance(decision, Mapping):
|
|
296
|
+
raise RuntimeError("Doubao actor decision must be an object")
|
|
297
|
+
return decision
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _invoke_provider_decision(
|
|
301
|
+
*,
|
|
302
|
+
api_key: str,
|
|
303
|
+
model: str,
|
|
304
|
+
timeout_seconds: float,
|
|
305
|
+
transport: DoubaoActorTransport,
|
|
306
|
+
system_instruction: str,
|
|
307
|
+
provider_input: Mapping[str, Any],
|
|
308
|
+
) -> Mapping[str, Any]:
|
|
309
|
+
body = {
|
|
310
|
+
"model": model,
|
|
311
|
+
"messages": [
|
|
312
|
+
{"role": "system", "content": system_instruction},
|
|
313
|
+
{
|
|
314
|
+
"role": "user",
|
|
315
|
+
"content": json.dumps(
|
|
316
|
+
dict(provider_input),
|
|
317
|
+
ensure_ascii=False,
|
|
318
|
+
sort_keys=True,
|
|
319
|
+
separators=(",", ":"),
|
|
320
|
+
),
|
|
321
|
+
},
|
|
322
|
+
],
|
|
323
|
+
"response_format": {"type": "json_object"},
|
|
324
|
+
"thinking": {"type": "disabled"},
|
|
325
|
+
"temperature": 0,
|
|
326
|
+
"max_tokens": _MAX_DECISION_TOKENS,
|
|
327
|
+
"stream": False,
|
|
328
|
+
}
|
|
329
|
+
try:
|
|
330
|
+
response = transport(
|
|
331
|
+
endpoint=DOUBAO_CHAT_COMPLETIONS_ENDPOINT,
|
|
332
|
+
headers={
|
|
333
|
+
"Authorization": f"Bearer {api_key}",
|
|
334
|
+
"Content-Type": "application/json",
|
|
335
|
+
},
|
|
336
|
+
body=json.dumps(
|
|
337
|
+
body,
|
|
338
|
+
ensure_ascii=False,
|
|
339
|
+
sort_keys=True,
|
|
340
|
+
separators=(",", ":"),
|
|
341
|
+
).encode("utf-8"),
|
|
342
|
+
timeout_seconds=timeout_seconds,
|
|
343
|
+
)
|
|
344
|
+
except DoubaoActorTransportError:
|
|
345
|
+
raise
|
|
346
|
+
except Exception:
|
|
347
|
+
raise DoubaoActorTransportError(
|
|
348
|
+
"Doubao actor provider transport failed",
|
|
349
|
+
error_code="provider_transport_failed",
|
|
350
|
+
) from None
|
|
351
|
+
return _provider_decision(response)
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def _onboarding_decision_instruction(phase: str) -> str:
|
|
355
|
+
common = """You are a LoopX new-user onboarding decision simulator.
|
|
356
|
+
Use only the qualification packet supplied by the user. Do not call tools,
|
|
357
|
+
execute commands, or request external writes. Return exactly one JSON object
|
|
358
|
+
with these top-level fields and no others:
|
|
359
|
+
{
|
|
360
|
+
"schema_version": "onboarding_model_behavior_decision_v0",
|
|
361
|
+
"phase": "entry|postcondition",
|
|
362
|
+
"next_action": "phase-specific route",
|
|
363
|
+
"semantic_contract": {},
|
|
364
|
+
"reason_codes": ["compact_public_safe_token"]
|
|
365
|
+
}
|
|
366
|
+
Copy the requested phase exactly. Output JSON only, without markdown or
|
|
367
|
+
reasoning. The semantic_contract must contain exactly the phase-specific fields
|
|
368
|
+
described below. Use null where instructed and never invent identifiers."""
|
|
369
|
+
if phase == "entry":
|
|
370
|
+
return (
|
|
371
|
+
common
|
|
372
|
+
+ """
|
|
373
|
+
|
|
374
|
+
For phase=entry, derive the contract from the start-goal packet:
|
|
375
|
+
- route: select_agent_identity when guided_transaction is blocked by an
|
|
376
|
+
identity gate; select_goal when blocked by a goal-selection gate;
|
|
377
|
+
connect_if_needed when ordered_steps contains that id; otherwise stop.
|
|
378
|
+
- goal_id: copy the top-level goal_id, including null.
|
|
379
|
+
- agent_id: copy top-level agent_id, falling back to
|
|
380
|
+
host_loop_activation.agent_id or command_pack.host_loop_activation.agent_id;
|
|
381
|
+
otherwise null.
|
|
382
|
+
- action_command_ids: in this exact order, include each key whose value is a
|
|
383
|
+
non-empty string in top-level commands or command_pack.commands:
|
|
384
|
+
goal_start_connect_if_needed, goal_start_refresh_state,
|
|
385
|
+
goal_start_host_loop_activation, goal_start_quota_should_run.
|
|
386
|
+
- host_loop_activation_available: true when top-level host_loop_activation or
|
|
387
|
+
command_pack.host_loop_activation is a non-empty object.
|
|
388
|
+
- host_loop_activation_after_todo_write: copy
|
|
389
|
+
activation_required_after_todo_write from that activation object, else false.
|
|
390
|
+
- requested_host_surface: copy the packet's top-level host_surface, including
|
|
391
|
+
null. Copy host_surface and activation_method from the activation object,
|
|
392
|
+
including null.
|
|
393
|
+
- visible_goal_command_available: true exactly when
|
|
394
|
+
activation.host_mutation.host_command is `/goal <task_body>`.
|
|
395
|
+
- writes_now and spends_quota_now: copy the corresponding booleans from
|
|
396
|
+
guided_transaction, defaulting to false.
|
|
397
|
+
Set next_action equal to route. The semantic_contract must contain exactly:
|
|
398
|
+
route, goal_id, agent_id, action_command_ids,
|
|
399
|
+
host_loop_activation_available, host_loop_activation_after_todo_write,
|
|
400
|
+
requested_host_surface, host_surface, activation_method,
|
|
401
|
+
visible_goal_command_available, writes_now, spends_quota_now."""
|
|
402
|
+
)
|
|
403
|
+
return (
|
|
404
|
+
common
|
|
405
|
+
+ """
|
|
406
|
+
|
|
407
|
+
For phase=postcondition, the packet is a locally derived observation:
|
|
408
|
+
- route: copy derived_route.
|
|
409
|
+
- state_projection_gap: copy the boolean field.
|
|
410
|
+
- executable_todo_present: true exactly when executable_todo_count is greater
|
|
411
|
+
than zero.
|
|
412
|
+
- selected_action_kind: copy the field, including null.
|
|
413
|
+
- normal_delivery_allowed and user_action_required: copy both booleans.
|
|
414
|
+
Set next_action equal to route. The semantic_contract must contain exactly:
|
|
415
|
+
route, state_projection_gap, executable_todo_present, selected_action_kind,
|
|
416
|
+
normal_delivery_allowed, user_action_required."""
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def _onboarding_provider_input(request: Mapping[str, Any]) -> dict[str, Any]:
|
|
421
|
+
return {
|
|
422
|
+
"schema_version": "onboarding_model_behavior_provider_input_v0",
|
|
423
|
+
"phase": request["phase"],
|
|
424
|
+
"packet": request["packet"],
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
class DoubaoModelBehaviorActor(ModelBehaviorActor):
|
|
429
|
+
"""Direct Ark actor for low-frequency, no-tool behavior qualification."""
|
|
430
|
+
|
|
431
|
+
def __init__(
|
|
432
|
+
self,
|
|
433
|
+
*,
|
|
434
|
+
api_key: str,
|
|
435
|
+
model: str = DOUBAO_2_1_PRO_MODEL,
|
|
436
|
+
timeout_seconds: float = 90.0,
|
|
437
|
+
transport: DoubaoActorTransport = _direct_ark_transport,
|
|
438
|
+
) -> None:
|
|
439
|
+
if not api_key.strip():
|
|
440
|
+
raise RuntimeError("Doubao actor requires a runtime-injected API key")
|
|
441
|
+
if model not in _ALLOWED_MODELS:
|
|
442
|
+
raise ValueError(
|
|
443
|
+
"Doubao actor model must be an allowlisted Doubao 2.1 model"
|
|
444
|
+
)
|
|
445
|
+
if timeout_seconds <= 0 or timeout_seconds > 300:
|
|
446
|
+
raise ValueError("Doubao actor timeout must be between 0 and 300 seconds")
|
|
447
|
+
self._api_key = api_key
|
|
448
|
+
self._model = model
|
|
449
|
+
self._timeout_seconds = timeout_seconds
|
|
450
|
+
self._transport = transport
|
|
451
|
+
|
|
452
|
+
@classmethod
|
|
453
|
+
def from_environment(
|
|
454
|
+
cls,
|
|
455
|
+
*,
|
|
456
|
+
environ: Mapping[str, str] | None = None,
|
|
457
|
+
transport: DoubaoActorTransport = _direct_ark_transport,
|
|
458
|
+
timeout_seconds: float = 90.0,
|
|
459
|
+
) -> DoubaoModelBehaviorActor:
|
|
460
|
+
values = os.environ if environ is None else environ
|
|
461
|
+
api_key = values.get(ARK_API_KEY_ENV, "")
|
|
462
|
+
if not api_key.strip():
|
|
463
|
+
raise RuntimeError(
|
|
464
|
+
"ARK_API_KEY is not injected; live Doubao qualification is unavailable"
|
|
465
|
+
)
|
|
466
|
+
model = values.get(DOUBAO_MODEL_ENV, DOUBAO_2_1_PRO_MODEL)
|
|
467
|
+
return cls(
|
|
468
|
+
api_key=api_key,
|
|
469
|
+
model=model,
|
|
470
|
+
timeout_seconds=timeout_seconds,
|
|
471
|
+
transport=transport,
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
def __call__(self, request: Mapping[str, Any]) -> Mapping[str, Any]:
|
|
475
|
+
canonical_request = normalize_model_behavior_actor_request(request)
|
|
476
|
+
decision = _invoke_provider_decision(
|
|
477
|
+
api_key=self._api_key,
|
|
478
|
+
model=self._model,
|
|
479
|
+
timeout_seconds=self._timeout_seconds,
|
|
480
|
+
transport=self._transport,
|
|
481
|
+
system_instruction=_decision_instruction(
|
|
482
|
+
arm=str(canonical_request["arm"]),
|
|
483
|
+
semantic_contract_required=bool(
|
|
484
|
+
canonical_request["semantic_contract_required"]
|
|
485
|
+
),
|
|
486
|
+
),
|
|
487
|
+
provider_input=_provider_input(canonical_request),
|
|
488
|
+
)
|
|
489
|
+
return {
|
|
490
|
+
"schema_version": MODEL_BEHAVIOR_ACTOR_RESULT_SCHEMA_VERSION,
|
|
491
|
+
"actor_ref": f"ark:{self._model}",
|
|
492
|
+
"decision": dict(decision),
|
|
493
|
+
"tool_calls": [],
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
class DoubaoOnboardingModelBehaviorActor:
|
|
498
|
+
"""Direct Ark actor for low-frequency onboarding closed-loop qualification."""
|
|
499
|
+
|
|
500
|
+
def __init__(
|
|
501
|
+
self,
|
|
502
|
+
*,
|
|
503
|
+
api_key: str,
|
|
504
|
+
model: str = DOUBAO_2_1_PRO_MODEL,
|
|
505
|
+
timeout_seconds: float = 90.0,
|
|
506
|
+
transport: DoubaoActorTransport = _direct_ark_transport,
|
|
507
|
+
) -> None:
|
|
508
|
+
if not api_key.strip():
|
|
509
|
+
raise RuntimeError("Doubao actor requires a runtime-injected API key")
|
|
510
|
+
if model not in _ALLOWED_MODELS:
|
|
511
|
+
raise ValueError(
|
|
512
|
+
"Doubao actor model must be an allowlisted Doubao 2.1 model"
|
|
513
|
+
)
|
|
514
|
+
if timeout_seconds <= 0 or timeout_seconds > 300:
|
|
515
|
+
raise ValueError("Doubao actor timeout must be between 0 and 300 seconds")
|
|
516
|
+
self._api_key = api_key
|
|
517
|
+
self._model = model
|
|
518
|
+
self._timeout_seconds = timeout_seconds
|
|
519
|
+
self._transport = transport
|
|
520
|
+
|
|
521
|
+
@classmethod
|
|
522
|
+
def from_environment(
|
|
523
|
+
cls,
|
|
524
|
+
*,
|
|
525
|
+
environ: Mapping[str, str] | None = None,
|
|
526
|
+
transport: DoubaoActorTransport = _direct_ark_transport,
|
|
527
|
+
timeout_seconds: float = 90.0,
|
|
528
|
+
) -> DoubaoOnboardingModelBehaviorActor:
|
|
529
|
+
values = os.environ if environ is None else environ
|
|
530
|
+
api_key = values.get(ARK_API_KEY_ENV, "")
|
|
531
|
+
if not api_key.strip():
|
|
532
|
+
raise RuntimeError(
|
|
533
|
+
"ARK_API_KEY is not injected; live Doubao qualification is unavailable"
|
|
534
|
+
)
|
|
535
|
+
model = values.get(DOUBAO_MODEL_ENV, DOUBAO_2_1_PRO_MODEL)
|
|
536
|
+
return cls(
|
|
537
|
+
api_key=api_key,
|
|
538
|
+
model=model,
|
|
539
|
+
timeout_seconds=timeout_seconds,
|
|
540
|
+
transport=transport,
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
def __call__(self, request: Mapping[str, Any]) -> Mapping[str, Any]:
|
|
544
|
+
canonical_request = normalize_onboarding_model_behavior_actor_request(request)
|
|
545
|
+
phase = str(canonical_request["phase"])
|
|
546
|
+
decision = _invoke_provider_decision(
|
|
547
|
+
api_key=self._api_key,
|
|
548
|
+
model=self._model,
|
|
549
|
+
timeout_seconds=self._timeout_seconds,
|
|
550
|
+
transport=self._transport,
|
|
551
|
+
system_instruction=_onboarding_decision_instruction(phase),
|
|
552
|
+
provider_input=_onboarding_provider_input(canonical_request),
|
|
553
|
+
)
|
|
554
|
+
return {
|
|
555
|
+
"schema_version": ONBOARDING_MODEL_BEHAVIOR_RESULT_SCHEMA_VERSION,
|
|
556
|
+
"actor_ref": f"ark:{self._model}",
|
|
557
|
+
"decision": dict(decision),
|
|
558
|
+
"tool_calls": [],
|
|
559
|
+
}
|