@celigo/api-specs 0.2.113 → 0.2.115
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/dist/api.yml +1 -0
- package/dist/connection.yml +1 -0
- package/dist/enduser.yml +1 -0
- package/dist/export.yml +20 -3
- package/dist/flow.yml +21 -3
- package/dist/import.yml +49 -7
- package/dist/lookupcache.yml +6 -1
- package/dist/mcp-server.yml +1 -0
- package/dist/tool.yml +70 -10
- package/package.json +1 -1
- package/schemas.json +1 -1
package/dist/api.yml
CHANGED
|
@@ -6470,6 +6470,7 @@ components:
|
|
|
6470
6470
|
but a decimal is rejected with 422 `invalid_field_value` on every write (the same rule applies to every
|
|
6471
6471
|
adaptor's `concurrencyLevel` and `targetConcurrencyLevel`, and to `ftp.multiThreadCount`).
|
|
6472
6472
|
Platform-managed while `autoRecoverRateLimitErrors` is true — a PUT ignores the value and the recovery machinery moves it toward the target; set `targetConcurrencyLevel` instead.
|
|
6473
|
+
At level 1 an import's pages run one at a time, so a record's existence lookup and write finish before the next record's start (measured on a single import); the import's `idLockTemplate` serializes only same-key records and leaves the rest parallel.
|
|
6473
6474
|
minimum: 1
|
|
6474
6475
|
maximum: 50
|
|
6475
6476
|
default: 25
|
package/dist/connection.yml
CHANGED
|
@@ -5581,6 +5581,7 @@ components:
|
|
|
5581
5581
|
but a decimal is rejected with 422 `invalid_field_value` on every write (the same rule applies to every
|
|
5582
5582
|
adaptor's `concurrencyLevel` and `targetConcurrencyLevel`, and to `ftp.multiThreadCount`).
|
|
5583
5583
|
Platform-managed while `autoRecoverRateLimitErrors` is true — a PUT ignores the value and the recovery machinery moves it toward the target; set `targetConcurrencyLevel` instead.
|
|
5584
|
+
At level 1 an import's pages run one at a time, so a record's existence lookup and write finish before the next record's start (measured on a single import); the import's `idLockTemplate` serializes only same-key records and leaves the rest parallel.
|
|
5584
5585
|
minimum: 1
|
|
5585
5586
|
maximum: 50
|
|
5586
5587
|
default: 25
|
package/dist/enduser.yml
CHANGED
|
@@ -3682,6 +3682,7 @@ components:
|
|
|
3682
3682
|
but a decimal is rejected with 422 `invalid_field_value` on every write (the same rule applies to every
|
|
3683
3683
|
adaptor's `concurrencyLevel` and `targetConcurrencyLevel`, and to `ftp.multiThreadCount`).
|
|
3684
3684
|
Platform-managed while `autoRecoverRateLimitErrors` is true — a PUT ignores the value and the recovery machinery moves it toward the target; set `targetConcurrencyLevel` instead.
|
|
3685
|
+
At level 1 an import's pages run one at a time, so a record's existence lookup and write finish before the next record's start (measured on a single import); the import's `idLockTemplate` serializes only same-key records and leaves the rest parallel.
|
|
3685
3686
|
minimum: 1
|
|
3686
3687
|
maximum: 50
|
|
3687
3688
|
default: 25
|
package/dist/export.yml
CHANGED
|
@@ -2074,6 +2074,7 @@ components:
|
|
|
2074
2074
|
x-celigo-ai-guidance:
|
|
2075
2075
|
- 'Set this only when the records sit inside an object (`{"data": {"items": [...]}}` → `data.items`). A sender that already posts a top-level array needs nothing here; a sender that posts an object with no path configured delivers exactly one record per request — the whole object — which is also the way to make one request one record on purpose.'
|
|
2076
2076
|
- 'Records are paged per request at the export''s `pageSize` (default 20) before any hook, filter, or downstream step runs: a 25-element array is a page of 20 records followed by a page of 5, and a `preSavePage` hook receives one page (up to `pageSize` records) per call. A hook that groups rows by order therefore groups only the rows on the same page — an order whose rows span two pages comes out as two grouped records, the second after the first was already processed. To keep a request''s rows together, have the sender wrap them in an object (one record, rows under `record.<path>`) or raise `pageSize` above the largest request — never `groupByFields`, which the listener applies per page after paging.'
|
|
2077
|
+
- 'Requests that arrive together, or while the listener''s current run is still collecting, become additional pages of that same run; a request that arrives after the run has stopped collecting starts a new run. Nothing on the listener de-duplicates: a sender that fires the same event twice (a retry, a button clicked twice) delivers two records, and the step that writes the effect has to be made idempotent — `ignoreExisting` or a keyed upsert under the import''s `idLockTemplate`.'
|
|
2077
2078
|
examples:
|
|
2078
2079
|
- events
|
|
2079
2080
|
- data.items
|
|
@@ -16060,9 +16061,25 @@ components:
|
|
|
16060
16061
|
Handlebars template that overrides how each record's unique trace key is generated, used
|
|
16061
16062
|
to track records through the flow and match retries to prior errors (e.g.
|
|
16062
16063
|
`{{join "_" record.customerId record.orderId}}`). When omitted, the system picks a unique
|
|
16063
|
-
field automatically
|
|
16064
|
-
|
|
16065
|
-
|
|
16064
|
+
field automatically from the record's top level, by exact field name (`GET
|
|
16065
|
+
/v1/flows/{_id}/traceKey` serves the pattern). The rendered value of a template is stamped
|
|
16066
|
+
on each record as `io_custom_trace_key` and travels downstream with it. If a transform
|
|
16067
|
+
reshapes the data first, omit the `record.` prefix. Trace keys are capped at 256 characters;
|
|
16068
|
+
a longer key is stored truncated from the middle, keeping the beginning and end of the
|
|
16069
|
+
value. Downstream imports use the trace key as their default concurrency lock key (a blank
|
|
16070
|
+
key means no lock); it never de-duplicates — a record emitted twice with the same key is
|
|
16071
|
+
processed twice.
|
|
16072
|
+
x-celigo-ai-guidance:
|
|
16073
|
+
- |-
|
|
16074
|
+
The default derivation reads these top-level fields in order and takes the first present
|
|
16075
|
+
(a record carrying `id` and `internalId` is keyed on `id` alone) — `id`, `Id`, `ID`,
|
|
16076
|
+
`internalid`, `Internalid`, `internalId`, `InternalId`, `INTERNALID`, `_id`, `_Id`, `_ID`,
|
|
16077
|
+
`internal_id`, `internal_Id`, `Internal_id`, `Internal_Id`, `INTERNAL_ID`, `identifier`,
|
|
16078
|
+
`IDENTIFIER` — then a `*anything` rule the platform does not document.
|
|
16079
|
+
- |-
|
|
16080
|
+
A record in flight through the flow carries `io_custom_trace_key` when a template is set
|
|
16081
|
+
— that value is the downstream imports' default lock key; without a template the record
|
|
16082
|
+
carries no trace-key field (the key is derived, not stored on the record).
|
|
16066
16083
|
examples:
|
|
16067
16084
|
- '{{record.id}}'
|
|
16068
16085
|
- '{{join "_" record.customerId record.orderId}}'
|
package/dist/flow.yml
CHANGED
|
@@ -835,8 +835,10 @@ paths:
|
|
|
835
835
|
To trace a run end-to-end, arm debug logging before calling this, then use the returned
|
|
836
836
|
`_jobId` with the execution-log endpoints. For delta backfills, prefer passing explicit
|
|
837
837
|
`startDate`/`endDate` over editing the export's `lastExportDateTime` — the override is
|
|
838
|
-
scoped to one run. A
|
|
839
|
-
|
|
838
|
+
scoped to one run. A flow runs one instance at a time: a run requested while another
|
|
839
|
+
instance is queued or running is refused with `409 job_already_queued` ("Another instance
|
|
840
|
+
for this flow is already queued or running"), and a run-next-flow trigger that arrives in
|
|
841
|
+
that state is dropped rather than queued.
|
|
840
842
|
parameters:
|
|
841
843
|
- name: _id
|
|
842
844
|
in: path
|
|
@@ -890,6 +892,20 @@ paths:
|
|
|
890
892
|
$ref: '#/components/responses/401-unauthorized'
|
|
891
893
|
'404':
|
|
892
894
|
$ref: '#/components/responses/404-not-found'
|
|
895
|
+
'409':
|
|
896
|
+
description: |-
|
|
897
|
+
Another instance of this flow is already queued or running. Wait for it to
|
|
898
|
+
finish (poll `GET /v1/flows/{_id}/jobs/latest`) and request the run again.
|
|
899
|
+
content:
|
|
900
|
+
application/json:
|
|
901
|
+
schema:
|
|
902
|
+
$ref: '#/components/schemas/Error'
|
|
903
|
+
examples:
|
|
904
|
+
default:
|
|
905
|
+
value:
|
|
906
|
+
errors:
|
|
907
|
+
- code: job_already_queued
|
|
908
|
+
message: Another instance for this flow is already queued or running. Please try again later.
|
|
893
909
|
'422':
|
|
894
910
|
$ref: '#/components/responses/422-unprocessable-entity'
|
|
895
911
|
/v1/flows/{_flowId}/runs/stats:
|
|
@@ -5531,7 +5547,9 @@ components:
|
|
|
5531
5547
|
description: |-
|
|
5532
5548
|
Flow IDs to trigger after this flow completes successfully. Accepts null as
|
|
5533
5549
|
equivalent to an empty list (the server also serves null on documents saved
|
|
5534
|
-
that way).
|
|
5550
|
+
that way). The trigger starts the next flow from its own source steps and passes
|
|
5551
|
+
it no records; a trigger that fires while the next flow is already queued or running
|
|
5552
|
+
is dropped, not queued, so several completions in quick succession start it once.
|
|
5535
5553
|
items:
|
|
5536
5554
|
type: string
|
|
5537
5555
|
format: objectId
|
package/dist/import.yml
CHANGED
|
@@ -5639,12 +5639,20 @@ components:
|
|
|
5639
5639
|
type:
|
|
5640
5640
|
- string
|
|
5641
5641
|
- 'null'
|
|
5642
|
-
description:
|
|
5642
|
+
description: |-
|
|
5643
|
+
Name of an entry in `lookups` that probes the database per record to decide whether it
|
|
5644
|
+
already exists, so `ignoreExisting` can skip it (or `ignoreMissing` can skip records with
|
|
5645
|
+
no match). Use it when existence must be read from the database; use `ignoreExtract` when
|
|
5646
|
+
the incoming record already carries the field that signals existence.
|
|
5643
5647
|
ignoreExtract:
|
|
5644
5648
|
type:
|
|
5645
5649
|
- string
|
|
5646
5650
|
- 'null'
|
|
5647
|
-
description:
|
|
5651
|
+
description: |-
|
|
5652
|
+
Path to a field on the incoming record whose presence decides the skip: with
|
|
5653
|
+
`ignoreExisting`, a populated value marks the record as existing and it is skipped; with
|
|
5654
|
+
`ignoreMissing`, an empty value marks it as missing and it is skipped. Zero per-record
|
|
5655
|
+
overhead; set exactly one of `ignoreExtract` / `ignoreLookupName`.
|
|
5648
5656
|
if:
|
|
5649
5657
|
not:
|
|
5650
5658
|
propertyNames:
|
|
@@ -15925,17 +15933,49 @@ components:
|
|
|
15925
15933
|
type: boolean
|
|
15926
15934
|
description: |-
|
|
15927
15935
|
When true, records that do not already exist in the destination system are silently
|
|
15928
|
-
skipped instead of producing errors — used for update-only operations.
|
|
15936
|
+
skipped instead of producing errors — used for update-only operations. Existing records
|
|
15937
|
+
are identified the same way as for `ignoreExisting`: the adaptor's ignore lookup
|
|
15938
|
+
(`ignoreLookupName`) or a populated `ignoreExtract` field on the incoming record.
|
|
15929
15939
|
idLockTemplate:
|
|
15930
15940
|
type:
|
|
15931
15941
|
- string
|
|
15932
15942
|
- 'null'
|
|
15933
15943
|
description: |-
|
|
15934
|
-
Handlebars template that generates a lock key for each record
|
|
15935
|
-
the same key are
|
|
15936
|
-
|
|
15944
|
+
Handlebars template that generates a concurrency lock key for each record: records that
|
|
15945
|
+
render the same key are never submitted at the same time, while records with different
|
|
15946
|
+
keys are processed in parallel. When omitted, the record's trace key is the lock key (a
|
|
15947
|
+
blank trace key means no lock; a custom `traceKeyTemplate` upstream arrives on the record
|
|
15948
|
+
as `io_custom_trace_key`); a template replaces that default rather than adding to it.
|
|
15949
|
+
The template is rendered from the record as it arrives at the import — before the import's
|
|
15950
|
+
own lookups and mapping run — so a key built from one of the import's lookup results
|
|
15951
|
+
(`{{lookup.<name>}}`) or from a mapped field renders empty, and an empty key is no lock at
|
|
15952
|
+
all; a field added upstream by a lookup step's response mapping is on the record and works.
|
|
15953
|
+
x-celigo-ai-guidance:
|
|
15954
|
+
- |-
|
|
15955
|
+
The lock is scoped to this import resource across every page and every concurrent run
|
|
15956
|
+
that submits through it — including other flows sharing the import — not to one page,
|
|
15957
|
+
and not to the connection: two different imports rendering the same key on the same
|
|
15958
|
+
connection still run in parallel. Records within a single page are
|
|
15959
|
+
sent one at a time regardless, so the lock matters when same-key records sit in different
|
|
15960
|
+
pages or runs.
|
|
15961
|
+
- |-
|
|
15962
|
+
With `ignoreExisting` and an ignore lookup, the existence lookup runs inside the lock:
|
|
15963
|
+
lookup-then-write for one key does not interleave with another record's lookup-then-write
|
|
15964
|
+
for the same key. That pairing is the duplicate-prevention pattern for destinations that
|
|
15965
|
+
can be queried but do not reject duplicates — key the lock on the business identifier the
|
|
15966
|
+
write is keyed on. With the check but no lock, concurrent same-key pages all read a miss
|
|
15967
|
+
before any write lands and all create. Connection `concurrencyLevel: 1` also closes that
|
|
15968
|
+
race for the import (measured on a single import: its pages ran one at a time and the
|
|
15969
|
+
same-key pages created once) — the lock is the per-key tool that leaves unrelated records
|
|
15970
|
+
parallel.
|
|
15971
|
+
- |-
|
|
15972
|
+
Key it on a field the record carries when it reaches this import (`{{{record.externalId}}}-GR`,
|
|
15973
|
+
or a field an upstream lookup step added through its response mapping), never on one of
|
|
15974
|
+
this import's own lookup results; the key must render non-empty for the records that
|
|
15975
|
+
matter, or those records have no lock.
|
|
15937
15976
|
examples:
|
|
15938
15977
|
- '{{record.customerId}}'
|
|
15978
|
+
- '{{{record.externalId}}}-GR'
|
|
15939
15979
|
dataURITemplate:
|
|
15940
15980
|
type:
|
|
15941
15981
|
- string
|
|
@@ -16055,7 +16095,9 @@ components:
|
|
|
16055
16095
|
Handlebars template that overrides how each record's unique trace key is generated,
|
|
16056
16096
|
used to track records through the flow and match errors to records. Trace keys are
|
|
16057
16097
|
capped at 256 characters; a longer key is stored truncated from the middle, keeping
|
|
16058
|
-
the beginning and end of the value.
|
|
16098
|
+
the beginning and end of the value. The trace key is also the import's default
|
|
16099
|
+
concurrency lock key when `idLockTemplate` is not set; it never de-duplicates — a record
|
|
16100
|
+
that arrives twice with the same key is processed twice.
|
|
16059
16101
|
x-celigo-ai-guidance:
|
|
16060
16102
|
- |-
|
|
16061
16103
|
## CRITICAL: ONLY VALID WHEN ``oneToMany: true``
|
package/dist/lookupcache.yml
CHANGED
|
@@ -410,7 +410,12 @@ paths:
|
|
|
410
410
|
summary: Upsert entries into a lookup cache
|
|
411
411
|
description: |-
|
|
412
412
|
Writes key-value entries to a lookup cache. Keys that already exist are
|
|
413
|
-
overwritten; new keys are created.
|
|
413
|
+
overwritten; new keys are created. There is no insert-only, create-if-absent or
|
|
414
|
+
compare-and-set mode — a write never fails because the key exists, so a
|
|
415
|
+
"first writer wins" claim cannot be built on this call alone: make the claim
|
|
416
|
+
on the flow's import step instead (`ignoreExisting` with a `getData` lookup on
|
|
417
|
+
the key, under `idLockTemplate` on the same key), which serializes
|
|
418
|
+
read-then-write per key. Values may be null, numbers, booleans,
|
|
414
419
|
strings, or objects — arrays at the top level are rejected (wrap them in an
|
|
415
420
|
object). One invalid entry fails the entire batch and nothing in it is written:
|
|
416
421
|
a bad value returns `400 invalid_value`, and an empty, missing, or over-length
|
package/dist/mcp-server.yml
CHANGED
|
@@ -5507,6 +5507,7 @@ components:
|
|
|
5507
5507
|
but a decimal is rejected with 422 `invalid_field_value` on every write (the same rule applies to every
|
|
5508
5508
|
adaptor's `concurrencyLevel` and `targetConcurrencyLevel`, and to `ftp.multiThreadCount`).
|
|
5509
5509
|
Platform-managed while `autoRecoverRateLimitErrors` is true — a PUT ignores the value and the recovery machinery moves it toward the target; set `targetConcurrencyLevel` instead.
|
|
5510
|
+
At level 1 an import's pages run one at a time, so a record's existence lookup and write finish before the next record's start (measured on a single import); the import's `idLockTemplate` serializes only same-key records and leaves the rest parallel.
|
|
5510
5511
|
minimum: 1
|
|
5511
5512
|
maximum: 50
|
|
5512
5513
|
default: 25
|
package/dist/tool.yml
CHANGED
|
@@ -8836,6 +8836,7 @@ components:
|
|
|
8836
8836
|
but a decimal is rejected with 422 `invalid_field_value` on every write (the same rule applies to every
|
|
8837
8837
|
adaptor's `concurrencyLevel` and `targetConcurrencyLevel`, and to `ftp.multiThreadCount`).
|
|
8838
8838
|
Platform-managed while `autoRecoverRateLimitErrors` is true — a PUT ignores the value and the recovery machinery moves it toward the target; set `targetConcurrencyLevel` instead.
|
|
8839
|
+
At level 1 an import's pages run one at a time, so a record's existence lookup and write finish before the next record's start (measured on a single import); the import's `idLockTemplate` serializes only same-key records and leaves the rest parallel.
|
|
8839
8840
|
minimum: 1
|
|
8840
8841
|
maximum: 50
|
|
8841
8842
|
default: 25
|
|
@@ -16949,12 +16950,20 @@ components:
|
|
|
16949
16950
|
type:
|
|
16950
16951
|
- string
|
|
16951
16952
|
- 'null'
|
|
16952
|
-
description:
|
|
16953
|
+
description: |-
|
|
16954
|
+
Name of an entry in `lookups` that probes the database per record to decide whether it
|
|
16955
|
+
already exists, so `ignoreExisting` can skip it (or `ignoreMissing` can skip records with
|
|
16956
|
+
no match). Use it when existence must be read from the database; use `ignoreExtract` when
|
|
16957
|
+
the incoming record already carries the field that signals existence.
|
|
16953
16958
|
ignoreExtract:
|
|
16954
16959
|
type:
|
|
16955
16960
|
- string
|
|
16956
16961
|
- 'null'
|
|
16957
|
-
description:
|
|
16962
|
+
description: |-
|
|
16963
|
+
Path to a field on the incoming record whose presence decides the skip: with
|
|
16964
|
+
`ignoreExisting`, a populated value marks the record as existing and it is skipped; with
|
|
16965
|
+
`ignoreMissing`, an empty value marks it as missing and it is skipped. Zero per-record
|
|
16966
|
+
overhead; set exactly one of `ignoreExtract` / `ignoreLookupName`.
|
|
16958
16967
|
if:
|
|
16959
16968
|
not:
|
|
16960
16969
|
propertyNames:
|
|
@@ -24792,17 +24801,49 @@ components:
|
|
|
24792
24801
|
type: boolean
|
|
24793
24802
|
description: |-
|
|
24794
24803
|
When true, records that do not already exist in the destination system are silently
|
|
24795
|
-
skipped instead of producing errors — used for update-only operations.
|
|
24804
|
+
skipped instead of producing errors — used for update-only operations. Existing records
|
|
24805
|
+
are identified the same way as for `ignoreExisting`: the adaptor's ignore lookup
|
|
24806
|
+
(`ignoreLookupName`) or a populated `ignoreExtract` field on the incoming record.
|
|
24796
24807
|
idLockTemplate:
|
|
24797
24808
|
type:
|
|
24798
24809
|
- string
|
|
24799
24810
|
- 'null'
|
|
24800
24811
|
description: |-
|
|
24801
|
-
Handlebars template that generates a lock key for each record
|
|
24802
|
-
the same key are
|
|
24803
|
-
|
|
24812
|
+
Handlebars template that generates a concurrency lock key for each record: records that
|
|
24813
|
+
render the same key are never submitted at the same time, while records with different
|
|
24814
|
+
keys are processed in parallel. When omitted, the record's trace key is the lock key (a
|
|
24815
|
+
blank trace key means no lock; a custom `traceKeyTemplate` upstream arrives on the record
|
|
24816
|
+
as `io_custom_trace_key`); a template replaces that default rather than adding to it.
|
|
24817
|
+
The template is rendered from the record as it arrives at the import — before the import's
|
|
24818
|
+
own lookups and mapping run — so a key built from one of the import's lookup results
|
|
24819
|
+
(`{{lookup.<name>}}`) or from a mapped field renders empty, and an empty key is no lock at
|
|
24820
|
+
all; a field added upstream by a lookup step's response mapping is on the record and works.
|
|
24821
|
+
x-celigo-ai-guidance:
|
|
24822
|
+
- |-
|
|
24823
|
+
The lock is scoped to this import resource across every page and every concurrent run
|
|
24824
|
+
that submits through it — including other flows sharing the import — not to one page,
|
|
24825
|
+
and not to the connection: two different imports rendering the same key on the same
|
|
24826
|
+
connection still run in parallel. Records within a single page are
|
|
24827
|
+
sent one at a time regardless, so the lock matters when same-key records sit in different
|
|
24828
|
+
pages or runs.
|
|
24829
|
+
- |-
|
|
24830
|
+
With `ignoreExisting` and an ignore lookup, the existence lookup runs inside the lock:
|
|
24831
|
+
lookup-then-write for one key does not interleave with another record's lookup-then-write
|
|
24832
|
+
for the same key. That pairing is the duplicate-prevention pattern for destinations that
|
|
24833
|
+
can be queried but do not reject duplicates — key the lock on the business identifier the
|
|
24834
|
+
write is keyed on. With the check but no lock, concurrent same-key pages all read a miss
|
|
24835
|
+
before any write lands and all create. Connection `concurrencyLevel: 1` also closes that
|
|
24836
|
+
race for the import (measured on a single import: its pages ran one at a time and the
|
|
24837
|
+
same-key pages created once) — the lock is the per-key tool that leaves unrelated records
|
|
24838
|
+
parallel.
|
|
24839
|
+
- |-
|
|
24840
|
+
Key it on a field the record carries when it reaches this import (`{{{record.externalId}}}-GR`,
|
|
24841
|
+
or a field an upstream lookup step added through its response mapping), never on one of
|
|
24842
|
+
this import's own lookup results; the key must render non-empty for the records that
|
|
24843
|
+
matter, or those records have no lock.
|
|
24804
24844
|
examples:
|
|
24805
24845
|
- '{{record.customerId}}'
|
|
24846
|
+
- '{{{record.externalId}}}-GR'
|
|
24806
24847
|
dataURITemplate:
|
|
24807
24848
|
type:
|
|
24808
24849
|
- string
|
|
@@ -24922,7 +24963,9 @@ components:
|
|
|
24922
24963
|
Handlebars template that overrides how each record's unique trace key is generated,
|
|
24923
24964
|
used to track records through the flow and match errors to records. Trace keys are
|
|
24924
24965
|
capped at 256 characters; a longer key is stored truncated from the middle, keeping
|
|
24925
|
-
the beginning and end of the value.
|
|
24966
|
+
the beginning and end of the value. The trace key is also the import's default
|
|
24967
|
+
concurrency lock key when `idLockTemplate` is not set; it never de-duplicates — a record
|
|
24968
|
+
that arrives twice with the same key is processed twice.
|
|
24926
24969
|
x-celigo-ai-guidance:
|
|
24927
24970
|
- |-
|
|
24928
24971
|
## CRITICAL: ONLY VALID WHEN ``oneToMany: true``
|
|
@@ -26682,6 +26725,7 @@ components:
|
|
|
26682
26725
|
x-celigo-ai-guidance:
|
|
26683
26726
|
- 'Set this only when the records sit inside an object (`{"data": {"items": [...]}}` → `data.items`). A sender that already posts a top-level array needs nothing here; a sender that posts an object with no path configured delivers exactly one record per request — the whole object — which is also the way to make one request one record on purpose.'
|
|
26684
26727
|
- 'Records are paged per request at the export''s `pageSize` (default 20) before any hook, filter, or downstream step runs: a 25-element array is a page of 20 records followed by a page of 5, and a `preSavePage` hook receives one page (up to `pageSize` records) per call. A hook that groups rows by order therefore groups only the rows on the same page — an order whose rows span two pages comes out as two grouped records, the second after the first was already processed. To keep a request''s rows together, have the sender wrap them in an object (one record, rows under `record.<path>`) or raise `pageSize` above the largest request — never `groupByFields`, which the listener applies per page after paging.'
|
|
26728
|
+
- 'Requests that arrive together, or while the listener''s current run is still collecting, become additional pages of that same run; a request that arrives after the run has stopped collecting starts a new run. Nothing on the listener de-duplicates: a sender that fires the same event twice (a retry, a button clicked twice) delivers two records, and the step that writes the effect has to be made idempotent — `ignoreExisting` or a keyed upsert under the import''s `idLockTemplate`.'
|
|
26685
26729
|
examples:
|
|
26686
26730
|
- events
|
|
26687
26731
|
- data.items
|
|
@@ -36913,9 +36957,25 @@ components:
|
|
|
36913
36957
|
Handlebars template that overrides how each record's unique trace key is generated, used
|
|
36914
36958
|
to track records through the flow and match retries to prior errors (e.g.
|
|
36915
36959
|
`{{join "_" record.customerId record.orderId}}`). When omitted, the system picks a unique
|
|
36916
|
-
field automatically
|
|
36917
|
-
|
|
36918
|
-
|
|
36960
|
+
field automatically from the record's top level, by exact field name (`GET
|
|
36961
|
+
/v1/flows/{_id}/traceKey` serves the pattern). The rendered value of a template is stamped
|
|
36962
|
+
on each record as `io_custom_trace_key` and travels downstream with it. If a transform
|
|
36963
|
+
reshapes the data first, omit the `record.` prefix. Trace keys are capped at 256 characters;
|
|
36964
|
+
a longer key is stored truncated from the middle, keeping the beginning and end of the
|
|
36965
|
+
value. Downstream imports use the trace key as their default concurrency lock key (a blank
|
|
36966
|
+
key means no lock); it never de-duplicates — a record emitted twice with the same key is
|
|
36967
|
+
processed twice.
|
|
36968
|
+
x-celigo-ai-guidance:
|
|
36969
|
+
- |-
|
|
36970
|
+
The default derivation reads these top-level fields in order and takes the first present
|
|
36971
|
+
(a record carrying `id` and `internalId` is keyed on `id` alone) — `id`, `Id`, `ID`,
|
|
36972
|
+
`internalid`, `Internalid`, `internalId`, `InternalId`, `INTERNALID`, `_id`, `_Id`, `_ID`,
|
|
36973
|
+
`internal_id`, `internal_Id`, `Internal_id`, `Internal_Id`, `INTERNAL_ID`, `identifier`,
|
|
36974
|
+
`IDENTIFIER` — then a `*anything` rule the platform does not document.
|
|
36975
|
+
- |-
|
|
36976
|
+
A record in flight through the flow carries `io_custom_trace_key` when a template is set
|
|
36977
|
+
— that value is the downstream imports' default lock key; without a template the record
|
|
36978
|
+
carries no trace-key field (the key is derived, not stored on the record).
|
|
36919
36979
|
examples:
|
|
36920
36980
|
- '{{record.id}}'
|
|
36921
36981
|
- '{{join "_" record.customerId record.orderId}}'
|
package/package.json
CHANGED