Skip to content

Conversation

@tomasz-stefaniak
Copy link
Contributor

@tomasz-stefaniak tomasz-stefaniak commented Oct 15, 2025

Description

Build a takeover MVP

AI Code Review

  • Team members only: AI review runs automatically when PR is opened or marked ready for review
  • Team members can also trigger a review by commenting @continue-review

Checklist

  • [] I've read the contributing guide
  • [] The relevant docs, if any, have been updated or created
  • [] The relevant tests, if any, have been updated or created

Screen recording or screenshot

[ When applicable, please include a short screen recording or screenshot - this makes it much easier for us as contributors to review and understand your changes. See this PR as a good example. ]

Tests

[ What tests were added or updated to ensure the changes work as expected? ]


Summary by cubic

Add Background mode that lets users create long‑running background agents from chat, see recent tasks, and take over an agent locally by switching to its branch and loading its session. Also updates org-scoped hub links and adds IDE/webview protocol support.

  • New Features

    • Background mode in ModeSelect (disabled for local profiles); MessageModes includes "background" and keyboard cycling updated.
    • Create background agent from chat input: includes context items and selected code, auto‑detects repo URL/branch, supports org scoping, and passes current cloud agent slug.
    • Agents list UI: shows recent tasks with status, repo, and time; links to hub; “Open locally” when repo matches an open workspace.
    • Local takeover flow (VS Code): stashes local changes, checks out/fetches the agent’s branch (with fallbacks), then loads the agent session via new loadAgentSession event.
    • Control plane client: createBackgroundAgent, listBackgroundAgents (org/limit), getAgentSession, getAgentState.
    • Protocol: add createBackgroundAgent, listBackgroundAgents, openAgentLocally; webview receives loadAgentSession.
    • Routing: core openUrl builds organizations/:orgSlug/... paths when org is provided.
  • Migration

    • Requires Continue sign‑in and GitHub integration for repo access (opens hub integrations page on auth errors).
    • No config changes; Background mode is hidden when a local profile is selected.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

3 issues found across 12 files

Prompt for AI agents (all 3 issues)

Understand the root cause of the following 3 issues and fix them.


<file name="gui/src/components/BackgroundMode/BackgroundModeView.tsx">

<violation number="1" location="gui/src/components/BackgroundMode/BackgroundModeView.tsx:58">
`listBackgroundAgents` is invoked without the current organization, so in an org without GitHub integration this check silently succeeds and the GitHub setup prompt never appears. Please pass the active org ID (as in AgentsList) so the API can surface the auth error.</violation>

<violation number="2" location="gui/src/components/BackgroundMode/BackgroundModeView.tsx:87">
Include `currentOrg` in this effect’s dependency array; otherwise switching orgs leaves the GitHub warning stale (the check never re-runs for the new org).</violation>
</file>

<file name="gui/src/components/BackgroundMode/AgentsList.tsx">

