@phosphor-dom/sentinel-ai 0.1.0 → 0.3.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.
Files changed (71) hide show
  1. package/README.md +71 -0
  2. package/bin/sentinel.js +2 -0
  3. package/dist/cli/commands/agents.d.ts +2 -0
  4. package/dist/cli/commands/agents.d.ts.map +1 -0
  5. package/dist/cli/commands/agents.js +22 -0
  6. package/dist/cli/commands/agents.js.map +1 -0
  7. package/dist/cli/commands/dashboard.d.ts +2 -0
  8. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  9. package/dist/cli/commands/dashboard.js +133 -0
  10. package/dist/cli/commands/dashboard.js.map +1 -0
  11. package/dist/cli/commands/events.d.ts +5 -0
  12. package/dist/cli/commands/events.d.ts.map +1 -0
  13. package/dist/cli/commands/events.js +26 -0
  14. package/dist/cli/commands/events.js.map +1 -0
  15. package/dist/cli/commands/report.d.ts +5 -0
  16. package/dist/cli/commands/report.d.ts.map +1 -0
  17. package/dist/cli/commands/report.js +34 -0
  18. package/dist/cli/commands/report.js.map +1 -0
  19. package/dist/cli/commands/scan.d.ts +7 -0
  20. package/dist/cli/commands/scan.d.ts.map +1 -0
  21. package/dist/cli/commands/scan.js +53 -0
  22. package/dist/cli/commands/scan.js.map +1 -0
  23. package/dist/cli/index.d.ts +2 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +102 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/utils/format.d.ts +6 -0
  28. package/dist/cli/utils/format.d.ts.map +1 -0
  29. package/dist/cli/utils/format.js +39 -0
  30. package/dist/cli/utils/format.js.map +1 -0
  31. package/dist/index.d.ts +4 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +4 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/mcp/client.d.ts +10 -0
  36. package/dist/mcp/client.d.ts.map +1 -0
  37. package/dist/mcp/client.js +50 -0
  38. package/dist/mcp/client.js.map +1 -0
  39. package/dist/mcp/index.d.ts +7 -0
  40. package/dist/mcp/index.d.ts.map +1 -0
  41. package/dist/mcp/index.js +11 -0
  42. package/dist/mcp/index.js.map +1 -0
  43. package/dist/mcp/server.d.ts +10 -0
  44. package/dist/mcp/server.d.ts.map +1 -0
  45. package/dist/mcp/server.js +28 -0
  46. package/dist/mcp/server.js.map +1 -0
  47. package/dist/mcp/tools.d.ts +8 -0
  48. package/dist/mcp/tools.d.ts.map +1 -0
  49. package/dist/mcp/tools.js +106 -0
  50. package/dist/mcp/tools.js.map +1 -0
  51. package/dist/mcp/types.d.ts +41 -0
  52. package/dist/mcp/types.d.ts.map +1 -0
  53. package/dist/mcp/types.js +2 -0
  54. package/dist/mcp/types.js.map +1 -0
  55. package/dist/skills/builtins.d.ts +3 -0
  56. package/dist/skills/builtins.d.ts.map +1 -0
  57. package/dist/skills/builtins.js +312 -0
  58. package/dist/skills/builtins.js.map +1 -0
  59. package/dist/skills/index.d.ts +5 -0
  60. package/dist/skills/index.d.ts.map +1 -0
  61. package/dist/skills/index.js +6 -0
  62. package/dist/skills/index.js.map +1 -0
  63. package/dist/skills/registry.d.ts +19 -0
  64. package/dist/skills/registry.d.ts.map +1 -0
  65. package/dist/skills/registry.js +72 -0
  66. package/dist/skills/registry.js.map +1 -0
  67. package/dist/skills/types.d.ts +25 -0
  68. package/dist/skills/types.d.ts.map +1 -0
  69. package/dist/skills/types.js +2 -0
  70. package/dist/skills/types.js.map +1 -0
  71. package/package.json +8 -2
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
40
+
41
+ # List available agents
42
+ sentinel agents
24
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"
@@ -106,6 +136,47 @@ plugins.register({
106
136
  const result = await plugins.execute("nmap", { target_ip: "10.0.0.1" })
107
137
  ```
108
138
 
139
+ ## Design Documents
140
+
141
+ Architecture and design docs available in `docs/`:
142
+
143
+ | Document | Content |
144
+ |----------|---------|
145
+ | `ARCHITECTURE.md` | System overview, agent hierarchy, execution flow (Mermaid) |
146
+ | `AGENT_FLOW.md` | Communication protocol, state machine, capability matrix |
147
+ | `EVENT_SYSTEM.md` | Event structure, categories, priority queues |
148
+ | `SKILL_SYSTEM.md` | Skill structure, registry, all 24 integrated skills |
149
+ | `MCP_INTEGRATION.md` | MCP layer, tool definitions, server config, execution flow |
150
+
151
+ ## Integrated Skills (24)
152
+
153
+ ```typescript
154
+ import { SkillRegistry } from "@phosphor-dom/sentinel-ai/skills"
155
+ const registry = new SkillRegistry()
156
+ registry.list().forEach((s) => console.log(s.name, s.capabilities))
157
+ const dns = registry.findByCapability("dns")
158
+ const manifest = registry.generateManifest()
159
+ ```
160
+
161
+ | Category | Skills | Count |
162
+ |----------|--------|-------|
163
+ | Core | event-bus, provider-abstraction, memory-manager, inter-agent-communication | 4 |
164
+ | Agents | orchestrator, recon, infrastructure, web-security, code-audit, cve-intelligence, threat-modeling, report | 8 |
165
+ | Analysis | context-compression, correlation-engine, evidence-manager, risk-analysis | 4 |
166
+ | Integration | plugin-manager, knowledge-base, vector-db | 3 |
167
+ | Operations | model-router, failover-manager, token-optimizer, distributed-agents, observability | 5 |
168
+
169
+ ## MCP Integration
170
+
171
+ ```typescript
172
+ import { MCPServer, createMCPServer } from "@phosphor-dom/sentinel-ai/mcp"
173
+
174
+ const server = createMCPServer()
175
+ const result = await server.call({ tool: "dns_lookup", args: { domain: "example.com" } })
176
+ ```
177
+
178
+ Built-in MCP tools: `dns_lookup`, `whois_query`, `subdomain_discover`, `port_scan`, `tls_analyze`, `http_scan`, `jwt_decode`, `sast_scan`, `secret_scan`, `cve_lookup`, `epss_query`.
179
+
109
180
  ## License
110
181
 
111
182
  MIT
@@ -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":"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"}
@@ -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.3.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/dist/index.d.ts CHANGED
@@ -20,4 +20,8 @@ export type { RiskScore } from "./core/risk-analysis";
20
20
  export type { PluginManifest, PluginResult } from "./core/plugin-manager";
21
21
  export type { ReportConfig, ReportSection } from "./core/report-generator";
22
22
  export type { KbEntry, KbEnrichment } from "./core/knowledge-base";
23
+ export { SkillRegistry } from "./skills";
24
+ export type { SkillDefinition, SkillOperation, SkillManifest, SkillCategory } from "./skills";
25
+ export { MCPServer, MCPClient, registerAllTools, createMCPServer } from "./mcp";
26
+ export type { MCPToolDef, MCPCallRequest, MCPCallResult, MCPServerConfig, MCPTransport } from "./mcp";
23
27
  //# sourceMappingURL=index.d.ts.map