pentesting 0.56.4 → 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 +270 -255
- 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({
|
|
@@ -15357,8 +15356,8 @@ var useKeyboardShortcuts = ({
|
|
|
15357
15356
|
};
|
|
15358
15357
|
|
|
15359
15358
|
// src/platform/tui/components/MessageList.tsx
|
|
15360
|
-
import { memo as
|
|
15361
|
-
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";
|
|
15362
15361
|
|
|
15363
15362
|
// src/platform/tui/components/messages/ThinkingBlock.tsx
|
|
15364
15363
|
import { memo } from "react";
|
|
@@ -15883,52 +15882,87 @@ var MessageRow = memo4(({ msg, isExpanded }) => {
|
|
|
15883
15882
|
});
|
|
15884
15883
|
|
|
15885
15884
|
// src/platform/tui/components/messages/EmptyState.tsx
|
|
15886
|
-
import { memo as
|
|
15885
|
+
import { memo as memo6 } from "react";
|
|
15886
|
+
import { Box as Box7, Text as Text7 } from "ink";
|
|
15887
|
+
|
|
15888
|
+
// src/platform/tui/components/ShimmerBanner.tsx
|
|
15889
|
+
import { useState as useState3, useEffect as useEffect5, memo as memo5 } from "react";
|
|
15887
15890
|
import { Box as Box6, Text as Text6 } from "ink";
|
|
15888
|
-
import { jsx as jsx6
|
|
15889
|
-
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 }) => {
|
|
15890
15922
|
const autoLabel = autoApproveMode ? "ON" : "OFF";
|
|
15891
15923
|
const autoColor = autoApproveMode ? THEME.primary : THEME.gray;
|
|
15892
|
-
return /* @__PURE__ */ jsxs6(
|
|
15893
|
-
/* @__PURE__ */
|
|
15894
|
-
|
|
15895
|
-
|
|
15896
|
-
|
|
15924
|
+
return /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", paddingX: 1, paddingY: 1, children: [
|
|
15925
|
+
/* @__PURE__ */ jsx7(ShimmerBanner, { banner: ASCII_BANNER }),
|
|
15926
|
+
/* @__PURE__ */ jsx7(Text7, { children: " " }),
|
|
15927
|
+
/* @__PURE__ */ jsxs6(Box7, { gap: 2, children: [
|
|
15928
|
+
/* @__PURE__ */ jsx7(Text7, { color: THEME.primary, bold: true, children: "\u25C8 Pentesting" }),
|
|
15929
|
+
version && /* @__PURE__ */ jsx7(Text7, { color: THEME.dimGray, children: `v${version}` }),
|
|
15930
|
+
modelName && /* @__PURE__ */ jsxs6(Text7, { color: THEME.dimGray, children: [
|
|
15897
15931
|
"\xB7",
|
|
15898
15932
|
" ",
|
|
15899
|
-
/* @__PURE__ */
|
|
15933
|
+
/* @__PURE__ */ jsx7(Text7, { color: THEME.gray, children: modelName })
|
|
15900
15934
|
] }),
|
|
15901
|
-
/* @__PURE__ */ jsxs6(
|
|
15935
|
+
/* @__PURE__ */ jsxs6(Text7, { color: THEME.dimGray, children: [
|
|
15902
15936
|
"\xB7",
|
|
15903
15937
|
" Auto: ",
|
|
15904
|
-
/* @__PURE__ */
|
|
15938
|
+
/* @__PURE__ */ jsx7(Text7, { color: autoColor, children: autoLabel })
|
|
15905
15939
|
] })
|
|
15906
15940
|
] }),
|
|
15907
|
-
/* @__PURE__ */
|
|
15908
|
-
/* @__PURE__ */
|
|
15909
|
-
/* @__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: [
|
|
15910
15944
|
" ",
|
|
15911
15945
|
" ",
|
|
15912
|
-
/* @__PURE__ */ jsxs6(
|
|
15946
|
+
/* @__PURE__ */ jsxs6(Text7, { color: THEME.white, children: [
|
|
15913
15947
|
"/target ",
|
|
15914
15948
|
"<ip>"
|
|
15915
15949
|
] }),
|
|
15916
15950
|
" \u2014 Set target IP or domain"
|
|
15917
15951
|
] }),
|
|
15918
|
-
/* @__PURE__ */ jsxs6(
|
|
15952
|
+
/* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
|
|
15919
15953
|
" ",
|
|
15920
15954
|
" ",
|
|
15921
|
-
/* @__PURE__ */
|
|
15955
|
+
/* @__PURE__ */ jsx7(Text7, { color: THEME.white, children: "/start" }),
|
|
15922
15956
|
" \u2014 Begin autonomous pentest"
|
|
15923
15957
|
] }),
|
|
15924
|
-
/* @__PURE__ */ jsxs6(
|
|
15958
|
+
/* @__PURE__ */ jsxs6(Text7, { color: THEME.gray, children: [
|
|
15925
15959
|
" ",
|
|
15926
15960
|
" ",
|
|
15927
|
-
/* @__PURE__ */
|
|
15961
|
+
/* @__PURE__ */ jsx7(Text7, { color: THEME.white, children: "/help" }),
|
|
15928
15962
|
" \u2014 Show all commands"
|
|
15929
15963
|
] }),
|
|
15930
|
-
/* @__PURE__ */
|
|
15931
|
-
/* @__PURE__ */
|
|
15964
|
+
/* @__PURE__ */ jsx7(Text7, { children: " " }),
|
|
15965
|
+
/* @__PURE__ */ jsx7(Text7, { color: THEME.dimGray, children: " Or just type a task and press Enter." })
|
|
15932
15966
|
] });
|
|
15933
15967
|
});
|
|
15934
15968
|
|
|
@@ -15943,9 +15977,9 @@ function computeSlidingWindow(messages, scrollOffset) {
|
|
|
15943
15977
|
}
|
|
15944
15978
|
|
|
15945
15979
|
// src/platform/tui/components/MessageList.tsx
|
|
15946
|
-
import { jsx as
|
|
15947
|
-
var MessageList =
|
|
15948
|
-
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());
|
|
15949
15983
|
const messagesRef = useRef6(messages);
|
|
15950
15984
|
messagesRef.current = messages;
|
|
15951
15985
|
const isModalOpenRef = useRef6(isModalOpen);
|
|
@@ -15999,7 +16033,7 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
|
|
|
15999
16033
|
}
|
|
16000
16034
|
}, []));
|
|
16001
16035
|
if (messages.length === 0) {
|
|
16002
|
-
return /* @__PURE__ */
|
|
16036
|
+
return /* @__PURE__ */ jsx8(
|
|
16003
16037
|
EmptyState,
|
|
16004
16038
|
{
|
|
16005
16039
|
modelName,
|
|
@@ -16009,9 +16043,9 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
|
|
|
16009
16043
|
);
|
|
16010
16044
|
}
|
|
16011
16045
|
const { visibleMessages, hiddenAbove, clampedOffset } = computeSlidingWindow(messages, scrollOffset);
|
|
16012
|
-
return /* @__PURE__ */ jsxs7(
|
|
16013
|
-
clampedOffset > 0 && /* @__PURE__ */
|
|
16014
|
-
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(
|
|
16015
16049
|
MessageRow,
|
|
16016
16050
|
{
|
|
16017
16051
|
msg,
|
|
@@ -16023,16 +16057,16 @@ var MessageList = memo6(({ messages, isModalOpen, modelName, autoApproveMode, ve
|
|
|
16023
16057
|
});
|
|
16024
16058
|
|
|
16025
16059
|
// src/platform/tui/components/StatusDisplay.tsx
|
|
16026
|
-
import { memo as
|
|
16027
|
-
import { Box as
|
|
16060
|
+
import { memo as memo10 } from "react";
|
|
16061
|
+
import { Box as Box11, Text as Text13 } from "ink";
|
|
16028
16062
|
|
|
16029
16063
|
// src/platform/tui/hooks/useStatusTimer.ts
|
|
16030
|
-
import { useState as
|
|
16064
|
+
import { useState as useState5, useEffect as useEffect6, useRef as useRef7 } from "react";
|
|
16031
16065
|
var useStatusTimer = (currentStatus, isProcessing) => {
|
|
16032
|
-
const [statusElapsed, setStatusElapsed] =
|
|
16066
|
+
const [statusElapsed, setStatusElapsed] = useState5(0);
|
|
16033
16067
|
const statusTimerRef = useRef7(null);
|
|
16034
16068
|
const statusStartRef = useRef7(Date.now());
|
|
16035
|
-
|
|
16069
|
+
useEffect6(() => {
|
|
16036
16070
|
if (statusTimerRef.current) clearInterval(statusTimerRef.current);
|
|
16037
16071
|
if (isProcessing && currentStatus) {
|
|
16038
16072
|
statusStartRef.current = Date.now();
|
|
@@ -16052,12 +16086,12 @@ var useStatusTimer = (currentStatus, isProcessing) => {
|
|
|
16052
16086
|
};
|
|
16053
16087
|
|
|
16054
16088
|
// src/platform/tui/components/status/RetryView.tsx
|
|
16055
|
-
import { Box as
|
|
16089
|
+
import { Box as Box9, Text as Text10 } from "ink";
|
|
16056
16090
|
|
|
16057
16091
|
// src/platform/tui/components/MusicSpinner.tsx
|
|
16058
|
-
import { useState as
|
|
16059
|
-
import { Text as
|
|
16060
|
-
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";
|
|
16061
16095
|
var FRAMES = [
|
|
16062
16096
|
"\xB7",
|
|
16063
16097
|
"\u2726",
|
|
@@ -16075,39 +16109,39 @@ var FRAMES = [
|
|
|
16075
16109
|
"\u2726"
|
|
16076
16110
|
];
|
|
16077
16111
|
var INTERVAL = 100;
|
|
16078
|
-
var MusicSpinner =
|
|
16079
|
-
const [index, setIndex] =
|
|
16080
|
-
|
|
16112
|
+
var MusicSpinner = memo8(({ color }) => {
|
|
16113
|
+
const [index, setIndex] = useState6(0);
|
|
16114
|
+
useEffect7(() => {
|
|
16081
16115
|
const timer = setInterval(() => {
|
|
16082
16116
|
setIndex((i) => (i + 1) % FRAMES.length);
|
|
16083
16117
|
}, INTERVAL);
|
|
16084
16118
|
return () => clearInterval(timer);
|
|
16085
16119
|
}, []);
|
|
16086
|
-
return /* @__PURE__ */
|
|
16120
|
+
return /* @__PURE__ */ jsx9(Text9, { color: color || "yellow", children: FRAMES[index] });
|
|
16087
16121
|
});
|
|
16088
16122
|
|
|
16089
16123
|
// src/platform/tui/components/status/RetryView.tsx
|
|
16090
|
-
import { jsx as
|
|
16124
|
+
import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
16091
16125
|
var RetryView = ({ retryState }) => {
|
|
16092
16126
|
const truncateError = (err) => {
|
|
16093
16127
|
return err.length > DISPLAY_LIMITS.RETRY_ERROR_PREVIEW ? err.substring(0, DISPLAY_LIMITS.RETRY_ERROR_TRUNCATED) + "..." : err;
|
|
16094
16128
|
};
|
|
16095
|
-
return /* @__PURE__ */ jsxs8(
|
|
16096
|
-
/* @__PURE__ */ jsxs8(
|
|
16097
|
-
/* @__PURE__ */
|
|
16098
|
-
/* @__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: [
|
|
16099
16133
|
" \u29F3 Retry #",
|
|
16100
16134
|
retryState.attempt,
|
|
16101
16135
|
"/",
|
|
16102
16136
|
retryState.maxRetries
|
|
16103
16137
|
] }),
|
|
16104
|
-
/* @__PURE__ */ jsxs8(
|
|
16138
|
+
/* @__PURE__ */ jsxs8(Text10, { color: THEME.gray, wrap: "truncate", children: [
|
|
16105
16139
|
" \u2014 ",
|
|
16106
16140
|
retryState.countdown,
|
|
16107
16141
|
"s"
|
|
16108
16142
|
] })
|
|
16109
16143
|
] }),
|
|
16110
|
-
/* @__PURE__ */
|
|
16144
|
+
/* @__PURE__ */ jsx10(Box9, { children: /* @__PURE__ */ jsxs8(Text10, { color: THEME.gray, wrap: "truncate", children: [
|
|
16111
16145
|
" ",
|
|
16112
16146
|
truncateError(retryState.error)
|
|
16113
16147
|
] }) })
|
|
@@ -16115,49 +16149,40 @@ var RetryView = ({ retryState }) => {
|
|
|
16115
16149
|
};
|
|
16116
16150
|
|
|
16117
16151
|
// src/platform/tui/components/status/ProcessingView.tsx
|
|
16118
|
-
import { Box as
|
|
16152
|
+
import { Box as Box10, Text as Text12 } from "ink";
|
|
16119
16153
|
|
|
16120
16154
|
// src/platform/tui/components/ShimmerText.tsx
|
|
16121
|
-
import { useState as
|
|
16122
|
-
import { Text as
|
|
16123
|
-
import { jsx as
|
|
16124
|
-
var
|
|
16125
|
-
|
|
16126
|
-
|
|
16127
|
-
|
|
16128
|
-
|
|
16129
|
-
|
|
16130
|
-
|
|
16131
|
-
|
|
16132
|
-
|
|
16133
|
-
|
|
16134
|
-
|
|
16135
|
-
|
|
16136
|
-
// 5: dim trough
|
|
16137
|
-
"#808080",
|
|
16138
|
-
// 6
|
|
16139
|
-
"#A0A0A0",
|
|
16140
|
-
// 7: mid
|
|
16141
|
-
"#C0C0C0",
|
|
16142
|
-
// 8
|
|
16143
|
-
"#E0E0E0"
|
|
16144
|
-
// 9
|
|
16145
|
-
];
|
|
16146
|
-
var SHIMMER_INTERVAL = 80;
|
|
16147
|
-
var ShimmerText = memo8(({ children, bold, phase = 0 }) => {
|
|
16148
|
-
const [frame, setFrame] = useState6(phase % SHIMMER_COLORS.length);
|
|
16149
|
-
useEffect7(() => {
|
|
16155
|
+
import { useState as useState7, useEffect as useEffect8, memo as memo9 } from "react";
|
|
16156
|
+
import { Text as Text11 } from "ink";
|
|
16157
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
16158
|
+
var FRAME_INTERVAL2 = 60;
|
|
16159
|
+
var WAVE_SPEED2 = 0.25;
|
|
16160
|
+
var CHAR_PHASE_GAP = 0.55;
|
|
16161
|
+
function sinToColor(sin) {
|
|
16162
|
+
const t = (sin + 1) / 2;
|
|
16163
|
+
const brightness = Math.round(56 + t * (255 - 56));
|
|
16164
|
+
const hex = brightness.toString(16).padStart(2, "0");
|
|
16165
|
+
return `#${hex}${hex}${hex}`;
|
|
16166
|
+
}
|
|
16167
|
+
var ShimmerText = memo9(({ children, bold, phase = 0 }) => {
|
|
16168
|
+
const [tick, setTick] = useState7(0);
|
|
16169
|
+
useEffect8(() => {
|
|
16150
16170
|
const timer = setInterval(() => {
|
|
16151
|
-
|
|
16152
|
-
},
|
|
16171
|
+
setTick((t) => t + 1);
|
|
16172
|
+
}, FRAME_INTERVAL2);
|
|
16153
16173
|
return () => clearInterval(timer);
|
|
16154
16174
|
}, []);
|
|
16155
|
-
const
|
|
16156
|
-
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
|
+
}) });
|
|
16157
16182
|
});
|
|
16158
16183
|
|
|
16159
16184
|
// src/platform/tui/components/status/ProcessingView.tsx
|
|
16160
|
-
import { jsx as
|
|
16185
|
+
import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
16161
16186
|
var ProcessingView = ({
|
|
16162
16187
|
statusMain,
|
|
16163
16188
|
detailText,
|
|
@@ -16173,26 +16198,26 @@ var ProcessingView = ({
|
|
|
16173
16198
|
return parts.length > 0 ? `(${parts.join(" \xB7 ")})` : "";
|
|
16174
16199
|
};
|
|
16175
16200
|
const meta = buildMeta();
|
|
16176
|
-
return /* @__PURE__ */ jsxs9(
|
|
16177
|
-
/* @__PURE__ */ jsxs9(
|
|
16178
|
-
/* @__PURE__ */
|
|
16179
|
-
/* @__PURE__ */
|
|
16180
|
-
/* @__PURE__ */
|
|
16181
|
-
/* @__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: [
|
|
16182
16207
|
" ",
|
|
16183
16208
|
meta
|
|
16184
16209
|
] })
|
|
16185
16210
|
] }),
|
|
16186
|
-
/* @__PURE__ */
|
|
16211
|
+
/* @__PURE__ */ jsx12(Box10, { children: detailText ? /* @__PURE__ */ jsxs9(Text12, { color: THEME.dimGray, wrap: "truncate", children: [
|
|
16187
16212
|
" ",
|
|
16188
16213
|
detailText
|
|
16189
|
-
] }) : /* @__PURE__ */
|
|
16214
|
+
] }) : /* @__PURE__ */ jsx12(Text12, { children: " " }) })
|
|
16190
16215
|
] });
|
|
16191
16216
|
};
|
|
16192
16217
|
|
|
16193
16218
|
// src/platform/tui/components/StatusDisplay.tsx
|
|
16194
|
-
import { jsx as
|
|
16195
|
-
var StatusDisplay =
|
|
16219
|
+
import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
16220
|
+
var StatusDisplay = memo10(({
|
|
16196
16221
|
retryState,
|
|
16197
16222
|
isProcessing,
|
|
16198
16223
|
currentStatus,
|
|
@@ -16200,14 +16225,14 @@ var StatusDisplay = memo9(({
|
|
|
16200
16225
|
}) => {
|
|
16201
16226
|
const statusElapsed = useStatusTimer(currentStatus, isProcessing);
|
|
16202
16227
|
if (retryState && retryState.status === "retrying") {
|
|
16203
|
-
return /* @__PURE__ */
|
|
16228
|
+
return /* @__PURE__ */ jsx13(RetryView, { retryState });
|
|
16204
16229
|
}
|
|
16205
16230
|
if (isProcessing) {
|
|
16206
16231
|
const isThinkingStatus = currentStatus.startsWith("Reasoning");
|
|
16207
16232
|
const statusLines = currentStatus ? currentStatus.split("\n").filter(Boolean) : [];
|
|
16208
16233
|
const statusMain = statusLines[0] || "Processing...";
|
|
16209
16234
|
const detailText = isThinkingStatus && statusLines.length > 1 ? statusLines[statusLines.length - 1].slice(0, 120) : "";
|
|
16210
|
-
return /* @__PURE__ */
|
|
16235
|
+
return /* @__PURE__ */ jsx13(
|
|
16211
16236
|
ProcessingView,
|
|
16212
16237
|
{
|
|
16213
16238
|
statusMain,
|
|
@@ -16218,46 +16243,46 @@ var StatusDisplay = memo9(({
|
|
|
16218
16243
|
}
|
|
16219
16244
|
);
|
|
16220
16245
|
}
|
|
16221
|
-
return /* @__PURE__ */ jsxs10(
|
|
16222
|
-
/* @__PURE__ */
|
|
16223
|
-
/* @__PURE__ */
|
|
16246
|
+
return /* @__PURE__ */ jsxs10(Box11, { flexDirection: "column", height: 2, children: [
|
|
16247
|
+
/* @__PURE__ */ jsx13(Text13, { children: " " }),
|
|
16248
|
+
/* @__PURE__ */ jsx13(Text13, { children: " " })
|
|
16224
16249
|
] });
|
|
16225
16250
|
});
|
|
16226
16251
|
|
|
16227
16252
|
// src/platform/tui/components/ChatInput.tsx
|
|
16228
|
-
import { useMemo, useCallback as useCallback9, useRef as useRef8, memo as
|
|
16229
|
-
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";
|
|
16230
16255
|
|
|
16231
16256
|
// src/platform/tui/components/input/AutocompletePreview.tsx
|
|
16232
|
-
import { Box as
|
|
16233
|
-
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";
|
|
16234
16259
|
var AutocompletePreview = ({
|
|
16235
16260
|
suggestions,
|
|
16236
16261
|
clampedIdx
|
|
16237
16262
|
}) => {
|
|
16238
|
-
return /* @__PURE__ */
|
|
16263
|
+
return /* @__PURE__ */ jsx14(Box12, { flexDirection: "column", paddingX: 1, children: suggestions.map((cmd, i) => {
|
|
16239
16264
|
const isSelected = i === clampedIdx;
|
|
16240
16265
|
const argsText = cmd.args ? ` ${cmd.args}` : "";
|
|
16241
|
-
return /* @__PURE__ */ jsxs11(
|
|
16242
|
-
/* @__PURE__ */
|
|
16243
|
-
/* @__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: [
|
|
16244
16269
|
"/",
|
|
16245
16270
|
cmd.name
|
|
16246
16271
|
] }),
|
|
16247
|
-
/* @__PURE__ */
|
|
16248
|
-
/* @__PURE__ */ jsxs11(
|
|
16272
|
+
/* @__PURE__ */ jsx14(Text14, { dimColor: true, color: THEME.gray, children: argsText }),
|
|
16273
|
+
/* @__PURE__ */ jsxs11(Text14, { dimColor: true, color: THEME.dimGray, children: [
|
|
16249
16274
|
" \u2014 ",
|
|
16250
16275
|
cmd.description
|
|
16251
16276
|
] }),
|
|
16252
|
-
isSelected && cmd.alias && /* @__PURE__ */
|
|
16277
|
+
isSelected && cmd.alias && /* @__PURE__ */ jsx14(Text14, { dimColor: true, color: THEME.dimGray, children: ` (/${cmd.alias})` })
|
|
16253
16278
|
] }, cmd.name);
|
|
16254
16279
|
}) });
|
|
16255
16280
|
};
|
|
16256
16281
|
|
|
16257
16282
|
// src/platform/tui/components/input/SecretInputArea.tsx
|
|
16258
|
-
import { Box as
|
|
16283
|
+
import { Box as Box13, Text as Text15, useStdout } from "ink";
|
|
16259
16284
|
import TextInput from "ink-text-input";
|
|
16260
|
-
import { jsx as
|
|
16285
|
+
import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
16261
16286
|
var OUTER_PADDING = 2;
|
|
16262
16287
|
var SecretInputArea = ({
|
|
16263
16288
|
inputRequest,
|
|
@@ -16268,16 +16293,16 @@ var SecretInputArea = ({
|
|
|
16268
16293
|
const { stdout } = useStdout();
|
|
16269
16294
|
const borderWidth = Math.max(10, (stdout?.columns ?? 80) - OUTER_PADDING);
|
|
16270
16295
|
const borderLine = "\u2501".repeat(borderWidth);
|
|
16271
|
-
return /* @__PURE__ */ jsxs12(
|
|
16272
|
-
/* @__PURE__ */
|
|
16273
|
-
/* @__PURE__ */ jsxs12(
|
|
16274
|
-
/* @__PURE__ */ jsxs12(
|
|
16275
|
-
/* @__PURE__ */
|
|
16276
|
-
/* @__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 })
|
|
16277
16302
|
] }),
|
|
16278
|
-
/* @__PURE__ */ jsxs12(
|
|
16279
|
-
/* @__PURE__ */
|
|
16280
|
-
/* @__PURE__ */
|
|
16303
|
+
/* @__PURE__ */ jsxs12(Box13, { children: [
|
|
16304
|
+
/* @__PURE__ */ jsx15(Text15, { color: THEME.yellow, children: " \u25B8 " }),
|
|
16305
|
+
/* @__PURE__ */ jsx15(
|
|
16281
16306
|
TextInput,
|
|
16282
16307
|
{
|
|
16283
16308
|
value: secretInput,
|
|
@@ -16289,14 +16314,14 @@ var SecretInputArea = ({
|
|
|
16289
16314
|
)
|
|
16290
16315
|
] })
|
|
16291
16316
|
] }),
|
|
16292
|
-
/* @__PURE__ */
|
|
16317
|
+
/* @__PURE__ */ jsx15(Box13, { children: /* @__PURE__ */ jsx15(Text15, { color: THEME.yellow, children: borderLine }) })
|
|
16293
16318
|
] });
|
|
16294
16319
|
};
|
|
16295
16320
|
|
|
16296
16321
|
// src/platform/tui/components/input/NormalInputArea.tsx
|
|
16297
|
-
import { Box as
|
|
16322
|
+
import { Box as Box14, Text as Text16, useStdout as useStdout2 } from "ink";
|
|
16298
16323
|
import TextInput2 from "ink-text-input";
|
|
16299
|
-
import { jsx as
|
|
16324
|
+
import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
16300
16325
|
var OUTER_PADDING2 = 2;
|
|
16301
16326
|
var NormalInputArea = ({
|
|
16302
16327
|
inputKey,
|
|
@@ -16308,11 +16333,11 @@ var NormalInputArea = ({
|
|
|
16308
16333
|
const { stdout } = useStdout2();
|
|
16309
16334
|
const borderWidth = Math.max(10, (stdout?.columns ?? 80) - OUTER_PADDING2);
|
|
16310
16335
|
const borderLine = "\u2500".repeat(borderWidth);
|
|
16311
|
-
return /* @__PURE__ */ jsxs13(
|
|
16312
|
-
/* @__PURE__ */
|
|
16313
|
-
/* @__PURE__ */ jsxs13(
|
|
16314
|
-
/* @__PURE__ */
|
|
16315
|
-
/* @__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(
|
|
16316
16341
|
TextInput2,
|
|
16317
16342
|
{
|
|
16318
16343
|
value,
|
|
@@ -16323,14 +16348,14 @@ var NormalInputArea = ({
|
|
|
16323
16348
|
inputKey
|
|
16324
16349
|
)
|
|
16325
16350
|
] }),
|
|
16326
|
-
/* @__PURE__ */
|
|
16351
|
+
/* @__PURE__ */ jsx16(Box14, { children: /* @__PURE__ */ jsx16(Text16, { dimColor: true, color: THEME.dimGray, children: borderLine }) })
|
|
16327
16352
|
] });
|
|
16328
16353
|
};
|
|
16329
16354
|
|
|
16330
16355
|
// src/platform/tui/components/ChatInput.tsx
|
|
16331
|
-
import { jsx as
|
|
16356
|
+
import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
16332
16357
|
var MAX_SUGGESTIONS = 6;
|
|
16333
|
-
var ChatInput =
|
|
16358
|
+
var ChatInput = memo11(({
|
|
16334
16359
|
value,
|
|
16335
16360
|
onChange,
|
|
16336
16361
|
onSubmit,
|
|
@@ -16348,7 +16373,7 @@ var ChatInput = memo10(({
|
|
|
16348
16373
|
return getMatchingCommands(partialCmd).slice(0, MAX_SUGGESTIONS);
|
|
16349
16374
|
}, [isSlashMode, partialCmd, hasArgs]);
|
|
16350
16375
|
const showPreview = isSlashMode && !hasArgs && suggestions.length > 0;
|
|
16351
|
-
const [selectedIdx, setSelectedIdx] =
|
|
16376
|
+
const [selectedIdx, setSelectedIdx] = useState8(0);
|
|
16352
16377
|
const clampedIdx = Math.min(selectedIdx, Math.max(0, suggestions.length - 1));
|
|
16353
16378
|
const selectedIdxRef = useRef8(clampedIdx);
|
|
16354
16379
|
selectedIdxRef.current = clampedIdx;
|
|
@@ -16364,10 +16389,10 @@ var ChatInput = memo10(({
|
|
|
16364
16389
|
inputRequestRef.current = inputRequest;
|
|
16365
16390
|
const onChangeRef = useRef8(onChange);
|
|
16366
16391
|
onChangeRef.current = onChange;
|
|
16367
|
-
const [pastedHint, setPastedHint] =
|
|
16392
|
+
const [pastedHint, setPastedHint] = useState8(null);
|
|
16368
16393
|
const prevValueRef = useRef8(value);
|
|
16369
16394
|
const pasteTimerRef = useRef8(null);
|
|
16370
|
-
|
|
16395
|
+
useEffect9(() => {
|
|
16371
16396
|
const diff = value.length - prevValueRef.current.length;
|
|
16372
16397
|
if (diff > 20) {
|
|
16373
16398
|
if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current);
|
|
@@ -16379,7 +16404,7 @@ var ChatInput = memo10(({
|
|
|
16379
16404
|
if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current);
|
|
16380
16405
|
};
|
|
16381
16406
|
}, [value]);
|
|
16382
|
-
const [inputKey, setInputKey] =
|
|
16407
|
+
const [inputKey, setInputKey] = useState8(0);
|
|
16383
16408
|
const completeCommand = useCallback9((idx) => {
|
|
16384
16409
|
const sug = suggestionsRef.current;
|
|
16385
16410
|
if (!sug.length) return;
|
|
@@ -16427,8 +16452,8 @@ var ChatInput = memo10(({
|
|
|
16427
16452
|
completeCommand(selectedIdxRef.current);
|
|
16428
16453
|
}
|
|
16429
16454
|
}, [completeCommand]));
|
|
16430
|
-
return /* @__PURE__ */ jsxs14(
|
|
16431
|
-
showPreview && /* @__PURE__ */
|
|
16455
|
+
return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", children: [
|
|
16456
|
+
showPreview && /* @__PURE__ */ jsx17(
|
|
16432
16457
|
AutocompletePreview,
|
|
16433
16458
|
{
|
|
16434
16459
|
suggestions,
|
|
@@ -16437,7 +16462,7 @@ var ChatInput = memo10(({
|
|
|
16437
16462
|
),
|
|
16438
16463
|
inputRequest.status === "active" ? (
|
|
16439
16464
|
/* Active input request — yellow top/bottom border */
|
|
16440
|
-
/* @__PURE__ */
|
|
16465
|
+
/* @__PURE__ */ jsx17(
|
|
16441
16466
|
SecretInputArea,
|
|
16442
16467
|
{
|
|
16443
16468
|
inputRequest,
|
|
@@ -16448,7 +16473,7 @@ var ChatInput = memo10(({
|
|
|
16448
16473
|
)
|
|
16449
16474
|
) : (
|
|
16450
16475
|
/* Normal input — dim top/bottom border */
|
|
16451
|
-
/* @__PURE__ */
|
|
16476
|
+
/* @__PURE__ */ jsx17(
|
|
16452
16477
|
NormalInputArea,
|
|
16453
16478
|
{
|
|
16454
16479
|
inputKey,
|
|
@@ -16459,14 +16484,14 @@ var ChatInput = memo10(({
|
|
|
16459
16484
|
}
|
|
16460
16485
|
)
|
|
16461
16486
|
),
|
|
16462
|
-
pastedHint && /* @__PURE__ */
|
|
16487
|
+
pastedHint && /* @__PURE__ */ jsx17(Box15, { paddingX: 2, children: /* @__PURE__ */ jsx17(Text17, { dimColor: true, color: THEME.dimGray, children: pastedHint }) })
|
|
16463
16488
|
] });
|
|
16464
16489
|
});
|
|
16465
16490
|
|
|
16466
16491
|
// src/platform/tui/components/footer.tsx
|
|
16467
|
-
import { memo as
|
|
16468
|
-
import { Box as
|
|
16469
|
-
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";
|
|
16470
16495
|
var CTX_WARN_THRESHOLD = 0.8;
|
|
16471
16496
|
var MAX_CONTEXT_TOKENS = LLM_LIMITS.streamMaxTokens;
|
|
16472
16497
|
var formatElapsed = (totalSeconds) => {
|
|
@@ -16479,55 +16504,55 @@ var formatElapsed = (totalSeconds) => {
|
|
|
16479
16504
|
}
|
|
16480
16505
|
return `${minutes}:${pad(seconds)}`;
|
|
16481
16506
|
};
|
|
16482
|
-
var Footer =
|
|
16507
|
+
var Footer = memo12(({ phase, targets, findings, todo, elapsedTime, isProcessing, totalTokens, turnCount }) => {
|
|
16483
16508
|
const ctxPct = totalTokens > 0 ? Math.round(totalTokens / MAX_CONTEXT_TOKENS * 100) : 0;
|
|
16484
16509
|
const ctxColor = ctxPct >= CTX_WARN_THRESHOLD * 100 ? THEME.yellow : THEME.dimGray;
|
|
16485
16510
|
return /* @__PURE__ */ jsxs15(
|
|
16486
|
-
|
|
16511
|
+
Box16,
|
|
16487
16512
|
{
|
|
16488
16513
|
width: "100%",
|
|
16489
16514
|
paddingX: 1,
|
|
16490
16515
|
justifyContent: "space-between",
|
|
16491
16516
|
overflow: "hidden",
|
|
16492
16517
|
children: [
|
|
16493
|
-
/* @__PURE__ */ jsxs15(
|
|
16494
|
-
/* @__PURE__ */ jsxs15(
|
|
16518
|
+
/* @__PURE__ */ jsxs15(Box16, { gap: 2, children: [
|
|
16519
|
+
/* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
|
|
16495
16520
|
"Phase: ",
|
|
16496
|
-
/* @__PURE__ */
|
|
16521
|
+
/* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: phase })
|
|
16497
16522
|
] }),
|
|
16498
|
-
/* @__PURE__ */ jsxs15(
|
|
16523
|
+
/* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
|
|
16499
16524
|
"Targets: ",
|
|
16500
|
-
/* @__PURE__ */
|
|
16525
|
+
/* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: targets })
|
|
16501
16526
|
] }),
|
|
16502
|
-
/* @__PURE__ */ jsxs15(
|
|
16527
|
+
/* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
|
|
16503
16528
|
"Findings: ",
|
|
16504
|
-
/* @__PURE__ */
|
|
16529
|
+
/* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: findings })
|
|
16505
16530
|
] }),
|
|
16506
|
-
/* @__PURE__ */ jsxs15(
|
|
16531
|
+
/* @__PURE__ */ jsxs15(Text18, { color: THEME.gray, children: [
|
|
16507
16532
|
"Tasks: ",
|
|
16508
|
-
/* @__PURE__ */
|
|
16533
|
+
/* @__PURE__ */ jsx18(Text18, { color: THEME.white, children: todo })
|
|
16509
16534
|
] })
|
|
16510
16535
|
] }),
|
|
16511
|
-
/* @__PURE__ */ jsxs15(
|
|
16512
|
-
isProcessing ? /* @__PURE__ */ jsxs15(
|
|
16513
|
-
/* @__PURE__ */
|
|
16514
|
-
/* @__PURE__ */
|
|
16515
|
-
] }) : /* @__PURE__ */
|
|
16516
|
-
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: [
|
|
16517
16542
|
"turn:",
|
|
16518
16543
|
turnCount
|
|
16519
16544
|
] }),
|
|
16520
|
-
totalTokens > 0 && /* @__PURE__ */ jsxs15(
|
|
16545
|
+
totalTokens > 0 && /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: ctxColor, children: [
|
|
16521
16546
|
"ctx:",
|
|
16522
16547
|
ctxPct,
|
|
16523
16548
|
"%"
|
|
16524
16549
|
] }),
|
|
16525
|
-
totalTokens > 0 && /* @__PURE__ */ jsxs15(
|
|
16550
|
+
totalTokens > 0 && /* @__PURE__ */ jsxs15(Text18, { dimColor: true, color: THEME.dimGray, children: [
|
|
16526
16551
|
"\u2191",
|
|
16527
16552
|
formatTokens(totalTokens)
|
|
16528
16553
|
] }),
|
|
16529
|
-
/* @__PURE__ */
|
|
16530
|
-
/* @__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) })
|
|
16531
16556
|
] })
|
|
16532
16557
|
]
|
|
16533
16558
|
}
|
|
@@ -16536,15 +16561,15 @@ var Footer = memo11(({ phase, targets, findings, todo, elapsedTime, isProcessing
|
|
|
16536
16561
|
var footer_default = Footer;
|
|
16537
16562
|
|
|
16538
16563
|
// src/platform/tui/components/Modal.tsx
|
|
16539
|
-
import { useMemo as useMemo2, memo as
|
|
16540
|
-
import { Box as
|
|
16541
|
-
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";
|
|
16542
16567
|
var MODAL_TITLES = {
|
|
16543
16568
|
findings: "\u25C8 FINDINGS \u25C8",
|
|
16544
16569
|
graph: "\u25C8 ATTACK GRAPH \u25C8",
|
|
16545
16570
|
help: "\u25C8 COMMANDS \u25C8"
|
|
16546
16571
|
};
|
|
16547
|
-
var Modal =
|
|
16572
|
+
var Modal = memo13(({
|
|
16548
16573
|
type,
|
|
16549
16574
|
content,
|
|
16550
16575
|
scrollOffset,
|
|
@@ -16583,19 +16608,19 @@ var Modal = memo12(({
|
|
|
16583
16608
|
const scrollbarHeight = Math.max(1, Math.floor(maxHeight * (maxHeight / Math.max(totalLines, 1))));
|
|
16584
16609
|
const scrollbarPosition = totalLines > maxHeight ? Math.floor(scrollOffset / (totalLines - maxHeight) * (maxHeight - scrollbarHeight)) : 0;
|
|
16585
16610
|
return /* @__PURE__ */ jsxs16(
|
|
16586
|
-
|
|
16611
|
+
Box17,
|
|
16587
16612
|
{
|
|
16588
16613
|
flexDirection: "column",
|
|
16589
16614
|
width: terminalWidth,
|
|
16590
16615
|
height: terminalHeight,
|
|
16591
16616
|
children: [
|
|
16592
|
-
/* @__PURE__ */
|
|
16617
|
+
/* @__PURE__ */ jsx19(Box17, { justifyContent: "center", marginBottom: 0, children: /* @__PURE__ */ jsx19(Text19, { color: THEME.cyan, bold: true, children: (() => {
|
|
16593
16618
|
const title = MODAL_TITLES[type];
|
|
16594
16619
|
const sideWidth = Math.max(3, Math.floor((terminalWidth - title.length - 2) / 2));
|
|
16595
16620
|
return `${"\u2500".repeat(sideWidth)} ${title} ${"\u2500".repeat(sideWidth)}`;
|
|
16596
16621
|
})() }) }),
|
|
16597
|
-
/* @__PURE__ */
|
|
16598
|
-
|
|
16622
|
+
/* @__PURE__ */ jsx19(
|
|
16623
|
+
Box17,
|
|
16599
16624
|
{
|
|
16600
16625
|
flexDirection: "column",
|
|
16601
16626
|
borderStyle: "round",
|
|
@@ -16604,17 +16629,17 @@ var Modal = memo12(({
|
|
|
16604
16629
|
flexGrow: 1,
|
|
16605
16630
|
children: visibleLines.map((line, i) => {
|
|
16606
16631
|
const showScrollbar = totalLines > maxHeight && i >= scrollbarPosition && i < scrollbarPosition + scrollbarHeight;
|
|
16607
|
-
return /* @__PURE__ */ jsxs16(
|
|
16608
|
-
/* @__PURE__ */
|
|
16609
|
-
/* @__PURE__ */
|
|
16610
|
-
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" })
|
|
16611
16636
|
] }, i);
|
|
16612
16637
|
})
|
|
16613
16638
|
}
|
|
16614
16639
|
),
|
|
16615
|
-
/* @__PURE__ */ jsxs16(
|
|
16616
|
-
/* @__PURE__ */
|
|
16617
|
-
/* @__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: [
|
|
16618
16643
|
startLine,
|
|
16619
16644
|
"-",
|
|
16620
16645
|
endLine,
|
|
@@ -16628,8 +16653,8 @@ var Modal = memo12(({
|
|
|
16628
16653
|
});
|
|
16629
16654
|
|
|
16630
16655
|
// src/platform/tui/components/app/bottom-region.tsx
|
|
16631
|
-
import { Box as
|
|
16632
|
-
import { jsx as
|
|
16656
|
+
import { Box as Box18 } from "ink";
|
|
16657
|
+
import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
16633
16658
|
var BottomRegion = ({
|
|
16634
16659
|
input,
|
|
16635
16660
|
setInput,
|
|
@@ -16654,8 +16679,8 @@ var BottomRegion = ({
|
|
|
16654
16679
|
const previewHeight = suggestionCount;
|
|
16655
16680
|
const inputExtraHeight = inputRequest.status === "active" ? 1 : 0;
|
|
16656
16681
|
const bottomMinHeight = 7 + inputExtraHeight;
|
|
16657
|
-
return /* @__PURE__ */ jsxs17(
|
|
16658
|
-
/* @__PURE__ */
|
|
16682
|
+
return /* @__PURE__ */ jsxs17(Box18, { flexDirection: "column", minHeight: bottomMinHeight, children: [
|
|
16683
|
+
/* @__PURE__ */ jsx20(
|
|
16659
16684
|
StatusDisplay,
|
|
16660
16685
|
{
|
|
16661
16686
|
retryState,
|
|
@@ -16664,7 +16689,7 @@ var BottomRegion = ({
|
|
|
16664
16689
|
currentTokens
|
|
16665
16690
|
}
|
|
16666
16691
|
),
|
|
16667
|
-
/* @__PURE__ */
|
|
16692
|
+
/* @__PURE__ */ jsx20(
|
|
16668
16693
|
ChatInput,
|
|
16669
16694
|
{
|
|
16670
16695
|
value: input,
|
|
@@ -16677,7 +16702,7 @@ var BottomRegion = ({
|
|
|
16677
16702
|
onSecretSubmit: handleSecretSubmit
|
|
16678
16703
|
}
|
|
16679
16704
|
),
|
|
16680
|
-
/* @__PURE__ */
|
|
16705
|
+
/* @__PURE__ */ jsx20(Box18, { marginTop: 1, children: /* @__PURE__ */ jsx20(
|
|
16681
16706
|
footer_default,
|
|
16682
16707
|
{
|
|
16683
16708
|
phase: stats.phase,
|
|
@@ -16694,16 +16719,16 @@ var BottomRegion = ({
|
|
|
16694
16719
|
};
|
|
16695
16720
|
|
|
16696
16721
|
// src/platform/tui/app.tsx
|
|
16697
|
-
import { jsx as
|
|
16722
|
+
import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
16698
16723
|
var MODEL_NAME = getModel() || DEFAULT_MODEL;
|
|
16699
16724
|
var App = ({ autoApprove = false, target }) => {
|
|
16700
16725
|
const { exit } = useApp();
|
|
16701
16726
|
const { stdout } = useStdout4();
|
|
16702
16727
|
const terminalWidth = stdout?.columns ?? 80;
|
|
16703
|
-
const [input, setInput] =
|
|
16704
|
-
const [secretInput, setSecretInput] =
|
|
16705
|
-
const [autoApproveMode, setAutoApproveMode] =
|
|
16706
|
-
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 });
|
|
16707
16732
|
const {
|
|
16708
16733
|
agent,
|
|
16709
16734
|
messages,
|
|
@@ -16736,7 +16761,7 @@ var App = ({ autoApprove = false, target }) => {
|
|
|
16736
16761
|
const clearInput = useCallback11(() => {
|
|
16737
16762
|
setInput("");
|
|
16738
16763
|
}, []);
|
|
16739
|
-
const [historyScrollOffset, setHistoryScrollOffset] =
|
|
16764
|
+
const [historyScrollOffset, setHistoryScrollOffset] = useState9(0);
|
|
16740
16765
|
const handleScroll = useCallback11((delta) => {
|
|
16741
16766
|
setHistoryScrollOffset((prev) => Math.max(0, prev - delta));
|
|
16742
16767
|
}, []);
|
|
@@ -16823,7 +16848,7 @@ var App = ({ autoApprove = false, target }) => {
|
|
|
16823
16848
|
onScroll: handleScroll
|
|
16824
16849
|
});
|
|
16825
16850
|
if (modal.type) {
|
|
16826
|
-
return /* @__PURE__ */
|
|
16851
|
+
return /* @__PURE__ */ jsx21(Box19, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: /* @__PURE__ */ jsx21(
|
|
16827
16852
|
Modal,
|
|
16828
16853
|
{
|
|
16829
16854
|
type: modal.type,
|
|
@@ -16834,8 +16859,8 @@ var App = ({ autoApprove = false, target }) => {
|
|
|
16834
16859
|
}
|
|
16835
16860
|
) });
|
|
16836
16861
|
}
|
|
16837
|
-
return /* @__PURE__ */ jsxs18(
|
|
16838
|
-
/* @__PURE__ */
|
|
16862
|
+
return /* @__PURE__ */ jsxs18(Box19, { flexDirection: "column", paddingX: 1, width: terminalWidth, children: [
|
|
16863
|
+
/* @__PURE__ */ jsx21(Box19, { flexDirection: "column", children: /* @__PURE__ */ jsx21(
|
|
16839
16864
|
MessageList,
|
|
16840
16865
|
{
|
|
16841
16866
|
messages,
|
|
@@ -16846,7 +16871,7 @@ var App = ({ autoApprove = false, target }) => {
|
|
|
16846
16871
|
scrollOffset: historyScrollOffset
|
|
16847
16872
|
}
|
|
16848
16873
|
) }),
|
|
16849
|
-
/* @__PURE__ */
|
|
16874
|
+
/* @__PURE__ */ jsx21(
|
|
16850
16875
|
BottomRegion,
|
|
16851
16876
|
{
|
|
16852
16877
|
input,
|
|
@@ -16871,20 +16896,16 @@ var App = ({ autoApprove = false, target }) => {
|
|
|
16871
16896
|
var app_default = App;
|
|
16872
16897
|
|
|
16873
16898
|
// src/platform/tui/cli/commands/interactive.tsx
|
|
16874
|
-
import { jsx as
|
|
16899
|
+
import { jsx as jsx22 } from "react/jsx-runtime";
|
|
16875
16900
|
async function interactiveAction(options) {
|
|
16876
16901
|
const { dangerouslySkipPermissions: skipPermissions = false, target } = options;
|
|
16877
16902
|
console.clear();
|
|
16878
|
-
console.log(gradient([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
|
|
16879
|
-
console.log(
|
|
16880
|
-
" " + chalk.hex(HEX.gray)(`v${APP_VERSION}`) + chalk.hex(HEX.gray)(" \u2502 ") + chalk.hex(HEX.primary)("Type /help for commands") + "\n"
|
|
16881
|
-
);
|
|
16882
16903
|
if (skipPermissions) {
|
|
16883
16904
|
console.log(chalk.hex(HEX.red)("[!] WARNING: Running with --dangerously-skip-permissions"));
|
|
16884
16905
|
console.log(chalk.hex(HEX.red)("[!] All tool executions will be auto-approved!\n"));
|
|
16885
16906
|
}
|
|
16886
16907
|
const { waitUntilExit } = render(
|
|
16887
|
-
/* @__PURE__ */
|
|
16908
|
+
/* @__PURE__ */ jsx22(
|
|
16888
16909
|
app_default,
|
|
16889
16910
|
{
|
|
16890
16911
|
autoApprove: skipPermissions,
|
|
@@ -16897,10 +16918,8 @@ async function interactiveAction(options) {
|
|
|
16897
16918
|
|
|
16898
16919
|
// src/platform/tui/cli/commands/run.ts
|
|
16899
16920
|
import chalk2 from "chalk";
|
|
16900
|
-
import gradient2 from "gradient-string";
|
|
16901
16921
|
async function runAction(objective, options) {
|
|
16902
16922
|
const skipPermissions = options.dangerouslySkipPermissions || false;
|
|
16903
|
-
console.log(gradient2([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
|
|
16904
16923
|
if (skipPermissions) {
|
|
16905
16924
|
console.log(chalk2.hex(HEX.red)("[!] WARNING: Running with --dangerously-skip-permissions\n"));
|
|
16906
16925
|
}
|
|
@@ -16942,10 +16961,8 @@ async function runAction(objective, options) {
|
|
|
16942
16961
|
|
|
16943
16962
|
// src/platform/tui/cli/commands/scan.ts
|
|
16944
16963
|
import chalk3 from "chalk";
|
|
16945
|
-
import gradient3 from "gradient-string";
|
|
16946
16964
|
async function scanAction(target, options) {
|
|
16947
16965
|
const skipPermissions = options.dangerouslySkipPermissions || false;
|
|
16948
|
-
console.log(gradient3([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
|
|
16949
16966
|
console.log(chalk3.hex(HEX.primary)(`
|
|
16950
16967
|
[scan] Target: ${target} (${options.scanType})
|
|
16951
16968
|
`));
|
|
@@ -16972,9 +16989,7 @@ async function scanAction(target, options) {
|
|
|
16972
16989
|
|
|
16973
16990
|
// src/platform/tui/cli/commands/help.ts
|
|
16974
16991
|
import chalk4 from "chalk";
|
|
16975
|
-
import gradient4 from "gradient-string";
|
|
16976
16992
|
function helpExtendedAction() {
|
|
16977
|
-
console.log(gradient4([HEX.primary, HEX.cyan, HEX.teal]).multiline(ASCII_BANNER));
|
|
16978
16993
|
console.log(`
|
|
16979
16994
|
${chalk4.hex(HEX.primary)(APP_NAME + " - Autonomous Penetration Testing AI")}
|
|
16980
16995
|
|