Commit Graph
16450 Commits
Author SHA1 Message Date
can1357 af2e2bf05c Merge PR #7121: fix(search): paginate DuckDuckGo HTML results (@roboomp) 2026-07-31 19:14:47 +02:00
can1357 8f6305f772 fix(tools): preserve read continuation notice when spilling 2026-07-31 19:14:47 +02:00
can1357 ce6c57acb0 Merge PR #7117: fix(coding-agent): spill oversized read results to artifacts (@wolfiesch) 2026-07-31 19:14:46 +02:00
can1357 56a176ea64 chore(catalog): regenerated models.json for synthetic capability mapping
- Regen picks up PR #7159's Synthetic mapper fields (reasoning, vision,
  output limits, pricing, thinking ladder) in the bundled syn:* entries.
- Includes incidental upstream metadata refresh (kimi-k3 efforts,
  deepseek-v4-flash, hf gpt-oss-120b) from models.dev since last regen.
2026-07-31 19:09:04 +02:00
can1357 8cb10f3f5b Merge PR #7159: fix(catalog): read Synthetic's advertised model capabilities (@Gareth-Rouse) 2026-07-31 19:08:31 +02:00
can1357 78825403ad fix(coding-agent): replay queued appearance changes 2026-07-31 19:08:17 +02:00
can1357 540e8f5797 Merge PR #7188: fix(coding-agent): preserve scrollback on appearance changes (@Sairen777)
# Conflicts:
#	packages/coding-agent/src/modes/controllers/input-controller.ts
2026-07-31 19:08:16 +02:00
can1357 95f5dc8011 Merge PR #7192: fix(coding-agent): reload MCP servers on /reload-plugins (@roboomp) 2026-07-31 19:07:28 +02:00
can1357 b2c2402436 docs(catalog): note Google AI Studio compat fix 2026-07-31 19:07:28 +02:00
can1357 79fde0a8b7 Merge PR #7191: fix(catalog): disable store field for Google AI Studio openai-compat host (@yevman) 2026-07-31 19:07:27 +02:00
can1357 ac736d3ee1 Merge PR #7186: fix(cursor): preserve structured K3 history replay (@roboomp) 2026-07-31 19:07:19 +02:00
can1357 a1eb8174b9 Merge PR #7180: fix(ai): refresh expired oauth credential on observed mismatch (@roboomp) 2026-07-31 19:07:19 +02:00
can1357 fdc430f450 Merge PR #7178: fix(web-search): surface xai-oauth support in Grok search provider label (@smoldrago) 2026-07-31 19:07:18 +02:00
can1357 3411bc3c8d Merge PR #7177: fix(coding-agent): keep ExtensionContext.cwd live across /move (@KennethHoff) 2026-07-31 19:07:18 +02:00
can1357 80a46c2d4c fix(coding-agent): avoid splitting parameter expansions 2026-07-31 19:07:18 +02:00
can1357 969b4a34a5 Merge PR #7176: fix(coding-agent): inspect compound Bash commands in interceptor (@Vincent-Huang-2000) 2026-07-31 19:07:18 +02:00
can1357 32748807a7 Merge PR #7175: fix(coding-agent): re-export compact from legacy pi shim (@roboomp) 2026-07-31 19:07:17 +02:00
can1357 f3ae071bb7 docs: clarify kitty placeholder opt-out precedence 2026-07-31 19:07:17 +02:00
can1357 3a3a65c639 Merge PR #7173: docs: document Kitty placeholder environment controls (@roboomp) 2026-07-31 19:07:17 +02:00
can1357 e13c2918b6 test(coding-agent): provide settings in input context fixture 2026-07-31 19:07:17 +02:00
can1357 3a68ce7eb0 Merge PR #7167: fix(cli): generate titles for positional initial messages (@roboomp) 2026-07-31 19:07:17 +02:00
can1357 21b1d4d4d2 Merge PR #7165: fix(tui): format selector keybinding hints (@roboomp) 2026-07-31 19:07:16 +02:00
can1357 40120fd2b4 fix(context): preserve total-only usage anchors 2026-07-31 19:07:16 +02:00
can1357 bf08e12629 Merge PR #7163: fix(session): reconstruct context without prompt usage (@harshav167) 2026-07-31 19:07:16 +02:00
can1357 71244aec4b Merge PR #7161: fix(tui): contain synchronous image conversion failures (@roboomp) 2026-07-31 19:07:16 +02:00
can1357 7818cac342 test(ai): scope Bedrock auth bypass to stream calls 2026-07-31 19:07:16 +02:00
can1357 9eddf297fd Merge PR #7155: test(ai): stop bedrock payload suites from needing ambient AWS auth (@wolfiesch) 2026-07-31 19:07:15 +02:00
can1357 da3b5bd65a Merge PR #7153: fix(session): stop repeated mid-turn compaction dead ends (@roboomp) 2026-07-31 19:07:15 +02:00
can1357 46d43c25f0 Merge PR #7152: docs: Add link to LSP config docs in README (@jorisw) 2026-07-31 19:07:15 +02:00
roboomp b8ab418dd6 test(coding-agent): update MCP reauth fake for reload deps
reloadServers() now reads ctx.settings and session.setMCPPromptCommands, which
the shared /mcp reauth|unauth harness did not provide, so those tests threw
inside reload and failed their showError assertions. Add both members to the
fake context.

