codeburn/tests/opencode-route-cache-invalidation.test.ts
Ulises 5fe803440a
feat(cli): filter usage by billing route and mode (#1486)
* feat(cli): filter usage by billing route and mode

Carry provider-observed billing provenance through Hermes and the session cache, register the real OpenRouter route, and add call-level route/billing filters to models, sessions, export, and audit.

Keep unknown billing unclassified, preserve existing pricing, and repair legacy included Hermes ledger baselines without rewriting genuine multi-observation history.

* feat(opencode): preserve OpenRouter route provenance

Carry OpenCode providerID through legacy SQLite, v2, file, and session-rollup paths so OpenRouter calls remain distinct from direct traffic. Invalidate OpenCode and KiloCode caches and cover strict route matching.

* feat(opencode): classify Amazon Bedrock route

Map OpenCode's exact amazon-bedrock providerID to the existing metered Bedrock route, including model families that cannot rely on Anthropic/OpenAI ID shapes. Invalidate OpenCode and KiloCode caches across the route expansion.

* docs(opencode): document billing route provenance

---------

Co-authored-by: ozymandiashh <234437643+ozymandiashh@users.noreply.github.com>
2026-09-19 11:32:06 -07:00

59 lines
2.4 KiB
TypeScript

import { createHash } from 'crypto'
import { describe, expect, it } from 'vitest'
import { computeEnvFingerprint } from '../src/session-cache.js'
function preOpenRouterRouteFingerprint(): string {
const parts = [
`XDG_DATA_HOME=${process.env['XDG_DATA_HOME'] ?? ''}`,
`OPENCODE_DATA_DIR=${process.env['OPENCODE_DATA_DIR'] ?? ''}`,
`OPENCODE_DB_PREFIX=${process.env['OPENCODE_DB_PREFIX'] ?? ''}`,
'parser=session-model-v1-archived-subtree-v1',
]
return createHash('sha256').update(parts.join('\0')).digest('hex').slice(0, 16)
}
function preKiloCodeOpenRouterRouteFingerprint(): string {
const parts = [
`XDG_DATA_HOME=${process.env['XDG_DATA_HOME'] ?? ''}`,
'parser=worktree-project-grouping-v1-session-model-v1-archived-subtree-v1',
]
return createHash('sha256').update(parts.join('\0')).digest('hex').slice(0, 16)
}
function openCodeOpenRouterOnlyFingerprint(): string {
const parts = [
`XDG_DATA_HOME=${process.env['XDG_DATA_HOME'] ?? ''}`,
`OPENCODE_DATA_DIR=${process.env['OPENCODE_DATA_DIR'] ?? ''}`,
`OPENCODE_DB_PREFIX=${process.env['OPENCODE_DB_PREFIX'] ?? ''}`,
'parser=session-model-v1-archived-subtree-v1-openrouter-route-v1',
]
return createHash('sha256').update(parts.join('\0')).digest('hex').slice(0, 16)
}
function kiloCodeOpenRouterOnlyFingerprint(): string {
const parts = [
`XDG_DATA_HOME=${process.env['XDG_DATA_HOME'] ?? ''}`,
'parser=worktree-project-grouping-v1-session-model-v1-archived-subtree-v1-openrouter-route-v1',
]
return createHash('sha256').update(parts.join('\0')).digest('hex').slice(0, 16)
}
describe('OpenCode-style route cache invalidation', () => {
it('invalidates OpenCode caches written before providerID became route provenance', () => {
expect(computeEnvFingerprint('opencode')).not.toBe(preOpenRouterRouteFingerprint())
})
it('invalidates OpenCode caches written before Amazon Bedrock providerID support', () => {
expect(computeEnvFingerprint('opencode')).not.toBe(openCodeOpenRouterOnlyFingerprint())
})
it('invalidates KiloCode caches written before the shared parser gained route provenance', () => {
expect(computeEnvFingerprint('kilo-code')).not.toBe(preKiloCodeOpenRouterRouteFingerprint())
})
it('invalidates KiloCode caches written before Amazon Bedrock providerID support', () => {
expect(computeEnvFingerprint('kilo-code')).not.toBe(kiloCodeOpenRouterOnlyFingerprint())
})
})