@celigo/api-specs 0.2.127 → 0.2.129

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/import.yml CHANGED
@@ -849,12 +849,12 @@ paths:
849
849
  value:
850
850
  data:
851
851
  - _id: 5d67ab3992080024596e0d8f
852
- email: nirav.pranami@celigo.com
852
+ email: jane@example.com
853
853
  verified: true
854
854
  developer: true
855
- name: sai kaivalya
856
- role: Associate QA Engineer
857
- company: celigo
855
+ name: Jane Doe
856
+ role: Engineer
857
+ company: acme
858
858
  createdAt: '2019-08-29T10:38:50.396Z'
859
859
  lastModified: '2024-09-25T14:17:50.802Z'
860
860
  importConfig:
@@ -903,8 +903,8 @@ paths:
903
903
  data:
904
904
  nlobjFieldIds:
905
905
  custrecord_user_id: 5d67ab3992080024596e0d8f
906
- custrecord_user_email: nirav.pranami@celigo.com
907
- custrecord_user_name: sai kaivalya
906
+ custrecord_user_email: jane@example.com
907
+ custrecord_user_name: Jane Doe
908
908
  custrecord_user_onboarded: 'true'
909
909
  nlobjSublistIds: {}
910
910
  originalSize: 1
@@ -1998,30 +1998,19 @@ components:
1998
1998
  would be bare ``{{{jsonSerialize record}}}`` with nothing
1999
1999
  around it, you don't need a template at all.
2000
2000
 
2001
- Production frequency: roughly 1 in 3 active HTTPImports leaves
2002
- this field empty (~35% null / empty array); closer to 1 in 2
2003
- once you count the additional ~12% of body entries that are
2004
- blank strings. The dominant case is "no body template".
2005
-
2006
2001
  Leave undefined for:
2007
2002
  - REST APIs accepting JSON CRUD payloads (the destination
2008
2003
  already wants exactly the post-mapped record shape).
2009
- - GraphQL destinations — do NOT author the body template here.
2010
- The dedicated GraphQL specialist owns the
2011
- ``{query, operationName, variables}`` shape and routes the
2012
- post-mapped record into ``variables`` automatically. Roughly
2013
- 96% of all wrapped-``jsonSerialize record`` uses in production
2014
- are GraphQL mutations; every one of those should go through
2015
- the GraphQL specialist, not through this body template.
2016
2004
  - Any case where the destination wants the mapped record as-is.
2005
+
2006
+ GraphQL destinations are different: the body is the stringified
2007
+ ``{query, operationName, variables}`` envelope described under
2008
+ ``formType``, with the post-mapped record passed in
2009
+ ``variables``.
2017
2010
  - |-
2018
- ## SET THIS FIELD when one of the production patterns below applies
2011
+ ## SET THIS FIELD when one of the patterns below applies
2019
2012
 
2020
- Production grounds these patterns: 36,445 active body entries
2021
- across HTTPImports in the last 30 days (Celigo-internal users
2022
- excluded). Choose the pattern that fits the destination's
2023
- shape, then write marker ``instructions`` describing intent
2024
- (let the Handlebars specialist produce the literal template).
2013
+ Choose the pattern that fits the destination's shape.
2025
2014
 
2026
2015
  ### Pattern A — ``{{{jsonSerialize record}}}`` inside a static wrapper
2027
2016
 
@@ -2033,13 +2022,12 @@ components:
2033
2022
  destination's field shape; the body owns the transport-level
2034
2023
  scaffolding.
2035
2024
 
2036
- Production frequency: roughly 115 / 36,445 (0.3%) of body
2037
- entries when the destination is non-GraphQL. Rare but real;
2038
- the use cases that fit are obvious when the user describes
2039
- them ("wrap each request in a SQS-style message envelope",
2040
- "add a batch header with timestamp + interface name", etc.).
2025
+ Rare for non-GraphQL destinations, but real; the use cases
2026
+ that fit are obvious when the user describes them ("wrap each
2027
+ request in a SQS-style message envelope", "add a batch header
2028
+ with timestamp + interface name", etc.).
2041
2029
 
2042
- Real production shapes:
2030
+ Typical shapes:
2043
2031
  - Message-bus envelope:
2044
2032
  ``{"MessageBody": {"class": "EntityUpdate", "payload": {{{jsonSerialize record}}}}}``
2045
2033
  - Metadata wrap:
@@ -2050,8 +2038,7 @@ components:
2050
2038
  NEVER emit BARE ``{{{jsonSerialize record}}}`` with no wrapper.
2051
2039
  The platform sends the post-mapped record as JSON automatically
2052
2040
  when body is undefined; bare ``jsonSerialize record`` produces
2053
- identical wire output and shows up in 0.7% of production body
2054
- entries — every one of those is redundant config the user has
2041
+ identical wire output, so it is redundant config the user has
2055
2042
  to maintain for zero benefit.
2056
2043
 
2057
2044
  ### Pattern B — Batch / page wrapper around mapped records
@@ -2098,15 +2085,14 @@ components:
2098
2085
  anti-pattern is the ``jsonSerialize`` wrap, not any particular
2099
2086
  path shape.
2100
2087
 
2101
- - Production frequency: 15 / 36,445 (0.04%) — essentially never.
2088
+ - Essentially never needed.
2102
2089
  - Failure mode: the body validator sees the PRE-mapped sample
2103
2090
  shape, can't resolve the post-mapped path during validation,
2104
2091
  and ``jsonSerialize`` on an unresolved path raises
2105
2092
  ``Helper {{jsonSerialize}} expects an argument`` — the
2106
2093
  template fails validation even when it would render at
2107
- runtime. The specialist enters a retry loop, tries variations
2108
- (``getValue`` wrappers, alternate paths), and converges on
2109
- failure.
2094
+ runtime. Variations (``getValue`` wrappers, alternate paths)
2095
+ fail the same way.
2110
2096
 
2111
2097
  If you find yourself wanting to reference a per-field
2112
2098
  post-mapped scalar wrapped in ``jsonSerialize``, your situation
@@ -2169,16 +2155,6 @@ components:
2169
2155
  before choosing: form-data APIs get the parts array above;
2170
2156
  multipart/related APIs get the hand-authored document. Never
2171
2157
  mix the two shapes in one body.
2172
- - |-
2173
- ## Marker instructions style
2174
-
2175
- When emitting a ``$agent: handlebars`` marker at this field,
2176
- write the ``instructions`` as INTENT (what the body should
2177
- produce: destination fields, shape, encoding), not as literal
2178
- Handlebars syntax. Embedding literal ``{{{jsonSerialize record.X}}}``
2179
- in the instructions risks the specialist following it verbatim
2180
- even when a simpler template would work — one of the ways the
2181
- per-field anti-pattern above gets introduced.
2182
2158
  examples:
2183
2159
  - - '{"name": "{{record.name}}", "email": "{{record.email}}"}'
2184
2160
  - - '{"requestData": {{{jsonSerialize record}}}}'
@@ -2270,9 +2246,7 @@ components:
2270
2246
  - |-
2271
2247
  The value MUST match the ``name`` of a lookup entry in ``http.lookups``.
2272
2248
  The lookup config itself (HTTP path, method, extract,
2273
- fallback chain) is authored separately — typically by the LookupsAgent
2274
- specialist via a ``$agent:
2275
- lookup`` marker.
2249
+ fallback chain) is defined separately, in that entry.
2276
2250
  - |-
2277
2251
  ## Mutually exclusive with ``existingExtract``
2278
2252
 
@@ -2752,9 +2726,8 @@ components:
2752
2726
 
2753
2727
  The Celigo platform persists lookups in TWO locations on an HTTP
2754
2728
  import: top-level ``lookups`` and ``http.lookups``. Both arrays
2755
- MUST hold byte-for-byte identical content. The import engine
2756
- and the MappingsAgent both maintain this mirror on every save —
2757
- callers never have to write both manually.
2729
+ MUST hold byte-for-byte identical content, so write both on
2730
+ every save.
2758
2731
  - |-
2759
2732
  ## Static vs dynamic vs cached
2760
2733
 
@@ -3030,7 +3003,7 @@ components:
3030
3003
  computedObject.fileName." — an error the platform labels source `internal` although the
3031
3004
  template is the cause. The run-time-proven way to keep the source file's name on a
3032
3005
  `blob: true` import is `{{record.fileMeta.fileName}}` on `file.fileName` with this field
3033
- omitted (the production runs of one FTP blob import set exactly that); the same template
3006
+ omitted (recorded runs of an FTP blob import set exactly that); the same template
3034
3007
  on this field has not been run. The field's editor preview (data version 1, its default)
3035
3008
  exposes the record as `data` —
3036
3009
  the `{blobKey, fileMeta}` record on a blob import, the page's record array otherwise —
@@ -3410,8 +3383,8 @@ components:
3410
3383
  ## Mirror invariant
3411
3384
  The Celigo platform persists lookups in TWO locations on a JDBC
3412
3385
  import: top-level `lookups` and `jdbc.lookups`. Both arrays
3413
- must hold byte-for-byte identical content — the MappingsAgent
3414
- writes both on every save.
3386
+ must hold byte-for-byte identical content, so write both on every
3387
+ save.
3415
3388
  x-celigo-agent:
3416
3389
  - lookup
3417
3390
  Mongodb:
@@ -3890,25 +3863,22 @@ components:
3890
3863
  substitutions FIRST against the incoming source record (pre-mapped),
3891
3864
  then the substituted expression is sent to NetSuite as a saved-search query.
3892
3865
  - |-
3893
- ## Handlebars conventions (production grounded)
3866
+ ## Handlebars conventions
3894
3867
 
3895
3868
  - **No `record.` prefix** — substitutions reference top-level
3896
3869
  source-record fields directly. `{{{id}}}` / `{{{Id}}}` /
3897
3870
  `{{{externalid}}}` / `{{{[Internal ID]}}}` — NOT
3898
- `{{{record.id}}}`. Production: only 122 / 55,328 expressions
3899
- (0.2%) use the `record.` prefix; the dominant convention is
3900
- top-level paths.
3901
- - **Triple braces `{{{...}}}`** are the preferred form (78% of
3902
- production); double-brace `{{...}}` also works for cases
3903
- where you want the platform's default HTML-escape (rare in
3904
- this field).
3871
+ `{{{record.id}}}`. Top-level paths are the established
3872
+ convention.
3873
+ - **Triple braces `{{{...}}}`** are the preferred form;
3874
+ double-brace `{{...}}` also works for cases where you want
3875
+ the platform's default HTML-escape (rare in this field).
3905
3876
  - **Bracket notation for field names with spaces or special
3906
3877
  chars**: `{{{[Field With Spaces]}}}`, `{{{[Internal ID]}}}`.
3907
- Anchored to ~10% of production expressions.
3908
3878
  - |-
3909
3879
  ## Canonical patterns
3910
3880
 
3911
- ### Simple lookup by internal ID (most common — 8.4% of all expressions)
3881
+ ### Simple lookup by internal ID (most common)
3912
3882
 
3913
3883
  `["internalid","is","{{{id}}}"]`
3914
3884
 
@@ -3979,8 +3949,8 @@ components:
3979
3949
  `is` / `equalto` / `internalid anyof` value to `isempty` before the
3980
3950
  search. On `restletVersion: suiteapp2.0` that search is not treated as
3981
3951
  "no match": it can return existing records, and `addupdate` then
3982
- updates one of them — an unrelated record receives the mapping (seen
3983
- in production as `cant_modify_sub` on a customer the record never
3952
+ updates one of them — an unrelated record receives the mapping (for
3953
+ example, a `cant_modify_sub` error on a customer the record never
3984
3954
  named). SuiteBundle and SuiteApp 1.0 discard a blank `internalid`
3985
3955
  match and create. Design so the operational lookup never renders
3986
3956
  empty: key it on a value every record carries (the source id stored
@@ -4067,10 +4037,6 @@ components:
4067
4037
  - |-
4068
4038
  Validated via the dedicated `PUT /v1/netsuiteDA/previewImportMappingFields`
4069
4039
  endpoint (NOT `/v1/processors/mapperProcessor`).
4070
- - |-
4071
- Managed by the MappingsAgent (`$agent: mapping`) — resource-authoring
4072
- agents must emit a specialist marker at this field rather than
4073
- generating the mapping inline.
4074
4040
  properties:
4075
4041
  fields:
4076
4042
  type: array
@@ -4147,8 +4113,8 @@ components:
4147
4113
  this block ONLY when the destination record type genuinely requires the
4148
4114
  subrecord.
4149
4115
  - |-
4150
- **Real-world `recordType` values** (ranked by
4151
- production frequency across NetSuite DA imports):
4116
+ **Common `recordType` values** (most common
4117
+ first):
4152
4118
  * `inventorydetail` — by far the most common.
4153
4119
  Serial / lot / bin assignments on sales-order,
4154
4120
  item-fulfillment, purchase-order, and inventory-
@@ -4218,8 +4184,8 @@ components:
4218
4184
  type: string
4219
4185
  description: |
4220
4186
  Secondary reference-field identifier used on a
4221
- small fraction of subrecord blocks in production
4222
- (~3%). Exact semantics are not publicly
4187
+ small fraction of subrecord blocks. Exact
4188
+ semantics are not publicly
4223
4189
  documented by Celigo — match the value on
4224
4190
  existing resources when present; do NOT
4225
4191
  synthesize one. Leave unset unless a template
@@ -4248,6 +4214,22 @@ components:
4248
4214
  existing record: on an `add`-only operation every record fails with
4249
4215
  `The mapping condition:"record_updated" not supported for the
4250
4216
  operation`. It works on `addupdate` and `update`.
4217
+ - |-
4218
+ The condition is one of the fixed `when` values — there is no
4219
+ predicate over a source field ("when `customer.id` is not empty",
4220
+ "when `channel.name` is Point of Sale" cannot be written here).
4221
+ `extract_not_empty` is the only source-driven gate: on a lookup row
4222
+ it reads the row's `extract`, and when that is empty the row is
4223
+ skipped and the field is left unset — nothing substitutes a value.
4224
+ Value-dependent behaviour (a fallback record when the key is
4225
+ missing) belongs inside the lookup's `expression` (see
4226
+ `lookups[].expression`).
4227
+ - |-
4228
+ Two rows with the same `generate` are not a fallback pair: the
4229
+ last row for a destination decides it alone — when its condition
4230
+ skips it the field stays empty even if an earlier row produced a
4231
+ value, and when it applies it overwrites the earlier row's value
4232
+ (`ignore_if_set` reads the target record, not an earlier row).
4251
4233
  properties:
4252
4234
  lookupName:
4253
4235
  type: string
@@ -4402,9 +4384,8 @@ components:
4402
4384
  this block ONLY when the destination record type genuinely requires the
4403
4385
  subrecord.
4404
4386
  - |-
4405
- **Real-world `recordType` values** (ranked
4406
- by production frequency across NetSuite DA
4407
- imports):
4387
+ **Common `recordType` values** (most
4388
+ common first):
4408
4389
  * `inventorydetail` — by far the most
4409
4390
  common. Serial / lot / bin assignments on
4410
4391
  sales-order, item-fulfillment, purchase-
@@ -4472,9 +4453,9 @@ components:
4472
4453
  type: string
4473
4454
  description: |
4474
4455
  Secondary reference-field identifier used
4475
- on a small fraction of subrecord blocks
4476
- in production (~3%). Exact semantics are
4477
- not publicly documented by Celigo — match
4456
+ on a small fraction of subrecord blocks.
4457
+ Exact semantics are not publicly
4458
+ documented by Celigo — match
4478
4459
  the value on existing resources when
4479
4460
  present; do NOT synthesize one. Leave
4480
4461
  unset unless a template clearly requires
@@ -4503,6 +4484,18 @@ components:
4503
4484
  rows in live verification. Do not rely on that tolerance — use
4504
4485
  `when: record_updated` only on operations that can update
4505
4486
  records (`addupdate` / `update`).
4487
+ - |-
4488
+ The condition is one of the fixed `when` values — the same
4489
+ closed set as body rows, with no predicate over a source
4490
+ field; `extract_not_empty` skips the row on the lines whose
4491
+ extract is empty and leaves that line's field unset. Two
4492
+ sublist rows with the same `generate` are not a fallback
4493
+ pair either, and the order rule is not the body rows': among
4494
+ extract rows the last row decides each line alone (a skipped
4495
+ last row leaves the line's field unset even when an earlier
4496
+ row produced a value), while a hard-coded row's value lands
4497
+ on every line whatever its position — a later conditional
4498
+ extract row does not override it.
4506
4499
  properties:
4507
4500
  lookupName:
4508
4501
  type: string
@@ -4629,6 +4622,32 @@ components:
4629
4622
  shows what the expression produced for that line. With
4630
4623
  `allowFailures: true` the `default` value is used instead
4631
4624
  and no error is raised. Give every branch an output.
4625
+ - |-
4626
+ ## An empty substitution searches `isempty`
4627
+
4628
+ When the source path a criterion reads is null or absent
4629
+ (`["custentity_celigo_etail_cust_id","is","{{{customer.id}}}"]`
4630
+ on an order with no customer), the engine does not fail on
4631
+ the missing input: it searches the field with an `isempty`
4632
+ criterion, so the lookup now matches every target record
4633
+ whose field is BLANK. Two or more such records fail the
4634
+ record with `VALUE_LOOKUP_FAILED` — `More than one match
4635
+ for "[<field>,"isempty"]" for the record type "<recordType>"`
4636
+ (the message quotes the search field, never the empty
4637
+ source path); none fail it as `Could not find a match`;
4638
+ exactly one silently resolves to that record. Keep an empty
4639
+ key out of the search inside the expression — branch on
4640
+ the key: `{{#if customer.id}}[["custentity_celigo_etail_cust_id",
4641
+ "is","{{{customer.id}}}"]]{{else}}[["internalid","anyof",
4642
+ "<fallback internal id>"]]{{/if}}` routes records without a
4643
+ key to a fallback record while records with a key keep
4644
+ fail-on-miss; or render a value that can never match in the
4645
+ else branch and set `allowFailures: true` with `default`.
4646
+ A `searchField` / `operator` lookup (no `expression`) never
4647
+ reaches this state: an empty extract fails the record with
4648
+ `STATIC_MAPPING_ERROR` — `Exported value is empty/undefined
4649
+ for the field: $.<path>` — and resolves to `default` when
4650
+ `allowFailures` is true.
4632
4651
  - |-
4633
4652
  ## The mapping preview cannot evaluate `[*]` inside a block-helper argument
4634
4653
 
@@ -4662,19 +4681,34 @@ components:
4662
4681
  useDefaultOnMultipleMatches:
4663
4682
  type: boolean
4664
4683
  description: |-
4665
- Controls behaviour when the search matches more than one
4666
- record. When true, the `default` value is returned instead
4667
- of raising an ambiguous-match error. When false (default),
4668
- multiple matches are treated as a failure.
4684
+ When true and `allowFailures` is also true, a search that
4685
+ matches more than one record resolves to `default` instead
4686
+ of failing the record. Has no effect while `allowFailures`
4687
+ is false — an ambiguous match then fails the record whatever
4688
+ this flag says.
4689
+ x-celigo-ai-guidance:
4690
+ - |-
4691
+ Set it together with `allowFailures: true` whenever the
4692
+ search value can be empty or duplicated: with
4693
+ `allowFailures: true` alone an ambiguous match resolves to
4694
+ ONE of the matching records with no error, and with this
4695
+ flag alone the record still fails `More than one match`.
4696
+ Every ambiguous match then becomes `default`, a genuinely
4697
+ duplicated key included — when that must still fail, keep
4698
+ `allowFailures` false and handle the empty key in the
4699
+ `expression` instead (see `expression`).
4669
4700
  allowFailures:
4670
4701
  type:
4671
4702
  - boolean
4672
4703
  - 'null'
4673
4704
  description: |-
4674
4705
  When true, a lookup miss (no matching record and no
4675
- `default`) resolves to `null` and the import continues.
4676
- When false (default), a miss halts the record. May be
4677
- stored as null (treated as unset).
4706
+ `default`) resolves to `null` and the import continues, and
4707
+ a search matching more than one record resolves to one of
4708
+ them unless `useDefaultOnMultipleMatches` routes it to
4709
+ `default`. When false (default), a miss and an ambiguous
4710
+ match both halt the record. May be stored as null (treated
4711
+ as unset).
4678
4712
  map:
