Commit Graph
6022 Commits
Author SHA1 Message Date
can1357 ef126fd0f6 fix(ai): fixed Google empty STOP retries to emit a single stream start event
- Added shared Google empty-stream retry constants and reused them in CLI.
- Replaced local content checks with hasMeaningfulGoogleContent for retry gating.
- Refactored streamGoogleGenAI to bound empty STOP retries with state reset and reopen.
- Moved stream start emission before retry loops to avoid duplicate start events.
2026-06-13 16:58:04 +02:00
can1357 bb2c018db9 fix(coding-agent): switched startup model checks to configured auth validation
- Replaced async getApiKey probing with modelRegistry.hasConfiguredAuth during session model restore and fallback selection.
- Removed the per-provider key cache and avoided startup getApiKey/network work by checking configured auth synchronously.
- Deferred real key retrieval to the request-time resolver while preserving existing model selection flow.
2026-06-13 16:52:23 +02:00
can1357 82d3502897 wip: fsync 2026-06-13 16:48:41 +02:00
can1357 e30c642126 fix: corrected assistant render and reveal logic to skip blank thinking
- Filtered dot-only or blank thinking blocks so they no longer render as assistant thought.
- Adjusted assistant-message and streaming-reveal logic to use visible-thinking helpers for consistency.
2026-06-13 16:26:51 +02:00
can1357 92fba8d486 fix: addressed model-aware image handling for tool image WebP filtering
- Added model-aware session image normalization by passing active model.
- Propagated model-derived WebP exclusion into browser snapshot capture and resizing.
- Applied model-derived WebP exclusion to eval, fetch, read, and inspect image paths.
2026-06-13 16:17:56 +02:00
can1357 d4d89fadb9 fix: resolved queued-message flush flow by coalescing in-flight calls
- Coalesced concurrent interruptAndFlushQueuedMessages() calls through one in-flight promise.
- Replaced continue()-retry logic with agent.prompt() to flush queued messages from empty contexts.
- Skipped queued-message flush replay while compacting or streaming to avoid turn overlap.
- Updated flush path to consume queued steering first, then follow-ups, via dequeuing helper.
- Added a regression test for empty-state interrupt-and-flush delivering queued steers safely.
2026-06-13 16:17:56 +02:00
can1357 e1e11e5256 feat: added model-aware image handling for session tools and webp
- Added getActiveModel support to session/tool interfaces for propagating active model objects.
- Added model capability helpers to flag WebP-unfriendly Ollama backends for image resize options.
- Updated image normalization and loading to auto-disable/reencode WebP when model constraints require it.
2026-06-13 16:17:56 +02:00
can1357 39efdfe91b fix(coding-agent): coalesced queued steer flushes to avoid AgentBusyError interrupt races
- Coalesced repeated interrupt-and-flush calls into one queued-steer resume flow.
- Retried queued continues on AgentBusyError after waitForIdle up to a 30s timeout.
- Handled queue-flush failures in input controllers with warning logs and TUI error display.
2026-06-13 15:52:25 +02:00
can1357 69051241f1 fix(ai): added finite output-token fallback when model maxTokens is unknown
- Applied a finite 64,000-token fallback for OpenAI completion requests when model maxTokens is unavailable.
- Refactored stream max-token computation to use a shared helper and preserve a finite cap when caller and model limits are null.
- Added regression coverage for null maxTokens flows and bumped the model-cache schema to invalidate entries using retired unknown-limit sentinels.
2026-06-13 15:52:06 +02:00
can1357 b7b201ae48 fix(coding-agent): avoided blocking auth resolution during model switches
- Updated AgentSession.setModel and setModelTemporary to validate credentials with hasConfiguredAuth instead of eagerly resolving API keys.
- Changed ModelRegistry.hasConfiguredAuth to probe configured credentials without executing command-backed key programs or refreshing OAuth tokens.
- Added model switch auth tests that verify resolver calls were removed and unconfigured models are rejected synchronously.
2026-06-13 15:39:04 +02:00
can1357 f0c6a54f51 fix: handled unknown model limits as null to avoid artificial token caps
- Replaced unknown model contextWindow/maxTokens sentinels with nullable values across types and catalog data.
- Mapped request token calculations to treat null maxTokens as unlimited output caps.
- Updated remote compaction and context checks to ignore unknown limits by using Infinity/0 fallbacks.
- Adjusted CLI/model registry flows to skip cap enforcement for null limits and render unknown values as '-'.
2026-06-13 15:35:40 +02:00
can1357 9dcaf1ae6b feat(cli): added omp models command and replaced --list-models listing flow
- Added `omp models` command with `ls`, `find`, `canonical`, and `refresh` actions.
- Removed top-level `--list-models` parsing from CLI args, launch, and main command flow.
- Implemented action-driven model listing with provider filtering, extension loading, and `--json` output.
- Updated unknown provider/model errors and tests to direct users to `omp models` guidance.
2026-06-13 15:00:25 +02:00
can1357 21a839fdce fix(coding-agent): preserved working loader during interrupt-queued resumption
- InputController now acknowledged empty-submit interrupts before flushing queued steering or queued-abort paths to preserve interrupting feedback.
- EventController now recreated the loading animation on interrupt acknowledgement and deferred end-of-turn teardown while queued resume recovery was still arming.
- AgentSession exposed an isResumingQueuedMessages phase around interruptAndFlushQueuedMessages so stale agent_end events no longer tear down the loader prematurely.
2026-06-13 14:52:40 +02:00
can1357 a2e63c70b0 feat(coding-agent): enabled discovered MCP server auth and namespaced reauth targets
- Allowed colon-separated MCP server names in validation and updated validation errors.
- Added discovery-aware MCP config resolution for /mcp auth, test, and unauth flows.
- Changed streaming behavior so superseded agent_end events don't stop active loaders.
2026-06-13 14:31:33 +02:00
can1357 bcabe9c4be fix(coding-agent/modes): skipped interrupted agent_end teardown during active streaming
- Short-circuited agent-end handling when a session was still streaming.
- Skipped turn-teardown steps for superseded agent_end events that arrived out of order.
2026-06-13 14:21:06 +02:00
chan1103 4b136b0710 fix: align Mermaid ASCII box borders for CJK/emoji labels
beautiful-mermaid@1.1.3 measures label width in UTF-16 code units, but
terminals render East Asian characters (Hangul/CJK/kana) and emoji 2
columns wide, so fenced mermaid blocks in assistant messages and
render_mermaid tool output had misaligned box borders for non-Latin
labels (upstream: lukilabs/beautiful-mermaid#119, #122).

Adds a patchedDependencies entry rebuilding the ASCII renderer to
measure terminal display columns: grapheme-cluster segmentation
(Intl.Segmenter), wcwidth-style policy (East Asian Wide + emoji
presentation + ZWJ/VS16/flag sequences = 2 columns; text-presentation
symbols like the renderer's own arrowheads stay narrow), and atomic
wide-glyph cell pairs so label collisions cannot shift row widths.

The patch modifies only existing files (bun cannot patch in new files,
and the exports "bun" condition loads src/ directly, so both src and
dist are patched). It mirrors the upstream PR and should be dropped
once the fix ships in a beautiful-mermaid release; a new CJK alignment
regression test keeps that transition honest.

Verified: bun test packages/coding-agent/test/modes/components/
assistant-message-mermaid.test.ts (8 pass, incl. new display-column
alignment regression test); bun test packages/utils (154 pass); Korean
flowchart renders with uniform display-column row widths through the
patched package.
2026-06-13 16:44:17 +09:00
can1357 6e8a56e24e fix(deps): migrated OpenAI providers to wire-based streaming and removed SDK dependency
- Replaced Azure and OpenAI provider calls with `postOpenAIStream` flow.
- Fixed stream error handling by retaining status, headers, and body on failures.
- Fixed stream parsing by handling raw JSON SSE frames and `[DONE]` events.
- Added `OpenAIHttpError` with parsed messages and timeout-aware retry behavior.
- Added remote-compaction tests for timeout, abort, and 500-fallback behavior.
2026-06-13 00:43:24 +02:00
can1357 f573e17e21 fix(coding-agent/modes): fixed Esc handling for compaction, handoff, and retry cancellation
- InputController now dispatched Esc to active viewSession operations, aborting compaction, handoff, and retry directly.
- Removed competing onEscape handler swaps across command and event controllers so overlapping auto/manual flow events no longer overwrote cancellation callbacks.
- Compaction now propagated fetch options and rethrew aborted signals so cancellations were not treated as remote failures.
2026-06-13 00:33:07 +02:00
can1357 95ec4f8bcb refactor(packages/coding-agent): migrated named zod imports and types
- Switched extensibility loader imports from namespace-style `zod` imports to named `z` imports in `zod/v4`.
- Updated extensibility type interfaces to use `typeof z` for injected `zod` modules in hook, extension, tool, and command APIs.
2026-06-13 00:24:45 +02:00
can1357 5691a039de refactor(packages/coding-agent): restructured acp 0.25 session state
- Removed `userMessageId` from `AcpAgent` prompt state and response payloads.
- Removed `models` from new/load/resume/fork session responses and deleted model-state building.
- Removed `unstable_setSessionModel` and routed model changes through `setSessionConfigOption`.
2026-06-13 00:20:05 +02:00
can1357 db573f713e fix(packages/coding-agent): resolved empty-stop retry handling regression
- Excluded assistant "thinking" content from non-empty stop detection in #isEmptyAssistantStop().
- Replaced the empty-stop retry prompt with the <system-injection> wrapper.
- Updated empty-stop reminder detection to accept <system-injection> messages.
- Added regression coverage for thinking-only stop retries to prevent skipped assistant output.
2026-06-13 00:20:05 +02:00
can1357 f33c7392fd Merge remote-tracking branch 'origin/farm/76b4d961/mnemopi-stable-bank-id' 2026-06-13 00:06:07 +02:00
can1357 f34610b1ee Merge remote-tracking branch 'origin/farm/428ce54a/sqlite-busy-recovery-during-concurrent-s' 2026-06-13 00:05:51 +02:00
can1357 c6f83c489f Merge remote-tracking branch 'origin/farm/4e128dc2/windows-image-attachment' 2026-06-13 00:03:59 +02:00
can1357 64aa558e62 chore: consistency 2026-06-13 00:03:27 +02:00
roboomp d718d54a33 fix(coding-agent): restored windows image paste fallback
Fell back to the PowerShell clipboard bridge when the native Windows clipboard reader reports no image, preserving Ctrl+V image paste in PowerShell terminals.\n\nFixes #2429
2026-06-12 21:52:59 +00:00
can1357 9cff84bd31 feat(coding-agent/commands): added token CLI command for provider credentials
- Added a new `token` CLI subcommand entry to the command registry.
- Implemented a `Token` command to fetch provider credentials with optional raw output and forced refresh.
- Added error handling to report configured providers and exit when no credential is available.
2026-06-12 23:07:06 +02:00
roboomp 03bead1eac fix(auth): retried SQLITE_BUSY family and hoisted busy_timeout
Concurrent omp --session restores after an unclean shutdown crashed
in SqliteAuthCredentialStore.#initializeSchema() with
SQLITE_BUSY_RECOVERY because the multi-statement schema run installed
PRAGMA busy_timeout=5000 AFTER PRAGMA journal_mode=WAL, the first
lock-taking statement during WAL recovery. Bun's default busy_timeout
is 0, so the lock conflict surfaces immediately.

- packages/ai/src/auth-storage.ts: hoisted PRAGMA busy_timeout to a
  standalone first statement, dropped it from the multi-statement
  schema run, wrapped SqliteAuthCredentialStore.open() in a 4-attempt
  exponential-backoff retry loop on the SQLITE_BUSY family, and the
  exhausted-retry error now includes the DB path. Exported
  isSqliteBusyError(err) (matches code prefix 'SQLITE_BUSY').
- packages/coding-agent/src/session/agent-storage.ts: same hoist and
  the existing retry loop now uses isSqliteBusyError so
  SQLITE_BUSY_RECOVERY / _SNAPSHOT / _TIMEOUT also trigger backoff.
- Hoisted busy_timeout before journal_mode=WAL in every other shared
  SQLite open path: history-storage, autoresearch/storage,
  memories/storage, github-cache, report-tool-issue (auto-QA),
  catalog/model-cache; stats/db.ts now sets busy_timeout at all.
- packages/ai/test/auth-storage-sqlite-busy.test.ts pins the contract:
  isSqliteBusyError matches every BUSY extended code (rejects
  SQLITE_LOCKED, non-errors, strings); open() leaves the connection in
  WAL mode (proves busy_timeout ran before journal_mode); open() retries
  through synthetic SQLITE_BUSY_RECOVERY; non-BUSY errors (SQLITE_CORRUPT)
  short-circuit; exhausted retries throw an error mentioning the DB path
  with exactly 3 sleeps for a 4-attempt budget.

Fixes #2421
2026-06-12 20:17:12 +00:00
roboomp e29555e814 fix(coding-agent): stabilized mnemopi per-project bank derivation
The bank id used to be hashed from
`git.repo.resolveSync(cwd)?.repoRoot ?? path.resolve(cwd)`, so adding or
removing a `.git` anywhere above the working directory silently
repointed the same conversation to a new bank and stranded its
memories. Same cwd `/home/x/projects/repo` flipped between
`projects-<hash>` and `repo-<hash>` depending on whether the parent
directory still looked like a repo.

`packages/coding-agent/src/mnemopi/config.ts` now hashes
`path.resolve(cwd)` directly. Session startup also widens the recall
set with any sibling bank under `<dbDir>/banks/` whose
`working_memory` rows already carry the active cwd in
`metadata_json.$.cwd`, so memories stranded by the old, less-stable
derivation become visible again on the next session without manual
migration.

Fixes #2412
2026-06-12 19:15:19 +00:00
roboomp ff3ded736f style: bun run fix 2026-06-12 16:43:31 +00:00
roboomp 8338a8af94 fix(skills): decoupled agents provider from third-party source toggles
Pre-fix `loadSkills` in `extensibility/skills.ts` gated the OMP-native
`agents` provider (the canonical `~/.agent[s]/skills` and project-walkup
`.agent[s]/skills`) on the `anyBuiltInSkillSourceEnabled` fall-through —
the OR of `enableCodexUser`/`enableClaudeUser`/`enableClaudeProject`/
`enablePiUser`/`enablePiProject`. A user who turned off the named
third-party toggles to clean noise from other CLIs silently lost their
own canonical OMP-native skills, so typing `/` showed no `/skill:<name>`
entries for `~/.agents/skills/*/SKILL.md`.

- Added `skills.enableAgentsUser` and `skills.enableAgentsProject` to
  the settings schema (default true) and to the `SkillsSettings` shape.
- Routed `isSourceEnabled` to the new toggles for `provider === "agents"`
  (per level). The fall-through still covers providers without a
  dedicated toggle (`claude-plugins`, `opencode`, `gemini`, `github`, …);
  agents joins claude/codex/native at the named-source layer where it
  always belonged.
- Updated `docs/skills.md` to document the new toggles and the corrected
  enablement rule.
- Refactored `test/skills.test.ts` to share a `DISABLE_ALL_BUILTIN_SKILLS`
  helper (so the isolation tests stay correct when new toggles are
  added) and added two regression tests: one asserting that the
  pre-fix scenario (named third-party toggles off, agents defaulted) now
  loads `~/.agents/skills/<name>/SKILL.md`, and one pinning the explicit
  `enableAgentsUser: false` opt-out.

Fixes #2401
2026-06-12 16:43:24 +00:00
can1357 db421bb2ef chore: bump version to 15.12.3 2026-06-12 18:13:09 +02:00
can1357 e914bf0c32 fix(coding-agent): fixed double-Esc draft clearing and selector display reset
- InputController now clears typed editor text and triggers a render when Esc is pressed with content, then resets the double-Esc timer.
- The double-Esc selector path was updated to reset the terminal display before opening tree or branch message selectors.
- Escape handling tests were expanded with settings setup/teardown to verify default, branch, and draft-clearing Esc scenarios.
2026-06-12 18:12:49 +02:00
can1357 d055f64ba0 Revert "fix(tui): restored double-esc message history"
This reverts commit 446f91bd41.
2026-06-12 17:54:57 +02:00
can1357 3d646d8c8b fix: Collapse AST pattern whitespace for status line display
Format multi-line, tab-indented AST patterns by collapsing whitespace
to single spaces, preventing them from distorting the single-line status
description in the UI.
2026-06-12 17:50:33 +02:00
can1357 fac2b5ad26 test(collab): deflake read-only guest tests against broadcast frame races
The host schedules a debounced state broadcast right after hello; on slow
runners it lands between a guest's mutating frame and the directed error
reply, so nextFrame() saw "state" instead of "error". Guests now drop
broadcast-only frames (state/agents/entry/event/bus) and wait solely on
directed welcome/error replies.
2026-06-12 17:29:52 +02:00
can1357 7975ebea8c chore: bump version to 15.12.2 2026-06-12 17:03:05 +02:00
can1357 bc763bf38c Merge remote-tracking branch 'origin/farm/2cee73cf/fix-brew-formula-install' 2026-06-12 17:02:51 +02:00
can1357 42ffc83b5d fix: re-polled steering after yield and drained queued follow-ups after turns
- Re-polled steering at the loop yield boundary and included it in the pre-stop pending batch so late messages are processed immediately.
- Added session-side draining for stranded queued messages, scheduling an auto-continue when a prompt settles and follow-ups or steers remain.
- Added a regression test for late steering injection at yield and updated mid-turn collab prompt handling to keep steering messages in the pending display queue until consumed.
2026-06-12 17:02:42 +02:00
roboomp 389add428b fix(brew): unbreak the generated homebrew formula install
Render Formula/omp.rb with two changes so the formula actually installs:

- Stamp `using: :nounzip` on every per-platform `url` stanza so Homebrew
  leaves the downloaded bare Mach-O/ELF asset in the staging CWD; the
  default `CurlDownloadStrategy` was routing through
  `UnpackStrategy::Uncompressed#extract_nestedly`, nesting the file
  outside CWD so `Dir["omp-*"].first` returned `nil` and
  `bin.install nil => "omp"` raised.
- Wrap `generate_completions_from_executable` in
  `with_env(HOME: buildpath)` so the popened binary's `os.homedir()`
  resolves into the writable staging dir instead of the real
  `/Users/<user>/.omp`, which Homebrew's sandbox profile denies read
  access to.

Also export `renderFormula` (gated by `import.meta.main`) and add a
unit test that pins the rendered stanza shape for future regressions.

Fixes #2398
2026-06-12 14:59:45 +00:00
can1357 0d49f94418 fix(collab): switched collab links to dot-joined room secrets
- Changed the link grammar from `<roomId>#<key>` / `host[:port]/r/<roomId>#<key>` to dot-joined `<roomId>.<key>` in `formatCollabLink`/`parseCollabLink` (`packages/coding-agent/src/collab/protocol.ts`) and the collab-web mirror (`packages/collab-web/src/lib/link.ts`): RFC 3986 forbids a raw `#` inside a fragment, so strict URL stacks (macOS Foundation behind terminal click-to-open) percent-encoded the second `#`.
- Kept legacy `#`-joined links parseable via `BARE_LINK_RE` and added lenient `%23` → `#` decoding for mangled deep links.
- Updated the `ConnectScreen` placeholder, `app.tsx` deep-link comment, `DEFAULT_RELAY_URL` doc in `packages/wire`, `docs/collab.md` examples, and both package CHANGELOGs.
- Extended `crypto.test.ts` and `link.test.ts` with dot-joined, legacy-hash, and `%23`-mangled link coverage.
2026-06-12 16:47:56 +02:00
can1357 ba27bbd3a3 chore: bump version to 15.12.1 2026-06-12 16:27:14 +02:00
can1357 28df38ed37 feat(agent): added useless-result tagging and compaction dropping of tool outputs
- Added optional `useless` flags to tool result types and payload builders.
- Added `pruneUseless` and `dropUeless` options to control uneventful result pruning.
- Changed compaction and shake passes to prune or ignore non-error useless tool results.
- Changed conversation serialization to omit useless toolCall/toolResult pairs from output.
- Added coverage for useless tagging, pruning, and serialization behavior.
2026-06-12 16:26:38 +02:00
roboomp b38d138781 fix(changelog): moved esc history entry to unreleased 2026-06-12 14:07:50 +00:00
roboomp 446f91bd41 fix(tui): restored double-esc message history
Restored the default double-Esc action to the editable message-history selector and covered the default controller route with a regression test.

Fixes #2396
2026-06-12 14:04:09 +00:00
can1357 89e0801a5d chore: bump version to 15.12.0 2026-06-12 15:50:06 +02:00
can1357 51add68c81 refactor(types): moved bun asset module declarations into shared types file
- Removed the obsolete `bun-imports.d.ts` file from `packages/coding-agent/src`.
- Consolidated the `*.css`, `*/template.js`, and `*.generated.js` module text-import declarations into `types/assets/index.d.ts`.
2026-06-12 15:49:47 +02:00
can1357 31ff08ef8c fix(coding-agent/modes): fixed focused left-tap handling for subagent sessions
- Added a focused-agent left-key input listener that consumes double left taps when the input is empty.
- Routed focused session left-tap behavior through #handleFocusedLeftTap so it matches the Esc-style unfocus timing.
- Updated tests/fixtures for the new listener flow and refreshed a hashline block-edit error assertion.
2026-06-12 15:41:50 +02:00
can1357 c938fe4d27 feat(coding-agent): added focused subagent session mode for main-agent hub navigation
- Added a SessionFocusController to switch transcript and input context between main and subagent sessions.
- Added agent-hub Enter activation and double-left return behavior for focused local agents.
- Added view-session-based event and render logic to avoid stale focus-session state.
- Added status-line focused agent display with ghost icon and focused-mode border dimming.
2026-06-12 15:37:56 +02:00
can1357 e24323dd5c feat(coding-agent/session): added tri-state Codex auto-redeem flow
- Updated `codexResets.autoRedeem` from a boolean to `unset`/`yes`/`no` in schema and settings types, with updated description text.
- Adjusted Codex auto-reset evaluation to skip checks in `no` mode and to prompt once in `unset` mode before spending, while preserving immediate spend for `yes`.
- Migrated legacy boolean config values to tri-state during settings load and added tests for mode defaults, helper behavior, and migration results.
2026-06-12 15:25:35 +02:00