@elevasis/core 0.20.0 → 0.22.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.
Files changed (77) hide show
  1. package/dist/index.d.ts +524 -6
  2. package/dist/index.js +417 -42
  3. package/dist/knowledge/index.d.ts +151 -1
  4. package/dist/organization-model/index.d.ts +524 -6
  5. package/dist/organization-model/index.js +417 -42
  6. package/dist/test-utils/index.d.ts +270 -1
  7. package/dist/test-utils/index.js +407 -41
  8. package/package.json +5 -5
  9. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +501 -303
  10. package/src/auth/multi-tenancy/permissions.ts +20 -8
  11. package/src/business/README.md +2 -2
  12. package/src/business/acquisition/api-schemas.test.ts +198 -0
  13. package/src/business/acquisition/api-schemas.ts +250 -9
  14. package/src/business/acquisition/build-templates.test.ts +28 -0
  15. package/src/business/acquisition/build-templates.ts +20 -8
  16. package/src/business/acquisition/index.ts +12 -0
  17. package/src/business/acquisition/types.ts +6 -1
  18. package/src/business/clients/api-schemas.test.ts +115 -0
  19. package/src/business/clients/api-schemas.ts +158 -0
  20. package/src/business/clients/index.ts +1 -0
  21. package/src/business/deals/api-schemas.ts +8 -0
  22. package/src/business/index.ts +5 -2
  23. package/src/business/projects/types.ts +19 -0
  24. package/src/execution/engine/__tests__/fixtures/test-agents.ts +10 -8
  25. package/src/execution/engine/agent/core/__tests__/agent.test.ts +16 -12
  26. package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +4 -3
  27. package/src/execution/engine/agent/core/types.ts +25 -15
  28. package/src/execution/engine/agent/index.ts +6 -4
  29. package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +24 -18
  30. package/src/execution/engine/index.ts +3 -0
  31. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.test.ts +55 -0
  32. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +107 -41
  33. package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.test.ts +48 -0
  34. package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.ts +99 -0
  35. package/src/execution/engine/tools/integration/server/adapters/apollo/index.ts +1 -0
  36. package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.test.ts +18 -0
  37. package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.ts +194 -0
  38. package/src/execution/engine/tools/integration/server/adapters/clickup/index.ts +7 -0
  39. package/src/execution/engine/workflow/types.ts +7 -0
  40. package/src/integrations/credentials/api-schemas.ts +21 -2
  41. package/src/integrations/credentials/schemas.ts +200 -164
  42. package/src/organization-model/README.md +10 -3
  43. package/src/organization-model/__tests__/defaults.test.ts +6 -0
  44. package/src/organization-model/__tests__/domains/resources.test.ts +188 -0
  45. package/src/organization-model/__tests__/domains/roles.test.ts +402 -347
  46. package/src/organization-model/__tests__/domains/systems.test.ts +193 -0
  47. package/src/organization-model/__tests__/knowledge.test.ts +39 -0
  48. package/src/organization-model/__tests__/prospecting-ssot.test.ts +7 -4
  49. package/src/organization-model/__tests__/resolve.test.ts +1 -1
  50. package/src/organization-model/defaults.ts +24 -3
  51. package/src/organization-model/domains/knowledge.ts +3 -2
  52. package/src/organization-model/domains/prospecting.ts +182 -25
  53. package/src/organization-model/domains/resources.ts +88 -0
  54. package/src/organization-model/domains/roles.ts +93 -55
  55. package/src/organization-model/domains/sales.ts +24 -3
  56. package/src/organization-model/domains/systems.ts +46 -0
  57. package/src/organization-model/icons.ts +1 -0
  58. package/src/organization-model/index.ts +2 -0
  59. package/src/organization-model/organization-model.mdx +33 -14
  60. package/src/organization-model/published.ts +52 -1
  61. package/src/organization-model/schema.ts +121 -0
  62. package/src/organization-model/types.ts +46 -1
  63. package/src/platform/api/types.ts +38 -35
  64. package/src/platform/constants/versions.ts +1 -1
  65. package/src/platform/registry/__tests__/resource-registry.test.ts +2051 -2005
  66. package/src/platform/registry/__tests__/validation.test.ts +1343 -1086
  67. package/src/platform/registry/index.ts +14 -0
  68. package/src/platform/registry/resource-registry.ts +40 -2
  69. package/src/platform/registry/serialization.ts +241 -202
  70. package/src/platform/registry/serialized-types.ts +1 -0
  71. package/src/platform/registry/types.ts +411 -361
  72. package/src/platform/registry/validation.ts +743 -513
  73. package/src/projects/api-schemas.ts +290 -267
  74. package/src/reference/_generated/contracts.md +501 -303
  75. package/src/reference/glossary.md +8 -3
  76. package/src/server.ts +2 -0
  77. package/src/supabase/database.types.ts +121 -0
@@ -1,268 +1,291 @@
1
- import { z } from 'zod'
2
- import { UuidSchema } from '../platform/utils/validation'
3
-
4
- /**
5
- * Project Management API Schemas
6
- *
7
- * Request/response validation for /api/external/projects surface.
8
- * Used by both the API (external-routes.ts) and the CLI (packages/cli).
9
- *
10
- * Table mapping:
11
- * prj_projects -> ProjectSchemas
12
- * prj_milestones -> MilestoneSchemas
13
- * prj_tasks -> TaskSchemas
14
- * prj_notes -> NoteSchemas
15
- */
16
-
17
- // ---------------------------------------------------------------------------
18
- // Enum literals (must match DB CHECK constraints exactly)
19
- // ---------------------------------------------------------------------------
20
-
21
- export const ProjectKindSchema = z.enum(['client_engagement', 'internal', 'research', 'other'])
22
- export const ProjectStatusSchema = z.enum(['active', 'on_track', 'at_risk', 'blocked', 'completed', 'paused'])
23
- export const MilestoneStatusSchema = z.enum(['upcoming', 'in_progress', 'completed', 'overdue', 'blocked'])
24
- export const TaskStatusSchema = z.enum([
25
- 'planned',
26
- 'in_progress',
27
- 'blocked',
28
- 'completed',
29
- 'cancelled',
30
- 'submitted',
31
- 'approved',
32
- 'rejected',
33
- 'revision_requested'
34
- ])
35
- export const TaskTypeSchema = z.enum([
36
- 'documentation',
37
- 'code',
38
- 'report',
39
- 'design',
40
- 'refactor',
41
- 'feature',
42
- 'bug',
43
- 'research',
44
- 'other'
45
- ])
1
+ import { z } from 'zod'
2
+ import { UuidSchema } from '../platform/utils/validation'
3
+
4
+ /**
5
+ * Project Management API Schemas
6
+ *
7
+ * Request/response validation for /api/external/projects surface.
8
+ * Used by both the API (external-routes.ts) and the CLI (packages/cli).
9
+ *
10
+ * Table mapping:
11
+ * prj_projects -> ProjectSchemas
12
+ * prj_milestones -> MilestoneSchemas
13
+ * prj_tasks -> TaskSchemas
14
+ * prj_notes -> NoteSchemas
15
+ */
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // Enum literals (must match DB CHECK constraints exactly)
19
+ // ---------------------------------------------------------------------------
20
+
21
+ export const ProjectKindSchema = z.enum(['client_engagement', 'internal', 'research', 'other'])
22
+ export const ProjectStatusSchema = z.enum(['active', 'on_track', 'at_risk', 'blocked', 'completed', 'paused'])
23
+ export const MilestoneStatusSchema = z.enum(['upcoming', 'in_progress', 'completed', 'overdue', 'blocked'])
24
+ export const TaskStatusSchema = z.enum([
25
+ 'planned',
26
+ 'in_progress',
27
+ 'blocked',
28
+ 'completed',
29
+ 'cancelled',
30
+ 'submitted',
31
+ 'approved',
32
+ 'rejected',
33
+ 'revision_requested'
34
+ ])
35
+ export const TaskTypeSchema = z.enum([
36
+ 'documentation',
37
+ 'code',
38
+ 'report',
39
+ 'design',
40
+ 'refactor',
41
+ 'feature',
42
+ 'bug',
43
+ 'research',
44
+ 'other'
45
+ ])
46
46
  export const NoteTypeSchema = z.enum(['call_note', 'status_update', 'issue', 'blocker', 'agent_learning'])
47
-
48
- // ---------------------------------------------------------------------------
49
- // Checklist item shape (JSONB array stored on prj_tasks)
50
- // ---------------------------------------------------------------------------
51
-
52
- export const ChecklistItemSchema = z.object({
53
- id: z.string(),
54
- label: z.string(),
55
- completed: z.boolean()
56
- })
57
-
58
- export const ChecklistSchema = z.array(ChecklistItemSchema)
59
-
60
- // ---------------------------------------------------------------------------
61
- // resume_context shape (JSONB on prj_tasks, merged on PATCH .../resume-context)
62
- // ---------------------------------------------------------------------------
63
-
64
- export const ResumeContextSchema = z.record(z.string(), z.unknown())
65
-
66
- // ---------------------------------------------------------------------------
67
- // Projects
68
- // ---------------------------------------------------------------------------
69
-
70
- export const CreateProjectRequestSchema = z
71
- .object({
72
- name: z.string().trim().min(1).max(255),
73
- kind: ProjectKindSchema,
74
- status: ProjectStatusSchema.optional(),
75
- description: z.string().nullable().optional(),
76
- deal_id: UuidSchema.nullable().optional(),
77
- client_company_id: UuidSchema.nullable().optional(),
78
- start_date: z.string().nullable().optional(),
79
- target_end_date: z.string().nullable().optional(),
80
- contract_value: z.number().nullable().optional(),
81
- metadata: z.record(z.string(), z.unknown()).nullable().optional()
82
- })
83
- .strict()
84
-
85
- export const UpdateProjectRequestSchema = z
86
- .object({
87
- name: z.string().trim().min(1).max(255).optional(),
88
- kind: ProjectKindSchema.optional(),
89
- status: ProjectStatusSchema.optional(),
90
- description: z.string().nullable().optional(),
91
- deal_id: UuidSchema.nullable().optional(),
92
- client_company_id: UuidSchema.nullable().optional(),
93
- start_date: z.string().nullable().optional(),
94
- target_end_date: z.string().nullable().optional(),
95
- actual_end_date: z.string().nullable().optional(),
96
- contract_value: z.number().nullable().optional(),
97
- metadata: z.record(z.string(), z.unknown()).nullable().optional()
98
- })
99
- .strict()
100
- .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
101
-
102
- export const GetProjectsQuerySchema = z
103
- .object({
104
- kind: ProjectKindSchema.optional(),
105
- status: ProjectStatusSchema.optional(),
106
- search: z.string().trim().min(1).max(255).optional()
107
- })
108
- .strict()
109
-
110
- export const ProjectIdParamsSchema = z.object({ id: UuidSchema })
111
-
112
- // ---------------------------------------------------------------------------
113
- // Milestones
114
- // ---------------------------------------------------------------------------
115
-
116
- export const CreateMilestoneRequestSchema = z
117
- .object({
118
- name: z.string().trim().min(1).max(255),
119
- status: MilestoneStatusSchema.optional(),
120
- description: z.string().nullable().optional(),
121
- due_date: z.string().nullable().optional(),
122
- sequence: z.number().int().min(0).optional(),
123
- metadata: z.record(z.string(), z.unknown()).nullable().optional()
124
- })
125
- .strict()
126
-
127
- export const UpdateMilestoneRequestSchema = z
128
- .object({
129
- name: z.string().trim().min(1).max(255).optional(),
130
- status: MilestoneStatusSchema.optional(),
131
- description: z.string().nullable().optional(),
132
- due_date: z.string().nullable().optional(),
133
- completed_at: z.string().nullable().optional(),
134
- sequence: z.number().int().min(0).optional(),
135
- checklist: ChecklistSchema.optional(),
136
- metadata: z.record(z.string(), z.unknown()).nullable().optional()
137
- })
138
- .strict()
139
- .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
140
-
141
- export const ProjectIdPathParamsSchema = z.object({ projectId: UuidSchema })
142
- export const MilestoneIdParamsSchema = z.object({ id: UuidSchema })
143
-
144
- // ---------------------------------------------------------------------------
145
- // Tasks
146
- // ---------------------------------------------------------------------------
147
-
148
- export const CreateTaskRequestSchema = z
149
- .object({
150
- project_id: UuidSchema,
151
- name: z.string().trim().min(1).max(255),
152
- type: TaskTypeSchema.optional(),
153
- status: TaskStatusSchema.optional(),
154
- description: z.string().nullable().optional(),
155
- milestone_id: UuidSchema.nullable().optional(),
156
- parent_task_id: UuidSchema.nullable().optional(),
157
- due_date: z.string().nullable().optional(),
158
- checklist: ChecklistSchema.optional(),
159
- resume_context: ResumeContextSchema.nullable().optional(),
160
- metadata: z.record(z.string(), z.unknown()).nullable().optional()
161
- })
162
- .strict()
163
-
164
- export const UpdateTaskRequestSchema = z
165
- .object({
166
- name: z.string().trim().min(1).max(255).optional(),
167
- type: TaskTypeSchema.optional(),
168
- status: TaskStatusSchema.optional(),
169
- description: z.string().nullable().optional(),
170
- milestone_id: UuidSchema.nullable().optional(),
171
- parent_task_id: UuidSchema.nullable().optional(),
172
- due_date: z.string().nullable().optional(),
173
- completed_at: z.string().nullable().optional(),
174
- checklist: ChecklistSchema.optional(),
175
- resume_context: ResumeContextSchema.nullable().optional(),
176
- file_url: z.string().nullable().optional(),
177
- metadata: z.record(z.string(), z.unknown()).nullable().optional()
178
- })
179
- .strict()
180
- .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
181
-
182
- export const MergeResumeContextRequestSchema = z
183
- .record(z.string(), z.unknown())
184
- .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
185
-
186
- export const GetTasksQuerySchema = z
187
- .object({
188
- status: TaskStatusSchema.optional(),
189
- milestone_id: UuidSchema.optional(),
190
- parent_task_id: UuidSchema.optional()
191
- })
192
- .strict()
193
-
194
- export const TaskIdParamsSchema = z.object({ id: UuidSchema })
195
-
196
- // ---------------------------------------------------------------------------
197
- // Notes
198
- // ---------------------------------------------------------------------------
199
-
200
- export const CreateNoteRequestSchema = z
201
- .object({
202
- project_id: UuidSchema,
203
- content: z.string().trim().min(1),
204
- type: NoteTypeSchema.optional(),
205
- summary: z.string().nullable().optional(),
206
- task_id: UuidSchema.nullable().optional(),
207
- milestone_id: UuidSchema.nullable().optional(),
208
- occurred_at: z.string().optional(),
209
- metadata: z.record(z.string(), z.unknown()).nullable().optional()
210
- })
211
- .strict()
212
-
213
- export const UpdateNoteRequestSchema = z
214
- .object({
215
- content: z.string().trim().min(1).optional(),
216
- type: NoteTypeSchema.optional(),
217
- summary: z.string().nullable().optional(),
218
- task_id: UuidSchema.nullable().optional(),
219
- milestone_id: UuidSchema.nullable().optional(),
220
- occurred_at: z.string().optional(),
221
- metadata: z.record(z.string(), z.unknown()).nullable().optional()
222
- })
223
- .strict()
224
- .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
225
-
226
- export const NoteIdParamsSchema = z.object({ id: UuidSchema })
227
-
228
- // ---------------------------------------------------------------------------
229
- // Bundled export (mirrors CredentialSchemas pattern)
230
- // ---------------------------------------------------------------------------
231
-
232
- export const ProjectSchemas = {
233
- // Projects
234
- CreateProjectRequest: CreateProjectRequestSchema,
235
- UpdateProjectRequest: UpdateProjectRequestSchema,
236
- GetProjectsQuery: GetProjectsQuerySchema,
237
- ProjectIdParams: ProjectIdParamsSchema,
238
-
239
- // Milestones
240
- CreateMilestoneRequest: CreateMilestoneRequestSchema,
241
- UpdateMilestoneRequest: UpdateMilestoneRequestSchema,
242
- ProjectIdPathParams: ProjectIdPathParamsSchema,
243
- MilestoneIdParams: MilestoneIdParamsSchema,
244
-
245
- // Tasks
246
- CreateTaskRequest: CreateTaskRequestSchema,
247
- UpdateTaskRequest: UpdateTaskRequestSchema,
248
- MergeResumeContextRequest: MergeResumeContextRequestSchema,
249
- GetTasksQuery: GetTasksQuerySchema,
250
- TaskIdParams: TaskIdParamsSchema,
251
-
252
- // Notes
253
- CreateNoteRequest: CreateNoteRequestSchema,
254
- UpdateNoteRequest: UpdateNoteRequestSchema,
255
- NoteIdParams: NoteIdParamsSchema
256
- }
257
-
258
- // ---------------------------------------------------------------------------
259
- // Inferred types
260
- // ---------------------------------------------------------------------------
261
-
262
- export type ProjectKind = z.infer<typeof ProjectKindSchema>
263
- export type ProjectStatus = z.infer<typeof ProjectStatusSchema>
264
- export type MilestoneStatus = z.infer<typeof MilestoneStatusSchema>
265
- export type TaskStatus = z.infer<typeof TaskStatusSchema>
266
- export type TaskType = z.infer<typeof TaskTypeSchema>
267
- export type NoteType = z.infer<typeof NoteTypeSchema>
268
- export type ChecklistItem = z.infer<typeof ChecklistItemSchema>
47
+
48
+ // ---------------------------------------------------------------------------
49
+ // Checklist item shape (JSONB array stored on prj_tasks)
50
+ // ---------------------------------------------------------------------------
51
+
52
+ export const ChecklistItemSchema = z.object({
53
+ id: z.string(),
54
+ label: z.string(),
55
+ completed: z.boolean()
56
+ })
57
+
58
+ export const ChecklistSchema = z.array(ChecklistItemSchema)
59
+
60
+ // ---------------------------------------------------------------------------
61
+ // resume_context shape (JSONB on prj_tasks, merged on PATCH .../resume-context)
62
+ // ---------------------------------------------------------------------------
63
+
64
+ export const ResumeContextSchema = z.record(z.string(), z.unknown())
65
+
66
+ // ---------------------------------------------------------------------------
67
+ // Projects
68
+ // ---------------------------------------------------------------------------
69
+
70
+ export const CreateProjectRequestSchema = z
71
+ .object({
72
+ name: z.string().trim().min(1).max(255),
73
+ kind: ProjectKindSchema,
74
+ status: ProjectStatusSchema.optional(),
75
+ description: z.string().nullable().optional(),
76
+ deal_id: UuidSchema.nullable().optional(),
77
+ client_id: UuidSchema.nullable().optional(),
78
+ client_company_id: UuidSchema.nullable().optional(),
79
+ start_date: z.string().nullable().optional(),
80
+ target_end_date: z.string().nullable().optional(),
81
+ contract_value: z.number().nullable().optional(),
82
+ metadata: z.record(z.string(), z.unknown()).nullable().optional()
83
+ })
84
+ .strict()
85
+
86
+ export const UpdateProjectRequestSchema = z
87
+ .object({
88
+ name: z.string().trim().min(1).max(255).optional(),
89
+ kind: ProjectKindSchema.optional(),
90
+ status: ProjectStatusSchema.optional(),
91
+ description: z.string().nullable().optional(),
92
+ deal_id: UuidSchema.nullable().optional(),
93
+ client_id: UuidSchema.nullable().optional(),
94
+ client_company_id: UuidSchema.nullable().optional(),
95
+ start_date: z.string().nullable().optional(),
96
+ target_end_date: z.string().nullable().optional(),
97
+ actual_end_date: z.string().nullable().optional(),
98
+ contract_value: z.number().nullable().optional(),
99
+ metadata: z.record(z.string(), z.unknown()).nullable().optional()
100
+ })
101
+ .strict()
102
+ .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
103
+
104
+ export const GetProjectsQuerySchema = z
105
+ .object({
106
+ kind: ProjectKindSchema.optional(),
107
+ status: ProjectStatusSchema.optional(),
108
+ search: z.string().trim().min(1).max(255).optional(),
109
+ client_id: UuidSchema.optional()
110
+ })
111
+ .strict()
112
+
113
+ export const ProjectIdParamsSchema = z.object({ id: UuidSchema })
114
+
115
+ export const ProjectSourceDealRefSchema = z.object({
116
+ id: z.string(),
117
+ clientId: z.string().nullable().optional(),
118
+ contactEmail: z.string(),
119
+ stageKey: z.string().nullable(),
120
+ stateKey: z.string().nullable(),
121
+ sourceListId: z.string().nullable(),
122
+ updatedAt: z.string()
123
+ })
124
+
125
+ export const ProjectClientRefSchema = z.object({
126
+ id: z.string(),
127
+ name: z.string(),
128
+ status: z.string()
129
+ })
130
+
131
+ // ---------------------------------------------------------------------------
132
+ // Milestones
133
+ // ---------------------------------------------------------------------------
134
+
135
+ export const CreateMilestoneRequestSchema = z
136
+ .object({
137
+ name: z.string().trim().min(1).max(255),
138
+ status: MilestoneStatusSchema.optional(),
139
+ description: z.string().nullable().optional(),
140
+ due_date: z.string().nullable().optional(),
141
+ sequence: z.number().int().min(0).optional(),
142
+ metadata: z.record(z.string(), z.unknown()).nullable().optional()
143
+ })
144
+ .strict()
145
+
146
+ export const UpdateMilestoneRequestSchema = z
147
+ .object({
148
+ name: z.string().trim().min(1).max(255).optional(),
149
+ status: MilestoneStatusSchema.optional(),
150
+ description: z.string().nullable().optional(),
151
+ due_date: z.string().nullable().optional(),
152
+ completed_at: z.string().nullable().optional(),
153
+ sequence: z.number().int().min(0).optional(),
154
+ checklist: ChecklistSchema.optional(),
155
+ metadata: z.record(z.string(), z.unknown()).nullable().optional()
156
+ })
157
+ .strict()
158
+ .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
159
+
160
+ export const ProjectIdPathParamsSchema = z.object({ projectId: UuidSchema })
161
+ export const MilestoneIdParamsSchema = z.object({ id: UuidSchema })
162
+
163
+ // ---------------------------------------------------------------------------
164
+ // Tasks
165
+ // ---------------------------------------------------------------------------
166
+
167
+ export const CreateTaskRequestSchema = z
168
+ .object({
169
+ project_id: UuidSchema,
170
+ name: z.string().trim().min(1).max(255),
171
+ type: TaskTypeSchema.optional(),
172
+ status: TaskStatusSchema.optional(),
173
+ description: z.string().nullable().optional(),
174
+ milestone_id: UuidSchema.nullable().optional(),
175
+ parent_task_id: UuidSchema.nullable().optional(),
176
+ due_date: z.string().nullable().optional(),
177
+ checklist: ChecklistSchema.optional(),
178
+ resume_context: ResumeContextSchema.nullable().optional(),
179
+ metadata: z.record(z.string(), z.unknown()).nullable().optional()
180
+ })
181
+ .strict()
182
+
183
+ export const UpdateTaskRequestSchema = z
184
+ .object({
185
+ name: z.string().trim().min(1).max(255).optional(),
186
+ type: TaskTypeSchema.optional(),
187
+ status: TaskStatusSchema.optional(),
188
+ description: z.string().nullable().optional(),
189
+ milestone_id: UuidSchema.nullable().optional(),
190
+ parent_task_id: UuidSchema.nullable().optional(),
191
+ due_date: z.string().nullable().optional(),
192
+ completed_at: z.string().nullable().optional(),
193
+ checklist: ChecklistSchema.optional(),
194
+ resume_context: ResumeContextSchema.nullable().optional(),
195
+ file_url: z.string().nullable().optional(),
196
+ metadata: z.record(z.string(), z.unknown()).nullable().optional()
197
+ })
198
+ .strict()
199
+ .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
200
+
201
+ export const MergeResumeContextRequestSchema = z
202
+ .record(z.string(), z.unknown())
203
+ .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
204
+
205
+ export const GetTasksQuerySchema = z
206
+ .object({
207
+ status: TaskStatusSchema.optional(),
208
+ milestone_id: UuidSchema.optional(),
209
+ parent_task_id: UuidSchema.optional()
210
+ })
211
+ .strict()
212
+
213
+ export const TaskIdParamsSchema = z.object({ id: UuidSchema })
214
+
215
+ // ---------------------------------------------------------------------------
216
+ // Notes
217
+ // ---------------------------------------------------------------------------
218
+
219
+ export const CreateNoteRequestSchema = z
220
+ .object({
221
+ project_id: UuidSchema,
222
+ content: z.string().trim().min(1),
223
+ type: NoteTypeSchema.optional(),
224
+ summary: z.string().nullable().optional(),
225
+ task_id: UuidSchema.nullable().optional(),
226
+ milestone_id: UuidSchema.nullable().optional(),
227
+ occurred_at: z.string().optional(),
228
+ metadata: z.record(z.string(), z.unknown()).nullable().optional()
229
+ })
230
+ .strict()
231
+
232
+ export const UpdateNoteRequestSchema = z
233
+ .object({
234
+ content: z.string().trim().min(1).optional(),
235
+ type: NoteTypeSchema.optional(),
236
+ summary: z.string().nullable().optional(),
237
+ task_id: UuidSchema.nullable().optional(),
238
+ milestone_id: UuidSchema.nullable().optional(),
239
+ occurred_at: z.string().optional(),
240
+ metadata: z.record(z.string(), z.unknown()).nullable().optional()
241
+ })
242
+ .strict()
243
+ .refine((data) => Object.keys(data).length > 0, { message: 'At least one field must be provided' })
244
+
245
+ export const NoteIdParamsSchema = z.object({ id: UuidSchema })
246
+
247
+ // ---------------------------------------------------------------------------
248
+ // Bundled export (mirrors CredentialSchemas pattern)
249
+ // ---------------------------------------------------------------------------
250
+
251
+ export const ProjectSchemas = {
252
+ // Projects
253
+ CreateProjectRequest: CreateProjectRequestSchema,
254
+ UpdateProjectRequest: UpdateProjectRequestSchema,
255
+ GetProjectsQuery: GetProjectsQuerySchema,
256
+ ProjectIdParams: ProjectIdParamsSchema,
257
+ ProjectSourceDealRef: ProjectSourceDealRefSchema,
258
+ ProjectClientRef: ProjectClientRefSchema,
259
+
260
+ // Milestones
261
+ CreateMilestoneRequest: CreateMilestoneRequestSchema,
262
+ UpdateMilestoneRequest: UpdateMilestoneRequestSchema,
263
+ ProjectIdPathParams: ProjectIdPathParamsSchema,
264
+ MilestoneIdParams: MilestoneIdParamsSchema,
265
+
266
+ // Tasks
267
+ CreateTaskRequest: CreateTaskRequestSchema,
268
+ UpdateTaskRequest: UpdateTaskRequestSchema,
269
+ MergeResumeContextRequest: MergeResumeContextRequestSchema,
270
+ GetTasksQuery: GetTasksQuerySchema,
271
+ TaskIdParams: TaskIdParamsSchema,
272
+
273
+ // Notes
274
+ CreateNoteRequest: CreateNoteRequestSchema,
275
+ UpdateNoteRequest: UpdateNoteRequestSchema,
276
+ NoteIdParams: NoteIdParamsSchema
277
+ }
278
+
279
+ // ---------------------------------------------------------------------------
280
+ // Inferred types
281
+ // ---------------------------------------------------------------------------
282
+
283
+ export type ProjectKind = z.infer<typeof ProjectKindSchema>
284
+ export type ProjectStatus = z.infer<typeof ProjectStatusSchema>
285
+ export type MilestoneStatus = z.infer<typeof MilestoneStatusSchema>
286
+ export type TaskStatus = z.infer<typeof TaskStatusSchema>
287
+ export type TaskType = z.infer<typeof TaskTypeSchema>
288
+ export type NoteType = z.infer<typeof NoteTypeSchema>
289
+ export type ChecklistItem = z.infer<typeof ChecklistItemSchema>
290
+ export type ProjectSourceDealRef = z.infer<typeof ProjectSourceDealRefSchema>
291
+ export type ProjectClientRef = z.infer<typeof ProjectClientRefSchema>