dsh-ssh-tui 0.1.5 → 0.1.7
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/README.en.md +6 -0
- package/README.md +14 -4
- package/cordis.patch.yml +19 -0
- package/lib/index.js +56 -13
- package/lib/index.js.map +1 -1
- package/lib/picker.js +12 -6
- package/lib/picker.js.map +1 -1
- package/lib/session-list.js +42 -14
- package/lib/session-list.js.map +1 -1
- package/lib/startup.js +2 -2
- package/lib/startup.js.map +1 -1
- package/lib/subagent-model.js +64 -0
- package/lib/subagent-model.js.map +1 -0
- package/lib/tui.js +639 -127
- package/lib/tui.js.map +1 -1
- package/lib/types/session-list.d.ts +2 -10
- package/lib/types/subagent-model.d.ts +56 -0
- package/lib/types/tui.d.ts +40 -0
- package/package.json +3 -1
package/README.en.md
CHANGED
|
@@ -155,6 +155,12 @@ configured catalog when the endpoint cannot be reached. Picking a model that
|
|
|
155
155
|
is not stored in the provider profile automatically adds it to
|
|
156
156
|
`llm-pi-ai.providers.<id>.models` so the harness can serve it.
|
|
157
157
|
|
|
158
|
+
Subagents follow the parent session's provider by default and run on the
|
|
159
|
+
lightweight `deepseek-v4-flash` model. `/submodel [model-id]` picks (or
|
|
160
|
+
directly sets) the subagent model, and `/subeffort` picks the subagent
|
|
161
|
+
reasoning effort or restores the provider default. Both commands are
|
|
162
|
+
remembered under `ssh-tui-subagent` in `$DSH_HOME/settings.yaml`.
|
|
163
|
+
|
|
158
164
|
`/usage` (alias `/quota`) works when the current provider is an OpenCode
|
|
159
165
|
source and keeps the two billing models distinct:
|
|
160
166
|
|
package/README.md
CHANGED
|
@@ -120,9 +120,14 @@ dsh --profile tui --no-color
|
|
|
120
120
|
| `Ctrl+D` | 退出 |
|
|
121
121
|
| `Ctrl+L` | 重绘 |
|
|
122
122
|
|
|
123
|
-
斜杠命令:`/help`、`/model`、`/mode`、`/resume
|
|
124
|
-
`/usage`(`/quota` 同义)、`/setup`、`/clear
|
|
125
|
-
|
|
123
|
+
斜杠命令:`/help`、`/model`、`/submodel`、`/subeffort`、`/mode`、`/resume`、
|
|
124
|
+
`/status`、`/subagents`、`/usage`(`/quota` 同义)、`/setup`、`/clear`,
|
|
125
|
+
以及 harness 自带命令(`/goal`、`/plan`、`/compact` 等)。
|
|
126
|
+
|
|
127
|
+
子代理默认跟随父会话的提供方,模型默认为轻量的 `deepseek-v4-flash`:
|
|
128
|
+
|
|
129
|
+
- `/submodel [model-id]`:打开子代理模型选择器;带参数时直接指定模型;
|
|
130
|
+
- `/subeffort`:选择子代理思考强度,或恢复为“跟随提供商默认”。
|
|
126
131
|
|
|
127
132
|
`/usage` 在当前提供商为 OpenCode 源时可用,并区分两种计费方式:
|
|
128
133
|
|
|
@@ -142,9 +147,14 @@ agent-default-model:
|
|
|
142
147
|
reasoningEffort: max
|
|
143
148
|
agent-presets:
|
|
144
149
|
default: standard
|
|
150
|
+
ssh-tui-subagent:
|
|
151
|
+
model: deepseek-v4-flash
|
|
152
|
+
# provider 可省略:省略时子代理跟随父会话提供方
|
|
153
|
+
# reasoningEffort 可省略:省略时跟随提供商/模型默认
|
|
145
154
|
```
|
|
146
155
|
|
|
147
|
-
`/model` 与 `/
|
|
156
|
+
`/model`、`/mode`、`/submodel` 与 `/subeffort` 的修改会写回这里,
|
|
157
|
+
web 端与 TUI 共用同一份设置。
|
|
148
158
|
|
|
149
159
|
对 OpenCode 和其他第三方提供商,`/model` 会先调用提供商的端点
|
|
150
160
|
(`GET {baseURL}/models`)获取实时模型列表;端点不可达时回退到已配置的
|
package/cordis.patch.yml
CHANGED
|
@@ -35,6 +35,25 @@
|
|
|
35
35
|
thinking: enabled
|
|
36
36
|
reasoningEffort: max
|
|
37
37
|
|
|
38
|
+
# Subagents follow the parent session's provider and default to the
|
|
39
|
+
# lightweight model. The TUI's /submodel and /subeffort commands can override
|
|
40
|
+
# both model and reasoning effort at runtime through the request waterfall.
|
|
41
|
+
- id: tool-subagent
|
|
42
|
+
config:
|
|
43
|
+
provider: spawn
|
|
44
|
+
toolName: subagent
|
|
45
|
+
backgroundMode: continuable
|
|
46
|
+
agentOptions:
|
|
47
|
+
model: deepseek-v4-flash
|
|
48
|
+
|
|
49
|
+
- id: tool-subagent-fork
|
|
50
|
+
config:
|
|
51
|
+
provider: fork
|
|
52
|
+
toolName: subagent_fork
|
|
53
|
+
backgroundMode: one-shot
|
|
54
|
+
agentOptions:
|
|
55
|
+
model: deepseek-v4-flash
|
|
56
|
+
|
|
38
57
|
- insert:
|
|
39
58
|
# The agent-mode roster (standard / PTC / minimal / cordis / routing-suite).
|
|
40
59
|
# The launcher injects the shipped preset root into this row when it is
|
package/lib/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
11
11
|
import { showSessionPicker } from './picker.js';
|
|
12
12
|
import { mountTui } from './tui.js';
|
|
13
13
|
import { defaultReasoningEffort } from './reasoning.js';
|
|
14
|
+
import { createSubagentSelection } from './subagent-model.js';
|
|
14
15
|
export const name = 'ssh-tui';
|
|
15
16
|
/** Core services required before the terminal channel can drive an agent. */
|
|
16
17
|
export const inject = ['agents', 'agentDefaultModel'];
|
|
@@ -24,6 +25,7 @@ export function apply(ctx, config) {
|
|
|
24
25
|
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
25
26
|
throw new Error('dsh-ssh-tui: both stdin and stdout must be TTYs; use a terminal/SSH session');
|
|
26
27
|
}
|
|
28
|
+
const subagentSelection = createSubagentSelection(ctx);
|
|
27
29
|
ctx.effect(() => {
|
|
28
30
|
let disposed = false;
|
|
29
31
|
let switching = false;
|
|
@@ -32,6 +34,19 @@ export function apply(ctx, config) {
|
|
|
32
34
|
// An explicit in-process change (/setup or /model) wins over launch-time
|
|
33
35
|
// CLI overrides for every session created or resumed later in this process.
|
|
34
36
|
let liveSelection;
|
|
37
|
+
/** Build the goodbye hint for the session that actually runs. */
|
|
38
|
+
const goodbyeFor = (sessionId) => {
|
|
39
|
+
const existing = ctx.get('tuiGoodbyeMessage');
|
|
40
|
+
const marker = '--resume=';
|
|
41
|
+
const markerIndex = existing?.lastIndexOf(marker) ?? -1;
|
|
42
|
+
if (existing !== undefined && markerIndex !== -1) {
|
|
43
|
+
const tail = existing.slice(markerIndex + marker.length);
|
|
44
|
+
if (tail !== '' && !/\s/u.test(tail)) {
|
|
45
|
+
return `${existing.slice(0, markerIndex + marker.length)}${sessionId}`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return `To resume this session: dsh --profile tui --resume=${sessionId}`;
|
|
49
|
+
};
|
|
35
50
|
const start = async (sessionId, resume) => {
|
|
36
51
|
await ctx.get('loader')?.await();
|
|
37
52
|
if (disposed)
|
|
@@ -40,28 +55,45 @@ export function apply(ctx, config) {
|
|
|
40
55
|
if (agents === undefined)
|
|
41
56
|
throw new Error('dsh-ssh-tui: agents service is unavailable');
|
|
42
57
|
const defaultModel = ctx.get('agentDefaultModel');
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
58
|
+
const savedSelection = defaultModel?.currentSelection();
|
|
59
|
+
// An explicit in-process change (/setup or /model) wins over launch-time
|
|
60
|
+
// CLI overrides for every session created or resumed later in this process.
|
|
61
|
+
const provider = liveSelection?.provider
|
|
62
|
+
?? config.provider
|
|
63
|
+
?? savedSelection?.provider
|
|
64
|
+
?? 'deepseek-official';
|
|
65
|
+
const model = liveSelection?.model
|
|
66
|
+
?? config.model
|
|
67
|
+
?? savedSelection?.model
|
|
68
|
+
?? 'deepseek-v4-flash';
|
|
69
|
+
// Reasoning effort is only meaningful for the exact provider/model it
|
|
70
|
+
// belongs to. CLI overrides that change either route must not inherit the
|
|
71
|
+
// saved effort of a different model.
|
|
72
|
+
let reasoningEffort = liveSelection?.reasoningEffort;
|
|
73
|
+
if (reasoningEffort === undefined && liveSelection === undefined) {
|
|
74
|
+
const sameSavedRoute = savedSelection !== undefined
|
|
75
|
+
&& (config.provider === undefined || config.provider === savedSelection.provider)
|
|
76
|
+
&& (config.model === undefined || config.model === savedSelection.model);
|
|
77
|
+
if (sameSavedRoute)
|
|
78
|
+
reasoningEffort = savedSelection.reasoningEffort;
|
|
79
|
+
}
|
|
50
80
|
// OpenCode / third-party (llm-pi-ai) routes carry no adapter-level
|
|
51
81
|
// reasoning default, so default a supported effort ourselves when none is
|
|
52
82
|
// selected. Without it the model streams thinking as plain text and the
|
|
53
83
|
// foldable `思考中` block never has data to render.
|
|
54
|
-
let reasoningEffort = selection?.reasoningEffort;
|
|
55
84
|
if (reasoningEffort === undefined && provider !== 'deepseek-official') {
|
|
56
85
|
const llm = ctx.get('llm');
|
|
57
86
|
if (llm !== undefined) {
|
|
58
87
|
reasoningEffort = await defaultReasoningEffort(llm, provider, model);
|
|
59
88
|
}
|
|
60
89
|
}
|
|
90
|
+
const effectiveSelection = {
|
|
91
|
+
provider,
|
|
92
|
+
model,
|
|
93
|
+
...(reasoningEffort === undefined ? {} : { reasoningEffort }),
|
|
94
|
+
};
|
|
61
95
|
const selectionRef = {
|
|
62
|
-
current:
|
|
63
|
-
? { ...selection, ...(reasoningEffort === undefined ? {} : { reasoningEffort }) }
|
|
64
|
-
: { provider, model, ...(reasoningEffort === undefined ? {} : { reasoningEffort }) },
|
|
96
|
+
current: effectiveSelection,
|
|
65
97
|
assembled: undefined,
|
|
66
98
|
};
|
|
67
99
|
const agentPresets = ctx.get('agentPresets');
|
|
@@ -101,8 +133,10 @@ export function apply(ctx, config) {
|
|
|
101
133
|
provider,
|
|
102
134
|
model,
|
|
103
135
|
selectionRef,
|
|
136
|
+
subagentSelection,
|
|
104
137
|
presetId,
|
|
105
138
|
presetName,
|
|
139
|
+
goodbye: goodbyeFor(String(sessionId)),
|
|
106
140
|
onSwitchSession: switchTo,
|
|
107
141
|
onSelectionChanged: (next) => {
|
|
108
142
|
liveSelection = next;
|
|
@@ -137,6 +171,7 @@ export function apply(ctx, config) {
|
|
|
137
171
|
switching = false;
|
|
138
172
|
}
|
|
139
173
|
};
|
|
174
|
+
let bootingSessionId = config.sessionId;
|
|
140
175
|
const boot = async () => {
|
|
141
176
|
if (config.resumePicker === true) {
|
|
142
177
|
await ctx.get('loader')?.await();
|
|
@@ -152,17 +187,25 @@ export function apply(ctx, config) {
|
|
|
152
187
|
return;
|
|
153
188
|
}
|
|
154
189
|
if (picked.kind === 'resume') {
|
|
190
|
+
bootingSessionId = picked.id;
|
|
155
191
|
await start(SessionId(picked.id), true);
|
|
156
192
|
}
|
|
157
193
|
else {
|
|
158
|
-
|
|
194
|
+
// Reuse the startup-minted session identity so the goodbye hint and
|
|
195
|
+
// the launcher-configured `main` identity all describe the session
|
|
196
|
+
// that actually runs.
|
|
197
|
+
const sessionId = config.sessionId === ''
|
|
198
|
+
? `main-session-${randomUUID()}`
|
|
199
|
+
: config.sessionId;
|
|
200
|
+
bootingSessionId = sessionId;
|
|
201
|
+
await start(SessionId(sessionId), false);
|
|
159
202
|
}
|
|
160
203
|
return;
|
|
161
204
|
}
|
|
162
205
|
await start(SessionId(config.sessionId), config.resume === true);
|
|
163
206
|
};
|
|
164
207
|
void boot().catch((error) => {
|
|
165
|
-
process.stderr.write(`dsh-ssh-tui: session "${
|
|
208
|
+
process.stderr.write(`dsh-ssh-tui: session "${bootingSessionId}" failed to start: ${errorChain(error)}\n`);
|
|
166
209
|
const exit = ctx.get('appExit');
|
|
167
210
|
if (exit !== undefined)
|
|
168
211
|
exit(1);
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAiE,MAAM,wBAAwB,CAAA;AAG7H,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAsB,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/picker.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { StringDecoder } from 'node:string_decoder';
|
|
7
7
|
import { formatSessionTime, listResumableSessions } from './session-list.js';
|
|
8
|
+
import { truncateToWidth } from './tui.js';
|
|
8
9
|
/**
|
|
9
10
|
* Show the picker and wait for one digit, Enter (new session), or Esc/Ctrl+C
|
|
10
11
|
* (cancel). Restores the terminal before resolving.
|
|
@@ -33,20 +34,20 @@ export async function showSessionPicker(ctx, color) {
|
|
|
33
34
|
const render = () => {
|
|
34
35
|
const width = Math.max(20, process.stdout.columns || 80);
|
|
35
36
|
const lines = [
|
|
36
|
-
style('DeepSeek Harness — 选择要恢复的历史会话', '1'),
|
|
37
|
+
style(truncateToWidth('DeepSeek Harness — 选择要恢复的历史会话', width), '1'),
|
|
37
38
|
'─'.repeat(width),
|
|
38
39
|
];
|
|
39
40
|
sessions.forEach((session, index) => {
|
|
40
|
-
lines.push(`${index + 1} ${session.label}
|
|
41
|
-
|
|
41
|
+
lines.push(style(truncateToWidth(`${index + 1} ${session.label}`, width), '1'));
|
|
42
|
+
const meta = `${session.unreadable === true ? '⚠ 无法读取 · ' : ''}${formatSessionTime(session.updatedAt)} · ${session.cwd}`;
|
|
43
|
+
lines.push(` ${style(truncateToWidth(meta, Math.max(1, width - 3)), '90')}`);
|
|
42
44
|
});
|
|
43
45
|
lines.push('');
|
|
44
46
|
lines.push(`${style('0', '36')} / ${style('Enter', '36')} 新建会话`);
|
|
45
47
|
lines.push(`${style('Esc', '36')} 取消`);
|
|
46
48
|
process.stdout.write('\x1b[2J\x1b[H');
|
|
47
49
|
for (const line of lines) {
|
|
48
|
-
|
|
49
|
-
process.stdout.write(`${wrapped}\x1b[0m\x1b[K\n`);
|
|
50
|
+
process.stdout.write(`${line}\x1b[0m\x1b[K\n`);
|
|
50
51
|
}
|
|
51
52
|
};
|
|
52
53
|
return new Promise((resolve) => {
|
|
@@ -56,7 +57,12 @@ export async function showSessionPicker(ctx, color) {
|
|
|
56
57
|
return;
|
|
57
58
|
done = true;
|
|
58
59
|
process.stdin.removeListener('data', onData);
|
|
59
|
-
|
|
60
|
+
try {
|
|
61
|
+
process.stdin.setRawMode(false);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// The stream may already be closed during shutdown; restoring is best-effort.
|
|
65
|
+
}
|
|
60
66
|
process.stdin.pause();
|
|
61
67
|
process.stdout.write(`\x1b[0m\x1b[?25h${useAltScreen ? '\x1b[?1049l' : ''}\n`);
|
|
62
68
|
resolve(result);
|
package/lib/picker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAQ1C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAY,EAAE,KAAc;IAClE,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACjD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAA;QAChF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACxB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAC7D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAA;QAC/F,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACxB,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG;WACzD,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM,CAAA;IACjD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;IACzC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAA;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;IAErE,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;IAClG,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACxD,MAAM,KAAK,GAAa;YACtB,KAAK,CAAC,eAAe,CAAC,+BAA+B,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC;YACnE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;SAClB,CAAA;QACD,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YAChF,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAA;YACxH,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAA;QAChD,CAAC;IACH,CAAC,CAAA;IAED,OAAO,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,EAAE;QAClD,IAAI,IAAI,GAAG,KAAK,CAAA;QAChB,MAAM,OAAO,GAAG,CAAC,MAA2B,EAAQ,EAAE;YACpD,IAAI,IAAI;gBAAE,OAAM;YAChB,IAAI,GAAG,IAAI,CAAA;YACX,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC5C,IAAI,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,8EAA8E;YAChF,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAC9E,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC,CAAA;QACD,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;YACrC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACjC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,CAAA;oBACb,OAAM;gBACR,CAAC;gBACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACnD,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;oBACxB,OAAM;gBACR,CAAC;gBACD,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;oBAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;oBAC1C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC1B,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;wBAC3C,OAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAA;QACD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,MAAM,EAAE,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/lib/session-list.js
CHANGED
|
@@ -12,13 +12,17 @@ export function formatSessionTime(timestamp) {
|
|
|
12
12
|
/**
|
|
13
13
|
* List the most recent resumable top-level sessions, newest first.
|
|
14
14
|
*
|
|
15
|
-
* Subagent-owned sessions
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* Subagent-owned sessions and the current session are excluded. Sessions
|
|
16
|
+
* whose event log cannot be inspected are kept (marked `unreadable`) instead
|
|
17
|
+
* of silently disappearing from history; readable sessions with user input
|
|
18
|
+
* sort first. The label is the user's first input, falling back to the
|
|
19
|
+
* session title and then the id.
|
|
18
20
|
* @param persistence - the session persistence service.
|
|
19
21
|
* @param currentId - the live session to exclude (empty at launch).
|
|
20
|
-
* @returns up to nine candidates in display order
|
|
22
|
+
* @returns up to nine candidates in display order.
|
|
21
23
|
*/
|
|
24
|
+
/** Upper bound on one inspection batch, so the picker never fans out unbounded. */
|
|
25
|
+
const INSPECT_BATCH_SIZE = 30;
|
|
22
26
|
export async function listResumableSessions(persistence, currentId) {
|
|
23
27
|
const headers = await persistence.list();
|
|
24
28
|
const candidates = headers
|
|
@@ -26,24 +30,24 @@ export async function listResumableSessions(persistence, currentId) {
|
|
|
26
30
|
&& meta.cwd !== undefined
|
|
27
31
|
&& meta.origin !== 'subagent'
|
|
28
32
|
&& (meta.delegationDepth ?? 0) === 0)
|
|
29
|
-
.sort((a, b) => b.createdAt - a.createdAt)
|
|
30
|
-
|
|
31
|
-
const inspected = await Promise.all(candidates.map(async (meta) => {
|
|
33
|
+
.sort((a, b) => b.createdAt - a.createdAt);
|
|
34
|
+
const inspectCandidate = async (meta) => {
|
|
32
35
|
try {
|
|
33
36
|
const inspection = await persistence.inspect(meta.id);
|
|
34
37
|
const firstUserMessage = inspection.events.find((event) => event.type === 'user/message'
|
|
35
38
|
&& event.data.source.kind === 'user');
|
|
36
39
|
const firstUserText = firstUserMessage === undefined
|
|
37
40
|
? undefined
|
|
38
|
-
: firstUserMessage.data.content
|
|
41
|
+
: Array.from(firstUserMessage.data.content
|
|
39
42
|
.map((block) => {
|
|
40
43
|
const candidate = block;
|
|
41
44
|
return candidate.type === 'text' && typeof candidate.text === 'string' ? candidate.text : '';
|
|
42
45
|
})
|
|
43
46
|
.join(' ')
|
|
44
47
|
.replace(/\s+/gu, ' ')
|
|
45
|
-
.trim()
|
|
46
|
-
.slice(0, 80)
|
|
48
|
+
.trim())
|
|
49
|
+
.slice(0, 80)
|
|
50
|
+
.join('');
|
|
47
51
|
const titleEvent = [...inspection.events].reverse()
|
|
48
52
|
.find(event => event.type === 'session/title');
|
|
49
53
|
const title = titleEvent === undefined
|
|
@@ -52,24 +56,48 @@ export async function listResumableSessions(persistence, currentId) {
|
|
|
52
56
|
const updatedAt = inspection.events.at(-1)?.time ?? meta.createdAt;
|
|
53
57
|
return {
|
|
54
58
|
id: meta.id,
|
|
55
|
-
label: firstUserText
|
|
59
|
+
label: firstUserText !== undefined && firstUserText !== ''
|
|
60
|
+
? firstUserText
|
|
61
|
+
: title !== undefined && title !== ''
|
|
62
|
+
? title
|
|
63
|
+
: meta.id,
|
|
56
64
|
updatedAt,
|
|
57
65
|
cwd: meta.cwd ?? '',
|
|
58
66
|
hasUserInput: firstUserMessage !== undefined,
|
|
59
67
|
};
|
|
60
68
|
}
|
|
61
69
|
catch {
|
|
70
|
+
// A corrupt/unsupported log must not make the session vanish from the
|
|
71
|
+
// picker: keep it visible under its id and let a resume attempt report
|
|
72
|
+
// the real error.
|
|
62
73
|
return {
|
|
63
74
|
id: meta.id,
|
|
64
75
|
label: meta.id,
|
|
65
76
|
updatedAt: meta.createdAt,
|
|
66
77
|
cwd: meta.cwd ?? '',
|
|
67
78
|
hasUserInput: false,
|
|
79
|
+
unreadable: true,
|
|
68
80
|
};
|
|
69
81
|
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
82
|
+
};
|
|
83
|
+
// Headers only carry creation time, so inspect by creation recency until
|
|
84
|
+
// nine sessions with real user input are found. Recent empty boot rows (a
|
|
85
|
+
// launch that exited before the first message) must not push older real
|
|
86
|
+
// conversations out of the fixed window.
|
|
87
|
+
const inspected = [];
|
|
88
|
+
for (let offset = 0; offset < candidates.length; offset += INSPECT_BATCH_SIZE) {
|
|
89
|
+
const batch = candidates.slice(offset, offset + INSPECT_BATCH_SIZE);
|
|
90
|
+
inspected.push(...await Promise.all(batch.map(inspectCandidate)));
|
|
91
|
+
if (inspected.filter(item => item.hasUserInput).length >= 9)
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
const resumable = inspected.filter(item => item.hasUserInput || item.unreadable === true);
|
|
95
|
+
// Readable sessions with user input first, unreadable sessions after them;
|
|
96
|
+
// within each group the inspected activity time puts the most recently
|
|
97
|
+
// touched session first.
|
|
98
|
+
resumable.sort((a, b) => (a.unreadable === true ? 1 : 0) - (b.unreadable === true ? 1 : 0)
|
|
99
|
+
|| b.updatedAt - a.updatedAt);
|
|
100
|
+
return resumable
|
|
73
101
|
.slice(0, 9)
|
|
74
102
|
.map(({ hasUserInput: _hasUserInput, ...rest }) => rest);
|
|
75
103
|
}
|
package/lib/session-list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-list.js","sourceRoot":"","sources":["../src/session-list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"session-list.js","sourceRoot":"","sources":["../src/session-list.ts"],"names":[],"mappings":"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"}
|
package/lib/startup.js
CHANGED
|
@@ -49,8 +49,8 @@ export function apply(ctx) {
|
|
|
49
49
|
program.error('dsh --profile tui: a session id requires resume mode or --resume');
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
|
-
if (options.new === true && (flagValue !== undefined || positionalId !== '')) {
|
|
53
|
-
program.error('dsh --profile tui: --new cannot be combined with a resume session id');
|
|
52
|
+
if (options.new === true && (flagValue !== undefined || positionalId !== '' || mode !== undefined)) {
|
|
53
|
+
program.error('dsh --profile tui: --new cannot be combined with a resume session id or mode');
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
const resumeId = flagId !== '' ? flagId : positionalId;
|
package/lib/startup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,6BAA6B,CAAA;AAE7E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAA;AAEtD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAA;AAwBnC,MAAM,CAAC,MAAM,IAAI,GAAG,iBAAiB,CAAA;AACrC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,aAAa,CAAC,CAAA;AAErC;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,mBAAmB,CAAC;SACzB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,UAAU,CAAC,YAAY,EAAE,gBAAgB,CAAC;SAC1C,QAAQ,CAAC,QAAQ,EAAE,0CAA0C,CAAC;SAC9D,QAAQ,CAAC,WAAW,EAAE,6CAA6C,CAAC;SACpE,MAAM,CAAC,oBAAoB,EAAE,qDAAqD,CAAC;SACnF,MAAM,CAAC,OAAO,EAAE,kDAAkD,CAAC;SACnE,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,CAAC;SAC1D,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,CAAC;SACtE,MAAM,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAA;IAE9C,OAAO,CAAC,MAAM,CAAC,CACb,IAAwB,EACxB,OAA2B,EAC3B,OAMC,EACD,EAAE;QACF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,wCAAwC,IAAI,uBAAuB,CAAC,CAAA;YAClF,OAAM;QACR,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAA;QAChC,MAAM,MAAM,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACpE,MAAM,YAAY,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QAC1C,IAAI,YAAY,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAA;YAC1G,OAAM;QACR,CAAC;QACD,IAAI,YAAY,KAAK,EAAE,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAA;YACjF,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,YAAY,KAAK,EAAE,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent model defaults and the settings section the TUI edits with
|
|
3
|
+
* `/submodel` and `/subeffort`.
|
|
4
|
+
*
|
|
5
|
+
* The provider is deliberately inherited from the running parent session:
|
|
6
|
+
* the subagent selection only overrides the provider when the user stored an
|
|
7
|
+
* explicit route. The model defaults to the lightweight `deepseek-v4-flash`.
|
|
8
|
+
*/
|
|
9
|
+
import z from '@deepseek-ai/schemastery';
|
|
10
|
+
import { ReasoningEffortId } from '@deepseek-ai/dsh-llm';
|
|
11
|
+
import { installSettingsSection, settingsNamespace } from '@deepseek-ai/dsh-settings';
|
|
12
|
+
/** Settings namespace carrying the TUI's subagent model selection. */
|
|
13
|
+
export const SUBAGENT_SETTINGS_NAMESPACE = settingsNamespace('ssh-tui-subagent');
|
|
14
|
+
/** Lightweight default model used for subagent children. */
|
|
15
|
+
export const DEFAULT_SUBAGENT_MODEL = 'deepseek-v4-flash';
|
|
16
|
+
/** Settings schema for `$DSH_HOME/settings.yaml`. */
|
|
17
|
+
export const SUBAGENT_SETTINGS_SCHEMA = z.object({
|
|
18
|
+
provider: z.string(),
|
|
19
|
+
model: z.string().default(DEFAULT_SUBAGENT_MODEL),
|
|
20
|
+
reasoningEffort: z.string(),
|
|
21
|
+
});
|
|
22
|
+
/** Normalize a raw settings section into a live typed selection. */
|
|
23
|
+
export function normalizeSubagentSelection(value) {
|
|
24
|
+
const raw = (typeof value === 'object' && value !== null ? value : {});
|
|
25
|
+
return {
|
|
26
|
+
...(typeof raw.provider === 'string' && raw.provider.trim() !== ''
|
|
27
|
+
? { provider: raw.provider.trim() }
|
|
28
|
+
: {}),
|
|
29
|
+
model: typeof raw.model === 'string' && raw.model.trim() !== ''
|
|
30
|
+
? raw.model.trim()
|
|
31
|
+
: DEFAULT_SUBAGENT_MODEL,
|
|
32
|
+
...(typeof raw.reasoningEffort === 'string' && raw.reasoningEffort.trim() !== ''
|
|
33
|
+
? { reasoningEffort: ReasoningEffortId(raw.reasoningEffort.trim()) }
|
|
34
|
+
: {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Install the settings-backed subagent selection for one TUI plugin fiber.
|
|
39
|
+
* Returns the mutable ref the request waterfall and the slash commands share.
|
|
40
|
+
*/
|
|
41
|
+
export function createSubagentSelection(ctx) {
|
|
42
|
+
let source = () => ({ model: DEFAULT_SUBAGENT_MODEL });
|
|
43
|
+
const ref = { current: normalizeSubagentSelection(source()) };
|
|
44
|
+
installSettingsSection(ctx, SUBAGENT_SETTINGS_NAMESPACE, SUBAGENT_SETTINGS_SCHEMA, {
|
|
45
|
+
model: DEFAULT_SUBAGENT_MODEL,
|
|
46
|
+
}, {
|
|
47
|
+
setSource: (current) => {
|
|
48
|
+
source = () => current();
|
|
49
|
+
},
|
|
50
|
+
onChange: () => {
|
|
51
|
+
ref.current = normalizeSubagentSelection(source());
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
return ref;
|
|
55
|
+
}
|
|
56
|
+
/** Serialize a live selection back into the settings document shape. */
|
|
57
|
+
export function subagentSettingsValue(selection) {
|
|
58
|
+
return {
|
|
59
|
+
...(selection.provider === undefined ? {} : { provider: selection.provider }),
|
|
60
|
+
model: selection.model,
|
|
61
|
+
...(selection.reasoningEffort === undefined ? {} : { reasoningEffort: String(selection.reasoningEffort) }),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=subagent-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-model.js","sourceRoot":"","sources":["../src/subagent-model.ts"],"names":[],"mappings":"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"}
|