pentesting 0.24.1 → 0.24.2
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 +1 -1
- package/dist/main.js +60 -31
- package/package.json +2 -2
package/README.md
CHANGED
package/dist/main.js
CHANGED
|
@@ -13,7 +13,7 @@ import chalk from "chalk";
|
|
|
13
13
|
import gradient from "gradient-string";
|
|
14
14
|
|
|
15
15
|
// src/platform/tui/app.tsx
|
|
16
|
-
import { useState as useState4, useCallback as useCallback3, useEffect as useEffect4 } from "react";
|
|
16
|
+
import { useState as useState4, useCallback as useCallback3, useEffect as useEffect4, useRef as useRef3 } from "react";
|
|
17
17
|
import { Box as Box6, useInput, useApp } from "ink";
|
|
18
18
|
|
|
19
19
|
// src/platform/tui/hooks/useAgent.ts
|
|
@@ -286,7 +286,7 @@ var ORPHAN_PROCESS_NAMES = [
|
|
|
286
286
|
var ID_LENGTH = AGENT_LIMITS.ID_LENGTH;
|
|
287
287
|
var ID_RADIX = AGENT_LIMITS.ID_RADIX;
|
|
288
288
|
var APP_NAME = "Pentest AI";
|
|
289
|
-
var APP_VERSION = "0.24.
|
|
289
|
+
var APP_VERSION = "0.24.2";
|
|
290
290
|
var APP_DESCRIPTION = "Autonomous Penetration Testing AI Agent";
|
|
291
291
|
var LLM_ROLES = {
|
|
292
292
|
SYSTEM: "system",
|
|
@@ -7807,14 +7807,32 @@ var THEME = {
|
|
|
7807
7807
|
identity: "#38bdf8"
|
|
7808
7808
|
};
|
|
7809
7809
|
var ASCII_BANNER = `
|
|
7810
|
-
|
|
7811
|
-
|
|
7812
|
-
|
|
7813
|
-
|
|
7814
|
-
|
|
7815
|
-
|
|
7816
|
-
|
|
7817
|
-
|
|
7810
|
+
\u2571\u2594\u2594\u2572
|
|
7811
|
+
\u2571\u2594 \u2594\u2572
|
|
7812
|
+
\u2571\u2594 \u2694 \u2594\u2572
|
|
7813
|
+
\u2571\u2594 \u2594\u2572
|
|
7814
|
+
\u2571\u2594 \u2594\u2572
|
|
7815
|
+
\u2571\u2594 \u2594\u2572
|
|
7816
|
+
\u2571\u2594 \u2594\u2572
|
|
7817
|
+
\u2571\u2594 \u2594\u2572
|
|
7818
|
+
\u2572\u2581 \u2581\u2571
|
|
7819
|
+
\u2572\u2581\u2581 \u2581\u2581\u2571
|
|
7820
|
+
\u2572\u2581\u2581 \u2581\u2581\u2571
|
|
7821
|
+
\u2500\u2500\u2500\u2500\u2500\u2573\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2573\u2500\u2500\u2500\u2500\u2500
|
|
7822
|
+
\u2572 \u2571
|
|
7823
|
+
\u2572 \u2571
|
|
7824
|
+
\u2572 \u2571
|
|
7825
|
+
\u2572 \u2571
|
|
7826
|
+
\u2572 \u2571
|
|
7827
|
+
\u25C9
|
|
7828
|
+
|
|
7829
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557
|
|
7830
|
+
\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D
|
|
7831
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551
|
|
7832
|
+
\u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551
|
|
7833
|
+
\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551
|
|
7834
|
+
\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D
|
|
7835
|
+
A U T O N O M O U S P E N T E S T A G E N T
|
|
7818
7836
|
`;
|
|
7819
7837
|
var ICONS = {
|
|
7820
7838
|
// Status
|
|
@@ -7980,6 +7998,7 @@ var useAgentState = () => {
|
|
|
7980
7998
|
}, []);
|
|
7981
7999
|
const manageTimer = useCallback((action) => {
|
|
7982
8000
|
if (action === "start") {
|
|
8001
|
+
if (timerRef.current) clearInterval(timerRef.current);
|
|
7983
8002
|
startTimeRef.current = Date.now();
|
|
7984
8003
|
timerRef.current = setInterval(() => {
|
|
7985
8004
|
setElapsedTime(Math.floor((Date.now() - startTimeRef.current) / 1e3));
|
|
@@ -8034,6 +8053,7 @@ var useAgentEvents = (agent, eventsRef, state) => {
|
|
|
8034
8053
|
setCurrentStatus,
|
|
8035
8054
|
setRetryState,
|
|
8036
8055
|
setCurrentTokens,
|
|
8056
|
+
setInputRequest,
|
|
8037
8057
|
setStats,
|
|
8038
8058
|
lastResponseMetaRef,
|
|
8039
8059
|
retryCountdownRef,
|
|
@@ -8086,7 +8106,7 @@ var useAgentEvents = (agent, eventsRef, state) => {
|
|
|
8086
8106
|
return new Promise((resolve) => {
|
|
8087
8107
|
const isPassword = /password|passphrase/i.test(p);
|
|
8088
8108
|
const inputType = /sudo/i.test(p) ? "sudo_password" : isPassword ? "password" : "text";
|
|
8089
|
-
|
|
8109
|
+
setInputRequest({
|
|
8090
8110
|
isActive: true,
|
|
8091
8111
|
prompt: p.trim(),
|
|
8092
8112
|
isPassword,
|
|
@@ -8100,7 +8120,7 @@ var useAgentEvents = (agent, eventsRef, state) => {
|
|
|
8100
8120
|
const hiddenTypes = ["password", "sudo_password", "ssh_password", "passphrase", "api_key", "credential"];
|
|
8101
8121
|
const isPassword = hiddenTypes.includes(request.type);
|
|
8102
8122
|
const displayPrompt = buildCredentialPrompt(request);
|
|
8103
|
-
|
|
8123
|
+
setInputRequest({
|
|
8104
8124
|
isActive: true,
|
|
8105
8125
|
prompt: displayPrompt,
|
|
8106
8126
|
isPassword,
|
|
@@ -8148,6 +8168,7 @@ var useAgentEvents = (agent, eventsRef, state) => {
|
|
|
8148
8168
|
setCurrentStatus,
|
|
8149
8169
|
setRetryState,
|
|
8150
8170
|
setCurrentTokens,
|
|
8171
|
+
setInputRequest,
|
|
8151
8172
|
setStats,
|
|
8152
8173
|
lastResponseMetaRef,
|
|
8153
8174
|
retryCountdownRef,
|
|
@@ -8155,7 +8176,7 @@ var useAgentEvents = (agent, eventsRef, state) => {
|
|
|
8155
8176
|
tokenAccumRef,
|
|
8156
8177
|
lastStepTokensRef,
|
|
8157
8178
|
clearAllTimers,
|
|
8158
|
-
|
|
8179
|
+
eventsRef
|
|
8159
8180
|
]);
|
|
8160
8181
|
};
|
|
8161
8182
|
function formatToolInput(toolName, input) {
|
|
@@ -8238,6 +8259,7 @@ var useAgent = (shouldAutoApprove, target) => {
|
|
|
8238
8259
|
isProcessing,
|
|
8239
8260
|
setIsProcessing,
|
|
8240
8261
|
currentStatus,
|
|
8262
|
+
setCurrentStatus,
|
|
8241
8263
|
elapsedTime,
|
|
8242
8264
|
retryState,
|
|
8243
8265
|
currentTokens,
|
|
@@ -8259,7 +8281,7 @@ var useAgent = (shouldAutoApprove, target) => {
|
|
|
8259
8281
|
const executeTask = useCallback2(async (task) => {
|
|
8260
8282
|
setIsProcessing(true);
|
|
8261
8283
|
manageTimer("start");
|
|
8262
|
-
|
|
8284
|
+
setCurrentStatus("Thinking");
|
|
8263
8285
|
resetCumulativeCounters();
|
|
8264
8286
|
try {
|
|
8265
8287
|
const response = await agent.execute(task);
|
|
@@ -8271,23 +8293,26 @@ var useAgent = (shouldAutoApprove, target) => {
|
|
|
8271
8293
|
} finally {
|
|
8272
8294
|
manageTimer("stop");
|
|
8273
8295
|
setIsProcessing(false);
|
|
8274
|
-
|
|
8296
|
+
setCurrentStatus("");
|
|
8275
8297
|
}
|
|
8276
|
-
}, [agent, addMessage, manageTimer, resetCumulativeCounters, setIsProcessing, lastResponseMetaRef,
|
|
8298
|
+
}, [agent, addMessage, manageTimer, resetCumulativeCounters, setIsProcessing, lastResponseMetaRef, setCurrentStatus]);
|
|
8277
8299
|
const abort = useCallback2(() => {
|
|
8278
8300
|
agent.abort();
|
|
8279
8301
|
setIsProcessing(false);
|
|
8280
8302
|
manageTimer("stop");
|
|
8281
|
-
|
|
8303
|
+
setCurrentStatus("");
|
|
8282
8304
|
addMessage("system", "Interrupted");
|
|
8283
|
-
}, [agent, addMessage, manageTimer, setIsProcessing,
|
|
8305
|
+
}, [agent, addMessage, manageTimer, setIsProcessing, setCurrentStatus]);
|
|
8306
|
+
const inputRequestRef = useRef2(inputRequest);
|
|
8307
|
+
inputRequestRef.current = inputRequest;
|
|
8284
8308
|
const cancelInputRequest = useCallback2(() => {
|
|
8285
|
-
|
|
8286
|
-
|
|
8309
|
+
const ir = inputRequestRef.current;
|
|
8310
|
+
if (ir.isActive && ir.resolve) {
|
|
8311
|
+
ir.resolve(null);
|
|
8287
8312
|
setInputRequest({ isActive: false, prompt: "", isPassword: false, resolve: null });
|
|
8288
8313
|
addMessage("system", "Input cancelled");
|
|
8289
8314
|
}
|
|
8290
|
-
}, [
|
|
8315
|
+
}, [setInputRequest, addMessage]);
|
|
8291
8316
|
return {
|
|
8292
8317
|
agent,
|
|
8293
8318
|
messages,
|
|
@@ -8683,13 +8708,16 @@ var App = ({ autoApprove = false, target }) => {
|
|
|
8683
8708
|
cancelInputRequest,
|
|
8684
8709
|
addMessage
|
|
8685
8710
|
} = useAgent(autoApproveMode, target);
|
|
8711
|
+
const inputRequestRef = useRef3(inputRequest);
|
|
8712
|
+
inputRequestRef.current = inputRequest;
|
|
8686
8713
|
const handleExit = useCallback3(() => {
|
|
8687
|
-
|
|
8714
|
+
const ir = inputRequestRef.current;
|
|
8715
|
+
if (ir.isActive && ir.resolve) ir.resolve(null);
|
|
8688
8716
|
cleanupAllProcesses().catch(() => {
|
|
8689
8717
|
});
|
|
8690
8718
|
exit();
|
|
8691
8719
|
setTimeout(() => process.exit(0), DISPLAY_LIMITS.EXIT_DELAY);
|
|
8692
|
-
}, [exit
|
|
8720
|
+
}, [exit]);
|
|
8693
8721
|
const handleCommand = useCallback3(async (cmd, args) => {
|
|
8694
8722
|
switch (cmd) {
|
|
8695
8723
|
case UI_COMMANDS.HELP:
|
|
@@ -8789,21 +8817,22 @@ ${procData.stdout || "(no output)"}
|
|
|
8789
8817
|
}
|
|
8790
8818
|
}, [addMessage, executeTask, handleCommand]);
|
|
8791
8819
|
const handleSecretSubmit = useCallback3((value) => {
|
|
8792
|
-
|
|
8793
|
-
|
|
8794
|
-
const
|
|
8820
|
+
const ir = inputRequestRef.current;
|
|
8821
|
+
if (!ir.isActive || !ir.resolve) return;
|
|
8822
|
+
const displayText = ir.isPassword ? "\u2022".repeat(value.length) : value;
|
|
8823
|
+
const promptLabel = ir.prompt || "Input";
|
|
8795
8824
|
addMessage("system", `\u21B3 ${promptLabel} ${displayText}`);
|
|
8796
|
-
|
|
8825
|
+
ir.resolve(value);
|
|
8797
8826
|
setInputRequest({ isActive: false, prompt: "", isPassword: false, resolve: null });
|
|
8798
8827
|
setSecretInput("");
|
|
8799
|
-
}, [
|
|
8800
|
-
useInput((ch, key) => {
|
|
8828
|
+
}, [addMessage, setInputRequest]);
|
|
8829
|
+
useInput(useCallback3((ch, key) => {
|
|
8801
8830
|
if (key.escape) {
|
|
8802
|
-
if (
|
|
8831
|
+
if (inputRequestRef.current.isActive) cancelInputRequest();
|
|
8803
8832
|
else if (isProcessing) abort();
|
|
8804
8833
|
}
|
|
8805
8834
|
if (key.ctrl && ch === "c") handleExit();
|
|
8806
|
-
});
|
|
8835
|
+
}, [cancelInputRequest, isProcessing, abort, handleExit]));
|
|
8807
8836
|
useEffect4(() => {
|
|
8808
8837
|
const onSignal = () => handleExit();
|
|
8809
8838
|
process.on("SIGINT", onSignal);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pentesting",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.2",
|
|
4
4
|
"description": "Autonomous Penetration Testing AI Agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/main.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"dev:tsx": "tsx src/platform/tui/main.tsx",
|
|
20
20
|
"build": "tsup",
|
|
21
21
|
"start": "node dist/main.js",
|
|
22
|
-
"test": "vitest run",
|
|
22
|
+
"test": "mkdir -p /tmp/pentesting-vitest && TMPDIR=/tmp/pentesting-vitest vitest run",
|
|
23
23
|
"test:watch": "vitest",
|
|
24
24
|
"lint": "tsc --noEmit",
|
|
25
25
|
"prepublishOnly": "npm run build",
|