@celigo/api-specs 0.2.213 → 0.2.215

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/ai-agent.yml CHANGED
@@ -5679,12 +5679,16 @@ components:
5679
5679
  - |-
5680
5680
  On a grouped record (the export groups rows, so the record is an
5681
5681
  array) only `create` can author output — build it from the rows with
5682
- `$[0].field`, `$[*].field`, or a `buildArrayHelper` over `$[*]`.
5682
+ `$[0].field`, `$[*].field`, or a `buildArrayHelper` over `$[*]`
5683
+ (`$.rows[0].field` and `$.rows[*]` with `inputContext: envelope`).
5683
5684
  `modify` has no object to overlay onto an array: the record passes
5684
- through untouched and the processor reports success. Either mode
5685
- reshapes the inside of one record; neither changes how many records
5686
- the page carries (that is the export's `preSavePage` hook) or whether
5687
- the export groups at all (that is its grouping setting).
5685
+ through untouched and the processor reports success. Paths written
5686
+ for one object record (`$.field`, an entry `$.lines[*]`) resolve
5687
+ nothing there, so `create` returns `{}` for each record, also with
5688
+ no error (live, 2026-10-30). Either mode reshapes the inside of one
5689
+ record; neither changes how many records the page carries (that is
5690
+ the export's `preSavePage` hook) or whether the export groups at all
5691
+ (that is its grouping setting).
5688
5692
  examples:
5689
5693
  - create
5690
5694
  - modify
@@ -5749,8 +5753,8 @@ components:
5749
5753
  - record
5750
5754
  - envelope
5751
5755
  x-enumDescriptions:
5752
- record: The transform processor evaluates `mappings[].extract` JSONPath against the flat record itself (`$.field`, no `record.` segment) — the default when absent.
5753
- envelope: The transform processor evaluates JSONPath against the wrapped runtime envelope `{record, job, testMode, settings, headers, queryParams}` (file-provider steps also carry `fileMeta`) — record fields need the `record.` segment (`$.record.field`), while `headers` and `queryParams` sit beside `record` (`$.headers['X-Id']`, `$.queryParams.src`).
5756
+ record: The transform processor evaluates `mappings[].extract` JSONPath against the flat record itself (`$.field`, no `record.` segment; a grouped record is the array of rows, `$[0].field`) — the default when absent.
5757
+ envelope: The transform processor evaluates JSONPath against the wrapped runtime envelope `{record, job, testMode, settings, headers, queryParams}` (file-provider steps also carry `fileMeta`) — record fields need the `record.` segment (`$.record.field`), and a grouped record sits under `rows` instead (`$.rows[0].field`), while `headers` and `queryParams` sit beside `record` (`$.headers['X-Id']`, `$.queryParams.src`).
5754
5758
  description: |
5755
5759
  Controls the JSON shape the transformTwoDotZero processor
5756
5760
  evaluates `mappings[].extract` JSONPath values against at
@@ -5766,24 +5770,38 @@ components:
5766
5770
  processor sees the FLAT record as its evaluation root.
5767
5771
  `mappings[].extract` JSONPath MUST anchor directly at
5768
5772
  `$` with NO `record.` segment — e.g. `"$.orderId"`,
5769
- `"$.customer.email"`; PLACEHOLDER extracts use
5773
+ `"$.customer.email"` on an object record, `"$[0].orderId"`
5774
+ on a grouped one; PLACEHOLDER extracts use
5770
5775
  `"$.PLACEHOLDER_<field>"`.
5771
5776
  This is the dominant Celigo idiom and the right choice for new transforms.
5772
5777
  - `envelope`: the processor sees a wrapped object
5773
5778
  `{record: {...}, job, testMode, settings, headers,
5774
5779
  queryParams}` (plus `fileMeta` on file-provider steps).
5775
5780
  `mappings[].extract` JSONPath MUST include the
5776
- `record.` segment for record fields — e.g.
5777
- `"$.record.orderId"` — and reads `headers` and
5781
+ `record.` segment for an object record's fields — e.g.
5782
+ `"$.record.orderId"`; a grouped record sits under `rows`
5783
+ instead (`"$.rows[0].orderId"`) — and reads `headers` and
5778
5784
  `queryParams` beside it (`$.headers['X-Id']`);
5779
5785
  PLACEHOLDER extracts use `"$.record.PLACEHOLDER_<field>"`.
5780
5786
  Pick this only when the transform was authored against
5781
5787
  the envelope shape on purpose.
5782
5788
  - |-
5783
- Handlebars expressions inside `extract`
5784
- (`{{record.field}}`, `{{dateFormat ... record.field}}`)
5785
- ALWAYS reference the `record` root regardless of
5789
+ Handlebars expressions inside `extract` reference the
5790
+ `record` root on an object record (`{{record.field}}`,
5791
+ `{{dateFormat ... record.field}}`) and `rows` on a
5792
+ grouped one (`{{rows.0.field}}`), regardless of
5786
5793
  `inputContext` — only JSONPath anchoring flips.
5794
+ - |-
5795
+ ## Grouped records
5796
+
5797
+ When the export groups rows, each record is an array of
5798
+ rows. In `record` mode JSONPath roots at that array
5799
+ (`$[0].field`, `$[*]`); `envelope` binds it as `rows`,
5800
+ not `record` — `$.rows[0].field`, and an entry
5801
+ `$.rows[*]` whose children read `$.rows.field` — while
5802
+ `$.record[0].field` and `$.record[*]` resolve nothing,
5803
+ with no error (live, 2026-10-30). Handlebars extracts
5804
+ read it as `rows` in both modes (`{{rows.0.field}}`).
5787
5805
  - |-
5788
5806
  In `envelope` mode the output is still a bare record: a
5789
5807
  `modify` transform returns the record with its mapped
@@ -5804,7 +5822,8 @@ components:
5804
5822
  ``mappings[].extract`` JSONPath values MUST anchor
5805
5823
  directly at ``$`` with NO ``record.`` segment — for
5806
5824
  example ``"$.orderId"`` or
5807
- ``"$.customer.email"``. PLACEHOLDER extracts use
5825
+ ``"$.customer.email"`` on an object record, and
5826
+ ``"$[0].orderId"`` on a grouped one. PLACEHOLDER extracts use
5808
5827
  ``"$.PLACEHOLDER_<field>"``. This is the dominant
5809
5828
  Celigo idiom and the right choice for new transforms.
5810
5829
 
@@ -5816,9 +5835,10 @@ components:
5816
5835
  ``record``) — the
5817
5836
  same runtime-context envelope Handlebars / SQL /
5818
5837
  GraphQL templates render against. ``mappings[].extract``
5819
- JSONPath values for record fields MUST include the
5838
+ JSONPath values for an object record's fields MUST include the
5820
5839
  ``record.`` segment — for example ``"$.record.orderId"``
5821
- or ``"$.record.customer.email"`` — while ``headers`` and
5840
+ or ``"$.record.customer.email"``; a grouped record's rows
5841
+ sit under ``rows`` instead (``"$.rows[0].orderId"``) — while ``headers`` and
5822
5842
  ``queryParams`` are read beside it
5823
5843
  (``"$.headers['X-Id']"``). PLACEHOLDER extracts
5824
5844
  use ``"$.record.PLACEHOLDER_<field>"``. Pick this
@@ -5831,8 +5851,9 @@ components:
5831
5851
 
5832
5852
  Handlebars expressions inside ``extract``
5833
5853
  (``{{record.field}}``,
5834
- ``{{dateFormat ... record.field}}``, etc.) ALWAYS
5835
- reference the runtime context's ``record`` root
5854
+ ``{{dateFormat ... record.field}}``, etc.) reference the
5855
+ runtime context's ``record`` root on an object record,
5856
+ and ``rows`` (``{{rows.0.field}}``) on a grouped one,
5836
5857
  regardless of ``inputContext`` — the Handlebars runtime
