@aiwayds/dsh-tui-pi 0.9.0 → 0.9.2
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/lib/commands.d.ts +34 -2
- package/lib/commands.js +21 -3
- package/lib/commands.js.map +1 -1
- package/lib/font-detect.d.ts +47 -16
- package/lib/font-detect.js +53 -16
- package/lib/font-detect.js.map +1 -1
- package/package.json +1 -1
package/lib/commands.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* dsh-tui-pi never re-implements a command: autocomplete lists
|
|
5
5
|
* `ctx.commands.list(agent)` and submission routes through
|
|
6
|
-
* `ctx.commands
|
|
6
|
+
* `executeCommand(ctx.commands, agent, line, signal)`. Anything that is not a
|
|
7
7
|
* resolvable command falls through to the model as an ordinary prompt, so
|
|
8
8
|
* every command registered by dsh packages (plan, compact, feedback, export,
|
|
9
9
|
* permission, goal, …) works here unchanged and future registrations appear
|
|
@@ -15,9 +15,40 @@
|
|
|
15
15
|
* and would mint a throwaway session just to run them.
|
|
16
16
|
*/
|
|
17
17
|
import type { Context } from '@deepseek-ai/cordis';
|
|
18
|
-
import
|
|
18
|
+
import type { Agent } from '@deepseek-ai/dsh-agent';
|
|
19
|
+
import { type CommandDescriptor, type CommandExecution, type CommandResult } from '@deepseek-ai/dsh-commands';
|
|
19
20
|
import type { AutocompleteProvider } from '@earendil-works/pi-tui';
|
|
20
21
|
import type { DshSessionBridge } from './session.ts';
|
|
22
|
+
/**
|
|
23
|
+
* Structural mirror of dsh-attachment's rc.8 `EncodedImageAttachment` —
|
|
24
|
+
* declared locally (not imported) because the rc.7 closure does not export
|
|
25
|
+
* that interface yet, and this file must typecheck against either closure.
|
|
26
|
+
*/
|
|
27
|
+
interface EncodedImageAttachment {
|
|
28
|
+
mediaType: 'image/png' | 'image/jpeg' | 'image/webp' | 'image/gif';
|
|
29
|
+
data: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Call `commands.execute` across dsh-commands API versions.
|
|
34
|
+
*
|
|
35
|
+
* rc.7 signature: execute(agent, line, signal) — 3 params
|
|
36
|
+
* rc.8 signature: execute(agent, line, images, signal) — 4 params
|
|
37
|
+
*
|
|
38
|
+
* The overloaded declaration accepts both call shapes so callers always
|
|
39
|
+
* pass `(commands, agent, line, signal)`. The implementation body
|
|
40
|
+
* dispatches to the correct argument count: for rc.7 the 3-arg form
|
|
41
|
+
* (signal in position 3); for rc.8 the 4-arg form (empty images array
|
|
42
|
+
* in position 3, signal in position 4).
|
|
43
|
+
*
|
|
44
|
+
* @internal — exported for unit testing.
|
|
45
|
+
*/
|
|
46
|
+
export declare function executeCommand(commands: {
|
|
47
|
+
execute: (...args: never[]) => unknown;
|
|
48
|
+
}, agent: Agent, line: string, signal: AbortSignal): Promise<CommandExecution | undefined>;
|
|
49
|
+
export declare function executeCommand(commands: {
|
|
50
|
+
execute: (...args: never[]) => unknown;
|
|
51
|
+
}, agent: Agent, line: string, images: readonly EncodedImageAttachment[], signal: AbortSignal): Promise<CommandExecution | undefined>;
|
|
21
52
|
/** A TUI-owned command body that needs no receiving agent. */
|
|
22
53
|
export type LocalCommandHandler = (rawInput: string, signal: AbortSignal) => CommandResult | Promise<CommandResult>;
|
|
23
54
|
export declare class CommandService {
|
|
@@ -63,3 +94,4 @@ export declare class CommandService {
|
|
|
63
94
|
/** Native `/name` skill candidates for the mixed `/` command list. */
|
|
64
95
|
private nativeSkillCandidates;
|
|
65
96
|
}
|
|
97
|
+
export {};
|
package/lib/commands.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* dsh-tui-pi never re-implements a command: autocomplete lists
|
|
5
5
|
* `ctx.commands.list(agent)` and submission routes through
|
|
6
|
-
* `ctx.commands
|
|
6
|
+
* `executeCommand(ctx.commands, agent, line, signal)`. Anything that is not a
|
|
7
7
|
* resolvable command falls through to the model as an ordinary prompt, so
|
|
8
8
|
* every command registered by dsh packages (plan, compact, feedback, export,
|
|
9
9
|
* permission, goal, …) works here unchanged and future registrations appear
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* locally when no live agent exists — dsh's execute path addresses an agent
|
|
15
15
|
* and would mint a throwaway session just to run them.
|
|
16
16
|
*/
|
|
17
|
-
import { parseCommand } from '@deepseek-ai/dsh-commands';
|
|
17
|
+
import { parseCommand, } from '@deepseek-ai/dsh-commands';
|
|
18
18
|
import { buildNativeSkillCandidates, buildSkillCompletionCandidates, completionLabel, isExplicitSkillItem, mergeMixedSkillItems, skillCompletionQuery, } from "./skills.js";
|
|
19
19
|
/**
|
|
20
20
|
* Token ending at the cursor on one editor line, for command detection.
|
|
@@ -30,6 +30,24 @@ function tokenAtCursor(line, cursorCol) {
|
|
|
30
30
|
const start = match.index + (match[1] ?? '').length;
|
|
31
31
|
return { token: upto.slice(start), start };
|
|
32
32
|
}
|
|
33
|
+
export function executeCommand(commands, agent, line, imagesOrSignal, maybeSignal) {
|
|
34
|
+
if (maybeSignal !== undefined) {
|
|
35
|
+
// Explicit 4-arg call: caller provided images + signal directly.
|
|
36
|
+
return commands.execute(agent, line, imagesOrSignal, maybeSignal);
|
|
37
|
+
}
|
|
38
|
+
// Caller passed only (agent, line, signal) — route by runtime arity.
|
|
39
|
+
// rc.8 added an `images` parameter before `signal`; detect via .length
|
|
40
|
+
// and insert an empty images array when needed. Known limit of arity
|
|
41
|
+
// probing: a future execute() that gains a default parameter or ANOTHER
|
|
42
|
+
// inserted parameter would misroute — if slash commands break after a
|
|
43
|
+
// dsh upgrade again, re-check this signature first (both rc.7 and rc.8
|
|
44
|
+
// use plain named parameters, so .length is exact today).
|
|
45
|
+
const signal = imagesOrSignal;
|
|
46
|
+
if (commands.execute.length >= 4) {
|
|
47
|
+
return commands.execute(agent, line, [], signal);
|
|
48
|
+
}
|
|
49
|
+
return commands.execute(agent, line, signal);
|
|
50
|
+
}
|
|
33
51
|
export class CommandService {
|
|
34
52
|
ctx;
|
|
35
53
|
bridge;
|
|
@@ -92,7 +110,7 @@ export class CommandService {
|
|
|
92
110
|
return { handled: false };
|
|
93
111
|
}
|
|
94
112
|
try {
|
|
95
|
-
const execution = await commands
|
|
113
|
+
const execution = await executeCommand(commands, agent, line, signal);
|
|
96
114
|
if (execution === undefined)
|
|
97
115
|
return { handled: false };
|
|
98
116
|
if (execution.result.kind === 'error')
|
package/lib/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/lib/font-detect.d.ts
CHANGED
|
@@ -4,20 +4,28 @@
|
|
|
4
4
|
* render the powerline PUA glyph U+E0B0 (and the other weak-terminal glyphs)
|
|
5
5
|
* before the `auto` icon-set mode picks between 'nerdfont' and 'plain'.
|
|
6
6
|
*
|
|
7
|
-
* Detection
|
|
7
|
+
* Detection has two layers:
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
9
|
+
* 1. Terminal whitelist: some terminal emulators ship a built-in Nerd /
|
|
10
|
+
* Symbols font fallback — they can render powerline glyphs regardless of
|
|
11
|
+
* which font the user has installed system-wide. When `TERM_PROGRAM`
|
|
12
|
+
* matches a known whitelisted terminal, the probe short-circuits to
|
|
13
|
+
* `true` without touching the filesystem. See `NERD_FONT_TERMINALS`.
|
|
14
|
+
*
|
|
15
|
+
* 2. Font-directory / fc-list scan (the original heuristic):
|
|
16
|
+
* - Linux: `fc-list -q <name>` for each candidate family. fc-list exits
|
|
17
|
+
* 0 when the family is installed (quiet mode prints nothing either way).
|
|
18
|
+
* When `fc-list` itself is missing (ENOENT — a fontconfig-less system),
|
|
19
|
+
* every probe fails and the probe reports "no Nerd Font".
|
|
20
|
+
* - macOS: scan `~/Library/Fonts` and `/Library/Fonts` and match file
|
|
21
|
+
* names against a Nerd/Powerline heuristic (the real Core Text registry
|
|
22
|
+
* is not reachable without Objective-C bindings — a file-name scan is
|
|
23
|
+
* the reasonable zero-dependency approximation; it also recognises the
|
|
24
|
+
* TUI's own bundled font `dsh-tui-pi-nerd.ttf`, so
|
|
25
|
+
* `node scripts/install-font.mjs` flipping the terminal to it is enough
|
|
26
|
+
* to flip `auto` → nerdfont).
|
|
27
|
+
* - Windows / anything else: false (no free probe; the conservative
|
|
28
|
+
* answer is the plain glyphs).
|
|
21
29
|
*
|
|
22
30
|
* The result is memoised at module level — the TUI probes once at startup and
|
|
23
31
|
* hot-applied 'auto' settings changes resolve against that same snapshot. All
|
|
@@ -31,6 +39,26 @@ export declare const NERD_FONT_CANDIDATES: readonly string[];
|
|
|
31
39
|
* Linux candidate list (MesloLGS NF ships as `MesloLGS NF Regular.ttf`).
|
|
32
40
|
*/
|
|
33
41
|
export declare const NERD_FONT_FILE_RE: RegExp;
|
|
42
|
+
/**
|
|
43
|
+
* Terminal emulators that ship a built-in Nerd / Symbols font fallback — they
|
|
44
|
+
* can render U+E0B0 and other PUA glyphs even when no Nerd Font is installed
|
|
45
|
+
* system-wide. The probe short-circuits to `true` when `TERM_PROGRAM` matches
|
|
46
|
+
* one of these, before touching the filesystem. The values are the terminals'
|
|
47
|
+
* own hardcoded, case-exact TERM_PROGRAM strings (locked by a test) — do not
|
|
48
|
+
* normalise case on a hunch.
|
|
49
|
+
*
|
|
50
|
+
* - `ghostty`: bundles Symbols Nerd Font as a built-in fallback for missing
|
|
51
|
+
* glyphs (https://ghostty.org/docs/install/release-notes/1-2-0).
|
|
52
|
+
* - `WezTerm`: bundles Nerd Font Symbols and always appends its default
|
|
53
|
+
* fallback, even with a user font chain
|
|
54
|
+
* (https://wezterm.org/config/fonts.html).
|
|
55
|
+
*
|
|
56
|
+
* Residual gap, accepted: tmux 3.3+ rewrites TERM_PROGRAM to `tmux` inside
|
|
57
|
+
* panes, so the whitelist does not apply there — the probe falls through to
|
|
58
|
+
* the (conservative, tofu-free) directory scan. Users under tmux should set
|
|
59
|
+
* `dsh-tui.iconSet` explicitly.
|
|
60
|
+
*/
|
|
61
|
+
export declare const NERD_FONT_TERMINALS: readonly string[];
|
|
34
62
|
/**
|
|
35
63
|
* The environment the probe reads — injected for tests (see
|
|
36
64
|
* test/font-detect.test.mjs), defaulting to the real platform/fs.
|
|
@@ -48,11 +76,14 @@ export interface FontDetectEnv {
|
|
|
48
76
|
execFile: (file: string, args: readonly string[], options?: {
|
|
49
77
|
timeout?: number;
|
|
50
78
|
}) => Promise<unknown>;
|
|
79
|
+
/** `process.env.TERM_PROGRAM` — used for the terminal-whitelist check. */
|
|
80
|
+
termProgram?: string;
|
|
51
81
|
}
|
|
52
82
|
/**
|
|
53
|
-
* The full probe against an injected environment:
|
|
54
|
-
*
|
|
55
|
-
*
|
|
83
|
+
* The full probe against an injected environment: first checks the terminal
|
|
84
|
+
* whitelist (built-in Nerd symbol fallback), then falls back to the
|
|
85
|
+
* platform-specific font-directory / fc-list scan. Never throws — every
|
|
86
|
+
* platform path is wrapped or falls through to `false`.
|
|
56
87
|
*/
|
|
57
88
|
export declare function probeNerdFont(env: FontDetectEnv): Promise<boolean>;
|
|
58
89
|
/**
|
package/lib/font-detect.js
CHANGED
|
@@ -4,20 +4,28 @@
|
|
|
4
4
|
* render the powerline PUA glyph U+E0B0 (and the other weak-terminal glyphs)
|
|
5
5
|
* before the `auto` icon-set mode picks between 'nerdfont' and 'plain'.
|
|
6
6
|
*
|
|
7
|
-
* Detection
|
|
7
|
+
* Detection has two layers:
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
9
|
+
* 1. Terminal whitelist: some terminal emulators ship a built-in Nerd /
|
|
10
|
+
* Symbols font fallback — they can render powerline glyphs regardless of
|
|
11
|
+
* which font the user has installed system-wide. When `TERM_PROGRAM`
|
|
12
|
+
* matches a known whitelisted terminal, the probe short-circuits to
|
|
13
|
+
* `true` without touching the filesystem. See `NERD_FONT_TERMINALS`.
|
|
14
|
+
*
|
|
15
|
+
* 2. Font-directory / fc-list scan (the original heuristic):
|
|
16
|
+
* - Linux: `fc-list -q <name>` for each candidate family. fc-list exits
|
|
17
|
+
* 0 when the family is installed (quiet mode prints nothing either way).
|
|
18
|
+
* When `fc-list` itself is missing (ENOENT — a fontconfig-less system),
|
|
19
|
+
* every probe fails and the probe reports "no Nerd Font".
|
|
20
|
+
* - macOS: scan `~/Library/Fonts` and `/Library/Fonts` and match file
|
|
21
|
+
* names against a Nerd/Powerline heuristic (the real Core Text registry
|
|
22
|
+
* is not reachable without Objective-C bindings — a file-name scan is
|
|
23
|
+
* the reasonable zero-dependency approximation; it also recognises the
|
|
24
|
+
* TUI's own bundled font `dsh-tui-pi-nerd.ttf`, so
|
|
25
|
+
* `node scripts/install-font.mjs` flipping the terminal to it is enough
|
|
26
|
+
* to flip `auto` → nerdfont).
|
|
27
|
+
* - Windows / anything else: false (no free probe; the conservative
|
|
28
|
+
* answer is the plain glyphs).
|
|
21
29
|
*
|
|
22
30
|
* The result is memoised at module level — the TUI probes once at startup and
|
|
23
31
|
* hot-applied 'auto' settings changes resolve against that same snapshot. All
|
|
@@ -45,12 +53,36 @@ export const NERD_FONT_CANDIDATES = [
|
|
|
45
53
|
* Linux candidate list (MesloLGS NF ships as `MesloLGS NF Regular.ttf`).
|
|
46
54
|
*/
|
|
47
55
|
export const NERD_FONT_FILE_RE = /Nerd|Powerline|Cascadia.*PL|MesloLGS|dsh-tui-pi-nerd/i;
|
|
56
|
+
/**
|
|
57
|
+
* Terminal emulators that ship a built-in Nerd / Symbols font fallback — they
|
|
58
|
+
* can render U+E0B0 and other PUA glyphs even when no Nerd Font is installed
|
|
59
|
+
* system-wide. The probe short-circuits to `true` when `TERM_PROGRAM` matches
|
|
60
|
+
* one of these, before touching the filesystem. The values are the terminals'
|
|
61
|
+
* own hardcoded, case-exact TERM_PROGRAM strings (locked by a test) — do not
|
|
62
|
+
* normalise case on a hunch.
|
|
63
|
+
*
|
|
64
|
+
* - `ghostty`: bundles Symbols Nerd Font as a built-in fallback for missing
|
|
65
|
+
* glyphs (https://ghostty.org/docs/install/release-notes/1-2-0).
|
|
66
|
+
* - `WezTerm`: bundles Nerd Font Symbols and always appends its default
|
|
67
|
+
* fallback, even with a user font chain
|
|
68
|
+
* (https://wezterm.org/config/fonts.html).
|
|
69
|
+
*
|
|
70
|
+
* Residual gap, accepted: tmux 3.3+ rewrites TERM_PROGRAM to `tmux` inside
|
|
71
|
+
* panes, so the whitelist does not apply there — the probe falls through to
|
|
72
|
+
* the (conservative, tofu-free) directory scan. Users under tmux should set
|
|
73
|
+
* `dsh-tui.iconSet` explicitly.
|
|
74
|
+
*/
|
|
75
|
+
export const NERD_FONT_TERMINALS = [
|
|
76
|
+
'ghostty',
|
|
77
|
+
'WezTerm',
|
|
78
|
+
];
|
|
48
79
|
/** The real environment: this process's platform, home and filesystem. */
|
|
49
80
|
const realEnv = {
|
|
50
81
|
platform: process.platform,
|
|
51
82
|
home: homedir(),
|
|
52
83
|
readdir: (dir) => readdir(dir),
|
|
53
84
|
execFile: (file, args, options) => execFile(file, args, options),
|
|
85
|
+
termProgram: process.env.TERM_PROGRAM,
|
|
54
86
|
};
|
|
55
87
|
/** Probe one platform with `fc-list -q`; `false` when fc-list is absent. */
|
|
56
88
|
async function probeLinux(env) {
|
|
@@ -86,11 +118,16 @@ async function probeDarwin(env) {
|
|
|
86
118
|
return false;
|
|
87
119
|
}
|
|
88
120
|
/**
|
|
89
|
-
* The full probe against an injected environment:
|
|
90
|
-
*
|
|
91
|
-
*
|
|
121
|
+
* The full probe against an injected environment: first checks the terminal
|
|
122
|
+
* whitelist (built-in Nerd symbol fallback), then falls back to the
|
|
123
|
+
* platform-specific font-directory / fc-list scan. Never throws — every
|
|
124
|
+
* platform path is wrapped or falls through to `false`.
|
|
92
125
|
*/
|
|
93
126
|
export async function probeNerdFont(env) {
|
|
127
|
+
// Short-circuit: terminals with built-in Nerd symbol fallback can render
|
|
128
|
+
// U+E0B0 regardless of system-installed fonts.
|
|
129
|
+
if (env.termProgram && NERD_FONT_TERMINALS.includes(env.termProgram))
|
|
130
|
+
return true;
|
|
94
131
|
switch (env.platform) {
|
|
95
132
|
case 'linux':
|
|
96
133
|
return probeLinux(env);
|
package/lib/font-detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"font-detect.js","sourceRoot":"","sources":["../src/font-detect.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"font-detect.js","sourceRoot":"","sources":["../src/font-detect.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED