pentesting 0.8.34 → 0.8.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +160 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6959,6 +6959,142 @@ function getKeyboardListener() {
6959
6959
  return keyboardListenerInstance;
6960
6960
  }
6961
6961
 
6962
+ // src/utils/input-queue.ts
6963
+ import { EventEmitter as EventEmitter8 } from "events";
6964
+ var INPUT_QUEUE_EVENT = {
6965
+ QUEUED: "queued",
6966
+ // Message added to queue
6967
+ DEQUEUED: "dequeued",
6968
+ // Message removed from queue
6969
+ PROCESSING: "processing",
6970
+ // Message being processed
6971
+ CLEARED: "cleared",
6972
+ // Queue cleared
6973
+ SHUTDOWN: "shutdown"
6974
+ // Queue shutdown
6975
+ };
6976
+ var InputQueue = class extends EventEmitter8 {
6977
+ queue = [];
6978
+ isShutdown = false;
6979
+ isPaused = false;
6980
+ nextId = 1;
6981
+ constructor() {
6982
+ super();
6983
+ }
6984
+ /**
6985
+ * Add input to the queue
6986
+ * Returns immediately, input will be processed when agent is ready
6987
+ */
6988
+ enqueue(content, options = {}) {
6989
+ if (this.isShutdown) {
6990
+ throw new Error("Queue is shutdown");
6991
+ }
6992
+ const input = {
6993
+ id: `input_${this.nextId++}`,
6994
+ content,
6995
+ timestamp: /* @__PURE__ */ new Date(),
6996
+ priority: options.priority || "normal",
6997
+ metadata: options.metadata
6998
+ };
6999
+ if (input.priority === "interrupt") {
7000
+ this.queue.unshift(input);
7001
+ } else if (input.priority === "high") {
7002
+ const firstNormal = this.queue.findIndex((q) => q.priority === "normal");
7003
+ if (firstNormal === -1) {
7004
+ this.queue.push(input);
7005
+ } else {
7006
+ this.queue.splice(firstNormal, 0, input);
7007
+ }
7008
+ } else {
7009
+ this.queue.push(input);
7010
+ }
7011
+ this.emit(INPUT_QUEUE_EVENT.QUEUED, input);
7012
+ return input;
7013
+ }
7014
+ /**
7015
+ * Get next input from queue
7016
+ * Returns null if queue is empty or paused
7017
+ */
7018
+ dequeue() {
7019
+ if (this.isShutdown || this.isPaused || this.queue.length === 0) {
7020
+ return null;
7021
+ }
7022
+ const input = this.queue.shift();
7023
+ this.emit(INPUT_QUEUE_EVENT.DEQUEUED, input);
7024
+ return input;
7025
+ }
7026
+ /**
7027
+ * Peek at next input without removing it
7028
+ */
7029
+ peek() {
7030
+ return this.queue[0] || null;
7031
+ }
7032
+ /**
7033
+ * Check if there are pending inputs
7034
+ */
7035
+ hasPending() {
7036
+ return this.queue.length > 0 && !this.isPaused && !this.isShutdown;
7037
+ }
7038
+ /**
7039
+ * Get number of pending inputs
7040
+ */
7041
+ get length() {
7042
+ return this.queue.length;
7043
+ }
7044
+ /**
7045
+ * Get all pending inputs (for display)
7046
+ */
7047
+ getPending() {
7048
+ return [...this.queue];
7049
+ }
7050
+ /**
7051
+ * Pause queue processing (inputs can still be added)
7052
+ */
7053
+ pause() {
7054
+ this.isPaused = true;
7055
+ }
7056
+ /**
7057
+ * Resume queue processing
7058
+ */
7059
+ resume() {
7060
+ this.isPaused = false;
7061
+ }
7062
+ /**
7063
+ * Clear all pending inputs
7064
+ */
7065
+ clear() {
7066
+ this.queue = [];
7067
+ this.emit(INPUT_QUEUE_EVENT.CLEARED);
7068
+ }
7069
+ /**
7070
+ * Shutdown queue (no more inputs accepted)
7071
+ */
7072
+ shutdown() {
7073
+ this.isShutdown = true;
7074
+ this.queue = [];
7075
+ this.emit(INPUT_QUEUE_EVENT.SHUTDOWN);
7076
+ }
7077
+ /**
7078
+ * Check if queue is shutdown
7079
+ */
7080
+ get isTerminated() {
7081
+ return this.isShutdown;
7082
+ }
7083
+ /**
7084
+ * Check if queue is paused
7085
+ */
7086
+ get isHeld() {
7087
+ return this.isPaused;
7088
+ }
7089
+ };
7090
+ var inputQueueInstance = null;
7091
+ function getInputQueue() {
7092
+ if (!inputQueueInstance) {
7093
+ inputQueueInstance = new InputQueue();
7094
+ }
7095
+ return inputQueueInstance;
7096
+ }
7097
+
6962
7098
  // src/cli/app.tsx
6963
7099
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
6964
7100
  var App = ({ autoApprove = false, target }) => {
@@ -6977,6 +7113,7 @@ var App = ({ autoApprove = false, target }) => {
6977
7113
  const [preInputBuffer, setPreInputBuffer] = useState("");
6978
7114
  const [wasInterrupted, setWasInterrupted] = useState(false);
6979
7115
  const [spinnerHue, setSpinnerHue] = useState(0);
7116
+ const [queuedCount, setQueuedCount] = useState(0);
6980
7117
  const [, forceUpdate] = useState(0);
6981
7118
  const spinnerColor = THEME.spinner;
6982
7119
  const [agent] = useState(() => new AutonomousHackingAgent(void 0, { autoApprove }));
@@ -7220,6 +7357,17 @@ var App = ({ autoApprove = false, target }) => {
7220
7357
  addMessage(MESSAGE_TYPE.SYSTEM, `\u2713 Complete (${duration}s)`);
7221
7358
  setIsProcessing(false);
7222
7359
  setCurrentStatus("");
7360
+ const inputQueue = getInputQueue();
7361
+ if (inputQueue.hasPending()) {
7362
+ const next = inputQueue.dequeue();
7363
+ if (next) {
7364
+ setQueuedCount(inputQueue.length);
7365
+ addMessage(MESSAGE_TYPE.SYSTEM, ` \u{1F4E4} Processing queued: ${next.content.slice(0, 50)}...`);
7366
+ setTimeout(() => {
7367
+ handleSubmit(next.content);
7368
+ }, 100);
7369
+ }
7370
+ }
7223
7371
  });
7224
7372
  agent.on(AGENT_EVENT.ERROR, (error) => {
7225
7373
  stopTimer();
@@ -7275,7 +7423,14 @@ var App = ({ autoApprove = false, target }) => {
7275
7423
  exit();
7276
7424
  return;
7277
7425
  }
7278
- if (isProcessing && !trimmed.startsWith("/")) return;
7426
+ if (isProcessing && !trimmed.startsWith("/")) {
7427
+ const inputQueue = getInputQueue();
7428
+ inputQueue.enqueue(trimmed);
7429
+ setQueuedCount(inputQueue.length);
7430
+ setInput("");
7431
+ addMessage(MESSAGE_TYPE.SYSTEM, ` \u{1F4E5} Queued (${inputQueue.length} pending): ${trimmed.slice(0, 50)}...`);
7432
+ return;
7433
+ }
7279
7434
  setInput("");
7280
7435
  addMessage(MESSAGE_TYPE.USER, trimmed);
7281
7436
  if (trimmed.startsWith("/")) {
@@ -7926,7 +8081,10 @@ ${list}`);
7926
8081
  /* @__PURE__ */ jsx2(Text2, { color: THEME.text.accent, children: preInputBuffer }),
7927
8082
  /* @__PURE__ */ jsx2(Text2, { color: THEME.text.muted, children: "\u258C" })
7928
8083
  ] }),
7929
- /* @__PURE__ */ jsx2(Box2, { marginTop: 1, children: /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "ESC to interrupt \u2502 Type ahead to queue input" }) })
8084
+ /* @__PURE__ */ jsx2(Box2, { marginTop: 1, children: /* @__PURE__ */ jsxs2(Text2, { dimColor: true, children: [
8085
+ "ESC to interrupt \u2502 Type ahead to queue input",
8086
+ queuedCount > 0 ? ` \u2502 \u{1F4E5} ${queuedCount} queued` : ""
8087
+ ] }) })
7930
8088
  ] }) : /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
7931
8089
  showCommandHints && input.startsWith("/") && /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", marginBottom: 1, children: /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: [
7932
8090
  "/target <ip>",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pentesting",
3
- "version": "0.8.34",
3
+ "version": "0.8.35",
4
4
  "description": "Autonomous Penetration Testing AI Agent",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",