@epilot/app-client 0.13.4 → 0.13.6

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2026 epilot GmbH
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -1 +1 @@
1
- (()=>{"use strict";var e={330:function(e,r,t){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});var p=n(t(466));r.default=p.default},466:e=>{e.exports=JSON.parse('{"openapi":"3.1.0","info":{"title":"","version":""},"servers":[{"url":"https://app.sls.epilot.io"}],"paths":{"/v1/public/app/{appId}/components/{componentId}":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the app configuration to install"},{"name":"componentId","in":"path","required":true,"description":"ID of the component to retrieve"}],"get":{"operationId":"getPublicFacingComponent","responses":{}}},"/v1/app-configurations":{"get":{"operationId":"listConfigurations","parameters":[{"name":"page","in":"query"},{"name":"pageSize","in":"query"}],"responses":{}},"post":{"operationId":"createConfiguration","requestBody":{"$ref":"#/components/requestBodies/CreateConfigRequest"},"responses":{}}},"/v1/app-configurations/public":{"get":{"operationId":"listPublicConfigurations","parameters":[{"name":"page","in":"query"},{"name":"pageSize","in":"query"}],"responses":{}}},"/v1/app-configurations/public/{appId}":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the app configuration to install"}],"get":{"operationId":"getPublicConfiguration","parameters":[{"name":"version","in":"query"}],"responses":{}}},"/v1/app-configurations/{appId}":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the app configuration"}],"get":{"operationId":"getConfiguration","parameters":[{"name":"version","in":"query"}],"responses":{}},"patch":{"operationId":"patchMetadata","requestBody":{"$ref":"#/components/requestBodies/PatchConfigMetadataRequest"},"responses":{}},"delete":{"operationId":"deleteConfiguration","responses":{}}},"/v1/app-configurations/{appId}/events":{"post":{"operationId":"queryEvents","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/app-configurations/{appId}/bundle":{"post":{"operationId":"createBundleUploadUrl","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/CreateBundlePresignedRequest"},"responses":{}}},"/v1/app-configurations/{appId}/zip":{"post":{"operationId":"createZipUploadUrl","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v1/app-configurations/{appId}/logo":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the app configuration"}],"post":{"operationId":"createLogoUploadUrl","requestBody":{"$ref":"#/components/requestBodies/CreateLogoPresignedRequest"},"responses":{}},"delete":{"operationId":"deleteLogo","responses":{}}},"/v1/app-configurations/{appId}/versions":{"get":{"operationId":"listVersions","parameters":[{"name":"appId","in":"path","required":true},{"name":"page","in":"query"},{"name":"pageSize","in":"query"}],"responses":{}}},"/v1/app-configurations/{appId}/versions/{version}":{"get":{"operationId":"getVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"responses":{}},"delete":{"operationId":"deleteVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"responses":{}},"patch":{"operationId":"patchVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/PatchVersionRequest"},"responses":{}}},"/v1/app-configurations/{appId}/versions/{version}/review":{"get":{"operationId":"getReview","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"responses":{}},"post":{"operationId":"createReview","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/CreateReviewRequest"},"responses":{}}},"/v1/app-configurations/{appId}/versions/{version}/components":{"post":{"operationId":"createComponent","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/UpsertComponentRequest"},"responses":{}}},"/v1/app-configurations/{appId}/versions/{version}/components/{componentId}":{"patch":{"operationId":"patchComponent","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true},{"name":"componentId","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/UpsertComponentRequest"},"responses":{}},"delete":{"operationId":"deleteComponent","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true},{"name":"componentId","in":"path","required":true}],"responses":{}}},"/v1/app-configurations/{appId}/versions/{sourceVersion}/clone-to/{targetVersion}":{"post":{"operationId":"cloneVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"sourceVersion","in":"path","required":true},{"name":"targetVersion","in":"path","required":true}],"responses":{}}},"/v1/app":{"get":{"operationId":"listInstallations","parameters":[{"name":"componentType","in":"query"},{"name":"enabled","in":"query"},{"name":"page","in":"query"},{"name":"pageSize","in":"query"}],"responses":{}}},"/v1/app/{appId}":{"get":{"operationId":"getInstallation","parameters":[{"name":"appId","in":"path","required":true}],"responses":{}},"post":{"operationId":"install","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/InstallRequest"},"responses":{}},"patch":{"operationId":"patchInstallation","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/InstallRequest"},"responses":{}},"delete":{"operationId":"uninstall","parameters":[{"name":"appId","in":"path","required":true}],"responses":{}}},"/v1/app/{appId}/promote-to/{version}":{"post":{"operationId":"promoteVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"responses":{}}},"/v1/app-events":{"post":{"operationId":"ingestEvent","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/public/app/{appId}/proxy/{proxyName}/{path}":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the installed app"},{"name":"proxyName","in":"path","required":true,"description":"Name of the proxy target as defined in the app manifest"},{"name":"path","in":"path","required":true,"description":"Path to forward to the proxy target"}],"get":{"operationId":"publicProxyGet","responses":{}},"post":{"operationId":"publicProxyPost","requestBody":{"content":{"application/json":{}}},"responses":{}}}},"components":{"requestBodies":{"CreateReviewRequest":{"required":true,"content":{"application/json":{}}},"CreateLogoPresignedRequest":{"required":true,"content":{"application/json":{}}},"CreateBundlePresignedRequest":{"required":true,"content":{"application/json":{}}},"PatchConfigMetadataRequest":{"required":true,"content":{"application/json":{}}},"PatchVersionRequest":{"required":true,"content":{"application/json":{}}},"UpsertComponentRequest":{"required":true,"content":{"application/json":{}}},"CreateConfigRequest":{"required":true,"content":{"application/json":{}}},"InstallRequest":{"content":{"application/json":{}}}}}}')}},r={},t=function t(n){var p=r[n];if(void 0!==p)return p.exports;var o=r[n]={exports:{}};return e[n].call(o.exports,o,o.exports,t),o.exports}(330),n=exports;for(var p in t)n[p]=t[p];t.__esModule&&Object.defineProperty(n,"__esModule",{value:!0})})();
1
+ (()=>{"use strict";var e={330:function(e,r,t){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});var o=n(t(466));r.default=o.default},466:e=>{e.exports=JSON.parse('{"openapi":"3.1.0","info":{"title":"","version":""},"servers":[{"url":"https://app.sls.epilot.io"}],"paths":{"/v1/public/app/{appId}/components/{componentId}":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the app configuration to install"},{"name":"componentId","in":"path","required":true,"description":"ID of the component to retrieve"}],"get":{"operationId":"getPublicFacingComponent","responses":{}}},"/v1/app-configurations":{"get":{"operationId":"listConfigurations","parameters":[{"name":"page","in":"query"},{"name":"pageSize","in":"query"}],"responses":{}},"post":{"operationId":"createConfiguration","requestBody":{"$ref":"#/components/requestBodies/CreateConfigRequest"},"responses":{}}},"/v1/app-configurations/public":{"get":{"operationId":"listPublicConfigurations","parameters":[{"name":"page","in":"query"},{"name":"pageSize","in":"query"}],"responses":{}}},"/v1/app-configurations/public/{appId}":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the app configuration to install"}],"get":{"operationId":"getPublicConfiguration","parameters":[{"name":"version","in":"query"}],"responses":{}}},"/v1/app-configurations/{appId}":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the app configuration"}],"get":{"operationId":"getConfiguration","parameters":[{"name":"version","in":"query"}],"responses":{}},"patch":{"operationId":"patchMetadata","requestBody":{"$ref":"#/components/requestBodies/PatchConfigMetadataRequest"},"responses":{}},"delete":{"operationId":"deleteConfiguration","responses":{}}},"/v1/app-configurations/{appId}/events":{"post":{"operationId":"queryEvents","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/app-configurations/{appId}/bundle":{"post":{"operationId":"createBundleUploadUrl","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/CreateBundlePresignedRequest"},"responses":{}}},"/v1/app-configurations/{appId}/zip":{"post":{"operationId":"createZipUploadUrl","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v1/app-configurations/{appId}/logo":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the app configuration"}],"post":{"operationId":"createLogoUploadUrl","requestBody":{"$ref":"#/components/requestBodies/CreateLogoPresignedRequest"},"responses":{}},"delete":{"operationId":"deleteLogo","responses":{}}},"/v1/app-configurations/{appId}/versions":{"get":{"operationId":"listVersions","parameters":[{"name":"appId","in":"path","required":true},{"name":"page","in":"query"},{"name":"pageSize","in":"query"}],"responses":{}}},"/v1/app-configurations/{appId}/versions/{version}":{"get":{"operationId":"getVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"responses":{}},"delete":{"operationId":"deleteVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"responses":{}},"patch":{"operationId":"patchVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/PatchVersionRequest"},"responses":{}}},"/v1/app-configurations/{appId}/versions/{version}/review":{"get":{"operationId":"getReview","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"responses":{}},"post":{"operationId":"createReview","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/CreateReviewRequest"},"responses":{}}},"/v1/app-configurations/{appId}/versions/{version}/components":{"post":{"operationId":"createComponent","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/UpsertComponentRequest"},"responses":{}}},"/v1/app-configurations/{appId}/versions/{version}/components/{componentId}":{"patch":{"operationId":"patchComponent","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true},{"name":"componentId","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/UpsertComponentRequest"},"responses":{}},"delete":{"operationId":"deleteComponent","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true},{"name":"componentId","in":"path","required":true}],"responses":{}}},"/v1/app-configurations/{appId}/versions/{sourceVersion}/clone-to/{targetVersion}":{"post":{"operationId":"cloneVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"sourceVersion","in":"path","required":true},{"name":"targetVersion","in":"path","required":true}],"responses":{}}},"/v1/app":{"get":{"operationId":"listInstallations","parameters":[{"name":"componentType","in":"query"},{"name":"enabled","in":"query"},{"name":"page","in":"query"},{"name":"pageSize","in":"query"}],"responses":{}}},"/v1/app/{appId}":{"get":{"operationId":"getInstallation","parameters":[{"name":"appId","in":"path","required":true}],"responses":{}},"post":{"operationId":"install","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/InstallRequest"},"responses":{}},"patch":{"operationId":"patchInstallation","parameters":[{"name":"appId","in":"path","required":true}],"requestBody":{"$ref":"#/components/requestBodies/InstallRequest"},"responses":{}},"delete":{"operationId":"uninstall","parameters":[{"name":"appId","in":"path","required":true}],"responses":{}}},"/v1/app/{appId}/promote-to/{version}":{"post":{"operationId":"promoteVersion","parameters":[{"name":"appId","in":"path","required":true},{"name":"version","in":"path","required":true}],"responses":{}}},"/v1/app-events":{"post":{"operationId":"ingestEvent","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/public/app/{appId}/proxy/{proxyName}/{path}":{"parameters":[{"name":"appId","in":"path","required":true,"description":"ID of the installed app"},{"name":"proxyName","in":"path","required":true,"description":"Name of the proxy target as defined in the app manifest"},{"name":"path","in":"path","required":true,"description":"Path to forward to the proxy target"}],"get":{"operationId":"publicProxyGet","responses":{}},"post":{"operationId":"publicProxyPost","requestBody":{"content":{"application/json":{}}},"responses":{}},"put":{"operationId":"publicProxyPut","requestBody":{"content":{"application/json":{}}},"responses":{}},"patch":{"operationId":"publicProxyPatch","requestBody":{"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"publicProxyDelete","responses":{}}}},"components":{"requestBodies":{"CreateReviewRequest":{"required":true,"content":{"application/json":{}}},"CreateLogoPresignedRequest":{"required":true,"content":{"application/json":{}}},"CreateBundlePresignedRequest":{"required":true,"content":{"application/json":{}}},"PatchConfigMetadataRequest":{"required":true,"content":{"application/json":{}}},"PatchVersionRequest":{"required":true,"content":{"application/json":{}}},"UpsertComponentRequest":{"required":true,"content":{"application/json":{}}},"CreateConfigRequest":{"required":true,"content":{"application/json":{}}},"InstallRequest":{"content":{"application/json":{}}}}}}')}},r={},t=function t(n){var o=r[n];if(void 0!==o)return o.exports;var p=r[n]={exports:{}};return e[n].call(p.exports,p,p.exports,t),p.exports}(330),n=exports;for(var o in t)n[o]=t[o];t.__esModule&&Object.defineProperty(n,"__esModule",{value:!0})})();
@@ -535,6 +535,28 @@
535
535
  }
