deepstrike 0.2.2__tar.gz → 0.2.3__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 (140) hide show
  1. {deepstrike-0.2.2 → deepstrike-0.2.3}/Cargo.lock +7 -90
  2. {deepstrike-0.2.2 → deepstrike-0.2.3}/Cargo.toml +3 -4
  3. {deepstrike-0.2.2 → deepstrike-0.2.3}/PKG-INFO +45 -4
  4. {deepstrike-0.2.2 → deepstrike-0.2.3}/README.md +44 -3
  5. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/Cargo.toml +0 -1
  6. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/compression.rs +50 -33
  7. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/config.rs +29 -0
  8. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/manager.rs +84 -192
  9. deepstrike-0.2.3/crates/deepstrike-core/src/context/partitions.rs +127 -0
  10. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/pressure.rs +16 -3
  11. deepstrike-0.2.3/crates/deepstrike-core/src/context/renderer.rs +229 -0
  12. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/renewal.rs +24 -82
  13. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/snapshot.rs +1 -4
  14. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/task_state.rs +38 -1
  15. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/token_engine.rs +0 -27
  16. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/runtime/kernel.rs +27 -36
  17. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/scheduler/state_machine.rs +84 -67
  18. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-py/Cargo.toml +0 -1
  19. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-py/src/lib.rs +6 -0
  20. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/__init__.py +2 -0
  21. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/__init__.py +2 -1
  22. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/runner.py +9 -11
  23. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/sub_agent_orchestrator.py +110 -34
  24. {deepstrike-0.2.2 → deepstrike-0.2.3}/pyproject.toml +1 -1
  25. deepstrike-0.2.2/crates/deepstrike-core/src/context/partitions.rs +0 -142
  26. deepstrike-0.2.2/crates/deepstrike-core/src/context/renderer.rs +0 -230
  27. deepstrike-0.2.2/crates/deepstrike-tokenizer/Cargo.toml +0 -12
  28. deepstrike-0.2.2/crates/deepstrike-tokenizer/src/lib.rs +0 -96
  29. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/dashboard.rs +0 -0
  30. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/mod.rs +0 -0
  31. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/sections.rs +0 -0
  32. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/skill_catalog.rs +0 -0
  33. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/summarizer.rs +0 -0
  34. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/text.rs +0 -0
  35. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/audit.rs +0 -0
  36. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/constraint.rs +0 -0
  37. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/mod.rs +0 -0
  38. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/permission.rs +0 -0
  39. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/pipeline.rs +0 -0
  40. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/rate_limit.rs +0 -0
  41. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/sandbox.rs +0 -0
  42. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/tool_decision.rs +0 -0
  43. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/veto.rs +0 -0
  44. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/harness/eval_pipeline.rs +0 -0
  45. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/harness/mod.rs +0 -0
  46. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/lib.rs +0 -0
  47. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/curator.rs +0 -0
  48. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/durable.rs +0 -0
  49. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/extractor.rs +0 -0
  50. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/idle_pipeline.rs +0 -0
  51. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/mod.rs +0 -0
  52. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/runtime.rs +0 -0
  53. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/semantic.rs +0 -0
  54. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/session.rs +0 -0
  55. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/synthesis.rs +0 -0
  56. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/trace_analyzer.rs +0 -0
  57. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/working.rs +0 -0
  58. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/executor.rs +0 -0
  59. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/gen_eval.rs +0 -0
  60. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/mod.rs +0 -0
  61. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/planner.rs +0 -0
  62. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/task_graph.rs +0 -0
  63. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/runtime/mod.rs +0 -0
  64. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/runtime/repair.rs +0 -0
  65. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/runtime/session.rs +0 -0
  66. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/scheduler/mod.rs +0 -0
  67. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/scheduler/policy.rs +0 -0
  68. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/signals/attention.rs +0 -0
  69. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/signals/mod.rs +0 -0
  70. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/signals/queue.rs +0 -0
  71. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/signals/router.rs +0 -0
  72. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/agent.rs +0 -0
  73. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/capability.rs +0 -0
  74. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/contract.rs +0 -0
  75. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/error.rs +0 -0
  76. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/message.rs +0 -0
  77. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/milestone.rs +0 -0
  78. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/mod.rs +0 -0
  79. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/model.rs +0 -0
  80. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/policy.rs +0 -0
  81. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/result.rs +0 -0
  82. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/signal.rs +0 -0
  83. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/skill.rs +0 -0
  84. {deepstrike-0.2.2 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/task.rs +0 -0
  85. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/collaboration/__init__.py +0 -0
  86. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/collaboration/contract.py +0 -0
  87. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/collaboration/handoff.py +0 -0
  88. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/collaboration/harness.py +0 -0
  89. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/collaboration/modes.py +0 -0
  90. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/collaboration/pool.py +0 -0
  91. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/governance.py +0 -0
  92. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/harness/__init__.py +0 -0
  93. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/harness/harness.py +0 -0
  94. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/kernel/__init__.py +0 -0
  95. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/knowledge/__init__.py +0 -0
  96. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/knowledge/source.py +0 -0
  97. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/memory/__init__.py +0 -0
  98. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/memory/protocols.py +0 -0
  99. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/memory/working.py +0 -0
  100. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/__init__.py +0 -0
  101. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/anthropic.py +0 -0
  102. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/base.py +0 -0
  103. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/deepseek.py +0 -0
  104. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/gemini.py +0 -0
  105. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/glm.py +0 -0
  106. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/kimi.py +0 -0
  107. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/minimax.py +0 -0
  108. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/ollama.py +0 -0
  109. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/openai.py +0 -0
  110. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/qwen.py +0 -0
  111. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/replay.py +0 -0
  112. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/providers/stream.py +0 -0
  113. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/archive.py +0 -0
  114. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/credential_vault.py +0 -0
  115. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/execution_plane.py +0 -0
  116. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/filtered_plane.py +0 -0
  117. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/kernel_step.py +0 -0
  118. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/mcp_proxy_plane.py +0 -0
  119. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/process_sandbox_plane.py +0 -0
  120. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/provider_replay.py +0 -0
  121. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/remote_vpc_plane.py +0 -0
  122. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/replay_sanitize.py +0 -0
  123. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/session_log.py +0 -0
  124. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/runtime/session_repair.py +0 -0
  125. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/safety/__init__.py +0 -0
  126. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/safety/permissions.py +0 -0
  127. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/signals/__init__.py +0 -0
  128. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/signals/gateway.py +0 -0
  129. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/signals/scheduled.py +0 -0
  130. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/signals/types.py +0 -0
  131. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/skills/__init__.py +0 -0
  132. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/skills/registry.py +0 -0
  133. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/skills/watcher.py +0 -0
  134. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/tools/__init__.py +0 -0
  135. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/tools/builtin/__init__.py +0 -0
  136. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/tools/builtin/read_file.py +0 -0
  137. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/tools/execution.py +0 -0
  138. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/tools/registry.py +0 -0
  139. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/types/__init__.py +0 -0
  140. {deepstrike-0.2.2 → deepstrike-0.2.3}/deepstrike/types/agent.py +0 -0
@@ -62,33 +62,12 @@ version = "1.5.0"
62
62
  source = "registry+https://github.com/rust-lang/crates.io-index"
63
63
  checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
64
64
 
65
- [[package]]
66
- name = "base64"
67
- version = "0.21.7"
68
- source = "registry+https://github.com/rust-lang/crates.io-index"
69
- checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
70
-
71
65
  [[package]]
72
66
  name = "base64"
73
67
  version = "0.22.1"
74
68
  source = "registry+https://github.com/rust-lang/crates.io-index"
75
69
  checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
76
70
 
77
- [[package]]
78
- name = "bit-set"
79
- version = "0.5.3"
80
- source = "registry+https://github.com/rust-lang/crates.io-index"
81
- checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
82
- dependencies = [
83
- "bit-vec",
84
- ]
85
-
86
- [[package]]
87
- name = "bit-vec"
88
- version = "0.6.3"
89
- source = "registry+https://github.com/rust-lang/crates.io-index"
90
- checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
91
-
92
71
  [[package]]
93
72
  name = "bitflags"
94
73
  version = "1.3.2"
@@ -101,17 +80,6 @@ version = "2.11.1"
101
80
  source = "registry+https://github.com/rust-lang/crates.io-index"
102
81
  checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
103
82
 
104
- [[package]]
105
- name = "bstr"
106
- version = "1.12.1"
107
- source = "registry+https://github.com/rust-lang/crates.io-index"
108
- checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
109
- dependencies = [
110
- "memchr",
111
- "regex-automata",
112
- "serde",
113
- ]
114
-
115
83
  [[package]]
116
84
  name = "bumpalo"
117
85
  version = "3.20.2"
@@ -226,10 +194,9 @@ dependencies = [
226
194
 
227
195
  [[package]]
228
196
  name = "deepstrike-core"
229
- version = "0.2.2"
197
+ version = "0.2.3"
230
198
  dependencies = [
231
199
  "compact_str",
232
- "deepstrike-tokenizer",
233
200
  "pretty_assertions",
234
201
  "serde",
235
202
  "serde_json",
@@ -239,11 +206,10 @@ dependencies = [
239
206
 
240
207
  [[package]]
241
208
  name = "deepstrike-node"
242
- version = "0.2.2"
209
+ version = "0.2.3"
243
210
  dependencies = [
244
211
  "compact_str",
245
212
  "deepstrike-core",
246
- "deepstrike-tokenizer",
247
213
  "napi",
248
214
  "napi-build",
249
215
  "napi-derive",
@@ -252,11 +218,10 @@ dependencies = [
252
218
 
253
219
  [[package]]
254
220
  name = "deepstrike-py"
255
- version = "0.2.2"
221
+ version = "0.2.3"
256
222
  dependencies = [
257
223
  "compact_str",
258
224
  "deepstrike-core",
259
- "deepstrike-tokenizer",
260
225
  "pyo3",
261
226
  "serde_json",
262
227
  "uuid",
@@ -264,7 +229,7 @@ dependencies = [
264
229
 
265
230
  [[package]]
266
231
  name = "deepstrike-sdk"
267
- version = "0.2.2"
232
+ version = "0.2.3"
268
233
  dependencies = [
269
234
  "async-stream",
270
235
  "async-trait",
@@ -296,21 +261,12 @@ dependencies = [
296
261
  "tokio",
297
262
  ]
298
263
 
299
- [[package]]
300
- name = "deepstrike-tokenizer"
301
- version = "0.2.2"
302
- dependencies = [
303
- "pretty_assertions",
304
- "tiktoken-rs",
305
- ]
306
-
307
264
  [[package]]
308
265
  name = "deepstrike-wasm"
309
- version = "0.2.2"
266
+ version = "0.2.3"
310
267
  dependencies = [
311
268
  "compact_str",
312
269
  "deepstrike-core",
313
- "deepstrike-tokenizer",
314
270
  "js-sys",
315
271
  "serde",
316
272
  "serde-wasm-bindgen",
@@ -368,17 +324,6 @@ dependencies = [
368
324
  "windows-sys 0.61.2",
369
325
  ]
370
326
 
371
- [[package]]
372
- name = "fancy-regex"
373
- version = "0.13.0"
374
- source = "registry+https://github.com/rust-lang/crates.io-index"
375
- checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2"
376
- dependencies = [
377
- "bit-set",
378
- "regex-automata",
379
- "regex-syntax",
380
- ]
381
-
382
327
  [[package]]
383
328
  name = "fastrand"
384
329
  version = "2.4.1"
@@ -708,7 +653,7 @@ version = "0.1.20"
708
653
  source = "registry+https://github.com/rust-lang/crates.io-index"
709
654
  checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
710
655
  dependencies = [
711
- "base64 0.22.1",
656
+ "base64",
712
657
  "bytes",
713
658
  "futures-channel",
714
659
  "futures-util",
@@ -921,12 +866,6 @@ dependencies = [
921
866
  "libc",
922
867
  ]
923
868
 
924
- [[package]]
925
- name = "lazy_static"
926
- version = "1.5.0"
927
- source = "registry+https://github.com/rust-lang/crates.io-index"
928
- checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
929
-
930
869
  [[package]]
931
870
  name = "leb128fmt"
932
871
  version = "0.1.0"
@@ -1379,7 +1318,7 @@ version = "0.12.28"
1379
1318
  source = "registry+https://github.com/rust-lang/crates.io-index"
1380
1319
  checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
1381
1320
  dependencies = [
1382
- "base64 0.22.1",
1321
+ "base64",
1383
1322
  "bytes",
1384
1323
  "encoding_rs",
1385
1324
  "futures-core",
@@ -1430,12 +1369,6 @@ dependencies = [
1430
1369
  "windows-sys 0.52.0",
1431
1370
  ]
1432
1371
 
1433
- [[package]]
1434
- name = "rustc-hash"
1435
- version = "1.1.0"
1436
- source = "registry+https://github.com/rust-lang/crates.io-index"
1437
- checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
1438
-
1439
1372
  [[package]]
1440
1373
  name = "rustix"
1441
1374
  version = "1.1.4"
@@ -1771,22 +1704,6 @@ dependencies = [
1771
1704
  "syn",
1772
1705
  ]
1773
1706
 
1774
- [[package]]
1775
- name = "tiktoken-rs"
1776
- version = "0.6.0"
1777
- source = "registry+https://github.com/rust-lang/crates.io-index"
1778
- checksum = "44075987ee2486402f0808505dd65692163d243a337fc54363d49afac41087f6"
1779
- dependencies = [
1780
- "anyhow",
1781
- "base64 0.21.7",
1782
- "bstr",
1783
- "fancy-regex",
1784
- "lazy_static",
1785
- "parking_lot",
1786
- "regex",
1787
- "rustc-hash",
1788
- ]
1789
-
1790
1707
  [[package]]
1791
1708
  name = "tinystr"
1792
1709
  version = "0.8.3"
@@ -1,16 +1,15 @@
1
1
  [workspace]
2
2
  resolver = "2"
3
- members = ["crates/deepstrike-core", "crates/deepstrike-tokenizer", "crates/deepstrike-py"]
3
+ members = ["crates/deepstrike-core", "crates/deepstrike-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.2.2"
6
+ version = "0.2.3"
7
7
  edition = "2024"
8
8
  license = "MIT"
9
9
  repository = "https://github.com/anthropics/deepstrike"
10
10
 
11
11
  [workspace.dependencies]
12
- deepstrike-core = { path = "crates/deepstrike-core", version = "0.2.2" }
13
- deepstrike-tokenizer = { path = "crates/deepstrike-tokenizer", version = "0.2.2" }
12
+ deepstrike-core = { path = "crates/deepstrike-core", version = "0.2.3" }
14
13
  notify = "6"
15
14
  serde = { version = "1", features = ["derive"] }
16
15
  serde_json = "1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepstrike
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Requires-Dist: httpx>=0.27
5
5
  Requires-Dist: pyyaml>=6.0
6
6
  Requires-Dist: anyio>=4.0
@@ -87,6 +87,29 @@ All providers accept `RetryConfig` for exponential backoff and share a `CircuitB
87
87
 
88
88
  ---
89
89
 
90
+ ## Context model (four slots)
91
+
92
+ The kernel renders context as four LLM API slots — only **history** is compressed.
93
+
94
+ | Slot | Source | Role |
95
+ |------|--------|------|
96
+ | `system_stable` | system partition | Identity, rules — never changes within a run |
97
+ | `system_knowledge` | knowledge partition | Preloaded memory, skill defs — low frequency |
98
+ | `turns[0]` | `task_state` + signals | Goal, plan, progress, compression log, runtime signals |
99
+ | `turns[1..N]` | history | Conversation transcript |
100
+
101
+ ```python
102
+ runner = RuntimeRunner(RuntimeOptions(
103
+ initial_memory=["User prefers chartreuse."], # → Slot 2
104
+ system_prompt="You are a helpful assistant.", # → Slot 1
105
+ # ...
106
+ ))
107
+ ```
108
+
109
+ Full reference: [docs/context-partition-compression.md](../docs/context-partition-compression.md)
110
+
111
+ ---
112
+
90
113
  ## Runtime options
91
114
 
92
115
  ```python
@@ -104,6 +127,11 @@ runner = RuntimeRunner(RuntimeOptions(
104
127
  signal_source=gateway, # SignalGateway or any SignalSource
105
128
  dream_store=my_store, # DreamStore for long-term memory
106
129
  agent_id="my-agent", # required with dream_store for memory meta-tool
130
+ initial_memory=["..."], # preloaded blocks → Slot 2 (system_knowledge)
131
+ sub_agent_harness=SubAgentHarnessConfig( # optional: HarnessLoop for spawned sub-agents
132
+ eval_provider=eval_provider,
133
+ max_attempts=3,
134
+ ),
107
135
  ))
108
136
  ```
109
137
 
@@ -151,7 +179,7 @@ effort: 1
151
179
 
152
180
  ## Knowledge
153
181
 
154
- Implement `KnowledgeSource` — the kernel injects a `knowledge` meta-tool.
182
+ Implement `KnowledgeSource` — the kernel injects a `knowledge` meta-tool. **Runtime retrieval results land in history** as tool results. Use `initial_memory` for durable preload into Slot 2.
155
183
 
156
184
  ```python
157
185
  from deepstrike import KnowledgeSource
@@ -177,7 +205,9 @@ runner = RuntimeRunner(RuntimeOptions(
177
205
 
178
206
  ## Memory
179
207
 
180
- ### WorkingMemory (in-session scratch pad)
208
+ ### WorkingMemory (SDK-side scratch pad)
209
+
210
+ `WorkingMemory` is an SDK helper — not the kernel `working` partition (removed). Kernel task state renders into Slot 3 (`turns[0]`).
181
211
 
182
212
  ```python
183
213
  from deepstrike import WorkingMemory
@@ -210,7 +240,8 @@ runner = RuntimeRunner(RuntimeOptions(
210
240
  agent_id="my-agent",
211
241
  ))
212
242
 
213
- # In-session: LLM calls memory(query) → DreamStore.search()
243
+ # In-session: LLM calls memory(query) → DreamStore.search() → history tool result
244
+ # Preload: initial_memory → Slot 2 (system_knowledge)
214
245
  # Post-session: trigger memory consolidation
215
246
  result = await runner.dream("my-agent", now_ms=int(time.time() * 1000))
216
247
  ```
@@ -295,6 +326,16 @@ outcome = await EvalLoopHarness(runner, gate=ContainsHello(), max_attempts=3).ru
295
326
 
296
327
  # 3. HarnessLoop — LLM-as-judge with feedback injection + skill extraction
297
328
  loop = HarnessLoop(runner, eval_provider=eval_provider, max_attempts=3, skill_dir="./skills")
329
+
330
+ # Sub-agents: pass sub_agent_harness on RuntimeOptions to auto-evaluate spawned children
331
+ from deepstrike import SubAgentHarnessConfig
332
+ runner = RuntimeRunner(RuntimeOptions(
333
+ provider=provider,
334
+ session_log=InMemorySessionLog(),
335
+ execution_plane=plane,
336
+ sub_agent_harness=SubAgentHarnessConfig(eval_provider=eval_provider, max_attempts=3),
337
+ # ...
338
+ ))
298
339
  async for event in loop.run_streaming(HarnessRequest(goal="Write a haiku")):
299
340
  if event.type == "done":
300
341
  print(event.verdict.passed, event.verdict.feedback)
@@ -74,6 +74,29 @@ All providers accept `RetryConfig` for exponential backoff and share a `CircuitB
74
74
 
75
75
  ---
76
76
 
77
+ ## Context model (four slots)
78
+
79
+ The kernel renders context as four LLM API slots — only **history** is compressed.
80
+
81
+ | Slot | Source | Role |
82
+ |------|--------|------|
83
+ | `system_stable` | system partition | Identity, rules — never changes within a run |
84
+ | `system_knowledge` | knowledge partition | Preloaded memory, skill defs — low frequency |
85
+ | `turns[0]` | `task_state` + signals | Goal, plan, progress, compression log, runtime signals |
86
+ | `turns[1..N]` | history | Conversation transcript |
87
+
88
+ ```python
89
+ runner = RuntimeRunner(RuntimeOptions(
90
+ initial_memory=["User prefers chartreuse."], # → Slot 2
91
+ system_prompt="You are a helpful assistant.", # → Slot 1
92
+ # ...
93
+ ))
94
+ ```
95
+
96
+ Full reference: [docs/context-partition-compression.md](../docs/context-partition-compression.md)
97
+
98
+ ---
99
+
77
100
  ## Runtime options
78
101
 
79
102
  ```python
@@ -91,6 +114,11 @@ runner = RuntimeRunner(RuntimeOptions(
91
114
  signal_source=gateway, # SignalGateway or any SignalSource
92
115
  dream_store=my_store, # DreamStore for long-term memory
93
116
  agent_id="my-agent", # required with dream_store for memory meta-tool
117
+ initial_memory=["..."], # preloaded blocks → Slot 2 (system_knowledge)
118
+ sub_agent_harness=SubAgentHarnessConfig( # optional: HarnessLoop for spawned sub-agents
119
+ eval_provider=eval_provider,
120
+ max_attempts=3,
121
+ ),
94
122
  ))
95
123
  ```
96
124
 
@@ -138,7 +166,7 @@ effort: 1
138
166
 
139
167
  ## Knowledge
140
168
 
141
- Implement `KnowledgeSource` — the kernel injects a `knowledge` meta-tool.
169
+ Implement `KnowledgeSource` — the kernel injects a `knowledge` meta-tool. **Runtime retrieval results land in history** as tool results. Use `initial_memory` for durable preload into Slot 2.
142
170
 
143
171
  ```python
144
172
  from deepstrike import KnowledgeSource
@@ -164,7 +192,9 @@ runner = RuntimeRunner(RuntimeOptions(
164
192
 
165
193
  ## Memory
166
194
 
167
- ### WorkingMemory (in-session scratch pad)
195
+ ### WorkingMemory (SDK-side scratch pad)
196
+
197
+ `WorkingMemory` is an SDK helper — not the kernel `working` partition (removed). Kernel task state renders into Slot 3 (`turns[0]`).
168
198
 
169
199
  ```python
170
200
  from deepstrike import WorkingMemory
@@ -197,7 +227,8 @@ runner = RuntimeRunner(RuntimeOptions(
197
227
  agent_id="my-agent",
198
228
  ))
199
229
 
200
- # In-session: LLM calls memory(query) → DreamStore.search()
230
+ # In-session: LLM calls memory(query) → DreamStore.search() → history tool result
231
+ # Preload: initial_memory → Slot 2 (system_knowledge)
201
232
  # Post-session: trigger memory consolidation
202
233
  result = await runner.dream("my-agent", now_ms=int(time.time() * 1000))
203
234
  ```
@@ -282,6 +313,16 @@ outcome = await EvalLoopHarness(runner, gate=ContainsHello(), max_attempts=3).ru
282
313
 
283
314
  # 3. HarnessLoop — LLM-as-judge with feedback injection + skill extraction
284
315
  loop = HarnessLoop(runner, eval_provider=eval_provider, max_attempts=3, skill_dir="./skills")
316
+
317
+ # Sub-agents: pass sub_agent_harness on RuntimeOptions to auto-evaluate spawned children
318
+ from deepstrike import SubAgentHarnessConfig
319
+ runner = RuntimeRunner(RuntimeOptions(
320
+ provider=provider,
321
+ session_log=InMemorySessionLog(),
322
+ execution_plane=plane,
323
+ sub_agent_harness=SubAgentHarnessConfig(eval_provider=eval_provider, max_attempts=3),
324
+ # ...
325
+ ))
285
326
  async for event in loop.run_streaming(HarnessRequest(goal="Write a haiku")):
286
327
  if event.type == "done":
287
328
  print(event.verdict.passed, event.verdict.feedback)
@@ -11,7 +11,6 @@ serde_json = { workspace = true }
11
11
  thiserror = { workspace = true }
12
12
  compact_str = { workspace = true }
13
13
  uuid = { workspace = true }
14
- deepstrike-tokenizer = { workspace = true }
15
14
 
16
15
  [dev-dependencies]
17
16
  pretty_assertions = "1"
@@ -22,6 +22,7 @@ pub trait Compressor: Send + Sync {
22
22
  partitions: &mut ContextPartitions,
23
23
  target_tokens: u32,
24
24
  max_tokens: u32,
25
+ preserve_k: usize,
25
26
  summarizer: &dyn Summarizer,
26
27
  engine: &ContextTokenEngine,
27
28
  ) -> CompressResult;
@@ -38,6 +39,7 @@ impl Compressor for SnipCompactor {
38
39
  partitions: &mut ContextPartitions,
39
40
  _target_tokens: u32,
40
41
  max_tokens: u32,
42
+ _preserve_k: usize,
41
43
  _summarizer: &dyn Summarizer,
42
44
  engine: &ContextTokenEngine,
43
45
  ) -> CompressResult {
@@ -93,6 +95,14 @@ impl Compressor for SnipCompactor {
93
95
  }
94
96
 
95
97
  partition.token_count = partition.token_count.saturating_sub(saved);
98
+
99
+ if saved > 0 {
100
+ partitions.task_state.log_compression(
101
+ "snip_compact",
102
+ format!("{saved} tokens truncated from oversized messages"),
103
+ );
104
+ }
105
+
96
106
  CompressResult {
97
107
  tokens_saved: saved,
98
108
  summary: None,
@@ -195,6 +205,7 @@ impl Compressor for MicroCompactor {
195
205
  partitions: &mut ContextPartitions,
196
206
  _target_tokens: u32,
197
207
  _max_tokens: u32,
208
+ _preserve_k: usize,
198
209
  _summarizer: &dyn Summarizer,
199
210
  engine: &ContextTokenEngine,
200
211
  ) -> CompressResult {
@@ -269,6 +280,14 @@ impl Compressor for MicroCompactor {
269
280
  }
270
281
 
271
282
  partition.token_count = partition.token_count.saturating_sub(saved);
283
+
284
+ if saved > 0 {
285
+ partitions.task_state.log_compression(
286
+ "micro_compact",
287
+ format!("{saved} tokens excerpted from tool results"),
288
+ );
289
+ }
290
+
272
291
  CompressResult {
273
292
  tokens_saved: saved,
274
293
  summary: None,
@@ -286,6 +305,7 @@ impl Compressor for CollapseCompactor {
286
305
  partitions: &mut ContextPartitions,
287
306
  target_tokens: u32,
288
307
  _max_tokens: u32,
308
+ preserve_k: usize,
289
309
  summarizer: &dyn Summarizer,
290
310
  engine: &ContextTokenEngine,
291
311
  ) -> CompressResult {
@@ -293,8 +313,8 @@ impl Compressor for CollapseCompactor {
293
313
  let mut saved = 0u32;
294
314
  let mut n = 0usize;
295
315
 
296
- // Preserve last K = 2 turns (4 messages) to maintain conversational context
297
- let limit = partition.messages.len().saturating_sub(4);
316
+ let keep = preserve_k * 2; // turns messages (user + assistant per turn)
317
+ let limit = partition.messages.len().saturating_sub(keep);
298
318
  for i in 0..limit {
299
319
  if partition.token_count.saturating_sub(saved) <= target_tokens {
300
320
  break;
@@ -315,27 +335,20 @@ impl Compressor for CollapseCompactor {
315
335
  let archived: Vec<Message> = partition.messages.drain(..n).collect();
316
336
  let summary_text =
317
337
  summarizer.summarize(&archived, PressureAction::ContextCollapse, target_tokens);
318
- let summary_tokens = engine.count(&summary_text);
319
-
320
- let mut summary_msg = Message::assistant(summary_text.clone());
321
- summary_msg.token_count = Some(summary_tokens);
322
338
 
323
- partition.messages.insert(0, summary_msg);
339
+ partition.token_count = partition.token_count.saturating_sub(saved);
324
340
 
325
- partition.token_count = partition
326
- .token_count
327
- .saturating_sub(saved)
328
- .saturating_add(summary_tokens);
341
+ partitions.task_state.log_compression("context_collapse", summary_text.clone());
329
342
 
330
343
  CompressResult {
331
- tokens_saved: saved.saturating_sub(summary_tokens),
344
+ tokens_saved: saved,
332
345
  summary: Some(summary_text),
333
346
  archived,
334
347
  }
335
348
  }
336
349
  }
337
350
 
338
- /// rho > auto_threshold: collapse history entirely except last K turns, updating scratchpad.
351
+ /// rho > auto_threshold: collapse history entirely except last K turns, updating compression log.
339
352
  pub struct AutoCompactor;
340
353
 
341
354
  impl Compressor for AutoCompactor {
@@ -344,6 +357,7 @@ impl Compressor for AutoCompactor {
344
357
  partitions: &mut ContextPartitions,
345
358
  _target_tokens: u32,
346
359
  _max_tokens: u32,
360
+ preserve_k: usize,
347
361
  summarizer: &dyn Summarizer,
348
362
  engine: &ContextTokenEngine,
349
363
  ) -> CompressResult {
@@ -357,9 +371,8 @@ impl Compressor for AutoCompactor {
357
371
  }
358
372
 
359
373
  let original_tokens = partition.token_count;
360
-
361
- // Preserve last K = 2 turns (4 messages)
362
- let limit = partition.messages.len().saturating_sub(4);
374
+ let keep = preserve_k * 2;
375
+ let limit = partition.messages.len().saturating_sub(keep);
363
376
  let (archived, kept): (Vec<Message>, Vec<Message>) = if limit > 0 {
364
377
  let archived_msgs = partition.messages.drain(..limit).collect();
365
378
  let kept_msgs = partition.messages.drain(..).collect();
@@ -381,12 +394,6 @@ impl Compressor for AutoCompactor {
381
394
 
382
395
  let summary_text =
383
396
  summarizer.summarize(&archived, PressureAction::AutoCompact, _max_tokens);
384
- let summary_tokens = engine.count(&summary_text);
385
-
386
- partitions.task_state.scratchpad = summary_text.clone();
387
-
388
- let working_msg = Message::system(summary_text.clone());
389
- partitions.working.push(working_msg, summary_tokens);
390
397
 
391
398
  let kept_tokens: u32 = partition
392
399
  .messages
@@ -395,6 +402,8 @@ impl Compressor for AutoCompactor {
395
402
  .sum();
396
403
  partition.token_count = kept_tokens;
397
404
 
405
+ partitions.task_state.log_compression("auto_compact", summary_text.clone());
406
+
398
407
  CompressResult {
399
408
  tokens_saved: original_tokens.saturating_sub(kept_tokens),
400
409
  summary: Some(summary_text),
@@ -406,11 +415,13 @@ impl Compressor for AutoCompactor {
406
415
  /// Compression pipeline — operates on history partition but can reference full partitions.
407
416
  pub struct CompressionPipeline {
408
417
  stages: Vec<(PressureAction, Box<dyn Compressor>)>,
418
+ preserve_recent_turns: usize,
409
419
  }
410
420
 
411
421
  impl CompressionPipeline {
412
422
  pub fn new(config: &ContextConfig) -> Self {
413
423
  Self {
424
+ preserve_recent_turns: config.preserve_recent_turns,
414
425
  stages: vec![
415
426
  (
416
427
  PressureAction::SnipCompact,
@@ -444,12 +455,17 @@ impl CompressionPipeline {
444
455
 
445
456
  for (stage_action, compressor) in &self.stages {
446
457
  if *stage_action <= action {
447
- // 如果当前总 token 已经满足预算目标,则无需继续进行更重级别的压缩
448
458
  if partitions.total_tokens(engine) <= target_tokens {
449
459
  break;
450
460
  }
451
- let res =
452
- compressor.compress(partitions, target_tokens, max_tokens, &summarizer, engine);
461
+ let res = compressor.compress(
462
+ partitions,
463
+ target_tokens,
464
+ max_tokens,
465
+ self.preserve_recent_turns,
466
+ &summarizer,
467
+ engine,
468
+ );
453
469
  total_saved += res.tokens_saved;
454
470
  if let Some(s) = res.summary {
455
471
  if !s.is_empty() {
@@ -507,7 +523,7 @@ mod tests {
507
523
  };
508
524
  let mut ctx = ContextPartitions::new(&cfg);
509
525
  ctx.history.push(Message::user("a".repeat(800)), 200);
510
- let result = compactor.compress(&mut ctx, 0, MAX, &summarizer(), &engine());
526
+ let result = compactor.compress(&mut ctx, 0, MAX, 2, &summarizer(), &engine());
511
527
  assert!(result.tokens_saved > 0);
512
528
  if let Content::Text(ref t) = ctx.history.messages[0].content {
513
529
  assert!(t.contains("… [… 100 tokens omitted …] …"), "got: {t}");
@@ -525,7 +541,7 @@ mod tests {
525
541
  };
526
542
  let mut ctx = ContextPartitions::new(&cfg);
527
543
  ctx.history.push(Message::user("short"), 5);
528
- let result = compactor.compress(&mut ctx, 0, MAX, &summarizer(), &engine());
544
+ let result = compactor.compress(&mut ctx, 0, MAX, 2, &summarizer(), &engine());
529
545
  assert_eq!(result.tokens_saved, 0);
530
546
  }
531
547
 
@@ -550,7 +566,7 @@ mod tests {
550
566
  ctx.history.messages.push(msg);
551
567
  ctx.history.token_count = 300;
552
568
 
553
- let result = compactor.compress(&mut ctx, 0, MAX, &summarizer(), &engine());
569
+ let result = compactor.compress(&mut ctx, 0, MAX, 2, &summarizer(), &engine());
554
570
  assert!(result.tokens_saved > 0);
555
571
  let text = ctx.history.messages[0].content.as_text().unwrap();
556
572
  assert!(
@@ -566,9 +582,10 @@ mod tests {
566
582
  for _ in 0..8 {
567
583
  ctx.history.push(Message::user("msg"), 50);
568
584
  }
569
- let result = compactor.compress(&mut ctx, 250, MAX, &summarizer(), &engine());
585
+ let result = compactor.compress(&mut ctx, 250, MAX, 2, &summarizer(), &engine());
570
586
  assert!(result.tokens_saved > 0);
571
587
  assert!(ctx.history.messages.len() < 8);
588
+ assert!(ctx.task_state.compression_log.iter().any(|e| e.action == "context_collapse"));
572
589
  }
573
590
 
574
591
  #[test]
@@ -618,7 +635,7 @@ mod tests {
618
635
  ctx.history.messages.push(msg);
619
636
  ctx.history.token_count = 300;
620
637
 
621
- let result = compactor.compress(&mut ctx, 0, MAX, &summarizer(), &engine());
638
+ let result = compactor.compress(&mut ctx, 0, MAX, 2, &summarizer(), &engine());
622
639
  // Since call_id "keep_me" is in preserved_refs, it should not be replaced!
623
640
  assert_eq!(result.tokens_saved, 0);
624
641
  let text_opt = ctx.history.messages[0].content.as_text();
@@ -635,12 +652,12 @@ mod tests {
635
652
  for i in 0..10 {
636
653
  ctx.history.push(Message::user(format!("msg {i}")), 10);
637
654
  }
638
- let result = compactor.compress(&mut ctx, 0, MAX, &summarizer(), &engine());
655
+ let result = compactor.compress(&mut ctx, 0, MAX, 2, &summarizer(), &engine());
639
656
  assert!(result.tokens_saved > 0);
640
657
  assert_eq!(ctx.history.messages.len(), 4); // kept last 2 turns = 4 messages
641
658
  assert!(result.summary.is_some());
642
- assert!(!ctx.task_state.scratchpad.is_empty());
643
- assert_eq!(ctx.working.messages.len(), 1); // summary pushed to working partition
659
+ // Summary now routes through compression_log → systemVolatile
660
+ assert!(ctx.task_state.compression_log.iter().any(|e| e.action == "auto_compact"));
644
661
  }
645
662
 
646
663
  #[test]