pentesting 0.70.7 → 0.70.8

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 (2) hide show
  1. package/dist/main.js +85 -82
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -759,7 +759,7 @@ var INPUT_PROMPT_PATTERNS = [
759
759
 
760
760
  // src/shared/constants/agent.ts
761
761
  var APP_NAME = "Pentest AI";
762
- var APP_VERSION = "0.70.7";
762
+ var APP_VERSION = "0.70.8";
763
763
  var APP_DESCRIPTION = "Autonomous Penetration Testing AI Agent";
764
764
  var LLM_ROLES = {
765
765
  SYSTEM: "system",
@@ -16766,7 +16766,7 @@ var MessageRow = memo4(({ msg }) => {
16766
16766
  ] }, msg.id);
16767
16767
  });
16768
16768
 
16769
- // src/platform/tui/components/messages/EmptyState.tsx
16769
+ // src/platform/tui/components/messages/BrandingHeader.tsx
16770
16770
  import { memo as memo6 } from "react";
16771
16771
  import { Box as Box7, Text as Text7 } from "ink";
16772
16772
 
@@ -16779,9 +16779,9 @@ var ShimmerBanner = memo5(({ banner }) => {
16779
16779
  return /* @__PURE__ */ jsx7(Box6, { flexDirection: "column", children: lines.map((line, row) => /* @__PURE__ */ jsx7(Text6, { color: HEX.primary, children: line }, row)) });
16780
16780
  });
16781
16781
 
16782
- // src/platform/tui/components/messages/EmptyState.tsx
16783
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
16784
- var EmptyState = memo6(({ modelName, autoApproveMode, version }) => {
16782
+ // src/platform/tui/components/messages/BrandingHeader.tsx
16783
+ import { Fragment as Fragment4, jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
16784
+ var BrandingHeader = memo6(({ modelName, autoApproveMode, version, showGuide = false }) => {
16785
16785
  const autoLabel = autoApproveMode ? "ON" : "OFF";
16786
16786
  const autoColor = autoApproveMode ? THEME.primary : THEME.gray;
16787
16787
  return /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
@@ -16799,47 +16799,50 @@ var EmptyState = memo6(({ modelName, autoApproveMode, version }) => {
16799
16799
  /* @__PURE__ */ jsx8(Text7, { color: autoColor, children: autoLabel })
16800
16800
  ] })
16801
16801
  ] }),
16802
- /* @__PURE__ */ jsx8(Text7, { children: " " }),
16803
- /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", paddingLeft: 2, children: [
16804
- /* @__PURE__ */ jsx8(Text7, { color: THEME.gray, children: "Get started:" }),
16805
- /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
16806
- " ",
16807
- /* @__PURE__ */ jsxs6(Text7, { color: THEME.white, children: [
16808
- "/target ",
16809
- "<ip>"
16810
- ] }),
16811
- " \u2014 Set target IP or domain"
16812
- ] }),
16813
- /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
16814
- " ",
16815
- /* @__PURE__ */ jsx8(Text7, { color: THEME.white, children: "/start" }),
16816
- " \u2014 Begin autonomous pentest"
16817
- ] }),
16818
- /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
16819
- " ",
16820
- /* @__PURE__ */ jsx8(Text7, { color: THEME.white, children: "/help" }),
16821
- " \u2014 Show all commands"
16822
- ] }),
16802
+ showGuide && /* @__PURE__ */ jsxs6(Fragment4, { children: [
16823
16803
  /* @__PURE__ */ jsx8(Text7, { children: " " }),
16824
- /* @__PURE__ */ jsx8(Text7, { color: THEME.dimGray, children: "Or just type a task and press Enter." })
16804
+ /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", paddingLeft: 2, children: [
16805
+ /* @__PURE__ */ jsx8(Text7, { color: THEME.gray, children: "Get started:" }),
16806
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
16807
+ " ",
16808
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.white, children: [
16809
+ "/target ",
16810
+ "<ip>"
16811
+ ] }),
16812
+ " \u2014 Set target IP or domain"
16813
+ ] }),
16814
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
16815
+ " ",
16816
+ /* @__PURE__ */ jsx8(Text7, { color: THEME.white, children: "/start" }),
16817
+ " \u2014 Begin autonomous pentest"
16818
+ ] }),
16819
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
16820
+ " ",
16821
+ /* @__PURE__ */ jsx8(Text7, { color: THEME.white, children: "/help" }),
16822
+ " \u2014 Show all commands"
16823
+ ] }),
16824
+ /* @__PURE__ */ jsx8(Text7, { children: " " }),
16825
+ /* @__PURE__ */ jsx8(Text7, { color: THEME.dimGray, children: "Or just type a task and press Enter." })
16826
+ ] })
16825
16827
  ] })
