deepstrike 0.2.20__tar.gz → 0.2.22__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 (172) hide show
  1. {deepstrike-0.2.20 → deepstrike-0.2.22}/Cargo.lock +5 -5
  2. {deepstrike-0.2.20 → deepstrike-0.2.22}/Cargo.toml +2 -2
  3. {deepstrike-0.2.20 → deepstrike-0.2.22}/PKG-INFO +1 -1
  4. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/__init__.py +1 -0
  5. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/memory/__init__.py +2 -0
  6. deepstrike-0.2.22/deepstrike/memory/in_memory_store.py +53 -0
  7. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/anthropic.py +39 -17
  8. {deepstrike-0.2.20 → deepstrike-0.2.22}/pyproject.toml +1 -1
  9. {deepstrike-0.2.20 → deepstrike-0.2.22}/README.md +0 -0
  10. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/Cargo.toml +0 -0
  11. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/compression.rs +0 -0
  12. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/config.rs +0 -0
  13. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/dashboard.rs +0 -0
  14. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/manager.rs +0 -0
  15. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/mod.rs +0 -0
  16. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/partitions.rs +0 -0
  17. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/pressure.rs +0 -0
  18. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/renderer.rs +0 -0
  19. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/renewal.rs +0 -0
  20. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/sections.rs +0 -0
  21. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/skill_catalog.rs +0 -0
  22. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/snapshot.rs +0 -0
  23. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/summarizer.rs +0 -0
  24. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/task_state.rs +0 -0
  25. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/text.rs +0 -0
  26. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/context/token_engine.rs +0 -0
  27. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/audit.rs +0 -0
  28. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/constraint.rs +0 -0
  29. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/mod.rs +0 -0
  30. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/permission.rs +0 -0
  31. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/pipeline.rs +0 -0
  32. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/quota.rs +0 -0
  33. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/rate_limit.rs +0 -0
  34. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/sandbox.rs +0 -0
  35. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/tool_decision.rs +0 -0
  36. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/governance/veto.rs +0 -0
  37. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/harness/eval.rs +0 -0
  38. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/harness/mod.rs +0 -0
  39. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/lib.rs +0 -0
  40. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/curator.rs +0 -0
  41. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/durable.rs +0 -0
  42. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/extractor.rs +0 -0
  43. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/idle_pipeline.rs +0 -0
  44. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/mod.rs +0 -0
  45. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/runtime.rs +0 -0
  46. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/semantic.rs +0 -0
  47. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/session.rs +0 -0
  48. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/synthesis.rs +0 -0
  49. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/trace_analyzer.rs +0 -0
  50. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/memory/working.rs +0 -0
  51. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/mm/handle.rs +0 -0
  52. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/mm/memory.rs +0 -0
  53. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/mm/mod.rs +0 -0
  54. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/orchestration/mod.rs +0 -0
  55. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/orchestration/task_graph.rs +0 -0
  56. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/orchestration/tournament.rs +0 -0
  57. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/orchestration/workflow/mod.rs +0 -0
  58. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/orchestration/workflow/run.rs +0 -0
  59. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/proc/mod.rs +0 -0
  60. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/runtime/event_log.rs +0 -0
  61. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/runtime/kernel.rs +0 -0
  62. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/runtime/mod.rs +0 -0
  63. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/runtime/repair.rs +0 -0
  64. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/runtime/replay.rs +0 -0
  65. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/runtime/session.rs +0 -0
  66. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/runtime/snapshot.rs +0 -0
  67. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/milestone.rs +0 -0
  68. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/mod.rs +0 -0
  69. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/policy.rs +0 -0
  70. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/rollback.rs +0 -0
  71. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/capability.rs +0 -0
  72. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/eviction.rs +0 -0
  73. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/gate.rs +0 -0
  74. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/milestone_exec.rs +0 -0
  75. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/mod.rs +0 -0
  76. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/process.rs +0 -0
  77. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/signal.rs +0 -0
  78. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/tests.rs +0 -0
  79. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/state_machine/workflow.rs +0 -0
  80. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/scheduler/tcb.rs +0 -0
  81. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/signals/attention.rs +0 -0
  82. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/signals/mod.rs +0 -0
  83. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/signals/queue.rs +0 -0
  84. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/signals/router.rs +0 -0
  85. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/syscall/mod.rs +0 -0
  86. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/agent.rs +0 -0
  87. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/capability.rs +0 -0
  88. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/contract.rs +0 -0
  89. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/error.rs +0 -0
  90. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/message.rs +0 -0
  91. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/milestone.rs +0 -0
  92. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/mod.rs +0 -0
  93. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/model.rs +0 -0
  94. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/policy.rs +0 -0
  95. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/result.rs +0 -0
  96. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/signal.rs +0 -0
  97. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/skill.rs +0 -0
  98. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-core/src/types/task.rs +0 -0
  99. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-py/Cargo.toml +0 -0
  100. {deepstrike-0.2.20 → deepstrike-0.2.22}/crates/deepstrike-py/src/lib.rs +0 -0
  101. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/collaboration/__init__.py +0 -0
  102. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/collaboration/contract.py +0 -0
  103. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/collaboration/handoff.py +0 -0
  104. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/collaboration/harness.py +0 -0
  105. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/collaboration/modes.py +0 -0
  106. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/collaboration/pool.py +0 -0
  107. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/governance.py +0 -0
  108. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/harness/__init__.py +0 -0
  109. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/harness/harness.py +0 -0
  110. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/kernel/__init__.py +0 -0
  111. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/knowledge/__init__.py +0 -0
  112. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/knowledge/source.py +0 -0
  113. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/memory/agent.py +0 -0
  114. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/memory/protocols.py +0 -0
  115. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/memory/working.py +0 -0
  116. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/__init__.py +0 -0
  117. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/base.py +0 -0
  118. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/deepseek.py +0 -0
  119. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/gemini.py +0 -0
  120. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/glm.py +0 -0
  121. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/kimi.py +0 -0
  122. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/minimax.py +0 -0
  123. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/ollama.py +0 -0
  124. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/openai.py +0 -0
  125. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/openai_responses.py +0 -0
  126. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/qwen.py +0 -0
  127. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/replay.py +0 -0
  128. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/replay_validator.py +0 -0
  129. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/providers/stream.py +0 -0
  130. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/__init__.py +0 -0
  131. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/archive.py +0 -0
  132. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/credential_vault.py +0 -0
  133. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/eval.py +0 -0
  134. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/execution_plane.py +0 -0
  135. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/filtered_plane.py +0 -0
  136. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/kernel_event_log.py +0 -0
  137. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/kernel_step.py +0 -0
  138. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/large_result_spool.py +0 -0
  139. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/mcp_proxy_plane.py +0 -0
  140. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/os_profile.py +0 -0
  141. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/os_snapshot.py +0 -0
  142. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/output_schema.py +0 -0
  143. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/process_sandbox_plane.py +0 -0
  144. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/provider_replay.py +0 -0
  145. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/reducers.py +0 -0
  146. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/remote_vpc_plane.py +0 -0
  147. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/replay_fixture.py +0 -0
  148. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/replay_provider.py +0 -0
  149. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/replay_sanitize.py +0 -0
  150. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/runner.py +0 -0
  151. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/session_log.py +0 -0
  152. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/session_repair.py +0 -0
  153. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/sub_agent_orchestrator.py +0 -0
  154. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/workflow_control_flow.py +0 -0
  155. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/workflow_store.py +0 -0
  156. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/runtime/worktree_plane.py +0 -0
  157. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/safety/__init__.py +0 -0
  158. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/safety/permissions.py +0 -0
  159. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/signals/__init__.py +0 -0
  160. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/signals/gateway.py +0 -0
  161. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/signals/scheduled.py +0 -0
  162. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/signals/types.py +0 -0
  163. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/skills/__init__.py +0 -0
  164. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/skills/registry.py +0 -0
  165. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/skills/watcher.py +0 -0
  166. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/tools/__init__.py +0 -0
  167. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/tools/builtin/__init__.py +0 -0
  168. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/tools/builtin/read_file.py +0 -0
  169. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/tools/execution.py +0 -0
  170. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/tools/registry.py +0 -0
  171. {deepstrike-0.2.20 → deepstrike-0.2.22}/deepstrike/types/__init__.py +0 -0
  172. {deepstrike-0.2.20 → deepstrike-0.2.22}/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.20"
