Feat: add slack integration

This commit is contained in:
Manoj K 2025-07-24 15:30:08 +05:30
parent a66a472112
commit 3f0a4b38ec
16 changed files with 130 additions and 885 deletions

View File

@ -1,4 +1,4 @@
VERSION=0.1.10
VERSION=0.1.11

View File

@ -1,21 +1,38 @@
import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server";
import { callbackHandler } from "~/services/oauth/oauth.server";
import type { CallbackParams } from "~/services/oauth/oauth-utils.server";
import { type LoaderFunctionArgs } from "@remix-run/node";
// This route handles the OAuth callback, similar to the NestJS controller
const { loader } = createActionApiRoute(
{
allowJWT: false,
corsStrategy: "all",
},
async ({ request }) => {
export async function loader({ request }: LoaderFunctionArgs) {
// Handle CORS preflight
if (request.method.toUpperCase() === "OPTIONS") {
return new Response(null, {
status: 200,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
},
});
}
// Only allow GET requests
if (request.method.toUpperCase() !== "GET") {
return new Response("Method Not Allowed", {
status: 405,
headers: { Allow: "GET" }
});
}
try {
const url = new URL(request.url);
const params: CallbackParams = {};
for (const [key, value] of url.searchParams.entries()) {
params[key] = value;
}
return await callbackHandler(params);
},
);
export { loader };
} catch (error) {
console.error("OAuth callback error:", error);
return new Response("Internal Server Error", { status: 500 });
}
}

View File