<violation number="1" location="gui/src/components/BackgroundMode/AgentsList.tsx:37">
SSH-formatted repo URLs (e.g. ssh://git@github.com/owner/repo.git) are rewritten to https://github.com/ssh://…, so background agents created with SSH remotes never match the open workspace and the “Open locally” action stays disabled.</violation>
</file>

React with 👍 or 👎 to teach cubic. Mention @cubic-dev-ai to give feedback, ask questions, or re-run the review.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

No issues found across 1 file

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

No issues found across 1 file

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

No issues found across 2 files

@tomasz-stefaniak tomasz-stefaniak marked this pull request as ready for review October 16, 2025 18:36
@tomasz-stefaniak tomasz-stefaniak requested a review from a team as a code owner October 16, 2025 18:36
@tomasz-stefaniak tomasz-stefaniak requested review from tingwai and removed request for a team October 16, 2025 18:36
@github-actions
Copy link

⚠️ PR Title Format

Your PR title doesn't follow the conventional commit format, but this won't block your PR from being merged. We recommend using this format for better project organization.

Expected Format:

<type>[optional scope]: <description>

Examples:

  • feat: add changelog generation support
  • fix: resolve login redirect issue
  • docs: update README with new instructions
  • chore: update dependencies

Valid Types:

feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert

This helps with:

  • 📝 Automatic changelog generation
  • 🚀 Automated semantic versioning
  • 📊 Better project history tracking

This is a non-blocking warning - your PR can still be merged without fixing this.

@tomasz-stefaniak tomasz-stefaniak changed the title Tomasz/con 4212 Build a local takeover MVP Oct 16, 2025
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Oct 16, 2025
@github-actions
Copy link

github-actions bot commented Oct 16, 2025

✅ Review Complete

This is a review request for a PR that builds a local takeover MVP for background agents. Let me analyze the code changes:

Code Review for PR #8270: Build a local takeover MVP

Critical Issues

1. Security: Missing Input Validation (Lines 270-290 in VsCodeMessenger.ts)

const prompt = stripImages(content);

if (!prompt || prompt.trim().length === 0) {
  vscode.window.showErrorMessage(...);
  return;
}

The selectedCode and contextItems arrays are passed directly to the API without validation. Malicious context items could contain executable code or injection attacks.

Suggestion: Validate and sanitize these inputs:

// Validate contextItems
const sanitizedContextItems = contextItems?.map(item => ({
  content: sanitizeString(item.content),
  description: sanitizeString(item.description),
  name: sanitizeString(item.name),
  uri: sanitizeString(item.uri)
})) || [];

2. Race Condition: Branch Checkout (Lines 305-360 in VsCodeMessenger.ts)

await repo.checkout(branch);

If another VS Code window has the same repo open, git operations can conflict. No locking mechanism prevents concurrent modifications.

Suggestion: Add a workspace-level lock or warn users about multiple windows.

3. Error Handling: Silent Failures (Lines 445-470 in client.ts)

public async listBackgroundAgents(...): Promise<...> {
  if (!(await this.isSignedIn())) {
    return { agents: [], totalCount: 0 };  // Silent failure
  }

Returns empty arrays instead of throwing errors, making it impossible for callers to distinguish between "no agents" vs "API failed".

Suggestion: Return a result type with error information:

return { agents: [], totalCount: 0, error: "Not signed in" };

Security Vulnerabilities

4. Unvalidated Repository URLs (Lines 286-308 in VsCodeMessenger.ts)
The code constructs GitHub URLs from repoName without validation:

if (repoName.includes("/") && !repoName.startsWith("http")) {
  repoUrl = `https://github.com/${repoName}`;
}

This could allow injection if repoName contains malicious strings like ../../evil or special characters.

Suggestion: Use URL validation library or regex to ensure format is correct.

5. Stash Command Injection Risk (Line 295 in VsCodeMessenger.ts)

await this.ide.subprocess(
  `git stash push -m "Continue: Stashed before opening agent ${agentSessionId}"`,
  workspacePath,
);

If agentSessionId contains shell metacharacters like ; rm -rf /, this could execute arbitrary commands.

Suggestion: Use parameterized command execution or escape the ID:

const escapedId = agentSessionId.replace(/[^a-zA-Z0-9-]/g, '');

Functionality Issues

6. Missing Error Recovery: Checkout Failure (Lines 315-355 in VsCodeMessenger.ts)
After fetching and checking out fails, the code returns but doesn't restore the previous branch. Users could be left in an inconsistent state.

Suggestion: Add rollback logic:

const originalBranch = await this.ide.getBranch(matchingWorkspace);
try {
  await repo.checkout(branch);
} catch (e) {
  await repo.checkout(originalBranch); // Restore original state
  throw e;
}

7. Incomplete URL Normalization (Lines 172-210 in VsCodeMessenger.ts)
The normalizeRepoUrl function handles GitHub but not GitLab, Bitbucket, or self-hosted Git servers. This will cause false negatives when matching repos.

Suggestion: Add support for other common Git hosts or make normalization more generic.

8. Missing Null Check (Line 367 in VsCodeMessenger.ts)

if (!agentState.session) {
  console.error("Agent state is missing session field...");
  return;
}

But agentState itself could be null due to the return type of getAgentState. Need to check agentState first.

Performance Issues

9. Polling Without Backoff (Lines 136-143 in AgentsList.tsx)

const interval = setInterval(() => {
  void fetchAgents();
}, 10000);

Polling every 10 seconds regardless of server load or errors. This could overwhelm the API or drain resources.

Suggestion: Add exponential backoff on errors and consider WebSocket for real-time updates.

10. Redundant Workspace Fetching (Lines 70-95 in AgentsList.tsx)
fetchWorkspaceRepos() runs on every component mount, even though workspace rarely changes. Could cache this.

Missing Tests

11. No Tests for Critical Flows
The PR adds complex logic for:

  • Branch checkout with stashing
  • Agent creation with context items
  • Repository URL normalization

None of these have unit tests. This is risky for mission-critical functionality.

Suggestion: Add tests for:

  • normalizeRepoUrl with various input formats
  • Agent creation error handling
  • Stash/checkout recovery scenarios

Documentation Issues

12. Missing API Documentation (Lines 448-503 in client.ts)
The new API methods have minimal JSDoc. Especially unclear:

  • What format should contextItems be in?
  • Is agent the slug or the full config?
  • What errors can be thrown?

Suggestion: Expand JSDoc with examples and error cases.

Minor Issues

13. Inconsistent Error Logging (Line 432 in client.ts)
Some methods use Logger.error while others use console.error. Should be consistent.

14. Magic Numbers (Line 334 in VsCodeMessenger.ts)
prompt.substring(0, 50) - why 50? Define as a constant.

15. Unused Variable (Line 69 in VsCodeMessenger.ts)
// debugger; - commented code should be removed.

Overall Assessment

The feature implementation is ambitious and well-structured, but has significant security and reliability issues that must be addressed before merging. The main concerns are:

  1. Input validation and injection risks - Multiple places where user/API input is used unsafely
  2. Error handling - Silent failures and incomplete recovery logic
  3. Missing tests - Complex flows without test coverage
  4. Race conditions - Git operations could conflict with concurrent usage

Recommendation: Request changes to address security issues (#1, #4, #5) and critical error handling (#3, #6, #8) before merging.


Copy link

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

Choose a reason for hiding this comment

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

💡 Codex Review

const isInAgentMode = getState().session.mode === "agent";
// Process context item attributes
for (const item of deduplicatedInputs) {
const result = await ideMessenger.request("context/getContextItems", {
name: item.provider,
query: item.query ?? "",
fullInput: stripImages(parts),
selectedCode,
isInAgentMode,
});
if (result.status === "success") {
contextItems.push(...result.content);
}
}
// cmd+enter to use codebase
if (
modifiers.useCodebase &&
!deduplicatedInputs.some((item) => item.provider === "codebase")
) {
const result = await ideMessenger.request("context/getContextItems", {
name: "codebase",
query: "",
fullInput: stripImages(parts),
selectedCode,
isInAgentMode,
});

P1 Badge Treat background mode as agent when gathering context

When background mode is triggered, Chat.sendInput still calls resolveEditorContent to collect selected code and context before the agent is created. Inside resolveEditorContent the isInAgentMode flag is only set when state.session.mode === "agent", so background submissions are treated like plain chat (isInAgentMode is false). Any context providers that rely on this flag (e.g. codebase retrieval) won’t run in background mode, meaning the newly created background agents receive no context items or selected code despite the feature description saying they should. Consider treating "background" the same as "agent" here so background agents start with the same context as agent mode.

ℹ️ 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

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

2 issues found across 12 files

Prompt for AI agents (all 2 issues)

Understand the root cause of the following 2 issues and fix them.


<file name="extensions/vscode/src/extension/VsCodeMessenger.ts">

<violation number="1" location="extensions/vscode/src/extension/VsCodeMessenger.ts:300">
SSH remotes are converted to invalid GitHub URLs (`https://github.com/git@github.com:owner/repo`), so creating a background agent fails for the common SSH setup.</violation>
</file>

<file name="gui/src/components/BackgroundMode/AgentsList.tsx">

<violation number="1" location="gui/src/components/BackgroundMode/AgentsList.tsx:241">
If createdAt is absent or invalid, formatRelativeTime returns &quot;NaNd ago&quot; because Math.floor(NaN) propagates through the template; add an explicit NaN guard so we fall back to the raw date string instead of showing garbage.</violation>
</file>

React with 👍 or 👎 to teach cubic. Mention @cubic-dev-ai to give feedback, ask questions, or re-run the review.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

Reviewed changes from recent commits (found 1 issue).

1 issue found across 3 files

Prompt for AI agents (all 1 issues)

Understand the root cause of the following 1 issues and fix them.


<file name="core/util/repoUrl.ts">

<violation number="1" location="core/util/repoUrl.ts:52">
Checking `normalized.includes(&quot;://&quot;)` treats any query/fragment containing `://` as a fully qualified URL, so shorthand repo strings like `owner/repo?redirect=https://example.com` are no longer normalized to the canonical GitHub URL. Please detect schemes only when they appear at the start of the string.</violation>
</file>

React with 👍 or 👎 to teach cubic. Mention @cubic-dev-ai to give feedback, ask questions, or re-run the review.

@tomasz-stefaniak
Copy link
Contributor Author

@continue-review

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

Reviewed changes from recent commits (found 1 issue).

1 issue found across 2 files

Prompt for AI agents (all 1 issues)

Understand the root cause of the following 1 issues and fix them.


<file name="core/util/sanitization.vitest.ts">

<violation number="1" location="core/util/sanitization.vitest.ts:185">
Hard-coding /bin/sh for execSync causes these tests to fail on Windows where that shell path is absent. Please use a cross-platform shell selection so the suite runs on Windows too.</violation>
</file>

React with 👍 or 👎 to teach cubic. Mention @cubic-dev-ai to give feedback, ask questions, or re-run the review.

@tomasz-stefaniak
Copy link
Contributor Author

@continue-review

@github-actions
Copy link

github-actions bot commented Oct 17, 2025

✅ Review Complete

Triggered by @tomasz-stefaniak's request

Code Review for PR #8270: Build a local takeover MVP

Summary

This PR implements a "Background Mode" feature allowing users to create long-running background agents from chat, view recent tasks, and take over an agent locally. The implementation includes proper security measures for shell command injection and input validation. Overall quality is good with comprehensive test coverage.


Critical Issues

None identified - The code properly addresses the primary security concerns around command injection through sanitization utilities.


Security Observations

Well handled:

  • Shell argument sanitization using shell-quote library (sanitizeShellArgument)
  • Repository URL validation (validateGitHubRepoUrl) blocks dangerous patterns
  • Comprehensive integration tests that actually execute commands to verify security
  • Proper validation happens after URL normalization to prevent bypass

⚠️ Minor concern:

  • File: extensions/vscode/src/extension/VsCodeMessenger.ts:311
  • The validateGitHubRepoUrl function allows valid GitHub URLs with query parameters and fragments (tested), but doesn't validate the overall structure. Consider adding a more strict regex pattern for GitHub URLs if you want to be extra defensive:
    // Optional: Add after existing checks
    const githubUrlPattern = /^https:\/\/github\.com\/[a-zA-Z0-9_-]+\/[a-zA-Z0-9_.-]+$/i;
    if (normalized.startsWith('https://github.com/') && !githubUrlPattern.test(normalized.split(/[?#]/)[0])) {
      return false;
    }

Bugs / Potential Issues

  1. Error handling in git operations (VsCodeMessenger.ts:355-390)

    • The stash operation uses ide.subprocess() which may not handle all git error scenarios
    • If stash fails mid-operation, user's changes could be in an inconsistent state
    • Suggestion: Add try-catch around the entire checkout flow and provide rollback mechanism
  2. Race condition in agent list (AgentsList.tsx:100-109)

    • The 10-second polling interval could conflict with the immediate fetch after creation
    • Suggestion: Add debouncing or use a more sophisticated refresh strategy (e.g., exponential backoff, or trigger refresh after creation completes)
  3. Missing null check (VsCodeMessenger.ts:545)

    • getAgentState response validation checks agentState.session but doesn't verify it's a valid object
    • Suggestion:
      if (!agentState.session || typeof agentState.session !== 'object') {
        // handle error
      }

Code Quality Issues

  1. Import organization (core/control-plane/client.ts:14-18)

    • Mixing import reordering with feature additions makes the diff harder to review
    • This appears to be a linter auto-fix - consider running linters in a separate commit
  2. Magic numbers (AgentsList.tsx:106)

    • The 10000 ms polling interval should be a named constant
    • Suggestion:
      const AGENT_LIST_REFRESH_INTERVAL_MS = 10_000;
  3. Duplicate URL normalization (VsCodeMessenger.ts:278, 311, 319)

    • Repository URL is normalized multiple times in the same function
    • Suggestion: Store the normalized result once and reuse
  4. Long function (VsCodeMessenger.ts:265-456)

    • The openAgentLocally handler is ~190 lines and handles many concerns
    • Suggestion: Extract into smaller functions:
      • validateAndFetchAgentSession()
      • matchAgentToWorkspace()
      • handleWorkspaceChanges()
      • checkoutAgentBranch()

Missing Tests

The security tests are excellent, but functional tests are missing:

  1. Unit tests needed:

    • createBackgroundAgent function behavior
    • Error handling paths in openAgentLocally
    • Agent status badge color mapping
    • Repository URL matching logic
  2. Integration tests would help:

    • Full agent creation → listing → local open flow
    • Workspace switching behavior
    • GitHub authentication error flows

Documentation Gaps

  1. Missing JSDoc for new protocol methods:

    • createBackgroundAgent, listBackgroundAgents, openAgentLocally in ideWebview.ts
    • Should document expected behavior, parameters, and error conditions
  2. User-facing documentation:

    • How does branch switching work with uncommitted changes?
    • What happens if the agent's branch doesn't exist locally?
    • Limitations of background mode vs other modes

Positive Observations

Excellent security testing - The integration tests in sanitization.vitest.ts actually execute shell commands to verify injection prevention

Good error messages - User-facing errors are clear and actionable

Comprehensive URL normalization tests - Edge cases well covered

Type safety - Proper TypeScript types throughout


Minor Suggestions

  1. UI/UX (BackgroundModeView.tsx:143):

    • "~30 seconds" is very specific - consider "about 30 seconds" or make it configurable
  2. Logging (VsCodeMessenger.ts:332):

    • Consider sanitizing logs to avoid accidentally logging sensitive data from contextItems or selectedCode
  3. Performance (AgentsList.tsx:115-120):

    • Consider using React Query or SWR for data fetching with automatic caching/revalidation instead of manual polling

Conclusion

This is solid work with good security practices. The main areas for improvement are:

  • Breaking up the large openAgentLocally function
  • Adding more functional tests
  • Minor error handling improvements

The security implementation with sanitization + validation is exemplary. Nice job! 🎉


Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

Reviewed changes from recent commits (found 1 issue).

1 issue found across 3 files

Prompt for AI agents (all 1 issues)

Understand the root cause of the following 1 issues and fix them.


<file name="core/util/repoUrl.ts">

<violation number="1" location="core/util/repoUrl.ts:52">
The new scheme detection rejects git+ssh:// and other valid protocols containing +, -, or . and wrongly treats them as shorthand owner/repo paths, producing malformed URLs. Please restore support for these schemes by allowing RFC 3986-compliant characters in the protocol portion.</violation>
</file>

React with 👍 or 👎 to teach cubic. Mention @cubic-dev-ai to give feedback, ask questions, or re-run the review.

// Convert shorthand owner/repo to full URL
if (
normalized.includes("/") &&
!/^[a-z]+:\/\//i.test(normalized) &&
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Oct 17, 2025

Choose a reason for hiding this comment

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

The new scheme detection rejects git+ssh:// and other valid protocols containing +, -, or . and wrongly treats them as shorthand owner/repo paths, producing malformed URLs. Please restore support for these schemes by allowing RFC 3986-compliant characters in the protocol portion.

Prompt for AI agents
Address the following comment on core/util/repoUrl.ts at line 52:

<comment>The new scheme detection rejects git+ssh:// and other valid protocols containing +, -, or . and wrongly treats them as shorthand owner/repo paths, producing malformed URLs. Please restore support for these schemes by allowing RFC 3986-compliant characters in the protocol portion.</comment>

<file context>
@@ -49,7 +49,7 @@ export function normalizeRepoUrl(url: string): string {
   if (
     normalized.includes(&quot;/&quot;) &amp;&amp;
-    !normalized.includes(&quot;://&quot;) &amp;&amp;
+    !/^[a-z]+:\/\//i.test(normalized) &amp;&amp;
     !normalized.startsWith(&quot;git@&quot;)
   ) {
</file context>
Suggested change
!/^[a-z]+:\/\//i.test(normalized) &&
!/^[a-z][a-z0-9+.-]*:\/\//i.test(normalized) &&
Fix with Cubic

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

No issues found across 1 file

* @param agentSessionId - The ID of the agent session
* @returns The agent session view including metadata and status
*/
public async getAgentSession(agentSessionId: string): Promise<any | null> {
Copy link
Contributor

Choose a reason for hiding this comment

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

nit add a return type

title={
canOpenLocally
? "Open this agent workflow locally"
: "This agent is for a different repository. Open the correct workspace to take over this workflow."
Copy link
Contributor

@tingwai tingwai Oct 17, 2025

Choose a reason for hiding this comment

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

Are we able to display the name of the workspace here? If it can't be done easily, don't worry about it

Copy link
Contributor

@tingwai tingwai left a comment

Choose a reason for hiding this comment

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

Tested locally too, looks great. Thanks for all the great work!

@github-project-automation github-project-automation bot moved this from Todo to In Progress in Issues and PRs Oct 17, 2025
@dosubot dosubot bot added the lgtm This PR has been approved by a maintainer label Oct 17, 2025
@tomasz-stefaniak tomasz-stefaniak merged commit f3209ea into main Oct 17, 2025
68 of 70 checks passed
@tomasz-stefaniak tomasz-stefaniak deleted the tomasz/con-4212 branch October 17, 2025 22:53
@github-project-automation github-project-automation bot moved this from In Progress to Done in Issues and PRs Oct 17, 2025
@github-actions github-actions bot locked and limited conversation to collaborators Oct 17, 2025
@sestinj
Copy link
Contributor

sestinj commented Oct 18, 2025

🎉 This PR is included in version 1.27.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@sestinj
Copy link
Contributor

sestinj commented Oct 21, 2025

🎉 This PR is included in version 1.5.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@sestinj
Copy link
Contributor

sestinj commented Oct 22, 2025

🎉 This PR is included in version 1.30.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@sestinj
Copy link
Contributor

sestinj commented Oct 29, 2025

🎉 This PR is included in version 1.4.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

lgtm This PR has been approved by a maintainer released size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants