@sma1lboy/kobe 0.5.8 → 0.5.9
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/kobed.js +140 -26
- package/dist/cli/index.js +567 -316
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -8857,7 +8857,7 @@ var init_package = __esm(() => {
|
|
|
8857
8857
|
package_default = {
|
|
8858
8858
|
$schema: "https://json.schemastore.org/package.json",
|
|
8859
8859
|
name: "@sma1lboy/kobe",
|
|
8860
|
-
version: "0.5.
|
|
8860
|
+
version: "0.5.9",
|
|
8861
8861
|
description: "TUI orchestrator for Claude Code (codename)",
|
|
8862
8862
|
type: "module",
|
|
8863
8863
|
packageManager: "bun@1.3.13",
|
|
@@ -10580,6 +10580,7 @@ class Orchestrator {
|
|
|
10580
10580
|
worktrees;
|
|
10581
10581
|
metadataSuggester;
|
|
10582
10582
|
handles = new Map;
|
|
10583
|
+
firstSpawnLatches = new Map;
|
|
10583
10584
|
subscribers = new Map;
|
|
10584
10585
|
pumps = new Map;
|
|
10585
10586
|
pendingInputBroker = new InMemoryPendingInputBroker;
|
|
@@ -10812,8 +10813,16 @@ class Orchestrator {
|
|
|
10812
10813
|
const renameTabId = this.resolveTab(task, tabId).id;
|
|
10813
10814
|
this.maybeRenameTempBranch(task.id, renameTabId, prompt);
|
|
10814
10815
|
}
|
|
10815
|
-
|
|
10816
|
+
let targetTab = this.resolveTab(task, tabId);
|
|
10816
10817
|
const key = tabKey(task.id, targetTab.id);
|
|
10818
|
+
if (!targetTab.sessionId) {
|
|
10819
|
+
const inflight = this.firstSpawnLatches.get(key);
|
|
10820
|
+
if (inflight) {
|
|
10821
|
+
await inflight.catch(() => {});
|
|
10822
|
+
task = this.requireTask(id);
|
|
10823
|
+
targetTab = this.resolveTab(task, tabId);
|
|
10824
|
+
}
|
|
10825
|
+
}
|
|
10817
10826
|
if (this.handles.has(key) === false) {
|
|
10818
10827
|
const running = this.countRunning();
|
|
10819
10828
|
if (running >= CONCURRENCY_CAP) {
|
|
@@ -10834,18 +10843,28 @@ class Orchestrator {
|
|
|
10834
10843
|
model: modelToUse
|
|
10835
10844
|
});
|
|
10836
10845
|
} else {
|
|
10837
|
-
|
|
10838
|
-
|
|
10839
|
-
|
|
10846
|
+
let releaseLatch = () => {};
|
|
10847
|
+
const latch = new Promise((resolve3) => {
|
|
10848
|
+
releaseLatch = resolve3;
|
|
10840
10849
|
});
|
|
10841
|
-
|
|
10842
|
-
|
|
10843
|
-
|
|
10844
|
-
|
|
10845
|
-
|
|
10846
|
-
|
|
10847
|
-
|
|
10848
|
-
|
|
10850
|
+
this.firstSpawnLatches.set(key, latch);
|
|
10851
|
+
try {
|
|
10852
|
+
handle = await this.engine.spawn(task.worktreePath, promptToSend, {
|
|
10853
|
+
permissionMode: task.permissionMode,
|
|
10854
|
+
model: modelToUse
|
|
10855
|
+
});
|
|
10856
|
+
await this.updateTab(task.id, targetTab.id, { sessionId: handle.sessionId });
|
|
10857
|
+
if (task.title === PLACEHOLDER_TASK_TITLE && prompt && prompt.trim().length > 0) {
|
|
10858
|
+
const derived = deriveTitleFromPrompt(prompt);
|
|
10859
|
+
if (derived)
|
|
10860
|
+
await this.store.update(task.id, { title: derived });
|
|
10861
|
+
}
|
|
10862
|
+
if (prompt && prompt.trim().length > 0) {
|
|
10863
|
+
this.maybeUpgradeTitle(task.id, prompt);
|
|
10864
|
+
}
|
|
10865
|
+
} finally {
|
|
10866
|
+
releaseLatch();
|
|
10867
|
+
this.firstSpawnLatches.delete(key);
|
|
10849
10868
|
}
|
|
10850
10869
|
}
|
|
10851
10870
|
this.handles.set(key, handle);
|
|
@@ -10912,6 +10931,12 @@ class Orchestrator {
|
|
|
10912
10931
|
}
|
|
10913
10932
|
this.dispatchEvent(task.id, targetTab.id, { type: "done" });
|
|
10914
10933
|
}
|
|
10934
|
+
async steerTask(id, prompt, tabId) {
|
|
10935
|
+
const task = this.requireTask(id);
|
|
10936
|
+
const targetTab = this.resolveTab(task, tabId);
|
|
10937
|
+
await this.interruptTask(task.id, targetTab.id);
|
|
10938
|
+
await this.runTask(task.id, prompt, targetTab.id);
|
|
10939
|
+
}
|
|
10915
10940
|
async pauseTask(id) {
|
|
10916
10941
|
const task = this.requireTask(id);
|
|
10917
10942
|
if (task.status !== "in_progress") {
|
|
@@ -11459,6 +11484,10 @@ class RemoteOrchestrator {
|
|
|
11459
11484
|
async interruptTask(taskId, tabId) {
|
|
11460
11485
|
await this.client.request("chat.interrupt", { taskId, tabId });
|
|
11461
11486
|
}
|
|
11487
|
+
async steerTask(taskId, text, tabId) {
|
|
11488
|
+
await this.client.request("chat.steer", { taskId, text, tabId });
|
|
11489
|
+
this.markRunState(taskId, tabId ?? this.getTask(taskId)?.activeTabId, "running");
|
|
11490
|
+
}
|
|
11462
11491
|
async setArchived(taskId, archived) {
|
|
11463
11492
|
await this.client.request("task.archive", { taskId, archived });
|
|
11464
11493
|
}
|
|
@@ -15571,7 +15600,8 @@ var init_sync = __esm(() => {
|
|
|
15571
15600
|
});
|
|
15572
15601
|
|
|
15573
15602
|
// src/engine/claude-code-local/history.ts
|
|
15574
|
-
import {
|
|
15603
|
+
import { randomUUID } from "crypto";
|
|
15604
|
+
import { appendFile, mkdir as mkdir3, readFile as readFile4, readdir, unlink as unlink2, writeFile as writeFile3 } from "fs/promises";
|
|
15575
15605
|
import { homedir as homedir8 } from "os";
|
|
15576
15606
|
import path6 from "path";
|
|
15577
15607
|
function encodeCwd(cwd) {
|
|
@@ -15668,6 +15698,76 @@ function extractUsage(v) {
|
|
|
15668
15698
|
function isObject(v) {
|
|
15669
15699
|
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
15670
15700
|
}
|
|
15701
|
+
async function appendInterruptedUserPrompt(sessionId, cwd, prompt, deps = defaultDeps2) {
|
|
15702
|
+
if (!prompt || prompt.trim().length === 0)
|
|
15703
|
+
return;
|
|
15704
|
+
const projectDir = path6.join(deps.projectsDir(), encodeCwd(cwd));
|
|
15705
|
+
const filePath = path6.join(projectDir, `${sessionId}.jsonl`);
|
|
15706
|
+
let lines = [];
|
|
15707
|
+
try {
|
|
15708
|
+
const raw = await readFile4(filePath, "utf8");
|
|
15709
|
+
lines = raw.split(`
|
|
15710
|
+
`).filter((l) => l.length > 0);
|
|
15711
|
+
} catch (err) {
|
|
15712
|
+
if (err.code !== "ENOENT")
|
|
15713
|
+
throw err;
|
|
15714
|
+
await mkdir3(projectDir, { recursive: true });
|
|
15715
|
+
}
|
|
15716
|
+
let lastConvIdx = -1;
|
|
15717
|
+
let lastConvRecord = null;
|
|
15718
|
+
let lastConvRole = null;
|
|
15719
|
+
for (let i = lines.length - 1;i >= 0; i--) {
|
|
15720
|
+
let parsed;
|
|
15721
|
+
try {
|
|
15722
|
+
parsed = JSON.parse(lines[i]);
|
|
15723
|
+
} catch {
|
|
15724
|
+
continue;
|
|
15725
|
+
}
|
|
15726
|
+
if (!isObject(parsed))
|
|
15727
|
+
continue;
|
|
15728
|
+
const inner = isObject(parsed.message) ? parsed.message : parsed;
|
|
15729
|
+
const role = inner.role;
|
|
15730
|
+
if (role === "user" || role === "assistant") {
|
|
15731
|
+
lastConvIdx = i;
|
|
15732
|
+
lastConvRecord = parsed;
|
|
15733
|
+
lastConvRole = role;
|
|
15734
|
+
break;
|
|
15735
|
+
}
|
|
15736
|
+
}
|
|
15737
|
+
const now = new Date().toISOString();
|
|
15738
|
+
if (lastConvRole === "user" && lastConvRecord && lastConvIdx >= 0) {
|
|
15739
|
+
const inner = isObject(lastConvRecord.message) ? lastConvRecord.message : lastConvRecord;
|
|
15740
|
+
const existing = typeof inner.content === "string" ? inner.content : "";
|
|
15741
|
+
if (existing === prompt || existing.endsWith(`
|
|
15742
|
+
|
|
15743
|
+
${prompt}`))
|
|
15744
|
+
return;
|
|
15745
|
+
inner.content = existing.length > 0 ? `${existing}
|
|
15746
|
+
|
|
15747
|
+
${prompt}` : prompt;
|
|
15748
|
+
lastConvRecord.timestamp = now;
|
|
15749
|
+
lines[lastConvIdx] = JSON.stringify(lastConvRecord);
|
|
15750
|
+
await writeFile3(filePath, `${lines.join(`
|
|
15751
|
+
`)}
|
|
15752
|
+
`);
|
|
15753
|
+
return;
|
|
15754
|
+
}
|
|
15755
|
+
const parentUuid = lastConvRecord && typeof lastConvRecord.uuid === "string" ? lastConvRecord.uuid : null;
|
|
15756
|
+
const record = {
|
|
15757
|
+
type: "user",
|
|
15758
|
+
message: { role: "user", content: prompt },
|
|
15759
|
+
uuid: randomUUID(),
|
|
15760
|
+
parentUuid,
|
|
15761
|
+
sessionId,
|
|
15762
|
+
cwd,
|
|
15763
|
+
timestamp: now,
|
|
15764
|
+
isSidechain: false,
|
|
15765
|
+
userType: "external",
|
|
15766
|
+
version: "1.0.0"
|
|
15767
|
+
};
|
|
15768
|
+
await appendFile(filePath, `${JSON.stringify(record)}
|
|
15769
|
+
`);
|
|
15770
|
+
}
|
|
15671
15771
|
var defaultDeps2;
|
|
15672
15772
|
var init_history = __esm(() => {
|
|
15673
15773
|
defaultDeps2 = {
|
|
@@ -16075,13 +16175,21 @@ class ClaudeCodeLocal {
|
|
|
16075
16175
|
}
|
|
16076
16176
|
async stop(handle) {
|
|
16077
16177
|
const sid = handle.sessionId;
|
|
16078
|
-
await this.registry.kill(sid, this.stopGraceMs);
|
|
16079
16178
|
const session = this.running.get(sid);
|
|
16179
|
+
const shouldRescue = !!session && !session.completedNaturally && session.prompt.trim().length > 0;
|
|
16180
|
+
const rescuePrompt = session?.prompt ?? "";
|
|
16181
|
+
const rescueCwd = session?.cwd ?? handle.cwd;
|
|
16182
|
+
await this.registry.kill(sid, this.stopGraceMs);
|
|
16080
16183
|
if (session) {
|
|
16081
16184
|
session.closed = true;
|
|
16082
16185
|
this.notify(session);
|
|
16083
16186
|
this.running.delete(sid);
|
|
16084
16187
|
}
|
|
16188
|
+
if (shouldRescue) {
|
|
16189
|
+
try {
|
|
16190
|
+
await appendInterruptedUserPrompt(sid, rescueCwd, rescuePrompt);
|
|
16191
|
+
} catch {}
|
|
16192
|
+
}
|
|
16085
16193
|
}
|
|
16086
16194
|
async start(args2) {
|
|
16087
16195
|
const binaryPath = await this.binaryPathResolver();
|
|
@@ -16114,14 +16222,17 @@ class ClaudeCodeLocal {
|
|
|
16114
16222
|
spawned,
|
|
16115
16223
|
queue,
|
|
16116
16224
|
waiters: [],
|
|
16117
|
-
closed: false
|
|
16225
|
+
closed: false,
|
|
16226
|
+
completedNaturally: false,
|
|
16227
|
+
prompt: args2.prompt
|
|
16118
16228
|
};
|
|
16119
16229
|
this.running.set(sessionId, session);
|
|
16120
16230
|
this.registry.register({
|
|
16121
16231
|
sessionId,
|
|
16122
16232
|
cwd: args2.cwd,
|
|
16123
16233
|
proc: spawned.proc,
|
|
16124
|
-
startedAt: Date.now()
|
|
16234
|
+
startedAt: Date.now(),
|
|
16235
|
+
prompt: args2.prompt
|
|
16125
16236
|
});
|
|
16126
16237
|
resolveHandle({ sessionId, cwd: args2.cwd });
|
|
16127
16238
|
};
|
|
@@ -16143,6 +16254,9 @@ class ClaudeCodeLocal {
|
|
|
16143
16254
|
try {
|
|
16144
16255
|
for await (const ev of events) {
|
|
16145
16256
|
queue.push(ev);
|
|
16257
|
+
if (ev.type === "done" && session) {
|
|
16258
|
+
session.completedNaturally = true;
|
|
16259
|
+
}
|
|
16146
16260
|
if (session)
|
|
16147
16261
|
this.notify(session);
|
|
16148
16262
|
}
|
|
@@ -16731,7 +16845,11 @@ function stripNewlines(v) {
|
|
|
16731
16845
|
return v.replace(/[\r\n]+/g, "");
|
|
16732
16846
|
}
|
|
16733
16847
|
function nextField(field) {
|
|
16734
|
-
|
|
16848
|
+
if (field === "repo")
|
|
16849
|
+
return "baseRef";
|
|
16850
|
+
if (field === "baseRef")
|
|
16851
|
+
return "confirm";
|
|
16852
|
+
return "repo";
|
|
16735
16853
|
}
|
|
16736
16854
|
function computeRepoOptions(defaultRepo, savedRepos) {
|
|
16737
16855
|
const seen = new Set;
|
|
@@ -16799,6 +16917,27 @@ function validateRepoPath(repo) {
|
|
|
16799
16917
|
}
|
|
16800
16918
|
return null;
|
|
16801
16919
|
}
|
|
16920
|
+
function getCurrentBranch(repo) {
|
|
16921
|
+
if (!repo)
|
|
16922
|
+
return null;
|
|
16923
|
+
try {
|
|
16924
|
+
const { spawnSync: spawnSync8 } = __require("child_process");
|
|
16925
|
+
const out = spawnSync8("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
|
|
16926
|
+
cwd: repo,
|
|
16927
|
+
encoding: "utf-8",
|
|
16928
|
+
timeout: 2000,
|
|
16929
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
16930
|
+
});
|
|
16931
|
+
if (out.status !== 0)
|
|
16932
|
+
return null;
|
|
16933
|
+
const name = out.stdout.trim();
|
|
16934
|
+
if (!name || name === "HEAD")
|
|
16935
|
+
return null;
|
|
16936
|
+
return name;
|
|
16937
|
+
} catch {
|
|
16938
|
+
return null;
|
|
16939
|
+
}
|
|
16940
|
+
}
|
|
16802
16941
|
function listLocalBranches(repo) {
|
|
16803
16942
|
if (!repo)
|
|
16804
16943
|
return [];
|
|
@@ -16896,7 +17035,8 @@ function NewTaskDialogView(props) {
|
|
|
16896
17035
|
} = useTheme();
|
|
16897
17036
|
const [field, setField] = createSignal("repo");
|
|
16898
17037
|
const [repo, setRepo] = createSignal(props.defaultRepo);
|
|
16899
|
-
const [baseRef, setBaseRef] = createSignal(DEFAULT_BASE_REF);
|
|
17038
|
+
const [baseRef, setBaseRef] = createSignal(getCurrentBranch(expandHome(props.defaultRepo.trim())) ?? DEFAULT_BASE_REF);
|
|
17039
|
+
const [baseRefTouched, setBaseRefTouched] = createSignal(false);
|
|
16900
17040
|
const repoOptions = createMemo(() => computeRepoOptions(props.defaultRepo, props.savedRepos));
|
|
16901
17041
|
const mode = createMemo(() => pickerModeFor(repo(), repoOptions()));
|
|
16902
17042
|
const subdirSplit = createMemo(() => splitPathForDirSuggest(repo()));
|
|
@@ -16914,6 +17054,16 @@ function NewTaskDialogView(props) {
|
|
|
16914
17054
|
branchFiltered();
|
|
16915
17055
|
setBranchCursor(0);
|
|
16916
17056
|
});
|
|
17057
|
+
createEffect(() => {
|
|
17058
|
+
const r = expandHome(repo().trim());
|
|
17059
|
+
if (!r)
|
|
17060
|
+
return;
|
|
17061
|
+
if (baseRefTouched())
|
|
17062
|
+
return;
|
|
17063
|
+
const current = getCurrentBranch(r);
|
|
17064
|
+
if (current)
|
|
17065
|
+
setBaseRef(current);
|
|
17066
|
+
});
|
|
16917
17067
|
createEffect(() => {
|
|
16918
17068
|
activeList();
|
|
16919
17069
|
setRepoCursor(0);
|
|
@@ -16945,7 +17095,7 @@ function NewTaskDialogView(props) {
|
|
|
16945
17095
|
const picked2 = activeList()[0];
|
|
16946
17096
|
if (picked2) {
|
|
16947
17097
|
setRepo(picked2);
|
|
16948
|
-
|
|
17098
|
+
setField("baseRef");
|
|
16949
17099
|
return;
|
|
16950
17100
|
}
|
|
16951
17101
|
}
|
|
@@ -16964,16 +17114,16 @@ function NewTaskDialogView(props) {
|
|
|
16964
17114
|
return;
|
|
16965
17115
|
}
|
|
16966
17116
|
}
|
|
16967
|
-
|
|
17117
|
+
setField("baseRef");
|
|
16968
17118
|
return;
|
|
16969
17119
|
}
|
|
16970
17120
|
const picked = activeList()[repoCursor()];
|
|
16971
17121
|
if (picked) {
|
|
16972
17122
|
setRepo(picked);
|
|
16973
|
-
|
|
17123
|
+
setField("baseRef");
|
|
16974
17124
|
return;
|
|
16975
17125
|
}
|
|
16976
|
-
|
|
17126
|
+
setField("baseRef");
|
|
16977
17127
|
}
|
|
16978
17128
|
function selectRepoAtMouse(absoluteIndex) {
|
|
16979
17129
|
const list = activeList();
|
|
@@ -17030,8 +17180,15 @@ function NewTaskDialogView(props) {
|
|
|
17030
17180
|
}
|
|
17031
17181
|
}]
|
|
17032
17182
|
}));
|
|
17183
|
+
useBindings(() => ({
|
|
17184
|
+
enabled: field() === "confirm",
|
|
17185
|
+
bindings: [{
|
|
17186
|
+
key: "return",
|
|
17187
|
+
cmd: () => commit()
|
|
17188
|
+
}]
|
|
17189
|
+
}));
|
|
17033
17190
|
return (() => {
|
|
17034
|
-
var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$7 = createElement("box"), _el$8 = createElement("text"), _el$0 = createElement("input"), _el$18 = createElement("box"), _el$19 = createElement("text"), _el$21 = createElement("input"), _el$31 = createElement("box"), _el$32 = createElement("text");
|
|
17191
|
+
var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$7 = createElement("box"), _el$8 = createElement("text"), _el$0 = createElement("input"), _el$18 = createElement("box"), _el$19 = createElement("text"), _el$21 = createElement("input"), _el$31 = createElement("box"), _el$32 = createElement("text"), _el$34 = createElement("text");
|
|
17035
17192
|
insertNode(_el$, _el$2);
|
|
17036
17193
|
insertNode(_el$, _el$7);
|
|
17037
17194
|
insertNode(_el$, _el$18);
|
|
@@ -17090,23 +17247,23 @@ function NewTaskDialogView(props) {
|
|
|
17090
17247
|
const suffix = () => mode() === "browse" ? "/" : "";
|
|
17091
17248
|
const tag = () => isCurrentDir() ? " (current dir)" : "";
|
|
17092
17249
|
return (() => {
|
|
17093
|
-
var _el$
|
|
17094
|
-
setProp(_el$
|
|
17095
|
-
setProp(_el$
|
|
17096
|
-
insert(_el$
|
|
17097
|
-
insert(_el$
|
|
17098
|
-
insert(_el$
|
|
17099
|
-
insert(_el$
|
|
17250
|
+
var _el$35 = createElement("text");
|
|
17251
|
+
setProp(_el$35, "wrapMode", "none");
|
|
17252
|
+
setProp(_el$35, "onMouseUp", () => selectRepoAtMouse(absoluteIndex()));
|
|
17253
|
+
insert(_el$35, () => isCursor() ? "\u25B8 " : " ", null);
|
|
17254
|
+
insert(_el$35, name, null);
|
|
17255
|
+
insert(_el$35, suffix, null);
|
|
17256
|
+
insert(_el$35, tag, null);
|
|
17100
17257
|
effect((_p$) => {
|
|
17101
|
-
var _v$
|
|
17102
|
-
_v$
|
|
17103
|
-
_v$
|
|
17258
|
+
var _v$12 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$13 = isCursor() ? TextAttributes19.BOLD : undefined;
|
|
17259
|
+
_v$12 !== _p$.e && (_p$.e = setProp(_el$35, "fg", _v$12, _p$.e));
|
|
17260
|
+
_v$13 !== _p$.t && (_p$.t = setProp(_el$35, "attributes", _v$13, _p$.t));
|
|
17104
17261
|
return _p$;
|
|
17105
17262
|
}, {
|
|
17106
17263
|
e: undefined,
|
|
17107
17264
|
t: undefined
|
|
17108
17265
|
});
|
|
17109
|
-
return _el$
|
|
17266
|
+
return _el$35;
|
|
17110
17267
|
})();
|
|
17111
17268
|
}
|
|
17112
17269
|
}), null);
|
|
@@ -17144,10 +17301,14 @@ function NewTaskDialogView(props) {
|
|
|
17144
17301
|
setProp(_el$18, "gap", 0);
|
|
17145
17302
|
insertNode(_el$19, createTextNode(`from branch`));
|
|
17146
17303
|
setProp(_el$21, "placeholder", DEFAULT_BASE_REF);
|
|
17147
|
-
setProp(_el$21, "onInput", (v) =>
|
|
17304
|
+
setProp(_el$21, "onInput", (v) => {
|
|
17305
|
+
setBaseRefTouched(true);
|
|
17306
|
+
setBaseRef(stripNewlines(v));
|
|
17307
|
+
});
|
|
17148
17308
|
setProp(_el$21, "onSubmit", () => {
|
|
17149
17309
|
setBaseRef(resolveBaseRef(baseRef(), branchFiltered(), branchCursor()));
|
|
17150
|
-
|
|
17310
|
+
setBaseRefTouched(true);
|
|
17311
|
+
setField("confirm");
|
|
17151
17312
|
});
|
|
17152
17313
|
insert(_el$, createComponent2(Show, {
|
|
17153
17314
|
get when() {
|
|
@@ -17197,25 +17358,26 @@ function NewTaskDialogView(props) {
|
|
|
17197
17358
|
const isCursor = () => absoluteIndex() === branchCursor();
|
|
17198
17359
|
const isSelected = () => baseRef().trim() === name;
|
|
17199
17360
|
return (() => {
|
|
17200
|
-
var _el$
|
|
17201
|
-
setProp(_el$
|
|
17202
|
-
setProp(_el$
|
|
17361
|
+
var _el$36 = createElement("text");
|
|
17362
|
+
setProp(_el$36, "wrapMode", "none");
|
|
17363
|
+
setProp(_el$36, "onMouseUp", () => {
|
|
17203
17364
|
setBaseRef(name);
|
|
17365
|
+
setBaseRefTouched(true);
|
|
17204
17366
|
setBranchCursor(absoluteIndex());
|
|
17205
|
-
|
|
17367
|
+
setField("confirm");
|
|
17206
17368
|
});
|
|
17207
|
-
insert(_el$
|
|
17208
|
-
insert(_el$
|
|
17369
|
+
insert(_el$36, () => isCursor() ? "\u25B8 " : " ", null);
|
|
17370
|
+
insert(_el$36, name, null);
|
|
17209
17371
|
effect((_p$) => {
|
|
17210
|
-
var _v$
|
|
17211
|
-
_v$
|
|
17212
|
-
_v$
|
|
17372
|
+
var _v$14 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$15 = isCursor() ? TextAttributes19.BOLD : undefined;
|
|
17373
|
+
_v$14 !== _p$.e && (_p$.e = setProp(_el$36, "fg", _v$14, _p$.e));
|
|
17374
|
+
_v$15 !== _p$.t && (_p$.t = setProp(_el$36, "attributes", _v$15, _p$.t));
|
|
17213
17375
|
return _p$;
|
|
17214
17376
|
}, {
|
|
17215
17377
|
e: undefined,
|
|
17216
17378
|
t: undefined
|
|
17217
17379
|
});
|
|
17218
|
-
return _el$
|
|
17380
|
+
return _el$36;
|
|
17219
17381
|
})();
|
|
17220
17382
|
}
|
|
17221
17383
|
}), null);
|
|
@@ -17237,10 +17399,15 @@ function NewTaskDialogView(props) {
|
|
|
17237
17399
|
}
|
|
17238
17400
|
}), _el$31);
|
|
17239
17401
|
insertNode(_el$31, _el$32);
|
|
17402
|
+
insertNode(_el$31, _el$34);
|
|
17403
|
+
setProp(_el$31, "flexDirection", "row");
|
|
17404
|
+
setProp(_el$31, "justifyContent", "space-between");
|
|
17240
17405
|
setProp(_el$31, "paddingBottom", 1);
|
|
17241
17406
|
insertNode(_el$32, createTextNode(`\u2191\u2193 pick \xB7 enter select \xB7 tab next field \xB7 esc cancel`));
|
|
17407
|
+
setProp(_el$34, "onMouseUp", () => commit());
|
|
17408
|
+
insert(_el$34, () => field() === "confirm" ? "\u25B8 [ Create ]" : " [ Create ]");
|
|
17242
17409
|
effect((_p$) => {
|
|
17243
|
-
var _v$ = TextAttributes19.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = field() === "repo" ? theme.accent : theme.textMuted, _v$5 = repo(), _v$6 = props.defaultRepo, _v$7 = field() === "repo", _v$8 = field() === "baseRef" ? theme.accent : theme.textMuted, _v$9 = baseRef(), _v$0 = field() === "baseRef", _v$1 = theme.textMuted;
|
|
17410
|
+
var _v$ = TextAttributes19.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = field() === "repo" ? theme.accent : theme.textMuted, _v$5 = repo(), _v$6 = props.defaultRepo, _v$7 = field() === "repo", _v$8 = field() === "baseRef" ? theme.accent : theme.textMuted, _v$9 = baseRef(), _v$0 = field() === "baseRef", _v$1 = theme.textMuted, _v$10 = field() === "confirm" ? theme.primary : theme.text, _v$11 = field() === "confirm" ? TextAttributes19.BOLD : undefined;
|
|
17244
17411
|
_v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
|
|
17245
17412
|
_v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
|
|
17246
17413
|
_v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
|
|
@@ -17252,6 +17419,8 @@ function NewTaskDialogView(props) {
|
|
|
17252
17419
|
_v$9 !== _p$.r && (_p$.r = setProp(_el$21, "value", _v$9, _p$.r));
|
|
17253
17420
|
_v$0 !== _p$.d && (_p$.d = setProp(_el$21, "focused", _v$0, _p$.d));
|
|
17254
17421
|
_v$1 !== _p$.l && (_p$.l = setProp(_el$32, "fg", _v$1, _p$.l));
|
|
17422
|
+
_v$10 !== _p$.u && (_p$.u = setProp(_el$34, "fg", _v$10, _p$.u));
|
|
17423
|
+
_v$11 !== _p$.c && (_p$.c = setProp(_el$34, "attributes", _v$11, _p$.c));
|
|
17255
17424
|
return _p$;
|
|
17256
17425
|
}, {
|
|
17257
17426
|
e: undefined,
|
|
@@ -17264,7 +17433,9 @@ function NewTaskDialogView(props) {
|
|
|
17264
17433
|
h: undefined,
|
|
17265
17434
|
r: undefined,
|
|
17266
17435
|
d: undefined,
|
|
17267
|
-
l: undefined
|
|
17436
|
+
l: undefined,
|
|
17437
|
+
u: undefined,
|
|
17438
|
+
c: undefined
|
|
17268
17439
|
});
|
|
17269
17440
|
return _el$;
|
|
17270
17441
|
})();
|
|
@@ -17409,11 +17580,17 @@ var init_rename_task_dialog = __esm(() => {
|
|
|
17409
17580
|
function useTaskActions(deps) {
|
|
17410
17581
|
const { orchestrator, dialog, kv, selectedId, setSelectedId, setFocusedPane, savedRepos } = deps;
|
|
17411
17582
|
async function openNewTaskFlow() {
|
|
17412
|
-
const
|
|
17583
|
+
const defaultRepo = (() => {
|
|
17584
|
+
const sid = selectedId();
|
|
17585
|
+
if (sid) {
|
|
17586
|
+
const task = orchestrator.getTask(sid);
|
|
17587
|
+
if (task?.repo?.trim())
|
|
17588
|
+
return task.repo;
|
|
17589
|
+
}
|
|
17413
17590
|
const raw = kv.get("lastNewTaskRepo");
|
|
17414
17591
|
return typeof raw === "string" && raw.trim() ? raw : process.cwd();
|
|
17415
17592
|
})();
|
|
17416
|
-
const result = await NewTaskDialog.show(dialog,
|
|
17593
|
+
const result = await NewTaskDialog.show(dialog, defaultRepo, savedRepos());
|
|
17417
17594
|
if (!result)
|
|
17418
17595
|
return;
|
|
17419
17596
|
try {
|
|
@@ -17956,7 +18133,7 @@ var init_history2 = __esm(() => {
|
|
|
17956
18133
|
});
|
|
17957
18134
|
|
|
17958
18135
|
// src/tui/panes/chat/composer/image-paste.ts
|
|
17959
|
-
import { randomUUID } from "crypto";
|
|
18136
|
+
import { randomUUID as randomUUID2 } from "crypto";
|
|
17960
18137
|
import { mkdirSync as mkdirSync5, writeFileSync as writeFileSync4 } from "fs";
|
|
17961
18138
|
import { join as join13 } from "path";
|
|
17962
18139
|
function pastedImagesDir() {
|
|
@@ -18040,7 +18217,7 @@ function mimeTypeToExt(mimeType) {
|
|
|
18040
18217
|
return ".png";
|
|
18041
18218
|
}
|
|
18042
18219
|
function mintPath(ext) {
|
|
18043
|
-
return join13(pastedImagesDir(), `${
|
|
18220
|
+
return join13(pastedImagesDir(), `${randomUUID2()}${ext}`);
|
|
18044
18221
|
}
|
|
18045
18222
|
var IMAGE_TOKEN_RE;
|
|
18046
18223
|
var init_image_paste = __esm(() => {
|
|
@@ -18642,9 +18819,9 @@ function Composer(props) {
|
|
|
18642
18819
|
return theme.border;
|
|
18643
18820
|
};
|
|
18644
18821
|
return (() => {
|
|
18645
|
-
var _el$ = createElement("box"), _el$14 = createElement("box"), _el$15 = createElement("box"), _el$
|
|
18822
|
+
var _el$ = createElement("box"), _el$14 = createElement("box"), _el$15 = createElement("box"), _el$21 = createElement("box"), _el$22 = createElement("text"), _el$23 = createElement("box"), _el$30 = createElement("box"), _el$31 = createElement("box");
|
|
18646
18823
|
insertNode(_el$, _el$14);
|
|
18647
|
-
insertNode(_el$, _el$
|
|
18824
|
+
insertNode(_el$, _el$30);
|
|
18648
18825
|
setProp(_el$, "flexShrink", 0);
|
|
18649
18826
|
setProp(_el$, "flexDirection", "column");
|
|
18650
18827
|
setProp(_el$, "paddingTop", 1);
|
|
@@ -18691,35 +18868,35 @@ function Composer(props) {
|
|
|
18691
18868
|
return idx >= 0 ? match.displayPath.slice(0, idx) : "";
|
|
18692
18869
|
};
|
|
18693
18870
|
return (() => {
|
|
18694
|
-
var _el$
|
|
18695
|
-
insertNode(_el$
|
|
18696
|
-
setProp(_el$
|
|
18697
|
-
setProp(_el$
|
|
18698
|
-
setProp(_el$
|
|
18699
|
-
insert(_el$
|
|
18700
|
-
insert(_el$
|
|
18701
|
-
insert(_el$
|
|
18871
|
+
var _el$32 = createElement("box"), _el$33 = createElement("text");
|
|
18872
|
+
insertNode(_el$32, _el$33);
|
|
18873
|
+
setProp(_el$32, "flexDirection", "row");
|
|
18874
|
+
setProp(_el$32, "gap", 2);
|
|
18875
|
+
setProp(_el$33, "wrapMode", "none");
|
|
18876
|
+
insert(_el$33, () => active() ? "\u25B8 " : " ", null);
|
|
18877
|
+
insert(_el$33, filename, null);
|
|
18878
|
+
insert(_el$32, createComponent2(Show, {
|
|
18702
18879
|
get when() {
|
|
18703
18880
|
return directory().length > 0;
|
|
18704
18881
|
},
|
|
18705
18882
|
get children() {
|
|
18706
|
-
var _el$
|
|
18707
|
-
setProp(_el$
|
|
18708
|
-
insert(_el$
|
|
18709
|
-
effect((_$p) => setProp(_el$
|
|
18710
|
-
return _el$
|
|
18883
|
+
var _el$34 = createElement("text");
|
|
18884
|
+
setProp(_el$34, "wrapMode", "none");
|
|
18885
|
+
insert(_el$34, directory);
|
|
18886
|
+
effect((_$p) => setProp(_el$34, "fg", theme.textMuted, _$p));
|
|
18887
|
+
return _el$34;
|
|
18711
18888
|
}
|
|
18712
18889
|
}), null);
|
|
18713
18890
|
effect((_p$) => {
|
|
18714
|
-
var _v$
|
|
18715
|
-
_v$
|
|
18716
|
-
_v$
|
|
18891
|
+
var _v$23 = active() ? theme.primary : theme.text, _v$24 = active() ? TextAttributes22.BOLD : undefined;
|
|
18892
|
+
_v$23 !== _p$.e && (_p$.e = setProp(_el$33, "fg", _v$23, _p$.e));
|
|
18893
|
+
_v$24 !== _p$.t && (_p$.t = setProp(_el$33, "attributes", _v$24, _p$.t));
|
|
18717
18894
|
return _p$;
|
|
18718
18895
|
}, {
|
|
18719
18896
|
e: undefined,
|
|
18720
18897
|
t: undefined
|
|
18721
18898
|
});
|
|
18722
|
-
return _el$
|
|
18899
|
+
return _el$32;
|
|
18723
18900
|
})();
|
|
18724
18901
|
}
|
|
18725
18902
|
}), null);
|
|
@@ -18786,47 +18963,47 @@ function Composer(props) {
|
|
|
18786
18963
|
const absoluteIndex = () => slashWindow().start + i();
|
|
18787
18964
|
const active = () => absoluteIndex() === slashCursor();
|
|
18788
18965
|
return (() => {
|
|
18789
|
-
var _el$
|
|
18790
|
-
insertNode(_el$
|
|
18791
|
-
setProp(_el$
|
|
18792
|
-
setProp(_el$
|
|
18793
|
-
setProp(_el$
|
|
18794
|
-
insert(_el$
|
|
18795
|
-
insert(_el$
|
|
18796
|
-
insert(_el$
|
|
18966
|
+
var _el$35 = createElement("box"), _el$36 = createElement("text");
|
|
18967
|
+
insertNode(_el$35, _el$36);
|
|
18968
|
+
setProp(_el$35, "flexDirection", "row");
|
|
18969
|
+
setProp(_el$35, "gap", 2);
|
|
18970
|
+
setProp(_el$36, "wrapMode", "none");
|
|
18971
|
+
insert(_el$36, () => active() ? "\u25B8 " : " ", null);
|
|
18972
|
+
insert(_el$36, () => entry.display, null);
|
|
18973
|
+
insert(_el$35, createComponent2(Show, {
|
|
18797
18974
|
get when() {
|
|
18798
18975
|
return entry.source === "user";
|
|
18799
18976
|
},
|
|
18800
18977
|
get children() {
|
|
18801
|
-
var _el$
|
|
18802
|
-
insertNode(_el$
|
|
18803
|
-
setProp(_el$
|
|
18804
|
-
effect((_$p) => setProp(_el$
|
|
18805
|
-
return _el$
|
|
18978
|
+
var _el$37 = createElement("text");
|
|
18979
|
+
insertNode(_el$37, createTextNode(`user`));
|
|
18980
|
+
setProp(_el$37, "wrapMode", "none");
|
|
18981
|
+
effect((_$p) => setProp(_el$37, "fg", theme.textMuted, _$p));
|
|
18982
|
+
return _el$37;
|
|
18806
18983
|
}
|
|
18807
18984
|
}), null);
|
|
18808
|
-
insert(_el$
|
|
18985
|
+
insert(_el$35, createComponent2(Show, {
|
|
18809
18986
|
get when() {
|
|
18810
18987
|
return entry.description;
|
|
18811
18988
|
},
|
|
18812
18989
|
get children() {
|
|
18813
|
-
var _el$
|
|
18814
|
-
setProp(_el$
|
|
18815
|
-
insert(_el$
|
|
18816
|
-
effect((_$p) => setProp(_el$
|
|
18817
|
-
return _el$
|
|
18990
|
+
var _el$39 = createElement("text");
|
|
18991
|
+
setProp(_el$39, "wrapMode", "none");
|
|
18992
|
+
insert(_el$39, () => entry.description);
|
|
18993
|
+
effect((_$p) => setProp(_el$39, "fg", theme.textMuted, _$p));
|
|
18994
|
+
return _el$39;
|
|
18818
18995
|
}
|
|
18819
18996
|
}), null);
|
|
18820
18997
|
effect((_p$) => {
|
|
18821
|
-
var _v$
|
|
18822
|
-
_v$
|
|
18823
|
-
_v$
|
|
18998
|
+
var _v$25 = active() ? theme.primary : theme.text, _v$26 = active() ? TextAttributes22.BOLD : undefined;
|
|
18999
|
+
_v$25 !== _p$.e && (_p$.e = setProp(_el$36, "fg", _v$25, _p$.e));
|
|
19000
|
+
_v$26 !== _p$.t && (_p$.t = setProp(_el$36, "attributes", _v$26, _p$.t));
|
|
18824
19001
|
return _p$;
|
|
18825
19002
|
}, {
|
|
18826
19003
|
e: undefined,
|
|
18827
19004
|
t: undefined
|
|
18828
19005
|
});
|
|
18829
|
-
return _el$
|
|
19006
|
+
return _el$35;
|
|
18830
19007
|
})();
|
|
18831
19008
|
}
|
|
18832
19009
|
}), null);
|
|
@@ -18860,37 +19037,125 @@ function Composer(props) {
|
|
|
18860
19037
|
}), _el$14);
|
|
18861
19038
|
insertNode(_el$14, _el$15);
|
|
18862
19039
|
setProp(_el$14, "border", ["left"]);
|
|
18863
|
-
insertNode(_el$15, _el$
|
|
19040
|
+
insertNode(_el$15, _el$21);
|
|
18864
19041
|
setProp(_el$15, "paddingLeft", 2);
|
|
18865
19042
|
setProp(_el$15, "paddingRight", 2);
|
|
18866
19043
|
setProp(_el$15, "paddingTop", 1);
|
|
18867
19044
|
setProp(_el$15, "paddingBottom", 0);
|
|
18868
19045
|
setProp(_el$15, "flexDirection", "column");
|
|
18869
19046
|
setProp(_el$15, "flexGrow", 1);
|
|
18870
|
-
|
|
18871
|
-
|
|
18872
|
-
|
|
18873
|
-
|
|
18874
|
-
|
|
18875
|
-
|
|
18876
|
-
|
|
18877
|
-
|
|
18878
|
-
|
|
18879
|
-
|
|
18880
|
-
|
|
19047
|
+
insert(_el$15, createComponent2(Show, {
|
|
19048
|
+
get when() {
|
|
19049
|
+
return (props.queue?.() ?? []).length > 0;
|
|
19050
|
+
},
|
|
19051
|
+
get children() {
|
|
19052
|
+
var _el$16 = createElement("box");
|
|
19053
|
+
setProp(_el$16, "flexDirection", "column");
|
|
19054
|
+
setProp(_el$16, "paddingBottom", 1);
|
|
19055
|
+
insert(_el$16, createComponent2(For, {
|
|
19056
|
+
get each() {
|
|
19057
|
+
return (props.queue?.() ?? []).slice(0, QUEUE_VISIBLE_CAP);
|
|
19058
|
+
},
|
|
19059
|
+
children: (entry, idx) => (() => {
|
|
19060
|
+
var _el$40 = createElement("box"), _el$41 = createElement("text"), _el$43 = createElement("text"), _el$44 = createTextNode(`queued`), _el$45 = createTextNode(`:`), _el$46 = createElement("box"), _el$47 = createElement("text"), _el$48 = createElement("text"), _el$50 = createElement("text");
|
|
19061
|
+
insertNode(_el$40, _el$41);
|
|
19062
|
+
insertNode(_el$40, _el$43);
|
|
19063
|
+
insertNode(_el$40, _el$46);
|
|
19064
|
+
insertNode(_el$40, _el$48);
|
|
19065
|
+
insertNode(_el$40, _el$50);
|
|
19066
|
+
setProp(_el$40, "flexDirection", "row");
|
|
19067
|
+
setProp(_el$40, "gap", 1);
|
|
19068
|
+
setProp(_el$40, "alignItems", "flex-start");
|
|
19069
|
+
insertNode(_el$41, createTextNode(`+`));
|
|
19070
|
+
insertNode(_el$43, _el$44);
|
|
19071
|
+
insertNode(_el$43, _el$45);
|
|
19072
|
+
setProp(_el$43, "wrapMode", "none");
|
|
19073
|
+
insert(_el$43, () => idx() === 0 ? " (next)" : "", _el$45);
|
|
19074
|
+
insertNode(_el$46, _el$47);
|
|
19075
|
+
setProp(_el$46, "flexGrow", 1);
|
|
19076
|
+
insert(_el$47, () => entry.text);
|
|
19077
|
+
insertNode(_el$48, createTextNode(`[\u25B6]`));
|
|
19078
|
+
setProp(_el$48, "onMouseUp", () => props.onSendQueuedNow?.(entry.id));
|
|
19079
|
+
insertNode(_el$50, createTextNode(`[x]`));
|
|
19080
|
+
setProp(_el$50, "onMouseUp", () => props.onCancelQueued?.(entry.id));
|
|
19081
|
+
effect((_p$) => {
|
|
19082
|
+
var _v$27 = theme.textMuted, _v$28 = TextAttributes22.BOLD, _v$29 = theme.textMuted, _v$30 = theme.text, _v$31 = theme.primary, _v$32 = TextAttributes22.BOLD, _v$33 = theme.error, _v$34 = TextAttributes22.BOLD;
|
|
19083
|
+
_v$27 !== _p$.e && (_p$.e = setProp(_el$41, "fg", _v$27, _p$.e));
|
|
19084
|
+
_v$28 !== _p$.t && (_p$.t = setProp(_el$41, "attributes", _v$28, _p$.t));
|
|
19085
|
+
_v$29 !== _p$.a && (_p$.a = setProp(_el$43, "fg", _v$29, _p$.a));
|
|
19086
|
+
_v$30 !== _p$.o && (_p$.o = setProp(_el$47, "fg", _v$30, _p$.o));
|
|
19087
|
+
_v$31 !== _p$.i && (_p$.i = setProp(_el$48, "fg", _v$31, _p$.i));
|
|
19088
|
+
_v$32 !== _p$.n && (_p$.n = setProp(_el$48, "attributes", _v$32, _p$.n));
|
|
19089
|
+
_v$33 !== _p$.s && (_p$.s = setProp(_el$50, "fg", _v$33, _p$.s));
|
|
19090
|
+
_v$34 !== _p$.h && (_p$.h = setProp(_el$50, "attributes", _v$34, _p$.h));
|
|
19091
|
+
return _p$;
|
|
19092
|
+
}, {
|
|
19093
|
+
e: undefined,
|
|
19094
|
+
t: undefined,
|
|
19095
|
+
a: undefined,
|
|
19096
|
+
o: undefined,
|
|
19097
|
+
i: undefined,
|
|
19098
|
+
n: undefined,
|
|
19099
|
+
s: undefined,
|
|
19100
|
+
h: undefined
|
|
19101
|
+
});
|
|
19102
|
+
return _el$40;
|
|
19103
|
+
})()
|
|
19104
|
+
}), null);
|
|
19105
|
+
insert(_el$16, createComponent2(Show, {
|
|
19106
|
+
get when() {
|
|
19107
|
+
return (props.queue?.() ?? []).length > QUEUE_VISIBLE_CAP;
|
|
19108
|
+
},
|
|
19109
|
+
get children() {
|
|
19110
|
+
var _el$17 = createElement("box"), _el$18 = createElement("text"), _el$20 = createElement("text");
|
|
19111
|
+
insertNode(_el$17, _el$18);
|
|
19112
|
+
insertNode(_el$17, _el$20);
|
|
19113
|
+
setProp(_el$17, "flexDirection", "row");
|
|
19114
|
+
setProp(_el$17, "gap", 1);
|
|
19115
|
+
setProp(_el$17, "alignItems", "flex-start");
|
|
19116
|
+
insertNode(_el$18, createTextNode(`+`));
|
|
19117
|
+
insert(_el$20, () => `\u2026 ${(props.queue?.() ?? []).length - QUEUE_VISIBLE_CAP} more queued`);
|
|
19118
|
+
effect((_p$) => {
|
|
19119
|
+
var _v$7 = theme.textMuted, _v$8 = TextAttributes22.BOLD, _v$9 = theme.textMuted;
|
|
19120
|
+
_v$7 !== _p$.e && (_p$.e = setProp(_el$18, "fg", _v$7, _p$.e));
|
|
19121
|
+
_v$8 !== _p$.t && (_p$.t = setProp(_el$18, "attributes", _v$8, _p$.t));
|
|
19122
|
+
_v$9 !== _p$.a && (_p$.a = setProp(_el$20, "fg", _v$9, _p$.a));
|
|
19123
|
+
return _p$;
|
|
19124
|
+
}, {
|
|
19125
|
+
e: undefined,
|
|
19126
|
+
t: undefined,
|
|
19127
|
+
a: undefined
|
|
19128
|
+
});
|
|
19129
|
+
return _el$17;
|
|
19130
|
+
}
|
|
19131
|
+
}), null);
|
|
19132
|
+
return _el$16;
|
|
19133
|
+
}
|
|
19134
|
+
}), _el$21);
|
|
19135
|
+
insertNode(_el$21, _el$22);
|
|
19136
|
+
insertNode(_el$21, _el$23);
|
|
19137
|
+
setProp(_el$21, "flexDirection", "row");
|
|
19138
|
+
setProp(_el$21, "gap", 1);
|
|
19139
|
+
setProp(_el$21, "alignItems", "flex-start");
|
|
19140
|
+
insert(_el$22, () => props.isStreaming ? "\u2026" : ">");
|
|
19141
|
+
setProp(_el$23, "flexGrow", 1);
|
|
19142
|
+
setProp(_el$23, "flexShrink", 1);
|
|
19143
|
+
setProp(_el$23, "maxHeight", 8);
|
|
19144
|
+
setProp(_el$23, "minHeight", 1);
|
|
19145
|
+
insert(_el$23, createComponent2(Show, {
|
|
18881
19146
|
get when() {
|
|
18882
19147
|
return props.hasTask;
|
|
18883
19148
|
},
|
|
18884
19149
|
get fallback() {
|
|
18885
19150
|
return (() => {
|
|
18886
|
-
var _el$
|
|
18887
|
-
insert(_el$
|
|
18888
|
-
effect((_$p) => setProp(_el$
|
|
18889
|
-
return _el$
|
|
19151
|
+
var _el$52 = createElement("text");
|
|
19152
|
+
insert(_el$52, () => props.noTaskMessage ?? "(no task \u2014 press n to create)");
|
|
19153
|
+
effect((_$p) => setProp(_el$52, "fg", theme.textMuted, _$p));
|
|
19154
|
+
return _el$52;
|
|
18890
19155
|
})();
|
|
18891
19156
|
},
|
|
18892
19157
|
get children() {
|
|
18893
|
-
var _el$
|
|
19158
|
+
var _el$24 = createElement("textarea");
|
|
18894
19159
|
use((r) => {
|
|
18895
19160
|
textareaRef = r;
|
|
18896
19161
|
if (props.draft)
|
|
@@ -18898,23 +19163,23 @@ function Composer(props) {
|
|
|
18898
19163
|
r.onPaste = handlePaste;
|
|
18899
19164
|
if (props.focused?.())
|
|
18900
19165
|
r.focus();
|
|
18901
|
-
}, _el$
|
|
18902
|
-
setProp(_el$
|
|
18903
|
-
setProp(_el$
|
|
18904
|
-
setProp(_el$
|
|
18905
|
-
setProp(_el$
|
|
18906
|
-
setProp(_el$
|
|
19166
|
+
}, _el$24);
|
|
19167
|
+
setProp(_el$24, "wrapMode", "word");
|
|
19168
|
+
setProp(_el$24, "keyBindings", composerKeyBindings);
|
|
19169
|
+
setProp(_el$24, "onContentChange", handleContentChange);
|
|
19170
|
+
setProp(_el$24, "onKeyDown", handleKeyDown);
|
|
19171
|
+
setProp(_el$24, "onSubmit", () => handleSubmit("auto"));
|
|
18907
19172
|
effect((_p$) => {
|
|
18908
|
-
var _v$
|
|
19173
|
+
var _v$0 = resolvePlaceholder({
|
|
18909
19174
|
isStreaming: props.isStreaming,
|
|
18910
19175
|
hasTask: props.hasTask,
|
|
18911
19176
|
noTaskMessage: props.noTaskMessage
|
|
18912
|
-
}), _v$
|
|
18913
|
-
_v$
|
|
18914
|
-
_v$
|
|
18915
|
-
_v$
|
|
18916
|
-
_v$
|
|
18917
|
-
_v$
|
|
19177
|
+
}), _v$1 = theme.textMuted, _v$10 = theme.text, _v$11 = theme.backgroundElement, _v$12 = theme.backgroundElement;
|
|
19178
|
+
_v$0 !== _p$.e && (_p$.e = setProp(_el$24, "placeholder", _v$0, _p$.e));
|
|
19179
|
+
_v$1 !== _p$.t && (_p$.t = setProp(_el$24, "placeholderColor", _v$1, _p$.t));
|
|
19180
|
+
_v$10 !== _p$.a && (_p$.a = setProp(_el$24, "textColor", _v$10, _p$.a));
|
|
19181
|
+
_v$11 !== _p$.o && (_p$.o = setProp(_el$24, "backgroundColor", _v$11, _p$.o));
|
|
19182
|
+
_v$12 !== _p$.i && (_p$.i = setProp(_el$24, "focusedBackgroundColor", _v$12, _p$.i));
|
|
18918
19183
|
return _p$;
|
|
18919
19184
|
}, {
|
|
18920
19185
|
e: undefined,
|
|
@@ -18923,7 +19188,7 @@ function Composer(props) {
|
|
|
18923
19188
|
o: undefined,
|
|
18924
19189
|
i: undefined
|
|
18925
19190
|
});
|
|
18926
|
-
return _el$
|
|
19191
|
+
return _el$24;
|
|
18927
19192
|
}
|
|
18928
19193
|
}));
|
|
18929
19194
|
insert(_el$15, createComponent2(Show, {
|
|
@@ -18931,74 +19196,74 @@ function Composer(props) {
|
|
|
18931
19196
|
return props.hasTask;
|
|
18932
19197
|
},
|
|
18933
19198
|
get children() {
|
|
18934
|
-
var _el$
|
|
18935
|
-
insertNode(_el$
|
|
18936
|
-
insertNode(_el$
|
|
18937
|
-
setProp(_el$
|
|
18938
|
-
setProp(_el$
|
|
18939
|
-
setProp(_el$
|
|
18940
|
-
setProp(_el$
|
|
18941
|
-
setProp(_el$
|
|
18942
|
-
insert(_el$
|
|
18943
|
-
insertNode(_el$
|
|
18944
|
-
setProp(_el$
|
|
18945
|
-
setProp(_el$
|
|
18946
|
-
setProp(_el$
|
|
18947
|
-
insert(_el$
|
|
19199
|
+
var _el$25 = createElement("box"), _el$26 = createElement("text"), _el$27 = createElement("box"), _el$28 = createElement("box"), _el$29 = createElement("text");
|
|
19200
|
+
insertNode(_el$25, _el$26);
|
|
19201
|
+
insertNode(_el$25, _el$27);
|
|
19202
|
+
setProp(_el$25, "flexDirection", "row");
|
|
19203
|
+
setProp(_el$25, "justifyContent", "space-between");
|
|
19204
|
+
setProp(_el$25, "paddingTop", 1);
|
|
19205
|
+
setProp(_el$25, "flexShrink", 0);
|
|
19206
|
+
setProp(_el$26, "wrapMode", "none");
|
|
19207
|
+
insert(_el$26, footerHint);
|
|
19208
|
+
insertNode(_el$27, _el$28);
|
|
19209
|
+
setProp(_el$27, "flexDirection", "row");
|
|
19210
|
+
setProp(_el$27, "gap", 2);
|
|
19211
|
+
setProp(_el$27, "flexShrink", 0);
|
|
19212
|
+
insert(_el$27, createComponent2(Show, {
|
|
18948
19213
|
get when() {
|
|
18949
19214
|
return modeBadge();
|
|
18950
19215
|
},
|
|
18951
19216
|
children: (badge) => (() => {
|
|
18952
|
-
var _el$
|
|
18953
|
-
setProp(_el$
|
|
18954
|
-
insert(_el$
|
|
18955
|
-
effect((_$p) => setProp(_el$
|
|
18956
|
-
return _el$
|
|
19217
|
+
var _el$53 = createElement("text");
|
|
19218
|
+
setProp(_el$53, "wrapMode", "none");
|
|
19219
|
+
insert(_el$53, () => badge().label);
|
|
19220
|
+
effect((_$p) => setProp(_el$53, "fg", toneColor(badge().tone), _$p));
|
|
19221
|
+
return _el$53;
|
|
18957
19222
|
})()
|
|
18958
|
-
}), _el$
|
|
18959
|
-
insertNode(_el$
|
|
18960
|
-
setProp(_el$
|
|
18961
|
-
setProp(_el$
|
|
18962
|
-
setProp(_el$
|
|
18963
|
-
setProp(_el$
|
|
18964
|
-
insert(_el$
|
|
18965
|
-
insert(_el$
|
|
19223
|
+
}), _el$28);
|
|
19224
|
+
insertNode(_el$28, _el$29);
|
|
19225
|
+
setProp(_el$28, "flexDirection", "row");
|
|
19226
|
+
setProp(_el$28, "flexShrink", 0);
|
|
19227
|
+
setProp(_el$28, "onMouseUp", () => props.onChooseModel?.());
|
|
19228
|
+
setProp(_el$29, "wrapMode", "none");
|
|
19229
|
+
insert(_el$29, modelLabel, null);
|
|
19230
|
+
insert(_el$29, () => props.onChooseModel ? " \u25BE" : "", null);
|
|
18966
19231
|
effect((_p$) => {
|
|
18967
|
-
var _v$
|
|
18968
|
-
_v$
|
|
18969
|
-
_v$
|
|
19232
|
+
var _v$13 = props.isStreaming ? theme.accent : theme.textMuted, _v$14 = theme.textMuted;
|
|
19233
|
+
_v$13 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$13, _p$.e));
|
|
19234
|
+
_v$14 !== _p$.t && (_p$.t = setProp(_el$29, "fg", _v$14, _p$.t));
|
|
18970
19235
|
return _p$;
|
|
18971
19236
|
}, {
|
|
18972
19237
|
e: undefined,
|
|
18973
19238
|
t: undefined
|
|
18974
19239
|
});
|
|
18975
|
-
return _el$
|
|
19240
|
+
return _el$25;
|
|
18976
19241
|
}
|
|
18977
19242
|
}), null);
|
|
18978
|
-
insertNode(_el$
|
|
18979
|
-
setProp(_el$
|
|
18980
|
-
setProp(_el$
|
|
18981
|
-
setProp(_el$
|
|
18982
|
-
setProp(_el$
|
|
19243
|
+
insertNode(_el$30, _el$31);
|
|
19244
|
+
setProp(_el$30, "height", 1);
|
|
19245
|
+
setProp(_el$30, "border", ["left"]);
|
|
19246
|
+
setProp(_el$31, "height", 1);
|
|
19247
|
+
setProp(_el$31, "border", ["bottom"]);
|
|
18983
19248
|
effect((_p$) => {
|
|
18984
|
-
var _v$
|
|
19249
|
+
var _v$15 = railColor(), _v$16 = {
|
|
18985
19250
|
...SplitBorder.customBorderChars,
|
|
18986
19251
|
bottomLeft: "\u2579"
|
|
18987
|
-
}, _v$
|
|
19252
|
+
}, _v$17 = theme.backgroundElement, _v$18 = props.isStreaming ? theme.accent : theme.primary, _v$19 = railColor(), _v$20 = {
|
|
18988
19253
|
...EmptyBorder,
|
|
18989
19254
|
vertical: theme.backgroundElement.a !== 0 ? "\u2579" : " "
|
|
18990
|
-
}, _v$
|
|
19255
|
+
}, _v$21 = theme.backgroundElement, _v$22 = {
|
|
18991
19256
|
...EmptyBorder,
|
|
18992
19257
|
horizontal: theme.backgroundElement.a !== 0 ? "\u2580" : " "
|
|
18993
19258
|
};
|
|
18994
|
-
_v$
|
|
18995
|
-
_v$
|
|
18996
|
-
_v$
|
|
18997
|
-
_v$
|
|
18998
|
-
_v$
|
|
18999
|
-
_v$
|
|
19000
|
-
_v$
|
|
19001
|
-
_v$
|
|
19259
|
+
_v$15 !== _p$.e && (_p$.e = setProp(_el$14, "borderColor", _v$15, _p$.e));
|
|
19260
|
+
_v$16 !== _p$.t && (_p$.t = setProp(_el$14, "customBorderChars", _v$16, _p$.t));
|
|
19261
|
+
_v$17 !== _p$.a && (_p$.a = setProp(_el$15, "backgroundColor", _v$17, _p$.a));
|
|
19262
|
+
_v$18 !== _p$.o && (_p$.o = setProp(_el$22, "fg", _v$18, _p$.o));
|
|
19263
|
+
_v$19 !== _p$.i && (_p$.i = setProp(_el$30, "borderColor", _v$19, _p$.i));
|
|
19264
|
+
_v$20 !== _p$.n && (_p$.n = setProp(_el$30, "customBorderChars", _v$20, _p$.n));
|
|
19265
|
+
_v$21 !== _p$.s && (_p$.s = setProp(_el$31, "borderColor", _v$21, _p$.s));
|
|
19266
|
+
_v$22 !== _p$.h && (_p$.h = setProp(_el$31, "customBorderChars", _v$22, _p$.h));
|
|
19002
19267
|
return _p$;
|
|
19003
19268
|
}, {
|
|
19004
19269
|
e: undefined,
|
|
@@ -19013,6 +19278,7 @@ function Composer(props) {
|
|
|
19013
19278
|
return _el$;
|
|
19014
19279
|
})();
|
|
19015
19280
|
}
|
|
19281
|
+
var QUEUE_VISIBLE_CAP = 4;
|
|
19016
19282
|
var init_Composer = __esm(() => {
|
|
19017
19283
|
init_solid();
|
|
19018
19284
|
init_solid();
|
|
@@ -21723,6 +21989,81 @@ var init_user_slashes = () => {};
|
|
|
21723
21989
|
function totalContextTokens(u) {
|
|
21724
21990
|
return u.input_tokens + (u.cache_read_input_tokens ?? 0) + (u.cache_creation_input_tokens ?? 0);
|
|
21725
21991
|
}
|
|
21992
|
+
function parseTimestampMs(value) {
|
|
21993
|
+
const ms = new Date(value).getTime();
|
|
21994
|
+
return Number.isFinite(ms) ? ms : null;
|
|
21995
|
+
}
|
|
21996
|
+
function mergeIntervals(intervals) {
|
|
21997
|
+
if (intervals.length === 0)
|
|
21998
|
+
return [];
|
|
21999
|
+
const sorted = [...intervals].sort((a, b) => a.startMs - b.startMs);
|
|
22000
|
+
const first = sorted[0];
|
|
22001
|
+
if (!first)
|
|
22002
|
+
return [];
|
|
22003
|
+
const merged = [{ startMs: first.startMs, endMs: first.endMs }];
|
|
22004
|
+
for (let i = 1;i < sorted.length; i++) {
|
|
22005
|
+
const current = sorted[i];
|
|
22006
|
+
const last = merged[merged.length - 1];
|
|
22007
|
+
if (!current || !last)
|
|
22008
|
+
continue;
|
|
22009
|
+
if (current.startMs <= last.endMs) {
|
|
22010
|
+
last.endMs = Math.max(last.endMs, current.endMs);
|
|
22011
|
+
} else {
|
|
22012
|
+
merged.push({ startMs: current.startMs, endMs: current.endMs });
|
|
22013
|
+
}
|
|
22014
|
+
}
|
|
22015
|
+
return merged;
|
|
22016
|
+
}
|
|
22017
|
+
function durationMs(intervals) {
|
|
22018
|
+
return intervals.reduce((total, interval) => total + (interval.endMs - interval.startMs), 0);
|
|
22019
|
+
}
|
|
22020
|
+
function deriveUsageMetricsFromHistory(past) {
|
|
22021
|
+
let latestUsage;
|
|
22022
|
+
let latestUsageTimestampMs = null;
|
|
22023
|
+
let lastUserTimestampMs = null;
|
|
22024
|
+
let inputTokens = 0;
|
|
22025
|
+
let outputTokens = 0;
|
|
22026
|
+
const intervals = [];
|
|
22027
|
+
for (const message of past) {
|
|
22028
|
+
const timestampMs = parseTimestampMs(message.timestamp);
|
|
22029
|
+
if (message.role === "user" && timestampMs !== null) {
|
|
22030
|
+
lastUserTimestampMs = timestampMs;
|
|
22031
|
+
continue;
|
|
22032
|
+
}
|
|
22033
|
+
if (message.role !== "assistant" || !message.usage)
|
|
22034
|
+
continue;
|
|
22035
|
+
if (timestampMs !== null && (latestUsageTimestampMs === null || timestampMs > latestUsageTimestampMs)) {
|
|
22036
|
+
latestUsageTimestampMs = timestampMs;
|
|
22037
|
+
latestUsage = message.usage;
|
|
22038
|
+
} else if (latestUsage === undefined) {
|
|
22039
|
+
latestUsage = message.usage;
|
|
22040
|
+
}
|
|
22041
|
+
inputTokens += message.usage.input_tokens;
|
|
22042
|
+
outputTokens += message.usage.output_tokens;
|
|
22043
|
+
if (timestampMs !== null && lastUserTimestampMs !== null && timestampMs > lastUserTimestampMs) {
|
|
22044
|
+
intervals.push({ startMs: lastUserTimestampMs, endMs: timestampMs });
|
|
22045
|
+
}
|
|
22046
|
+
}
|
|
22047
|
+
if (!latestUsage)
|
|
22048
|
+
return;
|
|
22049
|
+
const totalDurationMs = durationMs(mergeIntervals(intervals));
|
|
22050
|
+
if (totalDurationMs <= 0)
|
|
22051
|
+
return latestUsage;
|
|
22052
|
+
return {
|
|
22053
|
+
...latestUsage,
|
|
22054
|
+
total_speed_tokens_per_second: (inputTokens + outputTokens) / (totalDurationMs / 1000)
|
|
22055
|
+
};
|
|
22056
|
+
}
|
|
22057
|
+
function withTotalSpeedForTurn(usage, startedAtIso, endedAtIso) {
|
|
22058
|
+
const startMs = startedAtIso ? parseTimestampMs(startedAtIso) : null;
|
|
22059
|
+
const endMs = parseTimestampMs(endedAtIso);
|
|
22060
|
+
if (startMs === null || endMs === null || endMs <= startMs)
|
|
22061
|
+
return usage;
|
|
22062
|
+
return {
|
|
22063
|
+
...usage,
|
|
22064
|
+
total_speed_tokens_per_second: (usage.input_tokens + usage.output_tokens) / ((endMs - startMs) / 1000)
|
|
22065
|
+
};
|
|
22066
|
+
}
|
|
21726
22067
|
function contextWindowTokensForModel(modelId) {
|
|
21727
22068
|
const id = modelId ?? resolveDefaultModelId();
|
|
21728
22069
|
if (id.includes("[1m]"))
|
|
@@ -21745,13 +22086,21 @@ function formatTokShort(n) {
|
|
|
21745
22086
|
return `${(n / 1000).toFixed(1)}k`;
|
|
21746
22087
|
return String(n);
|
|
21747
22088
|
}
|
|
22089
|
+
function formatTotalSpeed(tokensPerSecond) {
|
|
22090
|
+
if (typeof tokensPerSecond !== "number" || !Number.isFinite(tokensPerSecond))
|
|
22091
|
+
return null;
|
|
22092
|
+
if (tokensPerSecond >= 1000)
|
|
22093
|
+
return `${(tokensPerSecond / 1000).toFixed(1)}k t/s`;
|
|
22094
|
+
return `${tokensPerSecond.toFixed(1)} t/s`;
|
|
22095
|
+
}
|
|
21748
22096
|
function formatContextUsageCompact(u, modelId) {
|
|
21749
22097
|
const window = contextWindowTokensForModel(modelId);
|
|
21750
22098
|
const total = totalContextTokens(u);
|
|
21751
22099
|
if (total <= 0 || window <= 0)
|
|
21752
22100
|
return null;
|
|
21753
22101
|
const pct2 = Math.min(100, Math.max(0, Math.round(total / window * 100)));
|
|
21754
|
-
|
|
22102
|
+
const speed = formatTotalSpeed(u.total_speed_tokens_per_second);
|
|
22103
|
+
return [`${pct2}% \xB7 ${formatTokShort(total)}/${formatTokShort(window)}`, speed].filter(Boolean).join(" \xB7 ");
|
|
21755
22104
|
}
|
|
21756
22105
|
var LONG_CTX = 1e6, STD_CTX = 200000;
|
|
21757
22106
|
var init_context_meter = __esm(() => {
|
|
@@ -21803,14 +22152,7 @@ function setMessagesFromHistory(state, past) {
|
|
|
21803
22152
|
for (const m of past) {
|
|
21804
22153
|
appendRowsFromMessage(rows, toolIndexById, m);
|
|
21805
22154
|
}
|
|
21806
|
-
|
|
21807
|
-
for (let i = past.length - 1;i >= 0; i--) {
|
|
21808
|
-
const u = past[i]?.usage;
|
|
21809
|
-
if (u) {
|
|
21810
|
-
latestUsage = u;
|
|
21811
|
-
break;
|
|
21812
|
-
}
|
|
21813
|
-
}
|
|
22155
|
+
const latestUsage = deriveUsageMetricsFromHistory(past);
|
|
21814
22156
|
return {
|
|
21815
22157
|
...state,
|
|
21816
22158
|
messages: capMessages(rows, new Date().toISOString()),
|
|
@@ -21888,19 +22230,20 @@ function applyEvent(state, ev, nowIso = new Date().toISOString()) {
|
|
|
21888
22230
|
case "usage":
|
|
21889
22231
|
return {
|
|
21890
22232
|
...state,
|
|
21891
|
-
lastUsage: {
|
|
22233
|
+
lastUsage: withTotalSpeedForTurn({
|
|
21892
22234
|
input_tokens: ev.input_tokens,
|
|
21893
22235
|
output_tokens: ev.output_tokens,
|
|
21894
22236
|
cache_read_input_tokens: ev.cache_read_input_tokens,
|
|
21895
22237
|
cache_creation_input_tokens: ev.cache_creation_input_tokens
|
|
21896
|
-
}
|
|
22238
|
+
}, state.activeTurnStartedAt, nowIso)
|
|
21897
22239
|
};
|
|
21898
22240
|
case "done":
|
|
21899
|
-
return { ...state, isStreaming: false };
|
|
22241
|
+
return { ...state, isStreaming: false, activeTurnStartedAt: undefined };
|
|
21900
22242
|
case "error":
|
|
21901
22243
|
return {
|
|
21902
22244
|
...state,
|
|
21903
22245
|
isStreaming: false,
|
|
22246
|
+
activeTurnStartedAt: undefined,
|
|
21904
22247
|
error: ev.message,
|
|
21905
22248
|
messages: capMessages([...state.messages, { kind: "system", text: `error: ${ev.message}`, ts: nowIso }], nowIso)
|
|
21906
22249
|
};
|
|
@@ -21910,6 +22253,7 @@ function applyEvent(state, ev, nowIso = new Date().toISOString()) {
|
|
|
21910
22253
|
isStreaming: true,
|
|
21911
22254
|
error: null,
|
|
21912
22255
|
lastUsage: undefined,
|
|
22256
|
+
activeTurnStartedAt: nowIso,
|
|
21913
22257
|
messages: capMessages([...state.messages, { kind: "user", text: ev.text, ts: nowIso }], nowIso)
|
|
21914
22258
|
};
|
|
21915
22259
|
case "system.info":
|
|
@@ -22078,6 +22422,7 @@ function findLastIndex(arr, pred) {
|
|
|
22078
22422
|
}
|
|
22079
22423
|
var SCROLLBACK_CAP = 1000, SENTINEL_PREFIX = "(scrollback truncated \u2014 ", SENTINEL_SUFFIX = " rows dropped)", CLAUDE_NOISE_TAGS, NOISE_TAG_PATTERN, QUEUE_SOFT_CAP = 50;
|
|
22080
22424
|
var init_store2 = __esm(() => {
|
|
22425
|
+
init_context_meter();
|
|
22081
22426
|
CLAUDE_NOISE_TAGS = [
|
|
22082
22427
|
"local-command-caveat",
|
|
22083
22428
|
"command-message",
|
|
@@ -22278,7 +22623,6 @@ var init_use_chat_session = __esm(() => {
|
|
|
22278
22623
|
});
|
|
22279
22624
|
|
|
22280
22625
|
// src/tui/panes/chat/Chat.tsx
|
|
22281
|
-
import { TextAttributes as TextAttributes25 } from "@opentui/core";
|
|
22282
22626
|
function Chat(props) {
|
|
22283
22627
|
const {
|
|
22284
22628
|
theme
|
|
@@ -22483,7 +22827,7 @@ function Chat(props) {
|
|
|
22483
22827
|
send(pp);
|
|
22484
22828
|
});
|
|
22485
22829
|
});
|
|
22486
|
-
let
|
|
22830
|
+
let dispatching = false;
|
|
22487
22831
|
createEffect(() => {
|
|
22488
22832
|
const taskId = props.taskId();
|
|
22489
22833
|
const tabId = activeTabId();
|
|
@@ -22496,15 +22840,15 @@ function Chat(props) {
|
|
|
22496
22840
|
return;
|
|
22497
22841
|
if (hasPendingInput())
|
|
22498
22842
|
return;
|
|
22499
|
-
if (
|
|
22843
|
+
if (dispatching)
|
|
22500
22844
|
return;
|
|
22501
22845
|
queueMicrotask(async () => {
|
|
22502
|
-
if (
|
|
22846
|
+
if (dispatching)
|
|
22503
22847
|
return;
|
|
22504
22848
|
const cur = activeState();
|
|
22505
22849
|
if (cur.isStreaming || cur.queue.length === 0)
|
|
22506
22850
|
return;
|
|
22507
|
-
|
|
22851
|
+
dispatching = true;
|
|
22508
22852
|
try {
|
|
22509
22853
|
let head = null;
|
|
22510
22854
|
patchActiveState((s) => {
|
|
@@ -22521,7 +22865,7 @@ function Chat(props) {
|
|
|
22521
22865
|
patchActiveState((s) => pushSystemError(s, `queued runTask failed: ${stringifyErr2(err)}`));
|
|
22522
22866
|
}
|
|
22523
22867
|
} finally {
|
|
22524
|
-
|
|
22868
|
+
dispatching = false;
|
|
22525
22869
|
}
|
|
22526
22870
|
});
|
|
22527
22871
|
});
|
|
@@ -22547,16 +22891,17 @@ function Chat(props) {
|
|
|
22547
22891
|
const streaming = activeState().isStreaming;
|
|
22548
22892
|
if (streaming && mode === "steer") {
|
|
22549
22893
|
setDraft("");
|
|
22550
|
-
|
|
22551
|
-
await props.orchestrator.interruptTask(taskId, tabId);
|
|
22552
|
-
} catch (err) {
|
|
22553
|
-
patchActiveState((s) => pushSystemError(s, `interrupt failed: ${stringifyErr2(err)}`));
|
|
22894
|
+
if (dispatching)
|
|
22554
22895
|
return;
|
|
22555
|
-
|
|
22896
|
+
dispatching = true;
|
|
22556
22897
|
try {
|
|
22557
|
-
|
|
22558
|
-
|
|
22559
|
-
|
|
22898
|
+
try {
|
|
22899
|
+
await props.orchestrator.steerTask(taskId, text, tabId);
|
|
22900
|
+
} catch (err) {
|
|
22901
|
+
patchActiveState((s) => pushSystemError(s, `steer failed: ${stringifyErr2(err)}`));
|
|
22902
|
+
}
|
|
22903
|
+
} finally {
|
|
22904
|
+
dispatching = false;
|
|
22560
22905
|
}
|
|
22561
22906
|
return;
|
|
22562
22907
|
}
|
|
@@ -22579,6 +22924,13 @@ function Chat(props) {
|
|
|
22579
22924
|
function cancelQueued(id) {
|
|
22580
22925
|
patchActiveState((s) => removeFromQueue(s, id));
|
|
22581
22926
|
}
|
|
22927
|
+
function sendQueuedNow(id) {
|
|
22928
|
+
const entry = activeState().queue.find((q) => q.id === id);
|
|
22929
|
+
if (!entry)
|
|
22930
|
+
return;
|
|
22931
|
+
patchActiveState((s) => removeFromQueue(s, id));
|
|
22932
|
+
send(entry.text, "steer");
|
|
22933
|
+
}
|
|
22582
22934
|
async function newTab() {
|
|
22583
22935
|
const taskId = props.taskId();
|
|
22584
22936
|
if (!taskId)
|
|
@@ -22832,19 +23184,6 @@ function Chat(props) {
|
|
|
22832
23184
|
return _el$5;
|
|
22833
23185
|
}
|
|
22834
23186
|
}), null);
|
|
22835
|
-
insert(_el$, createComponent2(Show, {
|
|
22836
|
-
get when() {
|
|
22837
|
-
return memo2(() => !!props.taskId())() && activeState().queue.length > 0;
|
|
22838
|
-
},
|
|
22839
|
-
get children() {
|
|
22840
|
-
return createComponent2(QueuedPromptList, {
|
|
22841
|
-
get queue() {
|
|
22842
|
-
return activeState().queue;
|
|
22843
|
-
},
|
|
22844
|
-
onCancel: cancelQueued
|
|
22845
|
-
});
|
|
22846
|
-
}
|
|
22847
|
-
}), null);
|
|
22848
23187
|
insert(_el$, createComponent2(Show, {
|
|
22849
23188
|
get when() {
|
|
22850
23189
|
return memo2(() => !!showThinking())() && props.taskId();
|
|
@@ -22889,7 +23228,10 @@ function Chat(props) {
|
|
|
22889
23228
|
onCyclePermissionMode: cyclePermissionMode,
|
|
22890
23229
|
modelLabel,
|
|
22891
23230
|
onChooseModel: () => void chooseModel(),
|
|
22892
|
-
worktreePath
|
|
23231
|
+
worktreePath,
|
|
23232
|
+
queue: () => activeState().queue,
|
|
23233
|
+
onCancelQueued: cancelQueued,
|
|
23234
|
+
onSendQueuedNow: sendQueuedNow
|
|
22893
23235
|
});
|
|
22894
23236
|
}
|
|
22895
23237
|
}), null);
|
|
@@ -22905,97 +23247,6 @@ function stringifyErr2(err) {
|
|
|
22905
23247
|
return String(err);
|
|
22906
23248
|
}
|
|
22907
23249
|
}
|
|
22908
|
-
function QueuedPromptList(props) {
|
|
22909
|
-
const {
|
|
22910
|
-
theme
|
|
22911
|
-
} = useTheme();
|
|
22912
|
-
const visible = () => props.queue.slice(0, QUEUE_VISIBLE_CAP);
|
|
22913
|
-
const hidden = () => Math.max(0, props.queue.length - QUEUE_VISIBLE_CAP);
|
|
22914
|
-
return (() => {
|
|
22915
|
-
var _el$7 = createElement("box");
|
|
22916
|
-
setProp(_el$7, "flexDirection", "column");
|
|
22917
|
-
setProp(_el$7, "gap", 0);
|
|
22918
|
-
setProp(_el$7, "paddingTop", 1);
|
|
22919
|
-
setProp(_el$7, "paddingLeft", 1);
|
|
22920
|
-
setProp(_el$7, "paddingRight", 1);
|
|
22921
|
-
insert(_el$7, createComponent2(For, {
|
|
22922
|
-
get each() {
|
|
22923
|
-
return visible();
|
|
22924
|
-
},
|
|
22925
|
-
children: (entry, idx) => (() => {
|
|
22926
|
-
var _el$10 = createElement("box"), _el$11 = createElement("text"), _el$13 = createElement("box"), _el$14 = createElement("text"), _el$15 = createTextNode(`queued`), _el$16 = createTextNode(`:`), _el$17 = createElement("box"), _el$18 = createElement("text"), _el$19 = createElement("text");
|
|
22927
|
-
insertNode(_el$10, _el$11);
|
|
22928
|
-
insertNode(_el$10, _el$13);
|
|
22929
|
-
setProp(_el$10, "flexDirection", "row");
|
|
22930
|
-
setProp(_el$10, "gap", 1);
|
|
22931
|
-
setProp(_el$10, "alignItems", "flex-start");
|
|
22932
|
-
insertNode(_el$11, createTextNode(`+`));
|
|
22933
|
-
insertNode(_el$13, _el$14);
|
|
22934
|
-
insertNode(_el$13, _el$17);
|
|
22935
|
-
insertNode(_el$13, _el$19);
|
|
22936
|
-
setProp(_el$13, "flexGrow", 1);
|
|
22937
|
-
setProp(_el$13, "flexDirection", "row");
|
|
22938
|
-
setProp(_el$13, "gap", 1);
|
|
22939
|
-
insertNode(_el$14, _el$15);
|
|
22940
|
-
insertNode(_el$14, _el$16);
|
|
22941
|
-
setProp(_el$14, "wrapMode", "none");
|
|
22942
|
-
insert(_el$14, () => idx() === 0 ? " (next)" : "", _el$16);
|
|
22943
|
-
insertNode(_el$17, _el$18);
|
|
22944
|
-
setProp(_el$17, "flexGrow", 1);
|
|
22945
|
-
insert(_el$18, () => entry.text);
|
|
22946
|
-
insertNode(_el$19, createTextNode(`[x]`));
|
|
22947
|
-
setProp(_el$19, "onMouseUp", () => props.onCancel(entry.id));
|
|
22948
|
-
effect((_p$) => {
|
|
22949
|
-
var _v$4 = theme.textMuted, _v$5 = TextAttributes25.BOLD, _v$6 = theme.textMuted, _v$7 = theme.text, _v$8 = theme.error, _v$9 = TextAttributes25.BOLD;
|
|
22950
|
-
_v$4 !== _p$.e && (_p$.e = setProp(_el$11, "fg", _v$4, _p$.e));
|
|
22951
|
-
_v$5 !== _p$.t && (_p$.t = setProp(_el$11, "attributes", _v$5, _p$.t));
|
|
22952
|
-
_v$6 !== _p$.a && (_p$.a = setProp(_el$14, "fg", _v$6, _p$.a));
|
|
22953
|
-
_v$7 !== _p$.o && (_p$.o = setProp(_el$18, "fg", _v$7, _p$.o));
|
|
22954
|
-
_v$8 !== _p$.i && (_p$.i = setProp(_el$19, "fg", _v$8, _p$.i));
|
|
22955
|
-
_v$9 !== _p$.n && (_p$.n = setProp(_el$19, "attributes", _v$9, _p$.n));
|
|
22956
|
-
return _p$;
|
|
22957
|
-
}, {
|
|
22958
|
-
e: undefined,
|
|
22959
|
-
t: undefined,
|
|
22960
|
-
a: undefined,
|
|
22961
|
-
o: undefined,
|
|
22962
|
-
i: undefined,
|
|
22963
|
-
n: undefined
|
|
22964
|
-
});
|
|
22965
|
-
return _el$10;
|
|
22966
|
-
})()
|
|
22967
|
-
}), null);
|
|
22968
|
-
insert(_el$7, createComponent2(Show, {
|
|
22969
|
-
get when() {
|
|
22970
|
-
return hidden() > 0;
|
|
22971
|
-
},
|
|
22972
|
-
get children() {
|
|
22973
|
-
var _el$8 = createElement("box"), _el$9 = createElement("text"), _el$1 = createElement("text");
|
|
22974
|
-
insertNode(_el$8, _el$9);
|
|
22975
|
-
insertNode(_el$8, _el$1);
|
|
22976
|
-
setProp(_el$8, "flexDirection", "row");
|
|
22977
|
-
setProp(_el$8, "gap", 1);
|
|
22978
|
-
setProp(_el$8, "alignItems", "flex-start");
|
|
22979
|
-
insertNode(_el$9, createTextNode(`+`));
|
|
22980
|
-
insert(_el$1, () => `\u2026 ${hidden()} more queued`);
|
|
22981
|
-
effect((_p$) => {
|
|
22982
|
-
var _v$ = theme.textMuted, _v$2 = TextAttributes25.BOLD, _v$3 = theme.textMuted;
|
|
22983
|
-
_v$ !== _p$.e && (_p$.e = setProp(_el$9, "fg", _v$, _p$.e));
|
|
22984
|
-
_v$2 !== _p$.t && (_p$.t = setProp(_el$9, "attributes", _v$2, _p$.t));
|
|
22985
|
-
_v$3 !== _p$.a && (_p$.a = setProp(_el$1, "fg", _v$3, _p$.a));
|
|
22986
|
-
return _p$;
|
|
22987
|
-
}, {
|
|
22988
|
-
e: undefined,
|
|
22989
|
-
t: undefined,
|
|
22990
|
-
a: undefined
|
|
22991
|
-
});
|
|
22992
|
-
return _el$8;
|
|
22993
|
-
}
|
|
22994
|
-
}), null);
|
|
22995
|
-
return _el$7;
|
|
22996
|
-
})();
|
|
22997
|
-
}
|
|
22998
|
-
var QUEUE_VISIBLE_CAP = 4;
|
|
22999
23250
|
var init_Chat = __esm(() => {
|
|
23000
23251
|
init_solid();
|
|
23001
23252
|
init_solid();
|
|
@@ -23025,7 +23276,7 @@ var init_Chat = __esm(() => {
|
|
|
23025
23276
|
});
|
|
23026
23277
|
|
|
23027
23278
|
// src/tui/component/sidebar.tsx
|
|
23028
|
-
import { TextAttributes as
|
|
23279
|
+
import { TextAttributes as TextAttributes25 } from "@opentui/core";
|
|
23029
23280
|
function Sidebar(props) {
|
|
23030
23281
|
const {
|
|
23031
23282
|
theme
|
|
@@ -23051,7 +23302,7 @@ function Sidebar(props) {
|
|
|
23051
23302
|
setProp(_el$2, "paddingBottom", 1);
|
|
23052
23303
|
insert(_el$3, () => props.title);
|
|
23053
23304
|
effect((_p$) => {
|
|
23054
|
-
var _v$ = theme.text, _v$2 =
|
|
23305
|
+
var _v$ = theme.text, _v$2 = TextAttributes25.BOLD;
|
|
23055
23306
|
_v$ !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$, _p$.e));
|
|
23056
23307
|
_v$2 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$2, _p$.t));
|
|
23057
23308
|
return _p$;
|
|
@@ -23310,7 +23561,7 @@ var init_keys4 = __esm(() => {
|
|
|
23310
23561
|
});
|
|
23311
23562
|
|
|
23312
23563
|
// src/tui/panes/sidebar/Sidebar.tsx
|
|
23313
|
-
import { TextAttributes as
|
|
23564
|
+
import { TextAttributes as TextAttributes26 } from "@opentui/core";
|
|
23314
23565
|
function Sidebar2(props) {
|
|
23315
23566
|
const {
|
|
23316
23567
|
theme
|
|
@@ -23402,7 +23653,7 @@ function Sidebar2(props) {
|
|
|
23402
23653
|
return () => _c$() ? `[ ${tab.label} ]` : tab.label;
|
|
23403
23654
|
})());
|
|
23404
23655
|
effect((_p$) => {
|
|
23405
|
-
var _v$7 = active() ? theme.primary : theme.textMuted, _v$8 = active() ?
|
|
23656
|
+
var _v$7 = active() ? theme.primary : theme.textMuted, _v$8 = active() ? TextAttributes26.BOLD : undefined;
|
|
23406
23657
|
_v$7 !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$7, _p$.e));
|
|
23407
23658
|
_v$8 !== _p$.t && (_p$.t = setProp(_el$13, "attributes", _v$8, _p$.t));
|
|
23408
23659
|
return _p$;
|
|
@@ -23497,7 +23748,7 @@ function Sidebar2(props) {
|
|
|
23497
23748
|
}
|
|
23498
23749
|
}), null);
|
|
23499
23750
|
effect((_p$) => {
|
|
23500
|
-
var _v$9 = isCursor() ? theme.primary : isSelected() ? theme.backgroundElement : undefined, _v$0 = isCursor() ? theme.selectedListItemText : badgeColor(), _v$1 = isCursor() ? theme.selectedListItemText : theme.text, _v$10 = (isMain || isSelected() && !isCursor()) && !isCursor() ?
|
|
23751
|
+
var _v$9 = isCursor() ? theme.primary : isSelected() ? theme.backgroundElement : undefined, _v$0 = isCursor() ? theme.selectedListItemText : badgeColor(), _v$1 = isCursor() ? theme.selectedListItemText : theme.text, _v$10 = (isMain || isSelected() && !isCursor()) && !isCursor() ? TextAttributes26.BOLD : undefined;
|
|
23501
23752
|
_v$9 !== _p$.e && (_p$.e = setProp(_el$14, "backgroundColor", _v$9, _p$.e));
|
|
23502
23753
|
_v$0 !== _p$.t && (_p$.t = setProp(_el$15, "fg", _v$0, _p$.t));
|
|
23503
23754
|
_v$1 !== _p$.a && (_p$.a = setProp(_el$16, "fg", _v$1, _p$.a));
|
|
@@ -23535,7 +23786,7 @@ function Sidebar2(props) {
|
|
|
23535
23786
|
setProp(_el$11, "wrapMode", "none");
|
|
23536
23787
|
setProp(_el$11, "onMouseUp", () => props.onAddTask?.());
|
|
23537
23788
|
effect((_p$) => {
|
|
23538
|
-
var _v$ = props.width ? props.width() : SIDEBAR_WIDTH, _v$2 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$3 =
|
|
23789
|
+
var _v$ = props.width ? props.width() : SIDEBAR_WIDTH, _v$2 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$3 = TextAttributes26.BOLD, _v$4 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$5 = TextAttributes26.BOLD, _v$6 = theme.textMuted;
|
|
23539
23790
|
_v$ !== _p$.e && (_p$.e = setProp(_el$, "width", _v$, _p$.e));
|
|
23540
23791
|
_v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
|
|
23541
23792
|
_v$3 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$3, _p$.a));
|
|
@@ -23605,11 +23856,11 @@ var init_Sidebar = __esm(() => {
|
|
|
23605
23856
|
});
|
|
23606
23857
|
|
|
23607
23858
|
// src/orchestrator/bridge/server.ts
|
|
23608
|
-
import { mkdir as
|
|
23859
|
+
import { mkdir as mkdir4, unlink as unlink3 } from "fs/promises";
|
|
23609
23860
|
import { createServer } from "net";
|
|
23610
23861
|
import { dirname as dirname6 } from "path";
|
|
23611
23862
|
async function startBridgeServer(orch, socketPath) {
|
|
23612
|
-
await
|
|
23863
|
+
await mkdir4(dirname6(socketPath), { recursive: true });
|
|
23613
23864
|
await unlink3(socketPath).catch(() => {});
|
|
23614
23865
|
const conns = new Set;
|
|
23615
23866
|
const server = createServer((conn) => {
|
|
@@ -23742,7 +23993,7 @@ var exports_bridge = {};
|
|
|
23742
23993
|
__export(exports_bridge, {
|
|
23743
23994
|
startBridge: () => startBridge
|
|
23744
23995
|
});
|
|
23745
|
-
import { writeFile as
|
|
23996
|
+
import { writeFile as writeFile4 } from "fs/promises";
|
|
23746
23997
|
import { homedir as homedir12 } from "os";
|
|
23747
23998
|
import { join as join15 } from "path";
|
|
23748
23999
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
@@ -23762,7 +24013,7 @@ async function startBridge(orch, opts = {}) {
|
|
|
23762
24013
|
}
|
|
23763
24014
|
}
|
|
23764
24015
|
};
|
|
23765
|
-
await
|
|
24016
|
+
await writeFile4(mcpConfigPath, JSON.stringify(mcpConfig, null, 2), "utf8");
|
|
23766
24017
|
process.env.KOBE_MCP_CONFIG = mcpConfigPath;
|
|
23767
24018
|
return {
|
|
23768
24019
|
socketPath,
|
|
@@ -24345,7 +24596,7 @@ var exports_tui = {};
|
|
|
24345
24596
|
__export(exports_tui, {
|
|
24346
24597
|
startTui: () => startTui
|
|
24347
24598
|
});
|
|
24348
|
-
import { TextAttributes as
|
|
24599
|
+
import { TextAttributes as TextAttributes27 } from "@opentui/core";
|
|
24349
24600
|
function HelpHint() {
|
|
24350
24601
|
const {
|
|
24351
24602
|
theme
|
|
@@ -24419,7 +24670,7 @@ function Banner() {
|
|
|
24419
24670
|
insert(_el$20, selected);
|
|
24420
24671
|
insert(_el$12, createComponent2(HelpHint, {}), null);
|
|
24421
24672
|
effect((_p$) => {
|
|
24422
|
-
var _v$7 = theme.primary, _v$8 =
|
|
24673
|
+
var _v$7 = theme.primary, _v$8 = TextAttributes27.BOLD, _v$9 = theme.borderActive, _v$0 = theme.text, _v$1 = theme.textMuted, _v$10 = {
|
|
24423
24674
|
fg: theme.accent
|
|
24424
24675
|
};
|
|
24425
24676
|
_v$7 !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$7, _p$.e));
|