Commit Graph
4298 Commits
Author SHA1 Message Date
ramox81andClaude Opus 5.5 024101afe8 Name the center mark/line action body in the associative data rows
The codec now reads AcDbCenterMarkActionBody and AcDbCenterLineActionBody
as a SmartCenterActionBody variant; the Properties associative-data rows
label it "Center Mark/Line Action". The codec dependency is patched to the
fork commit that adds the variant.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 09:30:22 +03:00
Karim Jerbi 5f016e1192 fix(layers): carry layer name instead of row index in Message::Layer*
Closes the view-to-dispatch resort race: the nine Layer* variants plus ColorPickTarget::Layer now carry the layer name and resolve to the current panel row at dispatch time via layer_panel_index; unknown names no-op. View sites (layer panel, ribbon dropdown) and the CLI/plugin path send names, so the CLI position lookup and the ribbon enumerate are deleted. Panel-internal selection state stays index-based. Tests: layer_toggle_visible_targets_layer_by_name_after_resort pins name targeting across a re-sort; layer_toggle_visible_unknown_name_is_noop pins the graceful no-op. Full suite: 1974 passed / 0 failed / 25 ignored.
2026-10-05 22:46:01 +01:00
Karim Jerbi c5f8eb2921 refactor(style): dedup layers/xref row-button style into ui::style::row_button
Moves the byte-identical zebra/selected cell-button bodies from layers.rs and xref_manager.rs plus the layers header-button body into one shared module. All six call sites now use the shared helpers; toolbar_btn helpers untouched (different semantics). No new tests per owner request (pure move, verified by build plus full suite before test removal).
2026-10-05 22:33:24 +01:00
Hakan SevenandClaude Opus 5.5 7c76d2c27f fix: review follow-ups for #1602 and #1606
- #1602 changed the COMMANDLINEFADETIME help text and added "Never"
  without catalog entries, so both showed in English everywhere. Add
  them to the catalog and all 21 locales; drop the "0 skips them" key.
- #1606 named another CAD vendor in a doc comment and two test names.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 00:32:30 +03:00
Hakan Seven 240eb0a95d Merge pull request #1606 from yztink/fix/ucs-face-selection
UCS FACE picks solid faces again; the UCS snaps to the nearest face corner with X along the nearest edge.
2026-10-06 00:20:59 +03:00
Hakan Seven 62bb04c9d8 Merge pull request #1602 from yztink/feat/commandline-fade-zero-never
feat(commandline): allow history to never fade when fade time is 0
2026-10-06 00:20:51 +03:00
Hakan Seven d968020950 Merge pull request #1601 from AJ-Gonzalez/fix/macos-entitlements-check-xml
fix(packaging): make build_macos_signed.sh entitlements check pass
2026-10-06 00:20:49 +03:00
Hakan Seven 70e6720ba5 Merge pull request #1619 from ramox81/codex/keep-solid-wireframe
fix(save): keep a loaded solid's own wireframe cache
2026-10-06 00:20:47 +03:00
Hakan Seven 7d5ee91665 Release v2026.40.1 v2026.40.1 2026-10-05 16:07:00 +03:00
Hakan SevenandClaude Opus 5.5 a3bcded498 fix(release): support fix releases on top of a weekly one
`v2026.40.1` matched neither the weekly pattern nor plain semver (2026 is
past the MSI major limit), so a fix release could not be built. Weekly
tags now take an optional patch: Cargo 2026.40.1, MSI 26.40.1, display
2026.40.1 (week zero-padded, as build.rs and the update check expect).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 15:58:53 +03:00
Hakan SevenandClaude Opus 5.5 47eef134cb fix(release): rebuild a tag from the commit the tag points at
The v2026.40 rebuild was dispatched with a separate `commit` input copied
from a stale local tag, so Windows/macOS assets were built from 20803948
instead of 8e122a4e. Dispatch now takes only `tag` and checks the tag out.
Reverts 4700e263: the skipped Python plugin was a symptom of that commit.

