martty 0.2.18 → 0.2.20

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/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/openma-ai/Martty/main/assets/tui-whale.svg" width="424" alt="DeepSeek Harness TUI whale" />
2
+ <img src="https://raw.githubusercontent.com/openma-ai/Martty/main/assets/martty-lockup.svg" width="650" alt="Martty terminal lockup" />
3
3
  </p>
4
4
 
5
- <h1 align="center">DeepSeek Harness TUI</h1>
5
+ <h1 align="center">Martty</h1>
6
6
 
7
7
  <p align="center">
8
- Terminal-native ACP client UI with a Cordis client plugin tree.
8
+ A DSH-first terminal with the same Cordis plugin model, plus support for other ACP agents.
9
9
  </p>
10
10
 
11
11
  ---
@@ -13,19 +13,39 @@
13
13
  Native binaries are packaged for macOS arm64, macOS x64, Linux x64, and Windows
14
14
  x64. Requires Node.js 18+.
15
15
 
16
+ > **Rename note:** the project and recommended npm package have moved from
17
+ > DeepSeek Harness TUI / `martty` to **Martty** / `martty`.
18
+ > The `dsh-tui` command, configuration, and session data remain compatible.
19
+ > The production profile is now `martty`; legacy `tui` profiles
20
+ > continue to work.
21
+
22
+ ## Global Agent TUI
23
+
24
+ ```sh
25
+ npm install --global martty
26
+ martty
27
+ ```
28
+
29
+ Martty directly depends on our `@openma/deepseek-harness-acp` implementation.
30
+ It resolves this built-in ACP from its own dependency graph, connects DSH by
31
+ default, and requires no separate ACP installation. For another ACP server,
32
+ configure `DSH_TUI_AGENT`; Cordis embedding can instead provide `config.agent`
33
+ or `config.stream`. `--agent` is only the standalone CLI override for the same
34
+ connection configuration.
35
+
16
36
  ## Recommended
17
37
 
18
38
  ```sh
19
39
  npm install --global @deepseek-ai/dsh
20
- dsh plugin --profile tui add martty@latest
21
- dsh --profile tui
40
+ dsh plugin --profile martty add martty@latest
41
+ dsh --profile martty
22
42
  ```
23
43
 
24
44
  The profile command is the recommended install and upgrade path. It creates a
25
45
  missing profile and installs the TUI plus its ACP dependency; no global
26
- `dsh-tui` installation is required.
46
+ `martty` installation is required.
27
47
 
28
- ## Migrating from the scoped package
48
+ ## Migrating from DeepSeek Harness TUI / the scoped package
29
49
 
30
50
  `martty` is the recommended package name. Starting with `0.2.13`, it and the
31
51
  legacy `martty` package are published by the same CI run
@@ -34,15 +54,16 @@ supported. To switch package names:
34
54
 
35
55
  ```sh
36
56
  dsh plugin --profile tui remove martty
37
- dsh plugin --profile tui add martty@latest
57
+ dsh plugin --profile martty add martty@latest
38
58
  ```
39
59
 
40
- Only the package spec changes. The `dsh-tui` / `dsb` commands, `tui` profile,
41
- runtime behavior, config, and session data remain unchanged.
60
+ The recommended profile changes from `tui` to `martty`; runtime behavior,
61
+ config, and session data remain unchanged. `dsh-tui` and legacy `tui`
62
+ profiles remain compatible.
42
63
 
43
64
  The profile Host mounts the ACP plugin on Base, then starts a separate TUI
44
65
  Client process over standard ACP stdin/stdout. For standalone use, run
45
- `dsh-tui` and use `--agent <cmd>` plus repeated `--agent-arg <arg>` for another
66
+ `martty` and use `--agent <cmd>` plus repeated `--agent-arg <arg>` for another
46
67
  ACP server. The Node Client process owns a Cordis tree and starts the Rust painter. A sibling
47
68
  `tui-cordis-client-runner` publishes TUI Client capabilities and evaluates
