@arbium/enterprise-agent-connect 0.0.0-stage → 0.1.2-dev.9022f22

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 (322) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +269 -2
  3. package/dist/connectors/dell-techdirect/connector.json +39 -0
  4. package/dist/connectors/dell-techdirect/index.d.ts +8 -0
  5. package/dist/connectors/dell-techdirect/index.js +7 -0
  6. package/dist/connectors/dell-techdirect/index.js.map +1 -0
  7. package/dist/connectors/dell-techdirect/tools.d.ts +2 -0
  8. package/dist/connectors/dell-techdirect/tools.js +49 -0
  9. package/dist/connectors/dell-techdirect/tools.js.map +1 -0
  10. package/dist/connectors/dell-techdirect/vendor.d.ts +6 -0
  11. package/dist/connectors/dell-techdirect/vendor.js +57 -0
  12. package/dist/connectors/dell-techdirect/vendor.js.map +1 -0
  13. package/dist/connectors/dynamics-365/connector.json +228 -0
  14. package/dist/connectors/dynamics-365/index.d.ts +8 -0
  15. package/dist/connectors/dynamics-365/index.js +10 -0
  16. package/dist/connectors/dynamics-365/index.js.map +1 -0
  17. package/dist/connectors/dynamics-365/tools.d.ts +35 -0
  18. package/dist/connectors/dynamics-365/tools.js +806 -0
  19. package/dist/connectors/dynamics-365/tools.js.map +1 -0
  20. package/dist/connectors/dynamics-365/vendor.d.ts +9 -0
  21. package/dist/connectors/dynamics-365/vendor.js +110 -0
  22. package/dist/connectors/dynamics-365/vendor.js.map +1 -0
  23. package/dist/connectors/entra/connector.json +85 -0
  24. package/dist/connectors/entra/index.d.ts +2 -0
  25. package/dist/connectors/entra/index.js +4 -0
  26. package/dist/connectors/entra/index.js.map +1 -0
  27. package/dist/connectors/entra/tools.d.ts +14 -0
  28. package/dist/connectors/entra/tools.js +262 -0
  29. package/dist/connectors/entra/tools.js.map +1 -0
  30. package/dist/connectors/fedex/connector.json +118 -0
  31. package/dist/connectors/fedex/index.d.ts +8 -0
  32. package/dist/connectors/fedex/index.js +7 -0
  33. package/dist/connectors/fedex/index.js.map +1 -0
  34. package/dist/connectors/fedex/tools.d.ts +3 -0
  35. package/dist/connectors/fedex/tools.js +152 -0
  36. package/dist/connectors/fedex/tools.js.map +1 -0
  37. package/dist/connectors/fedex/vendor.d.ts +7 -0
  38. package/dist/connectors/fedex/vendor.js +98 -0
  39. package/dist/connectors/fedex/vendor.js.map +1 -0
  40. package/dist/connectors/gong/connector.json +127 -0
  41. package/dist/connectors/gong/index.d.ts +8 -0
  42. package/dist/connectors/gong/index.js +7 -0
  43. package/dist/connectors/gong/index.js.map +1 -0
  44. package/dist/connectors/gong/tools.d.ts +8 -0
  45. package/dist/connectors/gong/tools.js +424 -0
  46. package/dist/connectors/gong/tools.js.map +1 -0
  47. package/dist/connectors/gong/vendor.d.ts +4 -0
  48. package/dist/connectors/gong/vendor.js +89 -0
  49. package/dist/connectors/gong/vendor.js.map +1 -0
  50. package/dist/connectors/http/index.d.ts +34 -0
  51. package/dist/connectors/http/index.js +325 -0
  52. package/dist/connectors/http/index.js.map +1 -0
  53. package/dist/connectors/intune/connector.json +106 -0
  54. package/dist/connectors/intune/index.d.ts +2 -0
  55. package/dist/connectors/intune/index.js +4 -0
  56. package/dist/connectors/intune/index.js.map +1 -0
  57. package/dist/connectors/intune/tools.d.ts +12 -0
  58. package/dist/connectors/intune/tools.js +416 -0
  59. package/dist/connectors/intune/tools.js.map +1 -0
  60. package/dist/connectors/jamf/connector.json +182 -0
  61. package/dist/connectors/jamf/index.d.ts +8 -0
  62. package/dist/connectors/jamf/index.js +7 -0
  63. package/dist/connectors/jamf/index.js.map +1 -0
  64. package/dist/connectors/jamf/tools.d.ts +7 -0
  65. package/dist/connectors/jamf/tools.js +659 -0
  66. package/dist/connectors/jamf/tools.js.map +1 -0
  67. package/dist/connectors/jamf/vendor.d.ts +5 -0
  68. package/dist/connectors/jamf/vendor.js +70 -0
  69. package/dist/connectors/jamf/vendor.js.map +1 -0
  70. package/dist/connectors/jira/connector.json +272 -0
  71. package/dist/connectors/jira/index.d.ts +8 -0
  72. package/dist/connectors/jira/index.js +7 -0
  73. package/dist/connectors/jira/index.js.map +1 -0
  74. package/dist/connectors/jira/jql.d.ts +4 -0
  75. package/dist/connectors/jira/jql.js +67 -0
  76. package/dist/connectors/jira/jql.js.map +1 -0
  77. package/dist/connectors/jira/tools.d.ts +3 -0
  78. package/dist/connectors/jira/tools.js +464 -0
  79. package/dist/connectors/jira/tools.js.map +1 -0
  80. package/dist/connectors/jira/vendor.d.ts +3 -0
  81. package/dist/connectors/jira/vendor.js +100 -0
  82. package/dist/connectors/jira/vendor.js.map +1 -0
  83. package/dist/connectors/microsoft/client.d.ts +66 -0
  84. package/dist/connectors/microsoft/client.js +452 -0
  85. package/dist/connectors/microsoft/client.js.map +1 -0
  86. package/dist/connectors/microsoft/provider.json +118 -0
  87. package/dist/connectors/netsuite/connector.json +317 -0
  88. package/dist/connectors/netsuite/index.d.ts +8 -0
  89. package/dist/connectors/netsuite/index.js +7 -0
  90. package/dist/connectors/netsuite/index.js.map +1 -0
  91. package/dist/connectors/netsuite/tools.d.ts +24 -0
  92. package/dist/connectors/netsuite/tools.js +447 -0
  93. package/dist/connectors/netsuite/tools.js.map +1 -0
  94. package/dist/connectors/netsuite/vendor.d.ts +26 -0
  95. package/dist/connectors/netsuite/vendor.js +247 -0
  96. package/dist/connectors/netsuite/vendor.js.map +1 -0
  97. package/dist/connectors/odata/index.d.ts +33 -0
  98. package/dist/connectors/odata/index.js +460 -0
  99. package/dist/connectors/odata/index.js.map +1 -0
  100. package/dist/connectors/okta/connector.json +194 -0
  101. package/dist/connectors/okta/index.d.ts +8 -0
  102. package/dist/connectors/okta/index.js +7 -0
  103. package/dist/connectors/okta/index.js.map +1 -0
  104. package/dist/connectors/okta/tools.d.ts +6 -0
  105. package/dist/connectors/okta/tools.js +429 -0
  106. package/dist/connectors/okta/tools.js.map +1 -0
  107. package/dist/connectors/okta/vendor.d.ts +14 -0
  108. package/dist/connectors/okta/vendor.js +204 -0
  109. package/dist/connectors/okta/vendor.js.map +1 -0
  110. package/dist/connectors/outlook-calendar/connector.json +136 -0
  111. package/dist/connectors/outlook-calendar/index.d.ts +2 -0
  112. package/dist/connectors/outlook-calendar/index.js +4 -0
  113. package/dist/connectors/outlook-calendar/index.js.map +1 -0
  114. package/dist/connectors/outlook-calendar/tools.d.ts +65 -0
  115. package/dist/connectors/outlook-calendar/tools.js +398 -0
  116. package/dist/connectors/outlook-calendar/tools.js.map +1 -0
  117. package/dist/connectors/outlook-mail/connector.json +154 -0
  118. package/dist/connectors/outlook-mail/index.d.ts +2 -0
  119. package/dist/connectors/outlook-mail/index.js +4 -0
  120. package/dist/connectors/outlook-mail/index.js.map +1 -0
  121. package/dist/connectors/outlook-mail/tools.d.ts +8 -0
  122. package/dist/connectors/outlook-mail/tools.js +236 -0
  123. package/dist/connectors/outlook-mail/tools.js.map +1 -0
  124. package/dist/connectors/salesforce/connector.json +122 -0
  125. package/dist/connectors/salesforce/index.d.ts +8 -0
  126. package/dist/connectors/salesforce/index.js +7 -0
  127. package/dist/connectors/salesforce/index.js.map +1 -0
  128. package/dist/connectors/salesforce/soql.d.ts +3 -0
  129. package/dist/connectors/salesforce/soql.js +60 -0
  130. package/dist/connectors/salesforce/soql.js.map +1 -0
  131. package/dist/connectors/salesforce/tools.d.ts +9 -0
  132. package/dist/connectors/salesforce/tools.js +234 -0
  133. package/dist/connectors/salesforce/tools.js.map +1 -0
  134. package/dist/connectors/salesforce/vendor.d.ts +3 -0
  135. package/dist/connectors/salesforce/vendor.js +113 -0
  136. package/dist/connectors/salesforce/vendor.js.map +1 -0
  137. package/dist/connectors/sap-s4hana/connector.json +264 -0
  138. package/dist/connectors/sap-s4hana/index.d.ts +8 -0
  139. package/dist/connectors/sap-s4hana/index.js +7 -0
  140. package/dist/connectors/sap-s4hana/index.js.map +1 -0
  141. package/dist/connectors/sap-s4hana/tools.d.ts +4 -0
  142. package/dist/connectors/sap-s4hana/tools.js +761 -0
  143. package/dist/connectors/sap-s4hana/tools.js.map +1 -0
  144. package/dist/connectors/sap-s4hana/vendor.d.ts +5 -0
  145. package/dist/connectors/sap-s4hana/vendor.js +176 -0
  146. package/dist/connectors/sap-s4hana/vendor.js.map +1 -0
  147. package/dist/connectors/servicenow/connector.json +228 -0
  148. package/dist/connectors/servicenow/index.d.ts +8 -0
  149. package/dist/connectors/servicenow/index.js +7 -0
  150. package/dist/connectors/servicenow/index.js.map +1 -0
  151. package/dist/connectors/servicenow/tools.d.ts +4 -0
  152. package/dist/connectors/servicenow/tools.js +884 -0
  153. package/dist/connectors/servicenow/tools.js.map +1 -0
  154. package/dist/connectors/servicenow/vendor.d.ts +3 -0
  155. package/dist/connectors/servicenow/vendor.js +106 -0
  156. package/dist/connectors/servicenow/vendor.js.map +1 -0
  157. package/dist/connectors/sharepoint-files/connector.json +194 -0
  158. package/dist/connectors/sharepoint-files/excel.d.ts +16 -0
  159. package/dist/connectors/sharepoint-files/excel.js +300 -0
  160. package/dist/connectors/sharepoint-files/excel.js.map +1 -0
  161. package/dist/connectors/sharepoint-files/index.d.ts +8 -0
  162. package/dist/connectors/sharepoint-files/index.js +12 -0
  163. package/dist/connectors/sharepoint-files/index.js.map +1 -0
  164. package/dist/connectors/sharepoint-files/tools.d.ts +52 -0
  165. package/dist/connectors/sharepoint-files/tools.js +365 -0
  166. package/dist/connectors/sharepoint-files/tools.js.map +1 -0
  167. package/dist/connectors/sharepoint-files/vendor.d.ts +11 -0
  168. package/dist/connectors/sharepoint-files/vendor.js +167 -0
  169. package/dist/connectors/sharepoint-files/vendor.js.map +1 -0
  170. package/dist/connectors/slack/connector.json +148 -0
  171. package/dist/connectors/slack/index.d.ts +8 -0
  172. package/dist/connectors/slack/index.js +7 -0
  173. package/dist/connectors/slack/index.js.map +1 -0
  174. package/dist/connectors/slack/tools.d.ts +3 -0
  175. package/dist/connectors/slack/tools.js +355 -0
  176. package/dist/connectors/slack/tools.js.map +1 -0
  177. package/dist/connectors/slack/vendor.d.ts +17 -0
  178. package/dist/connectors/slack/vendor.js +189 -0
  179. package/dist/connectors/slack/vendor.js.map +1 -0
  180. package/dist/connectors/soap/index.d.ts +16 -0
  181. package/dist/connectors/soap/index.js +248 -0
  182. package/dist/connectors/soap/index.js.map +1 -0
  183. package/dist/connectors/soap/xml.d.ts +12 -0
  184. package/dist/connectors/soap/xml.js +126 -0
  185. package/dist/connectors/soap/xml.js.map +1 -0
  186. package/dist/connectors/sql/engines.d.ts +58 -0
  187. package/dist/connectors/sql/engines.js +292 -0
  188. package/dist/connectors/sql/engines.js.map +1 -0
  189. package/dist/connectors/sql/index.d.ts +16 -0
  190. package/dist/connectors/sql/index.js +214 -0
  191. package/dist/connectors/sql/index.js.map +1 -0
  192. package/dist/connectors/teams/connector.json +298 -0
  193. package/dist/connectors/teams/index.d.ts +2 -0
  194. package/dist/connectors/teams/index.js +5 -0
  195. package/dist/connectors/teams/index.js.map +1 -0
  196. package/dist/connectors/teams/tools.d.ts +7 -0
  197. package/dist/connectors/teams/tools.js +392 -0
  198. package/dist/connectors/teams/tools.js.map +1 -0
  199. package/dist/connectors/workday/connector.json +188 -0
  200. package/dist/connectors/workday/index.d.ts +8 -0
  201. package/dist/connectors/workday/index.js +7 -0
  202. package/dist/connectors/workday/index.js.map +1 -0
  203. package/dist/connectors/workday/tools.d.ts +33 -0
  204. package/dist/connectors/workday/tools.js +410 -0
  205. package/dist/connectors/workday/tools.js.map +1 -0
  206. package/dist/connectors/workday/vendor.d.ts +18 -0
  207. package/dist/connectors/workday/vendor.js +199 -0
  208. package/dist/connectors/workday/vendor.js.map +1 -0
  209. package/dist/packages/connector-kit/src/branding.d.ts +57 -0
  210. package/dist/packages/connector-kit/src/branding.js +102 -0
  211. package/dist/packages/connector-kit/src/branding.js.map +1 -0
  212. package/dist/packages/connector-kit/src/certificate.d.ts +19 -0
  213. package/dist/packages/connector-kit/src/certificate.js +84 -0
  214. package/dist/packages/connector-kit/src/certificate.js.map +1 -0
  215. package/dist/packages/connector-kit/src/common.d.ts +36 -0
  216. package/dist/packages/connector-kit/src/common.js +110 -0
  217. package/dist/packages/connector-kit/src/common.js.map +1 -0
  218. package/dist/packages/connector-kit/src/connector.d.ts +1356 -0
  219. package/dist/packages/connector-kit/src/connector.js +1073 -0
  220. package/dist/packages/connector-kit/src/connector.js.map +1 -0
  221. package/dist/packages/connector-kit/src/fetch.d.ts +6 -0
  222. package/dist/packages/connector-kit/src/fetch.js +44 -0
  223. package/dist/packages/connector-kit/src/fetch.js.map +1 -0
  224. package/dist/packages/connector-kit/src/index.d.ts +5 -0
  225. package/dist/packages/connector-kit/src/index.js +6 -0
  226. package/dist/packages/connector-kit/src/index.js.map +1 -0
  227. package/dist/packages/connector-kit/src/oauth.d.ts +15 -0
  228. package/dist/packages/connector-kit/src/oauth.js +98 -0
  229. package/dist/packages/connector-kit/src/oauth.js.map +1 -0
  230. package/dist/packages/connector-kit/src/types.d.ts +87 -0
  231. package/dist/packages/connector-kit/src/types.js +20 -0
  232. package/dist/packages/connector-kit/src/types.js.map +1 -0
  233. package/dist/packages/server/migrations/0001_tables.sql +268 -0
  234. package/dist/packages/server/migrations/0002_organizations.sql +72 -0
  235. package/dist/packages/server/migrations/0003_drop_unused.sql +3 -0
  236. package/dist/packages/server/migrations/0004_trigger_runners.sql +15 -0
  237. package/dist/packages/server/migrations/0005_run_runner.sql +3 -0
  238. package/dist/packages/server/migrations/0006_approvals.sql +36 -0
  239. package/dist/packages/server/migrations/0007_app_events.sql +110 -0
  240. package/dist/packages/server/migrations/rollback/to-legacy.sql +90 -0
  241. package/dist/packages/server/src/api.d.ts +3730 -0
  242. package/dist/packages/server/src/api.js +820 -0
  243. package/dist/packages/server/src/api.js.map +1 -0
  244. package/dist/packages/server/src/app.d.ts +23 -0
  245. package/dist/packages/server/src/app.js +467 -0
  246. package/dist/packages/server/src/app.js.map +1 -0
  247. package/dist/packages/server/src/builtin.d.ts +5 -0
  248. package/dist/packages/server/src/builtin.js +42 -0
  249. package/dist/packages/server/src/builtin.js.map +1 -0
  250. package/dist/packages/server/src/consent.d.ts +27 -0
  251. package/dist/packages/server/src/consent.js +36 -0
  252. package/dist/packages/server/src/consent.js.map +1 -0
  253. package/dist/packages/server/src/events/admin.d.ts +156 -0
  254. package/dist/packages/server/src/events/admin.js +255 -0
  255. package/dist/packages/server/src/events/admin.js.map +1 -0
  256. package/dist/packages/server/src/events/deliver.d.ts +43 -0
  257. package/dist/packages/server/src/events/deliver.js +129 -0
  258. package/dist/packages/server/src/events/deliver.js.map +1 -0
  259. package/dist/packages/server/src/events/runtime.d.ts +28 -0
  260. package/dist/packages/server/src/events/runtime.js +400 -0
  261. package/dist/packages/server/src/events/runtime.js.map +1 -0
  262. package/dist/packages/server/src/events/store.d.ts +172 -0
  263. package/dist/packages/server/src/events/store.js +275 -0
  264. package/dist/packages/server/src/events/store.js.map +1 -0
  265. package/dist/packages/server/src/index.d.ts +40 -0
  266. package/dist/packages/server/src/index.js +186 -0
  267. package/dist/packages/server/src/index.js.map +1 -0
  268. package/dist/packages/server/src/migrate.d.ts +11 -0
  269. package/dist/packages/server/src/migrate.js +134 -0
  270. package/dist/packages/server/src/migrate.js.map +1 -0
  271. package/dist/packages/server/src/openapi.d.ts +4 -0
  272. package/dist/packages/server/src/openapi.js +101 -0
  273. package/dist/packages/server/src/openapi.js.map +1 -0
  274. package/dist/packages/server/src/queue.d.ts +10 -0
  275. package/dist/packages/server/src/queue.js +45 -0
  276. package/dist/packages/server/src/queue.js.map +1 -0
  277. package/dist/packages/server/src/secrets.d.ts +19 -0
  278. package/dist/packages/server/src/secrets.js +76 -0
  279. package/dist/packages/server/src/secrets.js.map +1 -0
  280. package/dist/packages/server/src/server.d.ts +1 -0
  281. package/dist/packages/server/src/server.js +82 -0
  282. package/dist/packages/server/src/server.js.map +1 -0
  283. package/dist/packages/server/src/service.d.ts +767 -0
  284. package/dist/packages/server/src/service.js +924 -0
  285. package/dist/packages/server/src/service.js.map +1 -0
  286. package/dist/packages/server/src/store.d.ts +157 -0
  287. package/dist/packages/server/src/store.js +415 -0
  288. package/dist/packages/server/src/store.js.map +1 -0
  289. package/dist/packages/server/src/teams/activity.d.ts +123 -0
  290. package/dist/packages/server/src/teams/activity.js +188 -0
  291. package/dist/packages/server/src/teams/activity.js.map +1 -0
  292. package/dist/packages/server/src/teams/admin.d.ts +335 -0
  293. package/dist/packages/server/src/teams/admin.js +699 -0
  294. package/dist/packages/server/src/teams/admin.js.map +1 -0
  295. package/dist/packages/server/src/teams/approval.d.ts +57 -0
  296. package/dist/packages/server/src/teams/approval.js +118 -0
  297. package/dist/packages/server/src/teams/approval.js.map +1 -0
  298. package/dist/packages/server/src/teams/bot.d.ts +25 -0
  299. package/dist/packages/server/src/teams/bot.js +124 -0
  300. package/dist/packages/server/src/teams/bot.js.map +1 -0
  301. package/dist/packages/server/src/teams/claude.d.ts +46 -0
  302. package/dist/packages/server/src/teams/claude.js +165 -0
  303. package/dist/packages/server/src/teams/claude.js.map +1 -0
  304. package/dist/packages/server/src/teams/jwt.d.ts +17 -0
  305. package/dist/packages/server/src/teams/jwt.js +121 -0
  306. package/dist/packages/server/src/teams/jwt.js.map +1 -0
  307. package/dist/packages/server/src/teams/package.d.ts +79 -0
  308. package/dist/packages/server/src/teams/package.js +319 -0
  309. package/dist/packages/server/src/teams/package.js.map +1 -0
  310. package/dist/packages/server/src/teams/provision.d.ts +84 -0
  311. package/dist/packages/server/src/teams/provision.js +505 -0
  312. package/dist/packages/server/src/teams/provision.js.map +1 -0
  313. package/dist/packages/server/src/teams/runner.d.ts +80 -0
  314. package/dist/packages/server/src/teams/runner.js +187 -0
  315. package/dist/packages/server/src/teams/runner.js.map +1 -0
  316. package/dist/packages/server/src/teams/runtime.d.ts +91 -0
  317. package/dist/packages/server/src/teams/runtime.js +679 -0
  318. package/dist/packages/server/src/teams/runtime.js.map +1 -0
  319. package/dist/packages/server/src/teams/store.d.ts +233 -0
  320. package/dist/packages/server/src/teams/store.js +507 -0
  321. package/dist/packages/server/src/teams/store.js.map +1 -0
  322. package/package.json +68 -4
@@ -0,0 +1,464 @@
1
+ import { z } from "zod";
2
+ import { isProjectKey, JqlRejected, scopeJql } from "./jql.js";
3
+ import { audited, Denied, json, listLimit, VendorFailed, } from "../../packages/connector-kit/src/common.js";
4
+ const ISSUE_KEY = /^[A-Z][A-Z0-9_]*-\d+$/;
5
+ const SEARCH_FIELDS = [
6
+ "summary",
7
+ "status",
8
+ "project",
9
+ "issuetype",
10
+ "assignee",
11
+ "priority",
12
+ "updated",
13
+ ];
14
+ const ISSUE_FIELDS = [...SEARCH_FIELDS, "reporter", "created", "labels", "description"];
15
+ // jira_get_issue returns the most recent comments only.
16
+ const RECENT_COMMENTS = 20;
17
+ // Who someone is, beyond the display name a person can set to anything: Atlassian's account id
18
+ // and type (atlassian, customer for a service project's customers, app). UserDetails in
19
+ // Atlassian's v3 reference. No email: an agent with read would get every customer's address.
20
+ function person(user) {
21
+ return {
22
+ account_id: typeof user?.accountId === "string" ? user.accountId : null,
23
+ account_type: typeof user?.accountType === "string" ? user.accountType : null,
24
+ };
25
+ }
26
+ // Only a service project (Jira Service Management) has customers, and internal notes they never
27
+ // see. The issue's own project field carries the type (ProjectDetails.projectTypeKey in
28
+ // Atlassian's v3 reference), so no project call is needed.
29
+ const serviceProject = (issue) => issue.fields.project?.projectTypeKey === "service_desk";
30
+ async function ok(ctx, mark, req) {
31
+ const res = await ctx.call(req);
32
+ mark(res.status);
33
+ if (res.status < 200 || res.status >= 300)
34
+ throw new VendorFailed(res.status, jiraError(res));
35
+ return res.data;
36
+ }
37
+ function jiraError(res) {
38
+ const d = res.data;
39
+ const detail = [...(d?.errorMessages ?? []), ...Object.values(d?.errors ?? {})].join("; ");
40
+ return `Jira answered ${res.status}${detail ? `: ${detail}` : ""}`;
41
+ }
42
+ // Atlassian Document Format to plain text, enough for an agent to read.
43
+ export function adfText(node) {
44
+ if (!node || typeof node !== "object")
45
+ return "";
46
+ if (node.type === "text")
47
+ return node.text ?? "";
48
+ if (node.type === "hardBreak")
49
+ return "\n";
50
+ if (node.type === "mention")
51
+ return node.attrs?.text ?? "";
52
+ const inner = (node.content ?? []).map(adfText).join("");
53
+ return ["paragraph", "heading", "listItem", "codeBlock", "blockquote"].includes(node.type)
54
+ ? `${inner}\n`
55
+ : inner;
56
+ }
57
+ function adfDoc(text) {
58
+ return {
59
+ type: "doc",
60
+ version: 1,
61
+ content: text
62
+ .split(/\n{2,}/)
63
+ .filter((p) => p.trim())
64
+ .map((p) => ({ type: "paragraph", content: [{ type: "text", text: p }] })),
65
+ };
66
+ }
67
+ function summary(issue) {
68
+ const f = issue.fields;
69
+ return {
70
+ key: issue.key,
71
+ summary: f.summary,
72
+ project: f.project?.key,
73
+ type: f.issuetype?.name,
74
+ status: f.status?.name,
75
+ priority: f.priority?.name ?? null,
76
+ assignee: f.assignee?.displayName ?? null,
77
+ updated: f.updated,
78
+ };
79
+ }
80
+ function allowedProject(projects, key) {
81
+ return projects === null || (key !== undefined && projects.includes(key));
82
+ }
83
+ async function transitions(ctx, mark, key) {
84
+ await fetchIssue(ctx, mark, key, ["project"]);
85
+ const data = await ok(ctx, mark, { method: "GET", path: `/rest/api/3/issue/${key}/transitions` });
86
+ return data.transitions;
87
+ }
88
+ // Fields a new issue must have that this tool cannot fill. Jira sets the reporter itself.
89
+ const FILLED = new Set(["project", "issuetype", "summary", "description", "reporter"]);
90
+ async function fetchIssue(ctx, mark, key, fields) {
91
+ if (!ISSUE_KEY.test(key))
92
+ throw new Denied("Give an issue key such as ABC-123");
93
+ const issue = await ok(ctx, mark, {
94
+ method: "GET",
95
+ path: `/rest/api/3/issue/${key}?fields=${fields.join(",")}`,
96
+ });
97
+ if (!allowedProject(listLimit(ctx.limits, "projects"), issue.fields.project?.key))
98
+ throw new Denied(`Issue ${key} is in a project this agent is not allowed to use`);
99
+ return issue;
100
+ }
101
+ // The issue's changelog comes oldest first, at most 100 changes a page.
102
+ const CHANGELOG_PAGE = 100;
103
+ // Changelog calls one jira_get_issue makes at most: the first page, then back from the newest.
104
+ const CHANGELOG_CALLS = 5;
105
+ // Who last added each current label: the newest changelog entry whose labels item has it in
106
+ // toString and not in fromString (Jira's labels are space-free, space-separated there). Read from
107
+ // the newest change back, CHANGELOG_CALLS calls at most; a label not found (set when the issue
108
+ // was created, or older than what was read) gets nulls. Null when the changelog cannot be read:
109
+ // the rest of the issue is still worth returning. GET /rest/api/3/issue/{key}/changelog
110
+ // (PageBeanChangelog) in Atlassian's v3 reference.
111
+ async function labelsAddedBy(ctx, key, labels) {
112
+ if (!labels.length)
113
+ return [];
114
+ const page = async (startAt, count) => {
115
+ const res = await ctx.call({
116
+ method: "GET",
117
+ path: `/rest/api/3/issue/${key}/changelog?startAt=${startAt}&maxResults=${count}`,
118
+ });
119
+ if (res.status < 200 || res.status >= 300)
120
+ throw new VendorFailed(res.status, jiraError(res));
121
+ return res.data;
122
+ };
123
+ const found = new Map();
124
+ const words = (s) => (typeof s === "string" ? s.split(/\s+/).filter(Boolean) : []);
125
+ const scan = (values) => {
126
+ for (const change of [...values].reverse())
127
+ for (const item of change?.items ?? []) {
128
+ if (item?.field !== "labels")
129
+ continue;
130
+ const before = new Set(words(item.fromString));
131
+ for (const label of words(item.toString))
132
+ if (!before.has(label) && labels.includes(label) && !found.has(label)) {
133
+ const author = person(change.author);
134
+ found.set(label, {
135
+ label,
136
+ author: change.author?.displayName ?? null,
137
+ author_account_id: author.account_id,
138
+ author_account_type: author.account_type,
139
+ added: change.created ?? null,
140
+ });
141
+ }
142
+ }
143
+ };
144
+ try {
145
+ const first = await page(0, CHANGELOG_PAGE);
146
+ const head = (first?.values ?? []);
147
+ const total = typeof first?.total === "number" ? first.total : head.length;
148
+ let start = Math.max(total, head.length);
149
+ for (let calls = 1; start > head.length && calls < CHANGELOG_CALLS; calls++) {
150
+ if (found.size === labels.length)
151
+ break;
152
+ const from = Math.max(head.length, start - CHANGELOG_PAGE);
153
+ scan((await page(from, start - from))?.values ?? []);
154
+ start = from;
155
+ }
156
+ if (start <= head.length)
157
+ scan(head);
158
+ }
159
+ catch (error) {
160
+ if (!(error instanceof VendorFailed))
161
+ console.error("[agent-connect] jira changelog failed", error);
162
+ return null;
163
+ }
164
+ return labels.map((label) => found.get(label) ?? {
165
+ label,
166
+ author: null,
167
+ author_account_id: null,
168
+ author_account_type: null,
169
+ added: null,
170
+ });
171
+ }
172
+ export const jiraTools = {
173
+ names: [
174
+ "jira_search_issues",
175
+ "jira_get_issue",
176
+ "jira_list_projects",
177
+ "jira_add_comment",
178
+ "jira_list_transitions",
179
+ "jira_transition_issue",
180
+ "jira_create_issue",
181
+ "jira_delete_issue",
182
+ ],
183
+ register(server, ctx, allowed) {
184
+ const readOnly = { readOnlyHint: true, openWorldHint: true };
185
+ if (allowed.has("jira_search_issues"))
186
+ server.registerTool("jira_search_issues", {
187
+ description: 'Search Jira issues with JQL, e.g. `status = "In Progress" ORDER BY updated DESC`. ' +
188
+ "Results are limited to the projects this agent may use.",
189
+ inputSchema: z.object({
190
+ jql: z.string().max(4000).describe("JQL query. ORDER BY is allowed at the end."),
191
+ max_results: z.number().int().min(1).max(50).default(20),
192
+ }),
193
+ annotations: readOnly,
194
+ }, ({ jql, max_results }) => audited(ctx, "jira_search_issues", jql, async (mark, retarget) => {
195
+ const projects = listLimit(ctx.limits, "projects");
196
+ let scoped;
197
+ try {
198
+ scoped = scopeJql(jql, projects);
199
+ }
200
+ catch (error) {
201
+ if (error instanceof JqlRejected)
202
+ throw new Denied(error.message);
203
+ throw error;
204
+ }
205
+ retarget(scoped);
206
+ const data = await ok(ctx, mark, {
207
+ method: "POST",
208
+ path: "/rest/api/3/search/jql",
209
+ body: { jql: scoped, maxResults: max_results, fields: SEARCH_FIELDS },
210
+ });
211
+ const issues = data.issues
212
+ .filter((i) => allowedProject(projects, i.fields.project?.key))
213
+ .map(summary);
214
+ return json({ issues, more: Boolean(data.nextPageToken) });
215
+ }));
216
+ if (allowed.has("jira_get_issue"))
217
+ server.registerTool("jira_get_issue", {
218
+ description: "Read one Jira issue: fields, description and the 20 most recent comments (fails if " +
219
+ "the comments cannot be read). People come with account_id and account_type " +
220
+ "(atlassian, customer, app). In a service project each comment's internal is true " +
221
+ "for an internal note the customer never sees; elsewhere it is null. labels_added_by " +
222
+ "names, for each current label, who last added it and when (nulls when the issue " +
223
+ "history does not show it, e.g. set at creation); it is null when the history " +
224
+ "could not be read.",
225
+ inputSchema: z.object({ issue_key: z.string().describe("Issue key, e.g. ABC-123.") }),
226
+ annotations: readOnly,
227
+ }, ({ issue_key }) => audited(ctx, "jira_get_issue", issue_key, async (mark) => {
228
+ const issue = await fetchIssue(ctx, mark, issue_key, ISSUE_FIELDS);
229
+ const f = issue.fields;
230
+ // The newest comments, put back in date order. Each Comment carries jsdPublic,
231
+ // false for a service project's internal note; Atlassian documents it as true for
232
+ // any comment outside a service project, so there it says nothing and is left null.
233
+ const page = await ok(ctx, mark, {
234
+ method: "GET",
235
+ path: `/rest/api/3/issue/${issue_key}/comment?orderBy=-created&maxResults=${RECENT_COMMENTS}`,
236
+ });
237
+ const recent = (page?.comments ?? []).slice(0, RECENT_COMMENTS).reverse();
238
+ const service = serviceProject(issue);
239
+ const reporter = person(f.reporter);
240
+ const labels = (f.labels ?? []).filter((l) => typeof l === "string");
241
+ return json({
242
+ ...summary(issue),
243
+ reporter: f.reporter?.displayName ?? null,
244
+ reporter_account_id: reporter.account_id,
245
+ reporter_account_type: reporter.account_type,
246
+ created: f.created,
247
+ labels,
248
+ labels_added_by: await labelsAddedBy(ctx, issue_key, labels),
249
+ description: adfText(f.description).trim(),
250
+ comments: recent.map((c) => {
251
+ const author = person(c.author);
252
+ return {
253
+ author: c.author?.displayName ?? null,
254
+ author_account_id: author.account_id,
255
+ author_account_type: author.account_type,
256
+ internal: service && typeof c.jsdPublic === "boolean" ? !c.jsdPublic : null,
257
+ created: c.created,
258
+ body: adfText(c.body).trim(),
259
+ };
260
+ }),
261
+ });
262
+ }));
263
+ if (allowed.has("jira_list_projects"))
264
+ server.registerTool("jira_list_projects", {
265
+ description: "List the Jira projects this agent may use.",
266
+ inputSchema: z.object({}),
267
+ annotations: readOnly,
268
+ }, () => audited(ctx, "jira_list_projects", null, async (mark) => {
269
+ const projects = listLimit(ctx.limits, "projects");
270
+ // Only projects whose issues the account can open; others are listed by Jira but
271
+ // their searches come back empty.
272
+ const permitted = await ok(ctx, mark, {
273
+ method: "POST",
274
+ path: "/rest/api/3/permissions/project",
275
+ body: { permissions: ["BROWSE_PROJECTS"] },
276
+ });
277
+ const browsable = new Set(permitted.projects.map((p) => p.key));
278
+ // Every page: a granted project can sit past the first hundred.
279
+ const all = [];
280
+ for (let startAt = 0;;) {
281
+ const page = await ok(ctx, mark, {
282
+ method: "GET",
283
+ path: `/rest/api/3/project/search?maxResults=100&startAt=${startAt}`,
284
+ });
285
+ const values = page.values;
286
+ all.push(...values);
287
+ if (page.isLast !== false || values.length === 0)
288
+ break;
289
+ startAt += values.length;
290
+ }
291
+ return json(all
292
+ .filter((p) => isProjectKey(p.key) && browsable.has(p.key) && allowedProject(projects, p.key))
293
+ .map((p) => ({ key: p.key, name: p.name })));
294
+ }));
295
+ if (allowed.has("jira_add_comment"))
296
+ server.registerTool("jira_add_comment", {
297
+ description: "Add a comment to a Jira issue. Blank lines separate paragraphs. In a service project " +
298
+ "(Jira Service Management) a comment can be public: the customer sees it and is emailed " +
299
+ "(whether it is depends on the account's Service Management seat). Set internal to add an " +
300
+ "internal note only the service team sees; internal notes exist only in service " +
301
+ "projects. The answer's internal says what Jira saved (null outside a service " +
302
+ "project); false when internal was asked means it was still posted, publicly: never " +
303
+ "retry it.",
304
+ inputSchema: z.object({
305
+ issue_key: z.string().describe("Issue key, e.g. ABC-123."),
306
+ body: z.string().min(1).max(30000),
307
+ internal: z
308
+ .boolean()
309
+ .default(false)
310
+ .describe("An internal note, not shown or sent to the customer. Service projects only."),
311
+ }),
312
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
313
+ }, ({ issue_key, body, internal }) => audited(ctx, "jira_add_comment", `${issue_key}${internal ? " (internal)" : ""}`, async (mark, retarget) => {
314
+ const issue = await fetchIssue(ctx, mark, issue_key, ["project"]);
315
+ const service = serviceProject(issue);
316
+ if (internal) {
317
+ if (!service)
318
+ throw new Denied(`${issue_key} is not in a service project, so it has no internal notes. Leave internal off to comment.`);
319
+ // The platform comment with the sd.public.comment entity property set to
320
+ // {internal: true} is what Jira Service Management's own agent view sends
321
+ // (Atlassian does not document the property). Tried live 2026-10-25: Create request
322
+ // comment (/rest/servicedeskapi/...) answers 403 to a service account without a
323
+ // Service Management agent seat, while this works with plain Jira access and gives
324
+ // jsdPublic false. jsdPublic in the answer is the guard.
325
+ const created = await ok(ctx, mark, {
326
+ method: "POST",
327
+ path: `/rest/api/3/issue/${issue_key}/comment`,
328
+ body: {
329
+ body: adfDoc(body),
330
+ properties: [{ key: "sd.public.comment", value: { internal: true } }],
331
+ },
332
+ });
333
+ if (created.jsdPublic !== false) {
334
+ // Already posted, shown to the customer and emailed: no error, which an agent
335
+ // would retry into a second public copy. The audit row records the write.
336
+ retarget(`${issue_key} (internal asked, posted PUBLIC as comment ${created.id})`);
337
+ return json({
338
+ id: created.id,
339
+ created: created.created,
340
+ internal: false,
341
+ warning: `Jira did not keep this as an internal note: comment ${created.id} WAS ` +
342
+ `posted on ${issue_key} and is PUBLIC, so the customer can see it and may ` +
343
+ "have been emailed. Do not retry: that would post it again. Tell a person " +
344
+ "on the service team.",
345
+ });
346
+ }
347
+ return json({ id: created.id, created: created.created, internal: true });
348
+ }
349
+ const created = await ok(ctx, mark, {
350
+ method: "POST",
351
+ path: `/rest/api/3/issue/${issue_key}/comment`,
352
+ body: { body: adfDoc(body) },
353
+ });
354
+ // As jira_get_issue reads it: a service project's comment can come out internal
355
+ // anyway (seen live from an account without a Service Management seat).
356
+ return json({
357
+ id: created.id,
358
+ created: created.created,
359
+ internal: service ? created.jsdPublic === false : null,
360
+ });
361
+ }));
362
+ const writes = { readOnlyHint: false, destructiveHint: false, openWorldHint: true };
363
+ const issueKey = z.string().describe("Issue key, e.g. ABC-123.");
364
+ if (allowed.has("jira_list_transitions"))
365
+ server.registerTool("jira_list_transitions", {
366
+ description: "List the statuses a Jira issue can move to now, for jira_transition_issue.",
367
+ inputSchema: z.object({ issue_key: issueKey }),
368
+ annotations: readOnly,
369
+ }, ({ issue_key }) => audited(ctx, "jira_list_transitions", issue_key, async (mark) => json((await transitions(ctx, mark, issue_key)).map((t) => ({
370
+ id: t.id,
371
+ name: t.name,
372
+ to: t.to?.name ?? null,
373
+ })))));
374
+ if (allowed.has("jira_transition_issue"))
375
+ server.registerTool("jira_transition_issue", {
376
+ description: "Move a Jira issue to another status. Give a transition id or name from jira_list_transitions.",
377
+ inputSchema: z.object({
378
+ issue_key: issueKey,
379
+ transition: z.string().min(1).max(200).describe("Transition id or name."),
380
+ }),
381
+ annotations: writes,
382
+ }, ({ issue_key, transition }) => audited(ctx, "jira_transition_issue", `${issue_key} → ${transition}`, async (mark) => {
383
+ const want = transition.trim().toLowerCase();
384
+ const found = (await transitions(ctx, mark, issue_key)).find((t) => t.id === want || t.name.toLowerCase() === want);
385
+ if (!found)
386
+ throw new Denied(`${issue_key} cannot move with "${transition}" now. List the options with jira_list_transitions.`);
387
+ await ok(ctx, mark, {
388
+ method: "POST",
389
+ path: `/rest/api/3/issue/${issue_key}/transitions`,
390
+ body: { transition: { id: found.id } },
391
+ });
392
+ return json({ moved: true, to: found.to?.name ?? found.name });
393
+ }));
394
+ if (allowed.has("jira_create_issue"))
395
+ server.registerTool("jira_create_issue", {
396
+ description: "Create a Jira issue in a project this agent may use. Blank lines in the description separate paragraphs.",
397
+ inputSchema: z.object({
398
+ project_key: z.string().describe("Project key, e.g. ABC."),
399
+ issue_type: z.string().min(1).max(100).describe("Issue type name, e.g. Task or Bug."),
400
+ summary: z.string().min(1).max(255),
401
+ description: z.string().max(30000).optional(),
402
+ }),
403
+ annotations: writes,
404
+ }, ({ project_key, issue_type, summary, description }) => audited(ctx, "jira_create_issue", project_key, async (mark) => {
405
+ if (!isProjectKey(project_key))
406
+ throw new Denied("Give a project key such as ABC");
407
+ if (!allowedProject(listLimit(ctx.limits, "projects"), project_key))
408
+ throw new Denied(`This agent is not allowed to use project ${project_key}`);
409
+ const meta = await ok(ctx, mark, {
410
+ method: "GET",
411
+ path: `/rest/api/3/issue/createmeta/${project_key}/issuetypes?maxResults=200`,
412
+ });
413
+ const types = meta.issueTypes;
414
+ const type = types.find((t) => !t.subtask && t.name.toLowerCase() === issue_type.trim().toLowerCase());
415
+ if (!type)
416
+ throw new Denied(`${project_key} has no issue type ${issue_type}. Use one of: ${types
417
+ .filter((t) => !t.subtask)
418
+ .map((t) => t.name)
419
+ .join(", ")}`);
420
+ const fields = (await ok(ctx, mark, {
421
+ method: "GET",
422
+ path: `/rest/api/3/issue/createmeta/${project_key}/issuetypes/${type.id}?maxResults=200`,
423
+ })).fields;
424
+ const needed = fields.filter((f) => f.required && !f.hasDefaultValue);
425
+ if (!description && needed.some((f) => f.fieldId === "description"))
426
+ throw new Denied(`${project_key} needs a description for a ${type.name}`);
427
+ const unfillable = needed.filter((f) => !FILLED.has(f.fieldId));
428
+ if (unfillable.length)
429
+ throw new Denied(`A ${type.name} in ${project_key} needs fields this tool cannot fill: ${unfillable
430
+ .map((f) => f.name)
431
+ .join(", ")}`);
432
+ const created = await ok(ctx, mark, {
433
+ method: "POST",
434
+ path: "/rest/api/3/issue",
435
+ body: {
436
+ fields: {
437
+ project: { key: project_key },
438
+ issuetype: { id: type.id },
439
+ summary,
440
+ ...(description ? { description: adfDoc(description) } : {}),
441
+ },
442
+ },
443
+ });
444
+ return json({ key: created.key, id: created.id });
445
+ }));
446
+ if (allowed.has("jira_delete_issue"))
447
+ server.registerTool("jira_delete_issue", {
448
+ description: "Delete a Jira issue for good. An issue with sub-tasks is only deleted with delete_subtasks set, which deletes them too.",
449
+ inputSchema: z.object({
450
+ issue_key: issueKey,
451
+ delete_subtasks: z.boolean().default(false),
452
+ }),
453
+ annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
454
+ }, ({ issue_key, delete_subtasks }) => audited(ctx, "jira_delete_issue", issue_key, async (mark) => {
455
+ await fetchIssue(ctx, mark, issue_key, ["project"]);
456
+ await ok(ctx, mark, {
457
+ method: "DELETE",
458
+ path: `/rest/api/3/issue/${issue_key}?deleteSubtasks=${delete_subtasks}`,
459
+ });
460
+ return json({ deleted: issue_key });
461
+ }));
462
+ },
463
+ };
464
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../connectors/jira/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Fetch, type Vendor } from "../../packages/connector-kit/src/types.js";
2
+ export declare function normalizeSite(input: string): string;
3
+ export declare function jiraVendor(unguarded?: Fetch): Vendor;
@@ -0,0 +1,100 @@
1
+ import { createHash } from "node:crypto";
2
+ import { vendorFetch } from "../../packages/connector-kit/src/fetch.js";
3
+ import { ConnectError, TokenCache, } from "../../packages/connector-kit/src/types.js";
4
+ // Atlassian service account, OAuth 2.0 client credentials. Tokens last 60 minutes and
5
+ // reach Jira through api.atlassian.com/ex/jira/{cloudId}.
6
+ const AUTH_URL = "https://auth.atlassian.com/oauth/token";
7
+ const API = "https://api.atlassian.com";
8
+ // Jira writes errors in the account's language otherwise; agents and admins read English.
9
+ const JSON_EN = { accept: "application/json", "accept-language": "en" };
10
+ const CLOUD_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
11
+ export function normalizeSite(input) {
12
+ const host = input
13
+ .trim()
14
+ .toLowerCase()
15
+ .replace(/^https?:\/\//, "")
16
+ .replace(/\/.*$/, "")
17
+ .replace(/\.atlassian\.net$/, "");
18
+ if (!/^[a-z0-9][a-z0-9-]{0,62}$/.test(host))
19
+ throw new ConnectError("Enter the Jira site name, the part before .atlassian.net");
20
+ return host;
21
+ }
22
+ export function jiraVendor(unguarded = fetch) {
23
+ const fetchImpl = vendorFetch("Jira", unguarded);
24
+ const tokens = new TokenCache();
25
+ const token = (clientId, clientSecret) => tokens.get(createHash("sha256").update(`${clientId}\n${clientSecret}`).digest("hex"), async () => {
26
+ const res = await fetchImpl(AUTH_URL, {
27
+ method: "POST",
28
+ headers: { "content-type": "application/json" },
29
+ body: JSON.stringify({
30
+ grant_type: "client_credentials",
31
+ client_id: clientId,
32
+ client_secret: clientSecret,
33
+ }),
34
+ });
35
+ if (!res.ok)
36
+ throw new ConnectError(res.status === 401 || res.status === 403
37
+ ? "Atlassian did not accept the client ID and secret"
38
+ : `Atlassian sign-in failed (${res.status})`);
39
+ const body = (await res.json());
40
+ return { token: body.access_token, expiresIn: body.expires_in };
41
+ });
42
+ return {
43
+ async connect(fields) {
44
+ const site = normalizeSite(fields.site ?? "");
45
+ const clientId = fields.client_id?.trim();
46
+ const clientSecret = fields.client_secret?.trim();
47
+ if (!clientId || !clientSecret)
48
+ throw new ConnectError("Enter the client ID and secret");
49
+ const access = await token(clientId, clientSecret);
50
+ // accessible-resources is empty for service-account tokens; the site publishes its
51
+ // cloudId, and serverInfo through the gateway proves the account can reach it.
52
+ const tenant = await fetchImpl(`https://${site}.atlassian.net/_edge/tenant_info`);
53
+ if (!tenant.ok)
54
+ throw new ConnectError(`${site}.atlassian.net is not a Jira site`);
55
+ const { cloudId } = (await tenant.json());
56
+ if (!cloudId || !CLOUD_ID.test(cloudId))
57
+ throw new ConnectError(`${site}.atlassian.net did not identify itself`);
58
+ const info = await fetchImpl(`${API}/ex/jira/${cloudId}/rest/api/3/serverInfo`, {
59
+ headers: { authorization: `Bearer ${access}`, ...JSON_EN },
60
+ });
61
+ if (!info.ok)
62
+ throw new ConnectError(`The service account cannot reach ${site}.atlassian.net (${info.status}). Check that it belongs to that site and has the scopes listed above.`);
63
+ return {
64
+ config: { site, cloudId },
65
+ secret: { client_id: clientId, client_secret: clientSecret },
66
+ accountLabel: `${site}.atlassian.net`,
67
+ };
68
+ },
69
+ async call(connection, request) {
70
+ const { cloudId } = connection.config;
71
+ if (!CLOUD_ID.test(cloudId ?? ""))
72
+ throw new Error("Jira connection has no cloudId");
73
+ const access = await token(connection.secret.client_id, connection.secret.client_secret);
74
+ const res = await fetchImpl(`${API}/ex/jira/${cloudId}${request.path}`, {
75
+ method: request.method,
76
+ headers: {
77
+ authorization: `Bearer ${access}`,
78
+ ...JSON_EN,
79
+ ...(request.body === undefined ? {} : { "content-type": "application/json" }),
80
+ },
81
+ body: request.body === undefined ? undefined : JSON.stringify(request.body),
82
+ });
83
+ const raw = await res.text();
84
+ return {
85
+ status: res.status,
86
+ data: raw ? safeJson(raw) : null,
87
+ headers: Object.fromEntries(res.headers),
88
+ };
89
+ },
90
+ };
91
+ }
92
+ function safeJson(raw) {
93
+ try {
94
+ return JSON.parse(raw);
95
+ }
96
+ catch {
97
+ return raw;
98
+ }
99
+ }
100
+ //# sourceMappingURL=vendor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../../connectors/jira/vendor.ts"],"names":[],"mappings":"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"}