Fixes #1612

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 15:54:32 +03:00
Hakan SevenandClaude Opus 5.5 de6e27304d perf(layers): toggle layer visibility without re-tessellating
Turning a 141k-entity layer off/on took 1.5-5 s; it now takes ~0.6-0.9 s.

- Off/freeze toggles go through invalidate_layer_visibility: entities on
  the layer keep their tessellation memo (visibility gates them before
  tessellation); only block users re-expand. No mesh recolor.
- The resident patch reuses a surviving memo entry instead of
  re-tessellating, guarded by the same display-context hash as the full
  build.
- The patch looked up `layout.order` linearly per re-shown entity, which
  made turning a big layer back on quadratic.
- recolor_meshes_for_handles resolved materials for handles with no mesh.
- Wire arena: a hidden slab keeps its instances and sets a `hidden` flag
  in its consts (collapsed in the vertex shader); an unchanged re-show only
  clears the flag. Const writes are batched into merged spans.
- The `layer_visible` automation action indexed the document's layer
  table instead of the sortable panel rows the Layer* messages use.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 15:53:27 +03:00
Karim Jerbi c35b902f3a fix(model): respect typed height on cylinder and primitive creation 2026-10-05 13:23:25 +01:00
ramox81andClaude Opus 5.5 95559a97f3 fix(save): keep a loaded solid's own wireframe cache
Saving filled every 3D solid without stored wires with tessellated display
edges, so solids read from a file without a wireframe cache (for example a
DXF) were saved with edges OCS never created. Only solids without ACIS data
now get an edge cache on save; solids OCS creates or edits already get their
wires when they are built.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 14:35:32 +03:00
Karim Jerbi fc19afa715 fix(automation): compare save_verified against the baked view
The before-manifest was taken pre-bake while save mints *D geometry on its clone, so every new dimension failed verification 1-vs-7. Compute before on a bake-simulated clone: baked-vs-baked proves roundtrip stability (bake correctness itself is pinned by the explode geometry tests). Pinned by save_verified_accepts_new_dimension_with_baked_block.
2026-10-05 00:07:21 +01:00
Karim Jerbi 7d1fca000b fix(io): materialize missing BLOCK/ENDBLK sentinels on load
The DXF reader keeps marker identities on the block record but never materializes the entities, so block_entity_handle/block_end_handle dangle after every DXF load (reopened baked *D dimension blocks hit this every time). Re-create missing sentinels at load finalize, reusing the file handle when free and minting otherwise. Idempotent and DWG-safe: loads whose markers already resolve are untouched. Pinned by dimlinear_survives_save_reload_with_baked_geometry.
2026-10-05 00:07:21 +01:00
Karim Jerbi a0d7447e2c fix(mcp): honest TTLs - 60s for resources, hour for tools
resources/* vary as sessions open and snapshots land, so an hour of advertised freshness was optimistic. protocol_result now takes the TTL value: tools/list and discovery keep 3600000, resources/list/read/templates get 60000, on every protocol version. No tool surface change; digest untouched.
2026-10-04 22:56:42 +01:00
Karim Jerbi f03ce9ab4f fix(mcp): send request_id and document_id on GUI capture requests
The GUI requires request_id and document_id on every non-query op, but the bridge sent neither on capture: every ocs_capture failed with request_id_required, then document_required. request() now always mints the GUI request id for capture (a client-supplied id wins and is echoed in metadata), and capture carries the active document. The op=capture read path answers guidance pointing at ocs_capture instead of a missing-path failure. Live-proven against the open window: plain and annotated captures return image content.
2026-10-04 22:45:11 +01:00
Karim Jerbi 695166d532 fix(mcp): stop deleting newborn GUI descriptors as corpses
The cached PID snapshot predates a GUI spawn, so the newborn pid missed from it read dead and the bridge deleted its just-written descriptor inside the launching call itself: every fast launch reported still-starting forever while a healthy window sat undiscoverable. Two guards: the snapshot cache is invalidated right after spawning, and deletion now waits out a 120s file-age grace (unknown age counts as newborn). Slow starters that write late were the only ones surviving before, which is why this was intermittent. Covered by stale_snapshot_may_delete predicate tests.
2026-10-04 21:36:04 +01:00
Karim Jerbi 342e9fdf2c ci(mcp): Inspector CLI conformance probes
Runs the official MCP Inspector against a fresh release build on every push and PR: initialize purity, four titled tools, headless resources/list, both resource templates. Headless-safe methods only; drawing-dependent coverage stays in unit tests and the pinned digest. Server addressed via config file (positional CLI targets break on Windows shells); TTL assertions stay at unit level (the CLI normalizes result envelopes on output).
2026-10-04 20:05:43 +01:00
Hakan SevenandClaude Opus 5.5 4700e263e3 fix(release): rebuild old tags that predate the bundled Python plugin
A dispatched rebuild checks out the tag's commit but runs main's
workflow; v2026.40 has no stage-bundled.sh, so the macOS bundle step
failed. Skip the plugin with a warning in that case only.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:59:42 +03:00
Hakan SevenandClaude Opus 5.5 f14b675ff7 fix(web): gate native-only code out of the wasm build
The wasm check broke on the MCP `tools` op, the block library's folder
picker and DWG thumbnails, and the PDF export-window culling helpers.
Gate each one like the code around it; `read_handle` needs no gate.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:53:11 +03:00
Hakan SevenandClaude Opus 5.5 440adec834 fix(pdf): leave out what the export window clips away
Everything was written and only clipped at view time, so a window over a
corner of a large drawing produced a near-empty page of several MB.
Wires and hatches whose sheet bounds miss the window are now skipped.

Fixes #1568

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:44:08 +03:00
Hakan SevenandClaude Opus 5.5 31341e8ea2 fix(xref): bring the anonymous blocks dimensions draw from
A dimension draws from its *D block by name, but loading an xref skipped
anonymous blocks and kept the name verbatim, so its dimensions fell back
to a regeneration (giant text at the origin) or a host block of the same
name. The load path now imports them prefixed like other blocks and
renames the dimension's block; BIND is unchanged.

Fixes #1578

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:44:08 +03:00
Hakan SevenandClaude Opus 5.5 6b5c2758e1 fix(hatch): keep the association when TRIM splits a boundary
Splitting a boundary object erased it and added the pieces, so the hatch
lost that source and rebuilt from what was left, often the whole circle.
The pieces now take over the old object's association before it is
erased.

Fixes #1572

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:44:08 +03:00
Hakan SevenandClaude Opus 5.5 fd01a36ad3 fix(osnap): a POINT snaps as a Node only
A point carried a key vertex, so Endpoint (which outranks Node) claimed
it, and an absolute-size glyph's strokes were indexed for Nearest and
Intersection. Points now offer only their Node, in the indexed and the
unindexed snap paths alike.

Fixes #1570

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:44:08 +03:00
Hakan SevenandClaude Opus 5.5 d6dfd0d46d fix(render): miter the joints of wide polyline bands
Each band segment was a rectangle ending square at its vertex, so the
outer corner of every joint showed a notch. Every segment end now carries
the tangent of half its turn, and the shader slides that end's corners
onto the joint's bisector so neighbours meet in a miter. Turns sharper
than the limit keep butt ends. Constant-width runs inside a polyline split
around its arcs no longer count as tapered, which had kept them unmitred.

Fixes #1565

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:44:08 +03:00
Hakan SevenandClaude Opus 5.5 4cfcc9dc38 chore: bump codec fe69506, kernel ae28f66, graph 892f942
The codec writes R2018 AuxHeader maintenance fields as RL, so AutoCAD no
longer reads a 2018 save as student-made. The kernel drops zero-area
spikes before triangulating, so a hatch whose boundary folds back on
itself fills on screen instead of vanishing.

Fixes #1564
Fixes #1569

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:44:08 +03:00
Hakan SevenandClaude Opus 5.5 03b01e818b fix(release): give rustc 1.99 enough stack; Windows build fails fast
rustc 1.99 overflows its default 8 MB stack compiling the crate in
release on Windows and macOS. Raise RUST_MIN_STACK to 64 MB in the cargo
config and the release workflow (the latter also covers rebuilding older
commits). The Windows Build step now runs in bash so a failed cargo build
stops the job instead of surfacing later as a missing exe at signing.
workflow_dispatch gains tag/commit inputs to rebuild a published release.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 20:42:55 +03:00
Karim Jerbi 469845df1c fix(mcp): only the 10-minute ceiling dismisses interactive waits
Short interactive waits returned a bogus 10-minute timeout on first expiry, killing the re-poll pattern and blocking task creation. The dismiss branch now fires only when the requested wait actually reaches the ceiling; shorter waits return running as before. Predicate covered by interactive_timeout asserts.
2026-10-04 18:05:15 +01:00
Karim Jerbi 4bca09c04a fix(mcp): honor tasks/cancel, public task error codes, schema-sync opt-out
tasks/cancel marks the task so polls report terminal cancelled with neither result nor error; late completions are discarded. Task envelope errors move from grandfathered -32000 to -32603. Agent schema sync on bridge start is now skippable via OCS_SKIP_SCHEMA_SYNC and logs one line when it writes.
2026-10-04 18:05:15 +01:00
github-actions[bot] 8e122a4e34 Release v2026.40 2026-10-04 16:40:44 +00:00
Karim Jerbi 709036ffca feat(mcp): templates/list, top-level titles, deterministic resources
resources/templates/list serves the two genuine parameterized URIs (pyramid tiles, snapshots) with TTL hints instead of -32601. Tool titles move top-level per the 2026-07-28 Tool shape (dropped from annotations); annotation keys are allowlist-tested. resources/list ids are sorted so client and prompt caches hit. Tool schema digest rolls to fbba987a; pin updated deliberately after reviewing the titles-only surface diff.
2026-10-04 17:27:57 +01:00
Karim Jerbi 3c751af337 docs(mcp): developing guide for bridge contributors
How to iterate the bridge: fast builds, digest pin, session model, discovery, launch serialization, cancellation, error routing, safety model, rebuild swaps, conformance gates. No diary entries, no harness names, no build-specific data.
2026-10-04 17:02:24 +01:00
Karim Jerbi b8caa5ccac feat(mcp): cancellable waits with GUI dismiss and max wait
run() reads stdin on a feeder thread into a channel (CancelPump); wait loops harvest lines in 50ms quanta instead of sleeping blind. A notifications/cancelled naming the in-flight MCP id dismisses the GUI prompt with a second cancel exchange, drops the late result, and sends nothing back. Cancels arriving between polls resolve via the inflight map; re-polls for dismissed ops answer cancelled without touching the GUI. Interactive picks (user_select/getpoint) get a 10-minute single-call ceiling ending in isError timeout text; other ops keep the 60s clamp. Ping-during-block stays unanswered while one exchange occupies the loop (bounded residual).
2026-10-04 17:02:24 +01:00
Karim Jerbi 5794276213 fix(mcp): spec-exact error routing for unknown tools and infra failures
Unknown tools become -32602 Protocol Errors carrying the four valid names (SEP-1303 keeps them there; the isError shape hid them from strict clients). Bridge/GUI infrastructure failures (no sessions, dead TCP, unwindable startup) become -32603 via the CallError split; tool-domain validation stays isError so the model keeps self-correcting. Verified observable in a live client session: bogus session surfaces readable -32603 naming ocs_sessions, model recovers.
2026-10-04 17:02:24 +01:00
Karim Jerbi 499b46ab4e fix(mcp): era-split not-found codes and -32600 for non-object input
resources/read reports -32602 on the modern path (2026-07-28 forbids emitting -32002) and keeps -32002 on legacy, where it was the code. Non-object top-level input (batches included - no batch semantics defined) gets -32600 Invalid Request instead of silence, so senders never hang. Id-less objects stay silent (notifications). Ping arm deliberately untouched: the method was removed only on the modern path, and legacy health checks may rely on it.
2026-10-04 17:00:59 +01:00
Karim Jerbi 22715c9485 refactor(mcp): spec-pure serverInfo, build identity via experimental
serverInfo carries only name/title/version so strict clients never reject the handshake. Build extras (build_rev, build_profile, tool_schema) live canonically in bridge_identity, surfaced via capabilities.experimental and the in-band bridge stamp - no copies to drift. Adds conformance guards: spec-pure initialize with unknown-version fallback, and JSON-RPC errors for unknown methods, missing tool names and missing resource URIs.
2026-10-04 17:00:59 +01:00
Karim Jerbi de4b47e7bd fix(mcp): announce build from the entry-point tool description
Global MCP instructions don't reliably reach agents (fresh sessions never announced the build). The directive now lives in the ocs_sessions description every agent reads first, pointing at the bridge object. Tool schema digest rolls to ede58332; pin updated deliberately after reviewing the description-only diff.
2026-10-04 17:00:38 +01:00
Karim Jerbi 71de9f844c feat(mcp): emit SEP-2549 TTL on every protocol version
List results (tools/list, resources/list, resources/read) carry ttlMs and cacheScope on the legacy 2025-11-25 path too; legacy clients ignore unknown fields per the SEP's backward-compat rule. The modern envelope (resultType, _meta.serverInfo) stays negotiated. Legacy-shape pin updated deliberately to assert presence.
2026-10-04 17:00:38 +01:00
Karim Jerbi d31b9d1a35 fix(mcp): harden discovery, serialize launches, expose build identity
Discovery skips pid-verified dead sessions and deletes stale descriptors; probes are bounded so dead sessions delay discovery by at most one timeout. The bridge exits after the in-flight request once it detects a rebuild, and error results omit structuredContent so strict clients surface real errors. Concurrent launches are serialized with automation/starting.lock: the first caller spawns the GUI, later callers wait for the same descriptor instead of opening another window. Session states and hello/capabilities responses now carry the bridge build identity (version, build_rev, tool_schema), and the agent instructions point the build announcement at it.
2026-10-04 17:00:38 +01:00
yztink 973d7b0bb6 feat(ucs): align UCS Face origin and axes to nearest vertex and edge 2026-10-03 22:32:57 -07:00
yztink 6840687f32 fix(ucs): enable solid face raycasting and model hydration in UCS FACE 2026-10-03 22:32:57 -07:00
yztink 384519f2cc feat(commandline): allow history to never fade when fade time is 0 2026-10-03 11:35:39 -07:00
AJ-Gonzalez 12e259816c fix(packaging): make build_macos_signed.sh entitlements check pass
codesign -d --entitlements - now prefixes a text header line, so the
plist parse hit InvalidFileException; --xml emits clean XML (same
workaround as release.yml). Python 3.14's plistlib.load also rejects a
non-seekable pipe, so buffer stdin first.

Without this the script exits before the dmg step after a successful
build and ad-hoc sign.
2026-10-03 09:58:49 -06:00
Hakan SevenandClaude Opus 5.5 d2a4e3f8e7 docs(ribbon): restore the #1595 screenshots
docs/screenshots is where PR before/after shots live; 88d6a5ec dropped
these by mistake.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 17:52:05 +03:00
Hakan SevenandClaude Opus 5.5 65ba02c379 Merge PR #1594 from CiberNin/feat/offset-drag-signed: OFFSET opens on the live preview for pre-selected objects; signed typed distance
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 17:50:35 +03:00
Hakan SevenandClaude Opus 5.5 88d6a5ec08 fix(ribbon): light the button for prefixed commands too; drop PR screenshots
_LINE / .LINE reached show_command with the prefix and matched nothing;
strip it the way the Start-tab gate already does. The before/after
screenshots only illustrate the PR and stay on its branch.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 15:03:20 +03:00
Hakan SevenandClaude Opus 5.5 420c12cc15 Merge PR #1595 from CiberNin/feat/ribbon-command-highlight: highlight the running command's ribbon button
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 15:02:26 +03:00
Hakan SevenandClaude Opus 5.5 ba8aed4fad fix(dynmode): one toggle keeps DYNMODE's sign in step
F12, the drafting dialog and restored settings each re-derived DYNMODE and
lost the mode on the way: F12 off set 0, so on came back as 3 even after
DYNMODE 1. set_dyn_input now makes off negative (temporarily off) and on
restore the stored mode, and the bare query prints the stored value.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-03 15:01:45 +03:00