- Keep waiting while the task status comes back empty for up to 30 seconds (
emptyStatusGrace), instead of giving up after three empty answers. A task on the test backend answered empty for its first few seconds, and 2.5.1–2.6.0 failed that healthy parse after about five seconds; rerunning resumed it without a new charge. A task this identity cannot see still fails within half a minute.
- Keep the paragraphs of a text box apart. Both PPTX engines now record paragraph ranges for every
multi-paragraph text box (
extensions.paragraphs), and Markdown gives each paragraph its own block; a line break inside a paragraph stays a line break. They used to be joined by single newlines, so every Markdown viewer merged them (Client process: … Server process: …on one line): 310 text boxes on the example lecture deck, 184 on a Chinese business deck. - Speaker notes: the cloud path reads them too (presentation
readNotes), so both engines give the same notes, built like slide text. Markdown renders a note as a quote headed**Speaker notes:**instead of a paragraph that looked like slide content. - Embedded objects (OLE): a visible object is shown as its preview image (
p:pic, or the legacy VML drawing), carryingextensions.embeddedObjectwith its program id and name; oneembedded_object_previewinfo check replaces a warning per object. Objects that draw nothing — add-in metadata a fraction of a point wide, or empty shells with no preview — become non-renderedembedded_objectnodes under oneembedded_object_hiddeninfo check. The lecture deck goes from 147 "unsupported embedded object" warnings to 144 previews and 3 hidden shells; the business deck's 12 think-cell objects are hidden. The cloud path reports SmartArt assmartart_partiallike the local parser. - Charts: the categories and values cached in the chart part are rendered as a table under the chart,
titled by the chart title, in both engines. A chart without readable data still reports
chart_partial. - Bump the local PPTX parser to
deckparse-pptx5, the cloud adapter todeckflow-cloud5 for PPTX and the Markdown renderer to 1.4.0. The cloud features need a backend on@deckflow/presentation≥ 0.4.0 with itsreadNotes,readEmbeddedObjectsandreadChartsoptions on.
- Resume an interrupted cloud parse: when an earlier run recorded a task ID (the task was created,
then the wait or the result download failed), rerunning the same parse waits for that task and
downloads its result instead of blocking. Nothing is uploaded or submitted again, so nothing is
billed twice. The task's space is now recorded in
upgrade.json. If the cloud reports the task failed or no longer finds it, the journal is markedfailedand the next run submits anew. A production run that lost its download toread ECONNRESETpreviously could only continue with--force, which re-bills. - Rejected saved credentials fail with
auth_errorand thedeckops auth loginhint. The CLI used to switch to guest mode silently: the task landed in a guest space, its result could not be fetched, and the command waited out its timeout without mentioning authentication. - Stop waiting when the task status comes back empty three times in a row, naming the task and the
endpoint. Production answers 200 with an empty body for a task outside the caller's identity, which
was treated as "still running" until the 600-second timeout. A resumed task that cannot be read is
marked
failedso the next run submits anew. - A task-creation request the server rejects with 4xx (expired login, quota, bad parameters) is
journaled as
failed, notsubmission_unknown: no task exists, and after logging in again the next parse must not be blocked behind--force. - When the whole operation runs out of time, say so:
Stopped after 120s without a result., with a hint to raise--timeout, rerun to resume a created task, or check the API root. It used to end with a bareThe operation was aborted due to timeout, even when the API host was unreachable.
- Placeholders that carry no frame of their own now take it from the matching layout placeholder,
then from the master, in both engines (
extensions.bboxInheritedFrom). They used to have no box and were read after everything else on the slide: on 21 slides of the example lecture deck the body text came after the diagram labels. Behavior change: PPTX node order and Markdown order change on such slides; unplaced text nodes drop from 101 to 0 on that deck. - Name package images by their real type when the extension is not an image type (a lecture deck
stores two PNGs as
ppt/media/image92.tmp): local PPTX and DOCX assets become.pnginstead of unreadable.tmpfiles. The cloud path reports a picture whose image the result left out ascloud_asset_missinginstead of silently dropping it (platform-slave now stores such images too). - Image alt text: the cloud adapter reads
descrlike the local parser. Both keep only author descriptions: links, file paths, file names, clip-art cache names (imgyjavg[1]) and search-engine boilerplate are dropped, UTF-8 garbled as Latin-1 is repaired, andImage result for 中信集团 logobecomes中信集团 logo. The original text stays inextensions.descr. - Bump the local PPTX parser to
deckparse-pptx4, the local DOCX parser todeckparse-docx3 and the cloud adapter todeckflow-cloud4 for PPTX only.
- Depend on
@deckflow/pdf-lite-parse@0.2.1, the new scoped name of the local PDF parser; the unscopedpdf-lite-parsepackage is deprecated. The parser code is unchanged, and so is thepdf-lite-parseproducer name recorded in IR, so existing local PDF artifacts stay reusable.
- Read PPTX list structure in both engines: each paragraph's outline level and bullet are resolved
through the OOXML inheritance chain (paragraph → shape list style → layout placeholder → master
placeholder → master title/body/other style → presentation default) and recorded on text nodes as
extensions.paragraphs(start/endoffsets intotext,level,list: 'bullet' | 'number'). Markdown renders them as nested-/1.lists; lead lines that switch bullets off stay plain. Behavior change: CommonMark list items go from 25 to 483 on the example lecture deck and from 8 to 194 on a Chinese business deck. The cloud path reads the same chain from the presentation JSON; it needs a backend on@deckflow/presentation≥ 0.3.7 to see<a:buNone/>(older backends render lead lines as list items). - Emphasis Markdown that parses: adjacent runs with the same formatting are merged before marking
(
**50****% ****的**** **becomes**50% 的**), whitespace and edge punctuation that would stop a marker from closing move outside it, whitespace-only runs get no markers, and italic nests inside bold. The example decks go from 90 and 188 stray**in CommonMark output to 0. - Headings: an empty title placeholder is no longer a heading (no more bare
##), and a multi-paragraph title renders on one heading line instead of spilling its second line into body text. - Cloud submission journal:
submission_unknownis recorded only when the task-creation request is about to be sent. A failure while resolving the space or uploading no longer blocks every later parse.--forcenow resubmits over an unresolved submission, with a warning that the earlier task, if it was created, may be billed separately. - Errors for requests that got no response name the host and request
(
Cannot reach the DeckFlow API (GET https://…/v1/user): timeout of 30000ms exceeded) and hint at the network or proxy, instead ofAPI Error (unknown): …. - Bump the local PPTX parser to
deckparse-pptx3, the cloud adapter todeckflow-cloud3 for PPTX only (cloud PDF/DOCX artifacts stay reusable, so they are not re-billed) and the Markdown renderer to 1.3.0.
- Resolve group transforms in both PPTX engines: group children now carry slide coordinates
(the child canvas
chOff/chExtis mapped onto the group frame). Only rotated or flipped groups still reportgroup_transform_partial; a 99-slide lecture deck drops from 339 such warnings to 38. - Read slides in layout order instead of z-order: title first, then body/content placeholders, then
other shapes top-to-bottom and left-to-right (rows judged against the taller shape), with furniture
and position-less nodes last. Groups are ordered as units and their children in layout order.
z-order stays available in
zIndex. Behavior change: PPTX nodeorderand Markdown order change. - Type footer, date and slide-number placeholders as
footer/page_number. Their text stays in the IR; Markdown no longer renders them, and no longer renderspage_numbernodes from any format. Behavior change: the example deck loses 92 repeated footer lines and 92 slide numbers. - Cloud PPTX: carry bold, italic, underline and strike from the cloud text runs (runs are attached only when they reproduce the node text exactly), and report bounding boxes and slide sizes in points like the local parser instead of EMU. Behavior change for cloud bbox units.
- Bump the local PPTX parser to
deckparse-pptx2, the cloud adapter todeckflow-cloud2 and the Markdown renderer to 1.2.0, so cached artifacts produced by the previous versions are not reused.
- Expand cloud tables into
table_row/table_cellso Markdown renders them. The generic cloud walker emitted flat shape children that the renderer dropped, so a cloud-parsed table produced no Markdown at all. - Type cloud PPTX title placeholders as headings and text-bearing shapes as text, matching the local parser. Cloud Markdown previously carried no heading structure whatsoever.
- Stop reading a shape's preset geometry path as an asset pointer and stop descending into
prstGeom; the first raised spuriouscloud_asset_unavailablechecks for every freeform, the second created empty phantom nodes whose type merely contained "chart". - Report
embedded_object_undetectedwhen preflight finds embedded objects that the result neither represents nor reports, comparing counted chart/SmartArt parts against represented nodes. Behavior change: such results now reportdegradedrather thanpass, so--fail-on-degradedrejects them; they were previously delivered as clean. - Fetch cloud parse assets concurrently with bounded retries, matching the convert path, instead of one serial pass that lost an image on any transient error. Link parse nodes through an index rather than a linear scan of every node built so far.
-
Summarize missing/failed pages, body text, OCR/visual risks and unsupported controls; expose paid cloud recommendations independently of local/auto/cloud execution policy.
-
Preserve best-effort Markdown and optional strict gating; provide the same assessment in read, parse and convert, including cached artifacts. Local OCR remains unsupported.
-
Fix command ampersands and code fencing, report control replacement without changing IR, respect disabled DOCX strike styles, and report actual output bytes on cache hits.
-
Share immutable identical assets across candidates and selected artifacts, using atomic replacement and copy fallback. Invalidate affected DOCX parser and Markdown renderer caches.
-
Update the bundled Agent skill to consume quality reports and keep upload choices explicit.
-
Depend on the published DeckProbe 2.6.0 package; remove the temporary vendor archive and bundled dependency override.
-
Ship a DeckOps Agent Skill with format, artifact, output, recipe, and limit references for traceable document-to-knowledge workflows.
-
Add
deckops install --skillswith project/global/explicit targets, dry-run JSON receipts, managed-file hash protection, and preservation of local additions. -
Validate skill resources during checks and prepack, and verify installation from the production npm tarball.
- Default bare CLI calls now return Markdown; add
read()SDK,--format ir, JSON content envelopes and independent run reports. - Introduce evidence-based assessments, a shared capability registry, policy provenance, negative overrides, candidate comparison and a final quality gate.
- Detect sparse raster PDF pages individually; unknown/unverified remedies and visual-only warnings do not automatically upload.
- Preserve local/cloud candidates, freeze local source bytes, propagate cancellation, journal uncertain submissions and disable mutation retries.
- Integrate DeckProbe 2.6.0 bounded preflight and exact SmartArt inventory; bundle the tested upstream release snapshot for independent installs.
- Keep stdout ownership in the CLI and preserve cache/export image lifetimes.
- License DeckOps-owned code under AGPL-3.0-only from this license-change commit onward. Preserve third-party licenses and notices; already published releases through 1.1.1 remain under their original MIT license.
- Use a new major version to make the license transition explicit. No parsing API or runtime dependency changes from 1.1.1.
- Upgrade to
pdf-lite-parse@0.2.1, which embeds a fixed, allowlisted PDF.js runtime and resources instead of declaring a runtimepdfjs-distdependency. - Ordinary npm installations no longer pull in canvas for PDF parsing. Keep DeckProbe's independent optional platform CLI packages unchanged;
--omit=optionalremains available for a strict no-native installation. - Add default-install PDF smoke tests and enforce smaller installed-size budgets plus absence of separate PDF.js/canvas packages.
- Upgrade the exact
pdf-lite-parsedependency to 0.2.0. Local PDF parsing exports embedded images by default without expensive composite-figure rasterization; extractable overlay text and fidelity warnings remain visible. - Pass
includeImages: falsethrough asimages: 'none', skipping image export instead of extracting then discarding assets. - Record the actual upstream parser version in IR/manifests and invalidate pre-1.0 PDF parse caches across minor versions. Existing artifacts remain convertible.
- Retain offline operation, lazy PDF loading, resource isolation, and the strict no-native install path.
- Rename the product and its sole CLI to DeckOps /
deckops; exportDeckOpsErrorwithout a legacy alias. Historical entries below describe the former DeckParse package. - Own the required cloud transport, DTOs and regression tests directly; remove the former SDK dependency and browser patch, with no replacement shared client package.
- Separate product defaults from shared credentials and UUID, and add an explicit, repeatable
config migrateoperation that preserves existing target values and source files. - Keep DeckIR, manifest v1/v2, schema identity, parser identities and
producer.deckparseunchanged. - See
src/cloud/README.mdfor source provenance and explicit transport deltas from the previous Node distribution.
- Make the Node CLI/SDK local-first and offline by default for PDF, PPTX, DOCX and static HTML source; cloud use now requires
--engine cloudorauto --allow-upload. - Publish
deckir.v1and manifest v2, with stable source-derived ids, content-addressed assets, deterministic quality checks and optional remote references. - Add local Markdown rendering so v2 artifacts remain convertible without credentials, network access or cloud-retention limits; keep manifest v1 cloud conversion compatibility.
- Integrate
pdf-lite-parse@0.1.1lazily and map result.v3 pages, nodes, assets and warnings without reimplementing PDF parsing. - Add bounded OPC/XML DOCX/PPTX parsers, static HTML parsing, worker isolation, ZIP/XML/URL resource limits, tracked-change policy and opaque-object visibility.
- Remove
zodfrom the runtime baseline; add package/install-size checks, a strict--omit=optionalno-native path, third-party notices and Node.js 22.18 minimum. - Keep
@deckflow/deckparse/browsercloud-only and API-compatible.
- Add DeckProbe preflight (
off | validate | strict) before Node/browser uploads, defaulting CLI and both SDKs to fail-openvalidate, with target-level format, encryption, active-content, page/slide and presentation-size facts. - Persist successful local reports as
probe.json, register summaries in artifact manifests/envelopes, and exposeinspectionplusinspectionReport()on document handles. - Ship a lazy browser module Worker and DeckProbe WASM asset; add real-browser PDF preflight coverage. Node.js now requires version 20 or newer.
- Add
@deckflow/deckparse/browser: File, named Blob/binary and URL inputs; in-memory IR and Markdown results; reusable IR references. - Add task progress/status lookup, abortable requests/upload/wait, fail-closed authentication refresh and no automatic replay of task-creation POSTs.
- Preserve envelope fields, credential resolution and cloud-cache semantics;
offremains an explicit performance/CSP escape hatch and URL inputs always skip local preflight. - Extract shared runtime-independent routing, parameter mapping, format validation and error translation.
- Add DOM-only type checks, self-contained browser distribution checks and localhost HTTP/real-browser conformance fixtures.