Commit Graph
69 Commits
Author SHA1 Message Date
arkon 65f81667d0 chore: bump version to 0.1481 2026-02-12 10:29:57 +01:00
arkonandClaude Opus 4.5 8f0bbf33d6 chore: bump version to 0.1477
Location: Ko Samui

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 07:24:32 +01:00
arkonandClaude Opus 4.5 eb7c005363 fix: memory leaks and performance optimizations
- WebServer: Store session listener refs for explicit cleanup on delete
- RespawnController: Fix clearInterval bug (was using clearTimeout)
- RespawnController: Add try/catch to interval callbacks
- PlanOrchestrator: Guarantee progressInterval cleanup with try/finally
- SubagentWatcher: Guard idle timer against deleted agents
- Session: Add threshold validation for auto-clear/compact (1k-500k)
- Session: Add token sum overflow check in restoreTokens
- Session: Use LRUMap for _recentTaskDescriptions auto-eviction

Commit from flight QR118 in an Airbus A350-1000, stable connection thanks to Starlink!

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 23:48:59 +01:00
arkon 6123ce8ba9 chore: bump version to 0.1444 2026-01-31 04:44:46 +01:00
arkonandClaude Opus 4.5 20283019f4 feat: comprehensive codebase improvements (cleanup, logic, performance)
Code Cleanups:
- Consolidated PlanTaskStatus and TddPhase types to types.ts
- Standardized node: prefix for Node.js builtin imports
- Fixed timer type to NodeJS.Timeout in respawn-controller

Logic Improvements:
- Fixed AI check race condition with UUID tracking in respawn-controller
- Added comprehensive _isStopped guards in session timer callbacks
- Made RalphTracker reset events non-reentrant via process.nextTick()
- Improved SessionManager mutex pattern reliability

Performance Optimizations:
- Fixed pendingToolCalls memory leak with TTL cleanup in subagent-watcher
- Improved LRUMap.newest() from O(n) to O(1) with _newestKey tracking

Documentation:
- Enhanced README antiflicker section with 6-layer technical details

Version: 0.1441

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 19:05:46 +01:00
arkon b520ce44e5 chore: bump version to 0.1439 2026-01-30 17:50:02 +01:00
arkon 5b6dd078f1 chore: bump version to 0.1438 2026-01-30 17:20:53 +01:00
arkonandClaude Opus 4.5 e3e0d226ce fix(memory): prevent memory leaks in session, server, and frontend
Backend fixes:
- Session: clear _recentTaskDescriptions Map in stop() and clearBuffers()
- Session: null promise callbacks after rejection in runPrompt() catch block
- Server: store subagent/image watcher listener refs and remove on shutdown

Frontend fixes:
- Plan file windows: store drag/resize handlers and clean up on close
- Plan file manager: store drag handler and clean up on close
- cleanupAllFloatingWindows: now cleans up plan file windows

These prevent unbounded memory growth in long-running sessions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:25:18 +01:00
arkon 7dfd97df58 chore: bump version to 0.1434 2026-01-30 11:30:51 +01:00
arkonandClaude Opus 4.5 b13b725bd8 fix: robust agent-to-tab connection lines with persistent parent tracking
- Add --session-id flag to Claude CLI startup so Claudeman and Claude share the same session ID
- Set claudeSessionId immediately on session start (no waiting for JSON messages)
- Add persistent subagentParentMap to store agent-to-tab associations permanently
- Add /api/subagent-parents endpoints for server-side persistence
- Add fallback: use active session when claudeSessionId matching fails
- Connection lines now reliably connect agent windows to their parent tabs
- Survives page refresh, reconnect, and server restart

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 14:56:11 +01:00
arkonandClaude Opus 4.5 6c07541288 refactor: consolidate shared regex patterns and token validation
- Create src/utils/regex-patterns.ts with ANSI_ESCAPE_PATTERN_FULL,
  ANSI_ESCAPE_PATTERN_SIMPLE, TOKEN_PATTERN, and helper functions
- Create src/utils/token-validation.ts with MAX_SESSION_TOKENS and
  validation utilities
- Update session.ts, respawn-controller.ts, ai-checker-base.ts,
  ralph-tracker.ts, state-store.ts to use shared utilities
- Export all new utilities from src/utils/index.ts