5837
5858
  always sees the wrapped envelope. Only JSONPath
5838
5859
  behavior flips with this field.
package/dist/api.yml CHANGED
@@ -5263,12 +5263,16 @@ components:
5263
5263
  - |-
5264
5264
  On a grouped record (the export groups rows, so the record is an
5265
5265
  array) only `create` can author output — build it from the rows with
5266
- `$[0].field`, `$[*].field`, or a `buildArrayHelper` over `$[*]`.
5266
+ `$[0].field`, `$[*].field`, or a `buildArrayHelper` over `$[*]`
5267
+ (`$.rows[0].field` and `$.rows[*]` with `inputContext: envelope`).
5267
5268
  `modify` has no object to overlay onto an array: the record passes
5268
- through untouched and the processor reports success. Either mode
5269
- reshapes the inside of one record; neither changes how many records
5270
- the page carries (that is the export's `preSavePage` hook) or whether
5271
- the export groups at all (that is its grouping setting).
5269
+ through untouched and the processor reports success. Paths written
5270
+ for one object record (`$.field`, an entry `$.lines[*]`) resolve
5271
+ nothing there, so `create` returns `{}` for each record, also with
5272
+ no error (live, 2026-10-30). Either mode reshapes the inside of one
5273
+ record; neither changes how many records the page carries (that is
5274
+ the export's `preSavePage` hook) or whether the export groups at all
5275
+ (that is its grouping setting).
5272
5276
  examples:
5273
5277
  - create
5274
5278
  - modify
@@ -5333,8 +5337,8 @@ components:
5333
5337
  - record
5334
5338
  - envelope
5335
5339
  x-enumDescriptions:
5336
- record: The transform processor evaluates `mappings[].extract` JSONPath against the flat record itself (`$.field`, no `record.` segment) — the default when absent.
5337
- envelope: The transform processor evaluates JSONPath against the wrapped runtime envelope `{record, job, testMode, settings, headers, queryParams}` (file-provider steps also carry `fileMeta`) — record fields need the `record.` segment (`$.record.field`), while `headers` and `queryParams` sit beside `record` (`$.headers['X-Id']`, `$.queryParams.src`).
5340
+ record: The transform processor evaluates `mappings[].extract` JSONPath against the flat record itself (`$.field`, no `record.` segment; a grouped record is the array of rows, `$[0].field`) — the default when absent.
5341
+ envelope: The transform processor evaluates JSONPath against the wrapped runtime envelope `{record, job, testMode, settings, headers, queryParams}` (file-provider steps also carry `fileMeta`) — record fields need the `record.` segment (`$.record.field`), and a grouped record sits under `rows` instead (`$.rows[0].field`), while `headers` and `queryParams` sit beside `record` (`$.headers['X-Id']`, `$.queryParams.src`).
5338
5342
  description: |
5339
5343
  Controls the JSON shape the transformTwoDotZero processor
5340
5344
  evaluates `mappings[].extract` JSONPath values against at
@@ -5350,24 +5354,38 @@ components:
5350
5354
  processor sees the FLAT record as its evaluation root.
5351
5355
  `mappings[].extract` JSONPath MUST anchor directly at
5352
5356
  `$` with NO `record.` segment — e.g. `"$.orderId"`,
5353
- `"$.customer.email"`; PLACEHOLDER extracts use
5357
+ `"$.customer.email"` on an object record, `"$[0].orderId"`
5358
+ on a grouped one; PLACEHOLDER extracts use
5354
5359
  `"$.PLACEHOLDER_<field>"`.
5355
5360
  This is the dominant Celigo idiom and the right choice for new transforms.
5356
5361
  - `envelope`: the processor sees a wrapped object
5357
5362
  `{record: {...}, job, testMode, settings, headers,
5358
5363
  queryParams}` (plus `fileMeta` on file-provider steps).
5359
5364
  `mappings[].extract` JSONPath MUST include the
5360
- `record.` segment for record fields — e.g.
5361
- `"$.record.orderId"` — and reads `headers` and
5365
+ `record.` segment for an object record's fields — e.g.
5366
+ `"$.record.orderId"`; a grouped record sits under `rows`
5367
+ instead (`"$.rows[0].orderId"`) — and reads `headers` and
5362
5368
  `queryParams` beside it (`$.headers['X-Id']`);
5363
5369
  PLACEHOLDER extracts use `"$.record.PLACEHOLDER_<field>"`.
5364
5370
  Pick this only when the transform was authored against
5365
5371
  the envelope shape on purpose.
5366
5372
  - |-
5367
- Handlebars expressions inside `extract`
5368
- (`{{record.field}}`, `{{dateFormat ... record.field}}`)
5369
- ALWAYS reference the `record` root regardless of
5373
+ Handlebars expressions inside `extract` reference the
5374
+ `record` root on an object record (`{{record.field}}`,
5375
+ `{{dateFormat ... record.field}}`) and `rows` on a
5376
+ grouped one (`{{rows.0.field}}`), regardless of
5370
5377
  `inputContext` — only JSONPath anchoring flips.
5378
+ - |-
5379
+ ## Grouped records
5380
+
5381
+ When the export groups rows, each record is an array of
5382
+ rows. In `record` mode JSONPath roots at that array
5383
+ (`$[0].field`, `$[*]`); `envelope` binds it as `rows`,
5384
+ not `record` — `$.rows[0].field`, and an entry
5385
+ `$.rows[*]` whose children read `$.rows.field` — while
5386
+ `$.record[0].field` and `$.record[*]` resolve nothing,
5387
+ with no error (live, 2026-10-30). Handlebars extracts
5388
+ read it as `rows` in both modes (`{{rows.0.field}}`).
5371
5389
  - |-
5372
5390
  In `envelope` mode the output is still a bare record: a
5373
5391
  `modify` transform returns the record with its mapped
@@ -5388,7 +5406,8 @@ components:
5388
5406
  ``mappings[].extract`` JSONPath values MUST anchor
5389
5407
  directly at ``$`` with NO ``record.`` segment — for
5390
5408
  example ``"$.orderId"`` or
5391
- ``"$.customer.email"``. PLACEHOLDER extracts use
5409
+ ``"$.customer.email"`` on an object record, and
5410
+ ``"$[0].orderId"`` on a grouped one. PLACEHOLDER extracts use
5392
5411
  ``"$.PLACEHOLDER_<field>"``. This is the dominant
5393
5412
  Celigo idiom and the right choice for new transforms.
5394
5413
 
@@ -5400,9 +5419,10 @@ components:
5400
5419
  ``record``) — the
5401
5420
  same runtime-context envelope Handlebars / SQL /
5402
5421
  GraphQL templates render against. ``mappings[].extract``
5403
- JSONPath values for record fields MUST include the
5422
+ JSONPath values for an object record's fields MUST include the
5404
5423
  ``record.`` segment — for example ``"$.record.orderId"``
5405
- or ``"$.record.customer.email"`` — while ``headers`` and
5424
+ or ``"$.record.customer.email"``; a grouped record's rows
5425
+ sit under ``rows`` instead (``"$.rows[0].orderId"``) — while ``headers`` and
5406
5426
  ``queryParams`` are read beside it
5407
5427
  (``"$.headers['X-Id']"``). PLACEHOLDER extracts
5408
5428
  use ``"$.record.PLACEHOLDER_<field>"``. Pick this
@@ -5415,8 +5435,9 @@ components:
5415
5435
 
5416
5436
  Handlebars expressions inside ``extract``
5417
5437
  (``{{record.field}}``,
5418
- ``{{dateFormat ... record.field}}``, etc.) ALWAYS
5419
- reference the runtime context's ``record`` root
5438
+ ``{{dateFormat ... record.field}}``, etc.) reference the
5439
+ runtime context's ``record`` root on an object record,
5440
+ and ``rows`` (``{{rows.0.field}}``) on a grouped one,
5420
5441
  regardless of ``inputContext`` — the Handlebars runtime
