@uipath/solution-tool 1.203.0-preview.203 → 1.204.0-preview.206

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.
Files changed (76) hide show
  1. package/README.md +2 -2
  2. package/dist/THIRD-PARTY-NOTICES.md +42 -4
  3. package/dist/deploy-delete-service-y9dwehmn.js +22 -0
  4. package/dist/deploy-status-service-nmhnnjmy.js +256 -0
  5. package/dist/deploy.d.ts +11 -4
  6. package/dist/deploy.js +19 -7
  7. package/dist/deployment-search-eb337bjh.js +49 -0
  8. package/dist/{embedded-file-reader-xxqe8vs8.js → embedded-file-reader-rf2g1kfj.js} +2 -2
  9. package/dist/feed-resolver-dmtnswcc.js +27 -0
  10. package/dist/feed-scope-failure-e2yaqfg2.js +18 -0
  11. package/dist/feed-session-sxga31vn.js +17 -0
  12. package/dist/index.js +27 -18
  13. package/dist/init.js +10 -7
  14. package/dist/{list-n0xd5rgn.js → list-rbjqgz6s.js} +9 -6
  15. package/dist/pack.js +14 -11
  16. package/dist/{packager-tool-vas0xg5h.js → packager-tool-2cntqvdv.js} +5 -3
  17. package/dist/{packager-tool-1haahq17.js → packager-tool-3enm2h28.js} +5 -5
  18. package/dist/{packager-tool-2syrt51a.js → packager-tool-3fv6zc86.js} +1062 -825
  19. package/dist/packager-tool-3fyq6wjs.js +5889 -0
  20. package/dist/{packager-tool-k4mskzww.js → packager-tool-5dzjsw5q.js} +3 -3
  21. package/dist/{packager-tool-0f0wt9vh.js → packager-tool-5fjp60dk.js} +3071 -2794
  22. package/dist/{packager-tool-x6gzyxnn.js → packager-tool-752zvh64.js} +756 -359
  23. package/dist/{packager-tool-bkwnetqn.js → packager-tool-83rzavkx.js} +383 -88
  24. package/dist/{packager-tool-7znqtw3f.js → packager-tool-9vvdgbay.js} +8 -6
  25. package/dist/packager-tool-b8pppqbb.js +172 -0
  26. package/dist/packager-tool-bqre28m1.js +43 -0
  27. package/dist/packager-tool-dh0m3ebf.js +173 -0
  28. package/dist/packager-tool-f5gq77m5.js +28 -0
  29. package/dist/{packager-tool-nzghfa48.js → packager-tool-fv7xyzg2.js} +550 -2
  30. package/dist/{packager-tool-3jrq7smt.js → packager-tool-gb35b4qs.js} +206 -289
  31. package/dist/{packager-tool-j2cqgegq.js → packager-tool-he7ak44z.js} +16 -74
  32. package/dist/packager-tool-myn57mc3.js +322 -0
  33. package/dist/{packager-tool-4rzjjv2p.js → packager-tool-n1nzj2b9.js} +1008 -647
  34. package/dist/packager-tool-n6yb6zp9.js +113 -0
  35. package/dist/{packager-tool-h4wn0y42.js → packager-tool-qgaqqq41.js} +320 -151
  36. package/dist/{packager-tool-resolver-fmjr60x8.js → packager-tool-resolver-2cbxyq6k.js} +6 -5
  37. package/dist/{packager-tool-ge4rvy7p.js → packager-tool-t12hj6pd.js} +1022 -1342
  38. package/dist/{packager-tool-znakt6yw.js → packager-tool-vh4ng74p.js} +8 -6
  39. package/dist/packager-tool-vmsxq1pc.js +104 -0
  40. package/dist/packager-tool-w6jr4638.js +166 -0
  41. package/dist/packager-tool-zf3929se.js +237 -0
  42. package/dist/packager-tool-zns6n8zp.js +837 -0
  43. package/dist/packager-tool-zw3036b8.js +37 -0
  44. package/dist/packager-tool.js +2 -2
  45. package/dist/prepare-solution-resources-p3gzdecy.js +25 -0
  46. package/dist/{project-contributions-cvttys34.js → project-contributions-txe8v6sm.js} +12 -9
  47. package/dist/publish.js +12 -7
  48. package/dist/resource.js +9 -6
  49. package/dist/services/activation.d.ts +17 -2
  50. package/dist/services/deploy-activate-service.d.ts +10 -0
  51. package/dist/services/deploy-delete-service.d.ts +82 -0
  52. package/dist/services/deploy-list-service.d.ts +15 -45
  53. package/dist/services/deploy-run-service.d.ts +36 -23
  54. package/dist/services/deploy-upgrade-service.d.ts +198 -39
  55. package/dist/services/deployment-feed-locator.d.ts +50 -12
  56. package/dist/services/deployment-search-client.d.ts +55 -0
  57. package/dist/services/deployment-search.d.ts +87 -34
  58. package/dist/services/deployment-state.d.ts +119 -0
  59. package/dist/services/feed-resolver.d.ts +31 -0
  60. package/dist/services/feed-session.d.ts +70 -0
  61. package/dist/services/folder-helper.d.ts +4 -27
  62. package/dist/services/http-status.d.ts +9 -0
  63. package/dist/services/incomplete-feed-sweep.d.ts +77 -0
  64. package/dist/services/legacy-deployment-search-v3.d.ts +23 -0
  65. package/dist/services/packages-list-service.d.ts +5 -0
  66. package/dist/services/pipeline-deploy-poll.d.ts +69 -0
  67. package/dist/services/publish-service.d.ts +14 -16
  68. package/dist/services/search-failure.d.ts +27 -0
  69. package/dist/templates/AGENTS.md +60 -20
  70. package/dist/tool.js +27 -18
  71. package/dist/utils/deployment-errors.d.ts +57 -0
  72. package/package.json +2 -2
  73. package/dist/packager-tool-07bqr90h.js +0 -51960
  74. package/dist/packager-tool-jz2wbfjz.js +0 -2275
  75. package/dist/prepare-solution-resources-wds3r8bq.js +0 -22
  76. package/dist/services/personal-workspace-deploy.d.ts +0 -49
@@ -49,7 +49,7 @@ You must manage membership via the CLI, never by editing the manifest. All these
49
49
  | Unregister a project (does not delete the project files on disk) | `uip solution projects remove <project-path> [<solution-file>]` |
50
50
  | List projects in the solution | `uip solution projects list` |
51
51
 
