feat: route DTL calls via script execution for v4 (#ENGCE-61216) - #3132
Conversation
|
Claude finished @mrstark14's task in 3m 5s —— View job PR Review: Route DTL calls via script execution for v4
SummaryDocuments the Change-by-Change Review1.
|
| Area | Status | Notes |
|---|---|---|
| Frontmatter | OK | No frontmatter changes |
| E2E Tests | Issue | No test tasks cover the new run script workflow |
| Skill Body | OK | No SKILL.md changes |
| References & Assets | OK | New section is authoritative and well-structured; pointer discipline is clean |
| Repo Hygiene | OK | No secrets, no new skill paths, scoped changes, all links resolve |
Issues for Manual Review
- CLI command accuracy: Verify that
uip is resources run script --connection-id <id> --connector-key <key> --script-ref <ref>is the correct syntax and that--connector-keyis indeed required with--script-ref. This cannot be verified from documentation alone. - Response envelope shape: The
Data.Bodyis documented as a JSON string decoding to{ status, headers, body }. Confirm this matches the actual IPE Runtime Proxy response. Data.Statussemantics: The claim that a vendor4xx/5xxstill returnsResult: "Success"is a subtle footgun — verify this is accurate, since agents will rely on it.
Conclusion
Clean, well-structured documentation addition. The new run script section in reference-resolution.md is thorough, the resources.md update is correctly scoped, and the impl.md additions follow established patterns. One Low finding on placeholder casing inconsistency, and one Medium note on missing test coverage for the new workflow. No blocking issues — the PR is ready to merge.
mukundbayyaram
left a comment
There was a problem hiding this comment.
We need a skill / reference on how our new scripts look like and conventions so that the scripts agent is building is correct ?
| 2. **`method` / `endpoint`** — from `connectorMethodInfo` (`registry get`) or `availableOperations[]` (`is resources describe <connector-key> <object-name> --activity-version 4.0.0`). | ||
| 3. **Operation label ≠ HTTP verb** — a semantic operation (e.g. `Update`) pairs with any verb (e.g. `POST /usergroups.users.update`). `flow validate` accepts it; do not "fix" the method to match the label. | ||
| 4. **Not connection-scoped** — `--connection-id` on `registry get` adds no custom fields. | ||
| 5. **Reference fields are script-backed** — `reference` carries `scriptRef` (e.g. `list_usergroups`) and no `objectName`. Resolve with `uip is resources run script --connection-id <id> --connector-key <connector-key> --script-ref <scriptRef> --output json`, never `run list`. `registry get` strips `scriptRef` — read it from the Step 3 `describe` (`--activity-version 4.0.0 --operation <method>`). Response parsing and matching rules: [/uipath:uipath-platform — reference-resolution.md § 4.0.0 Activities — Script References](../../../../../uipath-platform/references/integration-service/reference-resolution.md#400-activities--script-references-scriptref). |
There was a problem hiding this comment.
Can connectorKey be derived at SDK layer by looking at connection's cached response (assuming we do cache connection response) ? so that command looks a little cleaner ?
| # 3. Match the user's input against reference.lookupNames in the returned rows | ||
| # Extract reference.lookupValue as the resolved ID | ||
|
|
||
| # 4. Write the resolved ID (never the display name) into the node / --body |
There was a problem hiding this comment.
Should this be part of bash ?
| ### Reading the response | ||
|
|
||
| The proxy relays the vendor's answer verbatim, so the envelope differs from `run list`: | ||
|
|
||
| - `Data.Outcome` — `"vendor"` when the call reached the vendor. `Data.Status` is then the **vendor's** HTTP status; a vendor `4xx`/`5xx` still returns `Result: "Success"`. Read `Data.Status`, never assume success from the envelope. | ||
| - `Data.Body` — a **JSON string**, not an object. Parse it: it decodes to `{ "status", "headers", "body" }`, and `body` holds the rows the script returned (for `list_*` scripts, an array of records). | ||
| - `--output-filter` operates on the envelope only; it cannot reach inside the string. Parse with `jq`/Python instead: |
There was a problem hiding this comment.
This needs to be updated based on feedback in CLI PR ?
1753ea0 to
5b9cf8e
Compare
5b9cf8e to
ead92fc
Compare
Why
Reference fields on
4.0.0(v4) connector activities are script-backed, not object-backed. The v4 metadata carriesreference.scriptRefand has noobjectName/path:uip is resources describe uipath-salesforce-slack add_users_to_usergroup --activity-version 4.0.0 --operation POSTThe skills only knew one lookup path —
uip is resources run list <connector> <reference.objectName>— which cannot resolve these: there is no object to list. The CLI now exposes the design-time lookup (DTL) scripts through the IPE Runtime Proxy (elements_/v4/execute,feat: Add support to execute IPE runtime proxy (#ENGCE-61027)):integrationservice-tool/src/commands/resources.ts§run scriptTwo things an agent cannot infer and would otherwise get wrong:
maestro flow registry getstripsscriptRef.applyOptionalFieldPropscopies onlyobjectName/lookupValue/lookupNames/path/childPath(maestro-sdk/src/registry/integration-service-fetcher.ts), so a v4 field surfaces asreference: { lookupValue, lookupNames }with no target. The docs now say: neitherobjectNamenorscriptRefon a4.0.0node means script-backed — readscriptReffromdescribe, neverrun lista guessed object.run list. The proxy relays the vendor answer verbatim (ADR-0014):Data.Bodyis a JSON string decoding to{status, headers, body}, a vendor 4xx/5xx still returnsResult: "Success"(readData.Status),--output-filtercannot reach inside the string, and there is noData.Pagination.What
uipath-platform/.../reference-resolution.mdscriptRef): reference shape, 4-step resolution workflow (describe --activity-version 4.0.0 --operation <METHOD>→run script --script-ref→ matchlookupNames→ writelookupValue), response parsing with ajqexample, dottedlookupNames(profile.email), and wherescriptRefis/isn't visible. Connection-Scoped and When the Lookup Call Fails now namerun scriptalongsiderun listso the no-substitution rules apply to both.uipath-platform/.../resources.md--activity-version: v4 describe example gains--operation <METHOD>(without it the response is an operation summary with norequestFields), plus thescriptRef→run scriptpointer. New §run scriptunder Execute Operations: syntax,--script-refxor--inline-script,--connector-keyrequired with--script-ref, envelope caveats.uipath-maestro-flow/.../connector/impl.mdrun script,registry getstripsscriptRef. Step 4: callout routing4.0.0nodes torun scriptwith parsing rules; zero-match / multi-match / failed-call / connection-scoping rules unchanged.No frontmatter, Critical Rules, or flavor-marked passages touched; no
skill-flavors/override exists for these files.Verified
uip is resources run script … --script-ref list_usergroupsagainst a live Slack connection:Outcome: vendor,Status: 200,Data.Body→{status, headers, body}with 821 user-group rows carryingid/name— matches the documented parsing.describe … --activity-version 4.0.0without--operationreturnsAvailableOperations: nulland no fields; with--operation POSTit returnsReference.ScriptRef— hence the added flag.node scripts/check-skill-links.mjs— all 6709 links resolve (new anchors included).scripts/check-skill-verbs.pyflagsis resources run scriptas stale only becauseassets/uip-catalog-snapshot.jsonwas built from a dev CLI that predates the command; rebuilding the snapshot needs therpatool installed for the 1.203.x line (the build refuses otherwise).🤖 Generated with Claude Code