deepstrike 0.2.43__tar.gz → 0.2.45__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.43 → deepstrike-0.2.45}/Cargo.lock +6 -6
  2. {deepstrike-0.2.43 → deepstrike-0.2.45}/Cargo.toml +2 -2
  3. {deepstrike-0.2.43 → deepstrike-0.2.45}/PKG-INFO +1 -1
  4. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/kernel/protocol.rs +8 -1
  5. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-py/src/lib.rs +4 -1
  6. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/execution_plane.py +6 -3
  7. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/kernel_step.py +10 -6
  8. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/large_result_spool.py +12 -5
  9. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/runner.py +2 -2
  10. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/tools/execution.py +3 -1
  11. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/tools/registry.py +60 -2
  12. {deepstrike-0.2.43 → deepstrike-0.2.45}/pyproject.toml +1 -1
  13. {deepstrike-0.2.43 → deepstrike-0.2.45}/README.md +0 -0
  14. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/Cargo.toml +0 -0
  15. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/benches/kernel_baseline.rs +0 -0
  16. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/benchmark/mod.rs +0 -0
  17. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/compression.rs +0 -0
  18. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/config.rs +0 -0
  19. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/fault.rs +0 -0
  20. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/manager.rs +0 -0
  21. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/mod.rs +0 -0
  22. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/partitions.rs +0 -0
  23. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/policy.rs +0 -0
  24. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/pressure.rs +0 -0
  25. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/renderer.rs +0 -0
  26. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/renewal.rs +0 -0
  27. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/skill_catalog.rs +0 -0
  28. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/summarizer.rs +0 -0
  29. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/task_state.rs +0 -0
  30. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/text.rs +0 -0
  31. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/token_engine.rs +0 -0
  32. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/units.rs +0 -0
  33. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/context/utility.rs +0 -0
  34. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/governance/constraint.rs +0 -0
  35. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/governance/mod.rs +0 -0
  36. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/governance/permission.rs +0 -0
  37. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/governance/pipeline.rs +0 -0
  38. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/governance/quota.rs +0 -0
  39. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/governance/rate_limit.rs +0 -0
  40. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/governance/repeat_fuse.rs +0 -0
  41. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/governance/veto.rs +0 -0
  42. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/harness/eval.rs +0 -0
  43. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/harness/mod.rs +0 -0
  44. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/lexical.rs +0 -0
  45. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/lib.rs +0 -0
  46. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/memory/curator.rs +0 -0
  47. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/memory/durable.rs +0 -0
  48. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/memory/mod.rs +0 -0
  49. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/mm/handle.rs +0 -0
  50. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/mm/memory.rs +0 -0
  51. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/mm/mod.rs +0 -0
  52. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/mm/value.rs +0 -0
  53. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/orchestration/mod.rs +0 -0
  54. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/orchestration/task_graph.rs +0 -0
  55. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/orchestration/tournament.rs +0 -0
  56. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/orchestration/workflow/mod.rs +0 -0
  57. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/orchestration/workflow/run.rs +0 -0
  58. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/proc/mod.rs +0 -0
  59. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/event_log.rs +0 -0
  60. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/kernel/runtime.rs +0 -0
  61. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/kernel/tests.rs +0 -0
  62. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/kernel.rs +0 -0
  63. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/mod.rs +0 -0
  64. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/repair.rs +0 -0
  65. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/replay.rs +0 -0
  66. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/runtime/session.rs +0 -0
  67. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/entropy.rs +0 -0
  68. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/milestone.rs +0 -0
  69. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/mod.rs +0 -0
  70. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/policy.rs +0 -0
  71. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/rollback.rs +0 -0
  72. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/cancellation.rs +0 -0
  73. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/capability.rs +0 -0
  74. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/eviction.rs +0 -0
  75. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/gate.rs +0 -0
  76. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/milestone_exec.rs +0 -0
  77. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/mod.rs +0 -0
  78. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/process.rs +0 -0
  79. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/signal.rs +0 -0
  80. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/tests.rs +0 -0
  81. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/state_machine/workflow.rs +0 -0
  82. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/scheduler/tcb.rs +0 -0
  83. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/signals/attention.rs +0 -0
  84. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/signals/mod.rs +0 -0
  85. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/signals/queue.rs +0 -0
  86. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/signals/router.rs +0 -0
  87. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/syscall/mod.rs +0 -0
  88. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/agent.rs +0 -0
  89. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/capability.rs +0 -0
  90. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/contract.rs +0 -0
  91. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/error.rs +0 -0
  92. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/message.rs +0 -0
  93. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/milestone.rs +0 -0
  94. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/mod.rs +0 -0
  95. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/policy.rs +0 -0
  96. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/result.rs +0 -0
  97. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/signal.rs +0 -0
  98. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/skill.rs +0 -0
  99. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-core/src/types/task.rs +0 -0
  100. {deepstrike-0.2.43 → deepstrike-0.2.45}/crates/deepstrike-py/Cargo.toml +0 -0
  101. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/__init__.py +0 -0
  102. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/collaboration/__init__.py +0 -0
  103. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/collaboration/contract.py +0 -0
  104. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/collaboration/handoff.py +0 -0
  105. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/collaboration/harness.py +0 -0
  106. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/collaboration/modes.py +0 -0
  107. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/collaboration/pool.py +0 -0
  108. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/governance.py +0 -0
  109. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/harness/__init__.py +0 -0
  110. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/harness/harness.py +0 -0
  111. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/harness/judge.py +0 -0
  112. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/kernel/__init__.py +0 -0
  113. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/knowledge/__init__.py +0 -0
  114. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/knowledge/source.py +0 -0
  115. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/memory/__init__.py +0 -0
  116. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/memory/agent.py +0 -0
  117. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/memory/extraction.py +0 -0
  118. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/memory/in_memory_store.py +0 -0
  119. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/memory/protocols.py +0 -0
  120. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/memory/ranking.py +0 -0
  121. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/memory/retention.py +0 -0
  122. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/memory/working.py +0 -0
  123. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/__init__.py +0 -0
  124. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/anthropic.py +0 -0
  125. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/anthropic_compatible.py +0 -0
  126. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/base.py +0 -0
  127. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/deepseek.py +0 -0
  128. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/factories.py +0 -0
  129. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/gemini.py +0 -0
  130. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/glm.py +0 -0
  131. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/kimi.py +0 -0
  132. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/minimax.py +0 -0
  133. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/ollama.py +0 -0
  134. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/openai.py +0 -0
  135. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/openai_responses.py +0 -0
  136. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/qwen.py +0 -0
  137. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/replay.py +0 -0
  138. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/replay_validator.py +0 -0
  139. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/stream.py +0 -0
  140. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/providers/vendor_profiles.py +0 -0
  141. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/__init__.py +0 -0
  142. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/archive.py +0 -0
  143. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/context_policy.py +0 -0
  144. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/credential_vault.py +0 -0
  145. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/eval.py +0 -0
  146. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/event_stream.py +0 -0
  147. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/facade.py +0 -0
  148. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/filtered_plane.py +0 -0
  149. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/kernel_event_log.py +0 -0
  150. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/kernel_rebuild.py +0 -0
  151. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/kernel_transaction_log.py +0 -0
  152. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/loop_driver.py +0 -0
  153. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/mcp_proxy_plane.py +0 -0
  154. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/os_profile.py +0 -0
  155. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/os_snapshot.py +0 -0
  156. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/output_schema.py +0 -0
  157. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/process_sandbox_plane.py +0 -0
  158. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/provider_replay.py +0 -0
  159. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/reaction_checkpoint.py +0 -0
  160. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/reactive_session.py +0 -0
  161. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/reducers.py +0 -0
  162. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/reliability.py +0 -0
  163. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/remote_vpc_plane.py +0 -0
  164. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/replay_fixture.py +0 -0
  165. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/replay_provider.py +0 -0
  166. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/replay_sanitize.py +0 -0
  167. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/run_group.py +0 -0
  168. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/session_log.py +0 -0
  169. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/session_repair.py +0 -0
  170. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/sub_agent_orchestrator.py +0 -0
  171. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/turn_policy.py +0 -0
  172. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/workflow_control_flow.py +0 -0
  173. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/workflow_store.py +0 -0
  174. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/runtime/worktree_plane.py +0 -0
  175. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/safety/__init__.py +0 -0
  176. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/safety/permissions.py +0 -0
  177. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/signals/__init__.py +0 -0
  178. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/signals/gateway.py +0 -0
  179. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/signals/scheduled.py +0 -0
  180. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/signals/types.py +0 -0
  181. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/skills/__init__.py +0 -0
  182. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/skills/loader.py +0 -0
  183. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/skills/registry.py +0 -0
  184. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/skills/watcher.py +0 -0
  185. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/tools/__init__.py +0 -0
  186. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/tools/builtin/__init__.py +0 -0
  187. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/tools/builtin/read_file.py +0 -0
  188. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/tools/errors.py +0 -0
  189. {deepstrike-0.2.43 → deepstrike-0.2.45}/deepstrike/types/__init__.py +0 -0
  190. {deepstrike-0.2.43 → deepstrike-0.2.45}/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.43"
197
+ version = "0.2.45"
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.43"
209
+ version = "0.2.45"
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.43"
219
+ version = "0.2.45"
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.43"
231
+ version = "0.2.45"
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.43"
242
+ version = "0.2.45"
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.43"
276
+ version = "0.2.45"
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.43"
6
+ version = "0.2.45"
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.43" }
12
+ deepstrike-core = { path = "crates/deepstrike-core", version = "0.2.45" }
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.43
3
+ Version: 0.2.45
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
  }
@@ -248,9 +248,11 @@ class LocalExecutionPlane:
248
248
  audit=_audit,
249
249
  )
250
250
  try:
251
- kwargs = json.loads(call.arguments or "{}")
252
- original_args_str = json.dumps(kwargs)
253
- validation = validate_tool_arguments(registered.schema.parameters, kwargs)
251
+ raw_kwargs = json.loads(call.arguments or "{}")
252
+ original_args_str = json.dumps(raw_kwargs)
253
+ # validation["args"], not raw_kwargs, from here on: a oneOf/anyOf ROOT accepts a repaired
254
+ # probe deep-copy — the original dict never sees those repairs (auto-casts, strips, defaults).
255
+ validation = validate_tool_arguments(registered.schema.parameters, raw_kwargs)
254
256
  if validation.get("error"):
