mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 18:55:37 -04:00
9e0d3976e1
Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com> Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: Simon Klee <hello@simonklee.dk> Co-authored-by: Jay <air@live.ca> Co-authored-by: David Hill <1879069+iamdavidhill@users.noreply.github.com>
60 lines
2.4 KiB
TypeScript
60 lines
2.4 KiB
TypeScript
export type SessionSwitchSample = {
|
|
observedAtMs: number
|
|
destination: string[]
|
|
source: string[]
|
|
hasVisibleRows: boolean
|
|
last: boolean
|
|
requiredPartVisible?: boolean
|
|
bottomAnchorRequired?: boolean
|
|
bottomErrorPx?: number
|
|
review?: {
|
|
fileHost: boolean
|
|
fileHostReplaced: boolean
|
|
header: string
|
|
replacedLevels: string[]
|
|
}
|
|
}
|
|
|
|
export function classifySessionSwitch(samples: SessionSwitchSample[]) {
|
|
const firstDestination = samples.findIndex((sample) => sample.destination.length > 0)
|
|
const firstCorrect = samples.findIndex(isCorrectDestination)
|
|
const stable = samples.findIndex((_, index) => isStableSessionSwitch(samples.slice(index, index + 3)))
|
|
return {
|
|
firstDestinationObservedMs: samples[firstDestination]?.observedAtMs ?? null,
|
|
firstCorrectObservedMs: samples[firstCorrect]?.observedAtMs ?? null,
|
|
stableObservedMs: samples[stable + 2]?.observedAtMs ?? null,
|
|
wrongDestinationSamples: samples
|
|
.slice(firstDestination)
|
|
.filter((sample) => sample.destination.length > 0 && !sample.last).length,
|
|
blankSamples: samples.filter((sample) => !sample.hasVisibleRows).length,
|
|
unknownSamples: samples.filter(
|
|
(sample) => sample.hasVisibleRows && sample.destination.length === 0 && sample.source.length === 0,
|
|
).length,
|
|
sourceSamples: samples.filter((sample) => sample.source.length > 0).length,
|
|
reviewFileHostMissingSamples: samples.filter((sample) => sample.review && !sample.review.fileHost).length,
|
|
reviewFileHostReplacedSamples: samples.filter((sample) => sample.review?.fileHostReplaced).length,
|
|
reviewHeaders: [...new Set(samples.flatMap((sample) => (sample.review ? [sample.review.header] : [])))],
|
|
reviewReplacedLevels: [...new Set(samples.flatMap((sample) => sample.review?.replacedLevels ?? []))],
|
|
}
|
|
}
|
|
|
|
export function isCorrectDestination(sample: SessionSwitchSample) {
|
|
return (
|
|
sample.destination.length > 0 &&
|
|
sample.source.length === 0 &&
|
|
sample.last &&
|
|
sample.requiredPartVisible !== false &&
|
|
(sample.bottomAnchorRequired === false || Math.abs(sample.bottomErrorPx ?? Infinity) <= 1)
|
|
)
|
|
}
|
|
|
|
export function isStableSessionSwitch(samples: SessionSwitchSample[]) {
|
|
return samples.length === 3 && samples.every(isCorrectDestination)
|
|
}
|
|
|
|
export function isStableDestination(samples: Pick<SessionSwitchSample, "last" | "bottomErrorPx">[]) {
|
|
return (
|
|
samples.length === 3 && samples.every((sample) => sample.last && Math.abs(sample.bottomErrorPx ?? Infinity) <= 1)
|
|
)
|
|
}
|