mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-11-15 10:59:32 +01:00
- Session update no longer resets "How often" while typing: updateGitFetchStatus (session-ui.js) leaves a control alone while it is document.activeElement, and autoSaveGitFetch writes the clamped interval back itself (Enter saves with the field still focused). - Partial override shows the app values: enabled = session ?? app switch, interval = session ?? app interval ?? 300 (session-ui.js updateGitFetchStatus). - runFetch (git-fetch.ts) arms the spawn with what the core.sshCommand read left of timeoutMs, and answers ETIMEDOUT without spawning when nothing is left, so a git that never answers costs one timeout, not two. - fetchEnvFor keeps a GIT_SSH from the server's environment (repoSshCommand || base.GIT_SSH), fileoverview and CLAUDE.md line updated to say so. - i18n.js: the zh-CN "Git fetch on an interval" description scopes the only writing git command to the Git window. - styles.css: the disabled/busy rules are scoped to .git-status-actions .btn-icon-sm (moved beside .git-status-actions), and the busy pulse stops under prefers-reduced-motion. - Comments that called the override per case now say per session: session.ts (field, restore and getter docs, setGitFetchSettings), git-fetch-scheduler.ts:2, server-timing.ts:78, server.ts (cleanup and restore), app.js _onSessionUpdated, session-ui.js (openSessionOptions and updateGitFetchStatus). - Tests: test/git-fetch-session-options-ui.test.ts (new, JSDOM: typing survives an SSE update, the Enter write-back, both partial cases); test/git-fetch.test.ts (GIT_SSH kept; one bound for the read and the fetch, stub git on PATH). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
121 lines
5.0 KiB
TypeScript
121 lines
5.0 KiB
TypeScript
/**
|
||
* @fileoverview Web server performance and scheduling constants.
|
||
*
|
||
* Controls terminal batching throughput, SSE health checking,
|
||
* state persistence debouncing, and scheduled run timing.
|
||
*
|
||
* @module config/server-timing
|
||
*/
|
||
|
||
// ============================================================================
|
||
// Terminal & SSE Performance
|
||
// ============================================================================
|
||
|
||
/** Terminal data batching interval — targets 60fps (ms) */
|
||
export const TERMINAL_BATCH_INTERVAL = 16;
|
||
|
||
/** Immediate flush threshold for terminal batches (bytes).
|
||
* Set high (32KB) to allow effective batching; avg Ink events are ~14KB. */
|
||
export const BATCH_FLUSH_THRESHOLD = 32 * 1024;
|
||
|
||
/** Task event batching interval (ms) */
|
||
export const TASK_UPDATE_BATCH_INTERVAL = 100;
|
||
|
||
/** SSE heartbeat interval — sends padded keepalive to flush proxy buffers (ms).
|
||
* 15s is fast enough to keep Cloudflare tunnel buffers flushed while avoiding
|
||
* excessive bandwidth. Also serves as dead-client detection. */
|
||
export const SSE_HEARTBEAT_INTERVAL = 15 * 1000;
|
||
|
||
/** SSE padding size (bytes). Cloudflare quick tunnels buffer small SSE events;
|
||
* appending ~8KB of SSE comment padding forces the proxy to flush immediately.
|
||
* SSE comments (lines starting with ':') are silently ignored by EventSource. */
|
||
export const SSE_PADDING_SIZE = 8 * 1024;
|
||
|
||
// ============================================================================
|
||
// State Persistence
|
||
// ============================================================================
|
||
|
||
/** State update debounce — batches expensive toDetailedState() calls (ms) */
|
||
export const STATE_UPDATE_DEBOUNCE_INTERVAL = 500;
|
||
|
||
/** Sessions list cache TTL — avoids re-serializing on every SSE init (ms) */
|
||
export const SESSIONS_LIST_CACHE_TTL = 1000;
|
||
|
||
// ============================================================================
|
||
// Scheduled Runs
|
||
// ============================================================================
|
||
|
||
/** Scheduled runs cleanup check interval (ms) */
|
||
export const SCHEDULED_CLEANUP_INTERVAL = 5 * 60 * 1000;
|
||
|
||
/** Completed scheduled run max age before cleanup (ms) */
|
||
export const SCHEDULED_RUN_MAX_AGE = 60 * 60 * 1000;
|
||
|
||
// ============================================================================
|
||
// Cron Jobs
|
||
// ============================================================================
|
||
|
||
/** How often the cron loop wakes to check for due jobs (ms). */
|
||
export const CRON_TICK_INTERVAL = 30 * 1000;
|
||
|
||
/** Max attempts (× 500ms) to poll a launched session for CLI readiness before sending the prompt. */
|
||
export const CRON_READY_MAX_ATTEMPTS = 60;
|
||
|
||
/** Extra settle delay after CLI readiness is detected, before sending the prompt (ms). */
|
||
export const CRON_READY_SETTLE_MS = 2000;
|
||
|
||
/** Session limit retry wait before retrying (ms) */
|
||
export const SESSION_LIMIT_WAIT_MS = 5000;
|
||
|
||
/** Pause between scheduled run iterations (ms) */
|
||
export const ITERATION_PAUSE_MS = 2000;
|
||
|
||
// ============================================================================
|
||
// Git Fetch Interval
|
||
// ============================================================================
|
||
|
||
/**
|
||
* How often the fetch scheduler (src/git-fetch-scheduler.ts) wakes to check which sessions are due (ms). A
|
||
* run lands within one tick of the interval the user set, because the interval is timed from the start of
|
||
* a run; a tick is a settings read and a due check, not a spawn, so a quiet install costs nothing.
|
||
*/
|
||
export const GIT_FETCH_TICK_INTERVAL_MS = 15 * 1000;
|
||
|
||
// ============================================================================
|
||
// Mux Stats
|
||
// ============================================================================
|
||
|
||
/** Mux stats collection interval (ms) */
|
||
export const STATS_COLLECTION_INTERVAL_MS = 2000;
|
||
|
||
// ============================================================================
|
||
// Process Error Recovery
|
||
// ============================================================================
|
||
|
||
/** Max consecutive unhandled errors before auto-restart */
|
||
export const MAX_CONSECUTIVE_ERRORS = 5;
|
||
|
||
/** Error counter reset interval — forgives errors after quiet period (ms) */
|
||
export const ERROR_RESET_MS = 60_000;
|
||
|
||
// ============================================================================
|
||
// Common Cleanup Intervals
|
||
// ============================================================================
|
||
|
||
/** Standard 1-minute cleanup/check interval used by multiple subsystems (ms) */
|
||
export const CLEANUP_CHECK_INTERVAL_MS = 60_000;
|
||
|
||
/** Standard 1-hour max age for stale/completed data (ms) */
|
||
export const STALE_DATA_MAX_AGE_MS = 60 * 60 * 1000;
|
||
|
||
/** Standard 5-minute inactivity timeout for streams and caches (ms) */
|
||
export const INACTIVITY_TIMEOUT_MS = 5 * 60 * 1000;
|
||
|
||
/**
|
||
* Gap between a paste-mode cron prompt's text and its Enter (ms). The two must be
|
||
* separate writes: Claude Code takes a raw `<text>\r` burst of about a hundred
|
||
* characters as a paste and turns its `\r` into a newline. A separate `\r` 80 ms
|
||
* after the text was measured to submit; this leaves room for a longer prompt.
|
||
*/
|
||
export const CRON_PASTE_ENTER_DELAY_MS = 300;
|