dsh-code 0.4.0 → 0.6.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.
Files changed (49) hide show
  1. package/README.en.md +217 -0
  2. package/README.md +216 -67
  3. package/bin/deepseek.mjs +70 -0
  4. package/cordis.patch.yml +62 -6
  5. package/lib/devtools-CdTl3MNy.mjs +3643 -0
  6. package/lib/index.mjs +27467 -673
  7. package/lib/rolldown-runtime-CMFfr-1z.mjs +26 -0
  8. package/lib/startup.mjs +34 -17
  9. package/lib/types/app.d.ts +29 -1
  10. package/lib/types/commands.d.ts +2 -0
  11. package/lib/types/history.d.ts +79 -0
  12. package/lib/types/index.d.ts +5 -5
  13. package/lib/types/internals.d.ts +2 -0
  14. package/lib/types/kernel-panels.d.ts +48 -0
  15. package/lib/types/plugin-inventory.d.ts +11 -0
  16. package/lib/types/presets.d.ts +32 -0
  17. package/lib/types/render/animations.d.ts +10 -1
  18. package/lib/types/render/inspector.d.ts +6 -0
  19. package/lib/types/render/projection.d.ts +21 -1
  20. package/lib/types/render/status.d.ts +131 -14
  21. package/lib/types/render/text.d.ts +9 -0
  22. package/lib/types/session-directory.d.ts +54 -0
  23. package/lib/types/session-switch.d.ts +17 -0
  24. package/lib/types/skills.d.ts +2 -0
  25. package/lib/types/startup.d.ts +11 -1
  26. package/package.json +117 -112
  27. package/src/app.ts +2543 -1969
  28. package/src/commands.ts +15 -1
  29. package/src/history.ts +136 -0
  30. package/src/index.ts +550 -155
  31. package/src/internals.ts +5 -0
  32. package/src/kernel-panels.ts +419 -0
  33. package/src/plugin-inventory.ts +47 -0
  34. package/src/presets.ts +64 -0
  35. package/src/render/animations.ts +14 -1
  36. package/src/render/export.ts +4 -0
  37. package/src/render/inspector.ts +23 -5
  38. package/src/render/lines.ts +21 -10
  39. package/src/render/markdown.ts +15 -1
  40. package/src/render/projection.ts +71 -8
  41. package/src/render/status.ts +522 -65
  42. package/src/render/text.ts +34 -6
  43. package/src/session-directory.ts +102 -0
  44. package/src/session-switch.ts +58 -0
  45. package/src/skills.ts +20 -7
  46. package/src/startup.ts +38 -20
  47. package/src/whale-glyph.ts +23 -23
  48. package/README.zh.md +0 -65
  49. package/src/pictures/1.png +0 -0
@@ -1,9 +1,11 @@
1
1
  /**
2
- * Status-line composition for the TUI footer: pipe-separated groups blending
3
- * the Claude-Code-style identity facts (model, working directory, git branch,
4
- * session) with the web StatsLine's session figures (turns/steps, model and
5
- * tool wall time, cache hit, token totals). Pure functions only the footer
6
- * renders exactly what {@link buildStatusGroups} returns.
2
+ * Status-bar composition for the TUI footer. Codex/Claude-Code-style split
3
+ * line: identity facts and session figures flow from the left, while the
4
+ * permission badge (the Codex "autonomous selection" anchor, with its
5
+ * shift+tab cycle hint) pins to the right edge. Every segment carries a tone
6
+ * the footer maps to a theme color, and layoutStatusBar degrades the line
7
+ * item by item so it always fits one physical row — truncation with an
8
+ * ellipsis happens only after every lesser group has already dropped out.
7
9
  *
8
10
  * @module @deepseek-ai/dsh-tui/render/status
9
11
  */
@@ -34,35 +36,150 @@ export declare function formatRate(n: number): string;
34
36
  * @returns rounded integer percent, or null when no input was billed.
35
37
  */
36
38
  export declare function cacheHitPercent(usage: TranscriptStats['usage']): number | null;
