pentesting 0.56.3 → 0.56.5

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 +280 -257
  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.3";
714
+ var APP_VERSION = "0.56.5";
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({
@@ -14803,20 +14802,28 @@ var createSessionCommands = (ctx) => ({
14803
14802
 
14804
14803
  // src/platform/tui/hooks/commands/target-commands.ts
14805
14804
  var createTargetCommands = (ctx) => ({
14806
- [UI_COMMANDS.TARGET]: (args) => {
14805
+ [UI_COMMANDS.TARGET]: async (args) => {
14807
14806
  if (!args[0]) {
14808
14807
  ctx.addMessage("error", "Usage: /target <ip>");
14809
14808
  return;
14810
14809
  }
14810
+ if (ctx.agent.getState().getTargets().size > 0) {
14811
+ await ctx.agent.resetSession();
14812
+ ctx.addMessage("system", "Previous target data cleared. Starting fresh session for the new target.");
14813
+ }
14811
14814
  ctx.agent.addTarget(args[0]);
14812
14815
  ctx.agent.setScope([args[0]]);
14813
14816
  ctx.addMessage("system", `Target \u2192 ${args[0]}`);
14814
14817
  },
14815
- [UI_COMMANDS.TARGET_SHORT]: (args) => {
14818
+ [UI_COMMANDS.TARGET_SHORT]: async (args) => {
14816
14819
  if (!args[0]) {
14817
14820
  ctx.addMessage("error", "Usage: /target <ip>");
14818
14821
  return;
14819
14822
  }
14823
+ if (ctx.agent.getState().getTargets().size > 0) {
14824
+ await ctx.agent.resetSession();
14825
+ ctx.addMessage("system", "Previous target data cleared. Starting fresh session for the new target.");
14826
+ }
14820
14827
  ctx.agent.addTarget(args[0]);
14821
14828
  ctx.agent.setScope([args[0]]);
14822
14829
  ctx.addMessage("system", `Target \u2192 ${args[0]}`);
@@ -15349,8 +15356,8 @@ var useKeyboardShortcuts = ({
15349
15356
  };
15350
15357
 
15351
15358
  // src/platform/tui/components/MessageList.tsx
15352
- import { memo as memo6, useState as useState3, useCallback as useCallback8, useRef as useRef6 } from "react";
15353
- 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";
15354
15361
 
15355
15362
  // src/platform/tui/components/messages/ThinkingBlock.tsx
15356
15363
  import { memo } from "react";
@@ -15875,52 +15882,87 @@ var MessageRow = memo4(({ msg, isExpanded }) => {
15875
15882
  });
15876
15883
 
15877
15884
  // src/platform/tui/components/messages/EmptyState.tsx
15878
- 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";
15879
15890
  import { Box as Box6, Text as Text6 } from "ink";
15880
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
15881
- 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 }) => {
15882
15922
  const autoLabel = autoApproveMode ? "ON" : "OFF";
15883
15923
  const autoColor = autoApproveMode ? THEME.primary : THEME.gray;
15884
- return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", paddingX: 1, paddingY: 1, children: [
15885
- /* @__PURE__ */ jsxs6(Box6, { gap: 2, children: [
15886
- /* @__PURE__ */ jsx6(Text6, { color: THEME.primary, bold: true, children: "\u25C8 Pentesting Agent" }),
15887
- version && /* @__PURE__ */ jsx6(Text6, { color: THEME.dimGray, children: `v${version}` }),
15888
- 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: [
15889
15931
  "\xB7",
15890
15932
  " ",
15891
- /* @__PURE__ */ jsx6(Text6, { color: THEME.gray, children: modelName })
15933
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.gray, children: modelName })
15892
15934
  ] }),
15893
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.dimGray, children: [
15935
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.dimGray, children: [
15894
15936
  "\xB7",
15895
15937
  " Auto: ",
15896
- /* @__PURE__ */ jsx6(Text6, { color: autoColor, children: autoLabel })
15938
+ /* @__PURE__ */ jsx7(Text7, { color: autoColor, children: autoLabel })
15897
15939
  ] })
15898
15940
  ] }),
15899
- /* @__PURE__ */ jsx6(Text6, { children: " " }),
15900
- /* @__PURE__ */ jsx6(Text6, { color: THEME.gray, children: " Get started:" }),
15901
- /* @__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: [
15902
15944
  " ",
15903
15945
  " ",
15904
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.white, children: [
15946
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.white, children: [
15905
15947
  "/target ",
15906
15948
  "<ip>"
15907
15949
  ] }),
15908
15950
  " \u2014 Set target IP or domain"
15909
15951
  ] }),
15910
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.gray, children: [
15952
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
15911
15953
  " ",
15912
15954
  " ",
15913
- /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: "/start" }),
15955
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.white, children: "/start" }),
15914
15956
  " \u2014 Begin autonomous pentest"
15915
15957
  ] }),
15916
- /* @__PURE__ */ jsxs6(Text6, { color: THEME.gray, children: [
15958
+ /* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
15917
15959
  " ",
15918
15960
  " ",
15919
- /* @__PURE__ */ jsx6(Text6, { color: THEME.white, children: "/help" }),
15961
+ /* @__PURE__ */ jsx7(Text7, { color: THEME.white, children: "/help" }),
15920
15962
  " \u2014 Show all commands"
15921
15963
  ] }),
15922
- /* @__PURE__ */ jsx6(Text6, { children: " " }),
15923
- /* @__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." })
15924
15966
  ] });
15925
15967
  });
15926
15968
 
@@ -15935,9 +15977,9 @@ function computeSlidingWindow(messages, scrollOffset) {
15935
15977
  }
15936
15978
 
15937
15979
  // src/platform/tui/components/MessageList.tsx
15938
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
15939
- var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, version, scrollOffset = 0 }) => {
15940
- 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());
15941
15983
  const messagesRef = useRef6(messages);
15942
15984
  messagesRef.current = messages;
15943
15985
  const isModalOpenRef = useRef6(isModalOpen);
@@ -15991,7 +16033,7 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
15991
16033
  }
15992
16034
  }, []));
15993
16035
  if (messages.length === 0) {
15994
- return /* @__PURE__ */ jsx7(
16036
+ return /* @__PURE__ */ jsx8(
15995
16037
  EmptyState,
15996
16038
  {
15997
16039
  modelName,
@@ -16001,9 +16043,9 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
16001
16043
  );
16002
16044
  }
16003
16045
  const { visibleMessages, hiddenAbove, clampedOffset } = computeSlidingWindow(messages, scrollOffset);
16004
- return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", children: [
16005
- 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` }) }),
16006
- 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(
16007
16049
  MessageRow,
16008
16050
  {
16009
16051
  msg,
@@ -16015,16 +16057,16 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
16015
16057
  });
16016
16058
 
16017
16059
  // src/platform/tui/components/StatusDisplay.tsx
16018
- import { memo as memo9 } from "react";
16019
- 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";
16020
16062
 
16021
16063
  // src/platform/tui/hooks/useStatusTimer.ts
16022
- 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";
16023
16065
  var useStatusTimer = (currentStatus, isProcessing) => {
16024
- const [statusElapsed, setStatusElapsed] = useState4(0);
16066
+ const [statusElapsed, setStatusElapsed] = useState5(0);
16025
16067
  const statusTimerRef = useRef7(null);
16026
16068
  const statusStartRef = useRef7(Date.now());
16027
- useEffect5(() => {
16069
+ useEffect6(() => {
16028
16070
  if (statusTimerRef.current) clearInterval(statusTimerRef.current);
16029
16071
  if (isProcessing && currentStatus) {
16030
16072
  statusStartRef.current = Date.now();
@@ -16044,12 +16086,12 @@ var useStatusTimer = (currentStatus, isProcessing) => {
16044
16086
  };
16045
16087
 
16046
16088
  // src/platform/tui/components/status/RetryView.tsx
16047
- import { Box as Box8, Text as Text9 } from "ink";
16089
+ import { Box as Box9, Text as Text10 } from "ink";
16048
16090
 
16049
16091
  // src/platform/tui/components/MusicSpinner.tsx
16050
- import { useState as useState5, useEffect as useEffect6, memo as memo7 } from "react";
16051
- import { Text as Text8 } from "ink";
16052
- 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";
16053
16095
  var FRAMES = [
16054
16096
  "\xB7",
16055
16097
  "\u2726",
@@ -16067,39 +16109,39 @@ var FRAMES = [
16067
16109
  "\u2726"
16068
16110
  ];
16069
16111
  var INTERVAL = 100;
16070
- var MusicSpinner = memo7(({ color }) => {
16071
- const [index, setIndex] = useState5(0);
16072
- useEffect6(() => {
16112
+ var MusicSpinner = memo8(({ color }) => {
16113
+ const [index, setIndex] = useState6(0);
16114
+ useEffect7(() => {
16073
16115
  const timer = setInterval(() => {
16074
16116
  setIndex((i) => (i + 1) % FRAMES.length);
16075
16117
  }, INTERVAL);
16076
16118
  return () => clearInterval(timer);
16077
16119
  }, []);
16078
- return /* @__PURE__ */ jsx8(Text8, { color: color || "yellow", children: FRAMES[index] });
16120
+ return /* @__PURE__ */ jsx9(Text9, { color: color || "yellow", children: FRAMES[index] });
16079
16121
  });
16080
16122
 
16081
16123
  // src/platform/tui/components/status/RetryView.tsx
16082
- import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
16124
+ import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
16083
16125
  var RetryView = ({ retryState }) => {
16084
16126
  const truncateError = (err) => {
16085
16127
  return err.length > DISPLAY_LIMITS.RETRY_ERROR_PREVIEW ? err.substring(0, DISPLAY_LIMITS.RETRY_ERROR_TRUNCATED) + "..." : err;
16086
16128
  };
16087
- return /* @__PURE__ */ jsxs8(Box8, { flexDirection: "column", height: 2, children: [
16088
- /* @__PURE__ */ jsxs8(Box8, { children: [
16089
- /* @__PURE__ */ jsx9(Text9, { color: THEME.yellow, wrap: "truncate", children: /* @__PURE__ */ jsx9(MusicSpinner, { color: THEME.yellow }) }),
16090
- /* @__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: [
16091
16133
  " \u29F3 Retry #",
16092
16134
  retryState.attempt,
16093
16135
  "/",
16094
16136
  retryState.maxRetries
16095
16137
  ] }),
16096
- /* @__PURE__ */ jsxs8(Text9, { color: THEME.gray, wrap: "truncate", children: [
16138
+ /* @__PURE__ */ jsxs8(Text10, { color: THEME.gray, wrap: "truncate", children: [
16097
16139
  " \u2014 ",
16098
16140
  retryState.countdown,
16099
16141
  "s"
16100
16142
  ] })
16101
16143
  ] }),
16102
- /* @__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: [
16103
16145
  " ",
16104
16146
  truncateError(retryState.error)
16105
16147
  ] }) })
@@ -16107,49 +16149,40 @@ var RetryView = ({ retryState }) => {
16107
16149
  };
16108
16150
 
16109
16151
  // src/platform/tui/components/status/ProcessingView.tsx
16110
- import { Box as Box9, Text as Text11 } from "ink";
16152
+ import { Box as Box10, Text as Text12 } from "ink";
16111
16153
 
16112
16154
  // src/platform/tui/components/ShimmerText.tsx
16113
- import { useState as useState6, useEffect as useEffect7, memo as memo8 } from "react";
16114
- import { Text as Text10 } from "ink";
16115
- import { jsx as jsx10 } from "react/jsx-runtime";
16116
- var SHIMMER_COLORS = [
16117
- "#FFFFFF",
16118
- // 0: peak bright (white)
16119
- "#E0E0E0",
16120
- // 1
16121
- "#C0C0C0",
16122
- // 2
16123
- "#A0A0A0",
16124
- // 3: mid
16125
- "#808080",
16126
- // 4
16127
- "#606060",
16128
- // 5: dim trough
16129
- "#808080",
16130
- // 6
16131
- "#A0A0A0",
16132
- // 7: mid
16133
- "#C0C0C0",
16134
- // 8
16135
- "#E0E0E0"
16136
- // 9
16137
- ];
16138
- var SHIMMER_INTERVAL = 80;
16139
- var ShimmerText = memo8(({ children, bold, phase = 0 }) => {
16140
- const [frame, setFrame] = useState6(phase % SHIMMER_COLORS.length);
16141
- 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(() => {
16142
16170
  const timer = setInterval(() => {
16143
- setFrame((f) => (f + 1) % SHIMMER_COLORS.length);
16144
- }, SHIMMER_INTERVAL);
16171
+ setTick((t) => t + 1);
16172
+ }, FRAME_INTERVAL2);
16145
16173
  return () => clearInterval(timer);
16146
16174
  }, []);
16147
- const color = SHIMMER_COLORS[frame];
16148
- 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
+ }) });
16149
16182
  });
16150
16183
 
16151
16184
  // src/platform/tui/components/status/ProcessingView.tsx
16152
- import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
16185
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
16153
16186
  var ProcessingView = ({
16154
16187
  statusMain,
16155
16188
  detailText,
@@ -16165,26 +16198,26 @@ var ProcessingView = ({
16165
16198
  return parts.length > 0 ? `(${parts.join(" \xB7 ")})` : "";
16166
16199
  };
16167
16200
  const meta = buildMeta();
16168
- return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", height: 2, children: [
16169
- /* @__PURE__ */ jsxs9(Box9, { children: [
16170
- /* @__PURE__ */ jsx11(Text11, { color, wrap: "truncate", children: /* @__PURE__ */ jsx11(MusicSpinner, { color }) }),
16171
- /* @__PURE__ */ jsx11(Text11, { children: " " }),
16172
- /* @__PURE__ */ jsx11(ShimmerText, { bold: true, phase: 0, children: statusMain }),
16173
- /* @__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: [
16174
16207
  " ",
16175
16208
  meta
16176
16209
  ] })
16177
16210
  ] }),
16178
- /* @__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: [
16179
16212
  " ",
16180
16213
  detailText
16181
- ] }) : /* @__PURE__ */ jsx11(Text11, { children: " " }) })
16214
+ ] }) : /* @__PURE__ */ jsx12(Text12, { children: " " }) })
16182
16215
  ] });
16183
16216
  };
16184
16217
 
16185
16218
  // src/platform/tui/components/StatusDisplay.tsx
16186
- import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
16187
- var StatusDisplay = memo9(({
16219
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
16220
+ var StatusDisplay = memo10(({
16188
16221
  retryState,
16189
16222
  isProcessing,
16190
16223
  currentStatus,
@@ -16192,14 +16225,14 @@ var StatusDisplay = memo9(({
16192
16225
  }) => {
16193
16226
  const statusElapsed = useStatusTimer(currentStatus, isProcessing);
16194
16227
  if (retryState && retryState.status === "retrying") {
16195
- return /* @__PURE__ */ jsx12(RetryView, { retryState });
16228
+ return /* @__PURE__ */ jsx13(RetryView, { retryState });
16196
16229
  }
16197
16230
  if (isProcessing) {
16198
16231
  const isThinkingStatus = currentStatus.startsWith("Reasoning");
16199
16232
  const statusLines = currentStatus ? currentStatus.split("\n").filter(Boolean) : [];
16200
16233
  const statusMain = statusLines[0] || "Processing...";
16201
16234
  const detailText = isThinkingStatus && statusLines.length > 1 ? statusLines[statusLines.length - 1].slice(0, 120) : "";
16202
- return /* @__PURE__ */ jsx12(
16235
+ return /* @__PURE__ */ jsx13(
16203
16236
  ProcessingView,
16204
16237
  {
16205
16238
  statusMain,
@@ -16210,46 +16243,46 @@ var StatusDisplay = memo9(({
16210
16243
  }
16211
16244
  );
16212
16245
  }
16213
- return /* @__PURE__ */ jsxs10(Box10, { flexDirection: "column", height: 2, children: [
16214
- /* @__PURE__ */ jsx12(Text12, { children: " " }),
16215
- /* @__PURE__ */ jsx12(Text12, { children: " " })
16246
+ return /* @__PURE__ */ jsxs10(Box11, { flexDirection: "column", height: 2, children: [
16247
+ /* @__PURE__ */ jsx13(Text13, { children: " " }),
16248
+ /* @__PURE__ */ jsx13(Text13, { children: " " })
16216
16249
  ] });
16217
16250
  });
16218
16251
 
16219
16252
  // src/platform/tui/components/ChatInput.tsx
16220
- import { useMemo, useCallback as useCallback9, useRef as useRef8, memo as memo10, useState as useState7, useEffect as useEffect8 } from "react";
16221
- 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";
16222
16255
 
16223
16256
  // src/platform/tui/components/input/AutocompletePreview.tsx
16224
- import { Box as Box11, Text as Text13 } from "ink";
16225
- 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";
16226
16259
  var AutocompletePreview = ({
16227
16260
  suggestions,
16228
16261
  clampedIdx
16229
16262
  }) => {
16230
- 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) => {
16231
16264
  const isSelected = i === clampedIdx;
16232
16265
  const argsText = cmd.args ? ` ${cmd.args}` : "";
16233
- return /* @__PURE__ */ jsxs11(Box11, { children: [
16234
- /* @__PURE__ */ jsx13(Text13, { color: isSelected ? THEME.primary : THEME.dimGray, children: isSelected ? " \u276F " : " " }),
16235
- /* @__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: [
16236
16269
  "/",
16237
16270
  cmd.name
16238
16271
  ] }),
16239
- /* @__PURE__ */ jsx13(Text13, { dimColor: true, color: THEME.gray, children: argsText }),
16240
- /* @__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: [
16241
16274
  " \u2014 ",
16242
16275
  cmd.description
16243
16276
  ] }),
16244
- 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})` })
16245
16278
  ] }, cmd.name);
16246
16279
  }) });
16247
16280
  };
16248
16281
 
16249
16282
  // src/platform/tui/components/input/SecretInputArea.tsx
16250
- import { Box as Box12, Text as Text14, useStdout } from "ink";
16283
+ import { Box as Box13, Text as Text15, useStdout } from "ink";
16251
16284
  import TextInput from "ink-text-input";
16252
- import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
16285
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
16253
16286
  var OUTER_PADDING = 2;
16254
16287
  var SecretInputArea = ({
16255
16288
  inputRequest,
@@ -16260,16 +16293,16 @@ var SecretInputArea = ({
16260
16293
  const { stdout } = useStdout();
16261
16294
  const borderWidth = Math.max(10, (stdout?.columns ?? 80) - OUTER_PADDING);
16262
16295
  const borderLine = "\u2501".repeat(borderWidth);
16263
- return /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", children: [
16264
- /* @__PURE__ */ jsx14(Box12, { children: /* @__PURE__ */ jsx14(Text14, { color: THEME.yellow, children: borderLine }) }),
16265
- /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", paddingX: 1, children: [
16266
- /* @__PURE__ */ jsxs12(Box12, { children: [
16267
- /* @__PURE__ */ jsx14(Text14, { color: THEME.yellow, bold: true, children: "\u{1F512} " }),
16268
- /* @__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 })
16269
16302
  ] }),
16270
- /* @__PURE__ */ jsxs12(Box12, { children: [
16271
- /* @__PURE__ */ jsx14(Text14, { color: THEME.yellow, children: " \u25B8 " }),
16272
- /* @__PURE__ */ jsx14(
16303
+ /* @__PURE__ */ jsxs12(Box13, { children: [
16304
+ /* @__PURE__ */ jsx15(Text15, { color: THEME.yellow, children: " \u25B8 " }),
16305
+ /* @__PURE__ */ jsx15(
16273
16306
  TextInput,
16274
16307
  {
16275
16308
  value: secretInput,
@@ -16281,14 +16314,14 @@ var SecretInputArea = ({
16281
16314
  )
16282
16315
  ] })
16283
16316
  ] }),
16284
- /* @__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 }) })
16285
16318
  ] });
16286
16319
  };
16287
16320
 
16288
16321
  // src/platform/tui/components/input/NormalInputArea.tsx
16289
- 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";
16290
16323
  import TextInput2 from "ink-text-input";
16291
- import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
16324
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
16292
16325
  var OUTER_PADDING2 = 2;
16293
16326
  var NormalInputArea = ({
16294
16327
  inputKey,
@@ -16300,11 +16333,11 @@ var NormalInputArea = ({
16300
16333
  const { stdout } = useStdout2();
16301
16334
  const borderWidth = Math.max(10, (stdout?.columns ?? 80) - OUTER_PADDING2);
16302
16335
  const borderLine = "\u2500".repeat(borderWidth);
16303
- return /* @__PURE__ */ jsxs13(Box13, { flexDirection: "column", children: [
16304
- /* @__PURE__ */ jsx15(Box13, { children: /* @__PURE__ */ jsx15(Text15, { dimColor: true, color: THEME.dimGray, children: borderLine }) }),
16305
- /* @__PURE__ */ jsxs13(Box13, { paddingX: 1, children: [
16306
- /* @__PURE__ */ jsx15(Text15, { color: THEME.primary, children: "\u276F " }),
16307
- /* @__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(
16308
16341
  TextInput2,
16309
16342
  {
16310
16343
  value,
@@ -16315,14 +16348,14 @@ var NormalInputArea = ({
16315
16348
  inputKey
16316
16349
  )
16317
16350
  ] }),
16318
- /* @__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 }) })
16319
16352
  ] });
16320
16353
  };
16321
16354
 
16322
16355
  // src/platform/tui/components/ChatInput.tsx
16323
- import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
16356
+ import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
16324
16357
  var MAX_SUGGESTIONS = 6;
16325
- var ChatInput = memo10(({
16358
+ var ChatInput = memo11(({
16326
16359
  value,
16327
16360
  onChange,
16328
16361
  onSubmit,
@@ -16340,7 +16373,7 @@ var ChatInput = memo10(({
16340
16373
  return getMatchingCommands(partialCmd).slice(0, MAX_SUGGESTIONS);
16341
16374
  }, [isSlashMode, partialCmd, hasArgs]);
16342
16375
  const showPreview = isSlashMode && !hasArgs && suggestions.length > 0;
16343
- const [selectedIdx, setSelectedIdx] = useState7(0);
16376
+ const [selectedIdx, setSelectedIdx] = useState8(0);
16344
16377
  const clampedIdx = Math.min(selectedIdx, Math.max(0, suggestions.length - 1));
16345
16378
  const selectedIdxRef = useRef8(clampedIdx);
16346
16379
  selectedIdxRef.current = clampedIdx;
@@ -16356,10 +16389,10 @@ var ChatInput = memo10(({
16356
16389
  inputRequestRef.current = inputRequest;
16357
16390
  const onChangeRef = useRef8(onChange);
16358
16391
  onChangeRef.current = onChange;
16359
- const [pastedHint, setPastedHint] = useState7(null);
16392
+ const [pastedHint, setPastedHint] = useState8(null);
16360
16393
  const prevValueRef = useRef8(value);
16361
16394
  const pasteTimerRef = useRef8(null);
16362
- useEffect8(() => {
16395
+ useEffect9(() => {
16363
16396
  const diff = value.length - prevValueRef.current.length;
16364
16397
  if (diff > 20) {
16365
16398
  if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current);
@@ -16371,7 +16404,7 @@ var ChatInput = memo10(({
16371
16404
  if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current);
16372
16405
  };
16373
16406
  }, [value]);
16374
- const [inputKey, setInputKey] = useState7(0);
16407
+ const [inputKey, setInputKey] = useState8(0);
16375
16408
  const completeCommand = useCallback9((idx) => {
16376
16409
  const sug = suggestionsRef.current;
16377
16410
  if (!sug.length) return;
@@ -16419,8 +16452,8 @@ var ChatInput = memo10(({
16419
16452
  completeCommand(selectedIdxRef.current);
16420
16453
  }
16421
16454
  }, [completeCommand]));
16422
- return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", children: [
16423
- showPreview && /* @__PURE__ */ jsx16(
16455
+ return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", children: [
16456
+ showPreview && /* @__PURE__ */ jsx17(
16424
16457
  AutocompletePreview,
16425
16458
  {
16426
16459
  suggestions,
@@ -16429,7 +16462,7 @@ var ChatInput = memo10(({
16429
16462
  ),
16430
16463
  inputRequest.status === "active" ? (
16431
16464
  /* Active input request — yellow top/bottom border */
16432
- /* @__PURE__ */ jsx16(
16465
+ /* @__PURE__ */ jsx17(
16433
16466
  SecretInputArea,
16434
16467
  {
16435
16468
  inputRequest,
@@ -16440,7 +16473,7 @@ var ChatInput = memo10(({
16440
16473
  )
16441
16474
  ) : (
16442
16475
  /* Normal input — dim top/bottom border */
16443
- /* @__PURE__ */ jsx16(
16476
+ /* @__PURE__ */ jsx17(
16444
16477
  NormalInputArea,
16445
16478
  {
16446
16479
  inputKey,
@@ -16451,14 +16484,14 @@ var ChatInput = memo10(({
16451
16484
  }
16452
16485
  )
16453
16486
  ),
16454
- 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 }) })
16455
16488
  ] });
16456
16489
  });
16457
16490
 
16458
16491
  // src/platform/tui/components/footer.tsx
16459
- import { memo as memo11 } from "react";
16460
- import { Box as Box15, Text as Text17 } from "ink";
16461
- 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";
16462
16495
  var CTX_WARN_THRESHOLD = 0.8;
16463
16496
  var MAX_CONTEXT_TOKENS = LLM_LIMITS.streamMaxTokens;
16464
16497
  var formatElapsed = (totalSeconds) => {
@@ -16471,55 +16504,55 @@ var formatElapsed = (totalSeconds) => {
16471
16504
  }
16472
16505
  return `${minutes}:${pad(seconds)}`;
16473
16506
  };
16474
- var Footer = memo11(({ phase, targets, findings, todo, elapsedTime, isProcessing, totalTokens, turnCount }) => {
16507
+ var Footer = memo12(({ phase, targets, findings, todo, elapsedTime, isProcessing, totalTokens, turnCount }) => {
16475
16508
  const ctxPct = totalTokens > 0 ? Math.round(totalTokens / MAX_CONTEXT_TOKENS * 100) : 0;
16476
16509
  const ctxColor = ctxPct >= CTX_WARN_THRESHOLD * 100 ? THEME.yellow : THEME.dimGray;
16477
16510
  return /* @__PURE__ */ jsxs15(
16478
- Box15,
16511
+ Box16,
16479
16512
  {
16480
16513
  width: "100%",
16481
16514
  paddingX: 1,
16482
16515
  justifyContent: "space-between",
16483
16516
  overflow: "hidden",
16484
16517
  children: [
16485
- /* @__PURE__ */ jsxs15(Box15, { gap: 2, children: [
16486
- /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
16518
+ /* @__PURE__ */ jsxs15(Box16, { gap: 2, children: [
16519
+ /* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
16487
16520
  "Phase: ",
16488
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: phase })
16521
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: phase })
16489
16522
  ] }),
16490
- /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
16523
+ /* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
16491
16524
  "Targets: ",
16492
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: targets })
16525
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: targets })
16493
16526
  ] }),
16494
- /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
16527
+ /* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
16495
16528
  "Findings: ",
16496
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: findings })
16529
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: findings })
16497
16530
  ] }),
16498
- /* @__PURE__ */ jsxs15(Text17, { color: THEME.gray, children: [
16531
+ /* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
16499
16532
  "Tasks: ",
16500
- /* @__PURE__ */ jsx17(Text17, { color: THEME.white, children: todo })
16533
+ /* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: todo })
16501
16534
  ] })
16502
16535
  ] }),
16503
- /* @__PURE__ */ jsxs15(Box15, { gap: 2, children: [
16504
- isProcessing ? /* @__PURE__ */ jsxs15(Box15, { gap: 1, children: [
16505
- /* @__PURE__ */ jsx17(Text17, { dimColor: true, color: THEME.dimGray, children: "[ESC] abort" }),
16506
- /* @__PURE__ */ jsx17(Text17, { dimColor: true, color: THEME.dimGray, children: "[^C\xD72] exit" })
16507
- ] }) : /* @__PURE__ */ jsx17(Text17, { dimColor: true, color: THEME.dimGray, children: "[/help] commands" }),
16508
- 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: [
16509
16542
  "turn:",
16510
16543
  turnCount
16511
16544
  ] }),
16512
- totalTokens > 0 && /* @__PURE__ */ jsxs15(Text17, { dimColor: true, color: ctxColor, children: [
16545
+ totalTokens > 0 && /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: ctxColor, children: [
16513
16546
  "ctx:",
16514
16547
  ctxPct,
16515
16548
  "%"
16516
16549
  ] }),
16517
- totalTokens > 0 && /* @__PURE__ */ jsxs15(Text17, { dimColor: true, color: THEME.dimGray, children: [
16550
+ totalTokens > 0 && /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: THEME.dimGray, children: [
16518
16551
  "\u2191",
16519
16552
  formatTokens(totalTokens)
16520
16553
  ] }),
16521
- /* @__PURE__ */ jsx17(Text17, { color: isProcessing ? THEME.primary : THEME.gray, children: isProcessing ? "Running " : "Idle " }),
16522
- /* @__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) })
16523
16556
  ] })
16524
16557
  ]
16525
16558
  }
@@ -16528,15 +16561,15 @@ var Footer = memo11(({ phase, targets, findings, todo, elapsedTime, isProcessing
16528
16561
  var footer_default = Footer;
16529
16562
 
16530
16563
  // src/platform/tui/components/Modal.tsx
16531
- import { useMemo as useMemo2, memo as memo12, useCallback as useCallback10, useRef as useRef9 } from "react";
16532
- import { Box as Box16, Text as Text18, useStdout as useStdout3, useInput as useInput4 } from "ink";
16533
- 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";
16534
16567
  var MODAL_TITLES = {
16535
16568
  findings: "\u25C8 FINDINGS \u25C8",
16536
16569
  graph: "\u25C8 ATTACK GRAPH \u25C8",
16537
16570
  help: "\u25C8 COMMANDS \u25C8"
16538
16571
  };
16539
- var Modal = memo12(({
16572
+ var Modal = memo13(({
16540
16573
  type,
16541
16574
  content,
16542
16575
  scrollOffset,
@@ -16575,19 +16608,19 @@ var Modal = memo12(({
16575
16608
  const scrollbarHeight = Math.max(1, Math.floor(maxHeight * (maxHeight / Math.max(totalLines, 1))));
16576
16609
  const scrollbarPosition = totalLines > maxHeight ? Math.floor(scrollOffset / (totalLines - maxHeight) * (maxHeight - scrollbarHeight)) : 0;
16577
16610
  return /* @__PURE__ */ jsxs16(
16578
- Box16,
16611
+ Box17,
16579
16612
  {
16580
16613
  flexDirection: "column",
16581
16614
  width: terminalWidth,
16582
16615
  height: terminalHeight,
16583
16616
  children: [
16584
- /* @__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: (() => {
16585
16618
  const title = MODAL_TITLES[type];
16586
16619
  const sideWidth = Math.max(3, Math.floor((terminalWidth - title.length - 2) / 2));
16587
16620
  return `${"\u2500".repeat(sideWidth)} ${title} ${"\u2500".repeat(sideWidth)}`;
16588
16621
  })() }) }),
16589
- /* @__PURE__ */ jsx18(
16590
- Box16,
16622
+ /* @__PURE__ */ jsx19(
16623
+ Box17,
16591
16624
  {
16592
16625
  flexDirection: "column",
16593
16626
  borderStyle: "round",
@@ -16596,17 +16629,17 @@ var Modal = memo12(({
16596
16629
  flexGrow: 1,
16597
16630
  children: visibleLines.map((line, i) => {
16598
16631
  const showScrollbar = totalLines > maxHeight && i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight;
16599
- return /* @__PURE__ */ jsxs16(Box16, { children: [
16600
- /* @__PURE__ */ jsx18(Text18, { color: THEME.white, wrap: "truncate", children: line }),
16601
- /* @__PURE__ */ jsx18(Box16, { flexGrow: 1 }),
16602
- 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" })
16603
16636
  ] }, i);
16604
16637
  })
16605
16638
  }
16606
16639
  ),
16607
- /* @__PURE__ */ jsxs16(Box16, { justifyContent: "space-between", paddingX: 1, children: [
16608
- /* @__PURE__ */ jsx18(Text18, { dimColor: true, color: THEME.gray, children: "\u2191\u2193/jk: scroll | g/G: top/bottom | ESC/q: close" }),
16609
- /* @__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: [
16610
16643
  startLine,
16611
16644
  "-",
16612
16645
  endLine,
@@ -16620,8 +16653,8 @@ var Modal = memo12(({
16620
16653
  });
16621
16654
 
16622
16655
  // src/platform/tui/components/app/bottom-region.tsx
16623
- import { Box as Box17 } from "ink";
16624
- 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";
16625
16658
  var BottomRegion = ({
16626
16659
  input,
16627
16660
  setInput,
@@ -16646,8 +16679,8 @@ var BottomRegion = ({
16646
16679
  const previewHeight = suggestionCount;
16647
16680
  const inputExtraHeight = inputRequest.status === "active" ? 1 : 0;
16648
16681
  const bottomMinHeight = 7 + inputExtraHeight;
16649
- return /* @__PURE__ */ jsxs17(Box17, { flexDirection: "column", minHeight: bottomMinHeight, children: [
16650
- /* @__PURE__ */ jsx19(
16682
+ return /* @__PURE__ */ jsxs17(Box18, { flexDirection: "column", minHeight: bottomMinHeight, children: [
16683
+ /* @__PURE__ */ jsx20(
16651
16684
  StatusDisplay,
16652
16685
  {
16653
16686
  retryState,
@@ -16656,7 +16689,7 @@ var BottomRegion = ({
16656
16689
  currentTokens
16657
16690
  }
16658
16691
  ),
16659
- /* @__PURE__ */ jsx19(
16692
+ /* @__PURE__ */ jsx20(
16660
16693
  ChatInput,
16661
16694
  {
16662
16695
  value: input,
@@ -16669,7 +16702,7 @@ var BottomRegion = ({
16669
16702
  onSecretSubmit: handleSecretSubmit
16670
16703
  }
16671
16704
  ),
16672
- /* @__PURE__ */ jsx19(Box17, { marginTop: 1, children: /* @__PURE__ */ jsx19(
16705
+ /* @__PURE__ */ jsx20(Box18, { marginTop: 1, children: /* @__PURE__ */ jsx20(
16673
16706
  footer_default,
16674
16707
  {
16675
16708
  phase: stats.phase,
@@ -16686,16 +16719,16 @@ var BottomRegion = ({
16686
16719
  };
16687
16720
 
16688
16721
  // src/platform/tui/app.tsx
16689
- import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
16722
+ import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
16690
16723
  var MODEL_NAME = getModel() || DEFAULT_MODEL;
16691
16724
  var App = ({ autoApprove = false, target }) => {
16692
16725
  const { exit } = useApp();
16693
16726
  const { stdout } = useStdout4();
16694
16727
  const terminalWidth = stdout?.columns ?? 80;
16695
- const [input, setInput] = useState8("");
16696
- const [secretInput, setSecretInput] = useState8("");
16697
- const [autoApproveMode, setAutoApproveMode] = useState8(autoApprove);
16698
- 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 });
16699
16732
  const {
16700
16733
  agent,
16701
16734
  messages,
@@ -16728,7 +16761,7 @@ var App = ({ autoApprove = false, target }) => {
16728
16761
  const clearInput = useCallback11(() => {
16729
16762
  setInput("");
16730
16763
  }, []);
16731
- const [historyScrollOffset, setHistoryScrollOffset] = useState8(0);
16764
+ const [historyScrollOffset, setHistoryScrollOffset] = useState9(0);
16732
16765
  const handleScroll = useCallback11((delta) => {
16733
16766
  setHistoryScrollOffset((prev) => Math.max(0, prev - delta));
16734
16767
  }, []);
@@ -16815,7 +16848,7 @@ var App = ({ autoApprove = false, target }) => {
16815
16848
  onScroll: handleScroll
16816
16849
  });
16817
16850
  if (modal.type) {
16818
- 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(
16819
16852
  Modal,
16820
16853
  {
16821
16854
  type: modal.type,
@@ -16826,8 +16859,8 @@ var App = ({ autoApprove = false, target }) => {
16826
16859
  }
16827
16860
  ) });
16828
16861
  }
16829
- return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: [
16830
- /* @__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(
16831
16864
  MessageList,
16832
16865
  {
16833
16866
  messages,
@@ -16838,7 +16871,7 @@ var App = ({ autoApprove = false, target }) => {
16838
16871
  scrollOffset: historyScrollOffset
16839
16872
  }
16840
16873
  ) }),
16841
- /* @__PURE__ */ jsx20(
16874
+ /* @__PURE__ */ jsx21(
16842
16875
  BottomRegion,
16843
16876
  {
16844
16877
  input,
@@ -16863,20 +16896,16 @@ var App = ({ autoApprove = false, target }) => {
16863
16896
  var app_default = App;
16864
16897
 
16865
16898
  // src/platform/tui/cli/commands/interactive.tsx
16866
- import { jsx as jsx21 } from "react/jsx-runtime";
16899
+ import { jsx as jsx22 } from "react/jsx-runtime";
16867
16900
  async function interactiveAction(options) {
16868
16901
  const { dangerouslySkipPermissions: skipPermissions = false, target } = options;
16869
16902
  console.clear();
16870
- console.log(gradient([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
16871
- console.log(
16872
- " " + chalk.hex(HEX.gray)(`v${APP_VERSION}`) + chalk.hex(HEX.gray)(" \u2502 ") + chalk.hex(HEX.primary)("Type /help for commands") + "\n"
16873
- );
16874
16903
  if (skipPermissions) {
16875
16904
  console.log(chalk.hex(HEX.red)("[!] WARNING: Running with --dangerously-skip-permissions"));
16876
16905
  console.log(chalk.hex(HEX.red)("[!] All tool executions will be auto-approved!\n"));
16877
16906
  }
16878
16907
  const { waitUntilExit } = render(
16879
- /* @__PURE__ */ jsx21(
16908
+ /* @__PURE__ */ jsx22(
16880
16909
  app_default,
16881
16910
  {
16882
16911
  autoApprove: skipPermissions,
@@ -16889,10 +16918,8 @@ async function interactiveAction(options) {
16889
16918
 
16890
16919
  // src/platform/tui/cli/commands/run.ts
16891
16920
  import chalk2 from "chalk";
16892
- import gradient2 from "gradient-string";
16893
16921
  async function runAction(objective, options) {
16894
16922
  const skipPermissions = options.dangerouslySkipPermissions || false;
16895
- console.log(gradient2([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
16896
16923
  if (skipPermissions) {
16897
16924
  console.log(chalk2.hex(HEX.red)("[!] WARNING: Running with --dangerously-skip-permissions\n"));
16898
16925
  }
@@ -16934,10 +16961,8 @@ async function runAction(objective, options) {
16934
16961
 
16935
16962
  // src/platform/tui/cli/commands/scan.ts
16936
16963
  import chalk3 from "chalk";
16937
- import gradient3 from "gradient-string";
16938
16964
  async function scanAction(target, options) {
16939
16965
  const skipPermissions = options.dangerouslySkipPermissions || false;
16940
- console.log(gradient3([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
16941
16966
  console.log(chalk3.hex(HEX.primary)(`
16942
16967
  [scan] Target: ${target} (${options.scanType})
16943
16968
  `));
@@ -16964,9 +16989,7 @@ async function scanAction(target, options) {
16964
16989
 
16965
16990
  // src/platform/tui/cli/commands/help.ts
16966
16991
  import chalk4 from "chalk";
16967
- import gradient4 from "gradient-string";
16968
16992
  function helpExtendedAction() {
16969
- console.log(gradient4([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
16970
16993
  console.log(`
16971
16994
  ${chalk4.hex(HEX.primary)(APP_NAME + " - Autonomous Penetration Testing AI")}
16972
16995
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pentesting",
3
- "version": "0.56.3",
3
+ "version": "0.56.5",
4
4
  "description": "Autonomous Penetration Testing AI Agent",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",