5421
5442
  always sees the wrapped envelope. Only JSONPath
5422
5443
  behavior flips with this field.
@@ -8342,11 +8363,22 @@ components:
8342
8363
  format: objectId
8343
8364
  x-celigo-refModel: agents
8344
8365
  description: |
8345
- Reference to a Celigo on-premise Agent. Required for connection types that need
8346
- local network or filesystem access (JDBC, filesystem, Oracle RDBMS, and on-premise MongoDB).
8366
+ Reference to a Celigo on-premise Agent. Connection types that need local network or
8367
+ filesystem access (JDBC, filesystem, Oracle RDBMS, and on-premise MongoDB) carry one
8368
+ binding — this agent, or an agent group in `_agentGroupId`; never both.
8347
8369
  The agent establishes a secure tunnel between the on-premise environment and integrator.io.
8348
8370
  examples:
8349
8371
  - 5f8d43a1b9e5a80011a35f2c
8372
+ _agentGroupId:
8373
+ type: string
8374
+ format: objectId
8375
+ x-celigo-refModel: agentgroups
8376
+ description: |-
8377
+ On-premise agent group serving this connection, when one is bound
8378
+ instead of a single `_agentId`. Absent on connections that use a
8379
+ single agent or none.
8380
+ examples:
8381
+ - 6650a1b2c3d4e5f60718293a
8350
8382
  _borrowConcurrencyFromConnectionId:
