Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
896 commits
Select commit Hold shift + click to select a range
8ca326c
fix(ui): land #37382 from @FradSer
steipete Mar 7, 2026
3a74dc0
fix(gateway): land #38725 from @ademczuk
steipete Mar 7, 2026
f53e10e
fix(config): fail closed on invalid config load (#9040, thanks @joeto…
steipete Mar 7, 2026
99de651
fix(telegram): surface fallback on dispatch failures (#39209, thanks …
steipete Mar 7, 2026
e45d62b
fix(memory): preserve BM25 relevance ordering (#33757, thanks @lsdcc01)
steipete Mar 7, 2026
ab704b7
fix(gateway): explain provider-object password bootstrap errors (#392…
steipete Mar 7, 2026
3a761fb
fix(agents): strip unsupported responses store payloads (#39219, than…
steipete Mar 7, 2026
e83094e
fix(agents): warn clearly on unresolved model ids (#39215, thanks @ad…
steipete Mar 7, 2026
265367d
fix(gateway): land #28428 from @l0cka
steipete Mar 7, 2026
3ca023b
chore(test): normalize install assertion formatting
steipete Mar 7, 2026
708187f
fix(outbound): prevent replay after ack crash windows (#38668, thanks…
steipete Mar 7, 2026
bfbe80a
test(ui): reduce gateway client test mocking (#39251)
altaywtf Mar 7, 2026
c76d292
fix(node-host): bind approved script operands
steipete Mar 7, 2026
7ab49a7
test(regression): cover recent landed fix paths
steipete Mar 7, 2026
5b27b0c
refactor(outbound,agents): extract shared payload and queue helpers
steipete Mar 7, 2026
1d1757b
fix(exec): recognize PowerShell encoded commands
steipete Mar 7, 2026
5f26970
fix(ui): land #28608 from @KimGLee
steipete Mar 7, 2026
fecca6f
refactor: unify gateway SecretRef auth resolution paths
steipete Mar 7, 2026
6b1c82c
refactor: unify onboarding dm/group policy scaffolding
steipete Mar 7, 2026
5eba663
refactor: unify onboarding secret-input prompt state wiring
steipete Mar 7, 2026
27dad96
refactor: normalize runtime group sender gating decisions
steipete Mar 7, 2026
4b61779
refactor: unify extension webhook request lifecycle scaffolding
steipete Mar 7, 2026
8e0e766
refactor: unify channel open-group-policy warning builders
steipete Mar 7, 2026
7230b96
refactor: unify extension allowlist resolver and directory scaffolding
steipete Mar 7, 2026
b456649
refactor: unify account-scoped dm security policy resolver
steipete Mar 7, 2026
b7d03ea
refactor: centralize open group-policy warning flow collectors
steipete Mar 7, 2026
621063a
style: format plugin helper tests
steipete Mar 7, 2026
5bbca5b
refactor: share sender-scoped group policy derivation
steipete Mar 7, 2026
c91bfa8
refactor: share route-level group gating decisions
steipete Mar 7, 2026
feac26c
refactor: share allowFrom formatter scaffolding
steipete Mar 7, 2026
556aa8a
refactor: share config adapter allowFrom and defaultTo helpers
steipete Mar 7, 2026
6647d02
refactor: share dock config adapter helper scaffolding
steipete Mar 7, 2026
d228a62
refactor: share trimmed string entry normalization
steipete Mar 7, 2026
8c15b86
refactor: share sender group policy evaluation
steipete Mar 7, 2026
99d14a8
refactor: share route policy evaluation in chat monitors
steipete Mar 7, 2026
c5bd843
refactor: share allowFrom stringification helpers
steipete Mar 7, 2026
c9128e1
refactor: share trimmed list normalization in provider helpers
steipete Mar 7, 2026
4956271
refactor: share provider allowlist input normalization
steipete Mar 7, 2026
dc92f2e
refactor: share nextcloud onboarding allowFrom lookup
steipete Mar 7, 2026
1aaca51
fix(media): harden unknown mime handling from #39199 (thanks @nicolas…
steipete Mar 7, 2026
939b184
fix(exec): honor shell comments in allow-always analysis
steipete Mar 7, 2026
adf4eb4
fix(signal): forward all inbound attachments from #39212 (thanks @joe…
steipete Mar 7, 2026
2fc95a7
fix(exec): close dispatch-wrapper boundary drift
steipete Mar 7, 2026
ada4ee0
fix(docker): land #33097 from @chengzhichao-xydt
steipete Mar 7, 2026
f304ca0
fix(agents): sanitize strict openai-compatible turn ordering from #39…
steipete Mar 7, 2026
eeba93d
fix(discord): pass gateway auth to exec approvals
steipete Mar 7, 2026
ab54532
fix(agents): land #39247 from @jasonQin6 (subagent workspace inherita…
steipete Mar 7, 2026
07cccfc
CI: drop duplicate strict smoke build check
vincentkoc Mar 7, 2026
d5803cc
CI: remove Knip dead-code report job
vincentkoc Mar 7, 2026
81140a7
Secrets: refresh baseline line numbers
vincentkoc Mar 7, 2026
3ae61d5
Gateway Status: allowlist missing token test fixture
vincentkoc Mar 7, 2026
936f0a7
Update gateway-status.test.ts
vincentkoc Mar 7, 2026
c5fb661
Daemon CLI: resolve token drift from gateway credentials
vincentkoc Mar 8, 2026
029fdd4
Daemon CLI: type-safe install plan assertions
vincentkoc Mar 8, 2026
766d76e
Wizard: type-safe onboarding install plan assertions
vincentkoc Mar 8, 2026
f319ec2
refactor: share onboarding allowlist entry parsing
steipete Mar 7, 2026
b0d9246
refactor: share matched group policy evaluation
steipete Mar 7, 2026
b6318d4
fix: narrow dm shared group policy typing
steipete Mar 7, 2026
846ec32
refactor: share account-scoped config adapter accessors
steipete Mar 7, 2026
2b54070
refactor: share allowlist provider warning resolution
steipete Mar 7, 2026
566a821
refactor: share missing-sender matched allowlist evaluation
steipete Mar 7, 2026
cc03c09
refactor: share provider group-policy warning collectors
steipete Mar 7, 2026
990fc36
refactor: share sampled entry summary formatting
steipete Mar 8, 2026
3800f67
Feishu: narrow directory entry types
vincentkoc Mar 8, 2026
7c5d6c3
Matrix: default missing media kind to unknown
vincentkoc Mar 8, 2026
a4ffebb
Mattermost: default unknown media kind
vincentkoc Mar 8, 2026
9d3469c
Nextcloud Talk: coerce route allowlist warning flag
vincentkoc Mar 8, 2026
d15a3d3
Telegram: coerce route allowlist warning flag
vincentkoc Mar 8, 2026
3b1be1a
Plugin SDK: align allowFrom helper test input
vincentkoc Mar 8, 2026
168c65a
Allowlists: type test runtime mocks
vincentkoc Mar 8, 2026
5f50823
refactor(exec): share wrapper depth classification
steipete Mar 8, 2026
8a469a1
test(exec): dedupe wrapper boundary regressions
steipete Mar 8, 2026
4e07bdb
fix(cron): restore isolated delivery defaults
steipete Mar 8, 2026
bda0357
fix(plugins): fall back to src plugin-sdk aliases
steipete Mar 8, 2026
61000b8
fix(acp): block sandboxed slash spawns
steipete Mar 8, 2026
eed403d
refactor(agents): unify spawned metadata and extract attachments service
steipete Mar 8, 2026
efdff9c
fix(scripts): enforce changelog.md and post clickable SHA links
steipete Mar 8, 2026
9856d84
chore(scripts): remove changelog fragment workflow helpers
steipete Mar 8, 2026
8f40b13
BlueBubbles: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
e47b63a
Discord: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
2a51582
Feishu: scope plugin SDK channel imports
vincentkoc Mar 8, 2026
1b034f0
Feishu: scope plugin SDK directory imports
vincentkoc Mar 8, 2026
566f308
Google Chat: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
4cd81b0
iMessage: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
7980dc5
IRC: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
43fd45f
LINE: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
4b02a4e
Matrix: use scoped plugin SDK channel imports
vincentkoc Mar 8, 2026
4b0d55d
Matrix: use scoped plugin SDK resolve-target imports
vincentkoc Mar 8, 2026
4cc619f
Mattermost: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
6b2adf6
Teams: use scoped plugin SDK channel imports
vincentkoc Mar 8, 2026
6035677
Teams: use scoped plugin SDK allowlist imports
vincentkoc Mar 8, 2026
c7c5c0e
Nextcloud Talk: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
4bcef86
Signal: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
d899990
Slack: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
e9cf350
Telegram: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
b46ac25
WhatsApp: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
5b0fa34
Zalo: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
d83f2c1
Zalo User: use scoped plugin SDK imports
vincentkoc Mar 8, 2026
475b0cb
Docker Setup: allowlist dotenv token fixtures
vincentkoc Mar 8, 2026
889a60e
Gateway Auth: allowlist bootstrap password references
vincentkoc Mar 8, 2026
ace6483
Gateway Credentials: allowlist password fixtures
vincentkoc Mar 8, 2026
a7c605e
Gateway Credentials: allowlist precedence fixtures
vincentkoc Mar 8, 2026
27b6b0c
Gateway Secrets: allowlist unresolved secret ref label
vincentkoc Mar 8, 2026
73e510c
Gateway UI: allowlist device key fixtures
vincentkoc Mar 8, 2026
a7f6e0a
fix(telegram): support negative IDs in groupAllowFrom (#36753) (#37134)
qiuyuemartin-max Mar 8, 2026
25252ab
gateway: harden shared auth resolution across systemd, discord, and n…
joshavant Mar 8, 2026
79e3d1f
fix: retry git lock in committer
steipete Mar 8, 2026
1731321
fix(exec): honor exec-approvals ask=off for gateway/node runs
steipete Mar 8, 2026
13ed6af
telegram: restore sender-only allowFrom validation
vincentkoc Mar 8, 2026
240b143
test(telegram): cover sender-only groupAllowFrom normalization
vincentkoc Mar 8, 2026
c657589
fix(exec): inherit ask from exec-approvals.json when tools.exec.ask u…
steipete Mar 8, 2026
ca37a4e
changelog: note telegram groupAllowFrom sender validation fix
vincentkoc Mar 8, 2026
9d2b292
fix(exec-approvals): honor allow-always for bash script invocations
steipete Mar 8, 2026
f195af0
fix(sandbox): anchor fs-bridge destructive ops
steipete Mar 8, 2026
a56841b
Daemon: harden WSL2 systemctl install checks (#39294)
vincentkoc Mar 8, 2026
60441c8
Systemd: allowlist environment file fixtures
vincentkoc Mar 8, 2026
83290c5
Discord: format exec approval tests
vincentkoc Mar 8, 2026
ac02529
Gateway Auth: allowlist connection auth precedence fixtures
vincentkoc Mar 8, 2026
fcb990e
Node Host: allowlist password precedence labels
vincentkoc Mar 8, 2026
0d66834
Daemon: scope relaxed systemd probes to install flows
vincentkoc Mar 8, 2026
02eef1d
fix(telegram): use group allowlist for native command auth in groups …
edwluo Mar 8, 2026
7ac7b39
refactor(daemon): extract gateway token drift helper
steipete Mar 8, 2026
e758d49
refactor(plugins): extract alias candidate resolution
steipete Mar 8, 2026
6b18ec4
refactor(cron): centralize initial delivery defaults
steipete Mar 8, 2026
45d3e62
refactor(cron): extract agent defaults merge helpers
steipete Mar 8, 2026
9b99787
refactor(cron): extract delivery tool policy helpers
steipete Mar 8, 2026
e66c418
refactor(cron): normalize legacy delivery at ingress
steipete Mar 8, 2026
149ae45
fix(cron): preserve manual timeoutSeconds on add
steipete Mar 8, 2026
5edcab2
fix(queue): land #33168 from @rylena
steipete Mar 8, 2026
d6d04f3
fix(ollama): preserve local limits and native thinking fallback (#39292)
vincentkoc Mar 8, 2026
4869e24
fix(telegram): land #34983 from @HOYALIM
steipete Mar 8, 2026
a505be7
fix(telegram): land #38906 from @gambletan
steipete Mar 8, 2026
09cfcf9
fix(sandbox): anchor fs-bridge mkdirp
steipete Mar 8, 2026
eb09d8d
fix(telegram): land #34238 from @hal-crackbot
steipete Mar 8, 2026
40dfba8
refactor(sandbox): split fs bridge path safety
steipete Mar 8, 2026
6337666
fix(telegram): restore named-account DM fallback routing (from #32426)
steipete Mar 8, 2026
cf1c2cc
fix(discord): normalize DM session keys
steipete Mar 8, 2026
bc91ae9
fix(discord): preserve native command session keys
steipete Mar 8, 2026
99cfd27
fix(sandbox): pin fs bridge readfile handles
steipete Mar 8, 2026
ad052d6
docs: note gateway auth follow-up hardening
steipete Mar 8, 2026
a2cb80b
fix(daemon): preserve envfile auth provenance
steipete Mar 8, 2026
f236742
fix(gateway): block cached device token override fallback
steipete Mar 8, 2026
da88d92
fix(gateway): fail closed for config-first secretrefs
steipete Mar 8, 2026
bebde34
refactor(sandbox): clarify fs bridge read and shell plans
steipete Mar 8, 2026
7e59803
refactor(queue): use stable tuple key for recent message dedupe
steipete Mar 8, 2026
f866e57
refactor(telegram): dedupe non-idempotent request setup
steipete Mar 8, 2026
7b9a349
refactor(telegram): share error graph traversal helper
steipete Mar 8, 2026
3987ca4
refactor(retry): simplify telegram shouldRetry composition
steipete Mar 8, 2026
1135b7f
refactor(telegram): precompute dm preview transport flag
steipete Mar 8, 2026
269cc22
refactor(telegram): split lane delivery modules
steipete Mar 8, 2026
c1d07b0
refactor(discord): extract route resolution helpers
steipete Mar 8, 2026
74e3c07
refactor(discord): extract session key normalization
steipete Mar 8, 2026
189cd99
refactor(discord): require explicit outbound target hints
steipete Mar 8, 2026
9d10697
refactor(discord): extract native command context builder
steipete Mar 8, 2026
8f719e5
refactor(discord): extract native command session targets
steipete Mar 8, 2026
ad7399b
refactor(sessions): add provider key normalizers
steipete Mar 8, 2026
eb9e78d
fix(discord): default missing native command args
steipete Mar 8, 2026
08597e8
fix(ci): stabilize detect-secrets baseline
steipete Mar 8, 2026
547436b
refactor(discord): extract inbound context helpers
steipete Mar 8, 2026
6016e22
refactor(discord): compose native command routes
steipete Mar 8, 2026
e381ab6
refactor(channels): share native command session targets
steipete Mar 8, 2026
8cc477b
refactor(sessions): simplify provider normalizer matching
steipete Mar 8, 2026
c22a445
fix(telegram): honor commands.allowFrom in native command auth (#39310)
vincentkoc Mar 8, 2026
556a74d
Daemon: handle degraded systemd status checks (#39325)
vincentkoc Mar 8, 2026
ad80ecd
Discord: fix native command context test args
vincentkoc Mar 8, 2026
69a6c0a
Runner: normalize malformed tool call names before dispatch (#39328)
vincentkoc Mar 8, 2026
2ec478c
Changelog: credit #39328 to @vincentkoc
vincentkoc Mar 8, 2026
5b30c9d
Changelog: move #39328 credit to section end
vincentkoc Mar 8, 2026
01833c5
fix(acp): avoid inline delivery for oneshot run spawns (#39014)
lidamao633 Mar 8, 2026
7e946b3
fix(ollama): register custom api for compaction and summarization (#3…
vincentkoc Mar 8, 2026
1831dbb
Status: format service summary
vincentkoc Mar 8, 2026
2c7fb54
Config: fail closed invalid config loads (#39071)
vincentkoc Mar 8, 2026
daecd2d
Pi Runner: gate parallel_tool_calls to compatible APIs (#39356)
vincentkoc Mar 8, 2026
1b9e480
test: fix gateway register option collision mock
steipete Mar 8, 2026
5b257c6
fix: default codex-cli sandbox to workspace-write
steipete Mar 8, 2026
ae15e3f
Daemon CLI: format lifecycle core imports
vincentkoc Mar 8, 2026
f494e46
Ollama: allowlist test api keys
vincentkoc Mar 8, 2026
0018f47
Secrets: refresh baseline for tts line drift
vincentkoc Mar 8, 2026
066d589
fix(gateway): distinguish disconnected from stuck in health-monitor r…
Sid-Qin Mar 5, 2026
1e05f14
fix: land health-monitor disconnected reason label (#36436) (thanks @…
steipete Mar 8, 2026
49261b0
fix: auto-create inherited agent override entries
steipete Mar 8, 2026
b2f8f5e
CI: add CodeQL workflow
vincentkoc Mar 8, 2026
6a8081a
refactor(routing): centralize inbound last-route policy
steipete Mar 8, 2026
e705627
refactor(telegram): centralize text parsing helpers
steipete Mar 8, 2026
01cff3a
refactor(pairing): share allowFrom path resolution
steipete Mar 8, 2026
44e7c11
refactor(doctor): model legacy file copies as plans
steipete Mar 8, 2026
a679049
refactor(doctor): type legacy migration fixtures
steipete Mar 8, 2026
c2e1ae6
refactor(telegram): split bot message context helpers
steipete Mar 8, 2026
31564be
CI: fix CodeQL manual builds
vincentkoc Mar 8, 2026
4062aa5
Gateway: add safer password-file input for gateway run (#39067)
vincentkoc Mar 8, 2026
bf9c362
Gateway: stop and restart unmanaged listeners (#39355)
vincentkoc Mar 8, 2026
1e3daa6
CI: fix CodeQL concurrency
vincentkoc Mar 8, 2026
c0a7c30
fix: preserve agents-page selection after config save
steipete Mar 8, 2026
c6ff137
CI: make CodeQL manual only
vincentkoc Mar 8, 2026
96f4f50
Agents UI: compose save state from config state
vincentkoc Mar 8, 2026
0125bd9
Agents UI: complete config state test fixture
vincentkoc Mar 8, 2026
1ef8d6a
test: accept ACP token-file inspect errors
steipete Mar 8, 2026
9d7d961
fix: restore Telegram webhook-mode health after restarts
steipete Mar 8, 2026
76a028a
Gateway CLI: allowlist password-file fixture
vincentkoc Mar 8, 2026
4600817
fix: isolate TUI /new sessions per client
steipete Mar 8, 2026
100da9f
fix: correct gemini flash model id
steipete Mar 8, 2026
6cb889d
TUI: type setSession test mocks
vincentkoc Mar 8, 2026
af9d76b
fix: honor explicit Synology Chat rate-limit env values
steipete Mar 8, 2026
a8c67af
test: cover gemini flash compat normalization
steipete Mar 8, 2026
28b72e5
fix: honor zero-valued voice-call STT settings
steipete Mar 8, 2026
442f2c3
fix: honor explicit OpenAI TTS speed values
steipete Mar 8, 2026
14916fb
Secrets: refresh baseline for model provider docs
vincentkoc Mar 8, 2026
b8b6569
Voice Call: allowlist realtime STT api key fixtures
vincentkoc Mar 8, 2026
b1f7cf4
Voice Call: read TTS internals in tests
vincentkoc Mar 8, 2026
244aabb
Voice Call: read realtime STT internals in tests
vincentkoc Mar 8, 2026
7f44bc5
fix: reject launchd pid sentinel values
steipete Mar 8, 2026
56cd008
test: fix gate regressions
steipete Mar 8, 2026
e45fcc5
fix(telegram): restore DM draft streaming
obviyus Mar 8, 2026
722c5e5
docs: add changelog for Telegram DM draft restore (#39398)
obviyus Mar 8, 2026
5759b93
fix(ci): pin multi-arch docker base digests
steipete Mar 8, 2026
3087893
refactor: normalize voice-call runtime defaults
steipete Mar 8, 2026
2646739
refactor: centralize strict numeric parsing
steipete Mar 8, 2026
fd1e481
refactor: split daemon status gathering
steipete Mar 8, 2026
380eb1c
refactor: reuse shared gateway probe auth
steipete Mar 8, 2026
bd41326
refactor: register gateway service adapters
steipete Mar 8, 2026
f6c7ff3
refactor: preserve explicit mock voice-call values
steipete Mar 8, 2026
7d2b146
test: cover daemon probe auth seam
steipete Mar 8, 2026
d902bae
fix(discord): validate agentComponents config
thewilloftheshadow Mar 8, 2026
9c8e34d
fix: document discord agentComponents schema parity (#39378) (thanks …
gambletan Mar 8, 2026
f721141
fix(ci): resolve type regressions on main
steipete Mar 8, 2026
5659d7f
fix: land #39337 by @goodspeed-apps for acpx MCP bootstrap
steipete Mar 8, 2026
ed43743
refactor(voice-call): share tts deep merge
steipete Mar 8, 2026
f2a4bdf
fix(ci): resolve current gate regressions
steipete Mar 8, 2026
75a44de
docs: dedupe changelog contributor attribution
steipete Mar 8, 2026
c743fd9
docs: clean up latest changelog sections
steipete Mar 8, 2026
930caea
fix(chat): preserve sender labels in dashboard history
obviyus Mar 8, 2026
5214859
chore: add changelog and format fix for #39414
obviyus Mar 8, 2026
dc78725
test: stabilize exec resolver timeout fixture
steipete Mar 8, 2026
1b3d8ee
docs: note npmjs 1password path for releases
steipete Mar 8, 2026
21df014
fix: stage docker live tests from mounted source
steipete Mar 8, 2026
a035a3c
fix: drop removed minimax lightning model
steipete Mar 8, 2026
dd8fd98
build: reduce build log noise
steipete Mar 8, 2026
3596a46
build: prepare 2026.3.7-beta.1 release
steipete Mar 8, 2026
d967009
style: format daemon lifecycle test
steipete Mar 8, 2026
fcdc1a1
fix: land #33992 from @darkamenosa
steipete Mar 8, 2026
c6a8ab6
build: refresh beta appcast asset signature
steipete Mar 8, 2026
06ffef8
fix(ci): repair zalouser CI failures
steipete Mar 8, 2026
59102a1
fix: add gemini 3.1 flash-lite support
steipete Mar 8, 2026
5d22bd0
fix: add google flash-lite forward compat
steipete Mar 8, 2026
e0f80cf
fix(ui): align control-ui device auth token signing
steipete Mar 8, 2026
c381034
CLI: avoid false update restart failures without listener attribution…
vincentkoc Mar 8, 2026
42a1394
build: prepare 2026.3.7 release
steipete Mar 8, 2026
82a84c1
chore: mark pending upstream sync for v2026.3.7 (conflicts)
github-actions[bot] Mar 8, 2026
c46075d
Merge tag 'refs/tags/v2026.3.7' into sync/upstream-release-v2026.3.7
RedBeardEth Mar 9, 2026
87237da
update lock
RedBeardEth Mar 9, 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
  •  
  •  
  •  
21 changes: 17 additions & 4 deletions .detect-secrets.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@
[exclude-files]
# pnpm lockfiles contain lots of high-entropy package integrity blobs.
pattern = (^|/)pnpm-lock\.yaml$
# Generated output and vendored assets.
pattern = (^|/)(dist|vendor)/
# Local config file with allowlist patterns.
pattern = (^|/)\.detect-secrets\.cfg$

[exclude-lines]
# Fastlane checks for private key marker; not a real key.
Expand All @@ -28,3 +24,20 @@ pattern = "talk\.apiKey"
pattern = === "string"
# specific optional-chaining password check that didn't match the line above.
pattern = typeof remote\?\.password === "string"
# Docker apt signing key fingerprint constant; not a secret.
pattern = OPENCLAW_DOCKER_GPG_FINGERPRINT=
# Credential matrix metadata field in docs JSON; not a secret value.
pattern = "secretShape": "(secret_input|sibling_ref)"
# Docs line describing API key rotation knobs; not a credential.
pattern = API key rotation \(provider-specific\): set `\*_API_KEYS`
# Docs line describing remote password precedence; not a credential.
pattern = passw[o]rd: `OPENCLAW_GATEWAY_PASSW[O]RD` -> `gateway\.auth\.passw[o]rd` -> `gateway\.remote\.passw[o]rd`
pattern = passw[o]rd: `OPENCLAW_GATEWAY_PASSW[O]RD` -> `gateway\.remote\.passw[o]rd` -> `gateway\.auth\.passw[o]rd`
# Test fixture starts a multiline fake private key; detector should ignore the header line.
pattern = const key = `-----BEGIN PRIVATE KEY-----
# Docs examples: literal placeholder API key snippets and shell heredoc helper.
pattern = export CUSTOM_API_K[E]Y="your-key"
pattern = grep -q 'N[O]DE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache' ~/.bashrc \|\| cat >> ~/.bashrc <<'EOF'
pattern = env: \{ MISTRAL_API_K[E]Y: "sk-\.\.\." \},
pattern = "ap[i]Key": "xxxxx",
pattern = ap[i]Key: "A[I]za\.\.\.",
47 changes: 47 additions & 0 deletions .github/actions/ensure-base-commit/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Ensure base commit
description: Ensure a shallow checkout has enough history to diff against a base SHA.
inputs:
base-sha:
description: Base commit SHA to diff against.
required: true
fetch-ref:
description: Branch or ref to deepen/fetch from origin when base-sha is missing.
required: true
runs:
using: composite
steps:
- name: Ensure base commit is available
shell: bash
env:
BASE_SHA: ${{ inputs.base-sha }}
FETCH_REF: ${{ inputs.fetch-ref }}
run: |
set -euo pipefail
if [ -z "$BASE_SHA" ] || [[ "$BASE_SHA" =~ ^0+$ ]]; then
echo "No concrete base SHA available; skipping targeted fetch."
exit 0
fi
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then
echo "Base commit already present: $BASE_SHA"
exit 0
fi
for deepen_by in 25 100 300; do
echo "Base commit missing; deepening $FETCH_REF by $deepen_by."
git fetch --no-tags --deepen="$deepen_by" origin "$FETCH_REF" || true
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then
echo "Resolved base commit after deepening: $BASE_SHA"
exit 0
fi
done
echo "Base commit still missing; fetching full history for $FETCH_REF."
git fetch --no-tags origin "$FETCH_REF" || true
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then
echo "Resolved base commit after full ref fetch: $BASE_SHA"
exit 0
fi
echo "Base commit still unavailable after fetch attempts: $BASE_SHA"
2 changes: 1 addition & 1 deletion .github/actions/setup-node-env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ runs:
if: inputs.install-bun == 'true'
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.9+cf6cdbbba"
bun-version: "1.3.9"

- name: Runtime versions
shell: bash
Expand Down
15 changes: 15 additions & 0 deletions .github/workflows/auto-response.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ jobs:
github-token: ${{ steps.app-token.outputs.token || steps.app-token-fallback.outputs.token }}
script: |
// Labels prefixed with "r:" are auto-response triggers.
const activePrLimit = 10;
const rules = [
{
label: "r: skill",
Expand All @@ -48,6 +49,20 @@ jobs:
message:
"Please use [our support server](https://discord.gg/clawd) and ask in #help or #users-helping-users to resolve this, or follow the stuck FAQ at https://docs.openclaw.ai/help/faq#im-stuck-whats-the-fastest-way-to-get-unstuck.",
},
{
label: "r: no-ci-pr",
message:
"Please don't make PRs for test failures on main.\n\n" +
"The team is aware of those and will handle them directly on the codebase, not only fixing the tests but also investigating what the root cause is. Having to sift through test-fix-PRs (including some that have been out of date for weeks...) on top of that doesn't help. There are already way too many PRs for humans to manage; please don't make the flood worse.\n\n" +
"Thank you.",
},
{
label: "r: too-many-prs",
close: true,
message:
`Closing this PR because the author has more than ${activePrLimit} active PRs in this repo. ` +
"Please reduce the active PR queue and reopen or resubmit once it is back under the limit. You can close your own PRs to get back under the limit.",
},
{
label: "r: testflight",
close: true,
Expand Down
125 changes: 74 additions & 51 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,31 +21,47 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-depth: 1
fetch-tags: false
submodules: false

- name: Ensure docs-scope base commit
uses: ./.github/actions/ensure-base-commit
with:
base-sha: ${{ github.event_name == 'push' && github.event.before || github.event.pull_request.base.sha }}
fetch-ref: ${{ github.event_name == 'push' && github.ref_name || github.event.pull_request.base.ref }}

- name: Detect docs-only changes
id: check
uses: ./.github/actions/detect-docs-changes

# Detect which heavy areas are touched so PRs can skip unrelated expensive jobs.
# Push to main keeps broad coverage.
# Push to main keeps broad coverage, but this job still needs to run so
# downstream jobs that list it in `needs` are not skipped.
changed-scope:
needs: [docs-scope]
if: github.event_name == 'pull_request' && needs.docs-scope.outputs.docs_only != 'true'
if: needs.docs-scope.outputs.docs_only != 'true'
runs-on: blacksmith-16vcpu-ubuntu-2404
outputs:
run_node: ${{ steps.scope.outputs.run_node }}
run_macos: ${{ steps.scope.outputs.run_macos }}
run_android: ${{ steps.scope.outputs.run_android }}
run_skills_python: ${{ steps.scope.outputs.run_skills_python }}
run_windows: ${{ steps.scope.outputs.run_windows }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-depth: 1
fetch-tags: false
submodules: false

- name: Ensure changed-scope base commit
uses: ./.github/actions/ensure-base-commit
with:
base-sha: ${{ github.event_name == 'push' && github.event.before || github.event.pull_request.base.sha }}
fetch-ref: ${{ github.event_name == 'push' && github.ref_name || github.event.pull_request.base.ref }}

- name: Detect changed scopes
id: scope
shell: bash
Expand All @@ -71,6 +87,13 @@ jobs:
with:
submodules: false

- name: Ensure secrets base commit (PR fast path)
if: github.event_name == 'pull_request'
uses: ./.github/actions/ensure-base-commit
with:
base-sha: ${{ github.event.pull_request.base.sha }}
fetch-ref: ${{ github.event.pull_request.base.ref }}

- name: Setup Node environment
uses: ./.github/actions/setup-node-env
with:
Expand Down Expand Up @@ -124,6 +147,9 @@ jobs:
- runtime: node
task: test
command: pnpm canvas:a2ui:bundle && pnpm test
- runtime: node
task: extensions
command: pnpm test:extensions
- runtime: node
task: protocol
command: pnpm protocol:check
Expand Down Expand Up @@ -187,46 +213,6 @@ jobs:
- name: Enforce safe external URL opening policy
run: pnpm lint:ui:no-raw-window-open

# Report-only dead-code scans. Runs after scope detection and stores machine-readable
# results as artifacts for later triage before we enable hard gates.
# Temporarily disabled in CI while we process initial findings.
deadcode:
name: dead-code report
needs: [docs-scope, changed-scope]
# if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true')
if: false
runs-on: blacksmith-16vcpu-ubuntu-2404
strategy:
fail-fast: false
matrix:
include:
- tool: knip
command: pnpm deadcode:report:ci:knip
- tool: ts-prune
command: pnpm deadcode:report:ci:ts-prune
- tool: ts-unused-exports
command: pnpm deadcode:report:ci:ts-unused
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: false

- name: Setup Node environment
uses: ./.github/actions/setup-node-env
with:
install-bun: "false"
use-sticky-disk: "true"

- name: Run ${{ matrix.tool }} dead-code scan
run: ${{ matrix.command }}

- name: Upload dead-code results
uses: actions/upload-artifact@v4
with:
name: dead-code-${{ matrix.tool }}-${{ github.run_id }}
path: .artifacts/deadcode

# Validate docs (format, lint, broken links) only when docs files changed.
check-docs:
needs: [docs-scope]
Expand All @@ -249,7 +235,7 @@ jobs:

skills-python:
needs: [docs-scope, changed-scope]
if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true')
if: needs.docs-scope.outputs.docs_only != 'true' && (github.event_name == 'push' || needs.changed-scope.outputs.run_node == 'true' || needs.changed-scope.outputs.run_skills_python == 'true')
runs-on: blacksmith-16vcpu-ubuntu-2404
steps:
- name: Checkout
Expand Down Expand Up @@ -289,20 +275,53 @@ jobs:
install-deps: "false"

- name: Setup Python
id: setup-python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: "pip"
cache-dependency-path: |
pyproject.toml
.pre-commit-config.yaml
.github/workflows/ci.yml
- name: Restore pre-commit cache
uses: actions/cache@v4
with:
path: ~/.cache/pre-commit
key: pre-commit-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('.pre-commit-config.yaml') }}

- name: Install pre-commit
run: |
python -m pip install --upgrade pip
python -m pip install pre-commit detect-secrets==1.5.0
python -m pip install pre-commit
- name: Detect secrets
run: |
if ! detect-secrets scan --baseline .secrets.baseline; then
echo "::error::Secret scanning failed. See docs/gateway/security.md#secret-scanning-detect-secrets"
exit 1
set -euo pipefail
if [ "${{ github.event_name }}" = "push" ]; then
echo "Running full detect-secrets scan on push."
pre-commit run --all-files detect-secrets
exit 0
fi
BASE="${{ github.event.pull_request.base.sha }}"
changed_files=()
if git rev-parse --verify "$BASE^{commit}" >/dev/null 2>&1; then
while IFS= read -r path; do
[ -n "$path" ] || continue
[ -f "$path" ] || continue
changed_files+=("$path")
done < <(git diff --name-only --diff-filter=ACMR "$BASE" HEAD)
fi
if [ "${#changed_files[@]}" -gt 0 ]; then
echo "Running detect-secrets on ${#changed_files[@]} changed file(s)."
pre-commit run detect-secrets --files "${changed_files[@]}"
else
echo "Falling back to full detect-secrets scan."
pre-commit run --all-files detect-secrets
fi
- name: Detect committed private keys
Expand Down Expand Up @@ -414,9 +433,11 @@ jobs:
cache-key-suffix: "node22"
# Sticky disk mount currently retries/fails on every shard and adds ~50s
# before install while still yielding zero pnpm store reuse.
# Try exact-key actions/cache restores instead to recover store reuse
# without the sticky-disk mount penalty.
use-sticky-disk: "false"
use-restore-keys: "false"
use-actions-cache: "false"
use-actions-cache: "true"

- name: Runtime versions
run: |
Expand All @@ -435,7 +456,9 @@ jobs:
which node
node -v
pnpm -v
pnpm install --frozen-lockfile --prefer-offline --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true || pnpm install --frozen-lockfile --prefer-offline --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true
# Persist Windows-native postinstall outputs in the pnpm store so restored
# caches can skip repeated rebuild/download work on later shards/runs.
pnpm install --frozen-lockfile --prefer-offline --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true --config.side-effects-cache=true || pnpm install --frozen-lockfile --prefer-offline --ignore-scripts=false --config.engine-strict=false --config.enable-pre-post-scripts=true --config.side-effects-cache=true
- name: Configure test shard (Windows)
if: matrix.task == 'test'
Expand Down
Loading