impel-cli 0.20.51 → 0.20.52

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
@@ -410,7 +410,9 @@ nor a tenant-derived credential.
410
410
  Electron archives cannot be patched without invalidating vendor signatures.
411
411
  It loads the authenticated canonical Impel `/tasks` application directly in
412
412
  a sandboxed, tenant-isolated web view; a fresh profile uses the existing
413
- Board default.
413
+ Board default. Selecting a card, list row, or fleet item opens that exact
414
+ tenant's ticket in the main Impel browser app; the constrained desktop
415
+ session remains board-only.
414
416
  - The trusted native process obtains the selected tenant credential through a
415
417
  private one-shot pipe, exchanges the PAT for a bounded HttpOnly web session,
416
418
  and then loads `/tasks` without an Authorization header. The web renderer has
package/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Release notes
2
2
 
3
+ ## 0.20.52 — Open embedded Tasks tickets safely
4
+
5
+ - Makes cards, list rows, fleet items, and the card menu open their exact
6
+ tenant-scoped ticket in the main Impel browser app.
7
+ - Keeps the embedded desktop session restricted to the Tasks board and sends
8
+ only the credential-free, membership-checked issue handoff to the system
9
+ browser.
10
+ - Updates the coordinated reviewed ChatGPT/Codex pin to desktop
11
+ `26.810.41047`, embedded Codex `0.148.0-alpha.9`, and the currently
12
+ fulfillable Windows Store package `26.810.4967.0`, retaining exact artifact,
13
+ signature, package, publisher, executable, and runtime verification.
14
+ - Skips the prerelease soak because this is an immediate stable repair for the
15
+ embedded ticket-navigation regression and Microsoft Store fulfillment drift;
16
+ the full release CI and Windows vendor contract remain mandatory before tag.
17
+
3
18
  ## 0.20.51 — Restore Claude Tasks in the sidebar
4
19
 
5
20
  - Restores one embedded Tasks row in managed Claude's existing sidebar,
@@ -85,7 +100,6 @@
85
100
  orchestration without changing vendor pins, generated profile contracts, or
86
101
  built bundle bytes; the full release CI, pinned managed-app launch smoke, and
87
102
  Windows vendor contracts remain mandatory before tagging.
88
-
89
103
  ## 0.20.46-beta.2 — Reload reconciled apps safely
90
104
 
91
105
  - Closes every running managed macOS app before rewriting its profile and
@@ -1,6 +1,6 @@
1
1
  # Native-agent host capability matrix
2
2
 
3
- Validated on 2026-08-11 with isolated temporary homes and tenant profiles. The
3
+ Validated on 2026-08-14 with isolated temporary homes and tenant profiles. The
4
4
  matrix is intentionally pinned: a client upgrade must be re-qualified before it
5
5
  is treated as an eager host.
6
6
 
@@ -9,7 +9,7 @@ is treated as an eager host.
9
9
  | Claude Code | 2.1.220 | Yes, agent frontmatter `tools` | Eager; optional single-thread selection | The bound run/answer, resume, and recovery tools are direct child tools. `impel claude --agent` verifies the exact managed adapter before enabling 2.1.220's bypass-permission opt-in and mode. |
10
10
  | Claude Desktop | 1.26832.0 (embedded Code 2.1.222) | Yes, agent frontmatter `tools` | Eager | Same direct-tool contract as Claude Code. |
11
11
  | Codex CLI through `impel codex` | 0.147.0 | Yes, with `features.code_mode.direct_only_tool_namespaces = ["mcp__impel_agent"]` | Eager; optional single-thread profile | Existing `@Agent` children call the fixed MCP namespace directly. `impel codex --agent` also removes the parent spawn/wait/relay thread. |
12
- | ChatGPT desktop Codex | 26.803.81509 (embedded Codex 0.147.0-alpha.6.6) | Yes, with the same exact native namespace | Eager child, compatible parent | Keeps the app's supported `@Agent` parent/child route, but the child no longer needs code cells or code-mode waits. |
12
+ | ChatGPT desktop Codex | 26.810.41047 (embedded Codex 0.148.0-alpha.9) | Yes, with the same exact native namespace | Eager child, compatible parent | Keeps the app's supported `@Agent` parent/child route, but the child no longer needs code cells or code-mode waits. |
13
13
 
14
14
  ## Qualified contract
15
15
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "impel-cli",
3
- "version": "0.20.51",
3
+ "version": "0.20.52",
4
4
  "description": "Prepare isolated Claude and Codex workspaces for every accessible Impel tenant",
5
5
  "type": "module",
6
6
  "bin": {
package/src/apps.js CHANGED
@@ -105,8 +105,8 @@ export const PINNED_VENDOR_APPS = Object.freeze({
105
105
  }),
106
106
  }),
107
107
  chatgpt: Object.freeze({
108
- version: "26.803.81509",
109
- codexVersion: "0.147.0-alpha.6.6",
108
+ version: "26.810.41047",
109
+ codexVersion: "0.148.0-alpha.9",
110
110
  bundleName: "ChatGPT.app",
111
111
  windows: Object.freeze({
112
112
  storeProductId: "9PLM9XGG6VKS",
@@ -114,20 +114,20 @@ export const PINNED_VENDOR_APPS = Object.freeze({
114
114
  // The Microsoft Store manifest identifies this exact reviewed build.
115
115
  // Keep one Windows package version so the manifest contract and local
116
116
  // AppX validation cannot silently drift apart again.
117
- packageVersion: "26.803.10989.0",
118
- codexVersion: "0.147.0-alpha.6.6",
117
+ packageVersion: "26.810.4967.0",
118
+ codexVersion: "0.148.0-alpha.9",
119
119
  publisherId: "2p2nqsd0c76g0",
120
120
  executable: "app\\ChatGPT.exe",
121
121
  updateManifestUrl: "https://persistent.oaistatic.com/codex-app-prod/windows-store-update.json",
122
122
  }),
123
123
  downloads: Object.freeze({
124
124
  arm64: Object.freeze({
125
- url: "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.803.81509.zip",
126
- sha256: "34c7e629678ad5d63a639ec694a5b83b85f4e1bd7c21ee2abcfefbb041095b9c",
125
+ url: "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.810.41047.zip",
126
+ sha256: "b8e82ade7b1f0161f1aec50c165bc97083ae5592703f8df3bff5850f57aaf287",
127
127
  }),
128
128
  x64: Object.freeze({
129
- url: "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-x64-26.803.81509.zip",
130
- sha256: "c9d5a14803c3138a77be5e891a4944c04ff421645150043dd3eddd0bf34eda97",
129
+ url: "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-x64-26.810.41047.zip",
130
+ sha256: "bec467c8ab052cfd6acb2492ba95439fbbbe0e001a138b3943f55036e0c51c4e",
131
131
  }),
132
132
  }),
133
133
  }),
@@ -455,10 +455,33 @@ if (
455
455
  try { return new URL(rawUrl).origin === appOrigin; }
456
456
  catch { return false; }
457
457
  };
458
+ const issueHandoff = (rawUrl) => {
459
+ try {
460
+ const url = new URL(rawUrl);
461
+ const prefix = "/api/issues/open/";
462
+ const issueId = url.pathname.startsWith(prefix) ? url.pathname.slice(prefix.length) : "";
463
+ const orgIds = url.searchParams.getAll("orgId");
464
+ return url.origin === appOrigin
465
+ && !url.username
466
+ && !url.password
467
+ && !url.hash
468
+ && Boolean(issueId)
469
+ && !issueId.includes("/")
470
+ && issueId.length <= 128
471
+ && [...url.searchParams.keys()].every((key) => key === "orgId")
472
+ && orgIds.length === 1
473
+ && /^[A-Za-z0-9_.-]{1,128}$/u.test(orgIds[0]);
474
+ } catch { return false; }
475
+ };
458
476
  const external = (rawUrl) => {
459
477
  try {
460
478
  const url = new URL(rawUrl);
461
- if (url.protocol === "https:" && !url.username && !url.password && url.origin !== appOrigin) {
479
+ if (
480
+ url.protocol === "https:"
481
+ && !url.username
482
+ && !url.password
483
+ && (url.origin !== appOrigin || issueHandoff(url.href))
484
+ ) {
462
485
  shell.openExternal(url.href).catch(() => record("external-link-failed"));
463
486
  }
464
487
  } catch {}
@@ -636,7 +659,8 @@ if (
636
659
  view.setVisible(false);
637
660
  view.setBackgroundColor("#181818");
638
661
  view.webContents.setWindowOpenHandler(({ url }) => {
639
- if (exactOrigin(url)) view.webContents.loadURL(url).catch(() => record("board-navigation-failed"));
662
+ if (issueHandoff(url)) external(url);
663
+ else if (exactOrigin(url)) view.webContents.loadURL(url).catch(() => record("board-navigation-failed"));
640
664
  else external(url);
641
665
  return { action: "deny" };
642
666
  });
@@ -4,4 +4,6 @@
4
4
  // v42 restores Claude's embedded Tasks entry through its real sidebar, using
5
5
  // the same fallback-free, tenant-bound board lifecycle already enabled for
6
6
  // managed ChatGPT profiles.
7
- export const CURRENT_CONFIG_VERSION = 42;
7
+ // v43 sends tenant-checked issue handoffs from the embedded board to the main
8
+ // Impel browser app without expanding the capability-scoped desktop session.
9
+ export const CURRENT_CONFIG_VERSION = 43;