8351
8383
  type: string
8352
8384
  format: objectId
@@ -11124,8 +11156,10 @@ components:
11124
11156
  x-celigo-ai-guidance:
11125
11157
  - The POST is rejected with 422 if type-specific required fields are missing (see the per-type conditional rules).
11126
11158
  - |-
11127
- For Oracle, a placeholder connection cannot be created without a real connection-level _agentId
11128
- (validator error agent_mode_only) — direct the user to install a Celigo Agent first. All other
11159
+ For Oracle, a placeholder connection cannot be created without a real on-premise binding — a
11160
+ connection-level _agentId, or an agent group through _agentGroupId (validator error
11161
+ agent_mode_only with neither; live-verified that a POST carrying only _agentGroupId is not
11162
+ answered with it) — direct the user to install a Celigo Agent first. All other
11129
11163
  RDBMS types accept placeholder credentials that satisfy the per-type required fields.
11130
11164
  - |-
11131
11165
  Celigo has native support for these database systems:
@@ -11176,16 +11210,17 @@ components:
11176
11210
  `_iClientId` with `basic` auth is rejected. Both types share the
11177
11211
  `mssql` sub-object; `azuresynapse` is cloud-only, and the SQL Server
11178
11212
  connection form offers service-principal auth in Cloud mode only — it
