8.9 KiB
8.9 KiB
Changelog
[1.46.1] - 2026-10-27
- WhatsApp learns contact names from incoming messages (push names)
[1.46.0] - 2026-10-27
- WhatsApp key-share hardening, contact sync wait and VCF import fallback
[1.45.0] - 2026-10-27
- WhatsApp link fix, image send, contact sync and search, failover hardening
[1.44.3] - 2026-10-25
- Bump to 1.44.3
[Unreleased] - 2026-10-25
- Verified the static build still works (
make staticexit 0, 29 MBbuild/detz-static,--versionprintstai 1.44.3); stamped in docs/embed.md. - Docs: docs/whatsapp.md now states up front what
whatsmeowis (the upstream Go reference library, MPL-2.0) and how this tree uses it (behavior referee for the native C++ port, not a linked dependency). - WhatsApp link, image and contacts (docs/whatsapp.md section 15): pairing replies now address
s.whatsapp.net(the decoder printed server-only JIDs as@s.whatsapp.net, the root cause of every post-link 401); the link wizard waits for the restart, logs in, uploads prekeys and retries once with a fresh device on 401/403; closed sockets no longer spin the CPU;whatsapp_sendtakesimage(PNG/JPEG up to 16 MB,WaMedia, own devices get the DeviceSentMessage copy) and enforces 10/minute and 200/day; contacts sync from the phone (app-state,historySyncConfignow declared at registration) and are searched with FTS5 trigram plus fuzzy ranking, also from the globalsearchtool; ambiguous names are reported instead of guessed. clean_historydrops orphan tool results (and logs it), and compaction no longer starts its kept window on a tool result: reproduced the devplaceHTTP 400 No function call found for function call outputagainst the live endpoint. Test:build/llm_history_test.- Terminal art (QR codes, boxed screens) pasted as a prompt is refused before any model call; a failed
Ctrl-Cno longer counts against backend health; muse runs in one stable workspace per home; the provider probe accepts bare JSON lists (pollinations) and prints the start of a bad body. - WhatsApp native protocol core (docs/whatsapp.md,
src/whatsapp/, namespacedetz::wa): a from-scratch C++ implementation of WhatsApp Web's multi-device wire protocol, built on OpenSSL plus a vendored public-domain ed25519 ref10 (third_party/ed25519, zlib) for XEdDSA, with no new runtime dependency.WaCrypto(X25519, AES-GCM/CTR/CBC, HKDF, PBKDF2, SHA, XEdDSA),WaBinary(binary-XML codec + token dict v3),WaProto(hand-written protobuf + the messages the 1:1 text/image client needs),WaNoise(Noise XX handshake + transport),WaSignal(X3DH + Double Ratchet, AES-CBC+HMAC). Verified byte-for-byte against golden vectors captured from the real Baileys client (tests/whatsapp_data/, from jfelipesjc/wa-go, MIT): HKDF/PBKDF2 RFC vectors, XEdDSA roundtrips, codec battery 19/19, ClientPayload byte-exact, the full Noise handshake, and a 4-exchange Signal session byte-exact. Test:build/whatsapp_test(16/16), stepwhatsapp.unitin run_all. The live socket/pairing/send/receive layer and the--whatsapp-linkwizard and agent tools are not built yet; the live path is unverified (needs a linked phone). Research: research/whatsapp-automation. - Terminal screenshots (docs/termshot.md): new tool
terminal_screenshotwrites a PNG of the current tmux or native multiplexer pane on a headless server (capture-pane -e, TuiVtScreen replay, embedded Spleen 8x16 font, zlib PNG; no new dependency). detz-only tools now live insrc/agent/detz_tools.*; agent.diff and agent.e2e turn them off to keep comparing with tai.py. Test:build/termshot_test. Research: research/terminal-screenshot-rendering (99 sources, 2 conclusions). - WhatsApp research and build spec: docs/whatsapp.md (no native Python library exists, no browser needed, native C++
detz::watranspiled from wa-go with whatsmeow as referee, no new dependencies, build vs deep-research table, caps, tests, phases, a whatsapp-mcp shortcut). Research: research/whatsapp-automation (70 sources, 3 conclusions). Nothing built. - LLM failover is no longer silent: every failed candidate prints
x provider/model failed after N.Ns: reasonto stderr the moment it fails (before, errors only reached the debug log until a whole round failed, so a 73 s turn showed only "thinking"). The line clears the spinner row first on a tty. - muse:
muse execnow runs with--reasoning-effort low,--preset emptyand--no-foreign-personal-context(constskMuseReasoningEffort). Measured on the real 16 KB tai prompt: 36.5 s at the default effort, 2.8 s at low, 2.4 s with the empty preset too; the default let muse reason 4.5k tokens about conflicting tool sets and call its ownread_skill, which failed withstep_limitafter 34 s. That failure now reads "muse tried to call its own tools instead of answering". - Circuit breaker (3 consecutive failures, 300 s) now also applies to CLI backends (muse, opencode, grok, claude, codex, gemini); before, they were appended to the candidate list regardless of health.
- opencode runs are capped at
kCliFallbackTimeout= 30 s each (they sit in the fallback chain and rotate through free models). Test:build/muse_flags_test. --install: the native version reader now returns nothing when the target file is absent, so a fresh install reportsinstalledinstead ofrefreshed X -> X. Documented the install target and its gaps in docs/misc.md.- Documentation: new docs/cap-agents.md (agents, models, probes,
@agentresolution, errors, limits, troubleshooting), rewritten docs/fuzzy.md (algorithm, constants, measured worked examples) and docs/orchestration.md (protocol with examples, layout, lifecycle, state machine, formatter, event mapping, supervision, collection, caps, measurements, verification, gaps), feed panes in docs/mplex.md, README overview;make docschecks the new pages; drift tests keep the constant tables in step with the code. - Orchestration on the multiplexer screen (docs/orchestration.md): every sub agent (
forkworker, CAP session,@agentmention) gets a live, word-wrapped panel; the main pane stays left at full height and sub agents stack on the right (1, 2, 3 ... up to what fits at 6 rows each). New: feed panes in the multiplexer (vpane_*control commands,MplexVpanes),src/orch/(OrchBoard,OrchPanel,OrchFormatter,OrchTransport,OrchCapAdapter),Agent::observerand cancel flag, supervision (idle warn 60 s, idle cancel 300 s, soft cancel then close after 5 s, closing the pane cancels the job), CAP answers collected through the spill path. Tests:build/orch_test,tests/orch_mplex_e2e.pywithbuild/orch_live. Measured: about 64 frames/s, median 12.9 ms between frames, p90 25 ms with three agents streaming 500 tokens/s each. - Generic
detz::FuzzyMatcher(src/util/fuzzy.*, docs/fuzzy.md, tests/fuzzy_test.cpp): subsequence DP with fzf constants, Damerau-Levenshtein, per-token typo and trigram signals;@agent/@modelmentions now always pick the most related candidate (floor 0.3, ties shorter then earlier, a note shows what was resolved). Research: research/fuzzy-matching-selectors. @agent,@agent:modeland bare@modelmentions resolve against CAP agents via the newCapModelCatalog(manifest[models]list or--cap-modelsprobe); turns run throughCapMention; failures print a per-agent report of status, binary and models. Test:build/capmcp/cap_model_catalog_test. Spec: docs/cap.md.- Build and test integration after the parallel module ports. Not released:
make testis not green (see below), so VERSION stays 1.44.2 and no tag was made. - Makefile rewritten: objects in
build/obj, archivebuild/libdetz.a(no main.cpp), one test binary per delivered test source (foundation, store, cli, util/config, agent diff/e2e/sched, shell, cap/mcp unit/probe/cli, misc, tui spec/shot/script/rows/chat/grr, mplex x11),make test,make lint(real-Werror -fsyntax-onlyover src, main.cpp and tests, no|| true),make parity,make parity-check(docs/wiring/verify.md). tests/run_all.py: runs all 32 steps (C++ unit binaries plus the python differential drivers), logs tobuild/test-logs/, prints a summary table, exits 1 on any failure.-Ifor moloapp now searched in../../moloapp/src, the worktree-relative path and$HOME/projects/moloapp/src(MOLOAPP_SRC=overrides); src/cli needstenancy/strategy.hfrom it.- Removed the obsolete
store_testrule, the unused per-module*.mkfiles andtests/foundation.mk,tests/misc.mk. tests/test_main.cppreplaced bytests/util_config_test.cpp: its shell section is covered byshell_test.cpp, its cli section bycli_test.cpp, its llm section tested the removed placeholder llm API (ChatClient/ModelHealth/Opencode); the util and config checks and the--helprun are kept.