First published build since v0.8.2 — this
.oxtincludes everything from 0.9.0, 0.9.1 and 0.9.2.
[0.9.2] — 2026-07-24
Fixed
save_document_asno longer overwrites the original file (#19) — it now persists viastoreAsURL(a real "File > Save As") instead ofstoreToURL(an export/copy), so the open document rebinds to the new location. Previously the model stayed bound to its original URL, so a latersave_documentwrote back to — and silently overwrote — the source file while the save-as target stayed frozen- Distinct documents no longer share a
doc_id(#20) — the per-document id is stored inside the file, so a copied orsave_document_as'd file used to inherit the source's id, making two open documents collide andid:addressing target the wrong one.get_doc_idnow detects when a persisted id is already in use by another open document and reassigns a fresh one (self-healing on the next save);save_document_asproactively mints a new id for the freshly written file so it gets its own identity from the start
[0.9.1] — 2026-07-24
Fixed
- CJK-locale Windows startup crash (#16, #17) — on Windows systems whose ANSI code page is not UTF-8 (zh-CN cp936/GBK, ja-JP cp932, ko-KR cp949…), extension registration aborted with
UnicodeDecodeErrorwhileoptions_handler.pyread_layout.pyat import time (an em-dash byte is illegal in GBK). Registration stopped there,Jobs.xcunever registered, and the MCP server never started even though the extension looked installed. The four startup-critical reads (_layout.py,version.py,_build_id.py,module.yaml) now open explicitly withencoding="utf-8". Thanks @7errry for the diagnosis, fix, and verification on Windows 11 zh-CN / LO 26.2.4.2
[0.9.0] — 2026-06-28
Added
fit_imagetool (#10) — auto-fit a Writer image using its real content aspect ratio (read server-side from the embedded image data, so it stays correct even after a manual rotation).fit="width"/"height"keep one dimension and recompute the other;fit="frame"fits the image to its parent text frame's inner width and resizes the frame height to match. Resets croppingwrap_image_in_frametool (#12) — wrap an existing frameless Writer image into a captioned text frame, preserving size/rotation/anchor. Reuses the embedded image data directly, so it works even when the source file path is unknown- Image rotation (#9) —
set_image_propertiesgains arotationparameter (degrees clockwise), mapped to Writer'sGraphicRotation get_image_infoenrichment (#12) — now returnsnative_width_px,native_height_px,native_ratio(real content ratio) androtation, plus anOriginURLfallback for the otherwise-emptygraphic_url- Search backend option — new
search_backendWriter option (directexact/regex, default, vsindexstemmed/fuzzy).search_in_documentgains a per-callbackendoverride; the index backend falls back to direct for regex or when the index module is unavailable
Changed
replace_imageadapts to aspect ratio (#8) — by default (fit="width") it now resets cropping and recomputes the height from the new image's aspect ratio, so portrait↔landscape swaps are no longer distorted.fit="height"keeps the height;fit="exact"preserves the previous behaviour (old frame size). Explicitwidth_mm/height_mmstill overridesearch_in_documentsearches text frames (#5) — body + text frames are now both searched (toggle withinclude_frames), so image captions/legends placed in frames are findable. Frame matches carry the frame name, a snippet, and the anchor paragraph. Results gainsource,backend,body_count,frame_countfieldsgoto_pagereturns page topology (#13) — by default also returns the images, tables and text frames on the target page (passtopology=falseto skip), removing the need for a follow-upget_page_objectscall