impel-cli 0.20.46-beta.2 → 0.20.47

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,19 @@
1
1
  # Release notes
2
2
 
3
+ ## 0.20.47 — Keep Tasks on the primary app window
4
+
5
+ - Makes the native Tasks fallback choose the earliest surviving primary host
6
+ window deterministically, so a later ChatGPT auxiliary renderer cannot win a
7
+ probe race and cover the real app with an empty grey window.
8
+ - Adds a behavioral regression that returns the auxiliary window first, lets it
9
+ finish navigation probing first, and proves the fallback and authenticated
10
+ board still attach only to the primary window.
11
+ - Skips the prerelease soak because this is an immediate stable regression
12
+ hotfix for `0.20.46`. The change updates the external Tasks preload
13
+ orchestration without changing vendor pins, generated profile contracts, or
14
+ built bundle bytes; the full release CI, pinned managed-app launch smoke, and
15
+ Windows vendor contracts remain mandatory before tagging.
16
+
3
17
  ## 0.20.46-beta.2 — Reload reconciled apps safely
4
18
 
5
19
  - Closes every running managed macOS app before rewriting its profile and
@@ -41,23 +55,29 @@
41
55
  reviewed tree to stable `0.20.46` only after the session endpoint is deployed
42
56
  and the isolated pinned-app launch smoke passes.
43
57
 
44
- ## 0.20.46 — Restore exact ChatGPT Store compatibility
58
+ ## 0.20.46 — Ship hardened managed apps and the embedded Tasks board
45
59
 
60
+ - Promotes the tested `0.20.46-beta.2` tree without changing its managed
61
+ profile or bundle fingerprints.
46
62
  - Updates the coordinated reviewed ChatGPT pin to desktop `26.803.81509`,
47
63
  embedded Codex `0.147.0-alpha.6.6`, and Windows Store package
48
- `26.803.10989.0`, restoring managed installation while keeping artifact,
49
- signature, runtime, and version checks exact and fail-closed.
50
- - Retries gateway model-catalog body-read timeouts as readiness failures while
51
- preserving malformed-catalog failures and one shared bounded retry policy.
52
- - Prevents cooperating verbatim-relay hosts from adding external sources on
53
- every managed relay surface, including the default Claude slash command.
54
- - Preserves the original vendor-install failure and the untouched sibling app
55
- during targeted recovery, instead of replacing useful diagnostics or
56
- disturbing an otherwise healthy managed app.
57
- - Accepts the control plane's `cancelled` task progress value in `impel tasks`
58
- validation and command help.
59
- - Carries the exact-pin compatibility repair through the `0.20.46` prerelease
60
- train before stable promotion.
64
+ `26.803.10989.0`, keeping artifact, signature, runtime, and version checks
65
+ exact and fail-closed.
66
+ - Embeds the authenticated canonical Impel Tasks board in managed macOS Claude
67
+ and ChatGPT apps through a sandboxed, tenant-isolated web view while retaining
68
+ tenant-bound headless Tasks tools on Windows and in both CLIs.
69
+ - Closes every running managed macOS app before rewriting its profile and Tasks
70
+ preloads, then reopens only the exact managed launchers the update closed;
71
+ current bundles still avoid unnecessary rebuilds.
72
+ - Uses a code-mode-compatible Codex model for explicit tenant-agent adapters
73
+ and refreshes existing generated adapters through the managed-agent manifest.
74
+ - Keeps Tasks cold starts and the native navigation fallback reliable, permits
75
+ only the reviewed GitHub avatar origin, and gives reasoning-capable Claude
76
+ doctor probes enough output budget with actionable non-terminal stop reasons.
77
+ - Retries gateway model-catalog body-read timeouts as readiness failures,
78
+ preserves original targeted-recovery diagnostics and healthy sibling apps,
79
+ prevents external-source additions on managed verbatim-relay surfaces, and
80
+ accepts the control plane's `cancelled` task progress value.
61
81
 
62
82
  ## 0.20.41 — Windows onboarding: converge over an already-installed Store ChatGPT
63
83
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "impel-cli",
3
- "version": "0.20.46-beta.2",
3
+ "version": "0.20.47",
4
4
  "description": "Prepare isolated Claude and Codex workspaces for every accessible Impel tenant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -483,6 +483,9 @@ if (
483
483
  } catch {}
484
484
  return window.isVisible?.() !== false;
485
485
  };
486
+ const fallbackHostWindow = () => BrowserWindow.getAllWindows()
487
+ .filter(isPrimaryWindow)
488
+ .sort((left, right) => left.id - right.id)[0] || null;
486
489
  const createView = (window) => {
487
490
  const state = stateFor(window);
488
491
  if (state.view && !state.view.webContents.isDestroyed()) return state;
@@ -573,8 +576,12 @@ if (
573
576
  const content = window.getContentBounds();
574
577
  state.nativeNav.setBounds({ x: content.x + 12, y: content.y + Math.max(48, content.height - 92), width: Math.min(120, Math.max(80, content.width - 24)), height: 38 });
575
578
  };
576
- const ensureNativeNav = (window) => {
577
- if (!isPrimaryWindow(window)) return;
579
+ const ensureNativeNav = () => {
580
+ // Renderer probes finish independently. Always bind the singleton
581
+ // fallback to the earliest surviving host window, not whichever visible
582
+ // auxiliary renderer happens to exhaust its probe retries first.
583
+ const window = fallbackHostWindow();
584
+ if (!window) return;
578
585
  const state = stateFor(window);
579
586
  if (state.nativeNav && !state.nativeNav.isDestroyed()) return;
580
587
  // Auxiliary vendor windows (for example Codex's hidden avatar overlay)
@@ -641,7 +648,7 @@ if (
641
648
  state.hasDomNavigation = true;
642
649
  for (const owner of BrowserWindow.getAllWindows()) removeNativeNav(owner);
643
650
  } else if (attempt < 3) setTimeout(() => inject(attempt + 1), 1000);
644
- else if (!state.hasDomNavigation && !hasDomNavigation) ensureNativeNav(window);
651
+ else if (!state.hasDomNavigation && !hasDomNavigation) ensureNativeNav();
645
652
  })
646
653
  .catch(() => record("navigation-injection-failed"));
647
654
  };