255
257
  yield ToolResultEvent(
256
258
  call_id=call.id,
@@ -261,6 +263,7 @@ class LocalExecutionPlane:
261
263
  error_kind="recoverable",
262
264
  )
263
265
  return
266
+ kwargs = validation["args"]
264
267
  if validation.get("repaired"):
265
268
  yield ToolArgumentRepairedEvent(
266
269
  call_id=call.id,
@@ -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
 
@@ -1864,7 +1864,7 @@ class RuntimeRunner:
1864
1864
  from deepstrike.runtime.large_result_spool import LargeResultSpool
1865
1865
  spool = self._opts.result_spool or LargeResultSpool()
1866
1866
  try:
1867
- full = await spool.find_by_call_id(call_id)
1867
+ full = await spool.find_by_call_id(session_id, call_id)
1868
1868
  except Exception:
1869
1869
  full = None
1870
1870
 
@@ -2440,7 +2440,7 @@ class RuntimeRunner:
2440
2440
  spool_ref = None
2441
2441
  error = None
2442
2442
  try:
2443
- 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 "")
2444
2444
  except Exception as exc:
2445
2445
  error = format_tool_error(exc)
2446
2446
  action = kernel_action(runtime, self._pending_observations, {
@@ -22,7 +22,9 @@ async def execute_tools(
22
22
  if validation.get("error"):
23
23
  results.append(ToolResult(call_id=call.id, output=f"invalid arguments: {validation['error']}", is_error=True))
24
24
  continue
25
- output = await tool(**kwargs)
25
+ # validation["args"], not kwargs: a oneOf/anyOf ROOT accepts a repaired probe
26
+ # deep-copy — the original dict never sees those repairs (auto-casts, strips, defaults).
27
+ output = await tool(**validation["args"])
26
28
  if isinstance(output, AsyncIterable):
27
29
  chunks = []
28
30
  async for chunk in output:
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
  import copy
3
3
  import inspect
4
4
  import json
5
+ import re
5
6
  from collections.abc import AsyncIterable
6
7
  from typing import Any, Callable
7
8
  from deepstrike._kernel import ToolSchema
@@ -73,11 +74,13 @@ def validate_tool_arguments(schema_json: str, args: dict[str, Any]) -> dict[str,
73
74
  try:
74
75
  schema = json.loads(schema_json)
75
76
  except Exception:
76
- return {"error": "invalid tool schema", "repaired": False}
77
+ return {"error": "invalid tool schema", "repaired": False, "args": args}
77
78
  state = {"repaired": False}
78
79
  wrapper = {"root": args}
79
80
  error = _validate_value(schema, wrapper, "root", "$", state)
80
- return {"error": error, "repaired": state["repaired"]}
81
+ # A oneOf/anyOf ROOT replaces the value with its accepted probe deep-copy — in-place mutation
82
+ # of the caller's dict only covers non-union roots. Callers must use the returned "args".
83
+ return {"error": error, "repaired": state["repaired"], "args": wrapper["root"]}
81
84
 
82
85
 
83
86
  def _validate_value(schema: dict[str, Any], parent: Any, key: Any, path: str, state: dict[str, bool]) -> str | None:
@@ -200,10 +203,65 @@ def _validate_value(schema: dict[str, Any], parent: Any, key: Any, path: str, st
200
203
  return f"{path} must be integer"
201
204
  elif expected == "boolean" and not isinstance(value, bool):
202
205
  return f"{path} must be boolean"
206
+ elif expected == "null" and value is not None:
207
+ return f"{path} must be null"
203
208
  elif path == "$" and not isinstance(value, dict):
204
209
  return f"{path} must be object"
205
210
 
206
211
  enum_values = schema.get("enum")
207
212
  if enum_values is not None and value not in enum_values:
208
213
  return f"{path} must be one of enum values"
214
+ # `const` is THE discriminator convention for oneOf variants (kind: {const: "edit"}). Without
215
+ # it, union branches match on required+type alone and the WRONG branch can win — then its
216
+ # allow-list strips keys the right branch declared.
217
+ if "const" in schema:
218
+ want = schema["const"]
219
+ if isinstance(want, bool) or isinstance(value, bool):
220
+ matches = value is want
221
+ else:
222
+ matches = value == want
223
+ if not matches:
224
+ return f"{path} must equal the const value {json.dumps(want)}"
225
+ # Constraint keywords, checked per the value's actual type (JSON Schema semantics: string
226
+ # constraints ignore non-strings, etc.). Keywords outside this set (allOf, multipleOf,
227
+ # uniqueItems, format, if/then/else, …) are ignored, not rejected.
228
+ if isinstance(value, str):
229
+ min_length = schema.get("minLength")
230
+ if isinstance(min_length, int) and len(value) < min_length:
231
+ return f"{path} must be at least {min_length} characters"
232
+ max_length = schema.get("maxLength")
233
+ if isinstance(max_length, int) and len(value) > max_length:
234
+ return f"{path} must be at most {max_length} characters"
235
+ pattern = schema.get("pattern")
236
+ if isinstance(pattern, str):
237
+ try:
238
+ compiled = re.compile(pattern)
239
+ except re.error:
240
+ compiled = None # author-side bad regex: skip, never fail the call
241
+ if compiled is not None and compiled.search(value) is None:
242
+ return f"{path} must match pattern {pattern}"
243
+ elif isinstance(value, (int, float)) and not isinstance(value, bool):
244
+ for keyword, ok in (
245
+ ("minimum", lambda bound: value >= bound),
246
+ ("maximum", lambda bound: value <= bound),
247
+ ("exclusiveMinimum", lambda bound: value > bound),
248
+ ("exclusiveMaximum", lambda bound: value < bound),
249
+ ):
250
+ bound = schema.get(keyword)
251
+ if isinstance(bound, (int, float)) and not isinstance(bound, bool) and not ok(bound):
252
+ op = {"minimum": ">=", "maximum": "<=", "exclusiveMinimum": ">", "exclusiveMaximum": "<"}[keyword]
253
+ return f"{path} must be {op} {bound}"
254
+ elif isinstance(value, list):
255
+ min_items = schema.get("minItems")
256
+ if isinstance(min_items, int) and len(value) < min_items:
257
+ return f"{path} must have at least {min_items} items"
258
+ max_items = schema.get("maxItems")
259
+ if isinstance(max_items, int) and len(value) > max_items:
260
+ return f"{path} must have at most {max_items} items"
261
+ # `not`: probe on a deep copy so a matching (= rejected) subschema's repairs never leak out.
262
+ not_schema = schema.get("not")
263
+ if isinstance(not_schema, dict):
264
+ probe = {"v": copy.deepcopy(value)}
265
+ if _validate_value(not_schema, probe, "v", path, {"repaired": False}) is None:
266
+ return f"{path} must not match the disallowed shape"
209
267
  return None
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "deepstrike"
7
- version = "0.2.43"
7
+ version = "0.2.45"
8
8
  requires-python = ">=3.10"
9
9
  readme = "README.md"
10
10
  dependencies = [
File without changes