Commit Graph

2033 Commits

Author SHA1 Message Date
YeonGyu-Kim ea0c45ad1b feat(hooks): wire pluginConfig to preemptive-compaction hook factory 2026-02-22 17:19:46 +09:00
YeonGyu-Kim ce89364c69 feat(recovery-strategy): apply compaction model override in context window recovery 2026-02-22 17:19:43 +09:00
YeonGyu-Kim 8f9b73c82e feat(preemptive-compaction): apply compaction model override from agent config 2026-02-22 17:19:39 +09:00
YeonGyu-Kim 6fae60b947 feat(schema): add compaction model and variant override configuration 2026-02-22 17:19:35 +09:00
YeonGyu-Kim 183f12eac0 feat(hooks): add compaction-model-resolver utility for session agent model lookup 2026-02-22 17:19:31 +09:00
YeonGyu-Kim fac2808e70 chore(tests): remove duplicate test in background-update-check (cubic feedback) 2026-02-22 16:51:04 +09:00
YeonGyu-Kim 584b1478ba refactor(tests): rewrite 5 over-mocked test files to test real behavior
- formatter.test.ts: use dynamic imports with cache-busting to avoid mock pollution from runner.test.ts; test real format output instead of dispatch mocking
- hook.test.ts: rewrite with proper branch coverage (7 tests), add success/guard/subagent paths
- background-update-check.test.ts: rewrite with 10 tests covering all branches (early returns, pinned versions, auto-update success/failure)
- directory-agents-injector/injector.test.ts: replace finder/storage mocks with real filesystem + temp directories, verify actual AGENTS.md injection content
- directory-readme-injector/injector.test.ts: same pattern as agents-injector but for README.md, verifies root inclusion behavior
2026-02-22 16:43:56 +09:00
YeonGyu-Kim e2ab76261d feat(write-existing-file-guard): allow writes outside session directory
Remove blocking logic that prevented writes to files outside the
session directory. The guard now only applies to files within the
session directory, allowing free writes to external paths.

- Remove OUTSIDE_SESSION_MESSAGE constant
- Update test to expect outside writes to be allowed
- Add early return for paths outside session directory
- Keep isPathInsideDirectory for session boundary check

TDD cycle:
1. RED: Update test expectation
2. GREEN: Implement early return for outside paths
3. REFACTOR: Clean up unused constants
2026-02-22 15:43:19 +09:00
YeonGyu-Kim 53403eeaad refactor(background-agent): wire session-idle-event-handler into manager, add unit tests
The extracted handleSessionIdleBackgroundEvent was never imported by
manager.ts — dead code from incomplete refactoring (d53bcfbc). Replace
the inline session.idle handler (58 LOC) with a call to the extracted
function, remove unused MIN_IDLE_TIME_MS import, and add 13 unit tests
covering all edge cases.
2026-02-22 15:30:40 +09:00
YeonGyu-Kim 11ea988c01 feat(agents,hooks): wire Sisyphus Gemini overlays and add Gemini verification reminder
Sisyphus: inject TOOL_CALL_MANDATE after intent gate, append delegation
and verification override sections for Gemini models.

Atlas hook: add VERIFICATION_REMINDER_GEMINI with stronger language -
'EXTREMELY SUSPICIOUS', explicit 'NOT reasoning, TOOL CALLS', and
consequence-driven framing for Gemini's optimistic tendencies.
2026-02-22 15:30:40 +09:00
YeonGyu-Kim e87579b687 feat(agents): wire Gemini prompt routing into Sisyphus-Junior, Atlas, Prometheus
Add 'gemini' to prompt source types and route Gemini models to new
Gemini-optimized prompts via isGeminiModel detection. Update barrel
exports for all 3 agent modules. All existing tests pass.
2026-02-22 15:30:40 +09:00
YeonGyu-Kim 3f9b5e6f44 feat(agents): add isGeminiModel detection function with TDD
Detects Gemini models via:
- Provider prefixes: google/, google-vertex/
- GitHub Copilot: github-copilot/gemini-*
- Model name: gemini-* (for proxied providers like litellm)