4679
4713
  type:
4680
4714
  - object
@@ -4701,8 +4735,8 @@ components:
4701
4735
  ## Mirror invariant
4702
4736
  The Celigo platform persists NetSuite Distributed Import lookups in
4703
4737
  TWO locations: `netsuite_da.lookups` and top-level `lookups`.
4704
- Both arrays must hold byte-for-byte identical content — the
4705
- MappingsAgent writes both on every save.
4738
+ Both arrays must hold byte-for-byte identical content, so write
4739
+ both on every save.
4706
4740
  - |-
4707
4741
  ## One context for body and sublist lookups
4708
4742
  Every lookup's `expression` renders against the whole source
@@ -5100,8 +5134,8 @@ components:
5100
5134
  **Mirror invariant**
5101
5135
  The Celigo platform persists lookups in TWO locations on an RDBMS
5102
5136
  import: top-level `lookups` and `rdbms.lookups`. Both arrays
5103
- must hold byte-for-byte identical content — the MappingsAgent
5104
- writes both on every save.
5137
+ must hold byte-for-byte identical content, so write both on every
5138
+ save.
5105
5139
  items:
5106
5140
  type: object
5107
5141
  properties:
@@ -5226,7 +5260,7 @@ components:
5226
5260
  - **Nested fields**: `{{record.properties.email}}` (auto-quoted)
5227
5261
  or `{{{record.properties.email}}}` (raw).
5228
5262
  - |-
5229
- ## EXAMPLES (production-grounded)
5263
+ ## EXAMPLES
5230
5264
 
5231
5265
  - INSERT (string columns, auto-quoted): `["INSERT INTO customers (name, email) VALUES ({{record.name}}, {{record.email}})"]`
5232
5266
  - INSERT (mixed numeric + string): `["INSERT INTO orders (qty, sku) VALUES ({{{record.qty}}}, {{record.sku}})"]`
