@celigo/api-specs 0.2.125 → 0.2.127

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
@@ -2951,6 +2951,12 @@ components:
2951
2951
  regardless of server OS — paths are case-sensitive on UNIX/Linux servers. Supports
2952
2952
  handlebars templates.
2953
2953
  x-celigo-ai-guidance:
2954
+ - |-
2955
+ A handlebars template here is rendered against the same context as `fileName`
2956
+ (`fileMeta` is not a root key). An expression that renders empty fails the record
2957
+ with `missing_s3_key` "Can not process upload file without
2958
+ computedObject.fileLocation." — labeled source `internal` although the template is
2959
+ the cause.
2954
2960
  - |-
2955
2961
  The path to the directory on the FTP server where files will be accessed,
2956
2962
  stored, or managed.
@@ -3007,13 +3013,28 @@ components:
3007
3013
  description: |-
3008
3014
  Name of the file written to the server, including its extension; do not include directory
3009
3015
  separators — the location comes from directoryPath. Supports handlebars placeholders such
3010
- as items-{{timestamp}}.csv to generate a unique name per run.
3016
+ as items-{{timestamp}}.csv to generate a unique name per run. The template is rendered
3017
+ against the incoming record: a file-transfer import from an FTP source kept the source
3018
+ file's name with `{{record.fileMeta.fileName}}` set on `file.fileName` and this field left
3019
+ unset — other source providers expose the name under their own `fileMeta` field.
3011
3020
  x-celigo-ai-guidance:
3012
3021
  - |-
3013
3022
  When the user does not specify a file naming convention,
3014
3023
  default to a timestamped filename such as "items-{{timestamp}}.csv" so each run
3015
3024
  produces a unique file and avoids overwriting previous files.
3016
3025
  Use a fixed filename only when the user explicitly requests overwriting or a fixed name.
