deepstrike 0.2.42__tar.gz → 0.2.44__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 (190) hide show
  1. {deepstrike-0.2.42 → deepstrike-0.2.44}/Cargo.lock +6 -6
  2. {deepstrike-0.2.42 → deepstrike-0.2.44}/Cargo.toml +2 -2
  3. {deepstrike-0.2.42 → deepstrike-0.2.44}/PKG-INFO +1 -1
  4. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/kernel/protocol.rs +8 -1
  5. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-py/src/lib.rs +4 -1
  6. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/harness/harness.py +7 -0
  7. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/kernel_step.py +10 -6
  8. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/large_result_spool.py +12 -5
  9. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/runner.py +19 -2
  10. {deepstrike-0.2.42 → deepstrike-0.2.44}/pyproject.toml +1 -1
  11. {deepstrike-0.2.42 → deepstrike-0.2.44}/README.md +0 -0
  12. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/Cargo.toml +0 -0
  13. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/benches/kernel_baseline.rs +0 -0
  14. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/benchmark/mod.rs +0 -0
  15. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/compression.rs +0 -0
  16. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/config.rs +0 -0
  17. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/fault.rs +0 -0
  18. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/manager.rs +0 -0
  19. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/mod.rs +0 -0
  20. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/partitions.rs +0 -0
  21. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/policy.rs +0 -0
  22. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/pressure.rs +0 -0
  23. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/renderer.rs +0 -0
  24. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/renewal.rs +0 -0
  25. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/skill_catalog.rs +0 -0
  26. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/summarizer.rs +0 -0
  27. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/task_state.rs +0 -0
  28. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/text.rs +0 -0
  29. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/token_engine.rs +0 -0
  30. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/units.rs +0 -0
  31. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/context/utility.rs +0 -0
  32. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/governance/constraint.rs +0 -0
  33. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/governance/mod.rs +0 -0
  34. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/governance/permission.rs +0 -0
  35. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/governance/pipeline.rs +0 -0
  36. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/governance/quota.rs +0 -0
  37. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/governance/rate_limit.rs +0 -0
  38. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/governance/repeat_fuse.rs +0 -0
  39. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/governance/veto.rs +0 -0
  40. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/harness/eval.rs +0 -0
  41. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/harness/mod.rs +0 -0
  42. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/lexical.rs +0 -0
  43. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/lib.rs +0 -0
  44. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/memory/curator.rs +0 -0
  45. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/memory/durable.rs +0 -0
  46. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/memory/mod.rs +0 -0
  47. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/mm/handle.rs +0 -0
  48. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/mm/memory.rs +0 -0
  49. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/mm/mod.rs +0 -0
  50. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/mm/value.rs +0 -0
  51. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/orchestration/mod.rs +0 -0
  52. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/orchestration/task_graph.rs +0 -0
  53. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/orchestration/tournament.rs +0 -0
  54. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/orchestration/workflow/mod.rs +0 -0
  55. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/orchestration/workflow/run.rs +0 -0
  56. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/proc/mod.rs +0 -0
  57. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/event_log.rs +0 -0
  58. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/kernel/runtime.rs +0 -0
  59. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/kernel/tests.rs +0 -0
  60. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/kernel.rs +0 -0
  61. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/mod.rs +0 -0
  62. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/repair.rs +0 -0
  63. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/replay.rs +0 -0
  64. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/runtime/session.rs +0 -0
  65. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/entropy.rs +0 -0
  66. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/milestone.rs +0 -0
  67. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/mod.rs +0 -0
  68. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/policy.rs +0 -0
  69. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/rollback.rs +0 -0
  70. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/cancellation.rs +0 -0
  71. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/capability.rs +0 -0
  72. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/eviction.rs +0 -0
  73. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/gate.rs +0 -0
  74. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/milestone_exec.rs +0 -0
  75. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/mod.rs +0 -0
  76. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/process.rs +0 -0
  77. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/signal.rs +0 -0
  78. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/tests.rs +0 -0
  79. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/state_machine/workflow.rs +0 -0
  80. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/scheduler/tcb.rs +0 -0
  81. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/signals/attention.rs +0 -0
  82. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/signals/mod.rs +0 -0
  83. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/signals/queue.rs +0 -0
  84. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/signals/router.rs +0 -0
  85. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/syscall/mod.rs +0 -0
  86. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/agent.rs +0 -0
  87. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/capability.rs +0 -0
  88. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/contract.rs +0 -0
  89. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/error.rs +0 -0
  90. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/message.rs +0 -0
  91. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/milestone.rs +0 -0
  92. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/mod.rs +0 -0
  93. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/policy.rs +0 -0
  94. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/result.rs +0 -0
  95. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/signal.rs +0 -0
  96. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/skill.rs +0 -0
  97. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-core/src/types/task.rs +0 -0
  98. {deepstrike-0.2.42 → deepstrike-0.2.44}/crates/deepstrike-py/Cargo.toml +0 -0
  99. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/__init__.py +0 -0
  100. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/collaboration/__init__.py +0 -0
  101. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/collaboration/contract.py +0 -0
  102. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/collaboration/handoff.py +0 -0
  103. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/collaboration/harness.py +0 -0
  104. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/collaboration/modes.py +0 -0
  105. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/collaboration/pool.py +0 -0
  106. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/governance.py +0 -0
  107. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/harness/__init__.py +0 -0
  108. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/harness/judge.py +0 -0
  109. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/kernel/__init__.py +0 -0
  110. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/knowledge/__init__.py +0 -0
  111. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/knowledge/source.py +0 -0
  112. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/memory/__init__.py +0 -0
  113. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/memory/agent.py +0 -0
  114. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/memory/extraction.py +0 -0
  115. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/memory/in_memory_store.py +0 -0
  116. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/memory/protocols.py +0 -0
  117. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/memory/ranking.py +0 -0
  118. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/memory/retention.py +0 -0
  119. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/memory/working.py +0 -0
  120. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/__init__.py +0 -0
  121. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/anthropic.py +0 -0
  122. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/anthropic_compatible.py +0 -0
  123. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/base.py +0 -0
  124. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/deepseek.py +0 -0
  125. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/factories.py +0 -0
  126. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/gemini.py +0 -0
  127. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/glm.py +0 -0
  128. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/kimi.py +0 -0
  129. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/minimax.py +0 -0
  130. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/ollama.py +0 -0
  131. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/openai.py +0 -0
  132. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/openai_responses.py +0 -0
  133. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/qwen.py +0 -0
  134. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/replay.py +0 -0
  135. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/replay_validator.py +0 -0
  136. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/stream.py +0 -0
  137. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/providers/vendor_profiles.py +0 -0
  138. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/__init__.py +0 -0
  139. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/archive.py +0 -0
  140. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/context_policy.py +0 -0
  141. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/credential_vault.py +0 -0
  142. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/eval.py +0 -0
  143. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/event_stream.py +0 -0
  144. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/execution_plane.py +0 -0
  145. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/facade.py +0 -0
  146. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/filtered_plane.py +0 -0
  147. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/kernel_event_log.py +0 -0
  148. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/kernel_rebuild.py +0 -0
  149. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/kernel_transaction_log.py +0 -0
  150. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/loop_driver.py +0 -0
  151. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/mcp_proxy_plane.py +0 -0
  152. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/os_profile.py +0 -0
  153. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/os_snapshot.py +0 -0
  154. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/output_schema.py +0 -0
  155. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/process_sandbox_plane.py +0 -0
  156. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/provider_replay.py +0 -0
  157. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/reaction_checkpoint.py +0 -0
  158. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/reactive_session.py +0 -0
  159. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/reducers.py +0 -0
  160. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/reliability.py +0 -0
  161. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/remote_vpc_plane.py +0 -0
  162. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/replay_fixture.py +0 -0
  163. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/replay_provider.py +0 -0
  164. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/replay_sanitize.py +0 -0
  165. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/run_group.py +0 -0
  166. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/session_log.py +0 -0
  167. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/session_repair.py +0 -0
  168. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/sub_agent_orchestrator.py +0 -0
  169. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/turn_policy.py +0 -0
  170. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/workflow_control_flow.py +0 -0
  171. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/workflow_store.py +0 -0
  172. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/runtime/worktree_plane.py +0 -0
  173. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/safety/__init__.py +0 -0
  174. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/safety/permissions.py +0 -0
  175. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/signals/__init__.py +0 -0
  176. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/signals/gateway.py +0 -0
  177. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/signals/scheduled.py +0 -0
  178. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/signals/types.py +0 -0
  179. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/skills/__init__.py +0 -0
  180. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/skills/loader.py +0 -0
  181. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/skills/registry.py +0 -0
  182. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/skills/watcher.py +0 -0
  183. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/tools/__init__.py +0 -0
  184. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/tools/builtin/__init__.py +0 -0
  185. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/tools/builtin/read_file.py +0 -0
  186. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/tools/errors.py +0 -0
  187. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/tools/execution.py +0 -0
  188. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/tools/registry.py +0 -0
  189. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/types/__init__.py +0 -0
  190. {deepstrike-0.2.42 → deepstrike-0.2.44}/deepstrike/types/agent.py +0 -0
