dsh-context-compression-improved 0.1.1 → 0.2.1
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.
- package/.gitattributes +1 -0
- package/.github/workflows/ci.yml +39 -0
- package/CHANGELOG.ja.md +39 -0
- package/CHANGELOG.ko.md +39 -0
- package/CHANGELOG.md +135 -0
- package/CHANGELOG.zh.md +39 -0
- package/CONTRIBUTING.md +22 -0
- package/README.ja.md +104 -0
- package/README.ko.md +103 -0
- package/README.md +89 -12
- package/README.zh.md +87 -12
- package/SECURITY.md +18 -0
- package/THIRD_PARTY_NOTICES.md +7 -31
- package/docs/installation.ja.md +76 -0
- package/docs/installation.ko.md +76 -0
- package/docs/installation.md +76 -0
- package/docs/installation.zh.md +76 -0
- package/docs/repair-log.md +582 -0
- package/eslint.config.js +30 -0
- package/package.json +85 -82
- package/packages/selector/LICENSE +21 -0
- package/packages/selector/README.md +26 -0
- package/packages/selector/README.zh.md +26 -0
- package/packages/selector/THIRD_PARTY_NOTICES.md +38 -0
- package/packages/selector/docs/history-tool-call-working-set-spec.md +112 -0
- package/packages/selector/docs/native-tool-result-selector-spec.md +34 -0
- package/packages/selector/docs/subagent-cache-reuse-spec.md +46 -0
- package/packages/selector/lib/style.css +308 -0
- package/packages/selector/package.json +115 -0
- package/{screenshots.json → packages/selector/screenshots.json} +6 -6
- package/packages/selector/src/client/CompressionProfileControls.tsx +229 -0
- package/packages/selector/src/client/CompressionProfileSelector.module.css +170 -0
- package/packages/selector/src/client/CompressionProfileSelector.tsx +79 -0
- package/packages/selector/src/client/CustomPolicyEditor.tsx +216 -0
- package/packages/selector/src/client/EstimatorControls.tsx +281 -0
- package/packages/selector/src/client/decode.ts +49 -0
- package/packages/selector/src/client/index.ts +111 -0
- package/packages/selector/src/client/locales.ts +198 -0
- package/packages/selector/src/client/preset-options.ts +70 -0
- package/packages/selector/src/client/settings-section.tsx +126 -0
- package/packages/selector/src/css-modules.d.ts +6 -0
- package/packages/selector/src/deepseek-v4-tokenizer.ts +210 -0
- package/packages/selector/src/estimator-catalog.ts +104 -0
- package/packages/selector/src/index.ts +327 -0
- package/packages/selector/src/invariant.ts +113 -0
- package/packages/selector/src/preset-overlay.ts +567 -0
- package/packages/selector/src/profiles.ts +342 -0
- package/packages/selector/src/pruner/content.ts +188 -0
- package/packages/selector/src/pruner/session.ts +94 -0
- package/packages/selector/src/pruner/state.ts +43 -0
- package/packages/selector/src/pruner/tuning.ts +23 -0
- package/packages/selector/src/pruner/types.ts +60 -0
- package/packages/selector/src/pruner.ts +2144 -0
- package/packages/selector/src/runtime/adaptive-cost.ts +194 -0
- package/packages/selector/src/runtime/audit.ts +215 -0
- package/packages/selector/src/runtime/config.ts +613 -0
- package/packages/selector/src/runtime/custom-policy.ts +278 -0
- package/packages/selector/src/runtime/deepseek-official-pricing.ts +298 -0
- package/packages/selector/src/runtime/deepseek-v4-vision-tokens.ts +254 -0
- package/packages/selector/src/runtime/measurement.ts +403 -0
- package/packages/selector/src/runtime/reducers.ts +656 -0
- package/packages/selector/src/runtime/retrieve.ts +457 -0
- package/packages/selector/src/runtime/session-events.ts +17 -0
- package/packages/selector/src/runtime/tail-trim.ts +166 -0
- package/packages/selector/src/runtime/token-count.ts +72 -0
- package/packages/selector/src/runtime/tokenpilot/dedup.ts +81 -0
- package/packages/selector/src/runtime/tokenpilot/estimator.ts +183 -0
- package/packages/selector/src/runtime/tokenpilot/locator.ts +128 -0
- package/packages/selector/src/runtime/tokenpilot/read-state.ts +77 -0
- package/packages/selector/src/runtime/types.ts +309 -0
- package/packages/selector/src/runtime/value.ts +48 -0
- package/packages/selector/tests/auto-compact.client.spec.tsx +226 -0
- package/packages/selector/tests/built/client-artifact.spec.ts +51 -0
- package/packages/selector/tests/cache-prefix-audit.spec.ts +123 -0
- package/packages/selector/tests/code-skeleton.client.spec.ts +88 -0
- package/packages/selector/tests/custom-contract.client.spec.ts +202 -0
- package/packages/selector/tests/estimator-catalog.spec.ts +70 -0
- package/packages/selector/tests/estimator-channel.client.spec.tsx +247 -0
- package/packages/selector/tests/estimator-route-registration.host.spec.ts +176 -0
- package/packages/selector/tests/host-preset-overlay.host.spec.ts +204 -0
- package/packages/selector/tests/preset-options-write.client.spec.ts +181 -0
- package/packages/selector/tests/preset-overlay-loader.e2e.host.spec.ts +196 -0
- package/packages/selector/tests/preset-overlay.host.spec.ts +243 -0
- package/packages/selector/tests/profiles.client.spec.tsx +434 -0
- package/packages/selector/tests/public/package-contract.client.spec.ts +33 -0
- package/packages/selector/tests/runtime/adaptive-cost.spec.ts +167 -0
- package/packages/selector/tests/runtime/audit.spec.ts +129 -0
- package/packages/selector/tests/runtime/auto-compact-config.spec.ts +523 -0
- package/packages/selector/tests/runtime/code-skeleton.spec.ts +141 -0
- package/packages/selector/tests/runtime/deepseek-official-pricing.spec.ts +186 -0
- package/packages/selector/tests/runtime/deepseek-v4-tokenizer.spec.ts +122 -0
- package/packages/selector/tests/runtime/deepseek-v4-vision-tokens.spec.ts +122 -0
- package/packages/selector/tests/runtime/fixtures/profile-baseline.json +273 -0
- package/packages/selector/tests/runtime/fixtures/tokenizer-golden.json +106 -0
- package/packages/selector/tests/runtime/fixtures/vision-golden.json +459 -0
- package/packages/selector/tests/runtime/public/public-runtime.spec.ts +2531 -0
- package/packages/selector/tests/runtime/session-events.spec.ts +27 -0
- package/packages/selector/tests/runtime/tokenizer-golden.spec.ts +53 -0
- package/packages/selector/tests/runtime/tokenpilot/dedup.spec.ts +52 -0
- package/packages/selector/tests/runtime/tokenpilot/estimator.spec.ts +56 -0
- package/packages/selector/tests/runtime/tokenpilot/locator.spec.ts +76 -0
- package/packages/selector/tests/runtime/tokenpilot/profile-baseline.spec.ts +100 -0
- package/packages/selector/tests/runtime/tokenpilot/read-state.spec.ts +58 -0
- package/packages/selector/tests/runtime/value.spec.ts +23 -0
- package/packages/selector/tests/standing-generation.host.spec.ts +631 -0
- package/packages/selector/tests/subagent-cache-reuse.host.spec.ts +250 -0
- package/packages/selector/tests/support/cache-prefix-audit.ts +105 -0
- package/packages/selector/tests/support/mock-adapter.ts +37 -0
- package/packages/selector/tests/support/ui-primitives.tsx +34 -0
- package/packages/selector/tsconfig.json +11 -0
- package/packages/selector/tsdown.client.config.ts +102 -0
- package/packages/selector/tsdown.config.ts +20 -0
- package/pnpm-workspace.yaml +19 -0
- package/scripts/capture-profile-baseline.ts +80 -0
- package/scripts/generate-tokenizer-fixtures.py +81 -0
- package/scripts/generate-vision-fixtures.py +208 -0
- package/scripts/packed-components-smoke.ts +713 -0
- package/scripts/packed-install-e2e.ts +1072 -0
- package/scripts/verify-release.ts +300 -0
- package/tests/TEST_INVENTORY.md +42 -0
- package/tsconfig.base.json +18 -0
- package/tsconfig.json +7 -0
- package/tsconfig.scripts.json +13 -0
- package/tsconfig.tests.json +15 -0
- package/vitest.built.config.ts +9 -0
- package/vitest.config.ts +43 -0
- /package/{assets → packages/selector/assets}/deepseek-v4/LICENSE.DeepSeek-V4-Pro.txt +0 -0
- /package/{assets → packages/selector/assets}/deepseek-v4/manifest.json +0 -0
- /package/{assets → packages/selector/assets}/deepseek-v4/tokenizer.json +0 -0
- /package/{assets → packages/selector/assets}/deepseek-v4/tokenizer_config.json +0 -0
- /package/{assets → packages/selector/assets}/deepseek-v4-vision-exp/LICENSE.DeepSeek-V4-Flash-Vision-Exp.txt +0 -0
- /package/{assets → packages/selector/assets}/deepseek-v4-vision-exp/manifest.json +0 -0
- /package/{assets → packages/selector/assets}/deepseek-v4-vision-exp/tokenizer.json +0 -0
- /package/{assets → packages/selector/assets}/deepseek-v4-vision-exp/tokenizer_config.json +0 -0
- /package/{assets → packages/selector/assets}/screenshots/context-compression-selector-profiles.jpg +0 -0
- /package/{assets → packages/selector/assets}/screenshots/context-compression-selector-settings.png +0 -0
- /package/{cordis.patch.yml → packages/selector/cordis.patch.yml} +0 -0
- /package/{dsh.plugin.json → packages/selector/dsh.plugin.json} +0 -0
- /package/{lib → packages/selector/lib}/client.d.ts +0 -0
- /package/{lib → packages/selector/lib}/client.js +0 -0
- /package/{lib → packages/selector/lib}/config.js +0 -0
- /package/{lib → packages/selector/lib}/index.d.ts +0 -0
- /package/{lib → packages/selector/lib}/index.js +0 -0
- /package/{lib → packages/selector/lib}/invariant.d.ts +0 -0
- /package/{lib → packages/selector/lib}/invariant.js +0 -0
- /package/{lib → packages/selector/lib}/pruner.d.ts +0 -0
- /package/{lib → packages/selector/lib}/pruner.js +0 -0
- /package/{lib → packages/selector/lib}/tail-trim.js +0 -0
|
@@ -0,0 +1,713 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
// and cordis augmented services that are not in the scripts tsconfig scope.
|
|
4
|
+
import { realpath } from 'node:fs/promises'
|
|
5
|
+
import { createRequire } from 'node:module'
|
|
6
|
+
import { dirname, sep } from 'node:path'
|
|
7
|
+
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
8
|
+
import { Context } from '@deepseek-ai/cordis'
|
|
9
|
+
import { agentEvents, Inbox } from '@deepseek-ai/dsh-agent'
|
|
10
|
+
import AgentLoop from '@deepseek-ai/dsh-agent-loop'
|
|
11
|
+
import { mountAgentLoopTestDependencies } from '@deepseek-ai/dsh-agent-loop-testkit'
|
|
12
|
+
import BasicCompactionEngine from '@deepseek-ai/dsh-compaction-basic'
|
|
13
|
+
import LlmRuntime, {
|
|
14
|
+
CallId,
|
|
15
|
+
createMessage,
|
|
16
|
+
createUserMessage,
|
|
17
|
+
createToolResultMessage,
|
|
18
|
+
LlmAdapter,
|
|
19
|
+
} from '@deepseek-ai/dsh-llm'
|
|
20
|
+
import SessionStore, { SessionId, canonicalHeader } from '@deepseek-ai/dsh-session'
|
|
21
|
+
import { SettingsProvider, settingsNamespace } from '@deepseek-ai/dsh-settings'
|
|
22
|
+
import SystemPrompt from '@deepseek-ai/dsh-system-prompt'
|
|
23
|
+
import TokenMeter from '@deepseek-ai/dsh-token-meter'
|
|
24
|
+
import ToolRuntime from '@deepseek-ai/dsh-tools'
|
|
25
|
+
|
|
26
|
+
const MODEL = 'deepseek-v4-flash'
|
|
27
|
+
const AUDIT_PREFIX = 'context-compression audit '
|
|
28
|
+
const consumerRoot = await realpath(dirname(fileURLToPath(import.meta.url)))
|
|
29
|
+
const consumerRequire = createRequire(import.meta.url)
|
|
30
|
+
const selectorPackage = consumerRequire.resolve('dsh-context-compression-improved/package.json')
|
|
31
|
+
const selectorRequire = createRequire(selectorPackage)
|
|
32
|
+
const prunerEntry = selectorRequire.resolve('dsh-context-compression-improved/pruner')
|
|
33
|
+
const SelectorHost = await import(pathToFileURL(consumerRequire.resolve('dsh-context-compression-improved')).href)
|
|
34
|
+
const Runtime = await import(pathToFileURL(prunerEntry).href) as typeof import('../packages/selector/src/pruner')
|
|
35
|
+
|
|
36
|
+
const assert = (condition: unknown, message: string): asserts condition => {
|
|
37
|
+
if (!condition) throw new Error(`packed component smoke: ${message}`)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
for (const path of [selectorPackage, prunerEntry]) {
|
|
41
|
+
const resolved = await realpath(path)
|
|
42
|
+
assert(resolved.startsWith(`${consumerRoot}${sep}node_modules${sep}`),
|
|
43
|
+
`product module resolved outside the packed consumer: ${resolved}`)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
class MemorySettings extends SettingsProvider {
|
|
47
|
+
writable = true
|
|
48
|
+
stored: Record<string, unknown> = {}
|
|
49
|
+
|
|
50
|
+
load() {
|
|
51
|
+
return Promise.resolve(structuredClone(this.stored))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
persist(namespace: string, section: unknown) {
|
|
55
|
+
this.stored[namespace] = structuredClone(section)
|
|
56
|
+
return Promise.resolve()
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
class NativeSummaryAdapter extends LlmAdapter {
|
|
61
|
+
responses: string[]
|
|
62
|
+
contextWindow: number
|
|
63
|
+
|
|
64
|
+
constructor(responses: string[], contextWindow: number) {
|
|
65
|
+
super()
|
|
66
|
+
this.responses = [...responses]
|
|
67
|
+
this.contextWindow = contextWindow
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
resolveModel(provider: string, model: string) {
|
|
71
|
+
return Promise.resolve({
|
|
72
|
+
provider,
|
|
73
|
+
id: model,
|
|
74
|
+
name: model,
|
|
75
|
+
context: { contextWindow: this.contextWindow },
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async * stream(options: { signal?: AbortSignal }) {
|
|
80
|
+
options.signal?.throwIfAborted()
|
|
81
|
+
const text = this.responses.shift()
|
|
82
|
+
if (text === undefined) throw new Error('NativeSummaryAdapter response script exhausted')
|
|
83
|
+
yield { type: 'block-start', index: 0, blockType: 'text' } as const
|
|
84
|
+
yield { type: 'text-delta', index: 0, text } as const
|
|
85
|
+
yield { type: 'block-end', index: 0, block: { type: 'text', text } } as const
|
|
86
|
+
yield { type: 'usage', usage: { inputTokens: 10, outputTokens: text.length } } as const
|
|
87
|
+
yield { type: 'finish', reason: { kind: 'stop' } } as const
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function captureAudit(ctx: Context) {
|
|
92
|
+
const records: Array<Record<string, unknown>> = []
|
|
93
|
+
Object.defineProperty(ctx.logger, 'info', {
|
|
94
|
+
configurable: true,
|
|
95
|
+
value(message: unknown) {
|
|
96
|
+
const line = String(message)
|
|
97
|
+
if (line.startsWith(AUDIT_PREFIX)) records.push(JSON.parse(line.slice(AUDIT_PREFIX.length)))
|
|
98
|
+
return ctx.logger
|
|
99
|
+
},
|
|
100
|
+
})
|
|
101
|
+
return records
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function appendToolTurn(
|
|
105
|
+
session: Record<string, unknown>,
|
|
106
|
+
turn: number,
|
|
107
|
+
text: string,
|
|
108
|
+
closeTurn: boolean,
|
|
109
|
+
userText?: string,
|
|
110
|
+
provider = 'deepseek',
|
|
111
|
+
model = MODEL,
|
|
112
|
+
) {
|
|
113
|
+
const callId = CallId(`packed-call-${String(turn)}`)
|
|
114
|
+
session.append('turn/start', { turn })
|
|
115
|
+
if (session.requestHeader() === undefined) {
|
|
116
|
+
session.append('request/header', {
|
|
117
|
+
reason: 'initial',
|
|
118
|
+
header: canonicalHeader({ config: { provider, model } }),
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
if (userText !== undefined) {
|
|
122
|
+
session.append('user/message', createUserMessage({
|
|
123
|
+
content: [{ type: 'text', text: userText }],
|
|
124
|
+
source: { kind: 'user' },
|
|
125
|
+
}), { surfaceOp: 'append' })
|
|
126
|
+
}
|
|
127
|
+
session.append('step/start', { turn, step: 1 })
|
|
128
|
+
const assistant = session.append('assistant/message', {
|
|
129
|
+
turn,
|
|
130
|
+
step: 1,
|
|
131
|
+
message: createMessage({
|
|
132
|
+
role: 'assistant',
|
|
133
|
+
content: [{ type: 'tool-call', id: callId, name: 'bash', arguments: '{}' }],
|
|
134
|
+
source: { kind: 'model', provider, model },
|
|
135
|
+
}),
|
|
136
|
+
}, { surfaceOp: 'append' })
|
|
137
|
+
session.append('tool/call', { turn, step: 1, callId, name: 'bash', arguments: '{}' })
|
|
138
|
+
const result = session.append('tool/result', {
|
|
139
|
+
turn,
|
|
140
|
+
step: 1,
|
|
141
|
+
message: createToolResultMessage({
|
|
142
|
+
callId,
|
|
143
|
+
content: [{ type: 'text', text }],
|
|
144
|
+
isError: false,
|
|
145
|
+
}),
|
|
146
|
+
}, { surfaceOp: 'append' })
|
|
147
|
+
session.append('step/end', { turn, step: 1 })
|
|
148
|
+
if (closeTurn) session.append('turn/end', { turn, reason: { kind: 'completed' } })
|
|
149
|
+
return { assistantSeq: (assistant as { seq: number }).seq, resultSeq: (result as { seq: number }).seq }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function appendToolBatchTurn(
|
|
153
|
+
session: Record<string, unknown>,
|
|
154
|
+
turn: number,
|
|
155
|
+
texts: string[],
|
|
156
|
+
closeTurn: boolean,
|
|
157
|
+
userText?: string,
|
|
158
|
+
) {
|
|
159
|
+
const calls = texts.map((_, index) => ({
|
|
160
|
+
id: CallId(`packed-call-${String(turn)}-${String(index + 1)}`),
|
|
161
|
+
name: 'bash',
|
|
162
|
+
}))
|
|
163
|
+
session.append('turn/start', { turn })
|
|
164
|
+
if (session.requestHeader() === undefined) {
|
|
165
|
+
session.append('request/header', {
|
|
166
|
+
reason: 'initial',
|
|
167
|
+
header: canonicalHeader({ config: { provider: 'deepseek', model: MODEL } }),
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
if (userText !== undefined) {
|
|
171
|
+
session.append('user/message', createUserMessage({
|
|
172
|
+
content: [{ type: 'text', text: userText }],
|
|
173
|
+
source: { kind: 'user' },
|
|
174
|
+
}), { surfaceOp: 'append' })
|
|
175
|
+
}
|
|
176
|
+
session.append('step/start', { turn, step: 1 })
|
|
177
|
+
session.append('assistant/message', {
|
|
178
|
+
turn,
|
|
179
|
+
step: 1,
|
|
180
|
+
message: createMessage({
|
|
181
|
+
role: 'assistant',
|
|
182
|
+
content: calls.map(call => ({
|
|
183
|
+
type: 'tool-call', id: call.id, name: call.name, arguments: '{}',
|
|
184
|
+
})),
|
|
185
|
+
source: { kind: 'model', provider: 'deepseek', model: MODEL },
|
|
186
|
+
}),
|
|
187
|
+
}, { surfaceOp: 'append' })
|
|
188
|
+
for (const [index, call] of calls.entries()) {
|
|
189
|
+
session.append('tool/call', {
|
|
190
|
+
turn, step: 1, callId: call.id, name: call.name, arguments: '{}',
|
|
191
|
+
})
|
|
192
|
+
session.append('tool/result', {
|
|
193
|
+
turn,
|
|
194
|
+
step: 1,
|
|
195
|
+
message: createToolResultMessage({
|
|
196
|
+
callId: call.id,
|
|
197
|
+
content: [{ type: 'text', text: texts[index] ?? '' }],
|
|
198
|
+
isError: false,
|
|
199
|
+
}),
|
|
200
|
+
}, { surfaceOp: 'append' })
|
|
201
|
+
}
|
|
202
|
+
session.append('step/end', { turn, step: 1 })
|
|
203
|
+
if (closeTurn) session.append('turn/end', { turn, reason: { kind: 'completed' } })
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function stubAgent(ctx: Context, session: Record<string, unknown>) {
|
|
207
|
+
return {
|
|
208
|
+
id: (session as { id: string }).id,
|
|
209
|
+
options: {},
|
|
210
|
+
session,
|
|
211
|
+
inbox: new Inbox(session as never, { inserted() {}, discarded() {}, claimed() {} }),
|
|
212
|
+
status: 'idle',
|
|
213
|
+
ctx,
|
|
214
|
+
send() {},
|
|
215
|
+
followup() {},
|
|
216
|
+
steer: () => ({ outcome: Promise.resolve({ status: 'rejected' }) }),
|
|
217
|
+
inject() {},
|
|
218
|
+
cancel() {},
|
|
219
|
+
runMaintenance: (task: (signal: AbortSignal) => void) => task(new AbortController().signal),
|
|
220
|
+
whenIdle: () => Promise.resolve(),
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const ctx = new Context()
|
|
225
|
+
try {
|
|
226
|
+
await ctx.plugin(MemorySettings).await()
|
|
227
|
+
await ctx.plugin(SelectorHost).await()
|
|
228
|
+
await ctx.plugin(LlmRuntime)
|
|
229
|
+
await ctx.plugin(SessionStore)
|
|
230
|
+
await ctx.plugin(SystemPrompt)
|
|
231
|
+
await ctx.plugin(ToolRuntime)
|
|
232
|
+
await ctx.plugin(TokenMeter)
|
|
233
|
+
const audit = captureAudit(ctx)
|
|
234
|
+
|
|
235
|
+
const policy = structuredClone(Runtime.DEFAULT_CUSTOM_COMPRESSION_POLICY)
|
|
236
|
+
assert(policy.version === 3, 'TailTrim requires the public Custom v3 policy')
|
|
237
|
+
policy.fresh = { enabled: true, trigger: 512, target: 256 }
|
|
238
|
+
policy.aggregate = { enabled: true, trigger: 1_000, target: 400 }
|
|
239
|
+
policy.history = {
|
|
240
|
+
enabled: true,
|
|
241
|
+
trigger: 7_800,
|
|
242
|
+
keepRecentToolCalls: 0,
|
|
243
|
+
keepRecentTokens: 1,
|
|
244
|
+
minReclaim: 1,
|
|
245
|
+
}
|
|
246
|
+
policy.prefixPolicy = 'pressure-break'
|
|
247
|
+
policy.tailTrim = { enabled: true, trigger: 8 }
|
|
248
|
+
const namespace = settingsNamespace(Runtime.CONTEXT_COMPRESSION_SETTINGS_NAMESPACE)
|
|
249
|
+
await ctx.settings.update(namespace, { profile: 'custom', custom: policy })
|
|
250
|
+
await ctx.plugin(Runtime.default, {
|
|
251
|
+
profile: 'native',
|
|
252
|
+
nativeTriggerTokens: 100,
|
|
253
|
+
nativeTargetTokens: 64,
|
|
254
|
+
headChars: 8,
|
|
255
|
+
tailChars: 8,
|
|
256
|
+
}).await()
|
|
257
|
+
|
|
258
|
+
const session = ctx.sessions.create(SessionId('packed-components-full-pipeline'))
|
|
259
|
+
appendToolTurn(session as never, 1, 'packed Fresh '.repeat(600), false, 'run packed Fresh')
|
|
260
|
+
ctx.toolResultPruner.pruneSession(session, { stage: 'fresh', freshTurn: 1, freshStep: 1 })
|
|
261
|
+
session.append('turn/end', { turn: 1, reason: { kind: 'completed' } })
|
|
262
|
+
appendToolBatchTurn(
|
|
263
|
+
session as never,
|
|
264
|
+
2,
|
|
265
|
+
Array.from({ length: 30 }, (_, index) => `packed Aggregate ${String(index)} `.repeat(20)),
|
|
266
|
+
false,
|
|
267
|
+
'run packed Aggregate',
|
|
268
|
+
)
|
|
269
|
+
ctx.toolResultPruner.pruneSession(session, { stage: 'fresh', freshTurn: 2, freshStep: 1 })
|
|
270
|
+
session.append('turn/end', { turn: 2, reason: { kind: 'completed' } })
|
|
271
|
+
appendToolTurn(session as never, 3, 'packed History '.repeat(600), true, 'run packed History')
|
|
272
|
+
appendToolTurn(session as never, 4, 'packed recent protected working-set context '.repeat(1000), true, 'retain packed recent context')
|
|
273
|
+
session.append('turn/start', { turn: 5 })
|
|
274
|
+
ctx.toolResultPruner.pruneSession(session, { stage: 'pressure' })
|
|
275
|
+
|
|
276
|
+
const tail = audit.find(record => record.kind === 'rewrite' && record.component === 'tail-trim')
|
|
277
|
+
if (tail === undefined) {
|
|
278
|
+
console.error('TAILTRIM_DIAG', JSON.stringify(audit.filter(record =>
|
|
279
|
+
record.component === 'tail-trim' || record.kind === 'rewrite'), null, 2))
|
|
280
|
+
}
|
|
281
|
+
assert(tail !== undefined, 'TailTrim did not commit from installed Runtime')
|
|
282
|
+
const ref = `session://${String((session as { id: string }).id)}/tailtrim/${String(tail.manifestSeq)}`
|
|
283
|
+
const recovered = await ctx.tools.execute({
|
|
284
|
+
name: 'context_compression_retrieve',
|
|
285
|
+
arguments: { ref, max_lines: 20 },
|
|
286
|
+
callId: CallId('packed-tailtrim-retrieve'),
|
|
287
|
+
signal: new AbortController().signal,
|
|
288
|
+
agent: stubAgent(ctx, session),
|
|
289
|
+
})
|
|
290
|
+
assert(recovered.isError === false, 'installed TailTrim recovery returned an error')
|
|
291
|
+
const recoveredText = recovered.content
|
|
292
|
+
.map((block: { type: string; text?: string }) => block.type === 'text' ? block.text : '')
|
|
293
|
+
.join('\n')
|
|
294
|
+
assert(recoveredText.includes('kind: tailtrim-group'),
|
|
295
|
+
'installed TailTrim recovery did not return a TailTrim group')
|
|
296
|
+
const tailSourcePayloads = (tail.sourceSeqs as number[])
|
|
297
|
+
.map(seq => (session as { events: Record<number, unknown> }).events[seq])
|
|
298
|
+
.filter(event => event !== undefined)
|
|
299
|
+
.map(event => JSON.stringify(event))
|
|
300
|
+
const recoveredMarker = [
|
|
301
|
+
'packed Fresh',
|
|
302
|
+
'packed Aggregate',
|
|
303
|
+
'packed History',
|
|
304
|
+
'packed recent working set',
|
|
305
|
+
].find(marker => tailSourcePayloads.some(payload => payload.includes(marker)))
|
|
306
|
+
assert(recoveredMarker !== undefined,
|
|
307
|
+
'installed TailTrim audit did not identify an original source payload marker')
|
|
308
|
+
assert(recoveredText.includes(recoveredMarker),
|
|
309
|
+
'installed TailTrim recovery did not contain the audited original source payload')
|
|
310
|
+
|
|
311
|
+
const capacityPolicy = structuredClone(policy)
|
|
312
|
+
capacityPolicy.fresh.enabled = false
|
|
313
|
+
capacityPolicy.aggregate.enabled = false
|
|
314
|
+
capacityPolicy.history = {
|
|
315
|
+
enabled: true,
|
|
316
|
+
trigger: 400,
|
|
317
|
+
keepRecentToolCalls: 0,
|
|
318
|
+
keepRecentTokens: 1,
|
|
319
|
+
minReclaim: 1,
|
|
320
|
+
}
|
|
321
|
+
capacityPolicy.prefixPolicy = 'preserve'
|
|
322
|
+
capacityPolicy.tailTrim.enabled = false
|
|
323
|
+
await ctx.settings.update(namespace, { profile: 'custom', custom: capacityPolicy })
|
|
324
|
+
|
|
325
|
+
const inactiveCapacity = ctx.sessions.create(SessionId('packed-history-capacity-inactive'))
|
|
326
|
+
appendToolTurn(inactiveCapacity as never, 1, 'packed capacity inactive '.repeat(600), true)
|
|
327
|
+
appendToolTurn(inactiveCapacity as never, 2, 'packed newest protected result', true)
|
|
328
|
+
inactiveCapacity.append('request/context', {
|
|
329
|
+
provider: 'deepseek',
|
|
330
|
+
model: MODEL,
|
|
331
|
+
contextWindow: 1_000_000,
|
|
332
|
+
})
|
|
333
|
+
inactiveCapacity.append('turn/start', { turn: 3 })
|
|
334
|
+
ctx.toolResultPruner.pruneSession(inactiveCapacity, { stage: 'pressure' })
|
|
335
|
+
const inactiveCapacityAudit = audit.find(record => record.kind === 'component-evaluation'
|
|
336
|
+
&& record.sessionId === String((inactiveCapacity as { id: string }).id)
|
|
337
|
+
&& record.component === 'history')
|
|
338
|
+
assert(inactiveCapacityAudit?.status === 'skipped'
|
|
339
|
+
&& inactiveCapacityAudit.reason === 'below-micro-deadline'
|
|
340
|
+
&& inactiveCapacityAudit.historyMode === 'capacity-pressure',
|
|
341
|
+
'installed History did not prove the inactive capacity-pressure gate')
|
|
342
|
+
|
|
343
|
+
const activeCapacity = ctx.sessions.create(SessionId('packed-history-capacity-active'))
|
|
344
|
+
appendToolTurn(activeCapacity as never, 1, 'packed capacity active '.repeat(600), true)
|
|
345
|
+
appendToolTurn(activeCapacity as never, 2, 'packed newest protected result', true)
|
|
346
|
+
const activeCapacityWindow = Math.floor(ctx.tokenMeter.measure(activeCapacity).totalTokens / 0.75)
|
|
347
|
+
activeCapacity.append('request/context', {
|
|
348
|
+
provider: 'deepseek',
|
|
349
|
+
model: MODEL,
|
|
350
|
+
contextWindow: activeCapacityWindow,
|
|
351
|
+
})
|
|
352
|
+
activeCapacity.append('turn/start', { turn: 3 })
|
|
353
|
+
ctx.toolResultPruner.pruneSession(activeCapacity, { stage: 'pressure' })
|
|
354
|
+
const capacityRewrite = audit.find(record => record.kind === 'rewrite'
|
|
355
|
+
&& record.sessionId === String((activeCapacity as { id: string }).id)
|
|
356
|
+
&& record.component === 'history')
|
|
357
|
+
assert(capacityRewrite?.historyMode === 'capacity-pressure'
|
|
358
|
+
&& capacityRewrite.stage === 'pressure'
|
|
359
|
+
&& typeof capacityRewrite.reducer === 'string'
|
|
360
|
+
&& Number.isSafeInteger(capacityRewrite.tokensBefore)
|
|
361
|
+
&& Number.isSafeInteger(capacityRewrite.tokensAfter)
|
|
362
|
+
&& (capacityRewrite.tokensBefore as number) > (capacityRewrite.tokensAfter as number),
|
|
363
|
+
'installed History did not commit exact capacity-pressure evidence')
|
|
364
|
+
|
|
365
|
+
const boundaryCtx = new Context()
|
|
366
|
+
try {
|
|
367
|
+
await mountAgentLoopTestDependencies(boundaryCtx)
|
|
368
|
+
await boundaryCtx.plugin(AgentLoop, { agents: [] })
|
|
369
|
+
await boundaryCtx.plugin(TokenMeter)
|
|
370
|
+
const boundaryAudit = captureAudit(boundaryCtx)
|
|
371
|
+
boundaryCtx.llm.registerAdapter(
|
|
372
|
+
['deepseek'],
|
|
373
|
+
new NativeSummaryAdapter(['packed Cache Strict pressure pass complete'], 100),
|
|
374
|
+
)
|
|
375
|
+
await boundaryCtx.plugin(Runtime.default, {
|
|
376
|
+
profile: 'cache-strict',
|
|
377
|
+
freshTriggerTokens: 100_000,
|
|
378
|
+
freshTargetTokens: 90_000,
|
|
379
|
+
aggregateTriggerTokens: 100_000,
|
|
380
|
+
aggregateTargetTokens: 90_000,
|
|
381
|
+
historyTriggerTokens: 400,
|
|
382
|
+
historyKeepRecentToolCalls: 0,
|
|
383
|
+
historyKeepRecentTokens: 1,
|
|
384
|
+
historyMinReclaimTokens: 1,
|
|
385
|
+
}).await()
|
|
386
|
+
const boundaryAgent = boundaryCtx.agentLoop.create(
|
|
387
|
+
SessionId('packed-history-capacity-request-boundary'),
|
|
388
|
+
{ provider: 'deepseek', model: MODEL },
|
|
389
|
+
)
|
|
390
|
+
const boundarySession = boundaryAgent.session
|
|
391
|
+
appendToolTurn(boundarySession as never, 1, 'packed old capacity-pressure evidence '.repeat(600), true)
|
|
392
|
+
appendToolTurn(boundarySession as never, 2, 'packed newest protected result', true)
|
|
393
|
+
const boundaryTotal = boundaryCtx.tokenMeter.measure(boundarySession).totalTokens
|
|
394
|
+
boundarySession.append('request/context', {
|
|
395
|
+
provider: 'deepseek',
|
|
396
|
+
model: MODEL,
|
|
397
|
+
contextWindow: Math.floor(boundaryTotal / 0.72),
|
|
398
|
+
})
|
|
399
|
+
boundaryAgent.followup(createUserMessage({
|
|
400
|
+
content: [{ type: 'text', text: 'run packed Cache Strict pressure pass' }],
|
|
401
|
+
source: { kind: 'user' },
|
|
402
|
+
}))
|
|
403
|
+
await boundaryAgent.whenIdle()
|
|
404
|
+
const boundaryRewrite = boundaryAudit.find(record => record.kind === 'rewrite'
|
|
405
|
+
&& record.sessionId === String((boundarySession as { id: string }).id)
|
|
406
|
+
&& record.component === 'history')
|
|
407
|
+
assert(boundaryRewrite?.stage === 'pressure'
|
|
408
|
+
&& boundaryRewrite.historyMode === 'capacity-pressure'
|
|
409
|
+
&& (boundaryRewrite.tokensBefore as number) > (boundaryRewrite.tokensAfter as number),
|
|
410
|
+
'installed Cache Strict did not schedule History from the real request boundary')
|
|
411
|
+
} finally {
|
|
412
|
+
await boundaryCtx.fiber.dispose()
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Packed vision-session gate
|
|
416
|
+
const VISION_MODEL = 'deepseek-v4-flash-vision-exp'
|
|
417
|
+
const VISION_TOKENIZER_REPOSITORY = 'deepseek-ai/DeepSeek-V4-Flash-Vision-Exp'
|
|
418
|
+
const VISION_TOKENIZER_REVISION = '6821d6ad3681a4b137b066b76094fa82ebd0a380'
|
|
419
|
+
const imageBlock = (width: number, height: number) => ({
|
|
420
|
+
type: 'image',
|
|
421
|
+
attachment: {
|
|
422
|
+
attachmentId: `packed-image-${String(width)}x${String(height)}`,
|
|
423
|
+
mediaType: 'image/png',
|
|
424
|
+
bytes: 1_024,
|
|
425
|
+
width,
|
|
426
|
+
height,
|
|
427
|
+
},
|
|
428
|
+
})
|
|
429
|
+
const visionCtx = new Context()
|
|
430
|
+
try {
|
|
431
|
+
await visionCtx.plugin(MemorySettings).await()
|
|
432
|
+
await visionCtx.plugin(SelectorHost).await()
|
|
433
|
+
await visionCtx.plugin(LlmRuntime)
|
|
434
|
+
await visionCtx.plugin(SessionStore)
|
|
435
|
+
await visionCtx.plugin(SystemPrompt)
|
|
436
|
+
await visionCtx.plugin(ToolRuntime)
|
|
437
|
+
await visionCtx.plugin(TokenMeter)
|
|
438
|
+
const visionAudit = captureAudit(visionCtx)
|
|
439
|
+
await visionCtx.plugin(Runtime.default, {
|
|
440
|
+
profile: 'balanced',
|
|
441
|
+
freshTriggerTokens: 1_000_000,
|
|
442
|
+
freshTargetTokens: 900_000,
|
|
443
|
+
aggregateTriggerTokens: 100,
|
|
444
|
+
aggregateTargetTokens: 64,
|
|
445
|
+
historyTriggerTokens: 600,
|
|
446
|
+
historyKeepRecentToolCalls: 0,
|
|
447
|
+
historyKeepRecentTokens: 1,
|
|
448
|
+
historyMinReclaimTokens: 1,
|
|
449
|
+
}).await()
|
|
450
|
+
|
|
451
|
+
// (a) A user image plus pure-text tool results
|
|
452
|
+
const visionText = visionCtx.sessions.create(SessionId('packed-vision-text-session'))
|
|
453
|
+
visionText.append('turn/start', { turn: 1 })
|
|
454
|
+
visionText.append('request/header', {
|
|
455
|
+
reason: 'initial',
|
|
456
|
+
header: canonicalHeader({ config: { provider: 'deepseek', model: VISION_MODEL } }),
|
|
457
|
+
})
|
|
458
|
+
visionText.append('user/message', createUserMessage({
|
|
459
|
+
content: [
|
|
460
|
+
imageBlock(640, 480),
|
|
461
|
+
{ type: 'text', text: 'describe the attachment and run the tools' },
|
|
462
|
+
],
|
|
463
|
+
source: { kind: 'user' },
|
|
464
|
+
}), { surfaceOp: 'append' })
|
|
465
|
+
visionText.append('step/start', { turn: 1, step: 1 })
|
|
466
|
+
visionText.append('assistant/message', {
|
|
467
|
+
turn: 1,
|
|
468
|
+
step: 1,
|
|
469
|
+
message: createMessage({
|
|
470
|
+
role: 'assistant',
|
|
471
|
+
content: [{ type: 'tool-call', id: CallId('packed-vision-call-1'), name: 'bash', arguments: '{}' }],
|
|
472
|
+
source: { kind: 'model', provider: 'deepseek', model: VISION_MODEL },
|
|
473
|
+
}),
|
|
474
|
+
}, { surfaceOp: 'append' })
|
|
475
|
+
visionText.append('tool/call', { turn: 1, step: 1, callId: CallId('packed-vision-call-1'), name: 'bash', arguments: '{}' })
|
|
476
|
+
visionText.append('tool/result', {
|
|
477
|
+
turn: 1,
|
|
478
|
+
step: 1,
|
|
479
|
+
message: createToolResultMessage({
|
|
480
|
+
callId: CallId('packed-vision-call-1'),
|
|
481
|
+
content: [{ type: 'text', text: 'packed vision fresh evidence '.repeat(1_000) }],
|
|
482
|
+
isError: false,
|
|
483
|
+
}),
|
|
484
|
+
}, { surfaceOp: 'append' })
|
|
485
|
+
visionText.append('step/end', { turn: 1, step: 1 })
|
|
486
|
+
visionText.append('turn/end', { turn: 1, reason: { kind: 'completed' } })
|
|
487
|
+
appendToolTurn(visionText as never, 2, 'packed vision history evidence '.repeat(300), true, undefined, 'deepseek', VISION_MODEL)
|
|
488
|
+
appendToolTurn(visionText as never, 3, 'packed recent protected result', true, undefined, 'deepseek', VISION_MODEL)
|
|
489
|
+
visionText.append('turn/start', { turn: 4 })
|
|
490
|
+
const visionFresh = visionCtx.toolResultPruner.pruneSession(visionText, { stage: 'fresh', freshTurn: 1, freshStep: 1 })
|
|
491
|
+
const visionPressure = visionCtx.toolResultPruner.pruneSession(visionText, { stage: 'pressure' })
|
|
492
|
+
assert(visionFresh.pruned.length === 1 && visionPressure.pruned.length >= 1,
|
|
493
|
+
'packed vision text session did not rewrite pure-text results')
|
|
494
|
+
const visionRewrites = visionAudit
|
|
495
|
+
.filter(record => record.kind === 'rewrite' && record.sessionId === String((visionText as { id: string }).id))
|
|
496
|
+
assert(visionRewrites.length >= 2, 'packed vision text session lacks aggregate and history rewrites')
|
|
497
|
+
for (const record of visionRewrites) {
|
|
498
|
+
assert(record.tokenizerId === VISION_TOKENIZER_REPOSITORY
|
|
499
|
+
&& record.tokenizerRevision === VISION_TOKENIZER_REVISION,
|
|
500
|
+
`packed vision rewrite used tokenizer ${String(record.tokenizerId)}@${String(record.tokenizerRevision)}`)
|
|
501
|
+
}
|
|
502
|
+
assert(visionRewrites.some(record => record.component === 'aggregate')
|
|
503
|
+
&& visionRewrites.some(record => record.component === 'history'),
|
|
504
|
+
'packed vision text session lacks an aggregate/history component rewrite')
|
|
505
|
+
|
|
506
|
+
// (b) An image-bearing tool result
|
|
507
|
+
const visionImage = visionCtx.sessions.create(SessionId('packed-vision-image-tool-result'))
|
|
508
|
+
visionImage.append('turn/start', { turn: 1 })
|
|
509
|
+
visionImage.append('request/header', {
|
|
510
|
+
reason: 'initial',
|
|
511
|
+
header: canonicalHeader({ config: { provider: 'deepseek', model: VISION_MODEL } }),
|
|
512
|
+
})
|
|
513
|
+
const estimatedUserImage = visionImage.append('user/message', createUserMessage({
|
|
514
|
+
content: [imageBlock(800, 600)],
|
|
515
|
+
source: { kind: 'user' },
|
|
516
|
+
}), { surfaceOp: 'append' })
|
|
517
|
+
visionImage.append('step/start', { turn: 1, step: 1 })
|
|
518
|
+
visionImage.append('assistant/message', {
|
|
519
|
+
turn: 1,
|
|
520
|
+
step: 1,
|
|
521
|
+
message: createMessage({
|
|
522
|
+
role: 'assistant',
|
|
523
|
+
content: [{ type: 'tool-call', id: CallId('packed-vision-image-call'), name: 'screenshot', arguments: '{}' }],
|
|
524
|
+
source: { kind: 'model', provider: 'deepseek', model: VISION_MODEL },
|
|
525
|
+
}),
|
|
526
|
+
}, { surfaceOp: 'append' })
|
|
527
|
+
visionImage.append('tool/call', { turn: 1, step: 1, callId: CallId('packed-vision-image-call'), name: 'screenshot', arguments: '{}' })
|
|
528
|
+
const imageResult = visionImage.append('tool/result', {
|
|
529
|
+
turn: 1,
|
|
530
|
+
step: 1,
|
|
531
|
+
message: createToolResultMessage({
|
|
532
|
+
callId: CallId('packed-vision-image-call'),
|
|
533
|
+
content: [
|
|
534
|
+
{ type: 'text', text: 'packed screenshot captured' },
|
|
535
|
+
imageBlock(800, 600),
|
|
536
|
+
],
|
|
537
|
+
isError: false,
|
|
538
|
+
}),
|
|
539
|
+
}, { surfaceOp: 'append' })
|
|
540
|
+
visionImage.append('step/end', { turn: 1, step: 1 })
|
|
541
|
+
visionImage.append('turn/end', { turn: 1, reason: { kind: 'completed' } })
|
|
542
|
+
visionImage.append('turn/start', { turn: 2 })
|
|
543
|
+
const imageFresh = visionCtx.toolResultPruner.pruneSession(visionImage, { stage: 'fresh', freshTurn: 1, freshStep: 1 })
|
|
544
|
+
const imagePressure = visionCtx.toolResultPruner.pruneSession(visionImage, { stage: 'pressure' })
|
|
545
|
+
assert(imageFresh.pruned.length === 0 && imagePressure.pruned.length === 0,
|
|
546
|
+
'packed vision image-bearing result was rewritten lossily')
|
|
547
|
+
const imageMeasurement = Runtime.measureForCompaction(visionCtx, visionImage)
|
|
548
|
+
const estimatedImageCount = imageMeasurement.measuredNodes
|
|
549
|
+
.find((node: { seq: number }) => node.seq === (estimatedUserImage as { seq: number }).seq)?.count
|
|
550
|
+
assert(estimatedImageCount?.kind === 'tokenizer-estimate',
|
|
551
|
+
`packed vision image surface is ${String(estimatedImageCount?.kind)}, expected tokenizer-estimate`)
|
|
552
|
+
assert(estimatedImageCount.tokens === 340,
|
|
553
|
+
`packed vision 800x600 estimate is ${String(estimatedImageCount.tokens)}, expected 340`)
|
|
554
|
+
assert(estimatedImageCount.upperBoundTokens === 384,
|
|
555
|
+
`packed vision image upper bound is ${String(estimatedImageCount.upperBoundTokens)}, expected 384`)
|
|
556
|
+
assert(estimatedImageCount.estimatorId === `${VISION_TOKENIZER_REPOSITORY}/image-token-estimate`,
|
|
557
|
+
`packed vision image estimator id is ${String(estimatedImageCount.estimatorId)}`)
|
|
558
|
+
assert(estimatedImageCount.estimatorRevision === `${VISION_TOKENIZER_REVISION}:v1`,
|
|
559
|
+
`packed vision image estimator revision is ${String(estimatedImageCount.estimatorRevision)}`)
|
|
560
|
+
assert(imageMeasurement.currentSurface.kind === 'tokenizer-estimate',
|
|
561
|
+
`packed vision current surface is ${imageMeasurement.currentSurface.kind}, expected tokenizer-estimate`)
|
|
562
|
+
const originalImage = (visionImage as { events: Record<number, unknown> }).events[(imageResult as { seq: number }).seq]
|
|
563
|
+
assert((originalImage as { type: string })?.type === 'tool/result'
|
|
564
|
+
&& JSON.stringify(originalImage).includes('packed-image-800x600')
|
|
565
|
+
&& JSON.stringify(originalImage).includes('"type":"image"'),
|
|
566
|
+
'packed vision image-bearing result is no longer intact on the surface')
|
|
567
|
+
for (const component of ['fresh', 'history']) {
|
|
568
|
+
assert(visionAudit.some(record => record.kind === 'component-evaluation'
|
|
569
|
+
&& record.sessionId === String((visionImage as { id: string }).id)
|
|
570
|
+
&& record.component === component
|
|
571
|
+
&& record.status === 'skipped'
|
|
572
|
+
&& record.reason === 'exact-tokenizer-unavailable'),
|
|
573
|
+
`packed vision image session lacks the ${component} exact-tokenizer-unavailable audit`)
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
console.info(`PACKED_VISION_E2E ${JSON.stringify({
|
|
577
|
+
model: VISION_MODEL,
|
|
578
|
+
tokenizer: { repository: VISION_TOKENIZER_REPOSITORY, revision: VISION_TOKENIZER_REVISION },
|
|
579
|
+
textSession: 'exact-rewrites-with-vision-tokenizer',
|
|
580
|
+
imageSession: {
|
|
581
|
+
measurement: estimatedImageCount,
|
|
582
|
+
currentSurfaceKind: imageMeasurement.currentSurface.kind,
|
|
583
|
+
exactRewriteIneligible: true,
|
|
584
|
+
originalIntact: true,
|
|
585
|
+
},
|
|
586
|
+
})}`)
|
|
587
|
+
} finally {
|
|
588
|
+
await visionCtx.fiber.dispose()
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
const beforeNative = ctx.tokenMeter.measure(session).totalTokens
|
|
592
|
+
assert(beforeNative > 2, 'installed pipeline has no Native pressure')
|
|
593
|
+
ctx.llm.registerAdapter(['deepseek'], new NativeSummaryAdapter(['packed native summary'], beforeNative))
|
|
594
|
+
void new BasicCompactionEngine(ctx, {
|
|
595
|
+
auto: true,
|
|
596
|
+
thresholdRatio: 0.5,
|
|
597
|
+
retainTokens: 0,
|
|
598
|
+
maxTokens: 100,
|
|
599
|
+
compactionRetries: 0,
|
|
600
|
+
})
|
|
601
|
+
const decision = await agentEvents(ctx, stubAgent(ctx, session)).waterfall(
|
|
602
|
+
'agent/pre-step',
|
|
603
|
+
{ messages: [], turn: 5, step: 1, signal: new AbortController().signal },
|
|
604
|
+
() => Promise.resolve({ kind: 'enter', messages: [] }),
|
|
605
|
+
)
|
|
606
|
+
assert(decision.kind === 'enter', 'Native pre-step did not return enter')
|
|
607
|
+
assert(session.events.some((event: { type: string }) => event.type === 'compaction/summary'),
|
|
608
|
+
'official BasicCompactionEngine did not commit Native summary')
|
|
609
|
+
|
|
610
|
+
await ctx.settings.update(namespace, { profile: 'native' })
|
|
611
|
+
const nativeSession = ctx.sessions.create(SessionId('packed-native-tool-result'))
|
|
612
|
+
appendToolTurn(nativeSession as never, 1, 'packed native tool result '.repeat(800), false)
|
|
613
|
+
const nativeResult = ctx.toolResultPruner.pruneSession(nativeSession, { stage: 'pressure' })
|
|
614
|
+
assert(nativeResult.pruned.length === 1, 'installed Native tool-result profile did not rewrite')
|
|
615
|
+
|
|
616
|
+
const firstFrozen = structuredClone(policy)
|
|
617
|
+
firstFrozen.fresh = { enabled: true, trigger: 512, target: 256 }
|
|
618
|
+
firstFrozen.aggregate.enabled = false
|
|
619
|
+
firstFrozen.history.enabled = false
|
|
620
|
+
firstFrozen.tailTrim.enabled = false
|
|
621
|
+
await ctx.settings.update(namespace, { profile: 'custom', custom: firstFrozen })
|
|
622
|
+
const frozenA = ctx.sessions.create(SessionId('packed-policy-freeze-a'))
|
|
623
|
+
appendToolTurn(frozenA as never, 1, 'packed frozen first '.repeat(800), false)
|
|
624
|
+
assert(ctx.toolResultPruner.pruneSession(frozenA, {
|
|
625
|
+
stage: 'fresh', freshTurn: 1, freshStep: 1,
|
|
626
|
+
}).pruned.length === 1, 'first frozen policy did not run Fresh')
|
|
627
|
+
const edited = structuredClone(firstFrozen)
|
|
628
|
+
edited.fresh.enabled = false
|
|
629
|
+
edited.history.trigger += 123
|
|
630
|
+
await ctx.settings.update(namespace, { custom: edited })
|
|
631
|
+
frozenA.append('turn/end', { turn: 1, reason: { kind: 'completed' } })
|
|
632
|
+
appendToolTurn(frozenA as never, 2, 'packed frozen second '.repeat(800), false)
|
|
633
|
+
assert(ctx.toolResultPruner.pruneSession(frozenA, {
|
|
634
|
+
stage: 'fresh', freshTurn: 2, freshStep: 1,
|
|
635
|
+
}).pruned.length === 1, 'observed Session did not retain its complete frozen policy')
|
|
636
|
+
const frozenB = ctx.sessions.create(SessionId('packed-policy-freeze-b'))
|
|
637
|
+
appendToolTurn(frozenB as never, 1, 'packed new disabled Fresh '.repeat(800), false)
|
|
638
|
+
assert(ctx.toolResultPruner.pruneSession(frozenB, {
|
|
639
|
+
stage: 'fresh', freshTurn: 1, freshStep: 1,
|
|
640
|
+
}).pruned.length === 0, 'new Session did not adopt the edited complete policy')
|
|
641
|
+
|
|
642
|
+
const rewrites = audit.filter(record => record.kind === 'rewrite')
|
|
643
|
+
const firstIndex = (component: string) => audit.findIndex(record => record.kind === 'rewrite'
|
|
644
|
+
&& record.sessionId === String((session as { id: string }).id) && record.component === component)
|
|
645
|
+
for (const component of ['fresh', 'aggregate', 'history', 'tail-trim']) {
|
|
646
|
+
assert(firstIndex(component) >= 0, `installed pipeline lacks ${component} rewrite`)
|
|
647
|
+
}
|
|
648
|
+
const routineHistory = rewrites.find(record => record.sessionId === String((session as { id: string }).id)
|
|
649
|
+
&& record.component === 'history')
|
|
650
|
+
assert(routineHistory?.historyMode === 'routine',
|
|
651
|
+
'installed full pipeline did not identify routine History')
|
|
652
|
+
assert(firstIndex('fresh') < firstIndex('aggregate')
|
|
653
|
+
&& firstIndex('aggregate') < firstIndex('history')
|
|
654
|
+
&& firstIndex('history') < firstIndex('tail-trim'),
|
|
655
|
+
'installed component rewrite order is wrong')
|
|
656
|
+
const pipelineRewrites = rewrites.filter(record => record.sessionId === String((session as { id: string }).id))
|
|
657
|
+
assert(pipelineRewrites.every(record => Number.isSafeInteger(record.tokensBefore)
|
|
658
|
+
&& Number.isSafeInteger(record.tokensAfter) && (record.tokensBefore as number) > (record.tokensAfter as number)),
|
|
659
|
+
'installed rewrite lacks exact decreasing token evidence')
|
|
660
|
+
assert(audit.some(record => record.kind === 'native-auto-compact'
|
|
661
|
+
&& record.sessionId === String((session as { id: string }).id)),
|
|
662
|
+
'installed Runtime did not audit official Native summary')
|
|
663
|
+
assert(rewrites.some(record => record.component === 'native-tool-result'
|
|
664
|
+
&& record.sessionId === String((nativeSession as { id: string }).id)),
|
|
665
|
+
'installed Runtime lacks Native tool-result audit')
|
|
666
|
+
const frozenAuditA = audit.find(record => record.kind === 'policy-frozen'
|
|
667
|
+
&& record.sessionId === String((frozenA as { id: string }).id))
|
|
668
|
+
const frozenAuditB = audit.find(record => record.kind === 'policy-frozen'
|
|
669
|
+
&& record.sessionId === String((frozenB as { id: string }).id))
|
|
670
|
+
assert((frozenAuditA?.settings as Record<string, Record<string, Record<string, unknown>>>)?.custom?.fresh?.enabled === true,
|
|
671
|
+
'first installed policy-frozen record lacks original complete settings')
|
|
672
|
+
assert((frozenAuditB?.settings as Record<string, Record<string, Record<string, unknown>>>)?.custom?.fresh?.enabled === false,
|
|
673
|
+
'new installed policy-frozen record lacks edited complete settings')
|
|
674
|
+
|
|
675
|
+
console.info(`PACKED_COMPONENTS_E2E ${JSON.stringify({
|
|
676
|
+
productImports: 'consumer-node_modules',
|
|
677
|
+
components: ['fresh', 'aggregate', 'history', 'tail-trim', 'native-tool-result'],
|
|
678
|
+
coreNative: 'compaction/summary',
|
|
679
|
+
tailTrimRecovery: 'original-group-recovered',
|
|
680
|
+
policyFreeze: 'old-session-retained-new-session-adopted',
|
|
681
|
+
exactTokenEvidence: 'before-greater-than-after',
|
|
682
|
+
historyModes: {
|
|
683
|
+
routine: {
|
|
684
|
+
stage: routineHistory.stage,
|
|
685
|
+
reducer: routineHistory.reducer,
|
|
686
|
+
tokensBefore: routineHistory.tokensBefore,
|
|
687
|
+
tokensAfter: routineHistory.tokensAfter,
|
|
688
|
+
},
|
|
689
|
+
capacityPressure: {
|
|
690
|
+
inactiveReason: inactiveCapacityAudit.reason,
|
|
691
|
+
stage: capacityRewrite.stage,
|
|
692
|
+
reducer: capacityRewrite.reducer,
|
|
693
|
+
tokensBefore: capacityRewrite.tokensBefore,
|
|
694
|
+
tokensAfter: capacityRewrite.tokensAfter,
|
|
695
|
+
},
|
|
696
|
+
capacityPressureRequestBoundary: 'scheduled-history-rewrite',
|
|
697
|
+
},
|
|
698
|
+
rewriteEvidence: ['fresh', 'aggregate', 'history', 'tail-trim'].map(component => {
|
|
699
|
+
const record = pipelineRewrites.find(candidate => candidate.component === component)
|
|
700
|
+
assert(record !== undefined, `installed Runtime lacks ${component} rewrite evidence`)
|
|
701
|
+
return {
|
|
702
|
+
component: record.component,
|
|
703
|
+
stage: record.stage,
|
|
704
|
+
reducer: record.reducer,
|
|
705
|
+
tokensBefore: record.tokensBefore,
|
|
706
|
+
tokensAfter: record.tokensAfter,
|
|
707
|
+
}
|
|
708
|
+
}),
|
|
709
|
+
customEvents: (session.events as Array<{ type: string }>).some(event => event.type === 'compaction/group-trim') ? 'present' : 'absent',
|
|
710
|
+
})}`)
|
|
711
|
+
} finally {
|
|
712
|
+
await ctx.fiber.dispose()
|
|
713
|
+
}
|