pentesting 0.44.0 → 0.44.1

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/dist/main.js CHANGED
@@ -311,7 +311,7 @@ var ORPHAN_PROCESS_NAMES = [
311
311
 
312
312
  // src/shared/constants/agent.ts
313
313
  var APP_NAME = "Pentest AI";
314
- var APP_VERSION = "0.44.0";
314
+ var APP_VERSION = "0.44.1";
315
315
  var APP_DESCRIPTION = "Autonomous Penetration Testing AI Agent";
316
316
  var LLM_ROLES = {
317
317
  SYSTEM: "system",
@@ -11460,19 +11460,28 @@ var formatInlineStatus = () => {
11460
11460
  import { useState, useRef, useCallback } from "react";
11461
11461
 
11462
11462
  // src/shared/constants/theme.ts
11463
+ var HEX = {
11464
+ primary: "#FF968A",
11465
+ pink: "#FFAEAE",
11466
+ peach: "#FFC5BF"
11467
+ };
11463
11468
  var COLORS = {
11464
- primary: "#e11d48",
11465
- // Rose 600 - red team primary
11466
- accent: "#fb923c",
11467
- // Orange 400 - fire accent
11468
- secondary: "#94a3b8",
11469
- // Slate - secondary/muted
11470
- white: "#f8fafc",
11471
- // Main text
11472
- red: "#ff4500",
11473
- // OrangeRed - Error/Critical (distinct from rose primary)
11474
- yellow: "#facc15"
11475
- // Yellow 400 - Warning/Pending (pure yellow)
11469
+ // Primary accent - coral/salmon (ANSI 210 is light coral)
11470
+ primary: "ansi256(210)",
11471
+ // Pastel pink (ANSI 217 is light pink)
11472
+ pink: "ansi256(217)",
11473
+ // Pastel peach (ANSI 216 is light salmon)
11474
+ peach: "ansi256(216)",
11475
+ // Warning yellow (ANSI 222 is light goldenrod)
11476
+ yellow: "ansi256(222)",
11477
+ // Orange (ANSI 215)
11478
+ orange: "ansi256(215)",
11479
+ // Bright white for main text
11480
+ white: "white",
11481
+ // Light gray for secondary text (ANSI 252 is light gray)
11482
+ gray: "ansi256(252)",
11483
+ // Bright red for errors
11484
+ red: "red"
11476
11485
  };
11477
11486
  var THEME = {
11478
11487
  ...COLORS,
@@ -11482,37 +11491,43 @@ var THEME = {
11482
11491
  },
11483
11492
  text: {
11484
11493
  primary: COLORS.white,
11485
- secondary: COLORS.secondary,
11486
- muted: "#64748b",
11487
- accent: COLORS.accent
11488
- // Using Emerald for "accented" text
11494
+ // AI responses - main text
11495
+ secondary: COLORS.gray,
11496
+ // Secondary info
11497
+ muted: COLORS.gray,
11498
+ // Metadata, hints
11499
+ accent: COLORS.gray
11500
+ // Very subtle
11489
11501
  },
11490
11502
  status: {
11491
- success: COLORS.accent,
11492
- // Success feels good in emerald
11503
+ success: COLORS.gray,
11504
+ // Keep it subtle
11493
11505
  warning: COLORS.yellow,
11506
+ // Pastel yellow
11494
11507
  error: COLORS.red,
11495
- running: COLORS.primary
11496
- // System operations in blue
11508
+ // Bright red for errors
11509
+ running: COLORS.gray
11510
+ // Processing indicator
11497
11511
  },
11498
11512
  border: {
11499
- default: "#1e293b",
11513
+ // ANSI 241 is a medium slate gray for borders
11514
+ default: "ansi256(241)",
11500
11515
  focus: COLORS.primary,
11501
11516
  error: COLORS.red
11502
11517
  },
11503
11518
  gradient: {
11504
- cyber: [COLORS.primary, "#f43f5e", "#fb923c"]
11505
- // Red team fire gradient: rose pink → amber
11519
+ // Hex colors required for gradient-string
11520
+ cyber: [HEX.primary, HEX.pink, HEX.peach]
11506
11521
  },
11507
11522
  spinner: COLORS.primary
11508
11523
  };
11509
11524
  var ASCII_BANNER = `
11510
- \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
11511
- \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
11525
+ \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
11526
+ \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
11512
11527
  \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
11513
11528
  \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
11514
11529
  \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
11515
- \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
11530
+ \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
11516
11531
  `;
11517
11532
  var ICONS = {
11518
11533
  // Status
@@ -11590,14 +11605,22 @@ var TUI_DISPLAY_LIMITS = {
11590
11605
  };
11591
11606
  var MESSAGE_STYLES = {
11592
11607
  colors: {
11593
- user: THEME.text.accent,
11594
- assistant: THEME.text.primary,
11595
- ai: THEME.text.primary,
11596
- system: THEME.text.muted,
11597
- error: THEME.status.error,
11598
- tool: THEME.status.running,
11599
- result: THEME.text.muted,
11608
+ user: THEME.white,
11609
+ // User input - bright white
11610
+ assistant: THEME.white,
11611
+ // AI response - white
11612
+ ai: THEME.white,
11613
+ // AI response - white
11614
+ system: THEME.gray,
11615
+ // System - light gray
11616
+ error: THEME.red,
11617
+ // Errors - red
11618
+ tool: THEME.gray,
11619
+ // Tool commands - light gray
11620
+ result: THEME.gray,
11621
+ // Tool results - light gray
11600
11622
  status: THEME.primary
11623
+ // Status - pastel red accent
11601
11624
  },
11602
11625
  prefixes: {
11603
11626
  user: "\u276F",
@@ -12064,29 +12087,29 @@ function getRoleColor(role) {
12064
12087
  const roleColors = {
12065
12088
  listener: THEME.primary,
12066
12089
  active_shell: THEME.primary,
12067
- server: THEME.secondary,
12090
+ server: THEME.gray,
12068
12091
  sniffer: THEME.yellow,
12069
12092
  spoofer: THEME.yellow,
12070
12093
  proxy: THEME.primary,
12071
12094
  callback: THEME.primary,
12072
- background: THEME.text.muted
12095
+ background: THEME.gray
12073
12096
  };
12074
- return roleColors[role] || THEME.text.secondary;
12097
+ return roleColors[role] || THEME.gray;
12075
12098
  }
12076
12099
  function StatusIndicator({ running, exitCode }) {
12077
12100
  if (running) {
12078
- return /* @__PURE__ */ jsxs(Text, { color: THEME.status.running, children: [
12101
+ return /* @__PURE__ */ jsxs(Text, { color: THEME.primary, children: [
12079
12102
  ICONS.running,
12080
12103
  " "
12081
12104
  ] });
12082
12105
  }
12083
12106
  if (exitCode === 0) {
12084
- return /* @__PURE__ */ jsxs(Text, { color: THEME.status.success, children: [
12107
+ return /* @__PURE__ */ jsxs(Text, { color: THEME.gray, children: [
12085
12108
  ICONS.success,
12086
12109
  " "
12087
12110
  ] });
12088
12111
  }
12089
- return /* @__PURE__ */ jsxs(Text, { color: THEME.status.error, children: [
12112
+ return /* @__PURE__ */ jsxs(Text, { color: THEME.red, children: [
12090
12113
  ICONS.error,
12091
12114
  " "
12092
12115
  ] });
@@ -12098,7 +12121,7 @@ function ProcessRow({ proc, compact }) {
12098
12121
  const truncatedPurpose = compact && purpose.length > TUI_DISPLAY_LIMITS.purposeMaxLength ? purpose.slice(0, TUI_DISPLAY_LIMITS.purposeTruncated) + "..." : purpose;
12099
12122
  return /* @__PURE__ */ jsxs(Box, { children: [
12100
12123
  /* @__PURE__ */ jsx(StatusIndicator, { running: proc.running, exitCode: proc.exitCode }),
12101
- /* @__PURE__ */ jsxs(Text, { color: THEME.text.muted, children: [
12124
+ /* @__PURE__ */ jsxs(Text, { color: THEME.gray, children: [
12102
12125
  "[",
12103
12126
  proc.id,
12104
12127
  "]"
@@ -12108,14 +12131,14 @@ function ProcessRow({ proc, compact }) {
12108
12131
  proc.role,
12109
12132
  port
12110
12133
  ] }),
12111
- /* @__PURE__ */ jsxs(Text, { color: THEME.text.muted, children: [
12134
+ /* @__PURE__ */ jsxs(Text, { color: THEME.gray, children: [
12112
12135
  " (",
12113
12136
  duration,
12114
12137
  ")"
12115
12138
  ] }),
12116
12139
  truncatedPurpose && /* @__PURE__ */ jsxs(Fragment, { children: [
12117
- /* @__PURE__ */ jsx(Text, { color: THEME.text.muted, children: " - " }),
12118
- /* @__PURE__ */ jsx(Text, { color: THEME.text.secondary, children: truncatedPurpose })
12140
+ /* @__PURE__ */ jsx(Text, { color: THEME.gray, children: " - " }),
12141
+ /* @__PURE__ */ jsx(Text, { color: THEME.gray, children: truncatedPurpose })
12119
12142
  ] })
12120
12143
  ] });
12121
12144
  }
@@ -12126,18 +12149,18 @@ var InlineStatus = ({
12126
12149
  compact = true
12127
12150
  }) => {
12128
12151
  if (processes.length === 0 && zombies.length === 0) {
12129
- return /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { color: THEME.text.muted, children: "\u2022 No active background processes" }) });
12152
+ return /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { color: THEME.gray, children: "\u2022 No active background processes" }) });
12130
12153
  }
12131
12154
  const running = processes.filter((p) => p.running);
12132
12155
  const stopped = processes.filter((p) => !p.running);
12133
12156
  const healthColor = {
12134
- healthy: THEME.status.success,
12135
- warning: THEME.status.warning,
12136
- critical: THEME.status.error
12157
+ healthy: THEME.gray,
12158
+ warning: THEME.yellow,
12159
+ critical: THEME.red
12137
12160
  }[health];
12138
12161
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
12139
12162
  running.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
12140
- /* @__PURE__ */ jsxs(Text, { color: THEME.text.muted, bold: true, children: [
12163
+ /* @__PURE__ */ jsxs(Text, { color: THEME.gray, bold: true, children: [
12141
12164
  ICONS.running,
12142
12165
  " Active (",
12143
12166
  running.length,
@@ -12146,46 +12169,46 @@ var InlineStatus = ({
12146
12169
  running.map((proc) => /* @__PURE__ */ jsx(ProcessRow, { proc, compact }, proc.id))
12147
12170
  ] }),
12148
12171
  stopped.length > 0 && !compact && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: running.length > 0 ? 1 : 0, children: [
12149
- /* @__PURE__ */ jsxs(Text, { color: THEME.text.muted, children: [
12172
+ /* @__PURE__ */ jsxs(Text, { color: THEME.gray, children: [
12150
12173
  ICONS.completed,
12151
12174
  " Completed (",
12152
12175
  stopped.length,
12153
12176
  ")"
12154
12177
  ] }),
12155
12178
  stopped.slice(0, TUI_DISPLAY_LIMITS.maxStoppedProcesses).map((proc) => /* @__PURE__ */ jsx(ProcessRow, { proc, compact }, proc.id)),
12156
- stopped.length > TUI_DISPLAY_LIMITS.maxStoppedProcesses && /* @__PURE__ */ jsxs(Text, { color: THEME.text.muted, children: [
12179
+ stopped.length > TUI_DISPLAY_LIMITS.maxStoppedProcesses && /* @__PURE__ */ jsxs(Text, { color: THEME.gray, children: [
12157
12180
  " ... and ",
12158
12181
  stopped.length - TUI_DISPLAY_LIMITS.maxStoppedProcesses,
12159
12182
  " more"
12160
12183
  ] })
12161
12184
  ] }),
12162
12185
  zombies.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
12163
- /* @__PURE__ */ jsxs(Text, { color: THEME.status.warning, children: [
12186
+ /* @__PURE__ */ jsxs(Text, { color: THEME.yellow, children: [
12164
12187
  ICONS.warning,
12165
12188
  " Zombie Processes (",
12166
12189
  zombies.length,
12167
12190
  ")"
12168
12191
  ] }),
12169
12192
  zombies.map((z) => /* @__PURE__ */ jsxs(Box, { children: [
12170
- /* @__PURE__ */ jsxs(Text, { color: THEME.status.error, children: [
12193
+ /* @__PURE__ */ jsxs(Text, { color: THEME.red, children: [
12171
12194
  " ",
12172
12195
  ICONS.error,
12173
12196
  " "
12174
12197
  ] }),
12175
- /* @__PURE__ */ jsxs(Text, { color: THEME.text.muted, children: [
12198
+ /* @__PURE__ */ jsxs(Text, { color: THEME.gray, children: [
12176
12199
  "[",
12177
12200
  z.processId,
12178
12201
  "] "
12179
12202
  ] }),
12180
- /* @__PURE__ */ jsxs(Text, { color: THEME.status.warning, children: [
12203
+ /* @__PURE__ */ jsxs(Text, { color: THEME.yellow, children: [
12181
12204
  z.orphanedChildren.length,
12182
12205
  " orphaned children"
12183
12206
  ] })
12184
12207
  ] }, z.processId)),
12185
- /* @__PURE__ */ jsx(Text, { color: THEME.text.muted, children: " Run /cleanup to terminate" })
12208
+ /* @__PURE__ */ jsx(Text, { color: THEME.gray, children: " Run /cleanup to terminate" })
12186
12209
  ] }),
12187
12210
  /* @__PURE__ */ jsxs(Box, { marginTop: running.length > 0 ? 1 : 0, children: [
12188
- /* @__PURE__ */ jsx(Text, { color: THEME.text.muted, children: "Health: " }),
12211
+ /* @__PURE__ */ jsx(Text, { color: THEME.gray, children: "Health: " }),
12189
12212
  /* @__PURE__ */ jsx(Text, { color: healthColor, bold: true, children: health.toUpperCase() })
12190
12213
  ] })
12191
12214
  ] });
@@ -12239,7 +12262,7 @@ import { useState as useState3, useEffect as useEffect3, memo as memo2 } from "r
12239
12262
  import { Text as Text3 } from "ink";
12240
12263
  import { jsx as jsx3 } from "react/jsx-runtime";
12241
12264
  var FRAMES = ["\u2669", "\u266A", "\u266B", "\u266C", "\u266B", "\u266A"];
12242
- var INTERVAL = 600;
12265
+ var INTERVAL = 120;
12243
12266
  var MusicSpinner = memo2(({ color }) => {
12244
12267
  const [index, setIndex] = useState3(0);
12245
12268
  useEffect3(() => {
@@ -12266,12 +12289,12 @@ var StatusDisplay = memo3(({
12266
12289
  const meta = formatMeta(elapsedTime * 1e3, currentTokens);
12267
12290
  return /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", marginTop: 0, children: [
12268
12291
  retryState.status === "retrying" && /* @__PURE__ */ jsxs3(Box3, { marginBottom: 1, children: [
12269
- /* @__PURE__ */ jsx4(Text4, { color: THEME.status.warning, children: /* @__PURE__ */ jsx4(MusicSpinner, { color: THEME.status.warning }) }),
12270
- /* @__PURE__ */ jsxs3(Text4, { color: THEME.status.warning, children: [
12292
+ /* @__PURE__ */ jsx4(Text4, { color: THEME.yellow, children: /* @__PURE__ */ jsx4(MusicSpinner, { color: THEME.yellow }) }),
12293
+ /* @__PURE__ */ jsxs3(Text4, { color: THEME.yellow, children: [
12271
12294
  " \u27F3 Retry #",
12272
12295
  retryState.attempt
12273
12296
  ] }),
12274
- /* @__PURE__ */ jsxs3(Text4, { color: THEME.text.muted, children: [
12297
+ /* @__PURE__ */ jsxs3(Text4, { color: THEME.gray, children: [
12275
12298
  " \xB7 ",
12276
12299
  truncateError(retryState.error)
12277
12300
  ] }),
@@ -12282,12 +12305,12 @@ var StatusDisplay = memo3(({
12282
12305
  ] })
12283
12306
  ] }),
12284
12307
  isProcessing && retryState.status !== "retrying" && /* @__PURE__ */ jsxs3(Box3, { marginBottom: 1, children: [
12285
- /* @__PURE__ */ jsx4(Text4, { color: THEME.spinner, children: /* @__PURE__ */ jsx4(MusicSpinner, { color: THEME.spinner }) }),
12286
- /* @__PURE__ */ jsxs3(Text4, { color: THEME.text.muted, children: [
12308
+ /* @__PURE__ */ jsx4(Text4, { color: THEME.primary, children: /* @__PURE__ */ jsx4(MusicSpinner, { color: THEME.primary }) }),
12309
+ /* @__PURE__ */ jsxs3(Text4, { color: THEME.gray, children: [
12287
12310
  " ",
12288
12311
  currentStatus || "Processing"
12289
12312
  ] }),
12290
- /* @__PURE__ */ jsxs3(Text4, { color: THEME.text.muted, children: [
12313
+ /* @__PURE__ */ jsxs3(Text4, { color: THEME.gray, children: [
12291
12314
  " ",
12292
12315
  meta
12293
12316
  ] })
@@ -12340,17 +12363,18 @@ var ChatInput = memo4(({
12340
12363
  }
12341
12364
  }, []));
12342
12365
  return /* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", children: [
12343
- showPreview && /* @__PURE__ */ jsx5(
12366
+ /* @__PURE__ */ jsx5(
12344
12367
  Box4,
12345
12368
  {
12346
12369
  flexDirection: "column",
12347
- borderStyle: "single",
12348
- borderColor: THEME.border.default,
12349
- paddingX: 1,
12370
+ borderStyle: showPreview ? "single" : void 0,
12371
+ borderColor: showPreview ? THEME.border.default : void 0,
12372
+ paddingX: showPreview ? 1 : 0,
12350
12373
  marginBottom: 0,
12351
- children: suggestions.map((cmd, i) => {
12374
+ height: showPreview ? void 0 : 0,
12375
+ children: showPreview && suggestions.map((cmd, i) => {
12352
12376
  const isFirst = i === 0;
12353
- const nameColor = isFirst ? THEME.primary : THEME.text.secondary;
12377
+ const nameColor = isFirst ? THEME.white : THEME.gray;
12354
12378
  const aliasText = cmd.alias ? ` /${cmd.alias}` : "";
12355
12379
  const argsText = cmd.args ? ` ${cmd.args}` : "";
12356
12380
  return /* @__PURE__ */ jsxs4(Box4, { children: [
@@ -12358,9 +12382,9 @@ var ChatInput = memo4(({
12358
12382
  "/",
12359
12383
  cmd.name
12360
12384
  ] }),
12361
- /* @__PURE__ */ jsx5(Text5, { color: THEME.text.muted, children: argsText }),
12362
- aliasText && /* @__PURE__ */ jsx5(Text5, { color: THEME.text.muted, children: aliasText }),
12363
- /* @__PURE__ */ jsxs4(Text5, { color: THEME.text.muted, children: [
12385
+ /* @__PURE__ */ jsx5(Text5, { color: THEME.gray, children: argsText }),
12386
+ aliasText && /* @__PURE__ */ jsx5(Text5, { color: THEME.gray, children: aliasText }),
12387
+ /* @__PURE__ */ jsxs4(Text5, { color: THEME.gray, children: [
12364
12388
  " \u2014 ",
12365
12389
  cmd.description
12366
12390
  ] }),
@@ -12373,11 +12397,11 @@ var ChatInput = memo4(({
12373
12397
  Box4,
12374
12398
  {
12375
12399
  borderStyle: "single",
12376
- borderColor: inputRequest.status === "active" ? THEME.status.warning : THEME.border.default,
12400
+ borderColor: inputRequest.status === "active" ? THEME.yellow : THEME.border.default,
12377
12401
  paddingX: 1,
12378
12402
  children: inputRequest.status === "active" ? /* @__PURE__ */ jsxs4(Box4, { children: [
12379
- /* @__PURE__ */ jsx5(Text5, { color: THEME.status.warning, children: "[auth]" }),
12380
- /* @__PURE__ */ jsxs4(Text5, { color: THEME.text.muted, children: [
12403
+ /* @__PURE__ */ jsx5(Text5, { color: THEME.yellow, children: "[auth]" }),
12404
+ /* @__PURE__ */ jsxs4(Text5, { color: THEME.gray, children: [
12381
12405
  " ",
12382
12406
  inputRequest.prompt
12383
12407
  ] }),
@@ -12392,7 +12416,7 @@ var ChatInput = memo4(({
12392
12416
  }
12393
12417
  )
12394
12418
  ] }) : /* @__PURE__ */ jsxs4(Box4, { children: [
12395
- /* @__PURE__ */ jsx5(Text5, { color: THEME.text.secondary, children: "\u25B8" }),
12419
+ /* @__PURE__ */ jsx5(Text5, { color: THEME.primary, children: "\u25B8" }),
12396
12420
  /* @__PURE__ */ jsx5(Text5, { children: " " }),
12397
12421
  /* @__PURE__ */ jsx5(
12398
12422
  TextInput,
@@ -12432,26 +12456,26 @@ var Footer = memo5(({ phase, targets, findings, todo, elapsedTime, isProcessing
12432
12456
  justifyContent: "space-between",
12433
12457
  children: [
12434
12458
  /* @__PURE__ */ jsxs5(Box5, { gap: 2, children: [
12435
- /* @__PURE__ */ jsxs5(Text6, { color: THEME.text.muted, children: [
12459
+ /* @__PURE__ */ jsxs5(Text6, { color: THEME.gray, children: [
12436
12460
  "Phase: ",
12437
- /* @__PURE__ */ jsx6(Text6, { color: THEME.primary, children: phase })
12461
+ /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: phase })
12438
12462
  ] }),
12439
- /* @__PURE__ */ jsxs5(Text6, { color: THEME.text.muted, children: [
12463
+ /* @__PURE__ */ jsxs5(Text6, { color: THEME.gray, children: [
12440
12464
  "Targets: ",
12441
- /* @__PURE__ */ jsx6(Text6, { color: THEME.text.secondary, children: targets })
12465
+ /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: targets })
12442
12466
  ] }),
12443
- /* @__PURE__ */ jsxs5(Text6, { color: THEME.text.muted, children: [
12467
+ /* @__PURE__ */ jsxs5(Text6, { color: THEME.gray, children: [
12444
12468
  "Findings: ",
12445
- /* @__PURE__ */ jsx6(Text6, { color: THEME.status.warning, children: findings })
12469
+ /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: findings })
12446
12470
  ] }),
12447
- /* @__PURE__ */ jsxs5(Text6, { color: THEME.text.muted, children: [
12471
+ /* @__PURE__ */ jsxs5(Text6, { color: THEME.gray, children: [
12448
12472
  "Tasks: ",
12449
- /* @__PURE__ */ jsx6(Text6, { color: THEME.text.secondary, children: todo })
12473
+ /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: todo })
12450
12474
  ] })
12451
12475
  ] }),
12452
12476
  /* @__PURE__ */ jsxs5(Box5, { children: [
12453
- /* @__PURE__ */ jsx6(Text6, { color: isProcessing ? THEME.status.running : THEME.text.muted, children: isProcessing ? "Running " : "Idle " }),
12454
- /* @__PURE__ */ jsx6(Text6, { color: THEME.text.secondary, children: formatElapsed(elapsedTime) })
12477
+ /* @__PURE__ */ jsx6(Text6, { color: isProcessing ? THEME.primary : THEME.gray, children: isProcessing ? "Running " : "Idle " }),
12478
+ /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: formatElapsed(elapsedTime) })
12455
12479
  ] })
12456
12480
  ]
12457
12481
  }
@@ -4,9 +4,41 @@ You are an **elite autonomous penetration testing AI** conducting authorized ope
4
4
  You think and act like a **senior offensive security researcher competing in a CTF**.
5
5
  You have direct access to all tools. **You can write your own code** — if a tool or PoC doesn't exist, build it yourself.
6
6
 
7
- ## ABSOLUTE RULE: EVERY TURN MUST PRODUCE TOOL CALLS
7
+ ## FIRST TURN: ANALYZE USER INTENT
8
8
 
9
- **You MUST call at least one tool on EVERY SINGLE TURN.** No exceptions.
9
+ **Before taking any action, you MUST analyze the user's input on the FIRST turn.**
10
+
11
+ ### Intent Classification (Check in Order)
12
+ 1. **Greeting/Small Talk** → Examples: "hi", "hello", "hey", "안녕", "what's up", "how are you"
13
+ - **Response**: Brief friendly greeting + ask what target they want to attack
14
+ - **DO NOT**: Start scanning, searching, or running any commands
15
+
16
+ 2. **Question/Help Request** → Examples: "how do I...", "what is...", "can you explain...", "help"
17
+ - **Response**: Answer the question directly using your knowledge
18
+ - **DO NOT**: Start pentesting operations unless explicitly requested
19
+
20
+ 3. **Unclear/Ambiguous Input** → Examples: single word that's not a target, incomplete sentences
21
+ - **Response**: Ask clarifying question: "What target would you like me to attack?"
22
+ - **DO NOT**: Assume it's a target and start scanning
23
+
24
+ 4. **Pentesting Request** → Examples: IP address, domain, "scan X", "attack Y", "find vulnerabilities in..."
25
+ - **Response**: Proceed with reconnaissance and attack workflow
26
+ - **REQUIRED**: Call tools and execute the pentesting loop
27
+
28
+ ### Greeting Response Template
29
+ ```
30
+ 👋 Hello! I'm your pentesting agent. I can help you with:
31
+ - Network reconnaissance and scanning
32
+ - Vulnerability discovery and exploitation
33
+ - Post-exploitation and privilege escalation
34
+ - CTF challenges and security assessments
35
+
36
+ What target would you like me to attack? (e.g., IP address, domain, or CTF challenge)
37
+ ```
38
+
39
+ ## SUBSEQUENT TURNS: EVERY TURN MUST PRODUCE TOOL CALLS
40
+
41
+ **Once pentesting has started, you MUST call at least one tool on EVERY SINGLE TURN.** No exceptions.
10
42
 
11
43
  - FORBIDDEN: Outputting text without tool calls (planning, summarizing, asking)
12
44
  - FORBIDDEN: "Let me think about this..." or "I'll plan my approach..."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pentesting",
3
- "version": "0.44.0",
3
+ "version": "0.44.1",
4
4
  "description": "Autonomous Penetration Testing AI Agent",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",