Follows existing isGptModel pattern. All 16 tests pass.
2026-02-22 15:30:40 +09:00
YeonGyu-Kim 0425c75447 feat(agents): add Gemini-optimized prompts for Sisyphus, Sisyphus-Junior, Prometheus, Atlas
Gemini models are aggressively optimistic and avoid tool calls in favor of
internal reasoning. These prompts counter that with:
- TOOL_CALL_MANDATE sections forcing actual tool usage
- Anti-optimism checkpoints before claiming completion
- Stronger delegation enforcement (Gemini prefers doing work itself)
- Aggressive verification language (subagent results are 'EXTREMELY SUSPICIOUS')
- Mandatory thinking checkpoints in Prometheus (prevents jumping to conclusions)
- Scope discipline reminders (creativity → implementation quality, not scope creep)
2026-02-22 15:30:40 +09:00
YeonGyu-Kim b1a9aa9f87 fix(grep): format files_with_matches output as clean file paths 2026-02-22 15:19:26 +09:00
YeonGyu-Kim c52d6c06d4 Merge pull request #2009 from JiHongKim98/fix/ripgrep-cpu-throttle
fix(tools): throttle ripgrep CPU usage with thread limits and concurrency control
2026-02-22 15:09:26 +09:00
YeonGyu-Kim f2c989662a Merge pull request #2030 from acamq/feature/agent-input-notifications
feat(notification): alert when agent asks questions or needs permission
2026-02-22 15:09:24 +09:00
YeonGyu-Kim 1a6ee9a8d5 Merge pull request #2029 from coleleavitt/fix/plug-resource-leaks
fix: plug resource leaks and add hook command timeout
2026-02-22 15:07:02 +09:00
YeonGyu-Kim 7b66b0e9b9 fix(hashline-edit): correct offset advancement and fuzzy index mapping in merge expand
- Track matchedLen separately for stripped continuation token matches
- Map fuzzy index back to original string position via character-by-character
  scan that skips operator chars, fixing positional correctness
2026-02-22 14:50:59 +09:00
YeonGyu-Kim 434b5fbd5d fix(hashline-edit): integrate continuation/merge helpers into expand logic and strengthen tool description
- maybeExpandSingleLineMerge now uses stripTrailingContinuationTokens and
  stripMergeOperatorChars as fallback matching strategies
- Add 'refs interpreted against last read' atomicity clause to tool description
- Add 'output tool calls only; no prose' rule to tool description
2026-02-22 14:46:59 +09:00
YeonGyu-Kim 6ab3dc35b0 fix(hashline-edit): align autocorrect, BOM/CRLF, and tool description with oh-my-pi
- Rewrite restoreOldWrappedLines to use oh-my-pi's span-scanning algorithm
- Add stripTrailingContinuationTokens and stripMergeOperatorChars helpers
- Fix detectLineEnding to use first-occurrence logic instead of any-match
- Fix applyAppend/applyPrepend to replace empty-line placeholder in empty files
- Enhance tool description with 7 critical rules, tag guidance, and anti-patterns
2026-02-22 14:40:18 +09:00
YeonGyu-Kim 3ba84d2107 feat(hashline-edit): add autocorrect, BOM/CRLF normalization, and file creation support
Implements key features from oh-my-pi to improve agent editing success rates:

- Autocorrect v1: single-line merge expansion, wrapped line restoration,
  paired indent restoration (autocorrect-replacement-lines.ts)
- BOM/CRLF normalization: canonicalize on read, restore on write
  (file-text-canonicalization.ts)
- Pre-validate all hashes before mutation (edit-ordering.ts)
- File creation via append/prepend operations (new types + executor logic)
- Modular refactoring: split edit-operations.ts into focused modules
  (primitives, ordering, deduplication, diff, executor)
- Enhanced tool description with operation choice guide and recovery hints

All 50 tests pass. TypeScript clean. Build successful.
2026-02-22 14:13:59 +09:00
YeonGyu-Kim 0be74980db fix: address Oracle + Cubic review feedback for background-agent refactoring
- Revert getMessageDir to original join(MESSAGE_STORAGE, sessionID) behavior
- Fix dead subagentSessions.delete by capturing previousSessionID before tryFallbackRetry
- Add .unref() to process cleanup setTimeout to prevent 6s hang on Ctrl-C
- Add missing isUnstableAgent to fallback retry input mapping
- Fix process-cleanup tests to use exit listener instead of SIGINT at index 0
- Swap test filenames in compaction-aware-message-resolver to exercise skip logic correctly
2026-02-22 12:14:26 +09:00
YeonGyu-Kim cb49ab1d67 test(background-agent): add unit tests for extracted modules
Add 104 new tests across 4 test files:
- error-classifier.test.ts (80 tests): isRecord, isAbortedSessionError, getErrorText, extractErrorName, extractErrorMessage, getSessionErrorMessage
- fallback-retry-handler.test.ts (19 tests): retry logic, fallback chain, concurrency release, session abort, queue management
- process-cleanup.test.ts (7 tests): signal registration, multi-manager shutdown, cleanup on unregister
- compaction-aware-message-resolver.test.ts (13 tests): compaction agent detection, message resolution with temp dirs (pre-existing, verified)

