@celigo/api-specs 0.2.83 → 0.2.85

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/tool.yml CHANGED
@@ -402,8 +402,14 @@ paths:
402
402
  | `/name` | Tool display name |
403
403
  | `/description` | Tool description |
404
404
  | `/aiDescription` | AI-generated description object |
405
+ | `/input/debugUntil` | Debug-capture expiry for the Tool Input stage (ISO-8601, at most 3600 seconds from now) |
406
+ | `/output/debugUntil` | Debug-capture expiry for the Tool Output stage (ISO-8601, at most 3600 seconds from now) |
405
407
 
406
- All other paths are rejected with 422 (`not a whitelisted property`).
408
+ All other paths are rejected with 422 (`not a whitelisted property`). A
409
+ `debugUntil` more than 3600 seconds ahead is rejected with 422
410
+ `update_not_allowed` and nothing is saved; `remove` on an absent
411
+ `debugUntil` succeeds (204). Changing a `debugUntil` needs the Tool
412
+ update permission on the Tool's integration, like every other path.
407
413
 
408
414
  PATCH is the intended way to update these fields without accidentally
409
415
  resetting other tool configuration via `PUT`.
@@ -2624,9 +2630,24 @@ paths:
2624
2630
  description: |-
2625
2631
  Lists the debug request records captured for a specific step of a tool.
2626
2632
  These are the raw request/response payloads the step processed, retained
