Skip to main content
K

dsh-tui-app

kouyichi/dsh-tui-app

Interactive terminal chat app for dsh: streaming conversation, tool cards, jobs panel, full-text search, trajectory replay, multi-session tabs, and A2A dispatch (Ink-based).

Install

dsh plugin --profile web add github:kouyichi/dsh-tui-app

README

๐Ÿ‹ dsh-tui-app

DeepSeek Harness ็š„็ปˆ็ซฏไธป็•Œ้ข โ€”โ€” ไธ€ๆก่“้ฒธ๏ผŒๆŒ‡ๆŒฅๅ…จๅฎถ

license dsh node

ไธ€ไธชๅŸบไบŽ Ink๏ผˆReact for CLI๏ผŒClaude Code ๅŒๆฌพๆŠ€ๆœฏๆ ˆ๏ผ‰็š„ dsh profile ๆ’ไปถ๏ผšClaude Code ๅฝขๆ€็š„ไบคไบ’ๅผ็ปˆ็ซฏ็•Œ้ข๏ผŒDeepSeek ๅ“็‰Œ้ฒธ้ฑผ๏ผŒ ไธ€ไธช็ปˆ็ซฏๅŒๆ—ถๆŒ‡ๆŒฅ hermes / claude / codex / dsh ๅ››ไธช Agentใ€‚

โœจ ็•Œ้ข้ข„่งˆ

โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ•—                                  โ–„โ–„โ–„โ–„โ–„        โ–ˆโ–ˆ
โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ• โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘                  โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€        โ–ˆโ–ˆโ–ˆโ–ˆ
โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘               โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ         โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„โ–„
โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘ โ•šโ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•‘             โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„       โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„
โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘           โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„     โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ•โ• โ•šโ•โ•  โ•šโ•โ•           โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„    โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ    โ–ˆโ–ˆโ–ˆโ–ˆโ–€โ–€โ–€โ–€โ–€โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„  โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
โ”‚  DeepSeek Harness            โ”‚    โ–ˆโ–ˆโ–ˆโ–ˆ     โ–€โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€โ–€โ–€โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
โ”‚  model     deepseek-v4-flash โ”‚    โ–ˆโ–ˆโ–ˆโ–ˆ         โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„โ–„  โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
โ”‚  mode      ๆ ‡ๅ‡†ๆจกๅผ           โ”‚    โ–ˆโ–ˆโ–ˆโ–ˆโ–„           โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ  โ–ˆ    โ–ˆโ–ˆโ–ˆโ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ
โ”‚  session   session-41bbbโ€ฆ    โ”‚     โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ             โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ   โ–€โ–ˆโ–„โ–„ โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€
โ”‚  stats     skills 15 ยท pl 92 โ”‚      โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„      โ–„โ–„โ–„       โ–„  โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€
โ”‚  /help ยท /config ยท /quit     โ”‚       โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„โ–„  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„โ–„โ–€   โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„โ–„
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ           โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„โ–„โ–„โ–„โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ

๐ŸŽฏ ไธบไป€ไนˆ็”จๅฎƒ

  • ๐Ÿ‹ DeepSeek ๅ“็‰Œ้ฒธ้ฑผๅผ€ๅฑ๏ผšfiglet ๅคงๆ ‡้ข˜ + ๅฎ˜ๆ–น logo ๅฝข็Šถ้ฒธ้ฑผ๏ผˆๅ“็‰Œ่“ #4D6BFE๏ผ‰๏ผŒHermes ๅผๅนถๆŽ’ๅธƒๅฑ€
  • ๐ŸŒ A2A ๆดพๆดป๏ผš่พ“ๅ…ฅ @hermes ๅธฎๆˆ‘ๆŸฅโ€ฆ / @codex ไฟฎไธช bug โ€”โ€” ไธ€ไธช็ปˆ็ซฏๆŒ‡ๆŒฅๆœฌๆœบๅ…จ้ƒจ Agent๏ผŒ็ป“ๆžœๅก็‰‡ๅŒ–่ฟ”ๅ›ž
  • ๐Ÿ“Š ๅฎžๆ—ถ็ปŸ่ฎก๏ผš่ฝฎๆฌก/ๆญฅๆ•ฐใ€LLM ๆ—ถ้—ดใ€ๅทฅๅ…ทๆ—ถ้—ดใ€็ผ“ๅญ˜ๅ‘ฝไธญ็އใ€TPSใ€token ๆ€ป้‡๏ผŒ/config ็ฉบๆ ผๅผ€ๅ…ณ
  • ๐ŸŽญ ๅ››็งๆจกๅผ๏ผšๆ ‡ๅ‡† / PTC / ๆž็ฎ€ / ๅˆ›้€  โ€”โ€” ไธŽ web ๅŒๆฌพ่ฎพ็ฝฎ๏ผŒ/mode ๅˆ‡ๆข
  • ๐Ÿ“ Markdown ๆธฒๆŸ“๏ผšๆ ‡้ข˜ใ€ๅˆ—่กจใ€ๅผ•็”จใ€ไปฃ็ ใ€็ฒ—ไฝ“ๆ–œไฝ“็›ดๆŽฅๅฏ่ง†ๅŒ–
  • ๐Ÿ” ๅ…จๆ–‡ๆœ็ดข๏ผšSQLite FTS ็ดขๅผ•ๅ…จ้ƒจไผš่ฏ๏ผŒ/search ็ง’็บงๅฎšไฝๅކๅฒ
  • ๐ŸŽฌ ่ฝจ่ฟนๅ›žๆ”พ๏ผš/trajectory ้€ๆญฅๅ›ž็œ‹ๆฏไธ€ๆญฅๆ€่€ƒไธŽๅทฅๅ…ท่ฐƒ็”จ
  • ๐Ÿ“‘ ๅคšไผš่ฏ Tab๏ผš/tab new ๆˆ– PgUp/PgDn ็ƒญๅˆ‡ๆข๏ผŒๆฏไผš่ฏ็‹ฌ็ซ‹่ฎฐๅฟ†
  • ๐Ÿ›  ๅฎŒๆ•ดๅทฅๅ…ท้ข๏ผšๅŽๅฐไปปๅŠก้ขๆฟใ€ask_user_question ๆตฎๅฑ‚ใ€plan ๅฎกๆ‰นๆตใ€goal ็Šถๆ€ใ€ๆถˆๆฏๅ้ฆˆ
  • โŒจ๏ธ ไธญๆ–‡ IMEใ€vim ๆจกๅผใ€ๅคš่กŒ่พ“ๅ…ฅใ€ๅ‘ฝไปค่”ๆƒณใ€@ๆ–‡ไปถ ่กฅๅ…จใ€ๅކๅฒๆต่งˆ

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

ๅ‰็ฝฎ๏ผšdsh โ‰ฅ 0.1.0-rc.6ใ€Node โ‰ฅ 22๏ผˆๅซ corepack/pnpm๏ผ‰ใ€‚

# 1. ๅปบ profile
mkdir -p ~/.dsh/profiles/tui && cd ~/.dsh/profiles/tui
cat > package.json <<'EOF'
{
  "name": "dsh-profile-tui",
  "private": true,
  "dependencies": {
    "dsh-tui-app": "github:kouyichi/dsh-tui-app"
  },
  "dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base"] } }
}
EOF
printf 'packages:\n  - .\n\nnodeLinker: hoisted\nautoInstallPeers: false\n' > pnpm-workspace.yaml

# 2. ่ฃ…ไพ่ต–
corepack pnpm install

# 3. ๅ†™ profile patch๏ผˆๆณจๅ…ฅๆ’ไปถ่กŒ + ๆฒ™็ฎฑ + ๆœ็ดข็ดขๅผ•๏ผŒ่ง README ๅฎŒๆ•ด็‰ˆ๏ผ‰
cat > cordis.patch.yml <<'EOF'
- id: system-prompt
  config:
    persona: >-
      You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.
- id: hmr
  disabled: true
- id: sandbox-policy
  config: { mode: danger-full-access, workspaceRoot: !!js process.cwd() }
- id: approval
  config: { policy: never }
- id: web-search-deepseek
  config:
    apiKeyEnv: DEEPSEEK_API_KEY
    baseURL: http://127.0.0.1:8899/anthropic/v1
- insert:
    - id: tui-startup
      name: 'dsh-tui-app/startup'
    - id: session-stats
      name: '@deepseek-ai/dsh-session-stats'
    - id: agent-presets
      name: '@deepseek-ai/dsh-agent-presets'
      config: { default: standard }
    - id: tui-runner
      name: 'dsh-tui-app'
      inject: [tuiStartup]
      config: { sessionId: !!js ctx.tuiStartup.sessionId }
EOF

# 4. ๅฏๅŠจ
dsh --profile tui

โŒจ๏ธ ๅ‘ฝไปคไธŽๅฟซๆท้”ฎ

ๅ‘ฝไปคไฝœ็”จ
/modeAgent ๆจกๅผ๏ผšๆ ‡ๅ‡† / PTC / ๆž็ฎ€ / ๅˆ›้€ ๏ผˆๆ–ฐไผš่ฏ็”Ÿๆ•ˆ๏ผ‰
/modelๆจกๅž‹้€‰ๆ‹ฉๅ™จ + ๆŽจ็†ๅŠ›ๅบฆ๏ผˆe ๅˆ‡ๆข๏ผ‰
/config็Šถๆ€ๆ ็ปŸ่ฎกๅผ€ๅ…ณ๏ผˆ็ฉบๆ ผๅˆ‡ๆข๏ผŒๆŒไน…ๅŒ–๏ผ‰
/jobsๅŽๅฐไปปๅŠก้ขๆฟ๏ผˆ็ฉบๆ ผๆ—ฅๅฟ— ยท k ๅœๆญข๏ผ‰
/search <่ฏ>ไผš่ฏๅ…จๆ–‡ๆœ็ดข๏ผˆFTS๏ผ‰
/trajectoryไบ‹ไปถ่ฝจ่ฟนๅ›žๆ”พ
/feedback up|down [ๅค‡ๆณจ]ๆถˆๆฏๅ้ฆˆ
/tab new | /tab <n>ๅคšไผš่ฏ Tab
/agentsA2A ็ซฏ็‚นๆŽขๆต‹
/goal็›ฎๆ ‡็Šถๆ€๏ผˆ้˜ถๆฎต/่ฝฎๆฌก/ๅ—้˜ปๅŽŸๅ› ๏ผ‰
@hermes/@claude/@codex/@dsh <ไปปๅŠก>A2A ๆดพๆดป
ๅฟซๆท้”ฎไฝœ็”จ
Shift+Enterๅคš่กŒ่พ“ๅ…ฅ
Escvim ๆจกๅผ
Tab / โ†‘โ†“ๅ‘ฝไปค่”ๆƒณ้€‰ๆ‹ฉ
โ†‘โ†“๏ผˆๆ— ่”ๆƒณๆ—ถ๏ผ‰ๅކๅฒๆต่งˆ
Ctrl+Oๆ€่€ƒ/ๅทฅๅ…ทๅก็‰‡ๆŠ˜ๅ 
PgUp/PgDnๅˆ‡ๆขไผš่ฏ Tab
Ctrl+Cไธญๆ–ญ / ้€€ๅ‡บ

๐Ÿ— ๆžถๆž„

dsh-tui-app (cordis ๆ’ไปถ, ็บฏ Node ESM, ้›ถๆž„ๅปบ)
โ”œโ”€โ”€ lib/index.js            agent ้ฉฑๅŠจ + ไผš่ฏ Tab + ่œๅ•่ทฏ็”ฑ + ็ปŸ่ฎก
โ”œโ”€โ”€ lib/runtime/            Ink ๆŒ‚่ฝฝ / ่‡ชๅฎšไน‰่พ“ๅ…ฅๅฑ‚๏ผˆIMEยทvimยท็ฒ˜่ดด๏ผ‰/ store
โ”œโ”€โ”€ lib/channel/            ไบ‹ไปถๅฝ’ไธ€ๅŒ– + A2A ๅฎขๆˆท็ซฏ๏ผˆ50ms ๆ‰น้‡ๆธฒๆŸ“๏ผ‰
โ”œโ”€โ”€ lib/components/         splash / ๆถˆๆฏๆต / ๅทฅๅ…ทๅก็‰‡ / ๅ„้ขๆฟ / TabBar
โ”œโ”€โ”€ lib/markdown.js         ่ฝป้‡ Markdown ๆธฒๆŸ“๏ผˆ้›ถไพ่ต–๏ผ‰
โ”œโ”€โ”€ lib/theme/              ๅ“็‰Œ่“ palette๏ผˆๅ”ฏไธ€ SGR ๆฅๆบ๏ผ‰
โ””โ”€โ”€ test/                   node:test ๅ•ๆต‹

ๆ ธๅฟƒๅŽŸๅˆ™๏ผšTUI ๆ˜ฏ่–„็•Œ้ข โ€”โ€” agent/ไผš่ฏ/ๅทฅๅ…ทๅ…จ้ƒจๆฅ่‡ช @deepseek-ai/dsh-base๏ผ› agent.ctx.on("session/event") ๆ˜ฏๅ”ฏไธ€ๆ•ฐๆฎๆบ๏ผŒไธ่ฝ็›˜ใ€ไธๅคๅˆถ้€ป่พ‘ใ€‚

๐Ÿงช ๅผ€ๅ‘

node --test test/input.test.js test/palette-events.test.js   # 21 ้กนๅ•ๆต‹
printf 'ไฝ ๅฅฝ\n/quit\n' | timeout 60 script -qec "dsh --profile tui" /dev/null  # ๅ†’็ƒŸ

๐Ÿ“„ ่ฎธๅฏ

MIT โ€”โ€” DeepSeek ๆ ‡ๅฟ—ๅฝ’ DeepSeek ๆ‰€ๆœ‰๏ผ›ๆœฌ้กน็›ฎไธบ็‹ฌ็ซ‹้žๅฎ˜ๆ–นๆ’ไปถใ€‚

Related plugins