opensentinel 2.1.1 → 3.1.1

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 (268) hide show
  1. package/README.md +354 -283
  2. package/dist/archiver-AVNBYCKQ.js +15340 -0
  3. package/dist/archiver-AVNBYCKQ.js.map +1 -0
  4. package/dist/audit-logger-OBPR7CRO.js +22 -0
  5. package/dist/auth-UOX5K2BE.js +18 -0
  6. package/dist/autonomy-ZXDBDQUJ.js +86 -0
  7. package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
  8. package/dist/aws-s3-Q4LLZZPD.js +146 -0
  9. package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
  10. package/dist/backup-restore-PZ7CYYB7.js +16 -0
  11. package/dist/blocks-R3PODY47.js +23 -0
  12. package/dist/bot-QRARP4UN.js +36 -0
  13. package/dist/brain-7XLLM3KC.js +56 -0
  14. package/dist/camera-monitor-M5CYKUU4.js +335 -0
  15. package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
  16. package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
  17. package/dist/chunk-22VGGA7S.js +330 -0
  18. package/dist/chunk-22VGGA7S.js.map +1 -0
  19. package/dist/chunk-35WYTA3C.js +382 -0
  20. package/dist/chunk-35WYTA3C.js.map +1 -0
  21. package/dist/chunk-3E2PSU2C.js +146 -0
  22. package/dist/chunk-3E2PSU2C.js.map +1 -0
  23. package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
  24. package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
  25. package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
  26. package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
  27. package/dist/chunk-6KONMXQ6.js +297 -0
  28. package/dist/chunk-6KONMXQ6.js.map +1 -0
  29. package/dist/chunk-6PMVAAA7.js +196 -0
  30. package/dist/chunk-6PMVAAA7.js.map +1 -0
  31. package/dist/chunk-766ASQWE.js +32620 -0
  32. package/dist/chunk-766ASQWE.js.map +1 -0
  33. package/dist/chunk-7WQO5J2M.js +29 -0
  34. package/dist/chunk-7WQO5J2M.js.map +1 -0
  35. package/dist/chunk-APHSRMBS.js +148 -0
  36. package/dist/chunk-APHSRMBS.js.map +1 -0
  37. package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
  38. package/dist/chunk-AYUKPTSM.js.map +1 -0
  39. package/dist/chunk-BIPYADGB.js +84 -0
  40. package/dist/chunk-BIPYADGB.js.map +1 -0
  41. package/dist/chunk-BRBWNV65.js +457 -0
  42. package/dist/chunk-BRBWNV65.js.map +1 -0
  43. package/dist/chunk-BXZ6EA52.js +382 -0
  44. package/dist/chunk-BXZ6EA52.js.map +1 -0
  45. package/dist/chunk-EVE7MIIY.js +290 -0
  46. package/dist/chunk-EVE7MIIY.js.map +1 -0
  47. package/dist/chunk-F3TTNID2.js +138 -0
  48. package/dist/chunk-F3TTNID2.js.map +1 -0
  49. package/dist/chunk-H5RQOFO2.js +190 -0
  50. package/dist/chunk-H5RQOFO2.js.map +1 -0
  51. package/dist/chunk-HN3F4WSW.js +145 -0
  52. package/dist/chunk-HN3F4WSW.js.map +1 -0
  53. package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
  54. package/dist/chunk-I6BDYQIG.js.map +1 -0
  55. package/dist/chunk-IZJMVV7O.js +347 -0
  56. package/dist/chunk-IZJMVV7O.js.map +1 -0
  57. package/dist/chunk-KM22GV7G.js +211 -0
  58. package/dist/chunk-KM22GV7G.js.map +1 -0
  59. package/dist/chunk-MGFBLVR7.js +103 -0
  60. package/dist/chunk-MGFBLVR7.js.map +1 -0
  61. package/dist/chunk-MQJ2ECQT.js +228 -0
  62. package/dist/chunk-MQJ2ECQT.js.map +1 -0
  63. package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
  64. package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
  65. package/dist/chunk-NPRTSZIF.js +131 -0
  66. package/dist/chunk-NPRTSZIF.js.map +1 -0
  67. package/dist/chunk-O7IH7JTI.js +1898 -0
  68. package/dist/chunk-O7IH7JTI.js.map +1 -0
  69. package/dist/chunk-OCVQGBJK.js +293 -0
  70. package/dist/chunk-OCVQGBJK.js.map +1 -0
  71. package/dist/chunk-P6QINGFL.js +332 -0
  72. package/dist/chunk-P6QINGFL.js.map +1 -0
  73. package/dist/chunk-PHDZKPNE.js +91 -0
  74. package/dist/chunk-PHDZKPNE.js.map +1 -0
  75. package/dist/chunk-PLDDJCW6.js +49 -0
  76. package/dist/chunk-PTGTGXV2.js +164 -0
  77. package/dist/chunk-PTGTGXV2.js.map +1 -0
  78. package/dist/chunk-REMIY4U2.js +171 -0
  79. package/dist/chunk-REMIY4U2.js.map +1 -0
  80. package/dist/chunk-RZ4YESBG.js +141 -0
  81. package/dist/chunk-RZ4YESBG.js.map +1 -0
  82. package/dist/chunk-SAX5MHK4.js +111 -0
  83. package/dist/chunk-SAX5MHK4.js.map +1 -0
  84. package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
  85. package/dist/chunk-SPPMCAKG.js +777 -0
  86. package/dist/chunk-SPPMCAKG.js.map +1 -0
  87. package/dist/chunk-SVAPX2XN.js +2441 -0
  88. package/dist/chunk-SVAPX2XN.js.map +1 -0
  89. package/dist/chunk-TVEWKIK3.js +452 -0
  90. package/dist/chunk-TVEWKIK3.js.map +1 -0
  91. package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
  92. package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
  93. package/dist/chunk-VNX5GMTN.js +128 -0
  94. package/dist/chunk-VNX5GMTN.js.map +1 -0
  95. package/dist/chunk-VRD5CYRL.js +1568 -0
  96. package/dist/chunk-VRD5CYRL.js.map +1 -0
  97. package/dist/chunk-WLUHNG6X.js +122 -0
  98. package/dist/chunk-WLUHNG6X.js.map +1 -0
  99. package/dist/chunk-WRAKK6K6.js +265 -0
  100. package/dist/chunk-WRAKK6K6.js.map +1 -0
  101. package/dist/chunk-XKYRH4FM.js +681 -0
  102. package/dist/chunk-XKYRH4FM.js.map +1 -0
  103. package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
  104. package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
  105. package/dist/chunk-ZLZKF2PM.js +310 -0
  106. package/dist/chunk-ZLZKF2PM.js.map +1 -0
  107. package/dist/cli.js +5 -1
  108. package/dist/cli.js.map +1 -1
  109. package/dist/client-ZQSFPMOB.js +21 -0
  110. package/dist/clipboard-manager-TEO2GEDN.js +24 -0
  111. package/dist/commands/setup.js +3 -3
  112. package/dist/commands/setup.js.map +1 -1
  113. package/dist/commands/start.js +3 -3
  114. package/dist/commands/status.js +2 -2
  115. package/dist/commands/stop.js +2 -2
  116. package/dist/commands/utils.js +2 -2
  117. package/dist/cron-explain-HHQKPD3M.js +16 -0
  118. package/dist/crypto-4AP47IKC.js +14 -0
  119. package/dist/crypto-4AP47IKC.js.map +1 -0
  120. package/dist/databases-37X4CI2Y.js +21 -0
  121. package/dist/databases-37X4CI2Y.js.map +1 -0
  122. package/dist/discord-B3HUPGQ6.js +70 -0
  123. package/dist/discord-B3HUPGQ6.js.map +1 -0
  124. package/dist/dist-UISMLMFN.js +21847 -0
  125. package/dist/dist-UISMLMFN.js.map +1 -0
  126. package/dist/email-K7LO2IPB.js +268 -0
  127. package/dist/email-K7LO2IPB.js.map +1 -0
  128. package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
  129. package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
  130. package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
  131. package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
  132. package/dist/entity-resolution-Y3IUWEAT.js +24 -0
  133. package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
  134. package/dist/env-IWXUVTCB.js +12 -0
  135. package/dist/env-IWXUVTCB.js.map +1 -0
  136. package/dist/google-workspace-DKWUVNGC.js +169 -0
  137. package/dist/google-workspace-DKWUVNGC.js.map +1 -0
  138. package/dist/hash-tool-ULQYD7B5.js +22 -0
  139. package/dist/hash-tool-ULQYD7B5.js.map +1 -0
  140. package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
  141. package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
  142. package/dist/image-generation-OSU7FP6F.js +486 -0
  143. package/dist/image-generation-OSU7FP6F.js.map +1 -0
  144. package/dist/imessage-NGA2XF2V.js +35 -0
  145. package/dist/imessage-NGA2XF2V.js.map +1 -0
  146. package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
  147. package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
  148. package/dist/incident-response-C5J7Q6DT.js +244 -0
  149. package/dist/incident-response-C5J7Q6DT.js.map +1 -0
  150. package/dist/inventory-manager-352OHXWD.js +24 -0
  151. package/dist/inventory-manager-352OHXWD.js.map +1 -0
  152. package/dist/jira-GSGDBMIG.js +199 -0
  153. package/dist/jira-GSGDBMIG.js.map +1 -0
  154. package/dist/json-tool-QE2SYHEG.js +26 -0
  155. package/dist/json-tool-QE2SYHEG.js.map +1 -0
  156. package/dist/key-rotation-DPHU4ZTB.js +18 -0
  157. package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
  158. package/dist/lib.d.ts +603 -11
  159. package/dist/lib.js +161 -35
  160. package/dist/lib.js.map +1 -1
  161. package/dist/mailchimp-KKNF6QJ7.js +152 -0
  162. package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
  163. package/dist/matrix-QVHG76I7.js +279 -0
  164. package/dist/matrix-QVHG76I7.js.map +1 -0
  165. package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
  166. package/dist/mcp-3JI6W7ZE.js.map +1 -0
  167. package/dist/microsoft365-UCBKJHNX.js +164 -0
  168. package/dist/microsoft365-UCBKJHNX.js.map +1 -0
  169. package/dist/ocr-AC7NPX33.js +22 -0
  170. package/dist/ocr-AC7NPX33.js.map +1 -0
  171. package/dist/ollama-BOAMSPLJ.js +8 -0
  172. package/dist/ollama-BOAMSPLJ.js.map +1 -0
  173. package/dist/pages-MI523RB7.js +26 -0
  174. package/dist/pages-MI523RB7.js.map +1 -0
  175. package/dist/pair-JDFTERIK.js +24 -0
  176. package/dist/pair-JDFTERIK.js.map +1 -0
  177. package/dist/pairing-IFQYCPNS.js +10 -0
  178. package/dist/pairing-IFQYCPNS.js.map +1 -0
  179. package/dist/pdf-ALQVOEJR.js +17 -0
  180. package/dist/pdf-ALQVOEJR.js.map +1 -0
  181. package/dist/presentations-DSV5IHG5.js +1002 -0
  182. package/dist/presentations-DSV5IHG5.js.map +1 -0
  183. package/dist/prometheus-JNT2BD4L.js +10 -0
  184. package/dist/prometheus-JNT2BD4L.js.map +1 -0
  185. package/dist/providers-J4LYPHDR.js +19 -0
  186. package/dist/providers-J4LYPHDR.js.map +1 -0
  187. package/dist/qr-code-WIX4PB4U.js +16 -0
  188. package/dist/qr-code-WIX4PB4U.js.map +1 -0
  189. package/dist/quickbooks-XB4NII2S.js +190 -0
  190. package/dist/quickbooks-XB4NII2S.js.map +1 -0
  191. package/dist/regex-tool-W4ABRKGK.js +24 -0
  192. package/dist/regex-tool-W4ABRKGK.js.map +1 -0
  193. package/dist/scheduler-VK4WFERV.js +63 -0
  194. package/dist/scheduler-VK4WFERV.js.map +1 -0
  195. package/dist/search-BCLBO5E3.js +25 -0
  196. package/dist/search-BCLBO5E3.js.map +1 -0
  197. package/dist/sendgrid-RNXCAFKM.js +152 -0
  198. package/dist/sendgrid-RNXCAFKM.js.map +1 -0
  199. package/dist/shopify-NCXYJB4R.js +171 -0
  200. package/dist/shopify-NCXYJB4R.js.map +1 -0
  201. package/dist/signal-6CGDFYL2.js +35 -0
  202. package/dist/signal-6CGDFYL2.js.map +1 -0
  203. package/dist/slack-IZQWIKOH.js +75 -0
  204. package/dist/slack-IZQWIKOH.js.map +1 -0
  205. package/dist/sms-M3JIOTCW.js +23 -0
  206. package/dist/sms-M3JIOTCW.js.map +1 -0
  207. package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
  208. package/dist/src-VYUE6LRA.js.map +1 -0
  209. package/dist/stocks-XXWBPOCU.js +14 -0
  210. package/dist/stocks-XXWBPOCU.js.map +1 -0
  211. package/dist/text-transform-6SGUA5Z4.js +22 -0
  212. package/dist/text-transform-6SGUA5Z4.js.map +1 -0
  213. package/dist/tools-2RLEI2N6.js +38 -0
  214. package/dist/tools-2RLEI2N6.js.map +1 -0
  215. package/dist/tunnel-IWMXUML4.js +301 -0
  216. package/dist/tunnel-IWMXUML4.js.map +1 -0
  217. package/dist/twilio-53GEW5JT.js +139 -0
  218. package/dist/twilio-53GEW5JT.js.map +1 -0
  219. package/dist/unit-converter-ZYXMEZOE.js +14 -0
  220. package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
  221. package/dist/whatsapp-LFX6YKCM.js +35 -0
  222. package/dist/whatsapp-LFX6YKCM.js.map +1 -0
  223. package/dist/word-document-7B6SJMAY.js +902 -0
  224. package/dist/word-document-7B6SJMAY.js.map +1 -0
  225. package/dist/xero-QYO66D45.js +162 -0
  226. package/dist/xero-QYO66D45.js.map +1 -0
  227. package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
  228. package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
  229. package/drizzle/0002_mushy_master_mold.sql +140 -0
  230. package/drizzle/meta/0002_snapshot.json +3637 -0
  231. package/drizzle/meta/_journal.json +7 -0
  232. package/package.json +100 -98
  233. package/dist/bot-KJ26BG56.js +0 -15
  234. package/dist/chunk-4LVWXUNC.js.map +0 -1
  235. package/dist/chunk-4TG2IG5K.js +0 -5249
  236. package/dist/chunk-4TG2IG5K.js.map +0 -1
  237. package/dist/chunk-6DRDKB45.js.map +0 -1
  238. package/dist/chunk-CI6Q63MM.js +0 -1613
  239. package/dist/chunk-CI6Q63MM.js.map +0 -1
  240. package/dist/chunk-KHNYJY2Z.js +0 -178
  241. package/dist/chunk-KHNYJY2Z.js.map +0 -1
  242. package/dist/chunk-NSBPE2FW.js +0 -17
  243. package/dist/discord-ZOJFTVTB.js +0 -49
  244. package/dist/imessage-JFRB6EJ7.js +0 -14
  245. package/dist/scheduler-EZ7CZMCS.js +0 -42
  246. package/dist/signal-T3MCSULM.js +0 -14
  247. package/dist/slack-N2M4FHAJ.js +0 -54
  248. package/dist/src-K7GASHRH.js.map +0 -1
  249. package/dist/tools-24GZHYRF.js +0 -16
  250. package/dist/whatsapp-VCRUPAO5.js +0 -14
  251. /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
  252. /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
  253. /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
  254. /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
  255. /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
  256. /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
  257. /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
  258. /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
  259. /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
  260. /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
  261. /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
  262. /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
  263. /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
  264. /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
  265. /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
  266. /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
  267. /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
  268. /package/dist/{whatsapp-VCRUPAO5.js.map → cron-explain-HHQKPD3M.js.map} +0 -0
