Skip to content

Feat/model picker anthropic - #3

Closed
danilarff86 wants to merge 36 commits into
ericwang915:mainfrom
danilarff86:feat/model-picker-anthropic
Closed

danilarff86 wants to merge 36 commits into
ericwang915:mainfrom
danilarff86:feat/model-picker-anthropic

Conversation

@danilarff86

Copy link
Copy Markdown

Feat/model picker anthropic

Testing

  • npm run lint passes
  • npm test passes
  • Ran the app (npm start) and verified the affected flow

danilarff86 and others added 30 commits September 1, 2026 20:04
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The trailing cue in buildExtractionUser is concatenated directly after
EXTRACTION_SYSTEM, which now describes a dissertation defense, so asking
for "the interviewer's current core question" contradicted it inside a
single request. Also removes a duplicate Ukrainian answer-language test
superseded by the target-language case, and corrects the design doc's
claim that buildExtractionUser needed no change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diagnoses why the Interviewer channel captures nothing on macOS: the
getDisplayMedia loopback path needs two Chromium feature flags that
main.js never sets, so the stream comes back video-only. On headphones
the interviewer is never transcribed; on speakers their speech reaches
only the microphone, which is hardwired to the "You" label.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzVW3YgFohygg7bM1Hxxyb
Supersedes the macOS loopback feature-flag design, whose premise was
wrong: Electron 33's Chromium contains no macOS system-audio capture at
all, and silently ignores the unknown feature names it was passed.
Electron 44 captures system audio through Apple's CoreAudio Tap API by
default, which needs no flags but does need the
NSAudioCaptureUsageDescription Info.plist key on both packaging paths.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzVW3YgFohygg7bM1Hxxyb
Task 0 translates source comments to English before the Electron work, so
later tasks do not write comments that immediately need translating. It
carries an explicit do-not-touch list: the repo also contains Chinese
that is user-facing or load-bearing (the Chinese answer-language rule,
the language <option> labels, and the knowledge-base markers asserted by
tests), none of which may be translated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzVW3YgFohygg7bM1Hxxyb
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzVW3YgFohygg7bM1Hxxyb
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzVW3YgFohygg7bM1Hxxyb
Step 6 searched for MacCatapSystemAudioLoopbackCapture, a feature name
copied from a community library targeting older Chromium. It does not
exist under that spelling in Electron 44, so the check returned 0 on a
runtime that does support system audio. Search for the CoreAudio Tap
implementation class instead: CatapAudioInputStream returns 16 on
Electron 44.2.0 and 0 on 33.4.11, while the control string
MacWebContentsOcclusion is found in both. Also records that this machine
blocks npm install scripts, so Electron's binary download must be run
by hand after a version change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzVW3YgFohygg7bM1Hxxyb
Task 3 raised .nvmrc to 22 and engines.node to >=22.12.0, but the two
documents that actually tell a contributor which Node to install still
said Node >= 18 / Node 20 LTS, and both CI workflows still pinned 20.
npm only warns on an engine mismatch, so a contributor following the
README installs Node 20, gets a clean install, and then cannot package
the app at all -- @electron/packager requires >= 22.12.0.

Also updates the allowScripts pin, which still named electron@33.4.11
after the bump to 44.2.0, and drops a comment in getSystemStream that
still blamed a missing feature flag -- the last trace in code of the
superseded explanation.

Extends test/packaging.test.js to compare the usage-description text
between the two packaging sources, not only the key names. macOS shows
that text in the permission prompt, so a wording fix applied to one
source alone would have passed the previous assertions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HzVW3YgFohygg7bM1Hxxyb
…n-44

Fix macOS system-audio capture: upgrade to Electron 44
* fix: translate remaining Chinese error/UI strings to English