48
69
  approved `code.client` packages from `dsh-tool-cordis` against that client tree.
@@ -79,11 +100,19 @@ agent traffic remains ACP.
79
100
  ## Demo
80
101
 
81
102
  ```sh
82
- dsh-tui --demo
83
- dsh-tui --demo-skin
103
+ martty --demo
104
+ martty --demo-skin
105
+ ```
106
+
107
+ Without a global installation:
108
+
109
+ ```sh
110
+ npx --yes martty --demo
84
111
  ```
85
112
 
86
- `dsh-tui` is the primary command. `dsb` is a compatibility alias.
113
+ The profile path remains recommended for an existing DSH installation that
114
+ wants standard plugin management and a durable `martty` profile. `martty` is the
115
+ primary command; `dsh-tui` remains a compatibility alias.
87
116
 
88
117
  ## Highlights
89
118
 
@@ -122,18 +151,18 @@ absolute coordinates, compositor fds, or private transport methods.
122
151
  The versioned contract and examples live in the repository's
123
152
  [plugin API](https://github.com/openma-ai/Martty/blob/main/docs/plugins.en.md).
124
153
 
125
- The demo needs no API key or agent. Run `dsh-tui --help` for agent, model,
154
+ The demo needs no API key or agent. Run `martty --help` for agent, model,
126
155
  credential, session, theme, and demo options.
127
156
 
128
157
  ## Supported platforms
129
158
 
130
159
  | Node platform key | Binary |
131
160
  |---|---|
132
- | `darwin-arm64` | `vendor/darwin-arm64/dsh-tui` |
133
- | `darwin-x64` | `vendor/darwin-x64/dsh-tui` |
134
- | `linux-x64` | `vendor/linux-x64/dsh-tui` |
135
- | `linux-arm64` | `vendor/linux-arm64/dsh-tui` |
136
- | `win32-x64` | `vendor/win32-x64/dsh-tui.exe` |
161
+ | `darwin-arm64` | `vendor/darwin-arm64/martty` |
162
+ | `darwin-x64` | `vendor/darwin-x64/martty` |
163
+ | `linux-x64` | `vendor/linux-x64/martty` |
164
+ | `linux-arm64` | `vendor/linux-arm64/martty` |
165
+ | `win32-x64` | `vendor/win32-x64/martty.exe` |
137
166
 
138
167
  If installation succeeds but launch reports `no native binary for ...`, confirm
139
168
  that you installed the latest version and that your platform appears above.
@@ -9,11 +9,13 @@ import { bootClient, parseClientArgv, painterArgs } from '../lib/boot.js'
9
9
  const __dirname = path.dirname(fileURLToPath(import.meta.url))
10
10
  const platformKey = process.platform + '-' + process.arch
11
11
  const vendorDir = path.join(__dirname, '..', 'vendor')
12
- const binaryName = process.platform === 'win32' ? 'dsh-tui.exe' : 'dsh-tui'
12
+ const binaryName = process.platform === 'win32' ? 'martty.exe' : 'martty'
13
13
  const packaged = path.join(vendorDir, platformKey, binaryName)
14
- const envBin = process.env.DSH_TUI_BIN
15
- const binaryPath = typeof envBin === 'string' && envBin.length > 0 && fs.existsSync(envBin)
16
- ? envBin
14
+ const configuredBin = process.env.MARTTY_BIN || process.env.DSH_TUI_BIN
15
+ const binaryPath = typeof configuredBin === 'string'
16
+ && configuredBin.length > 0
17
+ && fs.existsSync(configuredBin)
18
+ ? configuredBin
17
19
  : packaged
18
20
 
19
21
  const argv = process.argv.slice(2)
@@ -32,7 +34,7 @@ if (!fs.existsSync(binaryPath)) {
32
34
  } catch {
33
35
  // vendor dir missing entirely
34
36
  }
35
- console.error('dsh-tui: no bundled binary for this platform (' + platformKey + ').')
37
+ console.error('martty: no bundled binary for this platform (' + platformKey + ').')
36
38
  if (available.length > 0) {
37
39
  console.error('Bundled platforms: ' + available.join(', '))
38
40
  } else {
@@ -54,7 +56,7 @@ if (wantHelp || wantVersion || wantDemo) {
54
56
  }
55
57
 
56
58
  if (wantDemoSkin) {
57
- process.env.DSH_TUI_BIN ??= binaryPath
59
+ process.env.MARTTY_BIN ??= binaryPath
58
60
  const demoSkinPath = path.join(__dirname, '..', 'lib', 'demo-skin.js')
59
61
  const args = argv.filter((arg) => arg !== '--demo-skin')
60
62
  exitFromSpawn(spawnSync(process.execPath, [demoSkinPath, ...args], {
@@ -63,6 +65,6 @@ if (wantDemoSkin) {
63
65
  }))
64
66
  }
65
67
 
66
- process.env.DSH_TUI_BIN ??= binaryPath
68
+ process.env.MARTTY_BIN ??= binaryPath
67
69
  const parsed = parseClientArgv(argv)
68
70
  await bootClient({ agent: parsed.agent, extraArgs: painterArgs(parsed) })
package/lib/agent.js CHANGED
@@ -45,7 +45,7 @@ export function resolveStackedAgent(anchor = import.meta.url) {
45
45
  // Source checkouts may not have materialized the package dependencies.
46
46
  }
47
47
  const home = process.env.DSH_HOME ?? join(homedir(), '.dsh')
48
- for (const profile of ['tui-test', 'tui']) {
48
+ for (const profile of ['tui-test', 'martty', 'tui']) {
49
49
  const bin = join(home, 'profiles', profile, 'node_modules', '.bin', 'dsh-acp')
50
50
  const creator = join(
51
51
  home,
package/lib/demo-skin.js CHANGED
@@ -37,7 +37,7 @@ export async function runDemoSkin(argv = process.argv.slice(2)) {
37
37
  const theme = ctx.tuiTheme
38
38
  ctx.tuiTheme.activate('ember')
39
39
 
40
- const bin = process.env.DSH_TUI_BIN || nativeBinary()
40
+ const bin = process.env.MARTTY_BIN || process.env.DSH_TUI_BIN || nativeBinary()
41
41
  const connection = await spawnPluginTui(bin, extraBinaryArgs(argv))
42
42
  const { child } = connection
43
43
  const transport = new JsonRpcLineTransport(connection.input, connection.output)
@@ -50,7 +50,7 @@ export async function runDemoSkin(argv = process.argv.slice(2)) {
50
50
  transport.onRequest(async (method) => {
51
51
  switch (method) {
52
52
  case 'initialize':
53
- return { serverInfo: { name: 'dsh-tui-demo-skin', version } }
53
+ return { serverInfo: { name: 'martty-demo-skin', version } }
54
54
  case 'session/prompt':
55
55
  return { messageId: 'demo-skin' }
56
56
  case 'shutdown':
@@ -67,7 +67,7 @@ export async function runDemoSkin(argv = process.argv.slice(2)) {
67
67
  process.exit(code === null ? 0 : code)
68
68
  })
69
69
  child.on('error', (err) => {
70
- console.error(`dsh-tui demo-skin failed: ${err.message}`)
70
+ console.error(`martty demo-skin failed: ${err.message}`)
71
71
  process.exit(1)
72
72
  })
73
73
  }
package/lib/spawn-tui.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Spawn the platform-native `dsh-tui` binary for plugin / demo-skin attach.
2
+ * Spawn the platform-native `martty` binary for plugin / demo-skin attach.
3
3
  *
4
4
  * Unix extra fds: 3 = Node→TUI (Rust reads), 4 = TUI→Node (Rust writes).
5
5
  * Windows (and DSH_TUI_FORCE_TCP=1): authenticated loopback TCP.
@@ -26,13 +26,13 @@ export function selectNativeBinary({ envBin, devBin, packagedBin }) {
26
26
 
27
27
  /**
28
28
  * Packaged native binary for this platform, or throw if it was not staged.
29
- * Honors `DSH_TUI_BIN` when that path exists (source / cargo re-exec).
29
+ * Honors `MARTTY_BIN`, with `DSH_TUI_BIN` as a compatibility fallback.
30
30
  * @returns {string}
31
31
  */
32
32
  export function nativeBinary() {
33
- const envBin = process.env.DSH_TUI_BIN
33
+ const envBin = process.env.MARTTY_BIN || process.env.DSH_TUI_BIN
34
34
  const key = `${process.platform}-${process.arch}`
35
- const exe = process.platform === 'win32' ? 'dsh-tui.exe' : 'dsh-tui'
35
+ const exe = process.platform === 'win32' ? 'martty.exe' : 'martty'
36
36
  const bin = path.join(__dirname, '..', 'vendor', key, exe)
37
37
  const devBin = path.join(__dirname, '..', '..', 'target', 'debug', exe)
38
38
  const selected = selectNativeBinary({ envBin, devBin, packagedBin: bin })
@@ -90,7 +90,7 @@ export async function spawnPluginTui(bin, extraArgs = [], tty = {}) {
90
90
  const address = server.address()
91
91
  if (address === null || typeof address === 'string') {
92
92
  server.close()
93
- throw new Error('dsh-tui runner failed to allocate a loopback TCP port')
93
+ throw new Error('martty runner failed to allocate a loopback TCP port')
94
94
  }
95
95
 
96
96
  const authenticated = waitForAuthenticatedSocket(server, token)
@@ -103,7 +103,7 @@ export async function spawnPluginTui(bin, extraArgs = [], tty = {}) {
103
103
  const childFailed = new Promise((_, reject) => {
104
104
  onChildError = reject
105
105
  onChildExit = (code, signal) => {
106
- reject(new Error(`dsh-tui exited before connecting (code=${code}, signal=${signal})`))
106
+ reject(new Error(`martty exited before connecting (code=${code}, signal=${signal})`))
107
107
  }
108
108
  child.once('error', onChildError)
109
109
  child.once('exit', onChildExit)
@@ -129,7 +129,7 @@ function waitForAuthenticatedSocket(server, token) {
129
129
  const timeout = setTimeout(() => {
130
130
  cleanup()
131
131
  server.close()
132
- reject(new Error('dsh-tui timed out connecting to the loopback transport'))
132
+ reject(new Error('martty timed out connecting to the loopback transport'))
133
133
  }, 10_000)
134
134
  timeout.unref?.()
135
135
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "martty",
3
- "version": "0.2.18",
3
+ "version": "0.2.20",
4
4
  "description": "Terminal-native ACP client UI; Cordis client tree, any ACP agent",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -51,8 +51,8 @@
51
51
  "./package.json": "./package.json"
52
52
  },
53
53
  "bin": {
54
- "dsh-tui": "bin/dsh-tui.js",
55
- "dsb": "bin/dsh-tui.js"
54
+ "martty": "bin/martty.js",
55
+ "dsh-tui": "bin/martty.js"
56
56
  },
57
57
  "files": [
58
58
  "bin",
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "dependencies": {
73
73
  "@deepseek-ai/cordis": "^4.0.1",
74
- "@openma/deepseek-harness-acp": "0.4.20"
74
+ "@openma/deepseek-harness-acp": "0.4.21"
75
75
  },
76
76
  "devDependencies": {
77
77
  "@deepseek-ai/dsh": "0.1.0-rc.6"
index 6ba2228..21183a5 100755
Binary file
index a6f1556..56422b8 100755
Binary file
index 4884403..36bbfbc 100755
Binary file
index a9c208f..3fa21d7 100755
Binary file
index b6d53bf..dbcab60 100644
Binary file