codetyper-cli 0.4.0 → 0.4.2

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/index.js CHANGED
@@ -6317,9 +6317,10 @@ var init_ui = __esm(() => {
6317
6317
  });
6318
6318
 
6319
6319
  // src/constants/terminal.ts
6320
- var DISABLE_MOUSE_TRACKING;
6320
+ var DISABLE_MOUSE_TRACKING, TERMINAL_RESET;
6321
6321
  var init_terminal = __esm(() => {
6322
6322
  DISABLE_MOUSE_TRACKING = "\x1B[?1006l" + "\x1B[?1015l" + "\x1B[?1003l" + "\x1B[?1002l" + "\x1B[?1000l";
6323
+ TERMINAL_RESET = DISABLE_MOUSE_TRACKING + "\x1B[?25h" + "\x1B[?1049l" + "\x1B[>4;0m" + "\x1B[?2004l";
6323
6324
  });
6324
6325
 
6325
6326
  // node_modules/@inquirer/core/dist/lib/key.js
@@ -27362,15 +27363,17 @@ var init_dist16 = __esm(() => {
27362
27363
  });
27363
27364
 
27364
27365
  // src/utils/core/terminal.ts
27366
+ import { writeSync } from "fs";
27365
27367
  var spinner = null, exitHandlersRegistered = false, emergencyTerminalCleanup = () => {
27366
27368
  try {
27367
- process.stdout.write(DISABLE_MOUSE_TRACKING + TERMINAL_SEQUENCES.SHOW_CURSOR + TERMINAL_SEQUENCES.LEAVE_ALTERNATE_SCREEN);
27369
+ writeSync(1, TERMINAL_RESET);
27368
27370
  } catch {}
27369
27371
  }, registerExitHandlers = () => {
27370
27372
  if (exitHandlersRegistered)
27371
27373
  return;
27372
27374
  exitHandlersRegistered = true;
27373
27375
  process.on("exit", emergencyTerminalCleanup);
27376
+ process.on("beforeExit", emergencyTerminalCleanup);
27374
27377
  process.on("SIGINT", () => {
27375
27378
  emergencyTerminalCleanup();
27376
27379
  process.exit(130);
@@ -27379,6 +27382,18 @@ var spinner = null, exitHandlersRegistered = false, emergencyTerminalCleanup = (
27379
27382
  emergencyTerminalCleanup();
27380
27383
  process.exit(143);
27381
27384
  });
27385
+ process.on("SIGHUP", () => {
27386
+ emergencyTerminalCleanup();
27387
+ process.exit(128);
27388
+ });
27389
+ process.on("uncaughtException", () => {
27390
+ emergencyTerminalCleanup();
27391
+ process.exit(1);
27392
+ });
27393
+ process.on("unhandledRejection", () => {
27394
+ emergencyTerminalCleanup();
27395
+ process.exit(1);
27396
+ });
27382
27397
  }, successMessage = (message) => {
27383
27398
  console.log(source_default.green("✓") + " " + message);
27384
27399
  }, errorMessage = (message) => {
@@ -27420,7 +27435,9 @@ var spinner = null, exitHandlersRegistered = false, emergencyTerminalCleanup = (
27420
27435
  }, filePath = (path2) => source_default.cyan(path2), enterFullscreen = () => {
27421
27436
  process.stdout.write(TERMINAL_SEQUENCES.ENTER_ALTERNATE_SCREEN + TERMINAL_SEQUENCES.CLEAR_SCREEN + TERMINAL_SEQUENCES.CURSOR_HOME);
27422
27437
  }, exitFullscreen = () => {
27423
- process.stdout.write(DISABLE_MOUSE_TRACKING + TERMINAL_SEQUENCES.SHOW_CURSOR + TERMINAL_SEQUENCES.LEAVE_ALTERNATE_SCREEN);
27438
+ try {
27439
+ writeSync(1, TERMINAL_RESET);
27440
+ } catch {}
27424
27441
  }, clearScreen = () => {
27425
27442
  process.stdout.write(TERMINAL_SEQUENCES.CLEAR_SCREEN + TERMINAL_SEQUENCES.CLEAR_SCROLLBACK + TERMINAL_SEQUENCES.CURSOR_HOME);
27426
27443
  }, askConfirm = async (message) => {
@@ -41869,7 +41886,7 @@ function convertToDebugSymbols(symbols) {
41869
41886
  });
41870
41887
  if (env2.OTUI_DEBUG_FFI && globalFFILogWriter) {
41871
41888
  const writer = globalFFILogWriter;
41872
- const writeSync = (msg) => {
41889
+ const writeSync2 = (msg) => {
41873
41890
  const buffer = new TextEncoder().encode(msg + `
41874
41891
  `);
41875
41892
  writer.write(buffer);
@@ -41878,9 +41895,9 @@ function convertToDebugSymbols(symbols) {
41878
41895
  Object.entries(symbols).forEach(([key, value]) => {
41879
41896
  if (typeof value === "function") {
41880
41897
  debugSymbols[key] = (...args) => {
41881
- writeSync(`${key}(${args.map((arg) => String(arg)).join(", ")})`);
41898
+ writeSync2(`${key}(${args.map((arg) => String(arg)).join(", ")})`);
41882
41899
  const result = value(...args);
41883
- writeSync(`${key} returned: ${String(result)}`);
41900
+ writeSync2(`${key} returned: ${String(result)}`);
41884
41901
  return result;
41885
41902
  };
41886
41903
  }
@@ -65647,6 +65664,7 @@ var init_app = __esm(async () => {
65647
65664
  logs: [],
65648
65665
  currentToolCall: null,
65649
65666
  permissionRequest: null,
65667
+ planApprovalPrompt: null,
65650
65668
  learningPrompt: null,
65651
65669
  thinkingMessage: null,
65652
65670
  sessionId: null,
@@ -65691,6 +65709,7 @@ var init_app = __esm(async () => {
65691
65709
  const logs = () => store.logs;
65692
65710
  const currentToolCall = () => store.currentToolCall;
65693
65711
  const permissionRequest = () => store.permissionRequest;
65712
+ const planApprovalPrompt = () => store.planApprovalPrompt;
65694
65713
  const learningPrompt = () => store.learningPrompt;
65695
65714
  const thinkingMessage = () => store.thinkingMessage;
65696
65715
  const sessionId = () => store.sessionId;
@@ -65787,6 +65806,9 @@ var init_app = __esm(async () => {
65787
65806
  const setPermissionRequest = (request) => {
65788
65807
  setStore("permissionRequest", request);
65789
65808
  };
65809
+ const setPlanApprovalPrompt = (prompt2) => {
65810
+ setStore("planApprovalPrompt", prompt2);
65811
+ };
65790
65812
  const setLearningPrompt = (prompt2) => {
65791
65813
  setStore("learningPrompt", prompt2);
65792
65814
  };
@@ -66068,7 +66090,7 @@ var init_app = __esm(async () => {
66068
66090
  });
66069
66091
  };
66070
66092
  const isInputLocked = () => {
66071
- return store.mode === "thinking" || store.mode === "tool_execution" || store.mode === "permission_prompt";
66093
+ return store.mode === "thinking" || store.mode === "tool_execution" || store.mode === "permission_prompt" || store.mode === "plan_approval";
66072
66094
  };
66073
66095
  return {
66074
66096
  mode,
@@ -66080,6 +66102,7 @@ var init_app = __esm(async () => {
66080
66102
  logs,
66081
66103
  currentToolCall,
66082
66104
  permissionRequest,
66105
+ planApprovalPrompt,
66083
66106
  learningPrompt,
66084
66107
  thinkingMessage,
66085
66108
  sessionId,
@@ -66119,6 +66142,7 @@ var init_app = __esm(async () => {
66119
66142
  setCurrentToolCall,
66120
66143
  updateToolCall,
66121
66144
  setPermissionRequest,
66145
+ setPlanApprovalPrompt,
66122
66146
  setLearningPrompt,
66123
66147
  setThinkingMessage,
66124
66148
  setSessionInfo,
@@ -66175,6 +66199,7 @@ var init_app = __esm(async () => {
66175
66199
  logs: [],
66176
66200
  currentToolCall: null,
66177
66201
  permissionRequest: null,
66202
+ planApprovalPrompt: null,
66178
66203
  learningPrompt: null,
66179
66204
  thinkingMessage: null,
66180
66205
  sessionId: null,
@@ -66213,6 +66238,7 @@ var init_app = __esm(async () => {
66213
66238
  logs: storeRef.logs(),
66214
66239
  currentToolCall: storeRef.currentToolCall(),
66215
66240
  permissionRequest: storeRef.permissionRequest(),
66241
+ planApprovalPrompt: storeRef.planApprovalPrompt(),
66216
66242
  learningPrompt: storeRef.learningPrompt(),
66217
66243
  thinkingMessage: storeRef.thinkingMessage(),
66218
66244
  sessionId: storeRef.sessionId(),
@@ -66277,6 +66303,11 @@ var init_app = __esm(async () => {
66277
66303
  return;
66278
66304
  storeRef.setPermissionRequest(request);
66279
66305
  },
66306
+ setPlanApprovalPrompt: (prompt2) => {
66307
+ if (!storeRef)
66308
+ return;
66309
+ storeRef.setPlanApprovalPrompt(prompt2);
66310
+ },
66280
66311
  setLearningPrompt: (prompt2) => {
66281
66312
  if (!storeRef)
66282
66313
  return;
@@ -94036,7 +94067,7 @@ var init_semantic_search = __esm(() => {
94036
94067
  var version_default;
94037
94068
  var init_version = __esm(() => {
94038
94069
  version_default = {
94039
- version: "0.3.0"
94070
+ version: "0.4.2"
94040
94071
  };
94041
94072
  });
94042
94073
 
@@ -108063,6 +108094,203 @@ var getFiles = (dir, cwd, maxDepth = FILE_PICKER_DEFAULTS.MAX_DEPTH, currentDept
108063
108094
 
108064
108095
  // src/tui-solid/app.tsx
108065
108096
  init_terminal();
108097
+
108098
+ // src/services/exit-message.ts
108099
+ import { EOL } from "os";
108100
+
108101
+ // src/constants/exit-message.ts
108102
+ var EXIT_LOGO = [
108103
+ "█▀▀█",
108104
+ "█ █",
108105
+ "▀▀▀▀"
108106
+ ];
108107
+ var EXIT_STYLES = {
108108
+ RESET: "\x1B[0m",
108109
+ DIM: "\x1B[90m",
108110
+ HIGHLIGHT: "\x1B[96m",
108111
+ BOLD: "\x1B[1m",
108112
+ LOGO_COLOR: "\x1B[36m"
108113
+ };
108114
+ var EXIT_DESCRIPTION_MAX_WIDTH = 50;
108115
+ var EXIT_LINE_PADDING = " ";
108116
+ var EXIT_LOGO_GAP = " ";
108117
+ var EXIT_TRUNCATION_MARKER = "…";
108118
+
108119
+ // src/services/exit-message.ts
108120
+ var truncateText = (text, maxWidth) => {
108121
+ if (text.length <= maxWidth)
108122
+ return text;
108123
+ return text.slice(0, maxWidth - 1) + EXIT_TRUNCATION_MARKER;
108124
+ };
108125
+ var formatExitMessage = (sessionId, sessionTitle) => {
108126
+ if (!sessionId)
108127
+ return "";
108128
+ const { RESET, DIM, HIGHLIGHT, LOGO_COLOR } = EXIT_STYLES;
108129
+ const pad = EXIT_LINE_PADDING;
108130
+ const gap = EXIT_LOGO_GAP;
108131
+ const description = sessionTitle ? truncateText(sessionTitle, EXIT_DESCRIPTION_MAX_WIDTH) : "";
108132
+ const resumeCommand = `codetyper --resume ${sessionId}`;
108133
+ const lines = [
108134
+ "",
108135
+ `${pad}${LOGO_COLOR}${EXIT_LOGO[0]}${RESET}${gap}${HIGHLIGHT}${description}${RESET}`,
108136
+ `${pad}${LOGO_COLOR}${EXIT_LOGO[1]}${RESET}${gap}${DIM}${resumeCommand}${RESET}`,
108137
+ `${pad}${LOGO_COLOR}${EXIT_LOGO[2]}${RESET}`,
108138
+ ""
108139
+ ];
108140
+ return lines.join(EOL);
108141
+ };
108142
+
108143
+ // src/constants/clipboard.ts
108144
+ var OSC52_SEQUENCE_PREFIX = "\x1B]52;c;";
108145
+ var OSC52_SEQUENCE_SUFFIX = "\x07";
108146
+ var TMUX_DCS_PREFIX = "\x1BPtmux;\x1B";
108147
+ var TMUX_DCS_SUFFIX = "\x1B\\";
108148
+ var TMUX_ENV_VAR = "TMUX";
108149
+ var SCREEN_ENV_VAR = "STY";
108150
+ var WAYLAND_DISPLAY_ENV_VAR = "WAYLAND_DISPLAY";
108151
+ var CLIPBOARD_COMMAND_TIMEOUT_MS = 5000;
108152
+
108153
+ // src/services/clipboard/run-command.ts
108154
+ import { spawn as spawn8, execSync as execSync2 } from "child_process";
108155
+ var runCommand2 = (command, args) => {
108156
+ return new Promise((resolve4, reject) => {
108157
+ const proc = spawn8(command, args);
108158
+ const stdout = [];
108159
+ let stderr = "";
108160
+ const timer2 = setTimeout(() => {
108161
+ proc.kill();
108162
+ reject(new Error(`Command timed out after ${CLIPBOARD_COMMAND_TIMEOUT_MS}ms: ${command}`));
108163
+ }, CLIPBOARD_COMMAND_TIMEOUT_MS);
108164
+ proc.stdout.on("data", (data) => stdout.push(data));
108165
+ proc.stderr.on("data", (data) => {
108166
+ stderr += data.toString();
108167
+ });
108168
+ proc.on("close", (code) => {
108169
+ clearTimeout(timer2);
108170
+ if (code === 0) {
108171
+ resolve4({ stdout: Buffer.concat(stdout), stderr });
108172
+ } else {
108173
+ reject(new Error(`Command failed with code ${code}: ${stderr}`));
108174
+ }
108175
+ });
108176
+ proc.on("error", (error49) => {
108177
+ clearTimeout(timer2);
108178
+ reject(error49);
108179
+ });
108180
+ });
108181
+ };
108182
+ var runCommandText = async (command, args) => {
108183
+ const { stdout } = await runCommand2(command, args);
108184
+ return stdout.toString().trim();
108185
+ };
108186
+ var runCommandWithStdin = (command, args, input) => {
108187
+ return new Promise((resolve4, reject) => {
108188
+ const proc = spawn8(command, args, {
108189
+ stdio: ["pipe", "ignore", "ignore"]
108190
+ });
108191
+ const timer2 = setTimeout(() => {
108192
+ proc.kill();
108193
+ reject(new Error(`Command timed out after ${CLIPBOARD_COMMAND_TIMEOUT_MS}ms: ${command}`));
108194
+ }, CLIPBOARD_COMMAND_TIMEOUT_MS);
108195
+ proc.on("close", (code) => {
108196
+ clearTimeout(timer2);
108197
+ if (code === 0) {
108198
+ resolve4();
108199
+ } else {
108200
+ reject(new Error(`Command failed with code ${code}: ${command}`));
108201
+ }
108202
+ });
108203
+ proc.on("error", (error49) => {
108204
+ clearTimeout(timer2);
108205
+ reject(error49);
108206
+ });
108207
+ proc.stdin.write(input);
108208
+ proc.stdin.end();
108209
+ });
108210
+ };
108211
+ var commandExists = (name) => {
108212
+ try {
108213
+ execSync2(`which ${name}`, { stdio: "ignore" });
108214
+ return true;
108215
+ } catch {
108216
+ return false;
108217
+ }
108218
+ };
108219
+
108220
+ // src/services/clipboard/text-clipboard.ts
108221
+ var writeOsc52 = (text) => {
108222
+ if (!process.stdout.isTTY) {
108223
+ return;
108224
+ }
108225
+ const base643 = Buffer.from(text).toString("base64");
108226
+ const osc52 = `${OSC52_SEQUENCE_PREFIX}${base643}${OSC52_SEQUENCE_SUFFIX}`;
108227
+ const isPassthrough = Boolean(process.env[TMUX_ENV_VAR]) || Boolean(process.env[SCREEN_ENV_VAR]);
108228
+ const sequence = isPassthrough ? `${TMUX_DCS_PREFIX}${osc52}${TMUX_DCS_SUFFIX}` : osc52;
108229
+ process.stdout.write(sequence);
108230
+ };
108231
+ var copyMethodBuilders = {
108232
+ darwin: () => {
108233
+ if (!commandExists("osascript")) {
108234
+ return null;
108235
+ }
108236
+ return async (text) => {
108237
+ const escaped = text.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
108238
+ await runCommandText("osascript", [
108239
+ "-e",
108240
+ `set the clipboard to "${escaped}"`
108241
+ ]);
108242
+ };
108243
+ },
108244
+ linux: () => {
108245
+ if (process.env[WAYLAND_DISPLAY_ENV_VAR] && commandExists("wl-copy")) {
108246
+ return async (text) => {
108247
+ await runCommandWithStdin("wl-copy", [], text);
108248
+ };
108249
+ }
108250
+ if (commandExists("xclip")) {
108251
+ return async (text) => {
108252
+ await runCommandWithStdin("xclip", ["-selection", "clipboard"], text);
108253
+ };
108254
+ }
108255
+ if (commandExists("xsel")) {
108256
+ return async (text) => {
108257
+ await runCommandWithStdin("xsel", ["--clipboard", "--input"], text);
108258
+ };
108259
+ }
108260
+ return null;
108261
+ },
108262
+ win32: () => {
108263
+ return async (text) => {
108264
+ await runCommandWithStdin("powershell.exe", [
108265
+ "-NonInteractive",
108266
+ "-NoProfile",
108267
+ "-Command",
108268
+ "[Console]::InputEncoding = [System.Text.Encoding]::UTF8; Set-Clipboard -Value ([Console]::In.ReadToEnd())"
108269
+ ], text);
108270
+ };
108271
+ }
108272
+ };
108273
+ var cachedCopyMethod = null;
108274
+ var copyMethodResolved = false;
108275
+ var resolveCopyMethod = () => {
108276
+ if (copyMethodResolved) {
108277
+ return cachedCopyMethod;
108278
+ }
108279
+ const platform2 = process.platform;
108280
+ const builder = copyMethodBuilders[platform2];
108281
+ cachedCopyMethod = builder ? builder() : null;
108282
+ copyMethodResolved = true;
108283
+ return cachedCopyMethod;
108284
+ };
108285
+ var copyToClipboard = async (text) => {
108286
+ writeOsc52(text);
108287
+ const method = resolveCopyMethod();
108288
+ if (method) {
108289
+ await method(text);
108290
+ }
108291
+ };
108292
+
108293
+ // src/tui-solid/app.tsx
108066
108294
  init_version();
108067
108295
 
108068
108296
  // src/tui-solid/context/exit.tsx
@@ -110190,6 +110418,7 @@ function Header(props) {
110190
110418
  setProp(_el$11, "justifyContent", "space-between");
110191
110419
  setProp(_el$11, "paddingLeft", 1);
110192
110420
  setProp(_el$11, "paddingRight", 1);
110421
+ setProp(_el$11, "marginBottom", 1);
110193
110422
  setProp(_el$11, "border", ["bottom"]);
110194
110423
  insertNode(_el$12, _el$15);
110195
110424
  insertNode(_el$12, _el$17);
@@ -110351,17 +110580,18 @@ function Header(props) {
110351
110580
  }
110352
110581
  }), null);
110353
110582
  effect((_p$) => {
110354
- var _v$15 = theme.colors.border, _v$16 = theme.colors.textDim, _v$17 = theme.colors.textDim, _v$18 = modeColor(), _v$19 = TextAttributes.BOLD, _v$20 = theme.colors.textDim, _v$21 = theme.colors.textDim, _v$22 = theme.colors.secondary, _v$23 = theme.colors.textDim, _v$24 = theme.colors.accent;
110583
+ var _v$15 = theme.colors.border, _v$16 = theme.colors.background, _v$17 = theme.colors.textDim, _v$18 = theme.colors.textDim, _v$19 = modeColor(), _v$20 = TextAttributes.BOLD, _v$21 = theme.colors.textDim, _v$22 = theme.colors.textDim, _v$23 = theme.colors.secondary, _v$24 = theme.colors.textDim, _v$25 = theme.colors.accent;
110355
110584
  _v$15 !== _p$.e && (_p$.e = setProp(_el$11, "borderColor", _v$15, _p$.e));
110356
- _v$16 !== _p$.t && (_p$.t = setProp(_el$15, "fg", _v$16, _p$.t));
110357
- _v$17 !== _p$.a && (_p$.a = setProp(_el$17, "fg", _v$17, _p$.a));
110358
- _v$18 !== _p$.o && (_p$.o = setProp(_el$20, "fg", _v$18, _p$.o));
110359
- _v$19 !== _p$.i && (_p$.i = setProp(_el$20, "attributes", _v$19, _p$.i));
110360
- _v$20 !== _p$.n && (_p$.n = setProp(_el$26, "fg", _v$20, _p$.n));
110361
- _v$21 !== _p$.s && (_p$.s = setProp(_el$44, "fg", _v$21, _p$.s));
110362
- _v$22 !== _p$.h && (_p$.h = setProp(_el$46, "fg", _v$22, _p$.h));
110363
- _v$23 !== _p$.r && (_p$.r = setProp(_el$48, "fg", _v$23, _p$.r));
110364
- _v$24 !== _p$.d && (_p$.d = setProp(_el$50, "fg", _v$24, _p$.d));
110585
+ _v$16 !== _p$.t && (_p$.t = setProp(_el$11, "backgroundColor", _v$16, _p$.t));
110586
+ _v$17 !== _p$.a && (_p$.a = setProp(_el$15, "fg", _v$17, _p$.a));
110587
+ _v$18 !== _p$.o && (_p$.o = setProp(_el$17, "fg", _v$18, _p$.o));
110588
+ _v$19 !== _p$.i && (_p$.i = setProp(_el$20, "fg", _v$19, _p$.i));
110589
+ _v$20 !== _p$.n && (_p$.n = setProp(_el$20, "attributes", _v$20, _p$.n));
110590
+ _v$21 !== _p$.s && (_p$.s = setProp(_el$26, "fg", _v$21, _p$.s));
110591
+ _v$22 !== _p$.h && (_p$.h = setProp(_el$44, "fg", _v$22, _p$.h));
110592
+ _v$23 !== _p$.r && (_p$.r = setProp(_el$46, "fg", _v$23, _p$.r));
110593
+ _v$24 !== _p$.d && (_p$.d = setProp(_el$48, "fg", _v$24, _p$.d));
110594
+ _v$25 !== _p$.l && (_p$.l = setProp(_el$50, "fg", _v$25, _p$.l));
110365
110595
  return _p$;
110366
110596
  }, {
110367
110597
  e: undefined,
@@ -110373,7 +110603,8 @@ function Header(props) {
110373
110603
  s: undefined,
110374
110604
  h: undefined,
110375
110605
  r: undefined,
110376
- d: undefined
110606
+ d: undefined,
110607
+ l: undefined
110377
110608
  });
110378
110609
  return _el$;
110379
110610
  })();
@@ -110929,13 +111160,31 @@ function SystemEntry(props) {
110929
111160
  }
110930
111161
  function ThinkingEntry(props) {
110931
111162
  const theme = useTheme();
111163
+ const firstLine = createMemo(() => {
111164
+ const lines = props.entry.content.split(`
111165
+ `);
111166
+ const line2 = lines[0] || "";
111167
+ if (line2.length > 80)
111168
+ return line2.substring(0, 80) + "...";
111169
+ return line2;
111170
+ });
110932
111171
  return (() => {
110933
- var _el$15 = createElement("box"), _el$16 = createElement("text"), _el$17 = createTextNode(`● `);
111172
+ var _el$15 = createElement("box"), _el$16 = createElement("text"), _el$17 = createTextNode(`Thinking: `);
110934
111173
  insertNode(_el$15, _el$16);
110935
111174
  setProp(_el$15, "marginBottom", 1);
111175
+ setProp(_el$15, "border", ["left"]);
111176
+ setProp(_el$15, "paddingLeft", 1);
110936
111177
  insertNode(_el$16, _el$17);
110937
- insert(_el$16, () => props.entry.content, null);
110938
- effect((_$p) => setProp(_el$16, "fg", theme.colors.modeThinking, _$p));
111178
+ insert(_el$16, firstLine, null);
111179
+ effect((_p$) => {
111180
+ var _v$5 = theme.colors.modeThinking, _v$6 = theme.colors.textDim;
111181
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$15, "borderColor", _v$5, _p$.e));
111182
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$16, "fg", _v$6, _p$.t));
111183
+ return _p$;
111184
+ }, {
111185
+ e: undefined,
111186
+ t: undefined
111187
+ });
110939
111188
  return _el$15;
110940
111189
  })();
110941
111190
  }
@@ -111069,9 +111318,9 @@ function DiffToolEntry(props) {
111069
111318
  }
111070
111319
  }));
111071
111320
  effect((_p$) => {
111072
- var _v$5 = props.statusColor, _v$6 = theme.colors.roleTool;
111073
- _v$5 !== _p$.e && (_p$.e = setProp(_el$20, "fg", _v$5, _p$.e));
111074
- _v$6 !== _p$.t && (_p$.t = setProp(_el$22, "fg", _v$6, _p$.t));
111321
+ var _v$7 = props.statusColor, _v$8 = theme.colors.roleTool;
111322
+ _v$7 !== _p$.e && (_p$.e = setProp(_el$20, "fg", _v$7, _p$.e));
111323
+ _v$8 !== _p$.t && (_p$.t = setProp(_el$22, "fg", _v$8, _p$.t));
111075
111324
  return _p$;
111076
111325
  }, {
111077
111326
  e: undefined,
@@ -111171,9 +111420,9 @@ function MultilineToolEntry(props) {
111171
111420
  }
111172
111421
  }), null);
111173
111422
  effect((_p$) => {
111174
- var _v$7 = props.statusColor, _v$8 = theme.colors.roleTool;
111175
- _v$7 !== _p$.e && (_p$.e = setProp(_el$29, "fg", _v$7, _p$.e));
111176
- _v$8 !== _p$.t && (_p$.t = setProp(_el$31, "fg", _v$8, _p$.t));
111423
+ var _v$9 = props.statusColor, _v$0 = theme.colors.roleTool;
111424
+ _v$9 !== _p$.e && (_p$.e = setProp(_el$29, "fg", _v$9, _p$.e));
111425
+ _v$0 !== _p$.t && (_p$.t = setProp(_el$31, "fg", _v$0, _p$.t));
111177
111426
  return _p$;
111178
111427
  }, {
111179
111428
  e: undefined,
@@ -111220,9 +111469,9 @@ function DefaultToolEntry(props) {
111220
111469
  }
111221
111470
  }), null);
111222
111471
  effect((_p$) => {
111223
- var _v$9 = props.statusColor, _v$0 = theme.colors.roleTool;
111224
- _v$9 !== _p$.e && (_p$.e = setProp(_el$44, "fg", _v$9, _p$.e));
111225
- _v$0 !== _p$.t && (_p$.t = setProp(_el$46, "fg", _v$0, _p$.t));
111472
+ var _v$1 = props.statusColor, _v$10 = theme.colors.roleTool;
111473
+ _v$1 !== _p$.e && (_p$.e = setProp(_el$44, "fg", _v$1, _p$.e));
111474
+ _v$10 !== _p$.t && (_p$.t = setProp(_el$46, "fg", _v$10, _p$.t));
111226
111475
  return _p$;
111227
111476
  }, {
111228
111477
  e: undefined,
@@ -111334,20 +111583,6 @@ function LogEntryDisplay(props) {
111334
111583
 
111335
111584
  // src/tui-solid/components/logs/log-panel.tsx
111336
111585
  var SCROLL_LINES2 = 3;
111337
- var MOUSE_ENABLE = "\x1B[?1000h\x1B[?1006h";
111338
- var MOUSE_DISABLE = "\x1B[?1000l\x1B[?1006l";
111339
- var SGR_MOUSE_PATTERN = /^\x1b\[<(\d+);(\d+);(\d+)([Mm])$/;
111340
- var parseMouseScroll = (data) => {
111341
- const match = data.match(SGR_MOUSE_PATTERN);
111342
- if (!match)
111343
- return null;
111344
- const button = parseInt(match[1], 10);
111345
- if (button === 64)
111346
- return "up";
111347
- if (button === 65)
111348
- return "down";
111349
- return null;
111350
- };
111351
111586
  function LogPanel() {
111352
111587
  const theme = useTheme();
111353
111588
  const app = useAppStore();
@@ -111419,32 +111654,13 @@ function LogPanel() {
111419
111654
  return;
111420
111655
  }
111421
111656
  });
111422
- onMount(() => {
111423
- process.stdout.write(MOUSE_ENABLE);
111424
- const handleData = (data) => {
111425
- if (!canScroll())
111426
- return;
111427
- const str = data.toString();
111428
- const direction = parseMouseScroll(str);
111429
- if (direction === "up") {
111430
- scrollUp();
111431
- } else if (direction === "down") {
111432
- scrollDown();
111433
- }
111434
- };
111435
- process.stdin.on("data", handleData);
111436
- onCleanup(() => {
111437
- process.stdout.write(MOUSE_DISABLE);
111438
- process.stdin.off("data", handleData);
111439
- });
111440
- });
111441
111657
  return (() => {
111442
111658
  var _el$ = createElement("box");
111443
111659
  setProp(_el$, "flexDirection", "column");
111444
111660
  setProp(_el$, "flexGrow", 1);
111445
111661
  setProp(_el$, "paddingLeft", 1);
111446
111662
  setProp(_el$, "paddingRight", 1);
111447
- setProp(_el$, "border", ["top", "bottom", "left", "right"]);
111663
+ setProp(_el$, "marginTop", 1);
111448
111664
  insert(_el$, createComponent2(Show, {
111449
111665
  get when() {
111450
111666
  return hasContent();
@@ -111476,8 +111692,11 @@ function LogPanel() {
111476
111692
  get children() {
111477
111693
  var _el$2 = createElement("scrollbox"), _el$3 = createElement("box");
111478
111694
  insertNode(_el$2, _el$3);
111479
- var _ref$ = scrollboxRef;
111480
- typeof _ref$ === "function" ? use(_ref$, _el$2) : scrollboxRef = _el$2;
111695
+ use((el) => {
111696
+ scrollboxRef = el;
111697
+ el.verticalScrollBar.visible = false;
111698
+ el.horizontalScrollBar.visible = false;
111699
+ }, _el$2);
111481
111700
  setProp(_el$2, "stickyStart", "bottom");
111482
111701
  setProp(_el$2, "flexGrow", 1);
111483
111702
  setProp(_el$3, "flexDirection", "column");
@@ -111493,7 +111712,6 @@ function LogPanel() {
111493
111712
  return _el$2;
111494
111713
  }
111495
111714
  }));
111496
- effect((_$p) => setProp(_el$, "borderColor", theme.colors.border, _$p));
111497
111715
  return _el$;
111498
111716
  })();
111499
111717
  }
@@ -112812,11 +113030,14 @@ function PermissionModal(props) {
112812
113030
  insertNode(_el$, _el$14);
112813
113031
  insertNode(_el$, _el$15);
112814
113032
  setProp(_el$, "flexDirection", "column");
112815
- setProp(_el$, "border", ["top", "bottom", "left", "right"]);
113033
+ setProp(_el$, "border", ["top"]);
112816
113034
  setProp(_el$, "paddingLeft", 2);
112817
113035
  setProp(_el$, "paddingRight", 2);
112818
113036
  setProp(_el$, "paddingTop", 1);
112819
113037
  setProp(_el$, "paddingBottom", 1);
113038
+ setProp(_el$, "width", "100%");
113039
+ setProp(_el$, "height", "auto");
113040
+ setProp(_el$, "flexShrink", 0);
112820
113041
  insertNode(_el$2, _el$3);
112821
113042
  setProp(_el$2, "marginBottom", 1);
112822
113043
  insertNode(_el$3, createTextNode(`⚠ Permission Required`));
@@ -112931,6 +113152,341 @@ function PermissionModal(props) {
112931
113152
  })();
112932
113153
  }
112933
113154
 
113155
+ // src/tui-solid/components/modals/plan-approval-modal.tsx
113156
+ init_server();
113157
+ await __promiseAll([
113158
+ init_solid(),
113159
+ init_solid(),
113160
+ init_solid(),
113161
+ init_solid(),
113162
+ init_solid(),
113163
+ init_solid(),
113164
+ init_solid(),
113165
+ init_solid(),
113166
+ init_solid(),
113167
+ init_core2(),
113168
+ init_theme2()
113169
+ ]);
113170
+
113171
+ // src/constants/plan-approval.ts
113172
+ var PLAN_APPROVAL_OPTIONS = [
113173
+ {
113174
+ key: "1",
113175
+ label: "Yes, clear context and auto-accept edits",
113176
+ description: "Approve plan, clear conversation context, and auto-accept all file edits",
113177
+ editMode: "auto_accept_clear",
113178
+ shortcut: "shift+tab"
113179
+ },
113180
+ {
113181
+ key: "2",
113182
+ label: "Yes, auto-accept edits",
113183
+ description: "Approve plan and auto-accept all file edits without prompting",
113184
+ editMode: "auto_accept"
113185
+ },
113186
+ {
113187
+ key: "3",
113188
+ label: "Yes, manually approve edits",
113189
+ description: "Approve plan but require manual approval for each file edit",
113190
+ editMode: "manual_approve"
113191
+ },
113192
+ {
113193
+ key: "4",
113194
+ label: "Type here to tell CodeTyper what to change",
113195
+ description: "Provide feedback or modifications to the plan",
113196
+ editMode: "feedback"
113197
+ }
113198
+ ];
113199
+ var PLAN_APPROVAL_FOOTER_TEXT = "ctrl-g to edit in editor";
113200
+
113201
+ // src/tui-solid/components/modals/plan-approval-modal.tsx
113202
+ function PlanApprovalModal(props) {
113203
+ const theme = useTheme();
113204
+ const [selectedIndex, setSelectedIndex] = createSignal(0);
113205
+ const [feedbackMode, setFeedbackMode] = createSignal(false);
113206
+ const [feedbackText, setFeedbackText] = createSignal("");
113207
+ const isActive = () => props.isActive ?? true;
113208
+ const optionCount = PLAN_APPROVAL_OPTIONS.length;
113209
+ const handleApproval = (option) => {
113210
+ if (option.editMode === "feedback") {
113211
+ setFeedbackMode(true);
113212
+ return;
113213
+ }
113214
+ props.onRespond({
113215
+ approved: true,
113216
+ editMode: option.editMode
113217
+ });
113218
+ };
113219
+ const handleFeedbackSubmit = () => {
113220
+ const text = feedbackText().trim();
113221
+ if (!text)
113222
+ return;
113223
+ props.onRespond({
113224
+ approved: true,
113225
+ editMode: "feedback",
113226
+ feedback: text
113227
+ });
113228
+ };
113229
+ const handleCancel = () => {
113230
+ if (feedbackMode()) {
113231
+ setFeedbackMode(false);
113232
+ setFeedbackText("");
113233
+ return;
113234
+ }
113235
+ props.onRespond({
113236
+ approved: false,
113237
+ editMode: "manual_approve"
113238
+ });
113239
+ };
113240
+ useKeyboard((evt) => {
113241
+ if (!isActive())
113242
+ return;
113243
+ evt.stopPropagation();
113244
+ if (feedbackMode()) {
113245
+ if (evt.name === "return") {
113246
+ handleFeedbackSubmit();
113247
+ evt.preventDefault();
113248
+ return;
113249
+ }
113250
+ if (evt.name === "escape") {
113251
+ handleCancel();
113252
+ evt.preventDefault();
113253
+ return;
113254
+ }
113255
+ if (evt.name === "backspace") {
113256
+ setFeedbackText((prev) => prev.slice(0, -1));
113257
+ evt.preventDefault();
113258
+ return;
113259
+ }
113260
+ if (evt.name.length === 1 && !evt.ctrl && !evt.meta) {
113261
+ setFeedbackText((prev) => prev + evt.name);
113262
+ evt.preventDefault();
113263
+ }
113264
+ return;
113265
+ }
113266
+ if (evt.name === "up") {
113267
+ setSelectedIndex((prev) => prev > 0 ? prev - 1 : optionCount - 1);
113268
+ evt.preventDefault();
113269
+ return;
113270
+ }
113271
+ if (evt.name === "down") {
113272
+ setSelectedIndex((prev) => prev < optionCount - 1 ? prev + 1 : 0);
113273
+ evt.preventDefault();
113274
+ return;
113275
+ }
113276
+ if (evt.name === "return") {
113277
+ handleApproval(PLAN_APPROVAL_OPTIONS[selectedIndex()]);
113278
+ evt.preventDefault();
113279
+ return;
113280
+ }
113281
+ if (evt.name === "escape") {
113282
+ handleCancel();
113283
+ evt.preventDefault();
113284
+ return;
113285
+ }
113286
+ if (evt.name === "tab" && evt.shift) {
113287
+ handleApproval(PLAN_APPROVAL_OPTIONS[0]);
113288
+ evt.preventDefault();
113289
+ return;
113290
+ }
113291
+ if (evt.name.length === 1 && !evt.ctrl && !evt.meta) {
113292
+ const option = PLAN_APPROVAL_OPTIONS.find((o2) => o2.key === evt.name);
113293
+ if (option) {
113294
+ handleApproval(option);
113295
+ evt.preventDefault();
113296
+ }
113297
+ }
113298
+ });
113299
+ return (() => {
113300
+ var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text");
113301
+ insertNode(_el$, _el$2);
113302
+ setProp(_el$, "flexDirection", "column");
113303
+ setProp(_el$, "border", ["top", "bottom", "left", "right"]);
113304
+ setProp(_el$, "paddingLeft", 2);
113305
+ setProp(_el$, "paddingRight", 2);
113306
+ setProp(_el$, "paddingTop", 1);
113307
+ setProp(_el$, "paddingBottom", 1);
113308
+ insertNode(_el$2, _el$3);
113309
+ setProp(_el$2, "marginBottom", 1);
113310
+ insertNode(_el$3, createTextNode(`CodeTyper has written up a plan and is ready to execute. Would you like to proceed?`));
113311
+ insert(_el$, createComponent2(Show, {
113312
+ get when() {
113313
+ return props.prompt.planTitle;
113314
+ },
113315
+ get children() {
113316
+ var _el$5 = createElement("box"), _el$6 = createElement("text");
113317
+ insertNode(_el$5, _el$6);
113318
+ setProp(_el$5, "marginBottom", 1);
113319
+ insert(_el$6, () => props.prompt.planTitle);
113320
+ effect((_p$) => {
113321
+ var _v$ = theme.colors.text, _v$2 = TextAttributes.BOLD;
113322
+ _v$ !== _p$.e && (_p$.e = setProp(_el$6, "fg", _v$, _p$.e));
113323
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$6, "attributes", _v$2, _p$.t));
113324
+ return _p$;
113325
+ }, {
113326
+ e: undefined,
113327
+ t: undefined
113328
+ });
113329
+ return _el$5;
113330
+ }
113331
+ }), null);
113332
+ insert(_el$, createComponent2(Show, {
113333
+ get when() {
113334
+ return props.prompt.planSummary;
113335
+ },
113336
+ get children() {
113337
+ var _el$7 = createElement("box"), _el$8 = createElement("text");
113338
+ insertNode(_el$7, _el$8);
113339
+ setProp(_el$7, "marginBottom", 1);
113340
+ insert(_el$8, () => props.prompt.planSummary);
113341
+ effect((_$p) => setProp(_el$8, "fg", theme.colors.textDim, _$p));
113342
+ return _el$7;
113343
+ }
113344
+ }), null);
113345
+ insert(_el$, createComponent2(Show, {
113346
+ get when() {
113347
+ return !feedbackMode();
113348
+ },
113349
+ get children() {
113350
+ var _el$9 = createElement("box");
113351
+ setProp(_el$9, "flexDirection", "column");
113352
+ setProp(_el$9, "marginTop", 1);
113353
+ insert(_el$9, createComponent2(For, {
113354
+ each: PLAN_APPROVAL_OPTIONS,
113355
+ children: (option, index) => {
113356
+ const isSelected = () => index() === selectedIndex();
113357
+ return (() => {
113358
+ var _el$23 = createElement("box"), _el$24 = createElement("text"), _el$25 = createElement("text"), _el$26 = createTextNode(`. `), _el$27 = createElement("text");
113359
+ insertNode(_el$23, _el$24);
113360
+ insertNode(_el$23, _el$25);
113361
+ insertNode(_el$23, _el$27);
113362
+ setProp(_el$23, "flexDirection", "row");
113363
+ insert(_el$24, () => isSelected() ? "> " : " ");
113364
+ insertNode(_el$25, _el$26);
113365
+ insert(_el$25, () => option.key, _el$26);
113366
+ insert(_el$27, () => option.label);
113367
+ insert(_el$23, createComponent2(Show, {
113368
+ get when() {
113369
+ return option.shortcut;
113370
+ },
113371
+ get children() {
113372
+ var _el$28 = createElement("text"), _el$29 = createTextNode(` (`), _el$31 = createTextNode(`)`);
113373
+ insertNode(_el$28, _el$29);
113374
+ insertNode(_el$28, _el$31);
113375
+ insert(_el$28, () => option.shortcut, _el$31);
113376
+ effect((_$p) => setProp(_el$28, "fg", theme.colors.textMuted, _$p));
113377
+ return _el$28;
113378
+ }
113379
+ }), null);
113380
+ effect((_p$) => {
113381
+ var _v$10 = isSelected() ? theme.colors.primary : theme.colors.textDim, _v$11 = isSelected() ? TextAttributes.BOLD : TextAttributes.NONE, _v$12 = theme.colors.textDim, _v$13 = isSelected() ? theme.colors.text : theme.colors.textDim;
113382
+ _v$10 !== _p$.e && (_p$.e = setProp(_el$24, "fg", _v$10, _p$.e));
113383
+ _v$11 !== _p$.t && (_p$.t = setProp(_el$24, "attributes", _v$11, _p$.t));
113384
+ _v$12 !== _p$.a && (_p$.a = setProp(_el$25, "fg", _v$12, _p$.a));
113385
+ _v$13 !== _p$.o && (_p$.o = setProp(_el$27, "fg", _v$13, _p$.o));
113386
+ return _p$;
113387
+ }, {
113388
+ e: undefined,
113389
+ t: undefined,
113390
+ a: undefined,
113391
+ o: undefined
113392
+ });
113393
+ return _el$23;
113394
+ })();
113395
+ }
113396
+ }));
113397
+ return _el$9;
113398
+ }
113399
+ }), null);
113400
+ insert(_el$, createComponent2(Show, {
113401
+ get when() {
113402
+ return feedbackMode();
113403
+ },
113404
+ get children() {
113405
+ var _el$0 = createElement("box"), _el$1 = createElement("text"), _el$11 = createElement("box"), _el$12 = createElement("text"), _el$13 = createElement("text"), _el$15 = createElement("text");
113406
+ insertNode(_el$0, _el$1);
113407
+ insertNode(_el$0, _el$11);
113408
+ insertNode(_el$0, _el$15);
113409
+ setProp(_el$0, "flexDirection", "column");
113410
+ setProp(_el$0, "marginTop", 1);
113411
+ insertNode(_el$1, createTextNode(`Tell CodeTyper what to change:`));
113412
+ insertNode(_el$11, _el$12);
113413
+ setProp(_el$11, "border", ["left"]);
113414
+ setProp(_el$11, "paddingLeft", 1);
113415
+ setProp(_el$11, "marginTop", 1);
113416
+ insertNode(_el$12, _el$13);
113417
+ insert(_el$12, () => feedbackText() || " ", _el$13);
113418
+ insertNode(_el$13, createTextNode(`_`));
113419
+ insertNode(_el$15, createTextNode(`Enter to submit | Esc to cancel`));
113420
+ effect((_p$) => {
113421
+ var _v$3 = theme.colors.text, _v$4 = theme.colors.borderFocus, _v$5 = theme.colors.text, _v$6 = theme.colors.bgCursor, _v$7 = theme.colors.textDim;
113422
+ _v$3 !== _p$.e && (_p$.e = setProp(_el$1, "fg", _v$3, _p$.e));
113423
+ _v$4 !== _p$.t && (_p$.t = setProp(_el$11, "borderColor", _v$4, _p$.t));
113424
+ _v$5 !== _p$.a && (_p$.a = setProp(_el$12, "fg", _v$5, _p$.a));
113425
+ _v$6 !== _p$.o && (_p$.o = setProp(_el$13, "fg", _v$6, _p$.o));
113426
+ _v$7 !== _p$.i && (_p$.i = setProp(_el$15, "fg", _v$7, _p$.i));
113427
+ return _p$;
113428
+ }, {
113429
+ e: undefined,
113430
+ t: undefined,
113431
+ a: undefined,
113432
+ o: undefined,
113433
+ i: undefined
113434
+ });
113435
+ return _el$0;
113436
+ }
113437
+ }), null);
113438
+ insert(_el$, createComponent2(Show, {
113439
+ get when() {
113440
+ return !feedbackMode();
113441
+ },
113442
+ get children() {
113443
+ var _el$17 = createElement("box");
113444
+ setProp(_el$17, "marginTop", 1);
113445
+ setProp(_el$17, "flexDirection", "row");
113446
+ insert(_el$17, createComponent2(Show, {
113447
+ get when() {
113448
+ return props.prompt.planFilePath;
113449
+ },
113450
+ get children() {
113451
+ var _el$18 = createElement("text"), _el$19 = createTextNode(` - `);
113452
+ insertNode(_el$18, _el$19);
113453
+ insert(_el$18, PLAN_APPROVAL_FOOTER_TEXT, _el$19);
113454
+ insert(_el$18, () => props.prompt.planFilePath, null);
113455
+ effect((_$p) => setProp(_el$18, "fg", theme.colors.textDim, _$p));
113456
+ return _el$18;
113457
+ }
113458
+ }), null);
113459
+ insert(_el$17, createComponent2(Show, {
113460
+ get when() {
113461
+ return !props.prompt.planFilePath;
113462
+ },
113463
+ get children() {
113464
+ var _el$20 = createElement("text"), _el$21 = createTextNode(`↑↓ options | Enter select | 1-4 shortcut | Esc cancel`);
113465
+ insertNode(_el$20, _el$21);
113466
+ effect((_$p) => setProp(_el$20, "fg", theme.colors.textDim, _$p));
113467
+ return _el$20;
113468
+ }
113469
+ }), null);
113470
+ return _el$17;
113471
+ }
113472
+ }), null);
113473
+ effect((_p$) => {
113474
+ var _v$8 = theme.colors.borderModal, _v$9 = theme.colors.background, _v$0 = theme.colors.primary, _v$1 = TextAttributes.BOLD;
113475
+ _v$8 !== _p$.e && (_p$.e = setProp(_el$, "borderColor", _v$8, _p$.e));
113476
+ _v$9 !== _p$.t && (_p$.t = setProp(_el$, "backgroundColor", _v$9, _p$.t));
113477
+ _v$0 !== _p$.a && (_p$.a = setProp(_el$3, "fg", _v$0, _p$.a));
113478
+ _v$1 !== _p$.o && (_p$.o = setProp(_el$3, "attributes", _v$1, _p$.o));
113479
+ return _p$;
113480
+ }, {
113481
+ e: undefined,
113482
+ t: undefined,
113483
+ a: undefined,
113484
+ o: undefined
113485
+ });
113486
+ return _el$;
113487
+ })();
113488
+ }
113489
+
112934
113490
  // src/tui-solid/components/modals/learning-modal.tsx
112935
113491
  init_server();
112936
113492
  await __promiseAll([
@@ -114559,10 +115115,53 @@ function Session(props) {
114559
115115
  return createComponent2(DebugLogPanel, {});
114560
115116
  }
114561
115117
  }), null);
115118
+ insert(_el$, createComponent2(Show, {
115119
+ get when() {
115120
+ return memo2(() => app.mode() === "permission_prompt")() && app.permissionRequest();
115121
+ },
115122
+ get children() {
115123
+ return createComponent2(PermissionModal, {
115124
+ get request() {
115125
+ return app.permissionRequest();
115126
+ },
115127
+ get onRespond() {
115128
+ return props.onPermissionResponse;
115129
+ },
115130
+ get isActive() {
115131
+ return app.mode() === "permission_prompt";
115132
+ }
115133
+ });
115134
+ }
115135
+ }), null);
115136
+ insert(_el$, createComponent2(Show, {
115137
+ get when() {
115138
+ return memo2(() => app.mode() === "plan_approval")() && app.planApprovalPrompt();
115139
+ },
115140
+ get children() {
115141
+ return createComponent2(PlanApprovalModal, {
115142
+ get prompt() {
115143
+ return app.planApprovalPrompt();
115144
+ },
115145
+ get onRespond() {
115146
+ return props.onPlanApprovalResponse;
115147
+ },
115148
+ get isActive() {
115149
+ return app.mode() === "plan_approval";
115150
+ }
115151
+ });
115152
+ }
115153
+ }), null);
114562
115154
  insert(_el$, createComponent2(StatusBar, {}), null);
114563
- insert(_el$, createComponent2(InputArea, {
114564
- get onSubmit() {
114565
- return props.onSubmit;
115155
+ insert(_el$, createComponent2(Show, {
115156
+ get when() {
115157
+ return memo2(() => app.mode() !== "permission_prompt")() && app.mode() !== "plan_approval";
115158
+ },
115159
+ get children() {
115160
+ return createComponent2(InputArea, {
115161
+ get onSubmit() {
115162
+ return props.onSubmit;
115163
+ }
115164
+ });
114566
115165
  }
114567
115166
  }), null);
114568
115167
  insert(_el$, createComponent2(Switch, {
@@ -114756,27 +115355,6 @@ function Session(props) {
114756
115355
  }
114757
115356
  });
114758
115357
  }
114759
- }), createComponent2(Match, {
114760
- get when() {
114761
- return memo2(() => app.mode() === "permission_prompt")() && app.permissionRequest();
114762
- },
114763
- get children() {
114764
- return createComponent2(CenteredModal, {
114765
- get children() {
114766
- return createComponent2(PermissionModal, {
114767
- get request() {
114768
- return app.permissionRequest();
114769
- },
114770
- get onRespond() {
114771
- return props.onPermissionResponse;
114772
- },
114773
- get isActive() {
114774
- return app.mode() === "permission_prompt";
114775
- }
114776
- });
114777
- }
114778
- });
114779
- }
114780
115358
  }), createComponent2(Match, {
114781
115359
  get when() {
114782
115360
  return memo2(() => app.mode() === "learning_prompt")() && app.learningPrompt();
@@ -114902,8 +115480,17 @@ function AppContent(props) {
114902
115480
  const exit = useExit();
114903
115481
  const toast = useToast();
114904
115482
  const theme = useTheme();
115483
+ const renderer = useRenderer();
115484
+ renderer.disableStdoutInterception();
114905
115485
  const [fileList, setFileList] = createSignal([]);
114906
115486
  setAppStoreRef(app);
115487
+ const copySelectionToClipboard = async () => {
115488
+ const text = renderer.getSelection()?.getSelectedText();
115489
+ if (text && text.length > 0) {
115490
+ await copyToClipboard(text).then(() => toast.info("Copied to clipboard")).catch(() => toast.error("Failed to copy to clipboard"));
115491
+ renderer.clearSelection();
115492
+ }
115493
+ };
114907
115494
  createEffect(() => {
114908
115495
  if (app.mode() === "file_picker") {
114909
115496
  const cwd = process.cwd();
@@ -114943,6 +115530,11 @@ function AppContent(props) {
114943
115530
  }, 100);
114944
115531
  }
114945
115532
  useKeyboard((evt) => {
115533
+ if (evt.ctrl && evt.name === "y") {
115534
+ copySelectionToClipboard();
115535
+ evt.preventDefault();
115536
+ return;
115537
+ }
114946
115538
  if (evt.name === "escape") {
114947
115539
  abortCurrentOperation(false).then((aborted2) => {
114948
115540
  if (aborted2) {
@@ -115087,6 +115679,9 @@ function AppContent(props) {
115087
115679
  const handlePermissionResponse = (allowed, scope) => {
115088
115680
  props.onPermissionResponse(allowed, scope);
115089
115681
  };
115682
+ const handlePlanApprovalResponse = (response2) => {
115683
+ props.onPlanApprovalResponse(response2);
115684
+ };
115090
115685
  const handleLearningResponse = (save, scope, editedContent) => {
115091
115686
  props.onLearningResponse(save, scope, editedContent);
115092
115687
  };
@@ -115147,6 +115742,7 @@ function AppContent(props) {
115147
115742
  var _el$7 = createElement("box");
115148
115743
  setProp(_el$7, "flexDirection", "column");
115149
115744
  setProp(_el$7, "flexGrow", 1);
115745
+ setProp(_el$7, "onMouseUp", () => copySelectionToClipboard());
115150
115746
  insert(_el$7, createComponent2(Switch, {
115151
115747
  get children() {
115152
115748
  return [createComponent2(Match, {
@@ -115182,6 +115778,7 @@ function AppContent(props) {
115182
115778
  onProviderSelect: handleProviderSelect,
115183
115779
  onCascadeToggle: handleCascadeToggle,
115184
115780
  onPermissionResponse: handlePermissionResponse,
115781
+ onPlanApprovalResponse: handlePlanApprovalResponse,
115185
115782
  onLearningResponse: handleLearningResponse,
115186
115783
  get onBrainSetJwtToken() {
115187
115784
  return props.onBrainSetJwtToken;
@@ -115261,8 +115858,20 @@ function App(props) {
115261
115858
  }
115262
115859
  function tui(options2) {
115263
115860
  return new Promise((resolve4) => {
115861
+ const {
115862
+ writeSync: writeSync2
115863
+ } = __require("fs");
115264
115864
  const handleExit = (output) => {
115265
- process.stdout.write(DISABLE_MOUSE_TRACKING);
115865
+ try {
115866
+ writeSync2(1, TERMINAL_RESET);
115867
+ const state4 = appStore.getState();
115868
+ const firstUserLog = state4?.logs?.find((log2) => log2.type === "user");
115869
+ const sessionTitle = firstUserLog?.content;
115870
+ const exitMsg = formatExitMessage(output.sessionId, sessionTitle);
115871
+ if (exitMsg) {
115872
+ writeSync2(1, exitMsg);
115873
+ }
115874
+ } catch {}
115266
115875
  resolve4(output);
115267
115876
  };
115268
115877
  render(() => createComponent2(App, mergeProps3(options2, {
@@ -115270,8 +115879,7 @@ function tui(options2) {
115270
115879
  })), {
115271
115880
  targetFps: 60,
115272
115881
  exitOnCtrlC: false,
115273
- useKittyKeyboard: {},
115274
- useMouse: true
115882
+ useKittyKeyboard: {}
115275
115883
  });
115276
115884
  });
115277
115885
  }
@@ -115392,6 +116000,7 @@ var renderApp = async (props) => {
115392
116000
  },
115393
116001
  onMCPAdd: props.handleMCPAdd ?? defaultHandleMCPAdd,
115394
116002
  onPermissionResponse: props.handlePermissionResponse ?? (() => {}),
116003
+ onPlanApprovalResponse: props.handlePlanApprovalResponse ?? (() => {}),
115395
116004
  onLearningResponse: props.handleLearningResponse ?? (() => {}),
115396
116005
  onBrainSetJwtToken: props.handleBrainSetJwtToken ?? defaultHandleBrainSetJwtToken,
115397
116006
  onBrainSetApiKey: props.handleBrainSetApiKey ?? defaultHandleBrainSetApiKey,
@@ -116514,4 +117123,4 @@ ${plan.steps.map((s) => `${s.id}. ${s.description}`).join(`
116514
117123
  });
116515
117124
  program2.parse(process.argv);
116516
117125
 
116517
- //# debugId=AACE3B16C26B095E64756E2164756E21
117126
+ //# debugId=916DA4C2FBA06B5A64756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codetyper-cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "CodeTyper AI Agent - Standalone CLI for autonomous code generation",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
package/src/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "0.4.0"
2
+ "version": "0.4.2"
3
3
  }