devagent-physical-engine 0.13.0__tar.gz → 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- devagent_physical_engine-1.0.0/PKG-INFO +398 -0
- devagent_physical_engine-1.0.0/README.md +357 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/pyproject.toml +8 -7
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/__init__.py +23 -1
- devagent_physical_engine-1.0.0/src/devagent_physical_engine/commercial.py +873 -0
- devagent_physical_engine-1.0.0/src/devagent_physical_engine/commercial_campaign.py +118 -0
- devagent_physical_engine-1.0.0/src/devagent_physical_engine/commercial_cli.py +185 -0
- devagent_physical_engine-1.0.0/src/devagent_physical_engine/commercial_importer.py +84 -0
- devagent_physical_engine-1.0.0/src/devagent_physical_engine/commercial_readiness.py +157 -0
- devagent_physical_engine-1.0.0/src/devagent_physical_engine/commercial_repository.py +42 -0
- devagent_physical_engine-1.0.0/src/devagent_physical_engine.egg-info/PKG-INFO +398 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine.egg-info/SOURCES.txt +9 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine.egg-info/entry_points.txt +1 -0
- devagent_physical_engine-1.0.0/tests/test_commercial_importer_v1.py +78 -0
- devagent_physical_engine-1.0.0/tests/test_commercial_readiness_v1.py +141 -0
- devagent_physical_engine-1.0.0/tests/test_commercial_v1.py +227 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_readme_pypi.py +2 -1
- devagent_physical_engine-0.13.0/PKG-INFO +0 -456
- devagent_physical_engine-0.13.0/README.md +0 -415
- devagent_physical_engine-0.13.0/src/devagent_physical_engine.egg-info/PKG-INFO +0 -456
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/NOTICE +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/setup.cfg +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/coordinator.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ai_cli.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/engineering_agent.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/pose_math.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/project.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/qualification.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/reference_workcell.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/robots.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/__init__.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/doctor.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_ai_cli.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_core.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_gazebo_cli_v0122.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_joint_state_probe_v0125.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_moveit_scene_v0123.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_planning_fallback_v012.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_pose_math_v0125.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_project_spine_v013.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_reference_workcell_v012.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_robot_platform_v08.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_ros_trajectory_v09.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_tool_scene_v0124.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_trajectory_action_probe_v0125.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_trajectory_tracking_v0125.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-0.13.0 → devagent_physical_engine-1.0.0}/tests/test_workpiece_lifecycle_v011.py +0 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: devagent-physical-engine
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Verification-first commercial engineering, simulation, traceability, regression, and FAT evidence runtime for robotics and industrial automation.
|
|
5
|
+
Author: Tom Ha
|
|
6
|
+
License: All Rights Reserved
|
|
7
|
+
Project-URL: Homepage, https://github.com/tomha85/devagent-physical-engine
|
|
8
|
+
Project-URL: Repository, https://github.com/tomha85/devagent-physical-engine
|
|
9
|
+
Project-URL: Issues, https://github.com/tomha85/devagent-physical-engine/issues
|
|
10
|
+
Keywords: robotics,industrial-automation,agentic-ai,ros2,verification,digital-twin,fat-testing,regression
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: NOTICE
|
|
23
|
+
Requires-Dist: PyYAML<7,>=6.0
|
|
24
|
+
Provides-Extra: openai
|
|
25
|
+
Requires-Dist: openai<4,>=3.0; extra == "openai"
|
|
26
|
+
Provides-Extra: anthropic
|
|
27
|
+
Requires-Dist: anthropic<2,>=1.0; extra == "anthropic"
|
|
28
|
+
Provides-Extra: gemini
|
|
29
|
+
Requires-Dist: google-genai<3,>=2.0; extra == "gemini"
|
|
30
|
+
Provides-Extra: ai
|
|
31
|
+
Requires-Dist: openai<4,>=3.0; extra == "ai"
|
|
32
|
+
Requires-Dist: anthropic<2,>=1.0; extra == "ai"
|
|
33
|
+
Requires-Dist: google-genai<3,>=2.0; extra == "ai"
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: build==1.6.0; extra == "dev"
|
|
36
|
+
Requires-Dist: twine==7.0.0; extra == "dev"
|
|
37
|
+
Requires-Dist: coverage[toml]<8,>=7.6; extra == "dev"
|
|
38
|
+
Requires-Dist: ruff<1,>=0.12; extra == "dev"
|
|
39
|
+
Requires-Dist: pip-audit<3,>=2.9; extra == "dev"
|
|
40
|
+
Dynamic: license-file
|
|
41
|
+
|
|
42
|
+
# DevAgent Smart Physical Engine
|
|
43
|
+
|
|
44
|
+
[](https://pypi.org/project/devagent-physical-engine/)
|
|
45
|
+
[](https://pypi.org/project/devagent-physical-engine/)
|
|
46
|
+
[](#project-status)
|
|
47
|
+
|
|
48
|
+
**Verification-first commercial engineering, customer Twin import, requirement traceability, regression analysis, and FAT evidence for robotic and industrial automation.**
|
|
49
|
+
|
|
50
|
+
> **AI proposes. Deterministic engines validate, compile, verify, simulate, measure, and gate promotion. Existing certified robot controllers, PLCs, and safety systems remain authoritative.**
|
|
51
|
+
|
|
52
|
+
DevAgent Smart Physical Engine helps an engineer move from a customer workcell definition to evidence-backed engineering review without giving an LLM direct robot-control authority. Commercial V1 adds a durable customer workflow around the existing provider-neutral AI, canonical physical Twin, ROS 2 / Gazebo / MoveIt simulation, deterministic verification, and evidence infrastructure.
|
|
53
|
+
|
|
54
|
+
## Commercial V1 outcome
|
|
55
|
+
|
|
56
|
+
A customer project can now be handled as one durable evidence chain:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
CUSTOMER PROJECT / SITE / WORKCELL
|
|
60
|
+
|
|
|
61
|
+
v
|
|
62
|
+
CUSTOMER FILE INVENTORY + devagent-twin MANIFEST
|
|
63
|
+
|
|
|
64
|
+
v
|
|
65
|
+
CANONICAL TWIN + IMMUTABLE twin-r000N REVISION
|
|
66
|
+
|
|
|
67
|
+
v
|
|
68
|
+
REQUIREMENT SET
|
|
69
|
+
|
|
|
70
|
+
v
|
|
71
|
+
DETERMINISTIC REQUIREMENT CAMPAIGN
|
|
72
|
+
|
|
|
73
|
+
v
|
|
74
|
+
REGRESSION COMPARISON
|
|
75
|
+
|
|
|
76
|
+
v
|
|
77
|
+
CUSTOMER-READY FAT EVIDENCE REPORT
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The commercial workflow is intentionally fail-closed. A CAD, URDF, mesh, YAML, or CSV file being present does **not** prove a robot base pose, TCP, dimension, coordinate frame, collision model, calibration, or physics property. Those facts must be explicitly declared or measured before DevAgent promotes them as engineering evidence.
|
|
81
|
+
|
|
82
|
+
## Install
|
|
83
|
+
|
|
84
|
+
Python 3.11+ is required.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
python -m pip install devagent-physical-engine
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Optional AI providers:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
python -m pip install "devagent-physical-engine[openai]"
|
|
94
|
+
python -m pip install "devagent-physical-engine[anthropic]"
|
|
95
|
+
python -m pip install "devagent-physical-engine[gemini]"
|
|
96
|
+
# or all supported provider SDKs
|
|
97
|
+
python -m pip install "devagent-physical-engine[ai]"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`pip install` does not install ROS, Gazebo, MoveIt, OEM robot drivers, or privileged operating-system dependencies.
|
|
101
|
+
|
|
102
|
+
## Commercial quick start
|
|
103
|
+
|
|
104
|
+
Create durable customer identity:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
devagent-commercial init warehouse-cnc-04 \
|
|
108
|
+
--name "Warehouse CNC Loading Cell 04" \
|
|
109
|
+
--site atl-01 \
|
|
110
|
+
--workcell cnc-04
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Import a customer folder:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
devagent-commercial import-twin warehouse-cnc-04 ./customer-cell
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
The folder may contain supported engineering assets such as:
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
customer-cell/
|
|
123
|
+
├── devagent-twin.yaml
|
|
124
|
+
├── robot.urdf
|
|
125
|
+
├── robot.srdf
|
|
126
|
+
├── meshes/
|
|
127
|
+
│ ├── gripper.stl
|
|
128
|
+
│ └── fixture.stl
|
|
129
|
+
└── notes-or-export.json
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Commercial V1 inventories `.urdf`, `.xacro`, `.srdf`, `.stl`, `.dae`, `.obj`, `.step`, `.stp`, `.iges`, `.igs`, `.yaml`, `.yml`, `.json`, and `.csv` files. Customer assets are SHA-256 fingerprinted with bounded streaming I/O; individual inventoried assets are limited to 512 MiB. A `devagent-twin.yaml`, `devagent-twin.yml`, or `devagent-twin.json` manifest is required before file inventory becomes physical Twin evidence.
|
|
133
|
+
|
|
134
|
+
If the manifest or required physical facts are missing, DevAgent returns `needs_information` with explicit engineering questions instead of inventing values.
|
|
135
|
+
|
|
136
|
+
Import requirements:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
devagent-commercial requirements warehouse-cnc-04 requirements.csv
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Run deterministic requirement verification against the latest Twin revision:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
devagent-commercial campaign warehouse-cnc-04 requirements.csv
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Or bind the campaign to an exact immutable revision:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
devagent-commercial campaign warehouse-cnc-04 requirements.csv \
|
|
152
|
+
--revision twin-r0002
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Compare a previous campaign with a current campaign:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
devagent-commercial regression warehouse-cnc-04 \
|
|
159
|
+
art-BASELINE \
|
|
160
|
+
art-CURRENT
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Generate a FAT Markdown report:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
devagent-commercial fat-report warehouse-cnc-04 \
|
|
167
|
+
art-CURRENT \
|
|
168
|
+
--regression art-REGRESSION \
|
|
169
|
+
--output FAT_REPORT.md
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Inspect commercial readiness and immutable evidence:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
devagent-commercial status warehouse-cnc-04
|
|
176
|
+
devagent-commercial artifacts warehouse-cnc-04
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
The default commercial evidence database is:
|
|
180
|
+
|
|
181
|
+
```text
|
|
182
|
+
~/.devagent/projects.db
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Customer Twin manifest
|
|
186
|
+
|
|
187
|
+
Commercial V1 is manifest-driven so engineering facts have explicit provenance. A minimal structure is:
|
|
188
|
+
|
|
189
|
+
```yaml
|
|
190
|
+
schema_version: 1
|
|
191
|
+
length_unit: mm
|
|
192
|
+
angle_unit: deg
|
|
193
|
+
|
|
194
|
+
engineering_request:
|
|
195
|
+
robot: ur5e
|
|
196
|
+
operation: load
|
|
197
|
+
object_id: BOX_101
|
|
198
|
+
source: conveyor_a
|
|
199
|
+
destination: cnc_04
|
|
200
|
+
tool: parallel_gripper
|
|
201
|
+
payload_kg: 1.5
|
|
202
|
+
purpose: simulate
|
|
203
|
+
|
|
204
|
+
robot_base_pose:
|
|
205
|
+
x: 0
|
|
206
|
+
y: 0
|
|
207
|
+
z: 0
|
|
208
|
+
origin: measured
|
|
209
|
+
source_ref: site-survey
|
|
210
|
+
|
|
211
|
+
entities:
|
|
212
|
+
- id: conveyor_a
|
|
213
|
+
type: conveyor
|
|
214
|
+
pose: {x: 700, y: 0, z: 850}
|
|
215
|
+
geometry:
|
|
216
|
+
kind: box
|
|
217
|
+
dimensions: [2000, 600, 800]
|
|
218
|
+
|
|
219
|
+
- id: cnc_04
|
|
220
|
+
type: machine
|
|
221
|
+
pose: {x: 1200, y: 400, z: 0}
|
|
222
|
+
geometry:
|
|
223
|
+
kind: box
|
|
224
|
+
dimensions: [1400, 1200, 1800]
|
|
225
|
+
|
|
226
|
+
- id: BOX_101
|
|
227
|
+
type: workpiece
|
|
228
|
+
pose: {x: 700, y: 0, z: 900}
|
|
229
|
+
geometry:
|
|
230
|
+
kind: box
|
|
231
|
+
dimensions: [200, 100, 50]
|
|
232
|
+
|
|
233
|
+
tool:
|
|
234
|
+
id: parallel_gripper
|
|
235
|
+
tcp:
|
|
236
|
+
x: 0
|
|
237
|
+
y: 0
|
|
238
|
+
z: 180
|
|
239
|
+
origin: measured
|
|
240
|
+
geometry:
|
|
241
|
+
kind: box
|
|
242
|
+
dimensions: [120, 80, 200]
|
|
243
|
+
max_payload_kg:
|
|
244
|
+
value: 5.0
|
|
245
|
+
origin: imported
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
A mesh can be referenced by relative asset path, for example:
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
geometry:
|
|
252
|
+
kind: mesh
|
|
253
|
+
asset: meshes/fixture.stl
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
The referenced file must have been discovered inside the customer source root. Absolute paths, `..` traversal, and symlinked customer assets are rejected.
|
|
257
|
+
|
|
258
|
+
## Requirement traceability
|
|
259
|
+
|
|
260
|
+
CSV example:
|
|
261
|
+
|
|
262
|
+
```csv
|
|
263
|
+
requirement_id,text,check,target,expected,severity
|
|
264
|
+
REQ-001,Twin shall be planning ready,planning_allowed,,true,must
|
|
265
|
+
REQ-002,Workpiece shall exist,entity_present,BOX_101,true,must
|
|
266
|
+
REQ-003,Unit mismatch shall be absent,validation_issue_absent,possible_unit_mismatch,true,must
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Commercial V1 deterministic checks are deliberately small and auditable:
|
|
270
|
+
|
|
271
|
+
- `planning_allowed`
|
|
272
|
+
- `physics_allowed`
|
|
273
|
+
- `entity_present`
|
|
274
|
+
- `validation_issue_absent`
|
|
275
|
+
- `twin_state`
|
|
276
|
+
|
|
277
|
+
A prose requirement without a supported deterministic check is reported as `NOT_TESTED`. It is never auto-passed by an LLM. A required (`must`) item that fails or remains untested blocks customer-review readiness.
|
|
278
|
+
|
|
279
|
+
## Evidence and regression
|
|
280
|
+
|
|
281
|
+
Project, Twin, import, campaign, regression, and FAT artifacts are stored with stable identities and content hashes. Twin revisions are monotonic and immutable (`twin-r0001`, `twin-r0002`, ...).
|
|
282
|
+
|
|
283
|
+
Regression analysis explicitly identifies a requirement that changed from `PASS` in the baseline campaign to any non-pass state in the current campaign. A regression blocks release readiness.
|
|
284
|
+
|
|
285
|
+
The FAT report includes project/site/workcell identity, exact Twin revision and hash, requirement counts, pass/fail/not-tested results, coverage, regression state, and bounded release readiness.
|
|
286
|
+
|
|
287
|
+
`READY FOR CUSTOMER REVIEW` means the declared/imported Twin scope and mapped deterministic requirements passed the commercial evidence gates. It does **not** mean functional-safety certification, site qualification, commissioning approval, or permission to move a production robot.
|
|
288
|
+
|
|
289
|
+
## AI engineering layer
|
|
290
|
+
|
|
291
|
+
The runtime remains provider-neutral. OpenAI, Anthropic, and Gemini can be used for interpretation, planning, critique, and recovery while deterministic code owns schema validation, semantic policy, Twin validation, collision/clearance contracts, evidence, qualification, and execution gating.
|
|
292
|
+
|
|
293
|
+
Check a provider:
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
devagent-physical-ai doctor --provider openai
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Run an engineering request:
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
devagent-physical-ai engineer \
|
|
303
|
+
"Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
|
|
304
|
+
--provider openai \
|
|
305
|
+
--model <model-id>
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Use `--quiet` for machine-readable JSON without progress messages on stdout.
|
|
309
|
+
|
|
310
|
+
## Physical simulation
|
|
311
|
+
|
|
312
|
+
The repository retains the evidence-gated ROS 2 / Gazebo / MoveIt physical simulation stack and the packaged UR5e reference workcell. The reference stack target is:
|
|
313
|
+
|
|
314
|
+
```text
|
|
315
|
+
Ubuntu 24.04
|
|
316
|
+
ROS 2 Jazzy
|
|
317
|
+
Gazebo Harmonic
|
|
318
|
+
gz_ros2_control
|
|
319
|
+
Universal Robots ROS 2 driver
|
|
320
|
+
ur_simulation_gz
|
|
321
|
+
MoveIt 2
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Useful commands:
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
devagent-physical setup --profile ur5e-sim --dry-run
|
|
328
|
+
devagent-physical setup --profile ur5e-sim
|
|
329
|
+
devagent-physical ros doctor
|
|
330
|
+
devagent-physical ros demo
|
|
331
|
+
devagent-physical ros qualify-trajectory-runtime
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Hosted Python CI cannot truthfully exercise a graphical Gazebo process, MoveIt `move_group`, TF, ROS controllers, or Gazebo services. Those paths retain separate executable target qualification. A registry entry for FANUC, KUKA, ABB, or another robot family does not imply identical physical simulation qualification.
|
|
335
|
+
|
|
336
|
+
## Safety and authority boundary
|
|
337
|
+
|
|
338
|
+
Commercial V1 is an engineering verification product, not a safety controller. It intentionally preserves these boundaries:
|
|
339
|
+
|
|
340
|
+
```text
|
|
341
|
+
AI / COMMERCIAL WORKFLOW
|
|
342
|
+
|
|
|
343
|
+
v
|
|
344
|
+
DETERMINISTIC DEVAGENT EVIDENCE
|
|
345
|
+
|
|
|
346
|
+
v
|
|
347
|
+
SIMULATION / ENGINEERING REVIEW
|
|
348
|
+
|
|
|
349
|
+
X
|
|
350
|
+
NO AUTOMATIC PRODUCTION-HARDWARE AUTHORITY
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Simulation success does not override OEM controllers, PLC interlocks, safety PLCs, risk assessments, guarding, functional-safety validation, site commissioning procedures, or engineer approval.
|
|
354
|
+
|
|
355
|
+
Commercial outputs therefore continue to report:
|
|
356
|
+
|
|
357
|
+
```text
|
|
358
|
+
site_qualification=false
|
|
359
|
+
real_execution_allowed=false
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
unless a separately implemented and evidence-qualified authority path explicitly proves otherwise. Commercial V1 does not add such a path.
|
|
363
|
+
|
|
364
|
+
## Software verification and releases
|
|
365
|
+
|
|
366
|
+
Repository CI verifies Python 3.11, 3.12, and 3.13, compilation, unit regression, Ruff correctness, branch coverage, package build, clean wheel installation, and runtime dependency vulnerability audit.
|
|
367
|
+
|
|
368
|
+
A green `main` release is tied to the exact CI-tested commit. Release artifacts are rebuilt from the exact tag, checked with Twine, clean-installed, accompanied by a CycloneDX runtime SBOM and SHA-256 checksums, attached to the GitHub Release, and published to PyPI through Trusted Publishing with digital attestations.
|
|
369
|
+
|
|
370
|
+
## Documentation
|
|
371
|
+
|
|
372
|
+
- [Commercial V1](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/COMMERCIAL_V1.md)
|
|
373
|
+
- [Commercial project spine](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/COMMERCIAL_PROJECT_SPINE.md)
|
|
374
|
+
- [Production readiness](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/PRODUCTION_READINESS.md)
|
|
375
|
+
- [Architecture](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/ARCHITECTURE.md)
|
|
376
|
+
- [Agent Core](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/AGENT_CORE.md)
|
|
377
|
+
- [AI providers](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/AI_PROVIDERS.md)
|
|
378
|
+
- [Natural-language engineering](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/NATURAL_LANGUAGE_ENGINEERING.md)
|
|
379
|
+
- [Robot platform and Twin](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/ROBOT_PLATFORM_AND_TWIN.md)
|
|
380
|
+
- [Measured physical runtime](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/MEASURED_PHYSICAL_RUNTIME.md)
|
|
381
|
+
- [Qualification](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/QUALIFICATION.md)
|
|
382
|
+
- [Optimization](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/OPTIMIZATION.md)
|
|
383
|
+
- [Workstation setup](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/SETUP.md)
|
|
384
|
+
- [PyPI release process](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/PYPI_RELEASE.md)
|
|
385
|
+
|
|
386
|
+
## Project status
|
|
387
|
+
|
|
388
|
+
**v1.0.0 — Production/Stable software / commercial engineering workflow with evidence-gated customer Twin import, requirement traceability, regression analysis, and FAT reporting.**
|
|
389
|
+
|
|
390
|
+
Production/Stable describes the shipped software/API/CLI and release process for the bounded V1 scope. Physical and site readiness remain evidence- and adapter-specific. Arbitrary CAD/URDF content is inventoried and fingerprinted but is not semantically trusted merely because a file exists; customer physical facts are promoted only through explicit manifest/evidence contracts. Real robot execution remains locked by default. Functional-safety certification and customer-site commissioning are not claimed.
|
|
391
|
+
|
|
392
|
+
## Ownership
|
|
393
|
+
|
|
394
|
+
DevAgent Smart Physical Engine
|
|
395
|
+
Copyright © 2026 Tom Ha
|
|
396
|
+
Original creator: Tom Ha
|
|
397
|
+
Original project: https://github.com/tomha85/devagent-physical-engine
|
|
398
|
+
All rights reserved.
|