@sparkleideas/shared 3.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +323 -0
- package/__tests__/hooks/bash-safety.test.ts +289 -0
- package/__tests__/hooks/file-organization.test.ts +335 -0
- package/__tests__/hooks/git-commit.test.ts +336 -0
- package/__tests__/hooks/index.ts +23 -0
- package/__tests__/hooks/session-hooks.test.ts +357 -0
- package/__tests__/hooks/task-hooks.test.ts +193 -0
- package/docs/EVENTS_IMPLEMENTATION_SUMMARY.md +388 -0
- package/docs/EVENTS_QUICK_REFERENCE.md +470 -0
- package/docs/EVENTS_README.md +352 -0
- package/package.json +39 -0
- package/src/core/config/defaults.ts +207 -0
- package/src/core/config/index.ts +15 -0
- package/src/core/config/loader.ts +271 -0
- package/src/core/config/schema.ts +188 -0
- package/src/core/config/validator.ts +209 -0
- package/src/core/event-bus.ts +236 -0
- package/src/core/index.ts +22 -0
- package/src/core/interfaces/agent.interface.ts +251 -0
- package/src/core/interfaces/coordinator.interface.ts +363 -0
- package/src/core/interfaces/event.interface.ts +267 -0
- package/src/core/interfaces/index.ts +19 -0
- package/src/core/interfaces/memory.interface.ts +332 -0
- package/src/core/interfaces/task.interface.ts +223 -0
- package/src/core/orchestrator/event-coordinator.ts +122 -0
- package/src/core/orchestrator/health-monitor.ts +214 -0
- package/src/core/orchestrator/index.ts +89 -0
- package/src/core/orchestrator/lifecycle-manager.ts +263 -0
- package/src/core/orchestrator/session-manager.ts +279 -0
- package/src/core/orchestrator/task-manager.ts +317 -0
- package/src/events/domain-events.ts +584 -0
- package/src/events/event-store.test.ts +387 -0
- package/src/events/event-store.ts +588 -0
- package/src/events/example-usage.ts +293 -0
- package/src/events/index.ts +90 -0
- package/src/events/projections.ts +561 -0
- package/src/events/state-reconstructor.ts +349 -0
- package/src/events.ts +367 -0
- package/src/hooks/INTEGRATION.md +658 -0
- package/src/hooks/README.md +532 -0
- package/src/hooks/example-usage.ts +499 -0
- package/src/hooks/executor.ts +379 -0
- package/src/hooks/hooks.test.ts +421 -0
- package/src/hooks/index.ts +131 -0
- package/src/hooks/registry.ts +333 -0
- package/src/hooks/safety/bash-safety.ts +604 -0
- package/src/hooks/safety/file-organization.ts +473 -0
- package/src/hooks/safety/git-commit.ts +623 -0
- package/src/hooks/safety/index.ts +46 -0
- package/src/hooks/session-hooks.ts +559 -0
- package/src/hooks/task-hooks.ts +513 -0
- package/src/hooks/types.ts +357 -0
- package/src/hooks/verify-exports.test.ts +125 -0
- package/src/index.ts +195 -0
- package/src/mcp/connection-pool.ts +438 -0
- package/src/mcp/index.ts +183 -0
- package/src/mcp/server.ts +774 -0
- package/src/mcp/session-manager.ts +428 -0
- package/src/mcp/tool-registry.ts +566 -0
- package/src/mcp/transport/http.ts +557 -0
- package/src/mcp/transport/index.ts +294 -0
- package/src/mcp/transport/stdio.ts +324 -0
- package/src/mcp/transport/websocket.ts +484 -0
- package/src/mcp/types.ts +565 -0
- package/src/plugin-interface.ts +663 -0
- package/src/plugin-loader.ts +638 -0
- package/src/plugin-registry.ts +604 -0
- package/src/plugins/index.ts +34 -0
- package/src/plugins/official/hive-mind-plugin.ts +330 -0
- package/src/plugins/official/index.ts +24 -0
- package/src/plugins/official/maestro-plugin.ts +508 -0
- package/src/plugins/types.ts +108 -0
- package/src/resilience/bulkhead.ts +277 -0
- package/src/resilience/circuit-breaker.ts +326 -0
- package/src/resilience/index.ts +26 -0
- package/src/resilience/rate-limiter.ts +420 -0
- package/src/resilience/retry.ts +224 -0
- package/src/security/index.ts +39 -0
- package/src/security/input-validation.ts +265 -0
- package/src/security/secure-random.ts +159 -0
- package/src/services/index.ts +16 -0
- package/src/services/v3-progress.service.ts +505 -0
- package/src/types/agent.types.ts +144 -0
- package/src/types/index.ts +22 -0
- package/src/types/mcp.types.ts +300 -0
- package/src/types/memory.types.ts +263 -0
- package/src/types/swarm.types.ts +255 -0
- package/src/types/task.types.ts +205 -0
- package/src/types.ts +367 -0
- package/src/utils/secure-logger.d.ts +69 -0
- package/src/utils/secure-logger.d.ts.map +1 -0
- package/src/utils/secure-logger.js +208 -0
- package/src/utils/secure-logger.js.map +1 -0
- package/src/utils/secure-logger.ts +257 -0
- package/tmp.json +0 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V3 Swarm Types
|
|
3
|
+
* Modernized type system for swarm coordination
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { ISwarmConfig, ISwarmState, SwarmTopology, CoordinationStatus } from '../core/interfaces/coordinator.interface.js';
|
|
7
|
+
import type { IAgent } from '../core/interfaces/agent.interface.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Swarm initialization options
|
|
11
|
+
*/
|
|
12
|
+
export interface SwarmInitOptions extends ISwarmConfig {
|
|
13
|
+
name?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
initialAgents?: string[];
|
|
16
|
+
warmup?: boolean;
|
|
17
|
+
warmupTasks?: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Swarm initialization result
|
|
22
|
+
*/
|
|
23
|
+
export interface SwarmInitResult {
|
|
24
|
+
state: ISwarmState;
|
|
25
|
+
agents: IAgent[];
|
|
26
|
+
startupTime: number;
|
|
27
|
+
ready: boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Swarm scaling options
|
|
32
|
+
*/
|
|
33
|
+
export interface SwarmScaleOptions {
|
|
34
|
+
targetSize: number;
|
|
35
|
+
agentType?: string;
|
|
36
|
+
timeout?: number;
|
|
37
|
+
graceful?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Swarm scaling result
|
|
42
|
+
*/
|
|
43
|
+
export interface SwarmScaleResult {
|
|
44
|
+
previousSize: number;
|
|
45
|
+
currentSize: number;
|
|
46
|
+
agentsAdded: string[];
|
|
47
|
+
agentsRemoved: string[];
|
|
48
|
+
duration: number;
|
|
49
|
+
success: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Swarm coordination message
|
|
54
|
+
*/
|
|
55
|
+
export interface SwarmMessage<T = unknown> {
|
|
56
|
+
id: string;
|
|
57
|
+
type: string;
|
|
58
|
+
source: string;
|
|
59
|
+
target?: string | 'broadcast';
|
|
60
|
+
payload: T;
|
|
61
|
+
timestamp: Date;
|
|
62
|
+
correlationId?: string;
|
|
63
|
+
replyTo?: string;
|
|
64
|
+
ttl?: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Swarm consensus request
|
|
69
|
+
*/
|
|
70
|
+
export interface ConsensusRequest<T = unknown> {
|
|
71
|
+
topic: string;
|
|
72
|
+
options: T[];
|
|
73
|
+
requiredVotes: number | 'majority' | 'all';
|
|
74
|
+
timeout: number;
|
|
75
|
+
voters?: string[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Swarm consensus response
|
|
80
|
+
*/
|
|
81
|
+
export interface ConsensusResponse<T = unknown> {
|
|
82
|
+
topic: string;
|
|
83
|
+
decision: T | null;
|
|
84
|
+
votes: Map<string, T>;
|
|
85
|
+
consensus: boolean;
|
|
86
|
+
votingDuration: number;
|
|
87
|
+
participatingAgents: string[];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Distributed lock state
|
|
92
|
+
*/
|
|
93
|
+
export interface DistributedLock {
|
|
94
|
+
resourceId: string;
|
|
95
|
+
holderId: string;
|
|
96
|
+
acquiredAt: Date;
|
|
97
|
+
expiresAt: Date;
|
|
98
|
+
renewCount: number;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Lock acquisition result
|
|
103
|
+
*/
|
|
104
|
+
export interface LockAcquisitionResult {
|
|
105
|
+
acquired: boolean;
|
|
106
|
+
lock?: DistributedLock;
|
|
107
|
+
waitTime?: number;
|
|
108
|
+
error?: Error;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Deadlock detection result
|
|
113
|
+
*/
|
|
114
|
+
export interface DeadlockDetectionResult {
|
|
115
|
+
detected: boolean;
|
|
116
|
+
agents: string[];
|
|
117
|
+
resources: string[];
|
|
118
|
+
cycle?: string[][];
|
|
119
|
+
suggestedResolution?: string;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Swarm metrics
|
|
124
|
+
*/
|
|
125
|
+
export interface SwarmMetrics {
|
|
126
|
+
topology: SwarmTopology;
|
|
127
|
+
status: CoordinationStatus;
|
|
128
|
+
agentCount: number;
|
|
129
|
+
activeAgentCount: number;
|
|
130
|
+
taskCount: number;
|
|
131
|
+
completedTasks: number;
|
|
132
|
+
failedTasks: number;
|
|
133
|
+
throughput: number;
|
|
134
|
+
avgLatencyMs: number;
|
|
135
|
+
p95LatencyMs: number;
|
|
136
|
+
p99LatencyMs: number;
|
|
137
|
+
successRate: number;
|
|
138
|
+
resourceUtilization: number;
|
|
139
|
+
messagesSent: number;
|
|
140
|
+
messagesReceived: number;
|
|
141
|
+
consensusRounds: number;
|
|
142
|
+
locksAcquired: number;
|
|
143
|
+
deadlocksDetected: number;
|
|
144
|
+
uptime: number;
|
|
145
|
+
timestamp: Date;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Swarm event payloads
|
|
150
|
+
*/
|
|
151
|
+
export interface SwarmEventPayloads {
|
|
152
|
+
'swarm:initialized': {
|
|
153
|
+
state: ISwarmState;
|
|
154
|
+
config: ISwarmConfig;
|
|
155
|
+
};
|
|
156
|
+
'swarm:scaled': {
|
|
157
|
+
result: SwarmScaleResult;
|
|
158
|
+
};
|
|
159
|
+
'swarm:topology:changed': {
|
|
160
|
+
previousTopology: SwarmTopology;
|
|
161
|
+
currentTopology: SwarmTopology;
|
|
162
|
+
};
|
|
163
|
+
'swarm:status:changed': {
|
|
164
|
+
previousStatus: CoordinationStatus;
|
|
165
|
+
currentStatus: CoordinationStatus;
|
|
166
|
+
};
|
|
167
|
+
'swarm:message:sent': {
|
|
168
|
+
message: SwarmMessage;
|
|
169
|
+
};
|
|
170
|
+
'swarm:message:received': {
|
|
171
|
+
message: SwarmMessage;
|
|
172
|
+
};
|
|
173
|
+
'swarm:consensus:started': {
|
|
174
|
+
request: ConsensusRequest;
|
|
175
|
+
};
|
|
176
|
+
'swarm:consensus:completed': {
|
|
177
|
+
response: ConsensusResponse;
|
|
178
|
+
};
|
|
179
|
+
'swarm:lock:acquired': {
|
|
180
|
+
lock: DistributedLock;
|
|
181
|
+
};
|
|
182
|
+
'swarm:lock:released': {
|
|
183
|
+
resourceId: string;
|
|
184
|
+
holderId: string;
|
|
185
|
+
duration: number;
|
|
186
|
+
};
|
|
187
|
+
'swarm:deadlock:detected': {
|
|
188
|
+
result: DeadlockDetectionResult;
|
|
189
|
+
};
|
|
190
|
+
'swarm:shutdown': {
|
|
191
|
+
reason: string;
|
|
192
|
+
graceful: boolean;
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Topology configuration presets
|
|
198
|
+
*/
|
|
199
|
+
export const TopologyPresets: Record<SwarmTopology, Partial<ISwarmConfig>> = {
|
|
200
|
+
hierarchical: {
|
|
201
|
+
topology: 'hierarchical',
|
|
202
|
+
coordination: {
|
|
203
|
+
consensusRequired: false,
|
|
204
|
+
timeoutMs: 5000,
|
|
205
|
+
retryPolicy: { maxRetries: 3, backoffMs: 1000 }
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
mesh: {
|
|
209
|
+
topology: 'mesh',
|
|
210
|
+
coordination: {
|
|
211
|
+
consensusRequired: true,
|
|
212
|
+
timeoutMs: 10000,
|
|
213
|
+
retryPolicy: { maxRetries: 5, backoffMs: 500 }
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
ring: {
|
|
217
|
+
topology: 'ring',
|
|
218
|
+
coordination: {
|
|
219
|
+
consensusRequired: true,
|
|
220
|
+
timeoutMs: 8000,
|
|
221
|
+
retryPolicy: { maxRetries: 4, backoffMs: 750 }
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
star: {
|
|
225
|
+
topology: 'star',
|
|
226
|
+
coordination: {
|
|
227
|
+
consensusRequired: false,
|
|
228
|
+
timeoutMs: 3000,
|
|
229
|
+
retryPolicy: { maxRetries: 2, backoffMs: 500 }
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
adaptive: {
|
|
233
|
+
topology: 'adaptive',
|
|
234
|
+
autoScale: {
|
|
235
|
+
enabled: true,
|
|
236
|
+
minAgents: 1,
|
|
237
|
+
maxAgents: 20,
|
|
238
|
+
scaleUpThreshold: 0.8,
|
|
239
|
+
scaleDownThreshold: 0.3
|
|
240
|
+
},
|
|
241
|
+
coordination: {
|
|
242
|
+
consensusRequired: true,
|
|
243
|
+
timeoutMs: 10000,
|
|
244
|
+
retryPolicy: { maxRetries: 5, backoffMs: 500 }
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
'hierarchical-mesh': {
|
|
248
|
+
topology: 'hierarchical-mesh',
|
|
249
|
+
coordination: {
|
|
250
|
+
consensusRequired: true,
|
|
251
|
+
timeoutMs: 8000,
|
|
252
|
+
retryPolicy: { maxRetries: 4, backoffMs: 750 }
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
};
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V3 Task Types
|
|
3
|
+
* Modernized type system with strict TypeScript
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { ITask, ITaskResult, TaskStatus, TaskPriority } from '../core/interfaces/task.interface.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Task creation input
|
|
10
|
+
*/
|
|
11
|
+
export interface TaskInput {
|
|
12
|
+
type: string;
|
|
13
|
+
description: string;
|
|
14
|
+
priority?: number | TaskPriority;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
assignedAgent?: string;
|
|
17
|
+
input?: Record<string, unknown>;
|
|
18
|
+
metadata?: TaskMetadata;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Task metadata for additional context
|
|
23
|
+
*/
|
|
24
|
+
export interface TaskMetadata {
|
|
25
|
+
requiredCapabilities?: string[];
|
|
26
|
+
retryCount?: number;
|
|
27
|
+
maxRetries?: number;
|
|
28
|
+
critical?: boolean;
|
|
29
|
+
parentTaskId?: string;
|
|
30
|
+
childTaskIds?: string[];
|
|
31
|
+
tags?: string[];
|
|
32
|
+
deadline?: Date;
|
|
33
|
+
estimatedDuration?: number;
|
|
34
|
+
source?: string;
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Task execution context
|
|
40
|
+
*/
|
|
41
|
+
export interface TaskExecutionContext {
|
|
42
|
+
task: ITask;
|
|
43
|
+
agentId: string;
|
|
44
|
+
startTime: Date;
|
|
45
|
+
timeout: number;
|
|
46
|
+
attempt: number;
|
|
47
|
+
maxAttempts: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Task execution result - extended
|
|
52
|
+
*/
|
|
53
|
+
export interface TaskExecutionResult extends ITaskResult {
|
|
54
|
+
context: TaskExecutionContext;
|
|
55
|
+
logs?: string[];
|
|
56
|
+
artifacts?: TaskArtifact[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Task artifact - file or data produced by task
|
|
61
|
+
*/
|
|
62
|
+
export interface TaskArtifact {
|
|
63
|
+
id: string;
|
|
64
|
+
name: string;
|
|
65
|
+
type: 'file' | 'data' | 'log' | 'metric';
|
|
66
|
+
path?: string;
|
|
67
|
+
data?: unknown;
|
|
68
|
+
size?: number;
|
|
69
|
+
createdAt: Date;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Task queue configuration
|
|
74
|
+
*/
|
|
75
|
+
export interface TaskQueueConfig {
|
|
76
|
+
maxSize: number;
|
|
77
|
+
priorityLevels: number;
|
|
78
|
+
defaultTimeout: number;
|
|
79
|
+
batchSize: number;
|
|
80
|
+
processingInterval: number;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Task assignment strategy configuration
|
|
85
|
+
*/
|
|
86
|
+
export interface TaskAssignmentConfig {
|
|
87
|
+
strategy: 'round-robin' | 'least-loaded' | 'capability-match' | 'priority-based' | 'custom';
|
|
88
|
+
loadBalancing: boolean;
|
|
89
|
+
stickyAssignment: boolean;
|
|
90
|
+
capabilityWeight: number;
|
|
91
|
+
loadWeight: number;
|
|
92
|
+
priorityWeight: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Task retry policy
|
|
97
|
+
*/
|
|
98
|
+
export interface TaskRetryPolicy {
|
|
99
|
+
maxRetries: number;
|
|
100
|
+
backoffMs: number;
|
|
101
|
+
backoffMultiplier: number;
|
|
102
|
+
maxBackoffMs: number;
|
|
103
|
+
retryableErrors?: string[];
|
|
104
|
+
nonRetryableErrors?: string[];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Task filter for queries
|
|
109
|
+
*/
|
|
110
|
+
export interface TaskFilter {
|
|
111
|
+
status?: TaskStatus | TaskStatus[];
|
|
112
|
+
type?: string | string[];
|
|
113
|
+
assignedAgent?: string;
|
|
114
|
+
priority?: number | { min?: number; max?: number };
|
|
115
|
+
createdAfter?: Date;
|
|
116
|
+
createdBefore?: Date;
|
|
117
|
+
tags?: string[];
|
|
118
|
+
hasParent?: boolean;
|
|
119
|
+
parentTaskId?: string;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Task sort options
|
|
124
|
+
*/
|
|
125
|
+
export interface TaskSortOptions {
|
|
126
|
+
field: 'priority' | 'createdAt' | 'startedAt' | 'completedAt' | 'status';
|
|
127
|
+
direction: 'asc' | 'desc';
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Task query options
|
|
132
|
+
*/
|
|
133
|
+
export interface TaskQueryOptions {
|
|
134
|
+
filter?: TaskFilter;
|
|
135
|
+
sort?: TaskSortOptions;
|
|
136
|
+
limit?: number;
|
|
137
|
+
offset?: number;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Task event payloads
|
|
142
|
+
*/
|
|
143
|
+
export interface TaskEventPayloads {
|
|
144
|
+
'task:created': {
|
|
145
|
+
task: ITask;
|
|
146
|
+
};
|
|
147
|
+
'task:assigned': {
|
|
148
|
+
taskId: string;
|
|
149
|
+
agentId: string;
|
|
150
|
+
};
|
|
151
|
+
'task:started': {
|
|
152
|
+
taskId: string;
|
|
153
|
+
agentId: string;
|
|
154
|
+
startTime: Date;
|
|
155
|
+
};
|
|
156
|
+
'task:completed': {
|
|
157
|
+
taskId: string;
|
|
158
|
+
result: ITaskResult;
|
|
159
|
+
};
|
|
160
|
+
'task:failed': {
|
|
161
|
+
taskId: string;
|
|
162
|
+
error: Error;
|
|
163
|
+
retryable: boolean;
|
|
164
|
+
};
|
|
165
|
+
'task:cancelled': {
|
|
166
|
+
taskId: string;
|
|
167
|
+
reason: string;
|
|
168
|
+
};
|
|
169
|
+
'task:timeout': {
|
|
170
|
+
taskId: string;
|
|
171
|
+
timeoutMs: number;
|
|
172
|
+
};
|
|
173
|
+
'task:retry': {
|
|
174
|
+
taskId: string;
|
|
175
|
+
attempt: number;
|
|
176
|
+
maxAttempts: number;
|
|
177
|
+
error: Error;
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Priority value conversion
|
|
183
|
+
*/
|
|
184
|
+
export function priorityToNumber(priority: number | TaskPriority): number {
|
|
185
|
+
if (typeof priority === 'number') {
|
|
186
|
+
return Math.max(0, Math.min(100, priority));
|
|
187
|
+
}
|
|
188
|
+
switch (priority) {
|
|
189
|
+
case 'critical': return 100;
|
|
190
|
+
case 'high': return 75;
|
|
191
|
+
case 'medium': return 50;
|
|
192
|
+
case 'low': return 25;
|
|
193
|
+
default: return 50;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Priority number to label
|
|
199
|
+
*/
|
|
200
|
+
export function numberToPriority(value: number): TaskPriority {
|
|
201
|
+
if (value >= 90) return 'critical';
|
|
202
|
+
if (value >= 70) return 'high';
|
|
203
|
+
if (value >= 40) return 'medium';
|
|
204
|
+
return 'low';
|
|
205
|
+
}
|