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.
- package/dist/bin/whisper.js +52 -8
- package/package.json +3 -3
package/dist/bin/whisper.js
CHANGED
|
@@ -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 === "
|
|
10275
|
-
|
|
10276
|
-
|
|
10277
|
-
|
|
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
|
-
|
|
10284
|
-
|
|
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.
|
|
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/
|
|
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/
|
|
52
|
+
"@ai-whisper/companion-core": "0.0.0"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
55
55
|
"dist",
|