@phosphor-dom/sentinel-ai 0.1.0 → 0.2.0

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 CHANGED
@@ -14,6 +14,7 @@ Sentinel AI is a distributed, event-driven framework for automated security audi
14
14
  - **Risk analysis** — CVSS + EPSS + exploitability scoring
15
15
  - **Plugin system** — extensible with Nmap, Nuclei, Semgrep, Trivy, Gitleaks, ZAP
16
16
  - **Professional reports** — Markdown with executive summary, risk matrix, evidence mapping, remediation plan
17
+ - **CLI + TUI** — interactive dashboard, scan commands, event watcher
17
18
 
18
19
  ## Installation
19
20
 
@@ -21,7 +22,36 @@ Sentinel AI is a distributed, event-driven framework for automated security audi
21
22
  npm install @phosphor-dom/sentinel-ai
22
23
 
23
24
  bun add @phosphor-dom/sentinel-ai
25
+ ```
26
+
27
+ ## CLI Usage
28
+
29
+ ```bash
30
+ # Show help
31
+ sentinel help
32
+
33
+ # Run a security audit
34
+ sentinel scan example.com
35
+ sentinel scan example.com --verbose
36
+ sentinel scan example.com --agents recon,web-security
37
+
38
+ # Interactive TUI dashboard
39
+ sentinel dashboard
24
40
 
41
+ # List available agents
42
+ sentinel agents
43
+
44
+ # Watch live events
45
+ sentinel events
46
+
47
+ # Generate report from last scan
48
+ sentinel report
49
+ sentinel report --output report.md
50
+ ```
51
+
52
+ ## Library Usage
53
+
54
+ ```typescript
25
55
  import { SentinelOrchestrator } from "@phosphor-dom/sentinel-ai"
26
56
  import { EventBus } from "@phosphor-dom/sentinel-ai/core/event-bus"
27
57
  import { MemoryManager } from "@phosphor-dom/sentinel-ai/core/memory-manager"
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/cli/index.js"
@@ -0,0 +1,2 @@
1
+ export declare function agentsCommand(action: string | undefined): Promise<void>;
2
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agents.ts"],"names":[],"mappings":"AAaA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,iBAS7D"}
@@ -0,0 +1,22 @@
1
+ import { statusIcon } from "../utils/format";
2
+ const AGENTS = [
3
+ { name: "orchestrator", capability: "Orchestration & planning", status: "idle" },
4
+ { name: "sentinel-recon", capability: "DNS, WHOIS, subdomains, fingerprinting", status: "idle" },
5
+ { name: "sentinel-infrastructure", capability: "Ports, TLS, certificates, misconfigs", status: "idle" },
6
+ { name: "sentinel-web-security", capability: "OWASP Top 10, HTTP, JWT, APIs", status: "idle" },
7
+ { name: "sentinel-code-audit", capability: "SAST, secrets, dependencies, IaC", status: "idle" },
8
+ { name: "sentinel-cve-intelligence", capability: "CVE/CWE/CVSS/EPSS correlation", status: "idle" },
9
+ { name: "sentinel-threat-modeling", capability: "STRIDE, attack trees, risk scoring", status: "idle" },
10
+ { name: "sentinel-report", capability: "Professional report generation (MD)", status: "idle" },
11
+ ];
12
+ export async function agentsCommand(action) {
13
+ if (action === "list" || !action) {
14
+ process.stdout.write(`\n ${"Agent".padEnd(28)} ${"Status".padEnd(10)} Capability\n`);
15
+ process.stdout.write(` ${"\u2500".repeat(72)}\n`);
16
+ for (const agent of AGENTS) {
17
+ process.stdout.write(` ${statusIcon(agent.status)} ${agent.name.padEnd(25)} ${agent.status.padEnd(10)} ${agent.capability}\n`);
18
+ }
19
+ process.stdout.write("\n");
20
+ }
21
+ }
22
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/cli/commands/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,MAAM,GAAG;IACb,EAAE,IAAI,EAAE,cAAc,EAAS,UAAU,EAAE,0BAA0B,EAAmB,MAAM,EAAE,MAAM,EAAE;IACxG,EAAE,IAAI,EAAE,gBAAgB,EAAa,UAAU,EAAE,wCAAwC,EAAG,MAAM,EAAE,MAAM,EAAE;IAC5G,EAAE,IAAI,EAAE,yBAAyB,EAAI,UAAU,EAAE,sCAAsC,EAAI,MAAM,EAAE,MAAM,EAAE;IAC3G,EAAE,IAAI,EAAE,uBAAuB,EAAM,UAAU,EAAE,+BAA+B,EAAW,MAAM,EAAE,MAAM,EAAE;IAC3G,EAAE,IAAI,EAAE,qBAAqB,EAAQ,UAAU,EAAE,kCAAkC,EAAQ,MAAM,EAAE,MAAM,EAAE;IAC3G,EAAE,IAAI,EAAE,2BAA2B,EAAE,UAAU,EAAE,+BAA+B,EAAW,MAAM,EAAE,MAAM,EAAE;IAC3G,EAAE,IAAI,EAAE,0BAA0B,EAAG,UAAU,EAAE,oCAAoC,EAAM,MAAM,EAAE,MAAM,EAAE;IAC3G,EAAE,IAAI,EAAE,iBAAiB,EAAY,UAAU,EAAE,qCAAqC,EAAK,MAAM,EAAE,MAAM,EAAE;CAC5G,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA0B;IAC5D,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAA;QACrF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,CAAA;QACjI,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function dashboardCommand(): Promise<void>;
2
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAOA,wBAAsB,gBAAgB,kBAmFrC"}
@@ -0,0 +1,133 @@
1
+ import { EventBus } from "../../core/event-bus";
2
+ import { SentinelOrchestrator } from "../../core/orchestrator";
3
+ import { severityColor, statusIcon, bar, timestamp } from "../utils/format";
4
+ import * as readline from "node:readline";
5
+ let running = true;
6
+ export async function dashboardCommand() {
7
+ const bus = new EventBus();
8
+ const orchestrator = new SentinelOrchestrator();
9
+ const state = {
10
+ agents: new Map(),
11
+ events: [],
12
+ findings: [],
13
+ target: "not started",
14
+ phase: "idle",
15
+ phaseCount: 0,
16
+ phaseComplete: 0,
17
+ };
18
+ const agents_list = [
19
+ "orchestrator", "sentinel-recon", "sentinel-infrastructure",
20
+ "sentinel-web-security", "sentinel-code-audit",
21
+ "sentinel-cve-intelligence", "sentinel-threat-modeling", "sentinel-report",
22
+ ];
23
+ for (const a of agents_list)
24
+ state.agents.set(a, "idle");
25
+ bus.subscribe("AgentStatusChanged", (event) => {
26
+ const p = event.payload;
27
+ state.agents.set(p.agent, p.status);
28
+ draw(state);
29
+ });
30
+ bus.subscribe("*", (event) => {
31
+ const line = `[${timestamp()}] ${event.source} \u2192 ${event.type}`;
32
+ state.events.unshift(line);
33
+ if (state.events.length > 50)
34
+ state.events.pop();
35
+ draw(state);
36
+ });
37
+ bus.subscribe("VulnerabilityDetected", (event) => {
38
+ const p = event.payload;
39
+ state.findings.unshift({ severity: p.severity, title: p.title });
40
+ draw(state);
41
+ });
42
+ bus.subscribe("PlanUpdated", (event) => {
43
+ const p = event.payload;
44
+ state.phaseCount = p.phases.length;
45
+ state.phaseComplete = p.phases.filter((ph) => ph.status === "completed" || ph.status === "failed").length;
46
+ const active = p.phases.find((ph) => ph.status === "active");
47
+ state.phase = active ? active.name : p.status;
48
+ draw(state);
49
+ });
50
+ readline.emitKeypressEvents(process.stdin);
51
+ if (process.stdin.isTTY)
52
+ process.stdin.setRawMode(true);
53
+ process.stdin.on("keypress", (_str, key) => {
54
+ if (key.ctrl && key.name === "c") {
55
+ running = false;
56
+ process.stdin.setRawMode(false);
57
+ process.stdout.write("\n");
58
+ process.exit(0);
59
+ }
60
+ if (key.name === "q") {
61
+ const plan = orchestrator.getPlan();
62
+ if (plan) {
63
+ process.stdout.write("\n");
64
+ for (const f of plan.findings) {
65
+ process.stdout.write(` ${severityColor(f.severity)} ${f.title}\n`);
66
+ }
67
+ process.stdout.write("\n Press any key to return to dashboard...\n");
68
+ process.stdin.once("keypress", () => draw(state));
69
+ }
70
+ }
71
+ });
72
+ process.stdout.write("\x1b[2J");
73
+ draw(state);
74
+ // Start scan in background
75
+ orchestrator.runAudit({
76
+ target: "localhost",
77
+ targetType: "domain",
78
+ }).then((plan) => {
79
+ state.phase = "completed";
80
+ draw(state);
81
+ });
82
+ }
83
+ function draw(state) {
84
+ if (!running)
85
+ return;
86
+ const w = process.stdout.columns || 80;
87
+ const h = process.stdout.rows || 24;
88
+ const sep = "\u2500".repeat(Math.min(w, 80));
89
+ const out = [];
90
+ // Draw header
91
+ if (w >= 40) {
92
+ out.push(sep);
93
+ out.push(" \uD83D\uDD0D SENTINEL SECURITY PLATFORM \u2014 Interactive Dashboard ");
94
+ out.push(sep);
95
+ }
96
+ // Agents panel
97
+ out.push(" AGENTS:");
98
+ const cols = Math.max(1, Math.floor((w - 4) / 20));
99
+ let i = 0;
100
+ for (const [name, status] of state.agents) {
101
+ const icon = statusIcon(status);
102
+ const label = `${icon} ${name.replace("sentinel-", "").slice(0, 12).padEnd(12)} ${status}`;
103
+ if (i > 0 && i % cols === 0)
104
+ out.push("");
105
+ else if (i % cols === 0)
106
+ out.push(` ${label}`);
107
+ else
108
+ out[out.length - 1] += ` ${label}`;
109
+ i++;
110
+ }
111
+ // Events panel
112
+ out.push("");
113
+ out.push(` EVENTS (${state.events.length}):`);
114
+ const maxEvents = Math.max(0, h - out.length - 12);
115
+ for (let i = 0; i < Math.min(state.events.length, maxEvents); i++) {
116
+ out.push(` ${state.events[i].slice(0, w - 4)}`);
117
+ }
118
+ // Findings panel
119
+ out.push("");
120
+ out.push(` FINDINGS (${state.findings.length}):`);
121
+ const maxFindings = Math.max(0, h - out.length - 5);
122
+ for (let i = 0; i < Math.min(state.findings.length, maxFindings); i++) {
123
+ const f = state.findings[i];
124
+ out.push(` ${severityColor(f.severity)} ${f.title.slice(0, w - 16)}`);
125
+ }
126
+ // Status bar
127
+ const pct = state.phaseCount > 0 ? Math.round((state.phaseComplete / state.phaseCount) * 100) : 0;
128
+ out.push("");
129
+ out.push(` Phase: ${state.phase} | Progress: ${bar(pct, 100, 20)} ${pct}% | Ctrl+Q: findings | Ctrl+C: quit`);
130
+ out.push(sep);
131
+ process.stdout.write("\x1b[H" + out.slice(0, h - 1).join("\n") + "\n");
132
+ }
133
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function eventsCommand(options: {
2
+ filter?: string;
3
+ raw?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/events.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,iBA2B9E"}
@@ -0,0 +1,26 @@
1
+ import { EventBus } from "../../core/event-bus";
2
+ import { timestamp } from "../utils/format";
3
+ export async function eventsCommand(options) {
4
+ const bus = new EventBus();
5
+ bus.subscribe("*", (event) => {
6
+ const ts = timestamp();
7
+ const line = options.raw
8
+ ? `[${ts}] ${event.source} -> ${event.target} | ${event.type} | ${JSON.stringify(event.payload)}`
9
+ : ` [${ts}] ${event.source.padEnd(20)} \u2192 ${event.target.padEnd(15)} ${event.type}`;
10
+ process.stdout.write(line + "\n");
11
+ });
12
+ process.stdout.write(" Listening for events... (Ctrl+C to stop)\n\n");
13
+ // Publish a test event to show it works
14
+ bus.publish({
15
+ id: "evt-init",
16
+ timestamp: new Date().toISOString(),
17
+ type: "AgentStatusChanged",
18
+ source: "cli",
19
+ target: "*",
20
+ priority: "low",
21
+ payload: { agent: "cli", status: "listening" },
22
+ });
23
+ // Keep alive
24
+ await new Promise(() => { });
25
+ }
26
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/cli/commands/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAiB,MAAM,iBAAiB,CAAA;AAE1D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA2C;IAC7E,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAA;IAE1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;QACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG;YACtB,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YACjG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAA;QAE1F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAEtE,wCAAwC;IACxC,GAAG,CAAC,OAAO,CAAC;QACV,EAAE,EAAE,UAAU;QACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE;KAC/C,CAAC,CAAA;IAEF,aAAa;IACb,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function reportCommand(options: {
2
+ format?: string;
3
+ output?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAiChF"}
@@ -0,0 +1,34 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { SentinelOrchestrator } from "../../core/orchestrator";
3
+ import { ReportGenerator } from "../../core/report-generator";
4
+ export async function reportCommand(options) {
5
+ const orchestrator = new SentinelOrchestrator();
6
+ const plan = orchestrator.getPlan();
7
+ if (!plan || plan.findings.length === 0) {
8
+ process.stdout.write(" No audit data available. Run `sentinel scan` first.\n");
9
+ return;
10
+ }
11
+ const reportGen = new ReportGenerator();
12
+ const risk = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
13
+ for (const f of plan.findings) {
14
+ const s = f.severity.toLowerCase();
15
+ risk[s] = (risk[s] || 0) + 1;
16
+ }
17
+ const sections = reportGen.standardSections({
18
+ scope: plan.scope.target,
19
+ findings: plan.findings,
20
+ riskMatrix: risk,
21
+ evidence: [],
22
+ cves: [],
23
+ });
24
+ const reports = reportGen.generate(sections);
25
+ const md = reports["md"];
26
+ if (options.output) {
27
+ await writeFile(options.output, md, "utf-8");
28
+ process.stdout.write(` Report written to ${options.output}\n`);
29
+ }
30
+ else {
31
+ process.stdout.write(`\n${md}\n`);
32
+ }
33
+ }
34
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAE7D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA6C;IAC/E,MAAM,YAAY,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,CAAA;IAEnC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAA;QAC/E,OAAM;IACR,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAA;IACvC,MAAM,IAAI,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IACzF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;QAClC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC;QAC1C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;QACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,EAAE;KACT,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAExB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;QAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAA;IACjE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function scanCommand(target: string, options: {
2
+ type?: string;
3
+ description?: string;
4
+ agents?: string[];
5
+ verbose?: boolean;
6
+ }): Promise<import("../../core/orchestrator").AuditPlan>;
7
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,wDAiDvI"}
@@ -0,0 +1,53 @@
1
+ import { SentinelOrchestrator } from "../../core/orchestrator";
2
+ import { severityColor, statusIcon } from "../utils/format";
3
+ export async function scanCommand(target, options) {
4
+ const scope = {
5
+ target,
6
+ targetType: options.type || detectTargetType(target),
7
+ description: options.description || `Security audit of ${target}`,
8
+ agents: options.agents,
9
+ };
10
+ let findingsCount = 0;
11
+ const reported = new Set();
12
+ const orchestrator = new SentinelOrchestrator();
13
+ orchestrator.bus.subscribe("PlanUpdated", (event) => {
14
+ const plan = event.payload;
15
+ const activePhase = plan.phases.find((p) => p.status === "active");
16
+ if (activePhase) {
17
+ process.stdout.write(`\r ${statusIcon("active")} Phase: ${activePhase.name.padEnd(20)}`);
18
+ }
19
+ for (const phase of plan.phases) {
20
+ if ((phase.status === "completed" || phase.status === "failed") && !reported.has(phase.name)) {
21
+ reported.add(phase.name);
22
+ process.stdout.write(`\n ${statusIcon(phase.status)} ${phase.name}`);
23
+ }
24
+ }
25
+ });
26
+ orchestrator.bus.subscribe("VulnerabilityDetected", () => {
27
+ findingsCount++;
28
+ });
29
+ process.stdout.write(`\n ${statusIcon("active")} Starting audit of ${target}...\n\n`);
30
+ const plan = await orchestrator.runAudit(scope);
31
+ process.stdout.write(`\n\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n`);
32
+ process.stdout.write(` Plan: ${plan.id.slice(0, 8)}...\n`);
33
+ process.stdout.write(` Status: ${statusIcon(plan.status)} ${plan.status}\n`);
34
+ process.stdout.write(` Phases: ${plan.phases.length}\n`);
35
+ process.stdout.write(` Findings: ${findingsCount}\n`);
36
+ if (plan.findings.length > 0) {
37
+ process.stdout.write(`\n Findings:\n`);
38
+ for (const finding of plan.findings) {
39
+ process.stdout.write(` ${severityColor(finding.severity)} ${finding.title}\n`);
40
+ }
41
+ }
42
+ return plan;
43
+ }
44
+ function detectTargetType(target) {
45
+ if (target.startsWith("http://") || target.startsWith("https://"))
46
+ return "url";
47
+ if (target.includes("/") || target.endsWith(".git"))
48
+ return "repository";
49
+ if (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(target))
50
+ return "ip";
51
+ return "domain";
52
+ }
53
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,OAAsF;IACtI,MAAM,KAAK,GAAe;QACxB,MAAM;QACN,UAAU,EAAG,OAAO,CAAC,IAAiC,IAAI,gBAAgB,CAAC,MAAM,CAAC;QAClF,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,qBAAqB,MAAM,EAAE;QACjE,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAA;IAED,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAElC,MAAM,YAAY,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAE/C,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAyF,CAAA;QAC5G,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;QAClE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,QAAQ,CAAC,WAAW,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3F,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7F,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YACvE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACvD,aAAa,EAAE,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,QAAQ,CAAC,sBAAsB,MAAM,SAAS,CAAC,CAAA;IAEtF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gQAAgQ,CAAC,CAAA;IACtR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;IAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAA;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,aAAa,IAAI,CAAC,CAAA;IAEtD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACvC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAA;IAC/E,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,YAAY,CAAA;IACxE,IAAI,sCAAsC,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IACpE,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import { scanCommand } from "./commands/scan";
2
+ import { reportCommand } from "./commands/report";
3
+ import { dashboardCommand } from "./commands/dashboard";
4
+ import { agentsCommand } from "./commands/agents";
5
+ import { eventsCommand } from "./commands/events";
6
+ const HELP = ` Sentinel Security Platform — CLI v0.2.0
7
+
8
+ USAGE
9
+ sentinel <command> [options]
10
+
11
+ COMMANDS
12
+ scan <target> Run a security audit
13
+ report Generate report from last scan
14
+ dashboard Interactive TUI dashboard
15
+ agents List available agents
16
+ events Watch live event stream
17
+ help Show this help
18
+
19
+ OPTIONS
20
+ --type <type> Target type: domain | ip | url | repository
21
+ --agents <list> Comma-separated agent names to run
22
+ --output <file> Write output to file
23
+ --format <fmt> Output format: markdown | json
24
+ --verbose Show detailed event output
25
+ --raw Raw event output (for piping)
26
+ `;
27
+ async function main() {
28
+ const args = process.argv.slice(2);
29
+ if (args.length === 0 || args[0] === "help" || args[0] === "--help") {
30
+ process.stdout.write(HELP);
31
+ return;
32
+ }
33
+ const cmd = args[0];
34
+ const rest = args.slice(1);
35
+ function parseOptions(args) {
36
+ const opts = {};
37
+ for (let i = 0; i < args.length; i++) {
38
+ if (args[i].startsWith("--")) {
39
+ const key = args[i].slice(2);
40
+ if (key === "agents") {
41
+ opts[key] = args[++i]?.split(",").map((s) => s.trim()) || [];
42
+ }
43
+ else if (args[i + 1] && !args[i + 1].startsWith("--")) {
44
+ opts[key] = args[++i];
45
+ }
46
+ else {
47
+ opts[key] = true;
48
+ }
49
+ }
50
+ }
51
+ return opts;
52
+ }
53
+ switch (cmd) {
54
+ case "scan": {
55
+ const target = rest[0];
56
+ if (!target) {
57
+ process.stdout.write(" Error: target required. Usage: sentinel scan <target>\n");
58
+ return;
59
+ }
60
+ const opts = parseOptions(rest.slice(1));
61
+ await scanCommand(target, {
62
+ type: opts.type,
63
+ description: opts.description,
64
+ agents: opts.agents,
65
+ verbose: !!opts.verbose,
66
+ });
67
+ break;
68
+ }
69
+ case "report": {
70
+ const opts = parseOptions(rest);
71
+ await reportCommand({
72
+ format: opts.format,
73
+ output: opts.output,
74
+ });
75
+ break;
76
+ }
77
+ case "dashboard": {
78
+ await dashboardCommand();
79
+ break;
80
+ }
81
+ case "agents": {
82
+ const opts = parseOptions(rest);
83
+ await agentsCommand(rest[0]);
84
+ break;
85
+ }
86
+ case "events": {
87
+ const opts = parseOptions(rest);
88
+ await eventsCommand({
89
+ filter: opts.filter,
90
+ raw: !!opts.raw,
91
+ });
92
+ break;
93
+ }
94
+ default:
95
+ process.stdout.write(` Unknown command: ${cmd}\n${HELP}`);
96
+ }
97
+ }
98
+ main().catch((err) => {
99
+ process.stderr.write(` Error: ${err.message}\n`);
100
+ process.exit(1);
101
+ });
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function severityColor(severity: string): string;
2
+ export declare function statusIcon(status: string): string;
3
+ export declare function bar(value: number, max: number, width?: number): string;
4
+ export declare function timestamp(): string;
5
+ export declare function truncate(s: string, max?: number): string;
6
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/format.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAStD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAMlE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAGpD"}
@@ -0,0 +1,39 @@
1
+ export function severityColor(severity) {
2
+ switch (severity.toLowerCase()) {
3
+ case "critical": return "\x1b[1;41mCRITICAL\x1b[0m";
4
+ case "high": return "\x1b[1;31mHIGH \x1b[0m";
5
+ case "medium": return "\x1b[1;33mMEDIUM \x1b[0m";
6
+ case "low": return "\x1b[1;34mLOW \x1b[0m";
7
+ case "info": return "\x1b[1;37mINFO \x1b[0m";
8
+ default: return `\x1b[1;37m${severity.padEnd(8)}\x1b[0m`;
9
+ }
10
+ }
11
+ export function statusIcon(status) {
12
+ switch (status) {
13
+ case "completed": return "\u2705";
14
+ case "failed": return "\u274C";
15
+ case "active": return "\u23F3";
16
+ case "pending": return "\u2B1C";
17
+ case "idle": return "\u2B1C";
18
+ case "busy": return "\u23F3";
19
+ case "error": return "\u274C";
20
+ case "offline": return "\u26D4";
21
+ default: return "\u2753";
22
+ }
23
+ }
24
+ export function bar(value, max, width = 20) {
25
+ const filled = Math.round((value / max) * width);
26
+ const empty = width - filled;
27
+ const filledChar = "\u2588";
28
+ const emptyChar = "\u2591";
29
+ return filledChar.repeat(filled) + emptyChar.repeat(empty);
30
+ }
31
+ export function timestamp() {
32
+ return new Date().toLocaleTimeString("en-US", { hour12: false });
33
+ }
34
+ export function truncate(s, max = 60) {
35
+ if (s.length <= max)
36
+ return s;
37
+ return s.slice(0, max - 3) + "...";
38
+ }
39
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/utils/format.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/B,KAAK,UAAU,CAAC,CAAC,OAAO,2BAA2B,CAAA;QACnD,KAAK,MAAM,CAAC,CAAK,OAAO,2BAA2B,CAAA;QACnD,KAAK,QAAQ,CAAC,CAAG,OAAO,2BAA2B,CAAA;QACnD,KAAK,KAAK,CAAC,CAAM,OAAO,2BAA2B,CAAA;QACnD,KAAK,MAAM,CAAC,CAAK,OAAO,2BAA2B,CAAA;QACnD,OAAO,CAAC,CAAS,OAAO,aAAa,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW,CAAC,CAAC,OAAO,QAAQ,CAAA;QACjC,KAAK,QAAQ,CAAC,CAAI,OAAO,QAAQ,CAAA;QACjC,KAAK,QAAQ,CAAC,CAAI,OAAO,QAAQ,CAAA;QACjC,KAAK,SAAS,CAAC,CAAG,OAAO,QAAQ,CAAA;QACjC,KAAK,MAAM,CAAC,CAAM,OAAO,QAAQ,CAAA;QACjC,KAAK,MAAM,CAAC,CAAM,OAAO,QAAQ,CAAA;QACjC,KAAK,OAAO,CAAC,CAAK,OAAO,QAAQ,CAAA;QACjC,KAAK,SAAS,CAAC,CAAG,OAAO,QAAQ,CAAA;QACjC,OAAO,CAAC,CAAU,OAAO,QAAQ,CAAA;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,KAAK,GAAG,EAAE;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;IAChD,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;IAC5B,MAAM,UAAU,GAAG,QAAQ,CAAA;IAC3B,MAAM,SAAS,GAAG,QAAQ,CAAA;IAC1B,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,GAAG,GAAG,EAAE;IAC1C,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;AACpC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@phosphor-dom/sentinel-ai",
4
- "version": "0.1.0",
4
+ "version": "0.2.0",
5
5
  "description": "Sentinel Security Platform — AI-powered multi-agent security engineering framework",
6
6
  "type": "module",
7
7
  "license": "MIT",
@@ -24,6 +24,9 @@
24
24
  "build": "tsc",
25
25
  "typecheck": "tsc --noEmit"
26
26
  },
27
+ "bin": {
28
+ "sentinel": "./bin/sentinel.js"
29
+ },
27
30
  "main": "./dist/index.js",
28
31
  "types": "./dist/index.d.ts",
29
32
  "exports": {
@@ -33,6 +36,7 @@
33
36
  },
34
37
  "files": [
35
38
  "dist/",
39
+ "bin/",
36
40
  "README.md",
37
41
  "LICENSE"
38
42
  ],