business-as-code
Version:
Primitives for expressing business logic and processes as code
787 lines • 20.4 kB
JavaScript
/**
* Operations Entity Types (Nouns)
*
* Business operations: Process, Workflow, Procedure, Policy.
*
* @packageDocumentation
*/
// =============================================================================
// Process
// =============================================================================
/**
* Process entity
*
* Represents a business process with defined steps.
*/
export const Process = {
singular: 'process',
plural: 'processes',
description: 'A business process with defined steps',
properties: {
// Identity
name: {
type: 'string',
description: 'Process name',
},
slug: {
type: 'string',
optional: true,
description: 'URL-friendly identifier',
},
description: {
type: 'string',
optional: true,
description: 'Process description',
},
// Classification
type: {
type: 'string',
optional: true,
description: 'Process type',
examples: ['core', 'support', 'management'],
},
category: {
type: 'string',
optional: true,
description: 'Process category',
examples: ['sales', 'marketing', 'operations', 'finance', 'hr', 'engineering', 'support'],
},
// Flow
triggerType: {
type: 'string',
optional: true,
description: 'How process is triggered',
examples: ['manual', 'event', 'schedule', 'condition'],
},
triggerDescription: {
type: 'string',
optional: true,
description: 'Trigger description',
},
// IO
inputs: {
type: 'string',
array: true,
optional: true,
description: 'Required inputs',
},
outputs: {
type: 'string',
array: true,
optional: true,
description: 'Expected outputs',
},
// Metrics
averageDuration: {
type: 'string',
optional: true,
description: 'Average completion time',
},
sla: {
type: 'string',
optional: true,
description: 'SLA target',
},
// Automation
automationLevel: {
type: 'string',
optional: true,
description: 'Automation level',
examples: ['manual', 'semi-automated', 'automated', 'autonomous'],
},
automationPercentage: {
type: 'number',
optional: true,
description: 'Percentage automated (0-100)',
},
// Versioning
version: {
type: 'string',
optional: true,
description: 'Process version',
},
// Status
status: {
type: 'string',
description: 'Process status',
examples: ['draft', 'active', 'deprecated', 'archived'],
},
},
relationships: {
owner: {
type: 'Worker',
required: false,
description: 'Process owner',
},
department: {
type: 'Department',
required: false,
description: 'Owning department',
},
steps: {
type: 'ProcessStep[]',
description: 'Process steps',
},
workflows: {
type: 'Workflow[]',
description: 'Implementing workflows',
},
metrics: {
type: 'KPI[]',
description: 'Process metrics',
},
},
actions: [
'create',
'update',
'publish',
'addStep',
'removeStep',
'reorderSteps',
'automate',
'deprecate',
'archive',
],
events: [
'created',
'updated',
'published',
'stepAdded',
'stepRemoved',
'stepsReordered',
'automated',
'deprecated',
'archived',
],
};
// =============================================================================
// ProcessStep
// =============================================================================
/**
* ProcessStep entity
*
* Represents a step within a business process.
*/
export const ProcessStep = {
singular: 'process-step',
plural: 'process-steps',
description: 'A step within a business process',
properties: {
// Identity
name: {
type: 'string',
description: 'Step name',
},
description: {
type: 'string',
optional: true,
description: 'Step description',
},
// Order
order: {
type: 'number',
description: 'Step order',
},
// Execution
type: {
type: 'string',
optional: true,
description: 'Step type',
examples: ['task', 'decision', 'approval', 'notification', 'wait', 'parallel', 'subprocess'],
},
automationLevel: {
type: 'string',
optional: true,
description: 'Automation level',
examples: ['manual', 'semi-automated', 'automated'],
},
// Assignment
responsible: {
type: 'string',
optional: true,
description: 'Responsible role or person',
},
accountable: {
type: 'string',
optional: true,
description: 'Accountable role or person',
},
// Time
estimatedDuration: {
type: 'string',
optional: true,
description: 'Estimated duration',
},
sla: {
type: 'string',
optional: true,
description: 'SLA for this step',
},
// IO
inputs: {
type: 'string',
array: true,
optional: true,
description: 'Required inputs',
},
outputs: {
type: 'string',
array: true,
optional: true,
description: 'Expected outputs',
},
// Instructions
instructions: {
type: 'markdown',
optional: true,
description: 'Step instructions',
},
// Conditions
condition: {
type: 'string',
optional: true,
description: 'Condition for step execution',
},
},
relationships: {
process: {
type: 'Process',
description: 'Parent process',
},
nextStep: {
type: 'ProcessStep',
required: false,
description: 'Next step',
},
alternatives: {
type: 'ProcessStep[]',
description: 'Alternative next steps (for decisions)',
},
},
actions: [
'create',
'update',
'move',
'duplicate',
'delete',
],
events: [
'created',
'updated',
'moved',
'duplicated',
'deleted',
],
};
// =============================================================================
// Workflow
// =============================================================================
/**
* Workflow entity
*
* Represents an automated workflow.
*/
export const Workflow = {
singular: 'workflow',
plural: 'workflows',
description: 'An automated workflow',
properties: {
// Identity
name: {
type: 'string',
description: 'Workflow name',
},
slug: {
type: 'string',
optional: true,
description: 'URL-friendly identifier',
},
description: {
type: 'string',
optional: true,
description: 'Workflow description',
},
// Trigger
triggerType: {
type: 'string',
description: 'Trigger type',
examples: ['event', 'schedule', 'webhook', 'manual', 'api'],
},
triggerEvent: {
type: 'string',
optional: true,
description: 'Trigger event name',
},
triggerSchedule: {
type: 'string',
optional: true,
description: 'Cron schedule',
},
triggerWebhook: {
type: 'url',
optional: true,
description: 'Webhook URL',
},
triggerCondition: {
type: 'string',
optional: true,
description: 'Trigger condition',
},
// Execution
timeout: {
type: 'number',
optional: true,
description: 'Timeout in seconds',
},
retryPolicy: {
type: 'json',
optional: true,
description: 'Retry policy',
},
concurrency: {
type: 'number',
optional: true,
description: 'Max concurrent executions',
},
// Stats
runCount: {
type: 'number',
optional: true,
description: 'Total run count',
},
successCount: {
type: 'number',
optional: true,
description: 'Successful runs',
},
failureCount: {
type: 'number',
optional: true,
description: 'Failed runs',
},
lastRunAt: {
type: 'datetime',
optional: true,
description: 'Last run time',
},
lastRunStatus: {
type: 'string',
optional: true,
description: 'Last run status',
},
// Status
status: {
type: 'string',
description: 'Workflow status',
examples: ['draft', 'active', 'paused', 'error', 'archived'],
},
enabled: {
type: 'boolean',
optional: true,
description: 'Is enabled',
},
},
relationships: {
owner: {
type: 'Worker',
required: false,
description: 'Workflow owner',
},
team: {
type: 'Team',
required: false,
description: 'Owning team',
},
process: {
type: 'Process',
required: false,
description: 'Parent process',
},
actions: {
type: 'WorkflowAction[]',
description: 'Workflow actions',
},
runs: {
type: 'WorkflowRun[]',
description: 'Execution history',
},
},
actions: [
'create',
'update',
'enable',
'disable',
'trigger',
'test',
'addAction',
'removeAction',
'archive',
],
events: [
'created',
'updated',
'enabled',
'disabled',
'triggered',
'completed',
'failed',
'archived',
],
};
// =============================================================================
// WorkflowAction
// =============================================================================
/**
* WorkflowAction entity
*
* Represents an action step within a workflow.
*/
export const WorkflowAction = {
singular: 'workflow-action',
plural: 'workflow-actions',
description: 'An action step within a workflow',
properties: {
// Identity
name: {
type: 'string',
optional: true,
description: 'Action name',
},
// Order
order: {
type: 'number',
description: 'Action order',
},
// Type
type: {
type: 'string',
description: 'Action type',
examples: ['http', 'email', 'slack', 'database', 'transform', 'condition', 'loop', 'delay', 'approval', 'ai'],
},
operation: {
type: 'string',
optional: true,
description: 'Operation to perform',
},
// Configuration
config: {
type: 'json',
optional: true,
description: 'Action configuration',
},
inputs: {
type: 'json',
optional: true,
description: 'Input mappings',
},
// Conditions
condition: {
type: 'string',
optional: true,
description: 'Execution condition',
},
// Error handling
continueOnError: {
type: 'boolean',
optional: true,
description: 'Continue on error',
},
retryOnFailure: {
type: 'boolean',
optional: true,
description: 'Retry on failure',
},
maxRetries: {
type: 'number',
optional: true,
description: 'Max retry attempts',
},
},
relationships: {
workflow: {
type: 'Workflow',
description: 'Parent workflow',
},
nextAction: {
type: 'WorkflowAction',
required: false,
description: 'Next action',
},
},
actions: [
'create',
'update',
'move',
'duplicate',
'delete',
'test',
],
events: [
'created',
'updated',
'moved',
'duplicated',
'deleted',
'executed',
'failed',
],
};
// =============================================================================
// WorkflowRun
// =============================================================================
/**
* WorkflowRun entity
*
* Represents a workflow execution instance.
*/
export const WorkflowRun = {
singular: 'workflow-run',
plural: 'workflow-runs',
description: 'A workflow execution instance',
properties: {
// Status
status: {
type: 'string',
description: 'Run status',
examples: ['pending', 'running', 'completed', 'failed', 'cancelled', 'waiting'],
},
// Timing
startedAt: {
type: 'datetime',
optional: true,
description: 'Start time',
},
completedAt: {
type: 'datetime',
optional: true,
description: 'Completion time',
},
duration: {
type: 'number',
optional: true,
description: 'Duration in milliseconds',
},
// Progress
currentStep: {
type: 'number',
optional: true,
description: 'Current step number',
},
totalSteps: {
type: 'number',
optional: true,
description: 'Total steps',
},
// IO
triggerData: {
type: 'json',
optional: true,
description: 'Trigger input data',
},
output: {
type: 'json',
optional: true,
description: 'Final output',
},
// Error
error: {
type: 'string',
optional: true,
description: 'Error message',
},
errorStep: {
type: 'number',
optional: true,
description: 'Step that failed',
},
// Retry
attempt: {
type: 'number',
optional: true,
description: 'Attempt number',
},
},
relationships: {
workflow: {
type: 'Workflow',
description: 'Parent workflow',
},
triggeredBy: {
type: 'Worker',
required: false,
description: 'Who triggered the run',
},
stepResults: {
type: 'WorkflowStepResult[]',
description: 'Step execution results',
},
},
actions: [
'start',
'pause',
'resume',
'cancel',
'retry',
],
events: [
'started',
'paused',
'resumed',
'completed',
'failed',
'cancelled',
'retried',
],
};
// =============================================================================
// Policy
// =============================================================================
/**
* Policy entity
*
* Represents a business policy or rule.
*/
export const Policy = {
singular: 'policy',
plural: 'policies',
description: 'A business policy or rule',
properties: {
// Identity
name: {
type: 'string',
description: 'Policy name',
},
code: {
type: 'string',
optional: true,
description: 'Policy code',
},
description: {
type: 'string',
optional: true,
description: 'Policy description',
},
// Classification
type: {
type: 'string',
optional: true,
description: 'Policy type',
examples: ['compliance', 'operational', 'security', 'hr', 'financial', 'data'],
},
category: {
type: 'string',
optional: true,
description: 'Policy category',
},
// Content
content: {
type: 'markdown',
optional: true,
description: 'Policy content',
},
rules: {
type: 'string',
array: true,
optional: true,
description: 'Policy rules',
},
// Enforcement
enforcementLevel: {
type: 'string',
optional: true,
description: 'Enforcement level',
examples: ['mandatory', 'recommended', 'optional'],
},
violations: {
type: 'string',
array: true,
optional: true,
description: 'Violation consequences',
},
// Dates
effectiveDate: {
type: 'date',
optional: true,
description: 'Effective date',
},
reviewDate: {
type: 'date',
optional: true,
description: 'Next review date',
},
expirationDate: {
type: 'date',
optional: true,
description: 'Expiration date',
},
// Versioning
version: {
type: 'string',
optional: true,
description: 'Policy version',
},
// Status
status: {
type: 'string',
description: 'Policy status',
examples: ['draft', 'review', 'active', 'superseded', 'archived'],
},
},
relationships: {
owner: {
type: 'Worker',
required: false,
description: 'Policy owner',
},
department: {
type: 'Department',
required: false,
description: 'Owning department',
},
supersedes: {
type: 'Policy',
required: false,
description: 'Previous version superseded',
},
supersededBy: {
type: 'Policy',
required: false,
description: 'New version that supersedes this',
},
},
actions: [
'create',
'update',
'submit',
'approve',
'publish',
'supersede',
'archive',
],
events: [
'created',
'updated',
'submitted',
'approved',
'published',
'superseded',
'archived',
],
};
// =============================================================================
// Exports
// =============================================================================
export const OperationsEntities = {
Process,
ProcessStep,
Workflow,
WorkflowAction,
WorkflowRun,
Policy,
};
export const OperationsCategories = {
processes: ['Process', 'ProcessStep'],
automation: ['Workflow', 'WorkflowAction', 'WorkflowRun'],
governance: ['Policy'],
};
//# sourceMappingURL=operations.js.map