2627
- for troubleshooting while debug capture is active for the step. Use the
2628
- `key` of an entry with `GET /v1/tools/{_id}/{_stepId}/requests/{key}` to
2629
- fetch the full detail of a single captured request.
2633
+ for troubleshooting while debug capture is active for the step — a future
2634
+ `debugUntil` on the step's export or import document, or `input.debugUntil`
2635
+ / `output.debugUntil` on the tool for the Tool Input and Tool Output
2636
+ stages. Capture runs in every execution context (a standalone invoke at
2637
+ any `x-log-mode`, an AI agent or MCP caller, a flow or API that calls the
2638
+ tool, a parent tool); test runs write nothing here. Use the `key` of an
2639
+ entry with `GET /v1/tools/{_id}/{_stepId}/requests/{key}` to fetch the
2640
+ full detail of a single captured request.
2641
+
2642
+ HTTP and NetSuite steps record one entry per request they send. The
2643
+ `tool_input` stage records one entry per incoming record (`200` when the
2644
+ record passes the input schema, `422` with the validation errors when it
2645
+ does not); the `tool_output` stage records one entry per output
2646
+ validation. Routers, filters and scripts never record.
2647
+
2648
+ An account owner or administrator lists every entry. A shared user sees
2649
+ only entries from runs invoked under integrations they can access
2650
+ (standalone invokes are recorded under the tool's own integration).
2630
2651
 
2631
2652
  When more records match than fit in one page, `nextPageURL` returns the
2632
2653
  relative URL for the next page.
@@ -2656,15 +2677,21 @@ paths:
2656
2677
  required: true
2657
2678
  description: |-
2658
2679
  The step whose captured logs to list: the ObjectId of an export or
2659
- import step defined directly in this tool's routers. Steps nested
2660
- inside a child tool are addressed on that child tool's id. Any other
2661
- value — including reserved path segments such as `invocations`,
2662
- `invoke`, and `test` — returns `400` `invalid_ref`.
2680
+ import step defined directly in this tool's routers, or one of the
2681
+ two virtual stage ids `tool_input` (the record entering the tool,
2682
+ validated against the input schema) and `tool_output` (the
2683
+ post-mapped record, validated against the output schema). Steps
2684
+ nested inside a child tool are addressed on that child tool's id;
2685
+ an ObjectId that is not a direct step of this tool returns `404`
2686
+ `invalid_ref`. Any other value — including reserved path segments
2687
+ such as `invocations`, `invoke`, and `test` — returns `400`
2688
+ `invalid_ref`.
2663
2689
  schema:
2664
2690
  type: string
2665
- format: objectId
2666
2691
  examples:
2667
2692
  - 67ee026136f4d1eeb529ad63
2693
+ - tool_input
2694
+ - tool_output
2668
2695
  - name: time_gt
2669
2696
  in: query
2670
2697
  required: false
@@ -2771,7 +2798,11 @@ paths:
2771
2798
  description: Response status code of the captured request.
2772
2799
  stage:
2773
2800
  type: string
2774
- description: Processing stage the record was captured in.
2801
+ description: |-
2802
+ Processing stage the record was captured in, such as
2803
+ `lookup` for a lookup step's request. Present on
2804
+ records written by HTTP and NetSuite steps; absent on
2805
+ `tool_input` and `tool_output` records.
2775
2806
  additionalProperties: true
2776
2807
  nextPageURL:
2777
2808
  type: string
@@ -2789,16 +2820,60 @@ paths:
2789
2820
  summary: Captured debug requests for a tool step
2790
2821
  value:
2791
2822
  requests:
2792
- - key: 5481201053696-a10af1ade8fe477a847771c1e3716e36-200-POST
2823
+ - key: 5481201053696-a10af1ade8fe477a847771c1e3716e36-200-GET-lookup-60a2c4e6f321d800129a1a3c
2793
2824
  time: 1776917346304
2825
+ method: GET
2826
+ statusCode: '200'
2827
+ stage: lookup
2828
+ tool_input:
2829
+ summary: Captured Tool Input records — one passed, one failed the input schema
2830
+ value:
2831
+ requests:
2832
+ - key: 5466610903705-847304f37d2041a79b9e657ea9a45d68-200-POST--60a2c4e6f321d800129a1a3c
2833
+ time: 1791507496295
2794
2834
  method: POST
2795
2835
  statusCode: '200'
2836
+ - key: 5466610902616-0d4aa1266fcb4ae4be5a7f316ff5e01c-422-POST--60a2c4e6f321d800129a1a3c
2837
+ time: 1791507497384
2838
+ method: POST
2839
+ statusCode: '422'
2840
+ '400':
2841
+ description: |-
2842
+ `_stepId` is neither an ObjectId nor `tool_input` / `tool_output`.
2843
+ Error code: `invalid_ref`.
2844
+ content:
2845
+ application/json:
2846
+ schema:
2847
+ $ref: '#/components/schemas/Error'
2848
+ examples:
2849
+ unknown_virtual_id:
2850
+ value:
2851
+ errors:
2852
+ - code: invalid_ref
2853
+ message: Please provide a valid _expOrImpId.
2796
2854
  '401':
2797
2855
  $ref: '#/components/responses/401-unauthorized'
2798
2856
  '403':
2799
2857
  $ref: '#/components/responses/403-forbidden'
2800
2858
  '404':
2801
- $ref: '#/components/responses/404-not-found'
2859
+ description: |-
2860
+ The tool does not exist, or `_stepId` is an ObjectId that is not a
2861
+ step defined directly in this tool. Error code: `invalid_ref`.
2862
+ content:
2863
+ application/json:
2864
+ schema:
2865
+ $ref: '#/components/schemas/Error'
2866
+ examples:
2867
+ tool_not_found:
2868
+ value:
2869
+ errors:
2870
+ - code: invalid_ref
2871
+ message: Tool not found.
2872
+ step_not_in_tool:
2873
+ value:
2874
+ errors:
2875
+ - code: invalid_ref
2876
+ message: Export/Import not found.
2802
2877
  '422':
2803
2878
  description: 'Invalid time filter parameters. Error code: `invalid_or_missing_field`.'
2804
2879
  content:
@@ -2822,12 +2897,16 @@ paths:
2822
2897
  description: |-
2823
2898
  Deletes captured debug request records for a specific step of a tool, by
2824
2899
  their `key` values from `GET /v1/tools/{_id}/{_stepId}/requests`. Between
2825
- 1 and 1000 keys can be deleted per call.
2900
+ 1 and 1000 keys can be deleted per call; the deletion is synchronous and
2901
+ scoped to this step only.
2826
2902
 
2827
2903
  The response lists the keys that were deleted and, separately, any keys
2828
- that failed to delete along with the failure reason.
2904
+ that failed to delete along with the failure reason. A key that no longer
2905
+ exists is reported under `deleted`, not `errors`.
2829
2906
 
2830
- Requires the `manage:tool:logs:deletion` permission.
2907
+ Requires the `manage:tool:logs:deletion` permission. A shared user's
2908
+ delete removes only records from runs invoked under integrations they can
2909
+ access.
2831
2910
  operationId: deleteToolStepRequests
2832
2911
  tags:
2833
2912
  - Tools
@@ -2847,12 +2926,16 @@ paths:
2847
2926
  required: true
2848
2927
  description: |-
2849
2928
  The step whose captured logs to delete: the ObjectId of an export or
2850
- import step defined directly in this tool's routers.
2929
+ import step defined directly in this tool's routers, or the virtual
2930
+ stage id `tool_input` or `tool_output`. Any other value returns
2931
+ `400` `invalid_ref`; an ObjectId that is not a direct step of this
2932
+ tool returns `404` `invalid_ref`.
2851
2933
  schema:
2852
2934
  type: string
2853
- format: objectId
2854
2935
  examples:
2855
2936
  - 67ee026136f4d1eeb529ad63
2937
+ - tool_input
2938
+ - tool_output
2856
2939
  requestBody:
2857
2940
  required: true
2858
2941
  content:
@@ -2919,13 +3002,43 @@ paths:
2919
3002
  - 5481201048878-b21bf2bef9ff588b958882d2f4827f47-422-POST
2920
3003
  errors: []
2921
3004
  '400':
2922
- $ref: '#/components/responses/400-bad-request'
3005
+ description: |-
3006
+ The body carries no `keys` array (error code `invalid_url`), or
3007
+ `_stepId` is neither an ObjectId nor `tool_input` / `tool_output`
3008
+ (error code `invalid_ref`).
3009
+ content:
3010
+ application/json:
3011
+ schema:
3012
+ $ref: '#/components/schemas/Error'
3013
+ examples:
3014
+ missing_keys:
3015
+ value:
3016
+ errors:
3017
+ - code: invalid_url
3018
+ message: keys is not valid.
3019
+ unknown_virtual_id:
3020
+ value:
3021
+ errors:
3022
+ - code: invalid_ref
3023
+ message: Please provide a valid _expOrImpId.
2923
3024
  '401':
2924
3025
  $ref: '#/components/responses/401-unauthorized'
2925
3026
  '403':
2926
3027
  $ref: '#/components/responses/403-forbidden'
2927
3028
  '404':
2928
- $ref: '#/components/responses/404-not-found'
3029
+ description: |-
3030
+ The tool does not exist, or `_stepId` is an ObjectId that is not a
3031
+ step defined directly in this tool. Error code: `invalid_ref`.
3032
+ content:
3033
+ application/json:
3034
+ schema:
3035
+ $ref: '#/components/schemas/Error'
3036
+ examples:
3037
+ step_not_in_tool:
3038
+ value:
3039
+ errors:
3040
+ - code: invalid_ref
3041
+ message: Export/Import not found.
2929
3042
  /v1/tools/{_id}/{_stepId}/requests/{key}:
2930
3043
  get:
2931
3044
  x-internal: false
@@ -2935,8 +3048,15 @@ paths:
2935
3048
  step, identified by its `key`. Obtain the `key` from
2936
3049
  `GET /v1/tools/{_id}/{_stepId}/requests`.
2937
3050
 
2938
- The record carries the adaptor HTTP request/response the step issued,
2939
- with credentials masked, plus the `key`, record `id`, and capture `time`.
3051
+ For an HTTP or NetSuite step the record carries the adaptor HTTP
3052
+ request/response the step issued, with credentials masked and the
3053
+ bodies as strings. For the `tool_input` and `tool_output` stages (and a
3054
+ ToolImport step) the record is synthetic: `request.body` is the JSON
3055
+ record entering the stage, `response.body` is the validated JSON record
3056
+ (`statusCode` 200) or the validation errors (`statusCode` 422), the
3057
+ request carries no `url`, and `context` names the run that produced it.
3058
+ Synthetic bodies are stored unmasked. Every record carries the `key`,
3059
+ record `id`, and capture `time`.
2940
3060
 
2941
3061
  Requires the `manage:tool:logs` permission.
2942
3062
  operationId: getToolStepRequest
@@ -2958,15 +3078,18 @@ paths:
2958
3078
  required: true
2959
3079
  description: |-
2960
3080
  The step the captured request belongs to: the ObjectId of an export
2961
- or import step defined directly in this tool's routers. Steps nested
2962
- inside a child tool are addressed on that child tool's id. Any other
2963
- value — including reserved path segments such as `invocations`,
2964
- `invoke`, and `test` — returns `400` `invalid_ref`.
3081
+ or import step defined directly in this tool's routers, or the
3082
+ virtual stage id `tool_input` or `tool_output`. Steps nested inside
3083
+ a child tool are addressed on that child tool's id; an ObjectId that
3084
+ is not a direct step of this tool returns `404` `invalid_ref`. Any
3085
+ other value — including reserved path segments such as
3086
+ `invocations`, `invoke`, and `test` — returns `400` `invalid_ref`.
2965
3087
  schema:
2966
3088
  type: string
2967
- format: objectId
2968
3089
  examples:
2969
3090
  - 67ee026136f4d1eeb529ad63
3091
+ - tool_input
3092
+ - tool_output
2970
3093
  - name: key
2971
3094
  in: path
2972
3095
  required: true
@@ -2998,51 +3121,84 @@ paths:
2998
3121
  description: Epoch milliseconds when this pair was stored.
2999
3122
  request:
3000
3123
  type: object
3001
- description: The HTTP request the step's export or import sent.
3124
+ description: |-
3125
+ The HTTP request the step's export or import sent, or — for
3126
+ the `tool_input`, `tool_output` and ToolImport stages — the
3127
+ record entering the stage, wrapped as a `POST` with no `url`.
3002
3128
  properties:
3003
3129
  method:
3004
3130
  type: string
3005
- description: HTTP method (`GET`, `POST`, …).
3131
+ description: HTTP method (`GET`, `POST`, …); always `POST` on synthetic records.
3006
3132
  examples:
3007
3133
  - POST
3008
3134
  url:
3009
3135
  type: string
3010
- description: Fully-resolved URL the request was sent to.
3136
+ description: Fully-resolved URL the request was sent to. Absent on synthetic records.
3011
3137
  examples:
3012
3138
  - https://httpbin.org/post
3013
3139
  headers:
3014
3140
  type: object
3015
- description: Headers sent with the request; credential values are masked.
3141
+ description: Headers sent with the request; credential values are masked. Empty on synthetic records.
3016
3142
  additionalProperties: true
3017
3143
  body:
3018
- type: string
3019
- description: Request body as sent, verbatim.
3144
+ type:
3145
+ - string
3146
+ - object
3147
+ description: |-
3148
+ Request body as sent, verbatim, for an HTTP step (absent on a
3149
+ body-less method such as `GET`); the JSON record entering the
3150
+ stage on a synthetic record.
3020
3151
  examples:
3021
3152
  - '{"orderId":"SO-1042"}'
3022
3153
  response:
3023
3154
  type: object
3024
- description: The HTTP response the step received.
3155
+ description: |-
3156
+ The HTTP response the step received, or — on synthetic
3157
+ records — the outcome of the stage: the validated record
3158
+ with `statusCode` 200, or the validation errors with 422.
3025
3159
  properties:
3026
3160
  statusCode:
3027
3161
  type: integer
3028
- description: HTTP status code the target system returned.
3162
+ description: HTTP status code the target system returned, or 200 / 422 for a synthetic record.
3029
3163
  examples:
3030
3164
  - 200
3031
3165
  headers:
3032
3166
  type: object
3033
- description: Response headers as received.
3167
+ description: Response headers as received. Empty on synthetic records.
3034
3168
  additionalProperties: true
3035
3169
  body:
3036
- type: string
3037
- description: Response body as received; parse per the `content-type` header.
3170
+ type:
3171
+ - string
3172
+ - object
3173
+ description: |-
3174
+ For an HTTP or NetSuite step: the response body as received, a
3175
+ string the caller parses per the `content-type` header. On a
3176
+ synthetic record: the validated JSON record as an object, or
3177
+ `{errors: [{code, message, …}]}` when validation failed.
3038
3178
  examples:
3039
3179
  - '{"ok":true}'
3180
+ receivedAt:
3181
+ type: integer
3182
+ format: int64
3183
+ description: Epoch milliseconds when the pair was captured.
3184
+ context:
3185
+ type: object
3186
+ description: |-
3187
+ The run that produced a synthetic record. Absent on records
3188
+ written by HTTP and NetSuite steps.
3189
+ properties:
3190
+ _rootContainerId:
3191
+ type: string
3192
+ description: Owning flow, API, or tool id of the run that produced this capture.
3193
+ _jobId:
3194
+ type: string
3195
+ description: Job id of the run that produced this capture.
3040
3196
  additionalProperties: true
3041
3197
  examples:
3042
3198
  adaptor_http:
3043
3199
  summary: Captured HTTP request of a lookup step
3044
3200
  value:
3045
- key: 5481201053696-a10af1ade8fe477a847771c1e3716e36-200-POST
3201
+ key: 5481201053696-a10af1ade8fe477a847771c1e3716e36-200-POST-lookup-60a2c4e6f321d800129a1a3c
3046
3202
  id: a10af1ade8fe477a847771c1e3716e36
3047
3203
  time: 1776917346304
3048
3204
  request:
@@ -3056,12 +3212,67 @@ paths:
3056
3212
  headers:
3057
3213
  content-type: application/json
3058
3214
  body: '{"ok":true}'
3215
+ receivedAt: 1776917346302
3216
+ tool_input_failed:
3217
+ summary: Synthetic Tool Input record — the record failed the input schema
3218
+ value:
3219
+ key: 5466610902616-0d4aa1266fcb4ae4be5a7f316ff5e01c-422-POST--60a2c4e6f321d800129a1a3c
3220
+ id: 0d4aa1266fcb4ae4be5a7f316ff5e01c
3221
+ time: 1791507497384
3222
+ request:
3223
+ method: POST
3224
+ headers: {}
3225
+ body: {}
3226
+ response:
3227
+ statusCode: 422
3228
+ headers: {}
3229
+ receivedAt: 1791507497384
3230
+ body:
3231
+ errors:
3232
+ - code: tool_input_schema_validation_failed
3233
+ message: 'Tool input validation failed: must have required property ''q'''
3234
+ source: tool_input
3235
+ stage: tool_input_schema_validation
3236
+ context:
3237
+ _rootContainerId: 69d462d5b9c28ea0b7f82522
3238
+ _jobId: 6ac83c299205d177fa25df54
3239
+ '400':
3240
+ description: |-
3241
+ `_stepId` is neither an ObjectId nor `tool_input` / `tool_output`.
3242
+ Error code: `invalid_ref`.
3243
+ content:
3244
+ application/json:
3245
+ schema:
3246
+ $ref: '#/components/schemas/Error'
3247
+ examples:
3248
+ unknown_virtual_id:
3249
+ value:
3250
+ errors:
3251
+ - code: invalid_ref
3252
+ message: Please provide a valid _expOrImpId.
3059
3253
  '401':
3060
3254
  $ref: '#/components/responses/401-unauthorized'
3061
3255
  '403':
3062
3256
  $ref: '#/components/responses/403-forbidden'
3063
3257
  '404':
3064
- $ref: '#/components/responses/404-not-found'
3258
+ description: |-
3259
+ The tool or the step does not exist (`invalid_ref`), or no record
3260
+ carries this `key` (`file_not_found`).
3261
+ content:
3262
+ application/json:
3263
+ schema:
3264
+ $ref: '#/components/schemas/Error'
3265
+ examples:
3266
+ unknown_key:
3267
+ value:
3268
+ errors:
3269
+ - code: file_not_found
3270
+ message: We are unable to find the file for the given fileName.
3271
+ step_not_in_tool:
3272
+ value:
3273
+ errors:
3274
+ - code: invalid_ref
3275
+ message: Export/Import not found.
3065
3276
  components:
3066
3277
  securitySchemes:
3067
3278
  bearerAuth:
@@ -3373,7 +3584,8 @@ components:
3373
3584
  Explicit JSON `null` is itself a valid fallback: the destination field is written as
3374
3585
  JSON null when the extract yields nothing (the Mapper UI's "Use null as default value"
3375
3586
  action). Omitting the key entirely means no fallback — the field is left out of the
3376
- output when the extract is empty (the UI's "Do nothing" action).
3587
+ output when the extract is empty (the UI's "Do nothing" action). Failing the record
3588
+ instead is `conditional.when: fail_record_when_empty`, which excludes a default.
3377
3589
  x-celigo-ai-guidance:
3378
3590
  - |-
3379
3591
  `"default": null` and `"default": ""` are distinct saved values, not
@@ -3382,6 +3594,12 @@ components:
3382
3594
  Preserve them verbatim when editing or migrating a mapping — dropping
3383
3595
  the key changes runtime behavior from "use null/empty string as
3384
3596
  default value" to "do nothing" (field omitted from the output).
3597
+ - |-
3598
+ The four "Action to take if source field has no value" choices map to:
3599
+ do nothing → no `default` key (optionally `conditional.when:
3600
+ extract_not_empty`); use null → `"default": null`; use empty string or
3601
+ a custom value → `"default": "<value>"`; cause the record to fail →
3602
+ `conditional.when: fail_record_when_empty` with no `default` key.
3385
3603
  examples:
3386
3604
  - N/A
3387
3605
  - '0'
@@ -3714,6 +3932,22 @@ components:
3714
3932
  - $.order.lineItems[*]
3715
3933
  - $.parents[*].children[*]
3716
3934
  - $
3935
+ name:
3936
+ type: string
3937
+ maxLength: 200
3938
+ description: |
3939
+ Display label for this source object in the mapper, so the sources of
3940
+ an object array can be told apart instead of all showing as `$`.
3941
+ Has no effect at runtime; stored only when non-empty.
3942
+ x-celigo-ai-guidance:
3943
+ - |-
3944
+ Carry an existing `name` through every edit — it is the user's label
3945
+ for the tab, and an entry sent without it loses the label. Duplicate
3946
+ names across entries are allowed. Set one only when the user names
3947
+ the source object; never invent labels.
3948
+ examples:
3949
+ - Billing address
3950
+ - Shipping address
3717
3951
  sourceDataType:
3718
3952
  type: string
3719
3953
  description: |
@@ -3762,17 +3996,31 @@ components:
3762
3996
  type: object
3763
3997
  description: |
3764
3998
  Defines conditional rules for including each array element in the result.
3999
+ x-celigo-ai-guidance:
4000
+ - |-
4001
+ Judged against this entry's own `extract` (the array source). The
4002
+ design scopes the UI's tab-level "Action to take if source field has
4003
+ no value" to copy-as-is tabs (no child `mappings`); the API accepts
4004
+ `fail_record_when_empty` on a mapped entry as well, and the mapper
4005
+ processor honors it there — the record fails when that array is
4006
+ missing or empty (`errors[]` entry `code: extract_empty`, `fatal:
4007
+ true`, message `<generate>: Source field has no value`; probed
4008
+ 2026-10-09). Say so when writing it on a mapped entry: the user may
4009
+ not find the setting in the mapper's tab. To fail on an empty field
4010
+ inside each element, set the action on that child mapping instead.
3765
4011
  properties:
3766
4012
  when:
3767
4013
  type: string
3768
4014
  description: |
3769
- Specifies the condition that must be met for an array element to be included.
3770
-
3771
- 'extract_not_empty' only includes elements where the extract field returns a value.
4015
+ Condition judged on the entry's extract — skip the elements the
4016
+ extract does not return, or fail the whole record when the source
4017
+ array is missing or empty.
3772
4018
  enum:
3773
4019
  - extract_not_empty
4020
+ - fail_record_when_empty
3774
4021
  x-enumDescriptions:
3775
- extract_not_empty: Include the array element only when the extract field returns a non-empty value.
4022
+ extract_not_empty: Include an array element only when the extract returns a non-empty value for it
4023
+ fail_record_when_empty: Fail the record when the entry's source array is missing or empty
3776
4024
  examples:
3777
4025
  - extract_not_empty
3778
4026
  mappings:
@@ -3872,6 +4120,20 @@ components:
3872
4120
  extract: $.price
3873
4121
  dataType: number
3874
4122
  status: Active
4123
+ if:
4124
+ properties:
4125
+ conditional:
4126
+ properties:
4127
+ when:
4128
+ const: fail_record_when_empty
4129
+ required:
4130
+ - when
4131
+ required:
4132
+ - conditional
4133
+ then:
4134
+ not:
4135
+ required:
4136
+ - default
3875
4137
  status:
3876
4138
  type: string
3877
4139
  description: |
@@ -3879,9 +4141,10 @@ components:
3879
4141
  Required on every mapping entry. Controls whether the mapping is applied.
3880
4142
 
3881
4143
  **Guidance**
3882
- Emit `"Active"` for mappings that should run; `"Draft"` saves an
3883
- in-progress mapping without the Active-only field validations. The
3884
- API rejects a mapping missing this field
4144
+ Only `Active` rows run. `Draft` and `Inactive` rows keep their
4145
+ configuration, are saved with minimal validation, and are skipped at
4146
+ runtime and in preview; a non-Active parent skips its whole subtree
4147
+ whatever its children say. The API rejects a mapping missing this field
3885
4148
  (validation error: "Mapping object must have status field present.").
3886
4149
  x-celigo-ai-guidance:
3887
4150
  - |-
@@ -3890,12 +4153,28 @@ components:
3890
4153
  field validations. The value is case-sensitive. The API rejects:
3891
4154
  - Missing field: `[status_field_absent] Mapping object must have status field present.`
3892
4155
  - Wrong case (e.g. `"active"`): `[invalid_status_enums] active is not a valid enum for status field.`
4156
+ - |-
4157
+ `"Inactive"` is the user's "Set inactive" on a row: use it only when
4158
+ asked to disable or park a row, never to mean incomplete (that is
4159
+ `"Draft"`). Setting a parent `Inactive` means no `Active` row may
4160
+ remain under it — the save rejects an `Active` row under an
4161
+ `Inactive` parent (`[inactive_parent_active_child]` on `mappings`,
4162
+ no message text) and never cascades or promotes on its own; `Draft`
4163
+ descendants are kept as they are, and a `Draft` parent does not gate
4164
+ its children. The UI's Set inactive on a parent marks the parent and
4165
+ every child `Inactive` (IO-166197). Re-enabling a child
4166
+ means re-enabling its ancestors in the same payload. Edits that keep
4167
+ existing rows must carry their stored status forward — rewriting a
4168
+ `Draft` or `Inactive` row to `Active` turns a row the user parked
4169
+ back on.
3893
4170
  enum:
3894
4171
  - Active
3895
4172
  - Draft
4173
+ - Inactive
3896
4174
  x-enumDescriptions:
3897
- Active: The mapping is enabled and applied during processing.
3898
- Draft: In-progress mapping; saved without the Active-only field validations.
4175
+ Active: The mapping is enabled and applied during processing
4176
+ Draft: In-progress mapping; saved without the Active-only field validations and skipped at runtime
4177
+ Inactive: Disabled by the user; configuration kept, skipped at runtime and in preview
3899
4178
  examples:
3900
4179
  - Active
3901
4180
  conditional:
@@ -3924,6 +4203,10 @@ components:
3924
4203
  - `extract_not_empty`: Apply only when the extract field returns a value
3925
4204
  Useful for conditional mapping based on input data availability
3926
4205
 
4206
+ - `fail_record_when_empty`: Fail the record when the extract field returns
4207
+ no value (the UI's "Cause record to fail" action when the source field
4208
+ has no value)
4209
+
3927
4210
  **Example**
3928
4211
  ```json
3929
4212
  {
@@ -3936,28 +4219,75 @@ components:
3936
4219
  }
3937
4220
  }
3938
4221
  ```
4222
+ x-celigo-ai-guidance:
4223
+ - |-
4224
+ `when` holds one value, and two different settings share it: the
4225
+ composite-import operation gate (`record_created` / `record_updated`,
4226
+ the UI's "Only perform mapping when") and the empty-source action
4227
+ (`extract_not_empty` / `fail_record_when_empty`, the UI's "Action to
4228
+ take if source field has no value"). A row cannot carry both — writing
4229
+ one replaces the other and the save succeeds, so a composite import
4230
+ row that needs both has to choose. Never author `fail_record_when_empty`
4231
+ on a row that already carries `record_created` or `record_updated`.
3939
4232
  properties:
3940
4233
  when:
3941
4234
  type: string
3942
4235
  description: |
3943
- Specifies the condition that triggers application of this mapping:
3944
- - record_created: Apply only when creating a new record
3945
- - record_updated: Apply only when updating an existing record
3946
- - extract_not_empty: Apply only when the extract field returns a value
4236
+ Condition that gates this mapping — either an operation gate on a
4237
+ composite (create-or-update) import or the action to take when the
4238
+ extract returns no value. Empty means null, undefined or an empty
4239
+ string; `0`, `false` and whitespace are values.
4240
+ x-celigo-ai-guidance:
4241
+ - |-
4242
+ `fail_record_when_empty` is the fourth "Action to take if source field
4243
+ has no value" and is mutually exclusive with the other three: send it
4244
+ with no `default` key. A `default`, a `lookupName` or a `hardCodedValue`
4245
+ on the same row — or a `default` on a `buildArrayHelper` entry — is
4246
+ rejected at save with `[unsupported_mapping] "<key>" and conditional.when
4247
+ "fail_record_when_empty" cannot be present in mapping simultaneously.`
4248
+ (the lookup variant adds `Use lookup "allowFailures" instead.`);
4249
+ lookups fail through `allowFailures: false`, and a hard-coded row
4250
+ always has a value. At runtime an empty extract fails the record with
4251
+ an `errors[]` entry `{code: "extract_empty", fatal: true, source:
4252
+ "mapping", message: "<generate>: Source field has no value"}`
4253
+ ("Input field has no value" in a Transformation 2.0); `0` and `false`
4254
+ are values and map through.
3947
4255
  enum:
3948
4256
  - record_created
3949
4257
  - record_updated
3950
4258
  - extract_not_empty
4259
+ - fail_record_when_empty
3951
4260
  x-enumDescriptions:
3952
- record_created: Apply this mapping only when creating a new record.
3953
- record_updated: Apply this mapping only when updating an existing record.
3954
- extract_not_empty: Apply this mapping only when the extract field returns a non-empty value.
4261
+ record_created: Apply this mapping only when creating a new record
4262
+ record_updated: Apply this mapping only when updating an existing record
4263
+ extract_not_empty: Apply this mapping only when the extract field returns a non-empty value
4264
+ fail_record_when_empty: Fail the record when the extract field returns no value
3955
4265
  examples:
3956
4266
  - record_created
3957
4267
  - record_updated
3958
4268
  - extract_not_empty
4269
+ - fail_record_when_empty
3959
4270
  required:
3960
4271
  - dataType
4272
+ if:
4273
+ properties:
4274
+ conditional:
4275
+ properties:
4276
+ when:
4277
+ const: fail_record_when_empty
4278
+ required:
4279
+ - when
4280
+ required:
4281
+ - conditional
4282
+ then:
4283
+ not:
4284
+ anyOf:
4285
+ - required:
4286
+ - default
4287
+ - required:
4288
+ - lookupName
4289
+ - required:
4290
+ - hardCodedValue
3961
4291
  Mappings:
3962
4292
  type: array
3963
4293
  description: |
@@ -3981,6 +4311,20 @@ components:
3981
4311
 
3982
4312
  The system will process these nested structures recursively during runtime, ensuring proper construction
3983
4313
  of complex hierarchical data while maintaining excellent performance.
4314
+
4315
+ On save, a leaf row with neither a source (`extract`, `hardCodedValue`, `lookupName`) nor a
4316
+ destination (`generate`) is dropped silently, at every nesting level, and so is an object or
4317
+ object-array row left with no source, no destination and no remaining child `mappings` or
4318
+ `buildArrayHelper` entries; a row with only one of the two, and a source-less, destination-less
4319
+ wrapper that still has children, are kept.
4320
+ x-celigo-ai-guidance:
4321
+ - |-
4322
+ Rows that exist in the saved document — including `Draft` and `Inactive` rows and
4323
+ rows with only a source or only a destination — are the user's state: an edit that
4324
+ re-sends the tree must carry them through unchanged unless the user asked to change
4325
+ them. Only a row with neither source nor destination — and, for an object or
4326
+ object-array row, no remaining children — can be left out; the save would drop it
4327
+ anyway. A wrapper with children but no `generate` is kept by the save, so keep it.
3984
4328
  items:
3985
4329
  type: object
3986
4330
  properties:
@@ -4260,7 +4604,8 @@ components:
4260
4604
  Explicit JSON `null` is itself a valid fallback: the destination field is written as
4261
4605
  JSON null when the extract yields nothing (the Mapper UI's "Use null as default value"
4262
4606
  action). Omitting the key entirely means no fallback — the field is left out of the
4263
- output when the extract is empty (the UI's "Do nothing" action).
4607
+ output when the extract is empty (the UI's "Do nothing" action). Failing the record
4608
+ instead is `conditional.when: fail_record_when_empty`, which excludes a default.
4264
4609
  x-celigo-ai-guidance:
4265
4610
  - |-
4266
4611
  `"default": null` and `"default": ""` are distinct saved values, not
@@ -4269,6 +4614,12 @@ components:
4269
4614
  Preserve them verbatim when editing or migrating a mapping — dropping
4270
4615
  the key changes runtime behavior from "use null/empty string as
4271
4616
  default value" to "do nothing" (field omitted from the output).
4617
+ - |-
4618
+ The four "Action to take if source field has no value" choices map to:
4619
+ do nothing → no `default` key (optionally `conditional.when:
4620
+ extract_not_empty`); use null → `"default": null`; use empty string or
4621
+ a custom value → `"default": "<value>"`; cause the record to fail →
4622
+ `conditional.when: fail_record_when_empty` with no `default` key.
4272
4623
  examples:
4273
4624
  - N/A
4274
4625
  - '0'
@@ -4601,6 +4952,22 @@ components:
4601
4952
  - $.order.lineItems[*]
4602
4953
  - $.parents[*].children[*]
4603
4954
  - $
4955
+ name:
4956
+ type: string
4957
+ maxLength: 200
4958
+ description: |
4959
+ Display label for this source object in the mapper, so the sources of
4960
+ an object array can be told apart instead of all showing as `$`.
4961
+ Has no effect at runtime; stored only when non-empty.
4962
+ x-celigo-ai-guidance:
4963
+ - |-
4964
+ Carry an existing `name` through every edit — it is the user's label
4965
+ for the tab, and an entry sent without it loses the label. Duplicate
4966
+ names across entries are allowed. Set one only when the user names
4967
+ the source object; never invent labels.
4968
+ examples:
4969
+ - Billing address
4970
+ - Shipping address
4604
4971
  sourceDataType:
4605
4972
  type: string
4606
4973
  description: |
@@ -4649,17 +5016,31 @@ components:
4649
5016
  type: object
4650
5017
  description: |
4651
5018
  Defines conditional rules for including each array element in the result.
5019
+ x-celigo-ai-guidance:
5020
+ - |-
5021
+ Judged against this entry's own `extract` (the array source). The
5022
+ design scopes the UI's tab-level "Action to take if source field has
5023
+ no value" to copy-as-is tabs (no child `mappings`); the API accepts
5024
+ `fail_record_when_empty` on a mapped entry as well, and the mapper
5025
+ processor honors it there — the record fails when that array is
5026
+ missing or empty (`errors[]` entry `code: extract_empty`, `fatal:
5027
+ true`, message `<generate>: Source field has no value`; probed
5028
+ 2026-10-09). Say so when writing it on a mapped entry: the user may
5029
+ not find the setting in the mapper's tab. To fail on an empty field
5030
+ inside each element, set the action on that child mapping instead.
4652
5031
  properties:
4653
5032
  when:
4654
5033
  type: string
4655
5034
  description: |
4656
- Specifies the condition that must be met for an array element to be included.
4657
-
4658
- 'extract_not_empty' only includes elements where the extract field returns a value.
5035
+ Condition judged on the entry's extract — skip the elements the
5036
+ extract does not return, or fail the whole record when the source
5037
+ array is missing or empty.
4659
5038
  enum:
4660
5039
  - extract_not_empty
5040
+ - fail_record_when_empty
4661
5041
  x-enumDescriptions:
4662
- extract_not_empty: Include the array element only when the extract field returns a non-empty value.
5042
+ extract_not_empty: Include an array element only when the extract returns a non-empty value for it
5043
+ fail_record_when_empty: Fail the record when the entry's source array is missing or empty
4663
5044
  examples:
4664
5045
  - extract_not_empty
4665
5046
  mappings:
@@ -4759,6 +5140,20 @@ components:
4759
5140
  extract: $.price
4760
5141
  dataType: number
4761
5142
  status: Active
5143
+ if:
5144
+ properties:
5145
+ conditional:
5146
+ properties:
5147
+ when:
5148
+ const: fail_record_when_empty
5149
+ required:
5150
+ - when
5151
+ required:
5152
+ - conditional
5153
+ then:
5154
+ not:
5155
+ required:
5156
+ - default
4762
5157
  status:
4763
5158
  type: string
4764
5159
  description: |
@@ -4766,9 +5161,10 @@ components:
4766
5161
  Required on every mapping entry. Controls whether the mapping is applied.
4767
5162
 
4768
5163
  **Guidance**
4769
- Emit `"Active"` for mappings that should run; `"Draft"` saves an
4770
- in-progress mapping without the Active-only field validations. The
4771
- API rejects a mapping missing this field
5164
+ Only `Active` rows run. `Draft` and `Inactive` rows keep their
5165
+ configuration, are saved with minimal validation, and are skipped at
5166
+ runtime and in preview; a non-Active parent skips its whole subtree
5167
+ whatever its children say. The API rejects a mapping missing this field
4772
5168
  (validation error: "Mapping object must have status field present.").
4773
5169
  x-celigo-ai-guidance:
4774
5170
  - |-
@@ -4777,12 +5173,28 @@ components:
4777
5173
  field validations. The value is case-sensitive. The API rejects:
4778
5174
  - Missing field: `[status_field_absent] Mapping object must have status field present.`
4779
5175
  - Wrong case (e.g. `"active"`): `[invalid_status_enums] active is not a valid enum for status field.`
5176
+ - |-
5177
+ `"Inactive"` is the user's "Set inactive" on a row: use it only when
5178
+ asked to disable or park a row, never to mean incomplete (that is
5179
+ `"Draft"`). Setting a parent `Inactive` means no `Active` row may
5180
+ remain under it — the save rejects an `Active` row under an
5181
+ `Inactive` parent (`[inactive_parent_active_child]` on `mappings`,
5182
+ no message text) and never cascades or promotes on its own; `Draft`
5183
+ descendants are kept as they are, and a `Draft` parent does not gate
5184
+ its children. The UI's Set inactive on a parent marks the parent and
5185
+ every child `Inactive` (IO-166197). Re-enabling a child
5186
+ means re-enabling its ancestors in the same payload. Edits that keep
5187
+ existing rows must carry their stored status forward — rewriting a
5188
+ `Draft` or `Inactive` row to `Active` turns a row the user parked
5189
+ back on.
4780
5190
  enum:
4781
5191
  - Active
4782
5192
  - Draft
5193
+ - Inactive
4783
5194
  x-enumDescriptions:
4784
- Active: The mapping is enabled and applied during processing.
4785
- Draft: In-progress mapping; saved without the Active-only field validations.
5195
+ Active: The mapping is enabled and applied during processing
5196
+ Draft: In-progress mapping; saved without the Active-only field validations and skipped at runtime
5197
+ Inactive: Disabled by the user; configuration kept, skipped at runtime and in preview
4786
5198
  examples:
4787
5199
  - Active
4788
5200
  conditional:
@@ -4811,6 +5223,10 @@ components:
4811
5223
  - `extract_not_empty`: Apply only when the extract field returns a value
4812
5224
  Useful for conditional mapping based on input data availability
4813
5225
 
5226
+ - `fail_record_when_empty`: Fail the record when the extract field returns
5227
+ no value (the UI's "Cause record to fail" action when the source field
5228
+ has no value)
5229
+
4814
5230
  **Example**
4815
5231
  ```json
4816
5232
  {
@@ -4823,28 +5239,75 @@ components:
4823
5239
  }
4824
5240
  }
4825
5241
  ```
5242
+ x-celigo-ai-guidance:
5243
+ - |-
5244
+ `when` holds one value, and two different settings share it: the
5245
+ composite-import operation gate (`record_created` / `record_updated`,
5246
+ the UI's "Only perform mapping when") and the empty-source action
5247
+ (`extract_not_empty` / `fail_record_when_empty`, the UI's "Action to
5248
+ take if source field has no value"). A row cannot carry both — writing
5249
+ one replaces the other and the save succeeds, so a composite import
5250
+ row that needs both has to choose. Never author `fail_record_when_empty`
5251
+ on a row that already carries `record_created` or `record_updated`.
4826
5252
  properties:
4827
5253
  when:
4828
5254
  type: string
4829
5255
  description: |
4830
- Specifies the condition that triggers application of this mapping:
4831
- - record_created: Apply only when creating a new record
4832
- - record_updated: Apply only when updating an existing record
4833
- - extract_not_empty: Apply only when the extract field returns a value
5256
+ Condition that gates this mapping — either an operation gate on a
5257
+ composite (create-or-update) import or the action to take when the
5258
+ extract returns no value. Empty means null, undefined or an empty
5259
+ string; `0`, `false` and whitespace are values.
5260
+ x-celigo-ai-guidance:
5261
+ - |-
5262
+ `fail_record_when_empty` is the fourth "Action to take if source field
5263
+ has no value" and is mutually exclusive with the other three: send it
5264
+ with no `default` key. A `default`, a `lookupName` or a `hardCodedValue`
5265
+ on the same row — or a `default` on a `buildArrayHelper` entry — is
5266
+ rejected at save with `[unsupported_mapping] "<key>" and conditional.when
5267
+ "fail_record_when_empty" cannot be present in mapping simultaneously.`
5268
+ (the lookup variant adds `Use lookup "allowFailures" instead.`);
5269
+ lookups fail through `allowFailures: false`, and a hard-coded row
5270
+ always has a value. At runtime an empty extract fails the record with
5271
+ an `errors[]` entry `{code: "extract_empty", fatal: true, source:
5272
+ "mapping", message: "<generate>: Source field has no value"}`
5273
+ ("Input field has no value" in a Transformation 2.0); `0` and `false`
5274
+ are values and map through.
4834
5275
  enum:
4835
5276
  - record_created
4836
5277
  - record_updated
4837
5278
  - extract_not_empty
5279
+ - fail_record_when_empty
4838
5280
  x-enumDescriptions:
4839
- record_created: Apply this mapping only when creating a new record.
4840
- record_updated: Apply this mapping only when updating an existing record.
4841
- extract_not_empty: Apply this mapping only when the extract field returns a non-empty value.
5281
+ record_created: Apply this mapping only when creating a new record
5282
+ record_updated: Apply this mapping only when updating an existing record
5283
+ extract_not_empty: Apply this mapping only when the extract field returns a non-empty value
5284
+ fail_record_when_empty: Fail the record when the extract field returns no value
4842
5285
  examples:
4843
5286
  - record_created
4844
5287
  - record_updated
4845
5288
  - extract_not_empty
5289
+ - fail_record_when_empty
4846
5290
  required:
4847
5291
  - dataType
5292
+ if:
5293
+ properties:
5294
+ conditional:
5295
+ properties:
5296
+ when:
5297
+ const: fail_record_when_empty
5298
+ required:
5299
+ - when
5300
+ required:
5301
+ - conditional
5302
+ then:
5303
+ not:
5304
+ anyOf:
5305
+ - required:
5306
+ - default
5307
+ - required:
5308
+ - lookupName
5309
+ - required:
5310
+ - hardCodedValue
4848
5311
  Lookups:
4849
5312
  type: array
4850
5313
  description: |
@@ -5621,6 +6084,20 @@ components:
5621
6084
  ("requires at least one double stash expression"), and an unbalanced `{{record.id`
5622
6085
  fails with 422 "Failed to compile handlebars template". An empty string clears the
5623
6086
  field.
6087
+ debugUntil:
6088
+ type: string
6089
+ format: date-time
6090
+ description: |-
6091
+ Turns on debug capture for the Tool Input stage until this time: while it lies in
6092
+ the future, every record entering the tool is written to
6093
+ `GET /v1/tools/{_id}/tool_input/requests` with its input-schema outcome, in every
6094
+ execution context (standalone invoke, AI agent or MCP caller, flow or API). At
6095
+ most 3600 seconds ahead — a later value is rejected with `422` `update_not_allowed`
6096
+ and nothing is saved. Written by PUT or by `PATCH /v1/tools/{_id}` on
6097
+ `/input/debugUntil`; `remove` (or a past time) stops capture. Capture is not
6098
+ retroactive and does not change record retention.
6099
+ examples:
6100
+ - '2026-08-25T12:30:00.000Z'
5624
6101
  mockInput:
5625
6102
  type: object
5626
6103
  description: |
@@ -5793,6 +6270,20 @@ components:
5793
6270
  examples:
5794
6271
  - postProcessOutput
5795
6272
  - validateOutput
6273
+ debugUntil:
6274
+ type: string
6275
+ format: date-time
6276
+ description: |-
6277
+ Turns on debug capture for the Tool Output stage until this time: while it lies in
6278
+ the future, every post-mapped record is written to
6279
+ `GET /v1/tools/{_id}/tool_output/requests` with its output-schema outcome, in every
6280
+ execution context (standalone invoke, AI agent or MCP caller, flow or API). At
6281
+ most 3600 seconds ahead — a later value is rejected with `422` `update_not_allowed`
6282
+ and nothing is saved. Written by PUT or by `PATCH /v1/tools/{_id}` on
6283
+ `/output/debugUntil`; `remove` (or a past time) stops capture. Capture is not
6284
+ retroactive and does not change record retention.
6285
+ examples:
6286
+ - '2026-08-25T12:30:00.000Z'
5796
6287
  mockInput:
5797
6288
  type: object
5798
6289
  description: |
@@ -24585,7 +25076,13 @@ components:
24585
25076
  type: string
24586
25077
  format: date-time
24587
25078
  readOnly: true
24588
- description: Timestamp until which debug logging is enabled for this import.
25079
+ description: |-
25080
+ Turns on step debug capture until this time: while it lies in the future, every
25081
+ request this import sends — or, for a `ToolImport`, every record passing through
25082
+ it with the tool's output — is recorded in the step's debug log
25083
+ (`GET /v1/{flows|apis|tools}/{containerId}/{_id}/requests`). Read-only on PUT —
25084
+ written only by `PATCH /v1/imports/{_id}` on `/debugUntil`, at most 3600 seconds
25085
+ ahead (`422` `update_not_allowed` beyond that); `remove` stops capture.
24589
25086
  GroupBy:
24590
25087
  type: array
24591
25088
  description: |
@@ -36426,7 +36923,12 @@ components:
36426
36923
  type: string
36427
36924
  format: date-time
36428
36925
  readOnly: true
36429
- description: Timestamp until which debug logging is enabled for this export.
36926
+ description: |-
36927
+ Turns on step debug capture until this time: while it lies in the future, every
36928
+ request this export sends is recorded in the step's debug log
36929
+ (`GET /v1/{flows|apis|tools}/{containerId}/{_id}/requests`). Read-only on PUT —
36930
+ written only by `PATCH /v1/exports/{_id}` on `/debugUntil`, at most 3600 seconds
36931
+ ahead (`422` `update_not_allowed` beyond that); `remove` stops capture.
36430
36932
  ClonePreviewResponse:
36431
36933
  type: object
36432
36934
  description: |