@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,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slash-command catalog + subagent lifecycle listeners extracted from
|
|
3
|
+
* harness/driver.ts. Free-function collaborator: takes a
|
|
4
|
+
* {@link DriverCatalogCtx} instead of closing over createDriver's locals, so
|
|
5
|
+
* the harness factory stays out of this leaf.
|
|
6
|
+
*
|
|
7
|
+
* The catalog merges four sources with command-name precedence:
|
|
8
|
+
* TUI-local commands, the harness command registry (`ctx.commands`), the
|
|
9
|
+
* optional cc-shell plugin-command service (`ctx.ccPlugins`, colon-form
|
|
10
|
+
* `plugin:command` names), and user-invocable skills (`ctx.skills.snapshot()`). Skill names are duck-typed
|
|
11
|
+
* against upstream `SkillRegistry.snapshot` — the TUI never imports
|
|
12
|
+
* `@deepseek-ai/dsh-skill`; skills are optional and a missing service only
|
|
13
|
+
* leaves the skill half empty. Publishing a new catalog array emits the
|
|
14
|
+
* current state so root.ts's reference-equality guard rebuilds the
|
|
15
|
+
* autocomplete provider.
|
|
16
|
+
*
|
|
17
|
+
* @module @dsh-cc/tui/harness/driver-catalog
|
|
18
|
+
*/
|
|
19
|
+
import { upsertSubagent } from "../store.js";
|
|
20
|
+
import { LOCAL_COMMANDS, setPluginSlashNames } from "../slash.js";
|
|
21
|
+
/**
|
|
22
|
+
* Build the slash-command catalog section: merges LOCAL_COMMANDS with the
|
|
23
|
+
* harness registry and user-invocable skills, subscribes to
|
|
24
|
+
* `commands/change` / `skills/change` and subagent lifecycle events. The
|
|
25
|
+
* cached array identity stays stable between refreshes so root.ts can detect
|
|
26
|
+
* a change by reference equality and rebuild the autocomplete provider only
|
|
27
|
+
* when needed.
|
|
28
|
+
*/
|
|
29
|
+
export function createCatalogSection(rt) {
|
|
30
|
+
const commandsService = rt.ctx.get('commands');
|
|
31
|
+
const skillsService = rt.ctx.get('skills');
|
|
32
|
+
// NOTE: unlike `commands`/`skills` (provided by the host composition before
|
|
33
|
+
// the TUI driver mounts), `ccPlugins` is published by the cc-shell bundle's
|
|
34
|
+
// own fiber (`root.provide('ccPlugins', this)` in CcPluginsService), and
|
|
35
|
+
// bundle assembly order is not guaranteed relative to the driver — so the
|
|
36
|
+
// service MUST be resolved live at every refresh, never captured here.
|
|
37
|
+
let commandCatalog = [];
|
|
38
|
+
// Last-good user-invocable skill entries (already filtered/prefixed at
|
|
39
|
+
// snapshot time). Retained across incomplete or thrown snapshots.
|
|
40
|
+
let skillEntries = [];
|
|
41
|
+
// Generation token for in-flight skill snapshots: only the latest
|
|
42
|
+
// generation may publish, so overlapping snapshots are latest-wins.
|
|
43
|
+
let generation = 0;
|
|
44
|
+
const buildMerged = () => {
|
|
45
|
+
const localNames = new Set(LOCAL_COMMANDS.map(c => c.name));
|
|
46
|
+
// Live lookup each refresh: the cc-shell bundle may publish the service
|
|
47
|
+
// after the driver mounted (see the note at the top of this function).
|
|
48
|
+
const pluginService = rt.ctx.get('ccPlugins');
|
|
49
|
+
const merged = LOCAL_COMMANDS.map(c => ({
|
|
50
|
+
name: c.name,
|
|
51
|
+
description: c.description,
|
|
52
|
+
...c.argumentHint === undefined ? {} : { argumentHint: c.argumentHint },
|
|
53
|
+
}));
|
|
54
|
+
if (commandsService !== undefined) {
|
|
55
|
+
try {
|
|
56
|
+
const harnessList = commandsService.list(rt.current.agent);
|
|
57
|
+
for (const cmd of harnessList) {
|
|
58
|
+
if (localNames.has(cmd.name))
|
|
59
|
+
continue; // local wins, dedupe
|
|
60
|
+
merged.push({
|
|
61
|
+
name: cmd.name,
|
|
62
|
+
...cmd.description === undefined ? {} : { description: cmd.description },
|
|
63
|
+
...cmd.input?.hint === undefined ? {} : { argumentHint: cmd.input.hint },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// A failing list() degrades to local-only; don't poison the catalog.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Plugin commands (colon form `plugin:command`) merge after the harness
|
|
72
|
+
// registry with the same precedence discipline: a name already claimed by
|
|
73
|
+
// a local or harness command resolves to the earlier source. The names
|
|
74
|
+
// are also published to slash.ts so parseSlash can classify a typed
|
|
75
|
+
// `plugin:command` line as local (and unknown colon names keep the
|
|
76
|
+
// harness fall-through).
|
|
77
|
+
if (pluginService !== undefined) {
|
|
78
|
+
try {
|
|
79
|
+
const used = new Set(merged.map(c => c.name));
|
|
80
|
+
const pluginNames = [];
|
|
81
|
+
for (const cmd of pluginService.listPluginCommands()) {
|
|
82
|
+
pluginNames.push(cmd.name);
|
|
83
|
+
if (used.has(cmd.name))
|
|
84
|
+
continue;
|
|
85
|
+
used.add(cmd.name);
|
|
86
|
+
merged.push({
|
|
87
|
+
name: cmd.name,
|
|
88
|
+
description: cmd.description,
|
|
89
|
+
...cmd.argumentHint === undefined ? {} : { argumentHint: cmd.argumentHint },
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
setPluginSlashNames(pluginNames);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// A failing listPluginCommands() keeps the last-good table.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
setPluginSlashNames([]);
|
|
100
|
+
}
|
|
101
|
+
// Skills come last; a name already claimed by a local or harness command
|
|
102
|
+
// resolves to the command (web adjudication precedence).
|
|
103
|
+
const used = new Set(merged.map(c => c.name));
|
|
104
|
+
for (const skill of skillEntries) {
|
|
105
|
+
if (used.has(skill.name))
|
|
106
|
+
continue;
|
|
107
|
+
used.add(skill.name);
|
|
108
|
+
merged.push(skill);
|
|
109
|
+
}
|
|
110
|
+
return merged;
|
|
111
|
+
};
|
|
112
|
+
const publish = () => {
|
|
113
|
+
commandCatalog = buildMerged();
|
|
114
|
+
// Notify subscribers so root.ts compares the new catalog identity and
|
|
115
|
+
// rebuilds the autocomplete provider (skills arrive asynchronously, so
|
|
116
|
+
// the refresh must ride an emit, not just the next state change).
|
|
117
|
+
rt.emit(rt.state());
|
|
118
|
+
};
|
|
119
|
+
const refreshSkillsSnapshot = () => {
|
|
120
|
+
if (skillsService === undefined)
|
|
121
|
+
return;
|
|
122
|
+
const gen = ++generation;
|
|
123
|
+
const agent = rt.current.agent;
|
|
124
|
+
// cwd and scope are read from the LIVE agent at refresh time — never a
|
|
125
|
+
// captured boot cwd (switchSession rebinds `current` in place).
|
|
126
|
+
// exactOptionalPropertyTypes: omit cwd when the header has none; do not
|
|
127
|
+
// pass `undefined` into `{ cwd?: string }`.
|
|
128
|
+
const cwd = agent.session.header.cwd;
|
|
129
|
+
void skillsService.snapshot({
|
|
130
|
+
...cwd === undefined ? {} : { cwd },
|
|
131
|
+
scope: agent,
|
|
132
|
+
})
|
|
133
|
+
.then(obs => {
|
|
134
|
+
if (gen !== generation)
|
|
135
|
+
return; // superseded by a newer refresh
|
|
136
|
+
if (!obs.complete)
|
|
137
|
+
return; // incomplete: retain last-good entries
|
|
138
|
+
skillEntries = obs.skills
|
|
139
|
+
.filter(skill => skill.invocation.userInvocable === true)
|
|
140
|
+
.map(skill => ({
|
|
141
|
+
name: skill.name,
|
|
142
|
+
description: skill.invocation.modelInvocable === false
|
|
143
|
+
? `user-only · ${skill.description}`
|
|
144
|
+
: skill.description,
|
|
145
|
+
}));
|
|
146
|
+
publish();
|
|
147
|
+
})
|
|
148
|
+
.catch(() => {
|
|
149
|
+
// A rejected snapshot keeps the last-good skill entries; nothing to
|
|
150
|
+
// publish and nothing to surface — the next skills/change retries.
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Rebuild the full catalog for the current agent: commands synchronously
|
|
155
|
+
* (including current skillEntries), skills via a fresh snapshot. Called at
|
|
156
|
+
* boot, on commands/change and skills/change, and after a session switch.
|
|
157
|
+
*/
|
|
158
|
+
const refreshCatalog = () => {
|
|
159
|
+
publish();
|
|
160
|
+
refreshSkillsSnapshot();
|
|
161
|
+
};
|
|
162
|
+
refreshCatalog();
|
|
163
|
+
if (commandsService !== undefined) {
|
|
164
|
+
// `commands/change` is declared via module augmentation in
|
|
165
|
+
// @deepseek-ai/dsh-commands, but the tui package doesn't import that
|
|
166
|
+
// package directly, so the augmentation isn't in tsc's view here. The
|
|
167
|
+
// event exists at runtime (the commands service dispatches it on
|
|
168
|
+
// register/unregister); cast through the Events map to subscribe without
|
|
169
|
+
// pulling a new dep into the type graph.
|
|
170
|
+
const changeEvent = 'commands/change';
|
|
171
|
+
rt.ctx.on(changeEvent, () => {
|
|
172
|
+
refreshCatalog();
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (skillsService !== undefined) {
|
|
176
|
+
// `skills/change` — same cast pattern; declared in @deepseek-ai/dsh-skill.
|
|
177
|
+
const skillChangeEvent = 'skills/change';
|
|
178
|
+
rt.ctx.on(skillChangeEvent, () => {
|
|
179
|
+
refreshCatalog();
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// `ccPlugins/change` — unconditional (the cordis event bus is shared, so
|
|
183
|
+
// subscribing does not require the service to exist yet): this is what lets
|
|
184
|
+
// the catalog pick up a ccPlugins service that the cc-shell bundle publishes
|
|
185
|
+
// AFTER the driver mounted. Same cast pattern; the event is declared in
|
|
186
|
+
// cc-shell.
|
|
187
|
+
const pluginChangeEvent = 'ccPlugins/change';
|
|
188
|
+
rt.ctx.on(pluginChangeEvent, () => {
|
|
189
|
+
refreshCatalog();
|
|
190
|
+
});
|
|
191
|
+
// Subagent lifecycle: `subagent/start`|`subagent/end` are global,
|
|
192
|
+
// process-scoped observe-only snapshots paired by `runId` (declared via
|
|
193
|
+
// module augmentation in @deepseek-ai/subagent, which tui doesn't import).
|
|
194
|
+
// Same cast pattern as `commands/change` above. Tracking is event-only —
|
|
195
|
+
// no `SubagentRuntime.listChildren` call — so the driver stays
|
|
196
|
+
// composition-agnostic (tool-cordis may be absent). Events are NOT
|
|
197
|
+
// session-filtered: per-session parentage isn't on the payload, so the
|
|
198
|
+
// list tracks all runs observed this process; `/agents` labels it
|
|
199
|
+
// accordingly and does not overclaim parentage.
|
|
200
|
+
const subagentStart = 'subagent/start';
|
|
201
|
+
const subagentEnd = 'subagent/end';
|
|
202
|
+
/**
|
|
203
|
+
* Probe whether a child session is continuable: duck-typed peek at
|
|
204
|
+
* `rt.ctx.agents.get(id)` — the child session's events carry a
|
|
205
|
+
* `subagent/descriptor` event with `data.mode === 'continuable'`. Missing
|
|
206
|
+
* agent, missing `get`, or no such event → not resumable (fail closed).
|
|
207
|
+
* Kept local and tiny; no new module.
|
|
208
|
+
*/
|
|
209
|
+
const probeResumable = (id) => {
|
|
210
|
+
const child = rt.ctx.agents
|
|
211
|
+
?.get?.(String(id));
|
|
212
|
+
if (child === undefined)
|
|
213
|
+
return false;
|
|
214
|
+
return child.session?.events?.some(event => event.type === 'subagent/descriptor'
|
|
215
|
+
&& event.data?.mode === 'continuable') === true;
|
|
216
|
+
};
|
|
217
|
+
rt.ctx.on(subagentStart, (info) => {
|
|
218
|
+
const sessionId = String(info.id);
|
|
219
|
+
const resumable = probeResumable(sessionId);
|
|
220
|
+
rt.emit(upsertSubagent(rt.state(), {
|
|
221
|
+
runId: String(info.runId),
|
|
222
|
+
provider: String(info.provider),
|
|
223
|
+
sessionId,
|
|
224
|
+
status: 'running',
|
|
225
|
+
...(resumable ? { resumable: true } : {}),
|
|
226
|
+
}));
|
|
227
|
+
});
|
|
228
|
+
rt.ctx.on(subagentEnd, (info) => {
|
|
229
|
+
const runId = String(info.runId);
|
|
230
|
+
const sessionId = String(info.id);
|
|
231
|
+
// A parked run keeps `resumable: true` so a later cold-resume start for
|
|
232
|
+
// the same sessionId still matches by sessionId. `stopReason` is only
|
|
233
|
+
// meaningful on done — the `[completed]` render would read as a crash.
|
|
234
|
+
const existing = rt.state().subagents.find(run => run.runId === runId || run.sessionId === sessionId);
|
|
235
|
+
const resumable = existing?.resumable === true || probeResumable(sessionId);
|
|
236
|
+
const parked = resumable;
|
|
237
|
+
const view = {
|
|
238
|
+
runId,
|
|
239
|
+
provider: String(info.provider),
|
|
240
|
+
sessionId,
|
|
241
|
+
status: parked ? 'parked' : 'done',
|
|
242
|
+
...(parked ? { resumable: true } : {}),
|
|
243
|
+
...(parked || info.stopReason === undefined ? {} : { stopReason: String(info.stopReason) }),
|
|
244
|
+
};
|
|
245
|
+
rt.emit(upsertSubagent(rt.state(), view));
|
|
246
|
+
});
|
|
247
|
+
return {
|
|
248
|
+
listCommands() {
|
|
249
|
+
return commandCatalog;
|
|
250
|
+
},
|
|
251
|
+
refreshCatalog() {
|
|
252
|
+
refreshCatalog();
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=driver-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-catalog.js","sourceRoot":"","sources":["../../src/harness/driver-catalog.ts"],"names":[],"mappings":"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"}
|