3026
+ - |-
3027
+ `fileMeta` is not a root key of this template's context (it is one only on
3028
+ file-provider export and lookup steps): `{{fileMeta.fileName}}` renders empty and the
3029
+ upload fails with `missing_s3_key` "Can not process upload file without
3030
+ computedObject.fileName." — an error the platform labels source `internal` although the
3031
+ template is the cause. The run-time-proven way to keep the source file's name on a
3032
+ `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
3034
+ on this field has not been run. The field's editor preview (data version 1, its default)
3035
+ exposes the record as `data` —
3036
+ the `{blobKey, fileMeta}` record on a blob import, the page's record array otherwise —
3037
+ so `record.` previews empty there; judge by a run.
3017
3038
  - |-
3018
3039
  The name of the file to be accessed, transferred,
3019
3040
  or manipulated via FTP (File Transfer Protocol).
@@ -3820,7 +3841,11 @@ components:
3820
3841
  field mapped to `internalid` is overridden by it. When the incoming record
3821
3842
  already carries the NetSuite internal ID, point the lookup at that field with
3822
3843
  the expression form — `["internalid","is","{{{id}}}"]` — rather than removing
3823
- the lookup.
3844
+ the lookup. Only when every record carries it: on `restletVersion:
3845
+ suiteapp2.0` a record whose field is empty does not fall through to
3846
+ "create" on `addupdate` — the empty value is searched as `isempty` and
3847
+ can match an existing record (see `expression`; SuiteBundle and SuiteApp
3848
+ 1.0 create in that case).
3824
3849
  properties:
3825
3850
  extract:
3826
3851
  type: string
@@ -3946,6 +3971,21 @@ components:
3946
3971
  - DO NOT use `jsonSerialize` here — search expressions take
3947
3972
  scalar literals, not serialized JSON. Use `{{{id}}}` or
3948
3973
  `{{{[Field Name]}}}` directly.
3974
+ - |-
3975
+ ## A substitution that renders empty is not "no match"
3976
+
3977
+ When the source field is absent or empty, `["internalid","is","{{{id}}}"]`
3978
+ renders `["internalid","is",""]`, and the SuiteApp rewrites an empty
3979
+ `is` / `equalto` / `internalid anyof` value to `isempty` before the
3980
+ search. On `restletVersion: suiteapp2.0` that search is not treated as
3981
+ "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
3984
+ named). SuiteBundle and SuiteApp 1.0 discard a blank `internalid`
3985
+ match and create. Design so the operational lookup never renders
3986
+ empty: key it on a value every record carries (the source id stored
3987
+ as `externalid`), or route records without a destination id to a
3988
+ separate `add` import.
3949
3989
  - |-
3950
3990
  ## Body-level only
3951
3991
 
@@ -8522,7 +8562,10 @@ components:
8522
8562
  description: |-
8523
8563
  **REQUIRED for file-based imports.**
8524
8564
 
8525
- The name of the file to be created/written. Supports Handlebars expressions for dynamic naming.
8565
+ The name of the file to be created/written. Supports Handlebars expressions for dynamic naming,
8566
+ rendered against the incoming record — a file-transfer import keeps the source file's name from
8567
+ the record's `fileMeta`, whose field names are the exporting provider's
8568
+ (`{{record.fileMeta.fileName}}` from an FTP source, `fileMeta.name` from Google Drive).
8526
8569
 
8527
8570
  **Default behavior**
8528
8571
  - When the user does not specify a file naming convention, **always default to timestamped filenames** using `{{timestamp}}` (e.g., `"items-{{timestamp}}.csv"`). This ensures each run produces a unique file and avoids overwriting previous exports.
@@ -8540,7 +8583,20 @@ components:
8540
8583
 
8541
8584
  **Important**
8542
8585
  - For S3 imports, this should typically match the `s3.fileKey` value
8543
- - For FTP imports, this should typically match the `ftp.fileName` value
8586
+ - For FTP imports, this should typically match the `ftp.fileName` value; the one blob file-transfer run on record set only this field and left `ftp.fileName` unset
8587
+ x-celigo-ai-guidance:
8588
+ - |-
8589
+ `fileMeta` is not a root key of this template's context (it is one only on
8590
+ file-provider export and lookup steps): `{{fileMeta.fileName}}` renders empty and the
8591
+ file has no name; on an FTP import the record then fails with `missing_s3_key` "Can not
8592
+ process upload file without computedObject.fileName.", labeled source `internal`
8593
+ although the template is the cause. The incoming record carries the source file's
8594
+ metadata — on an FTP blob import `{{record.fileMeta.fileName}}` keeps the source file's
8595
+ name at run time (the only spelling proven by a run). The field's editor preview
8596
+ (data version 1, its default) exposes the record as `data` — the `{blobKey, fileMeta}`
8597
+ record on a `blob: true` import, the page's record array otherwise — so `record.`
8598
+ previews empty there; judge by a run. The metadata field names are the exporting
8599
+ provider's — read them off the incoming sample record.
8544
8600
  examples:
8545
8601
  - customers-{{timestamp}}.json
8546
8602
  - orders-export.csv
@@ -16021,6 +16077,14 @@ components:
16021
16077
  On AiAgentImport, GuardrailImport and ToolImport the save fails with 422 `not_supported`
16022
16078
  ("Field "blobKeyPath" is not supported for this import type."); route file content
16023
16079
  through a blob-capable import (HTTP, FTP, S3) instead.
16080
+ - |-
16081
+ Optional on a `blob: true` file-provider import: when omitted the platform reads the
16082
+ record's root `blobKey` — the field a blob export emits on its `{blobKey, fileMeta}`
16083
+ 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
16085
+ upload (`http.type: file`, the marketplace file-transfer template's shape); other
16086
+ file providers were not probed. Set it only when a response mapping placed the key
16087
+ elsewhere; on those two providers its absence is not a cause of upload failures.
16024
16088
  - |-
16025
16089
  The value at this path must be a blobKey produced by an upstream blob
16026
16090
  export or blob lookup and carried onto the record via that step's
@@ -16049,7 +16113,8 @@ components:
16049
16113
  - ToolImport
16050
16114
  description: |-
16051
16115
  When true, this import transfers raw file content (blobs) to the destination rather than
16052
- structured records, reading each file through `blobKeyPath`. Not accepted on
16116
+ structured records, reading each file through `blobKeyPath` (optional on FTP and Google
16117
+ Drive file-provider imports, which fall back to the record's root `blobKey`). Not accepted on
16053
16118
  `AiAgentImport`, `GuardrailImport`, or `ToolImport` — those adaptors process records only
16054
16119
  and reject the flag with 422 `not_supported`.
16055
16120
  x-celigo-ai-guidance:
package/dist/tool.yml CHANGED
@@ -14532,6 +14532,12 @@ components:
14532
14532
  regardless of server OS — paths are case-sensitive on UNIX/Linux servers. Supports
14533
14533
  handlebars templates.
14534
14534
  x-celigo-ai-guidance:
14535
+ - |-
14536
+ A handlebars template here is rendered against the same context as `fileName`
14537
+ (`fileMeta` is not a root key). An expression that renders empty fails the record
14538
+ with `missing_s3_key` "Can not process upload file without
14539
+ computedObject.fileLocation." — labeled source `internal` although the template is
14540
+ the cause.
14535
14541
  - |-
14536
14542
  The path to the directory on the FTP server where files will be accessed,
14537
14543
  stored, or managed.
@@ -14588,13 +14594,28 @@ components:
14588
14594
  description: |-
14589
14595
  Name of the file written to the server, including its extension; do not include directory
14590
14596
  separators — the location comes from directoryPath. Supports handlebars placeholders such
14591
- as items-{{timestamp}}.csv to generate a unique name per run.
14597
+ as items-{{timestamp}}.csv to generate a unique name per run. The template is rendered
14598
+ against the incoming record: a file-transfer import from an FTP source kept the source
14599
+ file's name with `{{record.fileMeta.fileName}}` set on `file.fileName` and this field left
14600
+ unset — other source providers expose the name under their own `fileMeta` field.
14592
14601
  x-celigo-ai-guidance:
14593
14602
  - |-
14594
14603
  When the user does not specify a file naming convention,
14595
14604
  default to a timestamped filename such as "items-{{timestamp}}.csv" so each run
14596
14605
  produces a unique file and avoids overwriting previous files.
14597
14606
  Use a fixed filename only when the user explicitly requests overwriting or a fixed name.
14607
+ - |-
14608
+ `fileMeta` is not a root key of this template's context (it is one only on
14609
+ file-provider export and lookup steps): `{{fileMeta.fileName}}` renders empty and the
14610
+ upload fails with `missing_s3_key` "Can not process upload file without
14611
+ computedObject.fileName." — an error the platform labels source `internal` although the
14612
+ template is the cause. The run-time-proven way to keep the source file's name on a
14613
+ `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
14615
+ on this field has not been run. The field's editor preview (data version 1, its default)
14616
+ exposes the record as `data` —
14617
+ the `{blobKey, fileMeta}` record on a blob import, the page's record array otherwise —
14618
+ so `record.` previews empty there; judge by a run.
14598
14619
  - |-
14599
14620
  The name of the file to be accessed, transferred,
14600
14621
  or manipulated via FTP (File Transfer Protocol).
@@ -15401,7 +15422,11 @@ components:
15401
15422
  field mapped to `internalid` is overridden by it. When the incoming record
15402
15423
  already carries the NetSuite internal ID, point the lookup at that field with
15403
15424
  the expression form — `["internalid","is","{{{id}}}"]` — rather than removing
15404
- the lookup.
15425
+ the lookup. Only when every record carries it: on `restletVersion:
15426
+ suiteapp2.0` a record whose field is empty does not fall through to
15427
+ "create" on `addupdate` — the empty value is searched as `isempty` and
15428
+ can match an existing record (see `expression`; SuiteBundle and SuiteApp
15429
+ 1.0 create in that case).
15405
15430
  properties:
15406
15431
  extract:
15407
15432
  type: string
@@ -15527,6 +15552,21 @@ components:
15527
15552
  - DO NOT use `jsonSerialize` here — search expressions take
15528
15553
  scalar literals, not serialized JSON. Use `{{{id}}}` or
15529
15554
  `{{{[Field Name]}}}` directly.
15555
+ - |-
15556
+ ## A substitution that renders empty is not "no match"
15557
+
15558
+ When the source field is absent or empty, `["internalid","is","{{{id}}}"]`
15559
+ renders `["internalid","is",""]`, and the SuiteApp rewrites an empty
15560
+ `is` / `equalto` / `internalid anyof` value to `isempty` before the
15561
+ search. On `restletVersion: suiteapp2.0` that search is not treated as
15562
+ "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
15565
+ named). SuiteBundle and SuiteApp 1.0 discard a blank `internalid`
15566
+ match and create. Design so the operational lookup never renders
15567
+ empty: key it on a value every record carries (the source id stored
15568
+ as `externalid`), or route records without a destination id to a
15569
+ separate `add` import.
15530
15570
  - |-
15531
15571
  ## Body-level only
15532
15572
 
@@ -19834,7 +19874,10 @@ components:
19834
19874
  description: |-
19835
19875
  **REQUIRED for file-based imports.**
19836
19876
 