@@ -194,7 +194,7 @@ dependencies = [
194
194
 
195
195
  [[package]]
196
196
  name = "deepstrike-core"
197
- version = "0.2.42"
197
+ version = "0.2.44"
198
198
  dependencies = [
199
199
  "compact_str",
200
200
  "pretty_assertions",
@@ -206,7 +206,7 @@ dependencies = [
206
206
 
207
207
  [[package]]
208
208
  name = "deepstrike-lab"
209
- version = "0.2.42"
209
+ version = "0.2.44"
210
210
  dependencies = [
211
211
  "deepstrike-core",
212
212
  "serde",
@@ -216,7 +216,7 @@ dependencies = [
216
216
 
217
217
  [[package]]
218
218
  name = "deepstrike-node"
219
- version = "0.2.42"
219
+ version = "0.2.44"
220
220
  dependencies = [
221
221
  "compact_str",
222
222
  "deepstrike-core",
@@ -228,7 +228,7 @@ dependencies = [
228
228
 
229
229
  [[package]]
230
230
  name = "deepstrike-py"
231
- version = "0.2.42"
231
+ version = "0.2.44"
232
232
  dependencies = [
233
233
  "compact_str",
234
234
  "deepstrike-core",
@@ -239,7 +239,7 @@ dependencies = [
239
239
 
240
240
  [[package]]
241
241
  name = "deepstrike-sdk"
242
- version = "0.2.42"
242
+ version = "0.2.44"
243
243
  dependencies = [
244
244
  "async-stream",
245
245
  "async-trait",
@@ -273,7 +273,7 @@ dependencies = [
273
273
 
274
274
  [[package]]
275
275
  name = "deepstrike-wasm"
276
- version = "0.2.42"
276
+ version = "0.2.44"
277
277
  dependencies = [
278
278
  "compact_str",
279
279
  "deepstrike-core",
@@ -3,13 +3,13 @@ resolver = "2"
3
3
  members = ["crates/deepstrike-core", "crates/deepstrike-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.2.42"
6
+ version = "0.2.44"
7
7
  edition = "2024"
8
8
  license = "MIT"
9
9
  repository = "https://github.com/kongusen/deepstrike"
10
10
 
11
11
  [workspace.dependencies]
12
- deepstrike-core = { path = "crates/deepstrike-core", version = "0.2.42" }
12
+ deepstrike-core = { path = "crates/deepstrike-core", version = "0.2.44" }
13
13
  notify = "6"
14
14
  serde = { version = "1", features = ["derive"] }
15
15
  serde_json = "1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepstrike
3
- Version: 0.2.42
3
+ Version: 0.2.44
4
4
  Requires-Dist: httpx>=0.27
5
5
  Requires-Dist: pyyaml>=6.0
6
6
  Requires-Dist: anyio>=4.0
@@ -92,6 +92,13 @@ pub struct KernelInput {
92
92
  }
93
93
 
94
94
  impl KernelInput {
95
+ /// Operation identity used by [`Self::new`] for in-process callers. Hosts that correlate
96
+ /// against it (e.g. a `cancel_operation` for an operation started via `new`) must use this
97
+ /// constant, never a re-typed literal. NOT for durable wire hosts: anything keyed by
98
+ /// `(session, operation)` in storage that outlives the process needs a unique identity via
99
+ /// [`Self::correlated`].
100
+ pub const LOCAL_OPERATION_ID: &'static str = "local-operation";
101
+
95
102
  /// Build an in-process input for callers that do not cross a durable wire boundary.
96
103
  /// Wire hosts should use [`Self::correlated`] with their durable identities.
97
104
  pub fn new(event: KernelInputEvent) -> Self {
@@ -99,7 +106,7 @@ impl KernelInput {
99
106
  static LOCAL_EVENT_SEQUENCE: AtomicU64 = AtomicU64::new(1);
100
107
  let event_seq = LOCAL_EVENT_SEQUENCE.fetch_add(1, Ordering::Relaxed);
101
108
  Self::correlated(
102
- "local-operation",
109
+ Self::LOCAL_OPERATION_ID,
103
110
  format!("local-event-{event_seq}"),
104
111
  0,
105
112
  event,
@@ -860,7 +860,10 @@ impl RenderedContext {
860
860
 
861
861
  // ──────────────────────────────────────── KernelRuntime ────────────────────────────────────
862
862
 
863
- #[pyclass]
863
+ // `weakref` so the SDK can key per-runtime wire state in a WeakKeyDictionary — a module dict
864
+ // keyed by id() aliases recycled addresses (a new runtime inherits a dead one's operation
865
+ // identity) and leaks an entry per runtime.
866
+ #[pyclass(weakref)]
864
867
  struct KernelRuntime {
865
868
  inner: RustKernelRuntime,
866
869
  }
@@ -45,6 +45,10 @@ class AttemptRequest:
45
45
  goal: str
46
46
  session_id: str | None = None
47
47
  criteria: list[Criterion] = field(default_factory=list)
48
+ # Multimodal inputs (images / audio) attached to the task. Forwarded to every attempt
49
+ # unconditionally; the runner seeds them per session idempotently, so fresh-session
50
+ # carries re-seed while same-session carries do not double.
51
+ attachments: list[dict] | None = None
48
52
  extensions: dict[str, Any] | None = None
49
53
  inherit_events: list[Any] | None = None
50
54
 
@@ -57,6 +61,7 @@ class AttemptBodyContext:
57
61
  extensions: dict[str, Any] | None
58
62
  inherit_events: list[Any] | None
59
63
  attempt: int
64
+ attachments: list[dict] | None = None
60
65
  context_input: str | None = None
61
66
 
62
67
 
@@ -102,6 +107,7 @@ class RuntimeAttemptBody:
102
107
  session_id=context.session_id,
103
108
  goal=context.goal,
104
109
  criteria=[criterion.text for criterion in context.criteria],
110
+ **({"attachments": context.attachments} if context.attachments else {}),
105
111
  extensions=context.extensions,
106
112
  inherit_events=context.inherit_events if context.attempt == 1 else None,
107
113
  )
@@ -294,6 +300,7 @@ class AttemptLoop:
294
300
  extensions=request.extensions,
295
301
  inherit_events=request.inherit_events,
296
302
  attempt=attempt,
303
+ attachments=request.attachments,
297
304
  context_input=prepared.context_input,
298
305
  )
299
306
  ):
@@ -4,6 +4,7 @@ import json
4
4
  import re
5
5
  import time
6
6
  import uuid
7
+ import weakref
7
8
  from dataclasses import dataclass
8
9
  from types import SimpleNamespace
9
10
  from typing import Any
@@ -13,7 +14,11 @@ from deepstrike.providers.base import ContextBudgetOverflow, RenderedContext
13
14
 
14
15
 
15
16
  KERNEL_ABI_VERSION = 2
16
- _wire_states: dict[int, tuple[str, int]] = {}
17
+ # Keyed by the runtime OBJECT, not id(runtime): a plain dict keyed by id() aliases recycled
18
+ # addresses (a new runtime inherits a dead one's operation identity — fatal once a durable log
19
+ # keys chains by that identity) and leaks an entry per runtime. WeakKeyDictionary mirrors the
20
+ # Node/WASM WeakMap; the pyo3 KernelRuntime declares `weakref` support for exactly this.
21
+ _wire_states: "weakref.WeakKeyDictionary[Any, tuple[str, int]]" = weakref.WeakKeyDictionary()
17
22
 
18
23
 
19
24
  def snapshot_kernel_runtime(runtime: Any) -> dict[str, Any]:
@@ -24,14 +29,14 @@ def restore_kernel_runtime(runtime: Any, snapshot: dict[str, Any]) -> None:
24
29
  runtime.restore(json.dumps(snapshot))
25
30
  operation_id = snapshot.get("operation_id")
26
31
  if not operation_id:
27
- _wire_states.pop(id(runtime), None)
32
+ _wire_states.pop(runtime, None)
28
33
  return
29
34
  next_sequence = 1
30
35
  for accepted in snapshot.get("accepted_inputs") or []:
31
36
  match = re.search(r"-event-(\d+)$", str(accepted.get("event_id") or ""))
32
37
  if match:
33
38
  next_sequence = max(next_sequence, int(match.group(1)) + 1)
34
- _wire_states[id(runtime)] = (str(operation_id), next_sequence)
39
+ _wire_states[runtime] = (str(operation_id), next_sequence)
35
40
 
36
41
 
37
42
  @dataclass
@@ -373,12 +378,11 @@ def _action_from_kernel(raw: dict[str, Any]) -> KernelRunnerAction:
373
378
 
374
379
 
375
380
  def _step_input(runtime: Any, event: dict[str, Any]) -> str:
376
- key = id(runtime)
377
- state = _wire_states.get(key)
381
+ state = _wire_states.get(runtime)
378
382
  if state is None:
379
383
  state = (f"python-operation-{uuid.uuid4()}", 1)
380
384
  operation_id, sequence = state
381
- _wire_states[key] = (operation_id, sequence + 1)
385
+ _wire_states[runtime] = (operation_id, sequence + 1)
382
386
  correlated_event = (
383
387
  {**event, "operation_id": operation_id}
384
388
  if event.get("kind") == "cancel_operation"
@@ -16,9 +16,16 @@ class LargeResultSpool:
16
16
  self._max_age_seconds = max_age_seconds
17
17
  self._active_writes: dict[str, asyncio.Lock] = {}
18
18
 
19
- async def persist_output(self, call_id: str, content: str) -> str:
19
+ @staticmethod
20
+ def _call_key(session_id: str, call_id: str) -> str:
21
+ # Session-scoped: the spool dir is shared across sessions and outlives runs, while vendor
22
+ # call ids can be index-style ("call_0") and repeat — an unscoped key lets read_result in
23
+ # one session fetch another session's spooled output.
24
+ return hashlib.sha256(f"{session_id}\x00{call_id}".encode("utf-8")).hexdigest()[:32]
25
+
26
+ async def persist_output(self, session_id: str, call_id: str, content: str) -> str:
20
27
  digest = hashlib.sha256(content.encode("utf-8")).hexdigest()[:16]
21
- call_key = hashlib.sha256(call_id.encode("utf-8")).hexdigest()[:32]
28
+ call_key = self._call_key(session_id, call_id)
22
29
  self._spool_dir.mkdir(parents=True, exist_ok=True)
23
30
  path = self._spool_dir / f"{call_key}-{digest}.txt"
24
31
  path_str = str(path)
@@ -50,16 +57,16 @@ class LargeResultSpool:
50
57
  return path.read_text(encoding="utf-8")
51
58
  return await asyncio.get_running_loop().run_in_executor(None, _read)
52
59
 
53
- async def find_by_call_id(self, call_id: str) -> str | None:
60
+ async def find_by_call_id(self, session_id: str, call_id: str) -> str | None:
54
61
  """O7: locate a spooled output by the tool call's id (the ``read_result`` meta-tool only
55
62
  knows ``call_id``, not the content-hashed file name ``persist_output`` chose). Scans the
56
- spool directory for the hashed call-key prefix; returns ``None`` if nothing
63
+ spool directory for the hashed session-scoped call-key prefix; returns ``None`` if nothing
57
64
  was ever spooled for that call."""
58
65
  if not self._spool_dir.is_dir():
59
66
  return None
60
67
 
61
68
  def _find() -> Path | None:
62
- call_key = hashlib.sha256(call_id.encode("utf-8")).hexdigest()[:32]
69
+ call_key = self._call_key(session_id, call_id)
63
70
  matches = sorted(self._spool_dir.glob(f"{call_key}-*.txt"))
64
71
  return matches[0] if matches else None
65
72
 
@@ -1706,6 +1706,11 @@ class RuntimeRunner:
1706
1706
  mid_run = _is_mid_run(prior)
1707
1707
  resumed_start = next((entry for entry in reversed(prior) if entry.event.get("kind") == "run_started"), None)
1708
1708
  run_id = resumed_start.event["run_id"] if mid_run and resumed_start is not None else str(uuid.uuid4())
1709
+ # Idempotent per session: an earlier run's `run_started` already carries these attachments
1710
+ # (same-session retry attempt), so replay reconstructs them — recording and seeding again
1711
+ # would double them in history. Deduping at the append keeps live and replay in agreement.
1712
+ if attachments and _attachments_already_seeded(prior, attachments):
1713
+ attachments = None
1709
1714
  if not mid_run:
1710
1715
  await self._opts.session_log.append(sid, {
1711
1716
  "kind": "run_started",
@@ -1859,7 +1864,7 @@ class RuntimeRunner:
1859
1864
  from deepstrike.runtime.large_result_spool import LargeResultSpool
1860
1865
  spool = self._opts.result_spool or LargeResultSpool()
1861
1866
  try:
1862
- full = await spool.find_by_call_id(call_id)
1867
+ full = await spool.find_by_call_id(session_id, call_id)
1863
1868
  except Exception:
1864
1869
  full = None
1865
1870
 
@@ -2435,7 +2440,7 @@ class RuntimeRunner:
2435
2440
  spool_ref = None
2436
2441
  error = None
2437
2442
  try:
2438
- spool_ref = await spool.persist_output(action.call_id or "", action.output or "")
2443
+ spool_ref = await spool.persist_output(session_id, action.call_id or "", action.output or "")
2439
2444
  except Exception as exc:
2440
2445
  error = format_tool_error(exc)
2441
2446
  action = kernel_action(runtime, self._pending_observations, {
@@ -3060,6 +3065,18 @@ def _is_mid_run(events: list[SessionEntry]) -> bool:
3060
3065
  return last_started >= 0 and last_started > last_terminal
3061
3066
 
3062
3067
 
3068
+ def _attachments_already_seeded(prior: list[SessionEntry], attachments: list[dict]) -> bool:
3069
+ """True when an earlier run in this session already seeded the same attachments. Replay
3070
+ reconstructs the attachment message from that run's ``run_started``, so recording and
3071
+ live-seeding them again (a same-session retry attempt) would double them in history."""
3072
+ wanted = json.dumps(attachments, sort_keys=True)
3073
+ return any(
3074
+ entry.event.get("kind") == "run_started"
3075
+ and json.dumps(entry.event.get("attachments") or [], sort_keys=True) == wanted
3076
+ for entry in prior
3077
+ )
3078
+
3079
+
3063
3080
  def _normalize_attachment_parts(parts: list[dict]) -> list[dict]:
3064
3081
  """Normalize SDK attachment dicts to kernel serde shape (`media_type`, not `mediaType`)."""
3065
3082
  normalized: list[dict] = []
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "deepstrike"
7
- version = "0.2.42"
7
+ version = "0.2.44"
8
8
  requires-python = ">=3.10"
9
9
  readme = "README.md"
10
10
  dependencies = [
File without changes