Commit Graph

268 Commits

Author SHA1 Message Date
bflatastic 3f9d802d4b Look programs up with lower-case extensions so the Windows tests pass, and tick the roadmap 2026-11-03 20:20:43 +07:00
Afloat b816df00c6 Preserve interrupted requests when agent sessions cannot resume (from #621) 2026-11-03 20:15:17 +07:00
Afloat 40061f746f Bound multiline server-sent event data (R5.5) (from #620) 2026-11-03 20:15:17 +07:00
Afloat b43050947e Avoid specialised-only models in automatic chat setup (R5.4) (from #619) 2026-11-03 20:15:17 +07:00
Afloat 3cfb4fc508 Find Antigravity under redirected Windows local app data (R2.2) (from #617) 2026-11-03 20:15:17 +07:00
Afloat ab39bec568 Stop recommending Aider without a headless adapter (R2.2) (from #616) 2026-11-03 20:15:17 +07:00
Fábio Soares 78e1f7dce0 Say where a program is when it is there but can't start, instead of "isn't installed" (#583)
A program that is on disk but can't start (an npm script whose node is missing) says where it is and what to check, instead of "isn't installed"; on Windows an .exe is started by the path it was found at (refs #152, #95).
2026-11-03 20:15:01 +07:00
Ole Bohmbach a6920ff271 Cap the edges a native call graph lists (#582)
A native call graph lists at most 50,000 call edges and says when it stopped there, so one function with a huge number of call sites can't blow up the report.
2026-11-03 20:14:55 +07:00
Fábio Soares b9c4c53099 Find Hermes Agent's native Windows install when the app's PATH is older than it (#585)
Hermes Agent's native Windows install (%LOCALAPPDATA%\hermes\bin) is found even when the app's PATH predates it (refs #116).
2026-11-03 20:14:49 +07:00
Max Mittelstädt 5845227f9f Bound IPv6 extension parsing to the declared payload (#639)
IPv6 extension headers are read only within the packet's declared payload, so padding after a packet can't change its reported protocol.
2026-11-03 20:14:20 +07:00
NetterSilver 0cff0f4336 Keep-awake helper test accepts a stop that arrives after the connection (#629)
Fixes a flaky platform test: on macOS an accepted socket inherits the listener's non-blocking mode, so the keep-awake stand-in helper dropped a stop that arrived after accept.
2026-11-03 20:14:14 +07:00
BFlat 3ee1642770 Serve previews only to this computer, stream their files and bound their connections (#649)
Replays #597, #598, #600 and #601. The preview server answers only requests addressed to this computer, streams files, sends no body for HEAD on a missing file, caps open connections and gives a request head one deadline.

Co-authored-by: Afloat <132809511+Afloat16@users.noreply.github.com>
2026-11-03 20:07:33 +07:00
BFlat 0eea78d7aa Read HTML pages' scripts and preloads correctly in more cases (#645)
Replays #591–#596. The HTML scanner reads rel token lists, decodes asset URLs once, keeps script and title text through lookalike closing tags, and skips raw-text elements, markup inside attribute values and custom tag names.

Co-authored-by: Afloat <132809511+Afloat16@users.noreply.github.com>
2026-11-03 19:58:08 +07:00
Matthias Bodsch 1d66a6ba4b Choose OpenCode models and thinking depth locally or over SSH (#413)
OpenCode can be chosen as a coding agent locally or over SSH, with the chat models its installation offers and the thinking depths each supports.
2026-11-03 19:53:16 +07:00
Afloat 48759fb5fc Stop unchanged rebuilds after two turns across runs (#557)
Refs #44, #110 and #481. A build stops after two builder turns in a row change no app files, counted across runs in a versioned inbox/build-progress.json; a new request or a real edit starts another attempt. File digests are cached by size and modification time, so unchanged files aren't read again.
2026-11-03 19:31:22 +07:00
Afloat f307d39480 Retry builder turns from typed failures, including stateless backends (#552)
Refs #377 and #142. Builder retries are decided by typed failures instead of English text: sign-in, billing, missing programs, configuration and failed required tools stop at once, while dropped connections, rate limits and plain crashes are retried up to three times with bounded waits. OpenCode's JSON output is read for errors, text, tools and usage.
2026-11-03 15:51:05 +07:00
Afloat 888f75b3f1 Help models correct rejected tool argument types (#546)
Refs #498. A tool argument of the wrong type is answered with its JSON Pointer, the type error and how to correct the call, so a model can fix it; schema types stay strict.
2026-11-03 15:48:57 +07:00
BFlat 6bbcb0d1bd Skip ZIP symlink and special members when extracting (#568)
Fixes #520. Supersedes #521. core_archive_extract skips ZIP symlink, device, FIFO and socket members and names each in skipped, instead of writing a symlink as a file holding its target.

Co-authored-by: NetterSilver <133535268+Silvertree2010@users.noreply.github.com>
2026-11-03 15:41:50 +07:00
BFlat e1d1974468 Keep a prompt's pictures when Up brings it back (#570)
Supersedes #216. A prompt brought back with Up keeps the pictures it was sent with. feed.json moves to version 3: a User item with pictures is saved as {text, pictures}, one without stays a plain string, so older files read as before. Picture paths are absolute, so they don't come back after the project is moved.

Co-authored-by: muraa-p <muraa-p@users.noreply.github.com>
2026-11-03 15:41:21 +07:00
BFlat 73f9d5a8d3 Report bytes per direction for packet capture flows (#566)
Fixes #507. Supersedes #531. Packet capture flows report bytes in each direction (bytes_a_to_b, bytes_b_to_a) next to the total.

Co-authored-by: NetterSilver <133535268+Silvertree2010@users.noreply.github.com>
2026-11-03 15:40:44 +07:00
Afloat 0a0fa2a43a Recover JSON tool calls emitted as text (#554)
Refs #417. A complete JSON tool call a model writes as its whole reply (bare or fenced, with name and arguments or parameters, or a function wrapper) runs as that tool when it was offered, including when native tool calling was offered; examples in prose, malformed or partial JSON stay text, and Action:/Action Input: steps still work.
2026-11-03 15:39:39 +07:00
BFlat 47e429ca15 Translate Pausing… in the Russian catalog (#567)
#555 added "Pausing…" to every UI catalog and #486 added the Russian one without it, so the catalog parity test failed on main; this adds the Russian translation.
2026-11-03 15:22:55 +07:00
GGWA 7e135c8065 Send Gemini CLI its prompt on stdin instead of the command line (#548)
Fixes #549. Gemini CLI gets its message on stdin with an empty -p, so a long message no longer passes cmd.exe's 8,191-character limit through gemini.cmd.
2026-11-03 15:17:20 +07:00
BFlat 7c20db27cc Let the Flatpak create and write its default projects folder (#565)
Fixes #505. The Flatpak grants home read-only, so new projects in the default folder (~/Documents/Craft Anything) failed with "Read-only file system". Both manifests now also grant xdg-documents/Craft Anything:create; the rest of home stays read-only.
2026-11-03 15:12:57 +07:00
Fábio Soares 0d24b0ee2f Send empty string content for tool-call-only assistant messages (#536)
Fixes #403. An assistant message with only tool calls sends an empty string as content instead of null, which Ollama rejected.
2026-11-03 15:09:05 +07:00
frankyef 549ae5e29a Give runtime_captures_compare object schemas so Claude Code keeps every MCP tool (#490)
runtime_captures_compare's left and right parameters are declared as a string or an object instead of a boolean schema, which made Claude Code drop every tool from the MCP server; on the command line a JSON object passed to them stays an object.
2026-11-03 15:09:00 +07:00
Fábio Soares 086ef3ba63 Approve Craft Anything's tools for Codex and explain a refused call instead of showing null (#553)
Fixes #540. Codex's codex exec can't ask for approval, so setup and the builder approve rebuild_start (which asks the person itself) on Codex's side, keeping the person's other settings in the entry; a refused call explains the fix instead of showing null.
2026-11-03 15:04:55 +07:00
DjMigen 09849084df Add a Russian UI catalog (#486)
Adds a Russian UI catalog (ru), selectable in Settings → General → Language, with key parity to the Chinese catalogs checked in tests.
2026-11-03 15:03:38 +07:00
NetterSilver 2b5af078f8 Say in the README that public releases are published (#501)
The README status says public releases with installers are published (still alpha); next is the managed tier.
2026-11-03 15:01:46 +07:00
Fábio Soares b002c5417f Show a named Pause button, and say Pausing… once it is pressed (#555)
Fixes #551. The pause button is named Pause, as the hint says, and reads Pausing… (ignoring further clicks) until the build stops.
2026-11-03 15:01:44 +07:00
NetterSilver 33d243674e List the current manifest and feed versions in the file formats table (#502)
Fixes #497. docs/file-formats.md lists the current craft.json and feed.json versions, and a test checks the table against the constants.
2026-11-03 15:01:41 +07:00
Fábio Soares 6d90c65624 Draw with Windows' own shader compiler, and say how to start without the graphics card when the device is lost (#558)
Fixes #522. On Windows the app draws with the DX12 shader compiler that ships with Windows (FXC) unless WGPU_DX12_COMPILER says otherwise, and a lost graphics device says how to draw without the graphics card (CRAFT_ANYTHING_RENDERER=software).
2026-11-03 15:01:38 +07:00
Bently f6055a5ba2 native_function_find gives an offset beyond 64-bit JSON numbers as signed hex text instead of panicking (#477)
native_function_find gives an offset that does not fit a 64-bit JSON number as signed hex text instead of panicking while serialising it.
2026-11-03 15:01:33 +07:00
Afloat 303de0a438 Keep ACP history replay out of new turns (#550)
Over ACP, session/update notifications that session/load replays before it answers are kept out of the new turn, so a continued session no longer shows the earlier conversation again.
2026-11-03 15:01:32 +07:00
Fábio Soares 199a71e08f Give Claude Code a writable conversation folder under Flatpak, and say how to sign in there (#561)
Fixes #506. Under a Flatpak, where ~/.claude is read-only, Claude Code is started with a writable CLAUDE_CONFIG_DIR in the app's data folder so its conversations are saved and --resume works; the sign-in message says how to sign in inside the sandbox. A CLAUDE_CONFIG_DIR the person sets wins, and SSH builds are unchanged.
2026-11-03 15:01:26 +07:00
NetterSilver d3bbf99b4a Write CRC-mismatched ZIP members when if_tampered=continue (#525)
Fixes #518. With if_tampered=continue, core_archive_extract writes a ZIP member whose CRC does not match (the mismatch stays in contradictions), as its remediation says.
2026-11-03 14:59:03 +07:00
GGWA a007d128af Read ZIP names without the UTF-8 flag as CP437 (#532)
Fixes #515. ZIP member names without the UTF-8 flag that are not valid UTF-8 are decoded as CP437, as the ZIP specification says, instead of lossily.
2026-11-03 14:58:57 +07:00
GGWA 5cdcbb7503 The archive inventory says when nested archives were left unopened (#534)
Fixes #519. core_archive_show counts nested archives that a depth or size limit left unopened, reports a nested_not_opened limitation and marks coverage partial.
2026-11-03 14:58:51 +07:00
GGWA 60c3a97a66 Archive extraction refuses names Windows would change: a trailing dot or space, or a colon (#533)
Fixes #516 and #517. Archive extraction refuses member names with a colon or a trailing dot or space, which Windows would change (merging two members, or hiding bytes in an alternate data stream).
2026-11-03 14:58:45 +07:00
NetterSilver d0c5feefa7 List DNS answers the same way on both packet engines (#514)
Fixes #510. The built-in engine lists DNS answers like tshark does: each A/AAAA address keyed by the response's first question, so CNAME chains end at the name asked. Both engines report the dns_answer_attribution limitation.
2026-11-03 14:58:38 +07:00
NetterSilver b0003d7ab2 Keep TCP ports when a frame is cut inside the TCP header (#529)
Fixes #509. The TCP decoder keeps the ports (and the tcp protocol entry) when a frame is cut later in the TCP header; each later field is set only when its own bytes were captured.
2026-11-03 14:56:12 +07:00
NetterSilver 493c20f414 Count each protocol once per frame in the capture summary (#513)
Fixes #508. The capture summary counts each protocol once per frame, so a QinQ frame no longer counts twice under vlan.
2026-11-03 14:56:07 +07:00
Afloat e3d95b4300 Test big-endian nanosecond pcap captures with FCS metadata (#433)
Adds tests for big-endian nanosecond pcap files with FCS metadata, for both Ethernet and raw IPv4 link types.
2026-11-03 14:56:01 +07:00
Alex Joaquim Pereira a3e6bd1b13 C# operators keep their CLR names (#456)
Fixes #316. The C# declaration scanner records operators under their CLR names (op_Equality, op_Addition, op_Implicit…), so managed_reconstruction_check no longer reports declared operators as missing.
2026-11-03 14:54:00 +07:00
Afloat c4e3d79dda Honor per-backend conversation context budgets (#559)
Refs #374. A backend can set its own conversation budget (context_tokens in [[ai.backends]]); the conversation is fitted to it before each model attempt, including a fallback with a smaller window, counting history added since the last measured request.
2026-11-03 14:53:55 +07:00
Bently 0ec096c569 Deep mode uses Ghidra when the engine store is under a dot folder such as ~/.config (#484)
On Linux, where the default engine store is under ~/.config, Ghidra is given a dot-free link to the store in a private runtime folder, since it refuses project paths with a dot folder; Deep mode now uses Ghidra there.
2026-11-03 14:51:00 +07:00
Bently c9c263832e Ghidra's pseudo-C uses the names you set, in the code and in its summary (#488)
In Deep mode, Ghidra's pseudo-C uses the names set with native_name_set in the function field, the summary and the code (whole identifiers only, never inside comments, literals or fields); names that can't stand in C or would clash are listed in a limitation.
2026-11-03 14:50:54 +07:00
Bently 473f187c5d doctor says which Java Ghidra runs on as well as the Java on PATH (#489)
doctor reports which Java Ghidra runs on (JAVA_HOME_OVERRIDE in its launch.properties, the Java set for it in Settings, JAVA_HOME, then PATH), and warns when the set folder has no Java or an override wins over it.
2026-11-03 14:50:48 +07:00
Bently 2c7a311dfd Find strings in ELF files with no section headers, read from their loaded segments (#491)
For ELF files with no section headers (common in firmware), native strings are read from the loaded segments, limited to the bytes each segment maps.
2026-11-03 14:50:43 +07:00
Bently c5fce85fe0 In stripped programs, a jump below a function's entry is a tail call to a function of its own (#492)
In a stripped program, an unconditional jump to code below a function's entry that the function hasn't reached otherwise is a tail call to a function of its own (such as frame_dummy jumping to register_tm_clones), instead of pulling that code into the caller.
2026-11-03 14:50:38 +07:00