@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,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-model + history cluster of the TUI driver factory.
|
|
3
|
+
*
|
|
4
|
+
* createDriver used to hold these locals inline: resolveEfforts / stalePair /
|
|
5
|
+
* seedDefaultModel, the resume marker + prompt/bash histories, the tool
|
|
6
|
+
* presenters, history folding, and the model-command catalog. They only read
|
|
7
|
+
* `ctx`/`current`/`selection`/`liveMode` off `rt` (DriverAgentCtx), so they
|
|
8
|
+
* migrate here as a free-function collaborator to keep the factory under the
|
|
9
|
+
* 500-line budget — the same pattern as the other harness/driver-*.ts leaves.
|
|
10
|
+
*
|
|
11
|
+
* Mutable state the other sections rebind (`markedContent`, `history`,
|
|
12
|
+
* `bashHistory`) is owned HERE and exposed through get/set/append handles so
|
|
13
|
+
* no other module captures a stale copy.
|
|
14
|
+
* @module @dsh-cc/tui/harness/driver-agent
|
|
15
|
+
*/
|
|
16
|
+
import { ReasoningEffortId } from '@deepseek-ai/dsh-llm';
|
|
17
|
+
import { bootBannerText } from "./boot-banner.js";
|
|
18
|
+
import { loadHistory, HISTORY_CAP } from "../history.js";
|
|
19
|
+
import { loadBashHistory, saveBashHistory } from "../bash-history.js";
|
|
20
|
+
import { writeResumeTarget } from "../resume-target.js";
|
|
21
|
+
import { clearTurn, resetTurnStep, setBusy, setPermissionMode, setTurnActive, upsertRow, } from "../store.js";
|
|
22
|
+
import { applySessionEvent, } from "../transcript.js";
|
|
23
|
+
/**
|
|
24
|
+
* The slice of createDriver's model/history cluster that the session/event
|
|
25
|
+
* listener needs: it folds events onto fresh state and presents tool cards for
|
|
26
|
+
* the live agent.
|
|
27
|
+
*/
|
|
28
|
+
export function attachSessionEvents(rt) {
|
|
29
|
+
// Whether a compact this driver anchored owns the working line: a manual
|
|
30
|
+
// `/compact` on an IDLE agent starts its own pseudo-turn (busy + anchor),
|
|
31
|
+
// and its `compaction/end` clears that anchor and flushes the outbox. An
|
|
32
|
+
// auto-compact riding a live turn never touches the anchor.
|
|
33
|
+
let compactOwnedTurn = false;
|
|
34
|
+
// Sessions that already showed the classifier-breaker fallback notice (R4):
|
|
35
|
+
// ONE per session per process, on live-appended events only — the initial
|
|
36
|
+
// fold/replay never routes through this listener, so a resume never re-shows
|
|
37
|
+
// a notice for a long-fixed lane.
|
|
38
|
+
const breakerNoticed = new Set();
|
|
39
|
+
const CLASSIFIER_BREAKER_NOTICE = 'classifier lane failed repeatedly; auto mode continues without LLM vetting until settings change';
|
|
40
|
+
rt.ctx.on('session/event', (session, event) => {
|
|
41
|
+
// Late events from a disposed session are dropped by id mismatch.
|
|
42
|
+
if (session.id !== rt.current.agent.session.id)
|
|
43
|
+
return;
|
|
44
|
+
const eventType = event.type;
|
|
45
|
+
rt.emit(applySessionEvent(rt.state(), event, rt.presenters));
|
|
46
|
+
if (eventType === 'permission/mode' || eventType === 'plan/mode') {
|
|
47
|
+
rt.emit(setPermissionMode(rt.state(), rt.liveMode(rt.current.agent)));
|
|
48
|
+
}
|
|
49
|
+
// R4: a live classifier breaker open is surfaced once, visibly — replayed
|
|
50
|
+
// logs are handled by the transcript fold, never re-shown here.
|
|
51
|
+
if (eventType === 'permission/classifier') {
|
|
52
|
+
const data = event.data;
|
|
53
|
+
if (data?.failure === 'breaker' && !breakerNoticed.has(session.id)) {
|
|
54
|
+
breakerNoticed.add(session.id);
|
|
55
|
+
rt.showNotice(CLASSIFIER_BREAKER_NOTICE);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Manual-compaction working line: an idle agent's `/compact` runs outside
|
|
59
|
+
// any turn, so anchor the working line for its duration. A live turn's
|
|
60
|
+
// anchor (auto-compact mid-request) is left untouched.
|
|
61
|
+
if (eventType === 'compaction/start') {
|
|
62
|
+
if (rt.state().turn === undefined) {
|
|
63
|
+
compactOwnedTurn = true;
|
|
64
|
+
rt.emit(setBusy(rt.state(), true));
|
|
65
|
+
rt.emit(setTurnActive(rt.state(), { startedAt: Date.now(), outputBase: rt.state().hud?.tokens?.output }));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (eventType === 'compaction/end' && compactOwnedTurn) {
|
|
69
|
+
compactOwnedTurn = false;
|
|
70
|
+
rt.emit(clearTurn(rt.state()));
|
|
71
|
+
rt.emit(setBusy(rt.state(), false));
|
|
72
|
+
// Same contract as turn/end: entries submitted during the compaction
|
|
73
|
+
// flush into the next durable turn.
|
|
74
|
+
rt.flushQueue();
|
|
75
|
+
}
|
|
76
|
+
// Working-line anchor backstop: a live `turn/start` (or `agent/status`
|
|
77
|
+
// running) can be the first evidence of a turn this UI never saw
|
|
78
|
+
// submitted. Anchor only when none exists — re-anchoring a live turn
|
|
79
|
+
// would reset elapsed time and the token delta to zero.
|
|
80
|
+
const liveState = rt.state();
|
|
81
|
+
if (eventType === 'turn/start' && liveState.turn === undefined) {
|
|
82
|
+
rt.emit(setTurnActive(rt.state(), { startedAt: Date.now(), outputBase: liveState.hud?.tokens?.output }));
|
|
83
|
+
}
|
|
84
|
+
else if (eventType === 'agent/status' && liveState.turn === undefined) {
|
|
85
|
+
const status = event.data;
|
|
86
|
+
if (status?.status === 'running') {
|
|
87
|
+
rt.emit(setTurnActive(rt.state(), { startedAt: Date.now(), outputBase: liveState.hud?.tokens?.output }));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Working-line step clock: each tool call (and each tool result) resets
|
|
91
|
+
// the elapsed timer, so the line shows the current step's duration.
|
|
92
|
+
const stepState = rt.state();
|
|
93
|
+
if ((eventType === 'tool/call' || eventType === 'tool/result') && stepState.turn !== undefined) {
|
|
94
|
+
rt.emit(resetTurnStep(rt.state(), Date.now()));
|
|
95
|
+
}
|
|
96
|
+
// Outbox flush anchor: the durable `turn/end` fires exactly once per turn.
|
|
97
|
+
if (eventType === 'turn/end') {
|
|
98
|
+
rt.emit(clearTurn(rt.state()));
|
|
99
|
+
rt.flushQueue();
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Build the agent-model/history cluster. Returns handles createDriver threads
|
|
105
|
+
* into the picker/session/run-local/queue sections and the Driver API, and
|
|
106
|
+
* exposes the owned `markedContent`/`history`/`bashHistory` state through
|
|
107
|
+
* get/set seams so no other module captures a stale copy.
|
|
108
|
+
*/
|
|
109
|
+
export function createAgentSection(rt) {
|
|
110
|
+
const { ctx, current, selection, agentOptions } = rt;
|
|
111
|
+
// Deployment default-model service (settings.yaml's agent-default-model).
|
|
112
|
+
const agentDefaultModel = ctx.get('agentDefaultModel');
|
|
113
|
+
/**
|
|
114
|
+
* Advertised reasoning-effort levels of `provider`/`model`, or undefined
|
|
115
|
+
* when they cannot be resolved: the llm service is absent, does not expose
|
|
116
|
+
* `resolveModelInfo` (legacy stubs), the lookup rejects, or the model
|
|
117
|
+
* carries no reasoning metadata.
|
|
118
|
+
*/
|
|
119
|
+
const resolveEfforts = async (provider, model) => {
|
|
120
|
+
const llm = ctx.get('llm');
|
|
121
|
+
if (llm?.resolveModelInfo === undefined)
|
|
122
|
+
return undefined;
|
|
123
|
+
try {
|
|
124
|
+
const info = await llm.resolveModelInfo(provider, model);
|
|
125
|
+
return info.reasoning === undefined ? undefined : info.reasoning.efforts;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Stale-pair guard for detached (submit-then-continue) writes: the captured
|
|
133
|
+
* `{provider, model}` must still be the live selection when the continuation
|
|
134
|
+
* resumes.
|
|
135
|
+
*/
|
|
136
|
+
const stalePair = (captured) => {
|
|
137
|
+
const live = selection.current;
|
|
138
|
+
if (live !== undefined && live.provider === captured.provider && live.model === captured.model) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
rt.emit(upsertRow(rt.state(), { kind: 'status', text: 'Model changed; effort not applied.' }));
|
|
142
|
+
return true;
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Seed `selection.current` from the deployment default when no explicit
|
|
146
|
+
* provider/model is configured. `currentSelection()` is awaited so a
|
|
147
|
+
* (duck-typed) async service can defer settlement — the boot seed's
|
|
148
|
+
* await-late wait seam keys off this promise.
|
|
149
|
+
*/
|
|
150
|
+
const seedDefaultModel = async (reset = false) => {
|
|
151
|
+
if (reset)
|
|
152
|
+
selection.current = undefined;
|
|
153
|
+
if (selection.current !== undefined)
|
|
154
|
+
return;
|
|
155
|
+
if (current.agent.options.provider !== undefined && current.agent.options.model !== undefined) {
|
|
156
|
+
selection.current = { provider: current.agent.options.provider, model: current.agent.options.model };
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (agentOptions === undefined) {
|
|
160
|
+
const dep = await agentDefaultModel?.currentSelection();
|
|
161
|
+
if (dep !== undefined) {
|
|
162
|
+
let effort;
|
|
163
|
+
if (dep.reasoningEffort !== undefined) {
|
|
164
|
+
const efforts = await resolveEfforts(dep.provider, dep.model);
|
|
165
|
+
if (efforts?.some(level => level.id === dep.reasoningEffort) === true) {
|
|
166
|
+
effort = dep.reasoningEffort;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
selection.current = effort === undefined
|
|
170
|
+
? { provider: dep.provider, model: dep.model }
|
|
171
|
+
: { provider: dep.provider, model: dep.model, reasoningEffort: ReasoningEffortId(effort) };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* Fire-early / await-late boot seed (W4): the seed promise is kicked once
|
|
177
|
+
* and shared (idempotent), so createDriver builds the root without waiting,
|
|
178
|
+
* while every model-turn path (queue submit, /effort) awaits
|
|
179
|
+
* {@link waitForModel} before dispatch. A failed seed is caught and warned —
|
|
180
|
+
* the wait must resolve so submit never deadlocks; the turn then runs on
|
|
181
|
+
* the agent's own default route. On settle (success or failure) the boot
|
|
182
|
+
* banner row is upserted to the resolved label and the no-model notice is
|
|
183
|
+
* emitted ONLY here — a slow-but-fine boot never flashes it.
|
|
184
|
+
*/
|
|
185
|
+
let seedPromise;
|
|
186
|
+
const runSeed = async () => {
|
|
187
|
+
try {
|
|
188
|
+
await seedDefaultModel();
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
console.warn('[dsh-cc-tui] default-model seed failed:', error);
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
const settled = rt.state();
|
|
195
|
+
const modelLabel = selection.current?.model ?? 'default model';
|
|
196
|
+
const rows = settled.rows.slice();
|
|
197
|
+
const bannerIndex = rows.findIndex(existing => existing.kind === 'status' && existing.text?.startsWith('dsh cc-mode — '));
|
|
198
|
+
if (bannerIndex >= 0) {
|
|
199
|
+
rows[bannerIndex] = { kind: 'status', text: bootBannerText(modelLabel, rt.cwd) };
|
|
200
|
+
rt.emit({ ...settled, rows });
|
|
201
|
+
}
|
|
202
|
+
if (selection.current === undefined) {
|
|
203
|
+
rt.emit(upsertRow(rt.state(), { kind: 'status', text: 'No model configured. Pick one with /model.' }));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
const waitForModel = () => {
|
|
208
|
+
if (seedPromise === undefined)
|
|
209
|
+
seedPromise = runSeed();
|
|
210
|
+
return seedPromise;
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Bounded boot-frame wait (W4): let a seed that settles within the current
|
|
214
|
+
* microtask cascade (a sync deployment-default service — the common boot)
|
|
215
|
+
* land its banner upsert + gated notice before the first frame; a genuinely
|
|
216
|
+
* slow seed resolves via the one-macrotask timer and never blocks it.
|
|
217
|
+
*/
|
|
218
|
+
const awaitBootFrame = () => Promise.race([waitForModel(), new Promise(resolve => { setTimeout(resolve, 0); })]);
|
|
219
|
+
/**
|
|
220
|
+
* Marker semantics: write on resume (self-heal) and after the first real
|
|
221
|
+
* user prompt — never on an empty fresh boot.
|
|
222
|
+
*/
|
|
223
|
+
let markedContent = false;
|
|
224
|
+
const persistResumeTarget = () => {
|
|
225
|
+
const id = String(current.agent.session.id);
|
|
226
|
+
// The NEW marker keys off the LIVE session's project (a resumed session
|
|
227
|
+
// created elsewhere writes its own bucket); legacy dual-write stays in
|
|
228
|
+
// the boot-cwd bucket. Dedupe is internal to writeResumeTarget (F4) —
|
|
229
|
+
// no read-compare here.
|
|
230
|
+
writeResumeTarget(id, {
|
|
231
|
+
cwd: current.agent.session.header.cwd ?? rt.cwd,
|
|
232
|
+
legacyCwd: rt.cwd,
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
// Composer + bash histories: owned here, rebound through get/set seams.
|
|
236
|
+
// `historyDir` is mutable so /resume can point it at the switched session's
|
|
237
|
+
// project directory (bindHistoryDir); every reader uses the live value via
|
|
238
|
+
// `get historyDir()` rather than a captured snapshot.
|
|
239
|
+
let historyDir = rt.historyDir;
|
|
240
|
+
let history = loadHistory(historyDir);
|
|
241
|
+
let bashHistory = loadBashHistory(historyDir).reverse();
|
|
242
|
+
const appendBashHistory = (command) => {
|
|
243
|
+
if (bashHistory[0] === command)
|
|
244
|
+
return;
|
|
245
|
+
bashHistory = [command, ...bashHistory].slice(0, HISTORY_CAP);
|
|
246
|
+
saveBashHistory([...bashHistory].reverse(), historyDir);
|
|
247
|
+
};
|
|
248
|
+
const bindHistoryDir = (dir) => {
|
|
249
|
+
historyDir = dir;
|
|
250
|
+
history = loadHistory(dir);
|
|
251
|
+
bashHistory = loadBashHistory(dir).reverse();
|
|
252
|
+
};
|
|
253
|
+
const tools = ctx.get('tools');
|
|
254
|
+
const shell = ctx.get('shell');
|
|
255
|
+
const presenters = tools === undefined
|
|
256
|
+
? undefined
|
|
257
|
+
: {
|
|
258
|
+
presentCall(name, args) {
|
|
259
|
+
return tools.get(name, current.agent)?.presentCall?.(args);
|
|
260
|
+
},
|
|
261
|
+
presentResult(name, args, result) {
|
|
262
|
+
return tools.get(name, current.agent)?.presentResult?.(args, result);
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* Replay the durable event log so a resumed session shows its prior
|
|
267
|
+
* conversation. Folding is a reduce, not a per-event broadcast.
|
|
268
|
+
*/
|
|
269
|
+
const foldHistory = () => {
|
|
270
|
+
let folded = rt.state();
|
|
271
|
+
for (const event of current.agent.session.events) {
|
|
272
|
+
folded = applySessionEvent(folded, event, presenters);
|
|
273
|
+
}
|
|
274
|
+
return folded;
|
|
275
|
+
};
|
|
276
|
+
/**
|
|
277
|
+
* Model-command catalog (`/model` picker). Reads the llm service providers
|
|
278
|
+
* it advertises.
|
|
279
|
+
*/
|
|
280
|
+
const loadCatalog = async () => {
|
|
281
|
+
const llm = ctx.get('llm');
|
|
282
|
+
if (llm === undefined)
|
|
283
|
+
return [];
|
|
284
|
+
const entries = [];
|
|
285
|
+
for (const provider of llm.listProviders()) {
|
|
286
|
+
const models = await llm.listModels(provider.id);
|
|
287
|
+
for (const model of models) {
|
|
288
|
+
entries.push({ provider: model.provider, id: model.id, name: model.name });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return entries;
|
|
292
|
+
};
|
|
293
|
+
return {
|
|
294
|
+
resolveEfforts,
|
|
295
|
+
stalePair,
|
|
296
|
+
seedDefaultModel,
|
|
297
|
+
waitForModel,
|
|
298
|
+
awaitBootFrame,
|
|
299
|
+
persistResumeTarget,
|
|
300
|
+
getMarkedContent: () => markedContent,
|
|
301
|
+
setMarkedContent: (value) => { markedContent = value; },
|
|
302
|
+
get historyDir() { return historyDir; },
|
|
303
|
+
bindHistoryDir,
|
|
304
|
+
getHistory: () => history,
|
|
305
|
+
setHistory: (next) => { history = next; },
|
|
306
|
+
getBashHistory: () => bashHistory,
|
|
307
|
+
appendBashHistory,
|
|
308
|
+
presenters,
|
|
309
|
+
shell,
|
|
310
|
+
foldHistory,
|
|
311
|
+
loadCatalog,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=driver-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-agent.js","sourceRoot":"","sources":["../../src/harness/driver-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /agents local-slash pipeline of the in-process protocol driver: the TUI
|
|
3
|
+
* surface for continuable background agents. Consumes the SAME thin snapshot
|
|
4
|
+
* as the preset /agents command — the read-only `ccAgents` service published
|
|
5
|
+
* on the root realm by command-agents inside cc-services (plan §3.2 / F8
|
|
6
|
+
* bridge). When the service is absent the fold degrades to a thin snapshot
|
|
7
|
+
* over the process-wide event fold. Fold-derived decorations (provider, last
|
|
8
|
+
* epoch stopReason, prompt excerpt — newline-normalized, ANSI-stripped,
|
|
9
|
+
* unicode-truncated) are additive on the detail view: never different ids or
|
|
10
|
+
* ordering.
|
|
11
|
+
*
|
|
12
|
+
* @module @dsh-cc/tui/harness/driver-agents
|
|
13
|
+
*/
|
|
14
|
+
import type { DriverRunLocalCtx } from './driver-ctx.ts';
|
|
15
|
+
/** The /agents slice of runLocal: one rendered status text per invocation. */
|
|
16
|
+
export interface AgentsSection {
|
|
17
|
+
agentsSlash(rawInput: string): Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
export declare function createAgentsSection(rt: DriverRunLocalCtx): AgentsSection;
|
|
20
|
+
//# sourceMappingURL=driver-agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-agents.d.ts","sourceRoot":"","sources":["../../src/harness/driver-agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC/C;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,iBAAiB,GAAG,aAAa,CAwGxE"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /agents local-slash pipeline of the in-process protocol driver: the TUI
|
|
3
|
+
* surface for continuable background agents. Consumes the SAME thin snapshot
|
|
4
|
+
* as the preset /agents command — the read-only `ccAgents` service published
|
|
5
|
+
* on the root realm by command-agents inside cc-services (plan §3.2 / F8
|
|
6
|
+
* bridge). When the service is absent the fold degrades to a thin snapshot
|
|
7
|
+
* over the process-wide event fold. Fold-derived decorations (provider, last
|
|
8
|
+
* epoch stopReason, prompt excerpt — newline-normalized, ANSI-stripped,
|
|
9
|
+
* unicode-truncated) are additive on the detail view: never different ids or
|
|
10
|
+
* ordering.
|
|
11
|
+
*
|
|
12
|
+
* @module @dsh-cc/tui/harness/driver-agents
|
|
13
|
+
*/
|
|
14
|
+
import { buildAgentsSnapshot, parseAgentsInput, renderAgentDetail, renderAgentsList, stopNotRunningCopy, stopRunningCopy, unknownAgentCopy, } from '@dsh-cc/command-agents/snapshot';
|
|
15
|
+
export function createAgentsSection(rt) {
|
|
16
|
+
// --- /agents: continuable background agents --------------------------------
|
|
17
|
+
// Replaces the pre-existing flat subagent-activity renderer: the TUI
|
|
18
|
+
// consumes the SAME thin snapshot as the preset /agents command — published
|
|
19
|
+
// on the root realm as `ccAgents` by command-agents inside cc-services
|
|
20
|
+
// (plan §3.2 / F8 bridge). When the service is absent (composition without
|
|
21
|
+
// the command-agents row) the fold degrades to a thin snapshot over the
|
|
22
|
+
// process-wide event fold only. Fold-derived decorations (provider, last
|
|
23
|
+
// stopReason, prompt excerpt) are additive on the detail view — never
|
|
24
|
+
// different ids or ordering.
|
|
25
|
+
const agentsRows = async () => {
|
|
26
|
+
const parentSessionId = String(rt.current.agent.session.id);
|
|
27
|
+
const snapshot = rt.ctx.get('ccAgents');
|
|
28
|
+
if (snapshot !== undefined && typeof snapshot.list === 'function') {
|
|
29
|
+
return snapshot.list(parentSessionId);
|
|
30
|
+
}
|
|
31
|
+
// Fold-only fallback: SubagentRunView rows mapped to thin snapshot rows.
|
|
32
|
+
// Parked AND done runs stay visible (Ready group) — the fold is the only
|
|
33
|
+
// history this composition has; a done one-shot still renders with its
|
|
34
|
+
// last-epoch decoration.
|
|
35
|
+
return buildAgentsSnapshot({
|
|
36
|
+
listChildren: async () => rt.state().subagents.map(run => ({
|
|
37
|
+
id: run.sessionId,
|
|
38
|
+
activity: run.status === 'running' ? 'running' : 'inactive',
|
|
39
|
+
hasChildren: false,
|
|
40
|
+
mode: 'continuable',
|
|
41
|
+
})),
|
|
42
|
+
getAgent: id => rt.state().subagents.find(run => run.sessionId === id && run.status === 'running'),
|
|
43
|
+
readPin: () => undefined,
|
|
44
|
+
pinPath: () => '',
|
|
45
|
+
}, parentSessionId);
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* ANSI/control-stripped, newline-normalized, unicode-aware-truncated prompt
|
|
49
|
+
* excerpt from the child's first user message event, when the child agent's
|
|
50
|
+
* session is reachable via `ctx.agents.get` (F7: the fold itself carries no
|
|
51
|
+
* prompt).
|
|
52
|
+
*/
|
|
53
|
+
const promptExcerptOf = (childId) => {
|
|
54
|
+
const child = rt.ctx.agents
|
|
55
|
+
?.get?.(childId);
|
|
56
|
+
const events = child?.session?.events;
|
|
57
|
+
if (events === undefined)
|
|
58
|
+
return undefined;
|
|
59
|
+
for (const event of events) {
|
|
60
|
+
const record = event;
|
|
61
|
+
if (record.type !== 'message' || record.data?.role !== 'user')
|
|
62
|
+
continue;
|
|
63
|
+
const data = record.data;
|
|
64
|
+
const text = typeof data.text === 'string'
|
|
65
|
+
? data.text
|
|
66
|
+
: Array.isArray(data.content)
|
|
67
|
+
? data.content
|
|
68
|
+
.filter((block) => block !== null && typeof block === 'object' && block.type === 'text')
|
|
69
|
+
.map(block => block.text)
|
|
70
|
+
.join('')
|
|
71
|
+
: '';
|
|
72
|
+
if (text.length === 0)
|
|
73
|
+
continue;
|
|
74
|
+
const normalized = text
|
|
75
|
+
.replace(/\r\n?/g, ' ')
|
|
76
|
+
.replace(/\x1B\[[0-9;?]*[A-Za-z]/g, '')
|
|
77
|
+
// eslint-disable-next-line no-control-regex
|
|
78
|
+
.replace(/[\u0000-\u0008\u000B-\u001F\u007F]/g, '');
|
|
79
|
+
const chars = Array.from(normalized);
|
|
80
|
+
return (chars.length > 80 ? chars.slice(0, 80).join('') + '…' : normalized);
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
};
|
|
84
|
+
/** Fold-derived additive detail lines (provider, last epoch, prompt excerpt). */
|
|
85
|
+
const decoratedDetailOf = (row) => {
|
|
86
|
+
const run = rt.state().subagents.find(candidate => candidate.sessionId === row.id);
|
|
87
|
+
if (run === undefined)
|
|
88
|
+
return [];
|
|
89
|
+
const lines = [` provider: ${run.provider}`];
|
|
90
|
+
if (run.stopReason !== undefined)
|
|
91
|
+
lines.push(` last epoch: ${run.stopReason}`);
|
|
92
|
+
const excerpt = promptExcerptOf(row.id);
|
|
93
|
+
if (excerpt !== undefined)
|
|
94
|
+
lines.push(` prompt: "${excerpt}"`);
|
|
95
|
+
return lines;
|
|
96
|
+
};
|
|
97
|
+
const agentsSlash = async (rawInput) => {
|
|
98
|
+
const parsed = parseAgentsInput(rawInput);
|
|
99
|
+
if (parsed.kind === 'error')
|
|
100
|
+
return parsed.text;
|
|
101
|
+
const rows = await agentsRows();
|
|
102
|
+
if (parsed.kind === 'list')
|
|
103
|
+
return renderAgentsList(rows);
|
|
104
|
+
const row = rows.find(candidate => candidate.id === parsed.id);
|
|
105
|
+
if (row === undefined)
|
|
106
|
+
return unknownAgentCopy(parsed.id);
|
|
107
|
+
if (parsed.kind === 'stop') {
|
|
108
|
+
if (row.residency !== 'running')
|
|
109
|
+
return stopNotRunningCopy(row.id, row.residency);
|
|
110
|
+
const subagents = rt.ctx.get('subagents');
|
|
111
|
+
if (typeof subagents?.interrupt !== 'function') {
|
|
112
|
+
return `No interrupt path available for agent ${row.id} in this composition.`;
|
|
113
|
+
}
|
|
114
|
+
subagents.interrupt(row.id, { kind: 'ancestor', agent: rt.current.agent });
|
|
115
|
+
return stopRunningCopy(row.id);
|
|
116
|
+
}
|
|
117
|
+
const detail = renderAgentDetail(row, undefined, undefined, String(rt.current.agent.session.id));
|
|
118
|
+
const decorated = decoratedDetailOf(row);
|
|
119
|
+
return decorated.length === 0 ? detail : `${detail}\n${decorated.join('\n')}`;
|
|
120
|
+
};
|
|
121
|
+
return { agentsSlash };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=driver-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-agents.js","sourceRoot":"","sources":["../../src/harness/driver-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Approval + user-question pipeline extracted from harness/driver.ts.
|
|
3
|
+
*
|
|
4
|
+
* Free-function collaborator: `createApprovalsSection` owns the modal FIFO
|
|
5
|
+
* (approvals and questions share one queue via createModalQueue) and takes a
|
|
6
|
+
* {@link DriverApprovalsCtx} instead of closing over createDriver's locals.
|
|
7
|
+
* Emits re-read the current view-model via `rt.state()` after every emit
|
|
8
|
+
* (createDriver rebinds `state` on emit). The section routes approvals from the
|
|
9
|
+
* host's `approval/request` hook, persists "always allow" rules through the
|
|
10
|
+
* settings provider, and answers questions through the host's userQuestions
|
|
11
|
+
* provider.
|
|
12
|
+
* @module @dsh-cc/tui/harness/driver-approvals
|
|
13
|
+
*/
|
|
14
|
+
import type { ApprovalAnswerKind } from '../state/driver-types.ts';
|
|
15
|
+
import { type ModalEntry } from './driver-modal.ts';
|
|
16
|
+
import type { DriverApprovalsCtx } from './driver-ctx.ts';
|
|
17
|
+
/** The approvals-driven slice of the Driver surface, plus queue/dispose teardown. */
|
|
18
|
+
export type ApprovalsSection = {
|
|
19
|
+
answerApproval(kind: ApprovalAnswerKind): void;
|
|
20
|
+
questionMove(delta: -1 | 1): void;
|
|
21
|
+
questionToggle(): void;
|
|
22
|
+
questionPick(index: number): void;
|
|
23
|
+
questionType(text: string): void;
|
|
24
|
+
questionBackspace(): void;
|
|
25
|
+
questionSubmit(): void;
|
|
26
|
+
questionCancel(): void;
|
|
27
|
+
/** Drain every parked modal entry (switchSession aborts approvals/questions). */
|
|
28
|
+
spliceAll(): ModalEntry[];
|
|
29
|
+
dispose(): void;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Build the approval/question pipeline. `answerApproval` threads the allow-rule
|
|
33
|
+
* write through {@link ModalAnswerDeps}; the modal FIFO lives here so approvals
|
|
34
|
+
* and user questions share a single queue. `current`/`state` are read live via
|
|
35
|
+
* the ctx — never captured snapshots.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createApprovalsSection(rt: DriverApprovalsCtx): ApprovalsSection;
|
|
38
|
+
//# sourceMappingURL=driver-approvals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-approvals.d.ts","sourceRoot":"","sources":["../../src/harness/driver-approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,0BAA0B,CAAA;AASxF,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGzD,qFAAqF;AACrF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAC9C,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACjC,cAAc,IAAI,IAAI,CAAA;IACtB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,iBAAiB,IAAI,IAAI,CAAA;IACzB,cAAc,IAAI,IAAI,CAAA;IACtB,cAAc,IAAI,IAAI,CAAA;IACtB,iFAAiF;IACjF,SAAS,IAAI,UAAU,EAAE,CAAA;IACzB,OAAO,IAAI,IAAI,CAAA;CAChB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,kBAAkB,GAAG,gBAAgB,CAyP/E"}
|