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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/main.js +60 -31
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -38,4 +38,4 @@ docker run -it --rm \
38
38
 
39
39
  ## Issue
40
40
 
41
- email: agnusdei1207@gmail.com
41
+ email: pentesting@agnusdei.kr
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.1";
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
- \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\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557
7811
- \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\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D
7812
- \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 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557
7813
- \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 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551
7814
- \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 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D
7815
- \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 \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D
7816
- \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\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
7817
- A U T O N O M O U S S E C U R I T Y A G E N T
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
- state.setInputRequest({
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
- state.setInputRequest({
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
- state
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
- state.setCurrentStatus("Thinking");
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
- state.setCurrentStatus("");
8296
+ setCurrentStatus("");
8275
8297
  }
8276
- }, [agent, addMessage, manageTimer, resetCumulativeCounters, setIsProcessing, lastResponseMetaRef, state]);
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
- state.setCurrentStatus("");
8303
+ setCurrentStatus("");
8282
8304
  addMessage("system", "Interrupted");
8283
- }, [agent, addMessage, manageTimer, setIsProcessing, state]);
8305
+ }, [agent, addMessage, manageTimer, setIsProcessing, setCurrentStatus]);
8306
+ const inputRequestRef = useRef2(inputRequest);
8307
+ inputRequestRef.current = inputRequest;
8284
8308
  const cancelInputRequest = useCallback2(() => {
8285
- if (inputRequest.isActive && inputRequest.resolve) {
8286
- inputRequest.resolve(null);
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
- }, [inputRequest, setInputRequest, addMessage]);
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
- if (inputRequest.isActive && inputRequest.resolve) inputRequest.resolve(null);
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, inputRequest, cancelInputRequest]);
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
- if (!inputRequest.isActive || !inputRequest.resolve) return;
8793
- const displayText = inputRequest.isPassword ? "\u2022".repeat(value.length) : value;
8794
- const promptLabel = inputRequest.prompt || "Input";
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
- inputRequest.resolve(value);
8825
+ ir.resolve(value);
8797
8826
  setInputRequest({ isActive: false, prompt: "", isPassword: false, resolve: null });
8798
8827
  setSecretInput("");
8799
- }, [inputRequest, addMessage, setInputRequest]);
8800
- useInput((ch, key) => {
8828
+ }, [addMessage, setInputRequest]);
8829
+ useInput(useCallback3((ch, key) => {
8801
8830
  if (key.escape) {
8802
- if (inputRequest.isActive) cancelInputRequest();
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.1",
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",