39
+ /**
40
+ * Presentation tones for status spans; the footer maps each to a theme color
41
+ * (Codex status-line accents: model/path/branch/state/usage categories).
42
+ */
43
+ export type StatusTone = 'model' | 'live' | 'path' | 'branch' | 'value' | 'label' | 'meta' | 'accent' | 'success' | 'warn' | 'error';
44
+ /** One colored run inside the status bar. */
45
+ export interface StatusSpan {
46
+ text: string;
47
+ tone: StatusTone;
48
+ }
49
+ /**
50
+ * One pipe-separated cluster on the leading side of the bar. Spans are the
51
+ * full visual sequence: junction separators ride along as their own dim
52
+ * 'label'-tone spans, so joining is a flat concat with no implicit glue.
53
+ */
54
+ export interface StatusGroup {
55
+ spans: readonly StatusSpan[];
56
+ }
57
+ /** One physical row of the footer: leading clusters and trailing badges. */
58
+ export interface StatusRow {
59
+ /** Leading clusters, pipe-separated in display order; index 0 is identity. */
60
+ left: readonly StatusGroup[];
61
+ /** Trailing spans pinned to the right edge, dot-separated in display order. */
62
+ right: readonly StatusSpan[];
63
+ /** Whether the shift+tab cycle hint rides after the permission badge. */
64
+ hint: boolean;
65
+ }
66
+ /**
67
+ * The footer layout: two stacked physical rows. Row 1 is the identity/state
68
+ * row (busy dot, model, cwd, branch, plan, turns, tokens, title; goal,
69
+ * sandbox, and permission badges). Row 2 is the run-meters row (mode, the
70
+ * context progress bar, cache, and duration figures) and degrades to empty
71
+ * before any row-1 content is touched.
72
+ */
73
+ export interface StatusLayout {
74
+ row1: StatusRow;
75
+ row2: StatusRow;
76
+ }
77
+ /** Separator between leading clusters. */
78
+ export declare const STATUS_GROUP_SEPARATOR = " | ";
79
+ /** Separator between trailing state spans. */
80
+ export declare const STATUS_ITEM_SEPARATOR = " \u00B7 ";
81
+ /** The Codex-style mode cycle hint appended to the permission badge. */
82
+ export declare const STATUS_CYCLE_HINT = " (shift+tab to cycle)";
83
+ /** Cells in the context-occupancy progress bar (block glyphs count two columns in the budget). */
84
+ export declare const CONTEXT_BAR_CELLS = 10;
85
+ /** Occupancy at which the bar switches from brand blue to a single amber warning. */
86
+ export declare const CONTEXT_WARN_PERCENT = 90;
87
+ /**
88
+ * Render a context-occupancy percent as a bracketed fixed-width progress bar
89
+ * plus the percentage: `[▰▰▰▱▱▱▱▱▱▱] 25%`. Filled cells and the percent read
90
+ * in brand blue (accent), empty cells and the brackets read dim (label), and
91
+ * the whole meter flips to one amber warning once occupancy reaches the
92
+ * warning threshold. The bar fill clamps to 100 while the printed percent
93
+ * keeps the raw value so an over-budget session reads as such.
94
+ * @param percent - occupancy percent (may exceed 100).
95
+ * @returns tone-split spans for the footer to paint.
96
+ */
97
+ export declare function contextBar(percent: number): readonly StatusSpan[];
98
+ /**
99
+ * One customizable status item (the Codex /statusline picker contract).
100
+ * 'left' items render as pipe-separated clusters after the identity dot;
101
+ * 'right' items pin to the right edge as dot-separated state badges.
102
+ */
103
+ export type StatusItemId = 'model' | 'cwd' | 'branch' | 'plan' | 'mode' | 'turns' | 'durations' | 'cache' | 'context' | 'tokens' | 'title' | 'goal' | 'sandbox' | 'permission';
104
+ /** Picker-facing metadata for one customizable item. */
105
+ export interface StatusItemInfo {
106
+ id: StatusItemId;
107
+ /** Short picker label. */
108
+ label: string;
109
+ /** One-line picker description of what the item shows. */
110
+ description: string;
111
+ /** Which side of the split row the item renders on. */
112
+ side: 'left' | 'right';
113
+ }
114
+ /** The full item catalog in canonical order (the /statusline default). */
115
+ export declare const STATUS_ITEMS: readonly StatusItemInfo[];
116
+ /**
117
+ * Default order: the whole catalog (matches the pre-customization bar).
118
+ * The busy dot is not an item — it always leads the identity cluster.
119
+ */
120
+ export declare const DEFAULT_STATUSLINE_ITEMS: readonly StatusItemId[];
121
+ /**
122
+ * Parse a persisted statusline item list. The stored value is the ordered
123
+ * set of ENABLED items (the Codex /statusline contract): unknown ids and
124
+ * duplicates drop out, and a non-array value (missing or corrupt file)
125
+ * falls back to the full default set. An explicitly empty array is valid —
126
+ * the bar degrades to its busy dot alone.
127
+ * @param value - the raw parsed JSON value (expected string[]).
128
+ * @returns the normalized ordered item list.
129
+ */
130
+ export declare function parseStatuslineItems(value: unknown): readonly StatusItemId[];
37
131
  /** Identity facts the runner resolves once at mount; empty strings drop out. */
