@typeb-digital/nucleus-sdk 0.0.6 → 0.1.1

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,183 @@ 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
+ };
357
+ /** A resource Nucleus owns the writes for — only `read` may be declared. */
358
+ type ReadOnlyResourceScope<M> = {
359
+ read?: readonly (keyof M)[];
360
+ };
219
361
  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)[];
362
+ employees?: ReadOnlyResourceScope<EmployeeBucketMap>;
363
+ projects?: ResourceScope<ProjectBucketMap>;
364
+ clients?: ResourceScope<ClientBucketMap>;
365
+ partners?: ResourceScope<PartnerBucketMap>;
366
+ departments?: ResourceScope<DepartmentBucketMap>;
367
+ projectTypes?: ResourceScope<ProjectTypeBucketMap>;
368
+ currencies?: ResourceScope<CurrencyBucketMap>;
369
+ genericRates?: ResourceScope<GenericRateBucketMap>;
370
+ jurisdictions?: ResourceScope<JurisdictionBucketMap>;
371
+ leaveTypes?: ResourceScope<LeaveTypeBucketMap>;
372
+ leaves?: ResourceScope<LeaveBucketMap>;
373
+ leaveBalances?: ResourceScope<LeaveBalanceBucketMap>;
374
+ policies?: ResourceScope<PolicyBucketMap>;
375
+ policyAcknowledgements?: ResourceScope<PolicyAcknowledgementBucketMap>;
376
+ calendarEvents?: ResourceScope<CalendarEventBucketMap>;
377
+ timesheets?: ResourceScope<TimesheetBucketMap>;
228
378
  };
379
+ type ReadOf<RS, M> = RS extends {
380
+ read: readonly (keyof M)[];
381
+ } ? RS['read'] : readonly [];
382
+ type IfCreate<RS, T> = RS extends {
383
+ create: readonly [unknown, ...unknown[]];
384
+ } ? T : never;
385
+ type IfUpdate<RS, T> = RS extends {
386
+ update: readonly [unknown, ...unknown[]];
387
+ } ? T : never;
388
+ type IfDelete<RS, T> = RS extends {
389
+ delete: true;
390
+ } ? T : never;
229
391
  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']>;
392
+ type ResolveEmployee<S extends ScopeDeclaration> = ResolveBuckets<EmployeeBucketMap, ReadOf<S['employees'], EmployeeBucketMap>>;
393
+ type ResolveProject<S extends ScopeDeclaration> = ResolveBuckets<ProjectBucketMap, ReadOf<S['projects'], ProjectBucketMap>>;
394
+ type ResolveClient<S extends ScopeDeclaration> = ResolveBuckets<ClientBucketMap, ReadOf<S['clients'], ClientBucketMap>>;
395
+ type ResolvePartner<S extends ScopeDeclaration> = ResolveBuckets<PartnerBucketMap, ReadOf<S['partners'], PartnerBucketMap>>;
396
+ type ResolveDepartment<S extends ScopeDeclaration> = ResolveBuckets<DepartmentBucketMap, ReadOf<S['departments'], DepartmentBucketMap>>;
397
+ type ResolveProjectType<S extends ScopeDeclaration> = ResolveBuckets<ProjectTypeBucketMap, ReadOf<S['projectTypes'], ProjectTypeBucketMap>>;
398
+ type ResolveCurrency<S extends ScopeDeclaration> = ResolveBuckets<CurrencyBucketMap, ReadOf<S['currencies'], CurrencyBucketMap>>;
399
+ type ResolveGenericRate<S extends ScopeDeclaration> = ResolveBuckets<GenericRateBucketMap, ReadOf<S['genericRates'], GenericRateBucketMap>>;
400
+ type ResolveJurisdiction<S extends ScopeDeclaration> = ResolveBuckets<JurisdictionBucketMap, ReadOf<S['jurisdictions'], JurisdictionBucketMap>>;
401
+ type ResolveLeaveType<S extends ScopeDeclaration> = ResolveBuckets<LeaveTypeBucketMap, ReadOf<S['leaveTypes'], LeaveTypeBucketMap>>;
402
+ type ResolveLeave<S extends ScopeDeclaration> = ResolveBuckets<LeaveBucketMap, ReadOf<S['leaves'], LeaveBucketMap>>;
403
+ type ResolveLeaveBalance<S extends ScopeDeclaration> = ResolveBuckets<LeaveBalanceBucketMap, ReadOf<S['leaveBalances'], LeaveBalanceBucketMap>>;
404
+ type ResolvePolicy<S extends ScopeDeclaration> = ResolveBuckets<PolicyBucketMap, ReadOf<S['policies'], PolicyBucketMap>>;
405
+ type ResolvePolicyAcknowledgement<S extends ScopeDeclaration> = ResolveBuckets<PolicyAcknowledgementBucketMap, ReadOf<S['policyAcknowledgements'], PolicyAcknowledgementBucketMap>>;
406
+ type ResolveCalendarEvent<S extends ScopeDeclaration> = ResolveBuckets<CalendarEventBucketMap, ReadOf<S['calendarEvents'], CalendarEventBucketMap>>;
407
+ type ResolveTimesheet<S extends ScopeDeclaration> = ResolveBuckets<TimesheetBucketMap, ReadOf<S['timesheets'], TimesheetBucketMap>>;
238
408
  type EmployeeExpandPath = 'manager' | 'partner';
239
409
  type WithEmployeeExpand<T, E extends readonly EmployeeExpandPath[], S extends ScopeDeclaration> = T & ('manager' extends E[number] ? {
240
410
  manager: ResolveEmployee<S> | null;
@@ -274,6 +444,169 @@ type PartnerExpandPath = 'employees';
274
444
  type WithPartnerExpand<T, E extends readonly PartnerExpandPath[], S extends ScopeDeclaration> = T & ('employees' extends E[number] ? {
275
445
  employees: Array<ResolveEmployee<S>>;
276
446
  } : unknown);
447
+ type LeaveExpandPath = 'employee' | 'leaveType';
448
+ type WithLeaveExpand<T, E extends readonly LeaveExpandPath[], S extends ScopeDeclaration> = T & ('employee' extends E[number] ? {
449
+ employee: ResolveEmployee<S> | null;
450
+ } : unknown) & ('leaveType' extends E[number] ? {
451
+ leaveType: ResolveLeaveType<S> | null;
452
+ } : unknown);
453
+ type LeaveBalanceExpandPath = 'employee' | 'leaveType';
454
+ type WithLeaveBalanceExpand<T, E extends readonly LeaveBalanceExpandPath[], S extends ScopeDeclaration> = T & ('employee' extends E[number] ? {
455
+ employee: ResolveEmployee<S> | null;
456
+ } : unknown) & ('leaveType' extends E[number] ? {
457
+ leaveType: ResolveLeaveType<S> | null;
458
+ } : unknown);
459
+ type PolicyAcknowledgementExpandPath = 'employee' | 'policy';
460
+ type WithPolicyAcknowledgementExpand<T, E extends readonly PolicyAcknowledgementExpandPath[], S extends ScopeDeclaration> = T & ('employee' extends E[number] ? {
461
+ employee: ResolveEmployee<S> | null;
462
+ } : unknown) & ('policy' extends E[number] ? {
463
+ policy: ResolvePolicy<S> | null;
464
+ } : unknown);
465
+ type TimesheetExpandPath = 'employee' | 'project';
466
+ type WithTimesheetExpand<T, E extends readonly TimesheetExpandPath[], S extends ScopeDeclaration> = T & ('employee' extends E[number] ? {
467
+ employee: ResolveEmployee<S> | null;
468
+ } : unknown) & ('project' extends E[number] ? {
469
+ project: ResolveProject<S> | null;
470
+ } : unknown);
471
+ type LeaveCreateInput = {
472
+ employeeId: string;
473
+ leaveTypeId: string;
474
+ startDate: string;
475
+ endDate: string;
476
+ days: number;
477
+ reason?: string | null;
478
+ status?: string;
479
+ source?: string;
480
+ };
481
+ type LeaveUpdateInput = Partial<LeaveCreateInput>;
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
  }
@@ -353,6 +703,12 @@ declare class ProjectsAccessor<S extends ScopeDeclaration> {
353
703
  getById<E extends readonly ProjectExpandPath[] = never[]>(id: string, options?: {
354
704
  expand?: E;
355
705
  }): Promise<SingleResult<WithProjectExpand<ResolveProject<S>, E, S>>>;
706
+ /** Create a project. Requires `projects.create` scope. */
707
+ create(data: IfCreate<S['projects'], ProjectCreateInput>): Promise<SingleResult<ResolveProject<S>>>;
708
+ /** Update a project. Requires `projects.update` scope. */
709
+ update(id: string, data: IfUpdate<S['projects'], ProjectUpdateInput>): Promise<SingleResult<ResolveProject<S>>>;
710
+ /** Soft-delete a project. Requires `projects.delete` scope. */
711
+ delete(id: IfDelete<S['projects'], string>): Promise<SingleResult<null>>;
356
712
  }
357
713
 
358
714
  type ClientListParams = {
@@ -372,6 +728,12 @@ declare class ClientsAccessor<S extends ScopeDeclaration> {
372
728
  getById<E extends readonly ClientExpandPath[] = never[]>(id: string, options?: {
373
729
  expand?: E;
374
730
  }): Promise<SingleResult<WithClientExpand<ResolveClient<S>, E, S>>>;
731
+ /** Create a client. Requires `clients.create` scope. */
732
+ create(data: IfCreate<S['clients'], ClientCreateInput>): Promise<SingleResult<ResolveClient<S>>>;
733
+ /** Update a client. Requires `clients.update` scope. */
734
+ update(id: string, data: IfUpdate<S['clients'], ClientUpdateInput>): Promise<SingleResult<ResolveClient<S>>>;
735
+ /** Soft-delete a client. Requires `clients.delete` scope. */
736
+ delete(id: IfDelete<S['clients'], string>): Promise<SingleResult<null>>;
375
737
  }
376
738
 
377
739
  type PartnerListParams = {
@@ -389,6 +751,12 @@ declare class PartnersAccessor<S extends ScopeDeclaration> {
389
751
  getById<E extends readonly PartnerExpandPath[] = never[]>(id: string, options?: {
390
752
  expand?: E;
391
753
  }): Promise<SingleResult<WithPartnerExpand<ResolvePartner<S>, E, S>>>;
754
+ /** Create a partner. Requires `partners.create` scope. */
755
+ create(data: IfCreate<S['partners'], PartnerCreateInput>): Promise<SingleResult<ResolvePartner<S>>>;
756
+ /** Update a partner. Requires `partners.update` scope. */
757
+ update(id: string, data: IfUpdate<S['partners'], PartnerUpdateInput>): Promise<SingleResult<ResolvePartner<S>>>;
758
+ /** Soft-delete a partner. Requires `partners.delete` scope. */
759
+ delete(id: IfDelete<S['partners'], string>): Promise<SingleResult<null>>;
392
760
  }
393
761
 
394
762
  type DepartmentListParams = {
@@ -401,6 +769,12 @@ declare class DepartmentsAccessor<S extends ScopeDeclaration> {
401
769
  constructor(transport: NucleusTransport);
402
770
  list(params?: DepartmentListParams): Promise<PaginatedResult<ResolveDepartment<S>>>;
403
771
  getById(id: string): Promise<SingleResult<ResolveDepartment<S>>>;
772
+ /** Create a department. Requires `departments.create` scope. */
773
+ create(data: IfCreate<S['departments'], DepartmentCreateInput>): Promise<SingleResult<ResolveDepartment<S>>>;
774
+ /** Update a department. Requires `departments.update` scope. */
775
+ update(id: string, data: IfUpdate<S['departments'], DepartmentUpdateInput>): Promise<SingleResult<ResolveDepartment<S>>>;
776
+ /** Soft-delete a department. Requires `departments.delete` scope. */
777
+ delete(id: IfDelete<S['departments'], string>): Promise<SingleResult<null>>;
404
778
  }
405
779
 
406
780
  type ProjectTypeListParams = {
@@ -412,6 +786,12 @@ declare class ProjectTypesAccessor<S extends ScopeDeclaration> {
412
786
  constructor(transport: NucleusTransport);
413
787
  list(params?: ProjectTypeListParams): Promise<PaginatedResult<ResolveProjectType<S>>>;
414
788
  getById(id: string): Promise<SingleResult<ResolveProjectType<S>>>;
789
+ /** Create a project type. Requires `projectTypes.create` scope. */
790
+ create(data: IfCreate<S['projectTypes'], ProjectTypeCreateInput>): Promise<SingleResult<ResolveProjectType<S>>>;
791
+ /** Update a project type. Requires `projectTypes.update` scope. */
792
+ update(id: string, data: IfUpdate<S['projectTypes'], ProjectTypeUpdateInput>): Promise<SingleResult<ResolveProjectType<S>>>;
793
+ /** Soft-delete a project type. Requires `projectTypes.delete` scope. */
794
+ delete(id: IfDelete<S['projectTypes'], string>): Promise<SingleResult<null>>;
415
795
  }
416
796
 
417
797
  type CurrencyListParams = {
@@ -423,6 +803,15 @@ declare class CurrenciesAccessor<S extends ScopeDeclaration> {
423
803
  constructor(transport: NucleusTransport);
424
804
  list(params?: CurrencyListParams): Promise<PaginatedResult<ResolveCurrency<S>>>;
425
805
  getByCode(code: string): Promise<SingleResult<ResolveCurrency<S>>>;
806
+ /** Create a currency. Requires `currencies.create` scope. */
807
+ create(data: IfCreate<S['currencies'], CurrencyCreateInput>): Promise<SingleResult<ResolveCurrency<S>>>;
808
+ /**
809
+ * Update a currency (keyed by its ISO code; `code` itself is immutable).
810
+ * Requires `currencies.update` scope.
811
+ */
812
+ update(code: string, data: IfUpdate<S['currencies'], CurrencyUpdateInput>): Promise<SingleResult<ResolveCurrency<S>>>;
813
+ /** Soft-delete a currency (keyed by its ISO code). Requires `currencies.delete` scope. */
814
+ delete(code: IfDelete<S['currencies'], string>): Promise<SingleResult<null>>;
426
815
  }
427
816
 
428
817
  type GenericRateListParams = {
@@ -435,6 +824,184 @@ declare class GenericRatesAccessor<S extends ScopeDeclaration> {
435
824
  constructor(transport: NucleusTransport);
436
825
  list(params?: GenericRateListParams): Promise<PaginatedResult<ResolveGenericRate<S>>>;
437
826
  getById(id: string): Promise<SingleResult<ResolveGenericRate<S>>>;
827
+ /** Create a generic rate. Requires `genericRates.create` scope. */
828
+ create(data: IfCreate<S['genericRates'], GenericRateCreateInput>): Promise<SingleResult<ResolveGenericRate<S>>>;
829
+ /** Update a generic rate. Requires `genericRates.update` scope. */
830
+ update(id: string, data: IfUpdate<S['genericRates'], GenericRateUpdateInput>): Promise<SingleResult<ResolveGenericRate<S>>>;
831
+ /** Soft-delete a generic rate. Requires `genericRates.delete` scope. */
832
+ delete(id: IfDelete<S['genericRates'], string>): Promise<SingleResult<null>>;
833
+ }
834
+
835
+ type JurisdictionListParams = {
836
+ search?: string;
837
+ page?: number;
838
+ pageSize?: number;
839
+ };
840
+ declare class JurisdictionsAccessor<S extends ScopeDeclaration> {
841
+ private readonly transport;
842
+ constructor(transport: NucleusTransport);
843
+ list(params?: JurisdictionListParams): Promise<PaginatedResult<ResolveJurisdiction<S>>>;
844
+ getById(id: string): Promise<SingleResult<ResolveJurisdiction<S>>>;
845
+ /** Create a jurisdiction. Requires `jurisdictions.create` scope. */
846
+ create(data: IfCreate<S['jurisdictions'], JurisdictionCreateInput>): Promise<SingleResult<ResolveJurisdiction<S>>>;
847
+ /** Update a jurisdiction. Requires `jurisdictions.update` scope. */
848
+ update(id: string, data: IfUpdate<S['jurisdictions'], JurisdictionUpdateInput>): Promise<SingleResult<ResolveJurisdiction<S>>>;
849
+ /** Soft-delete a jurisdiction. Requires `jurisdictions.delete` scope. */
850
+ delete(id: IfDelete<S['jurisdictions'], string>): Promise<SingleResult<null>>;
851
+ }
852
+
853
+ type LeaveTypeListParams = {
854
+ search?: string;
855
+ page?: number;
856
+ pageSize?: number;
857
+ };
858
+ declare class LeaveTypesAccessor<S extends ScopeDeclaration> {
859
+ private readonly transport;
860
+ constructor(transport: NucleusTransport);
861
+ list(params?: LeaveTypeListParams): Promise<PaginatedResult<ResolveLeaveType<S>>>;
862
+ getById(id: string): Promise<SingleResult<ResolveLeaveType<S>>>;
863
+ /** Create a leave type. Requires `leaveTypes.create` scope. */
864
+ create(data: IfCreate<S['leaveTypes'], LeaveTypeCreateInput>): Promise<SingleResult<ResolveLeaveType<S>>>;
865
+ /** Update a leave type. Requires `leaveTypes.update` scope. */
866
+ update(id: string, data: IfUpdate<S['leaveTypes'], LeaveTypeUpdateInput>): Promise<SingleResult<ResolveLeaveType<S>>>;
867
+ /** Soft-delete a leave type. Requires `leaveTypes.delete` scope. */
868
+ delete(id: IfDelete<S['leaveTypes'], string>): Promise<SingleResult<null>>;
869
+ }
870
+
871
+ type LeaveListParams = {
872
+ employeeId?: string;
873
+ leaveTypeId?: string;
874
+ status?: string;
875
+ page?: number;
876
+ pageSize?: number;
877
+ expand?: readonly LeaveExpandPath[];
878
+ };
879
+ declare class LeavesAccessor<S extends ScopeDeclaration> {
880
+ private readonly transport;
881
+ constructor(transport: NucleusTransport);
882
+ list<E extends readonly LeaveExpandPath[] = never[]>(params?: LeaveListParams & {
883
+ expand?: E;
884
+ }): Promise<PaginatedResult<WithLeaveExpand<ResolveLeave<S>, E, S>>>;
885
+ getById<E extends readonly LeaveExpandPath[] = never[]>(id: string, options?: {
886
+ expand?: E;
887
+ }): Promise<SingleResult<WithLeaveExpand<ResolveLeave<S>, E, S>>>;
888
+ /** Create a leave record. Requires `leaves.create` scope. */
889
+ create(data: IfCreate<S['leaves'], LeaveCreateInput>): Promise<SingleResult<ResolveLeave<S>>>;
890
+ /** Update a leave record. Requires `leaves.update` scope. */
891
+ update(id: string, data: IfUpdate<S['leaves'], LeaveUpdateInput>): Promise<SingleResult<ResolveLeave<S>>>;
892
+ /** Soft-delete a leave record. Requires `leaves.delete` scope. */
893
+ delete(id: IfDelete<S['leaves'], string>): Promise<SingleResult<null>>;
894
+ }
895
+
896
+ type LeaveBalanceListParams = {
897
+ employeeId?: string;
898
+ leaveTypeId?: string;
899
+ year?: number;
900
+ page?: number;
901
+ pageSize?: number;
902
+ expand?: readonly LeaveBalanceExpandPath[];
903
+ };
904
+ declare class LeaveBalancesAccessor<S extends ScopeDeclaration> {
905
+ private readonly transport;
906
+ constructor(transport: NucleusTransport);
907
+ list<E extends readonly LeaveBalanceExpandPath[] = never[]>(params?: LeaveBalanceListParams & {
908
+ expand?: E;
909
+ }): Promise<PaginatedResult<WithLeaveBalanceExpand<ResolveLeaveBalance<S>, E, S>>>;
910
+ getById<E extends readonly LeaveBalanceExpandPath[] = never[]>(id: string, options?: {
911
+ expand?: E;
912
+ }): Promise<SingleResult<WithLeaveBalanceExpand<ResolveLeaveBalance<S>, E, S>>>;
913
+ /** Create a leave balance. Requires `leaveBalances.create` scope. */
914
+ create(data: IfCreate<S['leaveBalances'], LeaveBalanceCreateInput>): Promise<SingleResult<ResolveLeaveBalance<S>>>;
915
+ /** Update a leave balance. Requires `leaveBalances.update` scope. */
916
+ update(id: string, data: IfUpdate<S['leaveBalances'], LeaveBalanceUpdateInput>): Promise<SingleResult<ResolveLeaveBalance<S>>>;
917
+ /** Soft-delete a leave balance. Requires `leaveBalances.delete` scope. */
918
+ delete(id: IfDelete<S['leaveBalances'], string>): Promise<SingleResult<null>>;
919
+ }
920
+
921
+ type PolicyListParams = {
922
+ search?: string;
923
+ category?: string;
924
+ page?: number;
925
+ pageSize?: number;
926
+ };
927
+ declare class PoliciesAccessor<S extends ScopeDeclaration> {
928
+ private readonly transport;
929
+ constructor(transport: NucleusTransport);
930
+ list(params?: PolicyListParams): Promise<PaginatedResult<ResolvePolicy<S>>>;
931
+ getById(id: string): Promise<SingleResult<ResolvePolicy<S>>>;
932
+ /** Create a policy. Requires `policies.create` scope. */
933
+ create(data: IfCreate<S['policies'], PolicyCreateInput>): Promise<SingleResult<ResolvePolicy<S>>>;
934
+ /** Update a policy. Requires `policies.update` scope. */
935
+ update(id: string, data: IfUpdate<S['policies'], PolicyUpdateInput>): Promise<SingleResult<ResolvePolicy<S>>>;
936
+ /** Soft-delete a policy. Requires `policies.delete` scope. */
937
+ delete(id: IfDelete<S['policies'], string>): Promise<SingleResult<null>>;
938
+ }
939
+
940
+ type PolicyAcknowledgementListParams = {
941
+ policyId?: string;
942
+ employeeId?: string;
943
+ page?: number;
944
+ pageSize?: number;
945
+ expand?: readonly PolicyAcknowledgementExpandPath[];
946
+ };
947
+ declare class PolicyAcknowledgementsAccessor<S extends ScopeDeclaration> {
948
+ private readonly transport;
949
+ constructor(transport: NucleusTransport);
950
+ list<E extends readonly PolicyAcknowledgementExpandPath[] = never[]>(params?: PolicyAcknowledgementListParams & {
951
+ expand?: E;
952
+ }): Promise<PaginatedResult<WithPolicyAcknowledgementExpand<ResolvePolicyAcknowledgement<S>, E, S>>>;
953
+ getById<E extends readonly PolicyAcknowledgementExpandPath[] = never[]>(id: string, options?: {
954
+ expand?: E;
955
+ }): Promise<SingleResult<WithPolicyAcknowledgementExpand<ResolvePolicyAcknowledgement<S>, E, S>>>;
956
+ /** Create a policy acknowledgement. Requires `policyAcknowledgements.create` scope. */
957
+ create(data: IfCreate<S['policyAcknowledgements'], PolicyAcknowledgementCreateInput>): Promise<SingleResult<ResolvePolicyAcknowledgement<S>>>;
958
+ /** Update a policy acknowledgement. Requires `policyAcknowledgements.update` scope. */
959
+ update(id: string, data: IfUpdate<S['policyAcknowledgements'], PolicyAcknowledgementUpdateInput>): Promise<SingleResult<ResolvePolicyAcknowledgement<S>>>;
960
+ /** Soft-delete a policy acknowledgement. Requires `policyAcknowledgements.delete` scope. */
961
+ delete(id: IfDelete<S['policyAcknowledgements'], string>): Promise<SingleResult<null>>;
962
+ }
963
+
964
+ type CalendarEventListParams = {
965
+ search?: string;
966
+ type?: string;
967
+ page?: number;
968
+ pageSize?: number;
969
+ };
970
+ declare class CalendarEventsAccessor<S extends ScopeDeclaration> {
971
+ private readonly transport;
972
+ constructor(transport: NucleusTransport);
973
+ list(params?: CalendarEventListParams): Promise<PaginatedResult<ResolveCalendarEvent<S>>>;
974
+ getById(id: string): Promise<SingleResult<ResolveCalendarEvent<S>>>;
975
+ /** Create a calendar event. Requires `calendarEvents.create` scope. */
976
+ create(data: IfCreate<S['calendarEvents'], CalendarEventCreateInput>): Promise<SingleResult<ResolveCalendarEvent<S>>>;
977
+ /** Update a calendar event. Requires `calendarEvents.update` scope. */
978
+ update(id: string, data: IfUpdate<S['calendarEvents'], CalendarEventUpdateInput>): Promise<SingleResult<ResolveCalendarEvent<S>>>;
979
+ /** Soft-delete a calendar event. Requires `calendarEvents.delete` scope. */
980
+ delete(id: IfDelete<S['calendarEvents'], string>): Promise<SingleResult<null>>;
981
+ }
982
+
983
+ type TimesheetListParams = {
984
+ employeeId?: string;
985
+ projectId?: string;
986
+ page?: number;
987
+ pageSize?: number;
988
+ expand?: readonly TimesheetExpandPath[];
989
+ };
990
+ declare class TimesheetsAccessor<S extends ScopeDeclaration> {
991
+ private readonly transport;
992
+ constructor(transport: NucleusTransport);
993
+ list<E extends readonly TimesheetExpandPath[] = never[]>(params?: TimesheetListParams & {
994
+ expand?: E;
995
+ }): Promise<PaginatedResult<WithTimesheetExpand<ResolveTimesheet<S>, E, S>>>;
996
+ getById<E extends readonly TimesheetExpandPath[] = never[]>(id: string, options?: {
997
+ expand?: E;
998
+ }): Promise<SingleResult<WithTimesheetExpand<ResolveTimesheet<S>, E, S>>>;
999
+ /** Create a timesheet entry. Requires `timesheets.create` scope. */
1000
+ create(data: IfCreate<S['timesheets'], TimesheetCreateInput>): Promise<SingleResult<ResolveTimesheet<S>>>;
1001
+ /** Update a timesheet entry. Requires `timesheets.update` scope. */
1002
+ update(id: string, data: IfUpdate<S['timesheets'], TimesheetUpdateInput>): Promise<SingleResult<ResolveTimesheet<S>>>;
1003
+ /** Soft-delete a timesheet entry. Requires `timesheets.delete` scope. */
1004
+ delete(id: IfDelete<S['timesheets'], string>): Promise<SingleResult<null>>;
438
1005
  }
439
1006
 
440
1007
  /**
@@ -566,9 +1133,9 @@ type NucleusClientConfig<S extends ScopeDeclaration> = {
566
1133
  * export const nucleus = new NucleusClient({
567
1134
  * token: process.env.NUCLEUS_TOKEN!,
568
1135
  * scopes: {
569
- * employees: ['identity', 'employment'],
570
- * projects: ['core'],
571
- * clients: ['identity'],
1136
+ * employees: { read: ['identity', 'employment'], update: ['contact'] },
1137
+ * projects: { read: ['core'] },
1138
+ * leaves: { read: ['core'], create: ['core'], delete: true },
572
1139
  * },
573
1140
  * });
574
1141
  * ```
@@ -586,6 +1153,14 @@ declare class NucleusClient<const S extends ScopeDeclaration> {
586
1153
  readonly projectTypes: ProjectTypesAccessor<S>;
587
1154
  readonly currencies: CurrenciesAccessor<S>;
588
1155
  readonly genericRates: GenericRatesAccessor<S>;
1156
+ readonly jurisdictions: JurisdictionsAccessor<S>;
1157
+ readonly leaveTypes: LeaveTypesAccessor<S>;
1158
+ readonly leaves: LeavesAccessor<S>;
1159
+ readonly leaveBalances: LeaveBalancesAccessor<S>;
1160
+ readonly policies: PoliciesAccessor<S>;
1161
+ readonly policyAcknowledgements: PolicyAcknowledgementsAccessor<S>;
1162
+ readonly calendarEvents: CalendarEventsAccessor<S>;
1163
+ readonly timesheets: TimesheetsAccessor<S>;
589
1164
  readonly apps: AppsAccessor;
590
1165
  readonly files: FilesAccessor;
591
1166
  readonly auth: AuthAccessor;
@@ -593,5 +1168,5 @@ declare class NucleusClient<const S extends ScopeDeclaration> {
593
1168
  }
594
1169
 
595
1170
  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 };
1171
+ 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
1172
  //# sourceMappingURL=index.d.cts.map