@typeb-digital/nucleus-sdk 0.0.5 → 0.1.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.
@@ -40,6 +40,7 @@ type EmployeeIdentity = {
40
40
  jobTitle: string | null;
41
41
  department: string | null;
42
42
  employmentStatus: string;
43
+ employmentType: string | null;
43
44
  isExternal: boolean;
44
45
  };
45
46
  type EmployeeContact = {
@@ -76,6 +77,7 @@ type EmployeeCompensation = {
76
77
  hourlyBillableRate: number | null;
77
78
  monthlyCostRate: number | null;
78
79
  monthlyBillableRate: number | null;
80
+ salary: number | null;
79
81
  currencyCode: string;
80
82
  effectiveFrom: string;
81
83
  } | null;
@@ -86,6 +88,7 @@ type EmployeeCompensationHistory = {
86
88
  hourlyBillableRate: number | null;
87
89
  monthlyCostRate: number | null;
88
90
  monthlyBillableRate: number | null;
91
+ salary: number | null;
89
92
  currencyCode: string;
90
93
  effectiveFrom: string;
91
94
  effectiveTo: string | null;
@@ -107,6 +110,9 @@ type ProjectCore = {
107
110
  id: string;
108
111
  name: string;
109
112
  status: string;
113
+ /** Pipeline lifecycle: opportunity | proposal | won | active | closed. */
114
+ stage: string;
115
+ stageChangedAt: string | null;
110
116
  colorTag: string | null;
111
117
  iconName: string | null;
112
118
  startDate: string | null;
@@ -119,12 +125,18 @@ type ProjectTeam = {
119
125
  engagementLeadId: string | null;
120
126
  memberships: ProjectMembership[];
121
127
  };
122
- type ProjectFinancials = Record<never, never>;
128
+ type ProjectFinancials = {
129
+ contractValue: number | null;
130
+ budget: number | null;
131
+ marginTarget: number | null;
132
+ financialsCurrency: string | null;
133
+ };
123
134
  type ProjectIntegrations = {
124
135
  source: string | null;
125
136
  clockifyProjectId: string | null;
126
137
  clockifyWorkspaceId: string | null;
127
138
  apolloDealId: string | null;
139
+ twentyOpportunityId: string | null;
128
140
  };
129
141
  type ProjectBucketMap = {
130
142
  core: ProjectCore;
@@ -216,25 +228,179 @@ type GenericRateBucketMap = {
216
228
  core: GenericRateCore;
217
229
  financials: GenericRateFinancials;
218
230
  };
231
+ type JurisdictionCore = {
232
+ id: string;
233
+ name: string;
234
+ code: string;
235
+ country: string | null;
236
+ };
237
+ type JurisdictionBucketMap = {
238
+ core: JurisdictionCore;
239
+ };
240
+ type LeaveTypeCore = {
241
+ id: string;
242
+ name: string;
243
+ description: string | null;
244
+ color: string | null;
245
+ sortOrder: number;
246
+ };
247
+ type LeaveTypeBucketMap = {
248
+ core: LeaveTypeCore;
249
+ };
250
+ type LeaveCore = {
251
+ id: string;
252
+ employeeId: string;
253
+ leaveTypeId: string;
254
+ startDate: string;
255
+ endDate: string;
256
+ days: number;
257
+ status: string;
258
+ source: string;
259
+ };
260
+ type LeaveDetails = {
261
+ reason: string | null;
262
+ };
263
+ type LeaveBucketMap = {
264
+ core: LeaveCore;
265
+ details: LeaveDetails;
266
+ };
267
+ type LeaveBalanceCore = {
268
+ id: string;
269
+ employeeId: string;
270
+ leaveTypeId: string;
271
+ year: number;
272
+ balanceDays: number;
273
+ };
274
+ type LeaveBalanceBucketMap = {
275
+ core: LeaveBalanceCore;
276
+ };
277
+ type PolicyCore = {
278
+ id: string;
279
+ title: string;
280
+ code: string;
281
+ category: string | null;
282
+ description: string | null;
283
+ currentVersion: number;
284
+ requiresAcknowledgement: boolean;
285
+ isPublished: boolean;
286
+ };
287
+ type PolicyContent = {
288
+ body: string | null;
289
+ fileKey: string | null;
290
+ };
291
+ type PolicyBucketMap = {
292
+ core: PolicyCore;
293
+ content: PolicyContent;
294
+ };
295
+ type PolicyAcknowledgementCore = {
296
+ id: string;
297
+ policyId: string;
298
+ employeeId: string;
299
+ version: number;
300
+ acknowledgedAt: string;
301
+ };
302
+ type PolicyAcknowledgementBucketMap = {
303
+ core: PolicyAcknowledgementCore;
304
+ };
305
+ type CalendarEventCore = {
306
+ id: string;
307
+ title: string;
308
+ description: string | null;
309
+ startDate: string;
310
+ endDate: string | null;
311
+ allDay: boolean;
312
+ type: string;
313
+ location: string | null;
314
+ color: string | null;
315
+ isPublished: boolean;
316
+ };
317
+ type CalendarEventBucketMap = {
318
+ core: CalendarEventCore;
319
+ };
320
+ type TimesheetCore = {
321
+ id: string;
322
+ employeeId: string;
323
+ projectId: string | null;
324
+ /** Entry start (Kimai `begin`). ISO 8601. */
325
+ startTime: string;
326
+ /** Entry end (Kimai `end`); null while running. ISO 8601. */
327
+ endTime: string | null;
328
+ durationMinutes: number;
329
+ billable: boolean;
330
+ };
331
+ type TimesheetDetails = {
332
+ description: string | null;
333
+ activityName: string | null;
334
+ };
335
+ type TimesheetIntegrations = {
336
+ source: string;
337
+ kimaiId: string | null;
338
+ kimaiActivityId: string | null;
339
+ };
340
+ type TimesheetBucketMap = {
341
+ core: TimesheetCore;
342
+ details: TimesheetDetails;
343
+ integrations: TimesheetIntegrations;
344
+ };
345
+ /**
346
+ * Per-resource scope: which buckets the app may read / create / update, and
347
+ * whether it may delete (record-level). Mirrors the platform's per-(resource,
348
+ * bucket, action) authorization. `read` drives the accessor return types;
349
+ * `create`/`update`/`delete` gate the mutation methods at compile time.
350
+ */
351
+ type ResourceScope<M> = {
352
+ read?: readonly (keyof M)[];
353
+ create?: readonly (keyof M)[];
354
+ update?: readonly (keyof M)[];
355
+ delete?: boolean;
356
+ };
219
357
  type ScopeDeclaration = {
220
- employees?: readonly (keyof EmployeeBucketMap)[];
221
- projects?: readonly (keyof ProjectBucketMap)[];
222
- clients?: readonly (keyof ClientBucketMap)[];
223
- partners?: readonly (keyof PartnerBucketMap)[];
224
- departments?: readonly (keyof DepartmentBucketMap)[];
225
- projectTypes?: readonly (keyof ProjectTypeBucketMap)[];
226
- currencies?: readonly (keyof CurrencyBucketMap)[];
227
- genericRates?: readonly (keyof GenericRateBucketMap)[];
358
+ employees?: ResourceScope<EmployeeBucketMap>;
359
+ projects?: ResourceScope<ProjectBucketMap>;
360
+ clients?: ResourceScope<ClientBucketMap>;
361
+ partners?: ResourceScope<PartnerBucketMap>;
362
+ departments?: ResourceScope<DepartmentBucketMap>;
363
+ projectTypes?: ResourceScope<ProjectTypeBucketMap>;
364
+ currencies?: ResourceScope<CurrencyBucketMap>;
365
+ genericRates?: ResourceScope<GenericRateBucketMap>;
366
+ jurisdictions?: ResourceScope<JurisdictionBucketMap>;
367
+ leaveTypes?: ResourceScope<LeaveTypeBucketMap>;
368
+ leaves?: ResourceScope<LeaveBucketMap>;
369
+ leaveBalances?: ResourceScope<LeaveBalanceBucketMap>;
370
+ policies?: ResourceScope<PolicyBucketMap>;
371
+ policyAcknowledgements?: ResourceScope<PolicyAcknowledgementBucketMap>;
372
+ calendarEvents?: ResourceScope<CalendarEventBucketMap>;
373
+ timesheets?: ResourceScope<TimesheetBucketMap>;
228
374
  };
375
+ type ReadOf<RS, M> = RS extends {
376
+ read: readonly (keyof M)[];
377
+ } ? RS['read'] : readonly [];
378
+ type IfCreate<RS, T> = RS extends {
379
+ create: readonly [unknown, ...unknown[]];
380
+ } ? T : never;
381
+ type IfUpdate<RS, T> = RS extends {
382
+ update: readonly [unknown, ...unknown[]];
383
+ } ? T : never;
384
+ type IfDelete<RS, T> = RS extends {
385
+ delete: true;
386
+ } ? T : never;
229
387
  type ResolveBuckets<M, B> = B extends readonly (keyof M)[] ? [B[number]] extends [never] ? NoScope : UnionToIntersection<M[B[number]]> : NoScope;
230
- type ResolveEmployee<S extends ScopeDeclaration> = ResolveBuckets<EmployeeBucketMap, S['employees']>;
231
- type ResolveProject<S extends ScopeDeclaration> = ResolveBuckets<ProjectBucketMap, S['projects']>;
232
- type ResolveClient<S extends ScopeDeclaration> = ResolveBuckets<ClientBucketMap, S['clients']>;
233
- type ResolvePartner<S extends ScopeDeclaration> = ResolveBuckets<PartnerBucketMap, S['partners']>;
234
- type ResolveDepartment<S extends ScopeDeclaration> = ResolveBuckets<DepartmentBucketMap, S['departments']>;
235
- type ResolveProjectType<S extends ScopeDeclaration> = ResolveBuckets<ProjectTypeBucketMap, S['projectTypes']>;
236
- type ResolveCurrency<S extends ScopeDeclaration> = ResolveBuckets<CurrencyBucketMap, S['currencies']>;
237
- type ResolveGenericRate<S extends ScopeDeclaration> = ResolveBuckets<GenericRateBucketMap, S['genericRates']>;
388
+ type ResolveEmployee<S extends ScopeDeclaration> = ResolveBuckets<EmployeeBucketMap, ReadOf<S['employees'], EmployeeBucketMap>>;
389
+ type ResolveProject<S extends ScopeDeclaration> = ResolveBuckets<ProjectBucketMap, ReadOf<S['projects'], ProjectBucketMap>>;
390
+ type ResolveClient<S extends ScopeDeclaration> = ResolveBuckets<ClientBucketMap, ReadOf<S['clients'], ClientBucketMap>>;
391
+ type ResolvePartner<S extends ScopeDeclaration> = ResolveBuckets<PartnerBucketMap, ReadOf<S['partners'], PartnerBucketMap>>;
392
+ type ResolveDepartment<S extends ScopeDeclaration> = ResolveBuckets<DepartmentBucketMap, ReadOf<S['departments'], DepartmentBucketMap>>;
393
+ type ResolveProjectType<S extends ScopeDeclaration> = ResolveBuckets<ProjectTypeBucketMap, ReadOf<S['projectTypes'], ProjectTypeBucketMap>>;
394
+ type ResolveCurrency<S extends ScopeDeclaration> = ResolveBuckets<CurrencyBucketMap, ReadOf<S['currencies'], CurrencyBucketMap>>;
395
+ type ResolveGenericRate<S extends ScopeDeclaration> = ResolveBuckets<GenericRateBucketMap, ReadOf<S['genericRates'], GenericRateBucketMap>>;
396
+ type ResolveJurisdiction<S extends ScopeDeclaration> = ResolveBuckets<JurisdictionBucketMap, ReadOf<S['jurisdictions'], JurisdictionBucketMap>>;
397
+ type ResolveLeaveType<S extends ScopeDeclaration> = ResolveBuckets<LeaveTypeBucketMap, ReadOf<S['leaveTypes'], LeaveTypeBucketMap>>;
398
+ type ResolveLeave<S extends ScopeDeclaration> = ResolveBuckets<LeaveBucketMap, ReadOf<S['leaves'], LeaveBucketMap>>;
399
+ type ResolveLeaveBalance<S extends ScopeDeclaration> = ResolveBuckets<LeaveBalanceBucketMap, ReadOf<S['leaveBalances'], LeaveBalanceBucketMap>>;
400
+ type ResolvePolicy<S extends ScopeDeclaration> = ResolveBuckets<PolicyBucketMap, ReadOf<S['policies'], PolicyBucketMap>>;
401
+ type ResolvePolicyAcknowledgement<S extends ScopeDeclaration> = ResolveBuckets<PolicyAcknowledgementBucketMap, ReadOf<S['policyAcknowledgements'], PolicyAcknowledgementBucketMap>>;
402
+ type ResolveCalendarEvent<S extends ScopeDeclaration> = ResolveBuckets<CalendarEventBucketMap, ReadOf<S['calendarEvents'], CalendarEventBucketMap>>;
403
+ type ResolveTimesheet<S extends ScopeDeclaration> = ResolveBuckets<TimesheetBucketMap, ReadOf<S['timesheets'], TimesheetBucketMap>>;
238
404
  type EmployeeExpandPath = 'manager' | 'partner';
239
405
  type WithEmployeeExpand<T, E extends readonly EmployeeExpandPath[], S extends ScopeDeclaration> = T & ('manager' extends E[number] ? {
240
406
  manager: ResolveEmployee<S> | null;
@@ -274,6 +440,173 @@ type PartnerExpandPath = 'employees';
274
440
  type WithPartnerExpand<T, E extends readonly PartnerExpandPath[], S extends ScopeDeclaration> = T & ('employees' extends E[number] ? {
275
441
  employees: Array<ResolveEmployee<S>>;
276
442
  } : unknown);
443
+ type LeaveExpandPath = 'employee' | 'leaveType';
444
+ type WithLeaveExpand<T, E extends readonly LeaveExpandPath[], S extends ScopeDeclaration> = T & ('employee' extends E[number] ? {
445
+ employee: ResolveEmployee<S> | null;
446
+ } : unknown) & ('leaveType' extends E[number] ? {
447
+ leaveType: ResolveLeaveType<S> | null;
448
+ } : unknown);
449
+ type LeaveBalanceExpandPath = 'employee' | 'leaveType';
450
+ type WithLeaveBalanceExpand<T, E extends readonly LeaveBalanceExpandPath[], S extends ScopeDeclaration> = T & ('employee' extends E[number] ? {
451
+ employee: ResolveEmployee<S> | null;
452
+ } : unknown) & ('leaveType' extends E[number] ? {
453
+ leaveType: ResolveLeaveType<S> | null;
454
+ } : unknown);
455
+ type PolicyAcknowledgementExpandPath = 'employee' | 'policy';
456
+ type WithPolicyAcknowledgementExpand<T, E extends readonly PolicyAcknowledgementExpandPath[], S extends ScopeDeclaration> = T & ('employee' extends E[number] ? {
457
+ employee: ResolveEmployee<S> | null;
458
+ } : unknown) & ('policy' extends E[number] ? {
459
+ policy: ResolvePolicy<S> | null;
460
+ } : unknown);
461
+ type TimesheetExpandPath = 'employee' | 'project';
462
+ type WithTimesheetExpand<T, E extends readonly TimesheetExpandPath[], S extends ScopeDeclaration> = T & ('employee' extends E[number] ? {
463
+ employee: ResolveEmployee<S> | null;
464
+ } : unknown) & ('project' extends E[number] ? {
465
+ project: ResolveProject<S> | null;
466
+ } : unknown);
467
+ type LeaveCreateInput = {
468
+ employeeId: string;
469
+ leaveTypeId: string;
470
+ startDate: string;
471
+ endDate: string;
472
+ days: number;
473
+ reason?: string | null;
474
+ status?: string;
475
+ source?: string;
476
+ };
477
+ type LeaveUpdateInput = Partial<LeaveCreateInput>;
478
+ type EmployeeUpdateInput = {
479
+ managerId?: string | null;
480
+ timezone?: string | null;
481
+ };
482
+ type ProjectCreateInput = {
483
+ name: string;
484
+ status?: string | null;
485
+ source?: string | null;
486
+ startDate?: string | null;
487
+ endDate?: string | null;
488
+ colorTag?: string | null;
489
+ iconName?: string | null;
490
+ clientId: string;
491
+ projectTypeId?: string | null;
492
+ projectManagerId?: string | null;
493
+ engagementLeadId?: string | null;
494
+ };
495
+ type ProjectUpdateInput = Partial<ProjectCreateInput>;
496
+ type ClientCreateInput = {
497
+ name: string;
498
+ code: string;
499
+ industry?: string | null;
500
+ website?: string | null;
501
+ country?: string | null;
502
+ contactPhone?: string | null;
503
+ defaultCurrency?: string | null;
504
+ primaryContactName?: string | null;
505
+ primaryContactEmail?: string | null;
506
+ notes?: string | null;
507
+ };
508
+ type ClientUpdateInput = Partial<ClientCreateInput>;
509
+ type PartnerCreateInput = {
510
+ name: string;
511
+ contactName?: string | null;
512
+ contactEmail?: string | null;
513
+ contactPhone?: string | null;
514
+ notes?: string | null;
515
+ };
516
+ type PartnerUpdateInput = Partial<PartnerCreateInput>;
517
+ type DepartmentCreateInput = {
518
+ name: string;
519
+ titles?: string[];
520
+ sortOrder?: number;
521
+ };
522
+ type DepartmentUpdateInput = Partial<DepartmentCreateInput>;
523
+ type ProjectTypeCreateInput = {
524
+ name: string;
525
+ description?: string | null;
526
+ sortOrder?: number;
527
+ };
528
+ type ProjectTypeUpdateInput = Partial<ProjectTypeCreateInput>;
529
+ type CurrencyCreateInput = {
530
+ code: string;
531
+ name: string;
532
+ symbol?: string | null;
533
+ isDefault?: boolean;
534
+ sortOrder?: number;
535
+ };
536
+ type CurrencyUpdateInput = Partial<Omit<CurrencyCreateInput, 'code'>>;
537
+ type GenericRateCreateInput = {
538
+ title: string;
539
+ department: string;
540
+ costRate: number;
541
+ billableRate: number;
542
+ currencyCode?: string;
543
+ };
544
+ type GenericRateUpdateInput = Partial<GenericRateCreateInput>;
545
+ type JurisdictionCreateInput = {
546
+ name: string;
547
+ code: string;
548
+ country?: string | null;
549
+ };
550
+ type JurisdictionUpdateInput = Partial<JurisdictionCreateInput>;
551
+ type LeaveTypeCreateInput = {
552
+ name: string;
553
+ description?: string | null;
554
+ color?: string | null;
555
+ sortOrder?: number;
556
+ };
557
+ type LeaveTypeUpdateInput = Partial<LeaveTypeCreateInput>;
558
+ type LeaveBalanceCreateInput = {
559
+ employeeId: string;
560
+ leaveTypeId: string;
561
+ year: number;
562
+ balanceDays?: number;
563
+ };
564
+ type LeaveBalanceUpdateInput = Partial<LeaveBalanceCreateInput>;
565
+ type PolicyCreateInput = {
566
+ title: string;
567
+ code: string;
568
+ category?: string | null;
569
+ description?: string | null;
570
+ body?: string | null;
571
+ fileKey?: string | null;
572
+ currentVersion?: number;
573
+ requiresAcknowledgement?: boolean;
574
+ isPublished?: boolean;
575
+ };
576
+ type PolicyUpdateInput = Partial<PolicyCreateInput>;
577
+ type PolicyAcknowledgementCreateInput = {
578
+ policyId: string;
579
+ employeeId: string;
580
+ version: number;
581
+ acknowledgedAt?: string;
582
+ };
583
+ type PolicyAcknowledgementUpdateInput = Partial<PolicyAcknowledgementCreateInput>;
584
+ type CalendarEventCreateInput = {
585
+ title: string;
586
+ description?: string | null;
587
+ startDate: string;
588
+ endDate?: string | null;
589
+ allDay?: boolean;
590
+ type?: string;
591
+ location?: string | null;
592
+ color?: string | null;
593
+ isPublished?: boolean;
594
+ };
595
+ type CalendarEventUpdateInput = Partial<CalendarEventCreateInput>;
596
+ type TimesheetCreateInput = {
597
+ employeeId: string;
598
+ projectId?: string | null;
599
+ startTime: string;
600
+ endTime?: string | null;
601
+ durationMinutes: number;
602
+ description?: string | null;
603
+ activityName?: string | null;
604
+ billable?: boolean;
605
+ source?: string;
606
+ kimaiId?: string | null;
607
+ kimaiActivityId?: string | null;
608
+ };
609
+ type TimesheetUpdateInput = Partial<TimesheetCreateInput>;
277
610
  type AppScopeInfo = {
278
611
  id: string;
279
612
  resource: string;
@@ -281,19 +614,34 @@ type AppScopeInfo = {
281
614
  status: 'active' | 'pending' | 'rejected';
282
615
  reviewNote: string | null;
283
616
  };
617
+ type AppPermissionInfo = {
618
+ resource: string;
619
+ bucket: string | null;
620
+ action: 'read' | 'create' | 'update' | 'delete';
621
+ status: 'active' | 'pending' | 'rejected';
622
+ reviewNote: string | null;
623
+ };
284
624
  type AppInfo = {
285
625
  id: string;
286
626
  appId: string;
287
627
  name: string;
288
628
  description: string | null;
289
629
  icon: string | null;
290
- environment: string;
630
+ /** Publish lifecycle: draft | submitted | published | changes_requested | suspended. */
291
631
  status: string;
632
+ redirectUris: string[];
633
+ submittedAt: string | null;
634
+ publishedAt: string | null;
635
+ reviewNote: string | null;
636
+ /** Back-compat aggregate of permissions grouped by resource. */
292
637
  scopes: AppScopeInfo[];
638
+ /** Normalized per-(resource, bucket, action) permission rows. */
639
+ permissions?: AppPermissionInfo[];
293
640
  tokens: {
294
641
  id: string;
295
642
  tokenPrefix: string;
296
- environment: string;
643
+ /** 'live' | 'test' — replaces the removed `environment`. */
644
+ mode: string;
297
645
  status: string;
298
646
  lastUsedAt: string | null;
299
647
  expiresAt: string | null;
@@ -313,6 +661,8 @@ declare class NucleusTransport {
313
661
  constructor(token: string, baseUrl?: string);
314
662
  get<T>(path: string, query?: Record<string, string | number | undefined>): Promise<SuccessResult<T> | ErrorResult>;
315
663
  post<T>(path: string, body: unknown): Promise<SuccessResult<T> | ErrorResult>;
664
+ put<T>(path: string, body: unknown): Promise<SuccessResult<T> | ErrorResult>;
665
+ patch<T>(path: string, body: unknown): Promise<SuccessResult<T> | ErrorResult>;
316
666
  del<T = null>(path: string, query?: Record<string, string | undefined>): Promise<SuccessResult<T> | ErrorResult>;
317
667
  getList<T>(path: string, query?: Record<string, string | number | undefined>): Promise<ListResult<T> | ErrorResult>;
318
668
  }
@@ -334,6 +684,10 @@ declare class EmployeesAccessor<S extends ScopeDeclaration> {
334
684
  getById<E extends readonly EmployeeExpandPath[] = never[]>(id: string, options?: {
335
685
  expand?: E;
336
686
  }): Promise<SingleResult<WithEmployeeExpand<ResolveEmployee<S>, E, S>>>;
687
+ /** Update an employee (managerId / timezone overrides). Requires `employees.update` scope. */
688
+ update(id: string, data: IfUpdate<S['employees'], EmployeeUpdateInput>): Promise<SingleResult<ResolveEmployee<S>>>;
689
+ /** Soft-delete an employee. Requires `employees.delete` scope. */
690
+ delete(id: IfDelete<S['employees'], string>): Promise<SingleResult<null>>;
337
691
  }
338
692
 
339
693
  type ProjectListParams = {
@@ -353,6 +707,12 @@ declare class ProjectsAccessor<S extends ScopeDeclaration> {
353
707
  getById<E extends readonly ProjectExpandPath[] = never[]>(id: string, options?: {
354
708
  expand?: E;
355
709
  }): Promise<SingleResult<WithProjectExpand<ResolveProject<S>, E, S>>>;
710
+ /** Create a project. Requires `projects.create` scope. */
711
+ create(data: IfCreate<S['projects'], ProjectCreateInput>): Promise<SingleResult<ResolveProject<S>>>;
712
+ /** Update a project. Requires `projects.update` scope. */
713
+ update(id: string, data: IfUpdate<S['projects'], ProjectUpdateInput>): Promise<SingleResult<ResolveProject<S>>>;
714
+ /** Soft-delete a project. Requires `projects.delete` scope. */
715
+ delete(id: IfDelete<S['projects'], string>): Promise<SingleResult<null>>;
356
716
  }
357
717
 
358
718
  type ClientListParams = {
@@ -372,6 +732,12 @@ declare class ClientsAccessor<S extends ScopeDeclaration> {
372
732
  getById<E extends readonly ClientExpandPath[] = never[]>(id: string, options?: {
373
733
  expand?: E;
374
734
  }): Promise<SingleResult<WithClientExpand<ResolveClient<S>, E, S>>>;
735
+ /** Create a client. Requires `clients.create` scope. */
736
+ create(data: IfCreate<S['clients'], ClientCreateInput>): Promise<SingleResult<ResolveClient<S>>>;
737
+ /** Update a client. Requires `clients.update` scope. */
738
+ update(id: string, data: IfUpdate<S['clients'], ClientUpdateInput>): Promise<SingleResult<ResolveClient<S>>>;
739
+ /** Soft-delete a client. Requires `clients.delete` scope. */
740
+ delete(id: IfDelete<S['clients'], string>): Promise<SingleResult<null>>;
375
741
  }
376
742
 
377
743
  type PartnerListParams = {
@@ -389,6 +755,12 @@ declare class PartnersAccessor<S extends ScopeDeclaration> {
389
755
  getById<E extends readonly PartnerExpandPath[] = never[]>(id: string, options?: {
390
756
  expand?: E;
391
757
  }): Promise<SingleResult<WithPartnerExpand<ResolvePartner<S>, E, S>>>;
758
+ /** Create a partner. Requires `partners.create` scope. */
759
+ create(data: IfCreate<S['partners'], PartnerCreateInput>): Promise<SingleResult<ResolvePartner<S>>>;
760
+ /** Update a partner. Requires `partners.update` scope. */
761
+ update(id: string, data: IfUpdate<S['partners'], PartnerUpdateInput>): Promise<SingleResult<ResolvePartner<S>>>;
762
+ /** Soft-delete a partner. Requires `partners.delete` scope. */
763
+ delete(id: IfDelete<S['partners'], string>): Promise<SingleResult<null>>;
392
764
  }
393
765
 
394
766
  type DepartmentListParams = {
@@ -401,6 +773,12 @@ declare class DepartmentsAccessor<S extends ScopeDeclaration> {
401
773
  constructor(transport: NucleusTransport);
402
774
  list(params?: DepartmentListParams): Promise<PaginatedResult<ResolveDepartment<S>>>;
403
775
  getById(id: string): Promise<SingleResult<ResolveDepartment<S>>>;
776
+ /** Create a department. Requires `departments.create` scope. */
777
+ create(data: IfCreate<S['departments'], DepartmentCreateInput>): Promise<SingleResult<ResolveDepartment<S>>>;
778
+ /** Update a department. Requires `departments.update` scope. */
779
+ update(id: string, data: IfUpdate<S['departments'], DepartmentUpdateInput>): Promise<SingleResult<ResolveDepartment<S>>>;
780
+ /** Soft-delete a department. Requires `departments.delete` scope. */
781
+ delete(id: IfDelete<S['departments'], string>): Promise<SingleResult<null>>;
404
782
  }
405
783
 
406
784
  type ProjectTypeListParams = {
@@ -412,6 +790,12 @@ declare class ProjectTypesAccessor<S extends ScopeDeclaration> {
412
790
  constructor(transport: NucleusTransport);
413
791
  list(params?: ProjectTypeListParams): Promise<PaginatedResult<ResolveProjectType<S>>>;
414
792
  getById(id: string): Promise<SingleResult<ResolveProjectType<S>>>;
793
+ /** Create a project type. Requires `projectTypes.create` scope. */
794
+ create(data: IfCreate<S['projectTypes'], ProjectTypeCreateInput>): Promise<SingleResult<ResolveProjectType<S>>>;
795
+ /** Update a project type. Requires `projectTypes.update` scope. */
796
+ update(id: string, data: IfUpdate<S['projectTypes'], ProjectTypeUpdateInput>): Promise<SingleResult<ResolveProjectType<S>>>;
797
+ /** Soft-delete a project type. Requires `projectTypes.delete` scope. */
798
+ delete(id: IfDelete<S['projectTypes'], string>): Promise<SingleResult<null>>;
415
799
  }
416
800
 
417
801
  type CurrencyListParams = {
@@ -423,6 +807,15 @@ declare class CurrenciesAccessor<S extends ScopeDeclaration> {
423
807
  constructor(transport: NucleusTransport);
424
808
  list(params?: CurrencyListParams): Promise<PaginatedResult<ResolveCurrency<S>>>;
425
809
  getByCode(code: string): Promise<SingleResult<ResolveCurrency<S>>>;
810
+ /** Create a currency. Requires `currencies.create` scope. */
811
+ create(data: IfCreate<S['currencies'], CurrencyCreateInput>): Promise<SingleResult<ResolveCurrency<S>>>;
812
+ /**
813
+ * Update a currency (keyed by its ISO code; `code` itself is immutable).
814
+ * Requires `currencies.update` scope.
815
+ */
816
+ update(code: string, data: IfUpdate<S['currencies'], CurrencyUpdateInput>): Promise<SingleResult<ResolveCurrency<S>>>;
817
+ /** Soft-delete a currency (keyed by its ISO code). Requires `currencies.delete` scope. */
818
+ delete(code: IfDelete<S['currencies'], string>): Promise<SingleResult<null>>;
426
819
  }
427
820
 
428
821
  type GenericRateListParams = {
@@ -435,6 +828,184 @@ declare class GenericRatesAccessor<S extends ScopeDeclaration> {
435
828
  constructor(transport: NucleusTransport);
436
829
  list(params?: GenericRateListParams): Promise<PaginatedResult<ResolveGenericRate<S>>>;
437
830
  getById(id: string): Promise<SingleResult<ResolveGenericRate<S>>>;
831
+ /** Create a generic rate. Requires `genericRates.create` scope. */
832
+ create(data: IfCreate<S['genericRates'], GenericRateCreateInput>): Promise<SingleResult<ResolveGenericRate<S>>>;
833
+ /** Update a generic rate. Requires `genericRates.update` scope. */
834
+ update(id: string, data: IfUpdate<S['genericRates'], GenericRateUpdateInput>): Promise<SingleResult<ResolveGenericRate<S>>>;
835
+ /** Soft-delete a generic rate. Requires `genericRates.delete` scope. */
836
+ delete(id: IfDelete<S['genericRates'], string>): Promise<SingleResult<null>>;
837
+ }
838
+
839
+ type JurisdictionListParams = {
840
+ search?: string;
841
+ page?: number;
842
+ pageSize?: number;
843
+ };
844
+ declare class JurisdictionsAccessor<S extends ScopeDeclaration> {
845
+ private readonly transport;
846
+ constructor(transport: NucleusTransport);
847
+ list(params?: JurisdictionListParams): Promise<PaginatedResult<ResolveJurisdiction<S>>>;
848
+ getById(id: string): Promise<SingleResult<ResolveJurisdiction<S>>>;
849
+ /** Create a jurisdiction. Requires `jurisdictions.create` scope. */
850
+ create(data: IfCreate<S['jurisdictions'], JurisdictionCreateInput>): Promise<SingleResult<ResolveJurisdiction<S>>>;
851
+ /** Update a jurisdiction. Requires `jurisdictions.update` scope. */
852
+ update(id: string, data: IfUpdate<S['jurisdictions'], JurisdictionUpdateInput>): Promise<SingleResult<ResolveJurisdiction<S>>>;
853
+ /** Soft-delete a jurisdiction. Requires `jurisdictions.delete` scope. */
854
+ delete(id: IfDelete<S['jurisdictions'], string>): Promise<SingleResult<null>>;
855
+ }
856
+
857
+ type LeaveTypeListParams = {
858
+ search?: string;
859
+ page?: number;
860
+ pageSize?: number;
861
+ };
862
+ declare class LeaveTypesAccessor<S extends ScopeDeclaration> {
863
+ private readonly transport;
864
+ constructor(transport: NucleusTransport);
865
+ list(params?: LeaveTypeListParams): Promise<PaginatedResult<ResolveLeaveType<S>>>;
866
+ getById(id: string): Promise<SingleResult<ResolveLeaveType<S>>>;
867
+ /** Create a leave type. Requires `leaveTypes.create` scope. */
868
+ create(data: IfCreate<S['leaveTypes'], LeaveTypeCreateInput>): Promise<SingleResult<ResolveLeaveType<S>>>;
869
+ /** Update a leave type. Requires `leaveTypes.update` scope. */
870
+ update(id: string, data: IfUpdate<S['leaveTypes'], LeaveTypeUpdateInput>): Promise<SingleResult<ResolveLeaveType<S>>>;
871
+ /** Soft-delete a leave type. Requires `leaveTypes.delete` scope. */
872
+ delete(id: IfDelete<S['leaveTypes'], string>): Promise<SingleResult<null>>;
873
+ }
874
+
875
+ type LeaveListParams = {
876
+ employeeId?: string;
877
+ leaveTypeId?: string;
878
+ status?: string;
879
+ page?: number;
880
+ pageSize?: number;
881
+ expand?: readonly LeaveExpandPath[];
882
+ };
883
+ declare class LeavesAccessor<S extends ScopeDeclaration> {
884
+ private readonly transport;
885
+ constructor(transport: NucleusTransport);
886
+ list<E extends readonly LeaveExpandPath[] = never[]>(params?: LeaveListParams & {
887
+ expand?: E;
888
+ }): Promise<PaginatedResult<WithLeaveExpand<ResolveLeave<S>, E, S>>>;
889
+ getById<E extends readonly LeaveExpandPath[] = never[]>(id: string, options?: {
890
+ expand?: E;
891
+ }): Promise<SingleResult<WithLeaveExpand<ResolveLeave<S>, E, S>>>;
892
+ /** Create a leave record. Requires `leaves.create` scope. */
893
+ create(data: IfCreate<S['leaves'], LeaveCreateInput>): Promise<SingleResult<ResolveLeave<S>>>;
894
+ /** Update a leave record. Requires `leaves.update` scope. */
895
+ update(id: string, data: IfUpdate<S['leaves'], LeaveUpdateInput>): Promise<SingleResult<ResolveLeave<S>>>;
896
+ /** Soft-delete a leave record. Requires `leaves.delete` scope. */
897
+ delete(id: IfDelete<S['leaves'], string>): Promise<SingleResult<null>>;
898
+ }
899
+
900
+ type LeaveBalanceListParams = {
901
+ employeeId?: string;
902
+ leaveTypeId?: string;
903
+ year?: number;
904
+ page?: number;
905
+ pageSize?: number;
906
+ expand?: readonly LeaveBalanceExpandPath[];
907
+ };
908
+ declare class LeaveBalancesAccessor<S extends ScopeDeclaration> {
909
+ private readonly transport;
910
+ constructor(transport: NucleusTransport);
911
+ list<E extends readonly LeaveBalanceExpandPath[] = never[]>(params?: LeaveBalanceListParams & {
912
+ expand?: E;
913
+ }): Promise<PaginatedResult<WithLeaveBalanceExpand<ResolveLeaveBalance<S>, E, S>>>;
914
+ getById<E extends readonly LeaveBalanceExpandPath[] = never[]>(id: string, options?: {
915
+ expand?: E;
916
+ }): Promise<SingleResult<WithLeaveBalanceExpand<ResolveLeaveBalance<S>, E, S>>>;
917
+ /** Create a leave balance. Requires `leaveBalances.create` scope. */
918
+ create(data: IfCreate<S['leaveBalances'], LeaveBalanceCreateInput>): Promise<SingleResult<ResolveLeaveBalance<S>>>;
919
+ /** Update a leave balance. Requires `leaveBalances.update` scope. */
920
+ update(id: string, data: IfUpdate<S['leaveBalances'], LeaveBalanceUpdateInput>): Promise<SingleResult<ResolveLeaveBalance<S>>>;
921
+ /** Soft-delete a leave balance. Requires `leaveBalances.delete` scope. */
922
+ delete(id: IfDelete<S['leaveBalances'], string>): Promise<SingleResult<null>>;
923
+ }
924
+
925
+ type PolicyListParams = {
926
+ search?: string;
927
+ category?: string;
928
+ page?: number;
929
+ pageSize?: number;
930
+ };
931
+ declare class PoliciesAccessor<S extends ScopeDeclaration> {
932
+ private readonly transport;
933
+ constructor(transport: NucleusTransport);
934
+ list(params?: PolicyListParams): Promise<PaginatedResult<ResolvePolicy<S>>>;
935
+ getById(id: string): Promise<SingleResult<ResolvePolicy<S>>>;
936
+ /** Create a policy. Requires `policies.create` scope. */
937
+ create(data: IfCreate<S['policies'], PolicyCreateInput>): Promise<SingleResult<ResolvePolicy<S>>>;
938
+ /** Update a policy. Requires `policies.update` scope. */
939
+ update(id: string, data: IfUpdate<S['policies'], PolicyUpdateInput>): Promise<SingleResult<ResolvePolicy<S>>>;
940
+ /** Soft-delete a policy. Requires `policies.delete` scope. */
941
+ delete(id: IfDelete<S['policies'], string>): Promise<SingleResult<null>>;
942
+ }
943
+
944
+ type PolicyAcknowledgementListParams = {
945
+ policyId?: string;
946
+ employeeId?: string;
947
+ page?: number;
948
+ pageSize?: number;
949
+ expand?: readonly PolicyAcknowledgementExpandPath[];
950
+ };
951
+ declare class PolicyAcknowledgementsAccessor<S extends ScopeDeclaration> {
952
+ private readonly transport;
953
+ constructor(transport: NucleusTransport);
954
+ list<E extends readonly PolicyAcknowledgementExpandPath[] = never[]>(params?: PolicyAcknowledgementListParams & {
955
+ expand?: E;
956
+ }): Promise<PaginatedResult<WithPolicyAcknowledgementExpand<ResolvePolicyAcknowledgement<S>, E, S>>>;
957
+ getById<E extends readonly PolicyAcknowledgementExpandPath[] = never[]>(id: string, options?: {
958
+ expand?: E;
959
+ }): Promise<SingleResult<WithPolicyAcknowledgementExpand<ResolvePolicyAcknowledgement<S>, E, S>>>;
960
+ /** Create a policy acknowledgement. Requires `policyAcknowledgements.create` scope. */
961
+ create(data: IfCreate<S['policyAcknowledgements'], PolicyAcknowledgementCreateInput>): Promise<SingleResult<ResolvePolicyAcknowledgement<S>>>;
962
+ /** Update a policy acknowledgement. Requires `policyAcknowledgements.update` scope. */
963
+ update(id: string, data: IfUpdate<S['policyAcknowledgements'], PolicyAcknowledgementUpdateInput>): Promise<SingleResult<ResolvePolicyAcknowledgement<S>>>;
964
+ /** Soft-delete a policy acknowledgement. Requires `policyAcknowledgements.delete` scope. */
965
+ delete(id: IfDelete<S['policyAcknowledgements'], string>): Promise<SingleResult<null>>;
966
+ }
967
+
968
+ type CalendarEventListParams = {
969
+ search?: string;
970
+ type?: string;
971
+ page?: number;
972
+ pageSize?: number;
973
+ };
974
+ declare class CalendarEventsAccessor<S extends ScopeDeclaration> {
975
+ private readonly transport;
976
+ constructor(transport: NucleusTransport);
977
+ list(params?: CalendarEventListParams): Promise<PaginatedResult<ResolveCalendarEvent<S>>>;
978
+ getById(id: string): Promise<SingleResult<ResolveCalendarEvent<S>>>;
979
+ /** Create a calendar event. Requires `calendarEvents.create` scope. */
980
+ create(data: IfCreate<S['calendarEvents'], CalendarEventCreateInput>): Promise<SingleResult<ResolveCalendarEvent<S>>>;
981
+ /** Update a calendar event. Requires `calendarEvents.update` scope. */
982
+ update(id: string, data: IfUpdate<S['calendarEvents'], CalendarEventUpdateInput>): Promise<SingleResult<ResolveCalendarEvent<S>>>;
983
+ /** Soft-delete a calendar event. Requires `calendarEvents.delete` scope. */
984
+ delete(id: IfDelete<S['calendarEvents'], string>): Promise<SingleResult<null>>;
985
+ }
986
+
987
+ type TimesheetListParams = {
988
+ employeeId?: string;
989
+ projectId?: string;
990
+ page?: number;
991
+ pageSize?: number;
992
+ expand?: readonly TimesheetExpandPath[];
993
+ };
994
+ declare class TimesheetsAccessor<S extends ScopeDeclaration> {
995
+ private readonly transport;
996
+ constructor(transport: NucleusTransport);
997
+ list<E extends readonly TimesheetExpandPath[] = never[]>(params?: TimesheetListParams & {
998
+ expand?: E;
999
+ }): Promise<PaginatedResult<WithTimesheetExpand<ResolveTimesheet<S>, E, S>>>;
1000
+ getById<E extends readonly TimesheetExpandPath[] = never[]>(id: string, options?: {
1001
+ expand?: E;
1002
+ }): Promise<SingleResult<WithTimesheetExpand<ResolveTimesheet<S>, E, S>>>;
1003
+ /** Create a timesheet entry. Requires `timesheets.create` scope. */
1004
+ create(data: IfCreate<S['timesheets'], TimesheetCreateInput>): Promise<SingleResult<ResolveTimesheet<S>>>;
1005
+ /** Update a timesheet entry. Requires `timesheets.update` scope. */
1006
+ update(id: string, data: IfUpdate<S['timesheets'], TimesheetUpdateInput>): Promise<SingleResult<ResolveTimesheet<S>>>;
1007
+ /** Soft-delete a timesheet entry. Requires `timesheets.delete` scope. */
1008
+ delete(id: IfDelete<S['timesheets'], string>): Promise<SingleResult<null>>;
438
1009
  }
439
1010
 
440
1011
  /**
@@ -566,9 +1137,9 @@ type NucleusClientConfig<S extends ScopeDeclaration> = {
566
1137
  * export const nucleus = new NucleusClient({
567
1138
  * token: process.env.NUCLEUS_TOKEN!,
568
1139
  * scopes: {
569
- * employees: ['identity', 'employment'],
570
- * projects: ['core'],
571
- * clients: ['identity'],
1140
+ * employees: { read: ['identity', 'employment'], update: ['contact'] },
1141
+ * projects: { read: ['core'] },
1142
+ * leaves: { read: ['core'], create: ['core'], delete: true },
572
1143
  * },
573
1144
  * });
574
1145
  * ```
@@ -586,6 +1157,14 @@ declare class NucleusClient<const S extends ScopeDeclaration> {
586
1157
  readonly projectTypes: ProjectTypesAccessor<S>;
587
1158
  readonly currencies: CurrenciesAccessor<S>;
588
1159
  readonly genericRates: GenericRatesAccessor<S>;
1160
+ readonly jurisdictions: JurisdictionsAccessor<S>;
1161
+ readonly leaveTypes: LeaveTypesAccessor<S>;
1162
+ readonly leaves: LeavesAccessor<S>;
1163
+ readonly leaveBalances: LeaveBalancesAccessor<S>;
1164
+ readonly policies: PoliciesAccessor<S>;
1165
+ readonly policyAcknowledgements: PolicyAcknowledgementsAccessor<S>;
1166
+ readonly calendarEvents: CalendarEventsAccessor<S>;
1167
+ readonly timesheets: TimesheetsAccessor<S>;
589
1168
  readonly apps: AppsAccessor;
590
1169
  readonly files: FilesAccessor;
591
1170
  readonly auth: AuthAccessor;
@@ -593,5 +1172,5 @@ declare class NucleusClient<const S extends ScopeDeclaration> {
593
1172
  }
594
1173
 
595
1174
  export { FilesAccessor, NucleusClient, isError };
596
- export type { AppInfo, AppScopeInfo, ClientContact, ClientExpandPath, ClientFinancials, ClientIdentity, ClientNotes, CurrencyCore, DepartmentCore, EmployeeCompensation, EmployeeCompensationHistory, EmployeeContact, EmployeeEmployment, EmployeeExpandPath, EmployeeIdentity, EmployeeSensitive, ErrorCode, ErrorResult, ListParams as FileListParams, FileRecord, FileUrlResult, FileVisibility, GenericRateCore, GenericRateFinancials, GetUrlOptions, ListMeta, ListResult, NucleusClientConfig, PaginatedResult, PartnerContact, PartnerExpandPath, PartnerIdentity, PartnerNotes, ProjectCore, ProjectExpandPath, ProjectFinancials, ProjectIntegrations, ProjectMembership, ProjectTeam, ProjectTypeCore, ResolveClient, ResolveCurrency, ResolveDepartment, ResolveEmployee, ResolveGenericRate, ResolvePartner, ResolveProject, ResolveProjectType, ScopeDeclaration, SingleResult, SuccessResult, UploadParams, VerifiedToken, WithClientExpand, WithEmployeeExpand, WithPartnerExpand, WithProjectExpand };
1175
+ export type { AppInfo, AppPermissionInfo, AppScopeInfo, CalendarEventCore, ClientContact, ClientExpandPath, ClientFinancials, ClientIdentity, ClientNotes, CurrencyCore, DepartmentCore, EmployeeCompensation, EmployeeCompensationHistory, EmployeeContact, EmployeeEmployment, EmployeeExpandPath, EmployeeIdentity, EmployeeSensitive, ErrorCode, ErrorResult, ListParams as FileListParams, FileRecord, FileUrlResult, FileVisibility, GenericRateCore, GenericRateFinancials, GetUrlOptions, JurisdictionCore, LeaveBalanceCore, LeaveBalanceExpandPath, LeaveCore, LeaveDetails, LeaveExpandPath, LeaveTypeCore, ListMeta, ListResult, NucleusClientConfig, PaginatedResult, PartnerContact, PartnerExpandPath, PartnerIdentity, PartnerNotes, PolicyAcknowledgementCore, PolicyAcknowledgementExpandPath, PolicyContent, PolicyCore, ProjectCore, ProjectExpandPath, ProjectFinancials, ProjectIntegrations, ProjectMembership, ProjectTeam, ProjectTypeCore, ResolveCalendarEvent, ResolveClient, ResolveCurrency, ResolveDepartment, ResolveEmployee, ResolveGenericRate, ResolveJurisdiction, ResolveLeave, ResolveLeaveBalance, ResolveLeaveType, ResolvePartner, ResolvePolicy, ResolvePolicyAcknowledgement, ResolveProject, ResolveProjectType, ResolveTimesheet, ScopeDeclaration, SingleResult, SuccessResult, TimesheetCore, TimesheetDetails, TimesheetExpandPath, TimesheetIntegrations, UploadParams, VerifiedToken, WithClientExpand, WithEmployeeExpand, WithLeaveBalanceExpand, WithLeaveExpand, WithPartnerExpand, WithPolicyAcknowledgementExpand, WithProjectExpand, WithTimesheetExpand };
597
1176
  //# sourceMappingURL=index.d.cts.map