aisolate-agent 0.3.3__tar.gz → 0.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/PKG-INFO +2 -2
  2. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/README.md +1 -1
  3. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/pyproject.toml +1 -1
  4. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/llm/base.py +1 -1
  5. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/llm/harmony.py +4 -4
  6. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/llm/oai.py +4 -4
  7. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/llm/qwen.py +4 -4
  8. aisolate_agent-0.3.4/src/aisolate/agent/tests/test_integration/test_prompt_template_contract.py +120 -0
  9. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate_agent.egg-info/PKG-INFO +2 -2
  10. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate_agent.egg-info/SOURCES.txt +1 -0
  11. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/setup.cfg +0 -0
  12. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/__init__.py +0 -0
  13. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/__init__.py +0 -0
  14. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/agent.py +0 -0
  15. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/config/__init__.py +0 -0
  16. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/config/agent_settings.py +0 -0
  17. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/config/prompts/__init__.py +0 -0
  18. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/config/state_llm.py +0 -0
  19. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/__init__.py +0 -0
  20. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/artifacts.py +0 -0
  21. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/budget.py +0 -0
  22. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/context.py +0 -0
  23. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/conversation_log.py +0 -0
  24. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/events.py +0 -0
  25. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/exceptions.py +0 -0
  26. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/graph.py +0 -0
  27. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/initial_state.py +0 -0
  28. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/llm_response.py +0 -0
  29. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/policy.py +0 -0
  30. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/protocols.py +0 -0
  31. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/snapshot.py +0 -0
  32. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/spine_compaction.py +0 -0
  33. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/tests/test_context_snapshots.py +0 -0
  34. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/tests/test_snapshot.py +0 -0
  35. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/views.py +0 -0
  36. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/core/workspace.py +0 -0
  37. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/graphs.py +0 -0
  38. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/logging/__init__.py +0 -0
  39. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/logging/config.py +0 -0
  40. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/logging/factory.py +0 -0
  41. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/logging/unified_logger.py +0 -0
  42. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/main.py +0 -0
  43. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/memory/__init__.py +0 -0
  44. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/memory/models.py +0 -0
  45. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/__init__.py +0 -0
  46. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/base.py +0 -0
  47. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/clarification.py +0 -0
  48. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/compaction.py +0 -0
  49. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/critic.py +0 -0
  50. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/executing.py +0 -0
  51. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/expert_synthesis.py +0 -0
  52. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/finished.py +0 -0
  53. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/hitl_pause.py +0 -0
  54. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/outputs.py +0 -0
  55. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/planning.py +0 -0
  56. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/states/task.py +0 -0
  57. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/status.py +0 -0
  58. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/__init__.py +0 -0
  59. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/llm/__init__.py +0 -0
  60. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/memory/__init__.py +0 -0
  61. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/memory/in_memory.py +0 -0
  62. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/memory/tests/test_in_memory.py +0 -0
  63. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/strategies/memory/vector.py +0 -0
  64. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/substrate.py +0 -0
  65. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/telemetry/__init__.py +0 -0
  66. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/telemetry/decorators.py +0 -0
  67. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/telemetry/factory.py +0 -0
  68. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/telemetry/interface.py +0 -0
  69. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/telemetry/noop.py +0 -0
  70. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/telemetry/openinference.py +0 -0
  71. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/telemetry/opentelemetry_impl.py +0 -0
  72. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/telemetry/utils.py +0 -0
  73. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/__init__.py +0 -0
  74. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/conftest.py +0 -0
  75. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/fakes.py +0 -0
  76. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/__init__.py +0 -0
  77. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_architecture_assumptions.py +0 -0
  78. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_artifact_rows.py +0 -0
  79. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_change_bridge_echo.py +0 -0
  80. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_conversation_log.py +0 -0
  81. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_delegated_lineage_restore.py +0 -0
  82. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_event_agent_name_stamping.py +0 -0
  83. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_execute_turn_review_pending.py +0 -0
  84. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_firewall_property.py +0 -0
  85. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_graph.py +0 -0
  86. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_initial_state.py +0 -0
  87. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_legacy_snapshot.py +0 -0
  88. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_live_capture.py +0 -0
  89. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_locale_prelude.py +0 -0
  90. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_policy.py +0 -0
  91. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_restore_review_posture.py +0 -0
  92. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_resume_semantics.py +0 -0
  93. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_run_streaming_cancel.py +0 -0
  94. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_spine_compaction.py +0 -0
  95. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_state_llm_overrides.py +0 -0
  96. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_state_transitions.py +0 -0
  97. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_status_summarizer.py +0 -0
  98. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_subagent_graph.py +0 -0
  99. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_substrate.py +0 -0
  100. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_token_accumulation.py +0 -0
  101. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_turn_started_events.py +0 -0
  102. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_turn_usage_isolation.py +0 -0
  103. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_uniform_state.py +0 -0
  104. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_views.py +0 -0
  105. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_workspace_bridge_attribution.py +0 -0
  106. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_workspace_capture.py +0 -0
  107. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_core/test_workspace_changed_event.py +0 -0
  108. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/__init__.py +0 -0
  109. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/conftest.py +0 -0
  110. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/test_delegation_file_paths.py +0 -0
  111. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/test_delegation_recovery.py +0 -0
  112. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/test_locale_helpers.py +0 -0
  113. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/test_size_compaction.py +0 -0
  114. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/test_stall_clone_96919cf1.py +0 -0
  115. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/test_truncation_wedge_5b90b101.py +0 -0
  116. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_e2e/test_workspace_lifecycle.py +0 -0
  117. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_integration/__init__.py +0 -0
  118. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_integration/helpers.py +0 -0
  119. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_integration/test_flagship_loop.py +0 -0
  120. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_integration/test_followup_roundtrips.py +0 -0
  121. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_integration/test_full_workflow.py +0 -0
  122. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_integration/test_restore_roundtrips.py +0 -0
  123. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_integration/test_stalled_and_acceptance.py +0 -0
  124. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/__init__.py +0 -0
  125. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_compact_for_llm.py +0 -0
  126. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_critic_enforcer.py +0 -0
  127. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_critic_review_cap.py +0 -0
  128. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_emission_map.py +0 -0
  129. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_executing_metadata.py +0 -0
  130. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_executing_prefix_stability.py +0 -0
  131. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_executing_review_routing.py +0 -0
  132. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_planning_artifact.py +0 -0
  133. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_planning_metadata.py +0 -0
  134. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_progress_ledger.py +0 -0
  135. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_selection.py +0 -0
  136. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_size_compaction_wiring.py +0 -0
  137. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_states/test_stall_recovery.py +0 -0
  138. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/__init__.py +0 -0
  139. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_identity_block.py +0 -0
  140. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_llm_generate_span.py +0 -0
  141. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_llm_providers.py +0 -0
  142. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_llm_watchdog.py +0 -0
  143. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_prepare_history_contract.py +0 -0
  144. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_qwen_retry.py +0 -0
  145. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_qwen_strategy.py +0 -0
  146. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_qwen_truncation.py +0 -0
  147. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_qwen_workspace_envelope.py +0 -0
  148. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_scripted_llm_contract.py +0 -0
  149. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_telemetry_attributes.py +0 -0
  150. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_strategies/test_turn_budget_block.py +0 -0
  151. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/__init__.py +0 -0
  152. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_bundle_and_restore.py +0 -0
  153. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_delegation_identity.py +0 -0
  154. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_edit_blocks.py +0 -0
  155. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_fake_executor.py +0 -0
  156. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_handover_sidecars.py +0 -0
  157. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_load_handover_resolution.py +0 -0
  158. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_output_refs.py +0 -0
  159. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_sandbox_import_surface.py +0 -0
  160. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_send_actions_error.py +0 -0
  161. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_shell_executing_loop.py +0 -0
  162. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_shell_tools.py +0 -0
  163. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_subagent_failure_contract.py +0 -0
  164. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_subagent_handover.py +0 -0
  165. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_three_tier_tools.py +0 -0
  166. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_workspace_actions.py +0 -0
  167. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tests/test_tools/test_workspace_tools.py +0 -0
  168. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/__init__.py +0 -0
  169. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/actions/__init__.py +0 -0
  170. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/actions/base.py +0 -0
  171. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/actions/final_answer.py +0 -0
  172. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/actions/load_handover.py +0 -0
  173. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/actions/visit_page_action.py +0 -0
  174. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/actions/web_search_action.py +0 -0
  175. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/actions/wikipedia_search_action.py +0 -0
  176. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/actions/workspace.py +0 -0
  177. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/base.py +0 -0
  178. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/execution.py +0 -0
  179. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/functions/__init__.py +0 -0
  180. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/functions/base.py +0 -0
  181. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/functions/hitl.py +0 -0
  182. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/models.py +0 -0
  183. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/__init__.py +0 -0
  184. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/base.py +0 -0
  185. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/edit_blocks.py +0 -0
  186. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/files_ops.py +0 -0
  187. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/python_executor.py +0 -0
  188. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/shell.py +0 -0
  189. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/subagent.py +0 -0
  190. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/web_search.py +0 -0
  191. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/platform/workspace_tools.py +0 -0
  192. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/tools/routing.py +0 -0
  193. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/trace.py +0 -0
  194. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/agent/utils.py +0 -0
  195. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/__init__.py +0 -0
  196. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/codec.py +0 -0
  197. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/errors.py +0 -0
  198. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/models.py +0 -0
  199. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/output_window.py +0 -0
  200. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/tests/__init__.py +0 -0
  201. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/tests/fake_vm.py +0 -0
  202. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/tests/fixtures.py +0 -0
  203. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/tests/test_codec_channel.py +0 -0
  204. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/tests/test_output_window.py +0 -0
  205. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/common/tests/utils.py +0 -0
  206. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/logging/__init__.py +0 -0
  207. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/logging/formatters.py +0 -0
  208. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate/logging/processors.py +0 -0
  209. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate_agent.egg-info/dependency_links.txt +0 -0
  210. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate_agent.egg-info/entry_points.txt +0 -0
  211. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate_agent.egg-info/requires.txt +0 -0
  212. {aisolate_agent-0.3.3 → aisolate_agent-0.3.4}/src/aisolate_agent.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aisolate-agent
3
- Version: 0.3.3
3
+ Version: 0.3.4
4
4
  Summary: AI Agent with intelligent planning and reasoning
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -30,7 +30,7 @@ AI Agent with intelligent planning and reasoning
30
30
  ## Local Installation
31
31
 
32
32
  ```bash
33
- pip install path/to/aisolate_agent-0.3.3-py3-none-any.whl
33
+ pip install path/to/aisolate_agent-0.3.4-py3-none-any.whl
34
34
  ```
35
35
 
36
36
  ## Usage
@@ -5,7 +5,7 @@ AI Agent with intelligent planning and reasoning
5
5
  ## Local Installation
6
6
 
7
7
  ```bash
8
- pip install path/to/aisolate_agent-0.3.3-py3-none-any.whl
8
+ pip install path/to/aisolate_agent-0.3.4-py3-none-any.whl
9
9
  ```
10
10
 
11
11
  ## Usage
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "aisolate-agent"
7
- version = "0.3.3"
7
+ version = "0.3.4"
8
8
  description = "AI Agent with intelligent planning and reasoning"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -500,7 +500,7 @@ class BaseLLMStrategy:
500
500
  prompt_template = (
501
501
  sub_agent_templates.get(f"task.{agent_name}")
502
502
  or sub_agent_templates.get("task")
503
- or "Create a plan to accomplish this task: {task}"
503
+ or "Create a plan to accomplish this task: {{ task }}"
504
504
  )
505
505
  rendered = render_template(
506
506
  prompt_template,
@@ -125,7 +125,7 @@ class HarmonyLLMStrategy(BaseLLMStrategy):
125
125
  def prepare_initial_history(self, context: "AgentContext") -> List["Message"]:
126
126
  """Creates the initial message history for the planning phase."""
127
127
  initial_plan_template = self.templates.get("planning", {}).get(
128
- "initial_plan", "Create a plan to accomplish this task: {task}"
128
+ "initial_plan", "Create a plan to accomplish this task: {{ task }}"
129
129
  )
130
130
 
131
131
  initial_plan = self._render_template(
@@ -234,7 +234,7 @@ class HarmonyLLMStrategy(BaseLLMStrategy):
234
234
  ) -> List["Message"]:
235
235
  """Build planning history with expert context from clarification."""
236
236
  initial_plan_template = self.templates.get("planning", {}).get(
237
- "initial_plan", "Create a plan to accomplish this task: {task}"
237
+ "initial_plan", "Create a plan to accomplish this task: {{ task }}"
238
238
  )
239
239
  initial_plan = self._render_template(
240
240
  initial_plan_template,
@@ -308,7 +308,7 @@ class HarmonyLLMStrategy(BaseLLMStrategy):
308
308
  """Task-decomposition input for harmony: task + plan → a checklist."""
309
309
  template = self.templates.get("task", {}).get(
310
310
  "decompose",
311
- "Break the plan into a concrete, checkable task list for the task: {task}",
311
+ "Break the plan into a concrete, checkable task list for the task: {{ task }}",
312
312
  )
313
313
  instructions = self._render_template(
314
314
  template, self._get_template_variables(context)
@@ -413,7 +413,7 @@ class HarmonyLLMStrategy(BaseLLMStrategy):
413
413
  ) -> List["Message"]:
414
414
  """Build planning history from an already-enriched task brief (Harmony)."""
415
415
  initial_plan_template = self.templates.get("planning", {}).get(
416
- "initial_plan", "Create a plan to accomplish this task: {task}"
416
+ "initial_plan", "Create a plan to accomplish this task: {{ task }}"
417
417
  )
418
418
  initial_plan = self._render_template(
419
419
  initial_plan_template,
@@ -334,7 +334,7 @@ class OpenAILLMStrategy(BaseLLMStrategy):
334
334
  def prepare_initial_history(self, context: "AgentContext") -> List[Message]:
335
335
  template = (
336
336
  self.templates.get("planning", {}).get("initial_plan")
337
- or "Create a plan to accomplish this task: {task}"
337
+ or "Create a plan to accomplish this task: {{ task }}"
338
338
  )
339
339
  initial_plan = self._render_template(
340
340
  template,
@@ -393,7 +393,7 @@ class OpenAILLMStrategy(BaseLLMStrategy):
393
393
  """
394
394
  template = (
395
395
  self.templates.get("planning", {}).get("initial_plan")
396
- or "Create a plan to accomplish this task: {task}"
396
+ or "Create a plan to accomplish this task: {{ task }}"
397
397
  )
398
398
  system_prompt = self._render_template(
399
399
  template,
@@ -468,7 +468,7 @@ class OpenAILLMStrategy(BaseLLMStrategy):
468
468
  """
469
469
  template = (
470
470
  self.templates.get("task", {}).get("decompose")
471
- or "Break the plan into a concrete, checkable task list for the task: {task}"
471
+ or "Break the plan into a concrete, checkable task list for the task: {{ task }}"
472
472
  )
473
473
  system_prompt = self._render_template(
474
474
  template,
@@ -569,7 +569,7 @@ class OpenAILLMStrategy(BaseLLMStrategy):
569
569
  """
570
570
  template = (
571
571
  self.templates.get("planning", {}).get("initial_plan")
572
- or "Create a plan to accomplish this task: {task}"
572
+ or "Create a plan to accomplish this task: {{ task }}"
573
573
  )
574
574
  system_prompt = self._render_template(
575
575
  template,
@@ -730,7 +730,7 @@ class QwenRawLLMStrategy(BaseLLMStrategy):
730
730
  def prepare_initial_history(self, context: "AgentContext") -> List[Message]:
731
731
  template = (
732
732
  self.templates.get("planning", {}).get("initial_plan")
733
- or "Create a plan to accomplish this task: {task}"
733
+ or "Create a plan to accomplish this task: {{ task }}"
734
734
  )
735
735
  initial_plan = self._render_template(
736
736
  template, self._get_template_variables(context)
@@ -784,7 +784,7 @@ class QwenRawLLMStrategy(BaseLLMStrategy):
784
784
  ) -> List[Message]:
785
785
  template = (
786
786
  self.templates.get("planning", {}).get("initial_plan")
787
- or "Create a plan to accomplish this task: {task}"
787
+ or "Create a plan to accomplish this task: {{ task }}"
788
788
  )
789
789
  system_prompt = self._render_template(
790
790
  template, self._get_template_variables(context)
@@ -831,7 +831,7 @@ class QwenRawLLMStrategy(BaseLLMStrategy):
831
831
  ) -> List[Message]:
832
832
  template = (
833
833
  self.templates.get("planning", {}).get("initial_plan")
834
- or "Create a plan to accomplish this task: {task}"
834
+ or "Create a plan to accomplish this task: {{ task }}"
835
835
  )
836
836
  system_prompt = self._render_template(
837
837
  template, self._get_template_variables(context)
@@ -858,7 +858,7 @@ class QwenRawLLMStrategy(BaseLLMStrategy):
858
858
  ) -> List[Message]:
859
859
  template = (
860
860
  self.templates.get("task", {}).get("decompose")
861
- or "Break the plan into a concrete, checkable task list for the task: {task}"
861
+ or "Break the plan into a concrete, checkable task list for the task: {{ task }}"
862
862
  )
863
863
  system_prompt = self._render_template(
864
864
  template, self._get_template_variables(context)
@@ -0,0 +1,120 @@
1
+ """The task node's prompt interpolates, whether the template is the consumer's
2
+ or the framework's fallback.
3
+
4
+ Driven through the real ``planning → task → executing`` graph with a real
5
+ ``OpenAILLMStrategy`` — only the provider call is scripted, so template
6
+ resolution, Jinja rendering and ``State.project`` are the production ones. No
7
+ other test renders a real template: ``ScriptedLLMStrategy`` hardcodes its
8
+ prompt strings, so this path was uncovered.
9
+
10
+ The fallbacks are the reason this file exists. They spelled their slot
11
+ ``{task}`` while the renderer is Jinja, so every consumer that did not declare
12
+ ``planning.initial_plan`` or ``task.decompose`` shipped the literal placeholder
13
+ to the model. ``StrictUndefined`` cannot catch that — single braces are text to
14
+ Jinja — and the run still worked, because ``prepare_task_history`` repeats the
15
+ task verbatim in the user message. Only a rendered prompt shows it.
16
+ """
17
+
18
+ import json
19
+ from typing import Any, Dict, List, Optional
20
+
21
+ import pytest
22
+ from openai_harmony import Message, Role
23
+
24
+ from aisolate.agent.core.llm_response import LLMResponse
25
+ from aisolate.agent.core.workspace import TASK_MD
26
+ from aisolate.agent.graphs import build_workflow
27
+ from aisolate.agent.strategies.llm.base import message_to_text
28
+ from aisolate.agent.strategies.llm.oai import OpenAILLMStrategy
29
+
30
+ from .helpers import make_agent_context
31
+ from ..conftest import FakeExecutor
32
+
33
+ CONVERSATION_ID = "prompt-template-contract"
34
+ TASK = "Total the 2025 consumption"
35
+
36
+ DECLARED: Dict[str, Any] = {
37
+ "planning": {"initial_plan": "Plan this: {{ task }}"},
38
+ "task": {"decompose": "Decompose the plan for: {{ task }}"},
39
+ }
40
+
41
+ PLAN = "1. Read the meter\n2. Report the total"
42
+ CHECKLIST = "- [ ] Read the meter\n Fetch the 2025 series.\n"
43
+
44
+
45
+ class _ScriptedOAIStrategy(OpenAILLMStrategy):
46
+ """Real strategy with the provider call replaced.
47
+
48
+ Everything the templates touch — ``prepare_*_history``, ``render_template``,
49
+ ``parse_assistant_response`` — stays production code; ``_generate`` records
50
+ the input each node rendered and returns the next scripted reply.
51
+ """
52
+
53
+ def __init__(self, script: List[str], templates: Optional[Dict[str, Any]]):
54
+ super().__init__(api_key="dummy-key", model="gpt-5.6-luna", templates=templates)
55
+ self._script = list(script)
56
+ self.rendered: List[List[Message]] = []
57
+
58
+ async def _generate(self, context) -> LLMResponse:
59
+ self.rendered.append(context.get_conversation_messages())
60
+ return LLMResponse(
61
+ messages=[
62
+ Message.from_role_and_content(Role.ASSISTANT, self._script.pop(0))
63
+ ]
64
+ )
65
+
66
+
67
+ def _run_to_task(templates: Optional[Dict[str, Any]]):
68
+ """Drive planning → task and return the strategy holding both prompts."""
69
+ strategy = _ScriptedOAIStrategy([PLAN, CHECKLIST], templates)
70
+ context = make_agent_context(
71
+ task=TASK,
72
+ llm=strategy,
73
+ executor=FakeExecutor([]),
74
+ conversation_id=CONVERSATION_ID,
75
+ graph=build_workflow(clarification=False, review=False, tasks=True),
76
+ )
77
+ context.seed_task(context.task)
78
+ context.enter_node(context.graph.entry)
79
+ return context, strategy
80
+
81
+
82
+ @pytest.mark.asyncio
83
+ async def test_declared_template_interpolates_the_task():
84
+ context, strategy = _run_to_task(DECLARED)
85
+
86
+ await context.execute_turn() # planning
87
+ await context.execute_turn() # task
88
+
89
+ assert message_to_text(strategy.rendered[0][0]) == f"Plan this: {TASK}"
90
+ assert message_to_text(strategy.rendered[1][0]) == f"Decompose the plan for: {TASK}"
91
+
92
+ artifact = context.artifacts.get(TASK_MD)
93
+ assert artifact is not None
94
+ assert "Read the meter" in artifact.inline_text
95
+
96
+
97
+ @pytest.mark.asyncio
98
+ async def test_fallback_template_interpolates_the_task():
99
+ """A consumer that declares nothing still gets the task in its prompts,
100
+ not a literal placeholder."""
101
+ context, strategy = _run_to_task(None)
102
+
103
+ await context.execute_turn() # planning
104
+ await context.execute_turn() # task
105
+
106
+ for prompt in (message_to_text(m[0]) for m in strategy.rendered):
107
+ assert TASK in prompt
108
+ assert "{task}" not in prompt
109
+
110
+
111
+ @pytest.mark.asyncio
112
+ async def test_unknown_variable_stops_the_run():
113
+ """``StrictUndefined``: a template naming a variable nobody supplies raises
114
+ rather than rendering it away to an empty string."""
115
+ context, _ = _run_to_task(
116
+ {"planning": {"initial_plan": "Plan this: {{ nonexistent_variable }}"}}
117
+ )
118
+
119
+ with pytest.raises(Exception, match="nonexistent_variable"):
120
+ await context.execute_turn() # planning
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aisolate-agent
3
- Version: 0.3.3
3
+ Version: 0.3.4
4
4
  Summary: AI Agent with intelligent planning and reasoning
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -30,7 +30,7 @@ AI Agent with intelligent planning and reasoning
30
30
  ## Local Installation
31
31
 
32
32
  ```bash
33
- pip install path/to/aisolate_agent-0.3.3-py3-none-any.whl
33
+ pip install path/to/aisolate_agent-0.3.4-py3-none-any.whl
34
34
  ```
35
35
 
36
36
  ## Usage
@@ -116,6 +116,7 @@ src/aisolate/agent/tests/test_integration/helpers.py
116
116
  src/aisolate/agent/tests/test_integration/test_flagship_loop.py
117
117
  src/aisolate/agent/tests/test_integration/test_followup_roundtrips.py
118
118
  src/aisolate/agent/tests/test_integration/test_full_workflow.py
119
+ src/aisolate/agent/tests/test_integration/test_prompt_template_contract.py
119
120
  src/aisolate/agent/tests/test_integration/test_restore_roundtrips.py
120
121
  src/aisolate/agent/tests/test_integration/test_stalled_and_acceptance.py
121
122
  src/aisolate/agent/tests/test_states/__init__.py
File without changes