@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,20 +10,86 @@ exports.quote_created_trigger = (0, pieces_framework_1.createTrigger)({
10
10
  displayName: 'Quote Created',
11
11
  description: 'Triggered when a new quote 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
94
  status: pieces_framework_1.Property.StaticMultiSelectDropdown({
29
95
  displayName: 'Filter by Status',
@@ -41,16 +107,23 @@ exports.quote_created_trigger = (0, pieces_framework_1.createTrigger)({
41
107
  }),
42
108
  },
43
109
  sampleData: {
44
- quote: {
45
- id: '507f1f77bcf86cd799439011',
46
- quoteNumber: 'Q-1001',
47
- status: 'Draft',
48
- total: 2500.0,
49
- tax: 250.0,
50
- createdAt: '2026-03-05T10:00:00.000Z',
51
- validUntil: '2026-04-05T10:00:00.000Z',
52
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
53
- job: { id: '507f1f77bcf86cd799439011', name: 'J10001' },
110
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
111
+ event: 'Quote Created',
112
+ action: 'create',
113
+ createdAt: '2026-03-14T05:21:47.307Z',
114
+ webhookTimestamp: 1773465707307,
115
+ data: {
116
+ quote: {
117
+ id: '507f1f77bcf86cd799439011',
118
+ quoteNumber: 'Q-1001',
119
+ status: 'Draft',
120
+ total: 2500.0,
121
+ tax: 250.0,
122
+ createdAt: '2026-03-05T10:00:00.000Z',
123
+ validUntil: '2026-04-05T10:00:00.000Z',
124
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
125
+ job: { id: '507f1f77bcf86cd799439011', name: 'J10001' },
126
+ },
54
127
  },
55
128
  },
56
129
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -67,7 +140,7 @@ exports.quote_created_trigger = (0, pieces_framework_1.createTrigger)({
67
140
  filters.tag = context.propsValue.tag;
68
141
  if (context.propsValue.status?.length)
69
142
  filters.status = context.propsValue.status.map((v) => JSON.parse(v));
70
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
143
+ // Register webhook with WorkBuddy v2 API
71
144
  const response = await pieces_common_1.httpClient.sendRequest({
72
145
  method: pieces_common_1.HttpMethod.POST,
73
146
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -96,18 +169,15 @@ exports.quote_created_trigger = (0, pieces_framework_1.createTrigger)({
96
169
  const baseUrl = context.auth.props.baseUrl;
97
170
  const webhookId = await context.store.get('webhookId');
98
171
  if (webhookId) {
99
- // Pause webhook (server keeps it for potential reactivation)
172
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
100
173
  await pieces_common_1.httpClient.sendRequest({
101
- method: pieces_common_1.HttpMethod.PATCH,
174
+ method: pieces_common_1.HttpMethod.DELETE,
102
175
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
103
176
  headers: {
104
177
  Authorization: `Bearer ${token}`,
105
178
  'Content-Type': 'application/json',
106
179
  'X-WorkBuddy-Version': '2026-01',
107
180
  },
108
- body: {
109
- status: 'paused',
110
- },
111
181
  });
112
182
  }
113
183
  },
@@ -121,20 +191,86 @@ exports.quote_updated_trigger = (0, pieces_framework_1.createTrigger)({
121
191
  displayName: 'Quote Updated',
122
192
  description: 'Triggered when a quote is updated',
123
193
  props: {
124
- customer: pieces_framework_1.Property.Array({
194
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
125
195
  displayName: 'Filter by Customer',
126
- description: 'Only trigger for specific customer IDs',
196
+ description: 'Only trigger for specific customer',
127
197
  required: false,
198
+ auth: auth_1.workbuddyAuth,
199
+ refreshers: [],
200
+ options: async ({ auth }) => {
201
+ const authValue = auth;
202
+ const token = await (0, auth_1.getAccessToken)(authValue);
203
+ const baseUrl = authValue.props.baseUrl;
204
+ const response = await pieces_common_1.httpClient.sendRequest({
205
+ method: pieces_common_1.HttpMethod.GET,
206
+ url: `${baseUrl}/api/v2/public/customers`,
207
+ headers: {
208
+ Authorization: `Bearer ${token}`,
209
+ 'X-WorkBuddy-Version': '2026-01',
210
+ },
211
+ });
212
+ const items = response.body?.items || [];
213
+ return {
214
+ options: items.map((item) => ({
215
+ label: item.name,
216
+ value: item.id,
217
+ })),
218
+ };
219
+ },
128
220
  }),
129
- billingCompany: pieces_framework_1.Property.Array({
221
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
130
222
  displayName: 'Filter by Billing Company',
131
- description: 'Only trigger for specific billing company IDs',
223
+ description: 'Only trigger for specific billing company',
132
224
  required: false,
225
+ auth: auth_1.workbuddyAuth,
226
+ refreshers: [],
227
+ options: async ({ auth }) => {
228
+ const authValue = auth;
229
+ const token = await (0, auth_1.getAccessToken)(authValue);
230
+ const baseUrl = authValue.props.baseUrl;
231
+ const response = await pieces_common_1.httpClient.sendRequest({
232
+ method: pieces_common_1.HttpMethod.GET,
233
+ url: `${baseUrl}/api/v2/public/companies`,
234
+ headers: {
235
+ Authorization: `Bearer ${token}`,
236
+ 'X-WorkBuddy-Version': '2026-01',
237
+ },
238
+ });
239
+ const items = response.body?.items || [];
240
+ return {
241
+ options: items.map((item) => ({
242
+ label: item.name,
243
+ value: item.id,
244
+ })),
245
+ };
246
+ },
133
247
  }),
134
- tag: pieces_framework_1.Property.Array({
248
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
135
249
  displayName: 'Filter by Tags',
136
- description: 'Only trigger for specific tags IDs',
250
+ description: 'Only trigger for specific tags',
137
251
  required: false,
252
+ auth: auth_1.workbuddyAuth,
253
+ refreshers: [],
254
+ options: async ({ auth }) => {
255
+ const authValue = auth;
256
+ const token = await (0, auth_1.getAccessToken)(authValue);
257
+ const baseUrl = authValue.props.baseUrl;
258
+ const response = await pieces_common_1.httpClient.sendRequest({
259
+ method: pieces_common_1.HttpMethod.GET,
260
+ url: `${baseUrl}/api/v2/public/settings/tags`,
261
+ headers: {
262
+ Authorization: `Bearer ${token}`,
263
+ 'X-WorkBuddy-Version': '2026-01',
264
+ },
265
+ });
266
+ const items = response.body?.items || [];
267
+ return {
268
+ options: items.map((item) => ({
269
+ label: item.name,
270
+ value: item.id,
271
+ })),
272
+ };
273
+ },
138
274
  }),
139
275
  status: pieces_framework_1.Property.StaticMultiSelectDropdown({
140
276
  displayName: 'Filter by Status',
@@ -152,16 +288,23 @@ exports.quote_updated_trigger = (0, pieces_framework_1.createTrigger)({
152
288
  }),
153
289
  },
154
290
  sampleData: {
155
- quote: {
156
- id: '507f1f77bcf86cd799439011',
157
- quoteNumber: 'Q-1001',
158
- status: 'Draft',
159
- total: 2500.0,
160
- tax: 250.0,
161
- createdAt: '2026-03-05T10:00:00.000Z',
162
- validUntil: '2026-04-05T10:00:00.000Z',
163
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
164
- job: { id: '507f1f77bcf86cd799439011', name: 'J10001' },
291
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
292
+ event: 'Quote Updated',
293
+ action: 'update',
294
+ createdAt: '2026-03-14T05:21:47.307Z',
295
+ webhookTimestamp: 1773465707307,
296
+ data: {
297
+ quote: {
298
+ id: '507f1f77bcf86cd799439011',
299
+ quoteNumber: 'Q-1001',
300
+ status: 'Draft',
301
+ total: 2500.0,
302
+ tax: 250.0,
303
+ createdAt: '2026-03-05T10:00:00.000Z',
304
+ validUntil: '2026-04-05T10:00:00.000Z',
305
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
306
+ job: { id: '507f1f77bcf86cd799439011', name: 'J10001' },
307
+ },
165
308
  },
166
309
  },
167
310
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -178,7 +321,7 @@ exports.quote_updated_trigger = (0, pieces_framework_1.createTrigger)({
178
321
  filters.tag = context.propsValue.tag;
179
322
  if (context.propsValue.status?.length)
180
323
  filters.status = context.propsValue.status.map((v) => JSON.parse(v));
181
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
324
+ // Register webhook with WorkBuddy v2 API
182
325
  const response = await pieces_common_1.httpClient.sendRequest({
183
326
  method: pieces_common_1.HttpMethod.POST,
184
327
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -207,18 +350,15 @@ exports.quote_updated_trigger = (0, pieces_framework_1.createTrigger)({
207
350
  const baseUrl = context.auth.props.baseUrl;
208
351
  const webhookId = await context.store.get('webhookId');
209
352
  if (webhookId) {
210
- // Pause webhook (server keeps it for potential reactivation)
353
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
211
354
  await pieces_common_1.httpClient.sendRequest({
212
- method: pieces_common_1.HttpMethod.PATCH,
355
+ method: pieces_common_1.HttpMethod.DELETE,
213
356
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
214
357
  headers: {
215
358
  Authorization: `Bearer ${token}`,
216
359
  'Content-Type': 'application/json',
217
360
  'X-WorkBuddy-Version': '2026-01',
218
361
  },
219
- body: {
220
- status: 'paused',
221
- },
222
362
  });
223
363
  }
224
364
  },
@@ -232,20 +372,86 @@ exports.quote_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
232
372
  displayName: 'Quote Status Changed',
233
373
  description: 'Triggered when a quote status changes',
234
374
  props: {
235
- customer: pieces_framework_1.Property.Array({
375
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
236
376
  displayName: 'Filter by Customer',
237
- description: 'Only trigger for specific customer IDs',
377
+ description: 'Only trigger for specific customer',
238
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/customers`,
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
+ },
239
401
  }),
240
- billingCompany: pieces_framework_1.Property.Array({
402
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
241
403
  displayName: 'Filter by Billing Company',
242
- description: 'Only trigger for specific billing company IDs',
404
+ description: 'Only trigger for specific billing company',
243
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/companies`,
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
+ },
244
428
  }),
245
- tag: pieces_framework_1.Property.Array({
429
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
246
430
  displayName: 'Filter by Tags',
247
- description: 'Only trigger for specific tags IDs',
431
+ description: 'Only trigger for specific tags',
248
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/tags`,
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
+ },
249
455
  }),
250
456
  status: pieces_framework_1.Property.StaticMultiSelectDropdown({
251
457
  displayName: 'Filter by Status',
@@ -263,16 +469,23 @@ exports.quote_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
263
469
  }),
264
470
  },
265
471
  sampleData: {
266
- quote: {
267
- id: '507f1f77bcf86cd799439011',
268
- quoteNumber: 'Q-1001',
269
- status: 'Draft',
270
- total: 2500.0,
271
- tax: 250.0,
272
- createdAt: '2026-03-05T10:00:00.000Z',
273
- validUntil: '2026-04-05T10:00:00.000Z',
274
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
275
- job: { id: '507f1f77bcf86cd799439011', name: 'J10001' },
472
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
473
+ event: 'Quote Status Changed',
474
+ action: 'update',
475
+ createdAt: '2026-03-14T05:21:47.307Z',
476
+ webhookTimestamp: 1773465707307,
477
+ data: {
478
+ quote: {
479
+ id: '507f1f77bcf86cd799439011',
480
+ quoteNumber: 'Q-1001',
481
+ status: 'Draft',
482
+ total: 2500.0,
483
+ tax: 250.0,
484
+ createdAt: '2026-03-05T10:00:00.000Z',
485
+ validUntil: '2026-04-05T10:00:00.000Z',
486
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
487
+ job: { id: '507f1f77bcf86cd799439011', name: 'J10001' },
488
+ },
276
489
  },
277
490
  },
278
491
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -289,7 +502,7 @@ exports.quote_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
289
502
  filters.tag = context.propsValue.tag;
290
503
  if (context.propsValue.status?.length)
291
504
  filters.status = context.propsValue.status.map((v) => JSON.parse(v));
292
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
505
+ // Register webhook with WorkBuddy v2 API
293
506
  const response = await pieces_common_1.httpClient.sendRequest({
294
507
  method: pieces_common_1.HttpMethod.POST,
295
508
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -318,18 +531,15 @@ exports.quote_status_changed_trigger = (0, pieces_framework_1.createTrigger)({
318
531
  const baseUrl = context.auth.props.baseUrl;
319
532
  const webhookId = await context.store.get('webhookId');
320
533
  if (webhookId) {
321
- // Pause webhook (server keeps it for potential reactivation)
534
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
322
535
  await pieces_common_1.httpClient.sendRequest({
323
- method: pieces_common_1.HttpMethod.PATCH,
536
+ method: pieces_common_1.HttpMethod.DELETE,
324
537
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
325
538
  headers: {
326
539
  Authorization: `Bearer ${token}`,
327
540
  'Content-Type': 'application/json',
328
541
  'X-WorkBuddy-Version': '2026-01',
329
542
  },
330
- body: {
331
- status: 'paused',
332
- },
333
543
  });
334
544
  }
335
545
  },
@@ -343,20 +553,86 @@ exports.quote_deleted_trigger = (0, pieces_framework_1.createTrigger)({
343
553
  displayName: 'Quote Deleted',
344
554
  description: 'Triggered when a quote is deleted',
345
555
  props: {
346
- customer: pieces_framework_1.Property.Array({
556
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
347
557
  displayName: 'Filter by Customer',
348
- description: 'Only trigger for specific customer IDs',
558
+ description: 'Only trigger for specific customer',
349
559
  required: false,
560
+ auth: auth_1.workbuddyAuth,
561
+ refreshers: [],
562
+ options: async ({ auth }) => {
563
+ const authValue = auth;
564
+ const token = await (0, auth_1.getAccessToken)(authValue);
565
+ const baseUrl = authValue.props.baseUrl;
566
+ const response = await pieces_common_1.httpClient.sendRequest({
567
+ method: pieces_common_1.HttpMethod.GET,
568
+ url: `${baseUrl}/api/v2/public/customers`,
569
+ headers: {
570
+ Authorization: `Bearer ${token}`,
571
+ 'X-WorkBuddy-Version': '2026-01',
572
+ },
573
+ });
574
+ const items = response.body?.items || [];
575
+ return {
576
+ options: items.map((item) => ({
577
+ label: item.name,
578
+ value: item.id,
579
+ })),
580
+ };
581
+ },
350
582
  }),
351
- billingCompany: pieces_framework_1.Property.Array({
583
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
352
584
  displayName: 'Filter by Billing Company',
353
- description: 'Only trigger for specific billing company IDs',
585
+ description: 'Only trigger for specific billing company',
354
586
  required: false,
587
+ auth: auth_1.workbuddyAuth,
588
+ refreshers: [],
589
+ options: async ({ auth }) => {
590
+ const authValue = auth;
591
+ const token = await (0, auth_1.getAccessToken)(authValue);
592
+ const baseUrl = authValue.props.baseUrl;
593
+ const response = await pieces_common_1.httpClient.sendRequest({
594
+ method: pieces_common_1.HttpMethod.GET,
595
+ url: `${baseUrl}/api/v2/public/companies`,
596
+ headers: {
597
+ Authorization: `Bearer ${token}`,
598
+ 'X-WorkBuddy-Version': '2026-01',
599
+ },
600
+ });
601
+ const items = response.body?.items || [];
602
+ return {
603
+ options: items.map((item) => ({
604
+ label: item.name,
605
+ value: item.id,
606
+ })),
607
+ };
608
+ },
355
609
  }),
356
- tag: pieces_framework_1.Property.Array({
610
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
357
611
  displayName: 'Filter by Tags',
358
- description: 'Only trigger for specific tags IDs',
612
+ description: 'Only trigger for specific tags',
359
613
  required: false,
614
+ auth: auth_1.workbuddyAuth,
615
+ refreshers: [],
616
+ options: async ({ auth }) => {
617
+ const authValue = auth;
618
+ const token = await (0, auth_1.getAccessToken)(authValue);
619
+ const baseUrl = authValue.props.baseUrl;
620
+ const response = await pieces_common_1.httpClient.sendRequest({
621
+ method: pieces_common_1.HttpMethod.GET,
622
+ url: `${baseUrl}/api/v2/public/settings/tags`,
623
+ headers: {
624
+ Authorization: `Bearer ${token}`,
625
+ 'X-WorkBuddy-Version': '2026-01',
626
+ },
627
+ });
628
+ const items = response.body?.items || [];
629
+ return {
630
+ options: items.map((item) => ({
631
+ label: item.name,
632
+ value: item.id,
633
+ })),
634
+ };
635
+ },
360
636
  }),
361
637
  status: pieces_framework_1.Property.StaticMultiSelectDropdown({
362
638
  displayName: 'Filter by Status',
@@ -374,16 +650,23 @@ exports.quote_deleted_trigger = (0, pieces_framework_1.createTrigger)({
374
650
  }),
375
651
  },
376
652
  sampleData: {
377
- quote: {
378
- id: '507f1f77bcf86cd799439011',
379
- quoteNumber: 'Q-1001',
380
- status: 'Draft',
381
- total: 2500.0,
382
- tax: 250.0,
383
- createdAt: '2026-03-05T10:00:00.000Z',
384
- validUntil: '2026-04-05T10:00:00.000Z',
385
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
386
- job: { id: '507f1f77bcf86cd799439011', name: 'J10001' },
653
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
654
+ event: 'Quote Deleted',
655
+ action: 'remove',
656
+ createdAt: '2026-03-14T05:21:47.307Z',
657
+ webhookTimestamp: 1773465707307,
658
+ data: {
659
+ quote: {
660
+ id: '507f1f77bcf86cd799439011',
661
+ quoteNumber: 'Q-1001',
662
+ status: 'Draft',
663
+ total: 2500.0,
664
+ tax: 250.0,
665
+ createdAt: '2026-03-05T10:00:00.000Z',
666
+ validUntil: '2026-04-05T10:00:00.000Z',
667
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
668
+ job: { id: '507f1f77bcf86cd799439011', name: 'J10001' },
669
+ },
387
670
  },
388
671
  },
389
672
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -400,7 +683,7 @@ exports.quote_deleted_trigger = (0, pieces_framework_1.createTrigger)({
400
683
  filters.tag = context.propsValue.tag;
401
684
  if (context.propsValue.status?.length)
402
685
  filters.status = context.propsValue.status.map((v) => JSON.parse(v));
403
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
686
+ // Register webhook with WorkBuddy v2 API
404
687
  const response = await pieces_common_1.httpClient.sendRequest({
405
688
  method: pieces_common_1.HttpMethod.POST,
406
689
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -429,18 +712,15 @@ exports.quote_deleted_trigger = (0, pieces_framework_1.createTrigger)({
429
712
  const baseUrl = context.auth.props.baseUrl;
430
713
  const webhookId = await context.store.get('webhookId');
431
714
  if (webhookId) {
432
- // Pause webhook (server keeps it for potential reactivation)
715
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
433
716
  await pieces_common_1.httpClient.sendRequest({
434
- method: pieces_common_1.HttpMethod.PATCH,
717
+ method: pieces_common_1.HttpMethod.DELETE,
435
718
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
436
719
  headers: {
437
720
  Authorization: `Bearer ${token}`,
438
721
  'Content-Type': 'application/json',
439
722
  'X-WorkBuddy-Version': '2026-01',
440
723
  },
441
- body: {
442
- status: 'paused',
443
- },
444
724
  });
445
725
  }
446
726
  },