@@ -6087,8 +6121,7 @@ components:
6087
6121
  "wrapper" JavaScript module that invokes a custom function (typically to
6088
6122
  integrate with a system Celigo doesn't have a first-class connector for).
6089
6123
  - |-
6090
- Wrapper imports use Mapper 1.0 for field mappings and the generic Celigo lookup shape.
6091
- The MappingsAgent operates in `v1_standard` mode for this adaptor type —
6124
+ Wrapper imports use Mapper 1.0 for field mappings and the generic Celigo lookup shape:
6092
6125
  mappings live in `resource.mapping` (fields/lists) and lookups mirror at
6093
6126
  `resource.lookups` and `resource.wrapper.lookups`.
6094
6127
  properties:
@@ -6136,8 +6169,8 @@ components:
6136
6169
  ## Mirror invariant
6137
6170
  The Celigo platform persists lookups in TWO locations on a
6138
6171
  Wrapper import: top-level `lookups` and `wrapper.lookups`.
6139
- Both arrays must hold byte-for-byte identical content — the
6140
- MappingsAgent writes both on every save.
6172
+ Both arrays must hold byte-for-byte identical content, so write
6173
+ both on every save.
6141
6174
  if:
6142
6175
  not:
6143
6176
  propertyNames:
@@ -6172,8 +6205,8 @@ components:
6172
6205
  **Mirror invariant**
6173
6206
  The Celigo platform stores lookups in TWO locations on a Salesforce
6174
6207
  import resource: top-level ``lookups`` and ``salesforce.lookups``.
6175
- Both arrays must hold byte-for-byte identical content — the
6176
- MappingsAgent writes both on every save.
6208
+ Both arrays must hold byte-for-byte identical content, so write
6209
+ both on every save.
6177
6210
 
6178
6211
  **Static vs dynamic lookups**
6179
6212
  - **Static** — only ``map`` + optional ``default``. No Salesforce
@@ -8339,10 +8372,8 @@ components:
8339
8372
  update this field — the wrapper itself stays the same shape,
8340
8373
  just points at a different Tool.
8341
8374
  - |-
8342
- The agent that authors the wrapper does not author the Tool itself;
8343
- Tool authoring goes through the Tools page agent's `create_tool` / `update_tool` tools (or,
8344
- when invoked from a flow / API / Tool dispatch path,
8345
- through the Tool Builder which delegates to the Tool engine's brief-based entry point).
8375
+ Writing the wrapper does not create or change the Tool itself;
8376
+ author the Tool as its own resource through `/v1/tools`.
8346
8377
  examples:
8347
8378
  - 69ce8ae7cbbb51405ae42ae5
8348
8379
  overrides:
@@ -13305,7 +13336,7 @@ components:
13305
13336
  no message text) and never cascades or promotes on its own; `Draft`
13306
13337
  descendants are kept as they are, and a `Draft` parent does not gate
13307
13338
  its children. The UI's Set inactive on a parent marks the parent and
13308
- every child `Inactive` (IO-166197). Re-enabling a child
13339
+ every child `Inactive`. Re-enabling a child
13309
13340
  means re-enabling its ancestors in the same payload. Edits that keep
13310
13341
  existing rows must carry their stored status forward — rewriting a
13311
13342
  `Draft` or `Inactive` row to `Active` turns a row the user parked
@@ -14344,7 +14375,7 @@ components:
14344
14375
  no message text) and never cascades or promotes on its own; `Draft`
14345
14376
  descendants are kept as they are, and a `Draft` parent does not gate
14346
14377
  its children. The UI's Set inactive on a parent marks the parent and
14347
- every child `Inactive` (IO-166197). Re-enabling a child
14378
+ every child `Inactive`. Re-enabling a child
14348
14379
  means re-enabling its ancestors in the same payload. Edits that keep
14349
14380
  existing rows must carry their stored status forward — rewriting a
14350
14381
  `Draft` or `Inactive` row to `Active` turns a row the user parked
@@ -14783,7 +14814,7 @@ components:
14783
14814
  ``{record: {...}, settings: ..., job: ...}`` (plus
14784
14815
  ``fileMeta`` on file-provider steps) — the
14785
14816
  same runtime-context envelope Handlebars / SQL /
14786
- GraphQL specialists consume. ``mappings[].extract``
14817
+ GraphQL templates render against. ``mappings[].extract``
14787
14818
  JSONPath values MUST include the ``record.`` segment
14788
14819
  — for example ``"$.record.orderId"`` or
14789
14820
  ``"$.record.customer.email"``. PLACEHOLDER extracts
@@ -14811,9 +14842,8 @@ components:
14811
14842
  ``inputContext: record`` makes the contract
14812
14843
  self-documenting and prevents the transform from
14813
14844
  drifting into envelope mode if an upstream change ever
14814
- changes the platform default. The TransformsAgent
14815
- reads this value off the transform config and threads
14816
- it into the generator's prompt so the JSONPath form
14845
+ changes the platform default. Read this value before
14846
+ writing ``mappings[].extract`` so the JSONPath form
14817
14847
  matches the runtime root.
14818
14848
  - |-
14819
14849
  ## fileMeta on file-provider steps
@@ -16081,7 +16111,7 @@ components:
16081
16111
  Optional on a `blob: true` file-provider import: when omitted the platform reads the
16082
16112
  record's root `blobKey` — the field a blob export emits on its `{blobKey, fileMeta}`
16083
16113
  record — so a file-transfer flow needs no `blobKeyPath`. Observed on an FTP import
16084
- (production runs writing files with no `blobKeyPath`) and on a Google Drive folder
16114
+ (recorded runs writing files with no `blobKeyPath`) and on a Google Drive folder
16085
16115
  upload (`http.type: file`, the marketplace file-transfer template's shape); other
16086
16116
  file providers were not probed. Set it only when a response mapping placed the key
16087
16117
  elsewhere; on those two providers its absence is not a cause of upload failures.
@@ -16263,13 +16293,9 @@ components:
16263
16293
  - |-
16264
16294
  JavaScript hook references attached to lifecycle stages of the import.
16265
16295
  Engage hooks ONLY when the user explicitly wants scripting OR a requirement
16266
- cannot be expressed through declarative specialists (mapping / filter /
16296
+ cannot be expressed through declarative configuration (mappings / filters /
16267
16297
  responseTransform).
16268
16298
  Hooks bypass the platform's declarative validation, so use them sparingly.
16269
- - |-
16270
- Phase A authoring scope: ``preMap`` and ``postMap`` only.
16271
- ``postSubmit`` and ``postAggregate`` are Phase B's territory (they author
16272
- against the real destination response).
16273
16299
  properties:
16274
16300
  preMap:
16275
16301
  type: object
@@ -16286,7 +16312,7 @@ components:
16286
16312
  before the mapping sees them (drop archived records,
16287
16313
  normalize date strings, split a record into many). Don't
16288
16314
  engage for static value substitution or simple field
16289
- renames — that's the mapping specialist's job.
16315
+ renames — mappings handle those.
16290
16316
 
16291
16317
  Runtime contract: ``options.data[]`` (the page of upstream
16292
16318
  records) → array of the same length.
@@ -16328,11 +16354,6 @@ components:
16328
16354
  Post-submit JavaScript hook — runs AFTER each batch of
16329
16355
  destination writes, on the destination's response.
16330
16356
 
16331
- **Phase B owns this slot.** Phase A must NOT emit a
16332
- ``$agent`` marker here (see "Phase A vs Phase B ownership"
16333
- in the engine prompt). Phase B authors this against the
16334
- real probe response.
16335
-
16336
16357
  Runtime contract: ``options.responseData[]`` (one per
16337
16358
  submitted record; ``{statusCode, errors, _json, ...}`` —
16338
16359
  ``id`` is present on real runs but absent from the
@@ -16357,11 +16378,6 @@ components:
16357
16378
  ``invalid_hook`` ("unsupported postAggregate hook") —
16358
16379
  never emit it for non-file adaptors.
16359
16380
 
16360
- **Phase B owns this slot.** Phase A must NOT emit a
16361
- ``$agent`` marker here (see "Phase A vs Phase B ownership"
16362
- in the engine prompt). Phase B authors this against the
16363
- real probe response.
16364
-
16365
16381
  Runtime contract: ``options.postAggregateData``
16366
16382
  (``{success, _json, code, message, source}``) → no return
16367
16383
  value; side effects only (logging, notifying, downstream
@@ -16413,8 +16429,7 @@ components:
16413
16429
 
16414
16430
  REQUIRED for ``SalesforceImport`` and ``WrapperImport``: these
16415
16431
  adaptors must use Mapper 1.0; Mapper 2.0 is not supported for
16416
- them. The agent's adaptor→mode classifier routes them here
16417
- automatically. ``NetSuiteDistributedImport`` is also V1-required
16432
+ them. ``NetSuiteDistributedImport`` is also V1-required
16418
16433
  but uses a NetSuite-specific variant at its adaptor-scoped copy
16419
16434
  ``netsuite_da.mapping`` (richer sublist / subRecord vocabulary) —
16420
16435
  not this field.
@@ -16423,17 +16438,9 @@ components:
16423
16438
  ``FTPImport``, ``JDBCImport``, etc.) when the user explicitly asks
16424
16439
  for Mapper 1.0 — e.g. when the import wraps a legacy v1 connector
16425
16440
  or is being migrated from an older integration. Those adaptors
16426
- default to Mapper 2.0 at the top-level ``mappings`` (plural) field;
16427
- see :mod:`celigo_agents.helpers.mappings.mapping_mode` for the
16428
- adaptor → default-mode classifier. Do not emit a marker here
16429
- unsolicited; the v2 default produces better output for modern
16430
- connectors.
16431
- - |-
16432
- ## Specialist marker
16433
-
16434
- Managed by the MappingsAgent (``$agent: mapping``) — resource-
16435
- authoring agents must emit a specialist marker at this field
16436
- rather than generating mapping content inline.
16441
+ default to Mapper 2.0 at the top-level ``mappings`` (plural) field.
16442
+ Do not set this field unsolicited; the v2 default produces better
16443
+ output for modern connectors.
16437
16444
  - |-
16438
16445
  Allowed (but not the default) on other import adaptors such as
16439
16446
  ``HTTPImport``, ``RDBMSImport``, ``FTPImport``, and
@@ -16450,8 +16457,8 @@ components:
16450
16457
 
16451
16458
  Lookups referenced by ``lookupName`` live on the top-level
16452
16459
  ``resource.lookups`` array (mirrored under the adaptor key for
16453
- adaptors that maintain their own copy — see the mirror pattern in
16454
- the MappingsAgent architecture). Lookups are independent of this
16460
+ adaptors that maintain their own copy — see the mirror invariant
16461
+ on ``lookups``). Lookups are independent of this
16455
16462
  mapping: they are neither created nor cleared automatically when
16456
16463
  this mapping changes.
16457
16464
  properties:
@@ -16566,9 +16573,8 @@ components:
16566
16573
  - |-
16567
16574
  ## Mirror invariant
16568
16575
 
16569
- Both arrays MUST hold byte-for-byte identical content. The
16570
- MappingsAgent writes both on every save and treats them as a
16571
- single logical field.
16576
+ Both arrays MUST hold byte-for-byte identical content: write
16577
+ both on every save and treat them as a single logical field.
16572
16578
  - |-
16573
16579
  ## Shape
16574
16580
 
@@ -16629,7 +16635,7 @@ components:
16629
16635
  - ``envelope``: the mapper sees a wrapped object of the shape
16630
16636
  ``{record: {...}, settings: ..., job: ...}`` — the same
16631
16637
  runtime-context envelope Handlebars / SQL / GraphQL
16632
- specialists consume. ``mappings[].extract`` JSONPath values
16638
+ templates render against. ``mappings[].extract`` JSONPath values
16633
16639
  MUST include the ``record.`` segment — for example
16634
16640
  ``"$.record.orderId"`` or ``"$.record.customer.email"``.
16635
16641
  PLACEHOLDER extracts use ``"$.record.PLACEHOLDER_<field>"``.
@@ -16654,9 +16660,9 @@ components:
16654
16660
  platform, but emitting ``inputContext: record`` makes the
16655
16661
  contract self-documenting and prevents the mapper from drifting
16656
16662
  into envelope mode if an upstream change ever changes the
16657
- platform default. The MappingsAgent reads this value off the
16658
- resource and threads it into the mapping generator's prompt so
16659
- the JSONPath form matches the runtime root.
16663
+ platform default. Read this value before writing
16664
+ ``mappings[].extract`` so the JSONPath form matches the runtime
16665
+ root.
16660
16666
  settingsForm:
16661
16667
  x-celigo-agent:
16662
16668
  - settings_form
package/dist/job.yml CHANGED
@@ -424,8 +424,8 @@ paths:
424
424
  - |-
425
425
  Returns a paged collection of currently running jobs for the dashboard.
426
426
  The request body supports filtering by integration, flow, status, and
427
- application. The platform requires ``sandbox`` in the body; Ora is
428
- production-only so it always sends ``false``.
427
+ application. ``sandbox`` is deprecated; when a caller still sends it,
428
+ ``false`` selects production.
429
429
  - |-
430
430
  Do not send time_gt or time_lte; they are not on this request. To find jobs
431
431
  stuck for longer than a threshold, compare each job's createdAt or startedAt