Reduces code duplication while maintaining pre-compiled patterns
for performance.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 10:55:49 +01:00
arkon e0a695fed7 chore: bump version to 0.1417 2026-01-28 07:18:45 +01:00
arkonandClaude Opus 4.5 077e296750 fix(session): prevent isWorking flag from getting stuck true
- Add _awaitingIdleConfirmation flag to prevent status bar redraws from
  resetting the 2-second idle detection timeout
- Strip ANSI/OSC escape sequences before checking working patterns to
  avoid false positives from window titles like '3 File Reading Task'
- Reset _awaitingIdleConfirmation on PTY exit for proper cleanup

chore: bump version to 0.1412

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 05:34:25 +01:00
arkonandClaude Opus 4.5 63d2265316 refactor: migrate session.ts and respawn-controller.ts to shared utilities
- Replace local BufferAccumulator in session.ts with shared utility
- Replace local BufferAccumulator in respawn-controller.ts with shared utility
- Import buffer constants from config/buffer-limits.ts
- Reduces code duplication and centralizes buffer management

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 04:38:43 +01:00
arkonandClaude Opus 4.5 e27b473e77 fix: memory leaks, race conditions, and stability improvements
- SSE event listener cleanup: Track all listeners and remove on reconnect
  to prevent listener accumulation (60+ listeners per connect cycle)
- Floating window cleanup: Remove drag listeners, ResizeObservers on close
- Session creation mutex: Prevent race conditions from concurrent requests
- Screen kill verification: Confirm processes are dead after kill signals
- State store circuit breaker: Prevent cascading failures with backup/recovery
- PTY spawn error handling: Wrap all spawn calls with proper error emission
- SSE graceful shutdown: Notify clients before server stops
- Async file writes: Replace blocking writeFileSync in hot paths
- DocumentFragment optimization: Batch DOM updates for plan rendering
- Timer cleanup: Clear notification/countdown timers on SSE reconnect

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 20:24:00 +01:00
arkonandClaude Opus 4.5 c4e5337480 fix: remove cpulimit, use nice only for CPU priority
cpulimit -f interfered with Claude's Ink terminal UI causing duplicate
prompt rendering. Replaced with nice-only approach.

- Remove cpulimit entirely (was causing display issues)
- Rename CpuLimitConfig -> NiceConfig for clean naming
- Simplify wrapWithCpuLimit -> wrapWithNice
- Update UI labels and settings key (cpuLimit -> nice)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 11:43:20 +01:00
arkonandClaude Opus 4.5 f92d009034 fix: Ralph Loop wizard screen creation and session idle detection
- Fix screen creation failing when using cpulimit/nice (env vars were passed
  as command args instead of shell variables)
- Fix session status never becoming 'idle' after startInteractive()
- Add automatic state file cleanup on startup (removes orphaned sessions)
- Add /api/cleanup-state endpoint for manual cleanup
- Make frontend session readiness check more robust (20 attempts, multiple checks)
- Add fallback to direct PTY write if writeViaScreen fails

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 11:02:02 +01:00
arkon 2d8597a66f chore: bump version to 0.1394 2026-01-27 02:38:37 +01:00
arkonandClaude Opus 4.5 59b406f73f feat: add CPU limiting and Ralph Loop wizard plan generation
CPU Limiting:
- Add CpuLimitConfig type and settings in App Settings
- Use nice command for process priority (-20 to 19)
- Optional cpulimit integration for hard CPU limits (if installed)
- Applied to new sessions via screen-manager and session modules

Ralph Loop Wizard:
- 3-step wizard: Describe → Plan → Launch
- New /api/generate-plan endpoint generates implementation steps via Claude
- Plan editor with checkboxes, priorities (P0/P1/P2), reordering
- Skip plan option for manual workflows
- Compact wizard modal layout

