@workbuddy/piece-workbuddy-vnext 1.0.4 → 1.0.6

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 (208) hide show
  1. package/package.json +1 -1
  2. package/src/index.d.ts.map +1 -1
  3. package/src/index.js +89 -83
  4. package/src/index.js.map +1 -1
  5. package/src/index.ts +29 -17
  6. package/src/lib/actions/agents.d.ts.map +1 -1
  7. package/src/lib/actions/agents.js +6 -4
  8. package/src/lib/actions/agents.js.map +1 -1
  9. package/src/lib/actions/agents.ts +8 -4
  10. package/src/lib/actions/attachments.d.ts.map +1 -1
  11. package/src/lib/actions/attachments.js +2 -1
  12. package/src/lib/actions/attachments.js.map +1 -1
  13. package/src/lib/actions/attachments.ts +3 -1
  14. package/src/lib/actions/{crm->-companies.d.ts → crm-companies.d.ts} +1 -1
  15. package/src/lib/actions/crm-companies.d.ts.map +1 -0
  16. package/src/lib/actions/{crm->-companies.js → crm-companies.js} +1 -1
  17. package/src/lib/actions/{crm->-invites.js.map → crm-companies.js.map} +1 -1
  18. package/src/lib/actions/{crm->-contacts.d.ts → crm-contacts.d.ts} +1 -1
  19. package/src/lib/actions/crm-contacts.d.ts.map +1 -0
  20. package/src/lib/actions/{crm->-contacts.js → crm-contacts.js} +1 -1
  21. package/src/lib/actions/crm-contacts.js.map +1 -0
  22. package/src/lib/actions/{crm->-contractors.d.ts → crm-contractors.d.ts} +1 -1
  23. package/src/lib/actions/crm-contractors.d.ts.map +1 -0
  24. package/src/lib/actions/{crm->-contractors.js → crm-contractors.js} +1 -1
  25. package/src/lib/actions/{crm->-employees.js.map → crm-contractors.js.map} +1 -1
  26. package/src/lib/actions/{crm->-customers.d.ts → crm-customers.d.ts} +1 -1
  27. package/src/lib/actions/crm-customers.d.ts.map +1 -0
  28. package/src/lib/actions/{crm->-customers.js → crm-customers.js} +1 -1
  29. package/src/lib/actions/crm-customers.js.map +1 -0
  30. package/src/lib/actions/{crm->-employees.d.ts → crm-employees.d.ts} +1 -1
  31. package/src/lib/actions/crm-employees.d.ts.map +1 -0
  32. package/src/lib/actions/{crm->-employees.js → crm-employees.js} +1 -1
  33. package/src/lib/actions/crm-employees.js.map +1 -0
  34. package/src/lib/actions/{crm->-external-users.d.ts → crm-external-users.d.ts} +1 -1
  35. package/src/lib/actions/crm-external-users.d.ts.map +1 -0
  36. package/src/lib/actions/{crm->-external-users.js → crm-external-users.js} +1 -1
  37. package/src/lib/actions/crm-external-users.js.map +1 -0
  38. package/src/lib/actions/{crm->-invites.d.ts → crm-invites.d.ts} +1 -1
  39. package/src/lib/actions/crm-invites.d.ts.map +1 -0
  40. package/src/lib/actions/{crm->-invites.js → crm-invites.js} +1 -1
  41. package/src/lib/actions/crm-invites.js.map +1 -0
  42. package/src/lib/actions/{crm->-sites.d.ts → crm-sites.d.ts} +1 -1
  43. package/src/lib/actions/crm-sites.d.ts.map +1 -0
  44. package/src/lib/actions/{crm->-sites.js → crm-sites.js} +1 -1
  45. package/src/lib/actions/crm-sites.js.map +1 -0
  46. package/src/lib/actions/{crm->-suppliers.d.ts → crm-suppliers.d.ts} +1 -1
  47. package/src/lib/actions/crm-suppliers.d.ts.map +1 -0
  48. package/src/lib/actions/{crm->-suppliers.js → crm-suppliers.js} +1 -1
  49. package/src/lib/actions/crm-suppliers.js.map +1 -0
  50. package/src/lib/actions/flags.d.ts +34 -0
  51. package/src/lib/actions/flags.d.ts.map +1 -0
  52. package/src/lib/actions/flags.js +185 -0
  53. package/src/lib/actions/flags.js.map +1 -0
  54. package/src/lib/actions/flags.ts +201 -0
  55. package/src/lib/actions/index.d.ts +18 -17
  56. package/src/lib/actions/index.d.ts.map +1 -1
  57. package/src/lib/actions/index.js +18 -17
  58. package/src/lib/actions/index.js.map +1 -1
  59. package/src/lib/actions/index.ts +18 -17
  60. package/src/lib/actions/{jobs->-activities.d.ts → jobs-activities.d.ts} +15 -5
  61. package/src/lib/actions/jobs-activities.d.ts.map +1 -0
  62. package/src/lib/actions/{jobs->-activities.js → jobs-activities.js} +110 -59
  63. package/src/lib/actions/jobs-activities.js.map +1 -0
  64. package/src/lib/actions/{jobs->-activities.ts → jobs-activities.ts} +118 -57
  65. package/src/lib/actions/{jobs->-contacts.d.ts → jobs-contacts.d.ts} +1 -1
  66. package/src/lib/actions/jobs-contacts.d.ts.map +1 -0
  67. package/src/lib/actions/{jobs->-contacts.js → jobs-contacts.js} +5 -5
  68. package/src/lib/actions/jobs-contacts.js.map +1 -0
  69. package/src/lib/actions/{jobs->-contacts.ts → jobs-contacts.ts} +4 -4
  70. package/src/lib/actions/{jobs->-files.d.ts → jobs-files.d.ts} +1 -1
  71. package/src/lib/actions/jobs-files.d.ts.map +1 -0
  72. package/src/lib/actions/{jobs->-files.js → jobs-files.js} +9 -9
  73. package/src/lib/actions/jobs-files.js.map +1 -0
  74. package/src/lib/actions/{jobs->-files.ts → jobs-files.ts} +8 -8
  75. package/src/lib/actions/{jobs->-tasks.d.ts → jobs-tasks.d.ts} +4 -2
  76. package/src/lib/actions/jobs-tasks.d.ts.map +1 -0
  77. package/src/lib/actions/{jobs->-tasks.js → jobs-tasks.js} +61 -37
  78. package/src/lib/actions/jobs-tasks.js.map +1 -0
  79. package/src/lib/actions/{jobs->-tasks.ts → jobs-tasks.ts} +64 -36
  80. package/src/lib/actions/jobs.d.ts +4 -3
  81. package/src/lib/actions/jobs.d.ts.map +1 -1
  82. package/src/lib/actions/jobs.js +90 -72
  83. package/src/lib/actions/jobs.js.map +1 -1
  84. package/src/lib/actions/jobs.ts +94 -72
  85. package/src/lib/actions/mcp.d.ts +1 -1
  86. package/src/lib/actions/mcp.d.ts.map +1 -1
  87. package/src/lib/actions/mcp.js +7 -6
  88. package/src/lib/actions/mcp.js.map +1 -1
  89. package/src/lib/actions/mcp.ts +8 -6
  90. package/src/lib/actions/settings.js +1 -1
  91. package/src/lib/actions/settings.js.map +1 -1
  92. package/src/lib/actions/settings.ts +1 -1
  93. package/src/lib/actions/{stages->-activities.d.ts → stages-activities.d.ts} +24 -5
  94. package/src/lib/actions/stages-activities.d.ts.map +1 -0
  95. package/src/lib/actions/{stages->-activities.js → stages-activities.js} +164 -68
  96. package/src/lib/actions/stages-activities.js.map +1 -0
  97. package/src/lib/actions/{stages->-activities.ts → stages-activities.ts} +172 -66
  98. package/src/lib/actions/{stages->-files.d.ts → stages-files.d.ts} +5 -1
  99. package/src/lib/actions/stages-files.d.ts.map +1 -0
  100. package/src/lib/actions/{stages->-files.js → stages-files.js} +35 -15
  101. package/src/lib/actions/stages-files.js.map +1 -0
  102. package/src/lib/actions/{stages->-files.ts → stages-files.ts} +34 -14
  103. package/src/lib/actions/{stages->-resources.d.ts → stages-resources.d.ts} +1 -1
  104. package/src/lib/actions/stages-resources.d.ts.map +1 -0
  105. package/src/lib/actions/{stages->-resources.js → stages-resources.js} +7 -5
  106. package/src/lib/actions/stages-resources.js.map +1 -0
  107. package/src/lib/actions/{stages->-resources.ts → stages-resources.ts} +8 -4
  108. package/src/lib/actions/{stages->-tasks.d.ts → stages-tasks.d.ts} +8 -2
  109. package/src/lib/actions/stages-tasks.d.ts.map +1 -0
  110. package/src/lib/actions/{stages->-tasks.js → stages-tasks.js} +91 -47
  111. package/src/lib/actions/stages-tasks.js.map +1 -0
  112. package/src/lib/actions/{stages->-tasks.ts → stages-tasks.ts} +94 -46
  113. package/src/lib/actions/stages.d.ts +6 -2
  114. package/src/lib/actions/stages.d.ts.map +1 -1
  115. package/src/lib/actions/stages.js +77 -27
  116. package/src/lib/actions/stages.js.map +1 -1
  117. package/src/lib/actions/stages.ts +88 -27
  118. package/src/lib/actions/webhooks-v2.js +15 -15
  119. package/src/lib/actions/webhooks-v2.js.map +1 -1
  120. package/src/lib/actions/webhooks-v2.ts +15 -15
  121. package/src/lib/auth.js +2 -2
  122. package/src/lib/auth.js.map +1 -1
  123. package/src/lib/auth.ts +2 -2
  124. package/src/lib/triggers/activity.d.ts.map +1 -1
  125. package/src/lib/triggers/activity.js +54 -42
  126. package/src/lib/triggers/activity.js.map +1 -1
  127. package/src/lib/triggers/activity.ts +54 -42
  128. package/src/lib/triggers/bill.d.ts +240 -48
  129. package/src/lib/triggers/bill.d.ts.map +1 -1
  130. package/src/lib/triggers/bill.js +368 -88
  131. package/src/lib/triggers/bill.js.map +1 -1
  132. package/src/lib/triggers/bill.ts +368 -88
  133. package/src/lib/triggers/invoice.d.ts +240 -48
  134. package/src/lib/triggers/invoice.d.ts.map +1 -1
  135. package/src/lib/triggers/invoice.js +368 -88
  136. package/src/lib/triggers/invoice.js.map +1 -1
  137. package/src/lib/triggers/invoice.ts +368 -88
  138. package/src/lib/triggers/job.d.ts +640 -128
  139. package/src/lib/triggers/job.d.ts.map +1 -1
  140. package/src/lib/triggers/job.js +928 -208
  141. package/src/lib/triggers/job.js.map +1 -1
  142. package/src/lib/triggers/job.ts +928 -208
  143. package/src/lib/triggers/lead.d.ts +400 -80
  144. package/src/lib/triggers/lead.d.ts.map +1 -1
  145. package/src/lib/triggers/lead.js +552 -96
  146. package/src/lib/triggers/lead.js.map +1 -1
  147. package/src/lib/triggers/lead.ts +552 -96
  148. package/src/lib/triggers/opportunity.d.ts +320 -64
  149. package/src/lib/triggers/opportunity.d.ts.map +1 -1
  150. package/src/lib/triggers/opportunity.js +456 -88
  151. package/src/lib/triggers/opportunity.js.map +1 -1
  152. package/src/lib/triggers/opportunity.ts +456 -88
  153. package/src/lib/triggers/quote.d.ts +240 -48
  154. package/src/lib/triggers/quote.d.ts.map +1 -1
  155. package/src/lib/triggers/quote.js +368 -88
  156. package/src/lib/triggers/quote.js.map +1 -1
  157. package/src/lib/triggers/quote.ts +368 -88
  158. package/src/lib/triggers/stage.d.ts +480 -96
  159. package/src/lib/triggers/stage.d.ts.map +1 -1
  160. package/src/lib/triggers/stage.js +764 -220
  161. package/src/lib/triggers/stage.js.map +1 -1
  162. package/src/lib/triggers/stage.ts +764 -220
  163. package/src/lib/triggers/task.d.ts +80 -16
  164. package/src/lib/triggers/task.d.ts.map +1 -1
  165. package/src/lib/triggers/task.js +172 -68
  166. package/src/lib/triggers/task.js.map +1 -1
  167. package/src/lib/triggers/task.ts +172 -68
  168. package/src/lib/actions/crm->-companies.d.ts.map +0 -1
  169. package/src/lib/actions/crm->-companies.js.map +0 -1
  170. package/src/lib/actions/crm->-contacts.d.ts.map +0 -1
  171. package/src/lib/actions/crm->-contacts.js.map +0 -1
  172. package/src/lib/actions/crm->-contractors.d.ts.map +0 -1
  173. package/src/lib/actions/crm->-contractors.js.map +0 -1
  174. package/src/lib/actions/crm->-customers.d.ts.map +0 -1
  175. package/src/lib/actions/crm->-customers.js.map +0 -1
  176. package/src/lib/actions/crm->-employees.d.ts.map +0 -1
  177. package/src/lib/actions/crm->-external-users.d.ts.map +0 -1
  178. package/src/lib/actions/crm->-external-users.js.map +0 -1
  179. package/src/lib/actions/crm->-invites.d.ts.map +0 -1
  180. package/src/lib/actions/crm->-sites.d.ts.map +0 -1
  181. package/src/lib/actions/crm->-sites.js.map +0 -1
  182. package/src/lib/actions/crm->-suppliers.d.ts.map +0 -1
  183. package/src/lib/actions/crm->-suppliers.js.map +0 -1
  184. package/src/lib/actions/jobs->-activities.d.ts.map +0 -1
  185. package/src/lib/actions/jobs->-activities.js.map +0 -1
  186. package/src/lib/actions/jobs->-contacts.d.ts.map +0 -1
  187. package/src/lib/actions/jobs->-contacts.js.map +0 -1
  188. package/src/lib/actions/jobs->-files.d.ts.map +0 -1
  189. package/src/lib/actions/jobs->-files.js.map +0 -1
  190. package/src/lib/actions/jobs->-tasks.d.ts.map +0 -1
  191. package/src/lib/actions/jobs->-tasks.js.map +0 -1
  192. package/src/lib/actions/stages->-activities.d.ts.map +0 -1
  193. package/src/lib/actions/stages->-activities.js.map +0 -1
  194. package/src/lib/actions/stages->-files.d.ts.map +0 -1
  195. package/src/lib/actions/stages->-files.js.map +0 -1
  196. package/src/lib/actions/stages->-resources.d.ts.map +0 -1
  197. package/src/lib/actions/stages->-resources.js.map +0 -1
  198. package/src/lib/actions/stages->-tasks.d.ts.map +0 -1
  199. package/src/lib/actions/stages->-tasks.js.map +0 -1
  200. /package/src/lib/actions/{crm->-companies.ts → crm-companies.ts} +0 -0
  201. /package/src/lib/actions/{crm->-contacts.ts → crm-contacts.ts} +0 -0
  202. /package/src/lib/actions/{crm->-contractors.ts → crm-contractors.ts} +0 -0
  203. /package/src/lib/actions/{crm->-customers.ts → crm-customers.ts} +0 -0
  204. /package/src/lib/actions/{crm->-employees.ts → crm-employees.ts} +0 -0
  205. /package/src/lib/actions/{crm->-external-users.ts → crm-external-users.ts} +0 -0
  206. /package/src/lib/actions/{crm->-invites.ts → crm-invites.ts} +0 -0
  207. /package/src/lib/actions/{crm->-sites.ts → crm-sites.ts} +0 -0
  208. /package/src/lib/actions/{crm->-suppliers.ts → crm-suppliers.ts} +0 -0
@@ -10,30 +10,140 @@ exports.stage_created_trigger = (0, pieces_framework_1.createTrigger)({
10
10
  displayName: 'Stage Created',
11
11
  description: 'Triggered when a new stage is created',
12
12
  props: {
13
- customer: pieces_framework_1.Property.Array({
13
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
14
14
  displayName: 'Filter by Customer',
15
- description: 'Only trigger for specific customer IDs',
15
+ description: 'Only trigger for specific customer',
16
16
  required: false,
17
+ auth: auth_1.workbuddyAuth,
18
+ refreshers: [],
19
+ options: async ({ auth }) => {
20
+ const authValue = auth;
21
+ const token = await (0, auth_1.getAccessToken)(authValue);
22
+ const baseUrl = authValue.props.baseUrl;
23
+ const response = await pieces_common_1.httpClient.sendRequest({
24
+ method: pieces_common_1.HttpMethod.GET,
25
+ url: `${baseUrl}/api/v2/public/customers`,
26
+ headers: {
27
+ Authorization: `Bearer ${token}`,
28
+ 'X-WorkBuddy-Version': '2026-01',
29
+ },
30
+ });
31
+ const items = response.body?.items || [];
32
+ return {
33
+ options: items.map((item) => ({
34
+ label: item.name,
35
+ value: item.id,
36
+ })),
37
+ };
38
+ },
17
39
  }),
18
- billingCompany: pieces_framework_1.Property.Array({
40
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
19
41
  displayName: 'Filter by Billing Company',
20
- description: 'Only trigger for specific billing company IDs',
42
+ description: 'Only trigger for specific billing company',
21
43
  required: false,
44
+ auth: auth_1.workbuddyAuth,
45
+ refreshers: [],
46
+ options: async ({ auth }) => {
47
+ const authValue = auth;
48
+ const token = await (0, auth_1.getAccessToken)(authValue);
49
+ const baseUrl = authValue.props.baseUrl;
50
+ const response = await pieces_common_1.httpClient.sendRequest({
51
+ method: pieces_common_1.HttpMethod.GET,
52
+ url: `${baseUrl}/api/v2/public/companies`,
53
+ headers: {
54
+ Authorization: `Bearer ${token}`,
55
+ 'X-WorkBuddy-Version': '2026-01',
56
+ },
57
+ });
58
+ const items = response.body?.items || [];
59
+ return {
60
+ options: items.map((item) => ({
61
+ label: item.name,
62
+ value: item.id,
63
+ })),
64
+ };
65
+ },
22
66
  }),
23
- tag: pieces_framework_1.Property.Array({
67
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
24
68
  displayName: 'Filter by Tags',
25
- description: 'Only trigger for specific tags IDs',
69
+ description: 'Only trigger for specific tags',
26
70
  required: false,
71
+ auth: auth_1.workbuddyAuth,
72
+ refreshers: [],
73
+ options: async ({ auth }) => {
74
+ const authValue = auth;
75
+ const token = await (0, auth_1.getAccessToken)(authValue);
76
+ const baseUrl = authValue.props.baseUrl;
77
+ const response = await pieces_common_1.httpClient.sendRequest({
78
+ method: pieces_common_1.HttpMethod.GET,
79
+ url: `${baseUrl}/api/v2/public/settings/tags`,
80
+ headers: {
81
+ Authorization: `Bearer ${token}`,
82
+ 'X-WorkBuddy-Version': '2026-01',
83
+ },
84
+ });
85
+ const items = response.body?.items || [];
86
+ return {
87
+ options: items.map((item) => ({
88
+ label: item.name,
89
+ value: item.id,
90
+ })),
91
+ };
92
+ },
27
93
  }),
28
- resource: pieces_framework_1.Property.Array({
94
+ resource: pieces_framework_1.Property.MultiSelectDropdown({
29
95
  displayName: 'Filter by Resource',
30
- description: 'Only trigger for specific resource IDs',
96
+ description: 'Only trigger for specific resource',
31
97
  required: false,
98
+ auth: auth_1.workbuddyAuth,
99
+ refreshers: [],
100
+ options: async ({ auth }) => {
101
+ const authValue = auth;
102
+ const token = await (0, auth_1.getAccessToken)(authValue);
103
+ const baseUrl = authValue.props.baseUrl;
104
+ const response = await pieces_common_1.httpClient.sendRequest({
105
+ method: pieces_common_1.HttpMethod.GET,
106
+ url: `${baseUrl}/api/v2/public/employees`,
107
+ headers: {
108
+ Authorization: `Bearer ${token}`,
109
+ 'X-WorkBuddy-Version': '2026-01',
110
+ },
111
+ });
112
+ const items = response.body?.items || [];
113
+ return {
114
+ options: items.map((item) => ({
115
+ label: item.name,
116
+ value: item.id,
117
+ })),
118
+ };
119
+ },
32
120
  }),
33
- workCategory: pieces_framework_1.Property.Array({
121
+ workCategory: pieces_framework_1.Property.MultiSelectDropdown({
34
122
  displayName: 'Filter by Work Category',
35
- description: 'Only trigger for specific work category IDs',
123
+ description: 'Only trigger for specific work category',
36
124
  required: false,
125
+ auth: auth_1.workbuddyAuth,
126
+ refreshers: [],
127
+ options: async ({ auth }) => {
128
+ const authValue = auth;
129
+ const token = await (0, auth_1.getAccessToken)(authValue);
130
+ const baseUrl = authValue.props.baseUrl;
131
+ const response = await pieces_common_1.httpClient.sendRequest({
132
+ method: pieces_common_1.HttpMethod.GET,
133
+ url: `${baseUrl}/api/v2/public/settings/work-types`,
134
+ headers: {
135
+ Authorization: `Bearer ${token}`,
136
+ 'X-WorkBuddy-Version': '2026-01',
137
+ },
138
+ });
139
+ const items = response.body?.items || [];
140
+ return {
141
+ options: items.map((item) => ({
142
+ label: item.name,
143
+ value: item.id,
144
+ })),
145
+ };
146
+ },
37
147
  }),
38
148
  stageStatus: pieces_framework_1.Property.StaticMultiSelectDropdown({
39
149
  displayName: 'Filter by Status',
@@ -49,33 +159,80 @@ exports.stage_created_trigger = (0, pieces_framework_1.createTrigger)({
49
159
  ],
50
160
  },
51
161
  }),
52
- schedulingTag: pieces_framework_1.Property.Array({
162
+ schedulingTag: pieces_framework_1.Property.MultiSelectDropdown({
53
163
  displayName: 'Filter by Scheduling Tag',
54
- description: 'Only trigger for specific scheduling tag IDs',
164
+ description: 'Only trigger for specific scheduling tag',
55
165
  required: false,
166
+ auth: auth_1.workbuddyAuth,
167
+ refreshers: [],
168
+ options: async ({ auth }) => {
169
+ const authValue = auth;
170
+ const token = await (0, auth_1.getAccessToken)(authValue);
171
+ const baseUrl = authValue.props.baseUrl;
172
+ const response = await pieces_common_1.httpClient.sendRequest({
173
+ method: pieces_common_1.HttpMethod.GET,
174
+ url: `${baseUrl}/api/v2/public/settings/tags?type=scheduling`,
175
+ headers: {
176
+ Authorization: `Bearer ${token}`,
177
+ 'X-WorkBuddy-Version': '2026-01',
178
+ },
179
+ });
180
+ const items = response.body?.items || [];
181
+ return {
182
+ options: items.map((item) => ({
183
+ label: item.name,
184
+ value: item.id,
185
+ })),
186
+ };
187
+ },
56
188
  }),
57
189
  },
58
190
  sampleData: {
59
- workOrder: {
60
- id: '507f1f77bcf86cd799439011',
61
- name: 'Foundation Work',
62
- workOrderNumber: 'J10001-5039',
63
- jobNumber: 'J10001',
64
- description: 'Sample stage description',
65
- status: 'In Progress',
66
- previousStatus: 'Open',
67
- createdAt: '2026-03-05T10:00:00.000Z',
68
- updatedAt: '2026-03-05T10:00:00.000Z',
69
- startDate: '2026-03-05T08:00:00.000Z',
70
- dueDate: '2026-03-10T17:00:00.000Z',
71
- completedDate: null,
72
- finalisedDate: null,
73
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
74
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
75
- stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
191
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
192
+ event: 'Stage Created',
193
+ action: 'create',
194
+ createdAt: '2026-03-14T05:21:47.307Z',
195
+ webhookTimestamp: 1773465707307,
196
+ data: {
197
+ workOrder: {
198
+ id: '507f1f77bcf86cd799439011',
199
+ name: 'Foundation Work',
200
+ workOrderNumber: 'J10001-5039',
201
+ jobNumber: 'J10001',
202
+ description: 'Sample stage description',
203
+ status: 'In Progress',
204
+ previousStatus: 'Open',
205
+ createdAt: '2026-03-05T10:00:00.000Z',
206
+ updatedAt: '2026-03-05T10:00:00.000Z',
207
+ startDate: '2026-03-05T08:00:00.000Z',
208
+ dueDate: '2026-03-10T17:00:00.000Z',
209
+ completedDate: null,
210
+ finalisedDate: null,
211
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
212
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
213
+ stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
214
+ technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
215
+ subcontractor: null,
216
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
217
+ site: {
218
+ id: '507f1f77bcf86cd799439011',
219
+ name: 'Main Office',
220
+ address: {
221
+ street: '123 Main St',
222
+ suburb: 'Sydney',
223
+ state: 'NSW',
224
+ postcode: '2000',
225
+ country: 'Australia',
226
+ formatted: '123 Main St, Sydney NSW 2000',
227
+ },
228
+ },
229
+ workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
230
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
231
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
232
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
233
+ },
76
234
  technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
77
- subcontractor: null,
78
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
235
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
79
236
  site: {
80
237
  id: '507f1f77bcf86cd799439011',
81
238
  name: 'Main Office',
@@ -88,24 +245,6 @@ exports.stage_created_trigger = (0, pieces_framework_1.createTrigger)({
88
245
  formatted: '123 Main St, Sydney NSW 2000',
89
246
  },
90
247
  },
91
- workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
92
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
93
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
94
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
95
- },
96
- technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
97
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
98
- site: {
99
- id: '507f1f77bcf86cd799439011',
100
- name: 'Main Office',
101
- address: {
102
- street: '123 Main St',
103
- suburb: 'Sydney',
104
- state: 'NSW',
105
- postcode: '2000',
106
- country: 'Australia',
107
- formatted: '123 Main St, Sydney NSW 2000',
108
- },
109
248
  },
110
249
  },
111
250
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -128,7 +267,7 @@ exports.stage_created_trigger = (0, pieces_framework_1.createTrigger)({
128
267
  filters.stageStatus = context.propsValue.stageStatus.map((v) => JSON.parse(v));
129
268
  if (context.propsValue.schedulingTag?.length)
130
269
  filters.schedulingTag = context.propsValue.schedulingTag;
131
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
270
+ // Register webhook with WorkBuddy v2 API
132
271
  const response = await pieces_common_1.httpClient.sendRequest({
133
272
  method: pieces_common_1.HttpMethod.POST,
134
273
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -157,18 +296,15 @@ exports.stage_created_trigger = (0, pieces_framework_1.createTrigger)({
157
296
  const baseUrl = context.auth.props.baseUrl;
158
297
  const webhookId = await context.store.get('webhookId');
159
298
  if (webhookId) {
160
- // Pause webhook (server keeps it for potential reactivation)
299
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
161
300
  await pieces_common_1.httpClient.sendRequest({
162
- method: pieces_common_1.HttpMethod.PATCH,
301
+ method: pieces_common_1.HttpMethod.DELETE,
163
302
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
164
303
  headers: {
165
304
  Authorization: `Bearer ${token}`,
166
305
  'Content-Type': 'application/json',
167
306
  'X-WorkBuddy-Version': '2026-01',
168
307
  },
169
- body: {
170
- status: 'paused',
171
- },
172
308
  });
173
309
  }
174
310
  },
@@ -182,30 +318,140 @@ exports.stage_updated_trigger = (0, pieces_framework_1.createTrigger)({
182
318
  displayName: 'Stage Updated',
183
319
  description: 'Triggered when a stage is updated',
184
320
  props: {
185
- customer: pieces_framework_1.Property.Array({
321
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
186
322
  displayName: 'Filter by Customer',
187
- description: 'Only trigger for specific customer IDs',
323
+ description: 'Only trigger for specific customer',
188
324
  required: false,
325
+ auth: auth_1.workbuddyAuth,
326
+ refreshers: [],
327
+ options: async ({ auth }) => {
328
+ const authValue = auth;
329
+ const token = await (0, auth_1.getAccessToken)(authValue);
330
+ const baseUrl = authValue.props.baseUrl;
331
+ const response = await pieces_common_1.httpClient.sendRequest({
332
+ method: pieces_common_1.HttpMethod.GET,
333
+ url: `${baseUrl}/api/v2/public/customers`,
334
+ headers: {
335
+ Authorization: `Bearer ${token}`,
336
+ 'X-WorkBuddy-Version': '2026-01',
337
+ },
338
+ });
339
+ const items = response.body?.items || [];
340
+ return {
341
+ options: items.map((item) => ({
342
+ label: item.name,
343
+ value: item.id,
344
+ })),
345
+ };
346
+ },
189
347
  }),
190
- billingCompany: pieces_framework_1.Property.Array({
348
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
191
349
  displayName: 'Filter by Billing Company',
192
- description: 'Only trigger for specific billing company IDs',
350
+ description: 'Only trigger for specific billing company',
193
351
  required: false,
352
+ auth: auth_1.workbuddyAuth,
353
+ refreshers: [],
354
+ options: async ({ auth }) => {
355
+ const authValue = auth;
356
+ const token = await (0, auth_1.getAccessToken)(authValue);
357
+ const baseUrl = authValue.props.baseUrl;
358
+ const response = await pieces_common_1.httpClient.sendRequest({
359
+ method: pieces_common_1.HttpMethod.GET,
360
+ url: `${baseUrl}/api/v2/public/companies`,
361
+ headers: {
362
+ Authorization: `Bearer ${token}`,
363
+ 'X-WorkBuddy-Version': '2026-01',
364
+ },
365
+ });
366
+ const items = response.body?.items || [];
367
+ return {
368
+ options: items.map((item) => ({
369
+ label: item.name,
370
+ value: item.id,
371
+ })),
372
+ };
373
+ },
194
374
  }),
195
- tag: pieces_framework_1.Property.Array({
375
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
196
376
  displayName: 'Filter by Tags',
197
- description: 'Only trigger for specific tags IDs',
377
+ description: 'Only trigger for specific tags',
198
378
  required: false,
379
+ auth: auth_1.workbuddyAuth,
380
+ refreshers: [],
381
+ options: async ({ auth }) => {
382
+ const authValue = auth;
383
+ const token = await (0, auth_1.getAccessToken)(authValue);
384
+ const baseUrl = authValue.props.baseUrl;
385
+ const response = await pieces_common_1.httpClient.sendRequest({
386
+ method: pieces_common_1.HttpMethod.GET,
387
+ url: `${baseUrl}/api/v2/public/settings/tags`,
388
+ headers: {
389
+ Authorization: `Bearer ${token}`,
390
+ 'X-WorkBuddy-Version': '2026-01',
391
+ },
392
+ });
393
+ const items = response.body?.items || [];
394
+ return {
395
+ options: items.map((item) => ({
396
+ label: item.name,
397
+ value: item.id,
398
+ })),
399
+ };
400
+ },
199
401
  }),
200
- resource: pieces_framework_1.Property.Array({
402
+ resource: pieces_framework_1.Property.MultiSelectDropdown({
201
403
  displayName: 'Filter by Resource',
202
- description: 'Only trigger for specific resource IDs',
404
+ description: 'Only trigger for specific resource',
203
405
  required: false,
406
+ auth: auth_1.workbuddyAuth,
407
+ refreshers: [],
408
+ options: async ({ auth }) => {
409
+ const authValue = auth;
410
+ const token = await (0, auth_1.getAccessToken)(authValue);
411
+ const baseUrl = authValue.props.baseUrl;
412
+ const response = await pieces_common_1.httpClient.sendRequest({
413
+ method: pieces_common_1.HttpMethod.GET,
414
+ url: `${baseUrl}/api/v2/public/employees`,
415
+ headers: {
416
+ Authorization: `Bearer ${token}`,
417
+ 'X-WorkBuddy-Version': '2026-01',
418
+ },
419
+ });
420
+ const items = response.body?.items || [];
421
+ return {
422
+ options: items.map((item) => ({
423
+ label: item.name,
424
+ value: item.id,
425
+ })),
426
+ };
427
+ },
204
428
  }),
205
- workCategory: pieces_framework_1.Property.Array({
429
+ workCategory: pieces_framework_1.Property.MultiSelectDropdown({
206
430
  displayName: 'Filter by Work Category',
207
- description: 'Only trigger for specific work category IDs',
431
+ description: 'Only trigger for specific work category',
208
432
  required: false,
433
+ auth: auth_1.workbuddyAuth,
434
+ refreshers: [],
435
+ options: async ({ auth }) => {
436
+ const authValue = auth;
437
+ const token = await (0, auth_1.getAccessToken)(authValue);
438
+ const baseUrl = authValue.props.baseUrl;
439
+ const response = await pieces_common_1.httpClient.sendRequest({
440
+ method: pieces_common_1.HttpMethod.GET,
441
+ url: `${baseUrl}/api/v2/public/settings/work-types`,
442
+ headers: {
443
+ Authorization: `Bearer ${token}`,
444
+ 'X-WorkBuddy-Version': '2026-01',
445
+ },
446
+ });
447
+ const items = response.body?.items || [];
448
+ return {
449
+ options: items.map((item) => ({
450
+ label: item.name,
451
+ value: item.id,
452
+ })),
453
+ };
454
+ },
209
455
  }),
210
456
  stageStatus: pieces_framework_1.Property.StaticMultiSelectDropdown({
211
457
  displayName: 'Filter by Status',
@@ -221,33 +467,80 @@ exports.stage_updated_trigger = (0, pieces_framework_1.createTrigger)({
221
467
  ],
222
468
  },
223
469
  }),
224
- schedulingTag: pieces_framework_1.Property.Array({
470
+ schedulingTag: pieces_framework_1.Property.MultiSelectDropdown({
225
471
  displayName: 'Filter by Scheduling Tag',
226
- description: 'Only trigger for specific scheduling tag IDs',
472
+ description: 'Only trigger for specific scheduling tag',
227
473
  required: false,
474
+ auth: auth_1.workbuddyAuth,
475
+ refreshers: [],
476
+ options: async ({ auth }) => {
477
+ const authValue = auth;
478
+ const token = await (0, auth_1.getAccessToken)(authValue);
479
+ const baseUrl = authValue.props.baseUrl;
480
+ const response = await pieces_common_1.httpClient.sendRequest({
481
+ method: pieces_common_1.HttpMethod.GET,
482
+ url: `${baseUrl}/api/v2/public/settings/tags?type=scheduling`,
483
+ headers: {
484
+ Authorization: `Bearer ${token}`,
485
+ 'X-WorkBuddy-Version': '2026-01',
486
+ },
487
+ });
488
+ const items = response.body?.items || [];
489
+ return {
490
+ options: items.map((item) => ({
491
+ label: item.name,
492
+ value: item.id,
493
+ })),
494
+ };
495
+ },
228
496
  }),
229
497
  },
230
498
  sampleData: {
231
- workOrder: {
232
- id: '507f1f77bcf86cd799439011',
233
- name: 'Foundation Work',
234
- workOrderNumber: 'J10001-5039',
235
- jobNumber: 'J10001',
236
- description: 'Sample stage description',
237
- status: 'In Progress',
238
- previousStatus: 'Open',
239
- createdAt: '2026-03-05T10:00:00.000Z',
240
- updatedAt: '2026-03-05T10:00:00.000Z',
241
- startDate: '2026-03-05T08:00:00.000Z',
242
- dueDate: '2026-03-10T17:00:00.000Z',
243
- completedDate: null,
244
- finalisedDate: null,
245
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
246
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
247
- stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
499
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
500
+ event: 'Stage Updated',
501
+ action: 'update',
502
+ createdAt: '2026-03-14T05:21:47.307Z',
503
+ webhookTimestamp: 1773465707307,
504
+ data: {
505
+ workOrder: {
506
+ id: '507f1f77bcf86cd799439011',
507
+ name: 'Foundation Work',
508
+ workOrderNumber: 'J10001-5039',
509
+ jobNumber: 'J10001',
510
+ description: 'Sample stage description',
511
+ status: 'In Progress',
512
+ previousStatus: 'Open',
513
+ createdAt: '2026-03-05T10:00:00.000Z',
514
+ updatedAt: '2026-03-05T10:00:00.000Z',
515
+ startDate: '2026-03-05T08:00:00.000Z',
516
+ dueDate: '2026-03-10T17:00:00.000Z',
517
+ completedDate: null,
518
+ finalisedDate: null,
519
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
520
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
521
+ stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
522
+ technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
523
+ subcontractor: null,
524
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
525
+ site: {
526
+ id: '507f1f77bcf86cd799439011',
527
+ name: 'Main Office',
528
+ address: {
529
+ street: '123 Main St',
530
+ suburb: 'Sydney',
531
+ state: 'NSW',
532
+ postcode: '2000',
533
+ country: 'Australia',
534
+ formatted: '123 Main St, Sydney NSW 2000',
535
+ },
536
+ },
537
+ workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
538
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
539
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
540
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
541
+ },
248
542
  technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
249
- subcontractor: null,
250
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
543
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
251
544
  site: {
252
545
  id: '507f1f77bcf86cd799439011',
253
546
  name: 'Main Office',
@@ -260,24 +553,6 @@ exports.stage_updated_trigger = (0, pieces_framework_1.createTrigger)({
260
553
  formatted: '123 Main St, Sydney NSW 2000',
261
554
  },
262
555
  },
263
- workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
264
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
265
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
266
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
267
- },
268
- technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
269
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
270
- site: {
271
- id: '507f1f77bcf86cd799439011',
272
- name: 'Main Office',
273
- address: {
274
- street: '123 Main St',
275
- suburb: 'Sydney',
276
- state: 'NSW',
277
- postcode: '2000',
278
- country: 'Australia',
279
- formatted: '123 Main St, Sydney NSW 2000',
280
- },
281
556
  },
282
557
  },
283
558
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -300,7 +575,7 @@ exports.stage_updated_trigger = (0, pieces_framework_1.createTrigger)({
300
575
  filters.stageStatus = context.propsValue.stageStatus.map((v) => JSON.parse(v));
301
576
  if (context.propsValue.schedulingTag?.length)
302
577
  filters.schedulingTag = context.propsValue.schedulingTag;
303
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
578
+ // Register webhook with WorkBuddy v2 API
304
579
  const response = await pieces_common_1.httpClient.sendRequest({
305
580
  method: pieces_common_1.HttpMethod.POST,
306
581
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -329,18 +604,15 @@ exports.stage_updated_trigger = (0, pieces_framework_1.createTrigger)({
329
604
  const baseUrl = context.auth.props.baseUrl;
330
605
  const webhookId = await context.store.get('webhookId');
331
606
  if (webhookId) {
332
- // Pause webhook (server keeps it for potential reactivation)
607
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
333
608
  await pieces_common_1.httpClient.sendRequest({
334
- method: pieces_common_1.HttpMethod.PATCH,
609
+ method: pieces_common_1.HttpMethod.DELETE,
335
610
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
336
611
  headers: {
337
612
  Authorization: `Bearer ${token}`,
338
613
  'Content-Type': 'application/json',
339
614
  'X-WorkBuddy-Version': '2026-01',
340
615
  },
341
- body: {
342
- status: 'paused',
343
- },
344
616
  });
345
617
  }
346
618
  },
@@ -354,30 +626,140 @@ exports.stage_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
354
626
  displayName: 'Stage Status Changed',
355
627
  description: 'Triggered when a stage status changes',
356
628
  props: {
357
- customer: pieces_framework_1.Property.Array({
629
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
358
630
  displayName: 'Filter by Customer',
359
- description: 'Only trigger for specific customer IDs',
631
+ description: 'Only trigger for specific customer',
360
632
  required: false,
633
+ auth: auth_1.workbuddyAuth,
634
+ refreshers: [],
635
+ options: async ({ auth }) => {
636
+ const authValue = auth;
637
+ const token = await (0, auth_1.getAccessToken)(authValue);
638
+ const baseUrl = authValue.props.baseUrl;
639
+ const response = await pieces_common_1.httpClient.sendRequest({
640
+ method: pieces_common_1.HttpMethod.GET,
641
+ url: `${baseUrl}/api/v2/public/customers`,
642
+ headers: {
643
+ Authorization: `Bearer ${token}`,
644
+ 'X-WorkBuddy-Version': '2026-01',
645
+ },
646
+ });
647
+ const items = response.body?.items || [];
648
+ return {
649
+ options: items.map((item) => ({
650
+ label: item.name,
651
+ value: item.id,
652
+ })),
653
+ };
654
+ },
361
655
  }),
362
- billingCompany: pieces_framework_1.Property.Array({
656
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
363
657
  displayName: 'Filter by Billing Company',
364
- description: 'Only trigger for specific billing company IDs',
658
+ description: 'Only trigger for specific billing company',
365
659
  required: false,
660
+ auth: auth_1.workbuddyAuth,
661
+ refreshers: [],
662
+ options: async ({ auth }) => {
663
+ const authValue = auth;
664
+ const token = await (0, auth_1.getAccessToken)(authValue);
665
+ const baseUrl = authValue.props.baseUrl;
666
+ const response = await pieces_common_1.httpClient.sendRequest({
667
+ method: pieces_common_1.HttpMethod.GET,
668
+ url: `${baseUrl}/api/v2/public/companies`,
669
+ headers: {
670
+ Authorization: `Bearer ${token}`,
671
+ 'X-WorkBuddy-Version': '2026-01',
672
+ },
673
+ });
674
+ const items = response.body?.items || [];
675
+ return {
676
+ options: items.map((item) => ({
677
+ label: item.name,
678
+ value: item.id,
679
+ })),
680
+ };
681
+ },
366
682
  }),
367
- tag: pieces_framework_1.Property.Array({
683
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
368
684
  displayName: 'Filter by Tags',
369
- description: 'Only trigger for specific tags IDs',
685
+ description: 'Only trigger for specific tags',
370
686
  required: false,
687
+ auth: auth_1.workbuddyAuth,
688
+ refreshers: [],
689
+ options: async ({ auth }) => {
690
+ const authValue = auth;
691
+ const token = await (0, auth_1.getAccessToken)(authValue);
692
+ const baseUrl = authValue.props.baseUrl;
693
+ const response = await pieces_common_1.httpClient.sendRequest({
694
+ method: pieces_common_1.HttpMethod.GET,
695
+ url: `${baseUrl}/api/v2/public/settings/tags`,
696
+ headers: {
697
+ Authorization: `Bearer ${token}`,
698
+ 'X-WorkBuddy-Version': '2026-01',
699
+ },
700
+ });
701
+ const items = response.body?.items || [];
702
+ return {
703
+ options: items.map((item) => ({
704
+ label: item.name,
705
+ value: item.id,
706
+ })),
707
+ };
708
+ },
371
709
  }),
372
- resource: pieces_framework_1.Property.Array({
710
+ resource: pieces_framework_1.Property.MultiSelectDropdown({
373
711
  displayName: 'Filter by Resource',
374
- description: 'Only trigger for specific resource IDs',
712
+ description: 'Only trigger for specific resource',
375
713
  required: false,
714
+ auth: auth_1.workbuddyAuth,
715
+ refreshers: [],
716
+ options: async ({ auth }) => {
717
+ const authValue = auth;
718
+ const token = await (0, auth_1.getAccessToken)(authValue);
719
+ const baseUrl = authValue.props.baseUrl;
720
+ const response = await pieces_common_1.httpClient.sendRequest({
721
+ method: pieces_common_1.HttpMethod.GET,
722
+ url: `${baseUrl}/api/v2/public/employees`,
723
+ headers: {
724
+ Authorization: `Bearer ${token}`,
725
+ 'X-WorkBuddy-Version': '2026-01',
726
+ },
727
+ });
728
+ const items = response.body?.items || [];
729
+ return {
730
+ options: items.map((item) => ({
731
+ label: item.name,
732
+ value: item.id,
733
+ })),
734
+ };
735
+ },
376
736
  }),
377
- workCategory: pieces_framework_1.Property.Array({
737
+ workCategory: pieces_framework_1.Property.MultiSelectDropdown({
378
738
  displayName: 'Filter by Work Category',
379
- description: 'Only trigger for specific work category IDs',
739
+ description: 'Only trigger for specific work category',
380
740
  required: false,
741
+ auth: auth_1.workbuddyAuth,
742
+ refreshers: [],
743
+ options: async ({ auth }) => {
744
+ const authValue = auth;
745
+ const token = await (0, auth_1.getAccessToken)(authValue);
746
+ const baseUrl = authValue.props.baseUrl;
747
+ const response = await pieces_common_1.httpClient.sendRequest({
748
+ method: pieces_common_1.HttpMethod.GET,
749
+ url: `${baseUrl}/api/v2/public/settings/work-types`,
750
+ headers: {
751
+ Authorization: `Bearer ${token}`,
752
+ 'X-WorkBuddy-Version': '2026-01',
753
+ },
754
+ });
755
+ const items = response.body?.items || [];
756
+ return {
757
+ options: items.map((item) => ({
758
+ label: item.name,
759
+ value: item.id,
760
+ })),
761
+ };
762
+ },
381
763
  }),
382
764
  stageStatus: pieces_framework_1.Property.StaticMultiSelectDropdown({
383
765
  displayName: 'Filter by Status',
@@ -393,33 +775,80 @@ exports.stage_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
393
775
  ],
394
776
  },
395
777
  }),
396
- schedulingTag: pieces_framework_1.Property.Array({
778
+ schedulingTag: pieces_framework_1.Property.MultiSelectDropdown({
397
779
  displayName: 'Filter by Scheduling Tag',
398
- description: 'Only trigger for specific scheduling tag IDs',
780
+ description: 'Only trigger for specific scheduling tag',
399
781
  required: false,
782
+ auth: auth_1.workbuddyAuth,
783
+ refreshers: [],
784
+ options: async ({ auth }) => {
785
+ const authValue = auth;
786
+ const token = await (0, auth_1.getAccessToken)(authValue);
787
+ const baseUrl = authValue.props.baseUrl;
788
+ const response = await pieces_common_1.httpClient.sendRequest({
789
+ method: pieces_common_1.HttpMethod.GET,
790
+ url: `${baseUrl}/api/v2/public/settings/tags?type=scheduling`,
791
+ headers: {
792
+ Authorization: `Bearer ${token}`,
793
+ 'X-WorkBuddy-Version': '2026-01',
794
+ },
795
+ });
796
+ const items = response.body?.items || [];
797
+ return {
798
+ options: items.map((item) => ({
799
+ label: item.name,
800
+ value: item.id,
801
+ })),
802
+ };
803
+ },
400
804
  }),
401
805
  },
402
806
  sampleData: {
403
- workOrder: {
404
- id: '507f1f77bcf86cd799439011',
405
- name: 'Foundation Work',
406
- workOrderNumber: 'J10001-5039',
407
- jobNumber: 'J10001',
408
- description: 'Sample stage description',
409
- status: 'In Progress',
410
- previousStatus: 'Open',
411
- createdAt: '2026-03-05T10:00:00.000Z',
412
- updatedAt: '2026-03-05T10:00:00.000Z',
413
- startDate: '2026-03-05T08:00:00.000Z',
414
- dueDate: '2026-03-10T17:00:00.000Z',
415
- completedDate: null,
416
- finalisedDate: null,
417
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
418
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
419
- 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
+ },
420
850
  technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
421
- subcontractor: null,
422
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
851
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
423
852
  site: {
424
853
  id: '507f1f77bcf86cd799439011',
425
854
  name: 'Main Office',
@@ -432,24 +861,6 @@ exports.stage_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
432
861
  formatted: '123 Main St, Sydney NSW 2000',
433
862
  },
434
863
  },
435
- workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
436
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
437
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
438
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
439
- },
440
- technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
441
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
442
- site: {
443
- id: '507f1f77bcf86cd799439011',
444
- name: 'Main Office',
445
- address: {
446
- street: '123 Main St',
447
- suburb: 'Sydney',
448
- state: 'NSW',
449
- postcode: '2000',
450
- country: 'Australia',
451
- formatted: '123 Main St, Sydney NSW 2000',
452
- },
453
864
  },
454
865
  },
455
866
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -472,7 +883,7 @@ exports.stage_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
472
883
  filters.stageStatus = context.propsValue.stageStatus.map((v) => JSON.parse(v));
473
884
  if (context.propsValue.schedulingTag?.length)
474
885
  filters.schedulingTag = context.propsValue.schedulingTag;
475
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
886
+ // Register webhook with WorkBuddy v2 API
476
887
  const response = await pieces_common_1.httpClient.sendRequest({
477
888
  method: pieces_common_1.HttpMethod.POST,
478
889
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -501,18 +912,15 @@ exports.stage_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
501
912
  const baseUrl = context.auth.props.baseUrl;
502
913
  const webhookId = await context.store.get('webhookId');
503
914
  if (webhookId) {
504
- // Pause webhook (server keeps it for potential reactivation)
915
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
505
916
  await pieces_common_1.httpClient.sendRequest({
506
- method: pieces_common_1.HttpMethod.PATCH,
917
+ method: pieces_common_1.HttpMethod.DELETE,
507
918
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
508
919
  headers: {
509
920
  Authorization: `Bearer ${token}`,
510
921
  'Content-Type': 'application/json',
511
922
  'X-WorkBuddy-Version': '2026-01',
512
923
  },
513
- body: {
514
- status: 'paused',
515
- },
516
924
  });
517
925
  }
518
926
  },
@@ -526,30 +934,140 @@ exports.stage_deleted_trigger = (0, pieces_framework_1.createTrigger)({
526
934
  displayName: 'Stage Deleted',
527
935
  description: 'Triggered when a stage is deleted',
528
936
  props: {
529
- customer: pieces_framework_1.Property.Array({
937
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
530
938
  displayName: 'Filter by Customer',
531
- description: 'Only trigger for specific customer IDs',
939
+ description: 'Only trigger for specific customer',
532
940
  required: false,
941
+ auth: auth_1.workbuddyAuth,
942
+ refreshers: [],
943
+ options: async ({ auth }) => {
944
+ const authValue = auth;
945
+ const token = await (0, auth_1.getAccessToken)(authValue);
946
+ const baseUrl = authValue.props.baseUrl;
947
+ const response = await pieces_common_1.httpClient.sendRequest({
948
+ method: pieces_common_1.HttpMethod.GET,
949
+ url: `${baseUrl}/api/v2/public/customers`,
950
+ headers: {
951
+ Authorization: `Bearer ${token}`,
952
+ 'X-WorkBuddy-Version': '2026-01',
953
+ },
954
+ });
955
+ const items = response.body?.items || [];
956
+ return {
957
+ options: items.map((item) => ({
958
+ label: item.name,
959
+ value: item.id,
960
+ })),
961
+ };
962
+ },
533
963
  }),
534
- billingCompany: pieces_framework_1.Property.Array({
964
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
535
965
  displayName: 'Filter by Billing Company',
536
- description: 'Only trigger for specific billing company IDs',
966
+ description: 'Only trigger for specific billing company',
537
967
  required: false,
968
+ auth: auth_1.workbuddyAuth,
969
+ refreshers: [],
970
+ options: async ({ auth }) => {
971
+ const authValue = auth;
972
+ const token = await (0, auth_1.getAccessToken)(authValue);
973
+ const baseUrl = authValue.props.baseUrl;
974
+ const response = await pieces_common_1.httpClient.sendRequest({
975
+ method: pieces_common_1.HttpMethod.GET,
976
+ url: `${baseUrl}/api/v2/public/companies`,
977
+ headers: {
978
+ Authorization: `Bearer ${token}`,
979
+ 'X-WorkBuddy-Version': '2026-01',
980
+ },
981
+ });
982
+ const items = response.body?.items || [];
983
+ return {
984
+ options: items.map((item) => ({
985
+ label: item.name,
986
+ value: item.id,
987
+ })),
988
+ };
989
+ },
538
990
  }),
539
- tag: pieces_framework_1.Property.Array({
991
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
540
992
  displayName: 'Filter by Tags',
541
- description: 'Only trigger for specific tags IDs',
993
+ description: 'Only trigger for specific tags',
542
994
  required: false,
995
+ auth: auth_1.workbuddyAuth,
996
+ refreshers: [],
997
+ options: async ({ auth }) => {
998
+ const authValue = auth;
999
+ const token = await (0, auth_1.getAccessToken)(authValue);
1000
+ const baseUrl = authValue.props.baseUrl;
1001
+ const response = await pieces_common_1.httpClient.sendRequest({
1002
+ method: pieces_common_1.HttpMethod.GET,
1003
+ url: `${baseUrl}/api/v2/public/settings/tags`,
1004
+ headers: {
1005
+ Authorization: `Bearer ${token}`,
1006
+ 'X-WorkBuddy-Version': '2026-01',
1007
+ },
1008
+ });
1009
+ const items = response.body?.items || [];
1010
+ return {
1011
+ options: items.map((item) => ({
1012
+ label: item.name,
1013
+ value: item.id,
1014
+ })),
1015
+ };
1016
+ },
543
1017
  }),
544
- resource: pieces_framework_1.Property.Array({
1018
+ resource: pieces_framework_1.Property.MultiSelectDropdown({
545
1019
  displayName: 'Filter by Resource',
546
- description: 'Only trigger for specific resource IDs',
1020
+ description: 'Only trigger for specific resource',
547
1021
  required: false,
1022
+ auth: auth_1.workbuddyAuth,
1023
+ refreshers: [],
1024
+ options: async ({ auth }) => {
1025
+ const authValue = auth;
1026
+ const token = await (0, auth_1.getAccessToken)(authValue);
1027
+ const baseUrl = authValue.props.baseUrl;
1028
+ const response = await pieces_common_1.httpClient.sendRequest({
1029
+ method: pieces_common_1.HttpMethod.GET,
1030
+ url: `${baseUrl}/api/v2/public/employees`,
1031
+ headers: {
1032
+ Authorization: `Bearer ${token}`,
1033
+ 'X-WorkBuddy-Version': '2026-01',
1034
+ },
1035
+ });
1036
+ const items = response.body?.items || [];
1037
+ return {
1038
+ options: items.map((item) => ({
1039
+ label: item.name,
1040
+ value: item.id,
1041
+ })),
1042
+ };
1043
+ },
548
1044
  }),
549
- workCategory: pieces_framework_1.Property.Array({
1045
+ workCategory: pieces_framework_1.Property.MultiSelectDropdown({
550
1046
  displayName: 'Filter by Work Category',
551
- description: 'Only trigger for specific work category IDs',
1047
+ description: 'Only trigger for specific work category',
552
1048
  required: false,
1049
+ auth: auth_1.workbuddyAuth,
1050
+ refreshers: [],
1051
+ options: async ({ auth }) => {
1052
+ const authValue = auth;
1053
+ const token = await (0, auth_1.getAccessToken)(authValue);
1054
+ const baseUrl = authValue.props.baseUrl;
1055
+ const response = await pieces_common_1.httpClient.sendRequest({
1056
+ method: pieces_common_1.HttpMethod.GET,
1057
+ url: `${baseUrl}/api/v2/public/settings/work-types`,
1058
+ headers: {
1059
+ Authorization: `Bearer ${token}`,
1060
+ 'X-WorkBuddy-Version': '2026-01',
1061
+ },
1062
+ });
1063
+ const items = response.body?.items || [];
1064
+ return {
1065
+ options: items.map((item) => ({
1066
+ label: item.name,
1067
+ value: item.id,
1068
+ })),
1069
+ };
1070
+ },
553
1071
  }),
554
1072
  stageStatus: pieces_framework_1.Property.StaticMultiSelectDropdown({
555
1073
  displayName: 'Filter by Status',
@@ -565,33 +1083,80 @@ exports.stage_deleted_trigger = (0, pieces_framework_1.createTrigger)({
565
1083
  ],
566
1084
  },
567
1085
  }),
568
- schedulingTag: pieces_framework_1.Property.Array({
1086
+ schedulingTag: pieces_framework_1.Property.MultiSelectDropdown({
569
1087
  displayName: 'Filter by Scheduling Tag',
570
- description: 'Only trigger for specific scheduling tag IDs',
1088
+ description: 'Only trigger for specific scheduling tag',
571
1089
  required: false,
1090
+ auth: auth_1.workbuddyAuth,
1091
+ refreshers: [],
1092
+ options: async ({ auth }) => {
1093
+ const authValue = auth;
1094
+ const token = await (0, auth_1.getAccessToken)(authValue);
1095
+ const baseUrl = authValue.props.baseUrl;
1096
+ const response = await pieces_common_1.httpClient.sendRequest({
1097
+ method: pieces_common_1.HttpMethod.GET,
1098
+ url: `${baseUrl}/api/v2/public/settings/tags?type=scheduling`,
1099
+ headers: {
1100
+ Authorization: `Bearer ${token}`,
1101
+ 'X-WorkBuddy-Version': '2026-01',
1102
+ },
1103
+ });
1104
+ const items = response.body?.items || [];
1105
+ return {
1106
+ options: items.map((item) => ({
1107
+ label: item.name,
1108
+ value: item.id,
1109
+ })),
1110
+ };
1111
+ },
572
1112
  }),
573
1113
  },
574
1114
  sampleData: {
575
- workOrder: {
576
- id: '507f1f77bcf86cd799439011',
577
- name: 'Foundation Work',
578
- workOrderNumber: 'J10001-5039',
579
- jobNumber: 'J10001',
580
- description: 'Sample stage description',
581
- status: 'In Progress',
582
- previousStatus: 'Open',
583
- createdAt: '2026-03-05T10:00:00.000Z',
584
- updatedAt: '2026-03-05T10:00:00.000Z',
585
- startDate: '2026-03-05T08:00:00.000Z',
586
- dueDate: '2026-03-10T17:00:00.000Z',
587
- completedDate: null,
588
- finalisedDate: null,
589
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
590
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
591
- stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
1115
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
1116
+ event: 'Stage Deleted',
1117
+ action: 'remove',
1118
+ createdAt: '2026-03-14T05:21:47.307Z',
1119
+ webhookTimestamp: 1773465707307,
1120
+ data: {
1121
+ workOrder: {
1122
+ id: '507f1f77bcf86cd799439011',
1123
+ name: 'Foundation Work',
1124
+ workOrderNumber: 'J10001-5039',
1125
+ jobNumber: 'J10001',
1126
+ description: 'Sample stage description',
1127
+ status: 'In Progress',
1128
+ previousStatus: 'Open',
1129
+ createdAt: '2026-03-05T10:00:00.000Z',
1130
+ updatedAt: '2026-03-05T10:00:00.000Z',
1131
+ startDate: '2026-03-05T08:00:00.000Z',
1132
+ dueDate: '2026-03-10T17:00:00.000Z',
1133
+ completedDate: null,
1134
+ finalisedDate: null,
1135
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1136
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
1137
+ stageOwner: { id: '507f1f77bcf86cd799439011', name: 'Jane Doe' },
1138
+ technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
1139
+ subcontractor: null,
1140
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
1141
+ site: {
1142
+ id: '507f1f77bcf86cd799439011',
1143
+ name: 'Main Office',
1144
+ address: {
1145
+ street: '123 Main St',
1146
+ suburb: 'Sydney',
1147
+ state: 'NSW',
1148
+ postcode: '2000',
1149
+ country: 'Australia',
1150
+ formatted: '123 Main St, Sydney NSW 2000',
1151
+ },
1152
+ },
1153
+ workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
1154
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
1155
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
1156
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1157
+ },
592
1158
  technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
593
- subcontractor: null,
594
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
1159
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
595
1160
  site: {
596
1161
  id: '507f1f77bcf86cd799439011',
597
1162
  name: 'Main Office',
@@ -604,24 +1169,6 @@ exports.stage_deleted_trigger = (0, pieces_framework_1.createTrigger)({
604
1169
  formatted: '123 Main St, Sydney NSW 2000',
605
1170
  },
606
1171
  },
607
- workCategory: { id: '507f1f77bcf86cd799439011', name: 'Electrical' },
608
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
609
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
610
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
611
- },
612
- technician: { id: '507f1f77bcf86cd799439011', name: 'Mike Tech' },
613
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
614
- site: {
615
- id: '507f1f77bcf86cd799439011',
616
- name: 'Main Office',
617
- address: {
618
- street: '123 Main St',
619
- suburb: 'Sydney',
620
- state: 'NSW',
621
- postcode: '2000',
622
- country: 'Australia',
623
- formatted: '123 Main St, Sydney NSW 2000',
624
- },
625
1172
  },
626
1173
  },
627
1174
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -644,7 +1191,7 @@ exports.stage_deleted_trigger = (0, pieces_framework_1.createTrigger)({
644
1191
  filters.stageStatus = context.propsValue.stageStatus.map((v) => JSON.parse(v));
645
1192
  if (context.propsValue.schedulingTag?.length)
646
1193
  filters.schedulingTag = context.propsValue.schedulingTag;
647
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
1194
+ // Register webhook with WorkBuddy v2 API
648
1195
  const response = await pieces_common_1.httpClient.sendRequest({
649
1196
  method: pieces_common_1.HttpMethod.POST,
650
1197
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -673,18 +1220,15 @@ exports.stage_deleted_trigger = (0, pieces_framework_1.createTrigger)({
673
1220
  const baseUrl = context.auth.props.baseUrl;
674
1221
  const webhookId = await context.store.get('webhookId');
675
1222
  if (webhookId) {
676
- // Pause webhook (server keeps it for potential reactivation)
1223
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
677
1224
  await pieces_common_1.httpClient.sendRequest({
678
- method: pieces_common_1.HttpMethod.PATCH,
1225
+ method: pieces_common_1.HttpMethod.DELETE,
679
1226
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
680
1227
  headers: {
681
1228
  Authorization: `Bearer ${token}`,
682
1229
  'Content-Type': 'application/json',
683
1230
  'X-WorkBuddy-Version': '2026-01',
684
1231
  },
685
- body: {
686
- status: 'paused',
687
- },
688
1232
  });
689
1233
  }
690
1234
  },