@fenfill/mcp 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -42
- package/THIRD_PARTY_NOTICES +1 -1
- package/dist/index.js +2305 -745
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -127,28 +127,51 @@ cancelling the call ends the wait. `too_many_active_jobs` counts every running a
|
|
|
127
127
|
workspace, free native-field (AcroForm) ones included.
|
|
128
128
|
|
|
129
129
|
`fill_form` and `fill_template` take `values`, `output_path` (a new `.pdf`) and optional
|
|
130
|
-
`overwrite`. They never overwrite the input PDF.
|
|
130
|
+
`overwrite`. They never overwrite the input PDF. In `values` (here and in `preview_page`), any id
|
|
131
|
+
may be shortened to an unambiguous prefix of 4+ characters (the preview tags show 6); that goes
|
|
132
|
+
for a table's cell or column ids inside its value, and for option ids in a choice's value, too. A
|
|
133
|
+
table cell's id given at the top level goes into its table's value, and an option's id given
|
|
134
|
+
`true` selects it (a radio's value, or one more item of a multiselect's list; `false` leaves it
|
|
135
|
+
unselected). A key that matches nothing is listed in `skipped`; one that starts several ids is
|
|
136
|
+
listed with its candidates, and a nested id that can't stand alone (a comb's cell, a table_rows
|
|
137
|
+
column) names the entry it belongs to.
|
|
131
138
|
|
|
132
139
|
### Previews and corrections
|
|
133
140
|
|
|
134
141
|
`preview_page` takes `path` (an analyzed PDF) or `template_id`, a 1-based `page`, optional
|
|
135
142
|
`values` (to see them stamped; the same shapes as `fill_form`, e.g. `table_rows` =
|
|
136
143
|
`[{columnId: value}, …]`, `multiselect` = an array of option ids or labels) and `dpi` (default
|
|
137
|
-
110, max 200).
|
|
144
|
+
110, max 200). The image's longest side is capped at 2,000 px, the size clients show without
|
|
145
|
+
shrinking it, so the `width` and `height` in the result are the image the agent sees; the
|
|
146
|
+
result's `dpi` is the resolution actually rendered (a whole A4 page tops out near 171, and
|
|
147
|
+
`crop` + `zoom` give more detail). It returns a PNG image plus a legend: each box's tag, id, type, label and `box`;
|
|
138
148
|
a text/date field's stored `format` and `font_pt` (the size its value starts at; `font_auto`
|
|
139
149
|
when that follows the box height); a choice's options with their own boxes; a table's cells by
|
|
140
150
|
`(row, col)`, its `orientation` and headers (also printed on the image inside, or beside, the
|
|
141
151
|
first cell of each line as `R: …` / `C: …`; a character the bundled fonts lack is shown as `?`
|
|
142
152
|
there, with a warning, and the legend keeps the full text); a `table_rows` table's columns and printed cells
|
|
143
|
-
with their boxes (fill values still go by column id)
|
|
153
|
+
with their boxes (fill values still go by column id); every date field, table date cell and date
|
|
154
|
+
column's `date_format` (the default `DD/MM/YYYY` when none is stored); and a comb's `cell_type`,
|
|
155
|
+
`max_length`, `date_format`, and in a `crop` its `comb_cells`: each printed cell in reading order with its tag
|
|
156
|
+
(the cell's own field; `index` for one cell of a field drawn over several) and box, plus the
|
|
157
|
+
`date_part` (`D`, `M` or `Y`) each cell of a date comb holds. `warnings` and `placement_warnings` are
|
|
144
158
|
always present (`[]` = checked and clean): placement covers every box shown, so a plain preview
|
|
145
159
|
is a read-only placement audit (see the checks under `edit_template`). `crop`
|
|
146
160
|
(`{x, y, w, h}`, fractions) with `zoom` (default 2, max 8) renders just a region, magnified, and
|
|
147
|
-
lists only what it shows
|
|
161
|
+
lists only what it shows (convert a position read off a crop by proportion: `x = crop.x + crop.w ×
|
|
162
|
+
pixel x / image width`); `legend: "changed"` returns only the rows that changed since your last
|
|
148
163
|
preview of that page (the first time: since fenfill's version), each with only its changed
|
|
149
164
|
options/cells/columns (`members_changed` counts them, so a header edit doesn't list the whole
|
|
150
165
|
grid), plus `removed` ids and `moved_into` (ids that now sit inside a table or group), and
|
|
151
|
-
`legend: "none"` omits the legend.
|
|
166
|
+
`legend: "none"` omits the legend. `overlay` says what is drawn over the page: `"full"` (the
|
|
167
|
+
default), `"outline"` (the boxes without id tags and table header texts) or `"none"` (nothing:
|
|
168
|
+
the page as a fill stamps it). Since 0.2.3 the `"full"` tags keep off the printed text (read from
|
|
169
|
+
the PDF's text layer) and the stamped values: an option's tag goes below, above or on the side
|
|
170
|
+
away from its caption, and a tag with no room beside its box is moved off and joined to it by a
|
|
171
|
+
thin line. On a scan there is no text layer, so a tag may still cover print there. Use the last
|
|
172
|
+
two when an outline covers what you must read; `"none"` needs no outlined copy, so it also
|
|
173
|
+
renders after `check_copy_failed`.
|
|
174
|
+
The legend and `placement_warnings` are the same in all three. It renders the local working copy (`edit_template`) when there is one, otherwise the saved
|
|
152
175
|
template or analyzed version; `edited: true` / `false` in the result says which. The page is rendered on your machine by
|
|
153
176
|
PDFium (WebAssembly, shipped in the package; nothing native is installed), nothing is written to
|
|
154
177
|
disk, and the image goes only to the calling client.
|
|
@@ -161,7 +184,23 @@ disk, and the image goes only to the calling client.
|
|
|
161
184
|
`set_placeholder`, `set_autofill` (a browser autofill token such as `name` or `postal-code`,
|
|
162
185
|
or `null` to clear it);
|
|
163
186
|
- choices and combs: `group` (`kind: "choice" | "comb"`), `ungroup`, `set_options`, and
|
|
164
|
-
`add_option` / `remove_option`, which keep the group's id;
|
|
187
|
+
`add_option` / `remove_option`, which keep the group's id; `set_format` on a comb group takes
|
|
188
|
+
`cell_type` (`char`, `integer` or `date`) and `date_format` (one `D`, `M` or `Y` per cell, e.g.
|
|
189
|
+
`DDMMYYYY`). Giving a `date_format` makes it a date comb, and `diff_summary.ops` echoes the
|
|
190
|
+
comb's `cell_type`, `date_format` and `max_length` as a fill will read them;
|
|
191
|
+
- combs in one op (0.2.3): `add {type: "comb", page, label, cells, box?, cell_type?,
|
|
192
|
+
date_format?, section_id?, required?, description?}` makes a comb, either `box` cut into
|
|
193
|
+
`cells` equal cells, or `cells` as a list of the printed cells' own boxes (cells split by
|
|
194
|
+
printed separators, as in DD / MM / YYYY). `retype {id, type: "comb", cells, cell_type?,
|
|
195
|
+
date_format?}` turns a text or date field into a comb over its box, keeping its label,
|
|
196
|
+
section, order, `required` and description (a date field's `DD/MM/YYYY` gives `DDMMYYYY` when
|
|
197
|
+
the counts agree). `comb_add_cell {id: comb, box, date_format?}` and `comb_remove_cell {id:
|
|
198
|
+
cell, date_format?}` keep the comb's id; a date comb needs its new `date_format` with them (one
|
|
199
|
+
letter per cell). `group {kind: "comb"}` also takes `cell_type` and `date_format`, and
|
|
200
|
+
`set_format` on a comb's cell applies to its comb. A comb's cells have no label of their own;
|
|
201
|
+
- refs within a batch: give an op that adds something a `ref` (`"dob"`), and later ops of the
|
|
202
|
+
same call name what it added as `"$dob"` wherever an id goes (`set_format {id: "$dob", …}`,
|
|
203
|
+
`group {ids: ["$a", "$b"]}`). A ref of a rejected op names nothing;
|
|
165
204
|
- tables: `group` with `kind: "table"` (a `cells` grid of field ids, rows × columns with `null`
|
|
166
205
|
for a gap, or `ids` laid out from their boxes; `header_cols`, `header_rows`, `orientation`,
|
|
167
206
|
`format`), `table_insert` / `table_delete` (a row or column; a new line's geometry is
|
|
@@ -170,8 +209,22 @@ disk, and the image goes only to the calling client.
|
|
|
170
209
|
and `set_header` / `set_headers` (`{id, axis, texts: [...], start?}`, several in one op). Every cell of one column (or row, for `orientation: "row"`) has one type,
|
|
171
210
|
as in the web editor; `set_format` on a table cell applies to its whole column or row;
|
|
172
211
|
- order: `reorder {page, ids}` moves those top-level entries together, in that order, to where
|
|
173
|
-
|
|
212
|
+
whichever of them is listed first now stands (not necessarily `ids[0]`'s place); every other
|
|
213
|
+
entry keeps its relative order. A partial list moves only what it names: to put B right after
|
|
214
|
+
A, list both, and chained partial reorders are simplest replaced by one with the page's whole
|
|
215
|
+
list. It stamps an explicit `order` on every entry of the page (the web
|
|
174
216
|
editor's layer-panel convention), so a later sub-pixel move no longer reshuffles questions.
|
|
217
|
+
`diff_summary.ops` shows the `order` the page is now listed in. fenfill lists each section as
|
|
218
|
+
one run, standing where its first entry stands, so entries of different sections never stand
|
|
219
|
+
together whatever their ranks: `reorder` warns, naming the sections, when the ids did not all
|
|
220
|
+
come out as asked, and rejects such an order when it would change nothing in the listing;
|
|
221
|
+
- sections: `set_section {ids, section_id}` moves fields or groups of one page to another of
|
|
222
|
+
that page's sections (`null`: out of every section; a group moves with all its members), and
|
|
223
|
+
`set_section_title {page, section_id, title}` renames one. `get_template` and `analyze_form`
|
|
224
|
+
show each section's `section_id`. `add` without `section_id` lands in the section of the
|
|
225
|
+
nearest field at or above it, a new `group` in its earliest member's section and at that
|
|
226
|
+
member's place in the order; `diff_summary.ops` gives each one's `section`, and a `group` its
|
|
227
|
+
`members` (ids unchanged) in reading order.
|
|
175
228
|
|
|
176
229
|
Any id can be shortened to an unambiguous prefix of 6+ characters (the length of the preview
|
|
177
230
|
tags); an ambiguous prefix is rejected with the candidates. `add`, `move` and `set_box` take an
|
|
@@ -182,21 +235,51 @@ box, the box is kept and a warning says so. Snap finds printed rules with its ow
|
|
|
182
235
|
finder (one ink threshold per page, not the web editor's wand): a very faint rule on a tinted
|
|
183
236
|
scan can be missed, and an underline box is one line of handwriting tall (as tall as the clear
|
|
184
237
|
space above the rule, within about 11–16 pt). `diff_summary.ops` lists every applied op with
|
|
185
|
-
`snapped: true/false` (when it asked for a snap) and `noop: true` when it changed nothing
|
|
186
|
-
|
|
238
|
+
`snapped: true/false` (when it asked for a snap) and `noop: true` when it changed nothing; a
|
|
239
|
+
batch that leaves the form as it was writes no working copy (`has_edits` stays `false`). After
|
|
240
|
+
each edit, the boxes you touched are checked for four placement problems: a value that would
|
|
187
241
|
print much larger than the page's other fields (an Auto box's text size follows its height), a
|
|
188
|
-
box over printed text (text layer only, so not on scans), and a box
|
|
189
|
-
ruled cell it sits in (from the page render, so scans too).
|
|
242
|
+
box over printed text (text layer only, so not on scans; the covered text is quoted), and a box
|
|
243
|
+
that runs a little past the ruled cell it sits in (from the page render, so scans too). Pale text
|
|
244
|
+
printed at the left edge of a blank's row or cell is a hint and is written over ("Name",
|
|
245
|
+
"Address"); a caption printed part-way along the row is not. So a box over a pale hint at its
|
|
246
|
+
left edge (or its ruled cell's) is no misplacement: it is listed under `notes` here and
|
|
247
|
+
`placement_notes` in `preview_page`, never as a warning. Invisible text (an OCR layer over a
|
|
248
|
+
scan) counts as the print it stands for. Signature boxes get the printed-text check too. And a choice's option box is checked
|
|
249
|
+
against its caption in reading order: it warns when the box is on the other side of its caption
|
|
250
|
+
from the question's other boxes (one question never mixes sides), or when the first printed text
|
|
251
|
+
after the box (before it, for boxes printed after their captions) is another option's caption. An
|
|
252
|
+
option the form prints no box for has its box on the same side as the printed ones; when that
|
|
253
|
+
side has no room on its caption's line (its caption starts the line), the box goes in the slot
|
|
254
|
+
just before the caption in reading order, at the end of the line above, and that passes. Not on
|
|
255
|
+
scans (no text layer). `set_format` merges into the stored
|
|
190
256
|
format (a date field keeps its date format when you only set `font_size`).
|
|
191
257
|
Coordinates are fractions of the page (0–1) with a top-left origin, the same as the legend's
|
|
192
258
|
`box`. Each op is checked against the rules fenfill applies when saving and is rejected with a
|
|
193
259
|
reason if it breaks them; ops apply in order, all-or-nothing each, except that a box only has to
|
|
194
260
|
lie on the page after the whole batch (so `move` then `resize` works even if the moved box
|
|
195
|
-
overhangs the page in between). `discard: true` drops the working copy
|
|
261
|
+
overhangs the page in between). `discard: true` drops the working copy (`ops` may then be left
|
|
262
|
+
out). Labels, descriptions,
|
|
196
263
|
placeholders, options, date formats and checkbox symbols are the form's wording, never answers:
|
|
197
264
|
an op whose new wording matches an answer given to `fill_form`, `fill_template` or
|
|
198
265
|
`preview_page` in the same session is rejected before the working copy is written (wording that
|
|
199
|
-
|
|
266
|
+
holds an answer of 6+ characters, or equals one of 4–5; equal to a shorter one only warns). A
|
|
267
|
+
one-word answer is held only as a whole word, so the test value `exempt` does not flag the
|
|
268
|
+
caption `exemption`; an answer of several words, or one without letters (a number, a phone
|
|
269
|
+
number, a date), is caught wherever it occurs. An answer is known as you passed it and as the
|
|
270
|
+
page shows it: a date in its field's printed format (`1990-05-17` as `17.05.1990`), a comb's
|
|
271
|
+
characters without the separators typed between them, an answer of several lines also line by
|
|
272
|
+
line. A date written a third way (`17/05/1990`) is not recognised. The values of a fill or
|
|
273
|
+
preview that failed before the form was read (an output file that already exists, a failed
|
|
274
|
+
download) count as answers too. A comb cell's own label is never shown (the comb is listed under the
|
|
275
|
+
group's label), so a placeholder label on a cell that equals an answer of under 4 characters
|
|
276
|
+
(`D1`) passes without a warning; one equal to a longer answer, or holding one, is refused. The
|
|
277
|
+
reason names the entry and the property (a section with its page), never the text. A printed caption can share a word with a test value (`Middle name` after
|
|
278
|
+
previewing `Middle`): when the rejected wording is the form's own, send the op again with
|
|
279
|
+
`confirm_wording: true`. That lets through only wording a rejection has already named (that
|
|
280
|
+
text in that property), and what you confirmed is the wording: it is not asked about again in
|
|
281
|
+
that session, on any entry. Previewing with values that are not words printed on the form
|
|
282
|
+
avoids the round trip.
|
|
200
283
|
Once a PDF is saved as a template, `fill_form` and `preview_page` on it use only that template's
|
|
201
284
|
working copy; an older copy of its unsaved analysis is dropped.
|
|
202
285
|
|
|
@@ -204,13 +287,25 @@ working copy; an older copy of its unsaved analysis is dropped.
|
|
|
204
287
|
from: if the template changed in fenfill meanwhile, it answers `template_conflict` and keeps your
|
|
205
288
|
local edits. Before anything is sent, it refuses wording that matches an answer given to
|
|
206
289
|
`fill_form`, `fill_template` or `preview_page` in the same session (that list lives only in
|
|
207
|
-
memory)
|
|
208
|
-
|
|
209
|
-
|
|
290
|
+
memory): `answer_in_template` lists the matched ids and properties in `matched`, never their
|
|
291
|
+
text (a section comes with its `page`, since section ids repeat from page to page). Fix an
|
|
292
|
+
answer with `edit_template`; when the wording is the form's own, call again with
|
|
293
|
+
`confirm_wording: true`, and the save names what it sent on your confirmation in `warnings`.
|
|
294
|
+
An entry no error has listed yet is refused and listed first, even with the flag set; an entry
|
|
295
|
+
listed for one template is not thereby listed for another. A working
|
|
296
|
+
copy edited in an earlier session can't be checked against that session's answers:
|
|
297
|
+
`save_template` then answers `confirm_wording_needed` with the changed ids and properties (never
|
|
298
|
+
their text); review them and call again with `confirm_wording: true` (the flag on the first
|
|
299
|
+
call gets the list first, too, and so does a copy whose wording changed after the list was
|
|
300
|
+
sent). An
|
|
210
301
|
unsaved analysis can be edited for filling but not saved: to keep corrections,
|
|
211
302
|
analyze with `save_as_template: true` and edit that template. With nothing to save, it succeeds
|
|
212
|
-
with `saved: false, nothing_to_save: true`. `get_template`
|
|
213
|
-
|
|
303
|
+
with `saved: false, nothing_to_save: true`. `get_template` lists the fields in `sections`, in fenfill's order: one
|
|
304
|
+
block per section (with its `section_id` and `title`), and fields in no section as blocks of
|
|
305
|
+
their own where they stand. With local edits it lists the working copy, as `fill_template` and
|
|
306
|
+
`preview_page` use it (`edited: true`, `has_local_edits: true`): new option ids, deleted rows,
|
|
307
|
+
sections and order show before you save; `version: "saved"` lists fenfill's saved version
|
|
308
|
+
instead (`edited: false`). It gives `field_count`
|
|
214
309
|
(entries listed) and `field_count_total` (the whole form); `save_template`'s `field_count` is
|
|
215
310
|
the whole saved template.
|
|
216
311
|
|
|
@@ -247,7 +342,7 @@ same run at no extra charge.
|
|
|
247
342
|
| Field type | Value |
|
|
248
343
|
| ------------------- | --------------------------------------------------------------------------- |
|
|
249
344
|
| `text`, `multiline` | string, stamped exactly as given |
|
|
250
|
-
| `comb` | string, one character per cell
|
|
345
|
+
| `comb` | string, one character per cell (a date comb: below) |
|
|
251
346
|
| `date` | `"YYYY-MM-DD"`, printed in the field's `date_format` (e.g. `DD/MM/YYYY`) |
|
|
252
347
|
| `checkbox` | `true` / `false` |
|
|
253
348
|
| `radio` | option id, option label, or the bare option text (`"No"` for `"Smoke? No"`) |
|
|
@@ -256,6 +351,11 @@ same run at no extra charge.
|
|
|
256
351
|
| `table_rows` | `[{ "<columnId>": value, … }, …]` |
|
|
257
352
|
| `signature` | `{ "image_path": "/abs/path/signature.png" }` (PNG or JPG) |
|
|
258
353
|
|
|
354
|
+
A date comb (`cell_type: "date"`) takes the whole date as one string, never cell by cell:
|
|
355
|
+
`"YYYY-MM-DD"`, laid out by its `date_format` (`DDMMYYYY` writes `17052024`), or exactly its
|
|
356
|
+
`max_length` digits in the printed order. The preview legend lists a comb's `cell_type`,
|
|
357
|
+
`max_length`, `date_format` and cells.
|
|
358
|
+
|
|
259
359
|
A date the form asks for in a plain `text` field is not reformatted: write it the way the field's
|
|
260
360
|
label or placeholder asks (for example `10042026` for "mmddyyyy"). A `signature` whose
|
|
261
361
|
`signing_requirement` is `"external"` is signed outside fenfill (on paper, or with an e-signature
|
|
@@ -288,7 +388,8 @@ fenfill web app for that workspace (for example, your logo if you have set one u
|
|
|
288
388
|
your user) holds form schemas, blank template PDFs, the workspace logo, sha256 hashes of the
|
|
289
389
|
PDFs it produced and `edit_template`'s working copies, **never the answers you fill in**. A
|
|
290
390
|
working copy holds the layout plus the wording the agent wrote with `edit_template`; the echo
|
|
291
|
-
guard refuses wording that repeats an answer seen in the same session before it is written
|
|
391
|
+
guard refuses wording that repeats an answer seen in the same session before it is written,
|
|
392
|
+
unless the agent, told which property matched, confirms that it is the form's own wording.
|
|
292
393
|
- **Cache cleanup:** at startup and at most once a day it deletes blank PDFs and the logo after
|
|
293
394
|
1 hour, analyses and working copies unused for 90 days, stale job records after 48 hours, and
|
|
294
395
|
output hashes after a year.
|
|
@@ -301,28 +402,28 @@ fenfill web app for that workspace (for example, your logo if you have set one u
|
|
|
301
402
|
|
|
302
403
|
## Troubleshooting
|
|
303
404
|
|
|
304
|
-
| Error | What to do
|
|
305
|
-
| ------------------------------------- |
|
|
306
|
-
| `missing_api_key` / `invalid_api_key` | Set `FENFILL_API_KEY` in the client's config and restart the client.
|
|
307
|
-
| `plan_required` | The workspace needs a paid plan (Pro and up).
|
|
308
|
-
| `insufficient_scans` | Not enough page scans left; analyze fewer `pages` or check `get_account`.
|
|
309
|
-
| `prefilled_form` / `filled_output` | Only blank forms can be analyzed; use the original, empty PDF. If it is the blank form (some ship with default text in their fields), use the fenfill web app.
|
|
310
|
-
| `pdf_password_required` | Remove the open password first; owner-password PDFs work as they are.
|
|
311
|
-
| `pdf_fill_forbidden` | The PDF's author forbids form filling; fenfill won't fill it. Use a copy that allows filling.
|
|
312
|
-
| `not_analyzed` | Run `analyze_form` on the same file (and pages) before `fill_form`.
|
|
313
|
-
| `output_exists` | Pick a new `output_path` or pass `overwrite: true`.
|
|
314
|
-
| `rate_limited` / `queue_full` | `analyze_form` already waited about a minute (`waited_s`); try again later.
|
|
315
|
-
| `too_many_active_jobs` | Other analyses in the workspace (free native-field ones too) are still running; try again in a minute, or analyze fewer at once.
|
|
316
|
-
| `template_conflict` | The template changed in fenfill since your edits began. Your local edits are kept: `edit_template` with `discard: true`, re-apply the ops, save again.
|
|
317
|
-
| `invalid_schema` | fenfill (or the local check before it) refused the edited layout; `details` lists each item and reason. Fix them with `edit_template`.
|
|
318
|
-
| `check_copy_failed` | `preview_page` could not build its outlined copy; `stage` and `id` say where. Fix or remove that field or group with `edit_template`, then preview again.
|
|
319
|
-
| `request_too_large` | The edited template is too large to save in one request.
|
|
320
|
-
| `answer_in_template` | Edited wording matches an answer from this session, so nothing was sent.
|
|
321
|
-
| `confirm_wording_needed` | The working copy has wording edited in an earlier session. Review the ids and properties in `changed`, then `save_template` with `confirm_wording: true`.
|
|
322
|
-
| `local_edits_pending` | `reanalyze_template` won't run over unsaved edits: `save_template` them first, or pass `discard: true`.
|
|
323
|
-
| `kind_required` | The pages already have fields: pass `kind` (`find`, `relabel`, `label_missing`, or `scratch` to replace them).
|
|
324
|
-
| `job_in_progress` | A job is already running on the template; wait and retry (call `reanalyze_template` again with the same arguments if you started it).
|
|
325
|
-
| `upload_outcome_unknown` | An earlier upload was interrupted. To avoid charging twice, the same file isn't re-uploaded for about 10 minutes; check `get_account` meanwhile.
|
|
405
|
+
| Error | What to do |
|
|
406
|
+
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
407
|
+
| `missing_api_key` / `invalid_api_key` | Set `FENFILL_API_KEY` in the client's config and restart the client. |
|
|
408
|
+
| `plan_required` | The workspace needs a paid plan (Pro and up). |
|
|
409
|
+
| `insufficient_scans` | Not enough page scans left; analyze fewer `pages` or check `get_account`. |
|
|
410
|
+
| `prefilled_form` / `filled_output` | Only blank forms can be analyzed; use the original, empty PDF. If it is the blank form (some ship with default text in their fields), use the fenfill web app. |
|
|
411
|
+
| `pdf_password_required` | Remove the open password first; owner-password PDFs work as they are. |
|
|
412
|
+
| `pdf_fill_forbidden` | The PDF's author forbids form filling; fenfill won't fill it. Use a copy that allows filling. |
|
|
413
|
+
| `not_analyzed` | Run `analyze_form` on the same file (and pages) before `fill_form`. |
|
|
414
|
+
| `output_exists` | Pick a new `output_path` or pass `overwrite: true`. |
|
|
415
|
+
| `rate_limited` / `queue_full` | `analyze_form` already waited about a minute (`waited_s`); try again later. |
|
|
416
|
+
| `too_many_active_jobs` | Other analyses in the workspace (free native-field ones too) are still running; try again in a minute, or analyze fewer at once. |
|
|
417
|
+
| `template_conflict` | The template changed in fenfill since your edits began. Your local edits are kept: `edit_template` with `discard: true`, re-apply the ops, save again. |
|
|
418
|
+
| `invalid_schema` | fenfill (or the local check before it) refused the edited layout; `details` lists each item and reason. Fix them with `edit_template`. |
|
|
419
|
+
| `check_copy_failed` | `preview_page` could not build its outlined copy; `stage` and `id` say where. Fix or remove that field or group with `edit_template`, then preview again; `overlay: "none"` still shows the page meanwhile. |
|
|
420
|
+
| `request_too_large` | The edited template is too large to save in one request. |
|
|
421
|
+
| `answer_in_template` | Edited wording matches an answer from this session, so nothing was sent; `matched` lists the ids and properties. An answer: put the form's own wording back with `edit_template`. The form's own wording: `save_template` again with `confirm_wording: true`. |
|
|
422
|
+
| `confirm_wording_needed` | The working copy has wording edited in an earlier session. Review the ids and properties in `changed`, then `save_template` with `confirm_wording: true`. |
|
|
423
|
+
| `local_edits_pending` | `reanalyze_template` won't run over unsaved edits: `save_template` them first, or pass `discard: true`. |
|
|
424
|
+
| `kind_required` | The pages already have fields: pass `kind` (`find`, `relabel`, `label_missing`, or `scratch` to replace them). |
|
|
425
|
+
| `job_in_progress` | A job is already running on the template; wait and retry (call `reanalyze_template` again with the same arguments if you started it). |
|
|
426
|
+
| `upload_outcome_unknown` | An earlier upload was interrupted. To avoid charging twice, the same file isn't re-uploaded for about 10 minutes; check `get_account` meanwhile. |
|
|
326
427
|
|
|
327
428
|
## API
|
|
328
429
|
|
package/THIRD_PARTY_NOTICES
CHANGED