Commit Graph

777 Commits

Author SHA1 Message Date
acamq cfab5caea3 fix(installer): add opencode-go fallback entries for deep and artistry categories
The deep and artistry category fallback chains had no opencode-go provider
entries, causing them to fall through to the ultimate fallback
(opencode/gpt-5-nano) which is not available to opencode-go users.

Add opencode-go entries:
- deep: deepseek-v4-pro -> kimi-k2.6 -> glm-5.1
- artistry: kimi-k2.6 -> glm-5.1

Fixes #3924
2026-05-10 10:11:59 -06:00
acamq c5e89f1eea fix(model-settings): support family reasoning aliases 2026-05-10 10:11:55 -06:00
YeonGyu-Kim 98da8b675b fix(installer): apply extractSemverFromOutput to opencode-binary version probe
The same output.trim() bug fixed in PR #3909 for doctor exists in the
installer's opencode-binary.ts. Without this fix, `bunx oh-my-opencode
install` would store polluted Electron stdout (e.g., `00:24:25.202 >
app starting { version: '1.14.33', packaged: true }`) as the OpenCode
version in config, breaking downstream version-dependent logic.

- Extract extractSemverFromOutput to src/shared/extract-semver.ts
  (precedent: spawn-with-windows-hide is in shared because used by
  both doctor and installer)
- src/cli/doctor/checks/system-binary.ts now imports from shared and
  re-exports for backward compat
- src/cli/config-manager/opencode-binary.ts uses the shared helper
  with `?? output.trim()` fallback to preserve legacy behavior on
  non-semver-shaped successful outputs (e.g., custom builds)
- Add 4 installer regression tests covering: clean semver, polluted
  Electron stdout (regression for #3765 installer caller), fallback
  for non-semver, null when no binary on PATH

Refs #3765
2026-05-10 15:32:36 +09:00
YeonGyu-Kim 279f0d150f fix(chat-params): guard non-positive max output tokens 2026-05-10 15:03:01 +09:00
YeonGyu-Kim f45452ae6c fix(config): use r+ mode for fsync on Windows to prevent migration retry loop
openSync with read-only mode fails fsync on Windows because FlushFileBuffers requires write-permission FD. This caused atomic writes to fail silently, leaving migrated config unwritten and triggering repeated migration + .bak.<timestamp> generation on every startup.

Same root cause as PR #3644 (#3643). Hyperplan disappear is a secondary symptom of plugin load instability.

Fixes #3877
2026-05-10 14:53:28 +09:00
YeonGyu-Kim b36389ef2c fix(team-mode): keep member communication tools visible 2026-05-10 12:54:16 +09:00
YeonGyu-Kim be2acd49b5 fix(delegate-task): hide team tools from subagents 2026-05-09 16:30:40 +09:00
YeonGyu-Kim 8eadf2056f perf(shared): avoid spawning opencode for version checks 2026-05-08 16:58:50 +09:00
YeonGyu-Kim 3a738e7047 Merge remote-tracking branch 'origin/dev' into feature/configurable-agent-ordering 2026-05-08 16:08:26 +09:00
YeonGyu-Kim 9522dd4ca4 feat(config): add configurable agent ordering 2026-05-08 16:08:18 +09:00
YeonGyu-Kim 43b0529557 feat(hooks): surface fsync-skip warnings to AI agent via tool output
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-08 15:08:34 +09:00
YeonGyu-Kim 6b69505940 feat(shared): wire tolerantFsync to record skips with path classification
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-08 15:08:19 +09:00
YeonGyu-Kim 20ae3f8ba5 feat(shared): add fsync-skip tracker and path-environment classifier
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-08 15:08:05 +09:00
YeonGyu-Kim 7735b2abd5 fix(shared): tolerate EPERM during fsync in writeFileAtomically
Replaces fsyncSync(tempFileDescriptor) with tolerantFsyncSync, allowing
EPERM/EACCES/ENOTSUP/EINVAL during fsync while still propagating real
errors. Adds an optional deps.fsyncSync injection point used solely by
the new EPERM tolerance regression tests.

Without this fix, plugin startup itself can fail on synced folders
because writeFileAtomically is used by config migrations and posthog
activity state — the same EPERM-on-fsync failure pattern reported for
team_create.
2026-05-08 14:09:17 +09:00
YeonGyu-Kim 9d83255426 feat(shared): add tolerant-fsync utility for synced-folder filesystems
Adds isToleratedFsyncError, tolerantFsync (async, FileHandle), and
tolerantFsyncSync (sync, fd) helpers that swallow filesystem-limitation
errors during fsync (EPERM, EACCES, ENOTSUP, EINVAL) while still
propagating real errors (EIO, ENOSPC, EBADF, etc.). Synced folders
like iCloud Drive, OneDrive, and antivirus-locked files reject fsync
with EPERM even though the underlying write+rename succeeded; for the
runtime data this codebase persists, losing the durability hint is
acceptable in exchange for not blocking the operation entirely.

The helper is intentionally not barrel-exported (consumers import the
file directly), matching the existing convention for write-file-atomically.
2026-05-08 14:09:16 +09:00
YeonGyu-Kim 2dfa6336f5 fix(metis): switch primary model to claude-sonnet-4-6 + correct AGENTS.md inaccuracies
Source code change:
- src/shared/model-requirements.ts: prepend claude-sonnet-4-6 to metis fallback
  chain so Sonnet becomes the default. Opus 4.7 max remains as the immediate
  fallback for callers who want extra reasoning.
- src/shared/model-requirements.test.ts: update assertion to expect Sonnet
  primary + Opus secondary.

AGENTS.md accuracy fixes (verified against source):
- Agent modes: Sisyphus/Hephaestus are 'primary' (not 'all'); Sisyphus-Junior
  is 'subagent' (not 'all'). Confirmed via 'const MODE: AgentMode = ...' in
  each agent file. Also clarified Prometheus has no agentSources factory and
  is built via buildPrometheusAgentConfig.
- Sisyphus fallback chain: corrected order to kimi-k2.6 → k2p5 → kimi-k2.5
  → gpt-5.5 medium → glm-5 → big-pickle (was missing kimi-k2.5).
- Librarian/Explore: added missing minimax-m2.7 step between -highspeed and
  claude-haiku-4-5.
- Metis chain: removed fictitious gemini-3.1-pro entry.
- Sisyphus-Junior chain: spelled out the actual fallback (was 'user-configurable').
- Temperatures: Sisyphus/Hephaestus do not set explicit temperature (model
  default); Sisyphus-Junior is 0.1 via SISYPHUS_JUNIOR_DEFAULTS.
- Quick category default: gpt-5.4-mini (not gpt-5.4-mini-fast).

Team-mode corrections:
- Eligibility registry has 3 verdicts: eligible (sisyphus, atlas, sisyphus-junior),
  conditional (hephaestus — needs D-36 teammate permission), hard-reject
  (oracle, librarian, explore, multimodal-looker, metis, momus, prometheus).
- Schema has 11 fields, not 4: added max_messages_per_run, max_wall_clock_minutes,
  max_member_turns, base_dir, message_payload_max_bytes, recipient_unread_max_bytes,
  mailbox_poll_interval_ms.
- Hooks: 'team-session-events' is 4 sub-handlers in src/plugin/event.ts
  (team-idle-wake-hint, team-lead-orphan-handler, team-member-error-handler,
  team-member-status-handler), not a single Continuation-tier hook.
- Tier counts now show base + team-mode: ToolGuard 14/15, Transform 5/7.
- Total: 52 base hooks, 59 with team-mode.

Doc cascade for the Metis change:
- docs/guide/orchestration.md, agent-model-matching.md, installation.md
- docs/reference/configuration.md, features.md
2026-05-08 13:06:34 +09:00
YeonGyu-Kim 838b5ae216 docs(agents): refresh hierarchical AGENTS.md with team-mode coverage
Update root + 43 directory-level AGENTS.md files to reflect current state:
- Root AGENTS.md rewritten with accurate counts (1967 TS files, 1304 source +
  663 test, 278k LOC, 120 barrel index.ts), 7-step init flow, 5-tier hook
  composition, and full Team Mode section (12 team_* tools, eligibility,
  storage layout, config gate)
- src/AGENTS.md adds team-mode init step, current per-subdir file/LOC table
- src/tools/AGENTS.md documents conditional gates (team-mode +12, task
  system +4, hashline +1, interactive_bash +1, look_at +1) with always-on
  baseline of 20
- src/hooks/AGENTS.md splits into 5 tiers + 4 conditional team-mode hooks
- src/features/team-mode/AGENTS.md surfaces 12 tools, eligible agents,
  spawn-race-safe invariants, and integration points
- src/features/builtin-skills/AGENTS.md tracks 10 skills incl. team-mode
- src/agents/AGENTS.md, src/plugin/AGENTS.md, src/config/AGENTS.md updated
  for team-mode awareness, accurate counts, and current schema field list
- All other AGENTS.md files refreshed to 2026-05-08 generation date
2026-05-08 12:08:42 +09:00
ShishaBoyTJ 8236d7d6b8 fix: support cmux tmux compatibility 2026-05-07 19:25:50 +09:00
YeonGyu-Kim 6b49e3bddc test agent runtime sort behavior 2026-05-07 18:52:44 +09:00
YeonGyu-Kim ee938aa097 fix full-suite isolation regressions 2026-05-07 18:36:03 +09:00
YeonGyu-Kim 8586cb8965 fix(posthog): disable feature flags, remove plugin_loaded event for billing optimization
- Remove plugin_loaded telemetry from index.ts (was 46.5% of all events, ~2.83M/month)
- Add enableLocalEvaluation: false to prevent feature flag polling/decide calls
- Add strictLocalEvaluation: true to prevent server fallback requests
- Add disableRemoteConfig: true to prevent remote config network requests
- Remove 'plugin_loaded' from PostHogActivityReason type
- Update tests: remove stale mocks, add SDK options verification test
- enableExceptionAutocapture: false already present (kept)

Estimated billing reduction: ~$960+/month from feature flag requests,
plus ~2.83M fewer events/month from plugin_loaded removal.
2026-05-07 16:44:05 +09:00
tw-yshuang fac90d69f8 fix(delegate-task): harden child-session fallback bootstrap and cleanup
Capture delegated child-session retry context before the first prompt so fallback recovery still works when session history is empty. Align background and sync launch paths around the same bootstrap contract, clear session-scoped fallback state on every terminal path, and lock the behavior with regression coverage for first-prompt retries, exhaustion, isolation, and cleanup.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-07 08:34:52 +08:00
YeonGyu-Kim 7bd863b214 Merge pull request #3813 from code-yeongyu/fix/agent-name-backslash-sanitize
fix(agent): sanitize backslash/quote from agent name
2026-05-06 18:14:39 +09:00
YeonGyu-Kim 25d183fbe8 fix(agent): sanitize backslash/quote from agent name in launch() and background-executor
Agent names like \hephaestus\ cause 'Agent not found' errors because
sanitizeSubagentType() was only called in subagent-resolver.ts but not
in the direct manager.launch() path or background-executor.ts.

- manager.ts: strip leading/trailing backslash/quote chars from input.agent
  before validation so \hephaestus\ → hephaestus
- background-executor.ts: call sanitizeSubagentType(args.subagent_type)
  instead of passing raw value to manager.launch()
- agent-display-names.ts: reuse sanitizeSubagentType in stripAgentListSortPrefix
- Add unit tests for all three fix points

Fixes: sessions dying with 'Agent not found: \hephaestus\'
2026-05-06 17:41:41 +09:00
YeonGyu-Kim 37d981ef1f Merge pull request #3634 from auyua9/fix/ast-grep-pattern-hints
fix(ast-grep): restore pattern hints in tools
2026-05-06 17:15:17 +09:00
YeonGyu-Kim 0a7306c6c1 Merge pull request #3637 from ihoooohi/fix/claude-thinking-legacy-alias-collision
fix(aliases): stop rewriting canonical claude-opus-4-6-thinking
2026-05-06 17:15:09 +09:00
YeonGyu-Kim 9b87fd5019 Merge pull request #3744 from Arcadi4/dev
Allow "max" option for "reasoningEffort" field in config schema
2026-05-06 17:14:57 +09:00
Samuele Domenico Ruffino 467a4a5eed fix(test): use toContain instead of providers[0].toBe for multi-provider entries
Restore consistent assertion style in librarian and explore tests.
Multi-provider entries like ["opencode-go", "vercel"] should use
toContain() not providers[0].toBe() to match the established pattern.
2026-05-06 16:51:59 +09:00
Samuele Domenico Ruffino b7d77da88f fix(capabilities): add kimi-k2.6 to supplemental model entries
kimi-k2.6 is referenced in fallback chains but missing from the bundled snapshot (which only has kimi-k2.5). Added supplemental entry with specs matching models.dev data.
2026-05-06 16:51:59 +09:00
Samuele Domenico Ruffino 6cd40df4cb feat(opencode-go): upgrade glm-5 → glm-5.1 and kimi-k2.5 → kimi-k2.6 in fallback chains 2026-05-06 16:45:30 +09:00
Samuele Domenico Ruffino 0727d9a1a3 fix(opencode-go): replace non-existent minimax-m2.7-highspeed with qwen3.5-plus 2026-05-06 16:45:30 +09:00
Matan Kushner 01c8a2a927 feat(shared): add findProjectOpencodePluginConfigFiles walker
Walks up the directory tree from a start directory looking for
.opencode/oh-my-openagent.json[c] (or legacy basename) files. Returns
detected paths in nearest-first order, optionally stopping at a
caller-provided directory.

Reuses detectPluginConfigFile so canonical/legacy basename detection,
caching, and JSONC vs JSON precedence stay consistent with existing
config loading. Foundation for #417 hierarchical config discovery.
2026-05-06 15:53:53 +09:00
YeonGyu-Kim 3749656a2b Merge pull request #3784 from matchai/chore/remove-redundant-env-restore
test: remove redundant local env restoration
2026-05-06 15:44:54 +09:00
YeonGyu-Kim 4e5980d7a9 fix(tmux): avoid Bun global in runner bundle
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-06 14:30:29 +09:00
YeonGyu-Kim ea5e3e034e fix(model): allow artistry category fallbacks
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-06 14:20:50 +09:00
YeonGyu-Kim 2ffe5afe2e feat(shared): add supplemental model capability entries for team-mode 2026-05-06 14:19:40 +09:00
YeonGyu-Kim c79addb626 test(shared): expand migrate-legacy-config-file tests for team-mode 2026-05-06 14:19:40 +09:00
YeonGyu-Kim 34b659a3b1 feat(shared): update agent display names for team-mode 2026-05-06 14:19:40 +09:00
YeonGyu-Kim 4a5e7cf2cf feat(tmux): add window-spawn utility with tests 2026-05-06 14:17:41 +09:00
YeonGyu-Kim 13b3bd9e72 feat(tmux): add session-spawn utility with tests 2026-05-06 14:17:19 +09:00
YeonGyu-Kim ad315987c7 feat(tmux): add session-kill utility with runner tests 2026-05-06 14:16:57 +09:00
YeonGyu-Kim 56250a468c feat(tmux): add pane-spawn utility with runner tests 2026-05-06 14:16:57 +09:00
YeonGyu-Kim f93e15b2a9 feat(tmux): add pane-replace utility with tests 2026-05-06 14:16:27 +09:00
YeonGyu-Kim d90102042b feat(tmux): add pane-dimensions utility with tests 2026-05-06 14:15:17 +09:00
YeonGyu-Kim cfce0cc31f refactor(tmux): migrate pane-close to runner and expand test coverage 2026-05-06 14:14:52 +09:00
YeonGyu-Kim b9a40f0c8c refactor(tmux): migrate layout commands to typed runner 2026-05-06 14:14:52 +09:00
YeonGyu-Kim c9e544a667 refactor(tmux): export sweepTmuxSessionsWith and add runtime tests 2026-05-06 14:14:15 +09:00
YeonGyu-Kim 96161cc0e6 feat(tmux): introduce typed tmux command runner abstraction 2026-05-06 14:14:15 +09:00
YeonGyu-Kim 10684857e3 Merge pull request #3798 from code-yeongyu/fix/node-runtime-compat
fix(bun-spawn-shim): eliminate globalThis.Bun top-level destructures (#3797)
2026-05-06 13:33:11 +09:00
YeonGyu-Kim 9dd0e14733 fix(bun-spawn-shim): match Bun.spawn semantics in Node fallback
Address cubic and oracle review feedback to make the Node/Electron
fallback faithful to Bun.spawn behavior so cross-runtime callers
behave identically.

Changes:
- resolveStdio() default stdio is now ["ignore", "pipe", "inherit"]
  to match Bun.spawn defaults (was ["pipe", "pipe", "pipe"]).
  Prevents hangs in dispatcher and on-complete-hook callers that
  did not explicitly set stdin and would otherwise wait forever
  for input on Node.
- spawn-with-windows-hide.ts uses the same defaults so the Windows
  Node helper aligns with the rest of the shim.
- wrapNodeProcess now rejects proc.exited with the original error
  on "error" events (previously swallowed the error and resolved
  to exit code 1, hiding ENOENT and friends).
- spawnSync result returns the real result.pid instead of -1 and
  exposes stdout/stderr as Buffer | undefined to match Node's
  spawnSync result shape when those streams are not piped.

Tests cover the new defaults, real pid surfacing, and missing
executable error propagation.

Refs cubic review and oracle audit on #3798.
2026-05-06 13:28:21 +09:00