536
536
  },
537
537
  "responses": {}
538
+ },
539
+ "put": {
540
+ "operationId": "publicProxyPut",
541
+ "requestBody": {
542
+ "content": {
543
+ "application/json": {}
544
+ }
545
+ },
546
+ "responses": {}
547
+ },
548
+ "patch": {
549
+ "operationId": "publicProxyPatch",
550
+ "requestBody": {
551
+ "content": {
552
+ "application/json": {}
553
+ }
554
+ },
555
+ "responses": {}
556
+ },
557
+ "delete": {
558
+ "operationId": "publicProxyDelete",
559
+ "responses": {}
538
560
  }
539
561
  }
540
562
  },
package/dist/openapi.d.ts CHANGED
@@ -151,9 +151,9 @@ declare namespace Components {
151
151
  */
152
152
  name: string; // ^[a-zA-Z0-9_-]+$
153
153
  /**
154
- * Base URL of the target API. Must be HTTPS.
154
+ * Base URL of the target API. Must be HTTPS. May reference component options via {{option_key}} interpolation (resolved from decrypted values), e.g. "https://{{cluster}}.example.com/api" for a per-installation host. The fully-resolved URL is validated at request time (SSRF protection).
155
155
  */
156
- target: string; // uri ^https://
156
+ target: string; // ^https://
157
157
  /**
158
158
  * Authentication strategy
159
159
  */
@@ -166,6 +166,12 @@ declare namespace Components {
166
166
  * OAuth2 token endpoint URL
167
167
  */
168
168
  token_url?: string; // uri ^https://
169
+ /**
170
+ * Additional request headers injected server-side on every proxied request. Values may reference component options via {{option_key}} interpolation (resolved from decrypted secrets), so credentials are never exposed to the client. Applied in addition to auth_type.
171
+ */
172
+ headers?: {
173
+ [name: string]: string;
174
+ };
169
175
  }
170
176
  export interface AppBridgeSurfaceConfig {
171
177
  /**
@@ -1596,7 +1602,11 @@ declare namespace Components {
1596
1602
  *
1597
1603
  */
1598
1604
  PortalExtensionHookVisualizationMetadata | /**
1599
- * Hook that replaces the built-in change email functionality for portal users. When configured, the portal does not change the user's login email itself. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the email change (most likely by sending the user instructions to confirm the new email address).
1605
+ * Hook that replaces the built-in change email functionality for portal users. When configured, the portal does not run its own change email flow. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the email change.
1606
+ * The `change_mode` controls what the portal does after the call:
1607
+ * - `asynchronous`: The third-party system takes the email change over entirely (most likely by sending the user instructions to confirm the new email address). The portal does not change the login email itself.
1608
+ * - `synchronous`: The third-party system applies the email change immediately. The portal waits for a successful (2xx) response and then also changes the portal user's login email right away, without sending a confirmation email. The user has to sign in again with the new email address afterwards.
1609
+ *
1600
1610
  * The expected response http status code to the call is:
1601
1611
  * - 2xx if the request was accepted
1602
1612
  * - non-2xx if the request failed (optionally with a human-readable message resolved via `resolved.error_message_path`)
@@ -1615,6 +1625,8 @@ declare namespace Components {
1615
1625
  * - `synchronous`: The third-party system deletes the user immediately. The portal waits for a successful (2xx) response and then also deletes the corresponding epilot Cognito user.
1616
1626
  * - `asynchronous`: The third-party system handles deletion out-of-band. The portal does not delete anything immediately; cleanup is expected to happen later (e.g. via the user deletion API or webhooks).
1617
1627
  *
1628
+ * The optional `delete_contact` additionally deletes the contact related to the portal user, once the portal user itself was deleted (`synchronous` mode only).
1629
+ *
1618
1630
  * The expected response http status code to the call is:
1619
1631
  * - 2xx if the request was accepted
1620
1632
  * - non-2xx if the request failed (optionally with a human-readable message resolved via `resolved.error_message_path`)
@@ -1651,7 +1663,11 @@ declare namespace Components {
1651
1663
  }[];
1652
1664
  }
1653
1665
  /**
1654
- * Hook that replaces the built-in change email functionality for portal users. When configured, the portal does not change the user's login email itself. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the email change (most likely by sending the user instructions to confirm the new email address).
1666
+ * Hook that replaces the built-in change email functionality for portal users. When configured, the portal does not run its own change email flow. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the email change.
1667
+ * The `change_mode` controls what the portal does after the call:
1668
+ * - `asynchronous`: The third-party system takes the email change over entirely (most likely by sending the user instructions to confirm the new email address). The portal does not change the login email itself.
1669
+ * - `synchronous`: The third-party system applies the email change immediately. The portal waits for a successful (2xx) response and then also changes the portal user's login email right away, without sending a confirmation email. The user has to sign in again with the new email address afterwards.
1670
+ *
1655
1671
  * The expected response http status code to the call is:
1656
1672
  * - 2xx if the request was accepted
1657
1673
  * - non-2xx if the request failed (optionally with a human-readable message resolved via `resolved.error_message_path`)
@@ -1665,7 +1681,12 @@ declare namespace Components {
1665
1681
  name?: TranslatedString;
1666
1682
  type: "changeEmail";
1667
1683
  /**
1668
- * Whether the portal user must confirm their current password before the change email request is handed over to the third-party system. When true, the portal collects and verifies the current password before calling the hook.
1684
+ * Controls how the email change is handled once the third-party system accepted it. `asynchronous` hands the email change over entirely to the third-party system and the portal does not change the login email itself. `synchronous` waits for the third-party system to respond and then changes the portal user's login email immediately, without a confirmation email.
1685
+ *
1686
+ */
1687
+ change_mode?: "synchronous" | "asynchronous";
1688
+ /**
1689
+ * Whether the portal user must confirm their current password before the change email request is handed over to the third-party system. When true, the portal collects and verifies the current password before calling the hook. Treated as true when `change_mode` is `synchronous`, since the portal re-creates the login with the confirmed password. Skipped either way for portal users whose identity is managed by an identity provider: an SSO login has no password to confirm.
1669
1690
  *
1670
1691
  */
1671
1692
  require_password_confirmation?: boolean;
@@ -2111,6 +2132,8 @@ declare namespace Components {
2111
2132
  * - `synchronous`: The third-party system deletes the user immediately. The portal waits for a successful (2xx) response and then also deletes the corresponding epilot Cognito user.
2112
2133
  * - `asynchronous`: The third-party system handles deletion out-of-band. The portal does not delete anything immediately; cleanup is expected to happen later (e.g. via the user deletion API or webhooks).
2113
2134
  *
2135
+ * The optional `delete_contact` additionally deletes the contact related to the portal user, once the portal user itself was deleted (`synchronous` mode only).
2136
+ *
2114
2137
  * The expected response http status code to the call is:
2115
2138
  * - 2xx if the request was accepted
2116
2139
  * - non-2xx if the request failed (optionally with a human-readable message resolved via `resolved.error_message_path`)
@@ -2128,6 +2151,11 @@ declare namespace Components {
2128
2151
  *
2129
2152
  */
2130
2153
  deletion_mode?: "synchronous" | "asynchronous";
2154
+ /**
2155
+ * Opt-in deletion of the contact related to the portal user, applied after the portal user itself was deleted. `none` (default) leaves the contact untouched. `soft` deletes the contact, so it can still be restored from the trash. `hard` permanently purges the contact. Only applied in `synchronous` deletion mode, as `asynchronous` mode hands the cleanup over to the third-party system.
2156
+ *
2157
+ */
2158
+ delete_contact?: "none" | "soft" | "hard";
2131
2159
  /**
2132
2160
  * Optional explanation shown to the user in the delete account confirmation dialog.
2133
2161
  */
@@ -3232,6 +3260,18 @@ declare namespace Paths {
3232
3260
  }
3233
3261
  }
3234
3262
  }
3263
+ namespace PublicProxyDelete {
3264
+ namespace Responses {
3265
+ export interface $200 {
3266
+ }
3267
+ export interface $403 {
3268
+ }
3269
+ export interface $404 {
3270
+ }
3271
+ export interface $502 {
3272
+ }
3273
+ }
3274
+ }
3235
3275
  namespace PublicProxyGet {
3236
3276
  namespace Responses {
3237
3277
  export interface $200 {
@@ -3244,6 +3284,20 @@ declare namespace Paths {
3244
3284
  }
3245
3285
  }
3246
3286
  }
3287
+ namespace PublicProxyPatch {
3288
+ export interface RequestBody {
3289
+ }
3290
+ namespace Responses {
3291
+ export interface $200 {
3292
+ }
3293
+ export interface $403 {
3294
+ }
3295
+ export interface $404 {
3296
+ }
3297
+ export interface $502 {
3298
+ }
3299
+ }
3300
+ }
3247
3301
  namespace PublicProxyPost {
3248
3302
  export interface RequestBody {
3249
3303
  }
@@ -3258,6 +3312,20 @@ declare namespace Paths {
3258
3312
  }
3259
3313
  }
3260
3314
  }
3315
+ namespace PublicProxyPut {
3316
+ export interface RequestBody {
3317
+ }
3318
+ namespace Responses {
3319
+ export interface $200 {
3320
+ }
3321
+ export interface $403 {
3322
+ }
3323
+ export interface $404 {
3324
+ }
3325
+ export interface $502 {
3326
+ }
3327
+ }
3328
+ }
3261
3329
  namespace QueryEvents {
3262
3330
  namespace Parameters {
3263
3331
  export type AppId = string;
@@ -3649,6 +3717,16 @@ export interface OperationMethods {
3649
3717
  data?: any,
3650
3718
  config?: AxiosRequestConfig
3651
3719
  ): OperationResponse<Paths.PublicProxyGet.Responses.$200>
3720
+ /**
3721
+ * publicProxyPut - publicProxyPut
3722
+ *
3723
+ * Forward a PUT request to a registered proxy target from a public-facing component
3724
+ */
3725
+ 'publicProxyPut'(
3726
+ parameters?: Parameters<Paths.V1PublicApp$AppIdProxy$ProxyName$Path.PathParameters> | null,
3727
+ data?: Paths.PublicProxyPut.RequestBody,
3728
+ config?: AxiosRequestConfig
3729
+ ): OperationResponse<Paths.PublicProxyPut.Responses.$200>
3652
3730
  /**
3653
3731
  * publicProxyPost - publicProxyPost
3654
3732
  *
@@ -3659,6 +3737,26 @@ export interface OperationMethods {
3659
3737
  data?: Paths.PublicProxyPost.RequestBody,
3660
3738
  config?: AxiosRequestConfig
3661
3739
  ): OperationResponse<Paths.PublicProxyPost.Responses.$200>
3740
+ /**
3741
+ * publicProxyPatch - publicProxyPatch
3742
+ *
3743
+ * Forward a PATCH request to a registered proxy target from a public-facing component
3744
+ */
3745
+ 'publicProxyPatch'(
3746
+ parameters?: Parameters<Paths.V1PublicApp$AppIdProxy$ProxyName$Path.PathParameters> | null,
3747
+ data?: Paths.PublicProxyPatch.RequestBody,
3748
+ config?: AxiosRequestConfig
3749
+ ): OperationResponse<Paths.PublicProxyPatch.Responses.$200>
3750
+ /**
3751
+ * publicProxyDelete - publicProxyDelete
3752
+ *
3753
+ * Forward a DELETE request to a registered proxy target from a public-facing component
3754
+ */
3755
+ 'publicProxyDelete'(
3756
+ parameters?: Parameters<Paths.V1PublicApp$AppIdProxy$ProxyName$Path.PathParameters> | null,
3757
+ data?: any,
3758
+ config?: AxiosRequestConfig
3759
+ ): OperationResponse<Paths.PublicProxyDelete.Responses.$200>
3662
3760
  }
3663
3761
 
3664
3762
  export interface PathsDictionary {
@@ -4022,6 +4120,36 @@ export interface PathsDictionary {
4022
4120
  data?: Paths.PublicProxyPost.RequestBody,
4023
4121
  config?: AxiosRequestConfig
4024
4122
  ): OperationResponse<Paths.PublicProxyPost.Responses.$200>
4123
+ /**
4124
+ * publicProxyPut - publicProxyPut
4125
+ *
4126
+ * Forward a PUT request to a registered proxy target from a public-facing component
4127
+ */
4128
+ 'put'(
4129
+ parameters?: Parameters<Paths.V1PublicApp$AppIdProxy$ProxyName$Path.PathParameters> | null,
4130
+ data?: Paths.PublicProxyPut.RequestBody,
4131
+ config?: AxiosRequestConfig
4132
+ ): OperationResponse<Paths.PublicProxyPut.Responses.$200>
4133
+ /**
4134
+ * publicProxyPatch - publicProxyPatch
4135
+ *
4136
+ * Forward a PATCH request to a registered proxy target from a public-facing component
4137
+ */
4138
+ 'patch'(
4139
+ parameters?: Parameters<Paths.V1PublicApp$AppIdProxy$ProxyName$Path.PathParameters> | null,
4140
+ data?: Paths.PublicProxyPatch.RequestBody,
4141
+ config?: AxiosRequestConfig
4142
+ ): OperationResponse<Paths.PublicProxyPatch.Responses.$200>
4143
+ /**
4144
+ * publicProxyDelete - publicProxyDelete
4145
+ *
4146
+ * Forward a DELETE request to a registered proxy target from a public-facing component
4147
+ */
4148
+ 'delete'(
4149
+ parameters?: Parameters<Paths.V1PublicApp$AppIdProxy$ProxyName$Path.PathParameters> | null,
4150
+ data?: any,
4151
+ config?: AxiosRequestConfig
4152
+ ): OperationResponse<Paths.PublicProxyDelete.Responses.$200>
4025
4153
  }
4026
4154
  }
4027
4155
 
package/dist/openapi.json CHANGED
@@ -1565,6 +1565,105 @@
1565
1565
  "description": "Bad gateway - proxy target unreachable or error"
1566
1566
  }
1567
1567
  }