52
- The `uip ...` scaffolders (`agent init`, `maestro flow init`, `maestro bpmn init`, `maestro case init`, `api-workflow init`, `codedapp init`, and `function init` for Python functions only) **auto-register** the new project when run inside a solution directory — they walk up for the enclosing `.uipx` and add it to `Projects[]` automatically, so a separate `project add` is not needed. Pass `--skip-solution-registration` to scaffold standalone without registering; the output's `Data.SolutionRegistration.Status` is then `OptedOut`. The full set of `Status` values is: `Registered` / `AlreadyRegistered` (added in this run / already present), `NotInSolution` (no enclosing `.uipx` found), `OptedOut` (`--skip-solution-registration` passed), `Skipped` (a candidate solution was found but registration was not safe to attempt — e.g. multiple `.uipx` in one directory, or the project sits outside the solution dir), and `Failed` (manifest read/parse/write error).
52
+ The `uip ...` scaffolders (`agent init`, `maestro flow init`, `maestro bpmn init`, `maestro case init`, `api-workflow init`, `codedapp init`, `rules init`, and `function init` for Python functions only) **auto-register** the new project when run inside a solution directory — they walk up for the enclosing `.uipx` and add it to `Projects[]` automatically, so a separate `project add` is not needed. Pass `--skip-solution-registration` to scaffold standalone without registering; the output's `Data.SolutionRegistration.Status` is then `OptedOut`. The full set of `Status` values is: `Registered` / `AlreadyRegistered` (added in this run / already present), `NotInSolution` (no enclosing `.uipx` found), `OptedOut` (`--skip-solution-registration` passed), `Skipped` (a candidate solution was found but registration was not safe to attempt — e.g. multiple `.uipx` in one directory, or the project sits outside the solution dir), and `Failed` (manifest read/parse/write error).
53
53
 
54
54
  ## Project Types
55
55
 
@@ -66,14 +66,14 @@ A solution can contain multiple projects of different types. The table below lis
66
66
  | `AppV2` | Coded App — web application | `uip codedapp init <path>` | `uipath-coded-apps` |
67
67
  | `Function` | UiPath Function (JS / TS / Python) | `uip function new [name]` | `uipath-functions` |
68
68
  | `Api` | API Workflow project | `uip api-workflow init <name>` | `uipath-api-workflow` |
69
- | `BusinessRules` | Business rule — one or more DMN decisions. Ships as a `.uirule`: an archive holding the project's `.dmn` files and the `entry-points.json` that names which decisions a caller may invoke and with what arguments. Not wrapped in a `.nupkg`, and the solution's `businessRule` resource points at it by file name. A project with no `entry-points.json` still ships as a bare `.dmn`, which exposes no arguments. `restore` and `validate` are no-ops for this type. | no CLI scaffolding — authored in Studio Web | none |
69
+ | `BusinessRules` | Business rule — one or more DMN decisions. Ships as a `.uirule`: an archive holding the project's `.dmn` files and the `entry-points.json` that names which decisions a caller may invoke and with what arguments. Not wrapped in a `.nupkg`, and the solution's `businessRule` resource points at it by file name. A project with no `entry-points.json` still ships as a bare `.dmn`, which exposes no arguments. `restore` and `validate` are no-ops for this type. | `uip rules init <name>` | none |
70
70
  | `Entity` | Data Fabric entity project — one folder per project, one `.entity` pointer file per entity; the schema itself lives in `resources/solution_folder/entity/native/<Name>.json`. Emits no package: the entity resources are the deployable payload, so `solution pack` validates the project instead of building it. | no CLI scaffolding — entity projects are modelled in the UiPath VS Code extension. Do not hand-write the `.entity` file or its resource: the pointer and the schema must stay in step, and `solution pack` fails if they do not. | `uipath-platform` (covers `uip df` entities, records and choice sets) |
71
71
  | `Connector` | Integration Service connector | no CLI scaffolding — use `uip is connectors` to list / get / export existing connectors | `uipath-connector-builder` |
72
72
  | `WebApp` | Legacy low-code UiPath App (the coded variant is `AppV2`) | no CLI scaffolding | none |
73
73
 
74
74
  Install the skills with `uip skills install`. The general-purpose `uipath-platform` skill covers what isn't in a type-specific skill, and `uipath-solution` covers the solution lifecycle itself.
75
75
 
76
- `BusinessRules`, `Library` and `Tests` projects declare no solution resources — `uip solution resources refresh` skips them instead of minting anything.
76
+ A `BusinessRules` project gets its `businessRule` resource when it is added to the solution; `Library` and `Tests` projects declare no solution resources. `uip solution resources refresh` skips all three.
77
77
 
78
78
  **`Library` is not a project type here.** A library is a reusable `.nupkg` consumed as a NuGet dependency, so `projects add` / `import` reject it and auto-registration returns `SolutionRegistration.Status: "Skipped"`. Publish it on its own (`uip rpa pack <project-dir> <output-path>`, then `uip or libraries upload --file <nupkg-path>`) and either reference it from a project's dependencies or attach it to this solution as a resource: `uip solution resources add --source remote --kind Library --name <library-name>`.
79
79
 
@@ -96,8 +96,9 @@ Run `uip login` first — most steps below need an authenticated session, includ
96
96
  # 1. Authenticate
97
97
  # Interactive (browser OAuth):
98
98
  uip login
99
- # Non-interactive (CI / CD) with client credentials:
100
- uip login --client-id <ID> --client-secret <SECRET> --tenant <TENANT>
99
+ # Non-interactive (CI / CD) with client credentials — read the values from
100
+ # environment variables so the secret stays out of shell history:
101
+ uip login --client-id env.UIPATH_CLIENT_ID --client-secret env.UIPATH_CLIENT_SECRET --tenant <TENANT>
101
102
 
102
103
  # 1a. (Optional) Restore project dependencies before packing. Resolves NuGet
103
104
  # deps (including authenticated Orchestrator feeds) so pack can compile.
@@ -133,7 +134,7 @@ uip solution deploy run \
133
134
  --config-file config.json
134
135
 
135
136
  # 7. The deploy returns a pipeline deployment ID — track it:
136
- uip solution deploy status <pipeline-deployment-id>
137
+ uip solution deploy status <pipeline-deployment-id> # that run's progress and errors; a deployment name or key gives the record's state instead
137
138
 
138
139
  # 8. List every deployment in the active tenant
139
140
  uip solution deploy list
@@ -141,17 +142,19 @@ uip solution deploy list
141
142
 
142
143
  `deploy run` also takes `--parent-folder-key <key>` in place of `--parent-folder-path`, and `--personal-workspace` to deploy into your Personal Workspace instead of the tenant.
143
144
 
144
- **A Personal Workspace deploy does not wait.** A tenant deploy polls until the install reaches a terminal state and reports `Status: "DeploymentSucceeded"`. `--personal-workspace` goes through a different endpoint that answers as soon as the install is accepted, so it reports `Status: "DeploymentStarted"` plus a `NextSteps` line and returns while the install is still running. Anything you do to that deployment next — `deploy uninstall`, `deploy activate`, an upgrade — is refused with `HTTP 400 … cannot be uninstalled` (or the equivalent) for as long as the operation is in progress.
145
+ **Listing one folder's deployments.** `uip solution deploy list --folder-path <path>` (or `--folder-key <key>`) lists the deployments installed into that folder. The Solutions search does the filtering, so `--limit`, `--offset` and `Pagination.Total` all count matching deployments: page with `--offset <previous Offset + Returned>` while `Pagination.HasMore` is true. The match is on the folder's **full path** (`Shared/Finance`, not `Finance`), exact and not case-sensitive, and deployments in its subfolders are **not** included — list each subfolder with its own call. `FolderPath` is the folder the deployment was installed *into*; a row's `FolderKey` is the deployment's own solution folder one level below it, so passing that key to `--folder-key` matches no deployment — use the key of the `FolderPath` folder instead.
145
146
 
146
- Add `--wait` when the next step needs the deployment settled:
147
+ **Every deploy waits, and validates first.** `deploy run` — tenant, `--personal-workspace` or `--feed` — goes through the Pipelines install, which validates the package against the target *before* it schedules the install, then polls the run to a terminal state and reports `Status: "DeploymentSucceeded"` with `DeploymentKey`, `PipelineDeploymentId` and `InstanceId`. A validation failure ends in `Status: ValidationFailed` with the per-resource errors in `Instructions`, and nothing is installed. `--timeout <seconds>` (default 360) bounds each polling phase; running out exits `2` with `ErrorCode: timeout` and `Retry: RetryLater` — "may still be running", so check `uip solution deploy status <pipeline-deployment-id>` rather than treating it as a failed install. `--wait` is accepted for backwards compatibility and does nothing. Deploying into a Personal Workspace or a folder feed needs a **user session**: under an external app's client-credentials token, `--personal-workspace` is refused before anything is requested and `--feed` is refused once it resolves to a feed other than the tenant feed (`ErrorCode: permission_denied`), because the server ignores the feed header on that token type and the install would otherwise land on the tenant feed under the requested name. A `--feed` that names the tenant feed is fine from CI/CD, as is omitting the flag. Reading a feed is the same: `deploy list` and `deploy status` with `--personal-workspace` or a folder-feed `--feed` refuse an external app (`ErrorCode: permission_denied`) instead of showing the tenant feed's records under that feed's name. A session whose kind cannot be read from its token is refused the same way; `uip login` records an interactive login as a user session.
147
148
 
148
- ```bash
149
- uip solution deploy run ... --personal-workspace --wait --timeout 300
150
- ```
149
+ **Upgrading in place.** `uip solution deploy upgrade <deployment-key>` (the `Key` from `deploy list`) or `uip solution deploy upgrade --name <deployment-name> --package-name <pkg>` moves an existing deployment to another published version of its package (newest by default, or `--version <version>`) and keeps the values already set on it. Both forms work from a CI/CD pipeline signed in as an external app. With a key, the deployment's name, package and feed are read from the server, so no `--package-name` or `--personal-workspace` is needed, and the result also carries `FromVersion` and `InstallDeploymentKey` — the key that stays the same across upgrades, so store that one rather than `DeploymentKey`, which changes with every upgrade. It uses the same Pipelines install, so it validates before it installs: on success it reports `Status: "DeploymentSucceeded"`, `Operation`, `DeploymentStatus`, `Actions`, `ToVersion`, `PipelineDeploymentId` and `DeploymentKey`; on a validation failure it reports the errors and the deployment stays on its current version. `--no-wait` returns `Status: "Accepted"` as soon as the install is queued. An external app can only upgrade tenant-feed deployments: the server ignores the feed header on client-credentials requests, so a Personal Workspace or folder-feed deployment is refused and needs a user session.
150
+
151
+ **Key or name — how the two forms differ.** The key form makes one extra Pipelines call, the deployment lookup, and needs nothing else: it works on any server that has that lookup. On a server without it, a user session reads the key through the Solutions API instead (tenant feed, or your Personal Workspace with `--personal-workspace`; a folder-feed deployment needs the name form) and the result carries no `FromVersion`; an external app gets `ErrorCode: not_found`, and the message points at the name form. The name form needs `--package-name` because the install route is addressed by name and nothing name-keyed in Pipelines reports a deployment's package; with `--version` as well it makes no version lookup. It does check the name exists first (the same route would otherwise treat an unknown name as a fresh install and create a deployment), so a typo fails with `ErrorCode: not_found` instead of deploying. A name whose deployment was *uninstalled* is caught the same way — the CLI checks the deployment search, which an external app can read only on servers that serve the Pipelines search — so from CI/CD on an older server address such a deployment by key, which reads its status. Find the key, the name and the package with `uip solution deploy list`.
152
+
153
+ **`Operation` tells you what actually happened.** The endpoint is unified, so asking for the version already deployed is a *configuration change*, not a version move. `Operation: "VersionChange"` means the version moved; `"ConfigurationChange"` means it did not. Check it rather than assuming `DeploymentSucceeded` implies a new version. `DeploymentStatus` says whether the new version runs: `SuccessfulActivate` means it does; `SuccessfulInstall` with `SetupActivation` in `Actions` means it is installed but the previous version keeps running until activation is set up (`uip solution deploy activate`, or Setup activation in Orchestrator).
151
154
 
152
- With `--wait` the command polls the deployment to a terminal state inside `--timeout`, reports `Status: "DeploymentSucceeded"` and drops `NextSteps` (there is nothing left to check). A terminal failure exits `1` as `Deployment '<name>' failed (OperationStatus: Failed): <reason>`, where the reason is the server's validation result (`the server reported no reason.` when it gives none). Still running when the timeout expires exits `2` with `ErrorCode: timeout` and `Retry: RetryLater` — "may still be running", so retry or check `deploy list` rather than treating it as a failed install. Without `--wait` nothing changes, so poll `uip solution deploy list` yourself if you skip it.
155
+ **A rejected attempt leaves a pending draft.** When a `deploy run` or `deploy upgrade` stops at `ValidationFailed` (or a conflict or scheduling error), nothing is installed and the live version keeps running, but the attempt stays behind as a *draft* — its key is the `deploymentKey` in the failure's `Instructions`. While the draft exists it owns the deployment, as in the Orchestrator UI (which offers only "continue editing" and "delete draft"): re-running the same `deploy run` with a corrected `--config-file` and the **draft's** version re-validates it with the new file (settings and resource links the file does not name keep the rejected values). Any other version is refused before anything is sent (`ErrorCode: invalid_argument`) — including the version that is live now, which the server would otherwise answer by installing the draft's version instead. Under an external app that check only warns and the deploy goes ahead — and the server then runs the draft, installing the draft's version — so from CI/CD ask only for the draft's version, or discard the draft first. `deploy upgrade` sends no configuration, so it refuses a deployment with a pending draft (`ErrorCode: invalid_argument`, naming the draft's key and version) rather than re-run the rejected attempt; once the cause is fixed, `uip solution deploy upgrade <draft-or-deployment-key> --discard-draft` deletes the draft and upgrades the live version with its own configuration, and reports the deleted key as `DiscardedDraftKey`. Address the deployment by key for this from CI/CD — on an older server the name form can only find the draft with a user session. A draft still being validated cannot be discarded yet (`Retry: RetryLater`). A Setup activation started in Orchestrator and left unfinished is a draft too, of the live version: both commands refuse while it exists and name it as such — finish it in Orchestrator, or discard it the same way. A deployment whose *first* install never completed has nothing to upgrade: fix and re-run its `deploy run`, or delete the draft in Orchestrator.
153
156
 
154
- **One deployment per package.** `deploy run` always creates a *new* deployment in a *new* Orchestrator folder — it never updates an existing one, and it cannot deploy into a folder that already exists (Orchestrator renames the folder instead, `MySolution` -> `MySolution 1`). So if the package is already deployed, the command stops and lists the existing deployments rather than quietly adding another folder. That check is best-effort, not a guarantee: it reads the Solutions search, which needs a user session, so a CI job signed in with an application (client-credentials) account deploys without it, and a failed lookup only logs a warning. In automation, track what you have already deployed instead of relying on the stop. To ship a new version, upgrade the existing deployment in place with `uip solution deploy upgrade <deployment-key>`; to start over, `deploy uninstall` first. Pass `--yes` only when you really do want a second, independent copy. While you are still iterating, validate locally (`solution pack --dry-run`) instead of deploying each attempt.
157
+ **One deployment per package.** `deploy run` always creates a *new* deployment in a *new* Orchestrator folder — it never updates an existing one, and it cannot deploy into a folder that already exists (Orchestrator renames the folder instead, `MySolution` -> `MySolution 1`). So if the package is already deployed, the command stops and lists the existing deployments rather than quietly adding another folder. That check is best-effort, not a guarantee: a failed lookup only logs a warning, and a CI job signed in with an application (client-credentials) account is never stopped by it — an existing deployment is reported as a warning and the deploy goes ahead (on servers without the Pipelines deployment search the check is skipped, with a warning). In automation, track what you have already deployed instead of relying on the stop. To ship a new version, upgrade the existing deployment in place with `uip solution deploy upgrade <deployment-key>`; to start over, `deploy uninstall`, then `deploy delete` to clear the record it leaves in `deploy list` (that record does not block a redeploy — `blocksRedeploy` lets an uninstalled deployment through — so the delete is housekeeping, not a prerequisite). Pass `--yes` only when you really do want a second, independent copy, and give it a different `--name`: the install is keyed on the deployment name, so re-using an existing one updates that deployment in place instead. While you are still iterating, validate locally (`solution pack --dry-run`) instead of deploying each attempt.
155
158
 
156
159
  **Activation lifecycle.** `deploy run` activates by default. To split the steps:
157
160
 
@@ -159,14 +162,33 @@ With `--wait` the command polls the deployment to a terminal state inside `--tim
159
162
  uip solution deploy run --skip-activate ... # leaves "Inactive (Ready to activate)"
160
163
  uip solution deploy activate <deployment-name> # activate later
161
164
  uip solution deploy uninstall <deployment-name> --yes # remove the deployment + its resources (--yes required; the CLI never prompts)
165
+ uip solution deploy delete <deployment-name> --yes # remove what uninstall leaves behind (--yes required)
162
166
  ```
163
167
 
164
- `uninstall` and `activate` take the deployment name as a **positional** argument (no `--name` flag). `status` takes the **pipeline deployment ID** (the GUID returned by `deploy run`), also positional.
168
+ `deploy run` reports `ActivationStatus: SuccessfulActivate` when the deployment runs. When the install landed but a resource needs "Setup activation" in Orchestrator first, it is still `Result: Success`, with `ActivationStatus: NeedsSetupToActivate`, `PendingResources` and `NextSteps` — the deployment exists, so do **not** run the deploy again; complete the setup, then `deploy activate`. `ReadyToActivate` in the same place means the install landed and the command could not activate it: run `deploy activate`.
169
+
170
+ `uninstall`, `delete`, `activate` and `status` take the deployment **name** as a positional argument (no `--name` flag). `status` also accepts a **deployment key** (from `deploy list` or `deploy upgrade` — the form that diagnoses a stale key) or the **pipeline deployment ID** from `deploy run` (that run's progress and errors, `Code: SolutionDeployStatus`); by name or key it answers `Code: SolutionDeployment` and reports the record's `Operation`, `OperationStatus`, `ActivationStatus`, `Actions`, and `NextSteps` when it is not live. A name is found across feeds; a key outside the tenant feed needs `--personal-workspace` or `--feed <name-or-key>`, as with `deploy list`. `Superseded: null` means the CLI could not tell — the chain search failed or holds no row for the key — and the fields are the requested record's own; take the current key from `deploy list`.
171
+
172
+ **Two status axes.** `OperationStatus: Successful` means the last operation's content landed. `ActivationStatus: Active` means the deployment runs. An upgrade can land `Successful` *and* `NeedsSetupToActivate`: the new version is installed but does not run until "Setup activation" is completed in Orchestrator (Tenant > Solutions > Deployments); the previous version keeps running meanwhile. The UI words the same states differently: `NeedsSetupToActivate` shows as **Inactive (Needs setup)**, `Operation: VersionChange` as **Change version**, `Operation: ActivationSetup` as **Activation setup** — and the UI lists every record of a deployment, where `deploy list` shows only the newest. `deploy upgrade` reports both axes; when not `Active` it adds `PendingResources` (the resources the service flags as needing configuration — Integration Service connections, typically — each with the `Reason` the activation validation gives, such as a connection that needs authenticating) and `NextSteps`. "Setup activation" has no CLI command **on an existing deployment**: `deploy config link` maps a resource to an existing one only in the config file a new `deploy run` consumes, `deploy upgrade` takes no config file, and the `resource`/`resources` verbs edit the solution project, not a deployment. `deploy activate` is refused (`4007 … cannot be activated`) until the setup is done in Orchestrator.
173
+
174
+ **A key is one record, not the deployment.** Every operation creates a new deployment record with its own key: `deploy run` the Install record, `deploy upgrade` a VersionChange one (`DeploymentKey` in its output; `InstallDeploymentKey` is the one that never changes). `deploy list` shows the newest per deployment. A key from before an upgrade is *superseded*: the Solutions record still answers as it was — old version, `Active`, `Upgrade` offered — but `deploy upgrade <key>` resolves it to the deployment's current generation through the Pipelines lookup and upgrades that, and `deploy status <key>` reports `Superseded: true` with `CurrentDeploymentKey`. Store `InstallDeploymentKey`, or take the current key from `deploy list`.
175
+
176
+ **`uninstall` and `delete` are never both available.** The service offers one action per state, and `deploy list` tells you which:
177
+
178
+ | Deployment state | `Actions` | What removes it |
179
+ |---|---|---|
180
+ | Installed | `SetupActivation, Uninstall, Upgrade` | `deploy uninstall` |
181
+ | Uninstalled | `Delete` | `deploy delete` |
182
+ | Never installed (`Draft`, e.g. a failed install) | `Install, Delete` | `deploy delete` |
183
+
184
+ So a full clean-up of a live deployment is two commands: `uninstall` removes its resources and folder, `delete` then removes the deployment itself. `delete` reads the action list first, and when the record lists actions but not `Delete` it says so and names the command to run instead — it never sends a request the state forbids. A record that lists **no** actions is the exception: nothing is known about it, so the request goes out and the server answers.
165
185
 
166
186
  `uninstall` waits out an operation that blocks it: when Orchestrator refuses because the deployment still has something running, the CLI polls until that finishes and then sends the request again, all inside `--timeout` (which covers the whole command, the status poll included). If it is still busy when the timeout expires you get exit `2` with `ErrorCode: timeout` and `Retry: RetryLater` — retry later, do not treat it as permanent. A refusal for any other reason (superseded, inactive, unknown name) still fails immediately with exit `1`.
167
187
 
168
188
  Neither `uninstall` nor `activate` takes a feed flag, and neither needs one: they find the deployment themselves — tenant feed first, then your Personal Workspace, then the folder feeds you can reach — and scope their requests to whatever feed holds it. So the `deploy activate <name>` that `--skip-activate` points you at works the same on a `--personal-workspace` or `--feed` deployment as on a tenant one. The cost is one extra lookup per call, and a name that exists in no feed you can see is reported as not found rather than as a blocked uninstall.
169
189
 
190
+ `deploy delete` and `deploy status <name>` (without a feed flag) find a name the same way. All four say "not found" only when every feed answered — with one exception: under an external-app login, `deploy status <guid>` for a GUID that is no deployment key still says "not found" when only the feeds after the tenant could not be searched, or when the tenant search refused the login (401/403), because an app login cannot read those feeds at all. When a feed cannot be searched — the feed service is down or refuses the session, the list of feeds cannot be read or gives a feed no key, or the tenant search itself fails — and no other feed has the name, they fail with a message that names the feeds they could not search instead of calling the name unknown. `ErrorCode` then comes from that failure (`server_error`, `network_error`, `authentication_required`, `permission_denied`, …, or `unknown_error` when it has no known class) and is never `not_found`; `Retry` follows it — `RetryLater` for an outage, `RetryWillNotFix` for a 401 or 403, and also `RetryWillNotFix` when every feed that could not be searched is one the list gives no key, since a retry gets the same list. Do not treat the name as wrong: do what `Instructions` say (log in again, fix the session's access, or retry later). To check one feed yourself, pass `--personal-workspace` or `--feed <name-or-key>` to `deploy status` or `deploy list` — but `--feed` is resolved through the same list of feeds, so when that list is what failed only `--personal-workspace` helps, and `--feed` cannot pick a feed the list gives no key. When the tenant feed refuses an `activate` or `uninstall` for its own reason (401, 403, 409, 422, 429, a 5xx), that failure is reported as it is.
191
+
170
192
  ## Dependency Feeds
171
193
 
172
194
  Packing an RPA project restores its NuGet dependencies first, so `pack` and `restore` both need to know which feeds to resolve against. So does `cleanup`: deciding that a dependency is *unused* means resolving the dependency graph, so it reads the same feeds. All three take the same three options.
@@ -209,13 +231,13 @@ The analyzer rule configuration comes from whichever governance flag you use. `-
209
231
 
210
232
  Whenever you are signed in, the tenant is asked first — including when you pass `--governance-file-path`. There are three possible answers and each does something different:
211
233
 
212
- - **The tenant publishes a policy.** That policy is what the analyzer uses. A `--governance-file-path` passed alongside it is refused with exit `1`, naming the file and the product whose policy applies — a flag in your own pipeline does not lift the organisation's policy.
234
+ - **The tenant publishes a policy.** That policy is what the analyzer uses, whatever else you passed. A `--governance-file-path` alongside it is not used; you get a warning and the pack carries on — a flag in your own pipeline does not lift the organisation's policy.
213
235
  - **The tenant publishes nothing.** The analyzer uses your `--governance-file-path` if you passed one, otherwise the rules shipped with the WorkflowCompiler.
214
- - **The question could not be answered** (expired token, no route, the service is down). The pack still succeeds and nothing fails: you get a warning naming the reason (`unauthorized`, `notFound`, `serverError`, `timedOut`, …), and the analyzer uses your `--governance-file-path` if you passed one, otherwise the shipped rules. Not knowing whether you are governed is not a reason to break a build.
236
+ - **The question could not be answered** (expired token, no route, the service is down). The pack still succeeds and nothing fails: you get a warning naming the reason (`unauthorized`, `notFound`, `serverError`, `timedOut`, …), shown only at `--log-level warn` or lower (see below), and the analyzer uses your `--governance-file-path` if you passed one, otherwise the shipped rules. Not knowing whether you are governed is not a reason to break a build.
215
237
 
216
238
  With no signed-in tenant there is nothing to ask, so a `--governance-file-path` is simply used and an offline pack keeps working.
217
239
 
218
- Note what this means for CI: a pack that could not reach AutomationOps still returns `Result: Success` and exit `0`, so a stage using `--governance-product` as a governance gate goes green while having enforced the shipped defaults. The warning in the log is what tells you which happened — `uip solution pack` reports on governance, it does not enforce it. Strict, fail-closed behaviour belongs to design-time hosts, not to this command.
240
+ Note what this means for CI: a pack that could not reach AutomationOps still returns `Result: Success` and exit `0`, so a stage using `--governance-product` as a governance gate goes green while having enforced the shipped defaults. The warning in the log is what tells you which happened — `uip solution pack` reports on governance, it does not enforce it. That warning is a `warn`-level log line, and the default `--log-level` is `error`, which hides it. A stage that needs to know passes `--log-level warn` and reads stderr. To read it from a file instead, pass `--log-file <path>` together with `--log-level warn`: the level filter runs before a line is sent to the file, so `--log-file` alone still drops the warning. Strict, fail-closed behaviour belongs to design-time hosts, not to this command.
219
241
 
220
242
  ## Dependency Feeds
221
243
 
@@ -349,9 +371,14 @@ A resource is either **virtual** — declared locally now, provisioned when the
349
371
 
350
372
  ```bash
351
373
  uip solution resources add --source local --kind Queue --name InvoiceQueue
374
+ uip solution resources add --source local --kind Asset --type Credential --name ApiLogin
352
375
  uip solution resources add --source remote --kind Process --name Existing --folder-path Shared
353
376
  ```
354
377
 
378
+ `--type` picks the subtype for kinds that have one. For assets it takes the Orchestrator name (`Text`, `Integer`, `Bool`, `Credential`, `Secret`) or the solution name (`stringAsset`, `integerAsset`, `booleanAsset`, `credentialAsset`, `secretAsset`), case-insensitive. A subtype the kind does not have fails with `ErrorCode: invalid_argument`, and `Instructions` lists the valid ones. A kind with no subtypes (a queue) refuses `--type`; a connection's connector type passes through. An empty `--type ""` is refused for every kind; leave the option out instead. With `--source local`, adding a name that already exists with a different `--type` fails instead of returning the existing one. With `--source remote`, `--type` must match the resource's own type: it narrows same-name matches and never changes what gets imported.
379
+
380
+ `--name` is checked before anything is written, because a local resource becomes a file under `resources/solution_folder/<kind>/<name>.json`: a blank or whitespace-only name, a name over 256 characters, or one containing path separators, control characters or any of `: * ? " < > |` fails with `Result: Failure` and a `Message` that names the option (`--name must not be blank`, `--name contains unsafe characters`). `uip agent memory add` runs the same check on `--memory-space` when it declares a memory space in the solution.
381
+
355
382
  **Not every kind can be virtual.** Queues, assets and buckets can — the solution creates them on deploy. Kinds that must already exist somewhere (processes, connections, apps, indexes, entities) cannot be conjured from a local declaration; they need `--source remote`, or a `deploy config link` onto an existing resource at deploy time.
356
383
 
357
384
  `--source local` does **not** enforce that. It succeeds for any kind, prints `Result: Success`, and writes a stub — the check that would catch it is not on this code path. The failure surfaces later, at deploy. Two ways to catch it early:
@@ -368,8 +395,11 @@ uip solution resources list # everything declared in this solution
368
395
  uip solution resources list --source remote --kind app --include-version
369
396
  # classic Apps in Orchestrator, with the version deployed per folder
370
397
  uip solution resources list --search <term> # filter by name
398
+ uip solution resources list --limit 20 --next-page <cursor> # the 20 rows after the previous page
371
399
  ```
372
400
 
401
+ A listing returns at most 50 rows unless you pass `--limit`. Check `Pagination.HasMore` before treating the rows as complete. The resource catalog pages by cursor, so `--offset` accepts only `0`: to get the next page, pass the previous response's `Pagination.NextPage` to `--next-page` with the same filters. If the catalog call fails, the command fails; use `--source local` to list only the solution's own resources.
402
+
373
403
  `--include-version` reads the live `version` of the kinds that carry one (`app`,
374
404
  `appVersion`, `package`, `process`). It costs one extra call per resource, so it
375
405
  is off by default.
@@ -477,10 +507,13 @@ uip or assets create # create an asset (see --help)
477
507
 
478
508
  ## Output Conventions for Agents
479
509
 
480
- Two rules make automation reliable:
510
+ Three rules make automation reliable:
481
511
 
482
512
  1. **Never redirect or drop stderr.** Errors and confirmations go to stderr — `2>/dev/null` will silently hide failures and produce false retries.
483
- 2. **Use `--output-filter <jmespath>`** to extract specific fields rather than piping JSON through external tools. The expression is applied to the `Data` array — start with `[]`, not with `Data[]`. On list commands with a default `--limit`, an explicit `--limit` is required with `--output-filter` (the filter only sees the records fetched). Example: `uip solution packages list --limit 100 --output-filter "[].name"`.
513
+ 2. **Use `--output-filter <jmespath>`** to extract specific fields rather than piping JSON through external tools. The expression is applied to the `Data` array — start with `[]`, not with `Data[]`. On list commands with a default `--limit`, an explicit `--limit` is required with `--output-filter` (the filter only sees the records fetched). Example: `uip solution packages list --limit 100 --output-filter "[].Name"`.
514
+ 3. **Match the key casing of the unfiltered output.** Filter keys are case-sensitive and most commands print `Data` keys in PascalCase, so write `[].Name`, not `[].name` — the wrong casing matches nothing and returns `Data: []`. A few commands pass their keys through verbatim (`uip maestro flow registry get` is one, where `Node.inputDefinition.fields` is correct). If you are unsure, run the command once without `--output-filter` and read the keys off the output.
515
+
516
+ A filter that selects nothing still returns `Result: "Success"` with `Data: []` and exit 0 — that is a valid empty answer, not a failure. Check the `Warning` field and stderr. They say which it was: a field name that does not exist (fix the expression), no record matched or the expression resolved to no value (the answer really is empty), or a name that reads below the top level (`Items[].Name` reads `Name` off an `Items` entry, so only `Items` was checked — an empty `Items` is the usual cause, not a bad name).
484
517
 
485
518
  Standard success shape: `{ "Result": "Success", "Code": "<CommandCode>", "Data": ... }`.
486
519
  Standard failure shape: `{ "Result": "Failure", "Message": "<short>", "Instructions": "<actionable>" }`.
@@ -524,10 +557,17 @@ Adjacent groups commonly used alongside solutions:
524
557
  |---|---|
525
558
  | `Not authenticated` / 401 | `uip login`, then re-run |
526
559
  | `upload` fails with 401/403 and `ErrorCode: permission_denied` | Not a login problem — the token was valid when the call went out, so `uip login` mints the same one. Read `Instructions`: for a session on an external application, check that the app has the Studio Web (`StudioWebS2S`) grants, not only the Orchestrator and Solutions ones; for a user, check Studio Web access in the tenant. Then confirm the `SolutionId` in the `.uipx` belongs to the tenant you are logged into — one from another tenant is refused, not reported missing |
560
+ | `packages list` or `deploy list` fails with `ErrorCode: permission_denied` from a CI/CD pipeline | `packages list` reads the Solutions search, which accepts user sessions only, so an external app's client-credentials token is refused (the message says so). `deploy list` reads the deployment search, which accepts an external app on servers that serve `POST /v1/pipelines/deployments/search`; it is refused only on an older server, or with `--personal-workspace` or a folder `--feed`, whose feed the server ignores for an app. `uip login` with the same app mints the same kind of token; run the listing under a user session. The same goes for `--personal-workspace` on any command: an external app has no Personal Workspace. |
527
561
  | Command targets the wrong tenant | `uip login tenant set <tenant>`; verify with `uip login status` |
528
562
  | Pack succeeds but publish 409s | Version conflict — bump the version (`uip solution pack . ./out -v <new-version>`) or delete the colliding version with `uip solution packages delete <package-name> <version> --yes` (only if intentional; `--yes` required) |
529
- | `deploy run` stops because the package is already deployed | Upgrade it in place with `uip solution deploy upgrade <deployment-key>` (running `deploy run` again does not upgrade it), or `uip solution deploy uninstall <name> --yes` first, or pass `--yes` to create a second, separate deployment |
563
+ | `deploy run` stops because the package is already deployed | Upgrade it in place with `uip solution deploy upgrade <deployment-key>` (running `deploy run` again does not upgrade it), or `uip solution deploy uninstall <name> --yes` then `uip solution deploy delete <name> --yes` first, or pass `--yes` with a different `--name` to create a second, separate deployment (re-using the name updates the existing one in place) |
564
+ | `HTTP 400 … cannot be uninstalled` (error `4007`) | The deployment is not uninstallable in its state — superseded, already uninstalled, or left by a failed install. Read `Instructions`: when its `Actions` list offers `Delete`, remove the record with `uip solution deploy delete <name> --yes`. An operation still running is the other cause, and that one clears by itself (`Retry: RetryLater`) |
565
+ | `deploy upgrade` reported `Status: DeploymentSucceeded` but the old version still runs | Read `DeploymentStatus` and `ActivationStatus` in the same output. `SuccessfulInstall` / `NeedsSetupToActivate` means the new version is installed and waits for "Setup activation" in Orchestrator; `PendingResources` names what needs configuring and why (`Reason`, from the activation validation, e.g. `[CNS1072] You will need to authenticate this connection before proceeding further`) and `NextSteps` the step. `ReadyToActivate` means `uip solution deploy activate <name>` is all that is left. Do not run the upgrade again — the content is already there |
566
+ | `Another upgrade has already started for this deployment` (error `4005`) | The key you passed is superseded by a later record; nothing is running. The CLI names the current record — use that key (`uip solution deploy list` shows it). If the current record is already at the version you want, there is nothing to upgrade |
567
+ | `deploy run` succeeded with `ActivationStatus: NeedsSetupToActivate` and the deployment does not run | Expected: the install landed, and a resource needs "Setup activation" in Orchestrator before activation. `PendingResources` names what needs configuring and why (`Reason`, from the activation validation, e.g. `[CNS1072] You will need to authenticate this connection before proceeding further`) and `NextSteps` the step. `Status` may read `ValidationFailed` there: that is the pipeline's word for the activation validation it ran after the install, and `NextSteps` open with its errors. Do not deploy again (the deployment exists); complete the setup, then `uip solution deploy activate <name>` |
568
+ | `deploy activate` refused with `cannot be activated` (error `4007`) on an installed deployment | The deployment needs "Setup activation" first (`ActivationStatus: NeedsSetupToActivate`); `Instructions` list the resources that need configuration. Complete the setup in Orchestrator, then activate. `deploy status <key>` shows the same state |
530
569
  | `deploy run` fails on a resource conflict | `uip solution deploy config link config.json <resource> --name <existing> --folder-path <path>` to map to the existing one, or change `conflictFixingAction` via `config set` |
570
+ | The deployment is stuck in `Draft` and `deploy activate` won't take it | Read `Operation` first. `ActivationSetup` + `Draft` is a "Setup activation" someone started in Orchestrator and did not finish — complete it there (the UI lists it as `Activation setup · Draft`); `deploy status <key>` names the resources it waits for. To discard it instead, `uip solution deploy delete <name> --yes` removes the draft alone and the deployment returns to its previous record (still needing setup). `VersionChange` + `Draft` is an upgrade queued and never installed. An `Install` `Draft` is a deploy whose install never completed — validation rejected something. It never advances on its own (a deployment passes through `Draft` for a moment right after you fire the command, but not once the command has returned). The reasons are in the failure's `Instructions` (`Validation:` / `Conflicts:`) on every feed, next to the draft's key; fix them with `uip solution deploy config set` / `deploy config link`, then run your original `uip solution deploy run …` again with `--config-file config.json` added and the **same** `--name` and `--package-version` — it still needs `--package-name` and `--folder-name`. A `Draft` left by an install does not block that rerun; one left by an update of a live deployment needs `--yes`, because the package is already deployed. While a draft exists any other version is refused, `deploy upgrade` included — to drop it instead, run `uip solution deploy upgrade <draft-key> --discard-draft`, or Delete draft in Orchestrator. To look at it, `uip solution deploy list` needs the same `--personal-workspace` / `--feed <name-or-key>` flag the deploy used — plain `deploy list` is tenant-scoped and shows no row for those deployments at all |
531
571
  | `Resource not found` after deploy | `uip solution resources refresh` to re-sync from each project's `bindings_v2.json`; if still missing, the resource was never declared in any project |
532
572
  | A cloud change (new entity field, changed queue setting) never reaches the solution | Expected: `refresh` is import-only and reports the resource under `Skipped`. Pull it with `uip solution resources edit <resource-key> --source remote --force` |
533
573
  | Output looks empty | You may have redirected stderr — confirmations and errors go there. Re-run without `2>` |
package/dist/tool.js CHANGED
@@ -1,25 +1,34 @@
1
1
  import {
2
2
  metadata,
3
3
  registerCommands
4
- } from "./packager-tool-x6gzyxnn.js";
5
- import"./packager-tool-1haahq17.js";
6
- import"./packager-tool-4rzjjv2p.js";
7
- import"./packager-tool-vas0xg5h.js";
8
- import"./packager-tool-07bqr90h.js";
9
- import"./packager-tool-7znqtw3f.js";
10
- import"./packager-tool-znakt6yw.js";
11
- import"./packager-tool-k4mskzww.js";
12
- import"./packager-tool-jz2wbfjz.js";
13
- import"./packager-tool-j2cqgegq.js";
14
- import"./packager-tool-h4wn0y42.js";
15
- import"./packager-tool-ge4rvy7p.js";
16
- import"./packager-tool-bkwnetqn.js";
4
+ } from "./packager-tool-752zvh64.js";
5
+ import"./packager-tool-3enm2h28.js";
6
+ import"./packager-tool-zw3036b8.js";
7
+ import"./packager-tool-n1nzj2b9.js";
8
+ import"./packager-tool-w6jr4638.js";
9
+ import"./packager-tool-b8pppqbb.js";
10
+ import"./packager-tool-myn57mc3.js";
11
+ import"./packager-tool-2cntqvdv.js";
12
+ import"./packager-tool-3fyq6wjs.js";
13
+ import"./packager-tool-9vvdgbay.js";
14
+ import"./packager-tool-vh4ng74p.js";
15
+ import"./packager-tool-5dzjsw5q.js";
16
+ import"./packager-tool-zns6n8zp.js";
17
+ import"./packager-tool-he7ak44z.js";
18
+ import"./packager-tool-qgaqqq41.js";
19
+ import"./packager-tool-dh0m3ebf.js";
20
+ import"./packager-tool-t12hj6pd.js";
21
+ import"./packager-tool-bqre28m1.js";
22
+ import"./packager-tool-83rzavkx.js";
17
23
  import"./packager-tool-gdtpsdn7.js";
18
24
  import"./packager-tool-53w8skv5.js";
19
- import"./packager-tool-nzghfa48.js";
20
- import"./packager-tool-2syrt51a.js";
21
- import"./packager-tool-3jrq7smt.js";
22
- import"./packager-tool-0f0wt9vh.js";
25
+ import"./packager-tool-fv7xyzg2.js";
26
+ import"./packager-tool-f5gq77m5.js";
27
+ import"./packager-tool-3fv6zc86.js";
28
+ import"./packager-tool-vmsxq1pc.js";
29
+ import"./packager-tool-5fjp60dk.js";
30
+ import"./packager-tool-gb35b4qs.js";
31
+ import"./packager-tool-zf3929se.js";
23
32
  import"./packager-tool-dfrk01gn.js";
24
33
  import"./packager-tool-1de529jm.js";
25
34
  export {
@@ -27,4 +36,4 @@ export {
27
36
  registerCommands
28
37
  };
29
38
 
30
- //# debugId=F50F7343D96D9C2C64756E2164756E21
39
+ //# debugId=A619C849012DC6F164756E2164756E21
@@ -37,3 +37,60 @@ export declare function extractDeploymentErrors(result: PipelineDeploymentResult
37
37
  */
38
38
  export declare function formatDeploymentErrorsAsText(summary: DeploymentErrorSummary): string;
39
39
  export declare function formatDeploymentFailureDetails(pipelineDeploymentId: string, status: PipelineDeploymentResult): string;
40
+ /**
41
+ * The errors a pipeline attached to its terminal status, one line per
42
+ * category (validation, conflicts, conflict fixing, schedule, deployment,
43
+ * services), each error with its code and the resource it names. Empty when
44
+ * the status carries none.
45
+ */
46
+ export declare function formatPipelineErrors(status: PipelineDeploymentResult): string[];
47
+ /**
48
+ * Does a server error body carry this Automation Solutions error code?
49
+ *
50
+ * The code sits either at the top level (`{"errorCode":"0002",…}`) or, on a
51
+ * ProblemDetails validation failure, inside each field's entries
52
+ * (`{"errors":{"deploymentName":[{"errorCode":"DeploymentAlreadyInProgress",…}]}}`).
53
+ * `extractErrorDetails` keeps only the messages of the latter in
54
+ * `parsedErrors`, so the raw `details` text is what still names the code.
55
+ */
56
+ export declare function hasServerErrorCode(details: string, code: string): boolean;
57
+ /**
58
+ * Did the server answer without a problem body? A missing body leaves the
59
+ * SDK's own error text in `details`; every server answer is JSON. With a 404
60
+ * this is how a route the server does not have (a bare 404 from the gateway)
61
+ * reads apart from the route's own not-found, which carries a body.
62
+ */
63
+ export declare function isBareResponse(details: string): boolean;
64
+ /**
65
+ * The install route's refusal when the name's newest generation is a Draft
66
+ * built for another version: a pending attempt stands in the way.
67
+ */
68
+ export declare const DRAFT_VERSION_MISMATCH_CODE = "DraftDeploymentHasDifferentPackageVersion";
69
+ /**
70
+ * Terminal statuses the pipeline reaches before it schedules the install. The
71
+ * attempt's generation is then never promoted: it stays behind as a Draft,
72
+ * which the install route reuses for the name on the next request.
73
+ */
74
+ export declare function leavesPendingDraft(status: string): boolean;
75
+ /**
76
+ * Whether the run's own record says the install landed although the pipeline
77
+ * did not end at `DeploymentSucceeded`.
78
+ *
79
+ * The pipeline runs an activation validation after the install. When it
80
+ * passes the run ends at `DeploymentSucceeded` with the record
81
+ * `ReadyToActivate`; when it fails the run ends at `ValidationFailed` with
82
+ * `deploymentResult.status: SuccessfulInstall` and the record `Successful` /
83
+ * `NeedsSetupToActivate`, `SetupActivation`, `Uninstall` and `Upgrade`
84
+ * offered — the install had landed. Measured 2026-09-28 on both `deploy run`
85
+ * (a fresh install and an in-place move) and `deploy upgrade`, with an
86
+ * Integration Service connection that needed authentication.
87
+ * `leavesPendingDraft` is wrong for such a run — nothing is a draft, and the
88
+ * deployment exists — so a caller reads this first.
89
+ */
90
+ export declare function installLandedDespiteStatus(status: PipelineDeploymentResult): boolean;
91
+ /**
92
+ * The first next step for a run {@link installLandedDespiteStatus} describes:
93
+ * the pipeline's status, why it is not the install's, and the errors it
94
+ * attached — on one line, since a next step is one.
95
+ */
96
+ export declare function explainPipelineStatusAfterInstall(status: PipelineDeploymentResult): string;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@uipath/solution-tool",
3
3
  "author": "UiPath",
4
4
  "license": "SEE LICENSE IN LICENSE.txt",
5
- "version": "1.203.0-preview.203",
5
+ "version": "1.204.0-preview.206",
6
6
  "description": "Create, pack, publish, and deploy UiPath Automation Solutions.",
7
7
  "repository": {
8
8
  "type": "git",
@@ -48,5 +48,5 @@
48
48
  "dist"
49
49
  ],
50
50
  "private": false,
51
- "gitHead": "a10661bf5ec19ddd6c628ed7bb1db55f721a6027"
51
+ "gitHead": "ea7fd32a02acccf14e8e83522e69101430627b83"
52
52
  }