ai-whisper 0.4.2 → 0.4.3

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.
@@ -10269,22 +10269,56 @@ function makeChangeCountReader(deps) {
10269
10269
  }
10270
10270
 
10271
10271
  // src/runtime/provider-submit-strategy.ts
10272
+ var PASTE_START = "\x1B[200~";
10273
+ var PASTE_END = "\x1B[201~";
10272
10274
  async function submitInjectedProviderInput(input) {
10273
10275
  const sleep3 = input.sleep ?? ((ms) => new Promise((resolve5) => setTimeout(resolve5, ms)));
10274
- if (input.target === "codex") {
10275
- for (const char of input.text) {
10276
- input.writeUserInput(char);
10277
- await sleep3(5);
10278
- }
10276
+ if (input.target === "claude") {
10277
+ input.writeUserInput(input.text);
10278
+ await sleep3(75);
10279
+ input.writeUserInput("\r");
10280
+ return;
10281
+ }
10282
+ const strategy = input.strategyOverride ?? (input.bracketedPasteEnabled ? "bracketed" : "keystream");
10283
+ if (strategy === "bracketed") {
10284
+ const safe = input.text.split(PASTE_END).join("");
10285
+ input.writeUserInput(PASTE_START + safe + PASTE_END);
10279
10286
  await sleep3(100);
10280
10287
  input.writeUserInput("\r");
10281
10288
  return;
10282
10289
  }
10283
- input.writeUserInput(input.text);
10284
- await sleep3(75);
10290
+ if (strategy === "chunk") {
10291
+ input.writeUserInput(input.text);
10292
+ await sleep3(75);
10293
+ input.writeUserInput("\r");
10294
+ return;
10295
+ }
10296
+ for (const char of input.text) {
10297
+ input.writeUserInput(char);
10298
+ await sleep3(5);
10299
+ }
10300
+ await sleep3(100);
10285
10301
  input.writeUserInput("\r");
10286
10302
  }
10287
10303
 
10304
+ // src/runtime/bracketed-paste-detector.ts
10305
+ var ENABLE = "\x1B[?2004h";
10306
+ var RESET2 = "\x1B[?2004l";
10307
+ function createBracketedPasteDetector() {
10308
+ let enabled = false;
10309
+ return {
10310
+ observe(data) {
10311
+ const hi = data.lastIndexOf(ENABLE);
10312
+ const lo = data.lastIndexOf(RESET2);
10313
+ if (hi > lo) enabled = true;
10314
+ else if (lo > hi) enabled = false;
10315
+ },
10316
+ get enabled() {
10317
+ return enabled;
10318
+ }
10319
+ };
10320
+ }
10321
+
10288
10322
  // src/runtime/runtime-debug-log.ts
10289
10323
  import { appendFileSync as appendFileSync4 } from "node:fs";
10290
10324
  function toHex2(text) {
@@ -10312,6 +10346,11 @@ function createRuntimeDebugLogger(input) {
10312
10346
  }
10313
10347
 
10314
10348
  // src/runtime/mount-session-main.ts
10349
+ function resolveCodexSubmitStrategyOverride() {
10350
+ const raw = process.env.AI_WHISPER_CODEX_SUBMIT_STRATEGY;
10351
+ if (raw === "bracketed" || raw === "keystream" || raw === "chunk") return raw;
10352
+ return void 0;
10353
+ }
10315
10354
  var readChangeCount = makeChangeCountReader();
10316
10355
  function safeReapSessions(input) {
10317
10356
  const reap = input.reap ?? ((collabId, agentType, keepSessionId) => {
@@ -10416,6 +10455,8 @@ function createMountSessionRuntime(input) {
10416
10455
  let lastActivityAt = Date.now();
10417
10456
  try {
10418
10457
  const turnCapture = createAssistantTurnCapture();
10458
+ const bracketedPaste = createBracketedPasteDetector();
10459
+ const codexStrategyOverride = resolveCodexSubmitStrategyOverride();
10419
10460
  const debugLog = createRuntimeDebugLogger({
10420
10461
  logPath: process.env.AI_WHISPER_DEBUG_INPUT_LOG ?? null,
10421
10462
  sessionId: process.env.AI_WHISPER_SESSION_ID ?? null
@@ -10437,12 +10478,15 @@ function createMountSessionRuntime(input) {
10437
10478
  await submitInjectedProviderInput({
10438
10479
  target: input.target,
10439
10480
  text,
10440
- writeUserInput: (value) => writeInjectedInput("mounted-submit", value)
10481
+ writeUserInput: (value) => writeInjectedInput("mounted-submit", value),
10482
+ bracketedPasteEnabled: bracketedPaste.enabled,
10483
+ strategyOverride: codexStrategyOverride
10441
10484
  });
10442
10485
  };
10443
10486
  interactiveSession.onProviderOutput?.((data) => {
10444
10487
  lastActivityAt = Date.now();
10445
10488
  turnCapture.recordProviderOutput(data);
10489
+ bracketedPaste.observe(data);
10446
10490
  });
10447
10491
  const onRelay = (directive, sendNow) => {
10448
10492
  if (!resolvedClaim) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-whisper",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Terminal-first relay for paired AI coding agents (Claude + Codex), driven by structured workflows.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -46,10 +46,10 @@
46
46
  "@types/react": "^19.2.14",
47
47
  "ink-testing-library": "^4.0.0",
48
48
  "@ai-whisper/adapter-claude": "0.0.0",
49
- "@ai-whisper/companion-core": "0.0.0",
49
+ "@ai-whisper/adapter-codex": "0.0.0",
50
50
  "@ai-whisper/broker": "0.0.0",
51
51
  "@ai-whisper/shared": "0.0.0",
52
- "@ai-whisper/adapter-codex": "0.0.0"
52
+ "@ai-whisper/companion-core": "0.0.0"
53
53
  },
54
54
  "files": [
55
55
  "dist",