Skip to content

feat(desktop): wire v2 terminal to user theme/font settings + addon parity - #3155

Merged
Kitenite merged 7 commits into
mainfrom
graceful-truffle
Apr 3, 2026
Merged

Kitenite merged 7 commits into
mainfrom
graceful-truffle

Conversation

@Kitenite

@Kitenite Kitenite commented Apr 3, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Introduces a shared TerminalAppearance contract (appearance/index.ts) with type, defaults (JetBrains Mono primary), and localStorage-cached theme for flash-free first paint
  • Adds useTerminalAppearance hook that reads the theme store + font settings from local DB, returning a memoized appearance object
  • Refactors terminal-runtime-registry to defer runtime creation until first attach() (no eager xterm instance before appearance is known) and adds updateAppearance() for live updates
  • terminal-runtime now accepts TerminalAppearance at creation and exposes updateRuntimeAppearance for in-place theme/font changes without remounting
  • Extracts addon loading into terminal-addons.ts — loads Clipboard, Unicode11, Image, Ligatures sync after open(), defers WebGL to rAF with global failure tracking (VS Code pattern)
  • Brings v2 xterm options to parity with v1: scrollback, allowProposedApi, cursorStyle, hidden scrollbar, etc.
  • TerminalPane wires appearance into attach (via ref to avoid re-mount) and pushes live updates via a separate effect; container background driven by appearance.background

Test plan

  • Open a v2 workspace terminal — should use user-selected theme and font
  • Change theme in settings — existing v2 terminals update colors without remount
  • Change terminal font family/size in settings — terminals update and re-fit layout
  • Block characters (e.g. Claude Code banner ▐▛███▜▌) render without line gaps (WebGL renderer)
  • Terminal survives WebGL context loss (falls back to DOM renderer)
  • v1 terminals unaffected

Summary by cubic

Wired the v2 terminal to user theme and font settings with live updates, matching v1. Improves first paint and stability by caching theme, deferring runtime/addons, and using WebGL with a safe DOM fallback.

  • New Features
    • Shared TerminalAppearance with defaults and a localStorage-cached terminal theme for flash-free first paint; useTerminalAppearance reads theme and font from settings.
    • Registry creates the runtime on first attach() and adds updateAppearance() for live theme/font updates; applies appearance on reattach and forwards PTY resize when cols/rows change.
    • Runtime accepts TerminalAppearance, exposes updateRuntimeAppearance, and reaches @xterm/xterm option parity (DEFAULT_TERMINAL_SCROLLBACK, allowProposedApi, cursor styles, hidden scrollbar).
    • Addon loader installs Clipboard, Unicode11, Image, and Ligatures after open(); defers @xterm/addon-webgl via rAF with global failure tracking and context-loss fallback.
    • TerminalPane passes appearance into attach() and pushes updates without remounts; container background uses appearance.background.
    • Adds small padding to the v2 terminal pane for consistent spacing.

Written for commit 1d048e3. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Centralized terminal appearance with shared defaults for font family/size and theme; new hook exposes appearance to UI.
  • Improvements

    • Appearance updates apply immediately without restart or reattach; preserves look across sessions for flash-free initial paint.
    • Safer, more resilient addon handling (clipboard, images, Unicode, ligatures when available) with robust WebGL fallback and cleanup.
  • Documentation

    • Expanded comment guidelines to preserve design intent.

@coderabbitai

coderabbitai Bot commented Apr 3, 2026 •

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 379c8ab3-9b78-4f12-85c1-258a0c19e1d1

📥 Commits

Reviewing files that changed from the base of the PR and between d321b22 and 1d048e3.

📒 Files selected for processing (1)
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/TerminalPane.tsx

📝 Walkthrough

Walkthrough

Adds a shared terminal appearance module and hook, introduces an addon loader, refactors runtime creation to accept and update appearance, updates the runtime registry and runtime implementation to support dynamic appearance changes and addon lifecycle, and wires these into the TerminalPane UI.

Changes