16826
16828
  ] });
16827
16829
  });
16828
16830
 
16829
16831
  // src/platform/tui/components/MessageList.tsx
16830
- import { jsx as jsx9 } from "react/jsx-runtime";
16832
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
16831
16833
  var MessageList = memo7(({ messages, modelName, autoApproveMode, version }) => {
16832
- if (messages.length === 0) {
16833
- return /* @__PURE__ */ jsx9(
16834
- EmptyState,
16834
+ return /* @__PURE__ */ jsxs7(Box8, { flexDirection: "column", children: [
16835
+ /* @__PURE__ */ jsx9(
16836
+ BrandingHeader,
16835
16837
  {
16836
16838
  modelName,
16837
16839
  autoApproveMode,
16838
- version
16840
+ version,
16841
+ showGuide: messages.length === 0
16839
16842
  }
16840
- );
16841
- }
16842
- return /* @__PURE__ */ jsx9(Box8, { flexDirection: "column", children: /* @__PURE__ */ jsx9(Static, { items: messages, children: (msg) => /* @__PURE__ */ jsx9(MessageRow, { msg }, msg.id) }) });
16843
+ ),
16844
+ messages.length > 0 && /* @__PURE__ */ jsx9(Static, { items: messages, children: (msg) => /* @__PURE__ */ jsx9(MessageRow, { msg }, msg.id) })
16845
+ ] });
16843
16846
  });
16844
16847
 
16845
16848
  // src/platform/tui/components/StatusDisplay.tsx
@@ -16901,27 +16904,27 @@ var StarSpinner = memo8(({ color }) => {
16901
16904
  });
16902
16905
 
16903
16906
  // src/platform/tui/components/status/RetryView.tsx
16904
- import { jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
16907
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
16905
16908
  var RetryView = ({ retryState }) => {
16906
16909
  const truncateError = (err) => {
16907
16910
  return err.length > DISPLAY_LIMITS.RETRY_ERROR_PREVIEW ? err.substring(0, DISPLAY_LIMITS.RETRY_ERROR_TRUNCATED) + "..." : err;
16908
16911
  };
16909
- return /* @__PURE__ */ jsxs7(Box9, { flexDirection: "column", height: 2, children: [
16910
- /* @__PURE__ */ jsxs7(Box9, { children: [
16912
+ return /* @__PURE__ */ jsxs8(Box9, { flexDirection: "column", height: 2, children: [
16913
+ /* @__PURE__ */ jsxs8(Box9, { children: [
16911
16914
  /* @__PURE__ */ jsx11(Text9, { color: THEME.yellow, wrap: "truncate", children: /* @__PURE__ */ jsx11(StarSpinner, { color: THEME.yellow }) }),
16912
- /* @__PURE__ */ jsxs7(Text9, { color: THEME.yellow, bold: true, wrap: "truncate", children: [
16915
+ /* @__PURE__ */ jsxs8(Text9, { color: THEME.yellow, bold: true, wrap: "truncate", children: [
16913
16916
  " \u29F3 Retry #",
16914
16917
  retryState.attempt,
16915
16918
  "/",
16916
16919
  retryState.maxRetries
16917
16920
  ] }),
16918
- /* @__PURE__ */ jsxs7(Text9, { color: THEME.gray, wrap: "truncate", children: [
16921
+ /* @__PURE__ */ jsxs8(Text9, { color: THEME.gray, wrap: "truncate", children: [
16919
16922
  " \u2014 ",
16920
16923
  retryState.countdown,
16921
16924
  "s"
16922
16925
  ] })
16923
16926
  ] }),
16924
- /* @__PURE__ */ jsx11(Box9, { children: /* @__PURE__ */ jsxs7(Text9, { color: THEME.gray, wrap: "truncate", children: [
16927
+ /* @__PURE__ */ jsx11(Box9, { children: /* @__PURE__ */ jsxs8(Text9, { color: THEME.gray, wrap: "truncate", children: [
16925
16928
  " ",
16926
16929
  truncateError(retryState.error)
16927
16930
  ] }) })
@@ -16955,7 +16958,7 @@ var ShimmerText = memo9(({ children, bold, phase = 0 }) => {
16955
16958
  });
16956
16959
 
16957
16960
  // src/platform/tui/components/status/ProcessingView.tsx
16958
- import { jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
16961
+ import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
16959
16962
  var ProcessingView = ({
16960
16963
  statusMain,
16961
16964
  detailText,
@@ -16974,18 +16977,18 @@ var ProcessingView = ({
16974
16977
  const parenIdx = statusMain.indexOf("(");
16975
16978
  const shimmerPart = parenIdx > -1 ? statusMain.slice(0, parenIdx).trimEnd() : statusMain;
16976
16979
  const staticSuffix = parenIdx > -1 ? " " + statusMain.slice(parenIdx) : "";
16977
- return /* @__PURE__ */ jsxs8(Box10, { flexDirection: "column", height: 2, children: [
16978
- /* @__PURE__ */ jsxs8(Box10, { children: [
16980
+ return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", height: 2, children: [
16981
+ /* @__PURE__ */ jsxs9(Box10, { children: [
16979
16982
  /* @__PURE__ */ jsx13(Text11, { color, wrap: "truncate", children: /* @__PURE__ */ jsx13(StarSpinner, { color }) }),
16980
16983
  /* @__PURE__ */ jsx13(Text11, { children: " " }),
16981
16984
  /* @__PURE__ */ jsx13(ShimmerText, { bold: true, phase: 0, children: shimmerPart }),
16982
16985
  staticSuffix ? /* @__PURE__ */ jsx13(Text11, { color: THEME.dimGray, wrap: "truncate", children: staticSuffix }) : null,
16983
- /* @__PURE__ */ jsxs8(Text11, { color: THEME.dimGray, wrap: "truncate", children: [
16986
+ /* @__PURE__ */ jsxs9(Text11, { color: THEME.dimGray, wrap: "truncate", children: [
16984
16987
  " ",
16985
16988
  meta
16986
16989
  ] })
16987
16990
  ] }),
16988
- /* @__PURE__ */ jsx13(Box10, { children: detailText ? /* @__PURE__ */ jsxs8(Text11, { color: THEME.dimGray, wrap: "truncate", children: [
16991
+ /* @__PURE__ */ jsx13(Box10, { children: detailText ? /* @__PURE__ */ jsxs9(Text11, { color: THEME.dimGray, wrap: "truncate", children: [
16989
16992
  " ",
16990
16993
  detailText
16991
16994
  ] }) : /* @__PURE__ */ jsx13(Text11, { children: " " }) })
@@ -16993,7 +16996,7 @@ var ProcessingView = ({
16993
16996
  };
16994
16997
 
16995
16998
  // src/platform/tui/components/StatusDisplay.tsx
16996
- import { jsx as jsx14, jsxs as jsxs9 } from "react/jsx-runtime";
16999
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
16997
17000
  var StatusDisplay = memo10(({
16998
17001
  retryState,
16999
17002
  isProcessing,
@@ -17007,7 +17010,7 @@ var StatusDisplay = memo10(({
17007
17010
  return /* @__PURE__ */ jsx14(RetryView, { retryState });
17008
17011
  }
17009
17012
  if (isProcessing && isWaitingForInput) {
17010
- return /* @__PURE__ */ jsxs9(Box11, { flexDirection: "column", height: 2, children: [
17013
+ return /* @__PURE__ */ jsxs10(Box11, { flexDirection: "column", height: 2, children: [
17011
17014
  /* @__PURE__ */ jsx14(Text12, { children: " " }),
17012
17015
  /* @__PURE__ */ jsx14(Text12, { children: " " })
17013
17016
  ] });
@@ -17028,7 +17031,7 @@ var StatusDisplay = memo10(({
17028
17031
  }
17029
17032
  );
17030
17033
  }
17031
- return /* @__PURE__ */ jsxs9(Box11, { flexDirection: "column", height: 2, children: [
17034
+ return /* @__PURE__ */ jsxs10(Box11, { flexDirection: "column", height: 2, children: [
17032
17035
  /* @__PURE__ */ jsx14(Text12, { children: " " }),
17033
17036
  /* @__PURE__ */ jsx14(Text12, { children: " " })
17034
17037
  ] });
@@ -17040,7 +17043,7 @@ import { Box as Box15, Text as Text16, useInput as useInput2 } from "ink";
17040
17043
 
17041
17044
  // src/platform/tui/components/input/AutocompletePreview.tsx
17042
17045
  import { Box as Box12, Text as Text13 } from "ink";
17043
- import { jsx as jsx15, jsxs as jsxs10 } from "react/jsx-runtime";
17046
+ import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
17044
17047
  var AutocompletePreview = ({
17045
17048
  suggestions,
17046
17049
  clampedIdx
@@ -17048,14 +17051,14 @@ var AutocompletePreview = ({
17048
17051
  return /* @__PURE__ */ jsx15(Box12, { flexDirection: "column", paddingX: 1, children: suggestions.map((cmd, i) => {
17049
17052
  const isSelected = i === clampedIdx;
17050
17053
  const argsText = cmd.args ? ` ${cmd.args}` : "";
17051
- return /* @__PURE__ */ jsxs10(Box12, { children: [
17054
+ return /* @__PURE__ */ jsxs11(Box12, { children: [
17052
17055
  /* @__PURE__ */ jsx15(Text13, { color: isSelected ? THEME.primary : THEME.dimGray, children: isSelected ? " \u276F " : " " }),
17053
- /* @__PURE__ */ jsxs10(Text13, { color: isSelected ? THEME.white : THEME.gray, bold: isSelected, children: [
17056
+ /* @__PURE__ */ jsxs11(Text13, { color: isSelected ? THEME.white : THEME.gray, bold: isSelected, children: [
17054
17057
  "/",
17055
17058
  cmd.name
17056
17059
  ] }),
17057
17060
  /* @__PURE__ */ jsx15(Text13, { dimColor: true, color: THEME.gray, children: argsText }),
17058
- /* @__PURE__ */ jsxs10(Text13, { dimColor: true, color: THEME.dimGray, children: [
17061
+ /* @__PURE__ */ jsxs11(Text13, { dimColor: true, color: THEME.dimGray, children: [
17059
17062
  " \u2014 ",
17060
17063
  cmd.description
17061
17064
  ] }),
@@ -17067,7 +17070,7 @@ var AutocompletePreview = ({
17067
17070
  // src/platform/tui/components/input/SecretInputArea.tsx
17068
17071
  import { Box as Box13, Text as Text14, useStdout } from "ink";
17069
17072
  import TextInput from "ink-text-input";
17070
- import { jsx as jsx16, jsxs as jsxs11 } from "react/jsx-runtime";
17073
+ import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
17071
17074
  var OUTER_PADDING = 2;
17072
17075
  var SecretInputArea = ({
17073
17076
  inputRequest,
@@ -17078,9 +17081,9 @@ var SecretInputArea = ({
17078
17081
  const { stdout } = useStdout();
17079
17082
  const borderWidth = Math.max(10, (stdout?.columns ?? 80) - OUTER_PADDING);
17080
17083
  const borderLine = "\u2501".repeat(borderWidth);
17081
- return /* @__PURE__ */ jsxs11(Box13, { flexDirection: "column", children: [
17084
+ return /* @__PURE__ */ jsxs12(Box13, { flexDirection: "column", children: [
17082
17085
  /* @__PURE__ */ jsx16(Box13, { children: /* @__PURE__ */ jsx16(Text14, { color: THEME.yellow, children: borderLine }) }),
17083
- /* @__PURE__ */ jsxs11(Box13, { paddingX: 1, children: [
17086
+ /* @__PURE__ */ jsxs12(Box13, { paddingX: 1, children: [
17084
17087
  /* @__PURE__ */ jsx16(Text14, { color: THEME.yellow, bold: true, children: "\u25B8 " }),
17085
17088
  /* @__PURE__ */ jsx16(
17086
17089
  TextInput,
@@ -17100,7 +17103,7 @@ var SecretInputArea = ({
17100
17103
  // src/platform/tui/components/input/NormalInputArea.tsx
17101
17104
  import { Box as Box14, Text as Text15, useStdout as useStdout2 } from "ink";
17102
17105
  import TextInput2 from "ink-text-input";
17103
- import { jsx as jsx17, jsxs as jsxs12 } from "react/jsx-runtime";
17106
+ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
17104
17107
  var OUTER_PADDING2 = 2;
17105
17108
  var NormalInputArea = ({
17106
17109
  inputKey,
@@ -17112,9 +17115,9 @@ var NormalInputArea = ({
17112
17115
  const { stdout } = useStdout2();
17113
17116
  const borderWidth = Math.max(10, (stdout?.columns ?? 80) - OUTER_PADDING2);
17114
17117
  const borderLine = "\u2500".repeat(borderWidth);
17115
- return /* @__PURE__ */ jsxs12(Box14, { flexDirection: "column", children: [
17118
+ return /* @__PURE__ */ jsxs13(Box14, { flexDirection: "column", children: [
17116
17119
  /* @__PURE__ */ jsx17(Box14, { children: /* @__PURE__ */ jsx17(Text15, { dimColor: true, color: THEME.dimGray, children: borderLine }) }),
17117
- /* @__PURE__ */ jsxs12(Box14, { paddingX: 1, children: [
17120
+ /* @__PURE__ */ jsxs13(Box14, { paddingX: 1, children: [
17118
17121
  /* @__PURE__ */ jsx17(Text15, { color: THEME.primary, children: "\u276F " }),
17119
17122
  /* @__PURE__ */ jsx17(
17120
17123
  TextInput2,
@@ -17132,7 +17135,7 @@ var NormalInputArea = ({
17132
17135
  };
17133
17136
 
17134
17137
  // src/platform/tui/components/ChatInput.tsx
17135
- import { jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
17138
+ import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
17136
17139
  var MAX_SUGGESTIONS = 6;
17137
17140
  var ChatInput = memo11(({
17138
17141
  value,
@@ -17231,7 +17234,7 @@ var ChatInput = memo11(({
17231
17234
  completeCommand(selectedIdxRef.current);
17232
17235
  }
17233
17236
  }, [completeCommand]));
17234
- return /* @__PURE__ */ jsxs13(Box15, { flexDirection: "column", children: [
17237
+ return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", children: [
17235
17238
  showPreview && /* @__PURE__ */ jsx18(
17236
17239
  AutocompletePreview,
17237
17240
  {
@@ -17270,7 +17273,7 @@ var ChatInput = memo11(({
17270
17273
  // src/platform/tui/components/footer.tsx
17271
17274
  import { memo as memo12 } from "react";
17272
17275
  import { Box as Box16, Text as Text17 } from "ink";
17273
- import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
17276
+ import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
17274
17277
  var CTX_WARN_THRESHOLD = 0.8;
17275
17278
  var MAX_CONTEXT_TOKENS = LLM_LIMITS.streamMaxTokens;
17276
17279
  var formatElapsed = (totalSeconds) => {
@@ -17286,7 +17289,7 @@ var formatElapsed = (totalSeconds) => {
17286
17289
  var Footer = memo12(({ phase, targets, findings, todo, elapsedTime, isProcessing, totalTokens, turnCount }) => {
17287
17290
  const ctxPct = totalTokens > 0 ? Math.round(totalTokens / MAX_CONTEXT_TOKENS * 100) : 0;
17288
17291
  const ctxColor = ctxPct >= CTX_WARN_THRESHOLD * 100 ? THEME.yellow : THEME.dimGray;
17289
- return /* @__PURE__ */ jsxs14(
17292
+ return /* @__PURE__ */ jsxs15(
17290
17293
  Box16,
17291
17294
  {
17292
17295
  width: "100%",
@@ -17294,39 +17297,39 @@ var Footer = memo12(({ phase, targets, findings, todo, elapsedTime, isProcessing
17294
17297
  justifyContent: "space-between",
17295
17298
  overflow: "hidden",
17296
17299
  children: [
17297
- /* @__PURE__ */ jsxs14(Box16, { gap: 2, children: [
17298
- /* @__PURE__ */ jsxs14(Text17, { color: THEME.gray, children: [
17300
+ /* @__PURE__ */ jsxs15(Box16, { gap: 2, children: [
17301
+ /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
17299
17302
  "Phase: ",
17300
17303
  /* @__PURE__ */ jsx19(Text17, { color: THEME.white, children: phase })
17301
17304
  ] }),
17302
- /* @__PURE__ */ jsxs14(Text17, { color: THEME.gray, children: [
17305
+ /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
17303
17306
  "Targets: ",
17304
17307
  /* @__PURE__ */ jsx19(Text17, { color: THEME.white, children: targets })
17305
17308
  ] }),
17306
- /* @__PURE__ */ jsxs14(Text17, { color: THEME.gray, children: [
17309
+ /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
17307
17310
  "Findings: ",
17308
17311
  /* @__PURE__ */ jsx19(Text17, { color: THEME.white, children: findings })
17309
17312
  ] }),
17310
- /* @__PURE__ */ jsxs14(Text17, { color: THEME.gray, children: [
17313
+ /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
17311
17314
  "Tasks: ",
17312
17315
  /* @__PURE__ */ jsx19(Text17, { color: THEME.white, children: todo })
17313
17316
  ] })
17314
17317
  ] }),
17315
- /* @__PURE__ */ jsxs14(Box16, { gap: 2, children: [
17316
- isProcessing ? /* @__PURE__ */ jsxs14(Box16, { gap: 1, children: [
17318
+ /* @__PURE__ */ jsxs15(Box16, { gap: 2, children: [
17319
+ isProcessing ? /* @__PURE__ */ jsxs15(Box16, { gap: 1, children: [
17317
17320
  /* @__PURE__ */ jsx19(Text17, { dimColor: true, color: THEME.dimGray, children: "[ESC] abort" }),
17318
17321
  /* @__PURE__ */ jsx19(Text17, { dimColor: true, color: THEME.dimGray, children: "[^C\xD72] exit" })
17319
17322
  ] }) : /* @__PURE__ */ jsx19(Text17, { dimColor: true, color: THEME.dimGray, children: "[/help] commands" }),
17320
- turnCount > 0 && /* @__PURE__ */ jsxs14(Text17, { dimColor: true, color: THEME.dimGray, children: [
17323
+ turnCount > 0 && /* @__PURE__ */ jsxs15(Text17, { dimColor: true, color: THEME.dimGray, children: [
17321
17324
  "turn:",
17322
17325
  turnCount
17323
17326
  ] }),
17324
- totalTokens > 0 && /* @__PURE__ */ jsxs14(Text17, { dimColor: true, color: ctxColor, children: [
17327
+ totalTokens > 0 && /* @__PURE__ */ jsxs15(Text17, { dimColor: true, color: ctxColor, children: [
17325
17328
  "ctx:",
17326
17329
  ctxPct,
17327
17330
  "%"
17328
17331
  ] }),
17329
- totalTokens > 0 && /* @__PURE__ */ jsxs14(Text17, { dimColor: true, color: THEME.dimGray, children: [
17332
+ totalTokens > 0 && /* @__PURE__ */ jsxs15(Text17, { dimColor: true, color: THEME.dimGray, children: [
17330
17333
  "\u2191",
17331
17334
  formatTokens(totalTokens)
17332
17335
  ] }),
@@ -17342,7 +17345,7 @@ var footer_default = Footer;
17342
17345
  // src/platform/tui/components/Modal.tsx
17343
17346
  import { useMemo as useMemo2, memo as memo13, useCallback as useCallback8, useRef as useRef7 } from "react";
17344
17347
  import { Box as Box17, Text as Text18, useStdout as useStdout3, useInput as useInput3 } from "ink";
17345
- import { jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
17348
+ import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
17346
17349
  var MODAL_TITLES = {
17347
17350
  findings: "\u25C8 FINDINGS \u25C8",
17348
17351
  graph: "\u25C8 ATTACK GRAPH \u25C8",
@@ -17386,7 +17389,7 @@ var Modal = memo13(({
17386
17389
  const endLine = Math.min(scrollOffset + maxHeight, totalLines);
17387
17390
  const scrollbarHeight = Math.max(1, Math.floor(maxHeight * (maxHeight / Math.max(totalLines, 1))));
17388
17391
  const scrollbarPosition = totalLines > maxHeight ? Math.floor(scrollOffset / (totalLines - maxHeight) * (maxHeight - scrollbarHeight)) : 0;
17389
- return /* @__PURE__ */ jsxs15(
17392
+ return /* @__PURE__ */ jsxs16(
17390
17393
  Box17,
17391
17394
  {
17392
17395
  flexDirection: "column",
@@ -17408,7 +17411,7 @@ var Modal = memo13(({
17408
17411
  flexGrow: 1,
17409
17412
  children: visibleLines.map((line, i) => {
17410
17413
  const showScrollbar = totalLines > maxHeight && i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight;
17411
- return /* @__PURE__ */ jsxs15(Box17, { children: [
17414
+ return /* @__PURE__ */ jsxs16(Box17, { children: [
17412
17415
  /* @__PURE__ */ jsx20(Text18, { color: THEME.white, wrap: "truncate", children: line }),
17413
17416
  /* @__PURE__ */ jsx20(Box17, { flexGrow: 1 }),
17414
17417
  totalLines > maxHeight && /* @__PURE__ */ jsx20(Text18, { color: showScrollbar ? THEME.cyan : THEME.dimGray, children: showScrollbar ? "\u2588" : "\u2502" })
@@ -17416,9 +17419,9 @@ var Modal = memo13(({
17416
17419
  })
17417
17420
  }
17418
17421
  ),
17419
- /* @__PURE__ */ jsxs15(Box17, { justifyContent: "space-between", paddingX: 1, children: [
17422
+ /* @__PURE__ */ jsxs16(Box17, { justifyContent: "space-between", paddingX: 1, children: [
17420
17423
  /* @__PURE__ */ jsx20(Text18, { dimColor: true, color: THEME.gray, children: "\u2191\u2193/jk: scroll | g/G: top/bottom | ESC/q: close" }),
17421
- /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: THEME.cyan, children: [
17424
+ /* @__PURE__ */ jsxs16(Text18, { dimColor: true, color: THEME.cyan, children: [
17422
17425
  startLine,
17423
17426
  "-",
17424
17427
  endLine,
@@ -17433,7 +17436,7 @@ var Modal = memo13(({
17433
17436
 
17434
17437
  // src/platform/tui/components/app/bottom-region.tsx
17435
17438
  import { Box as Box18 } from "ink";
17436
- import { jsx as jsx21, jsxs as jsxs16 } from "react/jsx-runtime";
17439
+ import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
17437
17440
  var BottomRegion = ({
17438
17441
  input,
17439
17442
  setInput,
@@ -17457,7 +17460,7 @@ var BottomRegion = ({
17457
17460
  const suggestionCount = isSlashMode && !hasArgs && inputRequest.status !== "active" ? Math.min(getMatchingCommands(partialCmd).length, MAX_SUGGESTIONS) : 0;
17458
17461
  const previewHeight = suggestionCount;
17459
17462
  const bottomMinHeight = 7;
17460
- return /* @__PURE__ */ jsxs16(Box18, { flexDirection: "column", minHeight: bottomMinHeight, children: [
17463
+ return /* @__PURE__ */ jsxs17(Box18, { flexDirection: "column", minHeight: bottomMinHeight, children: [
17461
17464
  /* @__PURE__ */ jsx21(
17462
17465
  StatusDisplay,
17463
17466
  {
@@ -17498,7 +17501,7 @@ var BottomRegion = ({
17498
17501
  };
17499
17502
 
17500
17503
  // src/platform/tui/app.tsx
17501
- import { jsx as jsx22, jsxs as jsxs17 } from "react/jsx-runtime";
17504
+ import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
17502
17505
  var MODEL_NAME = getModel() || DEFAULT_MODEL;
17503
17506
  var App = ({ autoApprove = false, target }) => {
17504
17507
  const { exit } = useApp();
@@ -17625,7 +17628,7 @@ var App = ({ autoApprove = false, target }) => {
17625
17628
  }
17626
17629
  ) });
17627
17630
  }
17628
- return /* @__PURE__ */ jsxs17(Box19, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: [
17631
+ return /* @__PURE__ */ jsxs18(Box19, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: [
17629
17632
  /* @__PURE__ */ jsx22(Box19, { flexDirection: "column", children: /* @__PURE__ */ jsx22(
17630
17633
  MessageList,
17631
17634
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pentesting",
3
- "version": "0.70.7",
3
+ "version": "0.70.8",
4
4
  "description": "Autonomous Penetration Testing AI Agent",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",