1568
+ },
1569
+ "put": {
1570
+ "summary": "publicProxyPut",
1571
+ "operationId": "publicProxyPut",
1572
+ "description": "Forward a PUT request to a registered proxy target from a public-facing component",
1573
+ "tags": [
1574
+ "App Proxy"
1575
+ ],
1576
+ "security": [
1577
+ {
1578
+ "EpilotAuth": []
1579
+ }
1580
+ ],
1581
+ "requestBody": {
1582
+ "content": {
1583
+ "application/json": {
1584
+ "schema": {
1585
+ "type": "object"
1586
+ }
1587
+ }
1588
+ }
1589
+ },
1590
+ "responses": {
1591
+ "200": {
1592
+ "description": "Proxied response from the target API"
1593
+ },
1594
+ "403": {
1595
+ "description": "Forbidden - app not installed or no public component uses this proxy"
1596
+ },
1597
+ "404": {
1598
+ "description": "Proxy target not found"
1599
+ },
1600
+ "502": {
1601
+ "description": "Bad gateway - proxy target unreachable or error"
1602
+ }
1603
+ }
1604
+ },
1605
+ "patch": {
1606
+ "summary": "publicProxyPatch",
1607
+ "operationId": "publicProxyPatch",
1608
+ "description": "Forward a PATCH request to a registered proxy target from a public-facing component",
1609
+ "tags": [
1610
+ "App Proxy"
1611
+ ],
1612
+ "security": [
1613
+ {
1614
+ "EpilotAuth": []
1615
+ }
1616
+ ],
1617
+ "requestBody": {
1618
+ "content": {
1619
+ "application/json": {
1620
+ "schema": {
1621
+ "type": "object"
1622
+ }
1623
+ }
1624
+ }
1625
+ },
1626
+ "responses": {
1627
+ "200": {
1628
+ "description": "Proxied response from the target API"
1629
+ },
1630
+ "403": {
1631
+ "description": "Forbidden - app not installed or no public component uses this proxy"
1632
+ },
1633
+ "404": {
1634
+ "description": "Proxy target not found"
1635
+ },
1636
+ "502": {
1637
+ "description": "Bad gateway - proxy target unreachable or error"
1638
+ }
1639
+ }
1640
+ },
1641
+ "delete": {
1642
+ "summary": "publicProxyDelete",
1643
+ "operationId": "publicProxyDelete",
1644
+ "description": "Forward a DELETE request to a registered proxy target from a public-facing component",
1645
+ "tags": [
1646
+ "App Proxy"
1647
+ ],
1648
+ "security": [
1649
+ {
1650
+ "EpilotAuth": []
1651
+ }
1652
+ ],
1653
+ "responses": {
1654
+ "200": {
1655
+ "description": "Proxied response from the target API"
1656
+ },
1657
+ "403": {
1658
+ "description": "Forbidden - app not installed or no public component uses this proxy"
1659
+ },
1660
+ "404": {
1661
+ "description": "Proxy target not found"
1662
+ },
1663
+ "502": {
1664
+ "description": "Bad gateway - proxy target unreachable or error"
1665
+ }
1666
+ }
1568
1667
  }
1569
1668
  }
1570
1669
  },
@@ -3584,7 +3683,7 @@
3584
3683
  "additionalProperties": false
3585
3684
  },
3586
3685
  "PortalExtensionHookChangeEmail": {
3587
- "description": "Hook that replaces the built-in change email functionality for portal users. When configured, the portal does not change the user's login email itself. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the email change (most likely by sending the user instructions to confirm the new email address).\nThe expected response http status code to the call is:\n - 2xx if the request was accepted\n - non-2xx if the request failed (optionally with a human-readable message resolved via `resolved.error_message_path`)\n",
3686
+ "description": "Hook that replaces the built-in change email functionality for portal users. When configured, the portal does not run its own change email flow. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the email change.\nThe `change_mode` controls what the portal does after the call:\n - `asynchronous`: The third-party system takes the email change over entirely (most likely by sending the user instructions to confirm the new email address). The portal does not change the login email itself.\n - `synchronous`: The third-party system applies the email change immediately. The portal waits for a successful (2xx) response and then also changes the portal user's login email right away, without sending a confirmation email. The user has to sign in again with the new email address afterwards.\n\nThe expected response http status code to the call is:\n - 2xx if the request was accepted\n - non-2xx if the request failed (optionally with a human-readable message resolved via `resolved.error_message_path`)\n",
3588
3687
  "type": "object",
3589
3688
  "properties": {
3590
3689
  "id": {
@@ -3601,9 +3700,18 @@
3601
3700
  "changeEmail"
3602
3701
  ]
3603
3702
  },
3703
+ "change_mode": {
3704
+ "type": "string",
3705
+ "enum": [
3706
+ "synchronous",
3707
+ "asynchronous"
3708
+ ],
3709
+ "description": "Controls how the email change is handled once the third-party system accepted it. `asynchronous` hands the email change over entirely to the third-party system and the portal does not change the login email itself. `synchronous` waits for the third-party system to respond and then changes the portal user's login email immediately, without a confirmation email.\n",
3710
+ "default": "asynchronous"
3711
+ },
3604
3712
  "require_password_confirmation": {
3605
3713
  "type": "boolean",
3606
- "description": "Whether the portal user must confirm their current password before the change email request is handed over to the third-party system. When true, the portal collects and verifies the current password before calling the hook.\n",
3714
+ "description": "Whether the portal user must confirm their current password before the change email request is handed over to the third-party system. When true, the portal collects and verifies the current password before calling the hook. Treated as true when `change_mode` is `synchronous`, since the portal re-creates the login with the confirmed password. Skipped either way for portal users whose identity is managed by an identity provider: an SSO login has no password to confirm.\n",
3607
3715
  "default": true
3608
3716
  },
3609
3717
  "explanation": {
@@ -3794,7 +3902,7 @@
3794
3902
  "additionalProperties": false
3795
3903
  },
3796
3904
  "PortalExtensionHookDeleteAccount": {
3797
- "description": "Hook that replaces the built-in delete account functionality for portal users. When configured, the portal does not delete the user itself. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the deletion.\nThe `deletion_mode` controls what the portal does after the call:\n - `synchronous`: The third-party system deletes the user immediately. The portal waits for a successful (2xx) response and then also deletes the corresponding epilot Cognito user.\n - `asynchronous`: The third-party system handles deletion out-of-band. The portal does not delete anything immediately; cleanup is expected to happen later (e.g. via the user deletion API or webhooks).\n\nThe expected response http status code to the call is:\n - 2xx if the request was accepted\n - non-2xx if the request failed (optionally with a human-readable message resolved via `resolved.error_message_path`)\n",
3905
+ "description": "Hook that replaces the built-in delete account functionality for portal users. When configured, the portal does not delete the user itself. Instead, this hook makes an HTTP call to the third-party system, which is expected to handle the deletion.\nThe `deletion_mode` controls what the portal does after the call:\n - `synchronous`: The third-party system deletes the user immediately. The portal waits for a successful (2xx) response and then also deletes the corresponding epilot Cognito user.\n - `asynchronous`: The third-party system handles deletion out-of-band. The portal does not delete anything immediately; cleanup is expected to happen later (e.g. via the user deletion API or webhooks).\n\nThe optional `delete_contact` additionally deletes the contact related to the portal user, once the portal user itself was deleted (`synchronous` mode only).\n\nThe expected response http status code to the call is:\n - 2xx if the request was accepted\n - non-2xx if the request failed (optionally with a human-readable message resolved via `resolved.error_message_path`)\n",
3798
3906
  "type": "object",
3799
3907
  "properties": {
3800
3908
  "id": {
@@ -3820,6 +3928,16 @@
3820
3928
  "description": "Controls how the account deletion is handled. `synchronous` waits for the third-party system to respond and then also deletes the epilot user. `asynchronous` hands the deletion over entirely to the third-party system and the portal does not delete anything immediately.\n",
3821
3929
  "default": "synchronous"
3822
3930
  },
3931
+ "delete_contact": {
3932
+ "type": "string",
3933
+ "enum": [
3934
+ "none",
3935
+ "soft",
3936
+ "hard"
3937
+ ],
3938
+ "description": "Opt-in deletion of the contact related to the portal user, applied after the portal user itself was deleted. `none` (default) leaves the contact untouched. `soft` deletes the contact, so it can still be restored from the trash. `hard` permanently purges the contact. Only applied in `synchronous` deletion mode, as `asynchronous` mode hands the cleanup over to the third-party system.\n",
3939
+ "default": "none"
3940
+ },
3823
3941
  "explanation": {
3824
3942
  "type": "object",
3825
3943
  "properties": {
@@ -4689,8 +4807,7 @@
4689
4807
  },
4690
4808
  "target": {
4691
4809
  "type": "string",
4692
- "format": "uri",
4693
- "description": "Base URL of the target API. Must be HTTPS.",
4810
+ "description": "Base URL of the target API. Must be HTTPS. May reference component options via {{option_key}} interpolation (resolved from decrypted values), e.g. \"https://{{cluster}}.example.com/api\" for a per-installation host. The fully-resolved URL is validated at request time (SSRF protection).",
4694
4811
  "pattern": "^https://"
4695
4812
  },
4696
4813
  "auth_type": {
@@ -4712,6 +4829,13 @@
4712
4829
  "format": "uri",
4713
4830
  "description": "OAuth2 token endpoint URL",
4714
4831
  "pattern": "^https://"
4832
+ },
4833
+ "headers": {
4834
+ "type": "object",
4835
+ "description": "Additional request headers injected server-side on every proxied request. Values may reference component options via {{option_key}} interpolation (resolved from decrypted secrets), so credentials are never exposed to the client. Applied in addition to auth_type.",
4836
+ "additionalProperties": {
4837
+ "type": "string"
4838
+ }
4715
4839
  }
4716
4840
  }
4717
4841
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/app-client",
3
- "version": "0.13.4",
3
+ "version": "0.13.6",
4
4
  "description": "JavaScript client library for the epilot App API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",