cli-jaw 1.3.3 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/public/index.html CHANGED
@@ -306,6 +306,25 @@
306
306
  <button id="codexFastOn" class="perm-btn" data-i18n="btn.on">켬</button>
307
307
  </div>
308
308
  </div>
309
+ <div class="settings-row sub-row">
310
+ <label>🧠 1M Context</label>
311
+ <div>
312
+ <button id="codexCtxOff" class="perm-btn active">Off</button>
313
+ <button id="codexCtxOn" class="perm-btn">On</button>
314
+ </div>
315
+ </div>
316
+ <div id="codexCtxValues" style="display:none">
317
+ <div class="settings-row sub-row" style="margin-left:24px">
318
+ <label style="min-width:120px;font-size:11px">Context Window</label>
319
+ <input type="number" id="codexCtxWindow" value="1000000" min="272000" max="1050000" step="1000"
320
+ style="width:100px;font-size:11px;padding:3px 6px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px">
321
+ </div>
322
+ <div class="settings-row sub-row" style="margin-left:24px">
323
+ <label style="min-width:120px;font-size:11px">Auto Compact Limit</label>
324
+ <input type="number" id="codexCtxCompact" value="900000" min="100000" max="1000000" step="1000"
325
+ style="width:100px;font-size:11px;padding:3px 6px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px">
326
+ </div>
327
+ </div>
309
328
  </div>
310
329
 
311
330
  <div class="settings-group">
@@ -402,7 +421,8 @@
402
421
  <option value="gemini-2.5-pro">gemini-2.5-pro (accurate)</option>
403
422
  <option value="__custom__">✏️ 직접 입력...</option>
404
423
  </select>
405
- <input type="text" id="sttGeminiModelCustom" placeholder="모델명 입력" style="display:none; margin-top:4px;" />
424
+ <input type="text" id="sttGeminiModelCustom" placeholder="모델명 입력"
425
+ style="display:none; margin-top:4px;" />
406
426
  </div>
407
427
  <!-- OpenAI Compatible -->
408
428
  <div class="settings-row sub-row stt-openai" style="display:none">
@@ -423,7 +443,8 @@
423
443
  <!-- Vertex AI -->
424
444
  <div class="settings-row sub-row stt-vertex" style="display:none">
425
445
  <label data-i18n="stt.vertexConfig">Vertex AI Config (JSON)</label>
426
- <textarea id="sttVertexJson" rows="4" placeholder='{"project_id":"...","location":"us-central1","credentials":{...}}'
446
+ <textarea id="sttVertexJson" rows="4"
447
+ placeholder='{"project_id":"...","location":"us-central1","credentials":{...}}'
427
448
  style="width:100%;font-size:11px;padding:4px;font-family:var(--font-mono)"></textarea>
428
449
  </div>
429
450
  <div class="settings-row sub-row stt-whisper">
@@ -572,7 +593,8 @@
572
593
  </div>
573
594
  <!-- View 2: Editor (hidden by default) -->
574
595
  <div id="templateEditorView" style="display:none;flex-direction:column">
575
- <div style="display:flex;align-items:center;gap:8px;padding:8px 16px;border-bottom:1px solid var(--border)">
596
+ <div
597
+ style="display:flex;align-items:center;gap:8px;padding:8px 16px;border-bottom:1px solid var(--border)">
576
598
  <button id="templateBack"
577
599
  style="background:none;border:1px solid var(--border);color:var(--text-dim);padding:4px 8px;border-radius:4px;cursor:pointer;font-size:11px">←
578
600
  뒤로</button>
@@ -584,10 +606,9 @@
584
606
  <textarea class="modal-textarea" id="templateEditor" readonly
585
607
  style="flex:1;min-height:350px;font-family:var(--font-mono);font-size:12px"></textarea>
586
608
  <div class="modal-footer">
587
- <span id="templateVars"
588
- style="color:var(--text-dim);font-size:10px;margin-right:auto"></span>
589
- <button class="btn-save" data-action="saveTemplate" style="display:none"
590
- id="templateSaveBtn">💾 저장</button>
609
+ <span id="templateVars" style="color:var(--text-dim);font-size:10px;margin-right:auto"></span>
610
+ <button class="btn-save" data-action="saveTemplate" style="display:none" id="templateSaveBtn">💾
611
+ 저장</button>
591
612
  </div>
592
613
  </div>
593
614
  </div>
