pentesting 0.56.4 → 0.56.6

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 +270 -255
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -711,7 +711,7 @@ var INPUT_PROMPT_PATTERNS = [
711
711
 
712
712
  // src/shared/constants/agent.ts
713
713
  var APP_NAME = "Pentest AI";
714
- var APP_VERSION = "0.56.4";
714
+ var APP_VERSION = "0.56.6";
715
715
  var APP_DESCRIPTION = "Autonomous Penetration Testing AI Agent";
716
716
  var LLM_ROLES = {
717
717
  SYSTEM: "system",
@@ -764,11 +764,10 @@ var CLI_SCAN_TYPES = Object.freeze([
764
764
  // src/platform/tui/cli/commands/interactive.tsx
765
765
  import { render } from "ink";
766
766
  import chalk from "chalk";
767
- import gradient from "gradient-string";
768
767
 
769
768
  // src/platform/tui/app.tsx
770
- import { useState as useState8, useCallback as useCallback11, useRef as useRef10 } from "react";
771
- import { Box as Box18, useApp, useStdout as useStdout4 } from "ink";
769
+ import { useState as useState9, useCallback as useCallback11, useRef as useRef10 } from "react";
770
+ import { Box as Box19, useApp, useStdout as useStdout4 } from "ink";
772
771
 
773
772
  // src/platform/tui/hooks/useAgent.ts
774
773
  import { useState as useState2, useEffect as useEffect2, useCallback as useCallback2, useRef as useRef3 } from "react";
@@ -11950,13 +11949,13 @@ async function digestToolOutput(output, toolName, toolInput, analystFn) {
11950
11949
  try {
11951
11950
  const context = `Tool: ${toolName}${toolInput ? ` | Input: ${toolInput}` : ""}`;
11952
11951
  const rawAnalystResponse = await analystFn(preprocessed, context);
11953
- const memo13 = parseAnalystMemo(rawAnalystResponse);
11952
+ const memo14 = parseAnalystMemo(rawAnalystResponse);
11954
11953
  const formatted = formatAnalystDigest(rawAnalystResponse, savedOutputPath, originalLength);
11955
11954
  return {
11956
11955
  digestedOutput: formatted,
11957
11956
  fullOutputPath: savedOutputPath,
11958
11957
  analystUsed: true,
11959
- memo: memo13,
11958
+ memo: memo14,
11960
11959
  originalLength,
11961
11960
  digestedLength: formatted.length,
11962
11961
  compressionRatio: formatted.length / originalLength
@@ -12890,7 +12889,7 @@ function buildSummaryFromEntries(entries) {
12890
12889
 
12891
12890
  // src/shared/utils/journal/formatters/record.ts
12892
12891
  function formatTurnRecord(input) {
12893
- const { turn, timestamp, phase, tools, memo: memo13, reflection } = input;
12892
+ const { turn, timestamp, phase, tools, memo: memo14, reflection } = input;
12894
12893
  const time = timestamp.slice(0, 19).replace("T", " ");
12895
12894
  const sections = [];
12896
12895
  sections.push(`# Turn ${turn} | ${time} | Phase: ${phase}`);
@@ -12907,25 +12906,25 @@ function formatTurnRecord(input) {
12907
12906
  }
12908
12907
  sections.push("");
12909
12908
  sections.push(`## ${TURN_SECTIONS.KEY_INSIGHTS}`);
12910
- if (memo13.keyFindings.length > 0) {
12911
- for (const f of memo13.keyFindings) sections.push(`- ${INSIGHT_TAGS.DISCOVERED}: ${f}`);
12909
+ if (memo14.keyFindings.length > 0) {
12910
+ for (const f of memo14.keyFindings) sections.push(`- ${INSIGHT_TAGS.DISCOVERED}: ${f}`);
12912
12911
  }
12913
- if (memo13.credentials.length > 0) {
12914
- for (const c of memo13.credentials) sections.push(`- ${INSIGHT_TAGS.CREDENTIAL}: ${c}`);
12912
+ if (memo14.credentials.length > 0) {
12913
+ for (const c of memo14.credentials) sections.push(`- ${INSIGHT_TAGS.CREDENTIAL}: ${c}`);
12915
12914
  }
12916
- if (memo13.attackVectors.length > 0) {
12917
- for (const v of memo13.attackVectors) sections.push(`- ${INSIGHT_TAGS.CONFIRMED}: ${v}`);
12915
+ if (memo14.attackVectors.length > 0) {
12916
+ for (const v of memo14.attackVectors) sections.push(`- ${INSIGHT_TAGS.CONFIRMED}: ${v}`);
12918
12917
  }
12919
- if (memo13.failures.length > 0) {
12920
- for (const f of memo13.failures) sections.push(`- ${INSIGHT_TAGS.DEAD_END}: ${f}`);
12918
+ if (memo14.failures.length > 0) {
12919
+ for (const f of memo14.failures) sections.push(`- ${INSIGHT_TAGS.DEAD_END}: ${f}`);
12921
12920
  }
12922
- if (memo13.suspicions.length > 0) {
12923
- for (const s of memo13.suspicions) sections.push(`- ${INSIGHT_TAGS.SUSPICIOUS}: ${s}`);
12921
+ if (memo14.suspicions.length > 0) {
12922
+ for (const s of memo14.suspicions) sections.push(`- ${INSIGHT_TAGS.SUSPICIOUS}: ${s}`);
12924
12923
  }
12925
- if (memo13.nextSteps.length > 0) {
12926
- for (const n of memo13.nextSteps) sections.push(`- ${INSIGHT_TAGS.NEXT}: ${n}`);
12924
+ if (memo14.nextSteps.length > 0) {
12925
+ for (const n of memo14.nextSteps) sections.push(`- ${INSIGHT_TAGS.NEXT}: ${n}`);
12927
12926
  }
12928
- if (memo13.keyFindings.length === 0 && memo13.failures.length === 0 && memo13.credentials.length === 0) {
12927
+ if (memo14.keyFindings.length === 0 && memo14.failures.length === 0 && memo14.credentials.length === 0) {
12929
12928
  sections.push(`- ${TURN_EMPTY_MESSAGES.NO_INSIGHTS}`);
12930
12929
  }
12931
12930
  sections.push("");
@@ -12937,7 +12936,7 @@ function formatTurnRecord(input) {
12937
12936
 
12938
12937
  // src/shared/utils/journal/formatters/reflection.ts
12939
12938
  function formatReflectionInput(input) {
12940
- const { tools, memo: memo13, phase } = input;
12939
+ const { tools, memo: memo14, phase } = input;
12941
12940
  const parts = [
12942
12941
  `\uD604\uC7AC Phase: ${phase}`,
12943
12942
  "",
@@ -12955,12 +12954,12 @@ function formatReflectionInput(input) {
12955
12954
  }
12956
12955
  parts.push("");
12957
12956
  parts.push("Analyst \uCD94\uCD9C \uBA54\uBAA8:");
12958
- if (memo13) {
12959
- if (memo13.keyFindings.length > 0) parts.push(` \uBC1C\uACAC: ${memo13.keyFindings.join(", ")}`);
12960
- if (memo13.credentials.length > 0) parts.push(` \uD06C\uB808\uB374\uC15C: ${memo13.credentials.join(", ")}`);
12961
- if (memo13.failures.length > 0) parts.push(` \uC2E4\uD328: ${memo13.failures.join(", ")}`);
12962
- if (memo13.suspicions.length > 0) parts.push(` \uC758\uC2EC: ${memo13.suspicions.join(", ")}`);
12963
- parts.push(` \uACF5\uACA9 \uAC00\uCE58: ${memo13.attackValue}`);
12957
+ if (memo14) {
12958
+ if (memo14.keyFindings.length > 0) parts.push(` \uBC1C\uACAC: ${memo14.keyFindings.join(", ")}`);
12959
+ if (memo14.credentials.length > 0) parts.push(` \uD06C\uB808\uB374\uC15C: ${memo14.credentials.join(", ")}`);
12960
+ if (memo14.failures.length > 0) parts.push(` \uC2E4\uD328: ${memo14.failures.join(", ")}`);
12961
+ if (memo14.suspicions.length > 0) parts.push(` \uC758\uC2EC: ${memo14.suspicions.join(", ")}`);
12962
+ parts.push(` \uACF5\uACA9 \uAC00\uCE58: ${memo14.attackValue}`);
12964
12963
  } else {
12965
12964
  parts.push(" (\uBD84\uC11D \uACB0\uACFC \uC5C6\uC74C)");
12966
12965
  }
@@ -13785,13 +13784,13 @@ ${extraction.extractedContext}
13785
13784
  }
13786
13785
  return false;
13787
13786
  }
13788
- async function processReflection(toolJournal, memo13, phase, reflector) {
13787
+ async function processReflection(toolJournal, memo14, phase, reflector) {
13789
13788
  if (toolJournal.length === 0) {
13790
13789
  return null;
13791
13790
  }
13792
13791
  const reflection = await reflector.execute({
13793
13792
  tools: toolJournal,
13794
- memo: memo13,
13793
+ memo: memo14,
13795
13794
  phase
13796
13795
  });
13797
13796
  if (reflection.success && reflection.reflection) {
@@ -13804,7 +13803,7 @@ async function processReflection(toolJournal, memo13, phase, reflector) {
13804
13803
  import { writeFileSync as writeFileSync10, existsSync as existsSync15, readFileSync as readFileSync10 } from "fs";
13805
13804
  import { join as join16 } from "path";
13806
13805
  async function recordTurn(context) {
13807
- const { turnCounter, phase, toolJournal, memo: memo13, reflections, summaryRegenerator } = context;
13806
+ const { turnCounter, phase, toolJournal, memo: memo14, reflections, summaryRegenerator } = context;
13808
13807
  if (toolJournal.length === 0) {
13809
13808
  return turnCounter;
13810
13809
  }
@@ -13814,17 +13813,17 @@ async function recordTurn(context) {
13814
13813
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
13815
13814
  phase,
13816
13815
  tools: toolJournal,
13817
- memo: memo13,
13818
- reflection: reflections.length > 0 ? reflections.join(" | ") : memo13.nextSteps.join("; ")
13816
+ memo: memo14,
13817
+ reflection: reflections.length > 0 ? reflections.join(" | ") : memo14.nextSteps.join("; ")
13819
13818
  };
13820
- await createTurnArchive(turnCounter, entry, toolJournal, memo13, phase, reflections);
13821
- await regenerateSummary(turnCounter, summaryRegenerator, entry, toolJournal, memo13, phase, reflections);
13819
+ await createTurnArchive(turnCounter, entry, toolJournal, memo14, phase, reflections);
13820
+ await regenerateSummary(turnCounter, summaryRegenerator, entry, toolJournal, memo14, phase, reflections);
13822
13821
  rotateTurnRecords();
13823
13822
  } catch {
13824
13823
  }
13825
13824
  return turnCounter + 1;
13826
13825
  }
13827
- async function createTurnArchive(turnCounter, entry, journalTools, memo13, phase, reflections) {
13826
+ async function createTurnArchive(turnCounter, entry, journalTools, memo14, phase, reflections) {
13828
13827
  try {
13829
13828
  const turnDir = WORKSPACE.turnPath(turnCounter);
13830
13829
  const toolsDir = WORKSPACE.turnToolsPath(turnCounter);
@@ -13835,28 +13834,28 @@ async function createTurnArchive(turnCounter, entry, journalTools, memo13, phase
13835
13834
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
13836
13835
  phase,
13837
13836
  tools: journalTools,
13838
- memo: memo13,
13837
+ memo: memo14,
13839
13838
  reflection: entry.reflection
13840
13839
  });
13841
13840
  writeFileSync10(join16(turnDir, TURN_FILES.RECORD), turnContent, "utf-8");
13842
13841
  writeFileSync10(join16(turnDir, TURN_FILES.STRUCTURED), JSON.stringify(entry, null, 2), "utf-8");
13843
- writeAnalystFile(turnDir, memo13);
13842
+ writeAnalystFile(turnDir, memo14);
13844
13843
  } catch {
13845
13844
  }
13846
13845
  }
13847
- function writeAnalystFile(turnDir, memo13) {
13846
+ function writeAnalystFile(turnDir, memo14) {
13848
13847
  const memoLines = [];
13849
- if (memo13.keyFindings.length > 0) memoLines.push("## Key Findings", ...memo13.keyFindings.map((f) => `- ${f}`), "");
13850
- if (memo13.credentials.length > 0) memoLines.push("## Credentials", ...memo13.credentials.map((c) => `- ${c}`), "");
13851
- if (memo13.attackVectors.length > 0) memoLines.push("## Attack Vectors", ...memo13.attackVectors.map((v) => `- ${v}`), "");
13852
- if (memo13.failures.length > 0) memoLines.push("## Failures", ...memo13.failures.map((f) => `- ${f}`), "");
13853
- if (memo13.suspicions.length > 0) memoLines.push("## Suspicious", ...memo13.suspicions.map((s) => `- ${s}`), "");
13854
- if (memo13.nextSteps.length > 0) memoLines.push("## Next Steps", ...memo13.nextSteps.map((n) => `- ${n}`), "");
13848
+ if (memo14.keyFindings.length > 0) memoLines.push("## Key Findings", ...memo14.keyFindings.map((f) => `- ${f}`), "");
13849
+ if (memo14.credentials.length > 0) memoLines.push("## Credentials", ...memo14.credentials.map((c) => `- ${c}`), "");
13850
+ if (memo14.attackVectors.length > 0) memoLines.push("## Attack Vectors", ...memo14.attackVectors.map((v) => `- ${v}`), "");
13851
+ if (memo14.failures.length > 0) memoLines.push("## Failures", ...memo14.failures.map((f) => `- ${f}`), "");
13852
+ if (memo14.suspicions.length > 0) memoLines.push("## Suspicious", ...memo14.suspicions.map((s) => `- ${s}`), "");
13853
+ if (memo14.nextSteps.length > 0) memoLines.push("## Next Steps", ...memo14.nextSteps.map((n) => `- ${n}`), "");
13855
13854
  if (memoLines.length > 0) {
13856
13855
  writeFileSync10(join16(turnDir, TURN_FILES.ANALYST), memoLines.join("\n"), "utf-8");
13857
13856
  }
13858
13857
  }
13859
- async function regenerateSummary(turnCounter, summaryRegenerator, entry, journalTools, memo13, phase, reflections) {
13858
+ async function regenerateSummary(turnCounter, summaryRegenerator, entry, journalTools, memo14, phase, reflections) {
13860
13859
  try {
13861
13860
  const turnDir = WORKSPACE.turnPath(turnCounter);
13862
13861
  const summaryPath = join16(turnDir, TURN_FILES.SUMMARY);
@@ -13873,7 +13872,7 @@ async function regenerateSummary(turnCounter, summaryRegenerator, entry, journal
13873
13872
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
13874
13873
  phase,
13875
13874
  tools: journalTools,
13876
- memo: memo13,
13875
+ memo: memo14,
13877
13876
  reflection: entry.reflection
13878
13877
  });
13879
13878
  const summaryResult = await summaryRegenerator.execute({
@@ -15357,8 +15356,8 @@ var useKeyboardShortcuts = ({
15357
15356
  };
15358
15357
 
15359
15358
  // src/platform/tui/components/MessageList.tsx
15360
- import { memo as memo6, useState as useState3, useCallback as useCallback8, useRef as useRef6 } from "react";
15361
- import { Box as Box7, Text as Text7, useInput as useInput2 } from "ink";
15359
+ import { memo as memo7, useState as useState4, useCallback as useCallback8, useRef as useRef6 } from "react";
15360
+ import { Box as Box8, Text as Text8, useInput as useInput2 } from "ink";
15362
15361
 
15363
15362
  // src/platform/tui/components/messages/ThinkingBlock.tsx
15364
15363
  import { memo } from "react";
@@ -15883,52 +15882,87 @@ var MessageRow = memo4(({ msg, isExpanded }) => {
15883
15882
  });
15884
15883
 
15885
15884
  // src/platform/tui/components/messages/EmptyState.tsx
15886
- import { memo as memo5 } from "react";
15885
+ import { memo as memo6 } from "react";
15886
+ import { Box as Box7, Text as Text7 } from "ink";
15887
+
15888
+ // src/platform/tui/components/ShimmerBanner.tsx
15889
+ import { useState as useState3, useEffect as useEffect5, memo as memo5 } from "react";
15887
15890
  import { Box as Box6, Text as Text6 } from "ink";
15888
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
15889
- var EmptyState = memo5(({ modelName, autoApproveMode, version }) => {
15891
+ import { jsx as jsx6 } from "react/jsx-runtime";
15892
+ var FRAME_INTERVAL = 60;
15893
+ var WAVE_SPEED = 0.22;
15894
+ var CHAR_GAP = 0.18;
15895
+ var ROW_GAP = 1.6;
15896
+ function waveColor(sin) {
15897
+ const t = (sin + 1) / 2;
15898
+ const r = Math.round(36 + t * (255 - 36));
15899
+ const g = Math.round(150 + t * (255 - 150));
15900
+ const b = Math.round(237 + t * (255 - 237));
15901
+ return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
15902
+ }
15903
+ var ShimmerBanner = memo5(({ banner }) => {
15904
+ const [tick, setTick] = useState3(0);
15905
+ useEffect5(() => {
15906
+ const timer = setInterval(() => setTick((t) => t + 1), FRAME_INTERVAL);
15907
+ return () => clearInterval(timer);
15908
+ }, []);
15909
+ const globalPhase = tick * WAVE_SPEED;
15910
+ const lines = banner.split("\n").filter((l) => l.length > 0);
15911
+ return /* @__PURE__ */ jsx6(Box6, { flexDirection: "column", children: lines.map((line, row) => /* @__PURE__ */ jsx6(Text6, { children: Array.from(line).map((char, col) => {
15912
+ const phase = globalPhase - col * CHAR_GAP - row * ROW_GAP;
15913
+ const sin = Math.sin(phase);
15914
+ const color = char.trim() === "" ? HEX.primary : waveColor(sin);
15915
+ return /* @__PURE__ */ jsx6(Text6, { color, children: char }, col);
15916
+ }) }, row)) });
15917
+ });
15918
+
15919
+ // src/platform/tui/components/messages/EmptyState.tsx
15920
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
15921
+ var EmptyState = memo6(({ modelName, autoApproveMode, version }) => {
15890
15922
  const autoLabel = autoApproveMode ? "ON" : "OFF";
15891
15923
  const autoColor = autoApproveMode ? THEME.primary : THEME.gray;
15892
- return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", paddingX: 1, paddingY: 1, children: [
15893
- /* @__PURE__ */ jsxs6(Box6, { gap: 2, children: [
15894
- /* @__PURE__ */ jsx6(Text6, { color: THEME.primary, bold: true, children: "\u25C8 Pentesting Agent" }),
15895
- version && /* @__PURE__ */ jsx6(Text6, { color: THEME.dimGray, children: `v${version}` }),
15896
- modelName && /* @__PURE__ */ jsxs6(Text6, { color: THEME.dimGray, children: [
15924
+ return /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", paddingX: 1, paddingY: 1, children: [
15925
+ /* @__PURE__ */ jsx7(ShimmerBanner, { banner: ASCII_BANNER }),
15926
+ /* @__PURE__ */ jsx7(Text7, { children: " " }),
15927
+ /* @__PURE__ */ jsxs6(Box7, { gap: 2, children: [
15928
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.primary, bold: true, children: "\u25C8 Pentesting" }),
15929
+ version && /* @__PURE__ */ jsx7(Text7, { color: THEME.dimGray, children: `v${version}` }),
15930
+ modelName && /* @__PURE__ */ jsxs6(Text7, { color: THEME.dimGray, children: [
15897
15931
  "\xB7",
15898
15932
  " ",
15899
- /* @__PURE__ */ jsx6(Text6, { color: THEME.gray, children: modelName })
15933
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.gray, children: modelName })
15900
15934
  ] }),
15901
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.dimGray, children: [
15935
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.dimGray, children: [
15902
15936
  "\xB7",
15903
15937
  " Auto: ",
15904
- /* @__PURE__ */ jsx6(Text6, { color: autoColor, children: autoLabel })
15938
+ /* @__PURE__ */ jsx7(Text7, { color: autoColor, children: autoLabel })
15905
15939
  ] })
15906
15940
  ] }),
15907
- /* @__PURE__ */ jsx6(Text6, { children: " " }),
15908
- /* @__PURE__ */ jsx6(Text6, { color: THEME.gray, children: " Get started:" }),
15909
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.gray, children: [
15941
+ /* @__PURE__ */ jsx7(Text7, { children: " " }),
15942
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.gray, children: " Get started:" }),
15943
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
15910
15944
  " ",
15911
15945
  " ",
15912
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.white, children: [
15946
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.white, children: [
15913
15947
  "/target ",
15914
15948
  "<ip>"
15915
15949
  ] }),
15916
15950
  " \u2014 Set target IP or domain"
15917
15951
  ] }),
15918
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.gray, children: [
15952
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
15919
15953
  " ",
15920
15954
  " ",
15921
- /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: "/start" }),
15955
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.white, children: "/start" }),
15922
15956
  " \u2014 Begin autonomous pentest"
15923
15957
  ] }),
15924
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.gray, children: [
15958
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
15925
15959
  " ",
15926
15960
  " ",
15927
- /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: "/help" }),
15961
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.white, children: "/help" }),
15928
15962
  " \u2014 Show all commands"
15929
15963
  ] }),
15930
- /* @__PURE__ */ jsx6(Text6, { children: " " }),
15931
- /* @__PURE__ */ jsx6(Text6, { color: THEME.dimGray, children: " Or just type a task and press Enter." })
15964
+ /* @__PURE__ */ jsx7(Text7, { children: " " }),
15965
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.dimGray, children: " Or just type a task and press Enter." })
15932
15966
  ] });
15933
15967
  });
15934
15968
 
@@ -15943,9 +15977,9 @@ function computeSlidingWindow(messages, scrollOffset) {
15943
15977
  }
15944
15978
 
15945
15979
  // src/platform/tui/components/MessageList.tsx
15946
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
15947
- var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, version, scrollOffset = 0 }) => {
15948
- const [expandedIds, setExpandedIds] = useState3(/* @__PURE__ */ new Set());
15980
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
15981
+ var MessageList = memo7(({ messages, isModalOpen, modelName, autoApproveMode, version, scrollOffset = 0 }) => {
15982
+ const [expandedIds, setExpandedIds] = useState4(/* @__PURE__ */ new Set());
15949
15983
  const messagesRef = useRef6(messages);
15950
15984
  messagesRef.current = messages;
15951
15985
  const isModalOpenRef = useRef6(isModalOpen);
@@ -15999,7 +16033,7 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
15999
16033
  }
16000
16034
  }, []));
16001
16035
  if (messages.length === 0) {
16002
- return /* @__PURE__ */ jsx7(
16036
+ return /* @__PURE__ */ jsx8(
16003
16037
  EmptyState,
16004
16038
  {
16005
16039
  modelName,
@@ -16009,9 +16043,9 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
16009
16043
  );
16010
16044
  }
16011
16045
  const { visibleMessages, hiddenAbove, clampedOffset } = computeSlidingWindow(messages, scrollOffset);
16012
- return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", children: [
16013
- clampedOffset > 0 && /* @__PURE__ */ jsx7(Box7, { paddingX: 1, children: /* @__PURE__ */ jsx7(Text7, { dimColor: true, color: THEME.dimGray, children: `\u2191 ${hiddenAbove} message${hiddenAbove !== 1 ? "s" : ""} above \xB7 PgDn to scroll down` }) }),
16014
- visibleMessages.map((msg) => /* @__PURE__ */ jsx7(
16046
+ return /* @__PURE__ */ jsxs7(Box8, { flexDirection: "column", children: [
16047
+ clampedOffset > 0 && /* @__PURE__ */ jsx8(Box8, { paddingX: 1, children: /* @__PURE__ */ jsx8(Text8, { dimColor: true, color: THEME.dimGray, children: `\u2191 ${hiddenAbove} message${hiddenAbove !== 1 ? "s" : ""} above \xB7 PgDn to scroll down` }) }),
16048
+ visibleMessages.map((msg) => /* @__PURE__ */ jsx8(
16015
16049
  MessageRow,
16016
16050
  {
16017
16051
  msg,
@@ -16023,16 +16057,16 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
16023
16057
  });
16024
16058
 
16025
16059
  // src/platform/tui/components/StatusDisplay.tsx
16026
- import { memo as memo9 } from "react";
16027
- import { Box as Box10, Text as Text12 } from "ink";
16060
+ import { memo as memo10 } from "react";
16061
+ import { Box as Box11, Text as Text13 } from "ink";
16028
16062
 
16029
16063
  // src/platform/tui/hooks/useStatusTimer.ts
16030
- import { useState as useState4, useEffect as useEffect5, useRef as useRef7 } from "react";
16064
+ import { useState as useState5, useEffect as useEffect6, useRef as useRef7 } from "react";
16031
16065
  var useStatusTimer = (currentStatus, isProcessing) => {
16032
- const [statusElapsed, setStatusElapsed] = useState4(0);
16066
+ const [statusElapsed, setStatusElapsed] = useState5(0);
16033
16067
  const statusTimerRef = useRef7(null);
16034
16068
  const statusStartRef = useRef7(Date.now());
16035
- useEffect5(() => {
16069
+ useEffect6(() => {
16036
16070
  if (statusTimerRef.current) clearInterval(statusTimerRef.current);
16037
16071
  if (isProcessing && currentStatus) {
16038
16072
  statusStartRef.current = Date.now();
@@ -16052,12 +16086,12 @@ var useStatusTimer = (currentStatus, isProcessing) => {
16052
16086
  };
16053
16087
 
16054
16088
  // src/platform/tui/components/status/RetryView.tsx
16055
- import { Box as Box8, Text as Text9 } from "ink";
16089
+ import { Box as Box9, Text as Text10 } from "ink";
16056
16090
 
16057
16091
  // src/platform/tui/components/MusicSpinner.tsx
16058
- import { useState as useState5, useEffect as useEffect6, memo as memo7 } from "react";
16059
- import { Text as Text8 } from "ink";
16060
- import { jsx as jsx8 } from "react/jsx-runtime";
16092
+ import { useState as useState6, useEffect as useEffect7, memo as memo8 } from "react";
16093
+ import { Text as Text9 } from "ink";
16094
+ import { jsx as jsx9 } from "react/jsx-runtime";
16061
16095
  var FRAMES = [
16062
16096
  "\xB7",
16063
16097
  "\u2726",
@@ -16075,39 +16109,39 @@ var FRAMES = [
16075
16109
  "\u2726"
16076
16110
  ];
16077
16111
  var INTERVAL = 100;
16078
- var MusicSpinner = memo7(({ color }) => {
16079
- const [index, setIndex] = useState5(0);
16080
- useEffect6(() => {
16112
+ var MusicSpinner = memo8(({ color }) => {
16113
+ const [index, setIndex] = useState6(0);
16114
+ useEffect7(() => {
16081
16115
  const timer = setInterval(() => {
16082
16116
  setIndex((i) => (i + 1) % FRAMES.length);
16083
16117
  }, INTERVAL);
16084
16118
  return () => clearInterval(timer);
16085
16119
  }, []);
16086
- return /* @__PURE__ */ jsx8(Text8, { color: color || "yellow", children: FRAMES[index] });
16120
+ return /* @__PURE__ */ jsx9(Text9, { color: color || "yellow", children: FRAMES[index] });
16087
16121
  });
16088
16122
 
16089
16123
  // src/platform/tui/components/status/RetryView.tsx
16090
- import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
16124
+ import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
16091
16125
  var RetryView = ({ retryState }) => {
16092
16126
  const truncateError = (err) => {
16093
16127
  return err.length > DISPLAY_LIMITS.RETRY_ERROR_PREVIEW ? err.substring(0, DISPLAY_LIMITS.RETRY_ERROR_TRUNCATED) + "..." : err;
16094
16128
  };
16095
- return /* @__PURE__ */ jsxs8(Box8, { flexDirection: "column", height: 2, children: [
16096
- /* @__PURE__ */ jsxs8(Box8, { children: [
16097
- /* @__PURE__ */ jsx9(Text9, { color: THEME.yellow, wrap: "truncate", children: /* @__PURE__ */ jsx9(MusicSpinner, { color: THEME.yellow }) }),
16098
- /* @__PURE__ */ jsxs8(Text9, { color: THEME.yellow, bold: true, wrap: "truncate", children: [
16129
+ return /* @__PURE__ */ jsxs8(Box9, { flexDirection: "column", height: 2, children: [
16130
+ /* @__PURE__ */ jsxs8(Box9, { children: [
16131
+ /* @__PURE__ */ jsx10(Text10, { color: THEME.yellow, wrap: "truncate", children: /* @__PURE__ */ jsx10(MusicSpinner, { color: THEME.yellow }) }),
16132
+ /* @__PURE__ */ jsxs8(Text10, { color: THEME.yellow, bold: true, wrap: "truncate", children: [
16099
16133
  " \u29F3 Retry #",
16100
16134
  retryState.attempt,
16101
16135
  "/",
16102
16136
  retryState.maxRetries
16103
16137
  ] }),
16104
- /* @__PURE__ */ jsxs8(Text9, { color: THEME.gray, wrap: "truncate", children: [
16138
+ /* @__PURE__ */ jsxs8(Text10, { color: THEME.gray, wrap: "truncate", children: [
16105
16139
  " \u2014 ",
16106
16140
  retryState.countdown,
16107
16141
  "s"
16108
16142
  ] })
16109
16143
  ] }),
16110
- /* @__PURE__ */ jsx9(Box8, { children: /* @__PURE__ */ jsxs8(Text9, { color: THEME.gray, wrap: "truncate", children: [
16144
+ /* @__PURE__ */ jsx10(Box9, { children: /* @__PURE__ */ jsxs8(Text10, { color: THEME.gray, wrap: "truncate", children: [
16111
16145
  " ",
16112
16146
  truncateError(retryState.error)
16113
16147
  ] }) })
@@ -16115,49 +16149,40 @@ var RetryView = ({ retryState }) => {
16115
16149
  };
16116
16150
 
16117
16151
  // src/platform/tui/components/status/ProcessingView.tsx
16118
- import { Box as Box9, Text as Text11 } from "ink";
16152
+ import { Box as Box10, Text as Text12 } from "ink";
16119
16153
 
16120
16154
  // src/platform/tui/components/ShimmerText.tsx
16121
- import { useState as useState6, useEffect as useEffect7, memo as memo8 } from "react";
16122
- import { Text as Text10 } from "ink";
16123
- import { jsx as jsx10 } from "react/jsx-runtime";
16124
- var SHIMMER_COLORS = [
16125
- "#FFFFFF",
16126
- // 0: peak bright (white)
16127
- "#E0E0E0",
16128
- // 1
16129
- "#C0C0C0",
16130
- // 2
16131
- "#A0A0A0",
16132
- // 3: mid
16133
- "#808080",
16134
- // 4
16135
- "#606060",
16136
- // 5: dim trough
16137
- "#808080",
16138
- // 6
16139
- "#A0A0A0",
16140
- // 7: mid
16141
- "#C0C0C0",
16142
- // 8
16143
- "#E0E0E0"
16144
- // 9
16145
- ];
16146
- var SHIMMER_INTERVAL = 80;
16147
- var ShimmerText = memo8(({ children, bold, phase = 0 }) => {
16148
- const [frame, setFrame] = useState6(phase % SHIMMER_COLORS.length);
16149
- useEffect7(() => {
16155
+ import { useState as useState7, useEffect as useEffect8, memo as memo9 } from "react";
16156
+ import { Text as Text11 } from "ink";
16157
+ import { jsx as jsx11 } from "react/jsx-runtime";
16158
+ var FRAME_INTERVAL2 = 60;
16159
+ var WAVE_SPEED2 = 0.25;
16160
+ var CHAR_PHASE_GAP = 0.55;
16161
+ function sinToColor(sin) {
16162
+ const t = (sin + 1) / 2;
16163
+ const brightness = Math.round(56 + t * (255 - 56));
16164
+ const hex = brightness.toString(16).padStart(2, "0");
16165
+ return `#${hex}${hex}${hex}`;
16166
+ }
16167
+ var ShimmerText = memo9(({ children, bold, phase = 0 }) => {
16168
+ const [tick, setTick] = useState7(0);
16169
+ useEffect8(() => {
16150
16170
  const timer = setInterval(() => {
16151
- setFrame((f) => (f + 1) % SHIMMER_COLORS.length);
16152
- }, SHIMMER_INTERVAL);
16171
+ setTick((t) => t + 1);
16172
+ }, FRAME_INTERVAL2);
16153
16173
  return () => clearInterval(timer);
16154
16174
  }, []);
16155
- const color = SHIMMER_COLORS[frame];
16156
- return /* @__PURE__ */ jsx10(Text10, { color, bold, children });
16175
+ const globalPhase = tick * WAVE_SPEED2 + phase;
16176
+ return /* @__PURE__ */ jsx11(Text11, { bold, children: Array.from(children).map((char, i) => {
16177
+ const charPhase = globalPhase - i * CHAR_PHASE_GAP;
16178
+ const sin = Math.sin(charPhase);
16179
+ const color = sinToColor(sin);
16180
+ return /* @__PURE__ */ jsx11(Text11, { color, children: char }, i);
16181
+ }) });
16157
16182
  });
16158
16183
 
16159
16184
  // src/platform/tui/components/status/ProcessingView.tsx
16160
- import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
16185
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
16161
16186
  var ProcessingView = ({
16162
16187
  statusMain,
16163
16188
  detailText,
@@ -16173,26 +16198,26 @@ var ProcessingView = ({
16173
16198
  return parts.length > 0 ? `(${parts.join(" \xB7 ")})` : "";
16174
16199
  };
16175
16200
  const meta = buildMeta();
16176
- return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", height: 2, children: [
16177
- /* @__PURE__ */ jsxs9(Box9, { children: [
16178
- /* @__PURE__ */ jsx11(Text11, { color, wrap: "truncate", children: /* @__PURE__ */ jsx11(MusicSpinner, { color }) }),
16179
- /* @__PURE__ */ jsx11(Text11, { children: " " }),
16180
- /* @__PURE__ */ jsx11(ShimmerText, { bold: true, phase: 0, children: statusMain }),
16181
- /* @__PURE__ */ jsxs9(Text11, { color: THEME.dimGray, wrap: "truncate", children: [
16201
+ return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", height: 2, children: [
16202
+ /* @__PURE__ */ jsxs9(Box10, { children: [
16203
+ /* @__PURE__ */ jsx12(Text12, { color, wrap: "truncate", children: /* @__PURE__ */ jsx12(MusicSpinner, { color }) }),
16204
+ /* @__PURE__ */ jsx12(Text12, { children: " " }),
16205
+ /* @__PURE__ */ jsx12(ShimmerText, { bold: true, phase: 0, children: statusMain }),
16206
+ /* @__PURE__ */ jsxs9(Text12, { color: THEME.dimGray, wrap: "truncate", children: [
16182
16207
  " ",
16183
16208
  meta
16184
16209
  ] })
16185
16210
  ] }),
16186
- /* @__PURE__ */ jsx11(Box9, { children: detailText ? /* @__PURE__ */ jsxs9(Text11, { color: THEME.dimGray, wrap: "truncate", children: [
16211
+ /* @__PURE__ */ jsx12(Box10, { children: detailText ? /* @__PURE__ */ jsxs9(Text12, { color: THEME.dimGray, wrap: "truncate", children: [
16187
16212
  " ",
16188
16213
  detailText
16189
- ] }) : /* @__PURE__ */ jsx11(Text11, { children: " " }) })
16214
+ ] }) : /* @__PURE__ */ jsx12(Text12, { children: " " }) })
16190
16215
  ] });
16191
16216
  };
16192
16217
 
16193
16218
  // src/platform/tui/components/StatusDisplay.tsx
16194
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
16195
- var StatusDisplay = memo9(({
16219
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
16220
+ var StatusDisplay = memo10(({
16196
16221
  retryState,
16197
16222
  isProcessing,
16198
16223
  currentStatus,
@@ -16200,14 +16225,14 @@ var StatusDisplay = memo9(({
16200
16225
  }) => {
16201
16226
  const statusElapsed = useStatusTimer(currentStatus, isProcessing);
16202
16227
  if (retryState && retryState.status === "retrying") {
16203
- return /* @__PURE__ */ jsx12(RetryView, { retryState });
16228
+ return /* @__PURE__ */ jsx13(RetryView, { retryState });
16204
16229
  }
16205
16230
  if (isProcessing) {
16206
16231
  const isThinkingStatus = currentStatus.startsWith("Reasoning");
16207
16232
  const statusLines = currentStatus ? currentStatus.split("\n").filter(Boolean) : [];
16208
16233
  const statusMain = statusLines[0] || "Processing...";
16209
16234
  const detailText = isThinkingStatus && statusLines.length > 1 ? statusLines[statusLines.length - 1].slice(0, 120) : "";
16210
- return /* @__PURE__ */ jsx12(
16235
+ return /* @__PURE__ */ jsx13(
16211
16236
  ProcessingView,
16212
16237
  {
16213
16238
  statusMain,
@@ -16218,46 +16243,46 @@ var StatusDisplay = memo9(({
16218
16243
  }
16219
16244
  );
16220
16245
  }
16221
- return /* @__PURE__ */ jsxs10(Box10, { flexDirection: "column", height: 2, children: [
16222
- /* @__PURE__ */ jsx12(Text12, { children: " " }),
16223
- /* @__PURE__ */ jsx12(Text12, { children: " " })
16246
+ return /* @__PURE__ */ jsxs10(Box11, { flexDirection: "column", height: 2, children: [
16247
+ /* @__PURE__ */ jsx13(Text13, { children: " " }),
16248
+ /* @__PURE__ */ jsx13(Text13, { children: " " })
16224
16249
  ] });
16225
16250
  });
16226
16251
 
16227
16252
  // src/platform/tui/components/ChatInput.tsx
16228
- import { useMemo, useCallback as useCallback9, useRef as useRef8, memo as memo10, useState as useState7, useEffect as useEffect8 } from "react";
16229
- import { Box as Box14, Text as Text16, useInput as useInput3 } from "ink";
16253
+ import { useMemo, useCallback as useCallback9, useRef as useRef8, memo as memo11, useState as useState8, useEffect as useEffect9 } from "react";
16254
+ import { Box as Box15, Text as Text17, useInput as useInput3 } from "ink";
16230
16255
 
16231
16256
  // src/platform/tui/components/input/AutocompletePreview.tsx
16232
- import { Box as Box11, Text as Text13 } from "ink";
16233
- import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
16257
+ import { Box as Box12, Text as Text14 } from "ink";
16258
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
16234
16259
  var AutocompletePreview = ({
16235
16260
  suggestions,
16236
16261
  clampedIdx
16237
16262
  }) => {
16238
- return /* @__PURE__ */ jsx13(Box11, { flexDirection: "column", paddingX: 1, children: suggestions.map((cmd, i) => {
16263
+ return /* @__PURE__ */ jsx14(Box12, { flexDirection: "column", paddingX: 1, children: suggestions.map((cmd, i) => {
16239
16264
  const isSelected = i === clampedIdx;
16240
16265
  const argsText = cmd.args ? ` ${cmd.args}` : "";
16241
- return /* @__PURE__ */ jsxs11(Box11, { children: [
16242
- /* @__PURE__ */ jsx13(Text13, { color: isSelected ? THEME.primary : THEME.dimGray, children: isSelected ? " \u276F " : " " }),
16243
- /* @__PURE__ */ jsxs11(Text13, { color: isSelected ? THEME.white : THEME.gray, bold: isSelected, children: [
16266
+ return /* @__PURE__ */ jsxs11(Box12, { children: [
16267
+ /* @__PURE__ */ jsx14(Text14, { color: isSelected ? THEME.primary : THEME.dimGray, children: isSelected ? " \u276F " : " " }),
16268
+ /* @__PURE__ */ jsxs11(Text14, { color: isSelected ? THEME.white : THEME.gray, bold: isSelected, children: [
16244
16269
  "/",
16245
16270
  cmd.name
16246
16271
  ] }),
16247
- /* @__PURE__ */ jsx13(Text13, { dimColor: true, color: THEME.gray, children: argsText }),
16248
- /* @__PURE__ */ jsxs11(Text13, { dimColor: true, color: THEME.dimGray, children: [
16272
+ /* @__PURE__ */ jsx14(Text14, { dimColor: true, color: THEME.gray, children: argsText }),
16273
+ /* @__PURE__ */ jsxs11(Text14, { dimColor: true, color: THEME.dimGray, children: [
16249
16274
  " \u2014 ",
16250
16275
  cmd.description
16251
16276
  ] }),
16252
- isSelected && cmd.alias && /* @__PURE__ */ jsx13(Text13, { dimColor: true, color: THEME.dimGray, children: ` (/${cmd.alias})` })
16277
+ isSelected && cmd.alias && /* @__PURE__ */ jsx14(Text14, { dimColor: true, color: THEME.dimGray, children: ` (/${cmd.alias})` })
16253
16278
  ] }, cmd.name);
16254
16279
  }) });
16255
16280
  };
16256
16281
 
16257
16282
  // src/platform/tui/components/input/SecretInputArea.tsx
16258
- import { Box as Box12, Text as Text14, useStdout } from "ink";
16283
+ import { Box as Box13, Text as Text15, useStdout } from "ink";
16259
16284
  import TextInput from "ink-text-input";
16260
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
16285
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
16261
16286
  var OUTER_PADDING = 2;
16262
16287
  var SecretInputArea = ({
16263
16288
  inputRequest,
@@ -16268,16 +16293,16 @@ var SecretInputArea = ({
16268
16293
  const { stdout } = useStdout();
16269
16294
  const borderWidth = Math.max(10, (stdout?.columns ?? 80) - OUTER_PADDING);
16270
16295
  const borderLine = "\u2501".repeat(borderWidth);
16271
- return /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", children: [
16272
- /* @__PURE__ */ jsx14(Box12, { children: /* @__PURE__ */ jsx14(Text14, { color: THEME.yellow, children: borderLine }) }),
16273
- /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", paddingX: 1, children: [
16274
- /* @__PURE__ */ jsxs12(Box12, { children: [
16275
- /* @__PURE__ */ jsx14(Text14, { color: THEME.yellow, bold: true, children: "\u{1F512} " }),
16276
- /* @__PURE__ */ jsx14(Text14, { color: THEME.yellow, children: inputRequest.prompt && inputRequest.prompt.length > 68 ? inputRequest.prompt.slice(0, 68) + "\u2026" : inputRequest.prompt })
16296
+ return /* @__PURE__ */ jsxs12(Box13, { flexDirection: "column", children: [
16297
+ /* @__PURE__ */ jsx15(Box13, { children: /* @__PURE__ */ jsx15(Text15, { color: THEME.yellow, children: borderLine }) }),
16298
+ /* @__PURE__ */ jsxs12(Box13, { flexDirection: "column", paddingX: 1, children: [
16299
+ /* @__PURE__ */ jsxs12(Box13, { children: [
16300
+ /* @__PURE__ */ jsx15(Text15, { color: THEME.yellow, bold: true, children: "\u{1F512} " }),
16301
+ /* @__PURE__ */ jsx15(Text15, { color: THEME.yellow, children: inputRequest.prompt && inputRequest.prompt.length > 68 ? inputRequest.prompt.slice(0, 68) + "\u2026" : inputRequest.prompt })
16277
16302
  ] }),
16278
- /* @__PURE__ */ jsxs12(Box12, { children: [
16279
- /* @__PURE__ */ jsx14(Text14, { color: THEME.yellow, children: " \u25B8 " }),
16280
- /* @__PURE__ */ jsx14(
16303
+ /* @__PURE__ */ jsxs12(Box13, { children: [
16304
+ /* @__PURE__ */ jsx15(Text15, { color: THEME.yellow, children: " \u25B8 " }),
16305
+ /* @__PURE__ */ jsx15(
16281
16306
  TextInput,
16282
16307
  {
16283
16308
  value: secretInput,
@@ -16289,14 +16314,14 @@ var SecretInputArea = ({
16289
16314
  )
16290
16315
  ] })
16291
16316
  ] }),
16292
- /* @__PURE__ */ jsx14(Box12, { children: /* @__PURE__ */ jsx14(Text14, { color: THEME.yellow, children: borderLine }) })
16317
+ /* @__PURE__ */ jsx15(Box13, { children: /* @__PURE__ */ jsx15(Text15, { color: THEME.yellow, children: borderLine }) })
16293
16318
  ] });
16294
16319
  };
16295
16320
 
16296
16321
  // src/platform/tui/components/input/NormalInputArea.tsx
16297
- import { Box as Box13, Text as Text15, useStdout as useStdout2 } from "ink";
16322
+ import { Box as Box14, Text as Text16, useStdout as useStdout2 } from "ink";
16298
16323
  import TextInput2 from "ink-text-input";
16299
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
16324
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
16300
16325
  var OUTER_PADDING2 = 2;
16301
16326
  var NormalInputArea = ({
16302
16327
  inputKey,
@@ -16308,11 +16333,11 @@ var NormalInputArea = ({
16308
16333
  const { stdout } = useStdout2();
16309
16334
  const borderWidth = Math.max(10, (stdout?.columns ?? 80) - OUTER_PADDING2);
16310
16335
  const borderLine = "\u2500".repeat(borderWidth);
16311
- return /* @__PURE__ */ jsxs13(Box13, { flexDirection: "column", children: [
16312
- /* @__PURE__ */ jsx15(Box13, { children: /* @__PURE__ */ jsx15(Text15, { dimColor: true, color: THEME.dimGray, children: borderLine }) }),
16313
- /* @__PURE__ */ jsxs13(Box13, { paddingX: 1, children: [
16314
- /* @__PURE__ */ jsx15(Text15, { color: THEME.primary, children: "\u276F " }),
16315
- /* @__PURE__ */ jsx15(
16336
+ return /* @__PURE__ */ jsxs13(Box14, { flexDirection: "column", children: [
16337
+ /* @__PURE__ */ jsx16(Box14, { children: /* @__PURE__ */ jsx16(Text16, { dimColor: true, color: THEME.dimGray, children: borderLine }) }),
16338
+ /* @__PURE__ */ jsxs13(Box14, { paddingX: 1, children: [
16339
+ /* @__PURE__ */ jsx16(Text16, { color: THEME.primary, children: "\u276F " }),
16340
+ /* @__PURE__ */ jsx16(
16316
16341
  TextInput2,
16317
16342
  {
16318
16343
  value,
@@ -16323,14 +16348,14 @@ var NormalInputArea = ({
16323
16348
  inputKey
16324
16349
  )
16325
16350
  ] }),
16326
- /* @__PURE__ */ jsx15(Box13, { children: /* @__PURE__ */ jsx15(Text15, { dimColor: true, color: THEME.dimGray, children: borderLine }) })
16351
+ /* @__PURE__ */ jsx16(Box14, { children: /* @__PURE__ */ jsx16(Text16, { dimColor: true, color: THEME.dimGray, children: borderLine }) })
16327
16352
  ] });
16328
16353
  };
16329
16354
 
16330
16355
  // src/platform/tui/components/ChatInput.tsx
16331
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
16356
+ import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
16332
16357
  var MAX_SUGGESTIONS = 6;
16333
- var ChatInput = memo10(({
16358
+ var ChatInput = memo11(({
16334
16359
  value,
16335
16360
  onChange,
16336
16361
  onSubmit,
@@ -16348,7 +16373,7 @@ var ChatInput = memo10(({
16348
16373
  return getMatchingCommands(partialCmd).slice(0, MAX_SUGGESTIONS);
16349
16374
  }, [isSlashMode, partialCmd, hasArgs]);
16350
16375
  const showPreview = isSlashMode && !hasArgs && suggestions.length > 0;
16351
- const [selectedIdx, setSelectedIdx] = useState7(0);
16376
+ const [selectedIdx, setSelectedIdx] = useState8(0);
16352
16377
  const clampedIdx = Math.min(selectedIdx, Math.max(0, suggestions.length - 1));
16353
16378
  const selectedIdxRef = useRef8(clampedIdx);
16354
16379
  selectedIdxRef.current = clampedIdx;
@@ -16364,10 +16389,10 @@ var ChatInput = memo10(({
16364
16389
  inputRequestRef.current = inputRequest;
16365
16390
  const onChangeRef = useRef8(onChange);
16366
16391
  onChangeRef.current = onChange;
16367
- const [pastedHint, setPastedHint] = useState7(null);
16392
+ const [pastedHint, setPastedHint] = useState8(null);
16368
16393
  const prevValueRef = useRef8(value);
16369
16394
  const pasteTimerRef = useRef8(null);
16370
- useEffect8(() => {
16395
+ useEffect9(() => {
16371
16396
  const diff = value.length - prevValueRef.current.length;
16372
16397
  if (diff > 20) {
16373
16398
  if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current);
@@ -16379,7 +16404,7 @@ var ChatInput = memo10(({
16379
16404
  if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current);
16380
16405
  };
16381
16406
  }, [value]);
16382
- const [inputKey, setInputKey] = useState7(0);
16407
+ const [inputKey, setInputKey] = useState8(0);
16383
16408
  const completeCommand = useCallback9((idx) => {
16384
16409
  const sug = suggestionsRef.current;
16385
16410
  if (!sug.length) return;
@@ -16427,8 +16452,8 @@ var ChatInput = memo10(({
16427
16452
  completeCommand(selectedIdxRef.current);
16428
16453
  }
16429
16454
  }, [completeCommand]));
16430
- return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", children: [
16431
- showPreview && /* @__PURE__ */ jsx16(
16455
+ return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", children: [
16456
+ showPreview && /* @__PURE__ */ jsx17(
16432
16457
  AutocompletePreview,
16433
16458
  {
16434
16459
  suggestions,
@@ -16437,7 +16462,7 @@ var ChatInput = memo10(({
16437
16462
  ),
16438
16463
  inputRequest.status === "active" ? (
16439
16464
  /* Active input request — yellow top/bottom border */
16440
- /* @__PURE__ */ jsx16(
16465
+ /* @__PURE__ */ jsx17(
16441
16466
  SecretInputArea,
16442
16467
  {
16443
16468
  inputRequest,
@@ -16448,7 +16473,7 @@ var ChatInput = memo10(({
16448
16473
  )
16449
16474
  ) : (
16450
16475
  /* Normal input — dim top/bottom border */
16451
- /* @__PURE__ */ jsx16(
16476
+ /* @__PURE__ */ jsx17(
16452
16477
  NormalInputArea,
16453
16478
  {
16454
16479
  inputKey,
@@ -16459,14 +16484,14 @@ var ChatInput = memo10(({
16459
16484
  }
16460
16485
  )
16461
16486
  ),
16462
- pastedHint && /* @__PURE__ */ jsx16(Box14, { paddingX: 2, children: /* @__PURE__ */ jsx16(Text16, { dimColor: true, color: THEME.dimGray, children: pastedHint }) })
16487
+ pastedHint && /* @__PURE__ */ jsx17(Box15, { paddingX: 2, children: /* @__PURE__ */ jsx17(Text17, { dimColor: true, color: THEME.dimGray, children: pastedHint }) })
16463
16488
  ] });
16464
16489
  });
16465
16490
 
16466
16491
  // src/platform/tui/components/footer.tsx
16467
- import { memo as memo11 } from "react";
16468
- import { Box as Box15, Text as Text17 } from "ink";
16469
- import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
16492
+ import { memo as memo12 } from "react";
16493
+ import { Box as Box16, Text as Text18 } from "ink";
16494
+ import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
16470
16495
  var CTX_WARN_THRESHOLD = 0.8;
16471
16496
  var MAX_CONTEXT_TOKENS = LLM_LIMITS.streamMaxTokens;
16472
16497
  var formatElapsed = (totalSeconds) => {
@@ -16479,55 +16504,55 @@ var formatElapsed = (totalSeconds) => {
16479
16504
  }
16480
16505
  return `${minutes}:${pad(seconds)}`;
16481
16506
  };
16482
- var Footer = memo11(({ phase, targets, findings, todo, elapsedTime, isProcessing, totalTokens, turnCount }) => {
16507
+ var Footer = memo12(({ phase, targets, findings, todo, elapsedTime, isProcessing, totalTokens, turnCount }) => {
16483
16508
  const ctxPct = totalTokens > 0 ? Math.round(totalTokens / MAX_CONTEXT_TOKENS * 100) : 0;
16484
16509
  const ctxColor = ctxPct >= CTX_WARN_THRESHOLD * 100 ? THEME.yellow : THEME.dimGray;
16485
16510
  return /* @__PURE__ */ jsxs15(
16486
- Box15,
16511
+ Box16,
16487
16512
  {
16488
16513
  width: "100%",
16489
16514
  paddingX: 1,
16490
16515
  justifyContent: "space-between",
16491
16516
  overflow: "hidden",
16492
16517
  children: [
16493
- /* @__PURE__ */ jsxs15(Box15, { gap: 2, children: [
16494
- /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
16518
+ /* @__PURE__ */ jsxs15(Box16, { gap: 2, children: [
16519
+ /* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
16495
16520
  "Phase: ",
16496
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: phase })
16521
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: phase })
16497
16522
  ] }),
16498
- /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
16523
+ /* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
16499
16524
  "Targets: ",
16500
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: targets })
16525
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: targets })
16501
16526
  ] }),
16502
- /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
16527
+ /* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
16503
16528
  "Findings: ",
16504
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: findings })
16529
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: findings })
16505
16530
  ] }),
16506
- /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
16531
+ /* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
16507
16532
  "Tasks: ",
16508
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: todo })
16533
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: todo })
16509
16534
  ] })
16510
16535
  ] }),
16511
- /* @__PURE__ */ jsxs15(Box15, { gap: 2, children: [
16512
- isProcessing ? /* @__PURE__ */ jsxs15(Box15, { gap: 1, children: [
16513
- /* @__PURE__ */ jsx17(Text17, { dimColor: true, color: THEME.dimGray, children: "[ESC] abort" }),
16514
- /* @__PURE__ */ jsx17(Text17, { dimColor: true, color: THEME.dimGray, children: "[^C\xD72] exit" })
16515
- ] }) : /* @__PURE__ */ jsx17(Text17, { dimColor: true, color: THEME.dimGray, children: "[/help] commands" }),
16516
- turnCount > 0 && /* @__PURE__ */ jsxs15(Text17, { dimColor: true, color: THEME.dimGray, children: [
16536
+ /* @__PURE__ */ jsxs15(Box16, { gap: 2, children: [
16537
+ isProcessing ? /* @__PURE__ */ jsxs15(Box16, { gap: 1, children: [
16538
+ /* @__PURE__ */ jsx18(Text18, { dimColor: true, color: THEME.dimGray, children: "[ESC] abort" }),
16539
+ /* @__PURE__ */ jsx18(Text18, { dimColor: true, color: THEME.dimGray, children: "[^C\xD72] exit" })
16540
+ ] }) : /* @__PURE__ */ jsx18(Text18, { dimColor: true, color: THEME.dimGray, children: "[/help] commands" }),
16541
+ turnCount > 0 && /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: THEME.dimGray, children: [
16517
16542
  "turn:",
16518
16543
  turnCount
16519
16544
  ] }),
16520
- totalTokens > 0 && /* @__PURE__ */ jsxs15(Text17, { dimColor: true, color: ctxColor, children: [
16545
+ totalTokens > 0 && /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: ctxColor, children: [
16521
16546
  "ctx:",
16522
16547
  ctxPct,
16523
16548
  "%"
16524
16549
  ] }),
16525
- totalTokens > 0 && /* @__PURE__ */ jsxs15(Text17, { dimColor: true, color: THEME.dimGray, children: [
16550
+ totalTokens > 0 && /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: THEME.dimGray, children: [
16526
16551
  "\u2191",
16527
16552
  formatTokens(totalTokens)
16528
16553
  ] }),
16529
- /* @__PURE__ */ jsx17(Text17, { color: isProcessing ? THEME.primary : THEME.gray, children: isProcessing ? "Running " : "Idle " }),
16530
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: formatElapsed(elapsedTime) })
16554
+ /* @__PURE__ */ jsx18(Text18, { color: isProcessing ? THEME.primary : THEME.gray, children: isProcessing ? "Running " : "Idle " }),
16555
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: formatElapsed(elapsedTime) })
16531
16556
  ] })
16532
16557
  ]
16533
16558
  }
@@ -16536,15 +16561,15 @@ var Footer = memo11(({ phase, targets, findings, todo, elapsedTime, isProcessing
16536
16561
  var footer_default = Footer;
16537
16562
 
16538
16563
  // src/platform/tui/components/Modal.tsx
16539
- import { useMemo as useMemo2, memo as memo12, useCallback as useCallback10, useRef as useRef9 } from "react";
16540
- import { Box as Box16, Text as Text18, useStdout as useStdout3, useInput as useInput4 } from "ink";
16541
- import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
16564
+ import { useMemo as useMemo2, memo as memo13, useCallback as useCallback10, useRef as useRef9 } from "react";
16565
+ import { Box as Box17, Text as Text19, useStdout as useStdout3, useInput as useInput4 } from "ink";
16566
+ import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
16542
16567
  var MODAL_TITLES = {
16543
16568
  findings: "\u25C8 FINDINGS \u25C8",
16544
16569
  graph: "\u25C8 ATTACK GRAPH \u25C8",
16545
16570
  help: "\u25C8 COMMANDS \u25C8"
16546
16571
  };
16547
- var Modal = memo12(({
16572
+ var Modal = memo13(({
16548
16573
  type,
16549
16574
  content,
16550
16575
  scrollOffset,
@@ -16583,19 +16608,19 @@ var Modal = memo12(({
16583
16608
  const scrollbarHeight = Math.max(1, Math.floor(maxHeight * (maxHeight / Math.max(totalLines, 1))));
16584
16609
  const scrollbarPosition = totalLines > maxHeight ? Math.floor(scrollOffset / (totalLines - maxHeight) * (maxHeight - scrollbarHeight)) : 0;
16585
16610
  return /* @__PURE__ */ jsxs16(
16586
- Box16,
16611
+ Box17,
16587
16612
  {
16588
16613
  flexDirection: "column",
16589
16614
  width: terminalWidth,
16590
16615
  height: terminalHeight,
16591
16616
  children: [
16592
- /* @__PURE__ */ jsx18(Box16, { justifyContent: "center", marginBottom: 0, children: /* @__PURE__ */ jsx18(Text18, { color: THEME.cyan, bold: true, children: (() => {
16617
+ /* @__PURE__ */ jsx19(Box17, { justifyContent: "center", marginBottom: 0, children: /* @__PURE__ */ jsx19(Text19, { color: THEME.cyan, bold: true, children: (() => {
16593
16618
  const title = MODAL_TITLES[type];
16594
16619
  const sideWidth = Math.max(3, Math.floor((terminalWidth - title.length - 2) / 2));
16595
16620
  return `${"\u2500".repeat(sideWidth)} ${title} ${"\u2500".repeat(sideWidth)}`;
16596
16621
  })() }) }),
16597
- /* @__PURE__ */ jsx18(
16598
- Box16,
16622
+ /* @__PURE__ */ jsx19(
16623
+ Box17,
16599
16624
  {
16600
16625
  flexDirection: "column",
16601
16626
  borderStyle: "round",
@@ -16604,17 +16629,17 @@ var Modal = memo12(({
16604
16629
  flexGrow: 1,
16605
16630
  children: visibleLines.map((line, i) => {
16606
16631
  const showScrollbar = totalLines > maxHeight && i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight;
16607
- return /* @__PURE__ */ jsxs16(Box16, { children: [
16608
- /* @__PURE__ */ jsx18(Text18, { color: THEME.white, wrap: "truncate", children: line }),
16609
- /* @__PURE__ */ jsx18(Box16, { flexGrow: 1 }),
16610
- totalLines > maxHeight && /* @__PURE__ */ jsx18(Text18, { color: showScrollbar ? THEME.cyan : THEME.dimGray, children: showScrollbar ? "\u2588" : "\u2502" })
16632
+ return /* @__PURE__ */ jsxs16(Box17, { children: [
16633
+ /* @__PURE__ */ jsx19(Text19, { color: THEME.white, wrap: "truncate", children: line }),
16634
+ /* @__PURE__ */ jsx19(Box17, { flexGrow: 1 }),
16635
+ totalLines > maxHeight && /* @__PURE__ */ jsx19(Text19, { color: showScrollbar ? THEME.cyan : THEME.dimGray, children: showScrollbar ? "\u2588" : "\u2502" })
16611
16636
  ] }, i);
16612
16637
  })
16613
16638
  }
16614
16639
  ),
16615
- /* @__PURE__ */ jsxs16(Box16, { justifyContent: "space-between", paddingX: 1, children: [
16616
- /* @__PURE__ */ jsx18(Text18, { dimColor: true, color: THEME.gray, children: "\u2191\u2193/jk: scroll | g/G: top/bottom | ESC/q: close" }),
16617
- /* @__PURE__ */ jsxs16(Text18, { dimColor: true, color: THEME.cyan, children: [
16640
+ /* @__PURE__ */ jsxs16(Box17, { justifyContent: "space-between", paddingX: 1, children: [
16641
+ /* @__PURE__ */ jsx19(Text19, { dimColor: true, color: THEME.gray, children: "\u2191\u2193/jk: scroll | g/G: top/bottom | ESC/q: close" }),
16642
+ /* @__PURE__ */ jsxs16(Text19, { dimColor: true, color: THEME.cyan, children: [
16618
16643
  startLine,
16619
16644
  "-",
16620
16645
  endLine,
@@ -16628,8 +16653,8 @@ var Modal = memo12(({
16628
16653
  });
16629
16654
 
16630
16655
  // src/platform/tui/components/app/bottom-region.tsx
16631
- import { Box as Box17 } from "ink";
16632
- import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
16656
+ import { Box as Box18 } from "ink";
16657
+ import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
16633
16658
  var BottomRegion = ({
16634
16659
  input,
16635
16660
  setInput,
@@ -16654,8 +16679,8 @@ var BottomRegion = ({
16654
16679
  const previewHeight = suggestionCount;
16655
16680
  const inputExtraHeight = inputRequest.status === "active" ? 1 : 0;
16656
16681
  const bottomMinHeight = 7 + inputExtraHeight;
16657
- return /* @__PURE__ */ jsxs17(Box17, { flexDirection: "column", minHeight: bottomMinHeight, children: [
16658
- /* @__PURE__ */ jsx19(
16682
+ return /* @__PURE__ */ jsxs17(Box18, { flexDirection: "column", minHeight: bottomMinHeight, children: [
16683
+ /* @__PURE__ */ jsx20(
16659
16684
  StatusDisplay,
16660
16685
  {
16661
16686
  retryState,
@@ -16664,7 +16689,7 @@ var BottomRegion = ({
16664
16689
  currentTokens
16665
16690
  }
16666
16691
  ),
16667
- /* @__PURE__ */ jsx19(
16692
+ /* @__PURE__ */ jsx20(
16668
16693
  ChatInput,
16669
16694
  {
16670
16695
  value: input,
@@ -16677,7 +16702,7 @@ var BottomRegion = ({
16677
16702
  onSecretSubmit: handleSecretSubmit
16678
16703
  }
16679
16704
  ),
16680
- /* @__PURE__ */ jsx19(Box17, { marginTop: 1, children: /* @__PURE__ */ jsx19(
16705
+ /* @__PURE__ */ jsx20(Box18, { marginTop: 1, children: /* @__PURE__ */ jsx20(
16681
16706
  footer_default,
16682
16707
  {
16683
16708
  phase: stats.phase,
@@ -16694,16 +16719,16 @@ var BottomRegion = ({
16694
16719
  };
16695
16720
 
16696
16721
  // src/platform/tui/app.tsx
16697
- import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
16722
+ import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
16698
16723
  var MODEL_NAME = getModel() || DEFAULT_MODEL;
16699
16724
  var App = ({ autoApprove = false, target }) => {
16700
16725
  const { exit } = useApp();
16701
16726
  const { stdout } = useStdout4();
16702
16727
  const terminalWidth = stdout?.columns ?? 80;
16703
- const [input, setInput] = useState8("");
16704
- const [secretInput, setSecretInput] = useState8("");
16705
- const [autoApproveMode, setAutoApproveMode] = useState8(autoApprove);
16706
- const [modal, setModal] = useState8({ type: null, content: "", scrollOffset: 0 });
16728
+ const [input, setInput] = useState9("");
16729
+ const [secretInput, setSecretInput] = useState9("");
16730
+ const [autoApproveMode, setAutoApproveMode] = useState9(autoApprove);
16731
+ const [modal, setModal] = useState9({ type: null, content: "", scrollOffset: 0 });
16707
16732
  const {
16708
16733
  agent,
16709
16734
  messages,
@@ -16736,7 +16761,7 @@ var App = ({ autoApprove = false, target }) => {
16736
16761
  const clearInput = useCallback11(() => {
16737
16762
  setInput("");
16738
16763
  }, []);
16739
- const [historyScrollOffset, setHistoryScrollOffset] = useState8(0);
16764
+ const [historyScrollOffset, setHistoryScrollOffset] = useState9(0);
16740
16765
  const handleScroll = useCallback11((delta) => {
16741
16766
  setHistoryScrollOffset((prev) => Math.max(0, prev - delta));
16742
16767
  }, []);
@@ -16823,7 +16848,7 @@ var App = ({ autoApprove = false, target }) => {
16823
16848
  onScroll: handleScroll
16824
16849
  });
16825
16850
  if (modal.type) {
16826
- return /* @__PURE__ */ jsx20(Box18, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: /* @__PURE__ */ jsx20(
16851
+ return /* @__PURE__ */ jsx21(Box19, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: /* @__PURE__ */ jsx21(
16827
16852
  Modal,
16828
16853
  {
16829
16854
  type: modal.type,
@@ -16834,8 +16859,8 @@ var App = ({ autoApprove = false, target }) => {
16834
16859
  }
16835
16860
  ) });
16836
16861
  }
16837
- return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: [
16838
- /* @__PURE__ */ jsx20(Box18, { flexDirection: "column", children: /* @__PURE__ */ jsx20(
16862
+ return /* @__PURE__ */ jsxs18(Box19, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: [
16863
+ /* @__PURE__ */ jsx21(Box19, { flexDirection: "column", children: /* @__PURE__ */ jsx21(
16839
16864
  MessageList,
16840
16865
  {
16841
16866
  messages,
@@ -16846,7 +16871,7 @@ var App = ({ autoApprove = false, target }) => {
16846
16871
  scrollOffset: historyScrollOffset
16847
16872
  }
16848
16873
  ) }),
16849
- /* @__PURE__ */ jsx20(
16874
+ /* @__PURE__ */ jsx21(
16850
16875
  BottomRegion,
16851
16876
  {
16852
16877
  input,
@@ -16871,20 +16896,16 @@ var App = ({ autoApprove = false, target }) => {
16871
16896
  var app_default = App;
16872
16897
 
16873
16898
  // src/platform/tui/cli/commands/interactive.tsx
16874
- import { jsx as jsx21 } from "react/jsx-runtime";
16899
+ import { jsx as jsx22 } from "react/jsx-runtime";
16875
16900
  async function interactiveAction(options) {
16876
16901
  const { dangerouslySkipPermissions: skipPermissions = false, target } = options;
16877
16902
  console.clear();
16878
- console.log(gradient([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
16879
- console.log(
16880
- " " + chalk.hex(HEX.gray)(`v${APP_VERSION}`) + chalk.hex(HEX.gray)(" \u2502 ") + chalk.hex(HEX.primary)("Type /help for commands") + "\n"
16881
- );
16882
16903
  if (skipPermissions) {
16883
16904
  console.log(chalk.hex(HEX.red)("[!] WARNING: Running with --dangerously-skip-permissions"));
16884
16905
  console.log(chalk.hex(HEX.red)("[!] All tool executions will be auto-approved!\n"));
16885
16906
  }
16886
16907
  const { waitUntilExit } = render(
16887
- /* @__PURE__ */ jsx21(
16908
+ /* @__PURE__ */ jsx22(
16888
16909
  app_default,
16889
16910
  {
16890
16911
  autoApprove: skipPermissions,
@@ -16897,10 +16918,8 @@ async function interactiveAction(options) {
16897
16918
 
16898
16919
  // src/platform/tui/cli/commands/run.ts
16899
16920
  import chalk2 from "chalk";
16900
- import gradient2 from "gradient-string";
16901
16921
  async function runAction(objective, options) {
16902
16922
  const skipPermissions = options.dangerouslySkipPermissions || false;
16903
- console.log(gradient2([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
16904
16923
  if (skipPermissions) {
16905
16924
  console.log(chalk2.hex(HEX.red)("[!] WARNING: Running with --dangerously-skip-permissions\n"));
16906
16925
  }
@@ -16942,10 +16961,8 @@ async function runAction(objective, options) {
16942
16961
 
16943
16962
  // src/platform/tui/cli/commands/scan.ts
16944
16963
  import chalk3 from "chalk";
16945
- import gradient3 from "gradient-string";
16946
16964
  async function scanAction(target, options) {
16947
16965
  const skipPermissions = options.dangerouslySkipPermissions || false;
16948
- console.log(gradient3([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
16949
16966
  console.log(chalk3.hex(HEX.primary)(`
16950
16967
  [scan] Target: ${target} (${options.scanType})
16951
16968
  `));
@@ -16972,9 +16989,7 @@ async function scanAction(target, options) {
16972
16989
 
16973
16990
  // src/platform/tui/cli/commands/help.ts
16974
16991
  import chalk4 from "chalk";
16975
- import gradient4 from "gradient-string";
16976
16992
  function helpExtendedAction() {
16977
- console.log(gradient4([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
16978
16993
  console.log(`
16979
16994
  ${chalk4.hex(HEX.primary)(APP_NAME + " - Autonomous Penetration Testing AI")}
16980
16995
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pentesting",
3
- "version": "0.56.4",
3
+ "version": "0.56.6",
4
4
  "description": "Autonomous Penetration Testing AI Agent",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",