@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 CHANGED
@@ -1,6 +1,10 @@
1
1
  <h1 align="center">Pensar Apex</h1>
2
2
 
3
- <p align="center">AI-powered penetration testing tool that enables you to use an AI agent to perform comprehensive blackbox and whitebox pentesting - directly in your terminal.
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
- Run Apex:
100
+ Open the Apex TUI:
49
101
 
50
102
  ```bash
51
103
  pensar
52
104
  ```
53
105
 
54
- ## AI Provider Support
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.109",
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.109",
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-1-20250805-v1:0",
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 [step, setStep] = import_react48.useState(alreadyConnected ? "success" : "start");
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
- route.navigate({ type: "base", path: "home" });
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: "providers" });
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: "providers"
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)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pensar/apex",
3
- "version": "0.0.109",
3
+ "version": "0.0.110-canary.f2a52b35",
4
4
  "description": "AI-powered penetration testing CLI tool with terminal UI",
5
5
  "module": "src/tui/index.tsx",
6
6
  "main": "build/index.js",