deepstrike 0.2.1__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.
- {deepstrike-0.2.1 → deepstrike-0.2.3}/Cargo.lock +7 -90
- {deepstrike-0.2.1 → deepstrike-0.2.3}/Cargo.toml +3 -4
- {deepstrike-0.2.1 → deepstrike-0.2.3}/PKG-INFO +45 -4
- {deepstrike-0.2.1 → deepstrike-0.2.3}/README.md +44 -3
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/Cargo.toml +0 -1
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/compression.rs +50 -33
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/config.rs +29 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/manager.rs +84 -192
- deepstrike-0.2.3/crates/deepstrike-core/src/context/partitions.rs +127 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/pressure.rs +16 -3
- deepstrike-0.2.3/crates/deepstrike-core/src/context/renderer.rs +229 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/renewal.rs +24 -82
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/snapshot.rs +1 -4
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/task_state.rs +38 -1
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/token_engine.rs +0 -27
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/runtime/kernel.rs +27 -36
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/scheduler/state_machine.rs +84 -67
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-py/Cargo.toml +0 -1
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-py/src/lib.rs +6 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/__init__.py +2 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/openai.py +3 -1
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/qwen.py +3 -1
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/__init__.py +2 -1
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/runner.py +9 -11
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/sub_agent_orchestrator.py +110 -34
- {deepstrike-0.2.1 → deepstrike-0.2.3}/pyproject.toml +1 -1
- deepstrike-0.2.1/crates/deepstrike-core/src/context/partitions.rs +0 -142
- deepstrike-0.2.1/crates/deepstrike-core/src/context/renderer.rs +0 -230
- deepstrike-0.2.1/crates/deepstrike-tokenizer/Cargo.toml +0 -12
- deepstrike-0.2.1/crates/deepstrike-tokenizer/src/lib.rs +0 -96
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/dashboard.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/sections.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/skill_catalog.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/summarizer.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/context/text.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/audit.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/constraint.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/permission.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/pipeline.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/rate_limit.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/sandbox.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/tool_decision.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/governance/veto.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/harness/eval_pipeline.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/harness/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/lib.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/curator.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/durable.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/extractor.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/idle_pipeline.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/runtime.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/semantic.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/session.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/synthesis.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/trace_analyzer.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/memory/working.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/executor.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/gen_eval.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/planner.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/orchestration/task_graph.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/runtime/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/runtime/repair.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/runtime/session.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/scheduler/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/scheduler/policy.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/signals/attention.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/signals/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/signals/queue.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/signals/router.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/agent.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/capability.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/contract.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/error.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/message.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/milestone.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/mod.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/model.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/policy.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/result.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/signal.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/skill.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/crates/deepstrike-core/src/types/task.rs +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/collaboration/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/collaboration/contract.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/collaboration/handoff.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/collaboration/harness.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/collaboration/modes.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/collaboration/pool.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/governance.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/harness/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/harness/harness.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/kernel/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/knowledge/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/knowledge/source.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/memory/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/memory/protocols.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/memory/working.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/anthropic.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/base.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/deepseek.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/gemini.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/glm.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/kimi.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/minimax.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/ollama.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/replay.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/providers/stream.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/archive.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/credential_vault.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/execution_plane.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/filtered_plane.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/kernel_step.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/mcp_proxy_plane.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/process_sandbox_plane.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/provider_replay.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/remote_vpc_plane.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/replay_sanitize.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/session_log.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/runtime/session_repair.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/safety/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/safety/permissions.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/signals/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/signals/gateway.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/signals/scheduled.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/signals/types.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/skills/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/skills/registry.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/skills/watcher.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/tools/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/tools/builtin/__init__.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/tools/builtin/read_file.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/tools/execution.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/tools/registry.py +0 -0
- {deepstrike-0.2.1 → deepstrike-0.2.3}/deepstrike/types/__init__.py +0 -0
- {deepstrike-0.2.1 → 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.1"
|
|
302
|
-
dependencies = [
|
|
303
|
-
"pretty_assertions",
|
|
304
|
-
"tiktoken-rs",
|
|
305
|
-
]
|
|
306
|
-
|
|
307
264
|
[[package]]
|
|
308
265
|
name = "deepstrike-wasm"
|
|
309
|
-
version = "0.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
|
|
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
|
|
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-
|
|
3
|
+
members = ["crates/deepstrike-core", "crates/deepstrike-py"]
|
|
4
4
|
|
|
5
5
|
[workspace.package]
|
|
6
|
-
version = "0.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.
|
|
13
|
-
deepstrike-tokenizer = { path = "crates/deepstrike-tokenizer", version = "0.2.1" }
|
|
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.
|
|
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 (
|
|
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 (
|
|
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)
|
|
@@ -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
|
-
|
|
297
|
-
let limit = partition.messages.len().saturating_sub(
|
|
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.
|
|
339
|
+
partition.token_count = partition.token_count.saturating_sub(saved);
|
|
324
340
|
|
|
325
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
643
|
-
|
|
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]
|