@@ -19,7 +19,7 @@ const FALLBACK_CLI_REGISTRY: CliRegistry = {
19
19
  codex: {
20
20
  label: 'Codex',
21
21
  efforts: ['low', 'medium', 'high', 'xhigh'],
22
- models: ['gpt-5.4', 'gpt-5.4-spark', 'gpt-5.3-codex', 'gpt-5.3-codex-spark', 'gpt-5.2-codex', 'gpt-5.1-codex-max', 'gpt-5.1-codex-mini'],
22
+ models: ['gpt-5.4', 'gpt-5.3-codex', 'gpt-5.3-codex-spark', 'gpt-5.2-codex', 'gpt-5.1-codex-max', 'gpt-5.1-codex-mini'],
23
23
  },
24
24
  gemini: {
25
25
  label: 'Gemini',
@@ -6,7 +6,7 @@ import { syncStoredLocale } from '../locale.js';
6
6
  import { t } from './i18n.js';
7
7
  import { api, apiJson, apiFire } from '../api.js';
8
8
 
9
- interface PerCliConfig { model?: string; effort?: string; fastMode?: boolean; }
9
+ interface PerCliConfig { model?: string; effort?: string; fastMode?: boolean; contextWindow?: boolean; contextWindowSize?: number; contextCompactLimit?: number; }
10
10
  interface TelegramConfig { enabled?: boolean; token?: string; allowedChatIds?: number[]; forwardAll?: boolean; }
11
11
  interface QuotaWindow { label: string; percent: number; resetsAt?: string | number | null; }
12
12
  interface QuotaEntry {
@@ -171,6 +171,18 @@ export async function loadSettings(): Promise<void> {
171
171
  document.getElementById('codexFastOn')?.classList.toggle('active', cfg.fastMode);
172
172
  document.getElementById('codexFastOff')?.classList.toggle('active', !cfg.fastMode);
173
173
  }
174
+ // Restore Codex context window toggle + values
175
+ if (cli === 'codex') {
176
+ const ctxOn = !!cfg.contextWindow;
177
+ document.getElementById('codexCtxOn')?.classList.toggle('active', ctxOn);
178
+ document.getElementById('codexCtxOff')?.classList.toggle('active', !ctxOn);
179
+ const valDiv = document.getElementById('codexCtxValues');
180
+ if (valDiv) valDiv.style.display = ctxOn ? '' : 'none';
181
+ const winInput = document.getElementById('codexCtxWindow') as HTMLInputElement | null;
182
+ const compInput = document.getElementById('codexCtxCompact') as HTMLInputElement | null;
183
+ if (winInput && cfg.contextWindowSize) winInput.value = String(cfg.contextWindowSize);
184
+ if (compInput && cfg.contextCompactLimit) compInput.value = String(cfg.contextCompactLimit);
185
+ }
174
186
  }
175
187
  }
176
188
 
@@ -377,6 +389,13 @@ export async function savePerCli(): Promise<void> {
377
389
  if (cli === 'codex') {
378
390
  const onBtn = document.getElementById('codexFastOn');
379
391
  entry.fastMode = onBtn?.classList.contains('active') ?? false;
392
+ // Context window toggle + values
393
+ const ctxOn = document.getElementById('codexCtxOn');
394
+ entry.contextWindow = ctxOn?.classList.contains('active') ?? false;
395
+ const winInput = document.getElementById('codexCtxWindow') as HTMLInputElement | null;
396
+ const compInput = document.getElementById('codexCtxCompact') as HTMLInputElement | null;
397
+ entry.contextWindowSize = parseInt(winInput?.value || '1000000', 10);
398
+ entry.contextCompactLimit = parseInt(compInput?.value || '900000', 10);
380
399
  }
381
400
  perCli[cli] = entry;
382
401
  }
package/public/js/main.ts CHANGED
@@ -182,6 +182,23 @@ function setCodexFast(on: boolean) {
182
182
  }
183
183
  document.getElementById('codexFastOn')?.addEventListener('click', () => setCodexFast(true));
184
184
  document.getElementById('codexFastOff')?.addEventListener('click', () => setCodexFast(false));
185
+
186
+ // Codex 1M context window toggle
187
+ function setCodexCtx(on: boolean) {
188
+ const onBtn = document.getElementById('codexCtxOn');
189
+ const offBtn = document.getElementById('codexCtxOff');
190
+ const valDiv = document.getElementById('codexCtxValues');
191
+ if (onBtn && offBtn) {
192
+ onBtn.classList.toggle('active', on);
193
+ offBtn.classList.toggle('active', !on);
194
+ }
195
+ if (valDiv) valDiv.style.display = on ? '' : 'none';
196
+ savePerCli();
197
+ }
198
+ document.getElementById('codexCtxOn')?.addEventListener('click', () => setCodexCtx(true));
199
+ document.getElementById('codexCtxOff')?.addEventListener('click', () => setCodexCtx(false));
200
+ document.getElementById('codexCtxWindow')?.addEventListener('change', savePerCli);
201
+ document.getElementById('codexCtxCompact')?.addEventListener('change', savePerCli);
185
202
  // Per-CLI model selects
186
203
  function bindPerCliControlEvents(): void {
187
204
  for (const cli of getCliKeys()) {