Skip to content

feat(core): Implement WorkflowDefinition model and WorkflowResolver #2359

@kitelev

Description

@kitelev

Parent Epic

#2357 — Declarative workflow customization via vault assets

Summary

Create the in-memory WorkflowDefinition model and WorkflowResolver service that loads workflow definitions from the triple store via SPARQL.

What to Do

1. Create WorkflowDefinition model

File: packages/exocortex/src/domain/models/WorkflowDefinition.ts (NEW)

interface WorkflowDefinition {
  id: string;                        // asset UID
  name: string;                      // label
  targetClass: AssetClass;
  states: WorkflowStateDefinition[];
  transitions: WorkflowTransitionDefinition[];
  initialState: EffortStatus;
  terminalStates: EffortStatus[];
  isDefault: boolean;
}

interface WorkflowStateDefinition {
  status: EffortStatus;
  order: number;
  optional: boolean;
  timestampOnEnter?: string[];
  badgeColor?: string;
}

interface WorkflowTransitionDefinition {
  from: EffortStatus;
  to: EffortStatus;
  label: string;
  icon?: string;
  isRollback: boolean;
}

2. Create WorkflowResolver service

File: packages/exocortex/src/services/WorkflowResolver.ts (NEW)

Responsibilities:

  • Execute SPARQL queries against triple store to find workflows
  • Build WorkflowDefinition from query results
  • Cache resolved definitions (invalidate on workflow asset changes)
  • Resolve workflow for a given asset: asset-level → class default → hardcoded fallback

3. SPARQL queries

Implement two key queries:

  1. Find workflow by targetClass + isDefault
  2. Load all states and transitions for a given workflow UID

4. Unit tests

  • WorkflowDefinition model construction
  • WorkflowResolver with mock triple store
  • Fallback chain: asset → class default → hardcoded
  • Cache invalidation

Acceptance Criteria

Given a triple store containing workflow assets for ems__Project
When WorkflowResolver.resolveForClass(AssetClass.PROJECT) is called
Then a WorkflowDefinition is returned with correct states and transitions

Given an asset with ems__Effort_workflow property
When WorkflowResolver.resolveForAsset(asset) is called
Then the asset-specific workflow is returned (not class default)

Given no workflow assets in triple store
When WorkflowResolver.resolveForClass(AssetClass.PROJECT) is called
Then the hardcoded fallback WorkflowDefinition is returned

AI Guidance

  • Look at SPARQLQueryService.ts for how to execute SPARQL in the codebase
  • Use InMemoryTripleStore patterns for test setup
  • Keep WorkflowDefinition immutable (readonly properties)

Estimate

~3 hours

Dependencies

Metadata

Metadata

Assignees

No one assigned

    Labels

    architectureArchitecture and design decisionsenhancementNew feature or requestpackage:core@exocortex/core package

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions