@multiclawcli/dashboard 0.7.0 → 0.8.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/tui.js +38 -4
- package/package.json +2 -2
package/dist/tui.js
CHANGED
|
@@ -52,7 +52,7 @@ var COMMANDS = [
|
|
|
52
52
|
{ name: "clear", description: "Clear the focused agent's log", availability: "always" },
|
|
53
53
|
{
|
|
54
54
|
name: "history",
|
|
55
|
-
description: "Browse finished turns",
|
|
55
|
+
description: "Browse finished turns, or continue one",
|
|
56
56
|
availability: "always"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
@@ -1484,7 +1484,7 @@ function HistoryOverlay({
|
|
|
1484
1484
|
] })
|
|
1485
1485
|
] }, turn.turn);
|
|
1486
1486
|
}) }),
|
|
1487
|
-
/* @__PURE__ */ jsx2(Box2, { marginTop: 1, children: /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: `\u2191\u2193 select \xB7 enter open \xB7 esc close${range}` }) })
|
|
1487
|
+
/* @__PURE__ */ jsx2(Box2, { marginTop: 1, children: /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: `\u2191\u2193 select \xB7 enter open \xB7 c continue \xB7 esc close${range}` }) })
|
|
1488
1488
|
] });
|
|
1489
1489
|
}
|
|
1490
1490
|
|
|
@@ -2158,6 +2158,20 @@ function pickTurn(state, raw, whenEmpty) {
|
|
|
2158
2158
|
if (!target.record.requirement) return { error: `turn ${target.record.turn} has no requirement` };
|
|
2159
2159
|
return { record: target.record, requirement: target.record.requirement };
|
|
2160
2160
|
}
|
|
2161
|
+
function turnSessions(turn) {
|
|
2162
|
+
const sessions = {};
|
|
2163
|
+
for (const agent of Object.values(turn.agents)) {
|
|
2164
|
+
if (agent.sessionId) sessions[agent.id] = agent.sessionId;
|
|
2165
|
+
}
|
|
2166
|
+
return sessions;
|
|
2167
|
+
}
|
|
2168
|
+
function continuationResume(continuation, live) {
|
|
2169
|
+
if (!continuation) return void 0;
|
|
2170
|
+
const sessions = Object.fromEntries(
|
|
2171
|
+
Object.entries(continuation.sessions).filter(([id]) => !live?.has(id))
|
|
2172
|
+
);
|
|
2173
|
+
return Object.keys(sessions).length > 0 ? { sessions } : void 0;
|
|
2174
|
+
}
|
|
2161
2175
|
function StatusLine({
|
|
2162
2176
|
state,
|
|
2163
2177
|
running,
|
|
@@ -2244,6 +2258,7 @@ function App({ config, onTurnStart, sessions: providedSessions, onCleanupReady }
|
|
|
2244
2258
|
const abortRef = useRef(null);
|
|
2245
2259
|
const sessionsRef = useRef(null);
|
|
2246
2260
|
if (!sessionsRef.current) sessionsRef.current = providedSessions ?? new AgentSessionManager();
|
|
2261
|
+
const continuationRef = useRef(null);
|
|
2247
2262
|
const activeTurnRef = useRef(null);
|
|
2248
2263
|
const reporterErrorRef = useRef(null);
|
|
2249
2264
|
const closingRef = useRef(false);
|
|
@@ -2381,6 +2396,9 @@ function App({ config, onTurnStart, sessions: providedSessions, onCleanupReady }
|
|
|
2381
2396
|
if (closingRef.current || busyRef.current) return;
|
|
2382
2397
|
busyRef.current = true;
|
|
2383
2398
|
setRunning(true);
|
|
2399
|
+
const continuation = opts?.newTask ? null : continuationRef.current;
|
|
2400
|
+
continuationRef.current = null;
|
|
2401
|
+
const resume = opts?.resume ?? continuationResume(continuation, sessionsRef.current);
|
|
2384
2402
|
if (opts?.newTask) {
|
|
2385
2403
|
try {
|
|
2386
2404
|
await sessionsRef.current?.reset();
|
|
@@ -2430,8 +2448,9 @@ function App({ config, onTurnStart, sessions: providedSessions, onCleanupReady }
|
|
|
2430
2448
|
logDir,
|
|
2431
2449
|
permissions: !config.permissions || config.permissions.mode === "ask" ? { mode: "ask", onRequest: requestPermission } : config.permissions,
|
|
2432
2450
|
questions: config.questions?.onRequest ? config.questions : { onRequest: requestQuestion },
|
|
2433
|
-
//
|
|
2434
|
-
|
|
2451
|
+
// A retry names the agents to redo; a continued conversation carries only
|
|
2452
|
+
// sessions and still lets the leader route. Both arrive here.
|
|
2453
|
+
...resume ? { resume } : {}
|
|
2435
2454
|
};
|
|
2436
2455
|
const controller = new AbortController();
|
|
2437
2456
|
abortRef.current = controller;
|
|
@@ -3026,6 +3045,21 @@ function App({ config, onTurnStart, sessions: providedSessions, onCleanupReady }
|
|
|
3026
3045
|
setHistoryOpen(false);
|
|
3027
3046
|
return;
|
|
3028
3047
|
}
|
|
3048
|
+
if (char === "c") {
|
|
3049
|
+
const target = historyTurns[historyIndex];
|
|
3050
|
+
const sessions = turnSessions(target);
|
|
3051
|
+
const count = Object.keys(sessions).length;
|
|
3052
|
+
if (count === 0) {
|
|
3053
|
+
setNotice(`turn ${target.turn} has no agent sessions to continue`);
|
|
3054
|
+
return;
|
|
3055
|
+
}
|
|
3056
|
+
continuationRef.current = { turn: target.turn, sessions };
|
|
3057
|
+
setHistoryOpen(false);
|
|
3058
|
+
setNotice(
|
|
3059
|
+
`continuing turn ${target.turn} \u2014 ${count} ${count === 1 ? "session" : "sessions"} \xB7 type your next instruction`
|
|
3060
|
+
);
|
|
3061
|
+
return;
|
|
3062
|
+
}
|
|
3029
3063
|
return;
|
|
3030
3064
|
}
|
|
3031
3065
|
if (key.ctrl && char === "d") {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiclawcli/dashboard",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./tui": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"access": "public"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@multiclawcli/core": "0.
|
|
28
|
+
"@multiclawcli/core": "0.8.0",
|
|
29
29
|
"ink": "^8.0.0",
|
|
30
30
|
"react": "^19.3.1",
|
|
31
31
|
"string-width": "^8.3.0"
|