Skip to content

chore(release): MIT + 0.2.0 alignment and production CI smoke - #15

Merged
tonythethompson merged 1 commit into
mainfrom
release/0.2.0-handoff
Jul 26, 2026
Merged

tonythethompson merged 1 commit into
mainfrom
release/0.2.0-handoff

Conversation

@tonythethompson

@tonythethompson tonythethompson commented Jul 26, 2026 •

Copy link
Copy Markdown
Owner

Summary

Implements steps 1, 3, and 4 of the Olive Studio 0.2.0 release handoff.

  • Align all license/version surfaces to MIT and 0.2.0 (package.json, README badges/docs, ABOUT, CONTRIBUTING, CLI messaging). LICENSE and UI LicenseNotice were already MIT.
  • Document honest GitHub-first distribution: clone + pnpm install/build/start; remove npx olive-studio claims; state not published to npm.
  • Add CI gates: pnpm build, assert dist/server.cjs + bin/cli.js, production start smoke against http://localhost:3000.

Out of scope (handoff later steps)

Test plan

  • Local pnpm lint (warnings only)
  • Local pnpm build
  • Local production start returned HTTP 200 on :3000
  • CI validate job with new build + smoke steps
  • Confirm no AGPL hits outside CHANGELOG historical notes

Summary by cubic

Aligns Olive Studio to MIT and version 0.2.0, and adds a production CI smoke test to guard releases. Updates docs to reflect GitHub-first distribution (clone + pnpm build/start) and removes npx references.

  • New Features

    • CI now builds with pnpm build, asserts dist/server.cjs and bin/cli.js, then smokes http://localhost:3000.
  • Migration

    • Distributed via GitHub, not npm: clone repo, run pnpm build then pnpm start (or node bin/cli.js).
    • CLI message now directs users to build from a clone if dist/ is missing.

Written for commit 17630c3. Summary will update on new commits.

Review in cubic

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @tonythethompson, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@tonythethompson, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 22 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f8f7f8e6-9394-424a-bb8e-7c12fc5ceb09

📥 Commits

Reviewing files that changed from the base of the PR and between 1657ea2 and 17630c3.

📒 Files selected for processing (6)
  • .github/workflows/ci.yml
  • ABOUT.md
  • CONTRIBUTING.md
  • README.md
  • bin/cli.js
  • package.json
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/0.2.0-handoff
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch release/0.2.0-handoff

Comment @coderabbitai help to get the list of available commands.

@tonythethompson
tonythethompson merged commit 548f4b4 into main Jul 26, 2026
7 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 17630c3d55

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/ci.yml

- name: Production start smoke
run: |
pnpm start &

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Fix the Express 5 catch-all before gating production startup

This new smoke step consistently fails with the locked express@5.2.1: production startup reaches server.ts's app.get("*"), but Express 5 no longer accepts an unnamed wildcard and throws before the server listens. Consequently every validate job waits through the ten failed curls and exits nonzero; update the catch-all to Express 5 syntax (for example /{*splat}) as part of enabling this gate.

Useful? React with 👍 / 👎.

@tonythethompson
tonythethompson deleted the release/0.2.0-handoff branch July 31, 2026 13:12
tonythethompson added a commit that referenced this pull request Aug 4, 2026
CUDA install UX (#12, #13, #16, #17, #18, #19, #21, #22, #25)
- hardwareProbe.mergeDetectedProviders: simplify cudaOk ternary to
  `input.cudaLoadable !== false` — same semantic, half the surface.
- hardwareProbe's pre-Maxwell box reason + recipeHardwareCompatibility's
  CUDA-floor reason now name Maxwell SM 5.0 as 'GeForce GTX 750 Ti or
  GTX 9xx series' instead of mistakenly borrowing 'GeForce RTX 20xx+'
  (RTX 20xx is Turing SM 7.5 — the floor above — which previously
  implied a Pascal SM 6.x owner had an unsupported card).
- recipeHardwareCompatibility widens tensorRtInstallHint to ePInstallHint
  and routes the onnxruntime-gpu install hint through it so the
  probe's detail string (driver/wheel mismatch, missing module, etc.)
  is preserved end-to-end.
- IHVIntegrationPanel gates the CUDA toolkit download-link paragraph
  on `cudaEpInVenv` so it only renders when the EP is actually
  registered — removes the contradictory 'CUDA EP detected / install
  button shown' state.
- InputEnvironmentPanel renders the requiresInstall hint directly so
  the label and the pip-install command can never disagree again (the
  old code branched on `kind` and silently printed the TensorRT label
  next to the onnxruntime install command). Drop the now-dead
  pinnedTensorRtLabel + tensorrtRtxEpAbiLabel imports.
- system.ts hardens the ORT GPU probe with an explicit 30 s timeout
  (a broken driver install can leave the onnxruntime import hanging
  and bind the HTTP request) and derives the pinned-version string from
  pinnedOrtGpuLabel() instead of hardcoding '1.26.0' — a wheel bump in
  oliveGpuRuntime now propagates to every error message and install
  hint without further edits.
- system.ts notes generator now derives its suggested pip command from
  pinnedOrtGpuInstallCommand() instead of a literal 'pip install
  onnxruntime-gpu==1.26.0' string.

Shared install helpers (#23, #24, #26)
- src/server/services/shared/pipInstall.ts is the single NDJSON-aware
  pip install helper used by every install route; the local copies in
  cuda.ts + tensorrt-rtx.ts deleted (kept the exact byte-shape so the
  UIs NDJSON parser keeps working unchanged).
- cuda.ts exports ensureOnnxRuntimeGpu; tensorrt-rtx.ts calls it
  directly instead of carrying a private duplicate (mirror drift was
  the actual bug — they were diverging in subtle ways).
- cuda.ts ensureOnnxRuntimeGpu explicitly returns libsDir: null on
  success so the documented return-type contract is honoured and
  external callers can distinguish "no library directory available"
  from "field not set".
- tensorrt-rtx.ts uses platform-appropriate native-lib extensions:
  onnxruntime_providers_nv_tensorrt_rtx.dll on win32,
  libonnxruntime_providers_nv_tensorrt_rtx.so on Linux, .dylib on
  Darwin (a hardcoded .dll hides the real reason an import fails on
  non-Windows platforms). The probe script picks the right extension
  at runtime.

Manifest / dedupe (#5, #20, #6)
- cudaDeps.cudaDownloadUrlForOs routes darwin to the archive landing
  page (Apple dropped CUDA toolkit support after CUDA 11.6) and uses
  word-boundary regexes so 'darwin' no longer accidentally hits the
  Windows branch via the substring 'win'.
- tensorrtRtxDeps.tensorrtRtxEpAbiInstallCommand now derives the
  manual pip command from the args list (same delegation pattern
  pinnedTensorRtInstallCommand uses), so an index/version bump cannot
  desync the server-side install and the user-facing fallback hint.
- src/server/shared/anyDotVenvDir.ts is the single chokidar
  ANY_DOT_VENV_DIR regex; vite.config.ts and server.ts both import
  from here so a rename/back-up of the venv directory is filtered out
  by both Vite watchlists in lockstep.

Test fixtures (#14, #15)
- cudaDeps.test isPreMaxwellNvidiaBox describe block: split the
  mislabeled 'every card is at or above the floor' assertion into
  two focused tests (every-card-above-floor / every-card-below-floor);
  add a darwin routing suite (asserts darwin does NOT hit the Windows
  branch via substring 'win' and lands on the archive landing page).
- providerCatalog.test cross-family lockstep test title now uses a
  template literal so the floor number interpolates into the test
  name (was a verbatim '$floor' string).

e2e/scroll-bounds-guardrail.spec.ts (#7, #8, #9)
- Page.evaluate wraps Radix Tooltip elements in the full
  Provider/Root/Trigger/Portal/Content hierarchy using
  React.createElement so the elements go through the JSX reconciler
  (plain RdxTooltip.Portal(...) / Content(...) function calls were
  missing Radix's Provider context and the sentinel never mounted).
- DOM-fallback branch preserves the actual import-error string so a
  future failure is filed with the real reason, not a synthetic
  'Radix bare imports did not resolve' placeholder.
- Added paint-time hit-test: document.elementFromPoint at the bbox
  centre must resolve to the sentinel (or one of its ancestors up
  to #root). getClientRects alone cannot detect overflow:hidden
  clipping because clip preserves the rect coordinates; the hit-test
  is the actual guardrail.
- Restrict the lint-disable comment to the placeholder line so the
  prettier/sonar warnings stay clean.

Verified: tsc clean, 734/734 unit tests + 229/229 server tests pass,
pnpm validate:recipe ok, pnpm lint 9 pre-existing warnings / 0 new
errors, live /api/system/hardware-probe?refresh=1 reflects the
updated probe fields.
tonythethompson added a commit that referenced this pull request Aug 4, 2026
* feat: CUDA+TensorRT install UX, lock SM-floor drift, bound scroll overshoot

Provider compat & install
- CUDA gets the same one-click install UX TRT/TRT-RTX already have: dedicated
  /api/env/install-onnxruntime-gpu route pip-installs the pinned 1.26.0 wheel
  into .venv with NDJSON progress, alongside the existing tensorrt / tensorrt-
  rtx routes (src/server/routes/env.ts, src/server/services/olive/cuda.ts).
- IHV panel surfaces the right CTA per state: external link to NVIDIA's CUDA
  Toolkit archive (system-level install), pip button for onnxruntime-gpu, or
  rose terminator for pre-Maxwell GPUs that no install can recover.
- Probe split into 4 user-facing states: no GPU / pre-Maxwell / driver+wheel
  missing / driver+toolkit+EP mismatch — the hidden one-line "NVIDIA CUDA was
  not detected" is gone.

Hardware probe + recipe compat
- Add cudaToolkit? and cuda? fields to HardwareProbeResult, with
  cudaLoadable gate on mergeDetectedProviders so recipe compat and IHV
  panel install button fire in lockstep.
- Pre-Maxwell SM 5.0 short-circuit on CUDA recipes, mirroring the existing
  pre-Turing SM 7.5 short-circuit: never advertise an install on a card that
  cannot run the EP.
- Center the SM floors in cudaDeps.ts and tensorrtRtxDeps so they're the
  single source of truth and importable by tests.

SM-floor drift guards (NEW)
- providerCatalog.ts TRT-RTX chip: chip + tooltip.requirements both cite 7.5
  numerically, name Turing / RTX 20xx, call out Maxwell/Pascal/Kepler.
- providerCatalog.ts full-TensorRT chip: same treatment — previously had no
  numeric anchor, just "Turing or newer (GeForce RTX 20xx+)".
- recipeHardwareCompatibility pre-Turing reason: drift-guard describe block
  imports the constant and asserts it appears in BOTH TRT and TRT-RTX
  reasons; locks the "Turing / RTX 20xx+" tie-in phrase and ensures the
  install hint stays undefined on pre-Turing boxes.
- providerCatalog.test.ts: full sibling describe block for the full-TensorRT
  half of the family, including a cross-family lockstep assertion (both
  halves must contain the same numeric constant).
- Future Bump of TENSORRT_FAMILY_MIN_COMPUTE_CAPABILITY fails CI in 3 test
  files (hardwareProbe / providerCatalog / recipeHardwareCompatibility) and
  forces all 4 user-facing surfaces to update atomically.

Scroll bound + Vite watcher
- App-level, IHV panel, and InputEnvironmentPanel clipped to
  min-h-0 overflow-hidden under a properly bounded scroll container so the
  page can't be scrolled past the end into empty space (CSS-only, no JS).
- e2e/scroll-bounds-guardrail.spec.ts mounts a Radix portal at #root and
  asserts it isn't clipped — guards the next person from re-applying the
  #root overflow lock that would break portals.
- vite.config.ts: ignore .venv*, .venv.bak, .venv.old, .venv-renamed so
  venv tooling (renames, swaps) no longer triggers page reloads.

Tests
- src/lib/cudaDeps.test.ts (18) — SM 5.0 floor lock + pre-Maxwell
  classification + pinned install command.
- src/lib/tensorrtRtxDeps.test.ts — RTF EP-ABI install command shape.
- src/lib/__tests__/providerCatalog.test.ts (16) — SM 7.5 lockstep across
  catalog chip and hardware-probe reason for BOTH halves of the family.
- src/lib/__tests__/recipeHardwareCompatibility.test.ts (23) — full SM-floor
  drift-guard describe block plus install-needed scenarios for CUDA/TRT/
  TRT-RTX on supported and pre-floor hardware.
- src/lib/hardwareProbe.test.ts + tensorrtDeps.test.ts — extended for CUDA
  4-state branching and TRT/TRT-RTX install-hint gating.

Verified
- pnpm exec tsc --noEmit: clean
- pnpm lint: 9 pre-existing warnings, 0 new, 0 errors
- pnpm vitest run --config vitest.config.ts: 731/731 passing
- Live preview at http://127.0.0.1:3000/ verified wiring (cudaToolkit field
  now surfaces on /api/system/hardware-probe).

* fix: Use .venv-scoped CUDA readiness

* fix: Compute scroll position relative to container

* feat: OpenVINO stack install button mirroring TensorRT UX

- Add openvino + optimum-intel[openvino] install via NDJSON /api/env/install-openvino into .venv

- Probe openvino version, Core().available_devices and optimum.intel availability

- Wire requiresInstall/openvinoNeedsInstall badge and install button in IHVIntegrationPanel

- Link to Intel GPU/NPU driver docs when discrete devices are absent

- Update recipe inference and hardwareProbe/pickRecommendedProvider for OpenVINO

- Add unit test for openvino stack install args

* refactor(openvino): split probe script, parse and install logic to reduce complexity

* fix: 2 findings — Unify shared venv install mutex; Rate-limit OpenVINO i

- Unify shared venv install mutex
- Rate-limit OpenVINO installation

* fix: 2 findings — Preserve partial OpenVINO probe results; Parallelize h

- Preserve partial OpenVINO probe results
- Parallelize hardware probe calls

* fix: address Greptile review feedback

- Add optimum.intel import check in recipe inference

- Restrict OpenVINO hardware detection to Intel-branded CPUs

- Surface optimum.intel import errors in probe detail

- Apply heavyCommandRateLimit to all venv install routes

* Update src/server/services/olive/openvino.ts

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Update src/lib/cudaDeps.ts

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* fix: apply CodeRabbit auto-fixes

Fixed 6 file(s) based on 5 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>

* fix: install and verify onnxruntime-openvino for OpenVINO EP

Codex P1: openvino + optimum-intel alone do not register
OpenVINOExecutionProvider. Install onnxruntime-openvino, remove
conflicting ORT wheels with a warning, and gate readiness on the EP.
P2 (shared venv pip mutex) was already unified on this branch.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: address PR #106 review feedback across 23 outstanding threads

CUDA install UX (#12, #13, #16, #17, #18, #19, #21, #22, #25)
- hardwareProbe.mergeDetectedProviders: simplify cudaOk ternary to
  `input.cudaLoadable !== false` — same semantic, half the surface.
- hardwareProbe's pre-Maxwell box reason + recipeHardwareCompatibility's
  CUDA-floor reason now name Maxwell SM 5.0 as 'GeForce GTX 750 Ti or
  GTX 9xx series' instead of mistakenly borrowing 'GeForce RTX 20xx+'
  (RTX 20xx is Turing SM 7.5 — the floor above — which previously
  implied a Pascal SM 6.x owner had an unsupported card).
- recipeHardwareCompatibility widens tensorRtInstallHint to ePInstallHint
  and routes the onnxruntime-gpu install hint through it so the
  probe's detail string (driver/wheel mismatch, missing module, etc.)
  is preserved end-to-end.
- IHVIntegrationPanel gates the CUDA toolkit download-link paragraph
  on `cudaEpInVenv` so it only renders when the EP is actually
  registered — removes the contradictory 'CUDA EP detected / install
  button shown' state.
- InputEnvironmentPanel renders the requiresInstall hint directly so
  the label and the pip-install command can never disagree again (the
  old code branched on `kind` and silently printed the TensorRT label
  next to the onnxruntime install command). Drop the now-dead
  pinnedTensorRtLabel + tensorrtRtxEpAbiLabel imports.
- system.ts hardens the ORT GPU probe with an explicit 30 s timeout
  (a broken driver install can leave the onnxruntime import hanging
  and bind the HTTP request) and derives the pinned-version string from
  pinnedOrtGpuLabel() instead of hardcoding '1.26.0' — a wheel bump in
  oliveGpuRuntime now propagates to every error message and install
  hint without further edits.
- system.ts notes generator now derives its suggested pip command from
  pinnedOrtGpuInstallCommand() instead of a literal 'pip install
  onnxruntime-gpu==1.26.0' string.

Shared install helpers (#23, #24, #26)
- src/server/services/shared/pipInstall.ts is the single NDJSON-aware
  pip install helper used by every install route; the local copies in
  cuda.ts + tensorrt-rtx.ts deleted (kept the exact byte-shape so the
  UIs NDJSON parser keeps working unchanged).
- cuda.ts exports ensureOnnxRuntimeGpu; tensorrt-rtx.ts calls it
  directly instead of carrying a private duplicate (mirror drift was
  the actual bug — they were diverging in subtle ways).
- cuda.ts ensureOnnxRuntimeGpu explicitly returns libsDir: null on
  success so the documented return-type contract is honoured and
  external callers can distinguish "no library directory available"
  from "field not set".
- tensorrt-rtx.ts uses platform-appropriate native-lib extensions:
  onnxruntime_providers_nv_tensorrt_rtx.dll on win32,
  libonnxruntime_providers_nv_tensorrt_rtx.so on Linux, .dylib on
  Darwin (a hardcoded .dll hides the real reason an import fails on
  non-Windows platforms). The probe script picks the right extension
  at runtime.

Manifest / dedupe (#5, #20, #6)
- cudaDeps.cudaDownloadUrlForOs routes darwin to the archive landing
  page (Apple dropped CUDA toolkit support after CUDA 11.6) and uses
  word-boundary regexes so 'darwin' no longer accidentally hits the
  Windows branch via the substring 'win'.
- tensorrtRtxDeps.tensorrtRtxEpAbiInstallCommand now derives the
  manual pip command from the args list (same delegation pattern
  pinnedTensorRtInstallCommand uses), so an index/version bump cannot
  desync the server-side install and the user-facing fallback hint.
- src/server/shared/anyDotVenvDir.ts is the single chokidar
  ANY_DOT_VENV_DIR regex; vite.config.ts and server.ts both import
  from here so a rename/back-up of the venv directory is filtered out
  by both Vite watchlists in lockstep.

Test fixtures (#14, #15)
- cudaDeps.test isPreMaxwellNvidiaBox describe block: split the
  mislabeled 'every card is at or above the floor' assertion into
  two focused tests (every-card-above-floor / every-card-below-floor);
  add a darwin routing suite (asserts darwin does NOT hit the Windows
  branch via substring 'win' and lands on the archive landing page).
- providerCatalog.test cross-family lockstep test title now uses a
  template literal so the floor number interpolates into the test
  name (was a verbatim '$floor' string).

e2e/scroll-bounds-guardrail.spec.ts (#7, #8, #9)
- Page.evaluate wraps Radix Tooltip elements in the full
  Provider/Root/Trigger/Portal/Content hierarchy using
  React.createElement so the elements go through the JSX reconciler
  (plain RdxTooltip.Portal(...) / Content(...) function calls were
  missing Radix's Provider context and the sentinel never mounted).
- DOM-fallback branch preserves the actual import-error string so a
  future failure is filed with the real reason, not a synthetic
  'Radix bare imports did not resolve' placeholder.
- Added paint-time hit-test: document.elementFromPoint at the bbox
  centre must resolve to the sentinel (or one of its ancestors up
  to #root). getClientRects alone cannot detect overflow:hidden
  clipping because clip preserves the rect coordinates; the hit-test
  is the actual guardrail.
- Restrict the lint-disable comment to the placeholder line so the
  prettier/sonar warnings stay clean.

Verified: tsc clean, 734/734 unit tests + 229/229 server tests pass,
pnpm validate:recipe ok, pnpm lint 9 pre-existing warnings / 0 new
errors, live /api/system/hardware-probe?refresh=1 reflects the
updated probe fields.

* fix: add missing useOpenVinoInstall hook for CI typecheck

CodeRabbit's auto-fix imported @/components/features/useOpenVinoInstall
but never added the module, so pnpm lint (tsc) failed with TS2307.

Co-authored-by: Anthony Thompson <github@trackdub.com>

* fix: address follow-up review on tensorrt.ts pipInstall, install mutex, state-4 test

- tensorrt.ts: extract private pipInstall to ../shared/pipInstall.ts;
  local spawn-based copy removed, all 4 install call-sites now route
  through the shared helper so cuda/tensorrt/tensorrt-rtx agree on
  error contract and the '[deps]' output prefix.
- IHVIntegrationPanel.tsx: replace installingTrt | installingTrtRtx |
  installingOrtGpu trio of mutex flags with a single installInProgress
  derived from all three. The three handler guards, setInstalling(true)
  cleanup, and React Button disabled props all use the unified flag so a
  concurrent pip install can no longer race the shared .venv.
- hardwareProbe.test.ts: state-4 fixture now passes cuda.loadable:true
  so the install-hint branch (state 3) is bypassed and the cascade
  reaches the state-4 driver/wheel mismatch reason. Without cuda.loadable
  the fixture was exercising state 3 instead of state 4, so the assertion
  originally committed failed to validate the intended branch.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>

* Update src/components/features/IHVIntegrationPanel.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix: extract HardwareProviderCard to clear CodeFactor complexity

Move the provider-card map (Very Complex Method) out of
IHVIntegrationPanel into a dedicated component with chrome helpers
and install/conflict subcomponents so CodeFactor can pass on PR 108.

Co-authored-by: Anthony Thompson <github@trackdub.com>

* fix: address CodeRabbit OpenVINO review findings

Share NDJSON install helper with residual-frame flush, add hook tests,
require --upgrade with eager strategy, tighten Intel hardware detection
via computeOpenVinoCompatibleHardware + lspci/Win32 probe, and gate ORT
wheel uninstall with install-failure recovery messaging.

Co-authored-by: Anthony Thompson <github@trackdub.com>

---------

Co-authored-by: qodo-code-review[bot] <151058649+qodo-code-review[bot]@users.noreply.github.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Codebuff <noreply@codebuff.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant