Commit Graph
5977 Commits
Author SHA1 Message Date
roboomp ee9deba239 fix(ai): defaulted bedrock claude thinking.display to summarized
Anthropic silently switched adaptive-thinking's display default to
"omitted" starting with Claude Opus 4.7, so the Bedrock provider
stopped surfacing any reasoning content — observed in the wild as
silent streams and timeouts on long reasoning runs.

Mirrors the existing direct-Anthropic behavior in this repo:

- For adaptive-thinking models that accept the field (Opus 4.7+),
  emit { type: "adaptive", display: "summarized" } by default.
- For older adaptive-thinking models (Opus 4.6, Sonnet 4.6+) that
  reject the field, keep emitting just { type: "adaptive" }.
- For budget-based Claude models, always set display.
- Expose BedrockOptions.thinkingDisplay ("summarized" | "omitted")
  so callers can opt out, and wire hideThinkingSummary into the
  bedrock-converse-stream case in stream.ts.

Fixes #1373
2026-05-25 19:08:00 +00:00
Can BölükandGitHub d201442a16 Merge pull request #1372 from can1357/farm/e4c67c73/fix-subagent-session-start-busy
fix(agent): prevent subagent session_start busy race
2026-05-25 21:59:38 +03:00
Can BölükandGitHub 3859943263 Merge pull request #1369 from can1357/farm/70c1e455/bash
fix(bash): return on stalled cancellation
2026-05-25 21:56:12 +03:00
Can BölükandGitHub 8b4525e869 Merge branch 'main' into farm/70c1e455/bash 2026-05-25 21:56:06 +03:00
roboomp 23300d0348 fix(bash): quarantined stalled shell sessions
Quarantined persistent session keys only while the native cancellation promise remains unsettled, so healthy cleanup restores persistent mode and stalled cleanup cannot accumulate live shell instances.

Added coverage for both stalled and settled native cleanup paths.

Fixes #1347
2026-05-25 18:48:20 +00:00
roboomp 1217091557 fix(agent): prevented subagent session_start busy race
Queued extension-delivered user messages when deliverAs is set and waited for session_start extension message sends before prompting subagents.

Fixes #1343
2026-05-25 18:48:06 +00:00
Can BölükandGitHub 55798d8deb Merge pull request #1367 from can1357/farm/5c2ff3c3/report-finding-tool-agent-output-schema-
fix(coding-agent): coerced report_finding string priority to number for reviewer schema
2026-05-25 21:42:40 +03:00
Can BölükandGitHub 47dab57559 Merge branch 'main' into farm/5c2ff3c3/report-finding-tool-agent-output-schema- 2026-05-25 21:42:35 +03:00
roboomp 8e5c7c9bf1 fix(bash): kept persistent shells after cancel
Stopped marking persistent bash sessions as permanently broken when the JavaScript abort or timeout race wins.

Stopped the Rust descendant kill-wave helper once no cancellation targets remain so later commands are not swept into old cancels.

Fixes #1347
2026-05-25 18:40:22 +00:00
can1357 7acc631ce9 chore: bump version to 15.3.2 2026-05-25 20:30:37 +02:00
can1357 83b69ead9f test(ai): fixed SSE test structure and added keepalive parsing coverage
- Restructured the auth-broker `openSnapshotStream` tests to be top-level cases under the describe suite.
- Added a stream parser test asserting pure ": keepalive" lines are not included in subsequent SSE event raw output.
2026-05-25 20:29:30 +02:00
can1357 25cfee5bca fix(ai): validated auth-broker SSE stream responses and initial snapshot
- AuthBrokerClient now checked the response Content-Type and rejected non-SSE responses before parsing.
- It required the first parsed SSE event to be a snapshot and treated ended or truncated streams as errors.
- Added coverage for non-SSE and missing-initial-snapshot streams, and reset raw SSE state for empty events.
2026-05-25 20:28:58 +02:00
can1357 a7af3900bd feat(coding-agent/task): added parent-aware labels to nested live task snapshots
- Updated nested task-rendering tests to use parent-qualified IDs for completed child task results.
- Updated in-flight nested snapshot expectations to verify parent-aware `Parent>Subtask` labeling.
- Documented the live nested task rendering behavior in the package changelog.
2026-05-25 20:27:22 +02:00
can1357 b464719208 Revert "fix(coding-agent): drop hash anchor when a displayed line was truncated"
This reverts commit 0d80a01280.
2026-05-25 20:26:56 +02:00
can1357 a5275b17ce feat(coding-agent): added hashline inline |TEXT matching for BOF/EOF
- Added inline `|TEXT` payload parsing for `"/"` before/after inserts, including BOF/EOF usage.
- Fixed inline anchor handling by resolving matching `|TEXT` bodies and handling whitespace-containing payloads.
- Added parser tests for `applyDiff` and `parseHashline` covering whitespace, matching, and non-matching inline `|TEXT`.
- Added nested live task fixtures and snapshot tests for ordered in-flight and completed child rendering.
- Documented hashline inline `|TEXT` behavior updates in CHANGELOG.
2026-05-25 20:24:44 +02:00
Can BölükandGitHub 0762c96088 Merge pull request #1370 from can1357/farm/91ea5361/coding-agent-openai-responses-replay-sti
fix(ai): repair orphan function_call_output in openai-responses replay
2026-05-25 21:22:09 +03:00
can1357 7f6c565296 feat(auth-broker): added auth-broker /v1/snapshot/stream SSE support
- Added `/v1/snapshot/stream` SSE support and discriminated `snapshot`/`entry`/`removed` event payload contracts.
- Added `openSnapshotStream()` with abort handling, unsupported-stream errors, and filtered SSE payload parsing.
- Added `streamSnapshots` as default-true in remote store with SSE-first background syncing and 404-based fallback.
- Added per-credential generation tracking and `streamKeepaliveMs` tuning for long-lived SSE connections.
2026-05-25 20:21:31 +02:00
can1357 3105870c86 feat(coding-agent/task): added live nested-subagent progress rendering
- Captured `tool_execution_update` snapshots for `task` calls into in-flight progress state for live nested rendering.
- Cleared in-flight task snapshots at task start and completion to prevent stale nested progress from persisting.
- Updated progress rendering to combine completed and in-flight task details through a dedicated nested task tree view.
2026-05-25 20:21:24 +02:00
roboomp de5b0a51e2 fix(bash): forcefully terminated canceled shells
Added Rust-side descendant termination on shell cancellation paths so aborts and timeouts escalate to SIGKILL even if brush cleanup stalls.

Covered SIGTERM-ignoring shell workloads in native tests.

Fixes #1347
2026-05-25 18:13:49 +00:00
can1357 37fe5b93b8 fix(ai): fixed OAuth refresh race by coalescing concurrent credential refreshes
- Added a per-credential in-flight refresh map in AuthStorage and returned existing promises for concurrent OAuth refreshes.
- Updated OAuth API-key retrieval to share refreshes and persist refreshed candidate credentials.
- Added tests covering preflight persistence across multiple credentials and ensuring concurrent refreshes coalesced to one call.
2026-05-25 20:11:31 +02:00
can1357 4cd86383c0 feat(python/robomp): added followup thread context to comment handling
- Normalized reviewer-bot matching by stripping a trailing `[bot]` suffix when resolving configured bot logins.
- Fetched PR thread history for followup comments without directives and carried it through task execution.
- Updated followup prompt rendering to include prior conversation context for handle_comment tasks.
2026-05-25 20:11:03 +02:00
can1357 7a867a5e85 fix(ai): updated OAuth refresh flow to replace credential storage entry
- OAuth refresh handling updated the candidate credential and replaced the stored entry at its index.
- OAuth refresh race tests were updated to unregister the test provider during teardown.
2026-05-25 20:09:16 +02:00
roboomp ba50aed4a7 fix(ai): repair orphan function_call_output in openai-responses replay
When a previous turn's providerPayload snapshot lands in the input array
via the `dt: false` splice, any earlier `function_call` items get
wiped while the matching `function_call_output` from a later toolResult
remains. Locally-rejected tool calls (argument-validation failure, hook
reject, aborted turn before the call streamed) hit the same pattern: a
toolResult lands without a `function_call` ever being persisted.

For non-Azure/non-Copilot providers (`strictResponsesPairing=false`)
the orphan output shipped to the wire, and the Responses API responded
with `400 No tool call found for function call output with call_id …`.
Sessions in that state were unrecoverable until restart.

Add a final-pass guard, `repairOrphanResponsesToolOutputs`, that scans
the assembled input for orphan `function_call_output` /
`custom_tool_call_output` items and folds each into an assistant
`message` text note carrying the call_id and (truncated) output. This
preserves the payload the model needs to recover while keeping the
request grammatically valid. Mirrors the existing behavior in the
`openai-codex` provider's `request-transformer.ts`.

Fixes #1351
2026-05-25 18:07:51 +00:00
can1357 a9a2c8516d fix(ai): applied broker refresh result to suspect credential snapshot
- Updated markCredentialSuspect to apply the credential entry returned from refreshCredential and throw when the broker returns a non-OAuth credential.
- Added #applyCredentialEntry to replace or append a credential in the in-memory snapshot for immediate state updates.
- Added a test covering suspect-credential refresh snapshot updates and token refresh invocation.
2026-05-25 20:03:32 +02:00
roboomp 14c7ddf7d0 fix(bash): returned on stalled cancellation
Raced bash execution against the JavaScript abort signal and timeout so the tool returns even when native shell cleanup does not settle.

Added regression coverage for native cleanup stalls on ESC abort and timeout.

Fixes #1347
2026-05-25 18:03:09 +00:00
roboomp 6e9cf81544 style: bun run fix 2026-05-25 18:01:45 +00:00
roboomp 6b14cf1f55 fix(coding-agent): coerced report_finding string priority to number for reviewer schema
The report_finding tool's priority is exposed as a string enum
("P0"-"P3") for ergonomics, but the reviewer agent and every
custom review agent declare priority as `type: number` in their
JTD output schema. The cast at executor.ts:1473 lied about the
runtime shape, so the auto-injected `findings[].priority` flowed
through as strings and every yield with at least one finding was
rejected with `findings.0.priority: expected number, received string`,
forcing the run into the schema_violation exit path.

Added `toReviewFinding(details)` in tools/review.ts that maps the
priority enum to its numeric ordinal via the existing PRIORITY_INFO
table and use it at the boundary in executor.ts. Render paths still
see the original `ReportFindingDetails` shape (string priority)
through normalizeReportFindings, so display formatting is unaffected.

Fixes #1350
2026-05-25 18:01:38 +00:00
can1357 53c1494d42 fix(ai): added session-aware OAuth credential invalidation
- Extended `invalidateCredentialMatching` to accept session-scoped options and clear cached session credentials before blocking the matched credential.
- Updated the OAuth auth-error retry flow to pass `agent.sessionId` through credential invalidation.
- Added a regression test ensuring invalidating a session-sticky OAuth key rotates to the next active credential.
2026-05-25 19:59:11 +02:00
can1357 d55b7d51df fix(python/robomp): corrected issue classification updates on rename-fail
- Moved issue classification updates to run only after branch rename succeeds, preventing partial labeling or DB writes when rename fails.
- Adjusted workspace ownership normalization to chown workspaces to the active slot or, when slotless, to the current euid/egid, then apply shared permissions.
- Added tests for classify_issue rename-failure rollback and chown_workspace normalization in non-slot mode.
2026-05-25 19:54:19 +02:00
can1357 2ad7124e25 feat(ai): added tri-state credential checks in auth-gateway check flow
- Added `checkCredentials()` with result types/options for per-credential tri-state health checks.
- Added `/v1/credentials/check` endpoint via `handleCredentialsCheck` returning `{ generatedAt, credentials }`.
- Added `omp auth-gateway check` flow with provider grouping, `--json` output, and exit status 1 on failures.
- Added command examples, changelog updates, and tests for expired OAuth refresh, null/missing config, and ordering edge cases.
2026-05-25 19:53:58 +02:00
can1357 aca68ad3a9 feat(robomp): accept github issue urls in manual triage
parse_issue_ref now accepts owner/repo#NN or a github issue url (with or without scheme, www., trailing slash, query, fragment). The dashboard trigger, CLI, and replay endpoint pick this up automatically; UI hints updated to match.
2026-05-25 19:37:40 +02:00
Can BölükandGitHub d351512b2b Merge pull request #1364 from can1357/farm/ccf5d9fd/csharp-lsp-plugin-doesn-t-work-with-omp-
fix(lsp): support config-only marketplace servers
2026-05-25 20:37:36 +03:00
Can BölükandGitHub a40864c5b2 Merge branch 'main' into farm/ccf5d9fd/csharp-lsp-plugin-doesn-t-work-with-omp- 2026-05-25 20:37:30 +03:00
roboomp 24b249219e fix(lsp): supported config-only marketplace servers
Loaded marketplace lspServers metadata from Claude plugin caches and embedded it for OMP marketplace installs so config-only plugins register without package code.

Fixes #1352
2026-05-25 17:34:32 +00:00
Can BölükandGitHub d339745237 Merge pull request #1363 from can1357/farm/b4be9197/task-explore-agent-fails-with-schema-vio
fix(coding-agent/tools): stop re-walking JTD-converted JSON Schema
2026-05-25 20:27:29 +03:00
Can BölükandGitHub 29d0e3a470 Merge branch 'main' into farm/b4be9197/task-explore-agent-fails-with-schema-vio 2026-05-25 20:27:22 +03:00
Can BölükandGitHub 5798b9436d Merge pull request #1362 from can1357/farm/f7b9e6bd/keybinding-collides-with-enter-both-reso
fix(keys): named keys win over colliding ctrl+letter in legacy mode
2026-05-25 20:26:23 +03:00
Can BölükandGitHub cf29731120 Merge pull request #1361 from can1357/farm/3c2acfb6/keybinding-docs-reference-wrong-config-f
docs: correct keybinding config file reference
2026-05-25 20:26:11 +03:00
roboomp ef68db17f5 fix(coding-agent/tools): stopped re-walking JTD-converted JSON Schema for nested JTD detection
The JTD-to-JSON-Schema converter post-processed convertSchema's
output with normalizeMixedSchemaNode, which walked back into the
emitted JSON Schema looking for nested JTD forms. Inside a
properties block, user-defined property names whose keys happened
to collide with JTD keywords ('ref', 'elements', 'values',
'optionalProperties', 'discriminator') were misclassified as JTD
forms and re-rewritten - corrupting properties like { ref: { type:
'string' } } into { $ref: '#/$defs/[object Object]' } and breaking
the built-in explore agent's output validator with
schema_violation: files.0.ref: must not be present.

convertSchema is already fully recursive and emits pure JSON Schema,
so the post-walk is both unnecessary and unsafe. Drop it.

Fixes #1345
2026-05-25 17:21:53 +00:00
roboomp 8b71ad0982 docs: corrected keybinding config reference
Documented that keybinding remaps live in ~/.omp/agent/keybindings.json and use namespaced action IDs. Added the keybindings reference page to the embedded docs set.

Fixes #1353
2026-05-25 17:21:33 +00:00
roboomp 1e052c2624 style: bun run fix 2026-05-25 17:21:22 +00:00
roboomp b352fd8d9d fix(keys): named keys win over colliding ctrl+letter in legacy mode
Pressing Enter sends `\r` (0x0D), and so does Ctrl+M; the terminal
cannot disambiguate the two in legacy mode (no Kitty keyboard protocol,
no modifyOtherKeys). matches_key was claiming both "enter" and
"ctrl+m" for the bare byte, so binding a command to Ctrl+M also fired
on Enter. Same collision applied for Ctrl+H vs Backspace, Ctrl+I vs Tab,
Ctrl+J vs LF/Enter, Ctrl+[ vs Escape, and the symmetric ctrl+alt+letter
legacy form (ESC + ctrl-char) vs Alt+Enter/Alt+Tab/Alt+Backspace.

The legacy ctrl+<letter>/<symbol> and ctrl+alt+<letter> fast-paths now
skip bytes terminals also send for named keys (0x08 0x09 0x0a 0x0d 0x1b
0x7f). The named key wins; the colliding ctrl+<letter> still matches
when the terminal disambiguates via the Kitty keyboard protocol or
modifyOtherKeys. parseKey already preferred the named key — matchesKey
now agrees.

Fixes #1354
2026-05-25 17:20:58 +00:00
can1357 e2b86b8a41 chore: bump version to 15.3.1 2026-05-25 14:07:16 +02:00
can1357 60010f3fdf fix(tui): corrected Hangul Compatibility Jamo width to 1 cell
- UAX#11 classifies U+3131..=U+318E as Wide (2 cells), but Ghostty, Terminal.app, and iTerm2 render them as 1 cell.
- Added `char_width_corrected` in Rust to override jamo width, mirroring the existing TS-side correction in `visibleWidth`.
- Replaced `UnicodeWidthStr::width` with per-char corrected sum so the override applies inside combining clusters.
- Added native-layer regression tests to guard cross-layer parity between Rust and TS width calculations.
2026-05-25 14:06:53 +02:00
can1357 80186e341c feat(agent): threaded intentTracing option through append-only context
- Exported `normalizeTools` so `AppendOnlyContext` uses the same tool normalization as the agent loop.
- Added `BuildOptions.intentTracing` to `build()`/`reset()`/`takeSnapshot()` so intent injection is consistent and included in the prefix fingerprint.
- Improved `#computeDigest` to cover tool_calls, tool_call_id, name, and id fields to catch in-place mutations.
- Fixed `#unsubscribeAppendOnly` leak and added no-op guard in `#syncAppendOnlyContext`.
2026-05-25 14:06:44 +02:00
can1357 2c75bb07f4 refactor(openai-responses): joined multiple system prompts into single instructions string
- Replaced first-prompt-as-instructions + extras-as-input[role=system] with a joined "\n\n" string.
- Removes system-role messages from input array, keeping it clean for third-party proxy compatibility.
2026-05-25 14:06:30 +02:00
can1357 93116f507f fix(oauth): fixed DeepSeek validation and Xiaomi per-endpoint timeout
- Switched DeepSeek validation from chat-completions to GET /v1/models, fixing 401s on accounts without the deepseek-v4-pro preview model.
- Added Bearer-prefix stripping for pasted DeepSeek keys copied from curl snippets.
- Moved Xiaomi AbortSignal.timeout inside the endpoint loop so a SGP regional timeout does not abort the AMS fallback fetch.
2026-05-25 14:06:22 +02:00
can1357 079d18a82b fix(model-registry): fixed tp- token-plan baseUrl lost during discovery merge
- Extracted `mergeDiscoveredModel` so discovered baseUrl takes priority over bundled entry, fixing 401s on Xiaomi tp- token-plan streams.
- User providerOverride.baseUrl still wins over both discovered and bundled values.
- Added regression tests covering all merge priority paths.
2026-05-25 14:06:13 +02:00
can1357 d6acef8b76 perf(status-line): replaced index-based token cache with message sidecar cache
- Added Symbol-keyed sidecar on each AgentMessage to memoize estimateTokens, with a cheap content fingerprint to detect in-place mutations.
- Fixed stale cache on same-length replaceMessages, post-hoc error attachment, and branch rebuild edge cases.
- Fixed usage fetch error backoff: stamped fetchedAt on failure so the 5-min TTL also gates retries during outages.
- Extracted computeNonMessageBreakdown as shared helper to prevent drift between status-line and context panel token counts.
2026-05-25 14:06:05 +02:00
can1357 8e3e4fd5f0 fix(slash-commands): captured mode state before handler call for history
- Fixed /plan and /goal history preservation by snapshotting enabled state before handlePlanModeCommand/handleGoalModeCommand executes.
- Previous check read state after the call, missing cases where the handler itself toggled the mode off (e.g., confirmed exit).
- Added tests covering confirm-exit, cancel-exit, and first-activation paths.
2026-05-25 14:05:55 +02:00