File size: 2,312 Bytes
064bfd6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import {
getCachedMCConfig,
type CachedMCConfig,
} from './cachedMCConfig.js'
export type CacheEditsBlock = {
type: 'cache_edits'
edits: { type: 'delete'; cache_reference: string }[]
}
export type PinnedCacheEdits = {
userMessageIndex: number
block: CacheEditsBlock
}
export type CachedMCState = {
pinnedEdits: PinnedCacheEdits[]
registeredTools: Set<string>
toolOrder: string[]
deletedRefs: Set<string>
}
export function createCachedMCState(): CachedMCState {
return {
pinnedEdits: [],
registeredTools: new Set(),
toolOrder: [],
deletedRefs: new Set(),
}
}
export function isCachedMicrocompactEnabled(): boolean {
return getCachedMCConfig().enabled
}
export function isModelSupportedForCacheEditing(model: string): boolean {
return getCachedMCConfig().supportedModels.some(pattern =>
model.includes(pattern),
)
}
export { getCachedMCConfig }
export type { CachedMCConfig }
export function registerToolResult(
state: CachedMCState,
toolUseId: string,
): void {
if (state.registeredTools.has(toolUseId)) {
return
}
state.registeredTools.add(toolUseId)
state.toolOrder.push(toolUseId)
}
export function registerToolMessage(
_state: CachedMCState,
_toolUseIds: string[],
): void {}
export function getToolResultsToDelete(state: CachedMCState): string[] {
const config = getCachedMCConfig()
const activeRefs = state.toolOrder.filter(id => !state.deletedRefs.has(id))
if (!config.enabled || activeRefs.length < config.triggerThreshold) {
return []
}
return activeRefs.slice(0, Math.max(0, activeRefs.length - config.keepRecent))
}
export function createCacheEditsBlock(
state: CachedMCState,
toolUseIds: string[],
): CacheEditsBlock | null {
const edits = toolUseIds
.filter(id => !state.deletedRefs.has(id))
.map(id => {
state.deletedRefs.add(id)
return {
type: 'delete' as const,
cache_reference: id,
}
})
if (edits.length === 0) {
return null
}
return {
type: 'cache_edits',
edits,
}
}
export function markToolsSentToAPI(_state: CachedMCState): void {}
export function resetCachedMCState(state: CachedMCState): void {
state.pinnedEdits.length = 0
state.registeredTools.clear()
state.toolOrder.length = 0
state.deletedRefs.clear()
}
|