Cohort / File(s) Summary
Appearance module
apps/desktop/src/renderer/lib/terminal/appearance/index.ts
New public API: TerminalAppearance interface, DEFAULT_TERMINAL_FONT_FAMILIES, DEFAULT_TERMINAL_FONT_FAMILY, DEFAULT_TERMINAL_FONT_SIZE, and getDefaultTerminalAppearance() with localStorage-backed theme cache, conversion, and fallbacks.
Addon loader
apps/desktop/src/renderer/lib/terminal/terminal-addons.ts
New loadAddons(terminal: XTerm): () => void to initialize clipboard, unicode, image, ligatures (safe), and deferred WebGL addon with lifecycle, context-loss handling, and cleanup.
Runtime registry
apps/desktop/src/renderer/lib/terminal/terminal-runtime-registry.ts
Entries make runtime nullable; attach(...) now accepts TerminalAppearance, defers runtime creation until attach, renames helper to getOrCreateEntry, adds updateAppearance(), tightens detach/dispose behavior, and updates state-change listener wiring.
Runtime implementation
apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
createRuntime now requires appearance; terminals are configured from appearance; _disposeAddons added and used; loadAddons invoked during creation; new updateRuntimeAppearance() updates theme/font and conditionally refits; disposeRuntime disposes addons.
TerminalPane integration
.../TerminalPane/TerminalPane.tsx
Uses useTerminalAppearance() and appearanceRef; passes appearance to attach(...), calls updateAppearance() on changes, applies dynamic style.backgroundColor, and adds padding.
Appearance hook
.../hooks/useTerminalAppearance/index.ts, .../useTerminalAppearance.ts
New useTerminalAppearance() hook returning memoized TerminalAppearance composed from useTerminalTheme() and font settings query; index barrel export added.
Config sync
apps/desktop/src/renderer/screens/.../Terminal/config.ts
Replaced local default font constants with shared SHARED_DEFAULT_TERMINAL_FONT_FAMILY and SHARED_DEFAULT_TERMINAL_FONT_SIZE from the appearance module.
Docs / minor
.agents/commands/deslop.md
Expanded comment-guideline rules (documentation-only).

Sequence Diagram

sequenceDiagram
    participant TerminalPane
    participant useTerminalAppearance
    participant TerminalRegistry
    participant TerminalRuntime
    participant XTerm
    participant Addons

    TerminalPane->>useTerminalAppearance: request appearance
    useTerminalAppearance-->>TerminalPane: TerminalAppearance

    TerminalPane->>TerminalRegistry: attach(terminalId, container, wsUrl, appearance)
    TerminalRegistry->>TerminalRuntime: createRuntime(terminalId, appearance)
    TerminalRuntime->>XTerm: createTerminal(appearance)
    TerminalRuntime->>Addons: loadAddons(terminal)
    Addons-->>TerminalRuntime: cleanupDisposer
    TerminalRuntime-->>TerminalRegistry: runtime ready
    TerminalRegistry-->>TerminalPane: attached

    rect rgba(100,150,200,0.5)
    TerminalPane->>TerminalRegistry: updateAppearance(terminalId, appearance)
    TerminalRegistry->>TerminalRuntime: updateRuntimeAppearance(runtime, appearance)
    TerminalRuntime->>XTerm: update theme & font options
    end

    TerminalPane->>TerminalRegistry: detach/dispose
    TerminalRegistry->>TerminalRuntime: disposeRuntime(runtime)
    TerminalRuntime->>Addons: cleanupDisposer()
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰
I hopped through fonts and theme-filled skies,
Cached colors snug for faster first eyes.
Addons tucked in, WebGL waits its turn,
Fonts and themes update as terminals burn.
A joyful thump — the terminals purr!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 15.38% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main objective: wiring v2 terminal to user theme/font settings with addon feature parity.
Description check ✅ Passed The PR description is comprehensive and well-structured with a summary, detailed explanation, and test plan. However, it does not follow the provided template sections (Type of Change, Related Issues, Screenshots).

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch graceful-truffle

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@cubic-dev-ai cubic-dev-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.

2 issues found across 8 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="apps/desktop/src/renderer/lib/terminal/terminal-addons.ts">

<violation number="1" location="apps/desktop/src/renderer/lib/terminal/terminal-addons.ts:39">
P2: Avoid empty catch blocks here; log a warning with the error so unexpected addon load failures aren’t silently hidden.

