Promised automation. Kept alive by manpower.
Traditional SOARs promise to free your SOC team, but end up requiring professional consultants and a dedicated team of engineers just to keep the playbooks running.
Evolutionary SOAR where AI agents actually DO the work — from investigation to response.
What's at stake.
SoSafe 2025 Cybercrime TrendsCrowdStrike Global Threat ReportGoogle Cloud Cybersecurity ForecastECSO Cybersecurity Market AnalysisarXiv:2505.23397Verizon DBIR 2023Orca Security 2022 Alert Fatigue ReportGartner ITSM Hype Cycle
The human-factor crisis: thin AI integration, expertise shortages, and overloaded SOC teams lead to critical errors — missed threats, mis-prioritization, and lost incidents that leave the business exposed.
Smart automation that can counter AI at equal speed — and deliver peak SOC-team efficiency — is no longer optional.
The state we're in.
Traditional SOARs promise to free your SOC team, but end up requiring professional consultants and a dedicated team of engineers just to keep the playbooks running.
Instead of focusing on real threats, your team burns endless hours fixing broken integrations and building complex playbooks. AI is limited to advice you have to double-check, or trivial operations — never the high-quality work you actually need done.
Legacy SOAR is a heavy engineering toolkit that drains more resources maintaining itself than it ever saves the SOC.
See a smarter way to automateThe solution
Where AI agents orchestrate the entire workflow — from investigation to response — saving your SOC team countless working hours.
Simple control: set tasks and kick off processes in plain language. The built-in AI assistant reads the context and recommends the move — your automation carries it out in seconds.
Integrate your security stack in minutes: just tell the AI what to connect — EDR, identity, threat intel, messaging — and it sets up the connections for you.
You design the processes, and the AI builds the playbooks that automatically analyze alerts, classify threats, and coordinate actions.
Isolate hosts, block IOCs, and notify your team in seconds — only the actions you chose to automate.
Build your own security workflows. Lunsight provides flexible building blocks, letting you automate your way. AI analyzes and recommends solutions, but control and execution remain entirely in your hands.
Example: classify what just fired, then route it.
// triage.ts — Detection-driven auto-triage
//
// A CrowdStrike Falcon detection fires this script. The "security/triage@v3"
// agent READS & enriches only (VirusTotal IOC reputation, CrowdStrike host
// context, M365 identity) and returns a structured verdict. The SCRIPT does
// every write: it upserts/dedups the incident on (vendor, external_id),
// attaches enriched observables, sets severity, and routes — page on-call for
// true positives, auto-close the rest.
import { defineScript, fetchPayload } from "lunex:sdk"
import { agents } from "lunex:ai"
import { incidents } from "lunex:incidents"
import { notify } from "lunex:script/lib/notify"
// The structured verdict the agent submits via its output schema. The agent
// only recommends; it performs no writes.
interface Observable {
type: string
value: string
enrichment?: unknown
}
interface Verdict {
severity: "info" | "low" | "medium" | "high" | "critical"
summary: string
isTruePositive: boolean
observables: Observable[]
}
export default defineScript(async (event) => {
// Pull the full detection record for the agent to reason over.
const detection = await fetchPayload(event)
// (1) The agent enriches (read-only tools) and returns its verdict.
const { output: verdict } = await agents.run<Verdict>("security/triage@v3", {
event,
detection,
})
// (2) The SCRIPT acts on the recommendation — find-or-create, then enrich.
const { incident, created } = await incidents.upsert("crowdstrike", event.composite_id, {
title: event.name,
severity: verdict.severity,
source: { vendor: "crowdstrike", event_type: event.event_type, ref: event.composite_id },
})
for (const obs of verdict.observables) {
await incident.addObservable(obs.type, obs.value, obs.enrichment) // idempotent
}
await incident.comment(`Auto-triage (security/triage@v3): ${verdict.summary}`)
await incident.attachRun() // link this run for the audit trail
// (3) Route: page on-call for high-severity true positives, else close benign.
if (verdict.isTruePositive && (verdict.severity === "high" || verdict.severity === "critical")) {
await notify(`🚨 ${verdict.severity.toUpperCase()} — ${event.name}\n${verdict.summary}`)
} else if (!verdict.isTruePositive) {
await incident.resolve("false_positive")
}
console.log(`Incident ${incident.id} ${created ? "created" : "updated"} (severity=${verdict.severity})`)
}) Example: an Agent System digs deeper across sources.
// investigation.ts — Agent-system deep investigation of a flagged incident
//
// A flagged incident (e.g. routed here by triage) runs this script. It calls an
// Agent System orchestrator ("soc/investigation@v2"). The orchestrator fans out
// to member agents that run in PARALLEL — IOC reputation (VirusTotal), host
// context (CrowdStrike), identity & sign-ins (M365) — aggregates their findings,
// and returns a structured assessment. The SCRIPT then records the investigation
// on the incident and pivots on shared IOCs to correlate related cases. The
// analyst works the case in the UI afterwards.
import { defineScript } from "lunex:sdk"
import { systems } from "lunex:ai"
import { incidents, observables } from "lunex:incidents"
// Aggregated output the orchestrator submits via the system's output schema.
interface EnrichedObservable {
type: string
value: string
verdict: string
findings?: unknown
}
interface Investigation {
summary: string
riskScore: number // 0–100, aggregated across member agents
observables: EnrichedObservable[]
}
export default defineScript(async (event) => {
// The flagged incident id arrives on the triggering event; load the handle.
const incident = await incidents.get(event.incident_id)
// Run the orchestrator. Member sub-agents run in parallel server-side and are
// correlated to this system run; the script only sees the aggregated output.
const { output: result, run_id } = await systems.run<Investigation>("soc/investigation@v2", {
incident: { id: incident.id, title: incident.title, severity: incident.severity },
})
// Record the investigation on the incident: attach enriched observables, drop
// a timeline comment, and link this run.
for (const obs of result.observables) {
await incident.addObservable(obs.type, obs.value, { verdict: obs.verdict, findings: obs.findings })
}
await incident.comment(`Investigation (soc/investigation@v2, run ${run_id}) — risk ${result.riskScore}/100\n${result.summary}`)
await incident.attachRun()
// Pivot on each shared IOC to surface related incidents, then note the
// correlations on the timeline for the analyst.
const related = new Set<string>()
for (const obs of result.observables) {
const hits = await observables.findIncidents(obs.type, obs.value)
for (const h of hits) if (h.id !== incident.id) related.add(h.id)
}
if (related.size > 0) {
await incident.comment(`Correlated ${related.size} related incident(s) via shared IOCs: ${[...related].join(", ")}`)
}
// Hand the enriched case to the analyst.
if (incident.status === "new") await incident.setStatus("in_progress")
console.log(`Investigation recorded on ${incident.id}; ${related.size} related, risk ${result.riskScore}`)
}) Example: the AI proposes the call — your automation carries it out.
// response.ts — Approval-gated remediation for a confirmed true positive
//
// A high-severity true-positive verdict runs this script (the AI recommended
// upstream; every action below is the SCRIPT's). It reads the response plan from
// storage, gates on an on-call approval, then remediates step by step — contain
// the host (CrowdStrike EDR isolation), disable the user + revoke sign-in
// sessions (M365 / Entra ID), and notify the team — then updates and resolves
// the incident. There is NO block-IOC step.
import { defineScript } from "lunex:sdk"
import { kv } from "lunex:storage"
import { incidents } from "lunex:incidents"
import { crowdstrike, microsoft365 } from "lunex:integrations"
import { waitForApproval } from "lunex:script/lib/approve"
import { notify } from "lunex:script/lib/notify"
interface ResponsePlan {
deviceIds: string[] // CrowdStrike device ids to isolate
userUpns: string[] // Entra ID users to disable + revoke
}
export default defineScript(async (event) => {
const incident = await incidents.get(event.incident_id)
const plan = await kv.get<ResponsePlan>(`response/plan/${incident.id}`)
if (!plan) return
// Approval gate: block until an on-call engineer approves containment.
const approved = await waitForApproval(incident.id)
if (!approved) {
await incident.comment("Containment not approved — no action taken.")
return
}
// Remediate step by step — contain hosts, disable + revoke users, notify team.
const containment = await crowdstrike.containHost(plan.deviceIds) // ActionResult[] { id, success, error }
for (const upn of plan.userUpns) {
await microsoft365.disableUser(upn)
await microsoft365.revokeSignInSessions(upn)
}
await notify(`🛡️ Remediating ${incident.id}: isolated ${plan.deviceIds.length} host(s), disabled ${plan.userUpns.length} user(s).`)
const isolated = containment.filter((r) => r.success).map((r) => r.id)
// Update + resolve the incident as a remediated true positive.
await incident.comment(`Remediated: isolated host(s) ${isolated.join(", ") || "none"}; disabled ${plan.userUpns.join(", ")}.`)
await incident.resolve("true_positive")
console.log(`Incident ${incident.id} remediated and resolved (${isolated.length} hosts isolated)`)
}) Illustration only — there's no visual mode on the platform. Every flow is written in code (see the Code tab).
AI is the core of the platform, not an external add-on.
The script format lets you extend functionality without limits in code, adapting your defenses to any change in the infrastructure.
With no block editor to keep in sync with the code, sync errors are impossible — saving your engineers hundreds of hours.
Critical actions and generated code go through cross-validation and human verification.
Agents operate strictly within the boundaries you set — no unsanctioned moves in critical infrastructure.
You get the speed of AI and keep 100% of the control.
The AI assistant builds reports in seconds on your command — MTTR, alert volume, agent activity — with no Excel sheets at all. Ready-made dashboards plus a data layer for building your own reports.
Lunsight runs in the cloud and integrates with the systems you already have — cloud services and on-prem deployments alike.
Your zeroth teammate.
Your personal AI assistant, integrated into the core of the system. She holds the context, can run every function of the platform, and fully covers the technical routine 24/7/365.
Build a playbook: phishing ticket in, classify, enrich, route to L1 or L2.
Drafted. Five steps, two branches. Open phishing-triage.ts to review.
Why is step 03 returning empty?
That action calls an integration that isn't connected on this tenant. Connect it, or drop in a stub for testing?
How do I version this playbook?
Every save is a version. Open History from the editor — diff, roll back, restore.
Traditional SOAR vs. Lunsight
Integrates with
and many more connect anything via code
Get Early Access