Files
attune/work-summary/2026-02-07-env-vars-ui-execution.md

12 KiB

Work Summary: Environment Variables UI for Manual Executions

Date: 2026-02-07
Status: Complete
Related: Secure Action Parameter Migration

Overview

Added support for custom environment variables in manual action executions. Users can now specify optional environment variables (e.g., DEBUG=true, LOG_LEVEL=debug) through the web UI and API when manually executing actions. These are distinct from action parameters and are used for runtime configuration rather than action-specific data.

Changes Made

1. Backend Changes

API Layer (attune/crates/api)

File: crates/api/src/dto/execution.rs

  • Added env_vars: Option<JsonValue> field to CreateExecutionRequest DTO
  • Allows API clients to pass custom environment variables when creating manual executions
  • Example: {"DEBUG": "true", "LOG_LEVEL": "info"}

File: crates/api/src/routes/executions.rs

  • Updated create_execution handler to accept and process env_vars from request
  • Passes env_vars to CreateExecutionInput for database storage
  • Environment variables are now part of execution creation flow

Repository Layer (attune/crates/common)

File: crates/common/src/repositories/execution.rs

  • Added env_vars: Option<JsonDict> to CreateExecutionInput struct
  • Updated all SQL queries to include env_vars column:
    • INSERT statement for creating executions
    • All SELECT statements (find_by_id, list, find_by_status, find_by_enforcement)
    • UPDATE RETURNING clause
  • Environment variables are now persisted with each execution

Note: The Execution model already had the env_vars field (added in previous migration), so no model changes were needed.

Executor Service (attune/crates/executor)

File: crates/executor/src/enforcement_processor.rs

  • Added env_vars: None to executions created from rule enforcements
  • Rule-triggered executions don't use custom env vars (only manual executions do)

File: crates/executor/src/execution_manager.rs

  • Updated child execution creation to inherit env_vars from parent
  • Ensures environment variables propagate through workflow hierarchies
  • env_vars: parent.env_vars.clone() pattern for parent-child relationships

Test Files

Updated all test files to include env_vars: None in CreateExecutionInput instances:

  • crates/api/tests/sse_execution_stream_tests.rs
  • crates/common/tests/execution_repository_tests.rs (20+ test cases)
  • crates/common/tests/inquiry_repository_tests.rs (15+ test cases)
  • crates/executor/tests/fifo_ordering_integration_test.rs
  • crates/executor/tests/policy_enforcer_tests.rs

Used Python script to bulk-update test files efficiently.

2. Frontend Changes

Web UI (attune/web)

File: web/src/pages/actions/ActionsPage.tsx

ExecuteActionModal Component Updates:

  1. State Management:

    • Added envVars state: Array<{ key: string; value: string }>
    • Initialized with one empty row: [{ key: "", value: "" }]
  2. Form Section:

    • Added "Environment Variables" section after Parameters section
    • Displays help text: "Optional environment variables for this execution (e.g., DEBUG, LOG_LEVEL)"
    • Multiple row support with add/remove functionality
  3. UI Components:

    • Two input fields per row: Key and Value
    • Remove button (X icon) on each row (disabled when only one row remains)
    • "Add Environment Variable" button below rows
    • Consistent styling with rest of modal (Tailwind CSS)
  4. Event Handlers:

    • addEnvVar() - Adds new empty row
    • removeEnvVar(index) - Removes row at index (minimum 1 row enforced)
    • updateEnvVar(index, field, value) - Updates key or value at index
  5. API Integration:

    • Updated mutationFn to accept { parameters, envVars } object
    • Filters out empty env vars (rows with blank keys)
    • Converts array to object: {"DEBUG": "true", "LOG_LEVEL": "info"}
    • Sends as env_vars field in POST request to /api/v1/executions/execute

Example UI Flow:

┌─────────────────────────────────────────┐
│ Execute Action                       X  │
├─────────────────────────────────────────┤
│ Action: core.http_request               │
│                                         │
│ Parameters                              │
│ ┌────────────────────┐                  │
│ │ url: https://...   │                  │
│ │ method: GET        │                  │
│ └────────────────────┘                  │
│                                         │
│ Environment Variables                   │
│ Optional environment variables...       │
│ ┌──────────┬──────────┬───┐             │
│ │ DEBUG    │ true     │ X │             │
│ ├──────────┼──────────┼───┤             │
│ │ LOG_LEVEL│ debug    │ X │             │
│ └──────────┴──────────┴───┘             │
│ + Add Environment Variable              │
│                                         │
│            [Cancel]  [Execute]          │
└─────────────────────────────────────────┘

3. Documentation Updates

File: docs/QUICKREF-execution-environment.md

Added comprehensive section on custom environment variables:

  1. Custom Environment Variables Section:

    • Purpose and use cases
    • Format and examples
    • Important distinctions from parameters and secrets
    • API usage examples
    • Web UI reference
    • Action script usage patterns
    • Security notes
  2. Environment Variable Precedence:

    • System defaults → Standard Attune vars → Custom env vars
    • Custom vars cannot override standard Attune variables
  3. Enhanced Distinctions:

    • Clarified difference between:
      • Standard environment variables (system-provided)
      • Custom environment variables (user-provided, optional)
      • Action parameters (user-provided, action-specific data)
    • Provided comprehensive example showing all three types
  4. Updated Examples:

    • Added custom env vars to local testing script
    • Showed combined usage of all three variable types
    • Added security best practices