Fixes #7189
2026-07-31 16:59:38 +00:00
can1357 ef44bb5707 Merge PR #7138: fix(natives): correct miniaudio layouts on Linux ARM64 (@olegpulatov) 2026-07-31 18:54:53 +02:00
Oleg Pulatovandcan1357 a5aa5baeb5 test(natives): validate cross-target maudio layouts 2026-07-31 18:54:42 +02:00
Lumen Radleyandcan1357 d316fb54fd fix(natives): correct miniaudio layouts on Linux ARM64 2026-07-31 18:54:42 +02:00
roboomp 62d7a7c5c9 fix(coding-agent): clear stale MCP prompts on reload
MCPManager.disconnectAll clears connections without notifying the session's
prompt-command consumer, so removed or disabled prompt servers left stale
/server:prompt commands after /reload-plugins and /mcp reload.

Clear the session MCP prompt-command registry immediately after disconnect and
before asynchronous rediscovery. Newly loaded prompts repopulate it through
the existing manager callback. Extend the reload regression coverage.

Fixes #7189
2026-07-31 16:48:36 +00:00
can1357 b990e84a96 fix(catalog): dropped unconfirmed GMI Cloud cache-read price
GMI's launch post documents only $0.14/$0.28 per 1M for DeepSeek-V4-Flash;
the $0.028 cache-read figure was back-derived from OpenRouter's discounted
route and has no direct api.gmi-serving.com source. Keep cacheRead at 0
until GMI confirms cached-token billing, so usage cost reporting is not
overstated.
2026-07-31 18:46:14 +02:00
can1357 a87d4ba459 Merge PR #5884: fix(catalog): corrected GMI Cloud seed metadata (@definitelynotguru) 2026-07-31 18:44:40 +02:00
can1357 4a7dc22e99 fix(catalog): corrected GMI Cloud seed to direct-tariff metadata
- Set deepseek-ai/DeepSeek-V4-Flash cost to GMI's direct api.gmi-serving.com
  tariff ($0.14/$0.28 per 1M, cache read $0.028) per GMI's DeepSeek V4
  launch post, instead of values inherited from other providers.
- Documented that mapWithBundledReference keeps the seed's cost/reasoning/
  thinking at runtime: /v1/models discovery only overrides the model ID set
  and context/max-token limits, so the seed must carry real GMI values.
- Regenerated models.json.
2026-07-31 18:43:34 +02:00
roboomp 95744328ef fix(coding-agent): honor mcp.enableProjectConfig on reload
reloadServers() rediscovered MCP with no options, so loadAllMCPConfigs
defaulted enableProjectConfig to true — /reload-plugins (and /mcp reload)
could start project .mcp.json servers a user opted out of.

Derive discovery filters (enableProjectConfig, filterExa, filterBrowser)
from ctx.settings before reconnecting, matching startup discovery. Added a
regression test asserting the opt-out is forwarded.

Fixes #7189
2026-07-31 16:41:08 +00:00
can1357 fc701f9af0 Merge PR #5884: feat(catalog,ai): add GMI Cloud provider (@definitelynotguru) 2026-07-31 18:40:37 +02:00
can1357 685311807c fix(catalog,ai): seeded GMI Cloud default model into bundled catalog
- Added GMI_CLOUD_STATIC_MODELS seed wired into gen:models so a fresh
  install resolves deepseek-ai/DeepSeek-V4-Flash synchronously at boot,
  before async /v1/models discovery fires; live discovery stays
  authoritative and replaces the seed.
- Regenerated models.json with the seeded gmi-cloud slice.
- Dropped the GeneratedProvider cast now that gmi-cloud is bundled.
- Moved gmi-cloud to the end of the /login provider order.
- Moved changelog entries from released 17.0.3 sections to Unreleased.
- Added a regression test asserting the seed covers the descriptor's
  defaultModel.
2026-07-31 18:40:09 +02:00
roboomp c7fb9140fb fix(coding-agent): reload MCP servers on /reload-plugins
/reload-plugins documents MCP in its reload scope but the TUI handler only
reset skill/command/capability caches and never reconnected MCP servers or
refreshed the session MCP tool registry, so .mcp.json edits stayed inactive
until process restart.

Route the TUI reload pipeline through a shared reloadTuiPluginState() helper
that also runs the disconnect/rediscover/refreshMCPTools path used by
/mcp reload, exposed as MCPCommandController.reloadServers().

Fixes #7189
2026-07-31 16:33:28 +00:00
yevman 2429efab86 fix(catalog): disable store field for Google AI Studio openai-compat host
Google AI Studio's OpenAI-compatible endpoint
(generativelanguage.googleapis.com/v1beta/openai/chat/completions)
implements a subset of the chat-completions schema and rejects the
`store` field with HTTP 400:

  Invalid JSON payload received. Unknown name "store": Cannot find field.

