@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,45 +10,221 @@ exports.job_created_trigger = (0, pieces_framework_1.createTrigger)({
10
10
  displayName: 'Job Created',
11
11
  description: 'Triggered when a new job 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
- site: pieces_framework_1.Property.Array({
94
+ site: pieces_framework_1.Property.MultiSelectDropdown({
29
95
  displayName: 'Filter by Site',
30
- description: 'Only trigger for specific site IDs',
96
+ description: 'Only trigger for specific site',
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/sites`,
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
- type: pieces_framework_1.Property.Array({
121
+ type: pieces_framework_1.Property.MultiSelectDropdown({
34
122
  displayName: 'Filter by Job Type',
35
- description: 'Only trigger for specific job type IDs',
123
+ description: 'Only trigger for specific job type',
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/job-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
- priority: pieces_framework_1.Property.Array({
148
+ priority: pieces_framework_1.Property.MultiSelectDropdown({
39
149
  displayName: 'Filter by Priority',
40
- description: 'Only trigger for specific priority IDs',
150
+ description: 'Only trigger for specific priority',
41
151
  required: false,
152
+ auth: auth_1.workbuddyAuth,
153
+ refreshers: [],
154
+ options: async ({ auth }) => {
155
+ const authValue = auth;
156
+ const token = await (0, auth_1.getAccessToken)(authValue);
157
+ const baseUrl = authValue.props.baseUrl;
158
+ const response = await pieces_common_1.httpClient.sendRequest({
159
+ method: pieces_common_1.HttpMethod.GET,
160
+ url: `${baseUrl}/api/v2/public/settings/priorities`,
161
+ headers: {
162
+ Authorization: `Bearer ${token}`,
163
+ 'X-WorkBuddy-Version': '2026-01',
164
+ },
165
+ });
166
+ const items = response.body?.items || [];
167
+ return {
168
+ options: items.map((item) => ({
169
+ label: item.name,
170
+ value: item.id,
171
+ })),
172
+ };
173
+ },
42
174
  }),
43
- owner: pieces_framework_1.Property.Array({
175
+ owner: pieces_framework_1.Property.MultiSelectDropdown({
44
176
  displayName: 'Filter by Owner',
45
- description: 'Only trigger for specific owner IDs',
177
+ description: 'Only trigger for specific owner',
46
178
  required: false,
179
+ auth: auth_1.workbuddyAuth,
180
+ refreshers: [],
181
+ options: async ({ auth }) => {
182
+ const authValue = auth;
183
+ const token = await (0, auth_1.getAccessToken)(authValue);
184
+ const baseUrl = authValue.props.baseUrl;
185
+ const response = await pieces_common_1.httpClient.sendRequest({
186
+ method: pieces_common_1.HttpMethod.GET,
187
+ url: `${baseUrl}/api/v2/public/employees`,
188
+ headers: {
189
+ Authorization: `Bearer ${token}`,
190
+ 'X-WorkBuddy-Version': '2026-01',
191
+ },
192
+ });
193
+ const items = response.body?.items || [];
194
+ return {
195
+ options: items.map((item) => ({
196
+ label: item.name,
197
+ value: item.id,
198
+ })),
199
+ };
200
+ },
47
201
  }),
48
- zone: pieces_framework_1.Property.Array({
202
+ zone: pieces_framework_1.Property.MultiSelectDropdown({
49
203
  displayName: 'Filter by Zone',
50
- description: 'Only trigger for specific zone IDs',
204
+ description: 'Only trigger for specific zone',
51
205
  required: false,
206
+ auth: auth_1.workbuddyAuth,
207
+ refreshers: [],
208
+ options: async ({ auth }) => {
209
+ const authValue = auth;
210
+ const token = await (0, auth_1.getAccessToken)(authValue);
211
+ const baseUrl = authValue.props.baseUrl;
212
+ const response = await pieces_common_1.httpClient.sendRequest({
213
+ method: pieces_common_1.HttpMethod.GET,
214
+ url: `${baseUrl}/api/v2/public/settings/zones`,
215
+ headers: {
216
+ Authorization: `Bearer ${token}`,
217
+ 'X-WorkBuddy-Version': '2026-01',
218
+ },
219
+ });
220
+ const items = response.body?.items || [];
221
+ return {
222
+ options: items.map((item) => ({
223
+ label: item.name,
224
+ value: item.id,
225
+ })),
226
+ };
227
+ },
52
228
  }),
53
229
  status: pieces_framework_1.Property.StaticMultiSelectDropdown({
54
230
  displayName: 'Filter by Status',
@@ -66,39 +242,46 @@ exports.job_created_trigger = (0, pieces_framework_1.createTrigger)({
66
242
  }),
67
243
  },
68
244
  sampleData: {
69
- job: {
70
- id: '507f1f77bcf86cd799439011',
71
- mode: 'job',
72
- jobNumber: 'J10001',
73
- description: 'Sample job description',
74
- status: 'Open',
75
- source: 'web',
76
- createdAt: '2026-03-05T10:00:00.000Z',
77
- updatedAt: '2026-03-05T10:00:00.000Z',
78
- startDate: '2026-03-05T10:00:00.000Z',
79
- dueDate: '2026-03-15T10:00:00.000Z',
80
- completedDate: null,
81
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
82
- customerPO: 'PO-1234',
83
- customerWO: 'WO-5678',
84
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
85
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
86
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
87
- site: {
245
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
246
+ event: 'Job Created',
247
+ action: 'create',
248
+ createdAt: '2026-03-14T05:21:47.307Z',
249
+ webhookTimestamp: 1773465707307,
250
+ data: {
251
+ job: {
88
252
  id: '507f1f77bcf86cd799439011',
89
- name: 'Main Office',
90
- address: {
91
- street: '123 Main St',
92
- suburb: 'Sydney',
93
- state: 'NSW',
94
- postcode: '2000',
95
- country: 'Australia',
96
- formatted: '123 Main St, Sydney NSW 2000',
253
+ mode: 'job',
254
+ jobNumber: 'J10001',
255
+ description: 'Sample job description',
256
+ status: 'Open',
257
+ source: 'web',
258
+ createdAt: '2026-03-05T10:00:00.000Z',
259
+ updatedAt: '2026-03-05T10:00:00.000Z',
260
+ startDate: '2026-03-05T10:00:00.000Z',
261
+ dueDate: '2026-03-15T10:00:00.000Z',
262
+ completedDate: null,
263
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
264
+ customerPO: 'PO-1234',
265
+ customerWO: 'WO-5678',
266
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
267
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
268
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
269
+ site: {
270
+ id: '507f1f77bcf86cd799439011',
271
+ name: 'Main Office',
272
+ address: {
273
+ street: '123 Main St',
274
+ suburb: 'Sydney',
275
+ state: 'NSW',
276
+ postcode: '2000',
277
+ country: 'Australia',
278
+ formatted: '123 Main St, Sydney NSW 2000',
279
+ },
97
280
  },
281
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
282
+ type: { id: '507f1f77bcf86cd799439011', name: 'Maintenance' },
283
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
98
284
  },
99
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
100
- type: { id: '507f1f77bcf86cd799439011', name: 'Maintenance' },
101
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
102
285
  },
103
286
  },
104
287
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -125,7 +308,7 @@ exports.job_created_trigger = (0, pieces_framework_1.createTrigger)({
125
308
  filters.zone = context.propsValue.zone;
126
309
  if (context.propsValue.status?.length)
127
310
  filters.status = context.propsValue.status.map((v) => JSON.parse(v));
128
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
311
+ // Register webhook with WorkBuddy v2 API
129
312
  const response = await pieces_common_1.httpClient.sendRequest({
130
313
  method: pieces_common_1.HttpMethod.POST,
131
314
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -154,18 +337,15 @@ exports.job_created_trigger = (0, pieces_framework_1.createTrigger)({
154
337
  const baseUrl = context.auth.props.baseUrl;
155
338
  const webhookId = await context.store.get('webhookId');
156
339
  if (webhookId) {
157
- // Pause webhook (server keeps it for potential reactivation)
340
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
158
341
  await pieces_common_1.httpClient.sendRequest({
159
- method: pieces_common_1.HttpMethod.PATCH,
342
+ method: pieces_common_1.HttpMethod.DELETE,
160
343
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
161
344
  headers: {
162
345
  Authorization: `Bearer ${token}`,
163
346
  'Content-Type': 'application/json',
164
347
  'X-WorkBuddy-Version': '2026-01',
165
348
  },
166
- body: {
167
- status: 'paused',
168
- },
169
349
  });
170
350
  }
171
351
  },
@@ -179,45 +359,221 @@ exports.job_updated_trigger = (0, pieces_framework_1.createTrigger)({
179
359
  displayName: 'Job Updated',
180
360
  description: 'Triggered when a job is updated',
181
361
  props: {
182
- customer: pieces_framework_1.Property.Array({
362
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
183
363
  displayName: 'Filter by Customer',
184
- description: 'Only trigger for specific customer IDs',
364
+ description: 'Only trigger for specific customer',
185
365
  required: false,
366
+ auth: auth_1.workbuddyAuth,
367
+ refreshers: [],
368
+ options: async ({ auth }) => {
369
+ const authValue = auth;
370
+ const token = await (0, auth_1.getAccessToken)(authValue);
371
+ const baseUrl = authValue.props.baseUrl;
372
+ const response = await pieces_common_1.httpClient.sendRequest({
373
+ method: pieces_common_1.HttpMethod.GET,
374
+ url: `${baseUrl}/api/v2/public/customers`,
375
+ headers: {
376
+ Authorization: `Bearer ${token}`,
377
+ 'X-WorkBuddy-Version': '2026-01',
378
+ },
379
+ });
380
+ const items = response.body?.items || [];
381
+ return {
382
+ options: items.map((item) => ({
383
+ label: item.name,
384
+ value: item.id,
385
+ })),
386
+ };
387
+ },
186
388
  }),
187
- billingCompany: pieces_framework_1.Property.Array({
389
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
188
390
  displayName: 'Filter by Billing Company',
189
- description: 'Only trigger for specific billing company IDs',
391
+ description: 'Only trigger for specific billing company',
190
392
  required: false,
393
+ auth: auth_1.workbuddyAuth,
394
+ refreshers: [],
395
+ options: async ({ auth }) => {
396
+ const authValue = auth;
397
+ const token = await (0, auth_1.getAccessToken)(authValue);
398
+ const baseUrl = authValue.props.baseUrl;
399
+ const response = await pieces_common_1.httpClient.sendRequest({
400
+ method: pieces_common_1.HttpMethod.GET,
401
+ url: `${baseUrl}/api/v2/public/companies`,
402
+ headers: {
403
+ Authorization: `Bearer ${token}`,
404
+ 'X-WorkBuddy-Version': '2026-01',
405
+ },
406
+ });
407
+ const items = response.body?.items || [];
408
+ return {
409
+ options: items.map((item) => ({
410
+ label: item.name,
411
+ value: item.id,
412
+ })),
413
+ };
414
+ },
191
415
  }),
192
- tag: pieces_framework_1.Property.Array({
416
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
193
417
  displayName: 'Filter by Tags',
194
- description: 'Only trigger for specific tags IDs',
418
+ description: 'Only trigger for specific tags',
195
419
  required: false,
420
+ auth: auth_1.workbuddyAuth,
421
+ refreshers: [],
422
+ options: async ({ auth }) => {
423
+ const authValue = auth;
424
+ const token = await (0, auth_1.getAccessToken)(authValue);
425
+ const baseUrl = authValue.props.baseUrl;
426
+ const response = await pieces_common_1.httpClient.sendRequest({
427
+ method: pieces_common_1.HttpMethod.GET,
428
+ url: `${baseUrl}/api/v2/public/settings/tags`,
429
+ headers: {
430
+ Authorization: `Bearer ${token}`,
431
+ 'X-WorkBuddy-Version': '2026-01',
432
+ },
433
+ });
434
+ const items = response.body?.items || [];
435
+ return {
436
+ options: items.map((item) => ({
437
+ label: item.name,
438
+ value: item.id,
439
+ })),
440
+ };
441
+ },
196
442
  }),
197
- site: pieces_framework_1.Property.Array({
443
+ site: pieces_framework_1.Property.MultiSelectDropdown({
198
444
  displayName: 'Filter by Site',
199
- description: 'Only trigger for specific site IDs',
445
+ description: 'Only trigger for specific site',
200
446
  required: false,
447
+ auth: auth_1.workbuddyAuth,
448
+ refreshers: [],
449
+ options: async ({ auth }) => {
450
+ const authValue = auth;
451
+ const token = await (0, auth_1.getAccessToken)(authValue);
452
+ const baseUrl = authValue.props.baseUrl;
453
+ const response = await pieces_common_1.httpClient.sendRequest({
454
+ method: pieces_common_1.HttpMethod.GET,
455
+ url: `${baseUrl}/api/v2/public/sites`,
456
+ headers: {
457
+ Authorization: `Bearer ${token}`,
458
+ 'X-WorkBuddy-Version': '2026-01',
459
+ },
460
+ });
461
+ const items = response.body?.items || [];
462
+ return {
463
+ options: items.map((item) => ({
464
+ label: item.name,
465
+ value: item.id,
466
+ })),
467
+ };
468
+ },
201
469
  }),
202
- type: pieces_framework_1.Property.Array({
470
+ type: pieces_framework_1.Property.MultiSelectDropdown({
203
471
  displayName: 'Filter by Job Type',
204
- description: 'Only trigger for specific job type IDs',
472
+ description: 'Only trigger for specific job type',
205
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/job-types`,
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
+ },
206
496
  }),
207
- priority: pieces_framework_1.Property.Array({
497
+ priority: pieces_framework_1.Property.MultiSelectDropdown({
208
498
  displayName: 'Filter by Priority',
209
- description: 'Only trigger for specific priority IDs',
499
+ description: 'Only trigger for specific priority',
210
500
  required: false,
501
+ auth: auth_1.workbuddyAuth,
502
+ refreshers: [],
503
+ options: async ({ auth }) => {
504
+ const authValue = auth;
505
+ const token = await (0, auth_1.getAccessToken)(authValue);
506
+ const baseUrl = authValue.props.baseUrl;
507
+ const response = await pieces_common_1.httpClient.sendRequest({
508
+ method: pieces_common_1.HttpMethod.GET,
509
+ url: `${baseUrl}/api/v2/public/settings/priorities`,
510
+ headers: {
511
+ Authorization: `Bearer ${token}`,
512
+ 'X-WorkBuddy-Version': '2026-01',
513
+ },
514
+ });
515
+ const items = response.body?.items || [];
516
+ return {
517
+ options: items.map((item) => ({
518
+ label: item.name,
519
+ value: item.id,
520
+ })),
521
+ };
522
+ },
211
523
  }),
212
- owner: pieces_framework_1.Property.Array({
524
+ owner: pieces_framework_1.Property.MultiSelectDropdown({
213
525
  displayName: 'Filter by Owner',
214
- description: 'Only trigger for specific owner IDs',
526
+ description: 'Only trigger for specific owner',
215
527
  required: false,
528
+ auth: auth_1.workbuddyAuth,
529
+ refreshers: [],
530
+ options: async ({ auth }) => {
531
+ const authValue = auth;
532
+ const token = await (0, auth_1.getAccessToken)(authValue);
533
+ const baseUrl = authValue.props.baseUrl;
534
+ const response = await pieces_common_1.httpClient.sendRequest({
535
+ method: pieces_common_1.HttpMethod.GET,
536
+ url: `${baseUrl}/api/v2/public/employees`,
537
+ headers: {
538
+ Authorization: `Bearer ${token}`,
539
+ 'X-WorkBuddy-Version': '2026-01',
540
+ },
541
+ });
542
+ const items = response.body?.items || [];
543
+ return {
544
+ options: items.map((item) => ({
545
+ label: item.name,
546
+ value: item.id,
547
+ })),
548
+ };
549
+ },
216
550
  }),
217
- zone: pieces_framework_1.Property.Array({
551
+ zone: pieces_framework_1.Property.MultiSelectDropdown({
218
552
  displayName: 'Filter by Zone',
219
- description: 'Only trigger for specific zone IDs',
553
+ description: 'Only trigger for specific zone',
220
554
  required: false,
555
+ auth: auth_1.workbuddyAuth,
556
+ refreshers: [],
557
+ options: async ({ auth }) => {
558
+ const authValue = auth;
559
+ const token = await (0, auth_1.getAccessToken)(authValue);
560
+ const baseUrl = authValue.props.baseUrl;
561
+ const response = await pieces_common_1.httpClient.sendRequest({
562
+ method: pieces_common_1.HttpMethod.GET,
563
+ url: `${baseUrl}/api/v2/public/settings/zones`,
564
+ headers: {
565
+ Authorization: `Bearer ${token}`,
566
+ 'X-WorkBuddy-Version': '2026-01',
567
+ },
568
+ });
569
+ const items = response.body?.items || [];
570
+ return {
571
+ options: items.map((item) => ({
572
+ label: item.name,
573
+ value: item.id,
574
+ })),
575
+ };
576
+ },
221
577
  }),
222
578
  status: pieces_framework_1.Property.StaticMultiSelectDropdown({
223
579
  displayName: 'Filter by Status',
@@ -235,39 +591,46 @@ exports.job_updated_trigger = (0, pieces_framework_1.createTrigger)({
235
591
  }),
236
592
  },
237
593
  sampleData: {
238
- job: {
239
- id: '507f1f77bcf86cd799439011',
240
- mode: 'job',
241
- jobNumber: 'J10001',
242
- description: 'Sample job description',
243
- status: 'Open',
244
- source: 'web',
245
- createdAt: '2026-03-05T10:00:00.000Z',
246
- updatedAt: '2026-03-05T10:00:00.000Z',
247
- startDate: '2026-03-05T10:00:00.000Z',
248
- dueDate: '2026-03-15T10:00:00.000Z',
249
- completedDate: null,
250
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
251
- customerPO: 'PO-1234',
252
- customerWO: 'WO-5678',
253
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
254
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
255
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
256
- site: {
594
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
595
+ event: 'Job Updated',
596
+ action: 'update',
597
+ createdAt: '2026-03-14T05:21:47.307Z',
598
+ webhookTimestamp: 1773465707307,
599
+ data: {
600
+ job: {
257
601
  id: '507f1f77bcf86cd799439011',
258
- name: 'Main Office',
259
- address: {
260
- street: '123 Main St',
261
- suburb: 'Sydney',
262
- state: 'NSW',
263
- postcode: '2000',
264
- country: 'Australia',
265
- formatted: '123 Main St, Sydney NSW 2000',
602
+ mode: 'job',
603
+ jobNumber: 'J10001',
604
+ description: 'Sample job description',
605
+ status: 'Open',
606
+ source: 'web',
607
+ createdAt: '2026-03-05T10:00:00.000Z',
608
+ updatedAt: '2026-03-05T10:00:00.000Z',
609
+ startDate: '2026-03-05T10:00:00.000Z',
610
+ dueDate: '2026-03-15T10:00:00.000Z',
611
+ completedDate: null,
612
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
613
+ customerPO: 'PO-1234',
614
+ customerWO: 'WO-5678',
615
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
616
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
617
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
618
+ site: {
619
+ id: '507f1f77bcf86cd799439011',
620
+ name: 'Main Office',
621
+ address: {
622
+ street: '123 Main St',
623
+ suburb: 'Sydney',
624
+ state: 'NSW',
625
+ postcode: '2000',
626
+ country: 'Australia',
627
+ formatted: '123 Main St, Sydney NSW 2000',
628
+ },
266
629
  },
630
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
631
+ type: { id: '507f1f77bcf86cd799439011', name: 'Maintenance' },
632
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
267
633
  },
268
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
269
- type: { id: '507f1f77bcf86cd799439011', name: 'Maintenance' },
270
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
271
634
  },
272
635
  },
273
636
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -294,7 +657,7 @@ exports.job_updated_trigger = (0, pieces_framework_1.createTrigger)({
294
657
  filters.zone = context.propsValue.zone;
295
658
  if (context.propsValue.status?.length)
296
659
  filters.status = context.propsValue.status.map((v) => JSON.parse(v));
297
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
660
+ // Register webhook with WorkBuddy v2 API
298
661
  const response = await pieces_common_1.httpClient.sendRequest({
299
662
  method: pieces_common_1.HttpMethod.POST,
300
663
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -323,18 +686,15 @@ exports.job_updated_trigger = (0, pieces_framework_1.createTrigger)({
323
686
  const baseUrl = context.auth.props.baseUrl;
324
687
  const webhookId = await context.store.get('webhookId');
325
688
  if (webhookId) {
326
- // Pause webhook (server keeps it for potential reactivation)
689
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
327
690
  await pieces_common_1.httpClient.sendRequest({
328
- method: pieces_common_1.HttpMethod.PATCH,
691
+ method: pieces_common_1.HttpMethod.DELETE,
329
692
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
330
693
  headers: {
331
694
  Authorization: `Bearer ${token}`,
332
695
  'Content-Type': 'application/json',
333
696
  'X-WorkBuddy-Version': '2026-01',
334
697
  },
335
- body: {
336
- status: 'paused',
337
- },
338
698
  });
339
699
  }
340
700
  },
@@ -348,45 +708,221 @@ exports.job_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
348
708
  displayName: 'Job Status Changed',
349
709
  description: 'Triggered when a job status changes',
350
710
  props: {
351
- customer: pieces_framework_1.Property.Array({
711
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
352
712
  displayName: 'Filter by Customer',
353
- description: 'Only trigger for specific customer IDs',
713
+ description: 'Only trigger for specific customer',
354
714
  required: false,
715
+ auth: auth_1.workbuddyAuth,
716
+ refreshers: [],
717
+ options: async ({ auth }) => {
718
+ const authValue = auth;
719
+ const token = await (0, auth_1.getAccessToken)(authValue);
720
+ const baseUrl = authValue.props.baseUrl;
721
+ const response = await pieces_common_1.httpClient.sendRequest({
722
+ method: pieces_common_1.HttpMethod.GET,
723
+ url: `${baseUrl}/api/v2/public/customers`,
724
+ headers: {
725
+ Authorization: `Bearer ${token}`,
726
+ 'X-WorkBuddy-Version': '2026-01',
727
+ },
728
+ });
729
+ const items = response.body?.items || [];
730
+ return {
731
+ options: items.map((item) => ({
732
+ label: item.name,
733
+ value: item.id,
734
+ })),
735
+ };
736
+ },
355
737
  }),
356
- billingCompany: pieces_framework_1.Property.Array({
738
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
357
739
  displayName: 'Filter by Billing Company',
358
- description: 'Only trigger for specific billing company IDs',
740
+ description: 'Only trigger for specific billing company',
359
741
  required: false,
742
+ auth: auth_1.workbuddyAuth,
743
+ refreshers: [],
744
+ options: async ({ auth }) => {
745
+ const authValue = auth;
746
+ const token = await (0, auth_1.getAccessToken)(authValue);
747
+ const baseUrl = authValue.props.baseUrl;
748
+ const response = await pieces_common_1.httpClient.sendRequest({
749
+ method: pieces_common_1.HttpMethod.GET,
750
+ url: `${baseUrl}/api/v2/public/companies`,
751
+ headers: {
752
+ Authorization: `Bearer ${token}`,
753
+ 'X-WorkBuddy-Version': '2026-01',
754
+ },
755
+ });
756
+ const items = response.body?.items || [];
757
+ return {
758
+ options: items.map((item) => ({
759
+ label: item.name,
760
+ value: item.id,
761
+ })),
762
+ };
763
+ },
360
764
  }),
361
- tag: pieces_framework_1.Property.Array({
765
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
362
766
  displayName: 'Filter by Tags',
363
- description: 'Only trigger for specific tags IDs',
767
+ description: 'Only trigger for specific tags',
364
768
  required: false,
769
+ auth: auth_1.workbuddyAuth,
770
+ refreshers: [],
771
+ options: async ({ auth }) => {
772
+ const authValue = auth;
773
+ const token = await (0, auth_1.getAccessToken)(authValue);
774
+ const baseUrl = authValue.props.baseUrl;
775
+ const response = await pieces_common_1.httpClient.sendRequest({
776
+ method: pieces_common_1.HttpMethod.GET,
777
+ url: `${baseUrl}/api/v2/public/settings/tags`,
778
+ headers: {
779
+ Authorization: `Bearer ${token}`,
780
+ 'X-WorkBuddy-Version': '2026-01',
781
+ },
782
+ });
783
+ const items = response.body?.items || [];
784
+ return {
785
+ options: items.map((item) => ({
786
+ label: item.name,
787
+ value: item.id,
788
+ })),
789
+ };
790
+ },
365
791
  }),
366
- site: pieces_framework_1.Property.Array({
792
+ site: pieces_framework_1.Property.MultiSelectDropdown({
367
793
  displayName: 'Filter by Site',
368
- description: 'Only trigger for specific site IDs',
794
+ description: 'Only trigger for specific site',
369
795
  required: false,
796
+ auth: auth_1.workbuddyAuth,
797
+ refreshers: [],
798
+ options: async ({ auth }) => {
799
+ const authValue = auth;
800
+ const token = await (0, auth_1.getAccessToken)(authValue);
801
+ const baseUrl = authValue.props.baseUrl;
802
+ const response = await pieces_common_1.httpClient.sendRequest({
803
+ method: pieces_common_1.HttpMethod.GET,
804
+ url: `${baseUrl}/api/v2/public/sites`,
805
+ headers: {
806
+ Authorization: `Bearer ${token}`,
807
+ 'X-WorkBuddy-Version': '2026-01',
808
+ },
809
+ });
810
+ const items = response.body?.items || [];
811
+ return {
812
+ options: items.map((item) => ({
813
+ label: item.name,
814
+ value: item.id,
815
+ })),
816
+ };
817
+ },
370
818
  }),
371
- type: pieces_framework_1.Property.Array({
819
+ type: pieces_framework_1.Property.MultiSelectDropdown({
372
820
  displayName: 'Filter by Job Type',
373
- description: 'Only trigger for specific job type IDs',
821
+ description: 'Only trigger for specific job type',
374
822
  required: false,
823
+ auth: auth_1.workbuddyAuth,
824
+ refreshers: [],
825
+ options: async ({ auth }) => {
826
+ const authValue = auth;
827
+ const token = await (0, auth_1.getAccessToken)(authValue);
828
+ const baseUrl = authValue.props.baseUrl;
829
+ const response = await pieces_common_1.httpClient.sendRequest({
830
+ method: pieces_common_1.HttpMethod.GET,
831
+ url: `${baseUrl}/api/v2/public/settings/job-types`,
832
+ headers: {
833
+ Authorization: `Bearer ${token}`,
834
+ 'X-WorkBuddy-Version': '2026-01',
835
+ },
836
+ });
837
+ const items = response.body?.items || [];
838
+ return {
839
+ options: items.map((item) => ({
840
+ label: item.name,
841
+ value: item.id,
842
+ })),
843
+ };
844
+ },
375
845
  }),
376
- priority: pieces_framework_1.Property.Array({
846
+ priority: pieces_framework_1.Property.MultiSelectDropdown({
377
847
  displayName: 'Filter by Priority',
378
- description: 'Only trigger for specific priority IDs',
848
+ description: 'Only trigger for specific priority',
379
849
  required: false,
850
+ auth: auth_1.workbuddyAuth,
851
+ refreshers: [],
852
+ options: async ({ auth }) => {
853
+ const authValue = auth;
854
+ const token = await (0, auth_1.getAccessToken)(authValue);
855
+ const baseUrl = authValue.props.baseUrl;
856
+ const response = await pieces_common_1.httpClient.sendRequest({
857
+ method: pieces_common_1.HttpMethod.GET,
858
+ url: `${baseUrl}/api/v2/public/settings/priorities`,
859
+ headers: {
860
+ Authorization: `Bearer ${token}`,
861
+ 'X-WorkBuddy-Version': '2026-01',
862
+ },
863
+ });
864
+ const items = response.body?.items || [];
865
+ return {
866
+ options: items.map((item) => ({
867
+ label: item.name,
868
+ value: item.id,
869
+ })),
870
+ };
871
+ },
380
872
  }),
381
- owner: pieces_framework_1.Property.Array({
873
+ owner: pieces_framework_1.Property.MultiSelectDropdown({
382
874
  displayName: 'Filter by Owner',
383
- description: 'Only trigger for specific owner IDs',
875
+ description: 'Only trigger for specific owner',
384
876
  required: false,
877
+ auth: auth_1.workbuddyAuth,
878
+ refreshers: [],
879
+ options: async ({ auth }) => {
880
+ const authValue = auth;
881
+ const token = await (0, auth_1.getAccessToken)(authValue);
882
+ const baseUrl = authValue.props.baseUrl;
883
+ const response = await pieces_common_1.httpClient.sendRequest({
884
+ method: pieces_common_1.HttpMethod.GET,
885
+ url: `${baseUrl}/api/v2/public/employees`,
886
+ headers: {
887
+ Authorization: `Bearer ${token}`,
888
+ 'X-WorkBuddy-Version': '2026-01',
889
+ },
890
+ });
891
+ const items = response.body?.items || [];
892
+ return {
893
+ options: items.map((item) => ({
894
+ label: item.name,
895
+ value: item.id,
896
+ })),
897
+ };
898
+ },
385
899
  }),
386
- zone: pieces_framework_1.Property.Array({
900
+ zone: pieces_framework_1.Property.MultiSelectDropdown({
387
901
  displayName: 'Filter by Zone',
388
- description: 'Only trigger for specific zone IDs',
902
+ description: 'Only trigger for specific zone',
389
903
  required: false,
904
+ auth: auth_1.workbuddyAuth,
905
+ refreshers: [],
906
+ options: async ({ auth }) => {
907
+ const authValue = auth;
908
+ const token = await (0, auth_1.getAccessToken)(authValue);
909
+ const baseUrl = authValue.props.baseUrl;
910
+ const response = await pieces_common_1.httpClient.sendRequest({
911
+ method: pieces_common_1.HttpMethod.GET,
912
+ url: `${baseUrl}/api/v2/public/settings/zones`,
913
+ headers: {
914
+ Authorization: `Bearer ${token}`,
915
+ 'X-WorkBuddy-Version': '2026-01',
916
+ },
917
+ });
918
+ const items = response.body?.items || [];
919
+ return {
920
+ options: items.map((item) => ({
921
+ label: item.name,
922
+ value: item.id,
923
+ })),
924
+ };
925
+ },
390
926
  }),
391
927
  status: pieces_framework_1.Property.StaticMultiSelectDropdown({
392
928
  displayName: 'Filter by Status',
@@ -404,39 +940,46 @@ exports.job_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
404
940
  }),
405
941
  },
406
942
  sampleData: {
407
- job: {
408
- id: '507f1f77bcf86cd799439011',
409
- mode: 'job',
410
- jobNumber: 'J10001',
411
- description: 'Sample job description',
412
- status: 'Open',
413
- source: 'web',
414
- createdAt: '2026-03-05T10:00:00.000Z',
415
- updatedAt: '2026-03-05T10:00:00.000Z',
416
- startDate: '2026-03-05T10:00:00.000Z',
417
- dueDate: '2026-03-15T10:00:00.000Z',
418
- completedDate: null,
419
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
420
- customerPO: 'PO-1234',
421
- customerWO: 'WO-5678',
422
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
423
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
424
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
425
- site: {
943
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
944
+ event: 'Job Status Changed',
945
+ action: 'update',
946
+ createdAt: '2026-03-14T05:21:47.307Z',
947
+ webhookTimestamp: 1773465707307,
948
+ data: {
949
+ job: {
426
950
  id: '507f1f77bcf86cd799439011',
427
- name: 'Main Office',
428
- address: {
429
- street: '123 Main St',
430
- suburb: 'Sydney',
431
- state: 'NSW',
432
- postcode: '2000',
433
- country: 'Australia',
434
- formatted: '123 Main St, Sydney NSW 2000',
951
+ mode: 'job',
952
+ jobNumber: 'J10001',
953
+ description: 'Sample job description',
954
+ status: 'Open',
955
+ source: 'web',
956
+ createdAt: '2026-03-05T10:00:00.000Z',
957
+ updatedAt: '2026-03-05T10:00:00.000Z',
958
+ startDate: '2026-03-05T10:00:00.000Z',
959
+ dueDate: '2026-03-15T10:00:00.000Z',
960
+ completedDate: null,
961
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
962
+ customerPO: 'PO-1234',
963
+ customerWO: 'WO-5678',
964
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
965
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
966
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
967
+ site: {
968
+ id: '507f1f77bcf86cd799439011',
969
+ name: 'Main Office',
970
+ address: {
971
+ street: '123 Main St',
972
+ suburb: 'Sydney',
973
+ state: 'NSW',
974
+ postcode: '2000',
975
+ country: 'Australia',
976
+ formatted: '123 Main St, Sydney NSW 2000',
977
+ },
435
978
  },
979
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
980
+ type: { id: '507f1f77bcf86cd799439011', name: 'Maintenance' },
981
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
436
982
  },
437
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
438
- type: { id: '507f1f77bcf86cd799439011', name: 'Maintenance' },
439
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
440
983
  },
441
984
  },
442
985
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -463,7 +1006,7 @@ exports.job_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
463
1006
  filters.zone = context.propsValue.zone;
464
1007
  if (context.propsValue.status?.length)
465
1008
  filters.status = context.propsValue.status.map((v) => JSON.parse(v));
466
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
1009
+ // Register webhook with WorkBuddy v2 API
467
1010
  const response = await pieces_common_1.httpClient.sendRequest({
468
1011
  method: pieces_common_1.HttpMethod.POST,
469
1012
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -492,18 +1035,15 @@ exports.job_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
492
1035
  const baseUrl = context.auth.props.baseUrl;
493
1036
  const webhookId = await context.store.get('webhookId');
494
1037
  if (webhookId) {
495
- // Pause webhook (server keeps it for potential reactivation)
1038
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
496
1039
  await pieces_common_1.httpClient.sendRequest({
497
- method: pieces_common_1.HttpMethod.PATCH,
1040
+ method: pieces_common_1.HttpMethod.DELETE,
498
1041
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
499
1042
  headers: {
500
1043
  Authorization: `Bearer ${token}`,
501
1044
  'Content-Type': 'application/json',
502
1045
  'X-WorkBuddy-Version': '2026-01',
503
1046
  },
504
- body: {
505
- status: 'paused',
506
- },
507
1047
  });
508
1048
  }
509
1049
  },
@@ -517,45 +1057,221 @@ exports.job_deleted_trigger = (0, pieces_framework_1.createTrigger)({
517
1057
  displayName: 'Job Deleted',
518
1058
  description: 'Triggered when a job is deleted',
519
1059
  props: {
520
- customer: pieces_framework_1.Property.Array({
1060
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
521
1061
  displayName: 'Filter by Customer',
522
- description: 'Only trigger for specific customer IDs',
1062
+ description: 'Only trigger for specific customer',
523
1063
  required: false,
1064
+ auth: auth_1.workbuddyAuth,
1065
+ refreshers: [],
1066
+ options: async ({ auth }) => {
1067
+ const authValue = auth;
1068
+ const token = await (0, auth_1.getAccessToken)(authValue);
1069
+ const baseUrl = authValue.props.baseUrl;
1070
+ const response = await pieces_common_1.httpClient.sendRequest({
1071
+ method: pieces_common_1.HttpMethod.GET,
1072
+ url: `${baseUrl}/api/v2/public/customers`,
1073
+ headers: {
1074
+ Authorization: `Bearer ${token}`,
1075
+ 'X-WorkBuddy-Version': '2026-01',
1076
+ },
1077
+ });
1078
+ const items = response.body?.items || [];
1079
+ return {
1080
+ options: items.map((item) => ({
1081
+ label: item.name,
1082
+ value: item.id,
1083
+ })),
1084
+ };
1085
+ },
524
1086
  }),
525
- billingCompany: pieces_framework_1.Property.Array({
1087
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
526
1088
  displayName: 'Filter by Billing Company',
527
- description: 'Only trigger for specific billing company IDs',
1089
+ description: 'Only trigger for specific billing company',
528
1090
  required: false,
1091
+ auth: auth_1.workbuddyAuth,
1092
+ refreshers: [],
1093
+ options: async ({ auth }) => {
1094
+ const authValue = auth;
1095
+ const token = await (0, auth_1.getAccessToken)(authValue);
1096
+ const baseUrl = authValue.props.baseUrl;
1097
+ const response = await pieces_common_1.httpClient.sendRequest({
1098
+ method: pieces_common_1.HttpMethod.GET,
1099
+ url: `${baseUrl}/api/v2/public/companies`,
1100
+ headers: {
1101
+ Authorization: `Bearer ${token}`,
1102
+ 'X-WorkBuddy-Version': '2026-01',
1103
+ },
1104
+ });
1105
+ const items = response.body?.items || [];
1106
+ return {
1107
+ options: items.map((item) => ({
1108
+ label: item.name,
1109
+ value: item.id,
1110
+ })),
1111
+ };
1112
+ },
529
1113
  }),
530
- tag: pieces_framework_1.Property.Array({
1114
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
531
1115
  displayName: 'Filter by Tags',
532
- description: 'Only trigger for specific tags IDs',
1116
+ description: 'Only trigger for specific tags',
533
1117
  required: false,
1118
+ auth: auth_1.workbuddyAuth,
1119
+ refreshers: [],
1120
+ options: async ({ auth }) => {
1121
+ const authValue = auth;
1122
+ const token = await (0, auth_1.getAccessToken)(authValue);
1123
+ const baseUrl = authValue.props.baseUrl;
1124
+ const response = await pieces_common_1.httpClient.sendRequest({
1125
+ method: pieces_common_1.HttpMethod.GET,
1126
+ url: `${baseUrl}/api/v2/public/settings/tags`,
1127
+ headers: {
1128
+ Authorization: `Bearer ${token}`,
1129
+ 'X-WorkBuddy-Version': '2026-01',
1130
+ },
1131
+ });
1132
+ const items = response.body?.items || [];
1133
+ return {
1134
+ options: items.map((item) => ({
1135
+ label: item.name,
1136
+ value: item.id,
1137
+ })),
1138
+ };
1139
+ },
534
1140
  }),
535
- site: pieces_framework_1.Property.Array({
1141
+ site: pieces_framework_1.Property.MultiSelectDropdown({
536
1142
  displayName: 'Filter by Site',
537
- description: 'Only trigger for specific site IDs',
1143
+ description: 'Only trigger for specific site',
538
1144
  required: false,
1145
+ auth: auth_1.workbuddyAuth,
1146
+ refreshers: [],
1147
+ options: async ({ auth }) => {
1148
+ const authValue = auth;
1149
+ const token = await (0, auth_1.getAccessToken)(authValue);
1150
+ const baseUrl = authValue.props.baseUrl;
1151
+ const response = await pieces_common_1.httpClient.sendRequest({
1152
+ method: pieces_common_1.HttpMethod.GET,
1153
+ url: `${baseUrl}/api/v2/public/sites`,
1154
+ headers: {
1155
+ Authorization: `Bearer ${token}`,
1156
+ 'X-WorkBuddy-Version': '2026-01',
1157
+ },
1158
+ });
1159
+ const items = response.body?.items || [];
1160
+ return {
1161
+ options: items.map((item) => ({
1162
+ label: item.name,
1163
+ value: item.id,
1164
+ })),
1165
+ };
1166
+ },
539
1167
  }),
540
- type: pieces_framework_1.Property.Array({
1168
+ type: pieces_framework_1.Property.MultiSelectDropdown({
541
1169
  displayName: 'Filter by Job Type',
542
- description: 'Only trigger for specific job type IDs',
1170
+ description: 'Only trigger for specific job type',
543
1171
  required: false,
1172
+ auth: auth_1.workbuddyAuth,
1173
+ refreshers: [],
1174
+ options: async ({ auth }) => {
1175
+ const authValue = auth;
1176
+ const token = await (0, auth_1.getAccessToken)(authValue);
1177
+ const baseUrl = authValue.props.baseUrl;
1178
+ const response = await pieces_common_1.httpClient.sendRequest({
1179
+ method: pieces_common_1.HttpMethod.GET,
1180
+ url: `${baseUrl}/api/v2/public/settings/job-types`,
1181
+ headers: {
1182
+ Authorization: `Bearer ${token}`,
1183
+ 'X-WorkBuddy-Version': '2026-01',
1184
+ },
1185
+ });
1186
+ const items = response.body?.items || [];
1187
+ return {
1188
+ options: items.map((item) => ({
1189
+ label: item.name,
1190
+ value: item.id,
1191
+ })),
1192
+ };
1193
+ },
544
1194
  }),
545
- priority: pieces_framework_1.Property.Array({
1195
+ priority: pieces_framework_1.Property.MultiSelectDropdown({
546
1196
  displayName: 'Filter by Priority',
547
- description: 'Only trigger for specific priority IDs',
1197
+ description: 'Only trigger for specific priority',
548
1198
  required: false,
1199
+ auth: auth_1.workbuddyAuth,
1200
+ refreshers: [],
1201
+ options: async ({ auth }) => {
1202
+ const authValue = auth;
1203
+ const token = await (0, auth_1.getAccessToken)(authValue);
1204
+ const baseUrl = authValue.props.baseUrl;
1205
+ const response = await pieces_common_1.httpClient.sendRequest({
1206
+ method: pieces_common_1.HttpMethod.GET,
1207
+ url: `${baseUrl}/api/v2/public/settings/priorities`,
1208
+ headers: {
1209
+ Authorization: `Bearer ${token}`,
1210
+ 'X-WorkBuddy-Version': '2026-01',
1211
+ },
1212
+ });
1213
+ const items = response.body?.items || [];
1214
+ return {
1215
+ options: items.map((item) => ({
1216
+ label: item.name,
1217
+ value: item.id,
1218
+ })),
1219
+ };
1220
+ },
549
1221
  }),
550
- owner: pieces_framework_1.Property.Array({
1222
+ owner: pieces_framework_1.Property.MultiSelectDropdown({
551
1223
  displayName: 'Filter by Owner',
552
- description: 'Only trigger for specific owner IDs',
1224
+ description: 'Only trigger for specific owner',
553
1225
  required: false,
1226
+ auth: auth_1.workbuddyAuth,
1227
+ refreshers: [],
1228
+ options: async ({ auth }) => {
1229
+ const authValue = auth;
1230
+ const token = await (0, auth_1.getAccessToken)(authValue);
1231
+ const baseUrl = authValue.props.baseUrl;
1232
+ const response = await pieces_common_1.httpClient.sendRequest({
1233
+ method: pieces_common_1.HttpMethod.GET,
1234
+ url: `${baseUrl}/api/v2/public/employees`,
1235
+ headers: {
1236
+ Authorization: `Bearer ${token}`,
1237
+ 'X-WorkBuddy-Version': '2026-01',
1238
+ },
1239
+ });
1240
+ const items = response.body?.items || [];
1241
+ return {
1242
+ options: items.map((item) => ({
1243
+ label: item.name,
1244
+ value: item.id,
1245
+ })),
1246
+ };
1247
+ },
554
1248
  }),
555
- zone: pieces_framework_1.Property.Array({
1249
+ zone: pieces_framework_1.Property.MultiSelectDropdown({
556
1250
  displayName: 'Filter by Zone',
557
- description: 'Only trigger for specific zone IDs',
1251
+ description: 'Only trigger for specific zone',
558
1252
  required: false,
1253
+ auth: auth_1.workbuddyAuth,
1254
+ refreshers: [],
1255
+ options: async ({ auth }) => {
1256
+ const authValue = auth;
1257
+ const token = await (0, auth_1.getAccessToken)(authValue);
1258
+ const baseUrl = authValue.props.baseUrl;
1259
+ const response = await pieces_common_1.httpClient.sendRequest({
1260
+ method: pieces_common_1.HttpMethod.GET,
1261
+ url: `${baseUrl}/api/v2/public/settings/zones`,
1262
+ headers: {
1263
+ Authorization: `Bearer ${token}`,
1264
+ 'X-WorkBuddy-Version': '2026-01',
1265
+ },
1266
+ });
1267
+ const items = response.body?.items || [];
1268
+ return {
1269
+ options: items.map((item) => ({
1270
+ label: item.name,
1271
+ value: item.id,
1272
+ })),
1273
+ };
1274
+ },
559
1275
  }),
560
1276
  status: pieces_framework_1.Property.StaticMultiSelectDropdown({
561
1277
  displayName: 'Filter by Status',
@@ -573,39 +1289,46 @@ exports.job_deleted_trigger = (0, pieces_framework_1.createTrigger)({
573
1289
  }),
574
1290
  },
575
1291
  sampleData: {
576
- job: {
577
- id: '507f1f77bcf86cd799439011',
578
- mode: 'job',
579
- jobNumber: 'J10001',
580
- description: 'Sample job description',
581
- status: 'Open',
582
- source: 'web',
583
- createdAt: '2026-03-05T10:00:00.000Z',
584
- updatedAt: '2026-03-05T10:00:00.000Z',
585
- startDate: '2026-03-05T10:00:00.000Z',
586
- dueDate: '2026-03-15T10:00:00.000Z',
587
- completedDate: null,
588
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
589
- customerPO: 'PO-1234',
590
- customerWO: 'WO-5678',
591
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
592
- labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
593
- zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
594
- site: {
1292
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
1293
+ event: 'Job Deleted',
1294
+ action: 'remove',
1295
+ createdAt: '2026-03-14T05:21:47.307Z',
1296
+ webhookTimestamp: 1773465707307,
1297
+ data: {
1298
+ job: {
595
1299
  id: '507f1f77bcf86cd799439011',
596
- name: 'Main Office',
597
- address: {
598
- street: '123 Main St',
599
- suburb: 'Sydney',
600
- state: 'NSW',
601
- postcode: '2000',
602
- country: 'Australia',
603
- formatted: '123 Main St, Sydney NSW 2000',
1300
+ mode: 'job',
1301
+ jobNumber: 'J10001',
1302
+ description: 'Sample job description',
1303
+ status: 'Open',
1304
+ source: 'web',
1305
+ createdAt: '2026-03-05T10:00:00.000Z',
1306
+ updatedAt: '2026-03-05T10:00:00.000Z',
1307
+ startDate: '2026-03-05T10:00:00.000Z',
1308
+ dueDate: '2026-03-15T10:00:00.000Z',
1309
+ completedDate: null,
1310
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
1311
+ customerPO: 'PO-1234',
1312
+ customerWO: 'WO-5678',
1313
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
1314
+ labels: [{ id: '507f1f77bcf86cd799439011', name: 'Urgent' }],
1315
+ zones: [{ id: '507f1f77bcf86cd799439011', name: 'North' }],
1316
+ site: {
1317
+ id: '507f1f77bcf86cd799439011',
1318
+ name: 'Main Office',
1319
+ address: {
1320
+ street: '123 Main St',
1321
+ suburb: 'Sydney',
1322
+ state: 'NSW',
1323
+ postcode: '2000',
1324
+ country: 'Australia',
1325
+ formatted: '123 Main St, Sydney NSW 2000',
1326
+ },
604
1327
  },
1328
+ priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
1329
+ type: { id: '507f1f77bcf86cd799439011', name: 'Maintenance' },
1330
+ billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
605
1331
  },
606
- priority: { id: '507f1f77bcf86cd799439011', name: 'High' },
607
- type: { id: '507f1f77bcf86cd799439011', name: 'Maintenance' },
608
- billingCompany: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
609
1332
  },
610
1333
  },
611
1334
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -632,7 +1355,7 @@ exports.job_deleted_trigger = (0, pieces_framework_1.createTrigger)({
632
1355
  filters.zone = context.propsValue.zone;
633
1356
  if (context.propsValue.status?.length)
634
1357
  filters.status = context.propsValue.status.map((v) => JSON.parse(v));
635
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
1358
+ // Register webhook with WorkBuddy v2 API
636
1359
  const response = await pieces_common_1.httpClient.sendRequest({
637
1360
  method: pieces_common_1.HttpMethod.POST,
638
1361
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -661,18 +1384,15 @@ exports.job_deleted_trigger = (0, pieces_framework_1.createTrigger)({
661
1384
  const baseUrl = context.auth.props.baseUrl;
662
1385
  const webhookId = await context.store.get('webhookId');
663
1386
  if (webhookId) {
664
- // Pause webhook (server keeps it for potential reactivation)
1387
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
665
1388
  await pieces_common_1.httpClient.sendRequest({
666
- method: pieces_common_1.HttpMethod.PATCH,
1389
+ method: pieces_common_1.HttpMethod.DELETE,
667
1390
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
668
1391
  headers: {
669
1392
  Authorization: `Bearer ${token}`,
670
1393
  'Content-Type': 'application/json',
671
1394
  'X-WorkBuddy-Version': '2026-01',
672
1395
  },
673
- body: {
674
- status: 'paused',
675
- },
676
1396
  });
677
1397
  }
678
1398
  },