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.
- package/dist/main.js +280 -257
- 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.
|
|
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
|
|
771
|
-
import { Box as
|
|
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
|
|
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:
|
|
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:
|
|
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 (
|
|
12911
|
-
for (const f of
|
|
12909
|
+
if (memo14.keyFindings.length > 0) {
|
|
12910
|
+
for (const f of memo14.keyFindings) sections.push(`- ${INSIGHT_TAGS.DISCOVERED}: ${f}`);
|
|
12912
12911
|
}
|
|
12913
|
-
if (
|
|
12914
|
-
for (const c of
|
|
12912
|
+
if (memo14.credentials.length > 0) {
|
|
12913
|
+
for (const c of memo14.credentials) sections.push(`- ${INSIGHT_TAGS.CREDENTIAL}: ${c}`);
|
|
12915
12914
|
}
|
|
12916
|
-
if (
|
|
12917
|
-
for (const v of
|
|
12915
|
+
if (memo14.attackVectors.length > 0) {
|
|
12916
|
+
for (const v of memo14.attackVectors) sections.push(`- ${INSIGHT_TAGS.CONFIRMED}: ${v}`);
|
|
12918
12917
|
}
|
|
12919
|
-
if (
|
|
12920
|
-
for (const f of
|
|
12918
|
+
if (memo14.failures.length > 0) {
|
|
12919
|
+
for (const f of memo14.failures) sections.push(`- ${INSIGHT_TAGS.DEAD_END}: ${f}`);
|
|
12921
12920
|
}
|
|
12922
|
-
if (
|
|
12923
|
-
for (const s of
|
|
12921
|
+
if (memo14.suspicions.length > 0) {
|
|
12922
|
+
for (const s of memo14.suspicions) sections.push(`- ${INSIGHT_TAGS.SUSPICIOUS}: ${s}`);
|
|
12924
12923
|
}
|
|
12925
|
-
if (
|
|
12926
|
-
for (const n of
|
|
12924
|
+
if (memo14.nextSteps.length > 0) {
|
|
12925
|
+
for (const n of memo14.nextSteps) sections.push(`- ${INSIGHT_TAGS.NEXT}: ${n}`);
|
|
12927
12926
|
}
|
|
12928
|
-
if (
|
|
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:
|
|
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 (
|
|
12959
|
-
if (
|
|
12960
|
-
if (
|
|
12961
|
-
if (
|
|
12962
|
-
if (
|
|
12963
|
-
parts.push(` \uACF5\uACA9 \uAC00\uCE58: ${
|
|
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,
|
|
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:
|
|
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:
|
|
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:
|
|
13818
|
-
reflection: reflections.length > 0 ? reflections.join(" | ") :
|
|
13816
|
+
memo: memo14,
|
|
13817
|
+
reflection: reflections.length > 0 ? reflections.join(" | ") : memo14.nextSteps.join("; ")
|
|
13819
13818
|
};
|
|
13820
|
-
await createTurnArchive(turnCounter, entry, toolJournal,
|
|
13821
|
-
await regenerateSummary(turnCounter, summaryRegenerator, entry, toolJournal,
|
|
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,
|
|
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:
|
|
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,
|
|
13842
|
+
writeAnalystFile(turnDir, memo14);
|
|
13844
13843
|
} catch {
|
|
13845
13844
|
}
|
|
13846
13845
|
}
|
|
13847
|
-
function writeAnalystFile(turnDir,
|
|
13846
|
+
function writeAnalystFile(turnDir, memo14) {
|
|
13848
13847
|
const memoLines = [];
|
|
13849
|
-
if (
|
|
13850
|
-
if (
|
|
13851
|
-
if (
|
|
13852
|
-
if (
|
|
13853
|
-
if (
|
|
13854
|
-
if (
|
|
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,
|
|
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:
|
|
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
|
|
15353
|
-
import { Box as
|
|
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
|
|
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
|
|
15881
|
-
var
|
|
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(
|
|
15885
|
-
/* @__PURE__ */
|
|
15886
|
-
|
|
15887
|
-
|
|
15888
|
-
|
|
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__ */
|
|
15933
|
+
/* @__PURE__ */ jsx7(Text7, { color: THEME.gray, children: modelName })
|
|
15892
15934
|
] }),
|
|
15893
|
-
/* @__PURE__ */ jsxs6(
|
|
15935
|
+
/* @__PURE__ */ jsxs6(Text7, { color: THEME.dimGray, children: [
|
|
15894
15936
|
"\xB7",
|
|
15895
15937
|
" Auto: ",
|
|
15896
|
-
/* @__PURE__ */
|
|
15938
|
+
/* @__PURE__ */ jsx7(Text7, { color: autoColor, children: autoLabel })
|
|
15897
15939
|
] })
|
|
15898
15940
|
] }),
|
|
15899
|
-
/* @__PURE__ */
|
|
15900
|
-
/* @__PURE__ */
|
|
15901
|
-
/* @__PURE__ */ jsxs6(
|
|
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(
|
|
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(
|
|
15952
|
+
/* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
|
|
15911
15953
|
" ",
|
|
15912
15954
|
" ",
|
|
15913
|
-
/* @__PURE__ */
|
|
15955
|
+
/* @__PURE__ */ jsx7(Text7, { color: THEME.white, children: "/start" }),
|
|
15914
15956
|
" \u2014 Begin autonomous pentest"
|
|
15915
15957
|
] }),
|
|
15916
|
-
/* @__PURE__ */ jsxs6(
|
|
15958
|
+
/* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
|
|
15917
15959
|
" ",
|
|
15918
15960
|
" ",
|
|
15919
|
-
/* @__PURE__ */
|
|
15961
|
+
/* @__PURE__ */ jsx7(Text7, { color: THEME.white, children: "/help" }),
|
|
15920
15962
|
" \u2014 Show all commands"
|
|
15921
15963
|
] }),
|
|
15922
|
-
/* @__PURE__ */
|
|
15923
|
-
/* @__PURE__ */
|
|
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
|
|
15939
|
-
var MessageList =
|
|
15940
|
-
const [expandedIds, setExpandedIds] =
|
|
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__ */
|
|
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(
|
|
16005
|
-
clampedOffset > 0 && /* @__PURE__ */
|
|
16006
|
-
visibleMessages.map((msg) => /* @__PURE__ */
|
|
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
|
|
16019
|
-
import { Box as
|
|
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
|
|
16064
|
+
import { useState as useState5, useEffect as useEffect6, useRef as useRef7 } from "react";
|
|
16023
16065
|
var useStatusTimer = (currentStatus, isProcessing) => {
|
|
16024
|
-
const [statusElapsed, setStatusElapsed] =
|
|
16066
|
+
const [statusElapsed, setStatusElapsed] = useState5(0);
|
|
16025
16067
|
const statusTimerRef = useRef7(null);
|
|
16026
16068
|
const statusStartRef = useRef7(Date.now());
|
|
16027
|
-
|
|
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
|
|
16089
|
+
import { Box as Box9, Text as Text10 } from "ink";
|
|
16048
16090
|
|
|
16049
16091
|
// src/platform/tui/components/MusicSpinner.tsx
|
|
16050
|
-
import { useState as
|
|
16051
|
-
import { Text as
|
|
16052
|
-
import { jsx as
|
|
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 =
|
|
16071
|
-
const [index, setIndex] =
|
|
16072
|
-
|
|
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__ */
|
|
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
|
|
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(
|
|
16088
|
-
/* @__PURE__ */ jsxs8(
|
|
16089
|
-
/* @__PURE__ */
|
|
16090
|
-
/* @__PURE__ */ jsxs8(
|
|
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(
|
|
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__ */
|
|
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
|
|
16152
|
+
import { Box as Box10, Text as Text12 } from "ink";
|
|
16111
16153
|
|
|
16112
16154
|
// src/platform/tui/components/ShimmerText.tsx
|
|
16113
|
-
import { useState as
|
|
16114
|
-
import { Text as
|
|
16115
|
-
import { jsx as
|
|
16116
|
-
var
|
|
16117
|
-
|
|
16118
|
-
|
|
16119
|
-
|
|
16120
|
-
|
|
16121
|
-
|
|
16122
|
-
|
|
16123
|
-
|
|
16124
|
-
|
|
16125
|
-
|
|
16126
|
-
|
|
16127
|
-
|
|
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
|
-
|
|
16144
|
-
},
|
|
16171
|
+
setTick((t) => t + 1);
|
|
16172
|
+
}, FRAME_INTERVAL2);
|
|
16145
16173
|
return () => clearInterval(timer);
|
|
16146
16174
|
}, []);
|
|
16147
|
-
const
|
|
16148
|
-
return /* @__PURE__ */
|
|
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
|
|
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(
|
|
16169
|
-
/* @__PURE__ */ jsxs9(
|
|
16170
|
-
/* @__PURE__ */
|
|
16171
|
-
/* @__PURE__ */
|
|
16172
|
-
/* @__PURE__ */
|
|
16173
|
-
/* @__PURE__ */ jsxs9(
|
|
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__ */
|
|
16211
|
+
/* @__PURE__ */ jsx12(Box10, { children: detailText ? /* @__PURE__ */ jsxs9(Text12, { color: THEME.dimGray, wrap: "truncate", children: [
|
|
16179
16212
|
" ",
|
|
16180
16213
|
detailText
|
|
16181
|
-
] }) : /* @__PURE__ */
|
|
16214
|
+
] }) : /* @__PURE__ */ jsx12(Text12, { children: " " }) })
|
|
16182
16215
|
] });
|
|
16183
16216
|
};
|
|
16184
16217
|
|
|
16185
16218
|
// src/platform/tui/components/StatusDisplay.tsx
|
|
16186
|
-
import { jsx as
|
|
16187
|
-
var StatusDisplay =
|
|
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__ */
|
|
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__ */
|
|
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(
|
|
16214
|
-
/* @__PURE__ */
|
|
16215
|
-
/* @__PURE__ */
|
|
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
|
|
16221
|
-
import { Box as
|
|
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
|
|
16225
|
-
import { jsx as
|
|
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__ */
|
|
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(
|
|
16234
|
-
/* @__PURE__ */
|
|
16235
|
-
/* @__PURE__ */ jsxs11(
|
|
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__ */
|
|
16240
|
-
/* @__PURE__ */ jsxs11(
|
|
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__ */
|
|
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
|
|
16283
|
+
import { Box as Box13, Text as Text15, useStdout } from "ink";
|
|
16251
16284
|
import TextInput from "ink-text-input";
|
|
16252
|
-
import { jsx as
|
|
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(
|
|
16264
|
-
/* @__PURE__ */
|
|
16265
|
-
/* @__PURE__ */ jsxs12(
|
|
16266
|
-
/* @__PURE__ */ jsxs12(
|
|
16267
|
-
/* @__PURE__ */
|
|
16268
|
-
/* @__PURE__ */
|
|
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(
|
|
16271
|
-
/* @__PURE__ */
|
|
16272
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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(
|
|
16304
|
-
/* @__PURE__ */
|
|
16305
|
-
/* @__PURE__ */ jsxs13(
|
|
16306
|
-
/* @__PURE__ */
|
|
16307
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
16356
|
+
import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
16324
16357
|
var MAX_SUGGESTIONS = 6;
|
|
16325
|
-
var ChatInput =
|
|
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] =
|
|
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] =
|
|
16392
|
+
const [pastedHint, setPastedHint] = useState8(null);
|
|
16360
16393
|
const prevValueRef = useRef8(value);
|
|
16361
16394
|
const pasteTimerRef = useRef8(null);
|
|
16362
|
-
|
|
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] =
|
|
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(
|
|
16423
|
-
showPreview && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
16460
|
-
import { Box as
|
|
16461
|
-
import { jsx as
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
16486
|
-
/* @__PURE__ */ jsxs15(
|
|
16518
|
+
/* @__PURE__ */ jsxs15(Box16, { gap: 2, children: [
|
|
16519
|
+
/* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
|
|
16487
16520
|
"Phase: ",
|
|
16488
|
-
/* @__PURE__ */
|
|
16521
|
+
/* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: phase })
|
|
16489
16522
|
] }),
|
|
16490
|
-
/* @__PURE__ */ jsxs15(
|
|
16523
|
+
/* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
|
|
16491
16524
|
"Targets: ",
|
|
16492
|
-
/* @__PURE__ */
|
|
16525
|
+
/* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: targets })
|
|
16493
16526
|
] }),
|
|
16494
|
-
/* @__PURE__ */ jsxs15(
|
|
16527
|
+
/* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
|
|
16495
16528
|
"Findings: ",
|
|
16496
|
-
/* @__PURE__ */
|
|
16529
|
+
/* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: findings })
|
|
16497
16530
|
] }),
|
|
16498
|
-
/* @__PURE__ */ jsxs15(
|
|
16531
|
+
/* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
|
|
16499
16532
|
"Tasks: ",
|
|
16500
|
-
/* @__PURE__ */
|
|
16533
|
+
/* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: todo })
|
|
16501
16534
|
] })
|
|
16502
16535
|
] }),
|
|
16503
|
-
/* @__PURE__ */ jsxs15(
|
|
16504
|
-
isProcessing ? /* @__PURE__ */ jsxs15(
|
|
16505
|
-
/* @__PURE__ */
|
|
16506
|
-
/* @__PURE__ */
|
|
16507
|
-
] }) : /* @__PURE__ */
|
|
16508
|
-
turnCount > 0 && /* @__PURE__ */ jsxs15(
|
|
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(
|
|
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(
|
|
16550
|
+
totalTokens > 0 && /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: THEME.dimGray, children: [
|
|
16518
16551
|
"\u2191",
|
|
16519
16552
|
formatTokens(totalTokens)
|
|
16520
16553
|
] }),
|
|
16521
|
-
/* @__PURE__ */
|
|
16522
|
-
/* @__PURE__ */
|
|
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
|
|
16532
|
-
import { Box as
|
|
16533
|
-
import { jsx as
|
|
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 =
|
|
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
|
-
|
|
16611
|
+
Box17,
|
|
16579
16612
|
{
|
|
16580
16613
|
flexDirection: "column",
|
|
16581
16614
|
width: terminalWidth,
|
|
16582
16615
|
height: terminalHeight,
|
|
16583
16616
|
children: [
|
|
16584
|
-
/* @__PURE__ */
|
|
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__ */
|
|
16590
|
-
|
|
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(
|
|
16600
|
-
/* @__PURE__ */
|
|
16601
|
-
/* @__PURE__ */
|
|
16602
|
-
totalLines > maxHeight && /* @__PURE__ */
|
|
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(
|
|
16608
|
-
/* @__PURE__ */
|
|
16609
|
-
/* @__PURE__ */ jsxs16(
|
|
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
|
|
16624
|
-
import { jsx as
|
|
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(
|
|
16650
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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] =
|
|
16696
|
-
const [secretInput, setSecretInput] =
|
|
16697
|
-
const [autoApproveMode, setAutoApproveMode] =
|
|
16698
|
-
const [modal, setModal] =
|
|
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] =
|
|
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__ */
|
|
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(
|
|
16830
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|