@workbuddy/piece-workbuddy-edge 1.0.10 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/package.json +1 -1
  2. package/src/lib/actions/agents.d.ts.map +1 -1
  3. package/src/lib/actions/agents.js +4 -2
  4. package/src/lib/actions/agents.js.map +1 -1
  5. package/src/lib/actions/agents.ts +6 -2
  6. package/src/lib/actions/attachments.d.ts.map +1 -1
  7. package/src/lib/actions/attachments.js +2 -1
  8. package/src/lib/actions/attachments.js.map +1 -1
  9. package/src/lib/actions/attachments.ts +3 -1
  10. package/src/lib/actions/jobs-activities.d.ts.map +1 -1
  11. package/src/lib/actions/jobs-activities.js +18 -13
  12. package/src/lib/actions/jobs-activities.js.map +1 -1
  13. package/src/lib/actions/jobs-activities.ts +23 -13
  14. package/src/lib/actions/jobs-files.js +4 -4
  15. package/src/lib/actions/jobs-files.js.map +1 -1
  16. package/src/lib/actions/jobs-files.ts +4 -4
  17. package/src/lib/actions/jobs-tasks.d.ts.map +1 -1
  18. package/src/lib/actions/jobs-tasks.js +10 -8
  19. package/src/lib/actions/jobs-tasks.js.map +1 -1
  20. package/src/lib/actions/jobs-tasks.ts +13 -8
  21. package/src/lib/actions/jobs.d.ts.map +1 -1
  22. package/src/lib/actions/jobs.js +4 -2
  23. package/src/lib/actions/jobs.js.map +1 -1
  24. package/src/lib/actions/jobs.ts +7 -2
  25. package/src/lib/actions/mcp.d.ts.map +1 -1
  26. package/src/lib/actions/mcp.js +2 -1
  27. package/src/lib/actions/mcp.js.map +1 -1
  28. package/src/lib/actions/mcp.ts +3 -1
  29. package/src/lib/actions/stages-activities.d.ts.map +1 -1
  30. package/src/lib/actions/stages-activities.js +18 -13
  31. package/src/lib/actions/stages-activities.js.map +1 -1
  32. package/src/lib/actions/stages-activities.ts +23 -13
  33. package/src/lib/actions/stages-files.js +4 -4
  34. package/src/lib/actions/stages-files.js.map +1 -1
  35. package/src/lib/actions/stages-files.ts +4 -4
  36. package/src/lib/actions/stages-resources.d.ts.map +1 -1
  37. package/src/lib/actions/stages-resources.js +4 -2
  38. package/src/lib/actions/stages-resources.js.map +1 -1
  39. package/src/lib/actions/stages-resources.ts +6 -2
  40. package/src/lib/actions/stages-tasks.d.ts.map +1 -1
  41. package/src/lib/actions/stages-tasks.js +10 -8
  42. package/src/lib/actions/stages-tasks.js.map +1 -1
  43. package/src/lib/actions/stages-tasks.ts +13 -8
  44. package/src/lib/actions/stages.d.ts +6 -2
  45. package/src/lib/actions/stages.d.ts.map +1 -1
  46. package/src/lib/actions/stages.js +61 -11
  47. package/src/lib/actions/stages.js.map +1 -1
  48. package/src/lib/actions/stages.ts +72 -11
  49. package/src/lib/actions/webhooks-v2.js +9 -9
  50. package/src/lib/actions/webhooks-v2.js.map +1 -1
  51. package/src/lib/actions/webhooks-v2.ts +9 -9
  52. package/src/lib/triggers/activity.d.ts.map +1 -1
  53. package/src/lib/triggers/activity.js +54 -42
  54. package/src/lib/triggers/activity.js.map +1 -1
  55. package/src/lib/triggers/activity.ts +54 -42
  56. package/src/lib/triggers/bill.d.ts.map +1 -1
  57. package/src/lib/triggers/bill.js +80 -64
  58. package/src/lib/triggers/bill.js.map +1 -1
  59. package/src/lib/triggers/bill.ts +80 -64
  60. package/src/lib/triggers/invoice.d.ts.map +1 -1
  61. package/src/lib/triggers/invoice.js +80 -64
  62. package/src/lib/triggers/invoice.js.map +1 -1
  63. package/src/lib/triggers/invoice.ts +80 -64
  64. package/src/lib/triggers/job.d.ts.map +1 -1
  65. package/src/lib/triggers/job.js +160 -144
  66. package/src/lib/triggers/job.js.map +1 -1
  67. package/src/lib/triggers/job.ts +160 -144
  68. package/src/lib/triggers/lead.d.ts.map +1 -1
  69. package/src/lib/triggers/lead.js +72 -56
  70. package/src/lib/triggers/lead.js.map +1 -1
  71. package/src/lib/triggers/lead.ts +72 -56
  72. package/src/lib/triggers/opportunity.d.ts.map +1 -1
  73. package/src/lib/triggers/opportunity.js +72 -56
  74. package/src/lib/triggers/opportunity.js.map +1 -1
  75. package/src/lib/triggers/opportunity.ts +72 -56
  76. package/src/lib/triggers/quote.d.ts.map +1 -1
  77. package/src/lib/triggers/quote.js +80 -64
  78. package/src/lib/triggers/quote.js.map +1 -1
  79. package/src/lib/triggers/quote.ts +80 -64
  80. package/src/lib/triggers/stage.d.ts.map +1 -1
  81. package/src/lib/triggers/stage.js +188 -172
  82. package/src/lib/triggers/stage.js.map +1 -1
  83. package/src/lib/triggers/stage.ts +188 -172
  84. package/src/lib/triggers/task.d.ts.map +1 -1
  85. package/src/lib/triggers/task.js +76 -60
  86. package/src/lib/triggers/task.js.map +1 -1
  87. package/src/lib/triggers/task.ts +76 -60
@@ -186,26 +186,51 @@ export const stage_created_trigger = createTrigger({
186
186
  }),
187
187
  },
188
188
  sampleData: {
189
- workOrder: {
190
- id: '507f1f77bcf86cd799439011',
191
- name: 'Foundation Work',
192
- workOrderNumber: 'J10001-5039',
193
- jobNumber: 'J10001',
194
- description: 'Sample stage description',
195
- status: 'In Progress',
196
- previousStatus: 'Open',
197
- createdAt: '2026-03-05T10:00:00.000Z',
198
- updatedAt: '2026-03-05T10:00:00.000Z',
199
- startDate: '2026-03-05T08:00:00.000Z',
200
- dueDate: '2026-03-10T17:00:00.000Z',
201
- completedDate: null,
202
- finalisedDate: null,
203
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
204
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
205
- stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
189
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
190
+ event: 'Stage Created',
191
+ action: 'create',
192
+ createdAt: '2026-03-14T05:21:47.307Z',
193
+ webhookTimestamp: 1773465707307,
194
+ data: {
195
+ workOrder: {
196
+ id: '507f1f77bcf86cd799439011',
197
+ name: 'Foundation Work',
198
+ workOrderNumber: 'J10001-5039',
199
+ jobNumber: 'J10001',
200
+ description: 'Sample stage description',
201
+ status: 'In Progress',
202
+ previousStatus: 'Open',
203
+ createdAt: '2026-03-05T10:00:00.000Z',
204
+ updatedAt: '2026-03-05T10:00:00.000Z',
205
+ startDate: '2026-03-05T08:00:00.000Z',
206
+ dueDate: '2026-03-10T17:00:00.000Z',
207
+ completedDate: null,
208
+ finalisedDate: null,
209
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
210
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
211
+ stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
212
+ technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
213
+ subcontractor: null,
214
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
215
+ site: {
216
+ id: '507f1f77bcf86cd799439011',
217
+ name: 'Main Office',
218
+ address: {
219
+ street: '123 Main St',
220
+ suburb: 'Sydney',
221
+ state: 'NSW',
222
+ postcode: '2000',
223
+ country: 'Australia',
224
+ formatted: '123 Main St, Sydney NSW 2000',
225
+ },
226
+ },
227
+ workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
228
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
229
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
230
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
231
+ },
206
232
  technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
207
- subcontractor: null,
208
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
233
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
209
234
  site: {
210
235
  id: '507f1f77bcf86cd799439011',
211
236
  name: 'Main Office',
@@ -218,24 +243,6 @@ export const stage_created_trigger = createTrigger({
218
243
  formatted: '123 Main St, Sydney NSW 2000',
219
244
  },
220
245
  },
221
- workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
222
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
223
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
224
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
225
- },
226
- technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
227
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
228
- site: {
229
- id: '507f1f77bcf86cd799439011',
230
- name: 'Main Office',
231
- address: {
232
- street: '123 Main St',
233
- suburb: 'Sydney',
234
- state: 'NSW',
235
- postcode: '2000',
236
- country: 'Australia',
237
- formatted: '123 Main St, Sydney NSW 2000',
238
- },
239
246
  },
240
247
  },
241
248
  type: TriggerStrategy.WEBHOOK,
@@ -254,7 +261,7 @@ export const stage_created_trigger = createTrigger({
254
261
  if (context.propsValue.stageStatus?.length)
255
262
  filters.stageStatus = context.propsValue.stageStatus.map((v: string) => JSON.parse(v));
256
263
  if (context.propsValue.schedulingTag?.length) filters.schedulingTag = context.propsValue.schedulingTag;
257
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
264
+ // Register webhook with WorkBuddy v2 API
258
265
  const response = await httpClient.sendRequest<{ data: { id: string } }>({
259
266
  method: HttpMethod.POST,
260
267
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -286,18 +293,15 @@ export const stage_created_trigger = createTrigger({
286
293
  const webhookId = await context.store.get<string>('webhookId');
287
294
 
288
295
  if (webhookId) {
289
- // Pause webhook (server keeps it for potential reactivation)
296
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
290
297
  await httpClient.sendRequest({
291
- method: HttpMethod.PATCH,
298
+ method: HttpMethod.DELETE,
292
299
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
293
300
  headers: {
294
301
  Authorization: `Bearer ${token}`,
295
302
  'Content-Type': 'application/json',
296
303
  'X-WorkBuddy-Version': '2026-01',
297
304
  },
298
- body: {
299
- status: 'paused',
300
- },
301
305
  });
302
306
  }
303
307
  },
@@ -491,26 +495,51 @@ export const stage_updated_trigger = createTrigger({
491
495
  }),
492
496
  },
493
497
  sampleData: {
494
- workOrder: {
495
- id: '507f1f77bcf86cd799439011',
496
- name: 'Foundation Work',
497
- workOrderNumber: 'J10001-5039',
498
- jobNumber: 'J10001',
499
- description: 'Sample stage description',
500
- status: 'In Progress',
501
- previousStatus: 'Open',
502
- createdAt: '2026-03-05T10:00:00.000Z',
503
- updatedAt: '2026-03-05T10:00:00.000Z',
504
- startDate: '2026-03-05T08:00:00.000Z',
505
- dueDate: '2026-03-10T17:00:00.000Z',
506
- completedDate: null,
507
- finalisedDate: null,
508
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
509
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
510
- stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
498
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
499
+ event: 'Stage Updated',
500
+ action: 'update',
501
+ createdAt: '2026-03-14T05:21:47.307Z',
502
+ webhookTimestamp: 1773465707307,
503
+ data: {
504
+ workOrder: {
505
+ id: '507f1f77bcf86cd799439011',
506
+ name: 'Foundation Work',
507
+ workOrderNumber: 'J10001-5039',
508
+ jobNumber: 'J10001',
509
+ description: 'Sample stage description',
510
+ status: 'In Progress',
511
+ previousStatus: 'Open',
512
+ createdAt: '2026-03-05T10:00:00.000Z',
513
+ updatedAt: '2026-03-05T10:00:00.000Z',
514
+ startDate: '2026-03-05T08:00:00.000Z',
515
+ dueDate: '2026-03-10T17:00:00.000Z',
516
+ completedDate: null,
517
+ finalisedDate: null,
518
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
519
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
520
+ stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
521
+ technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
522
+ subcontractor: null,
523
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
524
+ site: {
525
+ id: '507f1f77bcf86cd799439011',
526
+ name: 'Main Office',
527
+ address: {
528
+ street: '123 Main St',
529
+ suburb: 'Sydney',
530
+ state: 'NSW',
531
+ postcode: '2000',
532
+ country: 'Australia',
533
+ formatted: '123 Main St, Sydney NSW 2000',
534
+ },
535
+ },
536
+ workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
537
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
538
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
539
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
540
+ },
511
541
  technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
512
- subcontractor: null,
513
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
542
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
514
543
  site: {
515
544
  id: '507f1f77bcf86cd799439011',
516
545
  name: 'Main Office',
@@ -523,24 +552,6 @@ export const stage_updated_trigger = createTrigger({
523
552
  formatted: '123 Main St, Sydney NSW 2000',
524
553
  },
525
554
  },
526
- workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
527
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
528
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
529
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
530
- },
531
- technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
532
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
533
- site: {
534
- id: '507f1f77bcf86cd799439011',
535
- name: 'Main Office',
536
- address: {
537
- street: '123 Main St',
538
- suburb: 'Sydney',
539
- state: 'NSW',
540
- postcode: '2000',
541
- country: 'Australia',
542
- formatted: '123 Main St, Sydney NSW 2000',
543
- },
544
555
  },
545
556
  },
546
557
  type: TriggerStrategy.WEBHOOK,
@@ -559,7 +570,7 @@ export const stage_updated_trigger = createTrigger({
559
570
  if (context.propsValue.stageStatus?.length)
560
571
  filters.stageStatus = context.propsValue.stageStatus.map((v: string) => JSON.parse(v));
561
572
  if (context.propsValue.schedulingTag?.length) filters.schedulingTag = context.propsValue.schedulingTag;
562
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
573
+ // Register webhook with WorkBuddy v2 API
563
574
  const response = await httpClient.sendRequest<{ data: { id: string } }>({
564
575
  method: HttpMethod.POST,
565
576
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -591,18 +602,15 @@ export const stage_updated_trigger = createTrigger({
591
602
  const webhookId = await context.store.get<string>('webhookId');
592
603
 
593
604
  if (webhookId) {
594
- // Pause webhook (server keeps it for potential reactivation)
605
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
595
606
  await httpClient.sendRequest({
596
- method: HttpMethod.PATCH,
607
+ method: HttpMethod.DELETE,
597
608
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
598
609
  headers: {
599
610
  Authorization: `Bearer ${token}`,
600
611
  'Content-Type': 'application/json',
601
612
  'X-WorkBuddy-Version': '2026-01',
602
613
  },
603
- body: {
604
- status: 'paused',
605
- },
606
614
  });
607
615
  }
608
616
  },
@@ -796,26 +804,51 @@ export const stage_status_changed_trigger = createTrigger({
796
804
  }),
797
805
  },
798
806
  sampleData: {
799
- workOrder: {
800
- id: '507f1f77bcf86cd799439011',
801
- name: 'Foundation Work',
802
- workOrderNumber: 'J10001-5039',
803
- jobNumber: 'J10001',
804
- description: 'Sample stage description',
805
- status: 'In Progress',
806
- previousStatus: 'Open',
807
- createdAt: '2026-03-05T10:00:00.000Z',
808
- updatedAt: '2026-03-05T10:00:00.000Z',
809
- startDate: '2026-03-05T08:00:00.000Z',
810
- dueDate: '2026-03-10T17:00:00.000Z',
811
- completedDate: null,
812
- finalisedDate: null,
813
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
814
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
815
- stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
807
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
808
+ event: 'Stage Status Changed',
809
+ action: 'update',
810
+ createdAt: '2026-03-14T05:21:47.307Z',
811
+ webhookTimestamp: 1773465707307,
812
+ data: {
813
+ workOrder: {
814
+ id: '507f1f77bcf86cd799439011',
815
+ name: 'Foundation Work',
816
+ workOrderNumber: 'J10001-5039',
817
+ jobNumber: 'J10001',
818
+ description: 'Sample stage description',
819
+ status: 'In Progress',
820
+ previousStatus: 'Open',
821
+ createdAt: '2026-03-05T10:00:00.000Z',
822
+ updatedAt: '2026-03-05T10:00:00.000Z',
823
+ startDate: '2026-03-05T08:00:00.000Z',
824
+ dueDate: '2026-03-10T17:00:00.000Z',
825
+ completedDate: null,
826
+ finalisedDate: null,
827
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
828
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
829
+ stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
830
+ technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
831
+ subcontractor: null,
832
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
833
+ site: {
834
+ id: '507f1f77bcf86cd799439011',
835
+ name: 'Main Office',
836
+ address: {
837
+ street: '123 Main St',
838
+ suburb: 'Sydney',
839
+ state: 'NSW',
840
+ postcode: '2000',
841
+ country: 'Australia',
842
+ formatted: '123 Main St, Sydney NSW 2000',
843
+ },
844
+ },
845
+ workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
846
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
847
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
848
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
849
+ },
816
850
  technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
817
- subcontractor: null,
818
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
851
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
819
852
  site: {
820
853
  id: '507f1f77bcf86cd799439011',
821
854
  name: 'Main Office',
@@ -828,24 +861,6 @@ export const stage_status_changed_trigger = createTrigger({
828
861
  formatted: '123 Main St, Sydney NSW 2000',
829
862
  },
830
863
  },
831
- workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
832
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
833
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
834
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
835
- },
836
- technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
837
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
838
- site: {
839
- id: '507f1f77bcf86cd799439011',
840
- name: 'Main Office',
841
- address: {
842
- street: '123 Main St',
843
- suburb: 'Sydney',
844
- state: 'NSW',
845
- postcode: '2000',
846
- country: 'Australia',
847
- formatted: '123 Main St, Sydney NSW 2000',
848
- },
849
864
  },
850
865
  },
851
866
  type: TriggerStrategy.WEBHOOK,
@@ -864,7 +879,7 @@ export const stage_status_changed_trigger = createTrigger({
864
879
  if (context.propsValue.stageStatus?.length)
865
880
  filters.stageStatus = context.propsValue.stageStatus.map((v: string) => JSON.parse(v));
866
881
  if (context.propsValue.schedulingTag?.length) filters.schedulingTag = context.propsValue.schedulingTag;
867
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
882
+ // Register webhook with WorkBuddy v2 API
868
883
  const response = await httpClient.sendRequest<{ data: { id: string } }>({
869
884
  method: HttpMethod.POST,
870
885
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -896,18 +911,15 @@ export const stage_status_changed_trigger = createTrigger({
896
911
  const webhookId = await context.store.get<string>('webhookId');
897
912
 
898
913
  if (webhookId) {
899
- // Pause webhook (server keeps it for potential reactivation)
914
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
900
915
  await httpClient.sendRequest({
901
- method: HttpMethod.PATCH,
916
+ method: HttpMethod.DELETE,
902
917
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
903
918
  headers: {
904
919
  Authorization: `Bearer ${token}`,
905
920
  'Content-Type': 'application/json',
906
921
  'X-WorkBuddy-Version': '2026-01',
907
922
  },
908
- body: {
909
- status: 'paused',
910
- },
911
923
  });
912
924
  }
913
925
  },
@@ -1101,26 +1113,51 @@ export const stage_deleted_trigger = createTrigger({
1101
1113
  }),
1102
1114
  },
1103
1115
  sampleData: {
1104
- workOrder: {
1105
- id: '507f1f77bcf86cd799439011',
1106
- name: 'Foundation Work',
1107
- workOrderNumber: 'J10001-5039',
1108
- jobNumber: 'J10001',
1109
- description: 'Sample stage description',
1110
- status: 'In Progress',
1111
- previousStatus: 'Open',
1112
- createdAt: '2026-03-05T10:00:00.000Z',
1113
- updatedAt: '2026-03-05T10:00:00.000Z',
1114
- startDate: '2026-03-05T08:00:00.000Z',
1115
- dueDate: '2026-03-10T17:00:00.000Z',
1116
- completedDate: null,
1117
- finalisedDate: null,
1118
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1119
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
1120
- stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
1116
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
1117
+ event: 'Stage Deleted',
1118
+ action: 'remove',
1119
+ createdAt: '2026-03-14T05:21:47.307Z',
1120
+ webhookTimestamp: 1773465707307,
1121
+ data: {
1122
+ workOrder: {
1123
+ id: '507f1f77bcf86cd799439011',
1124
+ name: 'Foundation Work',
1125
+ workOrderNumber: 'J10001-5039',
1126
+ jobNumber: 'J10001',
1127
+ description: 'Sample stage description',
1128
+ status: 'In Progress',
1129
+ previousStatus: 'Open',
1130
+ createdAt: '2026-03-05T10:00:00.000Z',
1131
+ updatedAt: '2026-03-05T10:00:00.000Z',
1132
+ startDate: '2026-03-05T08:00:00.000Z',
1133
+ dueDate: '2026-03-10T17:00:00.000Z',
1134
+ completedDate: null,
1135
+ finalisedDate: null,
1136
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1137
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
1138
+ stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
1139
+ technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
1140
+ subcontractor: null,
1141
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
1142
+ site: {
1143
+ id: '507f1f77bcf86cd799439011',
1144
+ name: 'Main Office',
1145
+ address: {
1146
+ street: '123 Main St',
1147
+ suburb: 'Sydney',
1148
+ state: 'NSW',
1149
+ postcode: '2000',
1150
+ country: 'Australia',
1151
+ formatted: '123 Main St, Sydney NSW 2000',
1152
+ },
1153
+ },
1154
+ workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
1155
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
1156
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
1157
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1158
+ },
1121
1159
  technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
1122
- subcontractor: null,
1123
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
1160
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1124
1161
  site: {
1125
1162
  id: '507f1f77bcf86cd799439011',
1126
1163
  name: 'Main Office',
@@ -1133,24 +1170,6 @@ export const stage_deleted_trigger = createTrigger({
1133
1170
  formatted: '123 Main St, Sydney NSW 2000',
1134
1171
  },
1135
1172
  },
1136
- workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
1137
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
1138
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
1139
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1140
- },
1141
- technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
1142
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1143
- site: {
1144
- id: '507f1f77bcf86cd799439011',
1145
- name: 'Main Office',
1146
- address: {
1147
- street: '123 Main St',
1148
- suburb: 'Sydney',
1149
- state: 'NSW',
1150
- postcode: '2000',
1151
- country: 'Australia',
1152
- formatted: '123 Main St, Sydney NSW 2000',
1153
- },
1154
1173
  },
1155
1174
  },
1156
1175
  type: TriggerStrategy.WEBHOOK,
@@ -1169,7 +1188,7 @@ export const stage_deleted_trigger = createTrigger({
1169
1188
  if (context.propsValue.stageStatus?.length)
1170
1189
  filters.stageStatus = context.propsValue.stageStatus.map((v: string) => JSON.parse(v));
1171
1190
  if (context.propsValue.schedulingTag?.length) filters.schedulingTag = context.propsValue.schedulingTag;
1172
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
1191
+ // Register webhook with WorkBuddy v2 API
1173
1192
  const response = await httpClient.sendRequest<{ data: { id: string } }>({
1174
1193
  method: HttpMethod.POST,
1175
1194
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -1201,18 +1220,15 @@ export const stage_deleted_trigger = createTrigger({
1201
1220
  const webhookId = await context.store.get<string>('webhookId');
1202
1221
 
1203
1222
  if (webhookId) {
1204
- // Pause webhook (server keeps it for potential reactivation)
1223
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
1205
1224
  await httpClient.sendRequest({
1206
- method: HttpMethod.PATCH,
1225
+ method: HttpMethod.DELETE,
1207
1226
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
1208
1227
  headers: {
1209
1228
  Authorization: `Bearer ${token}`,
1210
1229
  'Content-Type': 'application/json',
1211
1230
  'X-WorkBuddy-Version': '2026-01',
1212
1231
  },
1213
- body: {
1214
- status: 'paused',
1215
- },
1216
1232
  });
1217
1233
  }
1218
1234
  },
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAY,MAAM,gCAAgC,CAAC;AAI1F,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0G/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0G/B,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0GtC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0G/B,CAAC"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAY,MAAM,gCAAgC,CAAC;AAI1F,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8G/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8G/B,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8GtC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8G/B,CAAC"}