Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
7680 commits
Select commit Hold shift + click to select a range
00b4c49
test(agent): cover all rejected video part types
fangliquanflq Sep 6, 2026
11082f6
test: consolidate video rejection variants into one invariant
teknium1 Sep 7, 2026
edf8e5d
test: preserve reusable localhost provider wire A/B probe
teknium1 Sep 7, 2026
fb0fc7e
fix(agent): forward the new_text alias in the memory inline executor
liuhao1024 Sep 6, 2026
7ef4187
test: pin memory alias persistence without dispatch mocks
teknium1 Sep 7, 2026
4fbb253
fix: mirror successful memory alias writes to providers
teknium1 Sep 7, 2026
57c60f2
fix: explain the launchctl registration restriction without inventing…
teknium1 Sep 7, 2026
3429670
fix(agent): interpolate the live backups dir into corruption recovery…
liuhao1024 Sep 6, 2026
8d4b741
test(recovery): distinguish the profile home from the full backup root
teknium1 Sep 7, 2026
bcef8d6
fix: retain reasoning effort on named custom provider routes
teknium1 Sep 7, 2026
5d4f76b
test: preserve reusable localhost provider wire A/B probe
teknium1 Sep 7, 2026
be633b2
test: handle localhost model metadata probe without fixture error
teknium1 Sep 7, 2026
a39067f
test: clarify named-route parity wire evidence and held dialect scope
teknium1 Sep 7, 2026
1e65d6d
test: distinguish completion capture from model metadata HTTP
teknium1 Sep 7, 2026
8db9f49
fix(desktop): show failed project loads separately from empty sessions
teknium1 Sep 7, 2026
d0081d9
refactor: colocate fallback handoff with client lifecycle
teknium1 Sep 7, 2026
b4464f6
fix: retain rotating credentials during fallback handoff
teknium1 Sep 7, 2026
8c2f308
fix: read only installed SDK credential providers at handoff
teknium1 Sep 7, 2026
11ca36e
docs: clarify fallback credential and cooldown behavior
teknium1 Sep 7, 2026
c573e62
chore: credit callable fallback contributors
teknium1 Sep 7, 2026
4270e9a
fix: distinguish callable Anthropic bearer sources from OAuth text
teknium1 Sep 7, 2026
cf12224
test: publish credential-free fallback wire reproduction
teknium1 Sep 7, 2026
2b9e421
fix(cli): make session-title badge skin-aware
pminervini Sep 6, 2026
85d25f3
fix(cli): preserve session-title badge contrast
pminervini Sep 6, 2026
99fb18d
test(cli): keep badge regression coverage minimal
pminervini Sep 6, 2026
d538f4e
test: preserve themed badge contrast on light terminals
teknium1 Sep 7, 2026
97f74b8
fix(desktop-update): clean up throwaway browser profile directory
RohithPariki Sep 6, 2026
1bd7364
fix(desktop-update): clean only the captured shim profile
teknium1 Sep 7, 2026
b3778db
test(desktop-update): leave self-test failure flag empty on success
teknium1 Sep 7, 2026
ca812ba
fix(desktop-update): atomically claim the temporary browser profile
teknium1 Sep 7, 2026
a662f9d
fix(desktop-update): discard failed profile allocation output
teknium1 Sep 7, 2026
02aa4b5
chore: retain updater contributor release attribution
teknium1 Sep 7, 2026
00bb169
feat(desktop): full command description hover on slash autocomplete r…
kokhlo Sep 7, 2026
f83ff89
fix(desktop): reveal complete slash help across the window
teknium1 Sep 7, 2026
e3ba651
fix(desktop): relay MCP OAuth through client-local callbacks
lipebez Sep 7, 2026
5cf8d74
fix(desktop): preserve explicit local MCP OAuth without callback bridge
lipebez Sep 7, 2026
0922931
test(desktop): trim MCP relay coverage to ownership and cleanup invar…
teknium1 Sep 7, 2026
a504202
chore: credit MCP relay contributor
teknium1 Sep 7, 2026
6c0750e
fix(desktop): cancel MCP auth when scoped Skills tabs leave their owner
teknium1 Sep 7, 2026
f914c9b
fix(mcp): enforce profile ownership throughout OAuth sessions
teknium1 Sep 7, 2026
0d86694
test(desktop): make MCP renderer relay regressions executable
teknium1 Sep 7, 2026
7798241
fix: retain pending fleet restarts until supervisors recover
teknium1 Sep 7, 2026
1d5d059
fix(gateway): stop time-triggered conversation rotation
teknium1 Sep 7, 2026
1481a0d
docs(gateway): describe persistent sessions without reset timers
teknium1 Sep 7, 2026
f597c31
test(gateway): retire automatic expiry contracts
teknium1 Sep 7, 2026
34e512a
fix(sessions): remove remaining timer migration and guidance
teknium1 Sep 7, 2026
23a4bd8
test(sessions): preserve live persistence and eviction controls
teknium1 Sep 7, 2026
9c53128
test(sessions): verify gateway status after timer removal
teknium1 Sep 7, 2026
8ed86c0
test(sessions): exercise pressure eviction and recovery boundaries
teknium1 Sep 7, 2026
68837c5
test(sessions): preserve profile ownership checks after timer removal
teknium1 Sep 7, 2026
d79575c
fix(slack): preserve explicit suspension after timer removal
teknium1 Sep 7, 2026
c4cbd7a
test: use real Slack session entries for reset removal
teknium1 Sep 7, 2026
2bd6fe0
fix(desktop): keep gateway reconnect available on open transports
teknium1 Sep 7, 2026
5f02693
fix(desktop): reconnect only the active gateway route
teknium1 Sep 7, 2026
a275ade
fix(desktop): retain manual recovery scope through retries
teknium1 Sep 7, 2026
65f033a
fix(execute-code): teach the working helper import contract
teknium1 Sep 7, 2026
9797679
test: isolate updater fixtures from the live runtime fleet
teknium1 Sep 7, 2026
4dcdb5e
fix(cli): allow pinned installs to disable passive update checks
teknium1 Sep 7, 2026
eb027a8
fix(cli): preserve explicit dashboard update checks
teknium1 Sep 7, 2026
c06caad
fix(desktop): preserve per-session chat scroll position
DavidMetcalfe Aug 6, 2026
0237fcc
fix(desktop): defer parked scroll restore until ready
victorftrdba Aug 27, 2026
52ce7b2
fix(desktop): scope saved scroll by gateway
victorftrdba Aug 27, 2026
9a78d5a
test(desktop): document and probe reading-position restoration
teknium1 Sep 7, 2026
3329b38
fix(desktop): retain scroll ownership and honor hydration wheel intent
teknium1 Sep 7, 2026
f4f691c
fix(desktop): retain restored offsets through deferred layout
teknium1 Sep 7, 2026
fd3565d
fix: remove dedicated user-facing output cap controls
teknium1 Sep 7, 2026
27f32bd
test: exercise output-cap removal across native and child surfaces
teknium1 Sep 7, 2026
3d8c492
docs: record native output-cap save validation
teknium1 Sep 7, 2026
fe04d5b
test: preserve metadata and passthrough assertions after cap removal
teknium1 Sep 7, 2026
afcd5ea
fix(desktop): fold separators in model search so filters and highligh…
DavidMetcalfe Sep 6, 2026
b292e2d
fix(desktop): fold the model-picker downloads filter too
DavidMetcalfe Sep 7, 2026
50d7a75
fix(desktop): scope separator highlighting to model searches
teknium1 Sep 7, 2026
12891ea
fix(desktop): scope tool changes and commit rebuild ownership together
teknium1 Sep 7, 2026
026e3e8
fix: reject unavailable desktop profile and session targets
teknium1 Sep 7, 2026
6927ff8
test: enforce fail-closed project profile targeting
teknium1 Sep 7, 2026
49fc491
test(desktop): stop the unread-tile test timing out on loaded CI
anhtahaylove Sep 2, 2026
75fbefa
test(desktop): keep cold module transforms outside UI assertion deadl…
teknium1 Sep 7, 2026
14b9b93
fix(deps): sync LAZY_DEPS platform.discord brotlicffi pin to 1.2.0.2
liuhao1024 Sep 6, 2026
9fc80ac
fix(deps): bump brotlicffi pin to 1.2.0.2 to fix chunked brotli strea…
liuhao1024 Sep 6, 2026
0b33913
fix: keep desktop provider setup within its selected profile
teknium1 Sep 7, 2026
c89f3b8
fix(delegation): one completion per call by default; queued units no …
teknium1 Sep 7, 2026
ae9cd70
fix(delegation): keep the 'wait or poll' contract token in the tool d…
teknium1 Sep 7, 2026
26ed08c
fix(desktop): isolate hidden composer selection
jerrygooch Sep 3, 2026
1f92ab1
fmt(js): `npm run fix` on merge (#105106)
hermes-seaeye[bot] Sep 7, 2026
f17f18c
fix(desktop): release Windows app locks at staged promotion
teknium1 Sep 7, 2026
45c7388
fix(desktop): give the composer action pill a transit-safe hide delay
kokhlo Sep 7, 2026
d70fb4e
fix(desktop): keep directive hover timers on owned boundaries
teknium1 Sep 7, 2026
10b0722
docs: explain fenced hosted-room authority recovery
teknium1 Sep 7, 2026
55c223e
fix(mcp): probe the list signature instead of masking its TypeError (…
holny Sep 6, 2026
05315a6
fix: keep pagination signature inspection local and preserve exact de…
teknium1 Sep 7, 2026
f2c3455
fix(tui-gateway): clear abandoned orphan interrupt claims
fangliquanflq Sep 6, 2026
c22588b
fix(tui-gateway): start each detachment with a fresh settlement budget
teknium1 Sep 7, 2026
2019c0a
test(tui-gateway): add isolated websocket orphan reconnect probe
teknium1 Sep 7, 2026
f986a2b
fix(skills): pass the ClawHub owner hint as ?owner= so ambiguous slug…
liuhao1024 Sep 6, 2026
76de6ec
fix: retain ClawHub owner through version and bundle requests
teknium1 Sep 7, 2026
727c2d7
fix: accept the live ClawHub version-list response shape
teknium1 Sep 7, 2026
4cc42e6
refactor: isolate Discord media upload methods before routing repair
teknium1 Sep 7, 2026
22a03c8
fix: route Discord cron media to its target and report upload failures
teknium1 Sep 7, 2026
b40998b
fix(agent): isolate custom endpoint billing health
fangliquanflq Sep 6, 2026
3fcbf13
fix(agent): scope named custom health by endpoint
fangliquanflq Sep 6, 2026
e033bba
fix(agent): quarantine bare custom aliases by endpoint
fangliquanflq Sep 6, 2026
e3ff3e7
fix(agent): quarantine failed fallback destination
fangliquanflq Sep 6, 2026
a4f2e42
test(agent): update custom runtime mock contract
fangliquanflq Sep 6, 2026
84bbf17
fix(agent): preserve route URL path identity
fangliquanflq Sep 6, 2026
cb1a42d
refactor: isolate custom health identity and trim redundant alias tests
teknium1 Sep 7, 2026
f845f02
docs: clarify fallback credential and cooldown behavior
teknium1 Sep 7, 2026
78e0d29
test: publish credential-free fallback wire reproduction
teknium1 Sep 7, 2026
6504f33
fix(desktop): honor explicit worktree sidebar dismissal
teknium1 Sep 7, 2026
ae4f777
fix(agent): surface armed rate-limit cooldown in fallback notice (#10…
Halldrix Sep 6, 2026
fb2f66f
fix: describe remaining retry eligibility without promising recovery
teknium1 Sep 7, 2026
68b16aa
fix: retain exhausted-chain cooldown classification after extraction
teknium1 Sep 7, 2026
2efb8bd
docs: clarify fallback credential and cooldown behavior
teknium1 Sep 7, 2026
fc70d05
fix: arm primary cooldown once while walking fallback candidates
teknium1 Sep 7, 2026
0746484
test: assert skipped candidates do not compound cooldown
teknium1 Sep 7, 2026
61d690a
test: publish credential-free fallback wire reproduction
teknium1 Sep 7, 2026
9745a7f
fix(terminal): show sudo password prompts for paths and env prefixes
teknium1 Sep 7, 2026
5dfea72
refactor: extract Kanban graph persistence into topical sibling
teknium1 Sep 7, 2026
258fa97
fix: retain Kanban decomposition identity and inherit parent tenants
teknium1 Sep 7, 2026
b578261
fix: keep Kanban worker scope out of descendant processes
teknium1 Sep 7, 2026
6495009
test: align delegated-child env tests with retained board routing
teknium1 Sep 7, 2026
2d52ddc
fix(cli): planned systemd restarts no longer trigger failure alerts
Edizzier Sep 7, 2026
f9d0508
fix(desktop): route relative remote artifacts to gateway download
teknium1 Sep 7, 2026
478d772
fix(desktop): resolve artifact downloads in their originating session
teknium1 Sep 7, 2026
0461da8
fix(gateway): retain original source fields in busy injections
teknium1 Sep 7, 2026
9d576c4
docs: describe gateway injection origin context
teknium1 Sep 7, 2026
97fb475
fix(gateway): retain alternate and parent source identities
teknium1 Sep 7, 2026
7d50f99
fix(gateway): honor privacy policy in busy message origins
teknium1 Sep 7, 2026
d9833c5
fix(gateway): resolve busy origin privacy in routed profile
teknium1 Sep 7, 2026
af21210
feat(cli): show entry id and priority in hermes auth list (#104636)
kokhlo Sep 7, 2026
12ad29a
refactor: isolate credential pool administration methods
teknium1 Sep 7, 2026
53221df
feat: reset one pooled credential without clearing sibling cooldowns
0xble Sep 7, 2026
b86fb27
fix: count credential selections across every pool strategy
0xble Sep 7, 2026
1a4bb74
feat: choose pooled credential priority from the CLI
0xble Sep 7, 2026
32a59f3
feat: refresh one pooled OAuth grant from the CLI
0xble Sep 7, 2026
de25786
fix: place reauthenticated credentials by their saved identity
teknium1 Sep 7, 2026
f087cb8
test: exercise credential controls through PTY and local OAuth wire
teknium1 Sep 7, 2026
c13c37a
test: isolate external auth stores in pool command fixtures
teknium1 Sep 7, 2026
134b173
fix: reject independent Nous account refresh without clearing cooldown
teknium1 Sep 7, 2026
bdf45ab
fix: prefer owned Anthropic grants and bind auxiliary refresh to requ…
teknium1 Sep 7, 2026
b14315a
test: exercise owned OAuth recovery through the unchanged ladder surface
teknium1 Sep 7, 2026
07ddfaa
test: fix CI red — pool fixtures carry source, refresh assertion bind…
teknium1 Sep 7, 2026
7d44fe9
fix: capability probes send minted credentials instead of callable re…
teknium1 Sep 7, 2026
bbbccd3
fix: failed probe credentials cannot fall through to configured auth
teknium1 Sep 7, 2026
7a5fc1b
fix: remove automatic session JSON snapshots
teknium1 Sep 7, 2026
1491342
style: remove blank line left by snapshot setting removal
teknium1 Sep 7, 2026
5904c7a
fix(threats): keep unrelated role prose in context files
teknium1 Sep 7, 2026
a9ef4a7
fix(codex): keep transport echoes out of durable user history
teknium1 Sep 7, 2026
cd0b5b9
docs: record independently repeated input-ownership wire probe
teknium1 Sep 7, 2026
a745101
fix(gemini): route google-alias fallback providers through GeminiNati…
szcharlesji Sep 6, 2026
1eb1b79
test(gemini): verify alias routing and compatible endpoint controls
teknium1 Sep 7, 2026
42da1f2
chore: map Charles Ji contributor email
teknium1 Sep 7, 2026
7072670
feat(honcho): add bounded opt-in current-query recall
Wenfengcheng Sep 7, 2026
99f7d2b
fix(honcho): isolate recall generations and reject unscoped fallback
teknium1 Sep 7, 2026
4f54a6d
test(honcho): exercise config precedence through local SDK recall
teknium1 Sep 7, 2026
283e677
style(honcho): drop trailing blank lines at EOF in recall test
Sep 7, 2026
04767e7
fix(display): distinguish estimated context from provider usage
teknium1 Sep 7, 2026
b4e2ae9
test(display): exercise real usage and usage-less provider controls
teknium1 Sep 7, 2026
62f64ae
fix(display): retain provider provenance for persisted fallback readings
teknium1 Sep 7, 2026
9da8c63
fix(display): preserve localized estimate markers and headroom labels
teknium1 Sep 7, 2026
ab1a6d0
test(display): encode provenance contract in tilde assertions
Sep 7, 2026
7876d18
fix(approval): recover legacy list values without character grants
teknium1 Sep 7, 2026
ab98a92
fix(notifications): report applied skill batch operations
teknium1 Sep 7, 2026
8aaf1ac
fix(schemas): preserve required intent without invalid boolean flags
teknium1 Sep 7, 2026
549e6aa
fix(bot-mode): preserve refusal reasons across local delivery
teknium1 Sep 7, 2026
e3710c1
fix(cron): preserve continuity across silent audit ticks
teknium1 Sep 7, 2026
e1a1615
fix(cron): make failed runs diagnosable without verbose delivery errors
teknium1 Sep 7, 2026
db529aa
test(cron): exercise historical error redaction in live probe
teknium1 Sep 7, 2026
bbbcde8
fix(process): stop late forks escaping deadline tree cleanup
teknium1 Sep 7, 2026
2a980fb
fix(update): let systemd clients outwait legitimate unit transactions
doryani-ai Sep 7, 2026
6ab2245
chore: credit systemd restart budget contributor
teknium1 Sep 7, 2026
bb12ee7
test: retain native systemd restart budget probe
teknium1 Sep 7, 2026
08f2c78
fix(update): cover catch-up restart clients with the unit budget
teknium1 Sep 7, 2026
50cd119
test: pass snapshot listings to the catch-up restart budget probe
teknium1 Sep 7, 2026
89c85b8
fix(update): settle stale receipt warnings from matching live gateways
teknium1 Sep 7, 2026
03c20ba
fix(cli): probe update-check origin URL under the fetch's isolated gi…
liuhao1024 Sep 6, 2026
9f0bf22
fix(cli): pin core.sshCommand to BatchMode ssh in the noninteractive …
liuhao1024 Sep 6, 2026
9197afe
test(cli): pin git identity in the insteadOf regression test setup
liuhao1024 Sep 6, 2026
3a42722
test: verify SSH update checks with real PTY authentication controls
teknium1 Sep 7, 2026
a460b44
docs(desktop): document directive action hover grace
teknium1 Sep 7, 2026
f5afe8b
feat: authorize MCP servers with device codes from the CLI
teknium1 Sep 7, 2026
965f18b
fix: restore prior device OAuth state if persistence fails
teknium1 Sep 7, 2026
f94307a
fix: ignore malformed MCP OAuth metadata caches
teknium1 Sep 7, 2026
a46ddf0
test: keep quickstart preflight independent of host acceleration
teknium1 Sep 7, 2026
92f4246
fix(cli): hide the console window for banner/update git probes
teknium1 Sep 7, 2026
5f88f0e
test: keep core review checks independent of optional ACP
teknium1 Sep 7, 2026
37fb7ad
fix: structured reasoning no longer breaks chat consumers
teknium1 Sep 7, 2026
3bc8395
chore: credit reasoning normalization contributors
teknium1 Sep 7, 2026
5695ebc
refactor(tools): extract process checkpoint persistence
maximilliangrand Sep 7, 2026
b72e373
fix(tools): retain completed background process results across exit
maximilliangrand Sep 7, 2026
6339554
fix(tools): keep retained result reads off live status scans
maximilliangrand Sep 7, 2026
1770825
fix(tools): register readers atomically with completion
maximilliangrand Sep 7, 2026
fbed1d4
fix(tools): keep retained terminal results scoped to their owner
teknium1 Sep 7, 2026
0522ae9
fix(tools): retain producer profile scope in process readers
teknium1 Sep 7, 2026
1735ccd
fix(tools): always redact durable process receipts
teknium1 Sep 7, 2026
9af6e9f
fix: coalesce interactive completion backlogs without losing identity
teknium1 Sep 7, 2026
ada8e50
test: verify completion barriers and document local delivery proof
teknium1 Sep 7, 2026
7f80efc
fix(tui): post-turn completion drain resolves ownership once; barrier…
teknium1 Sep 7, 2026
39ed610
feat(cron): create paused jobs without a scheduling race
teknium1 Sep 7, 2026
ff17551
test(cron): preserve rejected creation exit status
teknium1 Sep 7, 2026
93af3db
fix: checkpoint Kanban completion before tool access expires
teknium1 Sep 7, 2026
35104c2
test: pin checkpoint transcript persistence before the next request
teknium1 Sep 7, 2026
a7198a8
fix: keep budget checkpoints out of cancelled tool results
teknium1 Sep 7, 2026
2c315ff
feat(openai): add GPT-6 Astra baseline support
Sep 4, 2026
c990017
test(openai): close Astra baseline review gaps
Sep 4, 2026
5a82258
fix(openai): keep Astra rules on eligible routes
Sep 4, 2026
850680f
fix(openai): require canonical host for Astra cache
Sep 4, 2026
3825d25
fix(openai): cap Astra Codex OAuth fallback
Sep 4, 2026
17c7be1
feat(models): preserve live-verified Astra 900K opt-in from #103132
mssteuer Sep 4, 2026
299d868
fix(openai): keep Astra 900K alias gated and wire-compatible
Sep 5, 2026
328542d
fix(openai): revalidate Astra at cached and saved-model picker bounda…
Sep 5, 2026
fdb76ce
fix(openai): include canonical API picker identity in Astra discovery…
Sep 5, 2026
170a736
fix(openai): drop prompt_cache_options from Astra requests — not an S…
kshitijk4poor Sep 7, 2026
b685299
refactor(openai): one is_astra_model predicate; gate Astra at the unt…
kshitijk4poor Sep 7, 2026
e583d68
perf(models): stop revalidating a fresh provider cache just because i…
kshitijk4poor Sep 7, 2026
f850bc5
refactor(inventory): build the gated-Astra warning tail instead of st…
kshitijk4poor Sep 7, 2026
2337570
test(openai): Astra pricing/capability tests assert contracts, not sn…
kshitijk4poor Sep 7, 2026
c5ff900
fix: resolve the 33 F821 undefined names outside tui_gateway / feishu…
kshitijk4poor Sep 4, 2026
ab2f460
refactor: MessageEvent to gateway/platforms/event.py; ElicitationHand…
kshitijk4poor Sep 4, 2026
2f1609a
refactor: sms AIOHTTP_AVAILABLE flag; ElicitationHandler call_context…
kshitijk4poor Sep 6, 2026
c54de79
test: /btw replies HISTORY_UNREADABLE on a failed transcript read (fr…
kshitijk4poor Sep 6, 2026
284b303
test: e2e conftest imports GatewayRunner at module level; elicitation…
kshitijk4poor Sep 6, 2026
e9bccc9
refactor: repoint 10 MessageEvent/MessageType importers that landed o…
kshitijk4poor Sep 6, 2026
610c869
fix(desktop): task panel follows the todo_list wire name
teknium1 Sep 7, 2026
03f3b09
fix(tui-gateway): subagent lifecycle survives display.tool_progress=off
teknium1 Sep 7, 2026
c81555e
fix: address PR 59 review findings
mrkillbob Sep 7, 2026
48e3fb7
docs: keep provider endpoints in config
mrkillbob Sep 7, 2026
1022e48
ci: rerun pull request checks
mrkillbob Sep 7, 2026
979156b
ci: rerun checks with actions enabled
mrkillbob Sep 7, 2026
0b54ebb
fix: address latest PR review findings
mrkillbob Sep 7, 2026
a5bbf43
test: cover backend dial routing behavior
mrkillbob Sep 7, 2026
8763d5b
fix: address follow-up review findings
mrkillbob Sep 7, 2026
441072a
fix: address final review findings
mrkillbob Sep 7, 2026
0740753
ci: repair attribution and scanner workflow
mrkillbob Sep 7, 2026
62e2569
fix: remove stale web backend configuration
mrkillbob Sep 7, 2026
250ba18
ci: avoid neutral osv code scanning status
mrkillbob Sep 7, 2026
5840f18
fix: preserve scheduled osv sarif publication
mrkillbob Sep 7, 2026
b0db7ea
ci: disable osv sarif on pr caller
mrkillbob Sep 7, 2026
ce7e81d
fix: preserve pooled backend claim scope
mrkillbob Sep 7, 2026
dfdd0ce
fix: complete acp tool and osv routing
mrkillbob Sep 7, 2026
148ce16
fix(ci): isolate osv sarif from pull request scans
mrkillbob Sep 8, 2026
4da9713
fix(ci): preserve pr osv upload opt-out
mrkillbob Sep 8, 2026
e6c068c
fix: harden fast mode and config integration tests
mrkillbob Sep 8, 2026
87d46b6
ci: use standard hosted runners
mrkillbob Sep 8, 2026
3480079
test: fix desktop and sessions CI failures
mrkillbob Sep 8, 2026
ddc08a9
test: wait for virtual history compensation
mrkillbob Sep 8, 2026
fe32a31
ci: allow full Python suite to finish
mrkillbob Sep 8, 2026
d3f4bbc
ci: limit Python test parallelism on standard runners
mrkillbob Sep 8, 2026
ca23da8
ci: shard Python tests across standard runners
mrkillbob Sep 8, 2026
8f1916f
test: fix CI-only Python regressions
mrkillbob Sep 8, 2026
160a5ff
ci: shard JavaScript and TypeScript checks
mrkillbob Sep 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
6 changes: 3 additions & 3 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,9 @@ plans/
.hadolint.yaml
.mailmap

# Repo-root debug/export artifacts — must never reach image layers (COPY . .)
# Debug/export artifacts — must never reach image layers (COPY . .)
/log.txt
/sqlite_leak_fix.png
/*.png.bak
/default.tar.gz
/*.tar.gz
*.tar.gz
*.tgz
54 changes: 45 additions & 9 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -132,17 +132,15 @@
# =============================================================================
# Qwen OAuth reuses your local Qwen CLI login (qwen auth qwen-oauth).
# No API key needed — credentials come from ~/.qwen/oauth_creds.json.
# Optional base URL override:
# HERMES_QWEN_BASE_URL=https://portal.qwen.ai/v1
# Configure custom endpoints with `model.base_url` in config.yaml.

# =============================================================================
# LLM PROVIDER (Xiaomi MiMo)
# =============================================================================
# Xiaomi MiMo models (mimo-v2-pro, mimo-v2-omni, mimo-v2-flash).
# Get your key at: https://platform.xiaomimimo.com
# XIAOMI_API_KEY=your_key_here
# Optional base URL override:
# XIAOMI_BASE_URL=https://api.xiaomimimo.com/v1
# Configure custom endpoints with `model.base_url` in config.yaml.

# =============================================================================
# LLM PROVIDER (Upstage Solar)
Expand All @@ -153,6 +151,33 @@
# Optional base URL override:
# UPSTAGE_BASE_URL=https://api.upstage.ai/v1

# =============================================================================
# LLM PROVIDER (Ramp Router)
# =============================================================================
# Ramp Router (router.com) — Responses-native LLM gateway; model IDs come
# from your account's live catalog (GET /v1/models).
# Get your key at: https://app.router.com/keys
# RAMP_ROUTER_API_KEY=your_key_here
# Optional base URL override:

# =============================================================================
# LLM PROVIDER (Nebius Token Factory)
# =============================================================================
# Nebius Token Factory — OpenAI-compatible inference for open models.
# Get your key at: https://tokenfactory.nebius.com/
# NEBIUS_API_KEY=your_key_here
# Optional base URL override:

# =============================================================================
# LLM PROVIDER (Tencent Hy — TokenHub & TokenPlan)
# =============================================================================
# Tencent TokenHub (OpenAI-compatible): https://tokenhub.tencentmaas.com
# TOKENHUB_API_KEY=your_key_here
# Configure custom endpoints with `model.base_url` in config.yaml.
# Tencent TokenPlan (Anthropic Messages endpoint via LKEAP):
# TOKENPLAN_API_KEY=your_key_here
# Configure custom endpoints with `model.base_url` in config.yaml.

# =============================================================================
# TOOL API KEYS
# =============================================================================
Expand Down Expand Up @@ -293,12 +318,14 @@ BROWSERBASE_PROXIES=true
# Uses custom Chromium build to avoid bot detection altogether
BROWSERBASE_ADVANCED_STEALTH=false

# Browser engine for local mode (default: auto = Chrome)
# "auto" — use Chrome (don't pass --engine flag)
# "lightpanda" — use Lightpanda (1.3-5.8x faster navigation, no screenshots)
# Local browser engine (default: auto = Chrome)
# "auto" — use Chrome
# "lightpanda" — use Lightpanda (faster navigation, no screenshots)
# "chrome" — explicitly request Chrome
# Requires agent-browser v0.25.3+. Lightpanda commands that fail or return
# empty results are automatically retried with Chrome.
# Browser Use mode (default) spawns `lightpanda serve` itself; the built-in
# browser tools pass --engine to agent-browser v0.25.3+ and retry failed or
# empty Lightpanda results with Chrome. Ignored while a cloud provider,
# Camofox or browser.cdp_url is active (`hermes doctor` reports that).
# Also configurable via browser.engine in config.yaml.
# AGENT_BROWSER_ENGINE=auto

Expand Down Expand Up @@ -502,3 +529,12 @@ IMAGE_TOOLS_DEBUG=false
# GOOGLE_CHAT_ALLOW_ALL_USERS=false # Set true to skip the allowlist
# GOOGLE_CHAT_HOME_CHANNEL= # Default space (spaces/XXXX) for cron delivery
# GOOGLE_CHAT_HOME_CHANNEL_NAME= # Display name for the home channel

# =============================================================================
# reddit-reading skill (optional) — app-only credentials, NOT a user login
# =============================================================================
# The skill works with no credentials via Reddit's public feeds (~1 request/minute).
# For faster access with scores and nested comments, register a free "script" app
# at https://www.reddit.com/prefs/apps and paste its id and secret here.
# REDDIT_CLIENT_ID=
# REDDIT_CLIENT_SECRET=
3 changes: 3 additions & 0 deletions .github/actions/detect-changes/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ outputs:
installer:
description: Run the PowerShell installer tests on a Windows runner.
value: ${{ steps.classify.outputs.installer }}
desktop_updater:
description: Run the Windows desktop-update hand-off (windows.ps1) integration tests.
value: ${{ steps.classify.outputs.desktop_updater }}
rust:
description: Run `cargo test` for the Tauri bootstrap installer.
value: ${{ steps.classify.outputs.rust }}
Expand Down
33 changes: 33 additions & 0 deletions .github/workflows/case-collision-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Case Collision Check

# Rejects PRs that track two files whose paths differ only by case
# (README.md vs readme.md, src/Foo.py vs SRC/foo.py).
#
# Linux is case-sensitive; Windows and macOS (default) are not. A
# case-colliding pair lives fine in a Linux checkout and silently breaks
# every clone on a case-insensitive host — the filesystem can hold only
# one of them, so checkout fails or whichever wins overwrites the other.
# Git won't prevent the pair from landing (it only warns at checkout time,
# on a case-insensitive FS, for the client doing the checkout), so the only
# enforcement point is CI, on Linux, against the index.
#
# Runs unconditionally (no change-classifier gate): a collision can ship in
# any kind of PR — docs, JS, config, not just Python — so gating on a
# language lane would be the same "passive rule that cannot enforce a
# policy" trap the infographic check exists to close.

on:
workflow_call:

permissions:
contents: read

jobs:
check-case-collisions:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Run case-collision checker
run: python3 scripts/check-case-collisions.py
39 changes: 31 additions & 8 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ jobs:
uv_lock: ${{ steps.classify.outputs.uv_lock }}
npm_lock: ${{ steps.classify.outputs.npm_lock }}
installer: ${{ steps.classify.outputs.installer }}
desktop_updater: ${{ steps.classify.outputs.desktop_updater }}
rust: ${{ steps.classify.outputs.rust }}
docker_meta: ${{ steps.classify.outputs.docker_meta }}
mcp_catalog: ${{ steps.classify.outputs.mcp_catalog }}
Expand Down Expand Up @@ -84,6 +85,11 @@ jobs:
needs: detect
if: needs.detect.outputs.python == 'true'
uses: ./.github/workflows/tests-os.yml
with:
# The Windows lane spawns the real desktop-update hand-off script
# (tests/test_desktop_update_windows_*.py) only when that surface
# changed; unit-level windows_only tests always run.
desktop_updater: ${{ needs.detect.outputs.desktop_updater == 'true' }}

lint:
name: Python lints
Expand Down Expand Up @@ -122,14 +128,14 @@ jobs:
# Tests-only PRs (~17% of commits) skip this 5-minute job — the longest
# single job in the workflow — while still running the full pytest lanes.
#
# ⛔ TEMPORARILY DISABLED (Aug 2, 2026, Teknium) — the suite is red on
# every PR and on main itself since the Aug 1 night engines/npm churn
# (#76499 → #76562 → #76575): the mock-backend Electron window never
# gets a title, so boot/chat/setup/interim specs all fail identically
# regardless of the PR's diff (verified on #76573 and the docs-only
# #76582). Tracking issue: #76627 (assigned: Ari). To re-enable,
# delete the `false &&` below — nothing else changed.
if: ${{ false && (needs.detect.outputs.python_prod == 'true' || needs.detect.outputs.frontend == 'true') }}
# Re-disabled (Sep 2026): the Sep 1 re-enable is still incredibly flaky.
# Keep this a bare `if: false`. The earlier
# `${{ false && (... || ...) }}` form on this reusable-workflow job made
# GitHub's workflow parser fail at startup ("An unexpected error has
# occurred") — every ci.yaml run repo-wide dispatched 0 jobs from
# 24f5a60ed1 until this line changed. To re-enable, restore:
# if: ${{ needs.detect.outputs.python_prod == 'true' || needs.detect.outputs.frontend == 'true' }}
if: false
uses: ./.github/workflows/e2e-desktop.yml

docs-site:
Expand Down Expand Up @@ -166,6 +172,16 @@ jobs:
needs: detect
uses: ./.github/workflows/infographic-check.yml

profile-artifact-check:
name: Profile artifact check
needs: detect
uses: ./.github/workflows/profile-artifact-check.yml

case-collision-check:
name: Check no case-colliding filenames
needs: detect
uses: ./.github/workflows/case-collision-check.yml

lockfile-diff:
name: package-lock.json diff
needs: detect
Expand Down Expand Up @@ -202,6 +218,11 @@ jobs:
osv-scanner:
name: OSV scan
uses: ./.github/workflows/osv-scanner.yml
with:
# The fork's existing Code Scanning baseline cannot correlate the upgraded
# reusable-workflow identity on CI PR runs. The standalone weekly scan
# keeps the default upload-sarif=true for durable main-branch findings.
upload-sarif: false

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Enable SARIF uploads on main pushes

The ci.yaml workflow runs for both pull requests and pushes to main, but this reusable-workflow call unconditionally passes upload-sarif: false. Consequently, the post-merge OSV scan also suppresses Code Scanning publication, even though the adjacent comment says the workaround is for PR runs; on main there is no PR review consumer, and the remaining short-lived artifact is not a durable alert. Pass false only when github.event_name == 'pull_request' so main-push scans retain SARIF.

Useful? React with 👍 / 👎.


# ─────────────────────────────────────────────────────────────────────
# Gate: runs after everything. ``if: always()`` ensures it reports a
Expand All @@ -228,8 +249,10 @@ jobs:
- history-check
- contributor-check
- uv-lockfile
- case-collision-check
- lockfile-diff
- docker-lint
- profile-artifact-check
- supply-chain
- review-labels
- osv-scanner
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ jobs:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Reject profile exports in the build context
run: python3 scripts/ci/check_profile_archive_boundary.py

# Retry once on transient Docker Hub / buildkit pull failures
# (connection reset, auth token timeout, rate limiting). The action
# generates a unique builder name per invocation so the retry doesn't
Expand Down Expand Up @@ -206,6 +209,9 @@ jobs:
- name: Checkout trusted source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Reject profile exports in the build context
run: python3 scripts/ci/check_profile_archive_boundary.py

# Retry once on transient Docker Hub / buildkit pull failures.
# See build job for rationale; same pattern.
- name: Set up Docker Buildx
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/installer-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,11 @@ jobs:
- name: 8.3 short-path normalization (Windows PowerShell 5.1)
shell: powershell
run: powershell -NoProfile -ExecutionPolicy Bypass -File scripts/tests/test-install-ps1-longpath.ps1

- name: System Node and npm compatibility (pwsh 7)
shell: pwsh
run: pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/tests/test-install-ps1-node-compatibility.ps1

- name: System Node and npm compatibility (Windows PowerShell 5.1)
shell: powershell
run: powershell -NoProfile -ExecutionPolicy Bypass -File scripts/tests/test-install-ps1-node-compatibility.ps1
22 changes: 22 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -178,3 +178,25 @@ jobs:

- name: Run footgun checker
run: python scripts/check-windows-footguns.py --all

# The Sep 2026 decomposition kept old import paths alive for external plugins
# (PLUGIN-COMPAT blocks, see COMPAT_MANIFEST.md). They are removed on schedule by
# reverting one commit, so in-tree code must never depend on them.
- name: Forbid in-tree use of plugin-compat pointers
run: python scripts/check_compat_pointers.py

# Advisory: dropped public names / methods / test defs vs the PR base, printed into the log.
# A refactor that silently removes a public symbol breaks plugins that import it; the Sep 2026
# decomposition opened with 1,703 such drops that reviewers had to find by hand.
# Advisory: it never fails the job. The checkout above is depth-1, so deepen both sides until
# a merge-base exists (the script refuses to report a clean diff without one, by design).
- name: Public-surface diff vs base (advisory)
if: github.event_name == 'pull_request'
continue-on-error: true
run: |
git fetch --no-tags --deepen=200 origin "${{ github.base_ref }}" HEAD
for i in 1 2 3; do
git merge-base "origin/${{ github.base_ref }}" HEAD >/dev/null 2>&1 && break
git fetch --no-tags --deepen=1000 origin "${{ github.base_ref }}" HEAD
done
python scripts/ci/check_public_surface.py --base "origin/${{ github.base_ref }}" --head HEAD
12 changes: 10 additions & 2 deletions .github/workflows/osv-scanner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ name: OSV-Scanner
# dep became known-vulnerable" case.
#
# Uses Google's officially-recommended reusable workflow, pinned by SHA.
# Findings land in the repo's Security tab (Code Scanning > OSV-Scanner).
# Findings land in the repo's Security tab for scheduled/main scans. PR scans
# keep the artifact and unified review status without creating a baseline-mismatch check.
# fail-on-vuln is disabled so the job does not block merges on pre-existing
# vulnerabilities in pinned deps that we may need to patch deliberately.
#
Expand All @@ -25,6 +26,12 @@ name: OSV-Scanner

on:
workflow_call:
inputs:
upload-sarif:
description: "Upload SARIF to Code Scanning (disabled for PR baseline mismatch)"
type: boolean
required: false
default: true
schedule:
# Weekly scan against main — catches CVEs published after merge for
# deps that haven't changed since.
Expand All @@ -40,7 +47,7 @@ permissions:
jobs:
scan:
name: Scan lockfiles
uses: google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@9a498708959aeaef5ef730655706c5a1df1edbc2 # v2.3.8
uses: google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@baa4139e56d6312335d899e6ba045fa16d1d3d0b # v2.5.1
with:
# Scan explicit lockfiles rather than recursing, so we only look at
# the five sources of truth and skip vendored / test / worktree dirs.
Expand All @@ -53,6 +60,7 @@ jobs:
# The upstream reusable workflow uploads this exact file under its
# fixed artifact name, which the wrapper downloads below.
results-file-name: osv-results.sarif
upload-sarif: ${{ inputs.upload-sarif }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Enable SARIF for direct workflow triggers

When this workflow runs from its own weekly schedule or workflow_dispatch trigger, it is not invoked through workflow_call, so the workflow_call.inputs.upload-sarif default is not populated; ${{ inputs.upload-sarif }} therefore resolves to an empty/false value and the child scanner still suppresses the SARIF upload. Fresh evidence after the earlier comment is that the repair only supplies true from the ci.yaml caller, leaving both direct triggers without a value; explicitly enable uploads for non-workflow_call events.

Useful? React with 👍 / 👎.

fail-on-vuln: false

emit-status:
Expand Down
21 changes: 21 additions & 0 deletions .github/workflows/profile-artifact-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Profile Artifact Boundary

# A reusable, unconditional guard for the incident class in #92457. Ignore
# files reduce accidental staging; this job is the enforcement boundary that
# still catches `git add -f` and generated files present during a build.

on:
workflow_call:

permissions:
contents: read

jobs:
check-profile-artifacts:
name: Reject profile archives
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Reject profile exports in the checkout
run: python3 scripts/ci/check_profile_archive_boundary.py
27 changes: 27 additions & 0 deletions .github/workflows/tests-os.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,19 @@ name: OS-specific tests

on:
workflow_call:
inputs:
desktop_updater:
description: >-
Run the Windows desktop-update hand-off integration tests
(tests/test_desktop_update_windows_*.py). These spawn the real
scripts/desktop-update/windows.ps1 and poll its loopback server, so
they carry process-timing noise a shared runner amplifies; the
caller gates them on the classifier's desktop_updater lane so a PR
that never touched that surface cannot be failed by it. Push /
dispatch runs fail open (classifier sets every lane true).
type: boolean
required: false
default: true

permissions:
contents: read
Expand Down Expand Up @@ -134,9 +147,23 @@ jobs:
# would therefore abort the script on any non-zero exit and the
# exit-5 branch below would be unreachable dead code — the job
# would still fail red, but the diagnostic would never print.
# Desktop-update hand-off integration tests spawn the real
# windows.ps1; deselect them unless the PR touched that surface
# (see the workflow_call input). ``--ignore-glob`` keeps the file
# list above intact, so a renamed test file still trips the
# zero-tests guard rather than silently vanishing.
# (bash 3.2 on the macOS runner: an empty array under ``set -u`` is
# an unbound-variable error, hence the ``${arr[@]+...}`` idiom.)
EXTRA_ARGS=()
if [ "${{ inputs.desktop_updater }}" != "true" ]; then
echo "desktop_updater lane off: skipping tests/test_desktop_update_windows_*.py"
EXTRA_ARGS+=(--ignore-glob='*test_desktop_update_windows_*.py')
fi

status=0
uv run --no-sync python -m pytest \
"$@" \
${EXTRA_ARGS[@]+"${EXTRA_ARGS[@]}"} \
-m "${{ matrix.marker }} and not integration" \
-v --tb=short || status=$?
if [ "$status" -eq 5 ]; then
Expand Down
Loading
Loading