197
+ version = "0.2.22"
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-node"
209
- version = "0.2.20"
209
+ version = "0.2.22"
210
210
  dependencies = [
211
211
  "compact_str",
212
212
  "deepstrike-core",
@@ -218,7 +218,7 @@ dependencies = [
218
218
 
219
219
  [[package]]
220
220
  name = "deepstrike-py"
221
- version = "0.2.20"
221
+ version = "0.2.22"
222
222
  dependencies = [
223
223
  "compact_str",
224
224
  "deepstrike-core",
@@ -229,7 +229,7 @@ dependencies = [
229
229
 
230
230
  [[package]]
231
231
  name = "deepstrike-sdk"
232
- version = "0.2.20"
232
+ version = "0.2.22"
233
233
  dependencies = [
234
234
  "async-stream",
235
235
  "async-trait",
@@ -263,7 +263,7 @@ dependencies = [
263
263
 
264
264
  [[package]]
265
265
  name = "deepstrike-wasm"
266
- version = "0.2.20"
266
+ version = "0.2.22"
267
267
  dependencies = [
268
268
  "compact_str",
269
269
  "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.20"
6
+ version = "0.2.22"
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.20" }
12
+ deepstrike-core = { path = "crates/deepstrike-core", version = "0.2.22" }
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.20
3
+ Version: 0.2.22
4
4
  Requires-Dist: httpx>=0.27
5
5
  Requires-Dist: pyyaml>=6.0
6
6
  Requires-Dist: anyio>=4.0
@@ -68,6 +68,7 @@ from deepstrike.tools import RegisteredTool, tool, streaming_tool, validate_tool
68
68
  from deepstrike.memory import (
69
69
  WorkingMemory,
70
70
  DreamStore, DreamResult, SessionData, MemoryEntry, CurationResult, CurationStats,
71
+ InMemoryDreamStore,
71
72
  )
72
73
  from deepstrike.safety import PermissionManager, PermissionMode, Permission, PermissionDecision
73
74
  from deepstrike.harness import (
@@ -2,8 +2,10 @@ from .working import WorkingMemory
2
2
  from .protocols import (
3
3
  DreamStore, DreamResult, SessionData, MemoryEntry, CurationResult, CurationStats,
4
4
  )
5
+ from .in_memory_store import InMemoryDreamStore
5
6
 
6
7
  __all__ = [
7
8
  "WorkingMemory",
8
9
  "DreamStore", "DreamResult", "SessionData", "MemoryEntry", "CurationResult", "CurationStats",
10
+ "InMemoryDreamStore",
9
11
  ]
@@ -0,0 +1,53 @@
1
+ """`InMemoryDreamStore` — lightweight `DreamStore` backed by per-agent dicts.
2
+
3
+ Python port of node/src/memory/in-memory-store.ts. Use for benchmarks, unit tests,
4
+ and local development where persistent memory isn't needed.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ from typing import Iterable
9
+
10
+ from deepstrike.memory.protocols import CurationResult, DreamStore, MemoryEntry, SessionData
11
+
12
+
13
+ class InMemoryDreamStore(DreamStore):
14
+ def __init__(self, initial_memories: Iterable[MemoryEntry] | None = None) -> None:
15
+ self._sessions: dict[str, list[SessionData]] = {}
16
+ self._memories: dict[str, list[MemoryEntry]] = {}
17
+ self._initial: list[MemoryEntry] = list(initial_memories or [])
18
+ #: Sessions persisted via save_session — exposed for test assertions.
19
+ self.saved_sessions: list[SessionData] = []
20
+
21
+ def add_session(self, agent_id: str, session: SessionData) -> None:
22
+ self._sessions.setdefault(agent_id, []).append(session)
23
+
24
+ def add_memories(self, agent_id: str, entries: Iterable[MemoryEntry]) -> None:
25
+ self._memories.setdefault(agent_id, []).extend(entries)
26
+
27
+ async def load_sessions(self, agent_id: str) -> list[SessionData]:
28
+ return list(self._sessions.get(agent_id, []))
29
+
30
+ async def load_memories(self, agent_id: str) -> list[MemoryEntry]:
31
+ if agent_id in self._memories:
32
+ return list(self._memories[agent_id])
33
+ if self._initial:
34
+ self._memories[agent_id] = list(self._initial)
35
+ return list(self._memories[agent_id])
36
+ return []
37
+
38
+ async def commit(
39
+ self,
40
+ agent_id: str,
41
+ result: CurationResult,
42
+ existing: list[MemoryEntry],
43
+ ) -> None:
44
+ kept = [m for i, m in enumerate(existing) if i not in set(result.to_remove_indices)]
45
+ self._memories[agent_id] = kept + list(result.to_add)
46
+
47
+ async def search(self, agent_id: str, query: str, top_k: int = 5) -> list[MemoryEntry]:
48
+ all_memories = await self.load_memories(agent_id)
49
+ return all_memories[:top_k]
50
+
51
+ async def save_session(self, data: SessionData) -> None:
52
+ self.saved_sessions.append(data)
53
+ self._sessions.setdefault(data.agent_id, []).append(data)
@@ -78,14 +78,18 @@ class AnthropicProvider:
78
78
  knowledge = getattr(context, "system_knowledge", "") or ""
79
79
  if not stable and not knowledge:
80
80
  return context.system_text or None
81
+ # System cache_control is emitted under "default" and "system-only". Other strategies keep
82
+ # the text-block structure for protocol parity but omit cache_control.
83
+ emit = strategy in ("default", "system-only")
84
+ cc = {"cache_control": {"type": "ephemeral"}} if emit else {}
81
85
  blocks: list[dict] = []
82
86
  if stable:
83
- blocks.append({"type": "text", "text": stable, "cache_control": {"type": "ephemeral"}})
87
+ blocks.append({"type": "text", "text": stable, **cc})
84
88
  if knowledge:
85
- blocks.append({"type": "text", "text": knowledge, "cache_control": {"type": "ephemeral"}})
89
+ blocks.append({"type": "text", "text": knowledge, **cc})
86
90
  return blocks or None
87
91
 
88
- def _build_messages(self, turns: list[Message], state_turn=None, frozen_prefix_len=None) -> list[dict]:
92
+ def _build_messages(self, turns: list[Message], state_turn=None, frozen_prefix_len=None, strategy: str = "default") -> list[dict]:
89
93
  msgs = to_anthropic_messages(
90
94
  turns,
91
95
  native_replay=lambda message: self._native_assistant_blocks.get(
@@ -97,7 +101,7 @@ class AnthropicProvider:
97
101
  # state_turn is None and the state is already inside turns (rendered above).
98
102
  # frozen_prefix_len (P1-E) pins the deep breakpoint at the compaction
99
103
  # boundary; None ⇒ rolling-pair fallback.
100
- _apply_message_cache_control(msgs, frozen_prefix_len)
104
+ _apply_message_cache_control(msgs, frozen_prefix_len, strategy)
101
105
  if state_turn is not None:
102
106
  # Render through to_anthropic_messages so assistant tool_use blocks
103
107
  # and tool-role tool_result parts are serialized correctly —
@@ -112,7 +116,7 @@ class AnthropicProvider:
112
116
  msgs.extend(state_msgs)
113
117
  return msgs
114
118
 
115
- def _build_tools(self, tools: list[ToolSchema], anchor_cache: bool) -> list[dict] | None:
119
+ def _build_tools(self, tools: list[ToolSchema], anchor_cache: bool, strategy: str = "default") -> list[dict] | None:
116
120
  if not tools:
117
121
  return None
118
122
  defs = [
@@ -123,10 +127,9 @@ class AnthropicProvider:
123
127
  }
124
128
  for t in tools
125
129
  ]
126
- # Anchor the tools-prefix cache on the final tool only when the system
127
- # blocks won't carry a breakpoint (tools render before system, so a
128
- # system_stable breakpoint already covers them).
129
- if anchor_cache:
130
+ # Tool cache_control is emitted under "default" and "tools-only".
131
+ emit_on_last_tool = anchor_cache and strategy in ("default", "tools-only")
132
+ if emit_on_last_tool:
130
133
  defs[-1]["cache_control"] = {"type": "ephemeral"}
131
134
  return defs
132
135
 
@@ -141,9 +144,10 @@ class AnthropicProvider:
141
144
  if self._circuit.is_open():
142
145
  raise RuntimeError("Circuit breaker open")
143
146
 
144
- msgs = self._build_messages(context.turns, context.state_turn, context.frozen_prefix_len)
145
- system = self._build_system(context)
146
- tool_defs = self._build_tools(tools, anchor_cache=not isinstance(system, list))
147
+ strategy = _resolve_cache_breakpoint_strategy(extensions)
148
+ msgs = self._build_messages(context.turns, context.state_turn, context.frozen_prefix_len, strategy)
149
+ system = self._build_system(context, strategy)
150
+ tool_defs = self._build_tools(tools, anchor_cache=not isinstance(system, list), strategy=strategy)
147
151
  _assert_cache_budget(system, len(tools))
148
152
 
149
153
  last_exc = None
@@ -213,9 +217,10 @@ class AnthropicProvider:
213
217
  raise last_exc or RuntimeError("Complete failed")
214
218
 
215
219
  async def stream(self, context: RenderedContext, tools: list[ToolSchema], extensions: dict | None = None, state: dict | None = None) -> AsyncIterator[StreamEvent]:
216
- msgs = self._build_messages(context.turns, context.state_turn, context.frozen_prefix_len)
217
- system = self._build_system(context)
218
- tool_defs = self._build_tools(tools, anchor_cache=not isinstance(system, list))
220
+ strategy = _resolve_cache_breakpoint_strategy(extensions)
221
+ msgs = self._build_messages(context.turns, context.state_turn, context.frozen_prefix_len, strategy)
222
+ system = self._build_system(context, strategy)
223
+ tool_defs = self._build_tools(tools, anchor_cache=not isinstance(system, list), strategy=strategy)
219
224
  _assert_cache_budget(system, len(tools))
220
225
 
221
226
  native_blocks: dict[int, dict] = {}
@@ -321,8 +326,22 @@ class AnthropicProvider:
321
326
  _MAX_CACHE_BREAKPOINTS = 4
322
327
  _MESSAGE_CACHE_BREAKPOINTS = 2
323
328
 
329
+ # Recognised values for the `cacheBreakpointStrategy` extension. See node/src/types.ts
330
+ # `CacheBreakpointStrategy` for the canonical documentation; this mirrors the same surface.
331
+ _CACHE_BREAKPOINT_STRATEGIES = {"default", "tools-only", "system-only", "frozen-prefix", "none"}
324
332
 
325
- def _apply_message_cache_control(msgs: list[dict], frozen_prefix_len: "int | None" = None) -> None:
333
+
334
+ def _resolve_cache_breakpoint_strategy(extensions: "dict | None") -> str:
335
+ """Pull `cacheBreakpointStrategy` from per-call extensions; unrecognised values → 'default'."""
336
+ if not extensions:
337
+ return "default"
338
+ raw = extensions.get("cacheBreakpointStrategy")
339
+ if isinstance(raw, str) and raw in _CACHE_BREAKPOINT_STRATEGIES:
340
+ return raw
341
+ return "default"
342
+
343
+
344
+ def _apply_message_cache_control(msgs: list[dict], frozen_prefix_len: "int | None" = None, strategy: str = "default") -> None:
326
345
  """Place the (<=2) message-history cache breakpoints. The final message always
327
346
  gets one (writes the current full prefix). The second is placed by one of two
328
347
  strategies:
@@ -340,11 +359,14 @@ def _apply_message_cache_control(msgs: list[dict], frozen_prefix_len: "int | Non
340
359
  body is promoted to a cache-bearing text block."""
341
360
  if not msgs:
342
361
  return
362
+ # Message-level cache_control is emitted under "default" and "frozen-prefix" only.
363
+ if strategy in ("tools-only", "system-only", "none"):
364
+ return
343
365
  targets = {len(msgs) - 1}
344
366
  if isinstance(frozen_prefix_len, int) and 1 <= frozen_prefix_len < len(msgs):
345
367
  # Deep anchor at the frozen-prefix boundary (last frozen turn). Fixed between compactions.
346
368
  targets.add(frozen_prefix_len - 1)
347
- else:
369
+ elif strategy == "default":
348
370
  i = len(msgs) - 2
349
371
  while i >= 0 and len(targets) < _MESSAGE_CACHE_BREAKPOINTS:
350
372
  if msgs[i].get("role") == "user":
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "deepstrike"
7
- version = "0.2.20"
7
+ version = "0.2.22"
8
8
  requires-python = ">=3.10"
9
9
  readme = "README.md"
10
10
  dependencies = [
File without changes