Key Design Decisions

1. Separate from Action Parameters

  • Environment variables are NOT action parameters
  • Parameters go via stdin (JSON), env vars via environment
  • This matches standard Unix conventions and StackStorm patterns

2. UI/UX Design

  • Multi-row key-value input (like Postman/curl)
  • Dynamic add/remove with minimum 1 row
  • Clear help text explaining purpose
  • Placed after parameters section for logical flow

3. Security Boundaries

  • Custom env vars stored in database (not secrets)
  • Documentation warns against using for sensitive data
  • Recommend secret: true parameters for sensitive data instead
  • Used for debug flags, feature toggles, runtime config only

4. Inheritance in Workflows

  • Child executions inherit parent's env_vars
  • Ensures consistent runtime config through workflow hierarchies
  • Same pattern as config inheritance

5. Rule-Triggered Executions

  • Rule-triggered executions get env_vars: None
  • Only manual executions can specify custom env vars
  • Keeps automated executions deterministic

Testing

Compilation

# Rust code compiles successfully
cargo check --workspace
# Output: Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.41s

# Web UI builds successfully
cd web && npm run build
# Output: ✓ built in 4.71s

Test Updates

  • All existing tests updated with env_vars: None
  • Bulk-updated using Python script for efficiency
  • ~40+ test cases across 5 test files

Usage Examples

Via Web UI

  1. Navigate to Actions page
  2. Click "Execute" on any action
  3. Fill in required parameters
  4. Add environment variables:
    • Key: DEBUG, Value: true
    • Key: LOG_LEVEL, Value: debug
  5. Click "Execute"

Via API

curl -X POST http://localhost:8080/api/v1/executions/execute \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "action_ref": "core.http_request",
    "parameters": {
      "url": "https://api.example.com",
      "method": "GET"
    },
    "env_vars": {
      "DEBUG": "true",
      "LOG_LEVEL": "debug",
      "TIMEOUT_SECONDS": "30"
    }
  }'

In Action Script

#!/bin/bash
# Custom env vars available as environment variables
if [ "$DEBUG" = "true" ]; then
    set -x  # Enable bash debug mode
fi

LOG_LEVEL="${LOG_LEVEL:-info}"
echo "Log level: $LOG_LEVEL" >&2

# Read parameters from stdin
INPUT=$(cat)
URL=$(echo "$INPUT" | jq -r '.url')

# Execute with both env vars and parameters
curl "$URL"

Benefits

  1. Improved Debugging:

    • Users can enable debug mode per execution
    • Adjust log levels without changing action code
    • Test different configurations easily
  2. Runtime Flexibility:

    • Feature flags for experimental features
    • Timeout adjustments for specific executions
    • Retry count overrides for troubleshooting
  3. Clean Separation:

    • Environment for runtime config
    • Parameters for action data
    • Secrets for sensitive data
  4. Developer Experience:

    • Intuitive UI with dynamic rows
    • Familiar pattern (like Postman headers)
    • Clear documentation and examples

Files Changed

Backend (Rust)

  • crates/api/src/dto/execution.rs
  • crates/api/src/routes/executions.rs
  • crates/common/src/repositories/execution.rs
  • crates/executor/src/enforcement_processor.rs
  • crates/executor/src/execution_manager.rs
  • crates/api/tests/sse_execution_stream_tests.rs
  • crates/common/tests/execution_repository_tests.rs
  • crates/common/tests/inquiry_repository_tests.rs
  • crates/executor/tests/fifo_ordering_integration_test.rs
  • crates/executor/tests/policy_enforcer_tests.rs

Frontend (TypeScript)

  • web/src/pages/actions/ActionsPage.tsx

Documentation

  • docs/QUICKREF-execution-environment.md

Next Steps

Recommended:

  1. Regenerate OpenAPI spec to include env_vars field
  2. Regenerate TypeScript API client from updated spec
  3. Add env_vars to execution detail page display
  4. Consider adding preset env var templates (common debug configs)

Optional Enhancements: 5. Add env var validation (key format, reserved names) 6. Add autocomplete for common env var names 7. Add env var inheritance toggle in workflow UI 8. Add execution replay with same env vars

Notes

  • Environment variables are optional - most executions won't use them
  • Primary use case is debugging and troubleshooting
  • Not intended for production workflow configuration (use parameters)
  • Complements but doesn't replace action parameters or secrets
  • Follows Unix/Linux environment variable conventions
  • Implementation aligns with StackStorm's env: execution parameter

Success Criteria

Users can add custom env vars in UI
Env vars sent to API and stored in database
Env vars available to action scripts as environment variables
Child executions inherit parent env vars
Clear documentation and examples
All tests pass and code compiles
Security boundaries maintained (not for secrets)


Implementation Time: ~2 hours
Complexity: Medium (backend + frontend + docs)
Impact: High (improves debugging/troubleshooting workflow)