mirror of
https://github.com/AgentSeal/codeburn.git
synced 2026-10-21 05:23:19 +00:00
* 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>
59 lines
2.4 KiB
TypeScript
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())
|
|
})
|
|
})
|