@@ -0,0 +1,244 @@
1
+ import {
2
+ logAudit
3
+ } from "./chunk-OCVQGBJK.js";
4
+ import {
5
+ db,
6
+ incidentTimeline,
7
+ securityIncidents
8
+ } from "./chunk-XKYRH4FM.js";
9
+ import "./chunk-ZLZKF2PM.js";
10
+ import "./chunk-PLDDJCW6.js";
11
+
12
+ // src/core/security/incident-response.ts
13
+ import { eq, or, desc } from "drizzle-orm";
14
+ function generateIncidentNumber() {
15
+ const now = /* @__PURE__ */ new Date();
16
+ const yyyy = now.getFullYear().toString();
17
+ const mm = (now.getMonth() + 1).toString().padStart(2, "0");
18
+ const dd = now.getDate().toString().padStart(2, "0");
19
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
20
+ let suffix = "";
21
+ for (let i = 0; i < 4; i++) {
22
+ suffix += chars.charAt(Math.floor(Math.random() * chars.length));
23
+ }
24
+ return `INC-${yyyy}${mm}${dd}-${suffix}`;
25
+ }
26
+ function mapAnomalyToIncident(anomalyType) {
27
+ switch (anomalyType) {
28
+ case "brute_force":
29
+ return { type: "brute_force", severity: "critical" };
30
+ case "impossible_travel":
31
+ return { type: "unauthorized_access", severity: "high" };
32
+ case "new_device":
33
+ return { type: "suspicious_activity", severity: "medium" };
34
+ case "new_ip":
35
+ return { type: "suspicious_activity", severity: "low" };
36
+ case "rapid_session_switching":
37
+ return { type: "suspicious_activity", severity: "medium" };
38
+ case "unusual_time":
39
+ return { type: "suspicious_activity", severity: "low" };
40
+ default:
41
+ return { type: "suspicious_activity", severity: "medium" };
42
+ }
43
+ }
44
+ async function createIncident(params) {
45
+ const incidentNumber = generateIncidentNumber();
46
+ const [incident] = await db.insert(securityIncidents).values({
47
+ incidentNumber,
48
+ title: params.title,
49
+ description: params.description,
50
+ type: params.type,
51
+ severity: params.severity,
52
+ status: "open",
53
+ userId: params.userId,
54
+ assignedTo: params.assignedTo,
55
+ source: params.source,
56
+ sourceData: params.sourceData
57
+ }).returning();
58
+ await addTimelineEvent({
59
+ incidentId: incident.id,
60
+ eventType: "created",
61
+ description: `Incident ${incidentNumber} created: ${params.title}`,
62
+ performedBy: params.userId,
63
+ metadata: {
64
+ type: params.type,
65
+ severity: params.severity,
66
+ source: params.source
67
+ }
68
+ });
69
+ try {
70
+ await logAudit({
71
+ userId: params.userId,
72
+ action: "tool_use",
73
+ resource: "tool",
74
+ resourceId: incident.id,
75
+ details: {
76
+ event: "incident_created",
77
+ incidentNumber,
78
+ type: params.type,
79
+ severity: params.severity,
80
+ source: params.source
81
+ }
82
+ });
83
+ } catch {
84
+ }
85
+ return incident;
86
+ }
87
+ async function createIncidentFromAnomaly(userId, anomaly) {
88
+ const { type, severity } = mapAnomalyToIncident(anomaly.type);
89
+ return createIncident({
90
+ title: `[Auto] ${anomaly.message}`,
91
+ description: `Automatically created from ${anomaly.type} anomaly detected at ${anomaly.timestamp.toISOString()}.
92
+
93
+ Level: ${anomaly.level}
94
+ Message: ${anomaly.message}`,
95
+ type,
96
+ severity,
97
+ userId,
98
+ source: "auth_monitor",
99
+ sourceData: {
100
+ anomalyType: anomaly.type,
101
+ anomalyLevel: anomaly.level,
102
+ details: anomaly.details,
103
+ detectedAt: anomaly.timestamp.toISOString()
104
+ }
105
+ });
106
+ }
107
+ async function updateIncidentStatus(incidentId, newStatus, performedBy, notes) {
108
+ const updateData = {
109
+ status: newStatus,
110
+ updatedAt: /* @__PURE__ */ new Date()
111
+ };
112
+ switch (newStatus) {
113
+ case "investigating":
114
+ updateData.investigatedAt = /* @__PURE__ */ new Date();
115
+ break;
116
+ case "contained":
117
+ updateData.containedAt = /* @__PURE__ */ new Date();
118
+ break;
119
+ case "resolved":
120
+ updateData.resolvedAt = /* @__PURE__ */ new Date();
121
+ if (notes) {
122
+ updateData.resolutionNotes = notes;
123
+ }
124
+ break;
125
+ case "closed":
126
+ updateData.closedAt = /* @__PURE__ */ new Date();
127
+ break;
128
+ }
129
+ const [updated] = await db.update(securityIncidents).set(updateData).where(eq(securityIncidents.id, incidentId)).returning();
130
+ await addTimelineEvent({
131
+ incidentId,
132
+ eventType: "status_change",
133
+ description: `Status changed to ${newStatus}${notes ? `: ${notes}` : ""}`,
134
+ performedBy,
135
+ metadata: { newStatus, notes }
136
+ });
137
+ return updated;
138
+ }
139
+ async function assignIncident(incidentId, assignedTo, performedBy) {
140
+ const [updated] = await db.update(securityIncidents).set({ assignedTo, updatedAt: /* @__PURE__ */ new Date() }).where(eq(securityIncidents.id, incidentId)).returning();
141
+ await addTimelineEvent({
142
+ incidentId,
143
+ eventType: "assignment",
144
+ description: `Incident assigned to ${assignedTo}`,
145
+ performedBy,
146
+ metadata: { assignedTo }
147
+ });
148
+ return updated;
149
+ }
150
+ async function addTimelineEvent(params) {
151
+ const [event] = await db.insert(incidentTimeline).values({
152
+ incidentId: params.incidentId,
153
+ eventType: params.eventType,
154
+ description: params.description,
155
+ performedBy: params.performedBy,
156
+ metadata: params.metadata
157
+ }).returning();
158
+ return event;
159
+ }
160
+ async function resolveIncident(incidentId, notes, performedBy) {
161
+ return updateIncidentStatus(incidentId, "resolved", performedBy, notes);
162
+ }
163
+ async function getOpenIncidents(options = {}) {
164
+ const { severity, type, userId, limit = 50 } = options;
165
+ let results = await db.select().from(securityIncidents).where(
166
+ or(
167
+ eq(securityIncidents.status, "open"),
168
+ eq(securityIncidents.status, "investigating"),
169
+ eq(securityIncidents.status, "contained")
170
+ )
171
+ ).orderBy(desc(securityIncidents.createdAt)).limit(limit);
172
+ if (severity) {
173
+ results = results.filter((inc) => inc.severity === severity);
174
+ }
175
+ if (type) {
176
+ results = results.filter((inc) => inc.type === type);
177
+ }
178
+ if (userId) {
179
+ results = results.filter((inc) => inc.userId === userId);
180
+ }
181
+ return results;
182
+ }
183
+ async function getIncidentTimeline(incidentId) {
184
+ return db.select().from(incidentTimeline).where(eq(incidentTimeline.incidentId, incidentId)).orderBy(desc(incidentTimeline.createdAt));
185
+ }
186
+ async function generateIncidentReport(incidentId) {
187
+ const [incident] = await db.select().from(securityIncidents).where(eq(securityIncidents.id, incidentId)).limit(1);
188
+ if (!incident) {
189
+ throw new Error(`Incident not found: ${incidentId}`);
190
+ }
191
+ const timeline = await getIncidentTimeline(incidentId);
192
+ const timelineEntries = timeline.map(
193
+ (e) => `- **${e.createdAt.toISOString()}** [${e.eventType}] ${e.description}`
194
+ ).join("\n");
195
+ const summary = `# Incident Report: ${incident.incidentNumber}
196
+
197
+ ## Overview
198
+ - **Title**: ${incident.title}
199
+ - **Type**: ${incident.type}
200
+ - **Severity**: ${incident.severity}
201
+ - **Status**: ${incident.status}
202
+ - **Source**: ${incident.source}
203
+ - **Created**: ${incident.createdAt.toISOString()}
204
+ - **Updated**: ${incident.updatedAt.toISOString()}
205
+
206
+ ## Description
207
+ ${incident.description}
208
+
209
+ ## Impact Assessment
210
+ ${incident.impactAssessment ?? "Not yet assessed."}
211
+
212
+ ## Resolution
213
+ ${incident.resolutionNotes ?? "Not yet resolved."}
214
+
215
+ ## Timeline
216
+ ${timelineEntries || "No timeline events recorded."}
217
+ `;
218
+ return { incident, timeline, summary };
219
+ }
220
+ function wireIncidentResponseToAuthMonitor(authMonitor) {
221
+ authMonitor.onAlert(async (userId, anomaly) => {
222
+ if (anomaly.level === "warning" || anomaly.level === "critical") {
223
+ try {
224
+ await createIncidentFromAnomaly(userId, anomaly);
225
+ } catch {
226
+ }
227
+ }
228
+ });
229
+ }
230
+ export {
231
+ addTimelineEvent,
232
+ assignIncident,
233
+ createIncident,
234
+ createIncidentFromAnomaly,
235
+ generateIncidentNumber,
236
+ generateIncidentReport,
237
+ getIncidentTimeline,
238
+ getOpenIncidents,
239
+ mapAnomalyToIncident,
240
+ resolveIncident,
241
+ updateIncidentStatus,
242
+ wireIncidentResponseToAuthMonitor
243
+ };
244
+ //# sourceMappingURL=incident-response-C5J7Q6DT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/security/incident-response.ts"],"sourcesContent":["// SOC 2 Incident Response System\n// Manages security incident lifecycle: creation, investigation, containment, resolution\n\nimport { db } from \"../../db\";\nimport { securityIncidents, incidentTimeline, users } from \"../../db/schema\";\nimport { eq, or, desc } from \"drizzle-orm\";\nimport { logAudit } from \"./audit-logger\";\n\n// ---------------------------------------------------------------------------\n// Type aliases (matching the schema column types)\n// ---------------------------------------------------------------------------\n\ntype IncidentType =\n | \"brute_force\"\n | \"unauthorized_access\"\n | \"data_breach\"\n | \"suspicious_activity\"\n | \"system_compromise\"\n | \"policy_violation\";\n\ntype IncidentSeverity = \"low\" | \"medium\" | \"high\" | \"critical\";\n\ntype IncidentStatus =\n | \"open\"\n | \"investigating\"\n | \"contained\"\n | \"resolved\"\n | \"closed\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a unique incident number in the format INC-YYYYMMDD-XXXX\n * where XXXX is 4 random uppercase alphanumeric characters.\n */\nexport function generateIncidentNumber(): string {\n const now = new Date();\n const yyyy = now.getFullYear().toString();\n const mm = (now.getMonth() + 1).toString().padStart(2, \"0\");\n const dd = now.getDate().toString().padStart(2, \"0\");\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n let suffix = \"\";\n for (let i = 0; i < 4; i++) {\n suffix += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return `INC-${yyyy}${mm}${dd}-${suffix}`;\n}\n\n/**\n * Map an anomaly type string (from AuthMonitor) to the corresponding\n * incident type and severity.\n */\nexport function mapAnomalyToIncident(anomalyType: string): {\n type: IncidentType;\n severity: IncidentSeverity;\n} {\n switch (anomalyType) {\n case \"brute_force\":\n return { type: \"brute_force\", severity: \"critical\" };\n case \"impossible_travel\":\n return { type: \"unauthorized_access\", severity: \"high\" };\n case \"new_device\":\n return { type: \"suspicious_activity\", severity: \"medium\" };\n case \"new_ip\":\n return { type: \"suspicious_activity\", severity: \"low\" };\n case \"rapid_session_switching\":\n return { type: \"suspicious_activity\", severity: \"medium\" };\n case \"unusual_time\":\n return { type: \"suspicious_activity\", severity: \"low\" };\n default:\n return { type: \"suspicious_activity\", severity: \"medium\" };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Core CRUD\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new security incident, add the initial \"created\" timeline event,\n * and emit an audit log entry.\n */\nexport async function createIncident(params: {\n title: string;\n description: string;\n type: IncidentType;\n severity: IncidentSeverity;\n userId?: string;\n source: string;\n sourceData?: unknown;\n assignedTo?: string;\n}) {\n const incidentNumber = generateIncidentNumber();\n\n const [incident] = await db\n .insert(securityIncidents)\n .values({\n incidentNumber,\n title: params.title,\n description: params.description,\n type: params.type,\n severity: params.severity,\n status: \"open\",\n userId: params.userId,\n assignedTo: params.assignedTo,\n source: params.source,\n sourceData: params.sourceData as any,\n })\n .returning();\n\n // Add \"created\" timeline event\n await addTimelineEvent({\n incidentId: incident.id,\n eventType: \"created\",\n description: `Incident ${incidentNumber} created: ${params.title}`,\n performedBy: params.userId,\n metadata: {\n type: params.type,\n severity: params.severity,\n source: params.source,\n },\n });\n\n // Audit log\n try {\n await logAudit({\n userId: params.userId,\n action: \"tool_use\" as any,\n resource: \"tool\" as any,\n resourceId: incident.id,\n details: {\n event: \"incident_created\",\n incidentNumber,\n type: params.type,\n severity: params.severity,\n source: params.source,\n },\n });\n } catch {\n // Audit logging should not block incident creation\n }\n\n return incident;\n}\n\n/**\n * Create an incident automatically from an AuthMonitor anomaly.\n */\nexport async function createIncidentFromAnomaly(\n userId: string,\n anomaly: {\n type: string;\n level: string;\n message: string;\n details?: unknown;\n timestamp: Date;\n }\n) {\n const { type, severity } = mapAnomalyToIncident(anomaly.type);\n\n return createIncident({\n title: `[Auto] ${anomaly.message}`,\n description: `Automatically created from ${anomaly.type} anomaly detected at ${anomaly.timestamp.toISOString()}.\\n\\nLevel: ${anomaly.level}\\nMessage: ${anomaly.message}`,\n type,\n severity,\n userId,\n source: \"auth_monitor\",\n sourceData: {\n anomalyType: anomaly.type,\n anomalyLevel: anomaly.level,\n details: anomaly.details,\n detectedAt: anomaly.timestamp.toISOString(),\n },\n });\n}\n\n// ---------------------------------------------------------------------------\n// Status management\n// ---------------------------------------------------------------------------\n\n/**\n * Transition an incident to a new status, updating the appropriate timestamp\n * field and recording a timeline event.\n */\nexport async function updateIncidentStatus(\n incidentId: string,\n newStatus: IncidentStatus,\n performedBy?: string,\n notes?: string\n) {\n const updateData: Record<string, unknown> = {\n status: newStatus,\n updatedAt: new Date(),\n };\n\n switch (newStatus) {\n case \"investigating\":\n updateData.investigatedAt = new Date();\n break;\n case \"contained\":\n updateData.containedAt = new Date();\n break;\n case \"resolved\":\n updateData.resolvedAt = new Date();\n if (notes) {\n updateData.resolutionNotes = notes;\n }\n break;\n case \"closed\":\n updateData.closedAt = new Date();\n break;\n }\n\n const [updated] = await db\n .update(securityIncidents)\n .set(updateData)\n .where(eq(securityIncidents.id, incidentId))\n .returning();\n\n // Timeline event\n await addTimelineEvent({\n incidentId,\n eventType: \"status_change\",\n description: `Status changed to ${newStatus}${notes ? `: ${notes}` : \"\"}`,\n performedBy,\n metadata: { newStatus, notes },\n });\n\n return updated;\n}\n\n/**\n * Assign an incident to a user and record the assignment in the timeline.\n */\nexport async function assignIncident(\n incidentId: string,\n assignedTo: string,\n performedBy?: string\n) {\n const [updated] = await db\n .update(securityIncidents)\n .set({ assignedTo, updatedAt: new Date() })\n .where(eq(securityIncidents.id, incidentId))\n .returning();\n\n await addTimelineEvent({\n incidentId,\n eventType: \"assignment\",\n description: `Incident assigned to ${assignedTo}`,\n performedBy,\n metadata: { assignedTo },\n });\n\n return updated;\n}\n\n/**\n * Add a timeline event to an incident.\n */\nexport async function addTimelineEvent(params: {\n incidentId: string;\n eventType: string;\n description: string;\n performedBy?: string;\n metadata?: unknown;\n}) {\n const [event] = await db\n .insert(incidentTimeline)\n .values({\n incidentId: params.incidentId,\n eventType: params.eventType as any,\n description: params.description,\n performedBy: params.performedBy,\n metadata: params.metadata as any,\n })\n .returning();\n\n return event;\n}\n\n/**\n * Convenience wrapper to resolve an incident with notes.\n */\nexport async function resolveIncident(\n incidentId: string,\n notes: string,\n performedBy?: string\n) {\n return updateIncidentStatus(incidentId, \"resolved\", performedBy, notes);\n}\n\n// ---------------------------------------------------------------------------\n// Queries\n// ---------------------------------------------------------------------------\n\n/**\n * Retrieve open incidents (status = open | investigating | contained),\n * optionally filtered by severity, type, userId, and limited.\n */\nexport async function getOpenIncidents(\n options: {\n severity?: IncidentSeverity;\n type?: IncidentType;\n userId?: string;\n limit?: number;\n } = {}\n) {\n const { severity, type, userId, limit = 50 } = options;\n\n let results = await db\n .select()\n .from(securityIncidents)\n .where(\n or(\n eq(securityIncidents.status, \"open\"),\n eq(securityIncidents.status, \"investigating\"),\n eq(securityIncidents.status, \"contained\")\n )\n )\n .orderBy(desc(securityIncidents.createdAt))\n .limit(limit);\n\n // Post-filter by optional criteria\n if (severity) {\n results = results.filter((inc) => inc.severity === severity);\n }\n if (type) {\n results = results.filter((inc) => inc.type === type);\n }\n if (userId) {\n results = results.filter((inc) => inc.userId === userId);\n }\n\n return results;\n}\n\n/**\n * Retrieve the full timeline for a specific incident, ordered chronologically.\n */\nexport async function getIncidentTimeline(incidentId: string) {\n return db\n .select()\n .from(incidentTimeline)\n .where(eq(incidentTimeline.incidentId, incidentId))\n .orderBy(desc(incidentTimeline.createdAt));\n}\n\n// ---------------------------------------------------------------------------\n// Reporting\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a structured incident report with a markdown-formatted summary.\n */\nexport async function generateIncidentReport(incidentId: string) {\n const [incident] = await db\n .select()\n .from(securityIncidents)\n .where(eq(securityIncidents.id, incidentId))\n .limit(1);\n\n if (!incident) {\n throw new Error(`Incident not found: ${incidentId}`);\n }\n\n const timeline = await getIncidentTimeline(incidentId);\n\n const timelineEntries = timeline\n .map(\n (e) =>\n `- **${e.createdAt.toISOString()}** [${e.eventType}] ${e.description}`\n )\n .join(\"\\n\");\n\n const summary = `# Incident Report: ${incident.incidentNumber}\n\n## Overview\n- **Title**: ${incident.title}\n- **Type**: ${incident.type}\n- **Severity**: ${incident.severity}\n- **Status**: ${incident.status}\n- **Source**: ${incident.source}\n- **Created**: ${incident.createdAt.toISOString()}\n- **Updated**: ${incident.updatedAt.toISOString()}\n\n## Description\n${incident.description}\n\n## Impact Assessment\n${incident.impactAssessment ?? \"Not yet assessed.\"}\n\n## Resolution\n${incident.resolutionNotes ?? \"Not yet resolved.\"}\n\n## Timeline\n${timelineEntries || \"No timeline events recorded.\"}\n`;\n\n return { incident, timeline, summary };\n}\n\n// ---------------------------------------------------------------------------\n// Integration with AuthMonitor\n// ---------------------------------------------------------------------------\n\n/**\n * Wire the incident response system into an AuthMonitor instance so that\n * warning-level and critical-level anomalies automatically create incidents.\n */\nexport function wireIncidentResponseToAuthMonitor(authMonitor: {\n onAlert: (\n cb: (userId: string, anomaly: any) => void | Promise<void>\n ) => void;\n}) {\n authMonitor.onAlert(async (userId: string, anomaly: any) => {\n // Only create incidents for warning and critical anomalies\n if (anomaly.level === \"warning\" || anomaly.level === \"critical\") {\n try {\n await createIncidentFromAnomaly(userId, anomaly);\n } catch {\n // Incident creation failure should not crash the auth flow\n }\n }\n });\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,24 @@
1
+ import {
2
+ addItem,
3
+ clearInventory,
4
+ getInventorySummary,
5
+ getItem,
6
+ getItemHistory,
7
+ listItems,
8
+ removeItem,
9
+ setQuantity,
10
+ updateQuantity
11
+ } from "./chunk-HN3F4WSW.js";
12
+ import "./chunk-PLDDJCW6.js";
13
+ export {
14
+ addItem,
15
+ clearInventory,
16
+ getInventorySummary,
17
+ getItem,
18
+ getItemHistory,
19
+ listItems,
20
+ removeItem,
21
+ setQuantity,
22
+ updateQuantity
23
+ };
24
+ //# sourceMappingURL=inventory-manager-352OHXWD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,199 @@
1
+ import {
2
+ BaseAdapter
3
+ } from "./chunk-7WQO5J2M.js";
4
+ import "./chunk-PLDDJCW6.js";
5
+
6
+ // src/core/adapters/adapters/jira.ts
7
+ import { z } from "zod";
8
+ var JiraAdapter = class extends BaseAdapter {
9
+ metadata = {
10
+ name: "Jira",
11
+ slug: "jira",
12
+ displayName: "Jira",
13
+ description: "Create and manage issues, track projects, and automate workflows in Jira",
14
+ category: "project-management",
15
+ authType: "api_key"
16
+ };
17
+ async authenticate(credentials) {
18
+ return {
19
+ accessToken: credentials.apiToken || credentials.accessToken || "",
20
+ metadata: {
21
+ domain: credentials.domain,
22
+ email: credentials.email
23
+ }
24
+ };
25
+ }
26
+ getBaseUrl(auth) {
27
+ const domain = auth.metadata?.domain || "myorg";
28
+ return `https://${domain}.atlassian.net/rest/api/3`;
29
+ }
30
+ getAuthHeaders(auth) {
31
+ const email = auth.metadata?.email || "";
32
+ const token = auth.accessToken;
33
+ return {
34
+ Authorization: `Basic ${btoa(`${email}:${token}`)}`,
35
+ "Content-Type": "application/json"
36
+ };
37
+ }
38
+ actions = {
39
+ createIssue: {
40
+ name: "Create Issue",
41
+ description: "Create a new issue in Jira",
42
+ inputSchema: z.object({
43
+ projectKey: z.string(),
44
+ summary: z.string(),
45
+ description: z.string().optional(),
46
+ issueType: z.string().default("Task"),
47
+ priority: z.string().optional(),
48
+ assigneeId: z.string().optional(),
49
+ labels: z.array(z.string()).optional()
50
+ }),
51
+ outputSchema: z.object({ id: z.string(), key: z.string(), self: z.string() }),
52
+ execute: async (input, auth) => {
53
+ const { projectKey, summary, description, issueType, priority, assigneeId, labels } = input;
54
+ const baseUrl = this.getBaseUrl(auth);
55
+ const fields = {
56
+ project: { key: projectKey },
57
+ summary,
58
+ issuetype: { name: issueType }
59
+ };
60
+ if (description) {
61
+ fields.description = {
62
+ type: "doc",
63
+ version: 1,
64
+ content: [{ type: "paragraph", content: [{ type: "text", text: description }] }]
65
+ };
66
+ }
67
+ if (priority) fields.priority = { name: priority };
68
+ if (assigneeId) fields.assignee = { accountId: assigneeId };
69
+ if (labels) fields.labels = labels;
70
+ const response = await this.makeRequest(
71
+ `${baseUrl}/issue`,
72
+ { method: "POST", body: JSON.stringify({ fields }), headers: this.getAuthHeaders(auth) }
73
+ );
74
+ return response.json();
75
+ }
76
+ },
77
+ updateIssue: {
78
+ name: "Update Issue",
79
+ description: "Update an existing Jira issue",
80
+ inputSchema: z.object({
81
+ issueKey: z.string(),
82
+ summary: z.string().optional(),
83
+ description: z.string().optional(),
84
+ priority: z.string().optional(),
85
+ assigneeId: z.string().optional(),
86
+ labels: z.array(z.string()).optional()
87
+ }),
88
+ outputSchema: z.object({ success: z.boolean(), issueKey: z.string() }),
89
+ execute: async (input, auth) => {
90
+ const { issueKey, summary, description, priority, assigneeId, labels } = input;
91
+ const baseUrl = this.getBaseUrl(auth);
92
+ const fields = {};
93
+ if (summary) fields.summary = summary;
94
+ if (description) {
95
+ fields.description = {
96
+ type: "doc",
97
+ version: 1,
98
+ content: [{ type: "paragraph", content: [{ type: "text", text: description }] }]
99
+ };
100
+ }
101
+ if (priority) fields.priority = { name: priority };
102
+ if (assigneeId) fields.assignee = { accountId: assigneeId };
103
+ if (labels) fields.labels = labels;
104
+ await this.makeRequest(
105
+ `${baseUrl}/issue/${issueKey}`,
106
+ { method: "PUT", body: JSON.stringify({ fields }), headers: this.getAuthHeaders(auth) }
107
+ );
108
+ return { success: true, issueKey };
109
+ }
110
+ },
111
+ addComment: {
112
+ name: "Add Comment",
113
+ description: "Add a comment to a Jira issue",
114
+ inputSchema: z.object({
115
+ issueKey: z.string(),
116
+ body: z.string()
117
+ }),
118
+ outputSchema: z.object({ id: z.string(), self: z.string(), created: z.string() }),
119
+ execute: async (input, auth) => {
120
+ const { issueKey, body } = input;
121
+ const baseUrl = this.getBaseUrl(auth);
122
+ const response = await this.makeRequest(
123
+ `${baseUrl}/issue/${issueKey}/comment`,
124
+ {
125
+ method: "POST",
126
+ body: JSON.stringify({
127
+ body: {
128
+ type: "doc",
129
+ version: 1,
130
+ content: [{ type: "paragraph", content: [{ type: "text", text: body }] }]
131
+ }
132
+ }),
133
+ headers: this.getAuthHeaders(auth)
134
+ }
135
+ );
136
+ return response.json();
137
+ }
138
+ },
139
+ transitionIssue: {
140
+ name: "Transition Issue",
141
+ description: "Move a Jira issue to a different status",
142
+ inputSchema: z.object({
143
+ issueKey: z.string(),
144
+ transitionId: z.string(),
145
+ comment: z.string().optional()
146
+ }),
147
+ outputSchema: z.object({ success: z.boolean(), issueKey: z.string() }),
148
+ execute: async (input, auth) => {
149
+ const { issueKey, transitionId, comment } = input;
150
+ const baseUrl = this.getBaseUrl(auth);
151
+ const payload = {
152
+ transition: { id: transitionId }
153
+ };
154
+ if (comment) {
155
+ payload.update = {
156
+ comment: [{
157
+ add: {
158
+ body: {
159
+ type: "doc",
160
+ version: 1,
161
+ content: [{ type: "paragraph", content: [{ type: "text", text: comment }] }]
162
+ }
163
+ }
164
+ }]
165
+ };
166
+ }
167
+ await this.makeRequest(
168
+ `${baseUrl}/issue/${issueKey}/transitions`,
169
+ { method: "POST", body: JSON.stringify(payload), headers: this.getAuthHeaders(auth) }
170
+ );
171
+ return { success: true, issueKey };
172
+ }
173
+ }
174
+ };
175
+ triggers = {
176
+ onIssueCreated: {
177
+ name: "Issue Created",
178
+ description: "Triggered when a new issue is created in Jira",
179
+ outputSchema: z.object({ issueId: z.string(), issueKey: z.string(), summary: z.string(), issueType: z.string(), projectKey: z.string() }),
180
+ subscribe: async (_config, _auth) => {
181
+ },
182
+ unsubscribe: async (_config, _auth) => {
183
+ }
184
+ },
185
+ onIssueUpdated: {
186
+ name: "Issue Updated",
187
+ description: "Triggered when an issue is updated in Jira",
188
+ outputSchema: z.object({ issueId: z.string(), issueKey: z.string(), summary: z.string(), changedFields: z.array(z.string()) }),
189
+ subscribe: async (_config, _auth) => {
190
+ },
191
+ unsubscribe: async (_config, _auth) => {
192
+ }
193
+ }
194
+ };
195
+ };
196
+ export {
197
+ JiraAdapter
198
+ };
199
+ //# sourceMappingURL=jira-GSGDBMIG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/adapters/adapters/jira.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { BaseAdapter } from \"../base-adapter\";\nimport type { AuthResult, ActionDefinition, TriggerDefinition, TriggerConfig } from \"../types\";\n\nexport class JiraAdapter extends BaseAdapter {\n metadata = {\n name: \"Jira\",\n slug: \"jira\",\n displayName: \"Jira\",\n description: \"Create and manage issues, track projects, and automate workflows in Jira\",\n category: \"project-management\",\n authType: \"api_key\" as const,\n };\n\n async authenticate(credentials: Record<string, string>): Promise<AuthResult> {\n return {\n accessToken: credentials.apiToken || credentials.accessToken || \"\",\n metadata: {\n domain: credentials.domain,\n email: credentials.email,\n },\n };\n }\n\n private getBaseUrl(auth: AuthResult): string {\n const domain = (auth.metadata?.domain as string) || \"myorg\";\n return `https://${domain}.atlassian.net/rest/api/3`;\n }\n\n private getAuthHeaders(auth: AuthResult): Record<string, string> {\n const email = (auth.metadata?.email as string) || \"\";\n const token = auth.accessToken;\n return {\n Authorization: `Basic ${btoa(`${email}:${token}`)}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n actions: Record<string, ActionDefinition> = {\n createIssue: {\n name: \"Create Issue\",\n description: \"Create a new issue in Jira\",\n inputSchema: z.object({\n projectKey: z.string(),\n summary: z.string(),\n description: z.string().optional(),\n issueType: z.string().default(\"Task\"),\n priority: z.string().optional(),\n assigneeId: z.string().optional(),\n labels: z.array(z.string()).optional(),\n }),\n outputSchema: z.object({ id: z.string(), key: z.string(), self: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { projectKey, summary, description, issueType, priority, assigneeId, labels } = input as {\n projectKey: string; summary: string; description?: string; issueType: string;\n priority?: string; assigneeId?: string; labels?: string[];\n };\n const baseUrl = this.getBaseUrl(auth);\n const fields: Record<string, unknown> = {\n project: { key: projectKey },\n summary,\n issuetype: { name: issueType },\n };\n if (description) {\n fields.description = {\n type: \"doc\",\n version: 1,\n content: [{ type: \"paragraph\", content: [{ type: \"text\", text: description }] }],\n };\n }\n if (priority) fields.priority = { name: priority };\n if (assigneeId) fields.assignee = { accountId: assigneeId };\n if (labels) fields.labels = labels;\n const response = await this.makeRequest(\n `${baseUrl}/issue`,\n { method: \"POST\", body: JSON.stringify({ fields }), headers: this.getAuthHeaders(auth) }\n );\n return response.json();\n },\n },\n updateIssue: {\n name: \"Update Issue\",\n description: \"Update an existing Jira issue\",\n inputSchema: z.object({\n issueKey: z.string(),\n summary: z.string().optional(),\n description: z.string().optional(),\n priority: z.string().optional(),\n assigneeId: z.string().optional(),\n labels: z.array(z.string()).optional(),\n }),\n outputSchema: z.object({ success: z.boolean(), issueKey: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { issueKey, summary, description, priority, assigneeId, labels } = input as {\n issueKey: string; summary?: string; description?: string;\n priority?: string; assigneeId?: string; labels?: string[];\n };\n const baseUrl = this.getBaseUrl(auth);\n const fields: Record<string, unknown> = {};\n if (summary) fields.summary = summary;\n if (description) {\n fields.description = {\n type: \"doc\",\n version: 1,\n content: [{ type: \"paragraph\", content: [{ type: \"text\", text: description }] }],\n };\n }\n if (priority) fields.priority = { name: priority };\n if (assigneeId) fields.assignee = { accountId: assigneeId };\n if (labels) fields.labels = labels;\n await this.makeRequest(\n `${baseUrl}/issue/${issueKey}`,\n { method: \"PUT\", body: JSON.stringify({ fields }), headers: this.getAuthHeaders(auth) }\n );\n return { success: true, issueKey };\n },\n },\n addComment: {\n name: \"Add Comment\",\n description: \"Add a comment to a Jira issue\",\n inputSchema: z.object({\n issueKey: z.string(),\n body: z.string(),\n }),\n outputSchema: z.object({ id: z.string(), self: z.string(), created: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { issueKey, body } = input as { issueKey: string; body: string };\n const baseUrl = this.getBaseUrl(auth);\n const response = await this.makeRequest(\n `${baseUrl}/issue/${issueKey}/comment`,\n {\n method: \"POST\",\n body: JSON.stringify({\n body: {\n type: \"doc\",\n version: 1,\n content: [{ type: \"paragraph\", content: [{ type: \"text\", text: body }] }],\n },\n }),\n headers: this.getAuthHeaders(auth),\n }\n );\n return response.json();\n },\n },\n transitionIssue: {\n name: \"Transition Issue\",\n description: \"Move a Jira issue to a different status\",\n inputSchema: z.object({\n issueKey: z.string(),\n transitionId: z.string(),\n comment: z.string().optional(),\n }),\n outputSchema: z.object({ success: z.boolean(), issueKey: z.string() }),\n execute: async (input: unknown, auth: AuthResult) => {\n const { issueKey, transitionId, comment } = input as {\n issueKey: string; transitionId: string; comment?: string;\n };\n const baseUrl = this.getBaseUrl(auth);\n const payload: Record<string, unknown> = {\n transition: { id: transitionId },\n };\n if (comment) {\n payload.update = {\n comment: [{\n add: {\n body: {\n type: \"doc\",\n version: 1,\n content: [{ type: \"paragraph\", content: [{ type: \"text\", text: comment }] }],\n },\n },\n }],\n };\n }\n await this.makeRequest(\n `${baseUrl}/issue/${issueKey}/transitions`,\n { method: \"POST\", body: JSON.stringify(payload), headers: this.getAuthHeaders(auth) }\n );\n return { success: true, issueKey };\n },\n },\n };\n\n triggers: Record<string, TriggerDefinition> = {\n onIssueCreated: {\n name: \"Issue Created\",\n description: \"Triggered when a new issue is created in Jira\",\n outputSchema: z.object({ issueId: z.string(), issueKey: z.string(), summary: z.string(), issueType: z.string(), projectKey: z.string() }),\n subscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n unsubscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n },\n onIssueUpdated: {\n name: \"Issue Updated\",\n description: \"Triggered when an issue is updated in Jira\",\n outputSchema: z.object({ issueId: z.string(), issueKey: z.string(), summary: z.string(), changedFields: z.array(z.string()) }),\n subscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n unsubscribe: async (_config: TriggerConfig, _auth: AuthResult) => {},\n },\n };\n}\n"],"mappings":";;;;;;AAAA,SAAS,SAAS;AAIX,IAAM,cAAN,cAA0B,YAAY;AAAA,EAC3C,WAAW;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EAEA,MAAM,aAAa,aAA0D;AAC3E,WAAO;AAAA,MACL,aAAa,YAAY,YAAY,YAAY,eAAe;AAAA,MAChE,UAAU;AAAA,QACR,QAAQ,YAAY;AAAA,QACpB,OAAO,YAAY;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,MAA0B;AAC3C,UAAM,SAAU,KAAK,UAAU,UAAqB;AACpD,WAAO,WAAW,MAAM;AAAA,EAC1B;AAAA,EAEQ,eAAe,MAA0C;AAC/D,UAAM,QAAS,KAAK,UAAU,SAAoB;AAClD,UAAM,QAAQ,KAAK;AACnB,WAAO;AAAA,MACL,eAAe,SAAS,KAAK,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;AAAA,MACjD,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,UAA4C;AAAA,IAC1C,aAAa;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,EAAE,OAAO;AAAA,QACpB,YAAY,EAAE,OAAO;AAAA,QACrB,SAAS,EAAE,OAAO;AAAA,QAClB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,WAAW,EAAE,OAAO,EAAE,QAAQ,MAAM;AAAA,QACpC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,QAChC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACvC,CAAC;AAAA,MACD,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;AAAA,MAC5E,SAAS,OAAO,OAAgB,SAAqB;AACnD,cAAM,EAAE,YAAY,SAAS,aAAa,WAAW,UAAU,YAAY,OAAO,IAAI;AAItF,cAAM,UAAU,KAAK,WAAW,IAAI;AACpC,cAAM,SAAkC;AAAA,UACtC,SAAS,EAAE,KAAK,WAAW;AAAA,UAC3B;AAAA,UACA,WAAW,EAAE,MAAM,UAAU;AAAA,QAC/B;AACA,YAAI,aAAa;AACf,iBAAO,cAAc;AAAA,YACnB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC,EAAE,CAAC;AAAA,UACjF;AAAA,QACF;AACA,YAAI,SAAU,QAAO,WAAW,EAAE,MAAM,SAAS;AACjD,YAAI,WAAY,QAAO,WAAW,EAAE,WAAW,WAAW;AAC1D,YAAI,OAAQ,QAAO,SAAS;AAC5B,cAAM,WAAW,MAAM,KAAK;AAAA,UAC1B,GAAG,OAAO;AAAA,UACV,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK,eAAe,IAAI,EAAE;AAAA,QACzF;AACA,eAAO,SAAS,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,EAAE,OAAO;AAAA,QACpB,UAAU,EAAE,OAAO;AAAA,QACnB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,QACjC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,QAChC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACvC,CAAC;AAAA,MACD,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC;AAAA,MACrE,SAAS,OAAO,OAAgB,SAAqB;AACnD,cAAM,EAAE,UAAU,SAAS,aAAa,UAAU,YAAY,OAAO,IAAI;AAIzE,cAAM,UAAU,KAAK,WAAW,IAAI;AACpC,cAAM,SAAkC,CAAC;AACzC,YAAI,QAAS,QAAO,UAAU;AAC9B,YAAI,aAAa;AACf,iBAAO,cAAc;AAAA,YACnB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC,EAAE,CAAC;AAAA,UACjF;AAAA,QACF;AACA,YAAI,SAAU,QAAO,WAAW,EAAE,MAAM,SAAS;AACjD,YAAI,WAAY,QAAO,WAAW,EAAE,WAAW,WAAW;AAC1D,YAAI,OAAQ,QAAO,SAAS;AAC5B,cAAM,KAAK;AAAA,UACT,GAAG,OAAO,UAAU,QAAQ;AAAA,UAC5B,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK,eAAe,IAAI,EAAE;AAAA,QACxF;AACA,eAAO,EAAE,SAAS,MAAM,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,EAAE,OAAO;AAAA,QACpB,UAAU,EAAE,OAAO;AAAA,QACnB,MAAM,EAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC;AAAA,MAChF,SAAS,OAAO,OAAgB,SAAqB;AACnD,cAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,cAAM,UAAU,KAAK,WAAW,IAAI;AACpC,cAAM,WAAW,MAAM,KAAK;AAAA,UAC1B,GAAG,OAAO,UAAU,QAAQ;AAAA,UAC5B;AAAA,YACE,QAAQ;AAAA,YACR,MAAM,KAAK,UAAU;AAAA,cACnB,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,SAAS,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,cAC1E;AAAA,YACF,CAAC;AAAA,YACD,SAAS,KAAK,eAAe,IAAI;AAAA,UACnC;AAAA,QACF;AACA,eAAO,SAAS,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa,EAAE,OAAO;AAAA,QACpB,UAAU,EAAE,OAAO;AAAA,QACnB,cAAc,EAAE,OAAO;AAAA,QACvB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,CAAC;AAAA,MACD,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC;AAAA,MACrE,SAAS,OAAO,OAAgB,SAAqB;AACnD,cAAM,EAAE,UAAU,cAAc,QAAQ,IAAI;AAG5C,cAAM,UAAU,KAAK,WAAW,IAAI;AACpC,cAAM,UAAmC;AAAA,UACvC,YAAY,EAAE,IAAI,aAAa;AAAA,QACjC;AACA,YAAI,SAAS;AACX,kBAAQ,SAAS;AAAA,YACf,SAAS,CAAC;AAAA,cACR,KAAK;AAAA,gBACH,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,SAAS,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,gBAC7E;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM,KAAK;AAAA,UACT,GAAG,OAAO,UAAU,QAAQ;AAAA,UAC5B,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,OAAO,GAAG,SAAS,KAAK,eAAe,IAAI,EAAE;AAAA,QACtF;AACA,eAAO,EAAE,SAAS,MAAM,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAA8C;AAAA,IAC5C,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,GAAG,YAAY,EAAE,OAAO,EAAE,CAAC;AAAA,MACxI,WAAW,OAAO,SAAwB,UAAsB;AAAA,MAAC;AAAA,MACjE,aAAa,OAAO,SAAwB,UAAsB;AAAA,MAAC;AAAA,IACrE;AAAA,IACA,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,GAAG,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,MAC7H,WAAW,OAAO,SAAwB,UAAsB;AAAA,MAAC;AAAA,MACjE,aAAa,OAAO,SAAwB,UAAsB;AAAA,MAAC;AAAA,IACrE;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,26 @@
1
+ import {
2
+ diffJson,
3
+ flattenJson,
4
+ formatJson,
5
+ getKeys,
6
+ jsonTool,
7
+ json_tool_default,
8
+ minifyJson,
9
+ queryJson,
10
+ unflattenJson,
11
+ validateJson
12
+ } from "./chunk-F3TTNID2.js";
13
+ import "./chunk-PLDDJCW6.js";
14
+ export {
15
+ json_tool_default as default,
16
+ diffJson,
17
+ flattenJson,
18
+ formatJson,
19
+ getKeys,
20
+ jsonTool,
21
+ minifyJson,
22
+ queryJson,
23
+ unflattenJson,
24
+ validateJson
25
+ };
26
+ //# sourceMappingURL=json-tool-QE2SYHEG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,18 @@
1
+ import {
2
+ generateEncryptionKey,
3
+ getRotationInfo,
4
+ hashKeyForLog,
5
+ key_rotation_default,
6
+ reEncryptValue,
7
+ rotateEncryptionKeys
8
+ } from "./chunk-BIPYADGB.js";
9
+ import "./chunk-PLDDJCW6.js";
10
+ export {
11
+ key_rotation_default as default,
12
+ generateEncryptionKey,
13
+ getRotationInfo,
14
+ hashKeyForLog,
15
+ reEncryptValue,
16
+ rotateEncryptionKeys
17
+ };
18
+ //# sourceMappingURL=key-rotation-DPHU4ZTB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}