OMP unconditionally emits `store: false` for any openai-completions
model whose resolved compat has supportsStore: true, so every request
to a custom provider pointed at this host (a common wiring for the
`vision` role, e.g. gemini-2.5-flash) failed before the first token.

Add a googleAistudio host class (URL-marker only, like chutes, since
users wire this host under arbitrary provider ids in models.yml) and
include it in the isNonStandard set so supportsStore resolves false.
Same failure shape as openclaw/openclaw#22704.

Detection is URL-based: verified against a captured 400 request dump
from generativelanguage.googleapis.com/v1beta/openai/chat/completions.
2026-07-31 12:29:21 -04:00
definitelynotguruandcan1357 2c61c373b7 feat(catalog,ai): add GMI Cloud provider
Add the gmi-cloud chat-model provider, an OpenAI-compatible inference
gateway at https://api.gmi-serving.com/v1. Wired per the adding-a-provider
contract: a createSimpleOpenAICompletionsOptions helper and catalog entry
in pi-catalog, plus a registry definition with an API-key paste login in
pi-ai. Dynamic model discovery via /v1/models; auth falls back to
GMI_API_KEY. defaultModel is deepseek-ai/DeepSeek-V4-Flash.

The providerId is cast to GeneratedProvider until the next gen:models run
seeds gmi-cloud into models.json (same pattern as xai-oauth/vllm).
2026-07-31 18:21:30 +02:00
roboomp b35adb2171 fix(cursor): gated turn thinking steps to same-model K3
- Applied the same same-model K3 replay guard to ConversationState.turns thinking steps so foreign or non-K3 reasoning never leaks into Cursor turn history.

Fixes #7184
2026-07-31 15:48:08 +00:00
roboomp 722b154266 fix(cursor): omitted undefined replay tool arguments
- Skipped undefined optional argument keys before protobuf Value encoding so normal exec calls remain replayable.

Fixes #7184
2026-07-31 15:38:25 +00:00
roboomp ee9c47a0c2 fix(cursor): kept empty tool results paired in replay
- Emitted a paired role:"tool" entry even when the result text is empty so a preserved structured tool call is never replayed unpaired.

Fixes #7184
2026-07-31 15:29:55 +00:00
roboomp 53eae701bd fix(cursor): preserved structured K3 history replay
- Rebuilt assistant thinking, tool calls, and paired tool results in Cursor-native history shapes.
- Rejected K3 continuation when prior same-model thinking cannot be replayed safely.
- Marked dynamically discovered Cursor K3 variants as reasoning models.

Fixes #7184
2026-07-31 15:23:52 +00:00
roboomp 7100d8b12d fix(ai): refresh expired oauth credential on observed mismatch
refreshStoredOAuthCredential's observed-credential mismatch guard
returned the stored row without a freshness check. When a concurrent
usage-fetch cycle rotated the in-memory selected credential out from
under a request and the stored row was itself expired, the guard handed
back the dead token, which getOAuthApiKey then refused — surfacing as a
misleading "No API key found for <provider>" during plan finalization.

Gate both the pre-lease and post-lease mismatch guards on the stored
credential still being fresh; expired stored copies now fall through to
a normal refresh.

Fixes #7179
2026-07-31 14:04:35 +00:00
Kenneth Hoff ae08bd57cb fix(coding-agent): keep ExtensionContext.cwd live across /move
ExtensionRunner cached cwd from its constructor argument, which is set
once at session start. /move (SessionManager.moveTo) relocates the
active session's directory, but ExtensionRunner never re-read it, so
every ExtensionContext built afterwards (tool calls, hooks, slash
commands) kept reporting the pre-move directory for the rest of the
session -- observed while building an extension that tracks the
session's git worktree via ctx.cwd.

Turn cwd into a getter over this.sessionManager.getCwd() instead of a
constructor-time snapshot. Session-scoped, not the process-global
project directory: the interactive /move handler happens to also
chdir the process (command-controller.ts -> applyCwdChange ->
setProjectDir), but moveTo() itself never touches that global, so a
programmatic AgentSession.moveSession()/SessionManager.moveTo() call,
a collab guest adopting a host's session cwd without chdir'ing, or an
SDK/ACP session opened via createAgentSession({ cwd }) with a cwd that
differs from the process's own would all still observe a stale
ctx.cwd under a getProjectDir()-based getter. Reading the runner's own
sessionManager -- already held for other purposes -- covers every one
of these instead of just the single-session interactive case.

The constructor parameter is kept (renamed _initialCwd, documented as
ignored) so the two existing call sites don't need touching.

Added a regression test constructing a real ExtensionRunner over an
in-memory SessionManager, relocating it via SessionManager.moveTo(),
and asserting both runner.cwd and createContext().cwd observe the new
directory.
2026-07-31 15:13:37 +02:00
Vincent Huang 296ece7ea5 fix(coding-agent): handle input fd redirects in interceptor 2026-08-01 00:34:19 +12:00