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.
- package/README.md +354 -283
- package/dist/archiver-AVNBYCKQ.js +15340 -0
- package/dist/archiver-AVNBYCKQ.js.map +1 -0
- package/dist/audit-logger-OBPR7CRO.js +22 -0
- package/dist/auth-UOX5K2BE.js +18 -0
- package/dist/autonomy-ZXDBDQUJ.js +86 -0
- package/dist/autonomy-ZXDBDQUJ.js.map +1 -0
- package/dist/aws-s3-Q4LLZZPD.js +146 -0
- package/dist/aws-s3-Q4LLZZPD.js.map +1 -0
- package/dist/backup-restore-PZ7CYYB7.js +16 -0
- package/dist/blocks-R3PODY47.js +23 -0
- package/dist/bot-QRARP4UN.js +36 -0
- package/dist/brain-7XLLM3KC.js +56 -0
- package/dist/camera-monitor-M5CYKUU4.js +335 -0
- package/dist/camera-monitor-M5CYKUU4.js.map +1 -0
- package/dist/{charts-MMXM6BWW.js → charts-V7ARZNKF.js} +2 -2
- package/dist/chunk-22VGGA7S.js +330 -0
- package/dist/chunk-22VGGA7S.js.map +1 -0
- package/dist/chunk-35WYTA3C.js +382 -0
- package/dist/chunk-35WYTA3C.js.map +1 -0
- package/dist/chunk-3E2PSU2C.js +146 -0
- package/dist/chunk-3E2PSU2C.js.map +1 -0
- package/dist/{chunk-L3F43VPB.js → chunk-4GLYY4NN.js} +2 -2
- package/dist/{chunk-L3F43VPB.js.map → chunk-4GLYY4NN.js.map} +1 -1
- package/dist/{chunk-L3PDU3XN.js → chunk-4UOE5TUZ.js} +4 -4
- package/dist/{chunk-6SNHU3CY.js → chunk-66OJ3WB4.js} +2 -2
- package/dist/chunk-6KONMXQ6.js +297 -0
- package/dist/chunk-6KONMXQ6.js.map +1 -0
- package/dist/chunk-6PMVAAA7.js +196 -0
- package/dist/chunk-6PMVAAA7.js.map +1 -0
- package/dist/chunk-766ASQWE.js +32620 -0
- package/dist/chunk-766ASQWE.js.map +1 -0
- package/dist/chunk-7WQO5J2M.js +29 -0
- package/dist/chunk-7WQO5J2M.js.map +1 -0
- package/dist/chunk-APHSRMBS.js +148 -0
- package/dist/chunk-APHSRMBS.js.map +1 -0
- package/dist/{chunk-4LVWXUNC.js → chunk-AYUKPTSM.js} +57 -39
- package/dist/chunk-AYUKPTSM.js.map +1 -0
- package/dist/chunk-BIPYADGB.js +84 -0
- package/dist/chunk-BIPYADGB.js.map +1 -0
- package/dist/chunk-BRBWNV65.js +457 -0
- package/dist/chunk-BRBWNV65.js.map +1 -0
- package/dist/chunk-BXZ6EA52.js +382 -0
- package/dist/chunk-BXZ6EA52.js.map +1 -0
- package/dist/chunk-EVE7MIIY.js +290 -0
- package/dist/chunk-EVE7MIIY.js.map +1 -0
- package/dist/chunk-F3TTNID2.js +138 -0
- package/dist/chunk-F3TTNID2.js.map +1 -0
- package/dist/chunk-H5RQOFO2.js +190 -0
- package/dist/chunk-H5RQOFO2.js.map +1 -0
- package/dist/chunk-HN3F4WSW.js +145 -0
- package/dist/chunk-HN3F4WSW.js.map +1 -0
- package/dist/{chunk-6DRDKB45.js → chunk-I6BDYQIG.js} +20 -9
- package/dist/chunk-I6BDYQIG.js.map +1 -0
- package/dist/chunk-IZJMVV7O.js +347 -0
- package/dist/chunk-IZJMVV7O.js.map +1 -0
- package/dist/chunk-KM22GV7G.js +211 -0
- package/dist/chunk-KM22GV7G.js.map +1 -0
- package/dist/chunk-MGFBLVR7.js +103 -0
- package/dist/chunk-MGFBLVR7.js.map +1 -0
- package/dist/chunk-MQJ2ECQT.js +228 -0
- package/dist/chunk-MQJ2ECQT.js.map +1 -0
- package/dist/{chunk-F6QUZQGI.js → chunk-MXAPLSJ5.js} +2 -2
- package/dist/{chunk-GK3E2I7A.js → chunk-NHMBTUMW.js} +2 -2
- package/dist/chunk-NPRTSZIF.js +131 -0
- package/dist/chunk-NPRTSZIF.js.map +1 -0
- package/dist/chunk-O7IH7JTI.js +1898 -0
- package/dist/chunk-O7IH7JTI.js.map +1 -0
- package/dist/chunk-OCVQGBJK.js +293 -0
- package/dist/chunk-OCVQGBJK.js.map +1 -0
- package/dist/chunk-P6QINGFL.js +332 -0
- package/dist/chunk-P6QINGFL.js.map +1 -0
- package/dist/chunk-PHDZKPNE.js +91 -0
- package/dist/chunk-PHDZKPNE.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-PTGTGXV2.js +164 -0
- package/dist/chunk-PTGTGXV2.js.map +1 -0
- package/dist/chunk-REMIY4U2.js +171 -0
- package/dist/chunk-REMIY4U2.js.map +1 -0
- package/dist/chunk-RZ4YESBG.js +141 -0
- package/dist/chunk-RZ4YESBG.js.map +1 -0
- package/dist/chunk-SAX5MHK4.js +111 -0
- package/dist/chunk-SAX5MHK4.js.map +1 -0
- package/dist/{chunk-GVJVEWHI.js → chunk-SJSUSJ47.js} +2 -2
- package/dist/chunk-SPPMCAKG.js +777 -0
- package/dist/chunk-SPPMCAKG.js.map +1 -0
- package/dist/chunk-SVAPX2XN.js +2441 -0
- package/dist/chunk-SVAPX2XN.js.map +1 -0
- package/dist/chunk-TVEWKIK3.js +452 -0
- package/dist/chunk-TVEWKIK3.js.map +1 -0
- package/dist/{chunk-HH2HBTQM.js → chunk-TYAGMJNV.js} +5 -5
- package/dist/{chunk-JXUP2X7V.js → chunk-VEHFVBLI.js} +2 -2
- package/dist/chunk-VNX5GMTN.js +128 -0
- package/dist/chunk-VNX5GMTN.js.map +1 -0
- package/dist/chunk-VRD5CYRL.js +1568 -0
- package/dist/chunk-VRD5CYRL.js.map +1 -0
- package/dist/chunk-WLUHNG6X.js +122 -0
- package/dist/chunk-WLUHNG6X.js.map +1 -0
- package/dist/chunk-WRAKK6K6.js +265 -0
- package/dist/chunk-WRAKK6K6.js.map +1 -0
- package/dist/chunk-XKYRH4FM.js +681 -0
- package/dist/chunk-XKYRH4FM.js.map +1 -0
- package/dist/{chunk-GUBEEYDW.js → chunk-XMCVRVTF.js} +2 -2
- package/dist/{chunk-GUBEEYDW.js.map → chunk-XMCVRVTF.js.map} +1 -1
- package/dist/chunk-ZLZKF2PM.js +310 -0
- package/dist/chunk-ZLZKF2PM.js.map +1 -0
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/client-ZQSFPMOB.js +21 -0
- package/dist/clipboard-manager-TEO2GEDN.js +24 -0
- package/dist/commands/setup.js +3 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.js +3 -3
- package/dist/commands/status.js +2 -2
- package/dist/commands/stop.js +2 -2
- package/dist/commands/utils.js +2 -2
- package/dist/cron-explain-HHQKPD3M.js +16 -0
- package/dist/crypto-4AP47IKC.js +14 -0
- package/dist/crypto-4AP47IKC.js.map +1 -0
- package/dist/databases-37X4CI2Y.js +21 -0
- package/dist/databases-37X4CI2Y.js.map +1 -0
- package/dist/discord-B3HUPGQ6.js +70 -0
- package/dist/discord-B3HUPGQ6.js.map +1 -0
- package/dist/dist-UISMLMFN.js +21847 -0
- package/dist/dist-UISMLMFN.js.map +1 -0
- package/dist/email-K7LO2IPB.js +268 -0
- package/dist/email-K7LO2IPB.js.map +1 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js +753 -0
- package/dist/enhanced-retrieval-DNLLEM4Z.js.map +1 -0
- package/dist/enrichment-pipeline-MNHNW65K.js +13 -0
- package/dist/enrichment-pipeline-MNHNW65K.js.map +1 -0
- package/dist/entity-resolution-Y3IUWEAT.js +24 -0
- package/dist/entity-resolution-Y3IUWEAT.js.map +1 -0
- package/dist/env-IWXUVTCB.js +12 -0
- package/dist/env-IWXUVTCB.js.map +1 -0
- package/dist/google-workspace-DKWUVNGC.js +169 -0
- package/dist/google-workspace-DKWUVNGC.js.map +1 -0
- package/dist/hash-tool-ULQYD7B5.js +22 -0
- package/dist/hash-tool-ULQYD7B5.js.map +1 -0
- package/dist/heartbeat-monitor-GCISLXI3.js +22 -0
- package/dist/heartbeat-monitor-GCISLXI3.js.map +1 -0
- package/dist/image-generation-OSU7FP6F.js +486 -0
- package/dist/image-generation-OSU7FP6F.js.map +1 -0
- package/dist/imessage-NGA2XF2V.js +35 -0
- package/dist/imessage-NGA2XF2V.js.map +1 -0
- package/dist/inbox-summarizer-NRI4S7IF.js +47 -0
- package/dist/inbox-summarizer-NRI4S7IF.js.map +1 -0
- package/dist/incident-response-C5J7Q6DT.js +244 -0
- package/dist/incident-response-C5J7Q6DT.js.map +1 -0
- package/dist/inventory-manager-352OHXWD.js +24 -0
- package/dist/inventory-manager-352OHXWD.js.map +1 -0
- package/dist/jira-GSGDBMIG.js +199 -0
- package/dist/jira-GSGDBMIG.js.map +1 -0
- package/dist/json-tool-QE2SYHEG.js +26 -0
- package/dist/json-tool-QE2SYHEG.js.map +1 -0
- package/dist/key-rotation-DPHU4ZTB.js +18 -0
- package/dist/key-rotation-DPHU4ZTB.js.map +1 -0
- package/dist/lib.d.ts +603 -11
- package/dist/lib.js +161 -35
- package/dist/lib.js.map +1 -1
- package/dist/mailchimp-KKNF6QJ7.js +152 -0
- package/dist/mailchimp-KKNF6QJ7.js.map +1 -0
- package/dist/matrix-QVHG76I7.js +279 -0
- package/dist/matrix-QVHG76I7.js.map +1 -0
- package/dist/{mcp-LS7Q3Z5W.js → mcp-3JI6W7ZE.js} +3 -3
- package/dist/mcp-3JI6W7ZE.js.map +1 -0
- package/dist/microsoft365-UCBKJHNX.js +164 -0
- package/dist/microsoft365-UCBKJHNX.js.map +1 -0
- package/dist/ocr-AC7NPX33.js +22 -0
- package/dist/ocr-AC7NPX33.js.map +1 -0
- package/dist/ollama-BOAMSPLJ.js +8 -0
- package/dist/ollama-BOAMSPLJ.js.map +1 -0
- package/dist/pages-MI523RB7.js +26 -0
- package/dist/pages-MI523RB7.js.map +1 -0
- package/dist/pair-JDFTERIK.js +24 -0
- package/dist/pair-JDFTERIK.js.map +1 -0
- package/dist/pairing-IFQYCPNS.js +10 -0
- package/dist/pairing-IFQYCPNS.js.map +1 -0
- package/dist/pdf-ALQVOEJR.js +17 -0
- package/dist/pdf-ALQVOEJR.js.map +1 -0
- package/dist/presentations-DSV5IHG5.js +1002 -0
- package/dist/presentations-DSV5IHG5.js.map +1 -0
- package/dist/prometheus-JNT2BD4L.js +10 -0
- package/dist/prometheus-JNT2BD4L.js.map +1 -0
- package/dist/providers-J4LYPHDR.js +19 -0
- package/dist/providers-J4LYPHDR.js.map +1 -0
- package/dist/qr-code-WIX4PB4U.js +16 -0
- package/dist/qr-code-WIX4PB4U.js.map +1 -0
- package/dist/quickbooks-XB4NII2S.js +190 -0
- package/dist/quickbooks-XB4NII2S.js.map +1 -0
- package/dist/regex-tool-W4ABRKGK.js +24 -0
- package/dist/regex-tool-W4ABRKGK.js.map +1 -0
- package/dist/scheduler-VK4WFERV.js +63 -0
- package/dist/scheduler-VK4WFERV.js.map +1 -0
- package/dist/search-BCLBO5E3.js +25 -0
- package/dist/search-BCLBO5E3.js.map +1 -0
- package/dist/sendgrid-RNXCAFKM.js +152 -0
- package/dist/sendgrid-RNXCAFKM.js.map +1 -0
- package/dist/shopify-NCXYJB4R.js +171 -0
- package/dist/shopify-NCXYJB4R.js.map +1 -0
- package/dist/signal-6CGDFYL2.js +35 -0
- package/dist/signal-6CGDFYL2.js.map +1 -0
- package/dist/slack-IZQWIKOH.js +75 -0
- package/dist/slack-IZQWIKOH.js.map +1 -0
- package/dist/sms-M3JIOTCW.js +23 -0
- package/dist/sms-M3JIOTCW.js.map +1 -0
- package/dist/{src-K7GASHRH.js → src-VYUE6LRA.js} +138 -32
- package/dist/src-VYUE6LRA.js.map +1 -0
- package/dist/stocks-XXWBPOCU.js +14 -0
- package/dist/stocks-XXWBPOCU.js.map +1 -0
- package/dist/text-transform-6SGUA5Z4.js +22 -0
- package/dist/text-transform-6SGUA5Z4.js.map +1 -0
- package/dist/tools-2RLEI2N6.js +38 -0
- package/dist/tools-2RLEI2N6.js.map +1 -0
- package/dist/tunnel-IWMXUML4.js +301 -0
- package/dist/tunnel-IWMXUML4.js.map +1 -0
- package/dist/twilio-53GEW5JT.js +139 -0
- package/dist/twilio-53GEW5JT.js.map +1 -0
- package/dist/unit-converter-ZYXMEZOE.js +14 -0
- package/dist/unit-converter-ZYXMEZOE.js.map +1 -0
- package/dist/whatsapp-LFX6YKCM.js +35 -0
- package/dist/whatsapp-LFX6YKCM.js.map +1 -0
- package/dist/word-document-7B6SJMAY.js +902 -0
- package/dist/word-document-7B6SJMAY.js.map +1 -0
- package/dist/xero-QYO66D45.js +162 -0
- package/dist/xero-QYO66D45.js.map +1 -0
- package/dist/zapier-webhook-TBZ5YF2A.js +106 -0
- package/dist/zapier-webhook-TBZ5YF2A.js.map +1 -0
- package/drizzle/0002_mushy_master_mold.sql +140 -0
- package/drizzle/meta/0002_snapshot.json +3637 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +100 -98
- package/dist/bot-KJ26BG56.js +0 -15
- package/dist/chunk-4LVWXUNC.js.map +0 -1
- package/dist/chunk-4TG2IG5K.js +0 -5249
- package/dist/chunk-4TG2IG5K.js.map +0 -1
- package/dist/chunk-6DRDKB45.js.map +0 -1
- package/dist/chunk-CI6Q63MM.js +0 -1613
- package/dist/chunk-CI6Q63MM.js.map +0 -1
- package/dist/chunk-KHNYJY2Z.js +0 -178
- package/dist/chunk-KHNYJY2Z.js.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -17
- package/dist/discord-ZOJFTVTB.js +0 -49
- package/dist/imessage-JFRB6EJ7.js +0 -14
- package/dist/scheduler-EZ7CZMCS.js +0 -42
- package/dist/signal-T3MCSULM.js +0 -14
- package/dist/slack-N2M4FHAJ.js +0 -54
- package/dist/src-K7GASHRH.js.map +0 -1
- package/dist/tools-24GZHYRF.js +0 -16
- package/dist/whatsapp-VCRUPAO5.js +0 -14
- /package/dist/{bot-KJ26BG56.js.map → audit-logger-OBPR7CRO.js.map} +0 -0
- /package/dist/{chunk-NSBPE2FW.js.map → auth-UOX5K2BE.js.map} +0 -0
- /package/dist/{discord-ZOJFTVTB.js.map → backup-restore-PZ7CYYB7.js.map} +0 -0
- /package/dist/{imessage-JFRB6EJ7.js.map → blocks-R3PODY47.js.map} +0 -0
- /package/dist/{mcp-LS7Q3Z5W.js.map → bot-QRARP4UN.js.map} +0 -0
- /package/dist/{scheduler-EZ7CZMCS.js.map → brain-7XLLM3KC.js.map} +0 -0
- /package/dist/{charts-MMXM6BWW.js.map → charts-V7ARZNKF.js.map} +0 -0
- /package/dist/{chunk-L3PDU3XN.js.map → chunk-4UOE5TUZ.js.map} +0 -0
- /package/dist/{chunk-6SNHU3CY.js.map → chunk-66OJ3WB4.js.map} +0 -0
- /package/dist/{chunk-F6QUZQGI.js.map → chunk-MXAPLSJ5.js.map} +0 -0
- /package/dist/{chunk-GK3E2I7A.js.map → chunk-NHMBTUMW.js.map} +0 -0
- /package/dist/{signal-T3MCSULM.js.map → chunk-PLDDJCW6.js.map} +0 -0
- /package/dist/{chunk-GVJVEWHI.js.map → chunk-SJSUSJ47.js.map} +0 -0
- /package/dist/{chunk-HH2HBTQM.js.map → chunk-TYAGMJNV.js.map} +0 -0
- /package/dist/{chunk-JXUP2X7V.js.map → chunk-VEHFVBLI.js.map} +0 -0
- /package/dist/{slack-N2M4FHAJ.js.map → client-ZQSFPMOB.js.map} +0 -0
- /package/dist/{tools-24GZHYRF.js.map → clipboard-manager-TEO2GEDN.js.map} +0 -0
- /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":"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","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":[]}
|