fix: derive the model maxlength and document the frame-focus cases

maxlength was hard-coded to 200 in the markup while MAX_MODEL_CHARS lives
in lib/defaults.js; lowering the constant would have left the input
accepting values mergeSettings() silently discards. It is now set from the
constant at render time.

Also records the hasFocus() gate's four manual frame cases in AGENTS.md,
including the findbar trade-off, and notes that fitToBudget()'s budget
guarantee assumes mergeSettings-validated input.
This commit is contained in:
golem
2026-08-01 23:21:45 -06:00
parent 8fcc93c541
commit 17bccc1ade
4 changed files with 27 additions and 6 deletions
+3 -1
View File
@@ -9,7 +9,9 @@
<form id="settings" autocomplete="off">
<div class="field">
<label for="model">Model <span class="tag">experimental</span></label>
<input type="text" id="model" placeholder="auto" spellcheck="false" maxlength="200" />
<!-- maxlength is set from MAX_MODEL_CHARS in options.js, so the input and
mergeSettings() can never disagree about the bound. -->
<input type="text" id="model" placeholder="auto" spellcheck="false" />
<p class="hint">
ChatGPT may ignore this and use your account default. Leave blank to
always use your account default.
+6 -1
View File
@@ -1,4 +1,4 @@
import { DEFAULT_SETTINGS } from "../lib/defaults.js";
import { DEFAULT_SETTINGS, MAX_MODEL_CHARS } from "../lib/defaults.js";
import { load, save } from "../lib/settings.js";
const SAVE_DEBOUNCE_MS = 400;
@@ -59,6 +59,11 @@ function scheduleSave() {
saveTimer = setTimeout(() => persist(collect()), SAVE_DEBOUNCE_MS);
}
// Derived rather than hard-coded in the markup: if the two ever disagreed, the
// input would accept a model that mergeSettings() then silently discards,
// blanking the setting with no explanation.
field("model").maxLength = MAX_MODEL_CHARS;
// Module scripts are deferred, so the DOM is already parsed here.
render(await load());