Total background-agent tests: 161 -> 265 (104 new, 0 regressions)
2026-02-22 11:59:06 +09:00
YeonGyu-Kim a4b841b929 refactor(background-agent): extract inline logic from manager.ts into focused modules
Extract 5 concerns from BackgroundManager into dedicated modules:
- error-classifier.ts: enhance with extractErrorName, extractErrorMessage, getSessionErrorMessage, isRecord
- fallback-retry-handler.ts: standalone tryFallbackRetry with full retry logic
- process-cleanup.ts: registerManagerForCleanup/unregisterManagerForCleanup
- compaction-aware-message-resolver.ts: isCompactionAgent/findNearestMessageExcludingCompaction
- Delete notification-builder.ts (duplicate of background-task-notification-template.ts)

Manager.ts method bodies now delegate to extracted modules.
Wire duration-formatter.ts and task-poller.ts (existing but unused).

manager.ts: 2036 -> 1647 LOC (19% reduction).
All 161 existing tests pass unchanged.
2026-02-22 11:58:57 +09:00
Cole Leavitt eb1f34072b fix: add proc.kill fallback when process group kill fails 2026-02-21 16:45:18 -07:00
Cole Leavitt 1af8020758 fix: kill process group on timeout and handle stdin EPIPE
- Use detached process group (non-Windows) + process.kill(-pid) to kill
  the entire process tree, not just the outer shell wrapper
- Add proc.stdin error listener to absorb EPIPE when child exits before
  stdin write completes
2026-02-21 16:45:00 -07:00
Cole Leavitt 2381400ff4 fix: handle signal-killed exit code and guard SIGTERM kill
- code ?? 0 → code ?? 1: signal-terminated processes return null exit code,
  which was incorrectly coerced to 0 (success) instead of 1 (failure)
- wrap proc.kill(SIGTERM) in try/catch to match SIGKILL guard and prevent
  EPERM/ESRCH from crashing on already-dead processes
2026-02-21 16:45:00 -07:00
Cole Leavitt 7ab4b7510f fix: plug resource leaks and add hook command timeout
- LSP signal handlers: store refs, return unregister handle, call in stopAll()
- session-tools-store: add per-session deleteSessionTools(), wire into session.deleted
- executeHookCommand: add 30s timeout with SIGTERM→SIGKILL escalation
2026-02-21 16:44:59 -07:00
acamq 2f9ec22495 fix(notification): use permission.asked and main-session fallback 2026-02-21 16:42:23 -07:00
acamq aae4363b56 feat(notification): alert when agent asks questions or needs permission 2026-02-21 16:01:38 -07:00
YeonGyu-Kim 08ba7ca0c8 Merge branch 'origin/dev' into dev
Resolves conflicts in hashline-edit module:

- Accept Cubic-reviewed fixes from origin/dev

- Maintains: insert_before, insert_between, streaming formatters, strict validation

- Includes: hashline-chunk-formatter.ts extracted module

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-22 04:48:30 +09:00
YeonGyu-Kim 2615fd0d73 fix(hashline-edit): address Cubic review issues - boundary echo, chunking dedup, empty stream alignment
- Fix single-line anchor-echo stripping to trigger empty-insert validation

- Fix trailing boundary-echo stripping for boundary-only payloads

- Extract shared chunking logic to hashline-chunk-formatter

- Align empty stream/iterable handling with formatHashLines

- Add regression tests for all fixes
2026-02-22 03:54:31 +09:00
YeonGyu-Kim 8f424de41b feat(hashline-edit): add anchor insert modes and strict insert validation 2026-02-22 03:38:47 +09:00
YeonGyu-Kim c9f153a464 feat(hashline-edit): add anchor insert modes and strict insert validation 2026-02-22 03:38:04 +09:00
YeonGyu-Kim b4399ffc8e feat(sisyphus): add deep parallel delegation section to prompt
Add buildDeepParallelSection() function that injects guidance for non-Claude
models on parallel deep agent delegation:
- Detect when model is non-Claude and 'deep' category is available
- Inject instructions to decompose tasks and delegate to deep agents in parallel
- Give goals, not step-by-step instructions to deep agents
- Update Sisyphus prompt builder to pass model and call new function

This helps GPT-based Sisyphus instances leverage deep agents more effectively
for complex implementation tasks.

🤖 Generated with assistance of OhMyOpenCode
2026-02-22 03:20:57 +09:00
YeonGyu-Kim ad11fee2e3 fix(delegate-task): aggressive tool description to prevent missing category/subagent_type
Problem: Agents frequently omit both 'category' and 'subagent_type' parameters
when calling the task() tool, causing validation failures. The JSON Schema
marks both as optional, and LLMs follow schema structure over description text.

Solution (Option A): Add aggressive visual warnings and failure-mode examples
to the tool description:
- ⚠️ CRITICAL warning header
- COMMON MISTAKE example showing what will FAIL
- CORRECT examples for both category and subagent_type usage
- Clear explanation that ONE must be provided

Tests: All 153 existing tests pass (no behavior change, only prompt improvement)
2026-02-22 02:51:03 +09:00
YeonGyu-Kim 6517665d36 fix(test): use static imports and strategy-level spies in executor.test.ts for CI stability 2026-02-22 02:42:59 +09:00
YeonGyu-Kim 88cb360b87 fix(test): harden executor.test.ts mock isolation for CI batch runs 2026-02-22 02:31:27 +09:00
YeonGyu-Kim 9e4c27e0e1 fix(test): flush fake timer microtasks in todo continuation tests 2026-02-22 02:18:47 +09:00
YeonGyu-Kim f1246ef110 refactor(hooks): remove beast-mode system integration
Remove the beast-mode-system hook and all transform wiring so Copilot-specific prompt injection is fully eliminated from the runtime pipeline.
2026-02-22 01:57:22 +09:00
YeonGyu-Kim c1f17136b1 feat(config): disable runtime_fallback by default (opt-in) 2026-02-22 01:54:34 +09:00
YeonGyu-Kim 0bb599722e feat(config): allow runtime_fallback to be configured as boolean
Enable simple boolean configuration for runtime_fallback:
- "runtime_fallback": true - Enable with defaults
- "runtime_fallback": false - Disable
- "runtime_fallback": { ... } - Advanced object config (existing)

Updated schema, event handler, chat-message handler, and session hooks
to handle both boolean and object formats.
2026-02-22 01:44:53 +09:00
YeonGyu-Kim 111ae5ea5a fix(hooks): use model cache availability with timeout for first-run cache creation
Replace fire-and-forget pattern with await + 10s timeout for initial

cache creation. Check model cache availability (not connected providers)

to properly coordinate with model-cache-warning hook.

Remove non-null assertion and add proper error logging.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-21 18:32:10 +09:00
YeonGyu-Kim 9fc825e748 fix(hooks): swap execution order to create cache before checking
Ensure cache creation runs before cache warning check to prevent false

'Model Cache Not Found' warnings on first run.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-21 18:32:01 +09:00
YeonGyu-Kim ccbec13c9e feat(hooks): add task-reminder hook for task tool usage tracking
Injects a reminder after 10 tool turns without task tool usage. Tracks
per-session counters and cleans up on session deletion.

🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 17:07:39 +09:00
YeonGyu-Kim ff683386f1 feat(hooks): add hashline-edit-diff-enhancer for Write tool diff metadata
Captures file content before/after Write tool execution and injects unified
diff into tool output metadata. TUI reads metadata.diff for rendering.

🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 17:07:34 +09:00
YeonGyu-Kim ce365d6fb2 feat(delegate-task): pass directory option through skill discovery
🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-02-21 17:07:29 +09:00
YeonGyu-Kim e263156335 fix: resolve ultrabrain review findings
- Remove runtime-fallback gate from session.status retry handler — runtime-fallback
  has no session.status handler, so gating it causes retry signals to be silently dropped
- Fix background_output full_session arg description: default is true, not false
2026-02-21 16:40:15 +09:00
YeonGyu-Kim ace914f1ef fix: resolve publish blockers for v3.7.4→v3.8.0 release
- Fix #1991 crash: optional chaining for task-history sessionID access
- Fix #1992 think-mode: add antigravity entries to HIGH_VARIANT_MAP
- Fix #1949 Copilot premium misattribution: use createInternalAgentTextPart
- Fix #1982 load_skills: pass directory to discoverSkills for project-level skills
- Fix command priority: sort scopePriority before .find(), project-first return
- Fix Google provider transform: apply in userFallbackModels path
- Fix ralph-loop TUI: optional chaining for event handler
- Fix runtime-fallback: unify dual fallback engines, remove HTTP 400 from retry,
  fix pendingFallbackModel stuck state, add priority gate to skip model-fallback
  when runtime-fallback is active
- Fix Prometheus task system: exempt from todowrite/todoread deny
- Fix background_output: default full_session to true
- Remove orphan hooks: hashline-edit-diff-enhancer (redundant with hashline_edit
  built-in diff), task-reminder (dead code)
- Remove orphan config entries: 3 stale hook names from Zod schema
- Fix disabled_hooks schema: accept arbitrary strings for forward compatibility
- Register json-error-recovery hook in tool-guard pipeline
- Add disabled_hooks gating for question-label-truncator, task-resume-info,
  claude-code-hooks
- Update test expectations to match new behavior
2026-02-21 16:24:18 +09:00
YeonGyu-Kim f5a35f0353 refactor: remove slashcommand tool implementation 2026-02-21 14:38:18 +09:00