11179
- saves `basic` for an on-premise connection (`_agentId` set).
11180
- - **Oracle** — runs in agent mode only, so requires `_agentId` on the
11181
- parent connection object. Uses `serviceName` instead of `database`.
11213
+ saves `basic` for an on-premise connection (`_agentId` or `_agentGroupId` set).
11214
+ - **Oracle** — runs in agent mode only, so requires an on-premise binding on
11215
+ the parent connection object: `_agentId`, or an agent group's `_agentGroupId`
11216
+ (one of the two, never both). Uses `serviceName` instead of `database`.
11182
11217
  Optionally also takes `serverType` and `instanceName`.
11183
11218
 
11184
11219
  ## PLACEHOLDER / DUMMY RDBMS CONNECTIONS
11185
11220
 
11186
11221
  For Oracle, placeholder connections cannot be created without a real
11187
- `_agentId` — the validator will reject them. Direct the user to install
11188
- a Celigo Agent first. For all other RDBMS types, a placeholder can be
11222
+ `_agentId` or `_agentGroupId` — the validator will reject them. Direct the
11223
+ user to install a Celigo Agent first. For all other RDBMS types, a placeholder can be
11189
11224
  created with dummy credentials matching the rules above.
11190
11225
  x-celigo-ui-override: 'Several requireds mirror the connection form rather than the API: snowflake.warehouse, redshift.clusterIdentifier, redshift.user, and mssql version. The API creates connections without them (live-verified 201), but the form requires them and a functional connection needs them. For mysql, postgresql, and mariadb the form makes password conditional — not required when a full SSL client certificate (ssl.ca, ssl.key, ssl.cert) is supplied instead; the conditional below keeps password required for the common (non-SSL) path, which is the only path the API enforces.'
11191
11226
  required:
@@ -11208,7 +11243,7 @@ components:
11208
11243
  postgresql: PostgreSQL database (default port 5432).
11209
11244
  mssql: Microsoft SQL Server (default port 1433).
11210
11245
  snowflake: Snowflake Data Cloud (requires snowflake.warehouse).
11211
- oracle: Oracle Database; runs in agent mode and requires a connection-level _agentId (default port 1521, uses serviceName instead of database).
11246
+ oracle: Oracle Database; runs in agent mode and requires a connection-level _agentId or _agentGroupId (default port 1521, uses serviceName instead of database).
11212
11247
  bigquery: Google BigQuery; requires service account credentials in the bigquery sub-object.
11213
11248
  redshift: Amazon Redshift — provisioned clusters or Redshift Serverless; authenticates with static access keys or an AWS IAM role iClient (redshift.authType).
11214
11249
  mariadb: MariaDB database (default port 3306).
@@ -11433,7 +11468,7 @@ components:
11433
11468
  iClient — a client secret, or on SQL Server a certificate — and
11434
11469
  `_iClientId` must reference it. The SQL Server connection form
11435
11470
  offers `azure-service-principal` in Cloud mode only and saves
11436
- `basic` for an on-premise connection (`_agentId` set).
11471
+ `basic` for an on-premise connection (`_agentId` or `_agentGroupId` set).
11437
11472
  default: basic
11438
11473
  examples:
11439
11474
  - basic
@@ -11899,9 +11934,9 @@ components:
11899
11934
  422 "Expected field: <field> to be present" if any of the three is missing. database is not
11900
11935
  required; when omitted, set it per operation instead.
11901
11936
  - |-
11902
- For an on-premise MongoDB instance, set the connection-level _agentId (the form's "On-premise"
11903
- mode) so traffic routes through a Celigo Agent. Cloud-reachable instances (including Atlas)
11904
- need no agent.
11937
+ For an on-premise MongoDB instance, bind the connection to one agent (connection-level
11938
+ _agentId) or to one agent group (_agentGroupId) — the form's "On-premise" mode — so traffic
11939
+ routes through a Celigo Agent. Cloud-reachable instances (including Atlas) need no agent.
11905
11940
  - |-
11906
11941
  ## AUTHENTICATION
11907
11942
  Username and password are optional — only required when the MongoDB server has
@@ -12601,8 +12636,8 @@ components:
12601
12636
  description: |-
12602
12637
  Configuration for filesystem connections. Used when the connection type is "filesystem".
12603
12638
  Provides access to directories on a Celigo on-premise Agent's host or mounted network
12604
- drives, so a connection-level `_agentId` is required — cloud-only deployments cannot use
12605
- this type. File-based PGP encryption/decryption is configured through the connection-level
12639
+ drives, so an on-premise binding is required — a connection-level `_agentId`, or an agent
12640
+ group through `_agentGroupId` — and cloud-only deployments cannot use this type. File-based PGP encryption/decryption is configured through the connection-level
12606
12641
  `pgp` object.
12607
12642
  properties:
12608
12643
  ping:
@@ -12648,9 +12683,10 @@ components:
12648
12683
  mounted network drives.
12649
12684
 
12650
12685
  ## AGENT REQUIREMENT
12651
- A Celigo Agent is REQUIRED for filesystem connections (set _agentId on the parent
12652
- connection object). The agent provides the filesystem access — cloud-only
12653
- deployments cannot use this connection type.
12686
+ A Celigo Agent is REQUIRED for filesystem connections: bind the parent connection
12687
+ object to one agent (_agentId) or to one agent group (_agentGroupId) — one of the
12688
+ two, never both. The agent provides the filesystem access — cloud-only deployments
12689
+ cannot use this connection type.
12654
12690
  token:
12655
12691
  type: object
12656
12692
  description: |
@@ -13124,13 +13160,17 @@ components:
13124
13160
  Configuration for JDBC (Java Database Connectivity) connections. Used when the connection
13125
13161
  type is "jdbc". Provides access through Java JDBC drivers to databases not covered by the
13126
13162
  rdbms type — such as NetSuite SuiteAnalytics, Databricks, DB2, and Workday. The driver runs
13127
- on a Celigo on-premise Agent, so most jdbc connections need a connection-level _agentId.
13163
+ on a Celigo on-premise Agent, so most jdbc connections need an on-premise binding — a
13164
+ connection-level _agentId, or an agent group through _agentGroupId.
13128
13165
  x-celigo-ai-guidance:
13129
13166
  - The POST is rejected with 422 if type-specific required fields are missing (see the per-type conditional rules).
13130
13167
  - |-
13131
- The agent and activedirectory types require a real connection-level _agentId: the POST fails with
13132
- 422 "The JDBC connection requires Agent. Expected field: _agentId to be present in the connection
13133
- doc." A placeholder cannot be created without one, so the user should install a Celigo Agent first.
13168
+ The agent and activedirectory types require a real on-premise binding — a connection-level
13169
+ _agentId, or an agent group through _agentGroupId (one of the two, never both; the agent-mode
13170
+ check accepts either — live-verified for both agent and activedirectory: a POST carrying only
13171
+ _agentGroupId is not answered with agent_mode_only): with neither, the POST fails with 422 "The JDBC
13172
+ connection requires Agent. Expected field: _agentId to be present in the connection doc." A
13173
+ placeholder cannot be created without one, so the user should install a Celigo Agent first.
13134
13174
  Other types commonly run on an agent too, but only these two are validator-enforced (live-verified
13135
13175
  celigo-labs-2 2026-06-11).