@ -271,10 +271,33 @@ export const fetchAndSaveStdioIntegrations = async () => {
continue;
}
const content = await response.text();
// Check if the response is binary (executable) or text
const contentType = response.headers.get("content-type");
const isBinary =
contentType &&
(contentType.includes("application/octet-stream") ||
contentType.includes("application/executable") ||
contentType.includes("application/x-executable") ||
contentType.includes("binary") ||
!contentType.includes("text/"));
let content: string | Buffer;
if (isBinary) {
// Handle binary files
const arrayBuffer = await response.arrayBuffer();
content = Buffer.from(arrayBuffer);
} else {
// Handle text files
content = await response.text();
}
// Save the content to the target file
fs.writeFileSync(targetFile, content);
if (typeof content === "string") {
fs.writeFileSync(targetFile, content);
} else {
fs.writeFileSync(targetFile, content);
}
// Make the file executable if it's a script
if (process.platform !== "win32") {

View File

@ -19,8 +19,21 @@ export const createIntegrationAccount = async ({
config?: Record<string, any>;
settings?: Record<string, any>;
}) => {
return prisma.integrationAccount.create({
data: {
return prisma.integrationAccount.upsert({
where: {
accountId_integrationDefinitionId_workspaceId: {
accountId,
integrationDefinitionId,
workspaceId,
},
},
update: {
integrationConfiguration: config || {},
settings: settings || {},
isActive: true,
deleted: null,
},
create: {
accountId,
integrationDefinitionId,
integratedById: userId,

View File

@ -43,7 +43,7 @@ services:
postgres:
container_name: core-postgres
image: postgres:15
image: redplanethq/postgres:0.1.0
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

View File

@ -1,28 +0,0 @@
# Automation Workflow Use Cases
## Persona-Based Automation Workflows
This document outlines high-impact automation workflows for different personas using our supported integrations: Slack, Github, Google Drive, Linear, Calendar, Claude Code, and Gmail.
| Rule Name | Description | Persona | Integrations | Importance |
|-----------|-------------|---------|-------------|------------|
| **Code Review Prioritizer** | Automatically prioritize and assign code reviews based on PR size, dependencies, and team availability | Developer | Github, Slack, Calendar | 9.7 |
| **PR to Deployment Tracker** | Track PRs from submission to deployment, notifying stakeholders at each stage with estimated completion times | Developer | Github, Slack, Linear | 9.5 |
| **Standup Automator** | Collect daily updates from commit messages and Linear tasks, post summaries to team Slack channel before standups | Developer | Github, Linear, Slack | 9.3 |
| **Technical Debt Tracker** | Auto-identify technical debt from code comments and Linear tickets, creating weekly summaries with prioritization suggestions | Developer | Github, Linear, Slack | 9.2 |
| **Code Documentation Generator** | Use Claude Code to auto-generate documentation from code changes, adding to Google Drive knowledge base | Developer | Github, Claude Code, Google Drive | 9.1 |
| **Sprint Planning Assistant** | Collect Linear backlog items, analyze GitHub PRs, and create pre-populated sprint planning documents | Product Manager | Linear, Github, Google Drive | 9.8 |
| **Feature Impact Dashboard** | Track feature usage metrics from analytics, connect to Linear tickets, and generate impact reports | Product Manager | Linear, Gmail, Google Drive | 9.6 |
| **Customer Feedback Connector** | Route customer feedback from Gmail to appropriate Linear tickets and notify product team in Slack | Product Manager | Gmail, Linear, Slack | 9.5 |
| **Release Notes Automator** | Generate release notes from Linear tickets and GitHub PRs, distribute via Slack and email | Product Manager | Linear, Github, Slack, Gmail | 9.4 |
| **Meeting Effectiveness Tracker** | Monitor calendar events, auto-document action items in Linear, and track follow-through | Product Manager | Calendar, Linear, Slack | 9.2 |
| **Investor Update Compiler** | Aggregate key metrics from various sources into monthly investor update templates | Founder | Google Drive, Linear, Gmail | 9.9 |
| **Competitive Intelligence Monitor** | Monitor competitor activities from various sources, creating summaries with Claude Code | Founder | Gmail, Claude Code, Google Drive | 9.7 |
| **Strategic Alignment Tracker** | Connect company OKRs to actual work items in Linear, creating executive dashboards | Founder | Linear, Google Drive, Slack | 9.6 |
| **Board Meeting Automator** | Collect data for board meetings, pre-populate slides, and send reminders with preparation materials | Founder | Calendar, Google Drive, Gmail | 9.5 |
| **Team Pulse Monitor** | Analyze communication patterns and work distribution to identify burnout risks | Founder | Slack, Github, Linear | 9.3 |
| **Deal Stage Progression** | Move deals through pipeline stages based on email interactions and scheduled meetings | Sales | Gmail, Calendar, Slack | 9.8 |
| **Proposal Generator** | Auto-generate customized proposals using templates and client-specific data | Sales | Google Drive, Gmail, Claude Code | 9.7 |
| **Meeting Follow-up Orchestrator** | Schedule and personalize follow-ups based on meeting notes and conversation topics | Sales | Calendar, Gmail, Slack | 9.6 |
| **Competitive Deal Intelligence** | Alert sales team when competitors are mentioned in prospect communications | Sales | Gmail, Slack, Claude Code | 9.4 |
| **Customer Success Handoff** | Automate post-sale transition with documentation, training materials, and onboarding schedules | Sales | Gmail, Google Drive, Calendar | 9.3 |

View File

@ -1,207 +0,0 @@
# OAuth Integration Webhook Implementation
This document describes the implementation of webhook notifications for OAuth applications when users connect new integrations, following the existing trigger-based architecture.
## Architecture
The implementation follows the established pattern used in the Echo system:
- **Integration Creation**: Happens in `integration-run` trigger
- **Webhook Delivery**: Uses dedicated trigger task for asynchronous processing
- **Error Handling**: Non-blocking - webhook failures don't affect integration creation
## Implementation Components
### 1. OAuth Integration Webhook Delivery Task
**File**: `apps/webapp/app/trigger/webhooks/oauth-integration-webhook-delivery.ts`
This is a dedicated trigger task that handles webhook delivery to OAuth applications:
```typescript
export const oauthIntegrationWebhookTask = task({
id: "oauth-integration-webhook-delivery",
queue: oauthIntegrationWebhookQueue,
run: async (payload: OAuthIntegrationWebhookPayload) => {
// Implementation
},
});
```
**Key Features**:
- Finds OAuth clients with `integration` scope for the user
- Sends webhook notifications with integration details
- Includes HMAC signature verification
- Provides detailed delivery status tracking
- Non-blocking error handling
### 2. Integration into Integration-Run Trigger
**File**: `apps/webapp/app/trigger/integrations/integration-run.ts`
Modified the `handleAccountMessage` function to trigger webhook notifications:
```typescript
async function handleAccountMessage(...) {
// Create integration account
const integrationAccount = await createIntegrationAccount({...});
// Trigger OAuth integration webhook notifications
try {
await triggerOAuthIntegrationWebhook(integrationAccount.id, userId);
} catch (error) {
// Log error but don't fail integration creation
}
return integrationAccount;
}
```
**Integration Points**:
- Triggered after successful integration account creation
- Works for all integration types (OAuth, API key, MCP)
- Maintains existing integration creation flow
## Webhook Flow
### 1. Integration Connection
When a user connects a new integration:
1. Integration runs through `IntegrationEventType.SETUP`
2. CLI returns "account" message
3. `handleAccountMessage` creates integration account
4. `triggerOAuthIntegrationWebhook` is called
5. Webhook delivery task is queued
### 2. Webhook Delivery
The webhook delivery task:
1. Queries OAuth clients with:
- `integration` scope in `allowedScopes`
- Active `OAuthIntegrationGrant` for the user
- Configured `webhookUrl`
2. Sends HTTP POST to each webhook URL
3. Logs delivery results
### 3. Webhook Payload
```json
{
"event": "integration.connected",
"user_id": "user_uuid",
"integration": {
"id": "integration_account_uuid",
"provider": "linear",
"account_id": "external_account_id",
"mcp_endpoint": "mcp://core.ai/linear/external_account_id",
"name": "Linear",
"icon": "https://example.com/linear-icon.png"
},
"timestamp": "2024-01-15T10:30:00.000Z"
}
```
## Security Features
### HMAC Signature
If OAuth client has `webhookSecret` configured:
```typescript
const signature = crypto
.createHmac("sha256", client.webhookSecret)
.update(payloadString)
.digest("hex");
headers["X-Webhook-Secret"] = signature;
```
### Headers
- `Content-Type: application/json`
- `User-Agent: Echo-OAuth-Webhooks/1.0`
- `X-Webhook-Delivery: ${deliveryId}`
- `X-Webhook-Event: integration.connected`
- `X-Webhook-Secret: ${signature}` (if secret configured)
## Error Handling
### Non-Blocking Design
- Webhook delivery failures do NOT affect integration creation
- Errors are logged but don't throw exceptions
- Integration process continues normally
### Retry Strategy
Currently, the system uses Trigger.dev's built-in retry mechanism:
- Failed webhook deliveries will be retried automatically
- Exponential backoff for temporary failures
- Dead letter queue for permanent failures
### Logging
Comprehensive logging includes:
- Integration account details
- OAuth client information
- HTTP response status and body
- Error messages and stack traces
- Delivery success/failure counts
## Database Requirements
The implementation requires these existing database relationships:
### OAuthClient
- `webhookUrl`: Target URL for notifications
- `webhookSecret`: Optional HMAC secret
- `allowedScopes`: Must include "integration"
### OAuthIntegrationGrant
- Links OAuth clients to users
- `isActive`: Must be true for notifications
- `userId`: Target user for the integration
### IntegrationAccount
- Created during integration setup
- Includes `integrationDefinition` relationship
- Contains provider-specific configuration
## Testing
To test the webhook delivery:
1. **Create OAuth Client** with integration scope:
```sql
UPDATE "OAuthClient"
SET "allowedScopes" = 'profile,email,openid,integration',
"webhookUrl" = 'https://your-webhook-endpoint.com/webhooks'
WHERE "clientId" = 'your-client-id';
```
2. **Grant Integration Access** through OAuth flow with `integration` scope
3. **Connect Integration** (Linear, Slack, etc.) - webhooks will be triggered automatically
4. **Monitor Logs** for delivery status and any errors
## Advantages of This Approach
1. **Follows Existing Patterns**: Uses the same trigger-based architecture as other webhook systems
2. **Scalable**: Leverages Trigger.dev's queue system for handling high volumes
3. **Reliable**: Built-in retry and error handling
4. **Non-Blocking**: Integration creation is never blocked by webhook issues
5. **Comprehensive**: Works with all integration types and OAuth flows
6. **Secure**: Includes HMAC signature verification and proper headers
7. **Observable**: Detailed logging for monitoring and debugging
This implementation ensures that OAuth applications are immediately notified when users connect new integrations, while maintaining the reliability and scalability of the existing system architecture.

View File

@ -1,159 +0,0 @@
# Webhook Delivery Architecture
This document describes the refactored webhook delivery system that eliminates code duplication by using common utilities.
## Architecture Overview
The webhook delivery system now follows a clean separation of concerns:
1. **Common Utilities** (`webhook-delivery-utils.ts`) - Shared HTTP delivery logic
2. **Activity Webhooks** (`webhook-delivery.ts`) - Workspace-based activity notifications
3. **OAuth Integration Webhooks** (`oauth-integration-webhook-delivery.ts`) - OAuth app integration notifications
## Common Utilities (`webhook-delivery-utils.ts`)
### Core Function: `deliverWebhook()`
Handles the common HTTP delivery logic for both webhook types:
```typescript
export async function deliverWebhook(params: WebhookDeliveryParams): Promise<{
success: boolean;
deliveryResults: DeliveryResult[];
summary: { total: number; successful: number; failed: number };
}>;
```
**Features:**
- Generic payload support (works with any webhook structure)
- Configurable User-Agent strings
- HMAC signature verification with different header formats
- 30-second timeout
- Comprehensive error handling and logging
- Detailed delivery results
### Helper Function: `prepareWebhookTargets()`
Converts simple webhook configurations to the standardized target format:
```typescript
export function prepareWebhookTargets(
webhooks: Array<{ url: string; secret?: string | null }>
): WebhookTarget[];
```
## Activity Webhooks (`webhook-delivery.ts`)
**Purpose:** Send notifications to workspace webhook configurations when activities are created.
**Payload Structure:**
```json
{
"event": "activity.created",
"timestamp": "2024-01-15T10:30:00.000Z",
"data": {
"id": "activity_id",
"text": "Activity content",
"sourceURL": "https://source.url",
"integrationAccount": { ... },
"workspace": { ... }
}
}
```
**Key Features:**
- Uses `X-Hub-Signature-256` header for HMAC verification
- Logs delivery results to `WebhookDeliveryLog` table
- Targets all active workspace webhook configurations
## OAuth Integration Webhooks (`oauth-integration-webhook-delivery.ts`)
**Purpose:** Notify OAuth applications when users connect new integrations.
**Payload Structure:**
```json
{
"event": "integration.connected",
"user_id": "user_uuid",
"integration": {
"id": "integration_account_id",
"provider": "linear",
"account_id": "external_account_id",
"mcp_endpoint": "mcp://core.ai/linear/external_account_id",
"name": "Linear",
"icon": "https://example.com/icon.png"
},
"timestamp": "2024-01-15T10:30:00.000Z"
}
```
**Key Features:**
- Uses `X-Webhook-Secret` header for HMAC verification
- Custom User-Agent: `Echo-OAuth-Webhooks/1.0`
- Targets OAuth clients with `integration` scope and webhook URLs
## Shared Features
Both webhook types benefit from the common utilities:
### Security
- HMAC-SHA256 signature verification
- Configurable secrets per webhook target
- Proper HTTP headers for identification
### Reliability
- 30-second request timeout
- Comprehensive error handling
- Non-blocking webhook failures
### Observability
- Detailed logging at each step
- Delivery success/failure tracking
- Response status and body capture (limited)
### Performance
- Parallel webhook delivery
- Efficient target preparation
- Minimal memory footprint
## Integration Points
### Activity Webhooks
- Triggered from: `apps/webapp/app/routes/api.v1.activity.tsx`
- Function: `triggerWebhookDelivery(activityId, workspaceId)`
### OAuth Integration Webhooks
- Triggered from: `apps/webapp/app/trigger/integrations/integration-run.ts`
- Function: `triggerOAuthIntegrationWebhook(integrationAccountId, userId)`
## Benefits of This Architecture
1. **Code Reuse**: Common HTTP delivery logic eliminates duplication
2. **Maintainability**: Single place to update delivery logic
3. **Consistency**: Same headers, timeouts, and error handling across webhook types
4. **Flexibility**: Easy to add new webhook types by reusing common utilities
5. **Testing**: Easier to test common logic independently
6. **Security**: Consistent HMAC implementation across all webhook types
## Adding New Webhook Types
To add a new webhook type:
1. Create a new trigger task file (e.g., `new-webhook-delivery.ts`)
2. Define your payload structure
3. Use `deliverWebhook()` with your payload and targets
4. Add your event type to `WebhookEventType` in utils
5. Update HMAC header logic in `deliverWebhook()` if needed
This architecture provides a solid foundation for webhook delivery that can easily scale to support additional webhook types while maintaining code quality and consistency.

View File

@ -58,6 +58,6 @@
"commander": "^12.0.0",
"openai": "^4.0.0",
"react-query": "^3.39.3",
"@redplanethq/sdk": "0.1.0"
"@redplanethq/sdk": "0.1.1"
}
}
}

View File

@ -9,8 +9,8 @@ importers:
.:
dependencies:
'@redplanethq/sdk':
specifier: 0.1.0
version: 0.1.0
specifier: 0.1.1
version: 0.1.1
axios:
specifier: ^1.7.9
version: 1.9.0
@ -33,18 +33,6 @@ importers:
'@babel/preset-typescript':
specifier: ^7.26.0
version: 7.27.1(@babel/core@7.27.1)
'@rollup/plugin-commonjs':
specifier: ^28.0.1
version: 28.0.3(rollup@4.40.2)
'@rollup/plugin-json':
specifier: ^6.1.0
version: 6.1.0(rollup@4.40.2)
'@rollup/plugin-node-resolve':
specifier: ^15.3.0
version: 15.3.1(rollup@4.40.2)
'@rollup/plugin-replace':
specifier: ^5.0.7
version: 5.0.7(rollup@4.40.2)
'@types/node':
specifier: ^18.0.20
version: 18.19.100
@ -56,19 +44,19 @@ importers:
version: 10.1.3(eslint@9.26.0)
eslint-import-resolver-alias:
specifier: ^1.1.2
version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0))
version: 1.1.2(eslint-plugin-import@2.31.0(eslint@9.26.0))
eslint-plugin-import:
specifier: ^2.31.0
version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)
version: 2.31.0(eslint@9.26.0)
eslint-plugin-jest:
specifier: ^27.9.0
version: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)
version: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)
eslint-plugin-prettier:
specifier: ^5.2.1
version: 5.4.0(eslint-config-prettier@10.1.3(eslint@9.26.0))(eslint@9.26.0)(prettier@3.5.3)
eslint-plugin-unused-imports:
specifier: ^2.0.0
version: 2.0.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)
version: 2.0.0(@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)
ncc:
specifier: 0.3.6
version: 0.3.6
@ -78,18 +66,6 @@ importers:
rimraf:
specifier: ^3.0.2
version: 3.0.2
rollup:
specifier: ^4.28.1
version: 4.40.2
rollup-plugin-node-polyfills:
specifier: ^0.2.1
version: 0.2.1
rollup-plugin-terser:
specifier: ^7.0.2
version: 7.0.2(rollup@4.40.2)
rollup-plugin-typescript2:
specifier: ^0.34.1
version: 0.34.1(rollup@4.40.2)(typescript@4.9.5)
tslib:
specifier: ^2.8.1
version: 2.8.1
@ -459,9 +435,6 @@ packages:
resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
engines: {node: '>=6.0.0'}
'@jridgewell/source-map@0.3.6':
resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
@ -492,59 +465,10 @@ packages:
resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
'@redplanethq/sdk@0.1.0':
resolution: {integrity: sha512-RmPfT9XESjTSMLlAMkolZEF28PvGo5hlwrG75JQy1tAZkvaTHzC7A2mEAMbsBvOMrJuUztL3NtCmVF//C/C/+A==}
'@redplanethq/sdk@0.1.1':
resolution: {integrity: sha512-tfR1c9p7vNeCL5jsF9QlEZcRFLsihaHe/ZQWVKZYXzAZ6GugoIFBaayGfVvjNjyEnN3nlrl3usKBX+hhaKzg0g==}
engines: {node: '>=18.0.0'}
'@rollup/plugin-commonjs@28.0.3':
resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==}
engines: {node: '>=16.0.0 || 14 >= 14.17'}
peerDependencies:
rollup: ^2.68.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/plugin-json@6.1.0':
resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/plugin-node-resolve@15.3.1':
resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^2.78.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/plugin-replace@5.0.7':
resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/pluginutils@4.2.1':
resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
engines: {node: '>= 8.0.0'}
'@rollup/pluginutils@5.1.4':
resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.40.2':
resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==}
cpu: [arm]
@ -663,9 +587,6 @@ packages:
'@types/node@18.19.100':
resolution: {integrity: sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==}
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
'@types/semver@7.7.0':
resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
@ -680,16 +601,6 @@ packages:
typescript:
optional: true
'@typescript-eslint/parser@5.62.0':
resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
'@typescript-eslint/scope-manager@5.62.0':
resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -845,9 +756,6 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
bundle-require@5.1.0:
resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -912,16 +820,10 @@ packages:
resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==}
engines: {node: '>=20'}
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
commondir@1.0.1:
resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@ -991,10 +893,6 @@ packages:
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
deepmerge@4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
define-data-property@1.1.4:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
@ -1222,12 +1120,6 @@ packages:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
estree-walker@0.6.1:
resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
@ -1297,14 +1189,6 @@ packages:
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
engines: {node: '>= 0.8'}
find-cache-dir@3.3.2:
resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
engines: {node: '>=8'}
find-up@4.1.0:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
@ -1352,10 +1236,6 @@ packages:
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
engines: {node: '>= 0.8'}
fs-extra@10.1.0:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
@ -1426,9 +1306,6 @@ packages:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
@ -1553,9 +1430,6 @@ packages:
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
engines: {node: '>= 0.4'}
is-module@1.0.0:
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
is-number-object@1.1.1:
resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
engines: {node: '>= 0.4'}
@ -1567,9 +1441,6 @@ packages:
is-promise@4.0.0:
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
is-regex@1.2.1:
resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
engines: {node: '>= 0.4'}
@ -1615,10 +1486,6 @@ packages:
jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
jest-worker@26.6.2:
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
engines: {node: '>= 10.13.0'}
joycon@3.1.1:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'}
@ -1656,9 +1523,6 @@ packages:
engines: {node: '>=6'}
hasBin: true
jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
@ -1677,10 +1541,6 @@ packages:
resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
locate-path@6.0.0:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
@ -1701,16 +1561,6 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
magic-string@0.25.9:
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
magic-string@0.30.17:
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
make-dir@3.1.0:
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
engines: {node: '>=8'}
match-sorter@6.3.4:
resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==}
@ -1726,9 +1576,6 @@ packages:
resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
engines: {node: '>=18'}
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
@ -1876,26 +1723,14 @@ packages:
resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
engines: {node: '>= 0.4'}
p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
engines: {node: '>=6'}
p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
p-locate@4.1.0:
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
engines: {node: '>=8'}
p-locate@5.0.0:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
@ -1953,10 +1788,6 @@ packages:
resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
engines: {node: '>=16.20.0'}
pkg-dir@4.2.0:
resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
engines: {node: '>=8'}
possible-typed-array-names@1.1.0:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
@ -2014,9 +1845,6 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
@ -2088,28 +1916,6 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
rollup-plugin-inject@3.0.2:
resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==}
deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.
rollup-plugin-node-polyfills@0.2.1:
resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==}
rollup-plugin-terser@7.0.2:
resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
peerDependencies:
rollup: ^2.0.0
rollup-plugin-typescript2@0.34.1:
resolution: {integrity: sha512-P4cHLtGikESmqi1CA+tdMDUv8WbQV48mzPYt77TSTOPJpERyZ9TXdDgjSDix8Fkqce6soYz3+fa4lrC93IEkcw==}
peerDependencies:
rollup: '>=1.26.3'
typescript: '>=2.4.0'
rollup-pluginutils@2.8.2:
resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
rollup@4.40.2:
resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@ -2159,9 +1965,6 @@ packages:
resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
engines: {node: '>= 18'}
serialize-javascript@4.0.0:
resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
serve-static@2.2.0:
resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
engines: {node: '>= 18'}
@ -2217,21 +2020,10 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
source-map@0.8.0-beta.0:
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
engines: {node: '>= 8'}
sourcemap-codec@1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
statuses@2.0.1:
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
engines: {node: '>= 0.8'}
@ -2289,11 +2081,6 @@ packages:
resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==}
engines: {node: ^14.18.0 || >=16.0.0}
terser@5.39.0:
resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==}
engines: {node: '>=10'}
hasBin: true
thenify-all@1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'}
@ -2410,10 +2197,6 @@ packages:
undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
unload@2.2.0:
resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==}
@ -2861,11 +2644,6 @@ snapshots:
'@jridgewell/set-array@1.2.1': {}
'@jridgewell/source-map@0.3.6':
dependencies:
'@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/trace-mapping@0.3.25':
@ -2905,58 +2683,10 @@ snapshots:
'@pkgr/core@0.2.4': {}
'@redplanethq/sdk@0.1.0':
'@redplanethq/sdk@0.1.1':
dependencies:
commander: 14.0.0
'@rollup/plugin-commonjs@28.0.3(rollup@4.40.2)':
dependencies:
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
commondir: 1.0.1
estree-walker: 2.0.2
fdir: 6.4.4(picomatch@4.0.2)
is-reference: 1.2.1
magic-string: 0.30.17
picomatch: 4.0.2
optionalDependencies:
rollup: 4.40.2
'@rollup/plugin-json@6.1.0(rollup@4.40.2)':
dependencies:
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
optionalDependencies:
rollup: 4.40.2
'@rollup/plugin-node-resolve@15.3.1(rollup@4.40.2)':
dependencies:
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
is-module: 1.0.0
resolve: 1.22.10
optionalDependencies:
rollup: 4.40.2
'@rollup/plugin-replace@5.0.7(rollup@4.40.2)':
dependencies:
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
magic-string: 0.30.17
optionalDependencies:
rollup: 4.40.2
'@rollup/pluginutils@4.2.1':
dependencies:
estree-walker: 2.0.2
picomatch: 2.3.1
'@rollup/pluginutils@5.1.4(rollup@4.40.2)':
dependencies:
'@types/estree': 1.0.7
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
rollup: 4.40.2
'@rollup/rollup-android-arm-eabi@4.40.2':
optional: true
@ -3034,14 +2764,11 @@ snapshots:
dependencies:
undici-types: 5.26.5
'@types/resolve@1.20.2': {}
'@types/semver@7.7.0': {}
'@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)':
'@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5)':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/type-utils': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
'@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
@ -3058,19 +2785,6 @@ snapshots:
- supports-color
optional: true
'@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5)':
dependencies:
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5)
debug: 4.4.0
eslint: 9.26.0
optionalDependencies:
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
optional: true
'@typescript-eslint/scope-manager@5.62.0':
dependencies:
'@typescript-eslint/types': 5.62.0
@ -3280,8 +2994,6 @@ snapshots:
node-releases: 2.0.19
update-browserslist-db: 1.1.3(browserslist@4.24.5)
buffer-from@1.1.2: {}
bundle-require@5.1.0(esbuild@0.25.4):
dependencies:
esbuild: 0.25.4
@ -3337,12 +3049,8 @@ snapshots:
commander@14.0.0: {}
commander@2.20.3: {}
commander@4.1.1: {}
commondir@1.0.1: {}
concat-map@0.0.1: {}
consola@3.4.2: {}
@ -3400,8 +3108,6 @@ snapshots:
deep-is@0.1.4: {}
deepmerge@4.3.1: {}
define-data-property@1.1.4:
dependencies:
es-define-property: 1.0.1
@ -3563,9 +3269,9 @@ snapshots:
dependencies:
eslint: 9.26.0
eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)):
eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(eslint@9.26.0)):
dependencies:
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)
eslint-plugin-import: 2.31.0(eslint@9.26.0)
eslint-import-resolver-node@0.3.9:
dependencies:
@ -3575,17 +3281,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0):
eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.26.0):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
eslint: 9.26.0
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0):
eslint-plugin-import@2.31.0(eslint@9.26.0):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@ -3596,7 +3301,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.26.0
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0)
eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.26.0)
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@ -3607,19 +3312,17 @@ snapshots:
semver: 6.3.1
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5):
eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5):
dependencies:
'@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
eslint: 9.26.0
optionalDependencies:
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)
'@typescript-eslint/eslint-plugin': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
transitivePeerDependencies:
- supports-color
- typescript
@ -3633,12 +3336,12 @@ snapshots:
optionalDependencies:
eslint-config-prettier: 10.1.3(eslint@9.26.0)
eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0):
eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0):
dependencies:
eslint: 9.26.0
eslint-rule-composer: 0.3.0
optionalDependencies:
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)
'@typescript-eslint/eslint-plugin': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
eslint-rule-composer@0.3.0: {}
@ -3716,10 +3419,6 @@ snapshots:
estraverse@5.3.0: {}
estree-walker@0.6.1: {}
estree-walker@2.0.2: {}
esutils@2.0.3: {}
etag@1.8.1: {}
@ -3811,17 +3510,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
find-cache-dir@3.3.2:
dependencies:
commondir: 1.0.1
make-dir: 3.1.0
pkg-dir: 4.2.0
find-up@4.1.0:
dependencies:
locate-path: 5.0.0
path-exists: 4.0.0
find-up@5.0.0:
dependencies:
locate-path: 6.0.0
@ -3863,12 +3551,6 @@ snapshots:
fresh@2.0.0: {}
fs-extra@10.1.0:
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.1.0
universalify: 2.0.1
fs.realpath@1.0.0: {}
fsevents@2.3.3:
@ -3959,8 +3641,6 @@ snapshots:
gopd@1.2.0: {}
graceful-fs@4.2.11: {}
graphemer@1.4.0:
optional: true
@ -4087,8 +3767,6 @@ snapshots:
is-map@2.0.3: {}
is-module@1.0.0: {}
is-number-object@1.1.1:
dependencies:
call-bound: 1.0.4
@ -4098,10 +3776,6 @@ snapshots:
is-promise@4.0.0: {}
is-reference@1.2.1:
dependencies:
'@types/estree': 1.0.7
is-regex@1.2.1:
dependencies:
call-bound: 1.0.4
@ -4151,12 +3825,6 @@ snapshots:
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
jest-worker@26.6.2:
dependencies:
'@types/node': 18.19.100
merge-stream: 2.0.0
supports-color: 7.2.0
joycon@3.1.1: {}
js-sha3@0.8.0: {}
@ -4181,12 +3849,6 @@ snapshots:
json5@2.2.3: {}
jsonfile@6.1.0:
dependencies:
universalify: 2.0.1
optionalDependencies:
graceful-fs: 4.2.11
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
@ -4202,10 +3864,6 @@ snapshots:
load-tsconfig@0.2.5: {}
locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
locate-path@6.0.0:
dependencies:
p-locate: 5.0.0
@ -4224,18 +3882,6 @@ snapshots:
dependencies:
yallist: 3.1.1
magic-string@0.25.9:
dependencies:
sourcemap-codec: 1.4.8
magic-string@0.30.17:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
make-dir@3.1.0:
dependencies:
semver: 6.3.1
match-sorter@6.3.4:
dependencies:
'@babel/runtime': 7.27.1
@ -4247,8 +3893,6 @@ snapshots:
merge-descriptors@2.0.0: {}
merge-stream@2.0.0: {}
merge2@1.4.1: {}
micromatch@4.0.8:
@ -4400,24 +4044,14 @@ snapshots:
object-keys: 1.1.1
safe-push-apply: 1.0.0
p-limit@2.3.0:
dependencies:
p-try: 2.2.0
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
p-locate@4.1.0:
dependencies:
p-limit: 2.3.0
p-locate@5.0.0:
dependencies:
p-limit: 3.1.0
p-try@2.2.0: {}
package-json-from-dist@1.0.1: {}
parent-module@1.0.1:
@ -4453,10 +4087,6 @@ snapshots:
pkce-challenge@5.0.0: {}
pkg-dir@4.2.0:
dependencies:
find-up: 4.1.0
possible-typed-array-names@1.1.0: {}
postcss-load-config@6.0.1(postcss@8.5.3)(yaml@2.7.1):
@ -4496,10 +4126,6 @@ snapshots:
queue-microtask@1.2.3: {}
randombytes@2.1.0:
dependencies:
safe-buffer: 5.2.1
range-parser@1.2.1: {}
raw-body@3.0.0:
@ -4572,38 +4198,6 @@ snapshots:
dependencies:
glob: 7.2.3
rollup-plugin-inject@3.0.2:
dependencies:
estree-walker: 0.6.1
magic-string: 0.25.9
rollup-pluginutils: 2.8.2
rollup-plugin-node-polyfills@0.2.1:
dependencies:
rollup-plugin-inject: 3.0.2
rollup-plugin-terser@7.0.2(rollup@4.40.2):
dependencies:
'@babel/code-frame': 7.27.1
jest-worker: 26.6.2
rollup: 4.40.2
serialize-javascript: 4.0.0
terser: 5.39.0
rollup-plugin-typescript2@0.34.1(rollup@4.40.2)(typescript@4.9.5):
dependencies:
'@rollup/pluginutils': 4.2.1
find-cache-dir: 3.3.2
fs-extra: 10.1.0
rollup: 4.40.2
semver: 7.7.1
tslib: 2.8.1
typescript: 4.9.5
rollup-pluginutils@2.8.2:
dependencies:
estree-walker: 0.6.1
rollup@4.40.2:
dependencies:
'@types/estree': 1.0.7
@ -4693,10 +4287,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
serialize-javascript@4.0.0:
dependencies:
randombytes: 2.1.0
serve-static@2.2.0:
dependencies:
encodeurl: 2.0.0
@ -4771,19 +4361,10 @@ snapshots:
source-map-js@1.2.1:
optional: true
source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
source-map@0.6.1: {}
source-map@0.8.0-beta.0:
dependencies:
whatwg-url: 7.1.0
sourcemap-codec@1.4.8: {}
statuses@2.0.1: {}
string-width@4.2.3:
@ -4854,13 +4435,6 @@ snapshots:
'@pkgr/core': 0.2.4
tslib: 2.8.1
terser@5.39.0:
dependencies:
'@jridgewell/source-map': 0.3.6
acorn: 8.14.1
commander: 2.20.3
source-map-support: 0.5.21
thenify-all@1.6.0:
dependencies:
thenify: 3.3.1
@ -5000,8 +4574,6 @@ snapshots:
undici-types@5.26.5: {}
universalify@2.0.1: {}
unload@2.2.0:
dependencies:
'@babel/runtime': 7.27.1

View File

@ -5,10 +5,11 @@
"icon": "slack",
"mcp": {
"type": "stdio",
"url": "",
"args": [ ],
"url": "https://integrations.heysol.ai/slack/mcp/slack-mcp-server",
"args": [],
"env": {
"SLACK_MCP_XOXP_TOKEN": "${config:access_token}"
"SLACK_MCP_XOXP_TOKEN": "${config:access_token}",
"SLACK_MCP_ADD_MESSAGE_TOOL": true
}
},
"auth": {

View File

@ -1,9 +1,6 @@
import axios from 'axios';
export async function integrationCreate(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
data: any,
integrationDefinition: any,
) {
const { oauthResponse } = data;
const integrationConfiguration = {
@ -14,14 +11,14 @@ export async function integrationCreate(
scope: oauthResponse.authed_user.scope,
};
const payload = {
settings: {},
accountId: integrationConfiguration.userId,
config: integrationConfiguration,
integrationDefinitionId: integrationDefinition.id,
};
const integrationAccount = (await axios.post(`/api/v1/integration_account`, payload)).data;
return integrationAccount;
return [
{
type: 'account',
data: {
settings: {},
accountId: integrationConfiguration.userId,
config: integrationConfiguration,
},
},
];
}

View File

@ -3,6 +3,23 @@ import axios from 'axios';
import { getUserDetails } from './utils';
interface SlackActivityCreateParams {
text: string;
sourceURL: string;
}
/**
* Creates an activity message based on Linear data
*/
function createActivityMessage(params: SlackActivityCreateParams) {
return {
type: 'activity',
data: {
text: params.text,
sourceURL: params.sourceURL,
},
};
}
async function getMessage(accessToken: string, channel: string, ts: string) {
const result = await axios.get('https://slack.com/api/conversations.history', {
headers: {
@ -64,7 +81,7 @@ export const createActivityEvent = async (
taskId: null,
};
await axios.post('/api/v1/activity', activity);
return createActivityMessage(activity);
}
if (eventData.event.type === 'reaction_added' && eventData.event.reaction === 'eyes') {
@ -120,7 +137,7 @@ export const createActivityEvent = async (
integrationAccountId: config.integrationAccountId,
};
await axios.post('/api/v1/activity', activity);
return createActivityMessage(activity);
}
return { message: `Processed activity from slack` };
};

View File

@ -10,7 +10,7 @@ import {
export async function run(eventPayload: IntegrationEventPayload) {
switch (eventPayload.event) {
case IntegrationEventType.SETUP:
return await integrationCreate(eventPayload.eventBody, eventPayload.integrationDefinition);
return await integrationCreate(eventPayload.eventBody);
case IntegrationEventType.IDENTIFY:
return eventPayload.eventBody.event.user;
@ -40,12 +40,10 @@ class SlackCLI extends IntegrationCLI {
description: 'Connect your workspace to Slack. Run your workflows from slack bookmarks',
icon: 'slack',
mcp: {
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-slack'],
command: 'slack-mcp-server',
args: [],
env: {
SLACK_BOT_TOKEN: '${config:access_token}',
SLACK_TEAM_ID: '${config:team_id}',
SLACK_CHANNEL_IDS: '${config:channel_ids}',
SLACK_MCP_XOXP_TOKEN: '${config:access_token}',
},
},
auth: {

View File

@ -1,7 +1,7 @@
{
"name": "core",
"private": true,
"version": "0.1.10",
"version": "0.1.11",
"workspaces": [
"apps/*",
"packages/*"

View File

@ -569,6 +569,7 @@ export class MCPAuthenticationClient {
// }
// }
console.log("completeOAuthFlow", options);
// Use the NodeOAuthClientProvider's completeAuth method
await authProvider.completeAuth({
authorizationCode: options.authorizationCode,