@locusai/shared 0.1.7 → 0.2.2

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.
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ import { BaseEntitySchema } from "../common";
3
+
4
+ export const OrganizationSchema = BaseEntitySchema.extend({
5
+ name: z.string().min(1, "Name is required").max(100),
6
+ slug: z
7
+ .string()
8
+ .min(1, "Slug is required")
9
+ .regex(/^[a-z0-9-]+$/, "Slug must be lowercase alphanumeric with hyphens"),
10
+ avatarUrl: z
11
+ .string()
12
+ .url("Invalid avatar URL")
13
+ .nullable()
14
+ .optional()
15
+ .or(z.literal("")),
16
+ });
17
+
18
+ export type Organization = z.infer<typeof OrganizationSchema>;
19
+
20
+ export const CreateOrganizationSchema = z.object({
21
+ name: z.string().min(1, "Name is required").max(100),
22
+ slug: z
23
+ .string()
24
+ .min(1, "Slug is required")
25
+ .regex(/^[a-z0-9-]+$/, "Slug must be lowercase alphanumeric with hyphens"),
26
+ avatarUrl: z.string().url("Invalid avatar URL").optional().or(z.literal("")),
27
+ });
28
+
29
+ export type CreateOrganization = z.infer<typeof CreateOrganizationSchema>;
30
+
31
+ export const UpdateOrganizationSchema = OrganizationSchema.partial().omit({
32
+ id: true,
33
+ slug: true,
34
+ createdAt: true,
35
+ updatedAt: true,
36
+ });
37
+
38
+ export type UpdateOrganization = z.infer<typeof UpdateOrganizationSchema>;
39
+
40
+ export const AddMemberSchema = z.object({
41
+ userId: z.string().uuid("Invalid User ID"),
42
+ role: z.enum(["ADMIN", "MEMBER"]).default("MEMBER"),
43
+ });
44
+
45
+ export type AddMember = z.infer<typeof AddMemberSchema>;
46
+
47
+ export const MembershipWithUserSchema = z.object({
48
+ id: z.string().uuid(),
49
+ userId: z.string().uuid(),
50
+ orgId: z.string().uuid(),
51
+ role: z.string(),
52
+ createdAt: z.number(),
53
+ user: z.object({
54
+ id: z.string().uuid(),
55
+ email: z.string().email(),
56
+ name: z.string(),
57
+ avatarUrl: z.string().url().nullable().optional(),
58
+ }),
59
+ });
60
+
61
+ export type MembershipWithUser = z.infer<typeof MembershipWithUserSchema>;
62
+
63
+ // ============================================================================
64
+ // Parameter & Query Schemas
65
+ // ============================================================================
66
+
67
+ export const OrgIdParamSchema = z.object({
68
+ orgId: z.string().uuid("Invalid Organization ID"),
69
+ });
70
+
71
+ export type OrgIdParam = z.infer<typeof OrgIdParamSchema>;
72
+
73
+ export const MembershipIdParamSchema = z.object({
74
+ id: z.string().uuid("Invalid Membership ID"),
75
+ });
76
+
77
+ export type MembershipIdParam = z.infer<typeof MembershipIdParamSchema>;
78
+
79
+ // ============================================================================
80
+ // Response Schemas
81
+ // ============================================================================
82
+
83
+ export const OrganizationResponseSchema = z.object({
84
+ organization: OrganizationSchema,
85
+ });
86
+
87
+ export type OrganizationResponse = z.infer<typeof OrganizationResponseSchema>;
88
+
89
+ export const OrganizationsResponseSchema = z.object({
90
+ organizations: z.array(OrganizationSchema),
91
+ });
92
+
93
+ export type OrganizationsResponse = z.infer<typeof OrganizationsResponseSchema>;
94
+
95
+ export const MembersResponseSchema = z.object({
96
+ members: z.array(MembershipWithUserSchema),
97
+ });
98
+
99
+ export type MembersResponse = z.infer<typeof MembersResponseSchema>;
100
+
101
+ export const MembershipResponseSchema = z.object({
102
+ membership: MembershipWithUserSchema,
103
+ });
104
+
105
+ export type MembershipResponse = z.infer<typeof MembershipResponseSchema>;
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ import { BaseEntitySchema } from "../common";
3
+ import { SprintStatus } from "../enums";
4
+
5
+ export const SprintSchema = BaseEntitySchema.extend({
6
+ workspaceId: z.string().uuid().nullable().optional(),
7
+ name: z.string().min(1, "Name is required").max(100),
8
+ status: z.nativeEnum(SprintStatus),
9
+ startDate: z.union([z.date(), z.number()]).nullable().optional(),
10
+ endDate: z.union([z.date(), z.number()]).nullable().optional(),
11
+ mindmap: z.string().nullable().optional(),
12
+ mindmapUpdatedAt: z.union([z.date(), z.number()]).nullable().optional(),
13
+ });
14
+
15
+ export type Sprint = z.infer<typeof SprintSchema>;
16
+
17
+ export const CreateSprintSchema = z.object({
18
+ name: z.string().min(1, "Name is required").max(100),
19
+ startDate: z.union([z.coerce.date(), z.number()]).optional(),
20
+ endDate: z.union([z.coerce.date(), z.number()]).optional(),
21
+ });
22
+
23
+ export type CreateSprint = z.infer<typeof CreateSprintSchema>;
24
+
25
+ export const UpdateSprintSchema = SprintSchema.partial()
26
+ .omit({
27
+ id: true,
28
+ createdAt: true,
29
+ updatedAt: true,
30
+ })
31
+ .extend({
32
+ name: z.string().min(1).max(100).optional(),
33
+ startDate: z.union([z.coerce.date(), z.number()]).optional().nullable(),
34
+ endDate: z.union([z.coerce.date(), z.number()]).optional().nullable(),
35
+ mindmapUpdatedAt: z
36
+ .union([z.coerce.date(), z.number()])
37
+ .optional()
38
+ .nullable(),
39
+ });
40
+
41
+ export type UpdateSprint = z.infer<typeof UpdateSprintSchema>;
42
+
43
+ // ============================================================================
44
+ // Parameter & Query Schemas
45
+ // ============================================================================
46
+
47
+ export const SprintIdParamSchema = z.object({
48
+ id: z.string().uuid("Invalid Sprint ID"),
49
+ });
50
+
51
+ export type SprintIdParam = z.infer<typeof SprintIdParamSchema>;
52
+
53
+ export const SprintQuerySchema = z.object({});
54
+
55
+ export type SprintQuery = z.infer<typeof SprintQuerySchema>;
56
+
57
+ // ============================================================================
58
+ // Response Schemas
59
+ // ============================================================================
60
+
61
+ export const SprintResponseSchema = z.object({
62
+ sprint: SprintSchema,
63
+ });
64
+
65
+ export type SprintResponse = z.infer<typeof SprintResponseSchema>;
66
+
67
+ export const SprintsResponseSchema = z.object({
68
+ sprints: z.array(SprintSchema),
69
+ });
70
+
71
+ export type SprintsResponse = z.infer<typeof SprintsResponseSchema>;
@@ -0,0 +1,110 @@
1
+ import { z } from "zod";
2
+ import { BaseEntitySchema } from "../common";
3
+ import { AssigneeRole, TaskPriority, TaskStatus } from "../enums";
4
+ import { CommentSchema, EventSchema } from "./activity";
5
+ import { DocSchema } from "./doc";
6
+
7
+ export const AcceptanceItemSchema = z.object({
8
+ id: z.string(),
9
+ text: z.string(),
10
+ done: z.boolean(),
11
+ });
12
+
13
+ export type AcceptanceItem = z.infer<typeof AcceptanceItemSchema>;
14
+
15
+ export const TaskSchema = BaseEntitySchema.extend({
16
+ workspaceId: z.string().uuid().nullable().optional(),
17
+ title: z.string().min(1, "Title is required").max(200),
18
+ description: z.string().default(""),
19
+ status: z.nativeEnum(TaskStatus).default(TaskStatus.BACKLOG),
20
+ priority: z.nativeEnum(TaskPriority).default(TaskPriority.MEDIUM),
21
+ labels: z.array(z.string()).default([]),
22
+ assigneeRole: z.nativeEnum(AssigneeRole).nullable().optional(),
23
+ /** Agent ID or user identifier - not necessarily a UUID */
24
+ assignedTo: z.string().nullable().optional(),
25
+ sprintId: z.string().uuid().nullable().optional(),
26
+ parentId: z.string().uuid().nullable().optional(),
27
+ dueDate: z.union([z.date(), z.number()]).nullable().optional(),
28
+ acceptanceChecklist: z.array(AcceptanceItemSchema).default([]),
29
+ comments: z.array(CommentSchema).default([]),
30
+ activityLog: z.array(EventSchema).default([]),
31
+ docs: z.array(DocSchema).default([]),
32
+ });
33
+
34
+ export type Task = z.infer<typeof TaskSchema>;
35
+
36
+ export const CreateTaskSchema = z.object({
37
+ title: z.string().min(1, "Title is required").max(200),
38
+ description: z.string().optional().default(""),
39
+ status: z.nativeEnum(TaskStatus).optional().default(TaskStatus.BACKLOG),
40
+ priority: z.nativeEnum(TaskPriority).optional().default(TaskPriority.MEDIUM),
41
+ labels: z.array(z.string()).optional().default([]),
42
+ assigneeRole: z.nativeEnum(AssigneeRole).optional(),
43
+ assignedTo: z.string().nullable().optional(),
44
+ dueDate: z.union([z.date(), z.number()]).nullable().optional(),
45
+ parentId: z.string().uuid().nullable().optional(),
46
+ sprintId: z.string().uuid().nullable().optional(),
47
+ acceptanceChecklist: z.array(AcceptanceItemSchema).optional(),
48
+ docIds: z.array(z.string().uuid()).optional(),
49
+ });
50
+
51
+ export type CreateTask = z.infer<typeof CreateTaskSchema>;
52
+
53
+ export const UpdateTaskSchema = TaskSchema.partial()
54
+ .omit({
55
+ id: true,
56
+ workspaceId: true,
57
+ createdAt: true,
58
+ updatedAt: true,
59
+ })
60
+ .extend({
61
+ title: z.string().min(1).max(200).optional(),
62
+ acceptanceChecklist: z.array(AcceptanceItemSchema).optional(),
63
+ docIds: z.array(z.string().uuid()).optional(),
64
+ });
65
+
66
+ export type UpdateTask = z.infer<typeof UpdateTaskSchema>;
67
+
68
+ export const AddCommentSchema = z.object({
69
+ author: z.string().min(1, "Author is required"),
70
+ text: z.string().min(1, "Comment text is required"),
71
+ });
72
+
73
+ export type AddComment = z.infer<typeof AddCommentSchema>;
74
+
75
+ export const DispatchTaskSchema = z.object({
76
+ workerId: z.string().optional(),
77
+ sprintId: z.string().uuid().optional().nullable(),
78
+ });
79
+
80
+ export type DispatchTask = z.infer<typeof DispatchTaskSchema>;
81
+
82
+ // ============================================================================
83
+ // Parameter & Query Schemas
84
+ // ============================================================================
85
+
86
+ export const TaskIdParamSchema = z.object({
87
+ id: z.string().uuid("Invalid Task ID"),
88
+ });
89
+
90
+ export type TaskIdParam = z.infer<typeof TaskIdParamSchema>;
91
+
92
+ export const TaskQuerySchema = z.object({});
93
+
94
+ export type TaskQuery = z.infer<typeof TaskQuerySchema>;
95
+
96
+ // ============================================================================
97
+ // Response Schemas
98
+ // ============================================================================
99
+
100
+ export const TaskResponseSchema = z.object({
101
+ task: TaskSchema,
102
+ });
103
+
104
+ export type TaskResponse = z.infer<typeof TaskResponseSchema>;
105
+
106
+ export const TasksResponseSchema = z.object({
107
+ tasks: z.array(TaskSchema),
108
+ });
109
+
110
+ export type TasksResponse = z.infer<typeof TasksResponseSchema>;
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ import { BaseEntitySchema } from "../common";
3
+ import { UserRole } from "../enums";
4
+
5
+ export const UserSchema = BaseEntitySchema.extend({
6
+ email: z.string().email(),
7
+ name: z.string().min(1),
8
+ avatarUrl: z.string().url().nullable().optional(),
9
+ role: z.nativeEnum(UserRole),
10
+ orgId: z.string().uuid().optional().nullable(),
11
+ workspaceId: z.string().uuid().optional().nullable(),
12
+ companyName: z.string().optional(),
13
+ userRole: z.string().optional(),
14
+ teamSize: z.string().optional(),
15
+ onboardingCompleted: z.boolean().default(false),
16
+ emailVerified: z.boolean().default(false),
17
+ });
18
+
19
+ export type User = z.infer<typeof UserSchema>;
20
+
21
+ export const CreateUserSchema = z.object({
22
+ email: z.string().email(),
23
+ name: z.string().min(1),
24
+ });
25
+
26
+ export type CreateUser = z.infer<typeof CreateUserSchema>;
27
+
28
+ export const UpdateUserSchema = UserSchema.partial().omit({
29
+ id: true,
30
+ email: true,
31
+ createdAt: true,
32
+ updatedAt: true,
33
+ });
34
+
35
+ export type UpdateUser = z.infer<typeof UpdateUserSchema>;
@@ -0,0 +1,90 @@
1
+ import { z } from "zod";
2
+ import { BaseEntitySchema } from "../common";
3
+
4
+ export const WorkspaceSchema = BaseEntitySchema.extend({
5
+ orgId: z.string().uuid(),
6
+ name: z.string().min(1, "Name is required").max(100),
7
+ slug: z
8
+ .string()
9
+ .min(1, "Slug is required")
10
+ .regex(/^[a-z0-9-]+$/, "Slug must be lowercase alphanumeric with hyphens"),
11
+ });
12
+
13
+ export type Workspace = z.infer<typeof WorkspaceSchema>;
14
+
15
+ export const CreateWorkspaceSchema = z.object({
16
+ name: z.string().min(1, "Name is required").max(100),
17
+ slug: z
18
+ .string()
19
+ .min(1, "Slug is required")
20
+ .regex(/^[a-z0-9-]+$/, "Slug must be lowercase alphanumeric with hyphens")
21
+ .optional(),
22
+ });
23
+
24
+ export type CreateWorkspace = z.infer<typeof CreateWorkspaceSchema>;
25
+
26
+ export const UpdateWorkspaceSchema = WorkspaceSchema.partial().omit({
27
+ id: true,
28
+ orgId: true,
29
+ slug: true,
30
+ createdAt: true,
31
+ updatedAt: true,
32
+ });
33
+
34
+ export type UpdateWorkspace = z.infer<typeof UpdateWorkspaceSchema>;
35
+
36
+ export const AddWorkspaceMemberSchema = z.object({
37
+ userId: z.string().uuid("Invalid User ID"),
38
+ role: z.string().optional(),
39
+ });
40
+
41
+ export type AddWorkspaceMember = z.infer<typeof AddWorkspaceMemberSchema>;
42
+
43
+ // ============================================================================
44
+ // Parameter & Query Schemas
45
+ // ============================================================================
46
+
47
+ export const WorkspaceIdParamSchema = z.object({
48
+ workspaceId: z.string().uuid("Invalid Workspace ID"),
49
+ });
50
+
51
+ export type WorkspaceIdParam = z.infer<typeof WorkspaceIdParamSchema>;
52
+
53
+ export const WorkspaceAndUserParamSchema = z.object({
54
+ workspaceId: z.string().uuid("Invalid Workspace ID"),
55
+ userId: z.string().uuid("Invalid User ID"),
56
+ });
57
+
58
+ export type WorkspaceAndUserParam = z.infer<typeof WorkspaceAndUserParamSchema>;
59
+
60
+ // ============================================================================
61
+ // Response Schemas
62
+ // ============================================================================
63
+
64
+ export const WorkspaceResponseSchema = z.object({
65
+ workspace: WorkspaceSchema,
66
+ });
67
+
68
+ export type WorkspaceResponse = z.infer<typeof WorkspaceResponseSchema>;
69
+
70
+ export const WorkspacesResponseSchema = z.object({
71
+ workspaces: z.array(WorkspaceSchema),
72
+ });
73
+
74
+ export type WorkspacesResponse = z.infer<typeof WorkspacesResponseSchema>;
75
+
76
+ export const WorkspaceStatsSchema = z.object({
77
+ workspaceName: z.string(),
78
+ taskCounts: z.record(z.string(), z.number()),
79
+ memberCount: z.number(),
80
+ });
81
+
82
+ export type WorkspaceStats = z.infer<typeof WorkspaceStatsSchema>;
83
+
84
+ export const WorkspaceStatsResponseSchema = z.object({
85
+ stats: WorkspaceStatsSchema,
86
+ });
87
+
88
+ export type WorkspaceStatsResponse = z.infer<
89
+ typeof WorkspaceStatsResponseSchema
90
+ >;