38
132
  export interface StatusFacts {
39
- /** `provider/model` selection serving this session. */
133
+ /** 'provider/model' selection serving this session. */
40
134
  model: string;
135
+ /** Agent preset composing this session. */
136
+ mode?: string;
41
137
  /** Working-directory basename the session serves. */
42
138
  cwd: string;
43
139
  /** Git branch name, empty outside a repository or on a detached HEAD file. */
44
140
  branch: string;
45
141
  /** Short session identifier (last dash-separated segment or tail). */
46
142
  sessionId: string;
47
- /** Latest session title (folded from `session/title`); shown in place of the id. */
143
+ /** Latest session title (folded from 'session/title'); shown in place of the id. */
48
144
  title: string;
49
- /** Sandbox-mode override (folded from `sandbox/mode`), empty when never switched. */
145
+ /** Sandbox-mode override (folded from 'sandbox/mode'), empty when never switched. */
50
146
  sandbox: string;
51
- /** Live goal summary (folded from `goal/change`), undefined when none. */
147
+ /** Live goal summary (folded from 'goal/change'), undefined when none. */
52
148
  goal: {
53
149
  phase: string;
54
150
  rounds: number;
55
151
  max: number;
56
152
  } | undefined;
57
- /** Whether plan mode is active (folded from `plan/mode`). */
153
+ /** Whether plan mode is active (folded from 'plan/mode'). */
58
154
  plan: boolean;
59
- /** Active permission preset (folded from `permission/preset`), empty when unknown. */
155
+ /** Active permission preset (folded from 'permission/preset'), empty when unknown. */
60
156
  permission: string;
61
157
  }
62
158
  /**
63
- * Build the footer's display groups; a group with no data drops out whole.
159
+ * Traffic-light tone for a permission preset: read-only stays success green,
160
+ * full access reads error red, and every workspace-scoped middle ground
161
+ * (including unknown presets) reads warning amber.
162
+ * @param permission - active permission preset label.
163
+ * @returns tone for the badge span.
164
+ */
165
+ export declare function permissionTone(permission: string): StatusTone;
166
+ /**
167
+ * Compose the two-row footer layout under a column budget. Row 1 (identity
168
+ * and state badges) degrades in a fixed order — cycle hint, then title, token
169
+ * figures, turn/step counts, goal, divergent sandbox, permission badge — and
170
+ * only then ellipsizes the identity cluster, so the row never wraps. Row 2
171
+ * (mode, context bar, cache, duration figures) fits its own budget and
172
+ * degrades to empty before any row-1 content is touched.
64
173
  * @param facts - identity facts resolved by the runner.
65
174
  * @param stats - session figures folded from the durable log.
66
- * @returns one string per pipe-separated group, in display order.
175
+ * @param columns - usable columns for each row (before their left padding).
176
+ * @param options - 'busy' hides the cycle hint while a turn runs (Codex
177
+ * keeps mode hints idle-only); 'items' is the ordered enabled-item config
178
+ * from /statusline (defaults to the full catalog). Display order follows the
179
+ * config per side while the drop ladder keeps its fixed ranks.
180
+ * @returns the two rows to render; row1.left is never empty.
67
181
  */
