agentevolve-optimizer 0.5.0__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.
- agent_evolve/__init__.py +722 -0
- agent_evolve/agentic.py +2800 -0
- agent_evolve/api.py +767 -0
- agent_evolve/application/__init__.py +1580 -0
- agent_evolve/application/action_allocation.py +744 -0
- agent_evolve/application/action_allocation_frame.py +347 -0
- agent_evolve/application/action_allocation_frame_commit.py +185 -0
- agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
- agent_evolve/application/action_allocation_frame_v3.py +338 -0
- agent_evolve/application/action_archive_value.py +497 -0
- agent_evolve/application/action_evidence_consistency.py +455 -0
- agent_evolve/application/action_forecast_partitioning.py +1471 -0
- agent_evolve/application/action_metric_projection.py +211 -0
- agent_evolve/application/action_role_value.py +680 -0
- agent_evolve/application/action_score_authorities.py +363 -0
- agent_evolve/application/action_structural_signature.py +116 -0
- agent_evolve/application/action_target_realization.py +402 -0
- agent_evolve/application/agentic_evolution.py +7734 -0
- agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
- agent_evolve/application/anchor_residual_identification.py +463 -0
- agent_evolve/application/archive_conditioned_action_target.py +208 -0
- agent_evolve/application/artifact_journal.py +246 -0
- agent_evolve/application/artifact_replay.py +347 -0
- agent_evolve/application/budgeted_optimizer.py +1828 -0
- agent_evolve/application/calibrated_campaign.py +485 -0
- agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
- agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
- agent_evolve/application/campaign_capacity_recourse.py +254 -0
- agent_evolve/application/campaign_contextual_outcomes.py +119 -0
- agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
- agent_evolve/application/campaign_evidence_registry.py +262 -0
- agent_evolve/application/campaign_execution.py +2537 -0
- agent_evolve/application/campaign_generation_audit.py +942 -0
- agent_evolve/application/campaign_learning.py +1812 -0
- agent_evolve/application/campaign_learning_runtime.py +1977 -0
- agent_evolve/application/campaign_search_phase.py +227 -0
- agent_evolve/application/campaign_selector_context_extension.py +220 -0
- agent_evolve/application/campaign_variation_envelope.py +649 -0
- agent_evolve/application/campaign_variation_trace.py +451 -0
- agent_evolve/application/candidate_archive_consequence.py +128 -0
- agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
- agent_evolve/application/composite_outcome_updater.py +145 -0
- agent_evolve/application/composition_portfolio_selection.py +363 -0
- agent_evolve/application/concurrent_stage.py +144 -0
- agent_evolve/application/contextual_action_allocation.py +181 -0
- agent_evolve/application/contextual_campaign_outcomes.py +267 -0
- agent_evolve/application/contextual_campaign_planning.py +1366 -0
- agent_evolve/application/contextual_delayed_credit.py +651 -0
- agent_evolve/application/contextual_search_controller.py +2374 -0
- agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
- agent_evolve/application/decision_metric_projection.py +112 -0
- agent_evolve/application/derived_action_semantics.py +129 -0
- agent_evolve/application/detailed_evaluation.py +449 -0
- agent_evolve/application/earned_lineage.py +1011 -0
- agent_evolve/application/effective_choice_audit.py +484 -0
- agent_evolve/application/empirical_consequence_calibration.py +908 -0
- agent_evolve/application/evaluation_accounting.py +325 -0
- agent_evolve/application/evaluation_cache.py +199 -0
- agent_evolve/application/evaluation_escrow.py +547 -0
- agent_evolve/application/evaluation_recourse.py +253 -0
- agent_evolve/application/event_recorder.py +151 -0
- agent_evolve/application/evolution_campaign.py +1840 -0
- agent_evolve/application/executable_hypothesis.py +323 -0
- agent_evolve/application/factorial_branch_pilot.py +772 -0
- agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
- agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
- agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
- agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
- agent_evolve/application/finite_action_selection.py +188 -0
- agent_evolve/application/finite_action_set.py +306 -0
- agent_evolve/application/finite_action_transition.py +537 -0
- agent_evolve/application/finite_variation_eligibility.py +296 -0
- agent_evolve/application/forecast_geometry_portfolio.py +799 -0
- agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
- agent_evolve/application/front_proximity_admission.py +311 -0
- agent_evolve/application/front_proximity_parent_basis.py +458 -0
- agent_evolve/application/frozen_hurdle_score.py +659 -0
- agent_evolve/application/g3_causal_screen.py +2257 -0
- agent_evolve/application/g3_causal_validation.py +1046 -0
- agent_evolve/application/g3_postseal_curation.py +818 -0
- agent_evolve/application/gated_agentic_generator.py +205 -0
- agent_evolve/application/generation_feedback.py +293 -0
- agent_evolve/application/generative_proposal_journal.py +185 -0
- agent_evolve/application/geometry_conditional_elasticity.py +453 -0
- agent_evolve/application/global_wave_action_allocation.py +1151 -0
- agent_evolve/application/head_mass_conditional_seat.py +268 -0
- agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
- agent_evolve/application/identifiable_reflection_learning.py +395 -0
- agent_evolve/application/identifiable_reflection_request.py +364 -0
- agent_evolve/application/in_memory_residual_archive.py +341 -0
- agent_evolve/application/insight_memory.py +1804 -0
- agent_evolve/application/live_runtime_manifest.py +758 -0
- agent_evolve/application/llm_task_queue.py +769 -0
- agent_evolve/application/matched_finite_action_block.py +409 -0
- agent_evolve/application/materialized_action_broker.py +2328 -0
- agent_evolve/application/materialized_action_constraints.py +83 -0
- agent_evolve/application/materialized_variation.py +211 -0
- agent_evolve/application/multi_option_evolution.py +1536 -0
- agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
- agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
- agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
- agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
- agent_evolve/application/outcome_relation.py +193 -0
- agent_evolve/application/paired_allocation_comparison.py +241 -0
- agent_evolve/application/paired_block_schedule.py +127 -0
- agent_evolve/application/parent_measurement.py +226 -0
- agent_evolve/application/pareto_archive.py +811 -0
- agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
- agent_evolve/application/portfolio_evolution.py +2950 -0
- agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
- agent_evolve/application/portfolio_memory_attribution.py +581 -0
- agent_evolve/application/portfolio_memory_dose.py +788 -0
- agent_evolve/application/portfolio_memory_matched_control.py +938 -0
- agent_evolve/application/portfolio_memory_transfer.py +297 -0
- agent_evolve/application/portfolio_optimization_memory.py +363 -0
- agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
- agent_evolve/application/portfolio_projection.py +335 -0
- agent_evolve/application/portfolio_recombination.py +2032 -0
- agent_evolve/application/post_evolution_reflection.py +834 -0
- agent_evolve/application/postcommit_rank_authority.py +245 -0
- agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
- agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
- agent_evolve/application/prequential_residual_exploration.py +343 -0
- agent_evolve/application/prequential_score_portfolio.py +954 -0
- agent_evolve/application/projections.py +292 -0
- agent_evolve/application/protected_action_committee.py +1027 -0
- agent_evolve/application/protected_branch_pilot.py +376 -0
- agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
- agent_evolve/application/provider_replay.py +910 -0
- agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
- agent_evolve/application/recombination_residual_expert.py +403 -0
- agent_evolve/application/reflection_workflow.py +571 -0
- agent_evolve/application/region_conditional_credit.py +911 -0
- agent_evolve/application/residual_campaign_runtime.py +531 -0
- agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
- agent_evolve/application/residual_headroom_ledger.py +1544 -0
- agent_evolve/application/residual_learning_transaction.py +396 -0
- agent_evolve/application/residual_portfolio_evolution.py +1228 -0
- agent_evolve/application/residual_reachability.py +749 -0
- agent_evolve/application/residual_stage_credit.py +499 -0
- agent_evolve/application/same_prefix_paired_audit.py +1580 -0
- agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
- agent_evolve/application/sequential_lineage_allocation.py +1017 -0
- agent_evolve/application/sequential_market_replay.py +1395 -0
- agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
- agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
- agent_evolve/application/single_score_action_allocation.py +299 -0
- agent_evolve/application/source_exposure_allocation.py +906 -0
- agent_evolve/application/staged_memory.py +210 -0
- agent_evolve/application/stratified_cold_start_allocation.py +732 -0
- agent_evolve/application/support_guarded_hurdle_score.py +549 -0
- agent_evolve/application/target_conditioned_action_forecast.py +595 -0
- agent_evolve/application/target_conditioned_campaign.py +566 -0
- agent_evolve/application/treatment_assignment.py +201 -0
- agent_evolve/application/trusted_objective_evidence.py +217 -0
- agent_evolve/application/two_stage_action_evolution.py +1131 -0
- agent_evolve/application/v8lite_allocation_policy.py +1083 -0
- agent_evolve/application/v9_candidate_policy.py +1303 -0
- agent_evolve/bootstrap.py +108 -0
- agent_evolve/campaign_presets.py +517 -0
- agent_evolve/campaign_profiles.py +452 -0
- agent_evolve/campaign_variation_topology.py +288 -0
- agent_evolve/campaign_workload.py +950 -0
- agent_evolve/cli.py +797 -0
- agent_evolve/contract.py +241 -0
- agent_evolve/core/__init__.py +91 -0
- agent_evolve/core/action_semantics.py +411 -0
- agent_evolve/core/authored.py +105 -0
- agent_evolve/core/formatting.py +286 -0
- agent_evolve/core/optimization_semantics.py +324 -0
- agent_evolve/core/problem.py +167 -0
- agent_evolve/core/results.py +323 -0
- agent_evolve/core/stats.py +70 -0
- agent_evolve/core/telemetry.py +100 -0
- agent_evolve/domain/__init__.py +89 -0
- agent_evolve/domain/artifact.py +162 -0
- agent_evolve/domain/durable_text.py +68 -0
- agent_evolve/domain/event.py +1454 -0
- agent_evolve/domain/finite_action_set.py +426 -0
- agent_evolve/domain/finite_variation.py +526 -0
- agent_evolve/domain/generative_emission.py +559 -0
- agent_evolve/domain/ids.py +163 -0
- agent_evolve/domain/inline_text.py +106 -0
- agent_evolve/domain/insight.py +27 -0
- agent_evolve/domain/lineage.py +737 -0
- agent_evolve/domain/llm_task_queue.py +960 -0
- agent_evolve/domain/outcome.py +96 -0
- agent_evolve/domain/patch.py +854 -0
- agent_evolve/domain/typed_json.py +542 -0
- agent_evolve/domain/variation_space.py +158 -0
- agent_evolve/driver.py +1014 -0
- agent_evolve/harness/__init__.py +29 -0
- agent_evolve/harness/base.py +242 -0
- agent_evolve/harness/directives.py +163 -0
- agent_evolve/harness/generative_seal.py +479 -0
- agent_evolve/harness/registry.py +41 -0
- agent_evolve/infrastructure/__init__.py +39 -0
- agent_evolve/infrastructure/artifacts/__init__.py +6 -0
- agent_evolve/infrastructure/artifacts/_verification.py +67 -0
- agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
- agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
- agent_evolve/infrastructure/asyncio_runtime.py +109 -0
- agent_evolve/infrastructure/authored_runtime.py +188 -0
- agent_evolve/infrastructure/authored_worker.py +171 -0
- agent_evolve/infrastructure/clock.py +53 -0
- agent_evolve/infrastructure/events/__init__.py +6 -0
- agent_evolve/infrastructure/events/_validation.py +89 -0
- agent_evolve/infrastructure/events/in_memory.py +56 -0
- agent_evolve/infrastructure/events/jsonl.py +193 -0
- agent_evolve/infrastructure/exception_provenance.py +215 -0
- agent_evolve/infrastructure/ids.py +118 -0
- agent_evolve/infrastructure/lineage_codec.py +1836 -0
- agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
- agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
- agent_evolve/infrastructure/resource_lease.py +370 -0
- agent_evolve/infrastructure/sanitization/__init__.py +8 -0
- agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
- agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
- agent_evolve/infrastructure/stream_liveness.py +383 -0
- agent_evolve/infrastructure/subprocess_boundary.py +136 -0
- agent_evolve/integrations/__init__.py +1 -0
- agent_evolve/integrations/botorch/__init__.py +28 -0
- agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
- agent_evolve/integrations/completion.py +242 -0
- agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
- agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
- agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
- agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
- agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
- agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
- agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
- agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
- agent_evolve/integrations/pydantic_ai/harness.py +159 -0
- agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
- agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
- agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
- agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
- agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
- agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
- agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
- agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
- agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
- agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
- agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
- agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
- agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
- agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
- agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
- agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
- agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
- agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
- agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
- agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
- agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
- agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
- agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
- agent_evolve/integrations/pymoo_adapter.py +242 -0
- agent_evolve/policies/__init__.py +17 -0
- agent_evolve/policies/check.py +469 -0
- agent_evolve/policies/emit_scaffold.py +451 -0
- agent_evolve/policies/feedback/__init__.py +37 -0
- agent_evolve/policies/feedback/held_out_asn.py +1325 -0
- agent_evolve/policies/genetic.py +607 -0
- agent_evolve/policies/llm_backoff.py +183 -0
- agent_evolve/policies/llm_chooser.py +226 -0
- agent_evolve/policies/llm_generator.py +1760 -0
- agent_evolve/policies/llm_init.py +267 -0
- agent_evolve/policies/llm_operator.py +109 -0
- agent_evolve/policies/llm_prior.py +194 -0
- agent_evolve/policies/llm_surrogate.py +334 -0
- agent_evolve/policies/measurement_evidence.py +704 -0
- agent_evolve/policies/memory/__init__.py +223 -0
- agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
- agent_evolve/policies/memory/compatibility_matching.py +593 -0
- agent_evolve/policies/memory/global_falsification.py +1841 -0
- agent_evolve/policies/memory/prompt_shape.py +503 -0
- agent_evolve/policies/memory/randomized_subset.py +714 -0
- agent_evolve/policies/memory/staged_causal.py +1270 -0
- agent_evolve/policies/memory/treatment_compliance.py +759 -0
- agent_evolve/policies/objective_resolution/__init__.py +17 -0
- agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
- agent_evolve/policies/operator_portfolio.py +407 -0
- agent_evolve/policies/reguidance.py +1133 -0
- agent_evolve/policies/reward/__init__.py +83 -0
- agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
- agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
- agent_evolve/policies/reward/affine_hypervolume.py +490 -0
- agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
- agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
- agent_evolve/policies/reward/frozen_archive.py +360 -0
- agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
- agent_evolve/policies/search_state.py +208 -0
- agent_evolve/policies/selection/__init__.py +345 -0
- agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
- agent_evolve/policies/selection/affine_frontier_context.py +330 -0
- agent_evolve/policies/selection/affine_frontier_target.py +473 -0
- agent_evolve/policies/selection/archive_elite.py +1346 -0
- agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
- agent_evolve/policies/selection/calibrated_slate.py +1394 -0
- agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
- agent_evolve/policies/selection/common_candidate_pool.py +685 -0
- agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
- agent_evolve/policies/selection/disjoint_pairs.py +479 -0
- agent_evolve/policies/selection/elite_explorer.py +719 -0
- agent_evolve/policies/selection/finite_action.py +187 -0
- agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
- agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
- agent_evolve/policies/selection/forecast_calibration.py +922 -0
- agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
- agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
- agent_evolve/policies/selection/full_support_slate.py +91 -0
- agent_evolve/policies/selection/meaningful_direction.py +240 -0
- agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
- agent_evolve/policies/selection/model_anchored_slate.py +826 -0
- agent_evolve/policies/selection/phenotype_recourse.py +979 -0
- agent_evolve/policies/selection/proposal_support.py +368 -0
- agent_evolve/policies/selection/random_portfolio.py +254 -0
- agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
- agent_evolve/policies/selection/residual_frontier.py +463 -0
- agent_evolve/policies/selection/residual_frontier_target.py +605 -0
- agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
- agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
- agent_evolve/policies/selection/target_conditioned_features.py +812 -0
- agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
- agent_evolve/policies/selection/task_keyed_palette.py +906 -0
- agent_evolve/policies/semantics.py +147 -0
- agent_evolve/policies/structure.py +362 -0
- agent_evolve/policies/structured_output_budget.py +62 -0
- agent_evolve/policies/surrogate.py +696 -0
- agent_evolve/policies/variation/__init__.py +1 -0
- agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
- agent_evolve/policies/variation/crossover_inheritance.py +575 -0
- agent_evolve/policies/variation/disjoint_recombination.py +611 -0
- agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
- agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
- agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
- agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
- agent_evolve/policies/variation/typed_patch.py +1981 -0
- agent_evolve/policies/weighted_prior.py +394 -0
- agent_evolve/ports/__init__.py +383 -0
- agent_evolve/ports/action_allocation.py +733 -0
- agent_evolve/ports/action_allocation_frame.py +1153 -0
- agent_evolve/ports/action_allocation_frame_commit.py +294 -0
- agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
- agent_evolve/ports/action_allocation_frame_v3.py +995 -0
- agent_evolve/ports/action_forecast.py +1568 -0
- agent_evolve/ports/action_metric_projection.py +165 -0
- agent_evolve/ports/agentic_generator.py +1561 -0
- agent_evolve/ports/archive_context.py +136 -0
- agent_evolve/ports/artifact_sanitizer.py +44 -0
- agent_evolve/ports/artifact_store.py +225 -0
- agent_evolve/ports/clock.py +13 -0
- agent_evolve/ports/contextual_search_allocation.py +827 -0
- agent_evolve/ports/decision_metric_projection.py +258 -0
- agent_evolve/ports/event_store.py +55 -0
- agent_evolve/ports/executable_hypothesis.py +557 -0
- agent_evolve/ports/finite_acquisition.py +377 -0
- agent_evolve/ports/finite_acquisition_batch.py +296 -0
- agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
- agent_evolve/ports/finite_acquisition_json.py +247 -0
- agent_evolve/ports/finite_acquisition_space.py +168 -0
- agent_evolve/ports/finite_action_selection.py +348 -0
- agent_evolve/ports/finite_action_set.py +256 -0
- agent_evolve/ports/frontier_target.py +396 -0
- agent_evolve/ports/generation_failure.py +43 -0
- agent_evolve/ports/hard_feasibility.py +233 -0
- agent_evolve/ports/id_factory.py +34 -0
- agent_evolve/ports/llm_task_queue.py +93 -0
- agent_evolve/ports/objective_resolution.py +419 -0
- agent_evolve/ports/paired_allocation_comparison.py +401 -0
- agent_evolve/ports/paired_block_schedule.py +475 -0
- agent_evolve/ports/parent_measurement.py +336 -0
- agent_evolve/ports/portfolio_memory_dose.py +643 -0
- agent_evolve/ports/portfolio_selection.py +3169 -0
- agent_evolve/ports/postcommit_rank_authority.py +467 -0
- agent_evolve/ports/presented_action_evidence.py +794 -0
- agent_evolve/ports/resource_lease.py +162 -0
- agent_evolve/ports/structured_generator.py +734 -0
- agent_evolve/ports/structured_output_budget.py +120 -0
- agent_evolve/ports/subprocess_boundary.py +138 -0
- agent_evolve/ports/treatment_assignment.py +466 -0
- agent_evolve/ports/variation_catalog.py +76 -0
- agent_evolve/ports/variation_source.py +226 -0
- agent_evolve/proposal_mode.py +157 -0
- agent_evolve/proposers/__init__.py +10 -0
- agent_evolve/proposers/random_proposer.py +188 -0
- agent_evolve/provider_accounting.py +163 -0
- agent_evolve/py.typed +0 -0
- agent_evolve/reference_method.py +1570 -0
- agent_evolve/session/__init__.py +11 -0
- agent_evolve/session/authorship.py +864 -0
- agent_evolve/session/evaluate.py +236 -0
- agent_evolve/session/fidelity.py +237 -0
- agent_evolve/session/genetic_loop.py +742 -0
- agent_evolve/session/loop.py +803 -0
- agent_evolve/session/screening.py +671 -0
- agent_evolve/settings.py +376 -0
- agent_evolve/workload_kit.py +368 -0
- agent_evolve/workload_prompt.py +398 -0
- agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
- agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
- agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
- agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
- agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
- agentevolve_optimizer-0.5.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""Workload-neutral projection port for authenticated archive geometry.
|
|
2
|
+
|
|
3
|
+
The campaign runtime owns when a projection is attached. Implementations own
|
|
4
|
+
how an already-frozen archive utility and an already-evaluated parent are
|
|
5
|
+
translated into a bounded model-visible payload. The port cannot inspect a
|
|
6
|
+
model/provider profile or any current/future candidate outcome.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
from dataclasses import dataclass, field
|
|
15
|
+
from typing import TYPE_CHECKING, Protocol, runtime_checkable
|
|
16
|
+
|
|
17
|
+
from agent_evolve.domain.typed_json import (
|
|
18
|
+
FrozenJsonObject,
|
|
19
|
+
freeze_json,
|
|
20
|
+
thaw_json,
|
|
21
|
+
typed_json_sha256,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from agent_evolve.application.agentic_evolution import EvolutionCandidate
|
|
26
|
+
from agent_evolve.application.evolution_campaign import ArchiveUtilitySnapshot
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,127}$")
|
|
30
|
+
_PROJECTION_DOMAIN = b"agent-evolve:campaign-archive-context-projection:v1\x00"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _canonical_json(value: object) -> bytes:
|
|
34
|
+
return json.dumps(
|
|
35
|
+
value,
|
|
36
|
+
allow_nan=False,
|
|
37
|
+
ensure_ascii=True,
|
|
38
|
+
separators=(",", ":"),
|
|
39
|
+
sort_keys=True,
|
|
40
|
+
).encode("ascii", errors="strict")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _require_sha256(value: str, name: str) -> None:
|
|
44
|
+
if (
|
|
45
|
+
type(value) is not str
|
|
46
|
+
or len(value) != 64
|
|
47
|
+
or any(character not in "0123456789abcdef" for character in value)
|
|
48
|
+
):
|
|
49
|
+
raise ValueError(f"{name} must be a lowercase SHA-256 digest")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True, slots=True)
|
|
53
|
+
class CampaignPortfolioArchiveContextProjection:
|
|
54
|
+
"""One exact cutoff-valid archive projection for one parent decision."""
|
|
55
|
+
|
|
56
|
+
projector_id: str
|
|
57
|
+
projector_version: int
|
|
58
|
+
definition_sha256: str
|
|
59
|
+
archive_utility_snapshot_sha256: str
|
|
60
|
+
parent_configuration_sha256: str
|
|
61
|
+
payload: FrozenJsonObject
|
|
62
|
+
projection_sha256: str = field(init=False)
|
|
63
|
+
|
|
64
|
+
def __post_init__(self) -> None:
|
|
65
|
+
if type(self.projector_id) is not str or _TOKEN.fullmatch(
|
|
66
|
+
self.projector_id
|
|
67
|
+
) is None:
|
|
68
|
+
raise ValueError("projector_id must use the closed token grammar")
|
|
69
|
+
if type(self.projector_version) is not int or self.projector_version <= 0:
|
|
70
|
+
raise ValueError("projector_version must be a positive exact integer")
|
|
71
|
+
_require_sha256(self.definition_sha256, "definition_sha256")
|
|
72
|
+
_require_sha256(
|
|
73
|
+
self.archive_utility_snapshot_sha256,
|
|
74
|
+
"archive_utility_snapshot_sha256",
|
|
75
|
+
)
|
|
76
|
+
_require_sha256(
|
|
77
|
+
self.parent_configuration_sha256,
|
|
78
|
+
"parent_configuration_sha256",
|
|
79
|
+
)
|
|
80
|
+
if (
|
|
81
|
+
type(self.payload) is not FrozenJsonObject
|
|
82
|
+
or freeze_json(self.payload) is not self.payload
|
|
83
|
+
):
|
|
84
|
+
raise TypeError("payload must be an exact frozen typed-JSON object")
|
|
85
|
+
object.__setattr__(
|
|
86
|
+
self,
|
|
87
|
+
"projection_sha256",
|
|
88
|
+
hashlib.sha256(
|
|
89
|
+
_PROJECTION_DOMAIN + _canonical_json(self._unsigned_record())
|
|
90
|
+
).hexdigest(),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
94
|
+
return {
|
|
95
|
+
"schema_version": 1,
|
|
96
|
+
"projector": {
|
|
97
|
+
"projector_id": self.projector_id,
|
|
98
|
+
"projector_version": self.projector_version,
|
|
99
|
+
"definition_sha256": self.definition_sha256,
|
|
100
|
+
},
|
|
101
|
+
"archive_utility_snapshot_sha256": (
|
|
102
|
+
self.archive_utility_snapshot_sha256
|
|
103
|
+
),
|
|
104
|
+
"parent_configuration_sha256": self.parent_configuration_sha256,
|
|
105
|
+
"payload_sha256": typed_json_sha256(self.payload),
|
|
106
|
+
"payload": thaw_json(self.payload),
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
def to_record(self) -> dict[str, object]:
|
|
110
|
+
self.__post_init__()
|
|
111
|
+
return {
|
|
112
|
+
**self._unsigned_record(),
|
|
113
|
+
"projection_sha256": self.projection_sha256,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@runtime_checkable
|
|
118
|
+
class CampaignPortfolioArchiveContextProjector(Protocol):
|
|
119
|
+
"""Project only frozen archive state and one evaluated parent."""
|
|
120
|
+
|
|
121
|
+
projector_id: str
|
|
122
|
+
projector_version: int
|
|
123
|
+
definition_sha256: str
|
|
124
|
+
|
|
125
|
+
def project(
|
|
126
|
+
self,
|
|
127
|
+
*,
|
|
128
|
+
archive_utility: ArchiveUtilitySnapshot,
|
|
129
|
+
parent: EvolutionCandidate,
|
|
130
|
+
) -> CampaignPortfolioArchiveContextProjection: ...
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
__all__ = [
|
|
134
|
+
"CampaignPortfolioArchiveContextProjection",
|
|
135
|
+
"CampaignPortfolioArchiveContextProjector",
|
|
136
|
+
]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Ports for artifact minimization and deterministic secret sanitization."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Protocol, runtime_checkable
|
|
6
|
+
|
|
7
|
+
from agent_evolve.domain.artifact import ArtifactRole
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ArtifactMinimizationError(ValueError):
|
|
11
|
+
"""A value cannot be minimized under the selected role policy."""
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ArtifactSanitizationError(ValueError):
|
|
15
|
+
"""A value cannot be made safe under the selected sanitization policy."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@runtime_checkable
|
|
19
|
+
class ArtifactMinimizer(Protocol):
|
|
20
|
+
"""Remove fields that are unnecessary for a role before redaction."""
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def policy_id(self) -> str: ...
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def policy_version(self) -> str: ...
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def policy_config_sha256(self) -> str: ...
|
|
30
|
+
|
|
31
|
+
def minimize_json(self, value: Any, *, role: ArtifactRole) -> Any: ...
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@runtime_checkable
|
|
35
|
+
class ArtifactSanitizer(Protocol):
|
|
36
|
+
"""Return a detached JSON value safe to pass to canonical encoding."""
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def policy_id(self) -> str: ...
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def policy_version(self) -> str: ...
|
|
43
|
+
|
|
44
|
+
def sanitize_json(self, value: Any, *, role: ArtifactRole) -> Any: ...
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"""Content-addressed artifact-store port, errors, and strict codecs."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import math
|
|
7
|
+
from typing import Any, Protocol, runtime_checkable
|
|
8
|
+
|
|
9
|
+
from agent_evolve.domain.artifact import ArtifactRef
|
|
10
|
+
from agent_evolve.domain.ids import ArtifactId
|
|
11
|
+
|
|
12
|
+
JSON_MEDIA_TYPE = "application/json"
|
|
13
|
+
UTF8_TEXT_MEDIA_TYPE = "text/plain; charset=utf-8"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ArtifactStoreError(RuntimeError):
|
|
17
|
+
"""Base error for artifact persistence and retrieval failures."""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ArtifactNotFoundError(ArtifactStoreError):
|
|
21
|
+
"""The requested artifact ID is not present."""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class CorruptArtifactError(ArtifactStoreError):
|
|
25
|
+
"""Stored bytes or metadata do not verify against their artifact ID."""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ArtifactCollisionError(ArtifactStoreError):
|
|
29
|
+
"""Different typed payloads resolved to the same artifact identity."""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ArtifactTypeError(TypeError, ArtifactStoreError):
|
|
33
|
+
"""A value or stored media type does not match the requested representation."""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ArtifactSerializationError(ArtifactStoreError):
|
|
37
|
+
"""A text or JSON value cannot be encoded or decoded strictly."""
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@runtime_checkable
|
|
41
|
+
class ArtifactStore(Protocol):
|
|
42
|
+
"""Persist and verify immutable typed byte payloads by content address."""
|
|
43
|
+
|
|
44
|
+
def put_bytes(self, content: bytes, *, media_type: str) -> ArtifactRef: ...
|
|
45
|
+
|
|
46
|
+
def stat(self, artifact_id: ArtifactId) -> ArtifactRef: ...
|
|
47
|
+
|
|
48
|
+
def read_bytes(
|
|
49
|
+
self,
|
|
50
|
+
artifact_id: ArtifactId,
|
|
51
|
+
*,
|
|
52
|
+
expected_media_type: str | None = None,
|
|
53
|
+
) -> bytes: ...
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _validate_json_value(
|
|
57
|
+
value: Any,
|
|
58
|
+
*,
|
|
59
|
+
path: str = "$",
|
|
60
|
+
ancestors: set[int] | None = None,
|
|
61
|
+
) -> None:
|
|
62
|
+
if value is None or isinstance(value, (bool, int)):
|
|
63
|
+
return
|
|
64
|
+
if isinstance(value, str):
|
|
65
|
+
_validate_utf8_string(value, path=path)
|
|
66
|
+
return
|
|
67
|
+
if isinstance(value, float):
|
|
68
|
+
if not math.isfinite(value):
|
|
69
|
+
raise ArtifactSerializationError(f"Non-finite JSON number at {path}")
|
|
70
|
+
return
|
|
71
|
+
if isinstance(value, (list, tuple)):
|
|
72
|
+
ancestors = set() if ancestors is None else ancestors
|
|
73
|
+
identity = id(value)
|
|
74
|
+
if identity in ancestors:
|
|
75
|
+
raise ArtifactSerializationError(f"Cyclic JSON container at {path}")
|
|
76
|
+
ancestors.add(identity)
|
|
77
|
+
try:
|
|
78
|
+
for index, item in enumerate(value):
|
|
79
|
+
_validate_json_value(
|
|
80
|
+
item,
|
|
81
|
+
path=f"{path}[{index}]",
|
|
82
|
+
ancestors=ancestors,
|
|
83
|
+
)
|
|
84
|
+
finally:
|
|
85
|
+
ancestors.remove(identity)
|
|
86
|
+
return
|
|
87
|
+
if isinstance(value, dict):
|
|
88
|
+
ancestors = set() if ancestors is None else ancestors
|
|
89
|
+
identity = id(value)
|
|
90
|
+
if identity in ancestors:
|
|
91
|
+
raise ArtifactSerializationError(f"Cyclic JSON container at {path}")
|
|
92
|
+
ancestors.add(identity)
|
|
93
|
+
try:
|
|
94
|
+
for key, item in value.items():
|
|
95
|
+
if not isinstance(key, str):
|
|
96
|
+
raise ArtifactSerializationError(
|
|
97
|
+
f"JSON object key at {path} must be a string"
|
|
98
|
+
)
|
|
99
|
+
_validate_utf8_string(key, path=f"{path} object key")
|
|
100
|
+
_validate_json_value(
|
|
101
|
+
item,
|
|
102
|
+
path=f"{path}[{key!r}]",
|
|
103
|
+
ancestors=ancestors,
|
|
104
|
+
)
|
|
105
|
+
finally:
|
|
106
|
+
ancestors.remove(identity)
|
|
107
|
+
return
|
|
108
|
+
raise ArtifactSerializationError(
|
|
109
|
+
f"Value at {path} has unsupported JSON type {type(value).__name__}"
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _validate_utf8_string(value: str, *, path: str) -> None:
|
|
114
|
+
try:
|
|
115
|
+
value.encode("utf-8", errors="strict")
|
|
116
|
+
except UnicodeEncodeError as exc:
|
|
117
|
+
raise ArtifactSerializationError(
|
|
118
|
+
f"JSON string at {path} is not strict UTF-8 encodable"
|
|
119
|
+
) from exc
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def canonical_json_bytes(value: Any) -> bytes:
|
|
123
|
+
"""Encode the supported JSON value domain deterministically as UTF-8."""
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
_validate_json_value(value)
|
|
127
|
+
encoded = json.dumps(
|
|
128
|
+
value,
|
|
129
|
+
allow_nan=False,
|
|
130
|
+
ensure_ascii=False,
|
|
131
|
+
separators=(",", ":"),
|
|
132
|
+
sort_keys=True,
|
|
133
|
+
)
|
|
134
|
+
return encoded.encode("utf-8", errors="strict")
|
|
135
|
+
except ArtifactSerializationError:
|
|
136
|
+
raise
|
|
137
|
+
except (TypeError, ValueError, UnicodeEncodeError, RecursionError) as exc:
|
|
138
|
+
raise ArtifactSerializationError(f"JSON encoding failed: {exc}") from exc
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _reject_duplicate_keys(pairs: list[tuple[str, Any]]) -> dict[str, Any]:
|
|
142
|
+
result: dict[str, Any] = {}
|
|
143
|
+
for key, value in pairs:
|
|
144
|
+
if key in result:
|
|
145
|
+
raise ArtifactSerializationError(f"Duplicate JSON object key {key!r}")
|
|
146
|
+
result[key] = value
|
|
147
|
+
return result
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _reject_nonstandard_number(value: str) -> None:
|
|
151
|
+
raise ArtifactSerializationError(f"Non-standard JSON number {value!r}")
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def decode_json_bytes(content: bytes) -> Any:
|
|
155
|
+
"""Decode strict UTF-8 JSON, rejecting duplicates and non-standard numbers."""
|
|
156
|
+
|
|
157
|
+
if not isinstance(content, bytes):
|
|
158
|
+
raise ArtifactTypeError("JSON artifact content must be bytes")
|
|
159
|
+
try:
|
|
160
|
+
text = content.decode("utf-8", errors="strict")
|
|
161
|
+
value = json.loads(
|
|
162
|
+
text,
|
|
163
|
+
object_pairs_hook=_reject_duplicate_keys,
|
|
164
|
+
parse_constant=_reject_nonstandard_number,
|
|
165
|
+
)
|
|
166
|
+
except ArtifactSerializationError:
|
|
167
|
+
raise
|
|
168
|
+
except (UnicodeDecodeError, json.JSONDecodeError, RecursionError) as exc:
|
|
169
|
+
raise ArtifactSerializationError(f"JSON decoding failed: {exc}") from exc
|
|
170
|
+
try:
|
|
171
|
+
_validate_json_value(value)
|
|
172
|
+
except RecursionError as exc:
|
|
173
|
+
raise ArtifactSerializationError("JSON value exceeds the nesting limit") from exc
|
|
174
|
+
return value
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def put_json(
|
|
178
|
+
store: ArtifactStore,
|
|
179
|
+
value: Any,
|
|
180
|
+
*,
|
|
181
|
+
media_type: str = JSON_MEDIA_TYPE,
|
|
182
|
+
) -> ArtifactRef:
|
|
183
|
+
return store.put_bytes(canonical_json_bytes(value), media_type=media_type)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def read_json(
|
|
187
|
+
store: ArtifactStore,
|
|
188
|
+
artifact_id: ArtifactId,
|
|
189
|
+
*,
|
|
190
|
+
expected_media_type: str = JSON_MEDIA_TYPE,
|
|
191
|
+
) -> Any:
|
|
192
|
+
return decode_json_bytes(
|
|
193
|
+
store.read_bytes(artifact_id, expected_media_type=expected_media_type)
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def put_text(
|
|
198
|
+
store: ArtifactStore,
|
|
199
|
+
value: str,
|
|
200
|
+
*,
|
|
201
|
+
media_type: str = UTF8_TEXT_MEDIA_TYPE,
|
|
202
|
+
) -> ArtifactRef:
|
|
203
|
+
if not isinstance(value, str):
|
|
204
|
+
raise ArtifactTypeError("text artifact value must be a string")
|
|
205
|
+
try:
|
|
206
|
+
content = value.encode("utf-8", errors="strict")
|
|
207
|
+
except UnicodeEncodeError as exc:
|
|
208
|
+
raise ArtifactSerializationError(f"UTF-8 encoding failed: {exc}") from exc
|
|
209
|
+
return store.put_bytes(content, media_type=media_type)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def read_text(
|
|
213
|
+
store: ArtifactStore,
|
|
214
|
+
artifact_id: ArtifactId,
|
|
215
|
+
*,
|
|
216
|
+
expected_media_type: str = UTF8_TEXT_MEDIA_TYPE,
|
|
217
|
+
) -> str:
|
|
218
|
+
content = store.read_bytes(
|
|
219
|
+
artifact_id,
|
|
220
|
+
expected_media_type=expected_media_type,
|
|
221
|
+
)
|
|
222
|
+
try:
|
|
223
|
+
return content.decode("utf-8", errors="strict")
|
|
224
|
+
except UnicodeDecodeError as exc:
|
|
225
|
+
raise ArtifactSerializationError(f"UTF-8 decoding failed: {exc}") from exc
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Wall/monotonic clock port."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import Protocol, runtime_checkable
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@runtime_checkable
|
|
10
|
+
class Clock(Protocol):
|
|
11
|
+
def utc_now(self) -> datetime: ...
|
|
12
|
+
def monotonic_ns(self) -> int: ...
|
|
13
|
+
|