v0.9.10: geo, chat fixes, sandbox fixes by waleedlatif1 · Pull Request #8539 · simstudioai/sim · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
60a1f6f
feat(chat): cycle available composer modes with Shift+Tab (#8511)
waleedlatif1 Oct 1, 2026
1b0b86e
docs(library): restore content dropped by automated refreshes (#8525)
waleedlatif1 Oct 1, 2026
a7c71cc
chore(content): add check:library-content audit for content posts (#8…
waleedlatif1 Oct 1, 2026
52b9930
fix(seo): escape backslashes in llms-full.txt comparison table cells …
waleedlatif1 Oct 1, 2026
59e1e70
fix(library): scope Sim license claims to the Apache 2.0 core and the…
waleedlatif1 Oct 1, 2026
4d51401
feat(dashboards): embed live dashboard panels in markdown (#8527)
TheodoreSpeaks Oct 1, 2026
b6a598e
fix(accounts): scope organization OAuth outbound requests (#8533)
waleedlatif1 Oct 1, 2026
7dad107
fix(wiza): surface Wiza's nested error messages (#8532)
TheodoreSpeaks Oct 1, 2026
9a2b64d
fix(chat): preserve per-chat resource panel widths (#8531)
waleedlatif1 Oct 1, 2026
a1e573a
chore(search): remove legacy indexed enterprise search (#8528)
icecrasher321 Oct 1, 2026
064cd41
fix(sandbox): preserve workbench availability for unrecorded API resp…
icecrasher321 Oct 1, 2026
045b07c
fix(mothership): stop duplicating chat resource tabs in workspace cha…
waleedlatif1 Oct 1, 2026
491ab88
chore(search): add paced projection replacement and data retirement (…
icecrasher321 Oct 1, 2026
90e3b91
fix(library): ignore sentence punctuation after bare internal URLs in…
waleedlatif1 Oct 1, 2026
efca99c
fix(ci): isolate HTTP end-to-end suites and stop the SCIM readiness f…
waleedlatif1 Oct 1, 2026
ec1a997
fix(dashboards): keep DST fall-back range endpoints and resolve thres…
TheodoreSpeaks Oct 1, 2026
428a945
fix(search): correct onboarding and live citations (#8542)
icecrasher321 Oct 1, 2026
39067d0
feat(files): render diff fences and theme mermaid diagrams (#8543)
TheodoreSpeaks Oct 1, 2026
a1ef625
fix(slack): verify Search permissions before changing active grants (…
waleedlatif1 Oct 1, 2026
004d3d3
fix(mothership): bound stream recovery with a per-run restart budget …
waleedlatif1 Oct 1, 2026
320843e
improvement(cron): run stale execution and file version cleanup off t…
TheodoreSpeaks Oct 1, 2026
d3f0d26
fix(slack): honor implicit Search approval during authorization (#8548)
waleedlatif1 Oct 1, 2026
f7b47bc
chore(cleanup): apply codebase-design deep-module pass across the mon…
waleedlatif1 Oct 2, 2026
31503c5
fix(accounts): report managed OAuth failures accurately (#8552)
waleedlatif1 Oct 2, 2026
3f29a16
improvement(lint): strip comment noise and add check:comment-hygiene …
waleedlatif1 Oct 2, 2026
4436f82
feat(workflows): compare deployment versions across UI and API (#8455)
mzxchandra Oct 2, 2026
2cbc59e
fix(files): align workbench reads with provenance policy (#8553)
icecrasher321 Oct 2, 2026
401e039
fix(cli): report authentication accurately and preserve file text (#8…
icecrasher321 Oct 2, 2026
e3211dd
chore(lint): delete unused variables and parameters; enforce both rul…
waleedlatif1 Oct 2, 2026
2cef19f
improvement(audits): ratchet unused exports, explicit any, and file n…
waleedlatif1 Oct 2, 2026
70412cc
fix(db): pin the primary-key plan in the search retirement read-bound…
waleedlatif1 Oct 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix(dashboards): keep DST fall-back range endpoints and resolve thres…
…hold axis from first series (#8541)

* fix(dashboards): keep DST fall-back range endpoints and resolve threshold axis from first series

* fix(dashboards): reject invalid first-series axis refs and show exclusive end for sub-minute ranges

* fix(dashboards): show inclusive range end in exact caption and cover id/x-axis threshold lookups

* fix(charts): resolve threshold axis by index before id, matching ECharts
  • Loading branch information
TheodoreSpeaks authored Oct 1, 2026
commit ec1a997dab824e1b5c371db99fa9101b7ff8885d
94 changes: 94 additions & 0 deletions apps/sim/lib/charts/annotations.test.ts
38 changes: 32 additions & 6 deletions apps/sim/lib/charts/annotations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,43 @@ export interface ChartAnnotations {

const BAND_OPACITY = 0.08

function firstAxis(axis: unknown): Record<string, unknown> {
return toRecord(Array.isArray(axis) ? axis[0] : axis)
function firstSeries(option: Record<string, unknown>): Record<string, unknown> {
return toRecord(Array.isArray(option.series) ? option.series[0] : option.series)
}

/** The axis a threshold is measured on; ECharts defaults an unspecified yAxis to a value axis. */
/**
* The axis the first series is plotted on. Like ECharts, `*AxisIndex` wins over `*AxisId`, and ids
* match across string and number.
*/
function seriesAxis(
option: Record<string, unknown>,
key: 'xAxis' | 'yAxis'
): Record<string, unknown> {
const axes = Array.isArray(option[key]) ? (option[key] as unknown[]) : [option[key]]
const series = firstSeries(option)
const id = series[`${key}Id`]
if (series[`${key}Index`] === undefined && id !== undefined) {
const axis = axes.find((candidate) => String(toRecord(candidate).id) === String(id))
if (axis === undefined) throw new Error(`The first series references a missing ${key} "${id}"`)
return toRecord(axis)
}
const index = series[`${key}Index`] ?? 0
if (option[key] === undefined && index === 0) return {}
if (!Number.isInteger(index) || axes[index as number] === undefined)
throw new Error(`The first series references a missing ${key} at index ${String(index)}`)
return toRecord(axes[index as number])
}

/**
* The axis a threshold is measured on, among the axes the first series is plotted on; ECharts
* defaults an unspecified yAxis to a value axis.
*/
export function valueAxisKey(option: Record<string, unknown>): 'xAxis' | 'yAxis' {
if (option.xAxis === undefined && option.yAxis === undefined)
throw new Error('Thresholds require a value axis')
const y = firstAxis(option.yAxis)
const y = seriesAxis(option, 'yAxis')
if (y.type === undefined || y.type === 'value' || y.type === 'log') return 'yAxis'
Comment thread
cubic-dev-ai[bot] marked this conversation as resolved.
const x = firstAxis(option.xAxis)
const x = seriesAxis(option, 'xAxis')
if (x.type === 'value' || x.type === 'log') return 'xAxis'
throw new Error('Thresholds require a value axis')
}
Expand All @@ -47,7 +73,7 @@ export function valueAxisKey(option: Record<string, unknown>): 'xAxis' | 'yAxis'
* y axis is inverted (as horizontal bar charts usually are).
*/
function verticalTop(option: Record<string, unknown>): 'start' | 'end' {
return firstAxis(option.yAxis).inverse === true ? 'start' : 'end'
return seriesAxis(option, 'yAxis').inverse === true ? 'start' : 'end'
}

/** A chart annotations can draw on: a first series with no hand-written marks to collide with. */
Expand Down
18 changes: 18 additions & 0 deletions apps/sim/lib/dashboards/time.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { describe, expect, it } from 'vitest'
import {
dashboardAxisFormatter,
dashboardRangeFromCalendar,
dashboardRangeText,
dashboardTimeLabel,
dashboardZoomRange,
parseDashboardCustomRange,
Expand Down Expand Up @@ -47,4 +48,21 @@ describe('dashboard time interactions', () => {
expect(dashboardTimeLabel(stamp, 'America/Los_Angeles')).toContain('PDT')
expect(dashboardTimeLabel('2026-12-20T02:30:00Z', 'America/Los_Angeles')).toContain('PST')
})

it('keeps both ends of a range that repeats the same wall-clock minute across a DST fall-back', () => {
const text = dashboardRangeText(
{ from: '2026-11-01T05:30:00.000Z', to: '2026-11-01T06:31:00.000Z' },
'America/New_York'
)
expect(text).toBe('Nov 1, 01:30:00 EDT – Nov 1, 01:30:59 EST')
})

it('shows distinct endpoints for a sub-minute zoom range', () => {
expect(
dashboardRangeText(
{ from: '2026-09-20T14:30:00.000Z', to: '2026-09-20T14:30:01.000Z' },
'UTC'
)
).toBe('Sep 20, 14:30:00.000 UTC – Sep 20, 14:30:00.999 UTC')
})
})
19 changes: 19 additions & 0 deletions apps/sim/lib/dashboards/time.ts
Loading