Skip to content

Conversation

@github-actions
Copy link
Contributor

@github-actions github-actions bot commented Jan 6, 2026

This is an automated pull request to release the candidate branch into production, which will trigger a deployment.
It was created by the [Production PR] action.

github-actions bot and others added 2 commits January 6, 2026 15:18
* feat(aikido): add Aikido security integration with vulnerability checks

* feat(aikido): enhance OAuth and variable controllers with improved error handling and logging

* feat(aikido): improve repository fetching and error handling in checks

* fix(aikido): improve error handling for code repository scanning

* fix(aikido): improve error handling for code repository scanning

* fix(aikido): enhance error handling and update fetch logic for repositories

* fix(aikido): update OAuth client credential handling and improve error logging

---------

Co-authored-by: Lewis Carhart <lewis@trycomp.ai>
Co-authored-by: Mariano Fuentes <marfuen98@gmail.com>
@vercel
Copy link

vercel bot commented Jan 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
app (staging) Ready Ready Preview, Comment Jan 8, 2026 2:55pm
1 Skipped Deployment
Project Deployment Review Updated (UTC)
portal (staging) Skipped Skipped Jan 8, 2026 2:55pm

@cursor
Copy link

cursor bot commented Jan 6, 2026

PR Summary

Introduces a new security integration and refines automation, OAuth, and UI flows across the platform.

  • New integration: Aikido
    • Adds aikido manifest, API types, variables, and checks (open_security_issues, code_repository_scanning, issue_count_threshold) and registers in registry
  • Task automation/scheduling
    • Extracts helpers (getTargetStatus, calculateNextDueDate) with tests; scheduler now categorizes overdue tasks into todo/failed/kept done based on custom/app automations and updates statuses separately with enhanced logs/metrics
  • OAuth and sync robustness
    • Aligns token requests with RFC 6749 (use Basic header without body creds) and improves error logging (includes response body) for token exchange/refresh and Google/JumpCloud sync
  • Variables API
    • Improves fetch error messaging and fetchAllPages to handle array or wrapped responses
  • GitHub checks
    • Branch protection check now fetches recent PRs (window configurable via recent_pr_days) and includes PR summaries in evidence; refactors manifest imports and adds PR types
  • App UI
    • Policy editor AI assistant behind feature flag (is-ai-policy-assistant-enabled), plumbed through PolicyPage and PolicyContentManager
    • Adds EvidenceJsonView (uses @uiw/react-json-view) to safely render/download run evidence; integrated into task integration check history
  • Config/other
    • Tailwind preset path updated to @trycompai/ui
    • Minor editor mention component cleanup and dependency lock updates

Written by Cursor Bugbot for commit 90b0c49. This will update automatically on new commits. Configure here.

@CLAassistant
Copy link

CLAassistant commented Jan 6, 2026

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.
1 out of 2 committers have signed the CLA.

✅ Marfuen
❌ github-actions[bot]
You have signed the CLA already but the status is still pending? Let us recheck it.

return repositories.map((repo) => ({
value: String(repo.id),
label: `${repo.name} (${repo.provider})`,
}));
Copy link

Choose a reason for hiding this comment

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

Inconsistent API response handling causes potential crash

The targetRepositoriesVariable.fetchOptions function in variables.ts assumes ctx.fetch always returns an array and directly calls .map() on the response. However, code-repository-scanning.ts defensively handles both array responses and wrapped responses (like { repositories: [...] }) using Array.isArray(response) ? response : (response?.repositories ?? []). If the Aikido API returns a wrapped response, the variable fetching will crash with a "map is not a function" error, preventing users from selecting target repositories during integration setup.

Additional Locations (1)

Fix in Cursor Fix in Web


const diffDays = (Date.now() - lastScanMs) / (1000 * 60 * 60 * 24);
return diffDays > SCAN_STALE_DAYS;
};
Copy link

Choose a reason for hiding this comment

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

Invalid date strings cause staleness check to pass incorrectly

The isStale function parses date strings using new Date(lastScannedAt).getTime() without validating the result. If the API returns an invalid date string for last_scan_at, getTime() returns NaN, causing diffDays to be NaN. Since NaN > SCAN_STALE_DAYS is always false, repositories with invalid date data would incorrectly be marked as not stale, causing the security check to pass when it cannot actually determine when the repo was last scanned. A fail-safe approach would treat unparseable dates as stale.

Fix in Cursor Fix in Web

…ion (#1984)

Co-authored-by: Tofik Hasanov <annexcies@gmail.com>
* fix(sync): enhance error logging for Google API response

* fix(google-workspace): update domain scope to role management readonly

---------

Co-authored-by: Mariano Fuentes <marfuen98@gmail.com>
return counts.critical + counts.high + counts.medium;
case 'low':
default:
return counts.all;
Copy link

Choose a reason for hiding this comment

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

Inconsistent severity counting logic between two checks

Medium Severity

The countAtOrAboveSeverity function is implemented differently in the two Aikido check files. In issue-count-threshold.ts, the 'low' case returns counts.all, while in open-security-issues.ts, it returns counts.critical + counts.high + counts.medium + counts.low. If the API's all field ever includes additional unmapped severity categories or differs from the explicit sum, these two security checks will produce inconsistent results for the same severity threshold setting.

Additional Locations (1)

Fix in Cursor Fix in Web

},
});
return;
}
Copy link

Choose a reason for hiding this comment

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

Security checks pass silently when API unavailable

Medium Severity

Both Aikido security checks call ctx.pass() when the API request fails, implementing a "fail-open" pattern. For security-critical checks designed to detect vulnerabilities, this means that API outages, credential issues, or rate limiting will cause the security checks to pass silently rather than flagging the inability to verify. This could mask real security issues during API unavailability.

Additional Locations (1)

Fix in Cursor Fix in Web


// Log details about updated tasks
overdueTasks.forEach((task) => {
tasksToTodo.forEach((task) => {
Copy link

Choose a reason for hiding this comment

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

Missing await on notification causes unhandled promise rejection

Medium Severity

The novu.triggerBulk() call is missing await. The previous code used await novu.trigger.broadcast(), but the new code calls novu.triggerBulk() synchronously. This means notification failures will result in unhandled promise rejections, the task will report success before notifications complete, and any errors from the notification service won't be caught by the surrounding try/catch block.

Fix in Cursor Fix in Web

* feat(evidence): add EvidenceJsonView component for JSON evidence display

* chore: remove unused react-json-view dependency and related code

---------

Co-authored-by: Tofik Hasanov <annexcies@gmail.com>
const arrayValue = Object.values(data).find((v) =>
Array.isArray(v),
) as T[] | undefined;
items = arrayValue ?? [];
Copy link

Choose a reason for hiding this comment

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

First-array heuristic may select wrong data in pagination

Low Severity

The fetchAllPages heuristic uses Object.values(data).find(v => Array.isArray(v)) to find data in wrapped responses. This selects the first array property by definition order, which could pick an unintended array if the response contains multiple arrays (e.g., { errors: [], items: [...] } would select the empty errors array). This causes pagination to terminate early with items.length === 0, silently returning no data. This could cause security checks to incorrectly pass if they find no resources to evaluate.

Fix in Cursor Fix in Web

@vercel vercel bot temporarily deployed to staging – portal January 8, 2026 14:53 Inactive
@Marfuen Marfuen merged commit df9d992 into release Jan 8, 2026
8 of 10 checks passed
@claudfuen
Copy link
Contributor

🎉 This PR is included in version 1.74.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants