Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
a5918a5
feat(transcription): expose active STT engine/model provenance (core)
alichherawalla Jul 23, 2026
ef05f07
feat(transcription): inline STT model picker (view + change) in meetings
alichherawalla Jul 23, 2026
3889417
chore(bench): vision-only capture benchmark with batch sweep + qualit…
alichherawalla Jul 23, 2026
78b2b96
fix(chat): reattach restores the image-gen progress panel on remount
alichherawalla Jul 23, 2026
ab9af57
feat(llm): use the model's trained context window as the ceiling, not…
alichherawalla Jul 23, 2026
e2ce09c
feat(engine): clean, awaitable unload — free the model port without a…
alichherawalla Jul 23, 2026
63cc87d
fix(llm): default max output to auto (until EOS / window fills), not …
alichherawalla Jul 23, 2026
f9ead97
fix(tools): stop capping the agentic answer at 1024 tokens — inherit …
alichherawalla Jul 23, 2026
3f163f6
fix(chat): don't yank the view down while streaming when the user scr…
alichherawalla Jul 23, 2026
e7aef2f
fix(llm): idle (inter-token) stream timeout, not total-duration — lon…
alichherawalla Jul 23, 2026
932ff51
test(settings): label the ctx/max-output selects + update the respons…
alichherawalla Jul 23, 2026
3123a8b
fix(chat): wrap composer chips instead of overflowing the input box
alichherawalla Jul 23, 2026
486a84f
chore(test): set the coverage floor to a uniform 85% across all metrics
alichherawalla Jul 23, 2026
805280c
review: address CodeRabbit findings on the release PR
alichherawalla Jul 23, 2026
4134368
docs(gaps): log 2 deferred items from PR #60 review (bench resilience…
alichherawalla Jul 23, 2026
a0a3972
docs(gaps): log 4 deferred edges from desktop-pro #32 review (Gitar)
alichherawalla Jul 23, 2026
0eacf94
fix(llm): explicit null check for the in-flight init in unload (Sonar…
alichherawalla Jul 23, 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
65 changes: 65 additions & 0 deletions e2e/meeting-transcription.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/**
* E2E: the Meetings detail exposes transcription provenance (which STT engine + model ran)
* against the real built app + seeded synthetic meetings. The Re-transcribe control and its
* failure feedback are behavior-verified in the MeetingsScreen integration test (they require a
* saved recording; seeded meetings are transcript-only), so here we verify the provenance the
* user sees and capture a screenshot for the record.
*/
import { test, expect, _electron as electron, type ElectronApplication, type Page } from '@playwright/test'
import os from 'os'
import path from 'path'
import fs from 'fs'

const PRO_PRESENT = fs.existsSync(path.resolve('pro/package.json'))
let app: ElectronApplication
let page: Page
let userDataDir: string

test.beforeAll(async () => {
test.skip(!PRO_PRESENT, 'pro package not present')

Check warning on line 19 in e2e/meeting-transcription.spec.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove this unit test or explain why it is ignored.

See more on https://sonarcloud.io/project/issues?id=off-grid-ai_off-grid-ai-desktop&issues=AZ-OUCKBLPtZEj4Xy_ES&open=AZ-OUCKBLPtZEj4Xy_ES&pullRequest=60
userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'offgrid-meet-'))
app = await electron.launch({
args: ['.'],
env: {
...process.env,
OFFGRID_USER_DATA: userDataDir,
OFFGRID_PRO: '1',
OFFGRID_SEED: 'force',
OFFGRID_SEED_PRO: 'force',
NODE_ENV: 'production'
}
})
page = await app.firstWindow()
await page.emulateMedia({ reducedMotion: 'reduce' })
await page.waitForLoadState('domcontentloaded')
for (let i = 0; i < 8; i++) {
const btn = page.getByRole('button', { name: /Continue|Start using Off Grid/i })
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
if (!(await btn.isVisible().catch(() => false))) break
await btn.click().catch(() => {})
await page.waitForTimeout(400)

Check warning on line 39 in e2e/meeting-transcription.spec.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this fixed wait with a synchronization on an observable condition.

See more on https://sonarcloud.io/project/issues?id=off-grid-ai_off-grid-ai-desktop&issues=AZ-OUCKBLPtZEj4Xy_ET&open=AZ-OUCKBLPtZEj4Xy_ET&pullRequest=60
}
await page.waitForTimeout(1500)

Check warning on line 41 in e2e/meeting-transcription.spec.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this fixed wait with a synchronization on an observable condition.

See more on https://sonarcloud.io/project/issues?id=off-grid-ai_off-grid-ai-desktop&issues=AZ-OUCKBLPtZEj4Xy_EU&open=AZ-OUCKBLPtZEj4Xy_EU&pullRequest=60
})

test.afterAll(async () => {
await app?.close()
fs.rmSync(userDataDir, { recursive: true, force: true })
})

test('meeting detail exposes the STT model picker (view + change)', async () => {
await page.getByRole('button', { name: 'Meetings', exact: true }).first().click()
await page.waitForTimeout(800)

Check warning on line 51 in e2e/meeting-transcription.spec.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this fixed wait with a synchronization on an observable condition.

See more on https://sonarcloud.io/project/issues?id=off-grid-ai_off-grid-ai-desktop&issues=AZ-OUCKBLPtZEj4Xy_EV&open=AZ-OUCKBLPtZEj4Xy_EV&pullRequest=60
// Open the first seeded meeting so the detail (with the transcription controls) renders.
const firstMeeting = page.locator('[class*="cursor-pointer"]').filter({ hasText: /·/ }).first()
if (await firstMeeting.isVisible().catch(() => false)) {
await firstMeeting.click().catch(() => {})
}
await page.waitForTimeout(600)

Check warning on line 57 in e2e/meeting-transcription.spec.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this fixed wait with a synchronization on an observable condition.

See more on https://sonarcloud.io/project/issues?id=off-grid-ai_off-grid-ai-desktop&issues=AZ-OUCKBLPtZEj4Xy_EW&open=AZ-OUCKBLPtZEj4Xy_EW&pullRequest=60
// The model picker is read from the core transcription source of truth and lets the user see
// (and change) which STT model transcribes meetings — always visible on the detail.
const picker = page.getByLabel('Transcription model')
await expect(picker).toBeVisible({ timeout: 8000 })
// At minimum the built-in whisper default is offered (installed models add more in a real profile).
await expect(picker).toContainText(/Whisper/)
await page.screenshot({ path: 'e2e/screenshots/meeting-transcription-picker.png' })
})
Binary file added e2e/screenshots/meeting-transcription-picker.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading