@elevasis/core 0.27.0 → 0.28.0

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.
@@ -1,339 +1,351 @@
1
- import { z } from 'zod'
2
-
3
- // ---------------------------------------------------------------------------
4
- // Semantic class enum — one value per status category.
5
- // Every status entry declares which category it belongs to via semanticClass.
6
- // ---------------------------------------------------------------------------
7
-
8
- export const StatusSemanticClassSchema = z.enum([
9
- 'delivery.task',
10
- 'delivery.project',
11
- 'delivery.milestone',
12
- 'queue',
13
- 'execution',
14
- 'schedule',
15
- 'schedule.run',
16
- 'request'
17
- ])
18
-
19
- // ---------------------------------------------------------------------------
20
- // Status entry schema
21
- // ---------------------------------------------------------------------------
22
-
23
- export const StatusEntrySchema = z.object({
24
- id: z.string().trim().min(1).max(100),
25
- /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
26
- order: z.number(),
27
- label: z.string().trim().min(1).max(120),
28
- semanticClass: StatusSemanticClassSchema,
29
- category: z.string().trim().min(1).max(80).optional()
30
- })
31
-
32
- // ---------------------------------------------------------------------------
33
- // Domain schema — id-keyed map of status entries
34
- // ---------------------------------------------------------------------------
35
-
36
- export const StatusesDomainSchema = z
37
- .record(z.string(), StatusEntrySchema)
38
- .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
39
- message: 'Each status entry id must match its map key'
40
- })
41
- .default({})
42
-
43
- // ---------------------------------------------------------------------------
44
- // Seed — covers all status enums in scope (delivery, queue, execution,
45
- // schedule, schedule.run, request). Delivery project/milestone statuses are
46
- // included here as semantic references; they mirror delivery.ts but live in
47
- // the statuses domain as the vibe-readable registry.
48
- // ---------------------------------------------------------------------------
49
-
50
- export type StatusEntry = z.infer<typeof StatusEntrySchema>
51
- export type StatusesDomain = z.infer<typeof StatusesDomainSchema>
52
-
53
- export const DEFAULT_ORGANIZATION_MODEL_STATUSES: StatusesDomain = {
54
- // --- delivery.task (TaskStatus — 9 values) ---
55
- 'delivery.task.planned': {
56
- id: 'delivery.task.planned',
57
- order: 10,
58
- label: 'Planned',
59
- semanticClass: 'delivery.task',
60
- category: 'delivery'
61
- },
62
- 'delivery.task.in_progress': {
63
- id: 'delivery.task.in_progress',
64
- order: 20,
65
- label: 'In Progress',
66
- semanticClass: 'delivery.task',
67
- category: 'delivery'
68
- },
69
- 'delivery.task.blocked': {
70
- id: 'delivery.task.blocked',
71
- order: 30,
72
- label: 'Blocked',
73
- semanticClass: 'delivery.task',
74
- category: 'delivery'
75
- },
76
- 'delivery.task.submitted': {
77
- id: 'delivery.task.submitted',
78
- order: 40,
79
- label: 'Submitted',
80
- semanticClass: 'delivery.task',
81
- category: 'delivery'
82
- },
83
- 'delivery.task.approved': {
84
- id: 'delivery.task.approved',
85
- order: 50,
86
- label: 'Approved',
87
- semanticClass: 'delivery.task',
88
- category: 'delivery'
89
- },
90
- 'delivery.task.revision_requested': {
91
- id: 'delivery.task.revision_requested',
92
- order: 60,
93
- label: 'Revision Requested',
94
- semanticClass: 'delivery.task',
95
- category: 'delivery'
96
- },
97
- 'delivery.task.rejected': {
98
- id: 'delivery.task.rejected',
99
- order: 70,
100
- label: 'Rejected',
101
- semanticClass: 'delivery.task',
102
- category: 'delivery'
103
- },
104
- 'delivery.task.cancelled': {
105
- id: 'delivery.task.cancelled',
106
- order: 80,
107
- label: 'Cancelled',
108
- semanticClass: 'delivery.task',
109
- category: 'delivery'
110
- },
111
- 'delivery.task.completed': {
112
- id: 'delivery.task.completed',
113
- order: 90,
114
- label: 'Completed',
115
- semanticClass: 'delivery.task',
116
- category: 'delivery'
117
- },
118
-
119
- // --- delivery.project (ProjectStatus — 6 values) ---
120
- 'delivery.project.active': {
121
- id: 'delivery.project.active',
122
- order: 100,
123
- label: 'Active',
124
- semanticClass: 'delivery.project',
125
- category: 'delivery'
126
- },
127
- 'delivery.project.on_track': {
128
- id: 'delivery.project.on_track',
129
- order: 110,
130
- label: 'On Track',
131
- semanticClass: 'delivery.project',
132
- category: 'delivery'
133
- },
134
- 'delivery.project.at_risk': {
135
- id: 'delivery.project.at_risk',
136
- order: 120,
137
- label: 'At Risk',
138
- semanticClass: 'delivery.project',
139
- category: 'delivery'
140
- },
141
- 'delivery.project.blocked': {
142
- id: 'delivery.project.blocked',
143
- order: 130,
144
- label: 'Blocked',
145
- semanticClass: 'delivery.project',
146
- category: 'delivery'
147
- },
148
- 'delivery.project.paused': {
149
- id: 'delivery.project.paused',
150
- order: 140,
151
- label: 'Paused',
152
- semanticClass: 'delivery.project',
153
- category: 'delivery'
154
- },
155
- 'delivery.project.completed': {
156
- id: 'delivery.project.completed',
157
- order: 150,
158
- label: 'Completed',
159
- semanticClass: 'delivery.project',
160
- category: 'delivery'
161
- },
162
-
163
- // --- delivery.milestone (MilestoneStatus — 5 values) ---
164
- 'delivery.milestone.upcoming': {
165
- id: 'delivery.milestone.upcoming',
166
- order: 160,
167
- label: 'Upcoming',
168
- semanticClass: 'delivery.milestone',
169
- category: 'delivery'
170
- },
171
- 'delivery.milestone.in_progress': {
172
- id: 'delivery.milestone.in_progress',
173
- order: 170,
174
- label: 'In Progress',
175
- semanticClass: 'delivery.milestone',
176
- category: 'delivery'
177
- },
178
- 'delivery.milestone.blocked': {
179
- id: 'delivery.milestone.blocked',
180
- order: 180,
181
- label: 'Blocked',
182
- semanticClass: 'delivery.milestone',
183
- category: 'delivery'
184
- },
185
- 'delivery.milestone.overdue': {
186
- id: 'delivery.milestone.overdue',
187
- order: 190,
188
- label: 'Overdue',
189
- semanticClass: 'delivery.milestone',
190
- category: 'delivery'
191
- },
192
- 'delivery.milestone.completed': {
193
- id: 'delivery.milestone.completed',
194
- order: 200,
195
- label: 'Completed',
196
- semanticClass: 'delivery.milestone',
197
- category: 'delivery'
198
- },
199
-
200
- // --- queue (QueueTaskStatus — 5 values, maps hitl/command-queue tasks) ---
201
- 'queue.pending': { id: 'queue.pending', order: 210, label: 'Pending', semanticClass: 'queue', category: 'queue' },
202
- 'queue.processing': {
203
- id: 'queue.processing',
204
- order: 220,
205
- label: 'Processing',
206
- semanticClass: 'queue',
207
- category: 'queue'
208
- },
209
- 'queue.completed': {
210
- id: 'queue.completed',
211
- order: 230,
212
- label: 'Completed',
213
- semanticClass: 'queue',
214
- category: 'queue'
215
- },
216
- 'queue.failed': { id: 'queue.failed', order: 240, label: 'Failed', semanticClass: 'queue', category: 'queue' },
217
- 'queue.expired': { id: 'queue.expired', order: 250, label: 'Expired', semanticClass: 'queue', category: 'queue' },
218
-
219
- // --- execution (ExecutionStatus — 5 values) ---
220
- 'execution.pending': {
221
- id: 'execution.pending',
222
- order: 260,
223
- label: 'Pending',
224
- semanticClass: 'execution',
225
- category: 'execution'
226
- },
227
- 'execution.running': {
228
- id: 'execution.running',
229
- order: 270,
230
- label: 'Running',
231
- semanticClass: 'execution',
232
- category: 'execution'
233
- },
234
- 'execution.completed': {
235
- id: 'execution.completed',
236
- order: 280,
237
- label: 'Completed',
238
- semanticClass: 'execution',
239
- category: 'execution'
240
- },
241
- 'execution.failed': {
242
- id: 'execution.failed',
243
- order: 290,
244
- label: 'Failed',
245
- semanticClass: 'execution',
246
- category: 'execution'
247
- },
248
- 'execution.warning': {
249
- id: 'execution.warning',
250
- order: 300,
251
- label: 'Warning',
252
- semanticClass: 'execution',
253
- category: 'execution'
254
- },
255
-
256
- // --- schedule (schedule status — 4 values) ---
257
- 'schedule.active': {
258
- id: 'schedule.active',
259
- order: 310,
260
- label: 'Active',
261
- semanticClass: 'schedule',
262
- category: 'schedule'
263
- },
264
- 'schedule.paused': {
265
- id: 'schedule.paused',
266
- order: 320,
267
- label: 'Paused',
268
- semanticClass: 'schedule',
269
- category: 'schedule'
270
- },
271
- 'schedule.completed': {
272
- id: 'schedule.completed',
273
- order: 330,
274
- label: 'Completed',
275
- semanticClass: 'schedule',
276
- category: 'schedule'
277
- },
278
- 'schedule.cancelled': {
279
- id: 'schedule.cancelled',
280
- order: 340,
281
- label: 'Cancelled',
282
- semanticClass: 'schedule',
283
- category: 'schedule'
284
- },
285
-
286
- // --- schedule.run (schedule run status — 4 values) ---
287
- 'schedule.run.running': {
288
- id: 'schedule.run.running',
289
- order: 350,
290
- label: 'Running',
291
- semanticClass: 'schedule.run',
292
- category: 'schedule'
293
- },
294
- 'schedule.run.completed': {
295
- id: 'schedule.run.completed',
296
- order: 360,
297
- label: 'Completed',
298
- semanticClass: 'schedule.run',
299
- category: 'schedule'
300
- },
301
- 'schedule.run.failed': {
302
- id: 'schedule.run.failed',
303
- order: 370,
304
- label: 'Failed',
305
- semanticClass: 'schedule.run',
306
- category: 'schedule'
307
- },
308
- 'schedule.run.cancelled': {
309
- id: 'schedule.run.cancelled',
310
- order: 380,
311
- label: 'Cancelled',
312
- semanticClass: 'schedule.run',
313
- category: 'schedule'
314
- },
315
-
316
- // --- request (RequestStatus — 4 values, maps reported_requests) ---
317
- 'request.open': { id: 'request.open', order: 390, label: 'Open', semanticClass: 'request', category: 'request' },
318
- 'request.investigating': {
319
- id: 'request.investigating',
320
- order: 400,
321
- label: 'Investigating',
322
- semanticClass: 'request',
323
- category: 'request'
324
- },
325
- 'request.resolved': {
326
- id: 'request.resolved',
327
- order: 410,
328
- label: 'Resolved',
329
- semanticClass: 'request',
330
- category: 'request'
331
- },
332
- 'request.wont_fix': {
333
- id: 'request.wont_fix',
334
- order: 420,
335
- label: "Won't Fix",
336
- semanticClass: 'request',
337
- category: 'request'
338
- }
339
- }
1
+ import { z } from 'zod'
2
+ import { defineDomainRecord } from '../helpers'
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // Semantic class enum one value per status category.
6
+ // Every status entry declares which category it belongs to via semanticClass.
7
+ // ---------------------------------------------------------------------------
8
+
9
+ export const StatusSemanticClassSchema = z.enum([
10
+ 'delivery.task',
11
+ 'delivery.project',
12
+ 'delivery.milestone',
13
+ 'queue',
14
+ 'execution',
15
+ 'schedule',
16
+ 'schedule.run',
17
+ 'request'
18
+ ])
19
+
20
+ // ---------------------------------------------------------------------------
21
+ // Status entry schema
22
+ // ---------------------------------------------------------------------------
23
+
24
+ export const StatusEntrySchema = z.object({
25
+ id: z.string().trim().min(1).max(100),
26
+ /** Domain-map iteration order. Convention: multiples of 10 (10, 20, 30, ...) to allow easy insertion. */
27
+ order: z.number(),
28
+ label: z.string().trim().min(1).max(120),
29
+ semanticClass: StatusSemanticClassSchema,
30
+ category: z.string().trim().min(1).max(80).optional()
31
+ })
32
+
33
+ // ---------------------------------------------------------------------------
34
+ // Domain schema — id-keyed map of status entries
35
+ // ---------------------------------------------------------------------------
36
+
37
+ export const StatusesDomainSchema = z
38
+ .record(z.string(), StatusEntrySchema)
39
+ .refine((record) => Object.entries(record).every(([key, entry]) => entry.id === key), {
40
+ message: 'Each status entry id must match its map key'
41
+ })
42
+ .default({})
43
+
44
+ // ---------------------------------------------------------------------------
45
+ // Seed covers all status enums in scope (delivery, queue, execution,
46
+ // schedule, schedule.run, request). Delivery project/milestone statuses are
47
+ // included here as semantic references; they mirror delivery.ts but live in
48
+ // the statuses domain as the vibe-readable registry.
49
+ // ---------------------------------------------------------------------------
50
+
51
+ /** Validate and return a single status entry. */
52
+ export function defineStatus(entry: z.input<typeof StatusEntrySchema>): StatusEntry {
53
+ return StatusEntrySchema.parse(entry)
54
+ }
55
+
56
+ /** Validate and return an id-keyed map of status entries. */
57
+ export function defineStatuses(entries: readonly z.input<typeof StatusEntrySchema>[]): StatusesDomain {
58
+ return defineDomainRecord(StatusEntrySchema, entries)
59
+ }
60
+
61
+ export type StatusEntry = z.infer<typeof StatusEntrySchema>
62
+ export type StatusesDomain = z.infer<typeof StatusesDomainSchema>
63
+ export type StatusSemanticClass = z.infer<typeof StatusSemanticClassSchema>
64
+
65
+ export const DEFAULT_ORGANIZATION_MODEL_STATUSES: StatusesDomain = {
66
+ // --- delivery.task (TaskStatus — 9 values) ---
67
+ 'delivery.task.planned': {
68
+ id: 'delivery.task.planned',
69
+ order: 10,
70
+ label: 'Planned',
71
+ semanticClass: 'delivery.task',
72
+ category: 'delivery'
73
+ },
74
+ 'delivery.task.in_progress': {
75
+ id: 'delivery.task.in_progress',
76
+ order: 20,
77
+ label: 'In Progress',
78
+ semanticClass: 'delivery.task',
79
+ category: 'delivery'
80
+ },
81
+ 'delivery.task.blocked': {
82
+ id: 'delivery.task.blocked',
83
+ order: 30,
84
+ label: 'Blocked',
85
+ semanticClass: 'delivery.task',
86
+ category: 'delivery'
87
+ },
88
+ 'delivery.task.submitted': {
89
+ id: 'delivery.task.submitted',
90
+ order: 40,
91
+ label: 'Submitted',
92
+ semanticClass: 'delivery.task',
93
+ category: 'delivery'
94
+ },
95
+ 'delivery.task.approved': {
96
+ id: 'delivery.task.approved',
97
+ order: 50,
98
+ label: 'Approved',
99
+ semanticClass: 'delivery.task',
100
+ category: 'delivery'
101
+ },
102
+ 'delivery.task.revision_requested': {
103
+ id: 'delivery.task.revision_requested',
104
+ order: 60,
105
+ label: 'Revision Requested',
106
+ semanticClass: 'delivery.task',
107
+ category: 'delivery'
108
+ },
109
+ 'delivery.task.rejected': {
110
+ id: 'delivery.task.rejected',
111
+ order: 70,
112
+ label: 'Rejected',
113
+ semanticClass: 'delivery.task',
114
+ category: 'delivery'
115
+ },
116
+ 'delivery.task.cancelled': {
117
+ id: 'delivery.task.cancelled',
118
+ order: 80,
119
+ label: 'Cancelled',
120
+ semanticClass: 'delivery.task',
121
+ category: 'delivery'
122
+ },
123
+ 'delivery.task.completed': {
124
+ id: 'delivery.task.completed',
125
+ order: 90,
126
+ label: 'Completed',
127
+ semanticClass: 'delivery.task',
128
+ category: 'delivery'
129
+ },
130
+
131
+ // --- delivery.project (ProjectStatus — 6 values) ---
132
+ 'delivery.project.active': {
133
+ id: 'delivery.project.active',
134
+ order: 100,
135
+ label: 'Active',
136
+ semanticClass: 'delivery.project',
137
+ category: 'delivery'
138
+ },
139
+ 'delivery.project.on_track': {
140
+ id: 'delivery.project.on_track',
141
+ order: 110,
142
+ label: 'On Track',
143
+ semanticClass: 'delivery.project',
144
+ category: 'delivery'
145
+ },
146
+ 'delivery.project.at_risk': {
147
+ id: 'delivery.project.at_risk',
148
+ order: 120,
149
+ label: 'At Risk',
150
+ semanticClass: 'delivery.project',
151
+ category: 'delivery'
152
+ },
153
+ 'delivery.project.blocked': {
154
+ id: 'delivery.project.blocked',
155
+ order: 130,
156
+ label: 'Blocked',
157
+ semanticClass: 'delivery.project',
158
+ category: 'delivery'
159
+ },
160
+ 'delivery.project.paused': {
161
+ id: 'delivery.project.paused',
162
+ order: 140,
163
+ label: 'Paused',
164
+ semanticClass: 'delivery.project',
165
+ category: 'delivery'
166
+ },
167
+ 'delivery.project.completed': {
168
+ id: 'delivery.project.completed',
169
+ order: 150,
170
+ label: 'Completed',
171
+ semanticClass: 'delivery.project',
172
+ category: 'delivery'
173
+ },
174
+
175
+ // --- delivery.milestone (MilestoneStatus — 5 values) ---
176
+ 'delivery.milestone.upcoming': {
177
+ id: 'delivery.milestone.upcoming',
178
+ order: 160,
179
+ label: 'Upcoming',
180
+ semanticClass: 'delivery.milestone',
181
+ category: 'delivery'
182
+ },
183
+ 'delivery.milestone.in_progress': {
184
+ id: 'delivery.milestone.in_progress',
185
+ order: 170,
186
+ label: 'In Progress',
187
+ semanticClass: 'delivery.milestone',
188
+ category: 'delivery'
189
+ },
190
+ 'delivery.milestone.blocked': {
191
+ id: 'delivery.milestone.blocked',
192
+ order: 180,
193
+ label: 'Blocked',
194
+ semanticClass: 'delivery.milestone',
195
+ category: 'delivery'
196
+ },
197
+ 'delivery.milestone.overdue': {
198
+ id: 'delivery.milestone.overdue',
199
+ order: 190,
200
+ label: 'Overdue',
201
+ semanticClass: 'delivery.milestone',
202
+ category: 'delivery'
203
+ },
204
+ 'delivery.milestone.completed': {
205
+ id: 'delivery.milestone.completed',
206
+ order: 200,
207
+ label: 'Completed',
208
+ semanticClass: 'delivery.milestone',
209
+ category: 'delivery'
210
+ },
211
+
212
+ // --- queue (QueueTaskStatus — 5 values, maps hitl/command-queue tasks) ---
213
+ 'queue.pending': { id: 'queue.pending', order: 210, label: 'Pending', semanticClass: 'queue', category: 'queue' },
214
+ 'queue.processing': {
215
+ id: 'queue.processing',
216
+ order: 220,
217
+ label: 'Processing',
218
+ semanticClass: 'queue',
219
+ category: 'queue'
220
+ },
221
+ 'queue.completed': {
222
+ id: 'queue.completed',
223
+ order: 230,
224
+ label: 'Completed',
225
+ semanticClass: 'queue',
226
+ category: 'queue'
227
+ },
228
+ 'queue.failed': { id: 'queue.failed', order: 240, label: 'Failed', semanticClass: 'queue', category: 'queue' },
229
+ 'queue.expired': { id: 'queue.expired', order: 250, label: 'Expired', semanticClass: 'queue', category: 'queue' },
230
+
231
+ // --- execution (ExecutionStatus — 5 values) ---
232
+ 'execution.pending': {
233
+ id: 'execution.pending',
234
+ order: 260,
235
+ label: 'Pending',
236
+ semanticClass: 'execution',
237
+ category: 'execution'
238
+ },
239
+ 'execution.running': {
240
+ id: 'execution.running',
241
+ order: 270,
242
+ label: 'Running',
243
+ semanticClass: 'execution',
244
+ category: 'execution'
245
+ },
246
+ 'execution.completed': {
247
+ id: 'execution.completed',
248
+ order: 280,
249
+ label: 'Completed',
250
+ semanticClass: 'execution',
251
+ category: 'execution'
252
+ },
253
+ 'execution.failed': {
254
+ id: 'execution.failed',
255
+ order: 290,
256
+ label: 'Failed',
257
+ semanticClass: 'execution',
258
+ category: 'execution'
259
+ },
260
+ 'execution.warning': {
261
+ id: 'execution.warning',
262
+ order: 300,
263
+ label: 'Warning',
264
+ semanticClass: 'execution',
265
+ category: 'execution'
266
+ },
267
+
268
+ // --- schedule (schedule status — 4 values) ---
269
+ 'schedule.active': {
270
+ id: 'schedule.active',
271
+ order: 310,
272
+ label: 'Active',
273
+ semanticClass: 'schedule',
274
+ category: 'schedule'
275
+ },
276
+ 'schedule.paused': {
277
+ id: 'schedule.paused',
278
+ order: 320,
279
+ label: 'Paused',
280
+ semanticClass: 'schedule',
281
+ category: 'schedule'
282
+ },
283
+ 'schedule.completed': {
284
+ id: 'schedule.completed',
285
+ order: 330,
286
+ label: 'Completed',
287
+ semanticClass: 'schedule',
288
+ category: 'schedule'
289
+ },
290
+ 'schedule.cancelled': {
291
+ id: 'schedule.cancelled',
292
+ order: 340,
293
+ label: 'Cancelled',
294
+ semanticClass: 'schedule',
295
+ category: 'schedule'
296
+ },
297
+
298
+ // --- schedule.run (schedule run status — 4 values) ---
299
+ 'schedule.run.running': {
300
+ id: 'schedule.run.running',
301
+ order: 350,
302
+ label: 'Running',
303
+ semanticClass: 'schedule.run',
304
+ category: 'schedule'
305
+ },
306
+ 'schedule.run.completed': {
307
+ id: 'schedule.run.completed',
308
+ order: 360,
309
+ label: 'Completed',
310
+ semanticClass: 'schedule.run',
311
+ category: 'schedule'
312
+ },
313
+ 'schedule.run.failed': {
314
+ id: 'schedule.run.failed',
315
+ order: 370,
316
+ label: 'Failed',
317
+ semanticClass: 'schedule.run',
318
+ category: 'schedule'
319
+ },
320
+ 'schedule.run.cancelled': {
321
+ id: 'schedule.run.cancelled',
322
+ order: 380,
323
+ label: 'Cancelled',
324
+ semanticClass: 'schedule.run',
325
+ category: 'schedule'
326
+ },
327
+
328
+ // --- request (RequestStatus — 4 values, maps reported_requests) ---
329
+ 'request.open': { id: 'request.open', order: 390, label: 'Open', semanticClass: 'request', category: 'request' },
330
+ 'request.investigating': {
331
+ id: 'request.investigating',
332
+ order: 400,
333
+ label: 'Investigating',
334
+ semanticClass: 'request',
335
+ category: 'request'
336
+ },
337
+ 'request.resolved': {
338
+ id: 'request.resolved',
339
+ order: 410,
340
+ label: 'Resolved',
341
+ semanticClass: 'request',
342
+ category: 'request'
343
+ },
344
+ 'request.wont_fix': {
345
+ id: 'request.wont_fix',
346
+ order: 420,
347
+ label: "Won't Fix",
348
+ semanticClass: 'request',
349
+ category: 'request'
350
+ }
351
+ }