dsh-plugin-lcu 0.3.7 → 0.3.8

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.8
4
+
5
+ The Codex upgrade script works across DSH Desktop releases again, and its
6
+ baseline now records `@openai/codex` 0.164.0.
7
+
8
+ - Resolve the app-bundled pnpm from the location current Desktop builds use
9
+ (`runtime/primary-runtime/dependencies/pnpm/bin/pnpm.mjs`), keeping the old
10
+ `runtime/pnpm/...` path as a fallback. The 0.2.1-rc.3 release moved it, and the
11
+ script's stale constant made every install fail with a null status.
12
+ - Keep the two-space indent when rewriting an existing override line. Dropping
13
+ it turned the key into a top-level entry, so pnpm ignored the override and
14
+ installed the dependency's own 0.153.4 pin; the script then reported
15
+ "installed 0.153.4, wanted 0.164.0" instead of applying the target.
16
+ - Include the spawn error when pnpm cannot start, instead of an empty detail.
17
+ - Verified 0.164.0 through all three gates (handshake, protocol schema, real
18
+ turn) and recorded it in `scripts/codex-baseline.json`; this profile now pins
19
+ `@deepseek-ai/dsh-subagent-codex>@openai/codex` to 0.164.0.
20
+
3
21
  ## 0.3.7
4
22
 
5
23
  Documentation only; no behaviour change.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-lcu",
3
- "version": "0.3.7",
3
+ "version": "0.3.8",
4
4
  "description": "Drive the desktop and Chrome from DeepSeek Harness using the computer-use runtime inside the ChatGPT desktop application.",
5
5
  "keywords": [
6
6
  "dsh-plugin",
@@ -1,6 +1,6 @@
1
1
  {
2
- "codex": "0.160.1",
3
- "verifiedAt": "2026-10-07T09:56:24.427Z",
2
+ "codex": "0.164.0",
3
+ "verifiedAt": "2026-10-25T13:28:39.458Z",
4
4
  "previous": "0.160.1",
5
5
  "gates": {
6
6
  "handshake": "ok",
@@ -55,7 +55,16 @@ const CODEX_ENTRY = 'node_modules/@openai/codex/bin/codex.js'
55
55
  // fetch every OS/arch payload (~275 MB each).
56
56
  const OVERRIDE_KEY = '"@deepseek-ai/dsh-subagent-codex>@openai/codex"'
57
57
  const OVERRIDE_RE = /^\s*"@deepseek-ai\/dsh-subagent-codex>@openai\/codex":.*$/m
58
- const APP_PNPM = '/Applications/DeepSeek Harness.app/Contents/Resources/runtime/pnpm/bin/pnpm.cjs'
58
+ // The Desktop app bundles the pnpm the profile was installed with, and that
59
+ // payload moves between releases: 0.2.1-rc.3 keeps it under primary-runtime,
60
+ // while older builds used runtime/pnpm. Resolve the first one that exists —
61
+ // a PATH pnpm is only a last resort, because a different pnpm may refuse this
62
+ // profile's node_modules without a TTY.
63
+ const APP_PNPM_CANDIDATES = [
64
+ '/Applications/DeepSeek Harness.app/Contents/Resources/runtime/primary-runtime/dependencies/pnpm/bin/pnpm.mjs',
65
+ '/Applications/DeepSeek Harness.app/Contents/Resources/runtime/pnpm/bin/pnpm.cjs',
66
+ ]
67
+ const APP_PNPM = APP_PNPM_CANDIDATES.find((path) => existsSync(path))
59
68
 
60
69
  /**
61
70
  * The protocol surface dsh-subagent-codex/src/wire.ts actually uses.
@@ -129,7 +138,11 @@ function readOverride(text) {
129
138
  function writeOverride(text, version, key = OVERRIDE_KEY) {
130
139
  const line = ` ${key}: "${version}"`
131
140
  if (OVERRIDE_RE.test(text)) {
132
- return text.replace(OVERRIDE_RE, line.trimStart())
141
+ // Keep the two-space indent: the replacement line lands inside the
142
+ // `overrides:` mapping. Dropping it (a previous bug) turned the key into a
143
+ // top-level entry, so pnpm silently ignored the override and installed the
144
+ // dependency's own pin instead.
145
+ return text.replace(OVERRIDE_RE, line)
133
146
  }
134
147
  if (/^overrides:/m.test(text)) {
135
148
  return text.replace(/^overrides:\s*$/m, `overrides:\n${line}`)
@@ -399,12 +412,15 @@ function install(profile, runner) {
399
412
  env: { ...process.env, CI: 'true' },
400
413
  })
401
414
  if (result.status !== 0) {
402
- const detail = `${result.stdout ?? ''}\n${result.stderr ?? ''}`
415
+ // spawnSync reports a failure to start (missing executable, EACCES) as a
416
+ // null status plus `error`; without it the message would be empty.
417
+ const spawnFailure = result.error === undefined ? '' : `${result.error.message}\n`
418
+ const detail = `${spawnFailure}${result.stdout ?? ''}\n${result.stderr ?? ''}`
403
419
  .split('\n')
404
420
  .filter((line) => line.trim() !== '' && !line.includes('NPM_TOKEN'))
405
421
  .slice(-25)
406
422
  .join('\n')
407
- throw new Error(`pnpm install failed (${result.status}):\n${detail}`)
423
+ throw new Error(`pnpm install failed (${String(result.status)}):\n${detail}`)
408
424
  }
409
425
  }
410
426
 
@@ -417,7 +433,7 @@ function install(profile, runner) {
417
433
  */
418
434
  function resolvePnpm(explicit) {
419
435
  if (explicit !== undefined) return [explicit]
420
- if (existsSync(APP_PNPM)) return [process.execPath, APP_PNPM]
436
+ if (APP_PNPM !== undefined) return [process.execPath, APP_PNPM]
421
437
  return ['pnpm']
422
438
  }
423
439