Error messages, dialog titles/filters, and console logs in the main
process and renderer were left in Chinese while the rest of the app
is English. Intentional multilingual bits are untouched: the native
language names in the language <select> options, and the zh branch
of the answer-language prompt rule (deliberately written in the
target language to prime model output).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q3K6W8gPHnrKVnvtmgDMxF

* style: run prettier on main.js

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q3K6W8gPHnrKVnvtmgDMxF

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…hunk (#5)

The transcript treated Deepgram's `is_final` flag as end-of-sentence. That
flag only means "this text won't be revised" — Deepgram freezes several
such chunks per spoken sentence — so a single question arrived as two or
three separate turns. The fragments were then joined and handed to the
LLM, which stitched them into a garbled question.

DeepgramLive now buffers frozen chunks and commits them as one turn on
`speech_final`, the flag that actually means the speaker stopped. An
`UtteranceEnd` backstop (requested via `utterance_end_ms`) covers the case
where steady background noise keeps endpointing from ever firing, and
close() flushes so a trailing sentence isn't dropped. Interim display is
prefixed with the buffered text, so a long sentence stays visible while
it's still being spoken.

The silence threshold was a fixed 300ms, which cut off anyone who paused
to think. It's now the `sttPauseMs` setting — Short 0.5s / Normal 0.9s /
Long 1.5s — under Settings, defaulting to 0.9s. No settings migration is
needed: the DEFAULTS merge in load() gives existing installs the new key.
Auto-answer's own debounce drops from 1.3s to 0.6s so it doesn't stack on
top of the longer pause.

Tests cover the segmentation logic against synthetic Deepgram frames,
including the real Ukrainian split that prompted this. deepgram.js gained
a guarded CommonJS export to make it loadable under node --test, with a
scoped eslint override rather than adding `module` to all renderer globals.

Also adds test/renderer-scripts.test.js, which compiles the renderer's
<script> files together the way the browser does. They share one global
scope, so a top-level `const` in two files is an early SyntaxError that
stops a whole file from parsing — and ESLint can't see it, since it lints
each file alone.


Claude-Session: https://claude.ai/code/session_01U27AjcJKhLosmpXPZmU1sC

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
The Current Question box is filled by a separate, display-only extraction
call (main.js:363-378) that sees the last six transcript lines. When the
committee asks a short follow-up, EXTRACTION_SYSTEM was told to return that
follow-up verbatim, so the box showed things like "А чому саме його?" —
unreadable without the preceding dialogue.

The answer itself was never affected: in extraction mode buildPrompt takes
the no-question branch and hands the answering model all 15 recent turns,
which is why the generated answers resolved the reference correctly. This is
purely a display fix.

EXTRACTION_SYSTEM now asks for the follow-up to be rewritten self-contained,
resolving pronouns, ellipsis and back-references against the earlier turns —
and explicitly forbids inventing an antecedent, so an out-of-window referent
degrades to the wording as spoken rather than to a confident guess.


Claude-Session: https://claude.ai/code/session_01H3ymMYyTkERfHPM9aoxEmj

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
danilarff86 and others added 6 commits September 25, 2026 21:24
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add eslint.config.js global for AbortSignal, used by the new
model-list timeout (Node's fetch/AbortSignal were already allowed
constraints; the lint config just hadn't caught up).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…o think

The Model picker pushed Start Listening and Settings off the right edge at
the default 1280px width. Top-bar fields now shrink and truncate instead,
and the app title hides below 1180px so the selects stay usable at the
960px minimum.

The Anthropic question-extraction call had a 2048-token ceiling, but
thinking counts against max_tokens and extraction failures are silent, so
it is raised to 4096. The budget table moves into config.tokenBudgets so it
is covered by a test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@danilarff86
danilarff86 deleted the feat/model-picker-anthropic branch September 25, 2026 19:06
@danilarff86
danilarff86 restored the feat/model-picker-anthropic branch September 25, 2026 19:06
@danilarff86
danilarff86 deleted the feat/model-picker-anthropic branch September 25, 2026 19:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant