impel-cli 0.20.63 → 0.20.64

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/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Release notes
2
2
 
3
+ ## 0.20.64 — Windows cmd-compatible Codex hooks; rebuilt managed macOS package
4
+
5
+ - Emits managed Codex hooks with cmd-compatible quoting on Windows. Codex's
6
+ Windows hook runner passes `commandWindows` to cmd.exe as one raw command
7
+ line, so the PowerShell call syntax used before failed every Windows hook
8
+ even though the same command worked on macOS. Bumps the managed config
9
+ contract to 49 so existing Windows profiles are rewritten.
10
+ - New version so the managed macOS `Impel-CLI` package can be reissued and
11
+ reinstalled by Munki. The 0.20.63 package published with release 0.1.134 was
12
+ re-signed without the Node runtime's JIT entitlements and its bundled Node
13
+ aborts at startup; the impel-apps builders now restore those entitlements,
14
+ but Munki only replaces the package when its version increases.
15
+
3
16
  ## 0.20.63 — Route isolated Codex through the typed gateway surface
4
17
 
5
18
  - Moves the `impel codex` and `impel use gateway codex` model provider from the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "impel-cli",
3
- "version": "0.20.63",
3
+ "version": "0.20.64",
4
4
  "description": "Prepare isolated Claude and Codex workspaces for every accessible Impel tenant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,9 +17,6 @@
17
17
  // v47 persists `features.apps = false` in the managed ChatGPT desktop profile
18
18
  // so the hosted codex_apps connector stops handshaking against the gateway
19
19
  // without a credential (the same gate 0.20.61 passed to CLI sessions).
20
- // v48 moves the isolated CLI Codex provider from the raw
21
- // `/chatgpt_passthrough/backend-api/codex` route (Codex-native models only) to
22
- // the typed `/openai/v1` route the managed ChatGPT desktop profile uses, and
23
- // pins `supports_websockets = false` so Codex stops retrying a wss://
24
- // handshake the gateway refuses before every HTTPS turn.
25
- export const CURRENT_CONFIG_VERSION = 48;
20
+ // v49 rewrites Codex `commandWindows` from PowerShell syntax to the
21
+ // `cmd.exe` syntax required by Codex's hook runner.
22
+ export const CURRENT_CONFIG_VERSION = 49;
@@ -2,6 +2,7 @@ import fs from "node:fs";
2
2
  import crypto from "node:crypto";
3
3
  import path from "node:path";
4
4
 
5
+ import { escapeWindowsBareArgument } from "./nativeProcess.js";
5
6
  import { impelCliInvocation } from "./selfInvocation.js";
6
7
  import { RUNTIME_BRAND } from "./runtimeBrand.js";
7
8
 
@@ -146,12 +147,6 @@ function shellQuote(value) {
146
147
  return `'${String(value).replaceAll("'", `'"'"'`)}'`;
147
148
  }
148
149
 
149
- function powershellQuote(value) {
150
- const text = String(value);
151
- if (/[\r\n\0]/u.test(text)) throw new Error("cannot safely write this Windows hook command");
152
- return `'${text.replaceAll("'", "''")}'`;
153
- }
154
-
155
150
  function canonicalize(value) {
156
151
  if (Array.isArray(value)) return value.map(canonicalize);
157
152
  if (!value || typeof value !== "object") return value;
@@ -214,11 +209,9 @@ export function ensureCodexSessionHooks(codexHome, tenantId, surface = "codex_cl
214
209
  const document = readJsonObject(hooksPath);
215
210
  const invocation = managedInvocation("codex", surface, tenantId);
216
211
  const unixCommand = [invocation.command, ...invocation.args].map(shellQuote).join(" ");
217
- const windowsTokens = [invocation.command, ...invocation.args].map(powershellQuote).join(" ");
218
- // Codex runs commandWindows through the session's normal Windows shell,
219
- // which is PowerShell. A quoted executable is only invoked when prefixed by
220
- // the call operator; cmd.exe's doubled outer-quote form is invalid here.
221
- const windowsCommand = `& ${windowsTokens}`;
212
+ const windowsCommand = [invocation.command, ...invocation.args]
213
+ .map(escapeWindowsBareArgument)
214
+ .join(" ");
222
215
  const handler = {
223
216
  type: "command",
224
217
  command: unixCommand,