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 +49 -20
- package/bin/{dsh-tui.js → martty.js} +9 -7
- package/lib/agent.js +1 -1
- package/lib/demo-skin.js +3 -3
- package/lib/spawn-tui.js +7 -7
- package/package.json +4 -4
- package/vendor/darwin-arm64/{dsh-tui → martty} +0 -0
- package/vendor/darwin-x64/{dsh-tui → martty} +0 -0
- package/vendor/linux-arm64/{dsh-tui → martty} +0 -0
- package/vendor/linux-x64/{dsh-tui → martty} +0 -0
- package/vendor/win32-x64/{dsh-tui.exe → martty.exe} +0 -0
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/
|
|
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">
|
|
5
|
+
<h1 align="center">Martty</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
|
|
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
|
|
21
|
-
dsh --profile
|
|
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
|
-
`
|
|
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
|
|
57
|
+
dsh plugin --profile martty add martty@latest
|
|
38
58
|
```
|
|
39
59
|
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
`
|
|
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
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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 `
|
|
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/
|
|
133
|
-
| `darwin-x64` | `vendor/darwin-x64/
|
|
134
|
-
| `linux-x64` | `vendor/linux-x64/
|
|
135
|
-
| `linux-arm64` | `vendor/linux-arm64/
|
|
136
|
-
| `win32-x64` | `vendor/win32-x64/
|
|
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' ? '
|
|
12
|
+
const binaryName = process.platform === 'win32' ? 'martty.exe' : 'martty'
|
|
13
13
|
const packaged = path.join(vendorDir, platformKey, binaryName)
|
|
14
|
-
const
|
|
15
|
-
const binaryPath = typeof
|
|
16
|
-
|
|
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('
|
|
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.
|
|
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.
|
|
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: '
|
|
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(`
|
|
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 `
|
|
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`
|
|
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' ? '
|
|
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('
|
|
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(`
|
|
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('
|
|
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.
|
|
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
|
-
"
|
|
55
|
-
"
|
|
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.
|
|
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
|