@pensar/apex 0.0.109 → 0.0.110-canary.f2a52b35
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 +57 -23
- package/build/auth.js +1 -1
- package/build/index.js +33 -13
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
<h1 align="center">Pensar Apex</h1>
|
|
2
2
|
|
|
3
|
-
<p align="center">AI-powered penetration testing
|
|
3
|
+
<p align="center">AI-powered penetration testing using an AI agent to perform comprehensive blackbox and whitebox pentesting - directly in your terminal.
|
|
4
|
+
</p>
|
|
5
|
+
|
|
6
|
+
<p align="center">
|
|
7
|
+
Want to run from the cloud or integrate it with your CI/CD? See <a href="https://docs.pensar.dev/console">Pensar Console</a>.
|
|
4
8
|
</p>
|
|
5
9
|
|
|
6
10
|
<p align="center">
|
|
@@ -12,9 +16,57 @@
|
|
|
12
16
|
<a href="https://discord.gg/pensar"><img src="https://img.shields.io/badge/Discord-Join%20Us-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
|
|
13
17
|
</p>
|
|
14
18
|
|
|
15
|
-
<p align="center">
|
|
19
|
+
<!-- <p align="center">
|
|
16
20
|
<img src="screenshot.png" alt="Pensar Apex Screenshot" width="800">
|
|
17
|
-
</p>
|
|
21
|
+
</p> -->
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
## Use Cases
|
|
25
|
+
|
|
26
|
+
Apex enables both developers and security professionals to run autonomous and assisted penetration testing directly from the terminal.
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Developers: Run a Pentest in Minutes
|
|
30
|
+
|
|
31
|
+
Apex makes it easy for developers to run a real penetration test without needing deep offensive security expertise.
|
|
32
|
+
|
|
33
|
+
Using the autonomous `/pentest` mode, Apex will perform reconnaissance, attack surface discovery, vulnerability testing, and exploitation attempts automatically.
|
|
34
|
+
|
|
35
|
+
This allows teams to quickly identify security issues before they reach production.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
/pentest
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
- Test a staging environment before deploying
|
|
43
|
+
- Scan a newly launched domain or API
|
|
44
|
+
- Run quick security checks during development
|
|
45
|
+
- Identify exposed services or misconfigurations
|
|
46
|
+
|
|
47
|
+
This is the **fastest way to get real pentesting coverage without becoming a security expert.**
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### Security Engineers: Advanced Operator Workflows
|
|
52
|
+
|
|
53
|
+
Security professionals can use Apex as an **agentic offensive security harness** that orchestrates tools and reasoning workflows.
|
|
54
|
+
|
|
55
|
+
The `/operator` mode allows engineers to work interactively with the Offensive Security Agent, guiding investigations and chaining tools dynamically.
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
/operator
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Examples:
|
|
63
|
+
- Deep investigation of suspicious endpoints
|
|
64
|
+
- Manual exploitation of discovered vulnerabilities
|
|
65
|
+
- Tool orchestration across recon and exploitation phases
|
|
66
|
+
- Validation and reproduction of vulnerabilities
|
|
67
|
+
- Open-source security research / testing
|
|
68
|
+
|
|
69
|
+
This turns Apex into a **terminal-native AI pentesting partner** rather than just a scanner.
|
|
18
70
|
|
|
19
71
|
## Installation
|
|
20
72
|
|
|
@@ -45,17 +97,13 @@ npm install -g @pensar/apex
|
|
|
45
97
|
|
|
46
98
|
## Usage
|
|
47
99
|
|
|
48
|
-
|
|
100
|
+
Open the Apex TUI:
|
|
49
101
|
|
|
50
102
|
```bash
|
|
51
103
|
pensar
|
|
52
104
|
```
|
|
53
105
|
|
|
54
|
-
##
|
|
55
|
-
|
|
56
|
-
Apex supports **OpenAI**, **Anthropic**, **AWS Bedrock**, and **vLLM** (local models). **Anthropic models provide the best performance** and are recommended for optimal results.
|
|
57
|
-
|
|
58
|
-
## Kali Linux Container (Recommended)
|
|
106
|
+
## Kali Linux Container (Optional)
|
|
59
107
|
|
|
60
108
|
For **best performance**, run Apex in the included Kali Linux container with preconfigured pentest tools:
|
|
61
109
|
|
|
@@ -72,20 +120,6 @@ Inside the container, run:
|
|
|
72
120
|
pensar
|
|
73
121
|
```
|
|
74
122
|
|
|
75
|
-
**Note:** On Linux hosts, consider using `network_mode: host` in `docker-compose.yml` for comprehensive network scanning.
|
|
76
|
-
|
|
77
|
-
## vLLM Local Model Support
|
|
78
|
-
|
|
79
|
-
To use a local vLLM server:
|
|
80
|
-
|
|
81
|
-
1. Set the vLLM endpoint:
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
export LOCAL_MODEL_URL="http://localhost:8000/v1"
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
2. In the Apex Models screen, enter your model name in the "Custom local model (vLLM)" input.
|
|
88
|
-
|
|
89
123
|
---
|
|
90
124
|
|
|
91
125
|
### ⚠️ Responsible Use
|
package/build/auth.js
CHANGED
|
@@ -8,7 +8,7 @@ import fs from "fs/promises";
|
|
|
8
8
|
// package.json
|
|
9
9
|
var package_default = {
|
|
10
10
|
name: "@pensar/apex",
|
|
11
|
-
version: "0.0.
|
|
11
|
+
version: "0.0.110-canary.f2a52b35",
|
|
12
12
|
description: "AI-powered penetration testing CLI tool with terminal UI",
|
|
13
13
|
module: "src/tui/index.tsx",
|
|
14
14
|
main: "build/index.js",
|
package/build/index.js
CHANGED
|
@@ -31892,12 +31892,6 @@ var init_pensar = __esm(() => {
|
|
|
31892
31892
|
provider: "pensar",
|
|
31893
31893
|
contextLength: 200000
|
|
31894
31894
|
},
|
|
31895
|
-
{
|
|
31896
|
-
id: "pensar:anthropic.claude-opus-4-1-20250805-v1:0",
|
|
31897
|
-
name: "Claude Opus 4.1 (Pensar)",
|
|
31898
|
-
provider: "pensar",
|
|
31899
|
-
contextLength: 200000
|
|
31900
|
-
},
|
|
31901
31895
|
{
|
|
31902
31896
|
id: "pensar:anthropic.claude-haiku-4-5-20251001-v1:0",
|
|
31903
31897
|
name: "Claude Haiku 4.5 (Pensar)",
|
|
@@ -31977,7 +31971,7 @@ var package_default2;
|
|
|
31977
31971
|
var init_package = __esm(() => {
|
|
31978
31972
|
package_default2 = {
|
|
31979
31973
|
name: "@pensar/apex",
|
|
31980
|
-
version: "0.0.
|
|
31974
|
+
version: "0.0.110-canary.f2a52b35",
|
|
31981
31975
|
description: "AI-powered penetration testing CLI tool with terminal UI",
|
|
31982
31976
|
module: "src/tui/index.tsx",
|
|
31983
31977
|
main: "build/index.js",
|
|
@@ -273281,7 +273275,7 @@ var PROVIDER_PREFERENCE_ORDER = [
|
|
|
273281
273275
|
"bedrock"
|
|
273282
273276
|
];
|
|
273283
273277
|
var PREFERRED_MODEL_BY_PROVIDER = {
|
|
273284
|
-
pensar: "pensar:anthropic.claude-opus-4-
|
|
273278
|
+
pensar: "pensar:anthropic.claude-opus-4-6-v1",
|
|
273285
273279
|
anthropic: "claude-opus-4-6",
|
|
273286
273280
|
openai: "gpt-5.2-pro",
|
|
273287
273281
|
google: "gemini-3.1-pro-preview",
|
|
@@ -279246,7 +279240,9 @@ function AuthFlow({ onClose }) {
|
|
|
279246
279240
|
const { colors: colors2 } = useTheme();
|
|
279247
279241
|
const appConfig = useConfig();
|
|
279248
279242
|
const alreadyConnected = isConnected(appConfig.data);
|
|
279249
|
-
const
|
|
279243
|
+
const hasWorkspace = !!appConfig.data.workspaceId;
|
|
279244
|
+
const needsWorkspace = alreadyConnected && !hasWorkspace && !!appConfig.data.accessToken;
|
|
279245
|
+
const [step, setStep] = import_react48.useState(needsWorkspace ? "requesting" : alreadyConnected ? "success" : "start");
|
|
279250
279246
|
const [error40, setError] = import_react48.useState(null);
|
|
279251
279247
|
const [flowInfo, setFlowInfo] = import_react48.useState(null);
|
|
279252
279248
|
const [workspaces, setWorkspaces] = import_react48.useState([]);
|
|
@@ -279457,6 +279453,14 @@ function AuthFlow({ onClose }) {
|
|
|
279457
279453
|
setStep("error");
|
|
279458
279454
|
}
|
|
279459
279455
|
};
|
|
279456
|
+
import_react48.useEffect(() => {
|
|
279457
|
+
if (!needsWorkspace)
|
|
279458
|
+
return;
|
|
279459
|
+
const ac = new AbortController;
|
|
279460
|
+
abortRef.current = ac;
|
|
279461
|
+
const apiUrl = getPensarApiUrl();
|
|
279462
|
+
handleFetchWorkspaces(apiUrl, appConfig.data.accessToken, ac);
|
|
279463
|
+
}, []);
|
|
279460
279464
|
const handleDisconnect = async () => {
|
|
279461
279465
|
await disconnect();
|
|
279462
279466
|
appConfig.reload();
|
|
@@ -279948,7 +279952,11 @@ function ProviderManager() {
|
|
|
279948
279952
|
});
|
|
279949
279953
|
};
|
|
279950
279954
|
const handleAuthClose = () => {
|
|
279951
|
-
|
|
279955
|
+
if (isOnboarding) {
|
|
279956
|
+
setFlowState("choosing");
|
|
279957
|
+
} else {
|
|
279958
|
+
route.navigate({ type: "base", path: "home" });
|
|
279959
|
+
}
|
|
279952
279960
|
};
|
|
279953
279961
|
const otherProviders = AVAILABLE_PROVIDERS.filter((p) => p.id !== "pensar");
|
|
279954
279962
|
const selectedProviderInfo = AVAILABLE_PROVIDERS.find((p) => p.id === selectedProvider);
|
|
@@ -291750,8 +291758,8 @@ function AppContent({
|
|
|
291750
291758
|
return;
|
|
291751
291759
|
if (!config3.data.responsibleUseAccepted && route.data.path !== "disclosure") {
|
|
291752
291760
|
route.navigate({ type: "base", path: "disclosure" });
|
|
291753
|
-
} else if (config3.data.responsibleUseAccepted && !hasAnyProviderConfigured(config3.data) && route.data.path !== "providers" && route.data.path !== "disclosure") {
|
|
291754
|
-
route.navigate({ type: "base", path: "
|
|
291761
|
+
} else if (config3.data.responsibleUseAccepted && !hasAnyProviderConfigured(config3.data) && route.data.path !== "auth" && route.data.path !== "providers" && route.data.path !== "disclosure") {
|
|
291762
|
+
route.navigate({ type: "base", path: "auth" });
|
|
291755
291763
|
}
|
|
291756
291764
|
}, [config3.data.responsibleUseAccepted, route.data]);
|
|
291757
291765
|
import_react90.useEffect(() => {
|
|
@@ -291879,7 +291887,7 @@ function CommandDisplay({
|
|
|
291879
291887
|
await config3.update({ responsibleUseAccepted: true });
|
|
291880
291888
|
route.navigate({
|
|
291881
291889
|
type: "base",
|
|
291882
|
-
path: "
|
|
291890
|
+
path: "auth"
|
|
291883
291891
|
});
|
|
291884
291892
|
};
|
|
291885
291893
|
if (route.data.type === "base") {
|
|
@@ -291925,6 +291933,18 @@ function CommandDisplay({
|
|
|
291925
291933
|
when: "models",
|
|
291926
291934
|
children: /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV(ModelsDisplay, {}, undefined, false, undefined, this)
|
|
291927
291935
|
}, undefined, false, undefined, this),
|
|
291936
|
+
/* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV(RouteSwitch.Case, {
|
|
291937
|
+
when: "auth",
|
|
291938
|
+
children: /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV(AuthFlow, {
|
|
291939
|
+
onClose: () => {
|
|
291940
|
+
if (hasAnyProviderConfigured(config3.data)) {
|
|
291941
|
+
route.navigate({ type: "base", path: "home" });
|
|
291942
|
+
} else {
|
|
291943
|
+
route.navigate({ type: "base", path: "providers" });
|
|
291944
|
+
}
|
|
291945
|
+
}
|
|
291946
|
+
}, undefined, false, undefined, this)
|
|
291947
|
+
}, undefined, false, undefined, this),
|
|
291928
291948
|
/* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV(RouteSwitch.Case, {
|
|
291929
291949
|
when: "providers",
|
|
291930
291950
|
children: /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV(ProviderManager, {}, undefined, false, undefined, this)
|