Connect your users to their apps
This report summarizes scanner evidence for corsairdev/corsair, a TypeScript project with 13,679 GitHub stars. SynthScan examined 2,228,294 lines of code across 9827 source files, recording 3882 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 4.5 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 707 finding(s).
Are imports declared and package/API names verified? 273 finding(s).
Are wrappers, guards, and repeated structures necessary? 3455 finding(s).
Which changes need focused human review? 3882 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 3882 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | demo/minimal/oauth.ts | 11 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | demo/minimal/oauth.ts | 13 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | demo/minimal/oauth.ts | 24 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | demo/minimal/oauth.ts | 26 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | adapters/mastra/src/corsair-tool-provider.ts | 353 | // ── Discovery (BaseToolProvider layers allowlist filtering on top) ────────── | COMMENT |
| MEDIUM | adapters/mastra/src/corsair-tool-provider.ts | 413 | // ── Runtime ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | adapters/mastra/src/corsair-tool-provider.ts | 477 | // ── Managed OAuth lifecycle ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | adapters/mastra/src/corsair-tool-provider.check.ts | 43 | // ── resolveTenant precedence (tenant isolation) ───────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 69 | // ── package.json ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 113 | // ── tsconfig.json ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 139 | // ── tsup.config.ts ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 160 | // ── webhooks/tenant-matcher.ts + oauth-tenant-link.ts ───────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 170 | // ── index.ts ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 370 | // ── client.ts ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 437 | // ── error-handlers.ts ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 474 | // ── endpoints/types.ts ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 509 | // ── endpoints/example.ts ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 530 | // ── endpoints/index.ts ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 543 | // ── webhooks/types.ts ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 607 | // ── webhooks/example.ts ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 640 | // ── webhooks/index.ts ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 655 | // ── schema/database.ts ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 670 | // ── schema/index.ts ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 680 | // ── jest.config.cjs + starter test ──────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin.ts | 767 | // ── Update core/constants.ts to register the new provider ───────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-readmes.ts | 55 | // ── discovery (mirrors generate-plugin-docs.ts) ────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-readmes.ts | 89 | // ── auth metadata (mirrors generate-plugin-docs.ts inference) ──────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-readmes.ts | 156 | // ── README template (unslopped house style) ────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-readmes.ts | 237 | // ── metadata fill (fills missing only, never clobbers) ─────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-readmes.ts | 293 | // ── changeset ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-readmes.ts | 306 | // ── plugin loading + orchestration ─────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-from-json.ts | 12 | // ── JSON shape ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-from-json.ts | 55 | // ── Name helpers ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-from-json.ts | 168 | // ── Auth helpers ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-from-json.ts | 211 | // ── Zod schema code generation ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-from-json.ts | 316 | // ── File content builders ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-from-json.ts | 944 | // ── Main ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/generate-plugin-from-json.ts | 1298 | // ── Entry ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/attio/index.ts | 46 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/attio/index.ts | 48 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/attio/index.ts | 57 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/attio/index.ts | 59 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/attio/index.ts | 928 | // ── Key Builder ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/attio/index.ts | 931 | // ── Webhook Signature ───────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/attio/index.ts | 941 | // ── Static key shortcut ─────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/attio/index.ts | 946 | // ── API Key auth ────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 72 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 74 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 104 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 106 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 234 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 236 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 699 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 701 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 854 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 856 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 873 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 875 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 890 | // ── OAuth Config ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/attio/index.ts | 972 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| 2841 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | demo/testing/src/scripts/test-hub.ts | 53 | async function testDeliveryEndpointHealth(): Promise<void> { | CODE |
| LOW | demo/testing/src/scripts/test-hub.ts | 107 | async function testManagedConnectSession(): Promise<void> { | CODE |
| LOW | demo/testing/src/scripts/test-hub.ts | 145 | async function testIntegrationCredentials(): Promise<void> { | CODE |
| LOW | demo/testing/src/scripts/test-hub.ts | 164 | async function testStoredGoogleCalendarTokens(): Promise<void> { | CODE |
| LOW | demo/testing/src/scripts/test-hub.ts | 186 | async function testStoredGitHubManagedTokens(): Promise<void> { | CODE |
| LOW | demo/testing/src/scripts/test-hub.ts | 208 | async function testGoogleCalendarApiCall(): Promise<void> { | CODE |
| LOW | demo/testing/src/scripts/test-hub.ts | 240 | async function testManagedOAuthDeliveryHandler(): Promise<void> { | CODE |
| LOW | clients/python/tests/test_corsair_cloud.py | 46 | def test_call_builds_url_bearer_body_and_returns_data(monkeypatch): | CODE |
| LOW | clients/python/tests/test_corsair_cloud.py | 65 | def test_connection_status_parses_plugin_map(monkeypatch): | CODE |
| LOW⚡ | clients/python/tests/test_corsair_cloud.py | 103 | def test_rejects_non_https_url(): | CODE |
| LOW⚡ | clients/python/tests/test_corsair_cloud.py | 108 | def test_allows_http_for_loopback(): | CODE |
| LOW⚡ | clients/python/tests/test_corsair_cloud.py | 113 | def test_call_encodes_a_slash_containing_tenant(monkeypatch): | CODE |
| LOW | clients/python/tests/test_corsair_cloud.py | 127 | def test_with_tenant_rejects_empty(): | CODE |
| LOW | clients/python/tests/test_corsair_cloud.py | 133 | def test_derives_url_from_key(): | CODE |
| LOW | explorer/src/catalog.ts | 205 | function catalogFromLegacyMonolith(data: PluginCatalog, path: string): Catalog { | CODE |
| LOW | www/scripts/migrate-blog-to-sanity.ts | 72 | async function uploadImageFromPublicPath( | CODE |
| LOW | www/src/app/oss/oss-integrations-shell.tsx | 16 | function OssIntegrationsShellInner({ | CODE |
| LOW | www/src/app/oss/active-claim-deadline-banner.tsx | 23 | export function ActiveClaimDeadlineBanner({ | CODE |
| LOW | www/src/app/oss/mark-finished-button.tsx | 123 | export function ReadyToReviewStatusCallout({ | CODE |
| LOW | www/src/app/oss/oss-sections.tsx | 49 | export async function OssCategoryOnboardingSection({ | CODE |
| LOW | www/src/app/oss/contributor-profile.tsx | 171 | function ContributorIntegrationRow({ | CODE |
| LOW | www/src/app/oss/[slug]/integration-detail-sections.tsx | 129 | export async function IntegrationCapabilitiesSection({ | CODE |
| LOW | www/src/app/oss/[slug]/integration-detail-sections.tsx | 156 | export function IntegrationHeaderSkeleton() { | CODE |
| LOW | www/src/app/oss/[slug]/integration-detail-sections.tsx | 190 | export function IntegrationCapabilitiesSkeleton() { | CODE |
| LOW | www/src/app/oss/[slug]/integration-capability-list.tsx | 21 | export function IntegrationCapabilityList({ | CODE |
| LOW | www/src/app/oss/[slug]/integration-auth-scheme-list.tsx | 9 | export function IntegrationAuthSchemeList({ | CODE |
| LOW | www/src/server/catalog-integration-cache.ts | 11 | export function catalogIntegrationCacheTag(id: string) { | CODE |
| LOW | www/src/server/catalog-integration-cache.ts | 19 | function getCachedCatalogIntegrationsList() { | CODE |
| LOW | www/src/server/catalog-integration-cache.ts | 30 | function getCachedCatalogIntegrationIds() { | CODE |
| LOW | www/src/server/catalog-integration-cache.ts | 41 | function getCachedCatalogIntegrationById(id: string) { | CODE |
| LOW | www/src/server/integration-cache.ts | 23 | function getCachedIntegrationSummary(slug: string) { | CODE |
| LOW | www/src/server/integration-cache.ts | 34 | function getCachedIntegrationCapabilities(slug: string) { | CODE |
| LOW | www/src/server/oss-public-cache.ts | 18 | export function revalidateOssWriteSurface() { | CODE |
| LOW | www/src/server/oss-public-cache.ts | 68 | export async function getIntegrationListForPage( | CODE |
| LOW | www/src/server/github-users.ts | 10 | function getGithubAvatarFallbackUrl(username: string): string { | CODE |
| LOW | www/src/server/catalog-combo-cache.ts | 16 | function getCachedCatalogCombosList() { | CODE |
| LOW | www/src/server/catalog-combo-cache.ts | 27 | function getCachedCatalogComboRouteKeys() { | CODE |
| LOW | www/src/server/catalog-combo-cache.ts | 38 | function getCachedCatalogComboByMemberIds(slugA: string, slugB: string) { | CODE |
| LOW | www/src/server/enterprise-contact.ts | 17 | function formatEnterpriseContactMessage(input: SubmitEnterpriseContactInput) { | CODE |
| LOW | www/src/server/enterprise-contact.ts | 30 | export async function sendEnterpriseContactNotification( | CODE |
| LOW | www/src/server/integrations/claim-integration.ts | 104 | export async function claimIntegrationAtomically( | CODE |
| LOW | www/src/server/actions/mark-ready-to-review.ts | 10 | export async function markIntegrationReadyToReview(integrationId: string) { | CODE |
| LOW | www/src/server/actions/admin-mark-merged.ts | 11 | export async function adminMarkIntegrationMerged(integrationId: string) { | CODE |
| LOW | www/src/server/api/routers/integrations.ts | 125 | function visibleIntegrationsFilter(query?: string, tagSlugs?: string[]): SQL { | CODE |
| LOW | www/src/server/api/routers/integrations.ts | 151 | function mapIntegrationClaimFields( | CODE |
| LOW | www/src/server/api/routers/integrations.ts | 181 | async function maybeAdvancePhaseAfterUrlUpdate( | CODE |
| LOW | …nts/landing/use-cases/corsair-infrastructure-layer.tsx | 4 | export function CorsairInfrastructureLayer() { | CODE |
| LOW | …nents/landing/hooks/use-window-pointer-interactions.ts | 43 | export function useWindowPointerInteractions({ | CODE |
| LOW | …ts/integrations/detail/integration-capability-tabs.tsx | 50 | export function IntegrationCapabilityTabs({ | CODE |
| LOW | …tegrations/detail/integration-capabilities-section.tsx | 4 | export function IntegrationCapabilitiesSection({ | CODE |
| LOW | …src/components/integrations/combo/workflow-builder.tsx | 46 | function defaultPairForTriggerSide( | CODE |
| LOW | …nents/compare/nango-limited-api-operations-section.tsx | 14 | export function NangoLimitedApiOperationsSection({ | CODE |
| LOW | www/src/components/compare/nango-integrations-modal.tsx | 69 | export function NangoIntegrationsCountLink() { | CODE |
| LOW | www/src/components/compare/nango-integrations-modal.tsx | 79 | export function NangoIntegrationsCatalogProvider({ | CODE |
| LOW | www/src/components/compare/nango-integrations-modal.tsx | 97 | export function NangoIntegrationsModalTrigger() { | CODE |
| LOW | www/src/components/compare/nango-integrations-modal.tsx | 107 | function NangoIntegrationsCatalogDialog({ | CODE |
| LOW | …nents/compare/visuals/security-architecture-visual.tsx | 40 | export function SecurityArchitectureVisual() { | CODE |
| LOW | www/src/lib/integration-phases.ts | 32 | export function isIntegrationActivelyClaimed( | CODE |
| LOW | www/src/lib/integration-urls.ts | 10 | export function formatIntegrationIssueLabel(url: string | null | undefined) { | CODE |
| LOW | www/src/lib/auth-emails.ts | 70 | export function buildMagicLinkEmailFromUrl(url: string) { | CODE |
| 493 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | demo/sdk/slack/tests/models.test.ts | 318 | real_name: 'John Doe', | CODE |
| LOW | demo/sdk/slack/tests/models.test.ts | 331 | real_name: 'John Doe', | CODE |
| LOW | demo/sdk/posthog/README.md | 122 | email: 'user@example.com', | CODE |
| LOW | demo/sdk/posthog/README.md | 123 | name: 'John Doe', | CODE |
| LOW | demo/sdk/unified-sdk/tests/slack/models.test.ts | 318 | real_name: 'John Doe', | CODE |
| LOW | demo/sdk/unified-sdk/tests/slack/models.test.ts | 331 | real_name: 'John Doe', | CODE |
| LOW | explorer/data/plugins/apininjas.json | 4741 | "description": "Returns one or more paragraphs of lorem ipsum placeholder text", | CODE |
| LOW | scripts/generate-plugin-readmes.test.ts | 115 | author: 'Jane Doe', | CODE |
| LOW | scripts/generate-plugin-readmes.test.ts | 120 | assert.equal(out.author, 'Jane Doe'); | CODE |
| LOW | packages/abstract/error-handlers.test.ts | 8 | const error = new AbstractAPIError('placeholder', status); | CODE |
| LOW | packages/abstract/api.test.ts | 95 | { query: { email: 'test@test.com' } }, | CODE |
| LOW⚡ | packages/allimagesai/endpoints.test.ts | 34 | harness.queue({ body: { email: 'user@example.com' } }); | CODE |
| LOW⚡ | packages/allimagesai/endpoints.test.ts | 43 | expect(result.email).toBe('user@example.com'); | CODE |
| LOW⚡ | packages/allimagesai/endpoints.test.ts | 48 | harness.queue({ body: { email: 'user@example.com' } }); | CODE |
| LOW⚡ | packages/allimagesai/endpoints.test.ts | 52 | email: 'user@example.com', | CODE |
| LOW | packages/allimagesai/client.test.ts | 22 | harness.queue({ body: { email: 'user@example.com' } }); | CODE |
| LOW | packages/campayn/endpoints.test.ts | 282 | email: 'user@example.com', | CODE |
| LOW | packages/campayn/endpoints.test.ts | 292 | email: 'user@example.com', | CODE |
| LOW | packages/workiom/schema.test.ts | 61 | '1251': 'user@example.com', | CODE |
| LOW | packages/appointo/schema.test.ts | 128 | name: 'John Doe', | CODE |
| LOW | packages/appointo/schema.test.ts | 140 | name: 'John Doe', | CODE |
| LOW | packages/appointo/schema.test.ts | 386 | name: 'John Doe', | CODE |
| LOW | packages/appointo/endpoints.test.ts | 424 | name: 'John Doe', | CODE |
| LOW | packages/appointo/endpoints.test.ts | 476 | name: 'John Doe', | CODE |
| LOW | packages/appointo/endpoints.test.ts | 491 | name: 'John Doe', | CODE |
| LOW | packages/appointo/endpoints.test.ts | 520 | name: 'Jane Doe', | CODE |
| LOW | packages/appointo/endpoints.test.ts | 528 | name: 'Jane Doe', | CODE |
| LOW | packages/appointo/endpoints.test.ts | 541 | name: 'Jane Doe', | CODE |
| LOW | packages/emelia/endpoints.test.ts | 119 | name: 'Jane Doe', | CODE |
| LOW | packages/altoviz/endpoints.test.ts | 166 | const payload = auditPayload({ customerId: 42, companyName: 'Acme Corp' }); | CODE |
| LOW | packages/altoviz/endpoints.test.ts | 173 | companyName: 'Acme Corp', | CODE |
| LOW | packages/borneo/endpoints/output-schemas.ts | 478 | 'Filters all logs with user email eg. "user@example.com".', | CODE |
| LOW | packages/borneo/endpoints/types.ts | 234 | .describe('Filters all logs with user email eg. "user@example.com".') | CODE |
| LOW⚡ | packages/corsair/tests/kek-config.test.ts | 21 | plugins: [slack({ authType: 'api_key', key: 'fake-key' })], | CODE |
| LOW⚡ | packages/corsair/tests/kek-config.test.ts | 31 | plugins: [slack({ authType: 'api_key', key: 'fake-key' })], | CODE |
| LOW⚡ | packages/corsair/tests/kek-config.test.ts | 41 | plugins: [slack({ authType: 'api_key', key: 'fake-key' })], | CODE |
| LOW | packages/corsair/tests/retry-recover.test.ts | 70 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/retry-recover.test.ts | 101 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/hooks.test.ts | 68 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/hooks.test.ts | 116 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/hooks.test.ts | 164 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/hooks.test.ts | 231 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/hooks.test.ts | 302 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/hooks.test.ts | 376 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/hooks.test.ts | 453 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/hooks.test.ts | 514 | key: 'fake-key', | CODE |
| LOW | packages/corsair/tests/connect-link.test.ts | 157 | const result = await boundFn({ to: 'user@example.com' }); | CODE |
| LOW | packages/cdrplatform/api.test.ts | 176 | display_name: 'Jane Doe', | CODE |
| LOW | packages/marketstack/error-handlers.test.ts | 8 | const error = new MarketstackAPIError('placeholder', { apiCode }); | CODE |
| LOW | packages/sendgrid/api.test.ts | 26 | contacts: [{ email: 'user@example.com', first_name: 'Jane' }], | CODE |
| LOW | packages/sendgrid/api.test.ts | 30 | contactSearchEmails: { emails: ['user@example.com'] }, | CODE |
| LOW | packages/breathehr/schema.test.ts | 26 | email: 'foo@bar.com', | CODE |
| LOW | packages/whautomate/schema.test.ts | 59 | name: 'John Doe', | CODE |
| LOW | packages/whautomate/schema.test.ts | 68 | expect(result.name).toBe('John Doe'); | CODE |
| LOW | packages/whautomate/schema.test.ts | 163 | name: 'John Doe', | CODE |
| LOW⚡ | packages/whautomate/schema.test.ts | 182 | expect(result.data[0]!.name).toBe('John Doe'); | CODE |
| LOW⚡ | packages/whautomate/schema.test.ts | 188 | { id: 'contact_1', name: 'John Doe', phoneNumber: '+1234567890' }, | CODE |
| LOW⚡ | packages/whautomate/schema.test.ts | 191 | expect(result.data[0]!.name).toBe('John Doe'); | CODE |
| LOW | packages/whautomate/schema.test.ts | 355 | name: 'Jane Doe', | CODE |
| LOW | packages/whautomate/schema.test.ts | 366 | expect(result.name).toBe('Jane Doe'); | CODE |
| 197 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | demo/testing/next-env.d.ts | 1 | /// <reference types="next" /> | COMMENT |
| LOW | demo/testing/src/scripts/test-hub.ts | 321 | } | COMMENT |
| LOW | demo/testing/src/scripts/test-hub.ts | 341 | // 'GitHub API (repositories.list)', | COMMENT |
| LOW | demo/testing/src/scripts/test-hub.ts | 361 | // message.includes('Bad credentials') || | COMMENT |
| LOW | explorer/pnpm-workspace.yaml | 1 | # Stops pnpm from walking up into the parent monorepo's workspace. This app is | COMMENT |
| LOW | www/next-env.d.ts | 1 | /// <reference types="next" /> | COMMENT |
| LOW | packages/ably/schema/database.ts | 1 | // Ably has no persisted database entities — messaging, presence, | COMMENT |
| LOW | packages/abstract/index.ts | 241 | keyBuilder: async (ctx: AbstractKeyBuilderContext, source) => { | COMMENT |
| LOW | packages/twochat/webhooks/types.ts | 1 | // 2Chat has no incoming webhooks in this integration. | COMMENT |
| LOW | packages/appointo/webhooks/index.ts | 1 | // Appointo uses API-token authentication and does not expose native webhooks. | COMMENT |
| LOW | packages/webflow/endpoints/factory.ts | 501 | response: unknown, | COMMENT |
| LOW | packages/contentfulgraphql/schema.test.ts | 21 | // Per .github/PLUGIN_PR_RULES.md (R2), every implemented endpoint | COMMENT |
| LOW | packages/contentfulgraphql/schema/database.ts | 1 | // This integration is a read-only GraphQL query API, so it defines no | COMMENT |
| LOW | packages/corsair/core/management/body-limit.ts | 1 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| LOW | packages/corsair/core/management/call.ts | 81 | // Never surface an arbitrary operation error's message — it can carry | COMMENT |
| LOW | packages/corsair/core/management/operations.ts | 81 | // `IntegrationKeyManagerFor<AuthTypes>` is a public type whose accessors are | COMMENT |
| LOW | packages/corsair/core/management/adapters/next.ts | 1 | import type { ManagementHandlerOptions } from '../handler'; | COMMENT |
| LOW | packages/corsair/core/management/adapters/express.ts | 21 | // | COMMENT |
| LOW | packages/corsair/core/management/adapters/hono.ts | 1 | import type { ManagementHandlerOptions } from '../handler'; | COMMENT |
| LOW | packages/corsair/core/management/adapters/fastify.ts | 21 | // // parser consumes request.raw BEFORE any handler runs, and re-serializing | COMMENT |
| LOW | …kages/corsair/core/management/adapters/node-request.ts | 1 | // ───────────────────────────────────────────────────────────────────────────── | COMMENT |
| LOW | packages/corsair/tests/framework-body-fidelity.test.ts | 21 | import { signDeliveryEnvelope } from '../hub/signing/envelope'; | COMMENT |
| LOW | packages/corsair/tests/framework-body-fidelity.test.ts | 41 | // - Express, no body parser (recommended) → adapter drains the raw stream. | COMMENT |
| LOW | packages/corsair/tests/framework-realserver.test.ts | 21 | // | COMMENT |
| LOW | packages/corsair/tests/management-client.test.ts | 1 | import { CorsairClientError, createCorsairClient } from '../client'; | COMMENT |
| LOW | packages/corsair/tests/management-handler.test.ts | 1 | import { createCorsair } from '../core'; | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 1 | // import * as dotenv from 'dotenv'; | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 21 | // }); | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 41 | // 'retry-after': String(mockRetryAfterSeconds), | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 61 | COMMENT | |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 81 | // expect(capturedError?.status).toBe(429); | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 101 | // headers: { | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 121 | // ]; | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 141 | COMMENT | |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 161 | // enabled: true, | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 181 | // errorHandlers, | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 201 | // }, | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 221 | COMMENT | |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 241 | // expect(result.headersRetryAfterMs).toBeUndefined(); | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 261 | // }); | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 281 | // rateLimitConfig: { | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 301 | // {}, | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 321 | // { | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 341 | // 'content-type': 'application/json', | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 361 | COMMENT | |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 381 | // expect(capturedError?.status).toBe(429); | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 401 | // const SLACK_BOT_TOKEN = process.env.SLACK_BOT_TOKEN; | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 421 | COMMENT | |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 441 | // console.log( | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 461 | // const secondStart = Date.now(); | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 481 | // rateLimitConfig: { | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 501 | // const secondElapsed = Date.now() - secondStart; | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 521 | // const successCount = results.filter( | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 541 | // console.log( | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 561 | // ); | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 581 | // console.warn('Your Slack workspace has extremely high rate limits.'); | COMMENT |
| LOW | …ges/corsair/tests/slack-rate-limit-integration.test.ts | 601 | // 'Consider using the simulated test or a workspace with lower limits.', | COMMENT |
| LOW | packages/corsair/workflows/probe.ts | 1 | import * as vm from 'node:vm'; | COMMENT |
| LOW | packages/corsair/workflows/execute.ts | 1 | import { createHash } from 'node:crypto'; | COMMENT |
| LOW | packages/corsair/client/react/index.ts | 21 | // | COMMENT |
| 29 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | demo/sdk/linear/ENV_SETUP.md | 193 | ### Step 1: Verify API Key | COMMENT |
| LOW | demo/sdk/linear/ENV_SETUP.md | 206 | ### Step 2: Verify Team ID (if set) | COMMENT |
| LOW | demo/sdk/linear/ENV_SETUP.md | 214 | ### Step 3: Verify Webhook Setup | COMMENT |
| LOW⚡ | demo/sdk/hubspot/README.md | 17 | #### Step 1: Navigate to Private Apps | COMMENT |
| LOW⚡ | demo/sdk/hubspot/README.md | 24 | #### Step 2: Create a New Private App | COMMENT |
| LOW⚡ | demo/sdk/hubspot/README.md | 32 | #### Step 3: Configure Scopes (Permissions) | COMMENT |
| LOW | demo/sdk/hubspot/README.md | 55 | #### Step 4: Get Your Access Token | COMMENT |
| LOW | demo/sdk/hubspot/README.md | 63 | #### Step 5: Create Environment File | COMMENT |
| LOW | demo/sdk/hubspot/README.md | 93 | #### Step 1: Get Your Webhook Secret (Optional but Recommended) | COMMENT |
| LOW | demo/sdk/hubspot/README.md | 100 | #### Step 2: Set Up Local Webhook Server | COMMENT |
| LOW | demo/sdk/hubspot/README.md | 114 | #### Step 3: Create Webhook Subscription in HubSpot | COMMENT |
| LOW | demo/sdk/hubspot/README.md | 126 | #### Step 4: Test Webhooks | COMMENT |
| LOW | demo/sdk/slack/README.md | 17 | #### Step 1: Create a Slack App | COMMENT |
| LOW | demo/sdk/slack/README.md | 26 | #### Step 2: Configure Bot Token Scopes | COMMENT |
| LOW⚡ | demo/sdk/slack/README.md | 55 | #### Step 3: Install App to Workspace | COMMENT |
| LOW⚡ | demo/sdk/slack/README.md | 62 | #### Step 4: Get User Token (Optional) | COMMENT |
| LOW⚡ | demo/sdk/slack/README.md | 72 | #### Step 5: Find Channel and User IDs | COMMENT |
| LOW | demo/sdk/slack/README.md | 93 | #### Step 6: Create Environment File | COMMENT |
| LOW⚡ | demo/sdk/posthog/README.md | 17 | #### Step 1: Get Your Project API Key | COMMENT |
| LOW⚡ | demo/sdk/posthog/README.md | 24 | #### Step 2: Get Your Personal API Key (Optional, for API access) | COMMENT |
| LOW⚡ | demo/sdk/posthog/README.md | 32 | #### Step 3: Create Environment File | COMMENT |
| LOW | demo/sdk/posthog/README.md | 64 | #### Step 1: Set Up Local Webhook Server | COMMENT |
| LOW | demo/sdk/posthog/README.md | 78 | #### Step 2: Create Webhook Destination in PostHog | COMMENT |
| LOW | demo/sdk/posthog/README.md | 87 | #### Step 3: Test Webhooks | COMMENT |
| LOW⚡ | demo/sdk/gmail/README.md | 36 | ### Step 1: Create Google Cloud Project | COMMENT |
| LOW⚡ | demo/sdk/gmail/README.md | 42 | ### Step 2: Enable Gmail API | COMMENT |
| LOW⚡ | demo/sdk/gmail/README.md | 48 | ### Step 3: Create OAuth 2.0 Credentials | COMMENT |
| LOW⚡ | demo/sdk/gmail/README.md | 56 | ### Step 4: Get Access Token | COMMENT |
| LOW | demo/sdk/gmail/README.md | 96 | ### Step 5: Configure Environment Variables | COMMENT |
| LOW⚡ | packages/googlecalendar/setup.ts | 32 | ### Step 2: Enable the Google Calendar API | COMMENT |
| LOW⚡ | packages/googlecalendar/setup.ts | 42 | ### Step 3: Configure the OAuth Consent Screen | COMMENT |
| LOW⚡ | packages/googlecalendar/setup.ts | 129 | ### Step 9: Get a Public Webhook URL | COMMENT |
| LOW⚡ | packages/googlecalendar/setup.ts | 139 | ### Step 10: Set Up ngrok | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 19 | ### Step 1: Check for an existing GCP project | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 61 | ### Step 4: Create OAuth 2.0 Credentials | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 77 | ### Step 5: Enter Client ID and Client Secret | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 88 | ### Step 6: Get Access Token and Refresh Token (OAuth Playground) | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 106 | ### Step 7: Enter Access Token and Refresh Token | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 117 | ### Step 8: Webhook Setup (Optional) | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 174 | ### Step 11: Create the Calendar Watch Channel | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | packages/circleci/endpoints.test.ts | 1033 | const entityIds = db.projectEnvVars.upsertByEntityId.mock.calls.map( | CODE |
| CRITICAL | packages/doppler/endpoints.test.ts | 1034 | const calledKeys = db.environments.upsertByEntityId.mock.calls.map( | CODE |
| CRITICAL | packages/twilio/integration.test.ts | 238 | await corsair.twilio.webhooks.message.received.handler({ | CODE |
| CRITICAL | packages/apininjas/behaviour.test.ts | 122 | const kinds = db.vehicles.upsertByEntityId.mock.calls.map( | CODE |
| CRITICAL | packages/apininjas/behaviour.test.ts | 125 | const ids = db.vehicles.upsertByEntityId.mock.calls.map((call) => call[0]); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/googlemeet/scripts/setup-test-db.ts | 171 | print(f'Opening database: {db_path}') | CODE |
| HIGH⚡ | packages/googlemeet/scripts/setup-test-db.ts | 190 | print(f'\\nIntegration rows: {len(integrations)}') | CODE |
| HIGH⚡ | packages/googlemeet/scripts/setup-test-db.ts | 192 | print(f' id={row[0]}, name={row[1]}') | CODE |
| HIGH⚡ | packages/googlemeet/scripts/setup-test-db.ts | 196 | print(f'\\nAccount rows: {len(accounts)}') | CODE |
| HIGH⚡ | packages/googlemeet/scripts/setup-test-db.ts | 198 | print(f' id={row[0]}, tenant_id={row[1]}') | CODE |
| HIGH⚡ | packages/googlemeet/scripts/setup-test-db.ts | 201 | print('\\nDone! Google Meet plugin is ready to test.') | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | explorer/data/plugins/winstonai.json | 24 | "description": "Score whether a public image URL was created by a human or generated by AI", | CODE |
| HIGH | explorer/data/plugins/winstonai.json | 85 | "description": "Score whether text, a public file, or a website was written by a human or generated by AI", | CODE |
| HIGH | packages/winstonai/README.md | 15 | | `detect.aiText` | `winstonai.api.detect.aiText` | `read` | Score whether text was written by a human or generated by A | CODE |
| HIGH | packages/winstonai/README.md | 17 | | `detect.aiImage` | `winstonai.api.detect.aiImage` | `read` | Score whether a public image URL was generated by AI | | CODE |
| HIGH | packages/winstonai/index.ts | 100 | 'Score whether text, a public file, or a website was written by a human or generated by AI', | CODE |
| HIGH | packages/winstonai/index.ts | 110 | 'Score whether a public image URL was created by a human or generated by AI', | CODE |
| HIGH | packages/zoom/endpoints/types.ts | 331 | // AI-generated summary detail items have an open-ended structure that Zoom may extend | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | demo/sdk/posthog/README.md | 173 | token: 'your-api-key-here', | CODE |
| HIGH | packages/accrediblecertificates/client.ts | 46 | // "Use the format: Token token=YOUR_API_KEY". | COMMENT |
| HIGH | packages/googlecalendar/setup.ts | 157 | 4. Run: \`ngrok config add-authtoken YOUR_TOKEN_HERE\` | CODE |
| HIGH | packages/serpapi/client.ts | 38 | // (confirmed from the docs: `?api_key=YOUR_API_KEY`, not a header). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/leexi/index.ts | 210 | // compiler. This mirrors the generator scaffold used by every plugin. | COMMENT |
| MEDIUM | packages/extractaai/client.ts | 98 | // default scaffold which only sent bodies for POST/PUT/PATCH. | COMMENT |
| MEDIUM | packages/nextdns/client.ts | 84 | // it in a generic error class here (the generator's original scaffold | COMMENT |
| MEDIUM | packages/replyio/index.ts | 444 | // The factory is intentionally non-generic: the generated scaffold uses a | COMMENT |
| MEDIUM | packages/veriphone/index.ts | 169 | // Generator scaffold default: empty options satisfy the generic bound. | COMMENT |
| MEDIUM | packages/habitica/error-handlers.test.ts | 73 | // The scaffold matched 'rate_limited', which Habitica never sends. | COMMENT |
| MEDIUM | packages/serpapi/client.ts | 59 | // it in a generic error class here (the generator's original scaffold | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | packages/googlecalendar/setup.ts | 32 | ### Step 2: Enable the Google Calendar API | COMMENT |
| LOW⚡ | packages/googlecalendar/setup.ts | 42 | ### Step 3: Configure the OAuth Consent Screen | COMMENT |
| LOW⚡ | packages/googlecalendar/setup.ts | 129 | ### Step 9: Get a Public Webhook URL | COMMENT |
| LOW⚡ | packages/googlecalendar/setup.ts | 139 | ### Step 10: Set Up ngrok | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 19 | ### Step 1: Check for an existing GCP project | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 61 | ### Step 4: Create OAuth 2.0 Credentials | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 77 | ### Step 5: Enter Client ID and Client Secret | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 88 | ### Step 6: Get Access Token and Refresh Token (OAuth Playground) | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 106 | ### Step 7: Enter Access Token and Refresh Token | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 117 | ### Step 8: Webhook Setup (Optional) | COMMENT |
| LOW | packages/googlecalendar/setup.ts | 174 | ### Step 11: Create the Calendar Watch Channel | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/python/corsair_cloud/__init__.py | 17 | __all__ = ["CorsairCloud", "CorsairError", "TenantClient", "Manage"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | clients/python/corsair_cloud/__init__.py | 7 | CODE |