Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
277 commits
Select commit Hold shift + click to select a range
e3ff3c2
fix(control): adversarial review hardening
claude Oct 3, 2026
0877430
fix(desktop): adversarial review hardening
claude Oct 3, 2026
9cde66d
fix(missions): adversarial review hardening
claude Oct 3, 2026
62045a2
fix(platform): fit main's harness budgets
claude Oct 3, 2026
2519445
fix(sentinel): adversarial review hardening
claude Oct 3, 2026
98ea5b2
fix(workflows): adversarial review hardening
claude Oct 3, 2026
2329f46
Merge core module adversarial review
claude Oct 3, 2026
8b15d54
Merge telegram module adversarial review
claude Oct 3, 2026
1f04bfc
Merge sentinel module adversarial review
claude Oct 3, 2026
603fa7b
Merge missions module adversarial review
claude Oct 3, 2026
492304b
Merge control module adversarial review
claude Oct 3, 2026
c1ab31d
Merge desktop module adversarial review
claude Oct 3, 2026
34a5f71
Merge workflows module adversarial review
claude Oct 3, 2026
3333697
test: give spawned sub-agent children the stubbed preamble
claude Oct 3, 2026
ec93da7
fix: address code-scanning findings (races, error exposure, tag strip…
claude Oct 3, 2026
307c3e4
fix: more code-scanning findings (lock inspection by descriptor, dead…
claude Oct 3, 2026
65e17a0
fix(telegram): masked token shows only the public bot id
claude Oct 3, 2026
6a23956
fix(control): origin-check the login bounce target before redirecting
claude Oct 3, 2026
b99ec76
fix(control): guard the login redirect with an explicit local-target …
claude Oct 3, 2026
67b8fdc
salvage: adapt stranded control-hardening tests (fail on HEAD before …
claude Oct 3, 2026
7d3391f
salvage: control server survives a late server 'error' (EMFILE on acc…
claude Oct 3, 2026
2fc9d88
salvage: control center sends Cross-Origin-Resource-Policy: same-origin
claude Oct 3, 2026
09103a5
salvage: control center HTML sends Cross-Origin-Opener-Policy: same-o…
claude Oct 3, 2026
b347318
docs(telegram): maskToken comment matches its output
claude Oct 3, 2026
6769e28
salvage: control login cookie is Secure when reached over https (tunnel)
claude Oct 3, 2026
b56789d
fix(runtime): cross-module review follow-ups
claude Oct 3, 2026
e59b2c2
salvage: control center CSP allows only its own inline scripts (sha25…
claude Oct 3, 2026
6b9748c
salvage: control center takes QODEX_CONTROL_TOKEN out of process.env …
claude Oct 3, 2026
f7a8990
salvage: probe tests for the stranded telegram review (99767a4)
claude Oct 3, 2026
681242a
salvage: telegram isTooLong also matches a raw MESSAGE_TOO_LONG
claude Oct 3, 2026
445702d
salvage: telegram getUpdates accepts the positional (offset, timeout,…
claude Oct 3, 2026
d1763b4
salvage: telegram callback answers are capped without splitting a sur…
claude Oct 3, 2026
a74eed5
salvage: telegram escapeHtml replaces lone surrogates (Telegram rejec…
claude Oct 3, 2026
ec98db8
salvage: mask secrets in every bus event forwarded to control viewers
claude Oct 3, 2026
20723e4
salvage: telegram truncate never splits a surrogate pair
claude Oct 3, 2026
f95f1cd
salvage: telegram approval keyboard never emits an empty row
claude Oct 3, 2026
3f7f572
salvage: telegram mission status stays under 4096 chars in the worst …
claude Oct 3, 2026
b07946f
salvage: LAN rebind keeps the public tunnel link and the approval cha…
claude Oct 3, 2026
1100b51
salvage: telegram Sentinel notice also reads a decision nested under …
claude Oct 3, 2026
4dac442
salvage: /telegram stop during start-up stops the bot that was still …
claude Oct 3, 2026
d72a3cb
salvage: telegram setup reads a piped token at the first newline (no …
claude Oct 3, 2026
26aae6b
salvage: qodex telegram pair refuses to mint a code without a terminal
claude Oct 3, 2026
f587400
salvage: restart a live-view screencast that never delivered a frame
claude Oct 3, 2026
4350424
salvage: qodex telegram start prints no pairing code without a terminal
claude Oct 3, 2026
698bb34
salvage: telegram polling survives a malformed getUpdates result (bac…
claude Oct 3, 2026
8610d65
fix: recorder keeps a human Back when the agent's Enter echo is misse…
claude Oct 3, 2026
489f6ce
salvage: an in-flight telegram tick cannot re-register the approval c…
claude Oct 3, 2026
0d28125
salvage: telegram bot removes its abort listener from the caller's si…
claude Oct 3, 2026
489e814
fix(sentinel): cross-module review follow-ups
claude Oct 3, 2026
eb46a6e
salvage: dashboard keys β€” Persian-layout shortcuts by physical key, O…
claude Oct 3, 2026
e1c4937
salvage: telegram stop() during start-up waits until the bot is fully…
claude Oct 3, 2026
57b60eb
salvage: telegram callback aliases are derived from the approval id
claude Oct 3, 2026
8064997
salvage: telegram text replies tolerate Arabic letter forms and trail…
claude Oct 3, 2026
fe23089
salvage: a telegram mission approval without options gets yes/no buttons
claude Oct 3, 2026
fac1a36
salvage: already-paired telegram chats are alerted when a new chat pairs
claude Oct 3, 2026
a4fed74
salvage: dashboard input queue coalesces moves so a slow link never b…
claude Oct 3, 2026
8059070
salvage: dashboard flushes long typing bursts in 2000-char chunks
claude Oct 3, 2026
922fd0d
salvage: dashboard drops mission approval cards when missions.approva…
claude Oct 3, 2026
d0235e7
salvage: telegram retries a card that failed for one of several chats…
claude Oct 3, 2026
9fd7b55
salvage: telegram plain-text fallback is well-formed UTF-16 too
claude Oct 3, 2026
51d54bd
salvage: a telegram tick interrupted by stop() polls no missions afte…
claude Oct 3, 2026
44b88b7
Merge followup-sentinel cross-module follow-ups
claude Oct 3, 2026
4095643
Merge followup-runtime cross-module follow-ups
claude Oct 3, 2026
b4f574e
salvage: drop the COOP header again (breaks agent-browser eviction)
claude Oct 3, 2026
cc563d5
fix(telegram): register the approval channel before confirming a pairing
claude Oct 3, 2026
d1ce29f
Merge salvage-telegram: recover work from a review agent that died at…
claude Oct 3, 2026
2e2e9a9
Merge salvage-control: recover work from a review agent that died at …
claude Oct 3, 2026
6b5b56c
fix(sentinel): vbscript: is a high-risk scheme; script-scheme check n…
claude Oct 3, 2026
5779ef8
salvage(desktop): x11 screenshots fall back to the next tool that works
claude Oct 3, 2026
af633b9
fix(channels): one bus event per mission status transition
claude Oct 3, 2026
bea5ac2
fix(channels): pin Telegram's register-before-"Paired" ordering with …
claude Oct 3, 2026
8db3592
fix(channels): Telegram mission adapter never forwards the control token
claude Oct 3, 2026
d507e73
fix(channels): /control holds one mission-control reference, released…
claude Oct 3, 2026
dac5ff6
salvage(desktop): wayland screenshots fall back to the next tool that…
claude Oct 3, 2026
0994881
salvage(desktop): read the Wayland clipboard as text, not image bytes
claude Oct 3, 2026
ec686d9
salvage(desktop): note that ydotool types through the active keyboard…
claude Oct 3, 2026
d169a9b
fix(channels): workflow CLI and MCP server engines read tools' own re…
claude Oct 3, 2026
2e8731c
salvage(desktop): windows paste restores the old clipboard in a finally
claude Oct 3, 2026
8a06e11
fix(channels): `workflow record --browser-profile` (the root owns --p…
claude Oct 3, 2026
b6dc971
fix(channels): document that describeSelector describes the first match
claude Oct 3, 2026
f47fc91
fix(channels): resultHash uses sha256 instead of md5
claude Oct 3, 2026
d87a146
salvage(desktop): Sentinel treats more code-running open targets as c…
claude Oct 3, 2026
ee06f32
fix(channels): root flags written after a subcommand go back to that …
claude Oct 3, 2026
8fab381
test(channels): eval-core spawns tsx resolved like an import
claude Oct 3, 2026
8e155f9
Merge channels-finish
claude Oct 3, 2026
edeb0ca
Merge salvage-desktop2
claude Oct 3, 2026
3e9efb5
fix(browser): `browser open` treats a closed stdin like Ctrl+D
claude Oct 3, 2026
41a228b
feat(approval): rename modes to manual / edits / auto; autonomy polic…
claude Oct 3, 2026
b389590
feat(config): approval.defaultMode / approval.extraRoots (user config…
claude Oct 3, 2026
233a5cf
feat(auto-guard): Sentinel auto-mode policy β€” silent non-critical, re…
claude Oct 3, 2026
4c31f20
feat(auto-guard): MCP tools ask one question per call; auto mode foll…
claude Oct 3, 2026
5955cd3
feat(auto-guard): missions inherit auto mode and run its policy, neve…
claude Oct 3, 2026
0f6e44a
feat(auto-guard): bot /auto is a per-chat auto mode and never auto-an…
claude Oct 3, 2026
c7086d1
feat(auto-guard): control center approval cards say why auto mode sti…
claude Oct 3, 2026
d801949
feat(auto-core): shell parser + auto-mode policy (autonomousDecision)
claude Oct 3, 2026
7a841f8
feat(goals): standing goals proven by evidence (core)
claude Oct 3, 2026
af0eef6
feat(control): emergency stop (core)
claude Oct 3, 2026
182dfe8
feat(auto-core): wire auto policy into PermissionEngine; per-segment …
claude Oct 3, 2026
3de9e68
feat(schedule): continuity + notify-on-change for monitor routines
claude Oct 3, 2026
bde7bb3
feat(skills): /learn turns the task you just finished into a skill (c…
claude Oct 3, 2026
9a77c98
feat(security): classify agent instruction files (core)
claude Oct 3, 2026
3767b08
feat(auto-core): prompts say why; auto-policy asks go to a real human…
claude Oct 3, 2026
cac679b
feat(auto-core): headless --yes is auto mode; needs-human prompts are…
claude Oct 3, 2026
195c2f4
feat(auto-core): approval.* honored only from the user config
claude Oct 3, 2026
c6da960
feat(auto-core): harden the shell policy (sentinel ops on shell, run-…
claude Oct 3, 2026
861bd65
feat(auto-core): see substitutions inside ${x:-…} and $(( … )), brace…
claude Oct 3, 2026
bcc64d9
feat(auto-ux): questions decide themselves in auto mode; autonomous p…
claude Oct 3, 2026
78e2c79
feat(auto-ux): TUI β€” Shift+Tab re-checks a pending prompt against the…
claude Oct 3, 2026
827cfef
feat(auto-ux): --auto / --approval-mode flags, -y = auto, approval.de…
claude Oct 3, 2026
f427bb3
feat(auto-ux): /mode alias for /auto, /status shows the approval mode
claude Oct 3, 2026
ce26131
docs(auto-ux): approval modes β€” what auto asks and what it doesn't, h…
claude Oct 3, 2026
41c6686
test(auto-ux): autonomous prompt section only in auto, within eval bu…
claude Oct 3, 2026
f8a739a
feat(auto-ux): auto mode answers a 'Should I proceed?' final answer o…
claude Oct 3, 2026
a90fc0c
fix(auto-ux): a multi-file edit prompt never carries one file's path …
claude Oct 3, 2026
80d58a2
feat(auto-ux): register ask_user in the CLI bootstrap (no-op once the…
claude Oct 3, 2026
29552b4
build: add mail libraries (imapflow, nodemailer, mailparser) as optio…
claude Oct 3, 2026
4d524f8
Merge auto-core: real auto mode
claude Oct 3, 2026
8ca29a3
Merge auto-guard: real auto mode
claude Oct 3, 2026
48374bf
Merge auto-ux: real auto mode
claude Oct 3, 2026
6388360
feat(auto): integrate the three auto-mode branches
claude Oct 3, 2026
ef5a3d3
feat: wire /goal, /stop and /learn into the TUI and slash commands
claude Oct 3, 2026
ff5b3bc
feat(mail-core): accounts store, provider presets, vault-key encrypti…
claude Oct 3, 2026
0131ca4
feat(schedule): qodex schedule add --continuity --notify-on-change; l…
claude Oct 3, 2026
3a6bd87
feat(security): writes to agent instruction files ask in every mode
claude Oct 3, 2026
7c927e3
feat(control): emergency stop from Telegram (/stop, /stop all) and th…
claude Oct 3, 2026
70bca8a
feat(mail-auto): standing grant store + mail-reply scope check
claude Oct 3, 2026
af3abea
docs: /goal, /stop, /learn, schedule monitors, protected instruction …
claude Oct 3, 2026
e74de25
feat(mail-core): transport contract, in-memory fake, signed drafts st…
claude Oct 3, 2026
79ebd43
feat(mail-core): IMAP/SMTP transport (imapflow, nodemailer, mailparse…
claude Oct 3, 2026
3fe9ecc
fix(auto): code_run gets the outside-project check; chat /auto keeps …
claude Oct 3, 2026
872883e
feat(mail-core): mail tools (list/read/draft/send/mark/move/download)…
claude Oct 3, 2026
43aa5a6
feat(mods): contract for QodeX mods (events, hook chain, $ API, rende…
claude Oct 3, 2026
45aaa3c
feat(mail-auto): Sentinel classifies mail_send and honors standing re…
claude Oct 3, 2026
8558212
feat(mail-auto): mail rules (standing tasks) and the new-mail watcher
claude Oct 3, 2026
395bb2b
feat(mail-core): qodex mail add|list|remove|test|default|presets (hid…
claude Oct 3, 2026
428a5b0
feat(mail-core): watch support on the transport (folder status, IMAP …
claude Oct 3, 2026
62050b3
feat(mail-core): idle IMAP logout and provider setup docs (app passwo…
claude Oct 3, 2026
9e62b8f
feat(mail-auto): wire /allow, /mail, qodex grant, qodex mail watch|ru…
claude Oct 3, 2026
55bf27a
fix(mail-core): take Sentinel's send mark up front; allow attaching b…
claude Oct 3, 2026
39c8c97
fix(mail-core): scrub only quoted IMAP LOGIN arguments in error text
claude Oct 3, 2026
2a7dd2c
test(mail-auto): watcher with a fake transport (notify once, dedupe, …
claude Oct 3, 2026
7cebd21
test(mail-auto): rule conditions, run goal fencing, rule store, /mail…
claude Oct 3, 2026
89d16c9
test(mail-auto): Telegram /allow + revoke, /mail rule + reply-all, es…
claude Oct 3, 2026
4d0cd80
test(mail-auto): no tool can create or widen a grant (registry + impo…
claude Oct 3, 2026
9ae9893
feat(mail-auto): qodex telegram start / qodex control start the mail …
claude Oct 3, 2026
8aedd24
wip(cc-modsui): salvage the renderer, validator, controller and host …
claude Oct 3, 2026
b516b47
Merge mail-core: mail accounts, IMAP/SMTP transport, mail tools and CLI
claude Oct 3, 2026
07dafac
Merge commit 'b516b47' into wip/mail-auto2
claude Oct 3, 2026
33a49c5
Merge commit 'b516b47' into wip/cc2-modsui
claude Oct 3, 2026
8944936
fix(mail): decode HTML entities in one pass; check and read attachmen…
claude Oct 3, 2026
ecd8363
feat(cc-modsui): review the salvaged renderer β€” strip control chars, …
claude Oct 3, 2026
fd3c549
feat(mail-auto): Sentinel judges mail_send on the mail core's draft d…
claude Oct 3, 2026
bc40814
feat(cc-modsui): mount the mods UI in the TUI β€” band above the prompt…
claude Oct 3, 2026
6595e46
feat(mail-auto): mail tool-relevance family (mail tools only for mail…
claude Oct 3, 2026
514fde4
fix(workflows): an agent action's echo is an event before its record,…
claude Oct 3, 2026
d42abbb
feat(mail-auto): the watcher reads mail through the mail core's trans…
claude Oct 3, 2026
5227951
feat(browser): challenge detection β€” pure classifier, read-only probe…
claude Oct 3, 2026
7e13bcd
feat(cc-modsui): built-in mods context-bar, you-should-know, sample-h…
claude Oct 3, 2026
f0d5d1a
feat(cc-modsui): accept the runtime bus names (pane.open/close, error…
claude Oct 3, 2026
3815eda
test(mail-auto): end to end over the real mail core and a local SMTP …
claude Oct 3, 2026
d938728
feat(mail-auto): /allow and /mail in the slash catalog
claude Oct 3, 2026
bf903de
feat(browser): per-tab challenge state, document header capture, chal…
claude Oct 3, 2026
b3dbbca
feat(cc-mods): engine, loader, $ API, ui bus, runtime core
claude Oct 3, 2026
61e81b7
fix(mail-auto): a standing grant also marks sends under sentinel.auto…
claude Oct 3, 2026
6c93097
fix(mail-auto): scrub the account's own secrets from watched mail
claude Oct 3, 2026
cff08f6
feat(cc-modsui): /mod new <description> runs the bundled mod-writing …
claude Oct 3, 2026
07ada63
feat(browser): wait out self-clearing bot checks; report [CHALLENGE] …
claude Oct 3, 2026
215e7fe
docs(cc-modsui): docs/MODS.md β€” layout, events, $ API, render sites, …
claude Oct 3, 2026
dee8105
feat(browser): [CHALLENGE_HUMAN_ONLY] guard; the recorder never recor…
claude Oct 3, 2026
a2c85f5
feat(cc-mods): loop/headless integration points, test kit
claude Oct 3, 2026
60dffef
feat(handoff): hand-off meta/link store; relay human press-and-hold; …
claude Oct 3, 2026
abb98d2
feat(browser): browser_request_human β€” hand the browser to the human,…
claude Oct 3, 2026
ee000ed
feat(cc-mods): qodex mod CLI, /mods, /reload-mods, /mod new, --mod-di…
claude Oct 3, 2026
55bf22f
feat(browser): fewer challenges legitimately β€” headed by default in t…
claude Oct 3, 2026
92e8125
test(cc-mods): integration through a real AgentLoop (tool.call/check/…
claude Oct 3, 2026
9bebbee
feat(cc-runtime): project instructions first|all (GEMINI.md, /instruc…
claude Oct 3, 2026
2cc2086
feat(browser): maskExtra β€” vault-filled values stay hidden even when …
claude Oct 3, 2026
8656572
test(cc-mods): loader (layouts, TS, trust, state, hot reload) and $ A…
claude Oct 3, 2026
4f31028
feat(cc-runtime): unattended timeout for auto-mode asks in the TUI ([…
claude Oct 3, 2026
d2e45cd
test(cc-mods): test kit, qodex mod test/validate/new, instruction-fil…
claude Oct 3, 2026
36105e6
feat(prompts): CAPTCHA recipe + built-in sign-up / manage-site skills
claude Oct 3, 2026
883473c
feat(cc-mods): session.end on a dropped headless prompt, modsSessionR…
claude Oct 3, 2026
bf86e6c
feat(control): scoped short-TTL hand-off links and dashboard hand-off…
claude Oct 3, 2026
5ca98c4
fix(cc-mods): keep the strip-types warning off the TUI; reserved-name…
claude Oct 3, 2026
d8a4c81
fix(browser): hand-off fails fast when no human is reachable; re-take…
claude Oct 3, 2026
ad1ea43
feat(cc-mods): public mods barrel and subscribe/emit bus aliases for …
claude Oct 3, 2026
ad8d5b2
feat(cc-runtime): wrap-up allowance at a budget cap (+ --strict-budget)
claude Oct 3, 2026
7770caf
fix(browser): no close-up screenshots of a challenge; cover report mode
claude Oct 3, 2026
01f535b
test(handoff): scoped link routes, expiry, hashing, no-leak; gestures…
claude Oct 3, 2026
a24cb1f
fix(workflows): warn about skipped challenge steps only when a step w…
claude Oct 3, 2026
bc9e2b3
feat(telegram): hand-off card with clipped screenshot, one-tap link b…
claude Oct 3, 2026
3f2eaec
test(telegram): hand-off card, URL-button fallbacks, retraction, no t…
claude Oct 3, 2026
cf05ead
feat(tui): hand-off prompt hint with the local control-center URL
claude Oct 3, 2026
9b0ed78
test(browser): real press-and-hold relay, lost-up release, clipped sc…
claude Oct 3, 2026
6c73bde
feat(cc-models): Opus 5.5 / Sonnet 5.5 / Fable 5.1 models and opus|so…
claude Oct 3, 2026
a4325f0
feat(cc-runtime): send now (Ctrl+Enter / Ctrl+X Ctrl+S) keeps a runni…
claude Oct 3, 2026
59e916b
feat(control): export hand-off API; focus the live view on a relayed …
claude Oct 3, 2026
398e7ad
feat(handoff): plain step hand-offs ask for Done; more vendor labels
claude Oct 3, 2026
fddf911
feat(vault-core): keystore with OS backends and one shared getVaultKey
claude Oct 3, 2026
3f4678e
feat(cc-models): /checkup prompt-audit (also /doctor prompt-audit, qo…
claude Oct 3, 2026
ab4d34d
feat(cc-models): built-in build-eval and hillclimb skills
claude Oct 3, 2026
a69f724
fix(cc-modsui): tree validation refuses Object.prototype names and du…
claude Oct 3, 2026
63ad5f6
fix(cc-modsui): band focus names a button by its mod and key
claude Oct 3, 2026
bbec2cc
fix(cc-modsui): /mod new never runs a project or plugin modsmith play…
claude Oct 3, 2026
bf13461
feat(vault-core): merge-patch update, rotation history, findByOrigin,…
claude Oct 3, 2026
feea4dd
fix(cc-modsui): context-bar redraws when session.start restores it as…
claude Oct 3, 2026
08d8f80
test(vault-core): merge-patch update, rotation undo, findByOrigin, ad…
claude Oct 3, 2026
1738604
fix(cc-modsui): you-should-know fences the transcript it sends to the…
claude Oct 3, 2026
55f0c88
feat(vault): SecretRequestBroker and sealed secret transport
claude Oct 3, 2026
733991f
fix(cc-modsui): a burst of mod UI events repaints the TUI once, not o…
claude Oct 3, 2026
2a9859e
fix(cc-modsui): cap ui.render refusal lines per mod and site
claude Oct 3, 2026
7723dcf
fix(cc-modsui): the X of Ctrl+X X is never a button hotkey
claude Oct 3, 2026
1958819
feat(vault): vault_request_login β€” the human types a login into QodeX…
claude Oct 3, 2026
bab976a
feat(vault-core): qodex vault edit / rotate / import / key status|mig…
claude Oct 3, 2026
ece42c2
fix(cc-mods): project-mod trust hash covers symlink targets, node_mod…
claude Oct 3, 2026
ae7a722
fix(cc-modsui): one slow ui.render site no longer freezes every mod's…
claude Oct 3, 2026
08dac67
fix(cc-mods): clamp a tool.check override against the rules' live answer
claude Oct 3, 2026
4ee2517
feat(tui): masked login prompt for vault_request_login
claude Oct 3, 2026
8f78b9e
fix(cc-modsui): you-should-know sees multi_file_edit files and a diff…
claude Oct 3, 2026
ffda75f
fix(cc-mods): --mod-dir / QODEX_MOD_DIRS dirs are agent instruction d…
claude Oct 3, 2026
0812a12
feat(vault-core): Sentinel protections for exports, keystore files, k…
claude Oct 3, 2026
199ba48
fix(cc-mods): $.settings.read redacts secret env names, URL credentia…
claude Oct 3, 2026
60544ca
wip(vault-entry): control-center secret/vault routes, partial (agent …
claude Oct 3, 2026
a7ee3d3
Merge mail automation: standing reply grants, new-mail watcher, rules…
claude Oct 3, 2026
ea4ab74
Merge smart CAPTCHA hand-off (browser side): detection, self-clearing…
claude Oct 3, 2026
fac26ce
Merge smart CAPTCHA hand-off (surfaces): scoped short-TTL link, phone…
claude Oct 3, 2026
feee7ab
test(vault-core): vault_generate_and_fill + browser_login on real Chr…
claude Oct 3, 2026
69bc840
feat(control): secure login form + vault panel in the control center
claude Oct 3, 2026
3141fd4
fix(sentinel): judge vault_generate_and_fill on the open page and its…
claude Oct 3, 2026
1f52965
Merge Claude Code parity (runtime): wrap-up allowance, send now keeps…
claude Oct 3, 2026
588904b
Merge Claude Code parity (models + checkup): Opus/Sonnet 5.5, Fable 5…
claude Oct 3, 2026
de42d76
feat(vault-core): completion gate and recorder know browser_login / v…
claude Oct 3, 2026
382c315
fix(telegram): /unpair drops the approval channel before it confirms
claude Oct 3, 2026
434c15e
feat(vault-core): vault/login tool family, prompts point at browser_l…
claude Oct 3, 2026
186e9d7
feat(vault): offer to save a login the human types during takeover
claude Oct 3, 2026
0ad2249
test(vault): give the terminal secret-prompt tests room under a loade…
claude Oct 3, 2026
fc3753b
fix(mail): mail that arrives between the watcher's check and its IDLE…
claude Oct 3, 2026
661276a
Merge Claude Code parity (mods runtime): engine, loader, $ API, trust…
claude Oct 3, 2026
304a5f8
Merge Claude Code parity (mods UI): band/panes/status/toasts in the T…
claude Oct 3, 2026
44c7e0d
Merge password manager core: OS keychain key store, merge-patch rotat…
claude Oct 3, 2026
1d08ab0
Merge password manager entry: vault_request_login with a masked TUI p…
claude Oct 3, 2026
b748f80
fix(control): a hand-off page never starts the secret / vault panel; …
claude Oct 3, 2026
86a09b0
fix(browser): challenge detection awaits the page title instead of st…
claude Oct 3, 2026
68c8e04
fix(mail): stop() never waits out an IDLE wait that started on an alr…
claude Oct 3, 2026
a243629
docs: mail, password vault + CAPTCHA hand-off, mods and Claude Code p…
claude Oct 3, 2026
a300f30
docs: README, CHANGELOG, mail-auto guide and Persian summary for mail…
claude Oct 3, 2026
a40c3ce
feat(browser): lean mode skips images, fonts and media while nobody n…
claude Oct 3, 2026
25a872d
fix: secure login prompt type-ahead + CI rendering; CodeQL findings (…
claude Oct 3, 2026
f4c8a90
test(vault): wait for the vault row, then assert its text (no host su…
claude Oct 3, 2026
97036b9
feat(browser): Web Bot Auth β€” sign the agent's requests as an honest …
claude Oct 3, 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
  •  
  •  
  •  
183 changes: 183 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,188 @@
# Changelog

## Unreleased β€” mail, a real password vault, CAPTCHA hand-off, Claude Code parity

1. **Mail.** `qodex mail add` connects any IMAP/SMTP mailbox (presets for Gmail, Outlook, Yahoo,
iCloud, Yandex, Zoho, Fastmail, AOL, GMX, Proton Bridge; app passwords explained). Tools
`mail_list`, `mail_read` (fenced as untrusted data), `mail_draft`, `mail_send` (always asks),
`mail_mark`, `mail_move`, `mail_download_attachment`. **Standing reply grants** that only you
can create (`/allow mail-replies`, Telegram `/allow`, or "always allow replies like this") let
same-thread replies to the original sender go out without a prompt β€” audited, capped per day,
revocable. **Watcher** (IMAP IDLE): new mail is announced; **rules** start a task on matching
mail with the email as data. Guide: [docs/MAIL.md](docs/MAIL.md).
2. **Password vault (Muse-style).** The vault key can live in the macOS Keychain / Secret Service /
Windows DPAPI (`qodex vault key migrate`); `qodex vault edit|rotate|import` (Chrome, Firefox,
Bitwarden, 1Password exports); `browser_login` signs in in one step (username-first forms, 2FA);
`vault_generate_and_fill` makes and saves a strong password on sign-up; `vault_request_login`
has *you* type a login into a masked prompt or the control center's secure form (sealed over
tunnels) β€” the agent never sees it; logins you type during a takeover are offered for saving;
a vault panel in the control center. Guide: [docs/VAULT_AND_CAPTCHA.md](docs/VAULT_AND_CAPTCHA.md).
3. **CAPTCHAs: a smart hand-off, never solving.** Bot checks are detected; self-clearing ones are
waited out; the rest are handed to you (Telegram card with a cropped screenshot and a one-tap,
short-lived live-view link; phone hand-off mode that relays your own press-and-hold / drag;
TUI hint) and QodeX continues by itself when the check is gone. The agent can never click,
type into, drag or analyze a challenge (`[CHALLENGE_HUMAN_ONLY]`). **`browser.stealth` is now
off by default** β€” no fingerprint spoofing. Visible browser in the TUI by default
(`browser.headless: auto`), per-site pacing.
4. **Claude Code parity.** **Mods** β€” JS/TS modules that hook QodeX itself (tool calls, prompts,
permission checks within the safety rules, commands, tools, UI above/under the prompt, timers),
compatible with Claude Code mods; `/mod new` has QodeX write one; built-ins `context-bar`
(`/context-bar`) and `you-should-know` ([docs/MODS.md](docs/MODS.md)). **Wrap-up allowance**
when a budget runs out mid-task (`--strict-budget` to disable). **Send now** (Ctrl+Enter /
Ctrl+X Ctrl+S) keeps a running shell command as a background job. **Auto-mode asks time out**
after `approval.unattendedTimeoutSec` (default 120 s) with a rewrite hint β€” never the critical
ones. **Project instructions** `first|all` (`/instructions`, GEMINI.md). **Models:**
`claude-opus-5-5` (new default), `claude-sonnet-5-5`, `claude-fable-5-1`; `/model opus|sonnet|
haiku|fable`. **`/checkup prompt-audit`** writes `PROMPT_AUDIT.md` + `prompt-audit.patch`
(nothing applied). Built-in skills **build-eval** and **hillclimb**.
5. **Lean browser mode** (`browser.lean`, default `auto` = headless only): images, fonts and
audio/video are skipped while nobody needs the pixels; DOM, scripts, forms, cookies and the
HTTP cache are untouched (per-tab CDP interception of those resource types only, not
`context.route`, which turns the cache off). Never on your own Chrome or localhost / LAN
pages; off for the rest of the session on a screenshot, takeover, live view or bot check.
12-photo page: ~0 MB vs 5 MB downloaded, ~270 ms vs ~720 ms, ~100–180 MB less memory.
6. **Web Bot Auth β€” an honest agent identity** (`browser.botAuth`, off by default). QodeX
can sign its own requests with an Ed25519 key (HTTP Message Signatures / RFC 9421, tag
`web-bot-auth`) so a site recognises the agent and may let it through β€” the opposite of
detection evasion. `qodex browser bot-auth --init|--directory`; the private key lives in
`~/.qodex/browser/bot-auth/` (0600) and Sentinel keeps the agent out of it. Signs only
same-site document/xhr/fetch on public hosts; never loopback/LAN or the user's own
Chrome. No fingerprint spoofing, no hiding `navigator.webdriver`, no synthetic input.
7. **Fixes found while merging:** workflow recording dropped a human's Back on fast machines
(echo matching); the mail watcher missed mail that arrived between a check and the IDLE wait,
and `stop()` could wait out the IDLE timeout; Telegram `/unpair` confirmed before dropping the
approval channel; challenge detection stringified the page-title promise; the terminal's
secure login prompt could put keys typed right after Enter into the previous field (a false
"passwords do not match"), and now also takes a pasted password ending in Enter; the Wayland
backend measured the screen through a predictable file in the shared temp dir; `/mod new`
had a second, unreachable implementation.

## Unreleased β€” standing goals, emergency stop, /learn, monitors

1. **`/goal` β€” keep working until it is proven done.** `/goal <what done looks like>
[--check "<cmd>"] [--max N]` starts the task and, after each run, checks the goal: the check
command must exit 0, or (without one) the answer must cite evidence on a `GOAL_MET:` line.
Not met β†’ another round with the check's output, up to `--max` (default 8, cap 50), then it
stops and says what is missing. `/goal` shows it, `/goal clear` drops it.
2. **Emergency stop.** `/stop` halts the running task, side runs, background jobs and dev
servers and clears the goal β€” mid-task too; `/stop all` also cancels every active mission.
Also in the control center (⏹ Stop) and Telegram (`/stop`, `/stop all`).
3. **`/learn [name]`.** Turns the task you just finished into an active skill with the
deterministic distiller (no model call); never overwrites a skill you wrote.
4. **Monitors.** `qodex schedule add --continuity` gives each run the previous answer so it
reports what changed; `--notify-on-change` skips the notification / delivery when nothing did.
`qodex schedule list` shows both.
5. **Protected instruction files.** Writes to `AGENTS.md`, `QODEX.md`, `CLAUDE.md`, `GEMINI.md`,
`AI.md`, `.cursorrules`, `.windsurfrules`, `.github/copilot-instructions.md`, the project's
`.qodex/` and `.cursor/rules/`, and `~/.qodex/skills|rules|hooks|memory` ask in every mode,
auto included β€” by edit tool or any shell command that writes, moves, deletes or chmods them.
No allow rule, tool-wide allow or "always yes" covers them.

## Unreleased β€” a real auto mode

**Auto mode now means "work without asking me" β€” except for money, passwords, messages and
damage outside the project.** The approval modes are `manual` (default), `edits` (the old
"auto": file edits run, shell asks) and `auto` (replaces "always yes"). Shift+Tab cycles them.

1. **What auto mode asks.** Purchases, payments, passwords / credentials, sending messages and
QodeX's own safety settings (Sentinel-critical β€” a human answers in every mode), and
destructive actions outside the project: deleting or overwriting paths outside the workspace
roots, force-push and remote branch deletes, deleting remote data (cloud, Kubernetes,
`terraform destroy`, databases on other hosts, package unpublish), publishing (`npm publish`,
`docker push`, production deploys), system-level commands (`sudo`, `shutdown`, disks), and on
the web deleting data or changing an account on a non-local site. With nobody at the
terminal these go to the control center / Telegram / the mission queue, or are refused β€”
never auto-answered.
2. **What it doesn't.** Everything inside the project: edits, shell, installs, commits, rebases,
ordinary pushes, deleting project files, browser and desktop work Sentinel rates
non-critical. The agent's own questions are not asked either: the new `ask_user` tool and
plan approval (`present_plan`) answer "decide yourself" in auto mode, so the model picks a
sensible default, keeps going and lists its assumptions at the end; a plan presented in plan
mode is approved and carried out in the same turn. The system prompt gets a short
"Autonomous mode" section, and when the mode changes mid-task the running agent is told.
Sub-agents, side runs and missions started from an auto session follow the same policy.
3. **Turning it on.** Shift+Tab; `/auto on` (`/auto manual|edits|auto`, alias `/mode`);
`qodex --auto` or `qodex --approval-mode <manual|edits|auto>` for the TUI and `-p` runs
(`-y`/`--yes` on a `-p` run now means auto mode); `qodex mission start … --auto`; or
`approval.defaultMode: auto` in `~/.qodex/config.yaml` β€” only the user config counts, a
project's `.qodex/config.yaml` cannot switch you into auto. `approval.extraRoots` lists more
folders auto mode treats as the project (cwd and the temp dir always count).
4. **TUI.** The status bar shows the mode as a badge (`manual` · `✎ accept edits` ·
`⏡⏡ auto`); `/status` prints it. The first time auto is on, a one-line banner says what
still asks. Switching into auto with a prompt on screen answers it only when it is an
ordinary permission the auto policy allows β€” never a Sentinel prompt, never one the policy
still asks about, never with a standing "always". A Sentinel "always" answer keeps its
category-on-this-site scope instead of switching the whole session.
5. **Still in force.** `security.denyRules`, the hard-deny patterns and every budget
(`--budget-usd`, per-task caps) apply in auto mode exactly as before.

## v3.0.0 β€” 2026-10-03

**QodeX gets its own computer: a dedicated browser, desktop control on every OS, background
missions, and a Sentinel that never lets it buy, pay, send or type a password without you.**

QodeX is now a general autonomous agent in the spirit of Meta Muse and xAI Grok Bot β€” but it
runs on your machine, with your model, and also controls your desktop. Guide:
[docs/AGENT_PLATFORM.md](docs/AGENT_PLATFORM.md).

1. **Dedicated QodeX Browser.** Persistent Chromium profiles (logins survive restarts), multi-tab
with popup tracking, accessibility snapshots with element refs, actions by ref that return a
fresh compact snapshot, set-of-marks screenshots, markdown/table extraction, downloads,
uploads, dialogs, PDF, network log, CDP attach to your own Chrome, stealth, and
`browser_agent` (an autonomous browser sub-agent). 28 `browser_*` tools; `qodex browser
open|status|profiles|reset-profile|close`. Chromium is discovered automatically even when
the installed Playwright expects another revision. `browser_evaluate` now returns values
(it always returned `undefined`).
2. **Desktop control on macOS, Linux (X11 + Wayland) and Windows.** Screenshot (HiDPI-aware,
downscaled with coordinate mapping), click/drag/move/scroll, Unicode typing (Persian via
paste), key combos, clipboard, open apps/files/URLs, list/focus windows,
`computer_use_locate` (vision grounding) and `computer_use_agent`. 15 `computer_use_*` tools.
3. **Missions.** `qodex mission start "<goal>"` / `mission_start` plans the goal into steps, runs
each on a fresh agent in a detached, resumable worker (keeps going after you close QodeX),
reports milestones, retries failures, writes a final report, and starts its own private
live view. `attach`, `status`, `approve|deny`, `steer`, `cancel`, `resume`; routines via
`qodex schedule add --mission`. Approvals work across processes.
4. **Sentinel.** One guard at the tool-execution choke point (main agent, sub-agents, missions,
MCP server). Purchases, payments, sending and credentials always need an explicit human
answer β€” `/auto on` and `--yes` cannot approve them; with nobody reachable they are refused.
English + Persian action classification, payment-gateway and secret detection (Luhn, Sheba,
IBAN, API keys), domain allow/block lists, protected QodeX files, JSONL audit log. Web and
window text is fenced as untrusted data and scanned for prompt injection (EN + FA, hidden
Unicode).
5. **Credential vault.** `qodex vault add` β€” AES-256-GCM, separate 0600 key, TOTP (RFC 6238).
`browser_fill_secret` fills only on the entry's own https origin, re-checks right before
typing, and never returns the value to the model.
6. **Control center.** `qodex control [--lan|--tunnel]` or `/control`: a token-protected web page
with the live browser view, human takeover, one-tap approvals, an activity timeline,
steering and missions (English + Persian).
7. **Workflows.** Record the agent's or your own demonstration (`qodex workflow record`,
`workflow_record`), replay with self-healing selectors, Sentinel checks and vault secrets at
zero model tokens per step; each workflow is also saved as a skill.
8. **Telegram channel.** `qodex telegram setup|pair|start`: approve actions with inline buttons,
start and follow missions, get screenshots and notifications β€” paired private chats only.
9. **Approvals everywhere.** A new ApprovalBroker routes every human decision to the terminal,
the control center and Telegram; the first answer wins. Terminal prompts are queued (no more
concurrent prompts clobbering each other) and Esc cancels a stuck one.
10. **Agent core.** Sub-agents work again (they failed on a database foreign key), run on fresh
agent instances, honor their iteration cap and inherit approvals; new `browser` and
`computer` operator roles; per-tool timeouts; loop guards that understand changing page
state; the completion gate accepts real-world actions as evidence; `web` and `desktop` task
profiles; tool relevance understands URLs and Persian site commands; headless no longer
auto-accepts edits without `--yes`.
11. **CLI.** Options after a subcommand now belong to it (`qodex schedule tick --json` and every
new `--json` flag silently printed text before).

```
src/tools/browser/* (dedicated browser: manager, launcher, snapshot, 28 tools, CLI)
src/tools/computer/* (desktop backends: macOS, X11, Wayland, Windows; 15 tools)
src/missions/* (store, planner, runner, daemon, tools, CLI, Telegram adapter)
src/sentinel/*, src/vault/* (guard, policy, injection fencing, audit; encrypted vault, TOTP)
src/control/* (event bus, approval broker, control center server + dashboard)
src/workflows/* (recorder, replay, store, skill generation, tools, CLI)
src/channels/telegram/* (bot, Bot API client, pairing, formatting, CLI)
src/config/agent-config.ts, src/config/paths.ts (new optional config sections + paths)
```

## v2.7.0 β€” 2026-08-14

**Raw telemetry from 2.6 becomes something you can act on β€” without a slower CLI start.**
Expand Down
Loading
Loading