13136
13176
  x-celigo-ui-override: 'Two activedirectory requireds mirror the connection form rather than the API: password and port (default 389). The API creates an activedirectory connection without them (it auto-defaults port to 389), but the form requires both, so they are encoded to mirror the form. The workday user and password requireds are NOT form overrides — they are enforced by the API itself (POST returns 422 "Expected field: user/password to be present"). Per-type forms also require named entries inside jdbc.properties (netsuitejdbc AccountID + ServerDataSource; db2 AuthScheme; workday tenant/connectionType/authScheme; activedirectory LDAPVersion/BaseDN) — documented in prose since they live in the properties name/value array.'
@@ -3158,12 +3158,16 @@ components:
3158
3158
  - |-
3159
3159
  On a grouped record (the export groups rows, so the record is an
3160
3160
  array) only `create` can author output — build it from the rows with
3161
- `$[0].field`, `$[*].field`, or a `buildArrayHelper` over `$[*]`.
3161
+ `$[0].field`, `$[*].field`, or a `buildArrayHelper` over `$[*]`
3162
+ (`$.rows[0].field` and `$.rows[*]` with `inputContext: envelope`).
3162
3163
  `modify` has no object to overlay onto an array: the record passes
3163
- through untouched and the processor reports success. Either mode
3164
- reshapes the inside of one record; neither changes how many records
3165
- the page carries (that is the export's `preSavePage` hook) or whether
3166
- the export groups at all (that is its grouping setting).
3164
+ through untouched and the processor reports success. Paths written
3165
+ for one object record (`$.field`, an entry `$.lines[*]`) resolve
3166
+ nothing there, so `create` returns `{}` for each record, also with
3167
+ no error (live, 2026-10-30). Either mode reshapes the inside of one
3168
+ record; neither changes how many records the page carries (that is
3169
+ the export's `preSavePage` hook) or whether the export groups at all
3170
+ (that is its grouping setting).
3167
3171
  examples:
3168
3172
  - create
3169
3173
  - modify
@@ -3228,8 +3232,8 @@ components:
3228
3232
  - record
3229
3233
  - envelope
3230
3234
  x-enumDescriptions:
3231
- record: The transform processor evaluates `mappings[].extract` JSONPath against the flat record itself (`$.field`, no `record.` segment) — the default when absent.
3232
- envelope: The transform processor evaluates JSONPath against the wrapped runtime envelope `{record, job, testMode, settings, headers, queryParams}` (file-provider steps also carry `fileMeta`) — record fields need the `record.` segment (`$.record.field`), while `headers` and `queryParams` sit beside `record` (`$.headers['X-Id']`, `$.queryParams.src`).
3235
+ record: The transform processor evaluates `mappings[].extract` JSONPath against the flat record itself (`$.field`, no `record.` segment; a grouped record is the array of rows, `$[0].field`) — the default when absent.
3236
+ envelope: The transform processor evaluates JSONPath against the wrapped runtime envelope `{record, job, testMode, settings, headers, queryParams}` (file-provider steps also carry `fileMeta`) — record fields need the `record.` segment (`$.record.field`), and a grouped record sits under `rows` instead (`$.rows[0].field`), while `headers` and `queryParams` sit beside `record` (`$.headers['X-Id']`, `$.queryParams.src`).
3233
3237
  description: |
3234
3238
  Controls the JSON shape the transformTwoDotZero processor
3235
3239
  evaluates `mappings[].extract` JSONPath values against at
@@ -3245,24 +3249,38 @@ components:
3245
3249
  processor sees the FLAT record as its evaluation root.
3246
3250
  `mappings[].extract` JSONPath MUST anchor directly at
3247
3251
  `$` with NO `record.` segment — e.g. `"$.orderId"`,
3248
- `"$.customer.email"`; PLACEHOLDER extracts use
3252
+ `"$.customer.email"` on an object record, `"$[0].orderId"`
3253
+ on a grouped one; PLACEHOLDER extracts use
3249
3254
  `"$.PLACEHOLDER_<field>"`.
3250
3255
  This is the dominant Celigo idiom and the right choice for new transforms.
3251
3256
  - `envelope`: the processor sees a wrapped object
3252
3257
  `{record: {...}, job, testMode, settings, headers,
3253
3258
  queryParams}` (plus `fileMeta` on file-provider steps).
3254
3259
  `mappings[].extract` JSONPath MUST include the
3255
- `record.` segment for record fields — e.g.
3256
- `"$.record.orderId"` — and reads `headers` and
3260
+ `record.` segment for an object record's fields — e.g.
3261
+ `"$.record.orderId"`; a grouped record sits under `rows`
3262
+ instead (`"$.rows[0].orderId"`) — and reads `headers` and
3257
3263
  `queryParams` beside it (`$.headers['X-Id']`);
3258
3264
  PLACEHOLDER extracts use `"$.record.PLACEHOLDER_<field>"`.
3259
3265
  Pick this only when the transform was authored against
3260
3266
  the envelope shape on purpose.
3261
3267
  - |-
3262
- Handlebars expressions inside `extract`
3263
- (`{{record.field}}`, `{{dateFormat ... record.field}}`)
3264
- ALWAYS reference the `record` root regardless of
3268
+ Handlebars expressions inside `extract` reference the
3269
+ `record` root on an object record (`{{record.field}}`,
3270
+ `{{dateFormat ... record.field}}`) and `rows` on a
3271
+ grouped one (`{{rows.0.field}}`), regardless of
3265
3272
  `inputContext` — only JSONPath anchoring flips.
3273
+ - |-
3274
+ ## Grouped records
3275
+
3276
+ When the export groups rows, each record is an array of
3277
+ rows. In `record` mode JSONPath roots at that array
3278
+ (`$[0].field`, `$[*]`); `envelope` binds it as `rows`,
3279
+ not `record` — `$.rows[0].field`, and an entry
3280
+ `$.rows[*]` whose children read `$.rows.field` — while
3281
+ `$.record[0].field` and `$.record[*]` resolve nothing,
3282
+ with no error (live, 2026-10-30). Handlebars extracts
3283
+ read it as `rows` in both modes (`{{rows.0.field}}`).
3266
3284
  - |-
3267
3285
  In `envelope` mode the output is still a bare record: a
3268
3286
  `modify` transform returns the record with its mapped
@@ -3283,7 +3301,8 @@ components:
3283
3301
  ``mappings[].extract`` JSONPath values MUST anchor
3284
3302
  directly at ``$`` with NO ``record.`` segment — for
3285
3303
  example ``"$.orderId"`` or
3286
- ``"$.customer.email"``. PLACEHOLDER extracts use
3304
+ ``"$.customer.email"`` on an object record, and
3305
+ ``"$[0].orderId"`` on a grouped one. PLACEHOLDER extracts use
3287
3306
  ``"$.PLACEHOLDER_<field>"``. This is the dominant
3288
3307
  Celigo idiom and the right choice for new transforms.
3289
3308
 
@@ -3295,9 +3314,10 @@ components:
3295
3314
  ``record``) — the
3296
3315
  same runtime-context envelope Handlebars / SQL /
3297
3316
  GraphQL templates render against. ``mappings[].extract``
3298
- JSONPath values for record fields MUST include the
3317
+ JSONPath values for an object record's fields MUST include the
3299
3318
  ``record.`` segment — for example ``"$.record.orderId"``
3300
- or ``"$.record.customer.email"`` — while ``headers`` and
3319
+ or ``"$.record.customer.email"``; a grouped record's rows
3320
+ sit under ``rows`` instead (``"$.rows[0].orderId"``) — while ``headers`` and
3301
3321
  ``queryParams`` are read beside it
3302
3322
  (``"$.headers['X-Id']"``). PLACEHOLDER extracts
3303
3323
  use ``"$.record.PLACEHOLDER_<field>"``. Pick this
@@ -3310,8 +3330,9 @@ components:
3310
3330
 
3311
3331
  Handlebars expressions inside ``extract``
3312
3332
  (``{{record.field}}``,
3313
- ``{{dateFormat ... record.field}}``, etc.) ALWAYS
3314
- reference the runtime context's ``record`` root
3333
+ ``{{dateFormat ... record.field}}``, etc.) reference the
3334
+ runtime context's ``record`` root on an object record,
3335
+ and ``rows`` (``{{rows.0.field}}``) on a grouped one,
3315
3336
  regardless of ``inputContext`` — the Handlebars runtime
3316
3337
  always sees the wrapped envelope. Only JSONPath
3317
3338
  behavior flips with this field.