@workbuddy/piece-workbuddy-vnext 1.0.3 → 1.0.5

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,41 +10,136 @@ exports.opportunity_created_trigger = (0, pieces_framework_1.createTrigger)({
10
10
  displayName: 'Opportunity Created',
11
11
  description: 'Triggered when a new opportunity 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
  opportunityStage: pieces_framework_1.Property.Array({
29
95
  displayName: 'Filter by Stage',
30
96
  description: 'Only trigger for specific stage IDs',
31
97
  required: false,
32
98
  }),
33
- owner: pieces_framework_1.Property.Array({
99
+ owner: pieces_framework_1.Property.MultiSelectDropdown({
34
100
  displayName: 'Filter by Owner',
35
- description: 'Only trigger for specific owner IDs',
101
+ description: 'Only trigger for specific owner',
36
102
  required: false,
103
+ auth: auth_1.workbuddyAuth,
104
+ refreshers: [],
105
+ options: async ({ auth }) => {
106
+ const authValue = auth;
107
+ const token = await (0, auth_1.getAccessToken)(authValue);
108
+ const baseUrl = authValue.props.baseUrl;
109
+ const response = await pieces_common_1.httpClient.sendRequest({
110
+ method: pieces_common_1.HttpMethod.GET,
111
+ url: `${baseUrl}/api/v2/public/employees`,
112
+ headers: {
113
+ Authorization: `Bearer ${token}`,
114
+ 'X-WorkBuddy-Version': '2026-01',
115
+ },
116
+ });
117
+ const items = response.body?.items || [];
118
+ return {
119
+ options: items.map((item) => ({
120
+ label: item.name,
121
+ value: item.id,
122
+ })),
123
+ };
124
+ },
37
125
  }),
38
126
  },
39
127
  sampleData: {
40
- opportunity: {
41
- id: '507f1f77bcf86cd799439011',
42
- name: 'New Project Opportunity',
43
- status: 'Open',
44
- value: 50000.0,
45
- createdAt: '2026-03-05T10:00:00.000Z',
46
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
47
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
128
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
129
+ event: 'Opportunity Created',
130
+ action: 'create',
131
+ createdAt: '2026-03-14T05:21:47.307Z',
132
+ webhookTimestamp: 1773465707307,
133
+ data: {
134
+ opportunity: {
135
+ id: '507f1f77bcf86cd799439011',
136
+ name: 'New Project Opportunity',
137
+ status: 'Open',
138
+ value: 50000.0,
139
+ createdAt: '2026-03-05T10:00:00.000Z',
140
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
141
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
142
+ },
48
143
  },
49
144
  },
50
145
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -63,7 +158,7 @@ exports.opportunity_created_trigger = (0, pieces_framework_1.createTrigger)({
63
158
  filters.opportunityStage = context.propsValue.opportunityStage;
64
159
  if (context.propsValue.owner?.length)
65
160
  filters.owner = context.propsValue.owner;
66
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
161
+ // Register webhook with WorkBuddy v2 API
67
162
  const response = await pieces_common_1.httpClient.sendRequest({
68
163
  method: pieces_common_1.HttpMethod.POST,
69
164
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -92,18 +187,15 @@ exports.opportunity_created_trigger = (0, pieces_framework_1.createTrigger)({
92
187
  const baseUrl = context.auth.props.baseUrl;
93
188
  const webhookId = await context.store.get('webhookId');
94
189
  if (webhookId) {
95
- // Pause webhook (server keeps it for potential reactivation)
190
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
96
191
  await pieces_common_1.httpClient.sendRequest({
97
- method: pieces_common_1.HttpMethod.PATCH,
192
+ method: pieces_common_1.HttpMethod.DELETE,
98
193
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
99
194
  headers: {
100
195
  Authorization: `Bearer ${token}`,
101
196
  'Content-Type': 'application/json',
102
197
  'X-WorkBuddy-Version': '2026-01',
103
198
  },
104
- body: {
105
- status: 'paused',
106
- },
107
199
  });
108
200
  }
109
201
  },
@@ -117,41 +209,136 @@ exports.opportunity_updated_trigger = (0, pieces_framework_1.createTrigger)({
117
209
  displayName: 'Opportunity Updated',
118
210
  description: 'Triggered when an opportunity is updated',
119
211
  props: {
120
- customer: pieces_framework_1.Property.Array({
212
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
121
213
  displayName: 'Filter by Customer',
122
- description: 'Only trigger for specific customer IDs',
214
+ description: 'Only trigger for specific customer',
123
215
  required: false,
216
+ auth: auth_1.workbuddyAuth,
217
+ refreshers: [],
218
+ options: async ({ auth }) => {
219
+ const authValue = auth;
220
+ const token = await (0, auth_1.getAccessToken)(authValue);
221
+ const baseUrl = authValue.props.baseUrl;
222
+ const response = await pieces_common_1.httpClient.sendRequest({
223
+ method: pieces_common_1.HttpMethod.GET,
224
+ url: `${baseUrl}/api/v2/public/customers`,
225
+ headers: {
226
+ Authorization: `Bearer ${token}`,
227
+ 'X-WorkBuddy-Version': '2026-01',
228
+ },
229
+ });
230
+ const items = response.body?.items || [];
231
+ return {
232
+ options: items.map((item) => ({
233
+ label: item.name,
234
+ value: item.id,
235
+ })),
236
+ };
237
+ },
124
238
  }),
125
- billingCompany: pieces_framework_1.Property.Array({
239
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
126
240
  displayName: 'Filter by Billing Company',
127
- description: 'Only trigger for specific billing company IDs',
241
+ description: 'Only trigger for specific billing company',
128
242
  required: false,
243
+ auth: auth_1.workbuddyAuth,
244
+ refreshers: [],
245
+ options: async ({ auth }) => {
246
+ const authValue = auth;
247
+ const token = await (0, auth_1.getAccessToken)(authValue);
248
+ const baseUrl = authValue.props.baseUrl;
249
+ const response = await pieces_common_1.httpClient.sendRequest({
250
+ method: pieces_common_1.HttpMethod.GET,
251
+ url: `${baseUrl}/api/v2/public/companies`,
252
+ headers: {
253
+ Authorization: `Bearer ${token}`,
254
+ 'X-WorkBuddy-Version': '2026-01',
255
+ },
256
+ });
257
+ const items = response.body?.items || [];
258
+ return {
259
+ options: items.map((item) => ({
260
+ label: item.name,
261
+ value: item.id,
262
+ })),
263
+ };
264
+ },
129
265
  }),
130
- tag: pieces_framework_1.Property.Array({
266
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
131
267
  displayName: 'Filter by Tags',
132
- description: 'Only trigger for specific tags IDs',
268
+ description: 'Only trigger for specific tags',
133
269
  required: false,
270
+ auth: auth_1.workbuddyAuth,
271
+ refreshers: [],
272
+ options: async ({ auth }) => {
273
+ const authValue = auth;
274
+ const token = await (0, auth_1.getAccessToken)(authValue);
275
+ const baseUrl = authValue.props.baseUrl;
276
+ const response = await pieces_common_1.httpClient.sendRequest({
277
+ method: pieces_common_1.HttpMethod.GET,
278
+ url: `${baseUrl}/api/v2/public/settings/tags`,
279
+ headers: {
280
+ Authorization: `Bearer ${token}`,
281
+ 'X-WorkBuddy-Version': '2026-01',
282
+ },
283
+ });
284
+ const items = response.body?.items || [];
285
+ return {
286
+ options: items.map((item) => ({
287
+ label: item.name,
288
+ value: item.id,
289
+ })),
290
+ };
291
+ },
134
292
  }),
135
293
  opportunityStage: pieces_framework_1.Property.Array({
136
294
  displayName: 'Filter by Stage',
137
295
  description: 'Only trigger for specific stage IDs',
138
296
  required: false,
139
297
  }),
140
- owner: pieces_framework_1.Property.Array({
298
+ owner: pieces_framework_1.Property.MultiSelectDropdown({
141
299
  displayName: 'Filter by Owner',
142
- description: 'Only trigger for specific owner IDs',
300
+ description: 'Only trigger for specific owner',
143
301
  required: false,
302
+ auth: auth_1.workbuddyAuth,
303
+ refreshers: [],
304
+ options: async ({ auth }) => {
305
+ const authValue = auth;
306
+ const token = await (0, auth_1.getAccessToken)(authValue);
307
+ const baseUrl = authValue.props.baseUrl;
308
+ const response = await pieces_common_1.httpClient.sendRequest({
309
+ method: pieces_common_1.HttpMethod.GET,
310
+ url: `${baseUrl}/api/v2/public/employees`,
311
+ headers: {
312
+ Authorization: `Bearer ${token}`,
313
+ 'X-WorkBuddy-Version': '2026-01',
314
+ },
315
+ });
316
+ const items = response.body?.items || [];
317
+ return {
318
+ options: items.map((item) => ({
319
+ label: item.name,
320
+ value: item.id,
321
+ })),
322
+ };
323
+ },
144
324
  }),
145
325
  },
146
326
  sampleData: {
147
- opportunity: {
148
- id: '507f1f77bcf86cd799439011',
149
- name: 'New Project Opportunity',
150
- status: 'Open',
151
- value: 50000.0,
152
- createdAt: '2026-03-05T10:00:00.000Z',
153
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
154
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
327
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
328
+ event: 'Opportunity Updated',
329
+ action: 'update',
330
+ createdAt: '2026-03-14T05:21:47.307Z',
331
+ webhookTimestamp: 1773465707307,
332
+ data: {
333
+ opportunity: {
334
+ id: '507f1f77bcf86cd799439011',
335
+ name: 'New Project Opportunity',
336
+ status: 'Open',
337
+ value: 50000.0,
338
+ createdAt: '2026-03-05T10:00:00.000Z',
339
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
340
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
341
+ },
155
342
  },
156
343
  },
157
344
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -170,7 +357,7 @@ exports.opportunity_updated_trigger = (0, pieces_framework_1.createTrigger)({
170
357
  filters.opportunityStage = context.propsValue.opportunityStage;
171
358
  if (context.propsValue.owner?.length)
172
359
  filters.owner = context.propsValue.owner;
173
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
360
+ // Register webhook with WorkBuddy v2 API
174
361
  const response = await pieces_common_1.httpClient.sendRequest({
175
362
  method: pieces_common_1.HttpMethod.POST,
176
363
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -199,18 +386,15 @@ exports.opportunity_updated_trigger = (0, pieces_framework_1.createTrigger)({
199
386
  const baseUrl = context.auth.props.baseUrl;
200
387
  const webhookId = await context.store.get('webhookId');
201
388
  if (webhookId) {
202
- // Pause webhook (server keeps it for potential reactivation)
389
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
203
390
  await pieces_common_1.httpClient.sendRequest({
204
- method: pieces_common_1.HttpMethod.PATCH,
391
+ method: pieces_common_1.HttpMethod.DELETE,
205
392
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
206
393
  headers: {
207
394
  Authorization: `Bearer ${token}`,
208
395
  'Content-Type': 'application/json',
209
396
  'X-WorkBuddy-Version': '2026-01',
210
397
  },
211
- body: {
212
- status: 'paused',
213
- },
214
398
  });
215
399
  }
216
400
  },
@@ -224,41 +408,136 @@ exports.opportunity_status_changed_trigger = (0, pieces_framework_1.createTrigge
224
408
  displayName: 'Opportunity Status Changed',
225
409
  description: 'Triggered when an opportunity status changes',
226
410
  props: {
227
- customer: pieces_framework_1.Property.Array({
411
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
228
412
  displayName: 'Filter by Customer',
229
- description: 'Only trigger for specific customer IDs',
413
+ description: 'Only trigger for specific customer',
230
414
  required: false,
415
+ auth: auth_1.workbuddyAuth,
416
+ refreshers: [],
417
+ options: async ({ auth }) => {
418
+ const authValue = auth;
419
+ const token = await (0, auth_1.getAccessToken)(authValue);
420
+ const baseUrl = authValue.props.baseUrl;
421
+ const response = await pieces_common_1.httpClient.sendRequest({
422
+ method: pieces_common_1.HttpMethod.GET,
423
+ url: `${baseUrl}/api/v2/public/customers`,
424
+ headers: {
425
+ Authorization: `Bearer ${token}`,
426
+ 'X-WorkBuddy-Version': '2026-01',
427
+ },
428
+ });
429
+ const items = response.body?.items || [];
430
+ return {
431
+ options: items.map((item) => ({
432
+ label: item.name,
433
+ value: item.id,
434
+ })),
435
+ };
436
+ },
231
437
  }),
232
- billingCompany: pieces_framework_1.Property.Array({
438
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
233
439
  displayName: 'Filter by Billing Company',
234
- description: 'Only trigger for specific billing company IDs',
440
+ description: 'Only trigger for specific billing company',
235
441
  required: false,
442
+ auth: auth_1.workbuddyAuth,
443
+ refreshers: [],
444
+ options: async ({ auth }) => {
445
+ const authValue = auth;
446
+ const token = await (0, auth_1.getAccessToken)(authValue);
447
+ const baseUrl = authValue.props.baseUrl;
448
+ const response = await pieces_common_1.httpClient.sendRequest({
449
+ method: pieces_common_1.HttpMethod.GET,
450
+ url: `${baseUrl}/api/v2/public/companies`,
451
+ headers: {
452
+ Authorization: `Bearer ${token}`,
453
+ 'X-WorkBuddy-Version': '2026-01',
454
+ },
455
+ });
456
+ const items = response.body?.items || [];
457
+ return {
458
+ options: items.map((item) => ({
459
+ label: item.name,
460
+ value: item.id,
461
+ })),
462
+ };
463
+ },
236
464
  }),
237
- tag: pieces_framework_1.Property.Array({
465
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
238
466
  displayName: 'Filter by Tags',
239
- description: 'Only trigger for specific tags IDs',
467
+ description: 'Only trigger for specific tags',
240
468
  required: false,
469
+ auth: auth_1.workbuddyAuth,
470
+ refreshers: [],
471
+ options: async ({ auth }) => {
472
+ const authValue = auth;
473
+ const token = await (0, auth_1.getAccessToken)(authValue);
474
+ const baseUrl = authValue.props.baseUrl;
475
+ const response = await pieces_common_1.httpClient.sendRequest({
476
+ method: pieces_common_1.HttpMethod.GET,
477
+ url: `${baseUrl}/api/v2/public/settings/tags`,
478
+ headers: {
479
+ Authorization: `Bearer ${token}`,
480
+ 'X-WorkBuddy-Version': '2026-01',
481
+ },
482
+ });
483
+ const items = response.body?.items || [];
484
+ return {
485
+ options: items.map((item) => ({
486
+ label: item.name,
487
+ value: item.id,
488
+ })),
489
+ };
490
+ },
241
491
  }),
242
492
  opportunityStage: pieces_framework_1.Property.Array({
243
493
  displayName: 'Filter by Stage',
244
494
  description: 'Only trigger for specific stage IDs',
245
495
  required: false,
246
496
  }),
247
- owner: pieces_framework_1.Property.Array({
497
+ owner: pieces_framework_1.Property.MultiSelectDropdown({
248
498
  displayName: 'Filter by Owner',
249
- description: 'Only trigger for specific owner IDs',
499
+ description: 'Only trigger for specific owner',
250
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/employees`,
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
+ },
251
523
  }),
252
524
  },
253
525
  sampleData: {
254
- opportunity: {
255
- id: '507f1f77bcf86cd799439011',
256
- name: 'New Project Opportunity',
257
- status: 'Open',
258
- value: 50000.0,
259
- createdAt: '2026-03-05T10:00:00.000Z',
260
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
261
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
526
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
527
+ event: 'Opportunity Status Changed',
528
+ action: 'update',
529
+ createdAt: '2026-03-14T05:21:47.307Z',
530
+ webhookTimestamp: 1773465707307,
531
+ data: {
532
+ opportunity: {
533
+ id: '507f1f77bcf86cd799439011',
534
+ name: 'New Project Opportunity',
535
+ status: 'Open',
536
+ value: 50000.0,
537
+ createdAt: '2026-03-05T10:00:00.000Z',
538
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
539
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
540
+ },
262
541
  },
263
542
  },
264
543
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -277,7 +556,7 @@ exports.opportunity_status_changed_trigger = (0, pieces_framework_1.createTrigge
277
556
  filters.opportunityStage = context.propsValue.opportunityStage;
278
557
  if (context.propsValue.owner?.length)
279
558
  filters.owner = context.propsValue.owner;
280
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
559
+ // Register webhook with WorkBuddy v2 API
281
560
  const response = await pieces_common_1.httpClient.sendRequest({
282
561
  method: pieces_common_1.HttpMethod.POST,
283
562
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -306,18 +585,15 @@ exports.opportunity_status_changed_trigger = (0, pieces_framework_1.createTrigge
306
585
  const baseUrl = context.auth.props.baseUrl;
307
586
  const webhookId = await context.store.get('webhookId');
308
587
  if (webhookId) {
309
- // Pause webhook (server keeps it for potential reactivation)
588
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
310
589
  await pieces_common_1.httpClient.sendRequest({
311
- method: pieces_common_1.HttpMethod.PATCH,
590
+ method: pieces_common_1.HttpMethod.DELETE,
312
591
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
313
592
  headers: {
314
593
  Authorization: `Bearer ${token}`,
315
594
  'Content-Type': 'application/json',
316
595
  'X-WorkBuddy-Version': '2026-01',
317
596
  },
318
- body: {
319
- status: 'paused',
320
- },
321
597
  });
322
598
  }
323
599
  },
@@ -331,41 +607,136 @@ exports.opportunity_deleted_trigger = (0, pieces_framework_1.createTrigger)({
331
607
  displayName: 'Opportunity Deleted',
332
608
  description: 'Triggered when an opportunity is deleted',
333
609
  props: {
334
- customer: pieces_framework_1.Property.Array({
610
+ customer: pieces_framework_1.Property.MultiSelectDropdown({
335
611
  displayName: 'Filter by Customer',
336
- description: 'Only trigger for specific customer IDs',
612
+ description: 'Only trigger for specific customer',
337
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/customers`,
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
+ },
338
636
  }),
339
- billingCompany: pieces_framework_1.Property.Array({
637
+ billingCompany: pieces_framework_1.Property.MultiSelectDropdown({
340
638
  displayName: 'Filter by Billing Company',
341
- description: 'Only trigger for specific billing company IDs',
639
+ description: 'Only trigger for specific billing company',
342
640
  required: false,
641
+ auth: auth_1.workbuddyAuth,
642
+ refreshers: [],
643
+ options: async ({ auth }) => {
644
+ const authValue = auth;
645
+ const token = await (0, auth_1.getAccessToken)(authValue);
646
+ const baseUrl = authValue.props.baseUrl;
647
+ const response = await pieces_common_1.httpClient.sendRequest({
648
+ method: pieces_common_1.HttpMethod.GET,
649
+ url: `${baseUrl}/api/v2/public/companies`,
650
+ headers: {
651
+ Authorization: `Bearer ${token}`,
652
+ 'X-WorkBuddy-Version': '2026-01',
653
+ },
654
+ });
655
+ const items = response.body?.items || [];
656
+ return {
657
+ options: items.map((item) => ({
658
+ label: item.name,
659
+ value: item.id,
660
+ })),
661
+ };
662
+ },
343
663
  }),
344
- tag: pieces_framework_1.Property.Array({
664
+ tag: pieces_framework_1.Property.MultiSelectDropdown({
345
665
  displayName: 'Filter by Tags',
346
- description: 'Only trigger for specific tags IDs',
666
+ description: 'Only trigger for specific tags',
347
667
  required: false,
668
+ auth: auth_1.workbuddyAuth,
669
+ refreshers: [],
670
+ options: async ({ auth }) => {
671
+ const authValue = auth;
672
+ const token = await (0, auth_1.getAccessToken)(authValue);
673
+ const baseUrl = authValue.props.baseUrl;
674
+ const response = await pieces_common_1.httpClient.sendRequest({
675
+ method: pieces_common_1.HttpMethod.GET,
676
+ url: `${baseUrl}/api/v2/public/settings/tags`,
677
+ headers: {
678
+ Authorization: `Bearer ${token}`,
679
+ 'X-WorkBuddy-Version': '2026-01',
680
+ },
681
+ });
682
+ const items = response.body?.items || [];
683
+ return {
684
+ options: items.map((item) => ({
685
+ label: item.name,
686
+ value: item.id,
687
+ })),
688
+ };
689
+ },
348
690
  }),
349
691
  opportunityStage: pieces_framework_1.Property.Array({
350
692
  displayName: 'Filter by Stage',
351
693
  description: 'Only trigger for specific stage IDs',
352
694
  required: false,
353
695
  }),
354
- owner: pieces_framework_1.Property.Array({
696
+ owner: pieces_framework_1.Property.MultiSelectDropdown({
355
697
  displayName: 'Filter by Owner',
356
- description: 'Only trigger for specific owner IDs',
698
+ description: 'Only trigger for specific owner',
357
699
  required: false,
700
+ auth: auth_1.workbuddyAuth,
701
+ refreshers: [],
702
+ options: async ({ auth }) => {
703
+ const authValue = auth;
704
+ const token = await (0, auth_1.getAccessToken)(authValue);
705
+ const baseUrl = authValue.props.baseUrl;
706
+ const response = await pieces_common_1.httpClient.sendRequest({
707
+ method: pieces_common_1.HttpMethod.GET,
708
+ url: `${baseUrl}/api/v2/public/employees`,
709
+ headers: {
710
+ Authorization: `Bearer ${token}`,
711
+ 'X-WorkBuddy-Version': '2026-01',
712
+ },
713
+ });
714
+ const items = response.body?.items || [];
715
+ return {
716
+ options: items.map((item) => ({
717
+ label: item.name,
718
+ value: item.id,
719
+ })),
720
+ };
721
+ },
358
722
  }),
359
723
  },
360
724
  sampleData: {
361
- opportunity: {
362
- id: '507f1f77bcf86cd799439011',
363
- name: 'New Project Opportunity',
364
- status: 'Open',
365
- value: 50000.0,
366
- createdAt: '2026-03-05T10:00:00.000Z',
367
- customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
368
- owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
725
+ id: 'whd_019ceacb-232b-764f-8dfd-748e1a226de2',
726
+ event: 'Opportunity Deleted',
727
+ action: 'remove',
728
+ createdAt: '2026-03-14T05:21:47.307Z',
729
+ webhookTimestamp: 1773465707307,
730
+ data: {
731
+ opportunity: {
732
+ id: '507f1f77bcf86cd799439011',
733
+ name: 'New Project Opportunity',
734
+ status: 'Open',
735
+ value: 50000.0,
736
+ createdAt: '2026-03-05T10:00:00.000Z',
737
+ customer: { id: '507f1f77bcf86cd799439011', name: 'Acme Corp' },
738
+ owner: { id: '507f1f77bcf86cd799439011', name: 'John Smith' },
739
+ },
369
740
  },
370
741
  },
371
742
  type: pieces_framework_1.TriggerStrategy.WEBHOOK,
@@ -384,7 +755,7 @@ exports.opportunity_deleted_trigger = (0, pieces_framework_1.createTrigger)({
384
755
  filters.opportunityStage = context.propsValue.opportunityStage;
385
756
  if (context.propsValue.owner?.length)
386
757
  filters.owner = context.propsValue.owner;
387
- // Register webhook with WorkBuddy v2 API (server handles upsert - reactivates if exists)
758
+ // Register webhook with WorkBuddy v2 API
388
759
  const response = await pieces_common_1.httpClient.sendRequest({
389
760
  method: pieces_common_1.HttpMethod.POST,
390
761
  url: `${baseUrl}/api/v2/public/webhooks`,
@@ -413,18 +784,15 @@ exports.opportunity_deleted_trigger = (0, pieces_framework_1.createTrigger)({
413
784
  const baseUrl = context.auth.props.baseUrl;
414
785
  const webhookId = await context.store.get('webhookId');
415
786
  if (webhookId) {
416
- // Pause webhook (server keeps it for potential reactivation)
787
+ // Delete webhook to avoid stale subscriptions causing duplicate trigger deliveries
417
788
  await pieces_common_1.httpClient.sendRequest({
418
- method: pieces_common_1.HttpMethod.PATCH,
789
+ method: pieces_common_1.HttpMethod.DELETE,
419
790
  url: `${baseUrl}/api/v2/public/webhooks/${webhookId}`,
420
791
  headers: {
421
792
  Authorization: `Bearer ${token}`,
422
793
  'Content-Type': 'application/json',
423
794
  'X-WorkBuddy-Version': '2026-01',
424
795
  },
425
- body: {
426
- status: 'paused',
427
- },
428
796
  });
429
797
  }
430
798
  },