(Based on your team's feedback about avoiding empty catch blocks that hide failures.) [FEEDBACK_USED]</violation>
</file>

<file name="apps/desktop/src/renderer/lib/terminal/appearance/index.ts">

<violation number="1" location="apps/desktop/src/renderer/lib/terminal/appearance/index.ts:63">
P2: Avoid empty catch blocks here; log a warning with context so cached theme failures don’t disappear silently.

(Based on your team's feedback about avoiding empty catch blocks that hide failures.) [FEEDBACK_USED]</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

@greptile-apps

greptile-apps Bot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR wires v2 workspace terminals to the existing user-configured theme and font settings, achieving parity with v1 terminals without importing v1 component logic. It introduces a shared TerminalAppearance value object, a useTerminalAppearance hook that composes the Zustand theme store with a tRPC font-settings query, and a two-effect pattern in TerminalPane that keeps attach/detach stable while pushing live appearance updates independently.

Key changes and observations:

  • appearance/index.ts: Clean localStorage-cache fallback for flash-free first paint; well-isolated with correct try/catch guards.
  • terminal-addons.ts: Sync/deferred addon split (VS Code pattern) is well-structured. Module-level suggestedRendererType correctly prevents repeated WebGL attempts after GPU init failure, but context-loss events don't propagate this flag globally — worth deciding whether that is intentional.
  • terminal-runtime-registry.ts: Lazy runtime creation (null until first attach()) is a good fix for the eager-xterm-before-appearance problem. updateAppearance() correctly no-ops when the runtime hasn't been created yet.
  • terminal-runtime.ts: updateRuntimeAppearance correctly detects font changes before calling fitAddon.fit(), avoiding spurious reflows. _disposeAddons on the public TerminalRuntime interface is an internal detail that could be better encapsulated.
  • useTerminalAppearance: The staleTime: 30_000 on getFontSettings is a potential gap — live font-change updates depend on the settings mutation invalidating this query. If that invalidation exists elsewhere in the app, this is fine; if not, font changes could be delayed up to 30 seconds.

Confidence Score: 4/5

  • Safe to merge; all three comments are P2 style suggestions with no blocking logic bugs.
  • The architecture is sound and well-commented. The two-effect ref pattern in TerminalPane is correct, the lazy runtime creation is a clean improvement, and the addon loading follows established VS Code patterns. The only items worth verifying before merge are: (1) whether the settings mutation invalidates the getFontSettings cache so the 30s stale time doesn't break live font updates, and (2) the intentionality of not propagating suggestedRendererType = "dom" on context loss. Neither is a critical runtime error.
  • useTerminalAppearance.ts — verify the settings mutation invalidates the getFontSettings query; terminal-addons.ts — confirm context-loss WebGL retry behavior is intentional.

Important Files Changed

Filename Overview
apps/desktop/src/renderer/lib/terminal/appearance/index.ts New shared TerminalAppearance contract with localStorage-backed default theme for flash-free first paint; well-isolated and fallback-safe.
apps/desktop/src/renderer/lib/terminal/terminal-addons.ts Extracts addon loading with sync/deferred split and module-level WebGL failure tracking; onContextLoss doesn't set suggestedRendererType to "dom", which is an acceptable VS Code-aligned choice.
apps/desktop/src/renderer/lib/terminal/terminal-runtime-registry.ts Defers runtime creation to first attach; adds updateAppearance; attach() silently ignores appearance for already-created runtimes (covered by the separate updateAppearance effect in the component).
apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts Adds appearance injection at creation, _disposeAddons cleanup, and updateRuntimeAppearance with correct font-change detection and conditional fit; disposeRuntime correctly chains addon cleanup.
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/TerminalPane.tsx Two-effect design (stable attach + live appearance update via ref) is correct; background driven by appearance.background; no unnecessary remounts.
apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/hooks/useTerminalAppearance/useTerminalAppearance.ts Hook composes terminal theme store + tRPC font settings into a memoized TerminalAppearance; staleTime: 30_000 on font settings may delay live font updates if the settings mutation doesn't invalidate the cache.

Sequence Diagram

sequenceDiagram
    participant TP as TerminalPane
    participant UA as useTerminalAppearance
    participant RR as TerminalRuntimeRegistry
    participant RT as terminal-runtime
    participant AD as terminal-addons

    TP->>UA: useTerminalAppearance()
    UA->>UA: useTerminalTheme() + getFontSettings (staleTime 30s)
    UA-->>TP: memoized TerminalAppearance

    Note over TP: Effect 1 — attach (deps: terminalId, wsUrl)
    TP->>RR: attach(terminalId, container, wsUrl, appearanceRef.current)
    RR->>RT: createRuntime(terminalId, appearance)
    RT->>AD: loadAddons(terminal)
    AD->>AD: ClipboardAddon, Unicode11Addon, ImageAddon, LigaturesAddon (sync)
    AD-->>AD: WebglAddon via rAF (deferred)
    RT-->>RR: TerminalRuntime
    RR->>RT: attachToContainer(runtime, container)
    RT-->>TP: terminal visible + focused

    Note over TP: Effect 2 — appearance (deps: terminalId, appearance)
    TP->>RR: updateAppearance(terminalId, appearance)
    RR->>RT: updateRuntimeAppearance(runtime, appearance)
    RT->>RT: terminal.options.theme = appearance.theme
    RT->>RT: font changed? → fitAddon.fit() if visible

    Note over TP: On theme/font settings change
    UA-->>TP: new TerminalAppearance (memo busted)
    TP->>RR: updateAppearance(terminalId, newAppearance)
    RR->>RT: updateRuntimeAppearance(runtime, newAppearance)
Loading

Reviews (1): Last reviewed commit: "Deslop" | Re-trigger Greptile

@coderabbitai coderabbitai 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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts (1)

40-53: ⚠️ Potential issue | 🟠 Major

Remove invalid scrollbar option—not supported in xterm.js 5.x.

The option scrollbar: { showScrollbar: false } does not exist in xterm.js 5.x ITerminalOptions and will not hide the scrollbar. Use scrollback: 0 to disable scrolling (which removes the scrollbar), or hide it via CSS: .xterm-viewport::-webkit-scrollbar { display: none; }.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts` around lines 40 -
53, The XTerm constructor in terminal-runtime.ts is passing an invalid option
`scrollbar: { showScrollbar: false }` (xterm.js 5.x ITerminalOptions doesn't
support `scrollbar`); remove that option from the XTerm(...) call (look for the
`terminal = new XTerm({...})` instantiation) and instead disable scrolling via
`scrollback: 0` or hide the scrollbar with CSS (e.g., target
`.xterm-viewport::-webkit-scrollbar { display: none; }`) while preserving
existing options like `cols`, `rows`, `cursorBlink`, `fontFamily`, `fontSize`,
`theme`, `allowProposedApi`, `cursorStyle`, and `cursorInactiveStyle`.
🧹 Nitpick comments (1)
apps/desktop/src/renderer/lib/terminal/appearance/index.ts (1)

39-39: Hardcoded fallback background duplicated.

The fallback background "#151110" appears both here (line 39) and in useTerminalAppearance.ts (line 31). Consider exporting a constant from this module to avoid drift.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/desktop/src/renderer/lib/terminal/appearance/index.ts` at line 39, The
hardcoded fallback color "#151110" is duplicated; export a single constant (e.g.
DEFAULT_TERMINAL_BACKGROUND) from this appearance module and use it wherever the
fallback is needed. Change the object here to use background: theme.background
?? DEFAULT_TERMINAL_BACKGROUND, export DEFAULT_TERMINAL_BACKGROUND from this
file, and update useTerminalAppearance.ts to import and use that constant
instead of repeating the literal.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts`:
- Around line 40-53: The XTerm constructor in terminal-runtime.ts is passing an
invalid option `scrollbar: { showScrollbar: false }` (xterm.js 5.x
ITerminalOptions doesn't support `scrollbar`); remove that option from the
XTerm(...) call (look for the `terminal = new XTerm({...})` instantiation) and
instead disable scrolling via `scrollback: 0` or hide the scrollbar with CSS
(e.g., target `.xterm-viewport::-webkit-scrollbar { display: none; }`) while
preserving existing options like `cols`, `rows`, `cursorBlink`, `fontFamily`,
`fontSize`, `theme`, `allowProposedApi`, `cursorStyle`, and
`cursorInactiveStyle`.

---

Nitpick comments:
In `@apps/desktop/src/renderer/lib/terminal/appearance/index.ts`:
- Line 39: The hardcoded fallback color "#151110" is duplicated; export a single
constant (e.g. DEFAULT_TERMINAL_BACKGROUND) from this appearance module and use
it wherever the fallback is needed. Change the object here to use background:
theme.background ?? DEFAULT_TERMINAL_BACKGROUND, export
DEFAULT_TERMINAL_BACKGROUND from this file, and update useTerminalAppearance.ts
to import and use that constant instead of repeating the literal.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: dfdea033-f05c-4213-b12b-345250f84297

📥 Commits

Reviewing files that changed from the base of the PR and between c7508e5 and d957f63.

📒 Files selected for processing (7)
  • apps/desktop/src/renderer/lib/terminal/appearance/index.ts
  • apps/desktop/src/renderer/lib/terminal/terminal-addons.ts
  • apps/desktop/src/renderer/lib/terminal/terminal-runtime-registry.ts
  • apps/desktop/src/renderer/lib/terminal/terminal-runtime.ts
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/TerminalPane.tsx
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/hooks/useTerminalAppearance/index.ts
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/hooks/useTerminalAppearance/useTerminalAppearance.ts

@github-actions

github-actions Bot commented Apr 3, 2026 •

Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ✅ Neon database branch
  • ✅ Electric Fly.io app

Thank you for your contribution! 🎉

@Kitenite
Kitenite merged commit 2b91f11 into main Apr 3, 2026
15 checks passed
@Kitenite
Kitenite deleted the graceful-truffle branch April 3, 2026 20:28
/** Fallback grid size used when the host is not visible. */
lastCols: number;
lastRows: number;
_disposeAddons: (() => void) | null;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

nit: can be removed

}, [terminalId, websocketUrl]);

useEffect(() => {
terminalRuntimeRegistry.updateAppearance(terminalId, appearance);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

this should probably just be managed by whatever is doing the lifecycle of terminals - most of the other logic for the lifecycle of terminals is colocated so it might be a better fit

MocA-Love pushed a commit to MocA-Love/superset that referenced this pull request Apr 5, 2026
…arity (ParadevAI#3155)

* add appearance setup

* Terminal addons

* Lint

* Remove done plan

* Deslop

* Deslop

* p-2
MocA-Love added a commit to MocA-Love/superset that referenced this pull request Apr 5, 2026
cherry-pick方式で内容を取り込み済みの14コミットをgit履歴上もマージ済みにする。

取り込み済み (cherry-pick / 手動移植):
- be22b46 ParadevAI#3125 — スキップ (下記参照)
- 88bc7fb ParadevAI#3127 — Revert DA1 ✓
- 92d0ff9 ParadevAI#3054 — DA1 fix ✓
- c48450e ParadevAI#3093 — file viewer pane fix ✓
- fffa8db ParadevAI#3128 — version 1.4.7 ✓
- 589a7c7 ParadevAI#3136 — fuzzy scorer (ハイブリッド方式) ✓
- ceb8c81 ParadevAI#3150 — Electron 40.8.5 ✓
- 8922b94 ParadevAI#3137 — terminalId分離 ✓
- c7508e5 ParadevAI#3152 — GitHub無料化 ✓
- 2b91f11 ParadevAI#3155 — v2 terminal theme ✓
- b8b11af ParadevAI#3154 — TUI dimension fix ✓
- 7599ace ParadevAI#3149 — v2 sidebar file tree (手動統合) ✓
- 4d7c612 ParadevAI#3174 — DnD重複削除 ✓
- 864977d ParadevAI#3157 — Host Service分離 ✓

意図的にスキップ:
- be22b46 ParadevAI#3125 (GitHub polling簡素化)
  フォーク独自のGitHubSyncService (バックエンド集中ポーリング) と
  設計が異なるため不採用。upstreamはフロントエンドhover駆動、フォークは
  バックエンドキャッシュウォーマー方式。詳細は githubQueryPolicy.ts と
  github-sync-service.ts のFORK NOTEを参照。

ゴースト・マージ復元 (revert 134cfd5 で消失した内容):
- 538f306 ParadevAI#3120 — Patch vuln ✓
- 1588d20 ParadevAI#3108 — terminal lifecycle分離 ✓
- 59426f6 ParadevAI#3122 — file tree + FilePane + Alert refactor (手動統合) ✓
- 10d9a5d ParadevAI#3097 — tiptap line-height ✓
- 337a9ae ParadevAI#3121 — Codex hooks削除 ✓

This branch was previously deployed

1 inactive deployment
preview — 1d048e35 Deployed Apr 3, 2026 by Kitenite via Deploy Docs #3560
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.

2 participants