Skip to content

Commit 38dc7f4

Browse files
authored
Merge pull request #386 from Opencode-DCP/cleanup/context-limit-hints
Cleanup/context limit hints
2 parents aa60c0d + 83907c2 commit 38dc7f4

13 files changed

Lines changed: 412 additions & 421 deletions

File tree

lib/commands/sweep.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export async function handleSweepCommand(ctx: SweepCommandContext): Promise<void
128128
const protectedTools = config.commands.protectedTools
129129

130130
syncToolCache(state, config, logger, messages)
131-
buildToolIdList(state, messages, logger)
131+
buildToolIdList(state, messages)
132132

133133
// Parse optional numeric argument
134134
const numArg = args[0] ? parseInt(args[0], 10) : null

lib/hooks.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { PluginConfig } from "./config"
44
import { syncToolCache } from "./state/tool-cache"
55
import { deduplicate, supersedeWrites, purgeErrors } from "./strategies"
66
import { prune, insertCompressToolContext } from "./messages"
7-
import { buildToolIdList, isIgnoredUserMessage, annotateContext } from "./messages/utils"
7+
import { buildToolIdList, isIgnoredUserMessage } from "./messages/utils"
88
import { checkSession } from "./state"
99
import { renderSystemPrompt } from "./prompts"
1010
import { handleStatsCommand } from "./commands/stats"
@@ -108,7 +108,7 @@ export function createChatMessageTransformHandler(
108108
}
109109

110110
syncToolCache(state, config, logger, output.messages)
111-
buildToolIdList(state, output.messages, logger)
111+
buildToolIdList(state, output.messages)
112112

113113
deduplicate(state, logger, config, output.messages)
114114
supersedeWrites(state, logger, config, output.messages)
@@ -118,7 +118,6 @@ export function createChatMessageTransformHandler(
118118

119119
insertCompressToolContext(state, config, logger, output.messages)
120120

121-
annotateContext(output.messages)
122121
applyPendingManualTriggerPrompt(state, output.messages, logger)
123122

124123
if (state.sessionId) {

lib/messages/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export { prune } from "./prune"
2-
export { insertCompressToolContext } from "./inject"
2+
export { insertCompressToolContext } from "./inject/inject"

lib/messages/inject.ts

Lines changed: 0 additions & 246 deletions
This file was deleted.

lib/messages/inject/inject.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import type { SessionState, WithParts } from "../../state"
2+
import type { Logger } from "../../logger"
3+
import type { PluginConfig } from "../../config"
4+
import {
5+
addAnchor,
6+
applyAnchoredHints,
7+
findLastNonIgnoredMessage,
8+
getLimitNudgeInterval,
9+
getModelInfo,
10+
isContextOverLimit,
11+
messageHasCompress,
12+
persistAnchors,
13+
} from "./utils"
14+
15+
const CONTEXT_LIMIT_HINT_TEXT = "your context exceeds the context limit, you must compress"
16+
17+
export const insertCompressToolContext = (
18+
state: SessionState,
19+
config: PluginConfig,
20+
logger: Logger,
21+
messages: WithParts[],
22+
): void => {
23+
if (config.tools.compress.permission === "deny") {
24+
return
25+
}
26+
27+
const lastAssistantMessage = messages.findLast((message) => message.info.role === "assistant")
28+
if (lastAssistantMessage && messageHasCompress(lastAssistantMessage)) {
29+
return
30+
}
31+
32+
const { providerId, modelId } = getModelInfo(messages)
33+
let anchorsChanged = false
34+
35+
if (isContextOverLimit(config, state, providerId, modelId, messages)) {
36+
const lastNonIgnoredMessage = findLastNonIgnoredMessage(messages)
37+
if (lastNonIgnoredMessage) {
38+
const interval = getLimitNudgeInterval(config)
39+
const added = addAnchor(
40+
state.contextLimitAnchors,
41+
lastNonIgnoredMessage.message.info.id,
42+
lastNonIgnoredMessage.index,
43+
messages,
44+
interval,
45+
)
46+
if (added) {
47+
anchorsChanged = true
48+
}
49+
}
50+
}
51+
52+
applyAnchoredHints(state.contextLimitAnchors, messages, modelId, CONTEXT_LIMIT_HINT_TEXT)
53+
54+
if (anchorsChanged) {
55+
persistAnchors(state, logger)
56+
}
57+
}

0 commit comments

Comments
 (0)