UI Updates:
- Form section headers for grouped settings
- CPU limit status indicator (cpulimit availability)
- Wizard modal wider layout and inline fields

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 01:58:14 +01:00
arkonandClaude Opus 4.5 11d4666d19 feat: add RALPH_STATUS block parsing and circuit breaker pattern
Phase 1 Ralph enhancement implementation:
- Parse RALPH_STATUS blocks from Claude output (status, tasks, files, tests)
- Circuit breaker state machine (CLOSED → HALF_OPEN → OPEN) for stuck detection
- Dual-condition exit gate (completion indicators >= 2 AND EXIT_SIGNAL)
- Frontend: circuit breaker badge (yellow warning, red stuck), status block display
- API: circuit breaker reset endpoint, ralph status endpoint
- Notifications when circuit breaker opens or exit gate is met

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 00:29:38 +01:00
arkonandClaude Opus 4.5 45332b6438 feat: parallel session creation and improved minimized agents UI
- Session creation now parallelized (3x faster for multiple tabs)
- Minimized agents badge: compact, hover-triggered, auto-hide
- Removed "Minimized Agents" header, status dots instead of text
- Click to pin dropdown open, hover for quick access

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 19:42:01 +01:00
arkonandClaude Opus 4.5 428556e831 refactor: extract magic numbers to named constants
Low severity code quality improvements:
- session.ts: Add timing constants (SCREEN_STARTUP_DELAY_MS, etc.)
- screen-manager.ts: Add EXEC_TIMEOUT_MS, CR_MAX_ATTEMPTS, etc.
- subagent-watcher.ts: Add display length constants
- server.ts: Add STATS_COLLECTION_INTERVAL_MS, SESSION_LIMIT_WAIT_MS, etc.
- spawn-orchestrator.ts: Add budget ratio constants
- respawn-controller.ts: Use pre-compiled ANSI_ESCAPE_PATTERN
- state-store.ts: Use ES6 import for unlinkSync instead of dynamic require
- app.js: Add notification timing constants

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 14:27:21 +01:00
arkonandClaude Opus 4.5 3c2e89f427 fix: address medium severity issues from code review
- Fix inconsistent null handling in state-store (use ?? instead of ||)
- Add JSON.stringify error handling with specific messages
- Add error handling for SSE init event in app.js
- Fix spawn orchestrator silent failures (add logging)
- Fix statSync race condition in subagent-watcher
- Fix unbounded _taskNumberToContent Map in ralph-tracker
- Fix YAML pattern case sensitivity in ralph-config

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 13:58:34 +01:00
arkonandClaude Opus 4.5 6e4564abd1 fix: add validation to prevent token counter corruption
- Add max 500k tokens per session limit (Claude's context is ~200k)
- Add max 100k tokens per update to prevent sudden jumps from parsing errors
- Reject "M" suffix values > 0.5M to prevent false matches in output text
- Add validation to restoreTokens() to reject corrupted values from state.json
- Add validation to addToGlobalStats() for negative and absurd values
- Fix daily sessions count: track unique session IDs instead of incrementing
  on every 5-minute recording interval
- Pass sessionId to recordDailyUsage() for accurate session counting

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 12:22:05 +01:00
arkonandClaude Opus 4.5 fc940e153b fix: correct Task tool description extraction for subagent window titles
- Add parseTaskDescriptionsFromTerminalData() to parse raw terminal data in
  interactive sessions (not just one-shot mode)
- Strip ANSI codes before regex matching since terminal output has embedded
  codes like [1mExplore[0m
- Fix getTaskDescriptionForSubagent() to check ALL sessions with matching
  project hash (not just the first one found) since multiple sessions can
  share the same working directory
- Add tool_result event forwarding for subagent SSE broadcasts

The pattern Explore(Description) in terminal output is now correctly parsed
and used as the subagent window title instead of extracting from the prompt.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 10:42:04 +01:00
arkonandClaude Opus 4.5 3f73a5f908 chore: remove non-functional subagent input feature
Subagents (Task tool background agents) are autonomous and cannot
receive input mid-execution. They complete and return results to
the parent session. Removed the input UI and API endpoint.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 04:35:50 +01:00
arkonandClaude Opus 4.5 9aa5973970 fix: rock-solid idle detection in respawn controller
- Add 300-char rolling window to catch working patterns split across PTY chunks
- Check completion message BEFORE working patterns (priority fix)
- Clear rolling window on completion message (transition point)
- Increase working pattern absence threshold from 3s to 8s
- Add Session.isWorking safety check before confirming idle
- Add 20+ more working patterns (Compiling, Building, Processing, etc.)
- Make AI idle checker prompt more conservative (err toward WORKING)
- Update documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 00:55:29 +01:00
arkonandClaude Opus 4.5 40df0748c5 ui: improve respawn controller layout and filter action log noise
- Stack timers row vertically (timers on top, action log below)
- Reduce action log height to 60px since it's now full width
- Filter action log to show only important entries:
  - Commands sent to console
  - Plan-check with action taken
  - Step completions
- Skip timer starts/cancels, detection updates, ai-check status

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 19:59:42 +01:00
arkonandClaude Opus 4.5 e56c8626e4 feat: persistent token tracking with global stats aggregation
- Add restoreTokens() method to Session class for recovery after restart
- Add GlobalStats type for cumulative usage tracking across all sessions
- Accumulate tokens from deleted sessions into global stats
- Track lifetime session count with incrementSessionsCreated()
- Add /api/stats endpoint for global stats
- Include globalStats in /api/status response
- Frontend shows aggregate tokens + cost in header
- Fix respawn controller config to filter undefined values
- Add 7 new tests for global stats functionality (v0.1343)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 07:26:49 +01:00
arkonandClaude Opus 4.5 5ce95ee1ba fix: respawn controller stuck after AI check and AI check PATH discovery
Two bugs fixed:

1. Respawn controller got stuck after AI check returned WORKING/ERROR.
   The pre-filter and no-output timers fired once but were never restarted,
   leaving the controller in a dead 'watching' state with no retry mechanism.
   Now restarts both timers after any non-IDLE AI check result and on
   cooldown expiry. Also seeds the controller's terminal buffer from the
   session's existing output so the first AI check has context.

2. AI idle checker couldn't find the claude binary in restricted environments
   (systemd service). The spawned screen ran `claude -p` without PATH
   augmentation. Now exports getAugmentedPath() from session.ts and prepends
   it in the AI checker's bash command.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 20:19:55 +01:00
arkonandClaude Opus 4.5 19490dd763 fix: augment PATH with claude directory instead of using absolute path
The previous fix used absolute paths to spawn claude, but the CLI itself
checks if its directory is in PATH and warns if not. Instead, find where
claude is installed and prepend its directory to PATH in the spawn
environment. This ensures both execvp resolution and Claude's own PATH
check are satisfied.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 17:47:59 +01:00
arkonandClaude Opus 4.5 03a0cc862e fix: resolve claude CLI absolute path to prevent execvp failures
When the web server runs in environments where `claude` isn't in PATH
(e.g., systemd services, non-login shells), node-pty's execvp(3) fails
with "No such file or directory". Fix by resolving the absolute path
to the claude binary using `which` with fallback to common installation
locations (~/.local/bin, /usr/local/bin, etc.). The resolved path is
cached for performance.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 17:43:31 +01:00
arkonandClaude Opus 4.5 99919d6dfb feat: replace SpawnDetector with MCP server for spawn1337 protocol
Instead of parsing terminal output for <spawn1337> tags, spawn capabilities
are now exposed as native MCP tools that Claude Code can call directly.
The MCP server (stdio transport) proxies requests to the existing REST API.

- Add src/mcp-server.ts with 6 tools: spawn_agent, list_agents,
  get_agent_status, get_agent_result, send_agent_message, cancel_agent
- Remove src/spawn-detector.ts and all references in session.ts/server.ts
- Add CLAUDEMAN_API_URL env var propagation to sessions and screens
- Write .mcp.json to case directories during creation
- Remove spawn1337 tag documentation from case-template.md
- Add claudeman-mcp bin entry to package.json

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 23:16:21 +01:00
arkonandClaude Opus 4.5 1705b7a67d feat: implement spawn1337 autonomous agent protocol
Add full lifecycle management for spawning autonomous Claude sessions as
screen-based agents. Agents communicate via filesystem message bus, signal
completion via RalphTracker <promise> mechanism, and enforce resource budgets
(tokens, cost, timeout, depth limits).

New files:
- spawn-types.ts: Types, YAML parser, factory functions, serialization
- spawn-detector.ts: Terminal pattern detection for spawn1337 tags
- spawn-orchestrator.ts: Agent lifecycle (spawn, monitor, queue, cleanup)
- spawn-claude-md.ts: CLAUDE.md generator for agent sessions

Modified:
- session.ts: SpawnDetector integration, parent/child tracking
- server.ts: Orchestrator wiring, 11 API endpoints, SSE events
- types.ts: Re-exports, SessionState additions

Tests: 80 new tests across 3 test files (all passing)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:20:37 +01:00
arkonandClaude Opus 4.5 43eaafe084 feat: persist full session state to state.json for CLI visibility
The web server now persists all per-session settings (name, mode,
auto-compact, auto-clear, respawn config, ralph state, tokens, cost)
to state.json so the CLI status/session commands can display them.
Also removes unused pendingStepConfirm property from respawn controller.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:36:06 +01:00
arkonandClaude Opus 4.5 add8f8c84b fix: memory leak prevention and resource cleanup improvements
SSE Client Management:
- Add periodic health check (30s) to detect dead SSE connections
- Clean up clients with destroyed/non-writable sockets
- Clear all SSE clients on server stop

Session Lifecycle:
- Add _isStopped flag to prevent new timers after session stops
- Check flag in auto-compact/clear callbacks to avoid timer races
- Check flag in line buffer flush timer creation

Server Shutdown:
- Add _isStopping flag to prevent timer creation during shutdown
- Skip batch timer creation in terminal/output/task/state handlers
- Clear SSE health check timer on stop

Ralph Tracker:
- Call clearDebounceTimers() in clear() method (was missing)
- Add MAX_COMPLETION_PHRASE_ENTRIES (50) to trim phrase map
- Add MAX_LINE_BUFFER_SIZE (64KB) to prevent unbounded growth
- Trim line buffer when exceeding max size

Task Tracker:
- Add timestamp to pending tool uses for age-based cleanup
- Add PENDING_TOOL_USE_MAX_AGE_MS (1 hour) expiry
- Add MAX_PENDING_TOOL_USES (100) limit
- Clean up old entries on new tool use

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:08:32 +01:00
arkonandClaude Opus 4.5 5bd1e9e536 perf: optimize terminal buffer rendering for smoother tab switches
- Reduce buffer limits (terminal: 5MB→2MB, text: 2MB→1MB) to decrease
  render payload
- Add chunkedTerminalWrite() that writes in 64KB chunks via
  requestAnimationFrame to avoid UI jank
- Add tail mode to /api/sessions/:id/terminal endpoint (?tail=256KB)
  for faster initial load on tab switch
- Show truncation indicator when earlier output is cut
- Update CLAUDE.md with new buffer limits and performance notes

Fixes jittery behavior when switching tabs with large (2MB+) buffers.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:55:16 +01:00
arkonandClaude Opus 4.5 0d1ca37b6e refactor: rename inner-loop-tracker to ralph-tracker with API improvements
- Rename inner-loop-tracker.ts → ralph-tracker.ts throughout codebase
- Add ralph-config.ts for parsing .claude/ralph-loop.local.md config
- Standardize API error responses using createErrorResponse()
- Add input validation for auto-compact/auto-clear thresholds
- Update UI labels to "Ralph / Todo Tracker" consistently
- Add 46 integration tests for Ralph tracking functionality
- Update test badge to 438 total tests

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 22:36:45 +01:00
arkonandClaude Opus 4.5 cb4cb202b9 fix: improve reliability and performance across session management
- Add state store flush on shutdown to prevent data loss from debounced saves
- Add error handling in session exit handler to ensure cleanup always runs
- Add 5s timeout to all TUI execSync calls to prevent hangs
- Cache screen -ls output with 100ms TTL (90% reduction in execSync calls)
- Add token pre-check to skip expensive regex when "token" not in data

Based on findings from security, performance, and reliability analysis.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 10:05:39 +01:00
arkonandClaude Opus 4.5 d5ae376e07 feat(tui): add web server auto-start, shell mode, and feature parity
TUI now checks if web server is running on startup and offers to start
it in the background. Added new CLI options: --with-web (auto-start),
--no-web (skip check), -p (port).

TUI feature parity with web interface:
- Shell mode: press 'h' in cases view to start bash instead of Claude
- Multi-start: press 'm' to start 1-20 sessions at once
- Respawn toggle: Ctrl+R to enable/disable respawn on Claude sessions
- Session rename: API support via useSessionManager hook

Security fixes from previous analysis:
- Command injection prevention in screen-manager.ts
- Path traversal protection in server.ts
- Input validation for shell-interpolated values

Also fixes memory leak in session.ts (timer tracking) and flaky test
timeout in session-cleanup.test.ts.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 09:54:42 +01:00
arkonandClaude Opus 4.5 d8803e3318 refactor: remove unused imports, variables, and constants
- inner-loop-tracker.ts: Comment out unused COMPLETION_SIGNAL_PATTERN, use _id
- session.ts: Remove unused execSync import and timeout constants
- task-tracker.ts: Use _context for unused parameter
- server.ts: Remove unused FastifyRequest import

All files now pass --noUnusedLocals --noUnusedParameters check.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:51:41 +01:00
arkonandClaude Opus 4.5 1a7c6d3d0f fix: prevent memory leaks from orphaned event listeners
- Store TaskTracker and InnerLoopTracker handler references in class fields
- Add cleanupTrackerListeners() method to remove handlers on stop()
- Call cleanup in stop() to prevent listener accumulation
- Fixes memory leak from listener closures capturing session references

This prevents gradual memory creep when sessions are repeatedly
created and destroyed in long-running server instances.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:50:09 +01:00
arkonandClaude Opus 4.5 645f86e9cc perf: optimize regex execution and fix promise race condition
- Add pre-check flags (hasCheckbox, hasTodoIndicator, etc.) before regex exec
- Skip regex patterns that can't match based on line characteristics
- Expected 60-75% reduction in regex executions for todo detection

- Add _promptResolved flag to guard against race conditions in runPrompt
- Capture promise callbacks atomically before processing in onExit
- Prevents double-resolution or resolution after promise is nulled

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:47:17 +01:00
arkonandClaude Opus 4.5 df91823800 fix: improve memory safety and regex pattern handling
- Add withTimeout utility for async operation protection
- Move Promise callback cleanup earlier in stop() to prevent orphaned refs
- Fix regex lastIndex resets in inner-loop-tracker (reset BEFORE test)
- Add DEFAULT_ASYNC_TIMEOUT_MS and INTERACTIVE_START_TIMEOUT_MS constants

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:34:45 +01:00
arkonandClaude Opus 4.5 78ee062c4d fix: update assignTask to use BufferAccumulator API
- Fix TypeScript error: assignTask() was still using string assignment
- Add extended timeout to session.test.ts afterAll hook to prevent
  flaky test failures during cleanup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:10:57 +01:00
arkonandClaude Opus 4.5 cab2b20730 perf: add BufferAccumulator to reduce GC pressure in hot paths
Replace string concatenation (+=) with array-based BufferAccumulator
in terminal buffer handling. This reduces garbage collection pressure
during high-throughput terminal streaming.

Changes:
- Add BufferAccumulator class with auto-trim on max size
- Convert _terminalBuffer and _textOutput to BufferAccumulator in session.ts
- Convert terminalBuffer to BufferAccumulator in respawn-controller.ts
- Remove manual trim logic (now handled by BufferAccumulator)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:55:48 +01:00
arkonandClaude Opus 4.5 9bbd00db9a feat: add CLAUDEMAN_SCREEN env var to inform Claude sessions
Claude sessions spawned by Claudeman now receive environment variables:
- CLAUDEMAN_SCREEN=1 - Indicates running within Claudeman
- CLAUDEMAN_SESSION_ID - The session's unique identifier
- CLAUDEMAN_SCREEN_NAME - The GNU Screen session name (when applicable)

This helps prevent Claude from attempting to kill its own screen session
and allows sessions to be aware of their managed environment.

Also updated the default CLAUDE.md template to document this behavior.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:30:08 +01:00
arkonandClaude Opus 4.5 e316c3ea8c docs: add JSDoc comments to session, screen-manager, and state-store
- Add comprehensive module-level documentation
- Document main classes with usage examples
- Add parameter and return type documentation to key methods
- Document constants and buffer limits

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:25:53 +01:00
arkonandClaude Opus 4.5 4f11e029e5 fix: resolve flaky tests and TypeScript errors
- Fix pty-interactive test: use shell mode for reliable output timing
- Fix session-cleanup test: account for restored sessions from parallel tests
- Fix quick-start test: increase afterAll timeout for server.stop()
- Fix scheduled-runs test: skip slow real-Claude test, increase timeout
- Fix TypeScript errors: add non-null assertions for screenSession

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:56:25 +01:00
arkonandClaude Opus 4.5 b624bf49b6 fix: strip leading blank lines from Claude session output
Screen attach outputs blank lines that appeared above Claude's banner.
Added flag to strip leading newlines from PTY data after buffer clear.

Only affects Claude sessions (not shell), matching the reported behavior.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 19:02:31 +01:00