19837
- The name of the file to be created/written. Supports Handlebars expressions for dynamic naming.
19877
+ The name of the file to be created/written. Supports Handlebars expressions for dynamic naming,
19878
+ rendered against the incoming record — a file-transfer import keeps the source file's name from
19879
+ the record's `fileMeta`, whose field names are the exporting provider's
19880
+ (`{{record.fileMeta.fileName}}` from an FTP source, `fileMeta.name` from Google Drive).
19838
19881
 
19839
19882
  **Default behavior**
19840
19883
  - When the user does not specify a file naming convention, **always default to timestamped filenames** using `{{timestamp}}` (e.g., `"items-{{timestamp}}.csv"`). This ensures each run produces a unique file and avoids overwriting previous exports.
@@ -19852,7 +19895,20 @@ components:
19852
19895
 
19853
19896
  **Important**
19854
19897
  - For S3 imports, this should typically match the `s3.fileKey` value
19855
- - For FTP imports, this should typically match the `ftp.fileName` value
19898
+ - For FTP imports, this should typically match the `ftp.fileName` value; the one blob file-transfer run on record set only this field and left `ftp.fileName` unset
19899
+ x-celigo-ai-guidance:
19900
+ - |-
19901
+ `fileMeta` is not a root key of this template's context (it is one only on
19902
+ file-provider export and lookup steps): `{{fileMeta.fileName}}` renders empty and the
19903
+ file has no name; on an FTP import the record then fails with `missing_s3_key` "Can not
19904
+ process upload file without computedObject.fileName.", labeled source `internal`
19905
+ although the template is the cause. The incoming record carries the source file's
19906
+ metadata — on an FTP blob import `{{record.fileMeta.fileName}}` keeps the source file's
19907
+ name at run time (the only spelling proven by a run). The field's editor preview
19908
+ (data version 1, its default) exposes the record as `data` — the `{blobKey, fileMeta}`
19909
+ record on a `blob: true` import, the page's record array otherwise — so `record.`
19910
+ previews empty there; judge by a run. The metadata field names are the exporting
19911
+ provider's — read them off the incoming sample record.
19856
19912
  examples:
19857
19913
  - customers-{{timestamp}}.json
19858
19914
  - orders-export.csv
@@ -24890,6 +24946,14 @@ components:
24890
24946
  On AiAgentImport, GuardrailImport and ToolImport the save fails with 422 `not_supported`
24891
24947
  ("Field "blobKeyPath" is not supported for this import type."); route file content
24892
24948
  through a blob-capable import (HTTP, FTP, S3) instead.
24949
+ - |-
24950
+ Optional on a `blob: true` file-provider import: when omitted the platform reads the
24951
+ record's root `blobKey` — the field a blob export emits on its `{blobKey, fileMeta}`
24952
+ record — so a file-transfer flow needs no `blobKeyPath`. Observed on an FTP import
24953
+ (production runs writing files with no `blobKeyPath`) and on a Google Drive folder
24954
+ upload (`http.type: file`, the marketplace file-transfer template's shape); other
24955
+ file providers were not probed. Set it only when a response mapping placed the key
24956
+ elsewhere; on those two providers its absence is not a cause of upload failures.
24893
24957
  - |-
24894
24958
  The value at this path must be a blobKey produced by an upstream blob
24895
24959
  export or blob lookup and carried onto the record via that step's
@@ -24918,7 +24982,8 @@ components:
24918
24982
  - ToolImport
24919
24983
  description: |-
24920
24984
  When true, this import transfers raw file content (blobs) to the destination rather than
24921
- structured records, reading each file through `blobKeyPath`. Not accepted on
24985
+ structured records, reading each file through `blobKeyPath` (optional on FTP and Google
24986
+ Drive file-provider imports, which fall back to the record's root `blobKey`). Not accepted on
24922
24987
  `AiAgentImport`, `GuardrailImport`, or `ToolImport` — those adaptors process records only
24923
24988
  and reject the flag with 422 `not_supported`.
24924
24989
  x-celigo-ai-guidance:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celigo/api-specs",
3
- "version": "0.2.125",
3
+ "version": "0.2.127",
4
4
  "private": false,
5
5
  "description": "Public OpenAPI bundles (dist/) and the celigo-cli lint schema pack (schemas.json).",
6
6
  "keywords": [
package/schemas.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "provenance": {
3
3
  "repo": "celigo/integrator-api-specs",
4
- "iasCommit": "5aa2524f",
4
+ "iasCommit": "2882b3ab",
5
5
  "generatedAt": "2026-10-20"
6
6
  },
7
7
  "roots": {