@epilot/cli 0.1.77 → 0.1.78

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/README.md CHANGED
@@ -29,7 +29,7 @@ npm install -g @epilot/cli
29
29
 
30
30
  <!-- usage-help -->
31
31
  ```
32
- epilot v0.1.77 — CLI for epilot APIs
32
+ epilot v0.1.78 — CLI for epilot APIs
33
33
 
34
34
  USAGE
35
35
  epilot <api> <operationId> [params...] [flags]
@@ -4252,7 +4252,7 @@
4252
4252
  },
4253
4253
  "password": {
4254
4254
  "type": "string",
4255
- "description": "Password of the portal user for confirmation.\nRequired unless a `changeEmail` portal extension hook with `require_password_confirmation` disabled is configured for the portal.\n"
4255
+ "description": "Password of the portal user for confirmation.\nRequired unless a `changeEmail` portal extension hook with `require_password_confirmation` disabled is configured for the portal.\nAlso required by a `changeEmail` hook with `change_mode` set to `synchronous`, except for portal users whose identity is managed by an identity provider - an SSO login has no password to confirm.\n"
4256
4256
  }
4257
4257
  }
4258
4258
  }
@@ -4261,7 +4261,7 @@
4261
4261
  },
4262
4262
  "responses": {
4263
4263
  "200": {
4264
- "description": "Portal user email updated successfully and will receive a confirmation email soon.",
4264
+ "description": "Portal user email updated successfully.\nThe user receives a confirmation email, unless a `changeEmail` portal extension hook with\n`change_mode` set to `synchronous` changed the login email right away.\n",
4265
4265
  "content": {
4266
4266
  "application/json": {
4267
4267
  "schema": {
@@ -4269,7 +4269,7 @@
4269
4269
  "properties": {
4270
4270
  "message": {
4271
4271
  "type": "string",
4272
- "description": "`You will receive a confirmation mail soon on your updated email address.` for the built-in flow,\nor `Your email change request has been received.` when a changeEmail portal extension hook handed\nthe change over to a third party.\n",
4272
+ "description": "`You will receive a confirmation mail soon on your updated email address.` for the built-in flow,\n`Your email change request has been received.` when a changeEmail portal extension hook handed\nthe change over to a third party, or `Your email has been changed.` when a synchronous changeEmail\nportal extension hook changed the login email immediately - the portal user has to sign in again\nwith the new email address in that case.\n",
4273
4273
  "example": "You will receive a confirmation mail soon on your updated email address."
4274
4274
  }
4275
4275
  }
@@ -15481,9 +15481,18 @@
15481
15481
  "type": "string",
15482
15482
  "description": "Identifier of the hook."
15483
15483
  },
15484
+ "change_mode": {
15485
+ "type": "string",
15486
+ "enum": [
15487
+ "synchronous",
15488
+ "asynchronous"
15489
+ ],
15490
+ "description": "Whether the third-party system applies the email change immediately (`synchronous`) or takes it over entirely (`asynchronous`).\nIn synchronous mode the login email is changed as soon as the request succeeds and the portal user has to sign in again with the new address.\n",
15491
+ "default": "asynchronous"
15492
+ },
15484
15493
  "require_password_confirmation": {
15485
15494
  "type": "boolean",
15486
- "description": "Whether the portal user must confirm their current password before the email change is handed over to the third-party system.",
15495
+ "description": "Whether the portal user must confirm their current password before the email change is handed over to the third-party system.\nAlso required when `change_mode` is `synchronous`, except for portal users whose identity is managed by an identity provider - an SSO login has no password to confirm.\n",
15487
15496
  "default": true
15488
15497
  },
15489
15498
  "explanation": {
@@ -16803,7 +16812,7 @@
16803
16812
  ]
16804
16813
  },
16805
16814
  "ExtensionHookChangeEmail": {
16806
- "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",
16815
+ "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",
16807
16816
  "type": "object",
16808
16817
  "properties": {
16809
16818
  "type": {
@@ -16812,9 +16821,18 @@
16812
16821
  "changeEmail"
16813
16822
  ]
16814
16823
  },
16824
+ "change_mode": {
16825
+ "type": "string",
16826
+ "enum": [
16827
+ "synchronous",
16828
+ "asynchronous"
16829
+ ],
16830
+ "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",
16831
+ "default": "asynchronous"
16832
+ },
16815
16833
  "require_password_confirmation": {
16816
16834
  "type": "boolean",
16817
- "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",
16835
+ "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",
16818
16836
  "default": true
16819
16837
  },
16820
16838
  "explanation": {
@@ -16989,7 +17007,7 @@
16989
17007
  ]
16990
17008
  },
16991
17009
  "ExtensionHookDeleteAccount": {
16992
- "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 epilot 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",
17010
+ "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 epilot 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",
16993
17011
  "type": "object",
16994
17012
  "properties": {
16995
17013
  "type": {
@@ -17007,6 +17025,16 @@
17007
17025
  "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",
17008
17026
  "default": "synchronous"
17009
17027
  },
17028
+ "delete_contact": {
17029
+ "type": "string",
17030
+ "enum": [
17031
+ "none",
17032
+ "soft",
17033
+ "hard"
17034
+ ],
17035
+ "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",
17036
+ "default": "none"
17037
+ },
17010
17038
  "explanation": {
17011
17039
  "type": "object",
17012
17040
  "properties": {
@@ -17379,7 +17407,7 @@
17379
17407
  "type": "string",
17380
17408
  "example": "office-365-login",
17381
17409
  "description": "URL-friendly slug to use as organization-unique identifier for Provider",
17382
- "pattern": "[0-9a-z-]+"
17410
+ "pattern": "[0-9a-z_-]+"
17383
17411
  },
17384
17412
  "ProviderDisplayName": {
17385
17413
  "type": "string",
@@ -11,7 +11,7 @@ import { defineCommand } from "citty";
11
11
  var main = defineCommand({
12
12
  meta: {
13
13
  name: "epilot",
14
- version: "0.1.77",
14
+ version: "0.1.78",
15
15
  description: "CLI for epilot APIs"
16
16
  },
17
17
  args: {
@@ -31,7 +31,7 @@ var main = defineCommand({
31
31
  profile: () => import("../profile-OZJL5ZPT.js").then((m) => m.default),
32
32
  config: () => import("../config-DGZIMLZK.js").then((m) => m.default),
33
33
  completion: () => import("../completion-FAY7S3QS.js").then((m) => m.default),
34
- upgrade: () => import("../upgrade-OX7DIITI.js").then((m) => m.default),
34
+ upgrade: () => import("../upgrade-33QB7A5M.js").then((m) => m.default),
35
35
  "access-token": () => import("../access-token-WWE6BDJH.js").then((m) => m.default),
36
36
  address: () => import("../address-EH3C4CVB.js").then((m) => m.default),
37
37
  "address-suggestions": () => import("../address-suggestions-RRSLOBFW.js").then((m) => m.default),
@@ -134,7 +134,7 @@ process.stderr.on("error", (err) => {
134
134
  if (err.code === "EPIPE") process.exit(0);
135
135
  throw err;
136
136
  });
137
- var VERSION = true ? "0.1.77" : (await null).default.version;
137
+ var VERSION = true ? "0.1.78" : (await null).default.version;
138
138
  var reorderedArgv = hoistFlagsAfterSubcommand(process.argv.slice(2));
139
139
  process.argv = [process.argv[0], process.argv[1], ...reorderedArgv];
140
140
  var args = process.argv.slice(2);
@@ -72,7 +72,7 @@ ${GREEN}${BOLD}Upgraded to @epilot/cli@${latest}${RESET}
72
72
  }
73
73
  });
74
74
  var getCurrentVersion = () => {
75
- if (true) return "0.1.77";
75
+ if (true) return "0.1.78";
76
76
  try {
77
77
  const output = execSync("npm ls -g @epilot/cli --depth=0 --json 2>/dev/null", {
78
78
  encoding: "utf-8",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/cli",
3
- "version": "0.1.77",
3
+ "version": "0.1.78",
4
4
  "description": "CLI for epilot APIs",
5
5
  "type": "module",
6
6
  "bin": {