@cortexkit/aft-opencode 0.35.3 → 0.36.0
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/bg-notifications.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +419 -144
- package/dist/shared/bash-hints.d.ts +1 -1
- package/dist/shared/bash-hints.d.ts.map +1 -1
- package/dist/tools/_shared.d.ts +8 -0
- package/dist/tools/_shared.d.ts.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash_watch.d.ts.map +1 -1
- package/dist/tools/hoisted.d.ts.map +1 -1
- package/dist/tools/navigation.d.ts.map +1 -1
- package/dist/tools/safety.d.ts.map +1 -1
- package/dist/tui.js +1 -1
- package/dist/workflow-hints.d.ts +2 -0
- package/dist/workflow-hints.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/shared/bash-hints.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bg-notifications.d.ts","sourceRoot":"","sources":["../src/bg-notifications.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bg-notifications.d.ts","sourceRoot":"","sources":["../src/bg-notifications.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AA4MlD;;;;;;;;;;;;;;;;;GAiBG;AAQH,QAAA,MAAM,MAAM,EAAE,MAA6D,CAAC;AAq1B5E,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11597,9 +11597,6 @@ function error(message, meta) {
|
|
|
11597
11597
|
var CONFLICT_HINT = `
|
|
11598
11598
|
|
|
11599
11599
|
[Hint] Use aft_conflicts to see all conflict regions across files in a single call.`;
|
|
11600
|
-
var GREP_HINT = `
|
|
11601
|
-
|
|
11602
|
-
[Hint] Use the grep tool instead of bash for faster indexed search.`;
|
|
11603
11600
|
function maybeAppendConflictsHint(output) {
|
|
11604
11601
|
if (!output.includes("Automatic merge failed; fix conflicts"))
|
|
11605
11602
|
return output;
|
|
@@ -11607,12 +11604,12 @@ function maybeAppendConflictsHint(output) {
|
|
|
11607
11604
|
return output;
|
|
11608
11605
|
return output + CONFLICT_HINT;
|
|
11609
11606
|
}
|
|
11610
|
-
|
|
11611
|
-
|
|
11612
|
-
|
|
11613
|
-
|
|
11614
|
-
|
|
11615
|
-
return
|
|
11607
|
+
// ../aft-bridge/dist/bash-timeout.js
|
|
11608
|
+
function resolveBashKillTimeout(modelTimeout, foregroundWaitMs) {
|
|
11609
|
+
if (modelTimeout !== undefined && modelTimeout >= foregroundWaitMs) {
|
|
11610
|
+
return modelTimeout;
|
|
11611
|
+
}
|
|
11612
|
+
return;
|
|
11616
11613
|
}
|
|
11617
11614
|
// ../aft-bridge/dist/bridge.js
|
|
11618
11615
|
import { spawn } from "node:child_process";
|
|
@@ -11867,6 +11864,9 @@ class BinaryBridge {
|
|
|
11867
11864
|
hasPendingRequests() {
|
|
11868
11865
|
return this.pending.size > 0;
|
|
11869
11866
|
}
|
|
11867
|
+
getCwd() {
|
|
11868
|
+
return this.cwd;
|
|
11869
|
+
}
|
|
11870
11870
|
getCachedStatus() {
|
|
11871
11871
|
return this.cachedStatus;
|
|
11872
11872
|
}
|
|
@@ -12210,6 +12210,7 @@ class BinaryBridge {
|
|
|
12210
12210
|
const remaining = stdoutDecoder.end();
|
|
12211
12211
|
if (remaining)
|
|
12212
12212
|
this.onStdoutData(remaining);
|
|
12213
|
+
this.flushStdoutBuffer();
|
|
12213
12214
|
});
|
|
12214
12215
|
const stderrDecoder = new StringDecoder("utf8");
|
|
12215
12216
|
child.stderr?.on("data", (chunk) => {
|
|
@@ -12232,6 +12233,7 @@ class BinaryBridge {
|
|
|
12232
12233
|
return;
|
|
12233
12234
|
if (this._shuttingDown)
|
|
12234
12235
|
return;
|
|
12236
|
+
this.flushStdoutBuffer();
|
|
12235
12237
|
this.logVia(`Process exited: code=${code}, signal=${signal}`);
|
|
12236
12238
|
if (signal === "SIGTERM" || signal === "SIGKILL" || signal === "SIGHUP" || signal === "SIGINT") {
|
|
12237
12239
|
this.process = null;
|
|
@@ -12300,71 +12302,81 @@ class BinaryBridge {
|
|
|
12300
12302
|
this.stdoutBuffer = this.stdoutBuffer.slice(newlineIdx + 1);
|
|
12301
12303
|
if (!line)
|
|
12302
12304
|
continue;
|
|
12303
|
-
|
|
12304
|
-
|
|
12305
|
-
|
|
12306
|
-
|
|
12307
|
-
|
|
12308
|
-
|
|
12309
|
-
|
|
12310
|
-
|
|
12311
|
-
|
|
12312
|
-
|
|
12313
|
-
|
|
12314
|
-
|
|
12315
|
-
|
|
12316
|
-
|
|
12317
|
-
|
|
12318
|
-
|
|
12319
|
-
|
|
12320
|
-
|
|
12321
|
-
|
|
12322
|
-
|
|
12323
|
-
|
|
12324
|
-
|
|
12325
|
-
|
|
12326
|
-
|
|
12327
|
-
|
|
12328
|
-
|
|
12329
|
-
|
|
12330
|
-
this.onBashCompletion?.(response, this);
|
|
12331
|
-
continue;
|
|
12332
|
-
}
|
|
12333
|
-
if (response.type === "bash_long_running") {
|
|
12334
|
-
this.onBashLongRunning?.(response, this);
|
|
12335
|
-
continue;
|
|
12336
|
-
}
|
|
12337
|
-
if (response.type === "bash_pattern_match") {
|
|
12338
|
-
this.onBashPatternMatch?.(response, this);
|
|
12339
|
-
continue;
|
|
12340
|
-
}
|
|
12341
|
-
if (response.type === "configure_warnings") {
|
|
12342
|
-
this.handleConfigureWarningsFrame(response).catch((err) => {
|
|
12343
|
-
this.warnVia(`configure warning delivery failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
12344
|
-
});
|
|
12345
|
-
continue;
|
|
12346
|
-
}
|
|
12347
|
-
if (response.type === "status_changed") {
|
|
12348
|
-
this.handleStatusChangedFrame(response);
|
|
12349
|
-
continue;
|
|
12350
|
-
}
|
|
12351
|
-
const id = response.id;
|
|
12352
|
-
if (id && this.pending.has(id)) {
|
|
12353
|
-
const entry = this.pending.get(id);
|
|
12354
|
-
if (!entry)
|
|
12355
|
-
continue;
|
|
12356
|
-
this.pending.delete(id);
|
|
12305
|
+
this.processStdoutLine(line);
|
|
12306
|
+
}
|
|
12307
|
+
}
|
|
12308
|
+
flushStdoutBuffer() {
|
|
12309
|
+
const line = this.stdoutBuffer.trim();
|
|
12310
|
+
this.stdoutBuffer = "";
|
|
12311
|
+
if (!line)
|
|
12312
|
+
return;
|
|
12313
|
+
this.processStdoutLine(line);
|
|
12314
|
+
}
|
|
12315
|
+
processStdoutLine(line) {
|
|
12316
|
+
try {
|
|
12317
|
+
const response = JSON.parse(line);
|
|
12318
|
+
this.lastChildActivityAt = Date.now();
|
|
12319
|
+
if (response.type === "progress") {
|
|
12320
|
+
const requestId = response.request_id;
|
|
12321
|
+
const entry = requestId ? this.pending.get(requestId) : undefined;
|
|
12322
|
+
const kind = response.kind === "stderr" ? "stderr" : "stdout";
|
|
12323
|
+
const text = typeof response.chunk === "string" ? response.chunk : "";
|
|
12324
|
+
entry?.onProgress?.({ kind, text });
|
|
12325
|
+
return;
|
|
12326
|
+
}
|
|
12327
|
+
if (response.type === "permission_ask") {
|
|
12328
|
+
const requestId = response.request_id;
|
|
12329
|
+
const entry = requestId ? this.pending.get(requestId) : undefined;
|
|
12330
|
+
if (requestId && entry) {
|
|
12331
|
+
this.pending.delete(requestId);
|
|
12357
12332
|
clearTimeout(entry.timer);
|
|
12358
|
-
|
|
12359
|
-
|
|
12360
|
-
|
|
12361
|
-
|
|
12362
|
-
|
|
12363
|
-
|
|
12333
|
+
entry.resolve({
|
|
12334
|
+
success: false,
|
|
12335
|
+
code: "permission_required",
|
|
12336
|
+
message: "bash command requires permission",
|
|
12337
|
+
asks: response.asks
|
|
12338
|
+
});
|
|
12364
12339
|
}
|
|
12365
|
-
|
|
12366
|
-
|
|
12340
|
+
return;
|
|
12341
|
+
}
|
|
12342
|
+
if (response.type === "bash_completed") {
|
|
12343
|
+
this.onBashCompletion?.(response, this);
|
|
12344
|
+
return;
|
|
12367
12345
|
}
|
|
12346
|
+
if (response.type === "bash_long_running") {
|
|
12347
|
+
this.onBashLongRunning?.(response, this);
|
|
12348
|
+
return;
|
|
12349
|
+
}
|
|
12350
|
+
if (response.type === "bash_pattern_match") {
|
|
12351
|
+
this.onBashPatternMatch?.(response, this);
|
|
12352
|
+
return;
|
|
12353
|
+
}
|
|
12354
|
+
if (response.type === "configure_warnings") {
|
|
12355
|
+
this.handleConfigureWarningsFrame(response).catch((err) => {
|
|
12356
|
+
this.warnVia(`configure warning delivery failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
12357
|
+
});
|
|
12358
|
+
return;
|
|
12359
|
+
}
|
|
12360
|
+
if (response.type === "status_changed") {
|
|
12361
|
+
this.handleStatusChangedFrame(response);
|
|
12362
|
+
return;
|
|
12363
|
+
}
|
|
12364
|
+
const id = response.id;
|
|
12365
|
+
if (id && this.pending.has(id)) {
|
|
12366
|
+
const entry = this.pending.get(id);
|
|
12367
|
+
if (!entry)
|
|
12368
|
+
return;
|
|
12369
|
+
this.pending.delete(id);
|
|
12370
|
+
clearTimeout(entry.timer);
|
|
12371
|
+
this.consecutiveRequestTimeouts = 0;
|
|
12372
|
+
this.scheduleRestartCountReset();
|
|
12373
|
+
this.captureStatusBar(response);
|
|
12374
|
+
entry.resolve(response);
|
|
12375
|
+
} else if (typeof response.type === "string") {
|
|
12376
|
+
this.logVia(`Ignoring unknown stdout push frame type: ${response.type}`);
|
|
12377
|
+
}
|
|
12378
|
+
} catch (_err) {
|
|
12379
|
+
this.warnVia(`Failed to parse stdout line: ${line}`);
|
|
12368
12380
|
}
|
|
12369
12381
|
}
|
|
12370
12382
|
captureStatusBar(response) {
|
|
@@ -12452,6 +12464,27 @@ class BinaryBridge {
|
|
|
12452
12464
|
}
|
|
12453
12465
|
}
|
|
12454
12466
|
}
|
|
12467
|
+
// ../aft-bridge/dist/coerce.js
|
|
12468
|
+
function coerceStringArray(value) {
|
|
12469
|
+
if (Array.isArray(value)) {
|
|
12470
|
+
return value.filter((entry) => typeof entry === "string" && entry.length > 0);
|
|
12471
|
+
}
|
|
12472
|
+
if (typeof value === "string") {
|
|
12473
|
+
const trimmed = value.trim();
|
|
12474
|
+
if (trimmed.length === 0)
|
|
12475
|
+
return [];
|
|
12476
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
12477
|
+
try {
|
|
12478
|
+
const parsed = JSON.parse(trimmed);
|
|
12479
|
+
if (Array.isArray(parsed)) {
|
|
12480
|
+
return parsed.filter((entry) => typeof entry === "string" && entry.length > 0);
|
|
12481
|
+
}
|
|
12482
|
+
} catch {}
|
|
12483
|
+
}
|
|
12484
|
+
return [value];
|
|
12485
|
+
}
|
|
12486
|
+
return [];
|
|
12487
|
+
}
|
|
12455
12488
|
// ../aft-bridge/dist/downloader.js
|
|
12456
12489
|
import { spawnSync } from "node:child_process";
|
|
12457
12490
|
import { createHash, randomUUID } from "node:crypto";
|
|
@@ -13960,6 +13993,221 @@ function isProcessAlive(pid) {
|
|
|
13960
13993
|
return true;
|
|
13961
13994
|
}
|
|
13962
13995
|
}
|
|
13996
|
+
// ../aft-bridge/dist/pipe-strip.js
|
|
13997
|
+
var NOISE_FILTERS = new Set(["grep", "rg", "head", "tail", "cat", "less", "more"]);
|
|
13998
|
+
var GREP_GUARD_FLAGS = new Set([
|
|
13999
|
+
"c",
|
|
14000
|
+
"count",
|
|
14001
|
+
"q",
|
|
14002
|
+
"quiet",
|
|
14003
|
+
"o",
|
|
14004
|
+
"only-matching",
|
|
14005
|
+
"l",
|
|
14006
|
+
"files-with-matches"
|
|
14007
|
+
]);
|
|
14008
|
+
function maybeStripCompressorPipe(command, compressionEnabled) {
|
|
14009
|
+
if (!compressionEnabled)
|
|
14010
|
+
return { command, stripped: false };
|
|
14011
|
+
const chain = splitTopLevelAndChain(command);
|
|
14012
|
+
if (chain === null)
|
|
14013
|
+
return { command, stripped: false };
|
|
14014
|
+
const prefix = chain.slice(0, -1).map((segment) => segment.trim()).filter(Boolean);
|
|
14015
|
+
const pipeline3 = chain[chain.length - 1] ?? "";
|
|
14016
|
+
const stages = splitTopLevelPipeline(pipeline3);
|
|
14017
|
+
if (stages.length < 2)
|
|
14018
|
+
return { command, stripped: false };
|
|
14019
|
+
const firstStage = stages[0]?.trim() ?? "";
|
|
14020
|
+
if (!isCompressorHandledRunner(firstStage))
|
|
14021
|
+
return { command, stripped: false };
|
|
14022
|
+
const filterStages = stages.slice(1).map((stage) => stage.trim());
|
|
14023
|
+
for (const stage of filterStages) {
|
|
14024
|
+
if (!isPlainNoiseFilter(stage))
|
|
14025
|
+
return { command, stripped: false };
|
|
14026
|
+
}
|
|
14027
|
+
const filters = filterStages.join(" | ");
|
|
14028
|
+
const rebuilt = [...prefix, firstStage].join(" && ");
|
|
14029
|
+
return {
|
|
14030
|
+
command: rebuilt,
|
|
14031
|
+
stripped: true,
|
|
14032
|
+
note: `[AFT dropped \`| ${filters}\` (compressed:false to keep)]`
|
|
14033
|
+
};
|
|
14034
|
+
}
|
|
14035
|
+
function splitTopLevelAndChain(command) {
|
|
14036
|
+
const segments = [];
|
|
14037
|
+
let start = 0;
|
|
14038
|
+
let quote = null;
|
|
14039
|
+
let escaped = false;
|
|
14040
|
+
for (let index = 0;index < command.length; index++) {
|
|
14041
|
+
const char = command[index];
|
|
14042
|
+
const next = command[index + 1];
|
|
14043
|
+
if (escaped) {
|
|
14044
|
+
escaped = false;
|
|
14045
|
+
continue;
|
|
14046
|
+
}
|
|
14047
|
+
if (char === "\\" && quote !== "'") {
|
|
14048
|
+
escaped = true;
|
|
14049
|
+
continue;
|
|
14050
|
+
}
|
|
14051
|
+
if (quote) {
|
|
14052
|
+
if (char === quote)
|
|
14053
|
+
quote = null;
|
|
14054
|
+
continue;
|
|
14055
|
+
}
|
|
14056
|
+
if (char === "'" || char === '"') {
|
|
14057
|
+
quote = char;
|
|
14058
|
+
continue;
|
|
14059
|
+
}
|
|
14060
|
+
if (char === "&" && next === "&") {
|
|
14061
|
+
segments.push(command.slice(start, index));
|
|
14062
|
+
start = index + 2;
|
|
14063
|
+
index++;
|
|
14064
|
+
continue;
|
|
14065
|
+
}
|
|
14066
|
+
if (char === "|" && next === "|")
|
|
14067
|
+
return null;
|
|
14068
|
+
if (char === ";")
|
|
14069
|
+
return null;
|
|
14070
|
+
}
|
|
14071
|
+
segments.push(command.slice(start));
|
|
14072
|
+
return segments;
|
|
14073
|
+
}
|
|
14074
|
+
function splitTopLevelPipeline(command) {
|
|
14075
|
+
const stages = [];
|
|
14076
|
+
let start = 0;
|
|
14077
|
+
let quote = null;
|
|
14078
|
+
let escaped = false;
|
|
14079
|
+
for (let index = 0;index < command.length; index++) {
|
|
14080
|
+
const char = command[index];
|
|
14081
|
+
const next = command[index + 1];
|
|
14082
|
+
const previous = command[index - 1];
|
|
14083
|
+
if (escaped) {
|
|
14084
|
+
escaped = false;
|
|
14085
|
+
continue;
|
|
14086
|
+
}
|
|
14087
|
+
if (char === "\\" && quote !== "'") {
|
|
14088
|
+
escaped = true;
|
|
14089
|
+
continue;
|
|
14090
|
+
}
|
|
14091
|
+
if (quote) {
|
|
14092
|
+
if (char === quote)
|
|
14093
|
+
quote = null;
|
|
14094
|
+
continue;
|
|
14095
|
+
}
|
|
14096
|
+
if (char === "'" || char === '"') {
|
|
14097
|
+
quote = char;
|
|
14098
|
+
continue;
|
|
14099
|
+
}
|
|
14100
|
+
if (char === "|" && previous !== "|" && next !== "|") {
|
|
14101
|
+
stages.push(command.slice(start, index));
|
|
14102
|
+
start = index + 1;
|
|
14103
|
+
}
|
|
14104
|
+
}
|
|
14105
|
+
stages.push(command.slice(start));
|
|
14106
|
+
return stages;
|
|
14107
|
+
}
|
|
14108
|
+
function isCompressorHandledRunner(stage) {
|
|
14109
|
+
const tokens = tokenizeStage(stage);
|
|
14110
|
+
if (tokens.length === 0)
|
|
14111
|
+
return false;
|
|
14112
|
+
const [first, second, third] = tokens;
|
|
14113
|
+
if (!first)
|
|
14114
|
+
return false;
|
|
14115
|
+
if (tokens.some((token) => token === "&&" || token === "||" || token.includes(";"))) {
|
|
14116
|
+
return false;
|
|
14117
|
+
}
|
|
14118
|
+
if (first === "bun")
|
|
14119
|
+
return second === "test" || second === "run" && startsWithTest(third);
|
|
14120
|
+
if (first === "cargo")
|
|
14121
|
+
return ["test", "build", "check", "clippy"].includes(second ?? "");
|
|
14122
|
+
if (first === "go")
|
|
14123
|
+
return second === "test" || second === "build";
|
|
14124
|
+
if (["npm", "pnpm"].includes(first)) {
|
|
14125
|
+
return second === "test" || second === "run" && startsWithTest(third);
|
|
14126
|
+
}
|
|
14127
|
+
if (first === "yarn")
|
|
14128
|
+
return second === "test";
|
|
14129
|
+
if (first === "playwright")
|
|
14130
|
+
return second === "test";
|
|
14131
|
+
if (first === "npx")
|
|
14132
|
+
return ["tsc", "eslint", "vitest", "jest"].includes(second ?? "");
|
|
14133
|
+
return ["vitest", "jest", "pytest", "tsc", "eslint", "biome", "ruff", "mypy"].includes(first);
|
|
14134
|
+
}
|
|
14135
|
+
function startsWithTest(token) {
|
|
14136
|
+
return token?.startsWith("test") === true;
|
|
14137
|
+
}
|
|
14138
|
+
function isPlainNoiseFilter(stage) {
|
|
14139
|
+
const tokens = tokenizeStage(stage);
|
|
14140
|
+
const head = tokens[0];
|
|
14141
|
+
if (!head)
|
|
14142
|
+
return false;
|
|
14143
|
+
if (head === "wc")
|
|
14144
|
+
return false;
|
|
14145
|
+
if (!NOISE_FILTERS.has(head))
|
|
14146
|
+
return false;
|
|
14147
|
+
if ((head === "grep" || head === "rg") && hasIntentChangingGrepFlag(tokens.slice(1)))
|
|
14148
|
+
return false;
|
|
14149
|
+
return true;
|
|
14150
|
+
}
|
|
14151
|
+
function hasIntentChangingGrepFlag(args) {
|
|
14152
|
+
for (const arg of args) {
|
|
14153
|
+
if (arg === "--")
|
|
14154
|
+
return false;
|
|
14155
|
+
if (!arg.startsWith("-") || arg === "-")
|
|
14156
|
+
continue;
|
|
14157
|
+
if (arg.startsWith("--")) {
|
|
14158
|
+
const flag = arg.slice(2).split("=", 1)[0];
|
|
14159
|
+
if (GREP_GUARD_FLAGS.has(flag))
|
|
14160
|
+
return true;
|
|
14161
|
+
continue;
|
|
14162
|
+
}
|
|
14163
|
+
for (const flag of arg.slice(1)) {
|
|
14164
|
+
if (GREP_GUARD_FLAGS.has(flag))
|
|
14165
|
+
return true;
|
|
14166
|
+
}
|
|
14167
|
+
}
|
|
14168
|
+
return false;
|
|
14169
|
+
}
|
|
14170
|
+
function tokenizeStage(stage) {
|
|
14171
|
+
const tokens = [];
|
|
14172
|
+
let current = "";
|
|
14173
|
+
let quote = null;
|
|
14174
|
+
let escaped = false;
|
|
14175
|
+
for (let index = 0;index < stage.length; index++) {
|
|
14176
|
+
const char = stage[index];
|
|
14177
|
+
if (escaped) {
|
|
14178
|
+
current += char;
|
|
14179
|
+
escaped = false;
|
|
14180
|
+
continue;
|
|
14181
|
+
}
|
|
14182
|
+
if (char === "\\" && quote !== "'") {
|
|
14183
|
+
escaped = true;
|
|
14184
|
+
continue;
|
|
14185
|
+
}
|
|
14186
|
+
if (quote) {
|
|
14187
|
+
if (char === quote) {
|
|
14188
|
+
quote = null;
|
|
14189
|
+
} else {
|
|
14190
|
+
current += char;
|
|
14191
|
+
}
|
|
14192
|
+
continue;
|
|
14193
|
+
}
|
|
14194
|
+
if (char === "'" || char === '"') {
|
|
14195
|
+
quote = char;
|
|
14196
|
+
continue;
|
|
14197
|
+
}
|
|
14198
|
+
if (/\s/.test(char)) {
|
|
14199
|
+
if (current.length > 0) {
|
|
14200
|
+
tokens.push(current);
|
|
14201
|
+
current = "";
|
|
14202
|
+
}
|
|
14203
|
+
continue;
|
|
14204
|
+
}
|
|
14205
|
+
current += char;
|
|
14206
|
+
}
|
|
14207
|
+
if (current.length > 0)
|
|
14208
|
+
tokens.push(current);
|
|
14209
|
+
return tokens;
|
|
14210
|
+
}
|
|
13963
14211
|
// ../aft-bridge/dist/pool.js
|
|
13964
14212
|
import { realpathSync as realpathSync2 } from "node:fs";
|
|
13965
14213
|
var DEFAULT_IDLE_TIMEOUT_MS = Infinity;
|
|
@@ -14492,13 +14740,7 @@ function consumeBgCompletion(sessionID, taskId) {
|
|
|
14492
14740
|
state.consumedTaskIds.delete(evicted);
|
|
14493
14741
|
}
|
|
14494
14742
|
}
|
|
14495
|
-
|
|
14496
|
-
clearTimeout(state.debounceTimer);
|
|
14497
|
-
state.debounceTimer = null;
|
|
14498
|
-
state.firstCompletionAt = null;
|
|
14499
|
-
state.scheduledFireAt = null;
|
|
14500
|
-
state.scheduledCompletionCount = 0;
|
|
14501
|
-
}
|
|
14743
|
+
clearWakeTimerIfNoPending(state);
|
|
14502
14744
|
}
|
|
14503
14745
|
async function markBgCompletionDelivered(drainContext, taskId) {
|
|
14504
14746
|
await ackCompletions(drainContext, [
|
|
@@ -14669,16 +14911,11 @@ async function appendInTurnBgCompletions(drainContext, output) {
|
|
|
14669
14911
|
}
|
|
14670
14912
|
state.pendingLongRunning = [];
|
|
14671
14913
|
state.pendingPatternMatches = [];
|
|
14914
|
+
state.retryDelayMs = null;
|
|
14672
14915
|
state.wakeRetryAttempts = 0;
|
|
14673
14916
|
state.wakeHardStopped = false;
|
|
14674
14917
|
await ackCompletions(drainContext, completionAcks);
|
|
14675
|
-
|
|
14676
|
-
clearTimeout(state.debounceTimer);
|
|
14677
|
-
state.debounceTimer = null;
|
|
14678
|
-
state.firstCompletionAt = null;
|
|
14679
|
-
state.scheduledFireAt = null;
|
|
14680
|
-
state.scheduledCompletionCount = 0;
|
|
14681
|
-
}
|
|
14918
|
+
clearWakeTimerIfNoPending(state);
|
|
14682
14919
|
}
|
|
14683
14920
|
async function handleIdleBgCompletions(drainContext) {
|
|
14684
14921
|
stateFor(drainContext.sessionID).wakeDeferredTaskIds.clear();
|
|
@@ -14920,13 +15157,18 @@ function wakeEligibleCompletions(state, includeDeferredCompletions) {
|
|
|
14920
15157
|
return state.pendingCompletions.filter((completion) => !state.wakeDeferredTaskIds.has(completion.task_id));
|
|
14921
15158
|
}
|
|
14922
15159
|
function clearWakeTimerIfNoPending(state) {
|
|
14923
|
-
if (state.pendingCompletions.length
|
|
14924
|
-
|
|
14925
|
-
state.debounceTimer = null;
|
|
14926
|
-
state.firstCompletionAt = null;
|
|
14927
|
-
state.scheduledFireAt = null;
|
|
14928
|
-
state.scheduledCompletionCount = 0;
|
|
15160
|
+
if (state.pendingCompletions.length > 0 || state.pendingLongRunning.length > 0 || state.pendingPatternMatches.length > 0) {
|
|
15161
|
+
return;
|
|
14929
15162
|
}
|
|
15163
|
+
if (state.debounceTimer)
|
|
15164
|
+
clearTimeout(state.debounceTimer);
|
|
15165
|
+
state.debounceTimer = null;
|
|
15166
|
+
state.firstCompletionAt = null;
|
|
15167
|
+
state.scheduledFireAt = null;
|
|
15168
|
+
state.scheduledCompletionCount = 0;
|
|
15169
|
+
state.retryDelayMs = null;
|
|
15170
|
+
state.wakeRetryAttempts = 0;
|
|
15171
|
+
state.wakeHardStopped = false;
|
|
14930
15172
|
}
|
|
14931
15173
|
function scheduleWake(state, sendWake, onSendFailure, sessionID, includeDeferredCompletions = true) {
|
|
14932
15174
|
if (state.wakeHardStopped)
|
|
@@ -32986,6 +33228,7 @@ function isEmptyParam(value) {
|
|
|
32986
33228
|
return Object.keys(value).length === 0;
|
|
32987
33229
|
return false;
|
|
32988
33230
|
}
|
|
33231
|
+
var BASH_TRANSPORT_TIMEOUT_MS = 30000;
|
|
32989
33232
|
var LONG_RUNNING_COMMAND_TIMEOUT_MS = {
|
|
32990
33233
|
callers: 60000,
|
|
32991
33234
|
trace_to: 60000,
|
|
@@ -33121,6 +33364,13 @@ async function callBridge(ctx, runtime, command, params = {}, options) {
|
|
|
33121
33364
|
ingestBgCompletions(runtime.sessionID, response.bg_completions);
|
|
33122
33365
|
return response;
|
|
33123
33366
|
}
|
|
33367
|
+
async function callBashBridge(ctx, runtime, command, params = {}, options) {
|
|
33368
|
+
return await callBridge(ctx, runtime, command, params, {
|
|
33369
|
+
transportTimeoutMs: BASH_TRANSPORT_TIMEOUT_MS,
|
|
33370
|
+
...options,
|
|
33371
|
+
keepBridgeOnTimeout: true
|
|
33372
|
+
});
|
|
33373
|
+
}
|
|
33124
33374
|
|
|
33125
33375
|
// src/tools/permissions.ts
|
|
33126
33376
|
import * as fs4 from "node:fs";
|
|
@@ -33946,8 +34196,16 @@ function setCache2(sessionId, isSubagent) {
|
|
|
33946
34196
|
var z5 = tool5.schema;
|
|
33947
34197
|
var METADATA_PREVIEW_LIMIT = 30 * 1024;
|
|
33948
34198
|
var FOREGROUND_POLL_INTERVAL_MS = 100;
|
|
33949
|
-
var BASH_TRANSPORT_TIMEOUT_MS = 30000;
|
|
33950
34199
|
var DEFAULT_HARD_TIMEOUT_MS = 30 * 60 * 1000;
|
|
34200
|
+
function resolveForegroundWaitMs(configured) {
|
|
34201
|
+
const override = process.env.AFT_TEST_FOREGROUND_WAIT_MS;
|
|
34202
|
+
if (override !== undefined) {
|
|
34203
|
+
const parsed = Number(override);
|
|
34204
|
+
if (Number.isFinite(parsed) && parsed >= 0)
|
|
34205
|
+
return parsed;
|
|
34206
|
+
}
|
|
34207
|
+
return configured;
|
|
34208
|
+
}
|
|
33951
34209
|
var BASH_DESCRIPTION = `Hoisted bash tool with output compression, command rewriting to AFT tools, optional background execution, and PTY mode for interactive programs. By default, output is compressed; pass compressed: false for raw output. Pass background: true to spawn in the background and get a taskId for bash_status/bash_kill. Pass pty: true for interactive REPLs and drive them with bash_status({ outputMode: "screen" }) plus bash_write (pty implies background automatically). Use bash_watch to block on or register for pattern matches and exit events.`;
|
|
33952
34210
|
async function withPermissionLoop(ctx, runtime, params, bridgeCall, options) {
|
|
33953
34211
|
const first = await bridgeCall(ctx, runtime, "bash", params, options);
|
|
@@ -33990,7 +34248,10 @@ function createBashTool(ctx) {
|
|
|
33990
34248
|
let accumulatedOutput = "";
|
|
33991
34249
|
const description = args.description;
|
|
33992
34250
|
const metadata = context.metadata;
|
|
33993
|
-
const
|
|
34251
|
+
const rawCommand = args.command;
|
|
34252
|
+
const compressionEnabled = bashCfg.compress && args.compressed !== false;
|
|
34253
|
+
const pipeStrip = maybeStripCompressorPipe(rawCommand, compressionEnabled);
|
|
34254
|
+
const command = pipeStrip.command;
|
|
33994
34255
|
const cwd = args.workdir ?? context.directory;
|
|
33995
34256
|
const isSubagent = await resolveIsSubagent(ctx.client, context.sessionID, context.directory);
|
|
33996
34257
|
const requestedPty = args.pty === true;
|
|
@@ -34001,13 +34262,15 @@ function createBashTool(ctx) {
|
|
|
34001
34262
|
const allowSubagentBg = bashCfg.subagent_background;
|
|
34002
34263
|
const subagentForcedForeground = isSubagent && !allowSubagentBg;
|
|
34003
34264
|
const effectiveBackground = subagentForcedForeground ? false : requestedBackground;
|
|
34265
|
+
const rawTimeout = args.timeout;
|
|
34266
|
+
const effectiveTimeout = effectiveBackground ? rawTimeout : resolveBashKillTimeout(rawTimeout, bashCfg.foreground_wait_window_ms);
|
|
34004
34267
|
if (subagentForcedForeground && requestedBackground) {
|
|
34005
34268
|
sessionLog(context.sessionID, "[bash] subagent + background:true → converting to foreground (subagent would lose task_id)");
|
|
34006
34269
|
}
|
|
34007
34270
|
const shellEnv = await ctx.plugin?.trigger?.("shell.env", { cwd, sessionID: context.sessionID, callID: getCallID(context) }, { env: {} });
|
|
34008
34271
|
const data = await withPermissionLoop(ctx, context, {
|
|
34009
34272
|
command,
|
|
34010
|
-
timeout:
|
|
34273
|
+
timeout: effectiveTimeout,
|
|
34011
34274
|
workdir: args.workdir,
|
|
34012
34275
|
env: shellEnv?.env ?? {},
|
|
34013
34276
|
description,
|
|
@@ -34018,9 +34281,7 @@ function createBashTool(ctx) {
|
|
|
34018
34281
|
pty_rows: args.ptyRows,
|
|
34019
34282
|
pty_cols: args.ptyCols,
|
|
34020
34283
|
permissions_requested: true
|
|
34021
|
-
},
|
|
34022
|
-
transportTimeoutMs: BASH_TRANSPORT_TIMEOUT_MS,
|
|
34023
|
-
keepBridgeOnTimeout: true,
|
|
34284
|
+
}, callBashBridge, {
|
|
34024
34285
|
onProgress: ({ text }) => {
|
|
34025
34286
|
accumulatedOutput = preview(accumulatedOutput + text);
|
|
34026
34287
|
metadata?.({ output: accumulatedOutput, description });
|
|
@@ -34047,17 +34308,16 @@ function createBashTool(ctx) {
|
|
|
34047
34308
|
}
|
|
34048
34309
|
return startedLine;
|
|
34049
34310
|
}
|
|
34050
|
-
const
|
|
34051
|
-
const
|
|
34052
|
-
const waitTimeoutMs = subagentForcedForeground ? argTimeout ?? DEFAULT_HARD_TIMEOUT_MS : argTimeout !== undefined ? Math.min(argTimeout, foregroundWaitMs) : foregroundWaitMs;
|
|
34311
|
+
const foregroundWaitMs = resolveForegroundWaitMs(bashCfg.foreground_wait_window_ms);
|
|
34312
|
+
const waitTimeoutMs = subagentForcedForeground ? effectiveTimeout ?? DEFAULT_HARD_TIMEOUT_MS : effectiveTimeout !== undefined ? Math.min(effectiveTimeout, foregroundWaitMs) : foregroundWaitMs;
|
|
34053
34313
|
const startedAt = Date.now();
|
|
34054
34314
|
while (true) {
|
|
34055
|
-
const status = await
|
|
34315
|
+
const status = await callBashBridge(ctx, context, "bash_status", { task_id: taskId });
|
|
34056
34316
|
if (status.success === false) {
|
|
34057
34317
|
throw new Error(status.message ?? "bash_status failed");
|
|
34058
34318
|
}
|
|
34059
34319
|
if (isTerminalStatus(status.status)) {
|
|
34060
|
-
const rendered2 = formatForegroundResult(status);
|
|
34320
|
+
const rendered2 = appendPipeStripNote(formatForegroundResult(status), pipeStrip.note);
|
|
34061
34321
|
const metadataPayload2 = foregroundMetadata(description, status, rendered2);
|
|
34062
34322
|
metadata?.(metadataPayload2);
|
|
34063
34323
|
if (callID2) {
|
|
@@ -34073,12 +34333,14 @@ function createBashTool(ctx) {
|
|
|
34073
34333
|
await sleep(FOREGROUND_POLL_INTERVAL_MS);
|
|
34074
34334
|
continue;
|
|
34075
34335
|
}
|
|
34076
|
-
const promoted = await
|
|
34336
|
+
const promoted = await callBashBridge(ctx, context, "bash_promote", {
|
|
34337
|
+
task_id: taskId
|
|
34338
|
+
});
|
|
34077
34339
|
if (promoted.success === false) {
|
|
34078
34340
|
throw new Error(promoted.message ?? "bash_promote failed");
|
|
34079
34341
|
}
|
|
34080
34342
|
trackBgTask(context.sessionID, taskId);
|
|
34081
|
-
let message = formatPromotionMessage(taskId,
|
|
34343
|
+
let message = formatPromotionMessage(taskId, effectiveTimeout, foregroundWaitMs);
|
|
34082
34344
|
if (isSubagent && allowSubagentBg)
|
|
34083
34345
|
message += subagentGuidance(taskId);
|
|
34084
34346
|
const metadataPayload2 = { description, output: message, status: "running", taskId };
|
|
@@ -34128,10 +34390,16 @@ function createBashTool(ctx) {
|
|
|
34128
34390
|
rendered += `
|
|
34129
34391
|
[exit code: ${exit}]`;
|
|
34130
34392
|
}
|
|
34393
|
+
rendered = appendPipeStripNote(rendered, pipeStrip.note);
|
|
34131
34394
|
return rendered;
|
|
34132
34395
|
}
|
|
34133
34396
|
};
|
|
34134
34397
|
}
|
|
34398
|
+
function appendPipeStripNote(output, note) {
|
|
34399
|
+
return note ? `${output}
|
|
34400
|
+
|
|
34401
|
+
${note}` : output;
|
|
34402
|
+
}
|
|
34135
34403
|
function createBashStatusTool(ctx) {
|
|
34136
34404
|
return {
|
|
34137
34405
|
description: "Read-only snapshot of a background or PTY bash task's current state and output. Returns immediately. Never waits. Use bash_watch to block on or register for pattern matches and exit events.",
|
|
@@ -34154,7 +34422,7 @@ function createBashKillTool(ctx) {
|
|
|
34154
34422
|
taskId: z5.string().describe("Background task ID returned by bash({ background: true }), e.g. bash-6b454047.")
|
|
34155
34423
|
},
|
|
34156
34424
|
execute: async (args, context) => {
|
|
34157
|
-
const data = await
|
|
34425
|
+
const data = await callBashBridge(ctx, context, "bash_kill", {
|
|
34158
34426
|
task_id: args.taskId
|
|
34159
34427
|
});
|
|
34160
34428
|
if (data.success === false) {
|
|
@@ -34169,7 +34437,7 @@ function createBashKillTool(ctx) {
|
|
|
34169
34437
|
};
|
|
34170
34438
|
}
|
|
34171
34439
|
async function bashStatusSnapshot(ctx, runtime, taskId, outputMode, options) {
|
|
34172
|
-
const data = await
|
|
34440
|
+
const data = await callBashBridge(ctx, runtime, "bash_status", { task_id: taskId, output_mode: outputMode }, options);
|
|
34173
34441
|
if (data.success === false) {
|
|
34174
34442
|
throw new Error(data.message ?? "bash_status failed");
|
|
34175
34443
|
}
|
|
@@ -34186,7 +34454,7 @@ async function formatBashStatusText(runtime, taskId, data, requestedOutputMode)
|
|
|
34186
34454
|
const preview = data.output_preview;
|
|
34187
34455
|
if (preview && status !== "running") {
|
|
34188
34456
|
text += `
|
|
34189
|
-
${preview
|
|
34457
|
+
${preview}`;
|
|
34190
34458
|
}
|
|
34191
34459
|
if (status === "running") {
|
|
34192
34460
|
text += `
|
|
@@ -34307,11 +34575,10 @@ var z6 = tool6.schema;
|
|
|
34307
34575
|
var BASH_WAIT_POLL_INTERVAL_MS = 100;
|
|
34308
34576
|
var DEFAULT_BASH_STATUS_WAIT_TIMEOUT_MS = 30000;
|
|
34309
34577
|
var MAX_BASH_STATUS_WAIT_TIMEOUT_MS = 300000;
|
|
34310
|
-
var BASH_TRANSPORT_TIMEOUT_MS2 = 30000;
|
|
34311
34578
|
var REGEX_WAIT_SCAN_WINDOW_BYTES = 64 * 1024;
|
|
34312
34579
|
function createBashWatchTool(ctx) {
|
|
34313
34580
|
return {
|
|
34314
|
-
description: "
|
|
34581
|
+
description: "Watch a background bash task. Two modes. Async (background:true, requires pattern) registers a non-blocking notification and returns immediately — use this to be pinged when a specific line appears or the task exits, without freezing your turn. Sync (default) blocks until a pattern matches/the task exits/timeout, and is ONLY for short bounded waits (seconds, e.g. a dev server printing a readiness line). Do NOT sync-wait for a long task (build/test/install): blocking locks the user out until it ends — instead end your turn and let the automatic completion reminder arrive, or use async mode.",
|
|
34315
34582
|
args: {
|
|
34316
34583
|
taskId: z6.string().describe("Background task ID returned by bash({ background: true })."),
|
|
34317
34584
|
pattern: z6.union([z6.string(), z6.object({ regex: z6.string() })]).optional().describe("Substring or regex pattern. Optional in sync mode; required with background:true. Sync substring watches keep only the overlap tail needed for boundary matches; sync regex watches use a 64 KB rolling output window."),
|
|
@@ -34342,7 +34609,7 @@ function createBashWatchTool(ctx) {
|
|
|
34342
34609
|
markExplicitControl(context.sessionID, taskId, false);
|
|
34343
34610
|
let registered;
|
|
34344
34611
|
try {
|
|
34345
|
-
registered = await
|
|
34612
|
+
registered = await callBashBridge(ctx, context, "bash_notify", notifyParams);
|
|
34346
34613
|
} catch (err) {
|
|
34347
34614
|
unmarkExplicitControl(context.sessionID, taskId);
|
|
34348
34615
|
throw err;
|
|
@@ -34355,7 +34622,6 @@ function createBashWatchTool(ctx) {
|
|
|
34355
34622
|
throw new Error(`invalid_request: ${message}`);
|
|
34356
34623
|
throw new Error(`${code}: ${message}`);
|
|
34357
34624
|
}
|
|
34358
|
-
markExplicitControl(context.sessionID, taskId);
|
|
34359
34625
|
const metadata2 = context.metadata;
|
|
34360
34626
|
metadata2?.({ taskId, registered: true, watchId: registered.watch_id });
|
|
34361
34627
|
return `Watch registered: ${registered.watch_id} on task ${taskId}
|
|
@@ -34393,12 +34659,12 @@ Waited ${waited.elapsed_ms}ms; task exited (${stat}${e}).`;
|
|
|
34393
34659
|
const preview2 = data.output_preview;
|
|
34394
34660
|
if (preview2 && status !== "running") {
|
|
34395
34661
|
text += `
|
|
34396
|
-
${preview2
|
|
34662
|
+
${preview2}`;
|
|
34397
34663
|
}
|
|
34398
34664
|
return text;
|
|
34399
34665
|
}
|
|
34400
34666
|
async function bashStatusSnapshot2(ctx, runtime, taskId, outputMode, options) {
|
|
34401
|
-
const data = await
|
|
34667
|
+
const data = await callBashBridge(ctx, runtime, "bash_status", { task_id: taskId, output_mode: outputMode }, options);
|
|
34402
34668
|
if (data.success === false)
|
|
34403
34669
|
throw new Error(data.message ?? "bash_status failed");
|
|
34404
34670
|
return data;
|
|
@@ -34409,10 +34675,7 @@ async function waitForBashStatus(ctx, runtime, taskId, outputMode, waitFor, effe
|
|
|
34409
34675
|
let spillCursor = { output: 0, stderr: 0, combined: 0 };
|
|
34410
34676
|
let scanText = "";
|
|
34411
34677
|
let scanBaseOffset = 0;
|
|
34412
|
-
const bridgeOptions = {
|
|
34413
|
-
keepBridgeOnTimeout: true,
|
|
34414
|
-
transportTimeoutMs: BASH_TRANSPORT_TIMEOUT_MS2
|
|
34415
|
-
};
|
|
34678
|
+
const bridgeOptions = {};
|
|
34416
34679
|
markTaskWaiting(runtime.sessionID, taskId);
|
|
34417
34680
|
let sawTerminal = false;
|
|
34418
34681
|
try {
|
|
@@ -34598,7 +34861,7 @@ function createBashWriteTool(ctx) {
|
|
|
34598
34861
|
]).describe("Either a string of verbatim bytes (e.g. 'print(1)\\n') OR an array mixing strings " + "and { key: '<name>' } objects for atomic text+key sequences. " + "Example: [ 'iHello', { key: 'esc' }, ':wq', { key: 'enter' } ].")
|
|
34599
34862
|
},
|
|
34600
34863
|
execute: async (args, context) => {
|
|
34601
|
-
const data = await
|
|
34864
|
+
const data = await callBashBridge(ctx, context, "bash_write", {
|
|
34602
34865
|
task_id: args.taskId,
|
|
34603
34866
|
input: args.input
|
|
34604
34867
|
});
|
|
@@ -35636,7 +35899,10 @@ function createDeleteTool(ctx) {
|
|
|
35636
35899
|
recursive: z8.boolean().optional().describe("Required to delete a directory and its contents. Defaults to false; passing a directory without this returns an error.")
|
|
35637
35900
|
},
|
|
35638
35901
|
execute: async (args, context) => {
|
|
35639
|
-
const inputs = args.files;
|
|
35902
|
+
const inputs = coerceStringArray(args.files);
|
|
35903
|
+
if (inputs.length === 0) {
|
|
35904
|
+
throw new Error("delete: `files` must be a non-empty array of paths");
|
|
35905
|
+
}
|
|
35640
35906
|
const recursive = args.recursive === true;
|
|
35641
35907
|
const projectRoot = await resolveProjectRoot(ctx, context);
|
|
35642
35908
|
const absolutePaths = inputs.map((f) => resolvePathFromProjectRoot(projectRoot, f));
|
|
@@ -36062,6 +36328,7 @@ ${diagnostics}` : json2;
|
|
|
36062
36328
|
// src/tools/navigation.ts
|
|
36063
36329
|
import { tool as tool11 } from "@opencode-ai/plugin";
|
|
36064
36330
|
var z11 = tool11.schema;
|
|
36331
|
+
var CALLGRAPH_SOFT_CODES = new Set(["symbol_not_found", "callgraph_building"]);
|
|
36065
36332
|
function navigationTools(ctx) {
|
|
36066
36333
|
return {
|
|
36067
36334
|
aft_callgraph: {
|
|
@@ -36125,7 +36392,12 @@ function navigationTools(ctx) {
|
|
|
36125
36392
|
params.toFile = toFile;
|
|
36126
36393
|
const response = await callBridge(ctx, context, args.op, params);
|
|
36127
36394
|
if (response.success === false) {
|
|
36128
|
-
|
|
36395
|
+
const message = formatBridgeErrorMessage(args.op, response, params);
|
|
36396
|
+
const code = typeof response.code === "string" ? response.code : "";
|
|
36397
|
+
if (CALLGRAPH_SOFT_CODES.has(code)) {
|
|
36398
|
+
return message;
|
|
36399
|
+
}
|
|
36400
|
+
throw new Error(message);
|
|
36129
36401
|
}
|
|
36130
36402
|
return JSON.stringify(response);
|
|
36131
36403
|
}
|
|
@@ -36736,7 +37008,8 @@ function safetyTools(ctx) {
|
|
|
36736
37008
|
return permissionDeniedResponse(permissionError);
|
|
36737
37009
|
}
|
|
36738
37010
|
if (op === "checkpoint") {
|
|
36739
|
-
const
|
|
37011
|
+
const coercedFiles = coerceStringArray(args.files);
|
|
37012
|
+
const checkpointFiles = coercedFiles.length > 0 ? coercedFiles : typeof args.filePath === "string" ? [args.filePath] : undefined;
|
|
36740
37013
|
if (Array.isArray(checkpointFiles)) {
|
|
36741
37014
|
const projectRoot = await resolveProjectRoot(ctx, context);
|
|
36742
37015
|
const uniqueParents = new Set;
|
|
@@ -36782,17 +37055,18 @@ function safetyTools(ctx) {
|
|
|
36782
37055
|
const params = {};
|
|
36783
37056
|
if (args.name !== undefined)
|
|
36784
37057
|
params.name = args.name;
|
|
37058
|
+
const payloadFiles = coerceStringArray(args.files);
|
|
36785
37059
|
if (op === "checkpoint") {
|
|
36786
|
-
if (
|
|
36787
|
-
params.files =
|
|
37060
|
+
if (payloadFiles.length > 0) {
|
|
37061
|
+
params.files = payloadFiles;
|
|
36788
37062
|
} else if (args.filePath !== undefined) {
|
|
36789
37063
|
params.files = [args.filePath];
|
|
36790
37064
|
}
|
|
36791
37065
|
} else {
|
|
36792
37066
|
if (args.filePath !== undefined)
|
|
36793
37067
|
params.file = args.filePath;
|
|
36794
|
-
if (
|
|
36795
|
-
params.files =
|
|
37068
|
+
if (payloadFiles.length > 0)
|
|
37069
|
+
params.files = payloadFiles;
|
|
36796
37070
|
}
|
|
36797
37071
|
const response = await callBridge(ctx, context, commandMap[op], params);
|
|
36798
37072
|
if (response.success === false) {
|
|
@@ -37218,16 +37492,15 @@ function buildWorkflowHints(opts) {
|
|
|
37218
37492
|
const hasInspect = opts.toolSurface !== "minimal" && !opts.disabledTools.has("aft_inspect");
|
|
37219
37493
|
const hasBash = !opts.disabledTools.has(bashName);
|
|
37220
37494
|
const hasBgBash = hasBash && opts.bashBackgroundEnabled && !opts.disabledTools.has(bashStatusName);
|
|
37495
|
+
if (hasBash && opts.bashCompressionEnabled) {
|
|
37496
|
+
sections.push("When AFT bash output compression is on, do NOT pipe test/build commands through grep/head/tail (e.g. `bun test | grep fail`) to summarize. The compressor already keeps failures and the summary; piping hides failures. Run the command bare.");
|
|
37497
|
+
}
|
|
37221
37498
|
if (hasOutline && hasZoom) {
|
|
37222
37499
|
sections.push(`**Web/URL access**: \`aft_outline({ target: url })\` first for structure, then \`aft_zoom({ url, symbols: "<heading>" })\` for the specific section.`);
|
|
37223
37500
|
}
|
|
37224
37501
|
if (hasOutline && hasZoom && (hasGrep || hasSearch)) {
|
|
37225
|
-
|
|
37226
|
-
|
|
37227
|
-
sections.push(`**Code exploration**: \`aft_search\` is the primary code-search tool. It auto-routes by query shape — exact identifiers, regex, error messages, natural language all use the same call. Very short queries fall back to literal scans; pass \`hint: "regex"\` / \`hint: "literal"\` / \`hint: "semantic"\` to override routing if needed. Then \`aft_outline\` for structure → \`aft_zoom\` for symbol(s).${grepFallback}`);
|
|
37228
|
-
} else {
|
|
37229
|
-
sections.push(`**Code exploration**: \`${grepName}\` to locate → \`aft_outline\` for structure → \`aft_zoom\` for symbol(s).`);
|
|
37230
|
-
}
|
|
37502
|
+
const locate = hasSearch ? '`aft_search` is the primary code-search tool: one call auto-routes concepts, identifiers, regex, error strings, and literals (pass `hint: "regex"`/`"literal"`/`"semantic"` to force a lane).' : `\`${grepName}\` (the tool — indexed and ranked) locates code.`;
|
|
37503
|
+
sections.push(`**Code exploration**: fire independent lookups in ONE parallel tool-call wave — do NOT serialize them. ${locate} Then \`aft_outline\` for structure → \`aft_zoom\` for symbol(s). DO NOT run \`grep\`/\`rg\`/\`find\` through \`bash\` to locate code — the bash path is unindexed, unranked, serial, and routinely surfaces the wrong hit. Keep \`bash\` for shell facts (git state, file metadata, processes).`);
|
|
37231
37504
|
}
|
|
37232
37505
|
if (hasInspect) {
|
|
37233
37506
|
sections.push("**Codebase health & diagnostics**: AFT does not surface compile/type errors automatically after edits — pull them with `aft_inspect`. Run it after a batch of edits and before you run tests or commit, when starting in unfamiliar code, or before a refactor/review. One call summarizes diagnostics (compile/type errors), TODOs, metrics, dead code, unused exports, and duplicates; pass `sections` for focused drill-down and `scope` to actively pull diagnostics for a specific file or directory. Its diagnostics are a fast checkpoint, not the authority — a clean `tsc` / `cargo check` / `pyright` run is the real gate. Treat `stale_categories` as a genuine stale-cache signal while an async Tier 2 refresh catches up.");
|
|
@@ -37245,12 +37518,13 @@ function buildWorkflowHints(opts) {
|
|
|
37245
37518
|
`));
|
|
37246
37519
|
}
|
|
37247
37520
|
if (hasBash && hasBgBash) {
|
|
37248
|
-
sections.push(`**Long-running commands** (builds, installs, full test suites): \`${bashName}({ background: true })\` returns immediately with a \`taskId
|
|
37521
|
+
sections.push(`**Long-running commands** (builds, installs, full test suites): \`${bashName}({ background: true })\` returns immediately with a \`taskId\`, then **end your turn** — a completion reminder arrives automatically when it finishes. Do not poll \`${bashStatusName}({ taskId })\`, and do not sync-wait with \`bash_watch\` for a long task: blocking freezes your turn and locks the user out until it ends. For an early non-blocking ping on a specific output line, register an async watch \`bash_watch({ taskId, pattern, background: true })\`. \`bash_watch\` synchronous mode is only for short bounded waits (seconds, e.g. a dev server printing a readiness line), never for multi-minute jobs.`);
|
|
37249
37522
|
sections.push(`**PTY / interactive commands**: PTY mode is for interactive REPLs and terminal apps (python, node, bash itself, vim). Start with \`${bashName}({ command: "python", pty: true, background: true })\`, read the screen with \`${bashStatusName}({ taskId, outputMode: "screen" })\`, and send input with \`${bashWriteName}({ taskId, input: "..." })\`.`);
|
|
37250
37523
|
}
|
|
37251
37524
|
if (sections.length === 0) {
|
|
37252
37525
|
return null;
|
|
37253
37526
|
}
|
|
37527
|
+
sections.unshift("**Parallel tool calls**: when several read-only operations are independent, emit them in ONE response instead of serializing — file reads, structure and symbol lookups, code search, diagnostics, and git status/diff/log. Sequence only when a call depends on a prior result or when a command mutates state.");
|
|
37254
37528
|
return `${HEADING}
|
|
37255
37529
|
|
|
37256
37530
|
${sections.join(`
|
|
@@ -37263,6 +37537,7 @@ function buildHintsFromConfig(config2, disabledTools) {
|
|
|
37263
37537
|
hoistBuiltins: config2.hoist_builtin_tools !== false,
|
|
37264
37538
|
semanticEnabled: config2.semantic_search === true,
|
|
37265
37539
|
bashBackgroundEnabled: resolveBashConfig(config2).background,
|
|
37540
|
+
bashCompressionEnabled: resolveBashConfig(config2).compress,
|
|
37266
37541
|
disabledTools
|
|
37267
37542
|
});
|
|
37268
37543
|
}
|
|
@@ -37311,12 +37586,12 @@ var PLUGIN_VERSION = (() => {
|
|
|
37311
37586
|
return "0.0.0";
|
|
37312
37587
|
}
|
|
37313
37588
|
})();
|
|
37314
|
-
var ANNOUNCEMENT_VERSION = "0.
|
|
37589
|
+
var ANNOUNCEMENT_VERSION = "0.36.0";
|
|
37315
37590
|
var ANNOUNCEMENT_FEATURES = [
|
|
37316
|
-
"
|
|
37317
|
-
"
|
|
37318
|
-
"
|
|
37319
|
-
"
|
|
37591
|
+
"Persisted call graph: dead-code analysis runs on large repositories again (the file-count cap is gone), `aft_callgraph` queries resolve from disk, and method-call edges are more accurate across more languages.",
|
|
37592
|
+
"Bash output stops hiding failures: piping a test/build through `grep`/`head` with compression on now keeps the failures and summary instead of stripping them.",
|
|
37593
|
+
"Code search steering: guidance and hints now point to `aft_search` and parallel `aft_*` tools instead of `grep`/`find` in bash.",
|
|
37594
|
+
"Fixes: a small `timeout` no longer kills a foreground `bash` command (#102), and `aft_delete`/`aft_safety checkpoint` no longer crash on a mistyped `files` argument."
|
|
37320
37595
|
];
|
|
37321
37596
|
var ANNOUNCEMENT_FOOTER = "Join us on Discord: https://discord.gg/DSa65w8wuf";
|
|
37322
37597
|
var plugin = async (input) => initializePluginForDirectory(input);
|
|
@@ -37465,8 +37740,8 @@ ${lines}
|
|
|
37465
37740
|
delivery: projectConfig.configure_warnings_delivery ?? "toast"
|
|
37466
37741
|
});
|
|
37467
37742
|
},
|
|
37468
|
-
onBashCompletion: (completion) => {
|
|
37469
|
-
const sessionDir =
|
|
37743
|
+
onBashCompletion: (completion, bridge) => {
|
|
37744
|
+
const sessionDir = bridge.getCwd();
|
|
37470
37745
|
handlePushedBgCompletion({
|
|
37471
37746
|
ctx,
|
|
37472
37747
|
directory: sessionDir,
|
|
@@ -37475,8 +37750,8 @@ ${lines}
|
|
|
37475
37750
|
serverUrl: input.serverUrl?.toString()
|
|
37476
37751
|
}, completion);
|
|
37477
37752
|
},
|
|
37478
|
-
onBashLongRunning: (reminder) => {
|
|
37479
|
-
const sessionDir =
|
|
37753
|
+
onBashLongRunning: (reminder, bridge) => {
|
|
37754
|
+
const sessionDir = bridge.getCwd();
|
|
37480
37755
|
handlePushedBgLongRunning({
|
|
37481
37756
|
ctx,
|
|
37482
37757
|
directory: sessionDir,
|
|
@@ -37485,8 +37760,8 @@ ${lines}
|
|
|
37485
37760
|
serverUrl: input.serverUrl?.toString()
|
|
37486
37761
|
}, reminder);
|
|
37487
37762
|
},
|
|
37488
|
-
onBashPatternMatch: (frame) => {
|
|
37489
|
-
const sessionDir =
|
|
37763
|
+
onBashPatternMatch: (frame, bridge) => {
|
|
37764
|
+
const sessionDir = bridge.getCwd();
|
|
37490
37765
|
handlePushedPatternMatch({
|
|
37491
37766
|
ctx,
|
|
37492
37767
|
directory: sessionDir,
|
|
@@ -37688,6 +37963,7 @@ Install: ${getManualInstallHint()}`).catch(() => {});
|
|
|
37688
37963
|
"bash_status"
|
|
37689
37964
|
];
|
|
37690
37965
|
const registeredTools = new Set(Object.keys(allTools));
|
|
37966
|
+
pool.setConfigureOverride("aft_search_registered", registeredTools.has("aft_search"));
|
|
37691
37967
|
const hintsAbsentTools = new Set;
|
|
37692
37968
|
for (const name of HINTS_TOOL_NAMES) {
|
|
37693
37969
|
if (!registeredTools.has(name))
|
|
@@ -37783,7 +38059,6 @@ Install: ${getManualInstallHint()}`).catch(() => {});
|
|
|
37783
38059
|
}
|
|
37784
38060
|
if (toolInput.tool === "bash" && output.output) {
|
|
37785
38061
|
output.output = maybeAppendConflictsHint(output.output);
|
|
37786
|
-
output.output = maybeAppendGrepHint(output.output);
|
|
37787
38062
|
}
|
|
37788
38063
|
const sessionDir = getSessionDirectoryCached(toolInput.sessionID) ?? input.directory;
|
|
37789
38064
|
await appendInTurnBgCompletions({ ctx, directory: sessionDir, sessionID: toolInput.sessionID }, output);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { maybeAppendConflictsHint
|
|
1
|
+
export { maybeAppendConflictsHint } from "@cortexkit/aft-bridge";
|
|
2
2
|
//# sourceMappingURL=bash-hints.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-hints.d.ts","sourceRoot":"","sources":["../../src/shared/bash-hints.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,
|
|
1
|
+
{"version":3,"file":"bash-hints.d.ts","sourceRoot":"","sources":["../../src/shared/bash-hints.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/tools/_shared.d.ts
CHANGED
|
@@ -77,6 +77,7 @@ export declare function isEmptyParam(value: unknown): boolean;
|
|
|
77
77
|
* file tree or wait on external I/O (embedding API, index build). The
|
|
78
78
|
* goal is to absorb slow first-call spikes without masking real hangs.
|
|
79
79
|
*/
|
|
80
|
+
export declare const BASH_TRANSPORT_TIMEOUT_MS = 30000;
|
|
80
81
|
export declare const LONG_RUNNING_COMMAND_TIMEOUT_MS: Record<string, number>;
|
|
81
82
|
/** Returns the per-command timeout override, or undefined to use the bridge default. */
|
|
82
83
|
export declare function timeoutForCommand(command: string): number | undefined;
|
|
@@ -160,6 +161,13 @@ export declare function bridgeFor(ctx: PluginContext, runtime: ToolRuntime): Bin
|
|
|
160
161
|
* session identifier still work — they just share undo/checkpoint state.
|
|
161
162
|
*/
|
|
162
163
|
export declare function callBridge(ctx: PluginContext, runtime: ToolRuntime, command: string, params?: Record<string, unknown>, options?: BridgeRequestOptions): Promise<Record<string, unknown>>;
|
|
164
|
+
/**
|
|
165
|
+
* Send a bash-family command without restarting the shared bridge on transport
|
|
166
|
+
* timeout. Bash has its own child-process timeout/watchdog handling; a late
|
|
167
|
+
* transport response must not sacrifice the warm shared bridge and reject
|
|
168
|
+
* unrelated sibling requests.
|
|
169
|
+
*/
|
|
170
|
+
export declare function callBashBridge(ctx: PluginContext, runtime: ToolRuntime, command: string, params?: Record<string, unknown>, options?: BridgeRequestOptions): Promise<Record<string, unknown>>;
|
|
163
171
|
/**
|
|
164
172
|
* Eagerly warm the session-directory cache for a runtime. Safe to call from
|
|
165
173
|
* synchronous code — the lookup runs in the background and failures are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../src/tools/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAQhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,GACR,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,OAAO,EACV,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAWpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMpD;AAED;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../src/tools/_shared.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/bash.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAavE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiFjD,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,CAsRjE;AAMD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,CAyBvE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,CAuBrE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash_watch.d.ts","sourceRoot":"","sources":["../../src/tools/bash_watch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAavE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"bash_watch.d.ts","sourceRoot":"","sources":["../../src/tools/bash_watch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAavE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AASjD,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AACF,KAAK,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAGlF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,CAwFtE;AAiDD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,eAAe,GAAG,SAAS,EACpC,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,kBAAkB,CAAC,CA4D7B;AA6DD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAK5E;AA4DD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAEtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hoisted.d.ts","sourceRoot":"","sources":["../../src/tools/hoisted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA8EjD,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,GAAI,IAAI,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG,MAChD,CAAC;AA0RtC;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,CAmKjE;
|
|
1
|
+
{"version":3,"file":"hoisted.d.ts","sourceRoot":"","sources":["../../src/tools/hoisted.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAK1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA8EjD,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,GAAI,IAAI,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG,MAChD,CAAC;AA0RtC;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,CAmKjE;AAwnCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA0B/E;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CA+FnF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/tools/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/tools/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqBjD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAkGlF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/tools/safety.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/tools/safety.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwCjD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAkJ9E"}
|
package/dist/tui.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/tui/index.tsx
|
|
2
2
|
import { createMemo as createMemo2, createSignal as createSignal2, onCleanup as onCleanup2 } from "solid-js";
|
|
3
3
|
// package.json
|
|
4
|
-
var version = "0.
|
|
4
|
+
var version = "0.36.0";
|
|
5
5
|
|
|
6
6
|
// src/shared/rpc-client.ts
|
|
7
7
|
import { existsSync, readdirSync, readFileSync, unlinkSync } from "node:fs";
|
package/dist/workflow-hints.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export interface WorkflowHintsOpts {
|
|
|
8
8
|
semanticEnabled: boolean;
|
|
9
9
|
/** `experimental.bash.background` — gates background-bash paragraph. */
|
|
10
10
|
bashBackgroundEnabled: boolean;
|
|
11
|
+
/** Resolved bash compression flag. */
|
|
12
|
+
bashCompressionEnabled: boolean;
|
|
11
13
|
/** Set of disabled tool names (after surface filtering). */
|
|
12
14
|
disabledTools: Set<string>;
|
|
13
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-hints.d.ts","sourceRoot":"","sources":["../src/workflow-hints.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,KAAK,CAAC;IAC/C,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,eAAe,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,qBAAqB,EAAE,OAAO,CAAC;IAC/B,4DAA4D;IAC5D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"workflow-hints.d.ts","sourceRoot":"","sources":["../src/workflow-hints.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,KAAK,CAAC;IAC/C,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,eAAe,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sCAAsC;IACtC,sBAAsB,EAAE,OAAO,CAAC;IAChC,4DAA4D;IAC5D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CA8GzE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CASjG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cortexkit/aft-opencode",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.36.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "OpenCode plugin for Agent File Tools (AFT) — tree-sitter and lsp powered code analysis",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,19 +30,19 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@clack/prompts": "^1.2.0",
|
|
33
|
-
"@cortexkit/aft-bridge": "0.
|
|
33
|
+
"@cortexkit/aft-bridge": "0.36.0",
|
|
34
34
|
"@xterm/headless": "^5.5.0",
|
|
35
35
|
"comment-json": "^4.6.2",
|
|
36
36
|
"undici": "^7.25.0",
|
|
37
37
|
"zod": "^4.1.8"
|
|
38
38
|
},
|
|
39
39
|
"optionalDependencies": {
|
|
40
|
-
"@cortexkit/aft-darwin-arm64": "0.
|
|
41
|
-
"@cortexkit/aft-darwin-x64": "0.
|
|
42
|
-
"@cortexkit/aft-linux-arm64": "0.
|
|
43
|
-
"@cortexkit/aft-linux-x64": "0.
|
|
44
|
-
"@cortexkit/aft-win32-arm64": "0.
|
|
45
|
-
"@cortexkit/aft-win32-x64": "0.
|
|
40
|
+
"@cortexkit/aft-darwin-arm64": "0.36.0",
|
|
41
|
+
"@cortexkit/aft-darwin-x64": "0.36.0",
|
|
42
|
+
"@cortexkit/aft-linux-arm64": "0.36.0",
|
|
43
|
+
"@cortexkit/aft-linux-x64": "0.36.0",
|
|
44
|
+
"@cortexkit/aft-win32-arm64": "0.36.0",
|
|
45
|
+
"@cortexkit/aft-win32-x64": "0.36.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@opencode-ai/plugin": "^1.15.11",
|
package/src/shared/bash-hints.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// Bash-output hint nudges now live in the shared bridge package so both plugin
|
|
2
2
|
// hosts use one implementation. Re-exported here to keep the existing OpenCode
|
|
3
3
|
// import path stable.
|
|
4
|
-
export { maybeAppendConflictsHint
|
|
4
|
+
export { maybeAppendConflictsHint } from "@cortexkit/aft-bridge";
|