@dsh-cc/tui 0.5.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/LICENSE +201 -0
- package/README.md +144 -0
- package/lib/bash-history.d.ts +31 -0
- package/lib/bash-history.d.ts.map +1 -0
- package/lib/bash-history.js +94 -0
- package/lib/bash-history.js.map +1 -0
- package/lib/compact-fold.d.ts +35 -0
- package/lib/compact-fold.d.ts.map +1 -0
- package/lib/compact-fold.js +60 -0
- package/lib/compact-fold.js.map +1 -0
- package/lib/components/arg-completers.d.ts +22 -0
- package/lib/components/arg-completers.d.ts.map +1 -0
- package/lib/components/arg-completers.js +75 -0
- package/lib/components/arg-completers.js.map +1 -0
- package/lib/components/code-theme.d.ts +25 -0
- package/lib/components/code-theme.d.ts.map +1 -0
- package/lib/components/code-theme.js +137 -0
- package/lib/components/code-theme.js.map +1 -0
- package/lib/components/completion.d.ts +50 -0
- package/lib/components/completion.d.ts.map +1 -0
- package/lib/components/completion.js +279 -0
- package/lib/components/completion.js.map +1 -0
- package/lib/components/diff-card.d.ts +29 -0
- package/lib/components/diff-card.d.ts.map +1 -0
- package/lib/components/diff-card.js +175 -0
- package/lib/components/diff-card.js.map +1 -0
- package/lib/components/diff-hunks.d.ts +44 -0
- package/lib/components/diff-hunks.d.ts.map +1 -0
- package/lib/components/diff-hunks.js +188 -0
- package/lib/components/diff-hunks.js.map +1 -0
- package/lib/components/editor-history.d.ts +23 -0
- package/lib/components/editor-history.d.ts.map +1 -0
- package/lib/components/editor-history.js +29 -0
- package/lib/components/editor-history.js.map +1 -0
- package/lib/components/markdown-theme.d.ts +11 -0
- package/lib/components/markdown-theme.d.ts.map +1 -0
- package/lib/components/markdown-theme.js +29 -0
- package/lib/components/markdown-theme.js.map +1 -0
- package/lib/components/masked-input.d.ts +24 -0
- package/lib/components/masked-input.d.ts.map +1 -0
- package/lib/components/masked-input.js +168 -0
- package/lib/components/masked-input.js.map +1 -0
- package/lib/components/overlay-host.d.ts +31 -0
- package/lib/components/overlay-host.d.ts.map +1 -0
- package/lib/components/overlay-host.js +128 -0
- package/lib/components/overlay-host.js.map +1 -0
- package/lib/components/overlays.d.ts +94 -0
- package/lib/components/overlays.d.ts.map +1 -0
- package/lib/components/overlays.js +450 -0
- package/lib/components/overlays.js.map +1 -0
- package/lib/components/provider-box.d.ts +23 -0
- package/lib/components/provider-box.d.ts.map +1 -0
- package/lib/components/provider-box.js +164 -0
- package/lib/components/provider-box.js.map +1 -0
- package/lib/components/read-group.d.ts +51 -0
- package/lib/components/read-group.d.ts.map +1 -0
- package/lib/components/read-group.js +105 -0
- package/lib/components/read-group.js.map +1 -0
- package/lib/components/root-bash.d.ts +36 -0
- package/lib/components/root-bash.d.ts.map +1 -0
- package/lib/components/root-bash.js +112 -0
- package/lib/components/root-bash.js.map +1 -0
- package/lib/components/root-types.d.ts +42 -0
- package/lib/components/root-types.d.ts.map +1 -0
- package/lib/components/root-types.js +8 -0
- package/lib/components/root-types.js.map +1 -0
- package/lib/components/root-utils.d.ts +22 -0
- package/lib/components/root-utils.d.ts.map +1 -0
- package/lib/components/root-utils.js +45 -0
- package/lib/components/root-utils.js.map +1 -0
- package/lib/components/root.d.ts +25 -0
- package/lib/components/root.d.ts.map +1 -0
- package/lib/components/root.js +357 -0
- package/lib/components/root.js.map +1 -0
- package/lib/components/theme.d.ts +61 -0
- package/lib/components/theme.d.ts.map +1 -0
- package/lib/components/theme.js +99 -0
- package/lib/components/theme.js.map +1 -0
- package/lib/components/transcript.d.ts +43 -0
- package/lib/components/transcript.d.ts.map +1 -0
- package/lib/components/transcript.js +203 -0
- package/lib/components/transcript.js.map +1 -0
- package/lib/components/working-line.d.ts +35 -0
- package/lib/components/working-line.d.ts.map +1 -0
- package/lib/components/working-line.js +66 -0
- package/lib/components/working-line.js.map +1 -0
- package/lib/effort-catalog.d.ts +27 -0
- package/lib/effort-catalog.d.ts.map +1 -0
- package/lib/effort-catalog.js +36 -0
- package/lib/effort-catalog.js.map +1 -0
- package/lib/export-markdown.d.ts +18 -0
- package/lib/export-markdown.d.ts.map +1 -0
- package/lib/export-markdown.js +124 -0
- package/lib/export-markdown.js.map +1 -0
- package/lib/harness/approval-preview.d.ts +33 -0
- package/lib/harness/approval-preview.d.ts.map +1 -0
- package/lib/harness/approval-preview.js +179 -0
- package/lib/harness/approval-preview.js.map +1 -0
- package/lib/harness/boot-banner.d.ts +14 -0
- package/lib/harness/boot-banner.d.ts.map +1 -0
- package/lib/harness/boot-banner.js +89 -0
- package/lib/harness/boot-banner.js.map +1 -0
- package/lib/harness/driver-agent.d.ts +78 -0
- package/lib/harness/driver-agent.d.ts.map +1 -0
- package/lib/harness/driver-agent.js +314 -0
- package/lib/harness/driver-agent.js.map +1 -0
- package/lib/harness/driver-agents.d.ts +20 -0
- package/lib/harness/driver-agents.d.ts.map +1 -0
- package/lib/harness/driver-agents.js +123 -0
- package/lib/harness/driver-agents.js.map +1 -0
- package/lib/harness/driver-approvals.d.ts +38 -0
- package/lib/harness/driver-approvals.d.ts.map +1 -0
- package/lib/harness/driver-approvals.js +277 -0
- package/lib/harness/driver-approvals.js.map +1 -0
- package/lib/harness/driver-bash.d.ts +15 -0
- package/lib/harness/driver-bash.d.ts.map +1 -0
- package/lib/harness/driver-bash.js +73 -0
- package/lib/harness/driver-bash.js.map +1 -0
- package/lib/harness/driver-catalog.d.ts +84 -0
- package/lib/harness/driver-catalog.d.ts.map +1 -0
- package/lib/harness/driver-catalog.js +256 -0
- package/lib/harness/driver-catalog.js.map +1 -0
- package/lib/harness/driver-ctx.d.ts +462 -0
- package/lib/harness/driver-ctx.d.ts.map +1 -0
- package/lib/harness/driver-ctx.js +11 -0
- package/lib/harness/driver-ctx.js.map +1 -0
- package/lib/harness/driver-hud.d.ts +31 -0
- package/lib/harness/driver-hud.d.ts.map +1 -0
- package/lib/harness/driver-hud.js +204 -0
- package/lib/harness/driver-hud.js.map +1 -0
- package/lib/harness/driver-live.d.ts +36 -0
- package/lib/harness/driver-live.d.ts.map +1 -0
- package/lib/harness/driver-live.js +44 -0
- package/lib/harness/driver-live.js.map +1 -0
- package/lib/harness/driver-modal.d.ts +52 -0
- package/lib/harness/driver-modal.d.ts.map +1 -0
- package/lib/harness/driver-modal.js +78 -0
- package/lib/harness/driver-modal.js.map +1 -0
- package/lib/harness/driver-mode.d.ts +35 -0
- package/lib/harness/driver-mode.d.ts.map +1 -0
- package/lib/harness/driver-mode.js +84 -0
- package/lib/harness/driver-mode.js.map +1 -0
- package/lib/harness/driver-pickers.d.ts +48 -0
- package/lib/harness/driver-pickers.d.ts.map +1 -0
- package/lib/harness/driver-pickers.js +249 -0
- package/lib/harness/driver-pickers.js.map +1 -0
- package/lib/harness/driver-promote.d.ts +29 -0
- package/lib/harness/driver-promote.d.ts.map +1 -0
- package/lib/harness/driver-promote.js +36 -0
- package/lib/harness/driver-promote.js.map +1 -0
- package/lib/harness/driver-queue.d.ts +19 -0
- package/lib/harness/driver-queue.d.ts.map +1 -0
- package/lib/harness/driver-queue.js +281 -0
- package/lib/harness/driver-queue.js.map +1 -0
- package/lib/harness/driver-run-local.d.ts +32 -0
- package/lib/harness/driver-run-local.d.ts.map +1 -0
- package/lib/harness/driver-run-local.js +366 -0
- package/lib/harness/driver-run-local.js.map +1 -0
- package/lib/harness/driver-sessions.d.ts +28 -0
- package/lib/harness/driver-sessions.d.ts.map +1 -0
- package/lib/harness/driver-sessions.js +386 -0
- package/lib/harness/driver-sessions.js.map +1 -0
- package/lib/harness/driver.d.ts +22 -0
- package/lib/harness/driver.d.ts.map +1 -0
- package/lib/harness/driver.js +459 -0
- package/lib/harness/driver.js.map +1 -0
- package/lib/harness/preset.d.ts +32 -0
- package/lib/harness/preset.d.ts.map +1 -0
- package/lib/harness/preset.js +34 -0
- package/lib/harness/preset.js.map +1 -0
- package/lib/harness/session-list.d.ts +65 -0
- package/lib/harness/session-list.d.ts.map +1 -0
- package/lib/harness/session-list.js +91 -0
- package/lib/harness/session-list.js.map +1 -0
- package/lib/harness/shell-output.d.ts +44 -0
- package/lib/harness/shell-output.d.ts.map +1 -0
- package/lib/harness/shell-output.js +90 -0
- package/lib/harness/shell-output.js.map +1 -0
- package/lib/harness/statusline-cc-transcript.d.ts +51 -0
- package/lib/harness/statusline-cc-transcript.d.ts.map +1 -0
- package/lib/harness/statusline-cc-transcript.js +191 -0
- package/lib/harness/statusline-cc-transcript.js.map +1 -0
- package/lib/harness/statusline-command.d.ts +54 -0
- package/lib/harness/statusline-command.d.ts.map +1 -0
- package/lib/harness/statusline-command.js +161 -0
- package/lib/harness/statusline-command.js.map +1 -0
- package/lib/harness/statusline-payload.d.ts +79 -0
- package/lib/harness/statusline-payload.d.ts.map +1 -0
- package/lib/harness/statusline-payload.js +93 -0
- package/lib/harness/statusline-payload.js.map +1 -0
- package/lib/harness/statusline-settings.d.ts +47 -0
- package/lib/harness/statusline-settings.d.ts.map +1 -0
- package/lib/harness/statusline-settings.js +57 -0
- package/lib/harness/statusline-settings.js.map +1 -0
- package/lib/harness/statusline-wiring.d.ts +45 -0
- package/lib/harness/statusline-wiring.d.ts.map +1 -0
- package/lib/harness/statusline-wiring.js +247 -0
- package/lib/harness/statusline-wiring.js.map +1 -0
- package/lib/harness/usage-view.d.ts +84 -0
- package/lib/harness/usage-view.d.ts.map +1 -0
- package/lib/harness/usage-view.js +199 -0
- package/lib/harness/usage-view.js.map +1 -0
- package/lib/harness/worktree-exit.d.ts +105 -0
- package/lib/harness/worktree-exit.d.ts.map +1 -0
- package/lib/harness/worktree-exit.js +168 -0
- package/lib/harness/worktree-exit.js.map +1 -0
- package/lib/history.d.ts +50 -0
- package/lib/history.d.ts.map +1 -0
- package/lib/history.js +139 -0
- package/lib/history.js.map +1 -0
- package/lib/index.d.ts +63 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +54 -0
- package/lib/index.js.map +1 -0
- package/lib/input.d.ts +158 -0
- package/lib/input.d.ts.map +1 -0
- package/lib/input.js +400 -0
- package/lib/input.js.map +1 -0
- package/lib/invariant.d.ts +14 -0
- package/lib/invariant.d.ts.map +1 -0
- package/lib/invariant.js +20 -0
- package/lib/invariant.js.map +1 -0
- package/lib/mode-cycle.d.ts +22 -0
- package/lib/mode-cycle.d.ts.map +1 -0
- package/lib/mode-cycle.js +32 -0
- package/lib/mode-cycle.js.map +1 -0
- package/lib/model-catalog.d.ts +22 -0
- package/lib/model-catalog.d.ts.map +1 -0
- package/lib/model-catalog.js +45 -0
- package/lib/model-catalog.js.map +1 -0
- package/lib/packaged-preset.d.ts +32 -0
- package/lib/packaged-preset.d.ts.map +1 -0
- package/lib/packaged-preset.js +94 -0
- package/lib/packaged-preset.js.map +1 -0
- package/lib/plugin.d.ts +11 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +88 -0
- package/lib/plugin.js.map +1 -0
- package/lib/profile.d.ts +4 -0
- package/lib/profile.d.ts.map +1 -0
- package/lib/profile.js +7 -0
- package/lib/profile.js.map +1 -0
- package/lib/project-sessions.d.ts +29 -0
- package/lib/project-sessions.d.ts.map +1 -0
- package/lib/project-sessions.js +60 -0
- package/lib/project-sessions.js.map +1 -0
- package/lib/project.d.ts +75 -0
- package/lib/project.d.ts.map +1 -0
- package/lib/project.js +196 -0
- package/lib/project.js.map +1 -0
- package/lib/provider-actions.d.ts +37 -0
- package/lib/provider-actions.d.ts.map +1 -0
- package/lib/provider-actions.js +417 -0
- package/lib/provider-actions.js.map +1 -0
- package/lib/provider-command.d.ts +109 -0
- package/lib/provider-command.d.ts.map +1 -0
- package/lib/provider-command.js +220 -0
- package/lib/provider-command.js.map +1 -0
- package/lib/provider-detail.d.ts +15 -0
- package/lib/provider-detail.d.ts.map +1 -0
- package/lib/provider-detail.js +201 -0
- package/lib/provider-detail.js.map +1 -0
- package/lib/provider-flow.d.ts +191 -0
- package/lib/provider-flow.d.ts.map +1 -0
- package/lib/provider-flow.js +192 -0
- package/lib/provider-flow.js.map +1 -0
- package/lib/provider-presets.d.ts +32 -0
- package/lib/provider-presets.d.ts.map +1 -0
- package/lib/provider-presets.js +105 -0
- package/lib/provider-presets.js.map +1 -0
- package/lib/provider-read.d.ts +63 -0
- package/lib/provider-read.d.ts.map +1 -0
- package/lib/provider-read.js +115 -0
- package/lib/provider-read.js.map +1 -0
- package/lib/provider-settings.d.ts +30 -0
- package/lib/provider-settings.d.ts.map +1 -0
- package/lib/provider-settings.js +65 -0
- package/lib/provider-settings.js.map +1 -0
- package/lib/resume-target.d.ts +59 -0
- package/lib/resume-target.d.ts.map +1 -0
- package/lib/resume-target.js +143 -0
- package/lib/resume-target.js.map +1 -0
- package/lib/slash.d.ts +44 -0
- package/lib/slash.d.ts.map +1 -0
- package/lib/slash.js +81 -0
- package/lib/slash.js.map +1 -0
- package/lib/state/driver-types.d.ts +505 -0
- package/lib/state/driver-types.d.ts.map +1 -0
- package/lib/state/driver-types.js +8 -0
- package/lib/state/driver-types.js.map +1 -0
- package/lib/state/driver-usage-types.d.ts +59 -0
- package/lib/state/driver-usage-types.d.ts.map +1 -0
- package/lib/state/driver-usage-types.js +8 -0
- package/lib/state/driver-usage-types.js.map +1 -0
- package/lib/statusline.d.ts +63 -0
- package/lib/statusline.d.ts.map +1 -0
- package/lib/statusline.js +97 -0
- package/lib/statusline.js.map +1 -0
- package/lib/store/pickers.d.ts +34 -0
- package/lib/store/pickers.d.ts.map +1 -0
- package/lib/store/pickers.js +111 -0
- package/lib/store/pickers.js.map +1 -0
- package/lib/store/provider-panel.d.ts +107 -0
- package/lib/store/provider-panel.d.ts.map +1 -0
- package/lib/store/provider-panel.js +151 -0
- package/lib/store/provider-panel.js.map +1 -0
- package/lib/store/question.d.ts +21 -0
- package/lib/store/question.d.ts.map +1 -0
- package/lib/store/question.js +59 -0
- package/lib/store/question.js.map +1 -0
- package/lib/store/queue.d.ts +27 -0
- package/lib/store/queue.d.ts.map +1 -0
- package/lib/store/queue.js +34 -0
- package/lib/store/queue.js.map +1 -0
- package/lib/store/session.d.ts +73 -0
- package/lib/store/session.d.ts.map +1 -0
- package/lib/store/session.js +172 -0
- package/lib/store/session.js.map +1 -0
- package/lib/store/subagents.d.ts +16 -0
- package/lib/store/subagents.d.ts.map +1 -0
- package/lib/store/subagents.js +44 -0
- package/lib/store/subagents.js.map +1 -0
- package/lib/store/todos.d.ts +35 -0
- package/lib/store/todos.d.ts.map +1 -0
- package/lib/store/todos.js +68 -0
- package/lib/store/todos.js.map +1 -0
- package/lib/store/usage.d.ts +15 -0
- package/lib/store/usage.d.ts.map +1 -0
- package/lib/store/usage.js +27 -0
- package/lib/store/usage.js.map +1 -0
- package/lib/store/views.d.ts +419 -0
- package/lib/store/views.d.ts.map +1 -0
- package/lib/store/views.js +3 -0
- package/lib/store/views.js.map +1 -0
- package/lib/store.d.ts +19 -0
- package/lib/store.d.ts.map +1 -0
- package/lib/store.js +10 -0
- package/lib/store.js.map +1 -0
- package/lib/terminal/lease.d.ts +33 -0
- package/lib/terminal/lease.d.ts.map +1 -0
- package/lib/terminal/lease.js +99 -0
- package/lib/terminal/lease.js.map +1 -0
- package/lib/tool-card.d.ts +75 -0
- package/lib/tool-card.d.ts.map +1 -0
- package/lib/tool-card.js +109 -0
- package/lib/tool-card.js.map +1 -0
- package/lib/tool-verbs.d.ts +12 -0
- package/lib/tool-verbs.d.ts.map +1 -0
- package/lib/tool-verbs.js +29 -0
- package/lib/tool-verbs.js.map +1 -0
- package/lib/transcript.d.ts +40 -0
- package/lib/transcript.d.ts.map +1 -0
- package/lib/transcript.js +413 -0
- package/lib/transcript.js.map +1 -0
- package/lib/working-line.d.ts +44 -0
- package/lib/working-line.d.ts.map +1 -0
- package/lib/working-line.js +56 -0
- package/lib/working-line.js.map +1 -0
- package/package.json +72 -0
- package/presets/cc/.dsh-cc-managed.json +5 -0
- package/presets/cc/agent.cordis.yml +524 -0
- package/presets/cc/preset.yml +3 -0
- package/scripts/stage-preset.mjs +26 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session switcher / /resume section of the in-process protocol driver.
|
|
3
|
+
*
|
|
4
|
+
* Moved out of harness/driver.ts's createDriver factory so the factory stays
|
|
5
|
+
* under the line budget. All shared state arrives on `rt` (DriverSessionsCtx)
|
|
6
|
+
* and is read through getters / by-reference holders — never a stale snapshot —
|
|
7
|
+
* because createDriver rebinds `state` on every emit.
|
|
8
|
+
*
|
|
9
|
+
* @module @dsh-cc/tui/harness/driver-sessions
|
|
10
|
+
*/
|
|
11
|
+
import { SessionId } from '@deepseek-ai/dsh-session';
|
|
12
|
+
import { UserQuestionError } from '@deepseek-ai/dsh-user-questions';
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { bootBannerRows } from "./boot-banner.js";
|
|
16
|
+
import { filterSessions, sortByActivity } from "./session-list.js";
|
|
17
|
+
import { defaultTuiDir } from "../history.js";
|
|
18
|
+
import { liveSessionCwd } from "./driver-live.js";
|
|
19
|
+
import { isProjectMember, resolveProject } from "../project.js";
|
|
20
|
+
import { readProjectSessionIds } from "../project-sessions.js";
|
|
21
|
+
import { clearQueue, clearRows, clearTurn, closeTodoPanel, moveSessionSwitcherFocus, setApproval, setBusy, setModelPicker, setPermissionMode, setQuestion, setSessionSwitcher, setSessionTitle, setTurnActive, upsertRow, } from "../store.js";
|
|
22
|
+
const toSessionEntryView = (s) => ({
|
|
23
|
+
id: s.id,
|
|
24
|
+
...(s.cwd === undefined ? {} : { cwd: s.cwd }),
|
|
25
|
+
createdAt: s.createdAt,
|
|
26
|
+
...(s.updatedAtMs === undefined ? {} : { updatedAtMs: s.updatedAtMs }),
|
|
27
|
+
...(s.title === undefined ? {} : { title: s.title }),
|
|
28
|
+
...(s.parentSession === undefined ? {} : { parentSession: s.parentSession }),
|
|
29
|
+
});
|
|
30
|
+
export function createSessionsSection(rt) {
|
|
31
|
+
const { emit, ctx } = rt;
|
|
32
|
+
const listSessions = async () => {
|
|
33
|
+
const persistence = ctx.get('sessionPersistence');
|
|
34
|
+
if (persistence === undefined)
|
|
35
|
+
return [];
|
|
36
|
+
return persistence.list();
|
|
37
|
+
};
|
|
38
|
+
// /resume picker working set: the full unfiltered list lives here while the
|
|
39
|
+
// overlay is open (state.sessionSwitcher.sessions is the visible slice
|
|
40
|
+
// only), and a generation token invalidates an in-flight title decoration
|
|
41
|
+
// when the picker closes or reopens.
|
|
42
|
+
let allSessions = [];
|
|
43
|
+
let switcherGeneration = 0;
|
|
44
|
+
// Project scope for the open picker: resolved once at open (git probes are
|
|
45
|
+
// too expensive per refilter keystroke) and dropped on close. `members`
|
|
46
|
+
// is the sidecar index of the scope project's bucket.
|
|
47
|
+
let switcherProject;
|
|
48
|
+
let switcherMembers = new Set();
|
|
49
|
+
/** cwd-scope predicate: sidecar-indexed, or cwd inside the project (main
|
|
50
|
+
* root or any of its worktrees) at a separator boundary. */
|
|
51
|
+
const isScopeMember = (entry) => switcherMembers.has(entry.id)
|
|
52
|
+
|| (entry.cwd !== undefined
|
|
53
|
+
&& switcherProject !== undefined
|
|
54
|
+
&& isProjectMember(entry.cwd, switcherProject));
|
|
55
|
+
/**
|
|
56
|
+
* Async title decoration for the open picker. The generation token read
|
|
57
|
+
* before the await guards the continuation: a result landing after the
|
|
58
|
+
* picker closed (or was reopened, which re-bumped the token) is dropped
|
|
59
|
+
* instead of mutating a stale view. Per-id rejections are skipped; a
|
|
60
|
+
* whole-call failure or abort just skips decoration — the overlay never
|
|
61
|
+
* fails because titles are missing.
|
|
62
|
+
*/
|
|
63
|
+
const decorateSessionTitles = async (ids) => {
|
|
64
|
+
const generation = switcherGeneration;
|
|
65
|
+
const sessionQuery = ctx.get('sessionQuery');
|
|
66
|
+
if (sessionQuery === undefined || ids.length === 0)
|
|
67
|
+
return;
|
|
68
|
+
let results;
|
|
69
|
+
try {
|
|
70
|
+
results = await sessionQuery.readTitleSnapshots(ids);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (generation !== switcherGeneration || rt.state().sessionSwitcher === undefined)
|
|
76
|
+
return;
|
|
77
|
+
const titles = new Map();
|
|
78
|
+
for (const result of results) {
|
|
79
|
+
if (result.status !== 'fulfilled')
|
|
80
|
+
continue;
|
|
81
|
+
const title = result.value.title?.title;
|
|
82
|
+
if (title === undefined || title.length === 0)
|
|
83
|
+
continue;
|
|
84
|
+
// Join on the requested id (`sessionId`), not `value.session.id`.
|
|
85
|
+
// The latter is a cloned header and is not the batch's identity key —
|
|
86
|
+
// using it stamps one title onto every row when headers collide.
|
|
87
|
+
titles.set(result.sessionId, title);
|
|
88
|
+
}
|
|
89
|
+
if (titles.size === 0)
|
|
90
|
+
return;
|
|
91
|
+
const withTitle = (entry) => {
|
|
92
|
+
const title = titles.get(entry.id);
|
|
93
|
+
return title === undefined ? entry : { ...entry, title };
|
|
94
|
+
};
|
|
95
|
+
allSessions = allSessions.map(withTitle);
|
|
96
|
+
const sw = rt.state().sessionSwitcher;
|
|
97
|
+
if (sw !== undefined) {
|
|
98
|
+
emit(setSessionSwitcher(rt.state(), { ...sw, sessions: sw.sessions.map(withTitle) }));
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
// Re-derive the visible list from the working set after a query/scope edit.
|
|
102
|
+
// Focus follows the current session when it survives the filter, else row 0.
|
|
103
|
+
const refilterSessionSwitcher = () => {
|
|
104
|
+
const sw = rt.state().sessionSwitcher;
|
|
105
|
+
if (sw === undefined)
|
|
106
|
+
return;
|
|
107
|
+
const visible = filterSessions(allSessions, {
|
|
108
|
+
scope: sw.scope,
|
|
109
|
+
query: sw.query,
|
|
110
|
+
currentId: sw.currentId,
|
|
111
|
+
isMember: isScopeMember,
|
|
112
|
+
});
|
|
113
|
+
const index = visible.findIndex((s) => s.id === sw.currentId);
|
|
114
|
+
emit(setSessionSwitcher(rt.state(), {
|
|
115
|
+
...sw,
|
|
116
|
+
sessions: visible.map(toSessionEntryView),
|
|
117
|
+
focused: index >= 0 ? index : 0,
|
|
118
|
+
totalCount: allSessions.length,
|
|
119
|
+
}));
|
|
120
|
+
// Second-chance decoration for newly visible, still-untitled rows
|
|
121
|
+
// (same generation rules, same 50-id cap as the initial open).
|
|
122
|
+
const untitled = visible.filter((s) => s.title === undefined).slice(0, 50).map((s) => s.id);
|
|
123
|
+
if (untitled.length > 0)
|
|
124
|
+
void decorateSessionTitles(untitled);
|
|
125
|
+
};
|
|
126
|
+
const openSessionSwitcher = async () => {
|
|
127
|
+
const sessions = await listSessions();
|
|
128
|
+
if (sessions.length === 0) {
|
|
129
|
+
emit(upsertRow(rt.state(), { kind: 'status', text: 'No sessions are available to resume.' }));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
switcherGeneration += 1;
|
|
133
|
+
allSessions = sortByActivity(sessions);
|
|
134
|
+
// Live header cwd wins over the process cwd: a marker-resumed session can
|
|
135
|
+
// have been created elsewhere, and the current session must always be
|
|
136
|
+
// visible in the default (cwd) scope. The scope is the session's
|
|
137
|
+
// *project* (main git root; worktrees collapse onto it), resolved once
|
|
138
|
+
// here — refilters on query keystrokes reuse it.
|
|
139
|
+
const scopeCwd = rt.current.agent.session.header.cwd ?? rt.cwd;
|
|
140
|
+
switcherProject = resolveProject(scopeCwd);
|
|
141
|
+
switcherMembers = readProjectSessionIds(join(defaultTuiDir(), 'projects', switcherProject.projectKey));
|
|
142
|
+
const currentId = String(rt.current.agent.session.id);
|
|
143
|
+
const visible = filterSessions(allSessions, {
|
|
144
|
+
scope: 'cwd',
|
|
145
|
+
query: '',
|
|
146
|
+
currentId,
|
|
147
|
+
isMember: isScopeMember,
|
|
148
|
+
});
|
|
149
|
+
const index = visible.findIndex((s) => s.id === currentId);
|
|
150
|
+
emit(setSessionSwitcher(rt.state(), {
|
|
151
|
+
sessions: visible.map(toSessionEntryView),
|
|
152
|
+
focused: index >= 0 ? index : 0,
|
|
153
|
+
switching: false,
|
|
154
|
+
currentId,
|
|
155
|
+
query: '',
|
|
156
|
+
scope: 'cwd',
|
|
157
|
+
cwd: scopeCwd,
|
|
158
|
+
totalCount: allSessions.length,
|
|
159
|
+
}));
|
|
160
|
+
// Decorate the first screenful asynchronously — the overlay must appear
|
|
161
|
+
// immediately, not wait for the title reads.
|
|
162
|
+
void decorateSessionTitles(visible.slice(0, 50).map((s) => s.id));
|
|
163
|
+
};
|
|
164
|
+
const closeSessionSwitcher = () => {
|
|
165
|
+
// Bump the generation so an in-flight decoration lands nowhere, and drop
|
|
166
|
+
// the working set with the overlay.
|
|
167
|
+
switcherGeneration += 1;
|
|
168
|
+
allSessions = [];
|
|
169
|
+
switcherProject = undefined;
|
|
170
|
+
switcherMembers = new Set();
|
|
171
|
+
emit(setSessionSwitcher(rt.state(), undefined));
|
|
172
|
+
};
|
|
173
|
+
const switchSession = async (id) => {
|
|
174
|
+
// No-op guard: same id → stay.
|
|
175
|
+
if (id === String(rt.current.agent.session.id))
|
|
176
|
+
return;
|
|
177
|
+
// Clear pending overlays and the modal queue (mirror the abort paths):
|
|
178
|
+
// every parked approval resolves cancelled and every parked question
|
|
179
|
+
// rejects cancelled. The session switcher overlay itself is managed by the
|
|
180
|
+
// caller (sessionSwitcherSubmit).
|
|
181
|
+
for (const entry of rt.spliceAll()) {
|
|
182
|
+
if (entry.kind === 'approval')
|
|
183
|
+
entry.resolve('cancelled');
|
|
184
|
+
else
|
|
185
|
+
entry.reject(new UserQuestionError('session switching', 'CANCELLED'));
|
|
186
|
+
}
|
|
187
|
+
emit(setApproval(rt.state(), undefined));
|
|
188
|
+
emit(setQuestion(rt.state(), undefined));
|
|
189
|
+
emit(setModelPicker(rt.state(), undefined));
|
|
190
|
+
emit(closeTodoPanel(rt.state()));
|
|
191
|
+
emit(clearQueue(setBusy(rt.state(), false)));
|
|
192
|
+
// Resume first: keeps the old session alive if resume throws. The harness
|
|
193
|
+
// supports multiple concurrent agents (each independently scoped), so a
|
|
194
|
+
// brief overlap is safe. On the SESSION's stored options — omit
|
|
195
|
+
// agentOptions unless config.provider/model were explicitly set (same
|
|
196
|
+
// logic as boot).
|
|
197
|
+
let newHandle;
|
|
198
|
+
try {
|
|
199
|
+
newHandle = await ctx.agents.resume({
|
|
200
|
+
resumeSessionId: SessionId(id),
|
|
201
|
+
setup: rt.withSelection,
|
|
202
|
+
...(rt.agentOptions === undefined ? {} : { agentOptions: rt.agentOptions }),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
const message = error?.message ?? String(error);
|
|
207
|
+
emit(upsertRow(rt.state(), { kind: 'status', text: `Resume failed: ${message}` }));
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
await bindSession(newHandle, { reseedModel: true });
|
|
211
|
+
};
|
|
212
|
+
// Shared bind path (also used by startFreshSession). dispose() stops the
|
|
213
|
+
// loop, unregisters the agent, and removes its session from the in-memory
|
|
214
|
+
// store; it does NOT delete the durable session log.
|
|
215
|
+
const bindSession = async (newHandle, opts = {}) => {
|
|
216
|
+
await rt.current.handle.dispose();
|
|
217
|
+
rt.current.handle = newHandle;
|
|
218
|
+
rt.current.agent = newHandle.agent;
|
|
219
|
+
// Re-scope prompt/bash history onto the switched session's project: the
|
|
220
|
+
// new session may live in a different working directory, and recall must
|
|
221
|
+
// follow IT, not the boot directory. No-op for same-project switches.
|
|
222
|
+
rt.rebindHistory(rt.current.agent.session.header.cwd);
|
|
223
|
+
// Rebuild the slash-command catalog for the NEW agent: commands.list()
|
|
224
|
+
// and skills.snapshot() are agent- and cwd-scoped, and neither service
|
|
225
|
+
// emits a change event on a switch. Failed resumes returned above, so a
|
|
226
|
+
// failed switch keeps the old catalog.
|
|
227
|
+
rt.refreshCatalog();
|
|
228
|
+
// Pin the switched session in its project's sidecar index so the picker
|
|
229
|
+
// scope no longer relies on the cwd-prefix heuristic for it.
|
|
230
|
+
rt.recordProjectSession(String(rt.current.agent.session.id), rt.current.agent.session.header.cwd);
|
|
231
|
+
// Resume reseeds the model AFTER the rebind: seedDefaultModel(true) reads
|
|
232
|
+
// rt.current.agent, which is the target session only once rebound here;
|
|
233
|
+
// the fresh-session path (startFreshSession) skips reseed and keeps the
|
|
234
|
+
// live /model route as agentOptions instead.
|
|
235
|
+
//
|
|
236
|
+
// Benign boot race (W4, documented — no locking): this reset seed shares
|
|
237
|
+
// no lock with the boot seed's now-async wait seam. If a switch ran
|
|
238
|
+
// during the boot seed window, a boot seed that already passed its
|
|
239
|
+
// `selection.current !== undefined` early-return could still write
|
|
240
|
+
// `selection.current` AFTER this reset intended "unset". At boot both
|
|
241
|
+
// resolve to the same value (agent options / the same deployment
|
|
242
|
+
// default), so the outcome is identical; no synchronization is added.
|
|
243
|
+
if (opts.reseedModel === true)
|
|
244
|
+
await rt.seedDefaultModel(true);
|
|
245
|
+
rt.writeResumeTarget(String(rt.current.agent.session.id));
|
|
246
|
+
rt.setMarkedContent(false);
|
|
247
|
+
// Reset the transcript: clear + boot banner + fold new history + mode/busy.
|
|
248
|
+
// Bind always clears the window title; foldHistory below re-seeds it
|
|
249
|
+
// when the new session's log has a session/title event.
|
|
250
|
+
emit(setSessionTitle(clearRows(rt.state()), undefined));
|
|
251
|
+
const modelLabel = rt.selection.current?.model ?? 'default model';
|
|
252
|
+
for (const row of bootBannerRows(modelLabel, rt.cwd))
|
|
253
|
+
emit(upsertRow(rt.state(), row));
|
|
254
|
+
emit(rt.foldHistory());
|
|
255
|
+
emit(setPermissionMode(rt.state(), rt.liveMode(rt.current.agent)));
|
|
256
|
+
// Success path: drop the previous session's anchor together with the busy
|
|
257
|
+
// sync (a failed resume returned above and keeps it), then re-anchor
|
|
258
|
+
// below once the new session's HUD is seeded.
|
|
259
|
+
emit(clearTurn(setBusy(rt.state(), rt.current.agent.status === 'running')));
|
|
260
|
+
// Refresh the HUD, todos, and branch for the new session: stateOf may
|
|
261
|
+
// already be populated (or absent — stale fields must not leak), and the
|
|
262
|
+
// cwd may point at a different repo.
|
|
263
|
+
rt.seedHud();
|
|
264
|
+
rt.seedTodos();
|
|
265
|
+
// Resumed log may end mid-turn: re-anchor the working line after seedHud
|
|
266
|
+
// so outputBase reads the new session's seeded token totals.
|
|
267
|
+
if (rt.state().busy) {
|
|
268
|
+
emit(setTurnActive(rt.state(), { startedAt: Date.now(), outputBase: rt.state().hud?.tokens?.output }));
|
|
269
|
+
}
|
|
270
|
+
rt.refreshBranch();
|
|
271
|
+
};
|
|
272
|
+
// /clear, /new, /reset: brand-new empty session in-process. Create-first:
|
|
273
|
+
// a failed create keeps the old session fully live. The in-flight turn is
|
|
274
|
+
// cancelled only AFTER the create succeeded, so a failed create leaves the
|
|
275
|
+
// old session untouched (drain-before-create would resolve parked
|
|
276
|
+
// approvals/question even when nothing gets replaced). Mode, cwd, and the
|
|
277
|
+
// live /model route are captured before any of that.
|
|
278
|
+
const startFreshSession = async () => {
|
|
279
|
+
const capturedMode = rt.liveMode(rt.current.agent, rt.state().permissionMode);
|
|
280
|
+
const liveCwd = liveSessionCwd(rt.current.agent, rt.cwd);
|
|
281
|
+
const route = rt.selection.current;
|
|
282
|
+
let newHandle;
|
|
283
|
+
try {
|
|
284
|
+
newHandle = await rt.createHandle(SessionId(`tui-${randomUUID()}`), {
|
|
285
|
+
cwd: liveCwd,
|
|
286
|
+
...(route?.provider !== undefined && route?.model !== undefined
|
|
287
|
+
? { agentOptions: { provider: route.provider, model: route.model } }
|
|
288
|
+
: rt.agentOptions === undefined ? {} : { agentOptions: rt.agentOptions }),
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
const message = error?.message ?? String(error);
|
|
293
|
+
emit(upsertRow(rt.state(), { kind: 'status', text: `Start failed: ${message}` }));
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
// Cancel only now that create succeeded: adjacent cancel+dispose may
|
|
297
|
+
// block until the loop aborts (latency, not correctness) — do not hoist
|
|
298
|
+
// the cancel back before create.
|
|
299
|
+
if (rt.state().busy || rt.current.agent.status === 'running') {
|
|
300
|
+
rt.current.agent.cancel({ kind: 'user' });
|
|
301
|
+
}
|
|
302
|
+
// Clear pending overlays and the modal queue (mirror switchSession):
|
|
303
|
+
// every parked approval resolves cancelled and every parked question
|
|
304
|
+
// rejects cancelled.
|
|
305
|
+
for (const entry of rt.spliceAll()) {
|
|
306
|
+
if (entry.kind === 'approval')
|
|
307
|
+
entry.resolve('cancelled');
|
|
308
|
+
else
|
|
309
|
+
entry.reject(new UserQuestionError('session switching', 'CANCELLED'));
|
|
310
|
+
}
|
|
311
|
+
emit(setApproval(rt.state(), undefined));
|
|
312
|
+
emit(setQuestion(rt.state(), undefined));
|
|
313
|
+
emit(setModelPicker(rt.state(), undefined));
|
|
314
|
+
emit(closeTodoPanel(rt.state()));
|
|
315
|
+
emit(clearQueue(setBusy(rt.state(), false)));
|
|
316
|
+
await bindSession(newHandle);
|
|
317
|
+
if (capturedMode !== 'default')
|
|
318
|
+
await rt.reapplyMode(capturedMode);
|
|
319
|
+
};
|
|
320
|
+
const sessionSwitcherSubmit = async () => {
|
|
321
|
+
const sw = rt.state().sessionSwitcher;
|
|
322
|
+
if (sw === undefined || sw.switching)
|
|
323
|
+
return;
|
|
324
|
+
const session = sw.sessions[sw.focused];
|
|
325
|
+
if (session === undefined)
|
|
326
|
+
return;
|
|
327
|
+
// Show the dim 'Switching…' state and block input while the switch is
|
|
328
|
+
// in flight.
|
|
329
|
+
emit(setSessionSwitcher(rt.state(), { ...sw, switching: true }));
|
|
330
|
+
try {
|
|
331
|
+
await switchSession(session.id);
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
// Close the overlay whether the switch succeeded or failed.
|
|
335
|
+
closeSessionSwitcher();
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
return {
|
|
339
|
+
listSessions,
|
|
340
|
+
openSessionSwitcher,
|
|
341
|
+
closeSessionSwitcher,
|
|
342
|
+
switchSession,
|
|
343
|
+
startFreshSession,
|
|
344
|
+
sessionSwitcherMove(delta) {
|
|
345
|
+
emit(moveSessionSwitcherFocus(rt.state(), delta));
|
|
346
|
+
},
|
|
347
|
+
sessionSwitcherType(text) {
|
|
348
|
+
const sw = rt.state().sessionSwitcher;
|
|
349
|
+
if (sw === undefined || text.length === 0)
|
|
350
|
+
return;
|
|
351
|
+
emit(setSessionSwitcher(rt.state(), { ...sw, query: sw.query + text }));
|
|
352
|
+
refilterSessionSwitcher();
|
|
353
|
+
},
|
|
354
|
+
sessionSwitcherBackspace() {
|
|
355
|
+
const sw = rt.state().sessionSwitcher;
|
|
356
|
+
if (sw === undefined || sw.query.length === 0)
|
|
357
|
+
return;
|
|
358
|
+
emit(setSessionSwitcher(rt.state(), { ...sw, query: sw.query.slice(0, -1) }));
|
|
359
|
+
refilterSessionSwitcher();
|
|
360
|
+
},
|
|
361
|
+
sessionSwitcherToggleScope() {
|
|
362
|
+
const sw = rt.state().sessionSwitcher;
|
|
363
|
+
if (sw === undefined)
|
|
364
|
+
return;
|
|
365
|
+
emit(setSessionSwitcher(rt.state(), { ...sw, scope: sw.scope === 'cwd' ? 'all' : 'cwd' }));
|
|
366
|
+
refilterSessionSwitcher();
|
|
367
|
+
},
|
|
368
|
+
async sessionSwitcherSubmit() {
|
|
369
|
+
await sessionSwitcherSubmit();
|
|
370
|
+
},
|
|
371
|
+
sessionSwitcherCancel() {
|
|
372
|
+
const sw = rt.state().sessionSwitcher;
|
|
373
|
+
if (sw === undefined)
|
|
374
|
+
return;
|
|
375
|
+
// Two-stage escape: a non-empty query clears the filter first (the
|
|
376
|
+
// overlay stays open); an empty query closes it.
|
|
377
|
+
if (sw.query.length > 0) {
|
|
378
|
+
emit(setSessionSwitcher(rt.state(), { ...sw, query: '' }));
|
|
379
|
+
refilterSessionSwitcher();
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
closeSessionSwitcher();
|
|
383
|
+
},
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=driver-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-sessions.js","sourceRoot":"","sources":["../../src/harness/driver-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process protocol driver: session/event → UI store, followup/steer/cancel
|
|
3
|
+
* back into the agent. Only this directory imports `@deepseek-ai/*`.
|
|
4
|
+
* @module @dsh-cc/tui/harness/driver
|
|
5
|
+
*/
|
|
6
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
7
|
+
import type { ProviderRuntime } from '../provider-command.ts';
|
|
8
|
+
import type { Driver } from '../state/driver-types.ts';
|
|
9
|
+
export type { Driver } from '../state/driver-types.ts';
|
|
10
|
+
import type { DriverConfig } from '../state/driver-types.ts';
|
|
11
|
+
export type { DriverConfig, TokenUsageTotals } from '../state/driver-types.ts';
|
|
12
|
+
export { BASH_OUTPUT_LINE_CAP, BASH_STDOUT_MAX_BYTES, BASH_TIMEOUT_MS, gitBranchOf, } from './shell-output.ts';
|
|
13
|
+
export { formatCostReport } from './usage-view.ts';
|
|
14
|
+
export { allowRuleOf, payloadOf } from './approval-preview.ts';
|
|
15
|
+
/**
|
|
16
|
+
* Create the TUI driver: one agent under the CC preset, interaction providers,
|
|
17
|
+
* and a folded view model.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createDriver(ctx: Context, config?: DriverConfig): Promise<Driver & {
|
|
20
|
+
providerRuntime: ProviderRuntime;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/harness/driver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAoBlD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACtD,YAAY,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAwB5D,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAK9D;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,GAAG;IAAE,eAAe,EAAE,eAAe,CAAA;CAAE,CAAC,CA0alI"}
|