@uipath/skills 1.198.0-preview.21 → 1.198.1

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.
@@ -9,7 +9,7 @@
9
9
  "name": "uipath",
10
10
  "source": "./",
11
11
  "description": "UiPath plugin for Claude Code — custom skills, agents, hooks, and MCP servers for UiPath workflows, UI automation, UI testing and UiPath troubleshoot",
12
- "version": "1.198.0",
12
+ "version": "1.198.1",
13
13
  "author": {
14
14
  "name": "UiPath"
15
15
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uipath",
3
- "version": "1.198.0",
3
+ "version": "1.198.1",
4
4
  "description": "UiPath plugin for Claude Code — custom skills, agents, hooks, and MCP servers for UiPath RPA workflows, UI automation, UI testing, Python coded agents and UiPath troubleshoot",
5
5
  "author": {
6
6
  "name": "UiPath"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/skills",
3
- "version": "1.198.0-preview.21",
3
+ "version": "1.198.1",
4
4
  "description": "UiPath agent skills for Claude Code, Codex, Cursor, Copilot, Gemini and OpenCode — RPA, UI automation, UI testing, coded agents/apps/workflows, and troubleshooting. Distributed as the UiPath Claude Code plugin.",
5
5
  "author": {
6
6
  "name": "UiPath"
@@ -19,6 +19,8 @@ Data Fabric does NOT behave like a typical RDBMS. These differences trip up agen
19
19
  7. **Aggregates require server-side `aggregates` + `groupBy`.** Don't fetch raw rows and `.length` / `.reduce` client-side — every list call returns one page (see [pagination.md](pagination.md)) and you'll silently truncate. Use `{ aggregates: [{ function: EntityAggregateFunction.Count, field: 'Id' }] }` (string literal `'COUNT'` works equivalently).
20
20
  8. **`field.fieldDataType` is an OBJECT, not a string.** It's `{ name: 'DECIMAL', lengthLimit?: ..., maxValue?: ..., ... }`. Code like `String(field.fieldDataType).toUpperCase()` produces `"[object Object]"` and silently rejects every field. Always read `field.fieldDataType?.name`. Same applies to `field.fieldDisplayType` — but that one IS a plain string enum (`'ChoiceSetSingle'`, `'File'`, etc.).
21
21
  9. **File-type fields (`fieldDisplayType === 'File'`) aren't strings.** The record carries only metadata (`{ id, name, size, contentType }`); stringifying gives `"[object Object]"`. To display, call `entities.downloadAttachment(entityId, recordId, fieldName)` → `Blob` → `URL.createObjectURL` for an `<img src>`. **Neither `contentType` nor filename extension is reliable for detecting kind** — DF often returns `application/octet-stream`, and the stored `name` is frequently a bare UUID with no extension. To decide whether to render inline or fall back to a download link, either (a) sniff the blob's magic bytes after download (PNG starts `89 50 4E 47`, JPEG `FF D8 FF`, GIF `47 49 46 38`, PDF `25 50 44 46`, etc.), or (b) optimistically attempt `<img src={objectUrl}>` and swap to a download link in `onError`. Writes: `uploadAttachment(entityId, recordId, fieldName, file)`, not `insertRecordById` / `updateRecordById`.
22
+ 10. **`MULTILINE_MAX` fields return a size marker on list/query reads.** `getAllRecords` / `queryRecordsById` return a string starting `HasValue=true Length=N` (live form: `"HasValue=true Length=20000 — call Get Entity Record By Id activity to retrieve content"`), never the content — only `getRecordById` returns the full value (SDK 1.5.2+, v2 read endpoint). Never render or persist the marker as data, and never echo it back through `updateRecordById` / `updateRecordsById` — the server accepts it as a normal value and silently destroys the real content; omit the key instead. The type accepts no filters or `sortOptions` (server 400: *"Field '<name>' is of type MULTILINE_MAX and cannot be used in filters."*). `lengthLimit` is a UTF-16 **byte** budget (max 131072 ≈ 65,536 chars).
23
+
22
24
  ## Scopes
23
25
 
24
26
  - Schema reads: `DataFabric.Schema.Read`
@@ -67,7 +69,7 @@ import type {
67
69
 
68
70
  ```typescript
69
71
  import {
70
- EntityFieldDataType, // UUID, STRING, INTEGER, DATETIME, DATETIME_WITH_TZ, DECIMAL, FLOAT, DOUBLE, DATE, BOOLEAN, BIG_INTEGER, MULTILINE_TEXT
72
+ EntityFieldDataType, // UUID, STRING, INTEGER, DATETIME, DATETIME_WITH_TZ, DECIMAL, FLOAT, DOUBLE, DATE, BOOLEAN, BIG_INTEGER, MULTILINE_TEXT, MULTILINE_MAX (SDK 1.5.2+)
71
73
  EntityType, // Entity, ChoiceSet, InternalEntity, SystemEntity
72
74
  FieldDisplayType, // Basic, Relationship, File, ChoiceSetSingle, ChoiceSetMultiple, AutoNumber
73
75
  LogicalOperator, // And, Or
@@ -292,26 +292,32 @@ The user can adjust type, priority, or title (the title carries the area / optio
292
292
 
293
293
  ### Step 4 -- Send feedback
294
294
 
295
+ **Never inline the multi-line description as a `--description "…"` argument.** On Windows PowerShell the native-command argument serializer mangles multi-line values (lines starting with `-` reach the CLI as options → `ValidationError`). Always pass the body through `--description-file`.
296
+
297
+ 1. Write the sanitized description body to a temp file using the **Write tool** (not a shell heredoc — heredocs are bash-only and fail on PowerShell). Use an absolute path in the OS temp dir, e.g. `<temp>/uip-feedback/description.md`.
298
+ 2. Invoke the CLI with `--description-file` pointing at that file:
299
+
295
300
  ```bash
296
301
  uip feedback send \
297
302
  --type "<bug|improvement>" \
298
303
  --title "<TITLE>" \
299
- --description "$(cat <<'FEEDBACK_EOF'
300
- <DESCRIPTION_BODY>
301
- FEEDBACK_EOF
302
- )" \
304
+ --description-file "<TEMP>/uip-feedback/description.md" \
303
305
  --priority "<critical|normal|minor>" \
304
306
  --attachment <FILE1> <FILE2> \
305
307
  --output json
306
308
  ```
307
309
 
308
- The title's leading `[Tag]` segments (the area, plus an optional `[CLI]`/`[Skill]` marker) become Jira labels automatically -- no extra flags.
310
+ `--description-file` reads the body from disk, so it is immune to shell quoting and works identically on PowerShell, cmd, and bash. (If the CLI predates this flag, pipe the body via stdin instead; do not inline it.)
311
+
312
+ The title (`--title`) is short and single-line, so passing it inline is safe. Its leading `[Tag]` segments (the area, plus an optional `[CLI]`/`[Skill]` marker) become Jira labels automatically -- no extra flags.
309
313
 
310
314
  If an email is available from `uip login status`, include `--email "<EMAIL>"`. The CLI places it in the issue's Environment field, never in the description body.
311
315
 
312
316
  Parse the JSON output. On success, show the user a confirmation with any reference ID returned.
313
317
 
314
- **Fallback:** If `uip feedback send` fails (network, auth, CLI error), save the full feedback to `./feedback-report.md` using the description body and tell the user: _"Could not send automatically. The report is saved to `feedback-report.md`."_
318
+ **Diagnose failures correctly.** A `ValidationError` that names an option you did not pass (e.g. it complains about `-` or a bullet line) is a **shell-quoting** failure, not a CLI bug you inlined a multi-line value. Fix it by using `--description-file`; do not report the CLI as broken and do not retry the same inline invocation.
319
+
320
+ **Fallback:** Only after `--description-file` genuinely fails (network, auth, real CLI error) save the full feedback to `./feedback-report.md` using the description body and tell the user: _"Could not send automatically. The report is saved to `feedback-report.md`."_
315
321
 
316
322
  Clean up temp attachments:
317
323
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: uipath-ixp
3
- description: "UiPath IXP (Document Understanding) via `uip ixp` — create projects (with autopilot taxonomy suggestion, an imported taxonomy file, or empty), upload/download/delete documents, author the taxonomy (field groups, fields, data types, per-field and overall extraction instructions), configure the extraction model and pre-processing, review/confirm/unconfirm predictions, mark fields missing, pull metrics and model versions, publish/tag/roll back model versions. For IxP nodes or model listings inside a .flow / Maestro flow→uipath-maestro-flow."
3
+ description: "UiPath IXP (Document Understanding) via `uip ixp` — create projects (with autopilot taxonomy suggestion, an imported taxonomy file, or empty), upload/download/delete documents, author the taxonomy (field groups, fields, data types, per-field and overall extraction instructions), configure the extraction model and pre-processing, review/confirm/unconfirm predictions, mark fields missing, pull metrics and model versions, publish/tag/roll back model versions. DO NOT TRIGGER during .flow / Maestro Flow work — discovering or listing IxP / document-extraction models, extractors, or nodes available to Maestro Flow, and adding or wiring an IxP node, belong to uipath-maestro-flow even when they sound like IXP model management."
4
4
  ---
5
5
 
6
6
  # UiPath IXP Document Extraction Assistant
@@ -70,7 +70,7 @@ If the user provides a taxonomy file, use `--skip-taxonomy` and `import-taxonomy
70
70
  | "Import this taxonomy" / provides a taxonomy file | [Project Setup Guide](references/project-setup-guide.md) — Option B (`--skip-taxonomy` + `import-taxonomy`) |
71
71
  | "Label documents" / "Review predictions" | [Label Documents Guide](references/label-documents-guide.md) |
72
72
  | "Improve scores" / "Fix prompts" / "Improve F1" | [Improve Prompts Guide](references/improve-prompts-guide.md) |
73
- | "Publish the model" / "Tag as live" | `uip ixp projects publish <project-name> --output json` — publishes the latest version, untagged. Add `--tag <live\|staging>` to also tag it. See [cli-reference](references/cli-reference.md) for `--model-version`/`--description`. |
73
+ | "Publish the model" / "Tag as live" | `uip ixp projects publish <project-name> --output json` — publishes the latest version, untagged. Add `--tag <live\|staging>` to also tag it. See [cli-reference](references/cli-reference.md) for `--model-version`/`--description`. **Publishing does not deploy the model to an Orchestrator folder** — folder/environment binding is a product-side step with no `uip ixp` (or other CLI) equivalent, so publishing is the last step this skill performs. Don't chain a folder deployment onto it, deploy locally, or improvise another path. Only when the user explicitly asks to deploy to a folder/environment do you hand that back to them (it's done in-product) — see the "Deploy this model" row under [Unsupported Capabilities](#unsupported-capabilities). Deploying to a folder is what makes the model available to downstream consumers such as Maestro Flow. |
74
74
  | "Roll back to a previous version" / "Restore version N" | `uip ixp projects publish <project-name> --model-version <N> --output json` — re-publishes an earlier version. Get available versions from `uip ixp projects list-models <project-name> --output json`. |
75
75
  | "Unpublish a model" / "Take a model out of production" | `uip ixp projects unpublish <project-name> --model-version <N> --output json` — removes a version from the published set (it stays trained/listable). `--model-version` is required; find published versions via `list-models` (`Pinned: true`). To change which version is live, `publish` a different one instead. |
76
76
  | "Remove the live/staging tag" / "Untag a version" | `uip ixp projects untag <project-name> --tag <live\|staging> --output json` — removes the named tag (the version it pointed at stays published). **`untag` is the only way to remove a tag** — do NOT `unpublish` or re-`publish` to clear it (`unpublish` removes publication, not the tag; `publish` without `--tag` leaves the existing tag untouched). To switch `live`→`staging`, `publish --tag staging` instead. |
@@ -129,7 +129,7 @@ Structural edits to a field within an existing field group. For instruction-only
129
129
 
130
130
  ## Deployments
131
131
 
132
- For working with runtime (deployed) IXP models — separate from the training workflow above.
132
+ For working with runtime (deployed) IXP models — separate from the training workflow above. The `uip ixp` publish and tag commands operate within the project; they do **not** deploy a model to an Orchestrator folder. Making a model available to downstream consumers such as Maestro Flow requires deploying it to a folder — a separate, product-side step done by the user in-product.
133
133
 
134
134
  | Command | Description |
135
135
  |---------|-------------|
@@ -161,6 +161,8 @@ Respond that the operation is not supported. Do not try to work around it.
161
161
 
162
162
  20. **`records import` does not support complex field types — surface this to the user before invoking.** `records import` accepts Basic types only — `CHOICE_SET_SINGLE`, `CHOICE_SET_MULTIPLE`, `RELATIONSHIP`, `FILE`, and `AUTO_NUMBER` are **not supported**. The CSV header is accepted but the column values are ignored (no error, no `ErrorFileLink` entry — `null` in every row, or row failure if the field is `isRequired` without a `defaultValue`). Sequence: (1) run `entities get <entity-id>` and list every field whose type is in the unsupported set above; (2) tell the user verbatim which columns are not supported by import and why; (3) offer the alternative — `records insert --file <json>` with a JSON-array body handles all types except `FILE` (use `files upload` for those — Rule 6). See [`records-query.md` → Writing choice-set and relationship values](records-query.md#writing-choice-set-and-relationship-values) for the value form; (4) only invoke `records import` after the user confirms they accept the unsupported columns being skipped OR want to switch to `records insert`. This is platform behavior, not a bug — do not attempt to work around it.
163
163
 
164
+ 21. **`MULTILINE_MAX` fields — marker reads, no filter/sort.** `records list` / `records query` return a size marker starting `HasValue=true Length=N` (live form: `"HasValue=true Length=20000 — call Get Entity Record By Id activity to retrieve content"`) for `MULTILINE_MAX` fields, never the content — full value only via `records get <entity-id> <record-id>`. Never display or persist the marker as data; never echo it back through `records update` — the server accepts it as a normal value and silently destroys the real content; omit the key instead. The type takes no filter or sort — 400: *"Field '<name>' is of type MULTILINE_MAX and cannot be used in filters."* / *"Sort field '<name>' … cannot be used for sorting."*; surface verbatim (Rule 18). Capacity: `lengthLimit` is a UTF-16 **byte** budget (max 131072 ≈ 65,536 chars). A 400 on `entities create` / `addFields` naming this type: surface it verbatim, don't retry or silently substitute `MULTILINE_TEXT` (Rule 18). Full contract: [`entity-schema.md` → MULTILINE_MAX fields](entity-schema.md#multiline_max-fields) + [`records-query.md`](records-query.md#multiline_max-fields--marker-vs-full-content).
165
+
164
166
  ---
165
167
 
166
168
  ## Tool Version Requirements
@@ -169,7 +171,8 @@ Respond that the operation is not supported. Do not try to work around it.
169
171
  |---------|--------------------------------------|
170
172
  | `entities` / `records` CRUD, `query` with filters/sort, `records import`, `files` | `0.9.0+` |
171
173
  | Server-side `aggregates` and `groupBy` on `records query` | `1.0.1+` |
172
- | `--folder-key` threaded through every entity/record/file/choice-set command + `--include-folders` on `entities list` / `choice-sets list` | `1.197.0+` (currently on `alpha` dist-tag; falls into `latest` once promoted — install with `uip tools install @uipath/data-fabric-tool@alpha` until then) |
174
+ | `--folder-key` threaded through every entity/record/file/choice-set command + `--include-folders` on `entities list` / `choice-sets list` | `1.197.0+` (now on `latest`) |
175
+ | `MULTILINE_MAX` field type (schema create + full-content `records get`) | `1.198.0+` (first version bundling SDK `1.5.2`). Not yet on `latest` (still `1.197.0`, whose bundle predates the type) — until promoted, install the preview: `uip tools install @uipath/data-fabric-tool@1.198.0-preview.80` |
173
176
 
174
177
  Upgrade with `uip tools install @uipath/data-fabric-tool@latest` when a feature appears to silently no-op (e.g. aggregate body keys returning raw record lists).
175
178
 
@@ -339,6 +342,9 @@ Pass the query body via `--body` or `--file`; pagination uses `--limit` / `--cur
339
342
  | `unknown option '--folder-key'` or `unknown option '--include-folders'` | Installed `@uipath/data-fabric-tool` predates `1.197.0` (folder-key fan-out) | Upgrade: `uip tools install @uipath/data-fabric-tool@alpha` until `1.197.0+` is promoted to `latest`. See *Tool Version Requirements* |
340
343
  | `--folder-key and --include-folders are mutually exclusive` | Both flags passed on `entities list` / `choice-sets list` | Pick one: `--folder-key <key>` for a single folder, OR `--include-folders` for tenant + every folder you can see |
341
344
  | Entity / choice set just created via `--folder-key <X>` doesn't appear in `entities list` / `choice-sets list` | Lists default to tenant-only | Re-run with `--folder-key <X>` (same key) or `--include-folders` |
345
+ | `MULTILINE_MAX` field shows `HasValue=true Length=N — call Get Entity Record By Id …` in `records list` / `query` | Expected — list/query return a size marker, not content (Rule 21) | Full value via `records get <entity-id> <record-id>`. Never persist or write back the marker |
346
+ | *"Field '<name>' is of type MULTILINE_MAX and cannot be used in filters."* / *"Sort field '<name>' … cannot be used for sorting."* (400) | Type supports no filter/sort operators (Rule 21) | Surface verbatim; offer `records get` + client-side evaluation only with user approval |
347
+ | Insert rejected: *"value … is N bytes, exceeds the 131072-byte limit configured for this MULTILINE_MAX field"* | `lengthLimit` is a UTF-16 **byte** budget — 2 bytes per char, so 131072 ⇒ ~65,536 chars max | Surface the limit; ask the user whether to truncate or store elsewhere — never silently clamp (Rule 18) |
342
348
 
343
349
  ---
344
350
 
@@ -32,6 +32,7 @@ Pass the exact `EntityFieldDataType` UPPERCASE string — CLI is case-sensitive.
32
32
  |---|---|---|
33
33
  | `STRING` | NVARCHAR | Short text (≤4000 chars via `lengthLimit`) |
34
34
  | `MULTILINE_TEXT` | NVARCHAR(MAX) | Long text (≤10000 chars via `lengthLimit`) |
35
+ | `MULTILINE_MAX` | NVARCHAR(MAX) | Very large text (`lengthLimit` = UTF-16 byte budget, 1–131072; default 128 KB ≈ 65,536 chars max). No filter/sort; list/query reads return a size marker — see [MULTILINE_MAX fields](#multiline_max-fields) |
35
36
  | `DECIMAL` | DECIMAL | All numbers — `decimalPrecision: 0` for whole; `2` for money |
36
37
  | `BOOLEAN` | BIT | true/false |
37
38
  | `DATE` | DATE | Date only |
@@ -62,7 +63,7 @@ CLI needs UPPERCASE enum. Users write mixed-case + synonyms. Two paths:
62
63
 
63
64
  | User phrasing | Ask |
64
65
  |---|---|
65
- | `text` / `long text` / `paragraph` | `STRING` vs `MULTILINE_TEXT` — expected length? |
66
+ | `text` / `long text` / `paragraph` / `document body` | `STRING` (≤4000) vs `MULTILINE_TEXT` (≤10000) vs `MULTILINE_MAX` (up to ≈65,536 chars, but no filter/sort see [MULTILINE_MAX fields](#multiline_max-fields)) — expected length? |
66
67
  | `number` / `int` / `integer` / `float` / `double` | `DECIMAL` — how many decimal places? (`0` for whole, `2` for money) |
67
68
  | `money` / `price` / `amount` | Default `DECIMAL` with `decimalPrecision: 2`; confirm |
68
69
  | `timestamp` / `datetime` | Default `DATETIME_WITH_TZ`; confirm |
@@ -74,6 +75,24 @@ CLI needs UPPERCASE enum. Users write mixed-case + synonyms. Two paths:
74
75
 
75
76
  If the CLI rejects a `--body` with *"Cannot read properties of undefined (reading 'sqlTypeName')"*, the `type` value didn't match a known enum — almost always a casing issue. Re-emit with the exact UPPERCASE value from the table above.
76
77
 
78
+ ### MULTILINE_MAX fields
79
+
80
+ Very large text. Contract differs from `MULTILINE_TEXT`:
81
+
82
+ 1. **Not filterable, not sortable.** Any `queryFilters` or `sortOptions` entry naming a `MULTILINE_MAX` field → 400: *"Field '<name>' is of type MULTILINE_MAX and cannot be used in filters."* / *"Sort field '<name>' is of type MULTILINE_MAX and cannot be used for sorting."* Never offer the field in filter/sort predicates. See [filter contract](filter-platform-contract.md#operator-support-by-field-type).
83
+ 2. **List/query reads return a size marker, not content.** `records list` / `records query` return a string starting `HasValue=true Length=N` (live form: `"HasValue=true Length=20000 — call Get Entity Record By Id activity to retrieve content"`); only `records get <entity-id> <record-id>` returns the full value. Read + write-back rules in [records-query.md → MULTILINE_MAX fields](records-query.md#multiline_max-fields--marker-vs-full-content).
84
+ 3. **On a 400 from `entities create` / `addFields` naming the type**, surface the error verbatim — do NOT retry or silently substitute `MULTILINE_TEXT` (Rule 18).
85
+
86
+ Needs `@uipath/data-fabric-tool` `1.198.0+` (see data-fabric.md → Tool Version Requirements).
87
+
88
+ ```bash
89
+ uip df entities create "Documents" \
90
+ --body '{"fields":[{"fieldName":"Title","type":"STRING","isRequired":true},{"fieldName":"Body","type":"MULTILINE_MAX"}]}' \
91
+ --output json
92
+ ```
93
+
94
+ `lengthLimit` optional: UTF-16 **byte** budget, 1–131072; omitted → 131072 (platform max ≈ 65,536 chars — verified: 65,536-char insert succeeds, 65,537 rejected with *"value … is 131074 bytes, exceeds the 131072-byte limit"*).
95
+
77
96
  ## Field Definition Object
78
97
 
79
98
  ### Name Validation
@@ -122,7 +141,7 @@ Accepted on `entities create` and on `addFields` / `updateFields` in `entities u
122
141
 
123
142
  | Constraint | Allowed type | Range |
124
143
  |------------|--------------|-------|
125
- | `lengthLimit` | `STRING` (1–4000), `MULTILINE_TEXT` (1–10000) | — |
144
+ | `lengthLimit` | `STRING` (1–4000), `MULTILINE_TEXT` (1–10000), `MULTILINE_MAX` (1–131072 — UTF-16 **bytes**, ≈ 2 per char: 131072 ⇒ 65,536 chars max) | — |
126
145
  | `maxValue` / `minValue` | `DECIMAL` | ±9,007,199,254,740,991 |
127
146
  | `decimalPrecision` | `DECIMAL` — `0` whole, `2` money | 0–10 |
128
147
 
@@ -50,6 +50,8 @@ Build only within this matrix (✅ supported). The API *runs* some ❌ cells any
50
50
 
51
51
  Complex-field values: **Choice Set** — the integer `NumberId` (multi: `=` takes a sorted JSON-array string `"[1,3]"`, `contains` takes a bare id `"3"`). **Relationship** — the target record's UUID `Id`.
52
52
 
53
+ **`MULTILINE_MAX` is outside the matrix entirely** — the Text / Multiline column does NOT cover it. No operator is supported (including is-empty), and no `sortOptions`: server rejects with 400 — *"Field '<name>' is of type MULTILINE_MAX and cannot be used in filters."* / *"Sort field '<name>' is of type MULTILINE_MAX and cannot be used for sorting."* Don't offer the field in filter/sort; if the user asks, surface the limitation and (only with their approval) fetch full values via `records get` and evaluate client-side.
54
+
53
55
  ## Unsupported operator, or missing value
54
56
 
55
57
  If a request needs an out-of-matrix operator/type combo (or an operator outside the list above — `BETWEEN`, regex, `like`), or an operator other than is-empty/not-empty has no value, **don't silently run it**. Ask the user to either **(a)** run the query without that filter, or **(b)** supply a supported one — then apply only their choice, never a default. Compositions often help: `BETWEEN x AND y` → `>=` + `<=` in one `queryFilters` (`logicalOperator: 0`); regex → `contains` / `startswith` / `endswith`.
@@ -16,6 +16,18 @@ Response wrapper: `{ Result, Code: "RecordList" | "RecordQuery", Data: { Items,
16
16
  - **`Data.NextCursor` is an object `{ "Value": "<base64-string>" }`, not a flat string.** Pass `Data.NextCursor.Value` to `--cursor` on the next call (unwrap one level). Passing the whole `NextCursor` object errors out.
17
17
  - Use `Data.HasNextPage` to check if more records exist. Stop when it's `false`.
18
18
 
19
+ ## MULTILINE_MAX Fields — Marker vs Full Content
20
+
21
+ `records list` and `records query` do NOT return `MULTILINE_MAX` content. Each such field comes back as a size marker string starting `HasValue=true Length=N` — live form: `"HasValue=true Length=20000 — call Get Entity Record By Id activity to retrieve content"`. Only single-record read returns the full content:
22
+
23
+ ```bash
24
+ uip df records get <entity-id> <record-id> --output json
25
+ ```
26
+
27
+ 1. **Never treat the marker as the value.** Don't display, compare, or persist `"HasValue=true Length=N"` as field content — fetch via `records get` first.
28
+ 2. **Never write the marker back.** A `records update` body built by echoing a record from `list` / `query` overwrites the real content with the literal marker string — verified: the server accepts it as a normal value, `Result: Success`, content silently destroyed. Omit `MULTILINE_MAX` keys from update bodies unless intentionally replacing the content.
29
+ 3. **No filter, no sort.** `queryFilters` / `sortOptions` naming a `MULTILINE_MAX` field → 400: *"Field '<name>' is of type MULTILINE_MAX and cannot be used in filters."* / *"Sort field '<name>' is of type MULTILINE_MAX and cannot be used for sorting."* Surface verbatim (data-fabric.md Rule 18); don't retry with other operators. Full type contract: [entity-schema.md → MULTILINE_MAX fields](entity-schema.md#multiline_max-fields).
30
+
19
31
  ## Pagination
20
32
 
21
33
  Offset-based under the hood. Available on both `records list` and `records query`:
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "skillsVersion": "1.198.0-preview.21",
3
+ "skillsVersion": "1.198.1",
4
4
  "targetCli": "^1.198.0"
5
5
  }