@critical-path/core 0.48.1 → 0.50.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.
package/README.md CHANGED
@@ -190,6 +190,10 @@ await asVic.createTask({ projectId, title: 'x' }); // ForbiddenError if vic is o
190
190
 
191
191
  Checks run on `withActor` views (the base engine is trusted). Roles come from `project.members`: users (`{ userId, role }`) or whole teams (`{ teamId, role }`), with roles `viewer` < `contributor` < `project_manager` < `admin`. Project creators become `admin`. Actors with `roles: ['admin']` are superusers. Projects the actor cannot read, or that belong to another tenant, behave as if they do not exist (`NotFoundError`). Lists are filtered. Records created through a view are stamped with the actor's `tenantId`. See the docs site's Authorization page for the full permission matrix and custom policies.
192
192
 
193
+ #### Custom fields
194
+
195
+ Every entity (projects, workflows, teams, tasks, containers, iterations, deliverables, comments, attachments, time entries, dependencies, webhooks) accepts a `customFields` JSON object on create and update for your own data. Task custom fields are validated against the project's `customFieldDefinitions`; on other entities any JSON object is stored as-is. Updates replace the whole object.
196
+
193
197
  #### Webhooks
194
198
 
195
199
  ```ts
@@ -84,6 +84,16 @@ export declare class CriticalPathEngine {
84
84
  private projectIdOfComment;
85
85
  private projectIdOfAttachment;
86
86
  /** Strips fields only the engine may set (tenancy) from updates made through a view. */
87
+ /**
88
+ * Removes fields an update may never change: the id and timestamps, the record's owner
89
+ * (`owned`, e.g. `projectId`), and on actor views the tenant. Routers strip these through their
90
+ * schemas; this protects plugin routes and direct engine callers too.
91
+ */
92
+ private withoutOwnership;
93
+ /** The project, or `NotFoundError`. Checked even when no policy is enforced, so records cannot be orphaned. */
94
+ private requireExistingProject;
95
+ /** A workflow a project may use: it must exist and belong to the project's tenant. */
96
+ private assertUsableWorkflow;
87
97
  private withoutTenant;
88
98
  private initialize;
89
99
  private seedInitialData;
@@ -127,6 +137,11 @@ export declare class CriticalPathEngine {
127
137
  actorType?: string;
128
138
  };
129
139
  }): Promise<Task | null>;
140
+ /**
141
+ * After a task completes or is canceled, unblocks downstream tasks whose upstream tasks are all
142
+ * completed or canceled. Runs on an elevated view, so upstream tasks the caller cannot read still
143
+ * count, and resolves each task's status against its own project's definitions.
144
+ */
130
145
  private checkAndUnblockDownstreamTasks;
131
146
  /**
132
147
  * Deletes a task and everything that belongs to it: subtasks (or, with `subtasks: 'detach'`,
@@ -143,10 +158,13 @@ export declare class CriticalPathEngine {
143
158
  * descendants (which would create a cycle).
144
159
  */
145
160
  private assertValidParent;
161
+ /** A task's direct subtasks, paged through the store's parent filter (indexed in SQLite). */
162
+ private childTasks;
146
163
  /** Removes records owned by a task; the task's deletion was already authorized. */
147
164
  private deleteTaskChildren;
148
165
  /** Removes a dependency between two tasks. Requires `task.update` on the dependent task's project. */
149
166
  removeDependency(id: string): Promise<boolean>;
167
+ /** Adds a dependency. Adding one that already exists (same tasks and type) returns the existing one. */
150
168
  addDependency(dep: Omit<TaskDependency, 'id'>): Promise<TaskDependency>;
151
169
  /**
152
170
  * Collects every dependency edge reachable upstream from `startTaskId`. A new edge
@@ -203,6 +221,7 @@ export declare class CriticalPathEngine {
203
221
  uploaderType?: 'user' | 'agent' | 'system';
204
222
  artifactType?: 'plan' | 'spec' | 'deliverable' | 'review' | 'general';
205
223
  metadata?: Record<string, unknown>;
224
+ customFields?: Record<string, unknown>;
206
225
  }): Promise<Attachment>;
207
226
  readAttachmentText(id: string): Promise<string>;
208
227
  /**
@@ -306,11 +325,12 @@ export declare class CriticalPathEngine {
306
325
  events: Webhook['events'];
307
326
  secret?: string;
308
327
  active?: boolean;
328
+ customFields?: Record<string, unknown>;
309
329
  }): Promise<{
310
330
  webhook: PublicWebhook;
311
331
  secret: string;
312
332
  }>;
313
- updateWebhook(id: string, updates: Partial<Pick<Webhook, 'name' | 'url' | 'events' | 'active' | 'secret'>>): Promise<PublicWebhook | null>;
333
+ updateWebhook(id: string, updates: Partial<Pick<Webhook, 'name' | 'url' | 'events' | 'active' | 'secret' | 'customFields'>>): Promise<PublicWebhook | null>;
314
334
  deleteWebhook(id: string): Promise<boolean>;
315
335
  private validateWebhookUrl;
316
336
  /** Finds the tenant an event belongs to, from the entity in its payload or its project. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
@@ -256,6 +256,31 @@ export class CriticalPathEngine {
256
256
  return a.projectId ?? (await this.projectIdOfTask(a.taskId)) ?? (await this.projectIdOfComment(a.commentId));
257
257
  }
258
258
  /** Strips fields only the engine may set (tenancy) from updates made through a view. */
259
+ /**
260
+ * Removes fields an update may never change: the id and timestamps, the record's owner
261
+ * (`owned`, e.g. `projectId`), and on actor views the tenant. Routers strip these through their
262
+ * schemas; this protects plugin routes and direct engine callers too.
263
+ */
264
+ withoutOwnership(updates, owned = []) {
265
+ const blocked = new Set(['id', 'createdAt', 'updatedAt', ...owned, ...(this.actor ? ['tenantId'] : [])]);
266
+ return Object.fromEntries(Object.entries(updates).filter(([key]) => !blocked.has(key)));
267
+ }
268
+ /** The project, or `NotFoundError`. Checked even when no policy is enforced, so records cannot be orphaned. */
269
+ async requireExistingProject(projectId) {
270
+ const project = await this.store.getProject(projectId);
271
+ if (!project)
272
+ throw new NotFoundError(`Project "${projectId}" not found.`);
273
+ return project;
274
+ }
275
+ /** A workflow a project may use: it must exist and belong to the project's tenant. */
276
+ async assertUsableWorkflow(workflowId, tenantId) {
277
+ if (!workflowId)
278
+ return;
279
+ const workflow = await this.store.getWorkflow(workflowId);
280
+ if (!workflow || (workflow.tenantId ?? undefined) !== (tenantId ?? undefined)) {
281
+ throw new ValidationError(`Workflow "${workflowId}" was not found.`);
282
+ }
283
+ }
259
284
  withoutTenant(updates) {
260
285
  if (!this.actor || !('tenantId' in updates))
261
286
  return updates;
@@ -393,7 +418,7 @@ export class CriticalPathEngine {
393
418
  return project.workflow;
394
419
  if (project?.workflowId) {
395
420
  const wf = await this.store.getWorkflow(project.workflowId);
396
- if (wf)
421
+ if (wf && (wf.tenantId ?? undefined) === (project.tenantId ?? undefined))
397
422
  return wf;
398
423
  }
399
424
  // Only fall back to workflows from the project's own tenant.
@@ -443,6 +468,7 @@ export class CriticalPathEngine {
443
468
  validateCustomFieldDefinitions(project.customFieldDefinitions, this.plugins.getCustomFieldTypes());
444
469
  // Views always use the actor's tenant (possibly none); only trusted base-engine calls may set it.
445
470
  const input = { ...project, tenantId: this.actor ? this.actor.tenantId : project.tenantId };
471
+ await this.assertUsableWorkflow(input.workflowId, input.tenantId);
446
472
  // The creator administers the project they create.
447
473
  if (this.actor && this.actor.userId !== 'anonymous' && !input.members?.some((m) => m.userId === this.actor.userId)) {
448
474
  input.members = [...(input.members ?? []), { userId: this.actor.userId, role: 'admin' }];
@@ -483,6 +509,9 @@ export class CriticalPathEngine {
483
509
  }
484
510
  validateCustomFieldDefinitions(updates.customFieldDefinitions, this.plugins.getCustomFieldTypes());
485
511
  updates = this.withoutTenant(updates);
512
+ if (updates.workflowId && updates.workflowId !== existing.workflowId) {
513
+ await this.assertUsableWorkflow(updates.workflowId, existing.tenantId);
514
+ }
486
515
  const updated = await this.store.updateProject(id, updates);
487
516
  if (updated) {
488
517
  const now = new Date().toISOString();
@@ -604,7 +633,7 @@ export class CriticalPathEngine {
604
633
  throw new ValidationError('Plugins cannot move a task to another project in beforeTaskCreate.');
605
634
  }
606
635
  const projectId = taskInput.projectId;
607
- const project = await this.store.getProject(projectId);
636
+ const project = await this.requireExistingProject(projectId);
608
637
  const workflow = await this.resolveProjectWorkflow(projectId);
609
638
  // Merge hook output over the caller's input for every schema-known task field. Unknown keys
610
639
  // (id, timestamps, identity fields, anything else) never reach the store.
@@ -862,7 +891,7 @@ export class CriticalPathEngine {
862
891
  };
863
892
  await this.events.publish(statusEvent);
864
893
  const statusDef = resolveStatusDefinition(updated.status, project?.statusDefinitions || workflow?.statuses);
865
- if (statusDef.category === 'completed') {
894
+ if (statusDef.category === 'completed' || statusDef.category === 'canceled') {
866
895
  await this.checkAndUnblockDownstreamTasks(updated);
867
896
  }
868
897
  }
@@ -946,66 +975,67 @@ export class CriticalPathEngine {
946
975
  });
947
976
  return updated;
948
977
  }
978
+ /**
979
+ * After a task completes or is canceled, unblocks downstream tasks whose upstream tasks are all
980
+ * completed or canceled. Runs on an elevated view, so upstream tasks the caller cannot read still
981
+ * count, and resolves each task's status against its own project's definitions.
982
+ */
949
983
  async checkAndUnblockDownstreamTasks(completedTask) {
950
984
  try {
951
- const graph = await this.getTaskDependencyGraph(completedTask.id);
985
+ const engine = this.elevated();
986
+ const graph = await engine.getTaskDependencyGraph(completedTask.id);
952
987
  if (!graph.downstreamTasks || graph.downstreamTasks.length === 0)
953
988
  return;
989
+ const statusDefsByProject = new Map();
990
+ const categoryOf = async (task) => {
991
+ if (!statusDefsByProject.has(task.projectId)) {
992
+ const project = await this.store.getProject(task.projectId);
993
+ const workflow = await this.resolveProjectWorkflow(task.projectId);
994
+ statusDefsByProject.set(task.projectId, project?.statusDefinitions || workflow?.statuses);
995
+ }
996
+ return resolveStatusDefinition(task.status, statusDefsByProject.get(task.projectId)).category;
997
+ };
954
998
  for (const downstream of graph.downstreamTasks) {
955
- const downstreamProject = await this.store.getProject(downstream.projectId);
956
- const downstreamWorkflow = await this.resolveProjectWorkflow(downstream.projectId);
957
- const downstreamStatusDefs = downstreamProject?.statusDefinitions || downstreamWorkflow?.statuses;
958
- const downstreamStatusDef = resolveStatusDefinition(downstream.status, downstreamStatusDefs);
959
- if (downstreamStatusDef.category === 'completed' || downstreamStatusDef.category === 'canceled') {
999
+ const category = await categoryOf(downstream);
1000
+ if (category === 'completed' || category === 'canceled')
960
1001
  continue;
961
- }
962
- const downstreamGraph = await this.getTaskDependencyGraph(downstream.id);
963
- const allUpstreamsCompleted = downstreamGraph.upstreamTasks.every((up) => {
964
- const upDef = resolveStatusDefinition(up.status, downstreamStatusDefs);
965
- return upDef.category === 'completed';
966
- });
967
- if (allUpstreamsCompleted) {
968
- let updatedDownstream = downstream;
969
- const updates = {};
970
- if (downstream.isBlocked || downstream.blockedReason || downstream.blockedSince) {
971
- updates.isBlocked = false;
972
- updates.blockedReason = null;
973
- if (downstream.blockedSince) {
974
- const startMs = new Date(downstream.blockedSince).getTime();
975
- const endMs = new Date().getTime();
976
- if (!isNaN(startMs) && !isNaN(endMs) && endMs >= startMs) {
977
- const blockedSeconds = Math.max(0, (endMs - startMs) / 1000);
978
- updates.blockedDurationSeconds = (downstream.blockedDurationSeconds ?? 0) + blockedSeconds;
979
- }
980
- updates.blockedSince = null;
981
- }
1002
+ // Nothing to unblock; don't publish task.unblocked for tasks that were never blocked.
1003
+ if (!downstream.isBlocked && !downstream.blockedReason && !downstream.blockedSince)
1004
+ continue;
1005
+ const downstreamGraph = await engine.getTaskDependencyGraph(downstream.id);
1006
+ let allSatisfied = true;
1007
+ for (const up of downstreamGraph.upstreamTasks) {
1008
+ const upCategory = await categoryOf(up);
1009
+ if (upCategory !== 'completed' && upCategory !== 'canceled') {
1010
+ allSatisfied = false;
1011
+ break;
982
1012
  }
983
- if (Object.keys(updates).length > 0) {
984
- const res = await this.store.updateTask(downstream.id, updates);
985
- if (res)
986
- updatedDownstream = res;
1013
+ }
1014
+ if (!allSatisfied)
1015
+ continue;
1016
+ const updates = { isBlocked: false, blockedReason: null };
1017
+ if (downstream.blockedSince) {
1018
+ const startMs = new Date(downstream.blockedSince).getTime();
1019
+ const endMs = Date.now();
1020
+ if (!isNaN(startMs) && endMs >= startMs) {
1021
+ updates.blockedDurationSeconds = (downstream.blockedDurationSeconds ?? 0) + (endMs - startMs) / 1000;
987
1022
  }
988
- const now = new Date().toISOString();
989
- const unblockedEvent = {
990
- id: `evt_${crypto.randomUUID()}`,
991
- name: 'task.unblocked',
992
- aggregateId: downstream.id,
993
- aggregateType: 'Task',
994
- occurredAt: now,
995
- payload: {
996
- task: updatedDownstream,
997
- upstreamTaskId: completedTask.id
998
- }
999
- };
1000
- await this.events.publish(unblockedEvent);
1001
- await this.store.logActivity({
1002
- projectId: downstream.projectId,
1003
- taskId: downstream.id,
1004
- actorId: this.actorIdOr('system'),
1005
- action: 'task.unblocked',
1006
- details: { unblockedByTaskId: completedTask.id }
1007
- });
1023
+ updates.blockedSince = null;
1008
1024
  }
1025
+ const updatedDownstream = (await this.store.updateTask(downstream.id, updates)) ?? downstream;
1026
+ await this.publishEvent({
1027
+ name: 'task.unblocked',
1028
+ aggregateId: downstream.id,
1029
+ aggregateType: 'Task',
1030
+ payload: { task: updatedDownstream, upstreamTaskId: completedTask.id }
1031
+ });
1032
+ await this.store.logActivity({
1033
+ projectId: downstream.projectId,
1034
+ taskId: downstream.id,
1035
+ actorId: this.actorIdOr('system'),
1036
+ action: 'task.unblocked',
1037
+ details: { unblockedByTaskId: completedTask.id }
1038
+ });
1009
1039
  }
1010
1040
  }
1011
1041
  catch (err) {
@@ -1078,12 +1108,23 @@ export class CriticalPathEngine {
1078
1108
  ancestor = (await this.store.getTask(ancestor))?.parentId;
1079
1109
  }
1080
1110
  }
1111
+ /** A task's direct subtasks, paged through the store's parent filter (indexed in SQLite). */
1112
+ async childTasks(task) {
1113
+ const children = [];
1114
+ let cursor;
1115
+ do {
1116
+ const page = await this.store.queryTasks({ projectId: task.projectId, parentId: task.id, limit: 500, cursor });
1117
+ children.push(...page.items);
1118
+ cursor = page.nextCursor;
1119
+ } while (cursor);
1120
+ return children;
1121
+ }
1081
1122
  /** Removes records owned by a task; the task's deletion was already authorized. */
1082
1123
  async deleteTaskChildren(task, subtasks, deleting) {
1083
1124
  const cascade = this.elevated();
1084
1125
  // Parent cycles stored before parents were validated: skip tasks this cascade is already deleting.
1085
1126
  deleting.add(task.id);
1086
- const children = (await this.store.getTasks(task.projectId)).filter((t) => t.parentId === task.id && !deleting.has(t.id));
1127
+ const children = (await this.childTasks(task)).filter((t) => !deleting.has(t.id));
1087
1128
  for (const child of children) {
1088
1129
  if (subtasks === 'delete') {
1089
1130
  await cascade.deleteTaskNow(child.id, { subtasks }, deleting);
@@ -1136,15 +1177,17 @@ export class CriticalPathEngine {
1136
1177
  return removed;
1137
1178
  }
1138
1179
  // --- Task Dependencies & Graph ---
1180
+ /** Adds a dependency. Adding one that already exists (same tasks and type) returns the existing one. */
1139
1181
  async addDependency(dep) {
1140
- if (this.enforcing) {
1141
- const [task, upstream] = await Promise.all([this.getTask(dep.taskId), this.getTask(dep.dependsOnTaskId)]);
1142
- if (!task)
1143
- throw new NotFoundError(`Task "${dep.taskId}" not found.`);
1144
- if (!upstream)
1145
- throw new NotFoundError(`Task "${dep.dependsOnTaskId}" not found.`);
1146
- await this.requireProjectAccess('task.update', task.projectId);
1147
- }
1182
+ const [task, upstream] = await Promise.all([this.getTask(dep.taskId), this.getTask(dep.dependsOnTaskId)]);
1183
+ if (!task)
1184
+ throw new NotFoundError(`Task "${dep.taskId}" not found.`);
1185
+ if (!upstream)
1186
+ throw new NotFoundError(`Task "${dep.dependsOnTaskId}" not found.`);
1187
+ await this.requireProjectAccess('task.update', task.projectId);
1188
+ const duplicate = (await this.store.getDependencies(dep.taskId)).find((d) => d.taskId === dep.taskId && d.dependsOnTaskId === dep.dependsOnTaskId && d.type === dep.type);
1189
+ if (duplicate)
1190
+ return duplicate;
1148
1191
  // Enforce Directed Acyclic Graph (DAG) Invariant
1149
1192
  const reachableDeps = await this.collectUpstreamDependencies(dep.dependsOnTaskId);
1150
1193
  const cycleCheck = detectDependencyCycle(reachableDeps, dep);
@@ -1328,6 +1371,7 @@ export class CriticalPathEngine {
1328
1371
  type: 'comment',
1329
1372
  ownerId: existing.authorId
1330
1373
  });
1374
+ updates = this.withoutOwnership(updates, ['taskId', 'authorId', 'authorType', 'reactions']);
1331
1375
  const mentions = updates.mentions ?? (updates.content ? extractMentions(updates.content) : undefined);
1332
1376
  const toUpdate = mentions !== undefined ? { ...updates, mentions } : updates;
1333
1377
  const updated = await this.store.updateComment(id, toUpdate);
@@ -1552,7 +1596,8 @@ export class CriticalPathEngine {
1552
1596
  url: uploadResult.url,
1553
1597
  storageKey: uploadResult.storageKey,
1554
1598
  artifactType: input.artifactType,
1555
- metadata: input.metadata
1599
+ metadata: input.metadata,
1600
+ ...(input.customFields ? { customFields: input.customFields } : {})
1556
1601
  });
1557
1602
  }
1558
1603
  async readAttachmentText(id) {
@@ -1669,7 +1714,7 @@ export class CriticalPathEngine {
1669
1714
  if (!existing)
1670
1715
  return null;
1671
1716
  await this.requireWorkspaceAccess('workspace.manage');
1672
- const updated = await this.store.updateTeam(id, this.withoutTenant(updates));
1717
+ const updated = await this.store.updateTeam(id, this.withoutOwnership(updates));
1673
1718
  if (updated) {
1674
1719
  await this.publishEvent({
1675
1720
  name: 'team.updated',
@@ -1710,6 +1755,7 @@ export class CriticalPathEngine {
1710
1755
  }
1711
1756
  async createContainer(container) {
1712
1757
  await this.requireProjectAccess('plan.manage', container.projectId);
1758
+ await this.requireExistingProject(container.projectId);
1713
1759
  const created = await this.store.createContainer(container);
1714
1760
  const now = new Date().toISOString();
1715
1761
  const event = {
@@ -1728,7 +1774,7 @@ export class CriticalPathEngine {
1728
1774
  if (!existing)
1729
1775
  return null;
1730
1776
  await this.requireProjectAccess('plan.manage', existing.projectId);
1731
- const updated = await this.store.updateContainer(id, updates);
1777
+ const updated = await this.store.updateContainer(id, this.withoutOwnership(updates, ['projectId']));
1732
1778
  if (updated) {
1733
1779
  await this.publishEvent({
1734
1780
  name: 'container.updated',
@@ -1784,7 +1830,7 @@ export class CriticalPathEngine {
1784
1830
  }
1785
1831
  async createDeliverable(input) {
1786
1832
  await this.requireProjectAccess('plan.manage', input.projectId);
1787
- const project = await this.store.getProject(input.projectId);
1833
+ const project = await this.requireExistingProject(input.projectId);
1788
1834
  if (project?.customFieldDefinitions && input.customFields) {
1789
1835
  validateCustomFieldValues(project.customFieldDefinitions, input.customFields, this.plugins.getCustomFieldTypes());
1790
1836
  }
@@ -1820,7 +1866,7 @@ export class CriticalPathEngine {
1820
1866
  if (updates.status && updates.status === 'delivered' && !existing.deliveredAt && !updates.deliveredAt) {
1821
1867
  updates.deliveredAt = new Date().toISOString();
1822
1868
  }
1823
- const updated = await this.store.updateDeliverable(id, updates);
1869
+ const updated = await this.store.updateDeliverable(id, this.withoutOwnership(updates, ['projectId']));
1824
1870
  if (updated) {
1825
1871
  const now = new Date().toISOString();
1826
1872
  if (updates.status && updates.status !== existing.status) {
@@ -1944,6 +1990,7 @@ export class CriticalPathEngine {
1944
1990
  }
1945
1991
  async createIteration(iteration) {
1946
1992
  await this.requireProjectAccess('plan.manage', iteration.projectId);
1993
+ await this.requireExistingProject(iteration.projectId);
1947
1994
  const created = await this.store.createIteration(iteration);
1948
1995
  await this.publishEvent({
1949
1996
  name: 'iteration.created',
@@ -1970,7 +2017,7 @@ export class CriticalPathEngine {
1970
2017
  if (!existing)
1971
2018
  return null;
1972
2019
  await this.requireProjectAccess('plan.manage', existing.projectId);
1973
- const updated = await this.store.updateIteration(id, updates);
2020
+ const updated = await this.store.updateIteration(id, this.withoutOwnership(updates, ['projectId']));
1974
2021
  if (updated) {
1975
2022
  await this.publishEvent({
1976
2023
  name: 'iteration.updated',
@@ -2351,7 +2398,8 @@ export class CriticalPathEngine {
2351
2398
  events: input.events,
2352
2399
  secret,
2353
2400
  active: input.active ?? true,
2354
- tenantId: this.actor?.tenantId
2401
+ tenantId: this.actor?.tenantId,
2402
+ ...(input.customFields ? { customFields: input.customFields } : {})
2355
2403
  });
2356
2404
  this.webhooks.invalidate();
2357
2405
  return { webhook: this.toPublicWebhook(created), secret };
@@ -2361,8 +2409,8 @@ export class CriticalPathEngine {
2361
2409
  return null;
2362
2410
  if (updates.url)
2363
2411
  this.validateWebhookUrl(updates.url);
2364
- const { name, url, events, active, secret } = updates;
2365
- const updated = await this.store.updateWebhook(id, Object.fromEntries(Object.entries({ name, url, events, active, secret }).filter(([, v]) => v !== undefined)));
2412
+ const { name, url, events, active, secret, customFields } = updates;
2413
+ const updated = await this.store.updateWebhook(id, Object.fromEntries(Object.entries({ name, url, events, active, secret, customFields }).filter(([, v]) => v !== undefined)));
2366
2414
  this.webhooks.invalidate();
2367
2415
  return updated ? this.toPublicWebhook(updated) : null;
2368
2416
  }