68
- export declare function buildStatusGroups(facts: StatusFacts, stats: TranscriptStats): string[];
182
+ export declare function layoutStatusBar(facts: StatusFacts, stats: TranscriptStats, columns: number, options?: {
183
+ busy?: boolean;
184
+ items?: readonly string[];
185
+ }): StatusLayout;
@@ -16,6 +16,15 @@
16
16
  * as a literal `\xNN` escape.
17
17
  */
18
18
  export declare function displayText(text: string): string;
19
+ /** Collapse external text to one terminal-safe logical row. */
20
+ export declare function singleLineText(text: string): string;
21
+ /**
22
+ * Truncate one display-safe row without ever exceeding its physical-column
23
+ * budget. The ellipsis is included inside the budget, matching Codex's popup
24
+ * truncation contract; the previous app-local helper appended it after the
25
+ * row was already full and could force an extra terminal wrap.
26
+ */
27
+ export declare function truncateColumns(text: string, columns: number): string;
19
28
  /** A display-safe suffix bounded by terminal rows and columns. */
20
29
  export interface DisplayTail {
21
30
  /** Sanitized suffix suitable for direct terminal rendering. */
@@ -0,0 +1,54 @@
1
+ /** Lightweight session-directory projection for the /resume picker. */
2
+ import type { SessionEvent, SessionHeader } from '@deepseek-ai/dsh-session';
3
+ export interface SessionRecord {
4
+ readonly header: SessionHeader;
5
+ readonly live: boolean;
6
+ readonly persisted: boolean;
7
+ }
8
+ export interface TitleObservationResult {
9
+ readonly sessionId: string;
10
+ readonly status: 'fulfilled' | 'rejected';
11
+ readonly value?: {
12
+ readonly title?: {
13
+ readonly title?: string;
14
+ readonly text?: string;
15
+ };
16
+ };
17
+ }
18
+ export interface SessionLogSnapshot {
19
+ readonly session: SessionHeader;
20
+ readonly events: SessionEvent[];
21
+ }
22
+ /** Structural upstream SessionQuery surface used by the TUI. */
23
+ export interface SessionQueryService {
24
+ listSessions(signal?: AbortSignal): Promise<SessionRecord[]>;
25
+ readTitleSnapshots(ids: readonly string[], signal?: AbortSignal): Promise<TitleObservationResult[]>;
26
+ readSession(id: string, signal?: AbortSignal): Promise<SessionLogSnapshot>;
27
+ }
28
+ export type SessionScope = 'roots' | 'all';
29
+ export type CwdScope = 'all' | 'current';
30
+ export type SessionSort = 'newest' | 'oldest';
31
+ export interface SessionDirectoryOptions {
32
+ readonly sessions: SessionScope;
33
+ readonly cwd: CwdScope;
34
+ readonly sort: SessionSort;
35
+ readonly currentCwd: string;
36
+ readonly query: string;
37
+ }
38
+ export interface SessionRow {
39
+ readonly id: string;
40
+ readonly createdAt: number;
41
+ readonly cwd: string;
42
+ readonly workspace: string;
43
+ readonly parent?: string;
44
+ readonly subagent: boolean;
45
+ readonly resumable: boolean;
46
+ readonly live: boolean;
47
+ readonly persisted: boolean;
48
+ readonly preset: string;
49
+ readonly title?: string;
50
+ }
51
+ /** Filter/sort header-only records. No session log is loaded here. */
52
+ export declare function projectSessionRows(records: readonly SessionRecord[], options: SessionDirectoryOptions): SessionRow[];
53
+ /** Merge page-local title observations without disturbing directory order. */
54
+ export declare function mergeSessionTitles(rows: readonly SessionRow[], observations: readonly TitleObservationResult[]): SessionRow[];
@@ -0,0 +1,17 @@
1
+ /** Latest-wins, idle-bound queue for safe Agent session changes. */
2
+ export interface IdleActivity {
3
+ readonly status: 'idle' | 'running';
4
+ whenIdle(): Promise<void>;
5
+ }
6
+ export declare class SessionSwitchQueue<T> {
7
+ private readonly execute;
8
+ private readonly failed;
9
+ private pending;
10
+ private pumping;
11
+ constructor(execute: (value: T) => Promise<void>, failed: (error: unknown) => void);
12
+ /** Queue a request; a later request replaces any request still waiting. */
13
+ request(activity: IdleActivity, value: T): 'queued' | 'started';
14
+ /** Cancel only work that has not begun activation. */
15
+ cancel(): boolean;
16
+ private pump;
17
+ }
@@ -23,6 +23,8 @@ export interface SkillRow {
23
23
  export interface SkillsView {
24
24
  /** Name-sorted user-invocable rows; empty until the first load lands. */
25
25
  readonly rows: readonly SkillRow[];
26
+ /** Latest catalog-read failure; the help panel exposes it in place. */
27
+ readonly error?: string;
26
28
  /** Subscribe to catalog changes; returns the unsubscribe function. */
27
29
  subscribe(listener: () => void): () => void;
28
30
  /** Retarget the agent whose workspace the catalog is read for. */
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The interactive terminal app's command-line provider: parses `--resume`,
3
- * `--continue`, `--session`, and `--help`, then publishes
3
+ * `--continue`, `--session`, `--mode`, and `--help`, then publishes
4
4
  * {@link TUI_STARTUP_SERVICE} for the runner to consume lazily. Follows the
5
5
  * headless bundle's startup shape (a commander action publishing a service
6
6
  * through {@link parseCmdline}).
@@ -27,15 +27,25 @@ export declare const TUI_STARTUP_SERVICE = "tuiStartup";
27
27
  /** How the runner obtains its session identity. */
28
28
  export type TuiStartup = {
29
29
  readonly kind: 'fresh';
30
+ readonly mode?: string;
30
31
  } | {
31
32
  readonly kind: 'named';
32
33
  readonly sessionId: string;
34
+ readonly mode?: string;
33
35
  } | {
34
36
  readonly kind: 'resume';
35
37
  readonly sessionId: string;
36
38
  } | {
37
39
  readonly kind: 'latest';
38
40
  };
41
+ export interface TuiStartupOptions {
42
+ readonly resume?: string;
43
+ readonly continue?: boolean;
44
+ readonly session?: string;
45
+ readonly mode?: string;
46
+ }
47
+ /** Pure option policy shared by Commander and tests. */
48
+ export declare function resolveTuiStartup(options: TuiStartupOptions): TuiStartup;
39
49
  /**
40
50
  * Parse the invocation and publish the startup service. Mutual exclusions are
41
51
  * usage errors rejected from the action before anything is provided.
package/package.json CHANGED
@@ -1,112 +1,117 @@
1
- {
2
- "name": "dsh-code",
3
- "description": "Claude-Code-style interactive TUI bundle for DeepSeek Harness (dsh): DeepSeek-blue whale banner, live session transcript, and a blended status line",
4
- "version": "0.4.0",
5
- "type": "module",
6
- "main": "lib/index.mjs",
7
- "types": "lib/types/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./lib/types/index.d.ts",
11
- "default": "./lib/index.mjs"
12
- },
13
- "./startup": {
14
- "types": "./lib/types/startup.d.ts",
15
- "default": "./lib/startup.mjs"
16
- },
17
- "./invariant": {
18
- "types": "./lib/types/invariant.d.ts",
19
- "default": "./lib/invariant.mjs"
20
- },
21
- "./cordis.patch.yml": "./cordis.patch.yml",
22
- "./src/*": "./src/*",
23
- "./package.json": "./package.json"
24
- },
25
- "files": [
26
- "lib",
27
- "cordis.patch.yml",
28
- "src"
29
- ],
30
- "license": "MIT",
31
- "keywords": [
32
- "deepseek",
33
- "dsh",
34
- "deepseek-harness",
35
- "tui",
36
- "terminal",
37
- "claude-code",
38
- "agent",
39
- "ink"
40
- ],
41
- "repository": {
42
- "type": "git",
43
- "url": "git+https://github.com/unlinearity/dsh-code.git"
44
- },
45
- "dsh": {
46
- "bundle": {
47
- "patch": "./cordis.patch.yml"
48
- }
49
- },
50
- "scripts": {
51
- "build": "tsdown && tsc -p tsconfig.json",
52
- "test": "vitest run",
53
- "typecheck": "tsc -p tsconfig.json --noEmit",
54
- "gen:whale": "tsx scripts/gen-whale-glyph.ts",
55
- "prepublishOnly": "pnpm typecheck && pnpm test && pnpm build"
56
- },
57
- "engines": {
58
- "node": "^22.19 || >=24"
59
- },
60
- "dependencies": {
61
- "@deepseek-ai/schemastery": "^3.18.1",
62
- "chalk": "^5.6.2",
63
- "commander": "^14.0.2",
64
- "ink": "^5.2.1",
65
- "react": "^18.3.1"
66
- },
67
- "peerDependencies": {
68
- "@deepseek-ai/cordis": "^4.0.1",
69
- "@deepseek-ai/cordis-plugin-loader": "^1.0.0-rc.5",
70
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
71
- "@deepseek-ai/dsh-agent-default-model": "^0.1.0-rc.6",
72
- "@deepseek-ai/dsh-cmdline": "^0.1.0-rc.6",
73
- "@deepseek-ai/dsh-code-runtime-worker-thread": "^0.1.0-rc.6",
74
- "@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
75
- "@deepseek-ai/dsh-compaction": "^0.1.0-rc.6",
76
- "@deepseek-ai/dsh-goal": "^0.1.0-rc.6",
77
- "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6",
78
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
79
- "@deepseek-ai/dsh-llm-retry": "^0.1.0-rc.6",
80
- "@deepseek-ai/dsh-permission-presets": "^0.1.0-rc.6",
81
- "@deepseek-ai/dsh-plan-mode": "^0.1.0-rc.6",
82
- "@deepseek-ai/dsh-sandbox-policy": "^0.1.0-rc.6",
83
- "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
84
- "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6",
85
- "@deepseek-ai/dsh-session-reference": "^0.1.0-rc.6",
86
- "@deepseek-ai/dsh-session-title": "^0.1.0-rc.6",
87
- "@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
88
- "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6",
89
- "@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6"
90
- },
91
- "devDependencies": {
92
- "@deepseek-ai/dsh-compaction": "^0.1.0-rc.6",
93
- "@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
94
- "@deepseek-ai/dsh-goal": "^0.1.0-rc.6",
95
- "@deepseek-ai/dsh-llm-retry": "^0.1.0-rc.6",
96
- "@deepseek-ai/dsh-permission-presets": "^0.1.0-rc.6",
97
- "@deepseek-ai/dsh-plan-mode": "^0.1.0-rc.6",
98
- "@deepseek-ai/dsh-sandbox-policy": "^0.1.0-rc.6",
99
- "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6",
100
- "@deepseek-ai/dsh-session-reference": "^0.1.0-rc.6",
101
- "@deepseek-ai/dsh-session-title": "^0.1.0-rc.6",
102
- "@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
103
- "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6",
104
- "@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6",
105
- "@types/node": "^24.0.0",
106
- "@types/react": "~18.3.1",
107
- "tsdown": "^0.22.2",
108
- "tsx": "^4.22.4",
109
- "typescript": "^5.9.0",
110
- "vitest": "^3.0.0"
111
- }
112
- }
1
+ {
2
+ "name": "dsh-code",
3
+ "description": "Claude-Code-style interactive TUI bundle for DeepSeek Harness (dsh): DeepSeek-blue whale banner, live session transcript, and a blended status line",
4
+ "version": "0.6.0",
5
+ "type": "module",
6
+ "bin": {
7
+ "deepseek": "./bin/deepseek.mjs",
8
+ "dsh-code": "./bin/deepseek.mjs"
9
+ },
10
+ "main": "lib/index.mjs",
11
+ "types": "lib/types/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./lib/types/index.d.ts",
15
+ "default": "./lib/index.mjs"
16
+ },
17
+ "./startup": {
18
+ "types": "./lib/types/startup.d.ts",
19
+ "default": "./lib/startup.mjs"
20
+ },
21
+ "./invariant": {
22
+ "types": "./lib/types/invariant.d.ts",
23
+ "default": "./lib/invariant.mjs"
24
+ },
25
+ "./cordis.patch.yml": "./cordis.patch.yml",
26
+ "./src/*": "./src/*",
27
+ "./package.json": "./package.json"
28
+ },
29
+ "files": [
30
+ "lib",
31
+ "cordis.patch.yml",
32
+ "src"
33
+ ],
34
+ "license": "MIT",
35
+ "keywords": [
36
+ "deepseek",
37
+ "dsh",
38
+ "deepseek-harness",
39
+ "tui",
40
+ "terminal",
41
+ "claude-code",
42
+ "agent",
43
+ "ink"
44
+ ],
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/unlinearity/dsh-code.git"
48
+ },
49
+ "dsh": {
50
+ "bundle": {
51
+ "patch": "./cordis.patch.yml"
52
+ }
53
+ },
54
+ "scripts": {
55
+ "build": "tsdown && tsc -p tsconfig.json",
56
+ "test": "vitest run",
57
+ "typecheck": "tsc -p tsconfig.json --noEmit",
58
+ "gen:whale": "tsx scripts/gen-whale-glyph.ts",
59
+ "prepare": "pnpm build",
60
+ "prepublishOnly": "pnpm typecheck && pnpm test && pnpm build"
61
+ },
62
+ "engines": {
63
+ "node": "^22.19 || >=24"
64
+ },
65
+ "dependencies": {
66
+ "@deepseek-ai/schemastery": "^3.18.1",
67
+ "chalk": "^5.6.2",
68
+ "commander": "^14.0.2",
69
+ "ink": "^5.2.1",
70
+ "react": "^18.3.1"
71
+ },
72
+ "peerDependencies": {
73
+ "@deepseek-ai/cordis": "^4.0.1",
74
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.0-rc.5",
75
+ "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
76
+ "@deepseek-ai/dsh-agent-default-model": "^0.1.0-rc.6",
77
+ "@deepseek-ai/dsh-cmdline": "^0.1.0-rc.6",
78
+ "@deepseek-ai/dsh-code-runtime-worker-thread": "^0.1.0-rc.6",
79
+ "@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
80
+ "@deepseek-ai/dsh-compaction": "^0.1.0-rc.6",
81
+ "@deepseek-ai/dsh-goal": "^0.1.0-rc.6",
82
+ "@deepseek-ai/dsh-invariants": "^0.1.0-rc.6",
83
+ "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
84
+ "@deepseek-ai/dsh-llm-retry": "^0.1.0-rc.6",
85
+ "@deepseek-ai/dsh-permission-presets": "^0.1.0-rc.6",
86
+ "@deepseek-ai/dsh-plan-mode": "^0.1.0-rc.6",
87
+ "@deepseek-ai/dsh-sandbox-policy": "^0.1.0-rc.6",
88
+ "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
89
+ "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6",
90
+ "@deepseek-ai/dsh-session-reference": "^0.1.0-rc.6",
91
+ "@deepseek-ai/dsh-session-title": "^0.1.0-rc.6",
92
+ "@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
93
+ "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6",
94
+ "@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6"
95
+ },
96
+ "devDependencies": {
97
+ "@deepseek-ai/dsh-compaction": "^0.1.0-rc.6",
98
+ "@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
99
+ "@deepseek-ai/dsh-goal": "^0.1.0-rc.6",
100
+ "@deepseek-ai/dsh-llm-retry": "^0.1.0-rc.6",
101
+ "@deepseek-ai/dsh-permission-presets": "^0.1.0-rc.6",
102
+ "@deepseek-ai/dsh-plan-mode": "^0.1.0-rc.6",
103
+ "@deepseek-ai/dsh-sandbox-policy": "^0.1.0-rc.6",
104
+ "@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6",
105
+ "@deepseek-ai/dsh-session-reference": "^0.1.0-rc.6",
106
+ "@deepseek-ai/dsh-session-title": "^0.1.0-rc.6",
107
+ "@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
108
+ "@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6",
109
+ "@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6",
110
+ "@types/node": "^24.0.0",
111
+ "@types/react": "~18.3.1",
112
+ "tsdown": "^0.22.2",
113
+ "tsx": "^4.22.4",
114
+ "typescript": "^5.9.0",
115
+ "vitest": "^3.0.0"
116
+ }
117
+ }