Skip to navigation
Plugin Building MasterclassEnd-to-End Course

PurpleSuite Build Reference

Review the complete PurpleSuite feature-request build and finish any missing Agent Studio assets.

View as Markdown

PurpleSuite provides mock enterprise SaaS APIs and seeded data for Agent Studio development. This reference assembles the feature-request capability you built throughout the masterclass.

Use This as a Checkpoint

If you followed each Build Along section, the connector, actions, mappings, slots, compound action, conversation process, and plugin already exist. Compare those assets with the reference below and complete only the missing or failing checkpoints.

The completed build contains:

PurpleSuite connector
├── List feature requests HTTP action
├── Get feature request HTTP action
├── Update feature request HTTP action
├── Feature request dynamic resolver
├── Status static resolver
├── Update feature request compound action
├── Conversation process
└── Conversational plugin
Safe Explorer

The explorer below fetches only public PurpleSuite catalog and OpenAPI metadata. It does not request, store, or transmit your PAT or instance ID, and it does not execute API operations.

Explore the Live API Contract

Select Community, then inspect the instance-based GET /feature_requests, GET /feature_requests/{id}, and PATCH /feature_requests/{id} operations.

PurpleSuite API explorer

Choose a mock enterprise system and operation. The explorer reads public OpenAPI metadata and generates an Agent Studio action outline without requesting or storing credentials.

Catalog snapshot
Loading the public OpenAPI spec…
Security boundary: this explorer fetches only public catalog and OpenAPI metadata. It does not ask for, persist, or transmit a PurpleSuite PAT or instance ID, and it never runs write operations.

The catalog and operation schemas come from the current PurpleSuite codebase, so new systems and fields can appear without rewriting this page.

PurpleSuite end-to-end call trace

Follow one live feature request through the same three API calls and Agent Studio contracts in every chapter.

Shared connector
https://marketplace.moveworks.com
Every API action
Connector adds Bearer PAT. Action adds X-Instance-ID.
Compare the complete PurpleSuite build
Use the same live record, typed arguments, API calls, and mapped output to verify every Agent Studio asset.
User requestConversationConversational plugin
Move <a live feature request name> to Planned.
Receives
Natural-language intent
Returns
Selected plugin and conversation process
How it fits
The title, description, and triggering examples retrieve the capability. They do not contain an API record ID.
Successful run: actual API call ledger
1GET/api/purple-suite/community/feature_requestsDynamic resolver retrieves live candidates
2PATCH/api/purple-suite/community/feature_requests/{id}Compound action updates the selected record
3GET/api/purple-suite/community/feature_requests/{id}Compound action verifies the stored result
Use a record returned by your own PurpleSuite instance. Save its original status before the write and restore it after mutation testing when appropriate.

Phase 0: Create a PurpleSuite Instance

Complete PurpleSuite Setup to:

  1. Create an instance with sample data.
  2. Copy the temporary PAT and instance ID.
  3. Create an API-key connector.
  4. Verify the connection with a read-only request.

You can use either connector boundary:

Connector base URL:

https://marketplace.moveworks.com

HTTP action endpoint:

/api/purple-suite/community/feature_requests

The narrower base URL reduces the destinations compatible actions can reach. The broader connector is convenient when one build intentionally uses several PurpleSuite systems.

Phase 1: Build the Read Actions

Create an HTTP action named List PurpleSuite feature requests.

FieldValue
MethodGET
Endpoint with host-only connector/api/purple-suite/community/feature_requests
HeaderX-Instance-ID: <your instance ID>
Optional query$top=25

PurpleSuite list operations return a structured envelope:

{
"data": [
{
"id": "FR-1042",
"name": "Bulk edit requests",
"currentStatus": "New",
"productArea": "Admin"
}
],
"nextCursor": null,
"total": 1
}

Keep the list envelope in the HTTP action’s response schema. The dynamic resolver will transform response.data into candidate values in the next phase.

Create another HTTP action named Get PurpleSuite feature request:

FieldValue
Input argumentfeature_request_id as string
MethodGET
Endpoint with host-only connector/api/purple-suite/community/feature_requests/{{{feature_request_id}}}
HeaderX-Instance-ID: <your instance ID>

Checkpoint

The list action returns the documented { data, nextCursor, total } envelope. The get action returns one requested record.

Phase 2: Build the Resolvers

Dynamic Feature Request Resolver

Create an object slot named selected_feature_request.

Configure a dynamic resolver that:

  1. Calls List PurpleSuite feature requests.

  2. Maps the resolver output directly to a candidate list:

    MAP():
    items: response.data
    converter:
    id: item.id
    display_name: item.name
    current_status: item.currentStatus
    product_area: item.productArea
  3. Configures cardinality to interpret the output as a list of candidate values.

  4. Uses display_name as the useful display field.

  5. Preserves id, current_status, and product_area.

The user can refer to a request naturally while the selected slot retains the exact record ID.

Static Status Resolver

Create an object slot named target_status.

Use a static resolver based on the current currentStatus enum shown in the live OpenAPI schema. Do not copy an older list from another quickstart without checking the spec.

Add a DSL validator when your business flow allows only a subset of transitions.

Checkpoint

Test:

  • One exact request name.
  • An ambiguous phrase that matches several requests.
  • A phrase with no matching request.
  • Each allowed target status.
  • A status excluded by your business rule.

Phase 3: Build the Write Action

Create an HTTP action named Update PurpleSuite feature request.

Input argumentType
feature_request_idstring
new_statusstring

Configure the request from the live PATCH /feature_requests/{id} schema.

Endpoint:

/api/purple-suite/community/feature_requests/{{{feature_request_id}}}

Example body shape:

{
"currentStatus": "{{{new_status}}}"
}

Keep the exact property name and enum values defined by the current OpenAPI schema.

Checkpoint

Test the action against non-production sample data. Confirm that the selected record changes and the action returns a useful updated object.

Phase 4: Compose the Backend Workflow

Create a compound action named Update and verify feature request.

Declare:

feature_request_id:
type: string
new_status:
type: string

Add steps:

1

Update the record

Call the update HTTP action with the compound input arguments.

2

Retrieve the final state

Call GET /feature_requests/{id} with the same record ID.

3

Return the public result

Map only the stable ID, name, current status, and product area.

Example return:

- return:
output_mapper:
feature_request:
id: data.verified_feature_request.id
name: data.verified_feature_request.name
status: data.verified_feature_request.currentStatus
product_area: data.verified_feature_request.productArea

Checkpoint

The compound action exposes one result. The internal write and verification responses do not leak into the caller’s contract.

Phase 5: Build the Conversation Process

Add:

  1. selected_feature_request object slot with the dynamic resolver.
  2. target_status object slot with the static resolver and validation.
  3. Confirmation before the write.
  4. An action activity that calls the compound action.

Input mapping:

feature_request_id: data.selected_feature_request.id
new_status: data.target_status.value

Output mapping:

updated_feature_request:
id: response.feature_request.id
name: response.feature_request.name
status: response.feature_request.status
product_area: response.feature_request.product_area
display_instructions_for_model: >-
Confirm the feature request name and new status.
Include the product area. Do not mention internal implementation steps.

Checkpoint

The process collects both values, confirms once, performs the backend sequence, and returns one concise result.

Phase 6: Publish the Conversational Plugin

Use:

FieldExample
TitleManage Product Feature Requests
DescriptionFind a product feature request and update its supported status.
ProcessYour tested conversation process

Add at least five varied positive triggering examples and negative examples for nearby project-management or ticketing capabilities.

Launch to a test group and try:

Move <a request returned by your resolver> to Planned.

Optional Phase 7: Reuse the Backend as an Ambient Agent

Create a separate plugin with a webhook or scheduled trigger. Map an event body containing feature_request_id and new_status directly into the same compound action.

This variant demonstrates reuse:

  • Same connector.
  • Same HTTP actions.
  • Same compound action.
  • Different trigger and no conversational slots.
  • No automatic meta_info.user.

Add notify only when the result must reach a resolved user.

Lab Review

You have built one capability from modular contracts:

API schema
→ connector trust boundary
→ focused HTTP operations
→ resolvers and typed slots
→ deterministic compound workflow
→ user-facing conversation process
→ plugin retrieval and launch

Continue to Test and Operate.