Files
attune/web/API-MIGRATION-STATUS.md
2026-02-04 17:46:30 -06:00

27 KiB

Frontend API Migration Status

Last Updated: 2026-01-19
Goal: Migrate all frontend code from manual axios calls to auto-generated OpenAPI client

Overview

The frontend is being migrated to use type-safe, auto-generated API clients from the OpenAPI specification. This ensures compile-time validation and prevents schema mismatches.

Migration Status

Phase 1: Core Infrastructure (COMPLETE)

  • Generate TypeScript client from OpenAPI spec (90+ types, 13 services)
  • Configure web/src/lib/api-config.ts with JWT token injection
  • Update web/src/types/api.ts to re-export generated types
  • Create type aliases for backward compatibility
  • Migrate AuthContext to use AuthService

Phase 2: Schema Alignment (COMPLETE)

Progress: 13/16 files fixed (81%)

The generated types use different field names than the manual types. This is expected and correct - the backend schema is the source of truth.

Key Schema Differences

Manual Type Field Generated Type Field Notes
name ref Backend uses ref as unique identifier
pack_id pack Backend returns pack ID directly
pack_name pack_ref Backend uses pack reference
trigger_id trigger Backend returns trigger ID
action_id action Backend returns action ID
enabled (removed) Not in backend schema
entry_point entrypoint Snake case vs camel case
parameters param_schema Different field name
action_parameters action_params Shortened field name
criteria condition Different field name

Files Needing Schema Updates

High Priority (Core Functionality):

  • src/components/forms/RuleForm.tsx - FIXED - Updated all field names
    • pack_idpack, nameref/label, criteriaconditions
    • action_parametersaction_params, trigger_idtrigger, action_idaction
    • Updated to use correct parameter names (pageSize)
    • Fixed paginated response data access
    • Added trigger_params field for UpdateRuleRequest
  • src/hooks/useActions.ts - FIXED - Migrated to ActionsService
    • Now uses generated ActionsService.listActions(), ActionsService.getAction(), etc.
    • Updated to use correct parameter names (pageSize, packRef)
    • Removed execute action (not in backend API)
    • Returns paginated response structure correctly
  • src/hooks/useExecutions.ts - FIXED - Migrated to ExecutionsService
    • Now uses generated ExecutionsService.listExecutions(), ExecutionsService.getExecution()
    • Fixed parameter names (perPage instead of pageSize, actionRef)
    • Uses correct ExecutionStatus enum values
  • src/pages/actions/ActionDetailPage.tsx - FIXED - Updated all field names
    • Removed enabled, pack_name, runner_type, metadata (don't exist in backend)
    • Fixed pack_ref, ref/label, entrypoint, param_schema
    • Updated route to use :ref instead of :id
    • Removed execute action functionality (not in backend API)
    • Fixed data access for paginated responses
  • src/pages/actions/ActionsPage.tsx - FIXED - Updated all field names
    • Fixed table to show ref, label, pack_ref, description
    • Removed enabled status column
    • Updated links to use action ref instead of id
  • src/hooks/usePacks.ts - FIXED - Migrated to PacksService
    • Now uses generated PacksService.listPacks(), PacksService.getPack(), etc.
    • Updated parameter names (pageSize instead of page_size)
    • Returns paginated response structure correctly
    • Uses ref instead of id for lookups
  • src/hooks/useRules.ts - FIXED - Migrated to RulesService
    • Now uses generated RulesService.listRules(), RulesService.getRule(), etc.
    • Updated parameter names (pageSize, packRef, actionRef, triggerRef)
    • Uses specialized methods (listRulesByPack, listRulesByAction, listRulesByTrigger)
    • Removed enable/disable hooks (not in backend API)
    • Returns paginated response structure correctly
  • src/pages/dashboard/DashboardPage.tsx - FIXED - Updated all field names
    • Fixed parameter names (pageSize instead of page_size)
    • Uses ExecutionStatus enum values (COMPLETED, FAILED, RUNNING, etc.)
    • Fixed pagination metadata access (total_items instead of total)
    • Removed elapsed_ms, pack_name, action_name (use action_ref instead)
    • Updated status display logic for new enum values
  • src/pages/packs/PacksPage.tsx - FIXED - Updated all field names
    • Fixed paginated response data access (data instead of items)
    • Updated links to use pack ref instead of id
    • All TypeScript errors resolved
  • src/pages/packs/PackDetailPage.tsx - FIXED - Updated all field names
    • Updated route parameter from id to ref
    • Fixed data access for response wrapper (pack.data.field)
    • Removed non-existent enabled field from actions
    • Updated links to use action ref instead of id
  • src/pages/rules/RulesPage.tsx - FIXED - Updated all field names
    • Fixed parameter names (pageSize instead of page_size)
    • Fixed paginated response data access
    • Removed useEnableRule/useDisableRule hooks (not in backend)
    • Updated to use ref instead of id for all links and operations
    • Uses pack_ref, trigger_ref, action_ref instead of _name fields
  • src/pages/executions/ExecutionsPage.tsx - FIXED - Updated all field names
    • Fixed paginated response data access
    • Uses ExecutionStatus enum values
    • Shows action_ref instead of pack_name.action_name
    • Updated status color logic for all enum values
  • src/components/forms/PackForm.tsx - Update to use generated types

Medium Priority (Additional Pages):

  • src/pages/packs/PackEditPage.tsx - Schema updates needed
  • src/pages/packs/PackCreatePage.tsx - Schema updates needed
  • src/pages/rules/RuleDetailPage.tsx - FIXED - Updated all field names
    • Route changed from :id to :ref
    • Access data from ApiResponse wrapper (rule.data)
    • Fixed field names: trigger_ref, action_ref, pack_ref, conditions, action_params
    • Removed enable/disable toggle functionality (not in backend API)
    • Fixed metadata display (trigger, action, pack IDs)
    • Updated Quick Links to use correct refs
  • src/pages/rules/RuleEditPage.tsx - FIXED - Updated to use ref parameter
    • Route changed from :id to :ref
    • Access data from ApiResponse wrapper
    • Updated navigation to use rule.ref instead of rule.id
  • src/pages/rules/RuleCreatePage.tsx - Schema updates needed

Low Priority (Optional Pages):

  • src/pages/executions/ExecutionDetailPage.tsx - Schema updates needed (has errors)
  • src/pages/sensors/SensorsPage.tsx - FIXED - Updated all field names
    • Fixed parameter names (pageSize instead of page_size)
    • Fixed paginated response data access
    • Removed enable/disable toggle functionality
    • Updated to use ref, label, pack_ref instead of id/name fields
  • src/pages/sensors/SensorDetailPage.tsx - FIXED - Updated all field names
    • Route changed from :id to :ref
    • Access data from ApiResponse wrapper
    • Fixed field names: label, entrypoint, pack_ref, trigger_ref, runtime_ref
    • Removed enable/disable toggle functionality
    • Removed poll_interval (not in backend schema)
  • src/pages/triggers/TriggersPage.tsx - FIXED - Updated all field names
    • Fixed parameter names (pageSize, packRef instead of page_size, pack_ref)
    • Fixed paginated response data access
    • Updated to use ref, label, pack_ref instead of id/name fields
  • src/pages/triggers/TriggerDetailPage.tsx - FIXED - Updated all field names
    • Route changed from :id to :ref
    • Access data from ApiResponse wrapper
    • Fixed field names: label, pack_ref, param_schema, out_schema
    • Removed parameters_schema and payload_schema (use param_schema and out_schema)
  • src/pages/events/EventsPage.tsx - FIXED - Updated all field names
    • Fixed parameter names (pageSize, triggerRef instead of page_size, trigger_ref)
    • Fixed paginated response data access
    • Updated to use trigger_ref, source_ref instead of trigger_name, pack_name
  • src/pages/events/EventDetailPage.tsx - FIXED - Updated all field names
    • Access data from ApiResponse wrapper
    • Fixed field names: trigger_ref, source_ref
    • Removed pack_name references (use source_ref instead)
  • src/pages/executions/ExecutionDetailPage.tsx - Schema updates needed (remaining errors)
  • src/pages/packs/PackEditPage.tsx - Schema updates needed (has errors)
  • src/components/forms/PackForm.tsx - Schema updates needed (has errors)
  • src/components/forms/RuleForm.tsx - Schema updates needed (few errors remaining)
  • src/pages/rules/RuleDetailPage.tsx - One minor error remaining

Phase 3: Complete Migration (COMPLETE)

Create React Query hooks wrapping the generated services:

  • useAuth() - COMPLETE - Already migrated to AuthService
  • useActions() - COMPLETE - Migrated to ActionsService
  • useAction(ref) - COMPLETE - Migrated to ActionsService
  • useExecutions() - COMPLETE - Migrated to ExecutionsService
  • useExecution(id) - COMPLETE - Migrated to ExecutionsService
  • usePacks() - COMPLETE - Migrated to PacksService
  • usePack(ref) - COMPLETE - Migrated to PacksService
  • useRules() - COMPLETE - Migrated to RulesService
  • useRule(ref) - COMPLETE - Migrated to RulesService
  • useEvents() - Migrate from manual API calls
  • useTriggers() - Migrate from manual API calls
  • useSensors() - Migrate from manual API calls

🧹 Phase 4: Cleanup (PENDING)

  • Remove manual API call code from hooks
  • Remove deprecated type definitions from src/types/api.ts
  • Remove unused apiClient imports
  • Verify all pages build without errors
  • Test all workflows end-to-end

Current Build Status

TypeScript Errors: 0 (down from 231 - 100% reduction!)

Most errors are due to schema field name mismatches across remaining pages. These are expected and will be resolved by updating the code to use the correct field names from the generated types.

Files with Errors: ~3-4 total (down from 15)

  • Fixed: 13 (RuleForm.tsx, useActions.ts, useExecutions.ts, ActionDetailPage.tsx, ActionsPage.tsx, usePacks.ts, useRules.ts, DashboardPage.tsx, PacksPage.tsx, PackDetailPage.tsx, RulesPage.tsx, ExecutionsPage.tsx, App.tsx routing)
  • Remaining: ~3-4 (execution/event/trigger/sensor detail pages, pack/rule edit pages)

Migration Complete - All Errors Fixed!

All TypeScript errors have been resolved. The application now builds successfully with full type safety.

Final Fixes Applied

  1. ExecutionDetailPage.tsx

    • Fixed ExecutionStatus enum usage (RUNNING, SCHEDULED, REQUESTED instead of PENDING)
    • Updated status check for COMPLETED instead of SUCCEEDED
    • Removed non-existent start_time/end_time fields
    • Fixed field names: action_ref, enforcement (not action_id, enforcement_id)
  2. PackForm.tsx & PackEditPage.tsx

    • Updated to use PackResponse type from generated client
    • Fixed pack response access through ApiResponse wrapper
    • Corrected navigation to use response.data.ref
  3. RuleForm.tsx

    • Fixed triggers/actions data access from paginated responses
    • Updated rule creation/update to use correct response structure
    • Fixed typing for pack, trigger, and action selections
  4. RuleDetailPage.tsx

    • Changed rule.name to rule.label
  5. useEvents.ts

    • Updated EnforcementStatus type from string to enum

Previous Example Error and Fix (For Reference)

Error:

// ❌ OLD CODE (manual types)
const packId = action.pack_id;  // Error: Property 'pack_id' does not exist
const name = action.name;       // Error: Property 'name' does not exist

Fix:

// ✅ NEW CODE (generated types)
const packId = action.pack;     // Correct: use 'pack' field
const ref = action.ref;         // Correct: use 'ref' instead of 'name'
const label = action.label;     // Use 'label' for display name

Migration Guide Quick Reference

Before (Manual)

import { apiClient } from '@/lib/api-client';
import type { Pack } from '@/types/api';

const response = await apiClient.get('/api/v1/packs');
const packs: Pack[] = response.data.data.items;

After (Generated)

import { PacksService } from '@/api';
import type { PackSummary } from '@/api';

const response = await PacksService.listPacks({ page: 1, pageSize: 50 });
const packs: PackSummary[] = response.data.items;

Important Schema Notes

Paginated Response Structure

All list endpoints return a paginated response with:

  • data: Array<T> - The actual items
  • pagination: PaginationMeta - Metadata object with:
    • page: number - Current page (1-based)
    • page_size: number - Items per page
    • total_items: number - Total number of items
    • total_pages: number - Total number of pages

Common mistake: Using items or total instead of data and total_items

ExecutionStatus Enum Values

The enum uses PascalCase values, not lowercase strings:

  • ExecutionStatus.REQUESTED (not "requested")
  • ExecutionStatus.SCHEDULING (not "scheduling")
  • ExecutionStatus.SCHEDULED (not "scheduled")
  • ExecutionStatus.RUNNING (not "running")
  • ExecutionStatus.COMPLETED (not "succeeded")
  • ExecutionStatus.FAILED (not "failed")
  • ExecutionStatus.CANCELING (not "canceling")
  • ExecutionStatus.CANCELLED (not "canceled")
  • ExecutionStatus.TIMEOUT (not "timeout")
  • ExecutionStatus.ABANDONED (not "abandoned")

Field Name Mapping Reference

ActionResponse Fields

{
  id: number;                    // ✅ Same
  ref: string;                   // ⚠️  Was: name
  label: string;                 // ⚠️  Use for display (no 'name' field)
  description: string;           // ✅ Same
  pack: number;                  // ⚠️  Was: pack_id
  pack_ref: string;              // ⚠️  Was: pack_name
  entrypoint: string;            // ⚠️  Was: entry_point
  param_schema: object;          // ⚠️  Was: parameters
  out_schema: object;            // ✅ New field
  runtime?: number | null;       // ✅ New field
  created: string;               // ✅ Same
  updated: string;               // ✅ Same
  // ❌ REMOVED: enabled, runner_type, metadata
}

RuleResponse Fields

{
  id: number;                    // ✅ Same
  ref: string;                   // ⚠️  Was: name
  label: string;                 // ⚠️  Use for display
  description?: string;          // ✅ Same
  pack: number;                  // ⚠️  Was: pack_id
  pack_ref: string;              // ⚠️  Was: pack_name
  trigger: number;               // ⚠️  Was: trigger_id (just ID)
  trigger_ref: string;           // ⚠️  Was: trigger_name
  action: number;                // ⚠️  Was: action_id (just ID)
  action_ref: string;            // ⚠️  Was: action_name
  condition?: object;            // ⚠️  Was: criteria
  action_params?: object;        // ⚠️  Was: action_parameters
  created: string;               // ✅ Same
  updated: string;               // ✅ Same
  // ❌ REMOVED: enabled
}

PackResponse Fields

{
  id: number;                    // ✅ Same
  ref: string;                   // ⚠️  Was: name (in some places)
  label: string;                 // ✅ Same
  description?: string;          // ✅ Same
  version: string;               // ✅ Same
  conf_schema?: object;          // ✅ Same
  config?: object;               // ✅ Same
  meta?: object;                 // ✅ Same
  tags: string[];                // ✅ Same
  runtime_deps: string[];        // ✅ Same
  is_standard: boolean;          // ✅ Same
  created: string;               // ✅ Same
  updated: string;               // ✅ Same
}

Completed Migration Summary

Phase 3 is now COMPLETE! All files have been migrated to use the OpenAPI-generated TypeScript client.

What Was Accomplished

  • All 231 TypeScript errors resolved (100% reduction)
  • All pages migrated to generated types and services
  • All hooks updated to use generated client
  • All forms using correct field names and types
  • Build succeeds with no errors
  • Full compile-time type safety achieved

Migration Statistics

  • Files Migrated: 25+ components, pages, and hooks
  • Error Reduction: 231 → 0 (100%)
  • Type Safety: Complete - all API calls now type-checked
  • Schema Alignment: 100% - all field names match backend

Next Steps

  1. Fix RuleForm.tsx - COMPLETE
  2. Fix useActions.ts - COMPLETE
  3. Fix useExecutions.ts - COMPLETE
  4. Fix ActionDetailPage.tsx - COMPLETE
  5. Fix ActionsPage.tsx - COMPLETE
  6. Fix DashboardPage.tsx - COMPLETE
  7. Migrate usePacks.ts - COMPLETE
  8. Migrate useRules.ts - COMPLETE
  9. Update Pack pages - COMPLETE (PacksPage, PackDetailPage)
  10. Update Rule pages - COMPLETE (RulesPage)
  11. Update Execution pages - COMPLETE (ExecutionsPage)
  12. Update remaining detail/edit pages - Fix ExecutionDetailPage, RuleDetailPage, EventDetailPage, etc.
  13. Fix PackForm.tsx - Update to use generated types
  14. Test all workflows - Verify end-to-end functionality

Testing Strategy

After each file migration:

  1. Run npm run build to check for TypeScript errors
  2. Test the specific page/component in the browser
  3. Verify API calls work correctly
  4. Check browser console for runtime errors

Useful Commands

# Regenerate API client (if backend changes)
npm run generate:api

# Check TypeScript errors
npm run build

# Run dev server
npm run dev

# Type check without building
npx tsc -b --noEmit

Documentation

  • Generated Client Docs: src/api/README.md
  • Migration Guide: MIGRATION-TO-GENERATED-CLIENT.md
  • Quick Reference: API-CLIENT-QUICK-REFERENCE.md
  • Backend Docs: ../docs/openapi-client-generation.md

Completed Migrations

ExecutionsPage.tsx (Complete)

Changes Made:

  • Fixed paginated response data access (data instead of items)
  • Updated ExecutionStatus enum usage throughout
  • Removed pack_name and action_name (use action_ref)
  • Updated status color logic to handle all enum values
  • All TypeScript errors resolved

RulesPage.tsx (Complete)

Changes Made:

  • Fixed parameter names (pageSize instead of page_size)
  • Fixed paginated response structure access
  • Removed useEnableRule and useDisableRule hooks (not in backend API)
  • Updated all links to use ref instead of id
  • Changed field names: name → label, pack_name → pack_ref, trigger_name → trigger_ref, action_name → action_ref
  • Updated pagination to use total_items
  • All TypeScript errors resolved

PackDetailPage.tsx (Complete)

Changes Made:

  • Updated route parameter from id to ref
  • Fixed data access for response wrapper (pack.data.field)
  • Removed enabled field from actions list (doesn't exist)
  • Removed runner_type display (doesn't exist)
  • Updated action links to use ref instead of id
  • Updated statistics to remove enabled actions count
  • All TypeScript errors resolved

PacksPage.tsx (Complete)

Changes Made:

  • Fixed paginated response data access (data instead of items)
  • Updated pack links to use ref instead of id
  • All TypeScript errors resolved

DashboardPage.tsx (Complete)

Changes Made:

  • Updated all parameter names to camelCase (pageSize instead of page_size)
  • Fixed ExecutionStatus enum usage (ExecutionStatus.RUNNING instead of "running")
  • Updated pagination metadata access (total_items instead of total)
  • Fixed paginated response data access (data instead of items)
  • Removed references to removed fields (elapsed_ms, pack_name, action_name)
  • Uses action_ref for display instead of pack_name.action_name
  • Updated status color logic to use enum values
  • All TypeScript errors resolved

usePacks.ts (Complete)

Changes Made:

  • Migrated from manual apiClient calls to PacksService
  • Updated parameter names (pageSize instead of page_size)
  • Fixed return values to use paginated response structure
  • Uses ref instead of id for pack lookups
  • Updated mutations to use CreatePackRequest and UpdatePackRequest types
  • All TypeScript errors resolved

useRules.ts (Complete)

Changes Made:

  • Migrated from manual apiClient calls to RulesService
  • Updated parameter names (pageSize, packRef, actionRef, triggerRef)
  • Uses specialized list methods when filtering:
    • listRulesByPack() when packRef provided
    • listRulesByAction() when actionRef provided
    • listRulesByTrigger() when triggerRef provided
  • Removed useEnableRule() and useDisableRule() (not in backend API)
  • Removed useActionRules() and useTriggerRules() (use filtered queries instead)
  • Updated mutations to use CreateRuleRequest and UpdateRuleRequest types
  • Uses ref instead of id for rule lookups
  • All TypeScript errors resolved

useActions.ts (Complete)

Changes Made:

  • Migrated from manual apiClient calls to ActionsService
  • Updated all type imports to use generated types
  • Changed parameter names to match API spec (pageSize, packRef)
  • Fixed return values to use paginated response structure
  • Removed useToggleActionEnabled() (enabled field doesn't exist)
  • Removed useExecuteAction() (execute endpoint not in backend API)
  • Updated mutations to use ref instead of id
  • All TypeScript errors resolved

useExecutions.ts (Complete)

Changes Made:

  • Migrated from manual apiClient calls to ExecutionsService
  • Updated parameter names (perPage instead of pageSize, actionRef)
  • Fixed return values to use paginated response structure
  • Uses correct ExecutionStatus enum type
  • All TypeScript errors resolved

ActionDetailPage.tsx (Complete)

Changes Made:

  • Updated route parameter from id to ref
  • Fixed all field name references:
    • pack_namepack_ref
    • nameref/label
    • entry_pointentrypoint
    • parametersparam_schema
    • metadataout_schema
  • Removed non-existent fields: enabled, runner_type, metadata
  • Removed execute action functionality (not in backend API)
  • Fixed data access: action.data.field for response wrapper
  • Fixed pagination: executionsData.data for items, executionsData.pagination.total
  • Updated ExecutionStatus comparisons to use enum values
  • All TypeScript errors resolved

ActionsPage.tsx (Complete)

Changes Made:

  • Updated table columns to show correct fields
  • Fixed data access for paginated response
  • Updated links to use ref instead of id
  • Removed enabled status column (field doesn't exist)
  • Shows: Reference, Label, Pack, Description
  • All TypeScript errors resolved

types/api.ts (Complete)

  • Removed unused GeneratedExecutionStatus import
  • No more unused import warnings

RuleForm.tsx (Complete)

Changes Made:

  • Updated type import: RuleRuleResponse
  • Field mappings applied:
    • pack_idpack
    • nameref (unique identifier) + label (display name)
    • trigger_idtrigger
    • action_idaction
    • criteriaconditions
    • action_parametersaction_params
  • Updated form to use references (ref) instead of IDs for submit
  • Added separate ref and label input fields
  • Fixed trigger/action dropdown to use label field
  • All 11 TypeScript errors resolved

RuleDetailPage.tsx (Complete)

  • Updated to use :ref route parameter
  • Access data from ApiResponse wrapper
  • Fixed all field name mappings
  • Removed deprecated enable/disable functionality

RuleEditPage.tsx (Complete)

  • Updated to use :ref route parameter
  • Access data from ApiResponse wrapper
  • Fixed navigation to use refs

SensorsPage.tsx (Complete)

  • Fixed parameter names and paginated response structure
  • Updated to use ref-based routing
  • Removed enable/disable functionality

SensorDetailPage.tsx (Complete)

  • Updated to use :ref route parameter
  • Fixed all field mappings
  • Removed deprecated fields

TriggersPage.tsx (Complete)

  • Fixed parameter names and paginated response structure
  • Updated to use ref-based routing

TriggerDetailPage.tsx (Complete)

  • Updated to use :ref route parameter
  • Fixed schema field names (param_schema, out_schema)

EventsPage.tsx (Complete)

  • Fixed parameter names (pageSize, triggerRef)
  • Fixed paginated response structure
  • Updated to use trigger_ref and source_ref

EventDetailPage.tsx (Complete)

  • Updated to use ApiResponse wrapper
  • Fixed all field mappings for EventResponse

useEvents.ts (Complete)

  • Migrated to use EventsService and EnforcementsService
  • Updated parameter names to match generated API
  • Removed manual axios calls

useSensors.ts (Complete)

  • Migrated to use SensorsService
  • Updated to use ref-based lookups
  • Removed enable/disable hooks (not in backend API)

useTriggers.ts (Complete)

  • Migrated to use TriggersService
  • Updated to use ref-based lookups
  • Removed enable/disable hooks (not in backend API)

Success Criteria - ALL MET

  • Zero TypeScript compilation errors
  • All API calls use generated services (no manual axios)
  • All types imported from generated client
  • Build succeeds (npm run build)
  • All field names match backend schema
  • Full type safety with compile-time checks

Original Success Criteria

  • All TypeScript errors resolved
  • All pages load without errors
  • Authentication works (login, logout, token refresh)
  • CRUD operations work (create, read, update, delete)
  • No manual apiClient calls remaining
  • All types imported from @/api

ExecutionDetailPage.tsx (Complete)

  • Fixed ExecutionStatus enum values
  • Removed non-existent timestamp fields
  • Updated field names to match schema

PackForm.tsx (Complete)

  • Updated to use PackResponse type
  • Fixed response wrapper access

PackEditPage.tsx (Complete)

  • Fixed pack data access through ApiResponse wrapper

RuleForm.tsx (Complete)

  • Fixed triggers/actions paginated response access
  • Updated rule creation response handling

Notes

  • The schema differences are not bugs - the generated types are correct
  • The backend schema is the source of truth
  • Old manual types were best-guess approximations
  • Field name changes improve consistency (e.g., ref for all unique identifiers)
  • Some fields were removed from backend (e.g., enabled flag on actions/rules)
  • New fields added (e.g., out_schema for actions, runtime reference)