* feat(vercel): add complete Vercel integration with 42 API tools
Add Vercel platform management integration covering deployments, projects,
environment variables, domains, DNS records, aliases, edge configs, and
team/user management. All tools use API key authentication with Bearer tokens.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(vercel): add webhook and deployment check tools
Add 8 new Vercel API tools:
- Webhooks: list, create, delete
- Deployment Checks: create, get, list, update, rerequest
Brings total Vercel tools to 50.
* fix(vercel): expand all object and array output definitions
Expand unexpanded output types:
- get_deployment: meta and gitSource objects now have properties
- list_deployment_files: children array now has items definition
- get_team: teamRoles and teamPermissions arrays now have items
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* update icon size, update docs
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix(shortlink): remove isHosted guard from redirects, not available at build time on ECS
* fix(shortlink): use rewrite instead of redirect for Beluga tracking
- Add isEnterpriseMember and canViewUsageInfo flags to subscription permissions
- Hide UsageHeader, CreditBalance, billing date, and usage notifications from enterprise members
- Show only plan name in subscription tab for enterprise members (non-admin)
- Hide usage indicator details (amount, progress pills) from enterprise members
- Team tab already hidden via requiresTeam check in settings modal
Closes#6882
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
* feat(audit-log): add persistent audit log system with comprehensive route instrumentation
* fix(audit-log): address PR review — nullable workspaceId, enum usage, remove redundant queries
- Make audit_log.workspace_id nullable with ON DELETE SET NULL (logs survive workspace/user deletion)
- Make audit_log.actor_id nullable with ON DELETE SET NULL
- Replace all 53 routes' string literal action/resourceType with AuditAction.X and AuditResourceType.X enums
- Fix empty workspaceId ('') → null for OAuth, form, and org routes to avoid FK violations
- Remove redundant DB queries in chat manage route (use checkChatAccess return data)
- Fix organization routes to pass workspaceId: null instead of organizationId
* fix(audit-log): replace remaining workspaceId '' fallbacks with null
* fix(audit-log): credential-set org IDs, workspace deletion FK, actorId fallback, string literal action
* reran migrations
* fix(mcp,audit): tighten env var domain bypass, add post-resolution check, form workspaceId
- Only bypass MCP domain check when env var is in hostname/authority, not path/query
- Add post-resolution validateMcpDomain call in test-connection endpoint
- Match client-side isDomainAllowed to same hostname-only bypass logic
- Return workspaceId from checkFormAccess, use in form audit logs
- Add 49 comprehensive domain-check tests covering all edge cases
* fix(mcp): stateful regex lastIndex bug, RFC 3986 authority parsing
- Remove /g flag from module-level ENV_VAR_PATTERN to avoid lastIndex state
- Create fresh regex instances per call in server-side hasEnvVarInHostname
- Fix authority extraction to terminate at /, ?, or # per RFC 3986
- Prevents bypass via https://evil.com?token={{SECRET}} (no path)
- Add test cases for query-only and fragment-only env var URLs (53 total)
* fix(audit-log): try/catch for never-throw contract, accept null actorName/Email, fix misleading action
- Wrap recordAudit body in try/catch so nanoid() or header extraction can't throw
- Accept string | null for actorName and actorEmail (session.user.name can be null)
- Normalize null -> undefined before insert to match DB column types
- Fix org members route: ORG_MEMBER_ADDED -> ORG_INVITATION_CREATED (sends invite, not adds member)
* improvement(audit-log): add resource names and specific invitation actions
* fix(audit-log): use validated chat record, add mock sync tests
* fix: prevent copilot keyboard shortcuts from triggering when panel is inactive
The OptionsSelector component was capturing keyboard events (1-9 number keys and Enter)
globally on the document, causing accidental option selections when users were
interacting with other parts of the application.
This fix adds a check to only handle keyboard shortcuts when the copilot panel
is the active tab, preventing the shortcuts from interfering with other workflows.
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
* lint
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
Co-authored-by: Waleed Latif <walif6@gmail.com>
* feat(access-control): add ALLOWED_INTEGRATIONS env var for self-hosted block restrictions
* fix(tests): add getAllowedIntegrationsFromEnv mock to agent-handler tests
* fix(access-control): add auth to allowlist endpoint, fix loading state race, use accurate error message
* fix(access-control): remove auth from allowed-integrations endpoint to match models endpoint pattern
* fix(access-control): normalize blockType to lowercase before env allowlist check
* fix(access-control): expose merged allowedIntegrations on config to prevent bypass via direct access
* consolidate merging of allowed blocks so all callers have it by default
* normalize to lower case
* added tests
* added tests, normalize to lower case
* added safety incase userId is missing
* fix failing tests
- Changed default stickinessThreshold from 100 to 30 in use-scroll-management.ts
- Removed explicit stickinessThreshold override (40) from copilot.tsx
- Both copilot and chat now use the same default value of 30
- This makes scrolling less sticky across all copilot message interactions
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
* fix: update i18n.lock
* feat(docs): enhance documentation with new sections on file handling, form deployment, quick reference, agent skills, and A2A integration
* refactor(tool-input): eliminate SyncWrappers, add canonical toggle and dependsOn gating
Replace 17+ individual SyncWrapper components with a single centralized
ToolSubBlockRenderer that bridges the subblock store with StoredTool.params
via synthetic store keys. This reduces ~1000 lines of duplicated wrapper
code and ensures tool-input renders subblock components identically to
the standalone SubBlock path.
- Add ToolSubBlockRenderer with bidirectional store sync
- Add basic/advanced mode toggle (ArrowLeftRight) using collaborative functions
- Add dependsOn gating via useDependsOnGate (fields disable instead of hiding)
- Add paramVisibility field to SubBlockConfig for tool-input visibility control
- Pass canonicalModeOverrides through getSubBlocksForToolInput
- Show (optional) label for non-user-only fields (LLM can inject at runtime)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(tool-input): restore optional indicator, fix folder selector and canonical toggle, extract components
- Attach resolved paramVisibility to subblocks from getSubBlocksForToolInput
- Add labelSuffix prop to SubBlock for "(optional)" badge on user-or-llm params
- Fix folder selector missing for tools with canonicalParamId (e.g. Google Drive)
- Fix canonical toggle not clickable by letting SubBlock handle dependsOn internally
- Extract ParameterWithLabel, ToolSubBlockRenderer, ToolCredentialSelector to components/tools/
- Extract StoredTool interface to types.ts, selection helpers to utils.ts
- Remove dead code (mcpError, refreshTools, oldParamIds, initialParams)
- Strengthen typing: replace any with proper types on icon components and evaluateParameterCondition
* add sibling values to subblock context since subblock store isn't relevant in tool input, and removed unused param
* cleanup
* fix(tool-input): render uncovered tool params alongside subblocks
The SubBlock-first rendering path was hard-returning after rendering
subblocks, so tool params without matching subblocks (like inputMapping
for workflow tools) were never rendered. Now renders subblocks first,
then any remaining displayParams not covered by subblocks via the legacy
ParameterWithLabel fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(tool-input): auto-refresh workflow inputs after redeploy
After redeploying a child workflow via the stale badge, the workflow
state cache was not invalidated, so WorkflowInputMapperInput kept
showing stale input fields until page refresh. Now invalidates
workflowKeys.state on deploy success.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(tool-input): correct workflow selector visibility and tighten (optional) spacing
- Set workflowId param to user-only in workflow_executor tool config
so "Select Workflow" no longer shows "(optional)" indicator
- Tighten (optional) label spacing with -ml-[3px] to counteract
parent Label's gap-[6px], making it feel inline with the label text
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(tool-input): align (optional) text to baseline instead of center
Use items-baseline instead of items-center on Label flex containers
so the smaller (optional) text aligns with the label text baseline
rather than sitting slightly below it.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(tool-input): increase top padding of expanded tool body
Bump the expanded tool body container's top padding from 8px to 12px
for more breathing room between the header bar and the first parameter.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(tool-input): apply extra top padding only to SubBlock-first path
Revert container padding to py-[8px] (MCP tools were correct).
Wrap SubBlock-first output in a div with pt-[4px] so only registry
tools get extra breathing room from the container top.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(tool-input): increase gap between SubBlock params for visual clarity
SubBlock's internal gap (10px between label and input) matched the
between-parameter gap (10px), making them indistinguishable. Increase
the between-parameter gap to 14px so consecutive parameters are
visually distinct, matching the separation seen in ParameterWithLabel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix spacing and optional tag
* update styling + move predeploy checks earlier for first time deploys
* update change detection to account for synthetic tool ids
* fix remaining blocks who had files visibility set to hidden
* cleanup
* add catch
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix(agent): always fetch latest custom tool from DB when customToolId is present
* test(agent): use generic test data for customToolId resolution tests
* fix(agent): mock buildAuthHeaders in tests for CI compatibility
* remove inline mocks in favor of sim/testing ones
* fix(terminal): reconnect to running executions after page refresh
* fix(terminal): use ExecutionEvent type instead of any in reconnection stream
* fix(execution): type event buffer with ExecutionEvent instead of Record<string, unknown>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(execution): validate fromEventId query param in reconnection endpoint
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix some bugs
* fix(variables): fix tag dropdown and cursor alignment in variables block (#3199)
* feat(confluence): added list space labels, delete label, delete page prop (#3201)
* updated route
* ack comments
* fix(execution): reset execution state in reconnection cleanup to unblock re-entry
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(execution): restore running entries when reconnection is interrupted by navigation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* done
* remove cast in ioredis types
* ack PR comments
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Siddharth Ganesan <siddharthganesan@gmail.com>
* feat(providers): add Gemini Deep Research via Interactions API
* fix(providers): hide memory UI for deep research models
* feat(providers): add multi-turn support and token logging for deep research
* fix(providers): only collect user messages as deep research input
* fix(providers): forward previousInteractionId to provider request
* fix(blocks): hide memory child fields for deep research models
* remove memory params from models that don't support it in provider requests
* update blog