@celigo/api-specs 0.2.128 → 0.2.130

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/sync.yml CHANGED
@@ -1169,7 +1169,7 @@ paths:
1169
1169
  numLoadedRecords: 12450
1170
1170
  numExtractedRecords: 12450
1171
1171
  numTablesSynced: 3
1172
- triggeredBy: user:tyler.lamparter@celigo.com
1172
+ triggeredBy: user:jane@example.com
1173
1173
  runType: normal
1174
1174
  - _id: 6821b00a39db7c2b9cdc0d10
1175
1175
  flowExecutionGroupId: 6821b00a39db7c2b9cdc0d09
@@ -1347,7 +1347,7 @@ paths:
1347
1347
  numLoadedRecords: 12450
1348
1348
  numExtractedRecords: 12450
1349
1349
  numTablesSynced: 3
1350
- triggeredBy: user:tyler.lamparter@celigo.com
1350
+ triggeredBy: user:jane@example.com
1351
1351
  runType: normal
1352
1352
  running:
1353
1353
  summary: A currently running sync job
@@ -1997,7 +1997,7 @@ paths:
1997
1997
  type: string
1998
1998
  description: User display name.
1999
1999
  examples:
2000
- - Tyler Lamparter
2000
+ - Jane Doe
2001
2001
  fieldChanges:
2002
2002
  type: array
2003
2003
  description: Fields that were modified. Dot-notation paths reach into nested objects.
@@ -2043,7 +2043,7 @@ paths:
2043
2043
  byUser:
2044
2044
  _id: 624cb0346309dc3a543733a2
2045
2045
  email: user@example.com
2046
- name: Tyler Lamparter
2046
+ name: Jane Doe
2047
2047
  fieldChanges:
2048
2048
  - fieldPath: name
2049
2049
  oldValue: ''
@@ -2061,7 +2061,7 @@ paths:
2061
2061
  byUser:
2062
2062
  _id: 624cb0346309dc3a543733a2
2063
2063
  email: user@example.com
2064
- name: Tyler Lamparter
2064
+ name: Jane Doe
2065
2065
  fieldChanges:
2066
2066
  - fieldPath: salesforce.refreshToken
2067
2067
  newValue: '********'
@@ -4142,7 +4142,7 @@ components:
4142
4142
  Database in the destination warehouse the sync loads into; it must already exist.
4143
4143
  For Google BigQuery this is the GCP project id the tables are created in
4144
4144
  (`project.dataset.table`).
4145
- x-celigo-ui-override: For a BigQuery destination the Create Sync wizard shows no database picker and fills this field with the selected connection's rdbms.bigquery.projectId (IO-195900).
4145
+ x-celigo-ui-override: For a BigQuery destination the Create Sync wizard shows no database picker and fills this field with the selected connection's rdbms.bigquery.projectId.
4146
4146
  examples:
4147
4147
  - ANALYTICS_DB
4148
4148
  schema:
@@ -4151,7 +4151,7 @@ components:
4151
4151
  Schema within `database` where the sync creates and loads tables; created on save
4152
4152
  when it does not exist. For Google BigQuery this is the dataset name, with case
4153
4153
  preserved.
4154
- x-celigo-ui-override: For a BigQuery destination the Create Sync wizard labels this field "dataset" and accepts only letters, digits and underscore (no $), starting with a letter or underscore, at most 1024 characters (IO-195900); Snowflake and NSAW validation is unchanged.
4154
+ x-celigo-ui-override: For a BigQuery destination the Create Sync wizard labels this field "dataset" and accepts only letters, digits and underscore (no $), starting with a letter or underscore, at most 1024 characters; Snowflake and NSAW validation is unchanged.
4155
4155
  examples:
4156
4156
  - salesforce_raw
4157
4157
  tablePrefix:
@@ -4743,13 +4743,13 @@ components:
4743
4743
  readOnly: true
4744
4744
  description: Who or what triggered this sync run (e.g. `"user:email"`, `"schedule"`).
4745
4745
  examples:
4746
- - user:tyler.lamparter@celigo.com
4746
+ - user:jane@example.com
4747
4747
  canceledBy:
4748
4748
  type: string
4749
4749
  readOnly: true
4750
4750
  description: Who requested cancellation. Present once cancellation has been requested.
4751
4751
  examples:
4752
- - user:tyler.lamparter@celigo.com
4752
+ - user:jane@example.com
4753
4753
  runType:
4754
4754
  type: string
4755
4755
  readOnly: true
@@ -4785,7 +4785,7 @@ components:
4785
4785
  numLoadedRecords: 12450
4786
4786
  numExtractedRecords: 12450
4787
4787
  numTablesSynced: 3
4788
- triggeredBy: user:tyler.lamparter@celigo.com
4788
+ triggeredBy: user:jane@example.com
4789
4789
  runType: normal
4790
4790
  - _id: 6821c01c39db7c2b9cdc0e40
4791
4791
  flowExecutionGroupId: 6821c01c39db7c2b9cdc0e39
@@ -4798,7 +4798,7 @@ components:
4798
4798
  numLoadedRecords: 0
4799
4799
  numExtractedRecords: 0
4800
4800
  numTablesSynced: 1
4801
- triggeredBy: user:tyler.lamparter@celigo.com
4801
+ triggeredBy: user:jane@example.com
4802
4802
  runType: resync
4803
4803
  datasetIds:
4804
4804
  - 6a559b547885d8f93921c2ba
@@ -4833,7 +4833,7 @@ components:
4833
4833
  numLoadedRecords: 12450
4834
4834
  numExtractedRecords: 12450
4835
4835
  numTablesSynced: 3
4836
- triggeredBy: user:tyler.lamparter@celigo.com
4836
+ triggeredBy: user:jane@example.com
4837
4837
  runType: normal
4838
4838
  totalCount: 1
4839
4839
  SyncTableJob:
package/dist/tool.yml CHANGED
@@ -4338,7 +4338,7 @@ components:
4338
4338
  no message text) and never cascades or promotes on its own; `Draft`
4339
4339
  descendants are kept as they are, and a `Draft` parent does not gate
4340
4340
  its children. The UI's Set inactive on a parent marks the parent and
4341
- every child `Inactive` (IO-166197). Re-enabling a child
4341
+ every child `Inactive`. Re-enabling a child
4342
4342
  means re-enabling its ancestors in the same payload. Edits that keep
4343
4343
  existing rows must carry their stored status forward — rewriting a
4344
4344
  `Draft` or `Inactive` row to `Active` turns a row the user parked
@@ -5377,7 +5377,7 @@ components:
5377
5377
  no message text) and never cascades or promotes on its own; `Draft`
5378
5378
  descendants are kept as they are, and a `Draft` parent does not gate
5379
5379
  its children. The UI's Set inactive on a parent marks the parent and
5380
- every child `Inactive` (IO-166197). Re-enabling a child
5380
+ every child `Inactive`. Re-enabling a child
5381
5381
  means re-enabling its ancestors in the same payload. Edits that keep
5382
5382
  existing rows must carry their stored status forward — rewriting a
5383
5383
  `Draft` or `Inactive` row to `Active` turns a row the user parked
@@ -6085,7 +6085,7 @@ components:
6085
6085
  ``{record: {...}, settings: ..., job: ...}`` (plus
6086
6086
  ``fileMeta`` on file-provider steps) — the
6087
6087
  same runtime-context envelope Handlebars / SQL /
6088
- GraphQL specialists consume. ``mappings[].extract``
6088
+ GraphQL templates render against. ``mappings[].extract``
6089
6089
  JSONPath values MUST include the ``record.`` segment
6090
6090
  — for example ``"$.record.orderId"`` or
6091
6091
  ``"$.record.customer.email"``. PLACEHOLDER extracts
@@ -6113,9 +6113,8 @@ components:
6113
6113
  ``inputContext: record`` makes the contract
6114
6114
  self-documenting and prevents the transform from
6115
6115
  drifting into envelope mode if an upstream change ever
6116
- changes the platform default. The TransformsAgent
6117
- reads this value off the transform config and threads
6118
- it into the generator's prompt so the JSONPath form
6116
+ changes the platform default. Read this value before
6117
+ writing ``mappings[].extract`` so the JSONPath form
6119
6118
  matches the runtime root.
6120
6119
  - |-
6121
6120
  ## fileMeta on file-provider steps
@@ -13579,30 +13578,19 @@ components:
13579
13578
  would be bare ``{{{jsonSerialize record}}}`` with nothing
13580
13579
  around it, you don't need a template at all.
13581
13580
 
13582
- Production frequency: roughly 1 in 3 active HTTPImports leaves
13583
- this field empty (~35% null / empty array); closer to 1 in 2
13584
- once you count the additional ~12% of body entries that are
13585
- blank strings. The dominant case is "no body template".
13586
-
13587
13581
  Leave undefined for:
13588
13582
  - REST APIs accepting JSON CRUD payloads (the destination
13589
13583
  already wants exactly the post-mapped record shape).
13590
- - GraphQL destinations — do NOT author the body template here.
13591
- The dedicated GraphQL specialist owns the
13592
- ``{query, operationName, variables}`` shape and routes the
13593
- post-mapped record into ``variables`` automatically. Roughly
13594
- 96% of all wrapped-``jsonSerialize record`` uses in production
13595
- are GraphQL mutations; every one of those should go through
13596
- the GraphQL specialist, not through this body template.
13597
13584
  - Any case where the destination wants the mapped record as-is.
13585
+
13586
+ GraphQL destinations are different: the body is the stringified
13587
+ ``{query, operationName, variables}`` envelope described under
13588
+ ``formType``, with the post-mapped record passed in
13589
+ ``variables``.
13598
13590
  - |-
13599
- ## SET THIS FIELD when one of the production patterns below applies
13591
+ ## SET THIS FIELD when one of the patterns below applies
13600
13592
 
13601
- Production grounds these patterns: 36,445 active body entries
13602
- across HTTPImports in the last 30 days (Celigo-internal users
13603
- excluded). Choose the pattern that fits the destination's
13604
- shape, then write marker ``instructions`` describing intent
13605
- (let the Handlebars specialist produce the literal template).
13593
+ Choose the pattern that fits the destination's shape.
13606
13594
 
13607
13595
  ### Pattern A — ``{{{jsonSerialize record}}}`` inside a static wrapper
13608
13596
 
@@ -13614,13 +13602,12 @@ components:
13614
13602
  destination's field shape; the body owns the transport-level
13615
13603
  scaffolding.
13616
13604
 
13617
- Production frequency: roughly 115 / 36,445 (0.3%) of body
13618
- entries when the destination is non-GraphQL. Rare but real;
13619
- the use cases that fit are obvious when the user describes
13620
- them ("wrap each request in a SQS-style message envelope",
13621
- "add a batch header with timestamp + interface name", etc.).
13605
+ Rare for non-GraphQL destinations, but real; the use cases
13606
+ that fit are obvious when the user describes them ("wrap each
13607
+ request in a SQS-style message envelope", "add a batch header
13608
+ with timestamp + interface name", etc.).
13622
13609
 
13623
- Real production shapes:
13610
+ Typical shapes:
13624
13611
  - Message-bus envelope:
13625
13612
  ``{"MessageBody": {"class": "EntityUpdate", "payload": {{{jsonSerialize record}}}}}``
13626
13613
  - Metadata wrap:
@@ -13631,8 +13618,7 @@ components:
13631
13618
  NEVER emit BARE ``{{{jsonSerialize record}}}`` with no wrapper.
13632
13619
  The platform sends the post-mapped record as JSON automatically
13633
13620
  when body is undefined; bare ``jsonSerialize record`` produces
13634
- identical wire output and shows up in 0.7% of production body
13635
- entries — every one of those is redundant config the user has
13621
+ identical wire output, so it is redundant config the user has
13636
13622
  to maintain for zero benefit.
13637
13623
 
13638
13624
  ### Pattern B — Batch / page wrapper around mapped records
@@ -13679,15 +13665,14 @@ components:
13679
13665
  anti-pattern is the ``jsonSerialize`` wrap, not any particular
13680
13666
  path shape.
13681
13667
 
13682
- - Production frequency: 15 / 36,445 (0.04%) — essentially never.
13668
+ - Essentially never needed.
13683
13669
  - Failure mode: the body validator sees the PRE-mapped sample
13684
13670
  shape, can't resolve the post-mapped path during validation,
13685
13671
  and ``jsonSerialize`` on an unresolved path raises
13686
13672
  ``Helper {{jsonSerialize}} expects an argument`` — the
13687
13673
  template fails validation even when it would render at
13688
- runtime. The specialist enters a retry loop, tries variations
13689
- (``getValue`` wrappers, alternate paths), and converges on
13690
- failure.
13674
+ runtime. Variations (``getValue`` wrappers, alternate paths)
13675
+ fail the same way.
13691
13676
 
13692
13677
  If you find yourself wanting to reference a per-field
13693
13678
  post-mapped scalar wrapped in ``jsonSerialize``, your situation
@@ -13750,16 +13735,6 @@ components:
13750
13735
  before choosing: form-data APIs get the parts array above;
13751
13736
  multipart/related APIs get the hand-authored document. Never
13752
13737
  mix the two shapes in one body.
13753
- - |-
13754
- ## Marker instructions style
13755
-
13756
- When emitting a ``$agent: handlebars`` marker at this field,
13757
- write the ``instructions`` as INTENT (what the body should
13758
- produce: destination fields, shape, encoding), not as literal
13759
- Handlebars syntax. Embedding literal ``{{{jsonSerialize record.X}}}``
13760
- in the instructions risks the specialist following it verbatim
13761
- even when a simpler template would work — one of the ways the
13762
- per-field anti-pattern above gets introduced.
13763
13738
  examples:
13764
13739
  - - '{"name": "{{record.name}}", "email": "{{record.email}}"}'
13765
13740
  - - '{"requestData": {{{jsonSerialize record}}}}'
@@ -13851,9 +13826,7 @@ components:
13851
13826
  - |-
13852
13827
  The value MUST match the ``name`` of a lookup entry in ``http.lookups``.
13853
13828
  The lookup config itself (HTTP path, method, extract,
13854
- fallback chain) is authored separately — typically by the LookupsAgent
13855
- specialist via a ``$agent:
13856
- lookup`` marker.
13829
+ fallback chain) is defined separately, in that entry.
13857
13830
  - |-
13858
13831
  ## Mutually exclusive with ``existingExtract``
13859
13832
 
@@ -14333,9 +14306,8 @@ components:
14333
14306
 
14334
14307
  The Celigo platform persists lookups in TWO locations on an HTTP
14335
14308
  import: top-level ``lookups`` and ``http.lookups``. Both arrays
14336
- MUST hold byte-for-byte identical content. The import engine
14337
- and the MappingsAgent both maintain this mirror on every save —
14338
- callers never have to write both manually.
14309
+ MUST hold byte-for-byte identical content, so write both on
14310
+ every save.
14339
14311
  - |-
14340
14312
  ## Static vs dynamic vs cached
14341
14313
 
@@ -14611,7 +14583,7 @@ components:
14611
14583
  computedObject.fileName." — an error the platform labels source `internal` although the
14612
14584
  template is the cause. The run-time-proven way to keep the source file's name on a
14613
14585
  `blob: true` import is `{{record.fileMeta.fileName}}` on `file.fileName` with this field
14614
- omitted (the production runs of one FTP blob import set exactly that); the same template
14586
+ omitted (recorded runs of an FTP blob import set exactly that); the same template
14615
14587
  on this field has not been run. The field's editor preview (data version 1, its default)
14616
14588
  exposes the record as `data` —
14617
14589
  the `{blobKey, fileMeta}` record on a blob import, the page's record array otherwise —
@@ -14991,8 +14963,8 @@ components:
14991
14963
  ## Mirror invariant
14992
14964
  The Celigo platform persists lookups in TWO locations on a JDBC
14993
14965
  import: top-level `lookups` and `jdbc.lookups`. Both arrays
14994
- must hold byte-for-byte identical content — the MappingsAgent
14995
- writes both on every save.
14966
+ must hold byte-for-byte identical content, so write both on every
14967
+ save.
14996
14968
  x-celigo-agent:
14997
14969
  - lookup
14998
14970
  Mongodb:
@@ -15471,25 +15443,22 @@ components:
15471
15443
  substitutions FIRST against the incoming source record (pre-mapped),
15472
15444
  then the substituted expression is sent to NetSuite as a saved-search query.
15473
15445
  - |-
15474
- ## Handlebars conventions (production grounded)
15446
+ ## Handlebars conventions
15475
15447
 
15476
15448
  - **No `record.` prefix** — substitutions reference top-level
15477
15449
  source-record fields directly. `{{{id}}}` / `{{{Id}}}` /
15478
15450
  `{{{externalid}}}` / `{{{[Internal ID]}}}` — NOT
15479
- `{{{record.id}}}`. Production: only 122 / 55,328 expressions
15480
- (0.2%) use the `record.` prefix; the dominant convention is
15481
- top-level paths.
15482
- - **Triple braces `{{{...}}}`** are the preferred form (78% of
15483
- production); double-brace `{{...}}` also works for cases
15484
- where you want the platform's default HTML-escape (rare in
15485
- this field).
15451
+ `{{{record.id}}}`. Top-level paths are the established
15452
+ convention.
15453
+ - **Triple braces `{{{...}}}`** are the preferred form;
15454
+ double-brace `{{...}}` also works for cases where you want
15455
+ the platform's default HTML-escape (rare in this field).
15486
15456
  - **Bracket notation for field names with spaces or special
15487
15457
  chars**: `{{{[Field With Spaces]}}}`, `{{{[Internal ID]}}}`.
15488
- Anchored to ~10% of production expressions.
15489
15458
  - |-
15490
15459
  ## Canonical patterns
15491
15460
 
15492
- ### Simple lookup by internal ID (most common — 8.4% of all expressions)
15461
+ ### Simple lookup by internal ID (most common)
15493
15462
 
15494
15463
  `["internalid","is","{{{id}}}"]`
15495
15464
 
@@ -15560,8 +15529,8 @@ components:
15560
15529
  `is` / `equalto` / `internalid anyof` value to `isempty` before the
15561
15530
  search. On `restletVersion: suiteapp2.0` that search is not treated as
15562
15531
  "no match": it can return existing records, and `addupdate` then
15563
- updates one of them — an unrelated record receives the mapping (seen
15564
- in production as `cant_modify_sub` on a customer the record never
15532
+ updates one of them — an unrelated record receives the mapping (for
15533
+ example, a `cant_modify_sub` error on a customer the record never
15565
15534
  named). SuiteBundle and SuiteApp 1.0 discard a blank `internalid`
15566
15535
  match and create. Design so the operational lookup never renders
15567
15536
  empty: key it on a value every record carries (the source id stored
@@ -15648,10 +15617,6 @@ components:
15648
15617
  - |-
15649
15618
  Validated via the dedicated `PUT /v1/netsuiteDA/previewImportMappingFields`
15650
15619
  endpoint (NOT `/v1/processors/mapperProcessor`).
15651
- - |-
15652
- Managed by the MappingsAgent (`$agent: mapping`) — resource-authoring
15653
- agents must emit a specialist marker at this field rather than
15654
- generating the mapping inline.
15655
15620
  properties:
15656
15621
  fields:
15657
15622
  type: array
@@ -15728,8 +15693,8 @@ components:
15728
15693
  this block ONLY when the destination record type genuinely requires the
15729
15694
  subrecord.
15730
15695
  - |-
15731
- **Real-world `recordType` values** (ranked by
15732
- production frequency across NetSuite DA imports):
15696
+ **Common `recordType` values** (most common
15697
+ first):
15733
15698
  * `inventorydetail` — by far the most common.
15734
15699
  Serial / lot / bin assignments on sales-order,
15735
15700
  item-fulfillment, purchase-order, and inventory-
@@ -15799,8 +15764,8 @@ components:
15799
15764
  type: string
15800
15765
  description: |
15801
15766
  Secondary reference-field identifier used on a
15802
- small fraction of subrecord blocks in production
15803
- (~3%). Exact semantics are not publicly
15767
+ small fraction of subrecord blocks. Exact
15768
+ semantics are not publicly
15804
15769
  documented by Celigo — match the value on
15805
15770
  existing resources when present; do NOT
15806
15771
  synthesize one. Leave unset unless a template
@@ -15999,9 +15964,8 @@ components:
15999
15964
  this block ONLY when the destination record type genuinely requires the
16000
15965
  subrecord.
16001
15966
  - |-
16002
- **Real-world `recordType` values** (ranked
16003
- by production frequency across NetSuite DA
16004
- imports):
15967
+ **Common `recordType` values** (most
15968
+ common first):
16005
15969
  * `inventorydetail` — by far the most
16006
15970
  common. Serial / lot / bin assignments on
16007
15971
  sales-order, item-fulfillment, purchase-
@@ -16069,9 +16033,9 @@ components:
16069
16033
  type: string
16070
16034
  description: |
16071
16035
  Secondary reference-field identifier used
16072
- on a small fraction of subrecord blocks
16073
- in production (~3%). Exact semantics are
16074
- not publicly documented by Celigo — match
16036
+ on a small fraction of subrecord blocks.
16037
+ Exact semantics are not publicly
16038
+ documented by Celigo — match
16075
16039
  the value on existing resources when
16076
16040
  present; do NOT synthesize one. Leave
16077
16041
  unset unless a template clearly requires
@@ -16351,8 +16315,8 @@ components:
16351
16315
  ## Mirror invariant
16352
16316
  The Celigo platform persists NetSuite Distributed Import lookups in
16353
16317
  TWO locations: `netsuite_da.lookups` and top-level `lookups`.
16354
- Both arrays must hold byte-for-byte identical content — the
16355
- MappingsAgent writes both on every save.
16318
+ Both arrays must hold byte-for-byte identical content, so write
16319
+ both on every save.
16356
16320
  - |-
16357
16321
  ## One context for body and sublist lookups
16358
16322
  Every lookup's `expression` renders against the whole source
@@ -16481,8 +16445,8 @@ components:
16481
16445
  **Mirror invariant**
16482
16446
  The Celigo platform persists lookups in TWO locations on an RDBMS
16483
16447
  import: top-level `lookups` and `rdbms.lookups`. Both arrays
16484
- must hold byte-for-byte identical content — the MappingsAgent
16485
- writes both on every save.
16448
+ must hold byte-for-byte identical content, so write both on every
16449
+ save.
16486
16450
  items:
16487
16451
  type: object
16488
16452
  properties:
@@ -16607,7 +16571,7 @@ components:
16607
16571
  - **Nested fields**: `{{record.properties.email}}` (auto-quoted)
16608
16572
  or `{{{record.properties.email}}}` (raw).
16609
16573
  - |-
16610
- ## EXAMPLES (production-grounded)
16574
+ ## EXAMPLES
16611
16575
 
16612
16576
  - INSERT (string columns, auto-quoted): `["INSERT INTO customers (name, email) VALUES ({{record.name}}, {{record.email}})"]`
16613
16577
  - INSERT (mixed numeric + string): `["INSERT INTO orders (qty, sku) VALUES ({{{record.qty}}}, {{record.sku}})"]`
@@ -17468,8 +17432,7 @@ components:
17468
17432
  "wrapper" JavaScript module that invokes a custom function (typically to
17469
17433
  integrate with a system Celigo doesn't have a first-class connector for).
17470
17434
  - |-
17471
- Wrapper imports use Mapper 1.0 for field mappings and the generic Celigo lookup shape.
17472
- The MappingsAgent operates in `v1_standard` mode for this adaptor type —
17435
+ Wrapper imports use Mapper 1.0 for field mappings and the generic Celigo lookup shape:
17473
17436
  mappings live in `resource.mapping` (fields/lists) and lookups mirror at
17474
17437
  `resource.lookups` and `resource.wrapper.lookups`.
17475
17438
  properties:
@@ -17517,8 +17480,8 @@ components:
17517
17480
  ## Mirror invariant
17518
17481
  The Celigo platform persists lookups in TWO locations on a
17519
17482
  Wrapper import: top-level `lookups` and `wrapper.lookups`.
17520
- Both arrays must hold byte-for-byte identical content — the
17521
- MappingsAgent writes both on every save.
17483
+ Both arrays must hold byte-for-byte identical content, so write
17484
+ both on every save.
17522
17485
  if:
17523
17486
  not:
17524
17487
  propertyNames:
@@ -17553,8 +17516,8 @@ components:
17553
17516
  **Mirror invariant**
17554
17517
  The Celigo platform stores lookups in TWO locations on a Salesforce
17555
17518
  import resource: top-level ``lookups`` and ``salesforce.lookups``.
17556
- Both arrays must hold byte-for-byte identical content — the
17557
- MappingsAgent writes both on every save.
17519
+ Both arrays must hold byte-for-byte identical content, so write
17520
+ both on every save.
17558
17521
 
17559
17522
  **Static vs dynamic lookups**
17560
17523
  - **Static** — only ``map`` + optional ``default``. No Salesforce
@@ -19720,10 +19683,8 @@ components:
19720
19683
  update this field — the wrapper itself stays the same shape,
19721
19684
  just points at a different Tool.
19722
19685
  - |-
19723
- The agent that authors the wrapper does not author the Tool itself;
19724
- Tool authoring goes through the Tools page agent's `create_tool` / `update_tool` tools (or,
19725
- when invoked from a flow / API / Tool dispatch path,
19726
- through the Tool Builder which delegates to the Tool engine's brief-based entry point).
19686
+ Writing the wrapper does not create or change the Tool itself;
19687
+ author the Tool as its own resource through `/v1/tools`.
19727
19688
  examples:
19728
19689
  - 69ce8ae7cbbb51405ae42ae5
19729
19690
  overrides:
@@ -25019,7 +24980,7 @@ components:
25019
24980
  Optional on a `blob: true` file-provider import: when omitted the platform reads the
25020
24981
  record's root `blobKey` — the field a blob export emits on its `{blobKey, fileMeta}`
25021
24982
  record — so a file-transfer flow needs no `blobKeyPath`. Observed on an FTP import
25022
- (production runs writing files with no `blobKeyPath`) and on a Google Drive folder
24983
+ (recorded runs writing files with no `blobKeyPath`) and on a Google Drive folder
25023
24984
  upload (`http.type: file`, the marketplace file-transfer template's shape); other
25024
24985
  file providers were not probed. Set it only when a response mapping placed the key
25025
24986
  elsewhere; on those two providers its absence is not a cause of upload failures.
@@ -25201,13 +25162,9 @@ components:
25201
25162
  - |-
25202
25163
  JavaScript hook references attached to lifecycle stages of the import.
25203
25164
  Engage hooks ONLY when the user explicitly wants scripting OR a requirement
25204
- cannot be expressed through declarative specialists (mapping / filter /
25165
+ cannot be expressed through declarative configuration (mappings / filters /
25205
25166
  responseTransform).
25206
25167
  Hooks bypass the platform's declarative validation, so use them sparingly.
25207
- - |-
25208
- Phase A authoring scope: ``preMap`` and ``postMap`` only.
25209
- ``postSubmit`` and ``postAggregate`` are Phase B's territory (they author
25210
- against the real destination response).
25211
25168
  properties:
25212
25169
  preMap:
25213
25170
  type: object
@@ -25224,7 +25181,7 @@ components:
25224
25181
  before the mapping sees them (drop archived records,
25225
25182
  normalize date strings, split a record into many). Don't
25226
25183
  engage for static value substitution or simple field
25227
- renames — that's the mapping specialist's job.
25184
+ renames — mappings handle those.
25228
25185
 
25229
25186
  Runtime contract: ``options.data[]`` (the page of upstream
25230
25187
  records) → array of the same length.
@@ -25266,11 +25223,6 @@ components:
25266
25223
  Post-submit JavaScript hook — runs AFTER each batch of
25267
25224
  destination writes, on the destination's response.
25268
25225
 
25269
- **Phase B owns this slot.** Phase A must NOT emit a
25270
- ``$agent`` marker here (see "Phase A vs Phase B ownership"
25271
- in the engine prompt). Phase B authors this against the
25272
- real probe response.
25273
-
25274
25226
  Runtime contract: ``options.responseData[]`` (one per
25275
25227
  submitted record; ``{statusCode, errors, _json, ...}`` —
25276
25228
  ``id`` is present on real runs but absent from the
@@ -25295,11 +25247,6 @@ components:
25295
25247
  ``invalid_hook`` ("unsupported postAggregate hook") —
25296
25248
  never emit it for non-file adaptors.
25297
25249
 
25298
- **Phase B owns this slot.** Phase A must NOT emit a
25299
- ``$agent`` marker here (see "Phase A vs Phase B ownership"
25300
- in the engine prompt). Phase B authors this against the
25301
- real probe response.
25302
-
25303
25250
  Runtime contract: ``options.postAggregateData``
25304
25251
  (``{success, _json, code, message, source}``) → no return
25305
25252
  value; side effects only (logging, notifying, downstream
@@ -25351,8 +25298,7 @@ components:
25351
25298
 
25352
25299
  REQUIRED for ``SalesforceImport`` and ``WrapperImport``: these
25353
25300
  adaptors must use Mapper 1.0; Mapper 2.0 is not supported for
25354
- them. The agent's adaptor→mode classifier routes them here
25355
- automatically. ``NetSuiteDistributedImport`` is also V1-required
25301
+ them. ``NetSuiteDistributedImport`` is also V1-required
25356
25302
  but uses a NetSuite-specific variant at its adaptor-scoped copy
25357
25303
  ``netsuite_da.mapping`` (richer sublist / subRecord vocabulary) —
25358
25304
  not this field.
@@ -25361,17 +25307,9 @@ components:
25361
25307
  ``FTPImport``, ``JDBCImport``, etc.) when the user explicitly asks
25362
25308
  for Mapper 1.0 — e.g. when the import wraps a legacy v1 connector
25363
25309
  or is being migrated from an older integration. Those adaptors
25364
- default to Mapper 2.0 at the top-level ``mappings`` (plural) field;
25365
- see :mod:`celigo_agents.helpers.mappings.mapping_mode` for the
25366
- adaptor → default-mode classifier. Do not emit a marker here
25367
- unsolicited; the v2 default produces better output for modern
25368
- connectors.
25369
- - |-
25370
- ## Specialist marker
25371
-
25372
- Managed by the MappingsAgent (``$agent: mapping``) — resource-
25373
- authoring agents must emit a specialist marker at this field
25374
- rather than generating mapping content inline.
25310
+ default to Mapper 2.0 at the top-level ``mappings`` (plural) field.
25311
+ Do not set this field unsolicited; the v2 default produces better
25312
+ output for modern connectors.
25375
25313
  - |-
25376
25314
  Allowed (but not the default) on other import adaptors such as
25377
25315
  ``HTTPImport``, ``RDBMSImport``, ``FTPImport``, and
@@ -25388,8 +25326,8 @@ components:
25388
25326
 
25389
25327
  Lookups referenced by ``lookupName`` live on the top-level
25390
25328
  ``resource.lookups`` array (mirrored under the adaptor key for
25391
- adaptors that maintain their own copy — see the mirror pattern in
25392
- the MappingsAgent architecture). Lookups are independent of this
25329
+ adaptors that maintain their own copy — see the mirror invariant
25330
+ on ``lookups``). Lookups are independent of this
25393
25331
  mapping: they are neither created nor cleared automatically when
25394
25332
  this mapping changes.
25395
25333
  properties:
@@ -25504,9 +25442,8 @@ components:
25504
25442
  - |-
25505
25443
  ## Mirror invariant
25506
25444
 
25507
- Both arrays MUST hold byte-for-byte identical content. The
25508
- MappingsAgent writes both on every save and treats them as a
25509
- single logical field.
25445
+ Both arrays MUST hold byte-for-byte identical content: write
25446
+ both on every save and treat them as a single logical field.
25510
25447
  - |-
25511
25448
  ## Shape
25512
25449
 
@@ -25567,7 +25504,7 @@ components:
25567
25504
  - ``envelope``: the mapper sees a wrapped object of the shape
25568
25505
  ``{record: {...}, settings: ..., job: ...}`` — the same
25569
25506
  runtime-context envelope Handlebars / SQL / GraphQL
25570
- specialists consume. ``mappings[].extract`` JSONPath values
25507
+ templates render against. ``mappings[].extract`` JSONPath values
25571
25508
  MUST include the ``record.`` segment — for example
25572
25509
  ``"$.record.orderId"`` or ``"$.record.customer.email"``.
25573
25510
  PLACEHOLDER extracts use ``"$.record.PLACEHOLDER_<field>"``.
@@ -25592,9 +25529,9 @@ components:
25592
25529
  platform, but emitting ``inputContext: record`` makes the
25593
25530
  contract self-documenting and prevents the mapper from drifting
25594
25531
  into envelope mode if an upstream change ever changes the
25595
- platform default. The MappingsAgent reads this value off the
25596
- resource and threads it into the mapping generator's prompt so
25597
- the JSONPath form matches the runtime root.
25532
+ platform default. Read this value before writing
25533
+ ``mappings[].extract`` so the JSONPath form matches the runtime
25534
+ root.
25598
25535
  settingsForm:
25599
25536
  x-celigo-agent:
25600
25537
  - settings_form
@@ -25895,9 +25832,9 @@ components:
25895
25832
  Substitute ``<modifiedTimestampField>`` with the actual
25896
25833
  timestamp field the target entity exposes in its response. Do
25897
25834
  NOT invent or copy field names from an example authored for a
25898
- different endpoint -- an unknown field name causes a runtime
25899
- "unknown property" / "invalid column" error the build cannot
25900
- catch. See the engine's filter-field grounding principle.
25835
+ different endpoint -- an unknown field name causes an
25836
+ "unknown property" / "invalid column" error that surfaces only
25837
+ at run time.
25901
25838
 
25902
25839
  For Salesforce, this field is required and has the following default values:
25903
25840
  - LastModifiedDate
@@ -35277,7 +35214,7 @@ components:
35277
35214
  `[application · stage=apiCall] search.createColumn:
35278
35215
  Missing a required argument: name`. The platform
35279
35216
  validation runs before any column data is read, so
35280
- the build fails fast.
35217
+ the export fails fast.
35281
35218
  - |-
35282
35219
  ## NAME MUST BE A SEARCH COLUMN, NOT A BODY FIELD
35283
35220
  NetSuite distinguishes between body fields (the
@@ -35285,9 +35222,8 @@ components:
35285
35222
  search columns (the fields exposed for filtering /
35286
35223
  sorting in saved searches, like `shipaddress1`).
35287
35224
  `columns[].name` MUST be a search column ID, not
35288
- a body field ID. See the SEARCH COLUMNS section of
35289
- the metadata fetcher output for the valid search
35290
- column names for the chosen `recordType`.
35225
+ a body field ID: take it from the chosen
35226
+ `recordType`'s SEARCH COLUMNS list.
35291
35227
  - |-
35292
35228
  ## EXAMPLES
35293
35229
  - `"internalid"` -- the record's internal id
@@ -36029,7 +35965,7 @@ components:
36029
35965
  If the folder internal ID is required to be dynamic based on the data you are integrating,
36030
35966
  you can specify the JSON path to the field in your data containing the folder
36031
35967
  internal ID values instead — with DOUBLE braces (e.g. {{record.folderId}}).
36032
- Production usage is dominantly a static numeric ID; dynamic substitution is rare.
35968
+ Default to a static numeric ID; dynamic substitution is the exception.
36033
35969
  - |-
36034
35970
  ## FIELD BEHAVIOR:
36035
35971
  - Identifies the specific folder in NetSuite's file cabinet to export files from
@@ -36054,7 +35990,7 @@ components:
36054
35990
  - May be linked to folder creation or folder search operations to retrieve valid IDs.
36055
35991
  - |-
36056
35992
  ## EXAMPLES:
36057
- - "12345" - Static folder internal ID (the dominant production form)
35993
+ - "12345" - Static folder internal ID (the usual form)
36058
35994
  - "67890" - Another valid folder internal ID
36059
35995
  - "{{record.folderId}}" - Dynamic folder ID from integration data (double braces)
36060
35996
  - |-